Updates & backups
Pull, restart, done. And the one file that is your entire install.
Updating
Releases are published to ghcr.io/mddanishyusuf/piqo-selfhost with three tags each: the exact version (0.1.3), the minor line (0.1) and the major line (0). The guides pin :0, so pulling again gets every 0.x release and never a breaking major.
Migrations run automatically on boot. On Docker Compose:
docker compose pull
docker compose up -dOn Railway, Render and Coolify, redeploy the service. On Fly, fly deploy. The dashboard shows an “update available” banner when the daily license check-in reports a newer build.
When a 1.0 ships, its notes will say what changed. Move by changing the tag to :1 and redeploying. Take a backup first.
Nightly backups
Every night the app runs SQLite's VACUUM INTO and writes a complete, compacted copy of the database to /app/data/backups/piqo-YYYY-MM-DD.db. The last BACKUP_KEEP_N (default 7) are kept.
Because they live on the same volume, copy them off the box too. From a Docker host:
docker compose cp piqo:/app/data/backups ./piqo-backupsAny object storage sync (rclone, restic, a cron with aws s3 sync) pointed at that folder finishes the job.
Restoring
Each backup file is a full database. To restore, stop the app, replace the live file, start it again:
docker compose stop piqo
docker compose cp ./piqo-backups/piqo-2026-09-06.db piqo:/app/data/piqo.db
docker compose start piqoIf a piqo.db-wal or piqo.db-shm file exists next to it, delete those before starting. They belong to the old database.
AUTH_SECRET with the database. Stored integration secrets are encrypted with it. A restored database under a different secret works, but every payment provider and Search Console connection has to be reconnected.Retention
By default nothing is deleted. Set DATA_RETENTION_DAYS to have events older than that removed nightly. Hourly and daily rollups are kept, so historical charts still work after the raw rows are gone.
Moving to a new server
- Deploy the new install with the same
AUTH_SECRETandAPP_URL. - Stop the old one, copy its latest backup to the new volume as
piqo.db, start the new one. - Point DNS at the new server. Because the hostname is unchanged, the license carries over.