156 lines
4.6 KiB
Markdown
156 lines
4.6 KiB
Markdown
# MOBEA — Das Startup, das jeden Tag ein anderes Startup ist
|
||
|
||
Tägliche KI-Satire. Jeden Tag eine neue absurde Fake-Firma — todernst verkauft.
|
||
[🌐 mobea.de](https://mobea.de/)
|
||
|
||
---
|
||
|
||
## Das Konzept
|
||
|
||
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)
|
||
|
||
> 📖 [SOUL.md](SOUL.md) — Vollständige Vision, Ton und Design-Regeln
|
||
|
||
## Projektstruktur
|
||
|
||
```
|
||
/
|
||
├── compose.yml # nginx + Generator (Production)
|
||
├── compose.dev.yml # Lokale Dev-Umgebung (kein Traefik)
|
||
├── nginx.conf # nginx Konfiguration (JSON logging, security)
|
||
├── generator/
|
||
│ ├── 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
|
||
```
|
||
|
||
## Schnelleinstieg
|
||
|
||
### Voraussetzungen
|
||
|
||
- Docker + Docker Compose
|
||
- Optional lokal: Python 3.12+, venv
|
||
|
||
### API-Keys
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
# Editor auf → 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
|
||
pip install -r requirements.txt
|
||
|
||
SITE_DIR=../public DATA_DIR=../data python generate.py
|
||
```
|
||
|
||
Output: `public/index.html` + `public/archiv/YYYY-MM-DD.html`
|
||
|
||
### Lokal dev-en (einzeln)
|
||
|
||
```bash
|
||
# Generator ausführen
|
||
SITE_DIR=../public DATA_DIR=../data python generator/generate.py
|
||
|
||
# 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
|
||
```
|
||
|
||
### Kompletter Stack (Docker Compose)
|
||
|
||
```bash
|
||
# Lokal (kein Traefik nötig)
|
||
docker compose -f compose.yml -f compose.dev.yml up -d --build
|
||
# → http://localhost:8081
|
||
|
||
# Auf boka (Traefik aus compose.yml)
|
||
docker compose up -d --build
|
||
```
|
||
|
||
### Archive backfillen
|
||
|
||
```bash
|
||
cd generator
|
||
source .venv/bin/activate
|
||
python generate.py --backfill 2026-01-01 2026-01-07
|
||
```
|
||
|
||
## Deployment auf boka
|
||
|
||
```bash
|
||
ssh frank-schwenk.de
|
||
cd /home/frank/mobea.de
|
||
git pull
|
||
docker compose up -d --build
|
||
```
|
||
|
||
## Theming
|
||
|
||
5 visuelle Themes (deterministisch pro Tag gewürfelt):
|
||
|
||
| 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 |
|
||
|
||
## Gesundheit
|
||
|
||
```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.
|