Backups mit Docker
Alle Daten stecken in einer SQLite-Datei: /data/checky.db im Volume checky-data.
Snapshot (einfach, ein paar Sekunden Pause) — im Verzeichnis mit der docker-compose.yml:
docker compose stop checky
mkdir -p backup-$(date +%F)
docker run --rm -v checky_checky-data:/data -v "$PWD/backup-$(date +%F)":/b busybox sh -c 'cp /data/checky.db* /b/'
docker compose start checky
Beim Stoppen schreibt Checky sein Write-Ahead-Log in checky.db zurück, die Datei allein ist also
vollständig; der Befehl kopiert die -wal/-shm-Dateien trotzdem mit, falls der Container abgewürgt
statt gestoppt wurde. Das Volume heißt <projekt>_checky-data; das Projekt ist der Verzeichnisname
(hier checky). Prüfen mit docker volume ls.
Snapshot wiederherstellen (ersetzt die aktuellen Daten):
BACKUP=backup-2026-10-01 # der Ordner, den du zurückholen willst
docker compose stop checky
docker run --rm -v checky_checky-data:/data -v "$PWD/$BACKUP":/b:ro busybox \
sh -c 'rm -f /data/checky.db* && cp /b/checky.db* /data/ && chown 65532:65532 /data/checky.db*'
docker compose start checky
Das Volume heißt <projekt>_checky-data; das Projekt ist der Verzeichnisname (hier checky). Prüfen mit
docker volume ls.
Snapshot wiederherstellen:
docker compose stop checky
docker run --rm -v checky_checky-data:/data -v "$PWD":/b busybox \
sh -c 'rm -f /data/checky.db-wal /data/checky.db-shm && cp /b/checky-2026-10-01.db /data/checky.db && chown 65532:65532 /data/checky.db'
docker compose start checky
Laufende Backups mit Litestream (empfohlen): repliziert jede Änderung in S3-kompatiblen Speicher (Cloudflare
R2, AWS S3, Backblaze, MinIO). Setz LITESTREAM_BUCKET, LITESTREAM_ACCESS_KEY_ID,
LITESTREAM_SECRET_ACCESS_KEY (für R2 zusätzlich
LITESTREAM_ENDPOINT=https://<account>.r2.cloudflarestorage.com und LITESTREAM_REGION=auto) und starte mit dem
Litestream-Sidecar aus dem Repository:
docker compose -f docker-compose.yml -f deploy/litestream/docker-compose.litestream.yml up -d
Ein neuer Server mit leerem Volume stellt sich beim ersten Start selbst aus der Replik wieder her.
Portabel: Owner können die ganze Organisation als eine Datei herunterladen (Einstellungen → Daten umziehen → Exportieren) — siehe Umzug.
Probier ab und zu eine Wiederherstellung aus — ein Backup, das du nie zurückgespielt hast, ist eine Hoffnung, kein Backup.
Backups auf Cloudflare
D1 Time Travel hält 30 Tage Verlauf (wrangler d1 time-travel info DB, Wiederherstellung mit
wrangler d1 time-travel restore). Für eine zusätzliche Kopie:
wrangler d1 export DB --remote --output backup.sql.
Updates
Lies zuerst die Release Notes (Changelog); Major-Versionen nennen nötige Schritte. Admins sehen in der App einen Hinweis „Update verfügbar“; Sicherheitsreleases sind hervorgehoben.
Docker — Backup machen, dann:
docker compose pull
docker compose up -d
docker compose logs -f checky
curl -s https://checky.example.com/health # {"status":"ok","version":"…"}
Datenbank-Migrationen laufen beim Start automatisch. Image-Tags: x.y.z (genau), x.y (Patch-Updates einer
Minor-Version), latest. Leg produktiv x.y fest (CHECKY_IMAGE=ghcr.io/sonnenglas/checky:2.1) und wechsle
bewusst zur nächsten Minor-Version.
Cloudflare — Fork mit dem Release-Tag synchronisieren (Workers Builds deployt) oder aus einem Checkout
pnpm --filter @checky/worker run deploy ausführen. Die D1-Migrationen sind Teil des Deploys.
Zurückrollen
Migrationen laufen nur vorwärts. Zum Zurückrollen spielst du das Backup von vor dem Update zurück und startest das
vorherige Image (Docker) bzw. die vorherige Worker-Version (wrangler rollback). Lass nie eine ältere Version auf
einer Datenbank laufen, die eine neuere schon migriert hat.
Lizenz und Updates
Eine Self-Host-Lizenz deckt Releases ab, die in ihrem Update-Zeitraum erscheinen. Neuere Releases lassen sich trotzdem installieren und laufen — der Schlüssel läuft nie ab —, aber mit einer Verlängerung bleibst du bei Updates und Sicherheitsfixes abgedeckt.