docker compose -f docker-compose.dev.yml up -d postgres
docker compose -f docker-compose.dev.yml up -d redis
docker compose -p rentaldrivego-prod --env-file .env.docker.production -f docker-compose.production.yml up --build -d --no-deps carplace
docker compose -p rentaldrivego-prod --env-file .env.docker.production -f docker-compose.production.yml up --build -d --no-deps admin
docker compose -f docker-compose.dev.yml --profile full up --build
docker compose -f docker-compose.dev.yml --profile dashboard up --build
docker compose -f docker-compose.dev.yml --profile carplace up --build
docker compose -f docker-compose.dev.yml --profile api up --build


Default dev admin:

Email: platform.ops@rentaldrivego.com
Password: PlatformOps123!



What this means:

docker compose -f docker-compose.dev.yml --profile full up --build will no longer reseed or redeploy the DB on every fix.
Your data stays as long as you do not run docker compose ... down -v or manually delete the Docker volumes.
If you later change the schema and want to apply it without wiping data, run:
docker compose -f docker-compose.dev.yml run --rm migrate sh -c "npm run db:deploy"
Production was already using a persistent named Postgres volume, so the main issue was the dev bootstrap behavior. Restart the dev stack once for this change to take effect.








Done. The DOCKER.md production section now covers the full deployment flow from a fresh server. The short version:


# Once per server
docker network create traefik-proxy

# Clone & configure
git clone <repo> rentaldrivego && cd rentaldrivego
cp .env.docker.production.example .env.docker.production
# → fill in POSTGRES_PASSWORD, JWT_SECRET, ACME_EMAIL, RESEND_API_KEY

# Deploy
docker compose -f traefik.yaml up -d
docker compose -p rentaldrivego-prod --env-file .env.docker.production -f docker-compose.production.yml up --build -d
