# FlixCooks auf Coolify deployen Zwei getrennte Ressourcen: **PostgreSQL** und **PHP-Web-App** (dieses Repo als Dockerfile). ## Architektur ``` ┌──────────────────── Coolify Server ────────────────────┐ │ │ │ ┌──────────────┐ ┌─────────────────────────┐ │ │ │ PostgreSQL │◄────────│ FlixCooks (dieses Image) │ │ │ │ (Service B) │ :5432 │ Apache + PHP 8.3 │ │ │ └──────────────┘ │ Port 80 → Traefik/HTTPS │ │ │ ▲ └─────────────────────────┘ │ │ │ ▲ │ │ Volume (Daten) Volume optional: │ │ data/ (site.json) │ └─────────────────────────────────────────────────────────┘ ``` Die App startet **nicht**, wenn `DATABASE_URL` fehlt oder Postgres nicht erreichbar ist. --- ## 1. PostgreSQL in Coolify anlegen 1. Neues **Database** → PostgreSQL (16). 2. Notieren: - Benutzer, Passwort, Datenbankname - **Internal URL** (Host ist oft der Service-Name, z. B. `postgresql-xxxxx` oder was Coolify anzeigt) 3. Format für die App: ```text postgresql://USER:PASSWORD@HOST:5432/DATABASE ``` Beispiel (Platzhalter durch Coolify-Werte ersetzen): ```text postgresql://flixcooks:geheim@postgresql-flixcooks:5432/flixcooks ``` **Wichtig:** In der App den **internen** Hostnamen verwenden (gleiches Coolify-Netzwerk), nicht `127.0.0.1`. --- ## 2. Web-App in Coolify anlegen 1. Neues **Application** → Build Pack: **Dockerfile** (Repository dieses Projekts). 2. Dockerfile-Pfad: `Dockerfile` (Root). 3. Port: **80** (Container exponiert Apache auf 80). 4. Health Check (optional, empfohlen): - Path: `/health.php` - Erwartet HTTP 200 mit `{"status":"ok"}` ### Environment Variables (Pflicht) | Variable | Beschreibung | | --------------------- | --------------------------------- | | `DATABASE_URL` | Interne Postgres-URL von Coolify | | `FLIXCOOKS_ADMIN_KEY` | Starkes Passwort für `/admin.php` | ### Environment Variables (optional) | Variable | Default | Beschreibung | | ------------------- | ------- | ------------------------------------------------------------------ | | `RUN_DB_SEED` | `false` | Einmalig `true` setzen → importiert `data/recipes.json` beim Start | | `DB_WAIT_MAX_TRIES` | `30` | Warteversuche bis Postgres da ist (à 2 s) | Nach dem ersten erfolgreichen Deploy: `RUN_DB_SEED` wieder auf `false` oder entfernen. ### Persistent Storage (empfohlen) Mount für Impressum/Datenschutz (`data/site.json`): | Mount Path (Container) | Inhalt | | ---------------------- | ----------------------------------------- | | `/var/www/html/data` | `site.json` bleibt nach Redeploy erhalten | Rezepte liegen in Postgres – **kein** Volume für Rezepte nötig. --- ## 3. Erstes Deployment (Checkliste) 1. Postgres-Service läuft (healthy). 2. App mit `DATABASE_URL` + `FLIXCOOKS_ADMIN_KEY` deployen. 3. Einmalig `RUN_DB_SEED=true` → Redeploy → Rezepte prüfen auf der Startseite. 4. `RUN_DB_SEED` deaktivieren. 5. `https://deine-domain/admin.php` testen. 6. `https://deine-domain/health.php` → `{"status":"ok"}`. ### Schema ohne Seed Tabellen legt der Container beim Start automatisch an (`scripts/schema.sql` via `require_database()`). Ohne Seed ist die DB leer → Seite lädt, aber keine Rezepte, bis du im Admin anlegst oder seedest. --- ## 4. Lokaler Test vor Coolify ```bash # Starkes Admin-Passwort setzen export FLIXCOOKS_ADMIN_KEY="dein-geheimes-passwort" # Mit Seed export RUN_DB_SEED=true docker compose build docker compose up -d curl http://127.0.0.1:8080/health.php ``` --- ## 5. Updates / Redeploy - Neues Image bauen lassen (Git push → Coolify rebuild). - Postgres-Volume bleibt → Daten bleiben. - `data/`-Volume bleibt → Site-Settings bleiben. - Kein manuelles `db-seed` bei Updates, außer du leerst die DB bewusst. --- ## 6. Sicherheit - `.env` wird **nicht** ins Image kopiert (`.dockerignore`). - Admin-Key **nur** über `FLIXCOOKS_ADMIN_KEY` in Coolify setzen. Ohne diese Variable ist `/admin.php` deaktiviert. - Postgres nicht öffentlich exponieren, wenn nicht nötig (nur interne URL). --- ## 7. Troubleshooting | Problem | Lösung | | -------------------------------- | --------------------------------------------------------------- | | Container startet nicht | Logs: DB nicht erreichbar → `DATABASE_URL` Host/Passwort prüfen | | 503 „Datenbank nicht verfügbar“ | Gleiches Netzwerk in Coolify? Internal URL? | | Leere Seite, Health OK | `RUN_DB_SEED=true` einmalig oder Admin-Rezepte anlegen | | Admin geht nicht | `FLIXCOOKS_ADMIN_KEY` gesetzt? | | `site.json` verloren nach Deploy | Volume auf `/var/www/html/data` mounten |