Dokploy

Soft Serve

Soft Serve is a self-hosted Git server with an SSH TUI, HTTP Git access, Git LFS support, and simple repository management.

Soft Serve logo

Configuration

version: "3.8"

services:
  soft-serve:
    image: charmcli/soft-serve:v0.11.6
    restart: unless-stopped
    expose:
      - "23231"
      - "23232"
      - "23233"
      - "9418"
    environment:
      SOFT_SERVE_NAME: ${SOFT_SERVE_NAME}
      SOFT_SERVE_DATA_PATH: /soft-serve
      SOFT_SERVE_INITIAL_ADMIN_KEYS: ${SOFT_SERVE_INITIAL_ADMIN_KEYS}
      SOFT_SERVE_SSH_LISTEN_ADDR: ":23231"
      SOFT_SERVE_SSH_PUBLIC_URL: ${SOFT_SERVE_SSH_PUBLIC_URL}
      SOFT_SERVE_HTTP_LISTEN_ADDR: ":23232"
      SOFT_SERVE_HTTP_PUBLIC_URL: ${SOFT_SERVE_HTTP_PUBLIC_URL}
      SOFT_SERVE_GIT_LISTEN_ADDR: ":9418"
      SOFT_SERVE_STATS_LISTEN_ADDR: ":23233"
      SOFT_SERVE_LOG_LEVEL: ${SOFT_SERVE_LOG_LEVEL}
    volumes:
      - soft-serve-data:/soft-serve

volumes:
  soft-serve-data:
[variables]
main_domain = "${domain}"
server_name = "Soft Serve"
initial_admin_keys = ""
http_public_url = "http://${main_domain}"
ssh_public_url = "ssh://${main_domain}:23231"
log_level = "info"

[[config.domains]]
serviceName = "soft-serve"
port = 23232
host = "${main_domain}"
path = "/"

[[config.mounts]]
filePath = "README.md"
content = """# Soft Serve

This template deploys Soft Serve, a self-hosted Git server with an SSH TUI, HTTP Git access, Git LFS support, and a lightweight web endpoint.

## First Start

Set `initial_admin_keys` to one or more SSH public keys before the first deployment. Soft Serve uses this value to create the initial `admin` user. The keys are consumed during initialization, so changing this variable later does not rewrite an already initialized data volume.

Example value:

```text
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... your-name
```

## HTTP Access

The Dokploy domain routes to Soft Serve's HTTP listener:

- HTTP public URL: `http://${main_domain}`
- HTTP Git clone example: `git clone http://${main_domain}/repo.git`

Set `http_public_url` to `https://${main_domain}` before deploying if your Dokploy domain enforces TLS.

Private HTTP access uses tokens created through the SSH admin interface.

## SSH and Git Protocol Ports

Soft Serve also listens inside the deployment on:

- SSH/TUI: `23231`
- Stats: `23233`
- Git protocol: `9418`

This template does not publish host TCP ports directly. Expose the SSH or Git protocol ports separately in Dokploy if you need direct terminal/TUI access, then use the configured `ssh_public_url` for clone commands.

## Storage

Repositories, configuration, keys, and the default SQLite database are stored in the persistent `soft-serve-data` volume mounted at `/soft-serve`.
"""

[config.env]
SOFT_SERVE_NAME = "${server_name}"
SOFT_SERVE_INITIAL_ADMIN_KEYS = "${initial_admin_keys}"
SOFT_SERVE_HTTP_PUBLIC_URL = "${http_public_url}"
SOFT_SERVE_SSH_PUBLIC_URL = "${ssh_public_url}"
SOFT_SERVE_LOG_LEVEL = "${log_level}"

Base64

To import this template in Dokploy: create a Compose service → AdvancedBase64 import and paste the content below:

