Installation
Run Spunto Lite with one docker run or a compose file, then upgrade, back up and uninstall it.
Spunto Lite is a single container. It needs the Docker socket (to create the workers next to it),
your ~/.ssh (read-only), and two volumes: one for its data, one for the SSH agent socket it shares
with the workers.
With docker run
docker run -d --name spunto-lite --restart unless-stopped -p 80:80 \
-e DATA_ENCRYPTION_KEY="$(openssl rand -hex 32)" \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$HOME/.ssh:/host-ssh:ro" \
-v spunto-lite-ssh-agent:/run/spunto-ssh-agent \
-v spunto-lite-data:/app/data \
ghcr.io/spuntodotnet/spunto-lite:latest
Then open http://localhost. There is no account to create and no login screen.
Keep the encryption key.
DATA_ENCRYPTION_KEYencrypts every secret you store. Generate it once, write it down, and pass the same value every time you recreate the container — with another key, the stored secrets can’t be decrypted. Without it, Lite falls back to an insecure development key.
With compose
Save this as docker-compose.yml, put DATA_ENCRYPTION_KEY=… in a .env file next to it, and run
docker compose up -d:
services:
spunto-lite:
image: ghcr.io/spuntodotnet/spunto-lite:latest
container_name: spunto-lite
restart: unless-stopped
ports: ["80:80"]
environment:
DATA_ENCRYPTION_KEY: ${DATA_ENCRYPTION_KEY}
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ${HOME}/.ssh:/host-ssh:ro
- spunto-lite-ssh-agent:/run/spunto-ssh-agent
- spunto-lite-data:/app/data
# Optional — forward your host's ssh-agent (see "SSH keys and git"):
# macOS (Docker Desktop):
# - /run/host-services/ssh-auth.sock:/run/host-services/ssh-auth.sock
# Linux:
# - ${SSH_AUTH_SOCK}:/run/host-services/ssh-auth.sock
volumes:
spunto-lite-data:
spunto-lite-ssh-agent:
From source
The repository’s own compose file builds the image from the checkout and adds the local HTTPS domain used by its tests:
git clone https://github.com/spuntodotnet/spunto-lite.git
cd spunto-lite
cp .env.example .env # optional — sane defaults work out of the box
docker compose up -d --build # or ./start.sh
Another port
If port 80 is taken, publish another one and tell Lite about it, so the URLs it hands out match:
docker run … -p 8080:8080 -e PORT=8080 … ghcr.io/spuntodotnet/spunto-lite:latest
Workers are then at http://worker-<id>.localhost:8080.
Check that it runs
curl -s http://localhost/api/health
docker logs -f spunto-lite
Upgrade
Pull the new image and recreate the container with the same volumes and the same key:
docker pull ghcr.io/spuntodotnet/spunto-lite:latest
docker rm -f spunto-lite
docker run -d --name spunto-lite … # the same command as above
# or, with compose:
docker compose pull && docker compose up -d
Database migrations run on start. Workers are separate containers: they don’t go anywhere during
the upgrade, their agents reconnect once Lite is back, and a stopped worker starts as usual. When a release changes what goes into a workspace
image, the project’s image is rebuilt on the next launch instead of leaving your workers on the
old recipe. Besides latest, every release is tagged by version and every build by its short
commit SHA, if you’d rather pin one.
Back up
Everything Lite knows is in the spunto-lite-data volume — one SQLite file. Back it up and you’ve
backed up the installation (keep the encryption key with it):
docker run --rm -v spunto-lite-data:/data -v "$PWD":/backup alpine \
tar czf /backup/spunto-lite-data.tgz -C /data .
Your workers’ files are in their own volumes (mp-worker-<id>-workspace), and a project’s shared
volumes in mp-proj-<projectId>-<name>: back those up separately if they hold anything you can’t
clone again.
Uninstall
Delete your projects from the dashboard first — that removes their workers, images and volumes — then remove Lite itself:
docker rm -f spunto-lite
docker volume rm spunto-lite-data spunto-lite-ssh-agent
Anything left over is named mp-… (docker ps -a, docker volume ls, docker images).