# Server Deployment (Docker Compose) ## Ziel Pounce auf einem Server starten mit: - **Frontend** (Next.js) - **Backend API** (FastAPI) - **Postgres** - **Redis** (Rate-Limit Storage + Job Queue) - **Scheduler** (APScheduler) – **separater Prozess** - **Worker** (ARQ) – **separater Prozess** Damit laufen Jobs nicht mehrfach bei mehreren API-Workern und die UI bleibt schnell. --- ## Voraussetzungen - Linux Server (z.B. Ubuntu 22.04+) - Docker + Docker Compose Plugin - Domain + HTTPS Reverse Proxy (empfohlen), damit Cookie-Auth zuverlässig funktioniert --- ## 1) Repo auf den Server holen ```bash cd /opt git clone pounce cd pounce ``` --- ## 2) Server-Environment anlegen In `/opt/pounce`: ```bash cp DEPLOY_docker_compose.env.example .env ``` Dann `.env` öffnen und mindestens setzen: - **DB_PASSWORD** - **SECRET_KEY** - **SITE_URL** (z.B. `https://pounce.example.com`) - **ALLOWED_ORIGINS** (z.B. `https://pounce.example.com`) Optional (aber empfohlen): - **SMTP_\*** (für Alerts/Emails) - **COOKIE_DOMAIN** (wenn du Cookies über Subdomains teilen willst) --- ## 3) Starten ```bash docker compose up -d --build ``` Services: - `frontend` (Port 3000) - `backend` (Port 8000) - `scheduler` (kein Port) - `worker` (kein Port) - `db` (kein Port) - `redis` (kein Port) --- ## 4) Initial Setup (1× nach erstem Start) ### DB Tabellen + Baseline Seed ```bash docker compose exec backend python scripts/init_db.py ``` ### TLD Price Seed (886+) ```bash docker compose exec backend python scripts/seed_tld_prices.py ``` --- ## 5) Reverse Proxy (empfohlen) ### Warum? Das Frontend ruft im Browser standardmässig `https:///api/v1/...` auf (same-origin). Darum solltest du: - **HTTPS** terminieren - `/api/v1/*` an das Backend routen - `/` an das Frontend routen ### Beispiel: Caddy (sehr simpel) ```caddy pounce.example.com { encode zstd gzip # API handle_path /api/v1/* { reverse_proxy 127.0.0.1:8000 } # Frontend reverse_proxy 127.0.0.1:3000 # optional: metrics nur intern @metrics path /metrics handle @metrics { respond 403 } } ``` Wichtig: - Setze `SITE_URL=https://pounce.example.com` - Setze `COOKIE_SECURE=true` (oder via `ENVIRONMENT=production`) --- ## 6) Checks (nach Deploy) ```bash curl -f http://127.0.0.1:8000/health curl -f http://127.0.0.1:8000/metrics ``` Logs: ```bash docker compose logs -f backend docker compose logs -f scheduler docker compose logs -f worker ``` --- ## 7) Updates ```bash cd /opt/pounce git pull docker compose up -d --build ``` --- ## Troubleshooting (häufig) - **Cookies/Login klappt nicht**: - Prüfe `SITE_URL` und HTTPS (Secure Cookies) - Prüfe `ALLOWED_ORIGINS` (falls Frontend/Backend nicht same-origin sind) - **Scheduler läuft doppelt**: - Stelle sicher, dass nur **ein** `scheduler` Service läuft (keine zweite Instanz) - **Emails werden nicht gesendet**: - `docker compose exec scheduler env | grep SMTP_` - SMTP Vars müssen im Container vorhanden sein (kommen aus `.env`)