# mobea.de Tägliche Satire-Website — [mobea.de](https://mobea.de/) *Das Startup, das jeden Tag ein anderes Startup ist.* **Vision & Ton:** [SOUL.md](SOUL.md) ## Was passiert hier? Ein Python-Generator erfindet jeden Tag ein neues absurdes Startup (OpenRouter), rendert eine Landing Page (Jinja2) und legt optional ein Hero-Bild an (Pixazo SDXL). Ausgabe landet in `public/`; nginx liefert statisch aus. Alle Kauf-/Kontakt-Links führen zu `/echt-jetzt/` — Satire-Disclaimer, kein echtes Produkt. ## Projektstruktur ```text / ├── compose.yml # nginx + Generator (Produktion) ├── nginx.conf ├── generator/ │ ├── generate.py # Tages-Generator │ ├── backfill.py # Archiv-Lücken nachfüllen │ ├── topics.py # Themen-Pool │ ├── templates/ # startup.html.j2, archiv.html.j2 │ └── Dockerfile ├── public/ # Webroot (teilweise generiert, siehe unten) │ └── echt-jetzt/ # Fourth-Wall-Seite (im Repo) └── data/ # archive.json (generiert, gitignored) ``` ## Voraussetzungen - Docker + Docker Compose (Produktion) - Optional lokal: Python 3.12+, `venv` - API-Keys in `.env` (Vorlage: [`.env.example`](.env.example)) | Variable | Zweck | |----------|--------| | `OPENROUTER_API_KEY` | Text-Generierung (Pflicht) | | `OPENROUTER_MODEL` | z. B. `openai/gpt-4o-mini` | | `PIXAZO_API_KEY` | Hero-Bild (optional) | ## Lokale Entwicklung ### Generator einmal ausführen ```sh cp .env.example .env # Keys eintragen cd generator python -m venv .venv source .venv/bin/activate pip install -r requirements.txt SITE_DIR=../public DATA_DIR=../data python generate.py ``` Der Generator läuft standardmäßig ab **05:00 UTC** pro Tag; vorher wird eine bestehende Edition nicht überschrieben. Für erneutes Generieren am selben Tag: `public/index.html` und den heutigen Eintrag in `data/archive.json` entfernen. ### Archiv backfillen ```sh cd generator source .venv/bin/activate SITE_DIR=../public DATA_DIR=../data python backfill.py --from 2026-01-01 --to 2026-01-07 ``` ### Statische Seite lokal ansehen Nach einem Generator-Lauf (oder mit vorhandenem `public/index.html`): ```sh docker run --rm -p 8080:80 \ -v "$(pwd)/public:/usr/share/nginx/html:ro" \ -v "$(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro" \ nginx ``` → [http://localhost:8080](http://localhost:8080) ### Mit Docker Compose (wie auf dem Server) ```sh cp .env.example .env docker compose up -d --build ``` Benötigt das externe Netzwerk `traefik` (auf `boka` vorhanden). Lokal ggf. nur den Generator-Container nutzen oder das Netzwerk einmal anlegen: `docker network create traefik`. ## Deployment Manuell per SSH auf `boka` — siehe auch [INFRASTRUCTURE.md](INFRASTRUCTURE.md). ```sh ssh frank-schwenk.de cd /home/frank/mobea.de git pull docker compose up -d --build ``` Der Generator-Container versucht stündlich `generate.py`; ein Fehlschlag stoppt die Schleife nicht. ## Was im Repo liegt vs. generiert wird | Im Git | Generiert (gitignored) | |--------|-------------------------| | `public/echt-jetzt/`, Favicon, Manifest, `robots.txt` | `public/index.html` | | `generator/templates/`, Python-Code | `public/archiv/` | | | `public/img/` | | | `data/archive.json` | ## Tests Keine automatisierte Test-Suite. Nach UI-Änderungen: Generator-Lauf + Seite in Mobile-Breite (~390px) prüfen.