Operation
Backups & updates
What to back up, how to update and how to check that your instance is healthy.
What to back up
Everything worth keeping is in the data folder (DATA_DIR, in the container /var/www/data):
- the SQLite database (
annuva.sqlite) - uploaded files and generated invoice PDFs (
files/) - generated secrets (
.auth-secret)
Back up the whole folder. Without .auth-secret all sessions and API tokens become invalid after a restore (unless you set AUTH_SECRET yourself).
Consistent SQLite backups
While Annuva is running, use SQLite's backup command instead of copying the file:
sqlite3 data/annuva.sqlite ".backup 'backup/annuva-$(date +%F).sqlite'"Alternatively stop the container for a moment, copy the folder and start it again:
docker compose stop annuva
tar czf "annuva-$(date +%F).tar.gz" data
docker compose start annuvaWith MySQL or PostgreSQL back up the database with its usual tools (mysqldump, pg_dump) plus the data folder for the files.
Updates
docker compose pull
docker compose up -dDatabase migrations run automatically on start. The current version is shown in the user menu and at /api/health. The changelog lists what changed.
You can pin a version instead of latest – the image is tagged with the major (1), minor (1.3) and full version (1.3.0).
Health and logs
curl https://annuva.example.com/api/health
# {"database":"ok","status":"ok","version":"1.3.0"}
docker compose logs -f annuvaThe health endpoint answers 200 when the database is reachable and 503 otherwise; the Docker health check uses it. Set LOG_LEVEL=debug for more details.