# Deployment Runbook — ERP Nutzfahrzeuge --- ## Prerequisites 1. **PostgreSQL** — running and accessible (managed or self-hosted) 2. **Redis** (optional) — if async features (OCR, retouch, mobile.de push) are needed 3. **Node.js** — for frontend build (if building at deploy time) 4. **Python 3.11+** — for backend runtime 5. **Coolify** (or Docker) — for containerized deployment --- ## Pre-Deployment Steps ### 1. Verify Environment Variables Ensure all required variables are configured in Coolify or `.env`: ```bash # Required DATABASE_URL=postgresql+asyncpg://:@:5432/ JWT_SECRET= # Important APP_ENV=production CORS_ORIGINS=https://your-frontend-domain.com UPLOAD_DIR=/app/uploads # persistent volume # Optional (feature-dependent) REDIS_URL=redis://:6379/0 OPENROUTER_API_KEY= MOBILE_DE_API_KEY= MOBILE_DE_SELLER_ID= ``` ### 2. Build Frontend ```bash cd frontend npm ci npm run build ``` Build artifacts are output to `frontend/.next/`. ### 3. Verify Backend Dependencies ```bash cd backend /opt/venv/bin/pip install -r requirements.txt /opt/venv/bin/python -c "from app.main import app; print('Import OK')" ``` ### 4. Database Migration (if applicable) ```bash cd backend /opt/venv/bin/python -m alembic upgrade head # if Alembic is configured # Or ensure tables are created via app startup ``` --- ## Deployment Steps (Coolify) ### Step 1: Create Resource 1. In Coolify, create a new resource (Docker Compose or Dockerfile-based) 2. Configure the source repository 3. Set the build/pack type ### Step 2: Configure Environment 1. Navigate to resource → Environment Variables 2. Add all variables from `deploy/env.md` 3. Ensure `JWT_SECRET` is a secure random value 4. Set `APP_ENV=production` ### Step 3: Configure Health Check 1. Set health check path to `/api/v1/health` 2. Set port to `8000` 3. See `deploy/healthcheck.md` for full configuration ### Step 4: Configure Persistent Storage 1. Mount a persistent volume for `UPLOAD_DIR` (e.g., `/app/uploads`) 2. Ensure database volume is persistent ### Step 5: Deploy 1. Click **Deploy** in Coolify 2. Wait for build and startup to complete 3. Verify health check passes (green status) 4. Test endpoints: - `GET /api/v1/health` → 200 `{"status":"ok"}` - `GET /` → 200 app metadata - `GET /openapi.json` → 200 OpenAPI schema ### Step 6: Post-Deployment Verification 1. Verify frontend is accessible at the configured domain 2. Test login flow: `POST /api/v1/auth/login` with valid credentials 3. Verify CORS headers are present for frontend origin 4. Check logs for any errors: ```bash docker logs --tail 50 ``` --- ## Deployment Steps (Docker Compose) ### docker-compose.yml (template) ```yaml version: '3.8' services: backend: build: ./backend ports: - "8000:8000" environment: - DATABASE_URL=postgresql+asyncpg://user:pass@db:5432/erp - JWT_SECRET=${JWT_SECRET} - APP_ENV=production - CORS_ORIGINS=https://your-domain.com - UPLOAD_DIR=/app/uploads - REDIS_URL=redis://redis:6379/0 volumes: - uploads:/app/uploads depends_on: - db - redis healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/api/v1/health"] interval: 30s timeout: 5s retries: 3 start_period: 10s db: image: postgres:16-alpine environment: - POSTGRES_USER=erp_user - POSTGRES_PASSWORD=${DB_PASSWORD} - POSTGRES_DB=erp volumes: - pgdata:/var/lib/postgresql/data redis: image: redis:7-alpine volumes: - redisdata:/data frontend: build: ./frontend ports: - "3000:3000" depends_on: - backend volumes: uploads: pgdata: redisdata: ``` --- ## Start Command (standalone) ```bash cd backend && /opt/venv/bin/python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 ``` For production with workers: ```bash cd backend && /opt/venv/bin/python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4 ``` --- ## Rollback See `deploy/rollback.md` for rollback procedure.