ewogICJjb21wb3NlIjogInZlcnNpb246IFwiMy44XCJcblxuc2VydmljZXM6XG4gIHNvZnQtc2VydmU6XG4gICAgaW1hZ2U6IGNoYXJtY2xpL3NvZnQtc2VydmU6djAuMTEuNlxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZXhwb3NlOlxuICAgICAgLSBcIjIzMjMxXCJcbiAgICAgIC0gXCIyMzIzMlwiXG4gICAgICAtIFwiMjMyMzNcIlxuICAgICAgLSBcIjk0MThcIlxuICAgIGVudmlyb25tZW50OlxuICAgICAgU09GVF9TRVJWRV9OQU1FOiAke1NPRlRfU0VSVkVfTkFNRX1cbiAgICAgIFNPRlRfU0VSVkVfREFUQV9QQVRIOiAvc29mdC1zZXJ2ZVxuICAgICAgU09GVF9TRVJWRV9JTklUSUFMX0FETUlOX0tFWVM6ICR7U09GVF9TRVJWRV9JTklUSUFMX0FETUlOX0tFWVN9XG4gICAgICBTT0ZUX1NFUlZFX1NTSF9MSVNURU5fQUREUjogXCI6MjMyMzFcIlxuICAgICAgU09GVF9TRVJWRV9TU0hfUFVCTElDX1VSTDogJHtTT0ZUX1NFUlZFX1NTSF9QVUJMSUNfVVJMfVxuICAgICAgU09GVF9TRVJWRV9IVFRQX0xJU1RFTl9BRERSOiBcIjoyMzIzMlwiXG4gICAgICBTT0ZUX1NFUlZFX0hUVFBfUFVCTElDX1VSTDogJHtTT0ZUX1NFUlZFX0hUVFBfUFVCTElDX1VSTH1cbiAgICAgIFNPRlRfU0VSVkVfR0lUX0xJU1RFTl9BRERSOiBcIjo5NDE4XCJcbiAgICAgIFNPRlRfU0VSVkVfU1RBVFNfTElTVEVOX0FERFI6IFwiOjIzMjMzXCJcbiAgICAgIFNPRlRfU0VSVkVfTE9HX0xFVkVMOiAke1NPRlRfU0VSVkVfTE9HX0xFVkVMfVxuICAgIHZvbHVtZXM6XG4gICAgICAtIHNvZnQtc2VydmUtZGF0YTovc29mdC1zZXJ2ZVxuXG52b2x1bWVzOlxuICBzb2Z0LXNlcnZlLWRhdGE6XG4iLAogICJjb25maWciOiAiW3ZhcmlhYmxlc11cbm1haW5fZG9tYWluID0gXCIke2RvbWFpbn1cIlxuc2VydmVyX25hbWUgPSBcIlNvZnQgU2VydmVcIlxuaW5pdGlhbF9hZG1pbl9rZXlzID0gXCJcIlxuaHR0cF9wdWJsaWNfdXJsID0gXCJodHRwOi8vJHttYWluX2RvbWFpbn1cIlxuc3NoX3B1YmxpY191cmwgPSBcInNzaDovLyR7bWFpbl9kb21haW59OjIzMjMxXCJcbmxvZ19sZXZlbCA9IFwiaW5mb1wiXG5cbltbY29uZmlnLmRvbWFpbnNdXVxuc2VydmljZU5hbWUgPSBcInNvZnQtc2VydmVcIlxucG9ydCA9IDIzMjMyXG5ob3N0ID0gXCIke21haW5fZG9tYWlufVwiXG5wYXRoID0gXCIvXCJcblxuW1tjb25maWcubW91bnRzXV1cbmZpbGVQYXRoID0gXCJSRUFETUUubWRcIlxuY29udGVudCA9IFwiXCJcIiMgU29mdCBTZXJ2ZVxuXG5UaGlzIHRlbXBsYXRlIGRlcGxveXMgU29mdCBTZXJ2ZSwgYSBzZWxmLWhvc3RlZCBHaXQgc2VydmVyIHdpdGggYW4gU1NIIFRVSSwgSFRUUCBHaXQgYWNjZXNzLCBHaXQgTEZTIHN1cHBvcnQsIGFuZCBhIGxpZ2h0d2VpZ2h0IHdlYiBlbmRwb2ludC5cblxuIyMgRmlyc3QgU3RhcnRcblxuU2V0IGBpbml0aWFsX2FkbWluX2tleXNgIHRvIG9uZSBvciBtb3JlIFNTSCBwdWJsaWMga2V5cyBiZWZvcmUgdGhlIGZpcnN0IGRlcGxveW1lbnQuIFNvZnQgU2VydmUgdXNlcyB0aGlzIHZhbHVlIHRvIGNyZWF0ZSB0aGUgaW5pdGlhbCBgYWRtaW5gIHVzZXIuIFRoZSBrZXlzIGFyZSBjb25zdW1lZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24sIHNvIGNoYW5naW5nIHRoaXMgdmFyaWFibGUgbGF0ZXIgZG9lcyBub3QgcmV3cml0ZSBhbiBhbHJlYWR5IGluaXRpYWxpemVkIGRhdGEgdm9sdW1lLlxuXG5FeGFtcGxlIHZhbHVlOlxuXG5gYGB0ZXh0XG5zc2gtZWQyNTUxOSBBQUFBQzNOemFDMWxaREkxTlRFNUFBQUEuLi4geW91ci1uYW1lXG5gYGBcblxuIyMgSFRUUCBBY2Nlc3NcblxuVGhlIERva3Bsb3kgZG9tYWluIHJvdXRlcyB0byBTb2Z0IFNlcnZlJ3MgSFRUUCBsaXN0ZW5lcjpcblxuLSBIVFRQIHB1YmxpYyBVUkw6IGBodHRwOi8vJHttYWluX2RvbWFpbn1gXG4tIEhUVFAgR2l0IGNsb25lIGV4YW1wbGU6IGBnaXQgY2xvbmUgaHR0cDovLyR7bWFpbl9kb21haW59L3JlcG8uZ2l0YFxuXG5TZXQgYGh0dHBfcHVibGljX3VybGAgdG8gYGh0dHBzOi8vJHttYWluX2RvbWFpbn1gIGJlZm9yZSBkZXBsb3lpbmcgaWYgeW91ciBEb2twbG95IGRvbWFpbiBlbmZvcmNlcyBUTFMuXG5cblByaXZhdGUgSFRUUCBhY2Nlc3MgdXNlcyB0b2tlbnMgY3JlYXRlZCB0aHJvdWdoIHRoZSBTU0ggYWRtaW4gaW50ZXJmYWNlLlxuXG4jIyBTU0ggYW5kIEdpdCBQcm90b2NvbCBQb3J0c1xuXG5Tb2Z0IFNlcnZlIGFsc28gbGlzdGVucyBpbnNpZGUgdGhlIGRlcGxveW1lbnQgb246XG5cbi0gU1NIL1RVSTogYDIzMjMxYFxuLSBTdGF0czogYDIzMjMzYFxuLSBHaXQgcHJvdG9jb2w6IGA5NDE4YFxuXG5UaGlzIHRlbXBsYXRlIGRvZXMgbm90IHB1Ymxpc2ggaG9zdCBUQ1AgcG9ydHMgZGlyZWN0bHkuIEV4cG9zZSB0aGUgU1NIIG9yIEdpdCBwcm90b2NvbCBwb3J0cyBzZXBhcmF0ZWx5IGluIERva3Bsb3kgaWYgeW91IG5lZWQgZGlyZWN0IHRlcm1pbmFsL1RVSSBhY2Nlc3MsIHRoZW4gdXNlIHRoZSBjb25maWd1cmVkIGBzc2hfcHVibGljX3VybGAgZm9yIGNsb25lIGNvbW1hbmRzLlxuXG4jIyBTdG9yYWdlXG5cblJlcG9zaXRvcmllcywgY29uZmlndXJhdGlvbiwga2V5cywgYW5kIHRoZSBkZWZhdWx0IFNRTGl0ZSBkYXRhYmFzZSBhcmUgc3RvcmVkIGluIHRoZSBwZXJzaXN0ZW50IGBzb2Z0LXNlcnZlLWRhdGFgIHZvbHVtZSBtb3VudGVkIGF0IGAvc29mdC1zZXJ2ZWAuXG5cIlwiXCJcblxuW2NvbmZpZy5lbnZdXG5TT0ZUX1NFUlZFX05BTUUgPSBcIiR7c2VydmVyX25hbWV9XCJcblNPRlRfU0VSVkVfSU5JVElBTF9BRE1JTl9LRVlTID0gXCIke2luaXRpYWxfYWRtaW5fa2V5c31cIlxuU09GVF9TRVJWRV9IVFRQX1BVQkxJQ19VUkwgPSBcIiR7aHR0cF9wdWJsaWNfdXJsfVwiXG5TT0ZUX1NFUlZFX1NTSF9QVUJMSUNfVVJMID0gXCIke3NzaF9wdWJsaWNfdXJsfVwiXG5TT0ZUX1NFUlZFX0xPR19MRVZFTCA9IFwiJHtsb2dfbGV2ZWx9XCJcbiIKfQ==

Tags

git, ssh, developer-tools, self-hosted


Version: v0.11.6

On this page