Files
carmanagement/scripts/backup-restore-guide.md
T
root 8aab968e09
Build & Deploy / Build & Push Docker Image (push) Successful in 1m2s
Test / Type Check (all packages) (push) Failing after 28s
Test / API Unit Tests (push) Has been skipped
Test / Homepage Unit Tests (push) Has been skipped
Test / Storefront Unit Tests (push) Has been skipped
Test / Admin Unit Tests (push) Has been skipped
Test / Dashboard Unit Tests (push) Has been skipped
Test / API Integration Tests (push) Has been skipped
Build & Deploy / Deploy to VPS (push) Successful in 3s
refactor: rename marketplace to storefront across the entire monorepo
Comprehensive rename of all marketplace references to storefront:
- API module: apps/api/src/modules/marketplace/ → storefront/
- Components: MarketplaceHeader → StorefrontHeader, MarketplaceShell →
  StorefrontShell, MarketplaceFooter → StorefrontFooter
- Types: marketplace-homepage.ts → storefront-homepage.ts
- Test files: employee-marketplace-* → employee-storefront-*
- All source code identifiers, imports, route paths, and strings
- Documentation (docs/), CI config (.gitlab-ci.yml), scripts
- Dashboard, admin, storefront workspace references
- Prisma field names preserved (isListedOnMarketplace, marketplaceRating,
  marketplaceFunnelEvent) as they map to database schema

Validation:
- API type-check: 0 errors
- Storefront type-check: 0 errors
- Dashboard type-check: 0 errors
- Full monorepo type-check: only pre-existing admin TS18046
2026-06-28 01:14:46 -04:00

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.production file 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)

  1. Stops all app services (api, dashboard, storefront, admin, pgmanage, redis, traefik)
  2. Starts PostgreSQL
  3. Restores the database with pg_restore --clean --if-exists
  4. Restores uploaded files into the api_uploads volume
  5. Restores Traefik SSL certificates
  6. Restores remaining Docker volumes (Redis, pgmanage)
  7. 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

  1. Install Docker and Docker Compose on the new server
  2. Clone the repository
  3. Recreate .env.docker.production (from your secure backup of that file)
  4. Copy the backup directory to the new server
  5. 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