Kyle DammannandClaude Opus 5.5 9256e94286 Add phase 3: comments and cooking mode
- Comments on visible recipes; author and admin may delete; per-user
  hourly rate limit (COMMENT_RATE_LIMIT_PER_HOUR)
- Cooking mode with large text, tick-off checklists, serving scaling and
  Screen Wake Lock to keep the display on
- Serving calculator auto-submits on change
- Privacy tests cover comment and cooking-mode URLs

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 21:39:15 +01:00

Kochbuch

Selbst gehostetes Familien-Kochbuch mit Einladungen, privaten und öffentlichen Rezepten und KI-Import. Läuft per docker compose (App + PostgreSQL) hinter einem bestehenden Reverse Proxy.

Stand: Phase 1 (Konten, Einladungen, Rollen). Die vollständige Anleitung inkl. Update und Backup folgt in Phase 6.

Installation

git clone <gitea-url>/kochbuch.git && cd kochbuch
./scripts/init-env.sh [email protected]     # erzeugt .env mit zufälligen Secrets und Admin-Passwort
nano .env                                # APP_BASE_URL, TRUSTED_PROXIES, APP_PORT prüfen
docker compose up -d --build
docker compose ps                        # app sollte nach ~30 s "healthy" sein

Danach mit der Admin-E-Mail und dem ausgegebenen Passwort anmelden. ADMIN_PASSWORD kann nach dem ersten Start aus der .env entfernt werden – ein bestehendes Konto wird nie überschrieben.

Weitere Personen lädst du unter Menü → Einladungen ein. Der Link wird nur einmal angezeigt. Passwort vergessen? Menü → Nutzer verwalten → Aktionen: Reset-Link oder temporäres Passwort.

Reverse Proxy (Nginx + Cloudflare)

Die App spricht nur HTTP auf APP_PORT. Beispiel für Nginx:

server {
    server_name kochbuch.dammann.vip;
    # listen/ssl wie bei deinen anderen Diensten

    client_max_body_size 30m;               # Foto-Uploads

    location / {
        proxy_pass http://<docker-host>:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_read_timeout 120s;            # KI-Aufrufe können dauern
    }
}

Client-IP: Die App wertet X-Forwarded-For nur aus, wenn die Anfrage von einer IP aus TRUSTED_PROXIES kommt. Das ist wichtig für das Login-Rate-Limit. Mit Cloudflare gibt es zwei Wege:

  • Nginx ermittelt die echte IP selbst (set_real_ip_from <Cloudflare-Netze>; real_ip_header CF-Connecting-IP;). Dann reicht TRUSTED_PROXIES=<IP deines Nginx>.
  • Oder in der .env CLIENT_IP_HEADER=CF-Connecting-IP setzen. Nur sinnvoll, wenn dein Nginx ausschließlich über Cloudflare erreichbar ist, sonst kann der Header gefälscht werden.

Konfiguration

Alle Variablen stehen kommentiert in .env.example.

Entwicklung

python -m venv .venv && . .venv/bin/activate
pip install -r requirements-dev.txt
python -m pytest                          # Tests (SQLite)
python scripts/dev_server.py              # http://localhost:8000
docker compose --profile test run --rm test   # Tests gegen PostgreSQL
S
Description
No description provided
Readme
227 KiB
Languages
Python 81.3%
HTML 10.4%
CSS 4.5%
Shell 2.4%
JavaScript 1%
Other 0.4%