Backups run nightly from the scheduler. What is captured is controlled by BACKUP_POSTGRES_ENABLED, BACKUP_REDIS_ENABLED and BACKUP_STORAGE_ENABLED, written under BACKUP_ROOT and pruned after BACKUP_RETENTION_DAYS.
What is backed up
| Component | Contents | Matters because |
|---|---|---|
| PostgreSQL | Full logical dump | All clients, invoices, services and tickets. |
| Redis | RDB snapshot | Queued jobs and sessions. Losing it is survivable. |
| Storage | Archive of the storage directory | Uploads, generated documents, release archives. |
Restoring the database
gunzip -c backup-2026-01-01.sql.gz | docker compose -f docker-compose.prod.yml exec -T postgres psql -U $DB_USERNAME $DB_DATABASENoteA backup you have never restored is a hope, not a backup. Rehearse a restore into staging at least once, and confirm the dump is non-empty rather than trusting that the job ran.
Off-server copies
Backups are written to the same machine by default. Copy them somewhere else — object storage or another host — or a server failure takes the backups with it.