Soft Serve — a self-hostable Git server with a delightful SSH TUI: browse repos, manage access, and push over SSH. Deployed as a single host-networked Nomad service.
Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.
Source ↗ Project ↗ ★ 7.2k ⚑ Report an issue
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "soft-serve"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The Soft Serve container image. Pin a tag in production.
image = "charmcli/soft-serve:latest"
# SSH port — the primary interface (browse repos via the TUI, push over SSH).
port = 23231
# HTTP port for read-only web browsing and git-over-HTTP clone.
http_port = 23232
# Git daemon port (anonymous git:// protocol).
git_port = 9418
# Prometheus stats/metrics port.
stats_port = 23233
# SSH public key(s) granted admin, space/newline-separated (SOFT_SERVE_INITIAL_ADMIN_KEYS). SET THIS to your key, e.g. "ssh-ed25519 AAAA... you@host", or you can't administer the server.
admin_keys = ""
# Named volume mounted at /soft-serve — repositories, config and host keys.
data_volume = "soft_serve_data"
# Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# The task resources.
resources = {
cpu = 300
memory = 256
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "soft-serve" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "charmcli/soft-serve:latest" | The Soft Serve container image. Pin a tag in production. |
| port | number | 23231 | SSH port — the primary interface (browse repos via the TUI, push over SSH). |
| http_port | number | 23232 | HTTP port for read-only web browsing and git-over-HTTP clone. |
| git_port | number | 9418 | Git daemon port (anonymous git:// protocol). |
| stats_port | number | 23233 | Prometheus stats/metrics port. |
| admin_keys | string | "" | SSH public key(s) granted admin, space/newline-separated (SOFT_SERVE_INITIAL_ADMIN_KEYS). SET THIS to your key, e.g. "ssh-ed25519 AAAA... you@host", or you can't administer the server. |
| data_volume | string | "soft_serve_data" | Named volume mounted at /soft-serve — repositories, config and host keys. |
| constraints | list | [] | Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
| resources | object | {
cpu = 300
memory = 256
} | The task resources. |
No variables match.
This pack stores data in one Docker named volume:
soft_serve_data
restic
# Run on the node hosting this pack. Point restic at your repo first: # export RESTIC_REPOSITORY="s3:https://<account>.r2.cloudflarestorage.com/<bucket>" # export RESTIC_PASSWORD="<repo-password>" # export AWS_ACCESS_KEY_ID=<key> AWS_SECRET_ACCESS_KEY=<secret> restic backup \ /var/lib/docker/volumes/soft_serve_data/_data
rclone (sync to S3/R2)
rclone sync /var/lib/docker/volumes/soft_serve_data/_data backup:<bucket>/soft_serve_data
Paths assume the default Docker volume location (/var/lib/docker/volumes). Restore by stopping the job, restoring files into the same volume, and re-running the pack.
Soft Serve — a self-hostable Git server with a delightful SSH TUI (from Charm). Browse repositories, read READMEs and commits, and manage access right in your terminal over SSH, push and pull over SSH/HTTP/git, and keep everything on your own box. A lightweight, no-web-account alternative to a full forge.
Single host-networked Nomad service exposing SSH, HTTP, the git daemon and a stats endpoint, with a persistent data volume.
nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run soft-serve --registry=nomploy
| Variable | Default | Description |
|---|---|---|
port |
23231 |
SSH port — the primary interface (TUI + push). |
http_port |
23232 |
HTTP browsing / git-over-HTTP clone. |
git_port |
9418 |
Anonymous git:// daemon. |
stats_port |
23233 |
Prometheus metrics. |
admin_keys |
"" |
Set this. SSH public key(s) granted admin (SOFT_SERVE_INITIAL_ADMIN_KEYS). |
image |
charmcli/soft-serve:latest |
Container image. Pin a tag in production. |
data_volume |
soft_serve_data |
/soft-serve — repositories, config and host keys. |
resources |
{ cpu = 300, memory = 256 } |
Task resources. |
Set
admin_keysto your SSH public key(s) before deploying, or you won't be able to administer the server. Thenssh -p 23231 <host>opens the TUI. Pin the job to the node holding the volume withconstraints.