diff --git a/blueprints/soft-serve/docker-compose.yml b/blueprints/soft-serve/docker-compose.yml new file mode 100644 index 000000000..ac875d214 --- /dev/null +++ b/blueprints/soft-serve/docker-compose.yml @@ -0,0 +1,27 @@ +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: diff --git a/blueprints/soft-serve/soft-serve.svg b/blueprints/soft-serve/soft-serve.svg new file mode 100644 index 000000000..0bb41d559 --- /dev/null +++ b/blueprints/soft-serve/soft-serve.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/blueprints/soft-serve/template.toml b/blueprints/soft-serve/template.toml new file mode 100644 index 000000000..f18f883c8 --- /dev/null +++ b/blueprints/soft-serve/template.toml @@ -0,0 +1,62 @@ +[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}" diff --git a/meta.json b/meta.json index 8be7825d7..acec5a47b 100644 --- a/meta.json +++ b/meta.json @@ -5832,6 +5832,24 @@ "authentication" ] }, + { + "id": "soft-serve", + "name": "Soft Serve", + "version": "v0.11.6", + "description": "Soft Serve is a self-hosted Git server with an SSH TUI, HTTP Git access, Git LFS support, and simple repository management.", + "logo": "soft-serve.svg", + "links": { + "github": "https://github.com/charmbracelet/soft-serve", + "website": "https://charm.sh/", + "docs": "https://github.com/charmbracelet/soft-serve/blob/main/README.md" + }, + "tags": [ + "git", + "ssh", + "developer-tools", + "self-hosted" + ] + }, { "id": "soketi", "name": "Soketi",