-
Notifications
You must be signed in to change notification settings - Fork 1
Data Volumes
Since v0.7.0, every persistent path lives under one host directory
(./vibe-coder-data/), making backup/migration a one-line tar.
./vibe-coder-data/ container
───────────────── ─────────
├── workspace/ → /workspace (sources + APKs)
├── server/ → /data (SQLite + logs)
├── dev-tools/
│ ├── android-sdk/ → /opt/android-sdk (3-4 GB)
│ ├── gradle/ → /home/vibe/.gradle (1-2 GB)
│ ├── npm-global/ → /home/vibe/.local (MCP `npm -g`)
│ ├── npm-cache/ → /home/vibe/.npm (npx cache)
│ ├── playwright/ → /home/vibe/.cache/ms-playwright (optional, ~300 MB)
│ └── config/ → /home/vibe/.config (tool config)
└── claude/ → /home/vibe/.claude (OAuth/API key/MCP registrations)
The server image itself (~600 MB) contains only the Ktor body + Claude CLI + JDK + Node — every byte that took effort to download lives in your host directory.
# Stop the container so SQLite is in a quiescent state (optional but recommended).
docker compose stop vibe-coder-server
# One-line backup
tar czf vibe-coder-data-$(date +%F).tar.gz vibe-coder-data/
# Resume
docker compose start vibe-coder-server# On the destination
mkdir -p ~/vibe-coder && cd ~/vibe-coder
curl -fsSL https://raw.githubusercontent.com/siamakerlab/vibe-coder-server/main/docker/compose.yml -o compose.yml
curl -fsSL https://raw.githubusercontent.com/siamakerlab/vibe-coder-server/main/docker/.env.example -o .env
# Edit .env (PUID/PGID likely changes!)
# Drop the archive into place
scp source-host:~/vibe-coder/vibe-coder-data-*.tar.gz .
tar xzf vibe-coder-data-*.tar.gz
docker compose up -dPUID / PGID change is the only gotcha — file ownership inside
vibe-coder-data/ was set to the source host's uid:gid. If destination
host's id -u/-g differ, the entrypoint will chown the top-level dirs but
not deep contents. If you see permission errors, either:
sudo chown -R $(id -u):$(id -g) vibe-coder-data/ # easiestor update .env PUID/PGID to match the source host's values.
| Use case | Recommended free disk |
|---|---|
| First boot, no projects yet | ~5 GB (SDK 3-4 GB + image 600 MB + buffer) |
| Active project, ~10 builds done | ~10 GB |
| Heavy use with Playwright + several MCP-installed packages | ~15 GB |
| Production-leaning (artifact retention 20+ APKs each ~100 MB) | ~20 GB |
The artifactKeepCount in server.yml (default 20) bounds APK growth.
-
Docker container's own writable layer — ephemeral, recreated on
--force-recreate. If you put state here by accident (writing to a non-mounted path inside the container), it'll vanish. -
Image layers — pulled fresh on
docker compose pull. -
Host SSH agent — not forwarded. SSH keys for
git clonelive inside the container at/home/vibe/.ssh/, which IS bind-mounted as part ofclaude/— wait, no.~/.sshis NOT in the bind mount list above. This means: SSH keys are auto-regenerated on first re-clone after a fresh data directory. If you want to preserve the SSH key across full reinstalls, add~/.sshto your compose volumes manually:- ./vibe-coder-data/ssh:/home/vibe/.sshThis is intentional — the host SSH key registered with GitHub is your cleanest path; vibe-coder-generated keys are a fallback.
docker compose down -v removes Docker named volumes. v0.7.0+ uses
bind mounts only (everything in ./vibe-coder-data/), so down -v is
safe in clean installations. But if you're mid-migration from a v0.6.x
install, you may still have orphaned named volumes — those would be
deleted. Use docker volume ls to check first.
du -sh vibe-coder-data/*/
# →
# 1.2G vibe-coder-data/dev-tools
# 8.4G vibe-coder-data/workspace
# 120M vibe-coder-data/server
# 8.0K vibe-coder-data/claudeInside dev-tools/:
du -sh vibe-coder-data/dev-tools/*/
# 3.7G android-sdk
# 1.8G gradle
# 420M npm-global
# 280M npm-cache
# 310M playwright
# 4.0K config