b9ad7f0c40
Project character, agent rules, and run/deploy docs for mobea.de. Co-authored-by: Cursor <cursoragent@cursor.com>
114 lines
3.4 KiB
Markdown
114 lines
3.4 KiB
Markdown
# 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.
|