3.0 KiB
3.0 KiB
Backup & Restore Guide
What gets backed up
| File | Contents |
|---|---|
postgres.dump |
Full PostgreSQL database (pg_dump custom format) |
api-uploads.tar.gz |
User-uploaded files (vehicle images, documents, etc.) |
traefik-letsencrypt.tar.gz |
Let's Encrypt SSL certificates |
volumes/ |
Raw Docker volume archives (Redis, pgmanage, etc.) |
manifest.txt |
Backup metadata (timestamp, project name) |
Note: The
.env.docker.productionfile is NOT included in backups. Store it separately in a secure location (password manager, encrypted storage). You will need it to restore on a new server.
Running a Backup
cd ~/car_management_system
# Default — saves to ./backups/<timestamp>/
bash scripts/docker-prod-backup.sh
# Custom backup directory
bash scripts/docker-prod-backup.sh /mnt/external/backups
The script will create a timestamped directory, e.g.:
backups/rentaldrivego-prod-20260522T103000Z/
PostgreSQL does not need to be stopped. The script brings it up automatically if needed.
Running a Restore
Warning: Restore is destructive. It will overwrite the current database and uploaded files.
cd ~/car_management_system
bash scripts/docker-prod-restore.sh backups/rentaldrivego-prod-<timestamp> --yes
The --yes flag is required. Without it, the script exits with instructions.
What the restore does (in order)
- Stops all app services (api, dashboard, marketplace, admin, pgmanage, redis, traefik)
- Starts PostgreSQL
- Restores the database with
pg_restore --clean --if-exists - Restores uploaded files into the api_uploads volume
- Restores Traefik SSL certificates
- Restores remaining Docker volumes (Redis, pgmanage)
- Starts all services back up
Automated Daily Backups (cron)
To schedule a daily backup at 3:00 AM:
(crontab -l 2>/dev/null; echo '0 3 * * * cd /root/car_management_system && bash scripts/docker-prod-backup.sh /root/car_management_system/backups >> /var/log/rentaldrivego-backup.log 2>&1') | crontab -
Verify the cron job was added:
crontab -l
Cleaning up old backups
To keep only the last 7 days of backups, add a cleanup job:
(crontab -l 2>/dev/null; echo '30 3 * * * find /root/car_management_system/backups -maxdepth 1 -name "rentaldrivego-prod-*" -mtime +7 -exec rm -rf {} +') | crontab -
Restoring on a Fresh Server
- Install Docker and Docker Compose on the new server
- Clone the repository
- Recreate
.env.docker.production(from your secure backup of that file) - Copy the backup directory to the new server
- Run the restore script:
bash scripts/docker-prod-restore.sh /path/to/backup --yes
Verifying a Backup
Check the backup directory contents and sizes:
ls -lh backups/rentaldrivego-prod-<timestamp>/
cat backups/rentaldrivego-prod-<timestamp>/manifest.txt
Test that the database dump is valid:
pg_restore --list backups/rentaldrivego-prod-<timestamp>/postgres.dump | head -20