# Deployment Guide ## Prerequisites - Git installed on the server - Docker and Docker Compose installed on the server ## Step 1: Configure environment Copy the example env file and fill in real values: ```bash cp .env.production.example .env.production ``` Edit `.env.production` and set all 11 variables: - `DATABASE_URL` — Neon PostgreSQL connection string - `SIGNING_JWT_SECRET` — secret for signing JWT tokens - `AUTH_SECRET` — NextAuth secret - `AGENT_EMAIL` — agent login email - `AGENT_PASSWORD` — agent login password - `CONTACT_EMAIL_USER` — SMTP username - `CONTACT_EMAIL_PASS` — SMTP password - `CONTACT_SMTP_HOST` — SMTP host (e.g. `smtp.gmail.com`) - `CONTACT_SMTP_PORT` — SMTP port (e.g. `465`) - `OPENAI_API_KEY` — OpenAI API key for AI field placement - `APP_BASE_URL` — public URL of the app (e.g. `https://teressacopelandhomes.com`) ## Step 2: Run database migration Run migrations from the project directory on the host (not inside Docker): ```bash DATABASE_URL= npx drizzle-kit migrate ``` This must complete successfully before starting the container. Migrations are never run inside the Docker image. ## Step 3: Build and start ```bash docker compose up -d --build ``` ## Step 4: Verify ```bash curl http://localhost:3000/api/health ``` Expected response: `{"ok":true,"db":"connected"}` ## Updating To deploy a new version: ```bash git pull # If schema changed, re-run migration first: DATABASE_URL= npx drizzle-kit migrate docker compose up -d --build ```