Soft Serve
Soft Serve is a self-hosted Git server with an SSH TUI, HTTP Git access, Git LFS support, and simple repository management.
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 → Advanced → Base64 import and paste the content below:
ewogICJjb21wb3NlIjogInZlcnNpb246IFwiMy44XCJcblxuc2VydmljZXM6XG4gIHNvZnQtc2VydmU6XG4gICAgaW1hZ2U6IGNoYXJtY2xpL3NvZnQtc2VydmU6djAuMTEuNlxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZXhwb3NlOlxuICAgICAgLSBcIjIzMjMxXCJcbiAgICAgIC0gXCIyMzIzMlwiXG4gICAgICAtIFwiMjMyMzNcIlxuICAgICAgLSBcIjk0MThcIlxuICAgIGVudmlyb25tZW50OlxuICAgICAgU09GVF9TRVJWRV9OQU1FOiAke1NPRlRfU0VSVkVfTkFNRX1cbiAgICAgIFNPRlRfU0VSVkVfREFUQV9QQVRIOiAvc29mdC1zZXJ2ZVxuICAgICAgU09GVF9TRVJWRV9JTklUSUFMX0FETUlOX0tFWVM6ICR7U09GVF9TRVJWRV9JTklUSUFMX0FETUlOX0tFWVN9XG4gICAgICBTT0ZUX1NFUlZFX1NTSF9MSVNURU5fQUREUjogXCI6MjMyMzFcIlxuICAgICAgU09GVF9TRVJWRV9TU0hfUFVCTElDX1VSTDogJHtTT0ZUX1NFUlZFX1NTSF9QVUJMSUNfVVJMfVxuICAgICAgU09GVF9TRVJWRV9IVFRQX0xJU1RFTl9BRERSOiBcIjoyMzIzMlwiXG4gICAgICBTT0ZUX1NFUlZFX0hUVFBfUFVCTElDX1VSTDogJHtTT0ZUX1NFUlZFX0hUVFBfUFVCTElDX1VSTH1cbiAgICAgIFNPRlRfU0VSVkVfR0lUX0xJU1RFTl9BRERSOiBcIjo5NDE4XCJcbiAgICAgIFNPRlRfU0VSVkVfU1RBVFNfTElTVEVOX0FERFI6IFwiOjIzMjMzXCJcbiAgICAgIFNPRlRfU0VSVkVfTE9HX0xFVkVMOiAke1NPRlRfU0VSVkVfTE9HX0xFVkVMfVxuICAgIHZvbHVtZXM6XG4gICAgICAtIHNvZnQtc2VydmUtZGF0YTovc29mdC1zZXJ2ZVxuXG52b2x1bWVzOlxuICBzb2Z0LXNlcnZlLWRhdGE6XG4iLAogICJjb25maWciOiAiW3ZhcmlhYmxlc11cbm1haW5fZG9tYWluID0gXCIke2RvbWFpbn1cIlxuc2VydmVyX25hbWUgPSBcIlNvZnQgU2VydmVcIlxuaW5pdGlhbF9hZG1pbl9rZXlzID0gXCJcIlxuaHR0cF9wdWJsaWNfdXJsID0gXCJodHRwOi8vJHttYWluX2RvbWFpbn1cIlxuc3NoX3B1YmxpY191cmwgPSBcInNzaDovLyR7bWFpbl9kb21haW59OjIzMjMxXCJcbmxvZ19sZXZlbCA9IFwiaW5mb1wiXG5cbltbY29uZmlnLmRvbWFpbnNdXVxuc2VydmljZU5hbWUgPSBcInNvZnQtc2VydmVcIlxucG9ydCA9IDIzMjMyXG5ob3N0ID0gXCIke21haW5fZG9tYWlufVwiXG5wYXRoID0gXCIvXCJcblxuW1tjb25maWcubW91bnRzXV1cbmZpbGVQYXRoID0gXCJSRUFETUUubWRcIlxuY29udGVudCA9IFwiXCJcIiMgU29mdCBTZXJ2ZVxuXG5UaGlzIHRlbXBsYXRlIGRlcGxveXMgU29mdCBTZXJ2ZSwgYSBzZWxmLWhvc3RlZCBHaXQgc2VydmVyIHdpdGggYW4gU1NIIFRVSSwgSFRUUCBHaXQgYWNjZXNzLCBHaXQgTEZTIHN1cHBvcnQsIGFuZCBhIGxpZ2h0d2VpZ2h0IHdlYiBlbmRwb2ludC5cblxuIyMgRmlyc3QgU3RhcnRcblxuU2V0IGBpbml0aWFsX2FkbWluX2tleXNgIHRvIG9uZSBvciBtb3JlIFNTSCBwdWJsaWMga2V5cyBiZWZvcmUgdGhlIGZpcnN0IGRlcGxveW1lbnQuIFNvZnQgU2VydmUgdXNlcyB0aGlzIHZhbHVlIHRvIGNyZWF0ZSB0aGUgaW5pdGlhbCBgYWRtaW5gIHVzZXIuIFRoZSBrZXlzIGFyZSBjb25zdW1lZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24sIHNvIGNoYW5naW5nIHRoaXMgdmFyaWFibGUgbGF0ZXIgZG9lcyBub3QgcmV3cml0ZSBhbiBhbHJlYWR5IGluaXRpYWxpemVkIGRhdGEgdm9sdW1lLlxuXG5FeGFtcGxlIHZhbHVlOlxuXG5gYGB0ZXh0XG5zc2gtZWQyNTUxOSBBQUFBQzNOemFDMWxaREkxTlRFNUFBQUEuLi4geW91ci1uYW1lXG5gYGBcblxuIyMgSFRUUCBBY2Nlc3NcblxuVGhlIERva3Bsb3kgZG9tYWluIHJvdXRlcyB0byBTb2Z0IFNlcnZlJ3MgSFRUUCBsaXN0ZW5lcjpcblxuLSBIVFRQIHB1YmxpYyBVUkw6IGBodHRwOi8vJHttYWluX2RvbWFpbn1gXG4tIEhUVFAgR2l0IGNsb25lIGV4YW1wbGU6IGBnaXQgY2xvbmUgaHR0cDovLyR7bWFpbl9kb21haW59L3JlcG8uZ2l0YFxuXG5TZXQgYGh0dHBfcHVibGljX3VybGAgdG8gYGh0dHBzOi8vJHttYWluX2RvbWFpbn1gIGJlZm9yZSBkZXBsb3lpbmcgaWYgeW91ciBEb2twbG95IGRvbWFpbiBlbmZvcmNlcyBUTFMuXG5cblByaXZhdGUgSFRUUCBhY2Nlc3MgdXNlcyB0b2tlbnMgY3JlYXRlZCB0aHJvdWdoIHRoZSBTU0ggYWRtaW4gaW50ZXJmYWNlLlxuXG4jIyBTU0ggYW5kIEdpdCBQcm90b2NvbCBQb3J0c1xuXG5Tb2Z0IFNlcnZlIGFsc28gbGlzdGVucyBpbnNpZGUgdGhlIGRlcGxveW1lbnQgb246XG5cbi0gU1NIL1RVSTogYDIzMjMxYFxuLSBTdGF0czogYDIzMjMzYFxuLSBHaXQgcHJvdG9jb2w6IGA5NDE4YFxuXG5UaGlzIHRlbXBsYXRlIGRvZXMgbm90IHB1Ymxpc2ggaG9zdCBUQ1AgcG9ydHMgZGlyZWN0bHkuIEV4cG9zZSB0aGUgU1NIIG9yIEdpdCBwcm90b2NvbCBwb3J0cyBzZXBhcmF0ZWx5IGluIERva3Bsb3kgaWYgeW91IG5lZWQgZGlyZWN0IHRlcm1pbmFsL1RVSSBhY2Nlc3MsIHRoZW4gdXNlIHRoZSBjb25maWd1cmVkIGBzc2hfcHVibGljX3VybGAgZm9yIGNsb25lIGNvbW1hbmRzLlxuXG4jIyBTdG9yYWdlXG5cblJlcG9zaXRvcmllcywgY29uZmlndXJhdGlvbiwga2V5cywgYW5kIHRoZSBkZWZhdWx0IFNRTGl0ZSBkYXRhYmFzZSBhcmUgc3RvcmVkIGluIHRoZSBwZXJzaXN0ZW50IGBzb2Z0LXNlcnZlLWRhdGFgIHZvbHVtZSBtb3VudGVkIGF0IGAvc29mdC1zZXJ2ZWAuXG5cIlwiXCJcblxuW2NvbmZpZy5lbnZdXG5TT0ZUX1NFUlZFX05BTUUgPSBcIiR7c2VydmVyX25hbWV9XCJcblNPRlRfU0VSVkVfSU5JVElBTF9BRE1JTl9LRVlTID0gXCIke2luaXRpYWxfYWRtaW5fa2V5c31cIlxuU09GVF9TRVJWRV9IVFRQX1BVQkxJQ19VUkwgPSBcIiR7aHR0cF9wdWJsaWNfdXJsfVwiXG5TT0ZUX1NFUlZFX1NTSF9QVUJMSUNfVVJMID0gXCIke3NzaF9wdWJsaWNfdXJsfVwiXG5TT0ZUX1NFUlZFX0xPR19MRVZFTCA9IFwiJHtsb2dfbGV2ZWx9XCJcbiIKfQ==Links
Tags
git, ssh, developer-tools, self-hosted
Version: v0.11.6