docs: refresh context files and add project URLS

This commit is contained in:
Frank Schwenk
2026-10-01 20:23:20 +02:00
parent b9ad7f0c40
commit 9e9fbe7be2
8 changed files with 509 additions and 231 deletions
+105 -63
View File
@@ -1,113 +1,155 @@
# mobea.de
# MOBEA — Das Startup, das jeden Tag ein anderes Startup ist
Tägliche Satire-Website — [mobea.de](https://mobea.de/)
Tägliche KI-Satire. Jeden Tag eine neue absurde Fake-Firma — todernst verkauft.
[🌐 mobea.de](https://mobea.de/)
*Das Startup, das jeden Tag ein anderes Startup ist.*
---
**Vision & Ton:** [SOUL.md](SOUL.md)
## Das Konzept
## Was passiert hier?
1. AI würfelt 1–2 Themen aus dem Pool (Buzzwords, Esoterik, Pet-Tech,…)
2. **OpenRouter** generiert Landing-Page-Inhalte (Pitch, Features, Preise, Testimonials, FAQ)
3. Optional: **Pixazo SDXL** erzeugt ein Hero-Bild
4. **Jinja2** rendert `public/index.html` + Archiv-Eintrag
5. **nginx** liefert statisch aus — alle CTAs führen zu `/echt-jetzt/` (Satire-Disclaimer)
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.
> 📖 [SOUL.md](SOUL.md) — Vollständige Vision, Ton und Design-Regeln
## Projektstruktur
```text
```
/
├── compose.yml # nginx + Generator (Produktion)
├── nginx.conf
├── compose.yml # nginx + Generator (Production)
├── compose.dev.yml # Lokale Dev-Umgebung (kein Traefik)
├── nginx.conf # nginx Konfiguration (JSON logging, security)
├── 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)
│ ├── config.py # Einstellungen aus Environment-Variablen
│ ├── generate.py # CLI-Entry-Point für manuelles/backfill
│ ├── pipeline.py # Pipeline-Orchestrator (LLM → HTML → Archive)
│ ├── llm.py # OpenRouter API mit retries + hedging
│ ├── images.py # Responsive Hero-Image Pipeline (PIL)
│ ├── topics.py # Themen-Pool & Selection
│ ├── templates.py # Jinja2 Rendering & Template Utilities
│ ├── feed.py # Atom Feed Generator
│ ├── share.py # Share Card SVG Generator
│ ├── health.py # Health Check Status
│ ├── entrypoint.sh # Cron-Loop (prodcution)
│ ├── Dockerfile # Multi-stage build (python:alpine)
│ └── templates/
│ ├── startup.html.j2 # Täglich generierte Landing Page
│ ├── archiv.html.j2 # Archiv-Übersicht
│ └── _head_common.j2 # Favicon, OG/Twitter tags
├── public/ # Webroot (generiert, gitignored)
│ ├── echt-jetzt/ # Satire-Disclaimer (statisch, im Repo)
│ └── index.html # Heute (generiert)
├── data/ # archive.json (generiert, gitignored)
└── generate_health.py # Health.json generieren
```
## Voraussetzungen
## Schnelleinstieg
- Docker + Docker Compose (Produktion)
- Optional lokal: Python 3.12+, `venv`
- API-Keys in `.env` (Vorlage: [`.env.example`](.env.example))
### Voraussetzungen
| Variable | Zweck |
|----------|--------|
| `OPENROUTER_API_KEY` | Text-Generierung (Pflicht) |
| `OPENROUTER_MODEL` | z. B. `openai/gpt-4o-mini` |
| `PIXAZO_API_KEY` | Hero-Bild (optional) |
- Docker + Docker Compose
- Optional lokal: Python 3.12+, venv
## Lokale Entwicklung
### API-Keys
### Generator einmal ausführen
```bash
cp .env.example .env
# Editor auf → Keys eintragen
```
```sh
cp .env.example .env # Keys eintragen
| Variable | Pflicht | Zweck |
|----------|---------|-------|
| `OPENROUTER_API_KEY` | ✅ | Text-Generierung |
| `OPENROUTER_MODEL` | | z.B. `openai/gpt-4o-mini` |
| `PIXAZO_API_KEY` | | Hero-Bilder (optional) |
### Einmal generator starten
```bash
cd generator
python -m venv .venv
source .venv/bin/activate
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.
Output: `public/index.html` + `public/archiv/YYYY-MM-DD.html`
### Archiv backfillen
### Lokal dev-en (einzeln)
```sh
cd generator
source .venv/bin/activate
SITE_DIR=../public DATA_DIR=../data python backfill.py --from 2026-01-01 --to 2026-01-07
```
```bash
# Generator ausführen
SITE_DIR=../public DATA_DIR=../data python generator/generate.py
### Statische Seite lokal ansehen
Nach einem Generator-Lauf (oder mit vorhandenem `public/index.html`):
```sh
docker run --rm -p 8080:80 \
# nginx für statische Ausgabe
docker run --rm -p 8081:80 \
-v "$(pwd)/public:/usr/share/nginx/html:ro" \
-v "$(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro" \
nginx
# → http://localhost:8081
```
→ [http://localhost:8080](http://localhost:8080)
### Kompletter Stack (Docker Compose)
### Mit Docker Compose (wie auf dem Server)
```bash
# Lokal (kein Traefik nötig)
docker compose -f compose.yml -f compose.dev.yml up -d --build
# → http://localhost:8081
```sh
cp .env.example .env
# Auf boka (Traefik aus compose.yml)
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`.
### Archive backfillen
## Deployment
```bash
cd generator
source .venv/bin/activate
python generate.py --backfill 2026-01-01 2026-01-07
```
Manuell per SSH auf `boka` — siehe auch [INFRASTRUCTURE.md](INFRASTRUCTURE.md).
## Deployment auf boka
```sh
```bash
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.
## Theming
## Was im Repo liegt vs. generiert wird
5 visuelle Themes (deterministisch pro Tag gewürfelt):
| 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` |
| Theme | Accent | Vibe |
|-------|--------|------|
| **corporate** | `#2563eb` Blau | Clean SaaS, System-UI |
| **neon** | `#00f5d4` + `#a855f7` | Dark Cyber, Glow |
| **mystic** | `#d4a853` Gold | Dunkelviolet, Georgia |
| **brutalist** | `#ff0000` Rot | Schwarz-Weiß, Courier |
| **pastel** | `#f472b6` Pink | Soft Gradients, große Radien |
## Tests
## Gesundheit
Keine automatisierte Test-Suite. Nach UI-Änderungen: Generator-Lauf + Seite in Mobile-Breite (~390px) prüfen.
```bash
# Health-Status als JSON
curl -s http://localhost:8081/health
# Generator health generieren
python generate_health.py
# → public/health.json
```
## Non-Goals (Anti-Manifest)
- Kein echtes Startup, keine Leads, kein Impressum
- Kein Tracking/Analytics — Privacy by design
- Kein Engagement-Bait oder Newsletter-Tracking
- Keine Datenansammlung — nichts wird gespeichert außer dem Archiv
---
**Made with AI, satirized by humans.** [SOUL.md](SOUL.md) für Design-Regeln.