# 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                         |


