# Entscheidomat

Entscheidomat ist eine deutschsprachige Next.js-Web-App mit sieben kostenlosen
Zufalls-Tools: Ja/Nein-Generator, Münze, Glücksrad, Würfel,
Zufallszahl-Generator, Magic 8-Ball und Namen-Auslosung.

Die Anwendung wird als Docker-Container gebaut und hinter einem Reverse Proxy
wie Caddy betrieben. Diese Anleitung beschreibt den kompletten Weg vom
Produktionsserver bis zum sicheren Go-live von `entscheidomat.com`.

## Überblick

```text
Browser
  -> Cloudflare DNS / CDN (optional)
  -> Caddy (TLS, HTTPS, Redirects)
  -> Docker-Container auf Port 3000
  -> Next.js-App
```

Die App selbst enthält keine Datenbank. Eigene Einstellungen der Tools werden im
Browser der Nutzenden gespeichert. Umami Cloud wird für anonyme,
aggregierte Nutzungsstatistiken geladen.

## Voraussetzungen

Auf dem Produktionsserver werden benötigt:

- Linux-Server mit aktuellem Docker und Docker Compose Plugin
- eine Domain, z. B. `entscheidomat.com`
- Zugriff auf die DNS-Verwaltung, ggf. Cloudflare
- Caddy als Reverse Proxy (oder ein gleichwertiger Proxy)
- offene Ports `80` und `443` für Caddy

Prüfen:

```bash
docker --version
docker compose version
caddy version
```

## 1. Projekt auf den Server übertragen

Lege auf dem Server ein Verzeichnis für die Anwendung an und übertrage den
Projektordner dorthin. Bei einem Git-Repository ist ein Clone am einfachsten:

```bash
git clone <DEIN-REPOSITORY-URL> /opt/entscheidomat
cd /opt/entscheidomat
```

Ohne Git kannst du den Projektordner per `rsync` oder SFTP übertragen. Nicht
mit übertragen werden müssen `node_modules` und `.next`; Docker erzeugt beides
beim Build neu.

## 2. Produktionsumgebung konfigurieren

Erstelle im Projektordner eine `.env`-Datei:

```bash
APP_PORT=127.0.0.1:3000
```

Damit ist der App-Port nur lokal auf dem Server erreichbar. Caddy leitet
Anfragen intern an die App weiter; Port 3000 muss nicht öffentlich offen sein.

> Die `.env`-Datei gehört nicht in ein öffentliches Repository. Aktuell werden
> für die Anwendung keine weiteren Server-Geheimnisse benötigt.

## 3. App bauen und starten

```bash
cd /opt/entscheidomat
docker compose up -d --build
docker compose ps
docker compose logs -f app
```

Lokaler Gesundheitscheck auf dem Server:

```bash
curl -I http://127.0.0.1:3000/
```

Erwartet wird `HTTP/1.1 200 OK`.

## 4. Caddy konfigurieren

Lege eine Caddy-Konfiguration an oder ergänze die bestehende Caddyfile. Der
folgende Aufbau leitet `www` permanent auf die Hauptdomain und nutzt Caddy für
TLS und Reverse Proxying:

```caddyfile
www.entscheidomat.com {
    redir https://entscheidomat.com{uri} permanent
}

entscheidomat.com {
    encode zstd gzip
    reverse_proxy 127.0.0.1:3000
}
```

Nach dem Ändern die Konfiguration prüfen und neu laden:

```bash
caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
```

Der genaue Pfad kann je nach Caddy-Installation abweichen.

## 5. DNS und Cloudflare

Lege für die Domain folgende DNS-Einträge an:

| Typ | Name | Ziel |
| --- | --- | --- |
| A | `@` | Öffentliche IPv4-Adresse des Servers |
| CNAME | `www` | `entscheidomat.com` |

Wenn Cloudflare verwendet wird:

1. Stelle SSL/TLS auf **Full (strict)**.
2. Lass Caddy ein gültiges Zertifikat verwalten oder nutze ein korrekt
   eingerichtetes Cloudflare Origin Certificate.
3. Aktiviere erst nach erfolgreichem Origin-Test den Proxy-Modus (orange Wolke).
4. Lege keine Cache-Regel an, die HTML-Seiten oder `robots.txt`/`sitemap.xml`
   dauerhaft mit einem 404-Status cached.

## 6. Go-live-Prüfung

Nach DNS-Propagation alle folgenden Befehle ausführen:

```bash
curl -I https://entscheidomat.com/
curl -I https://entscheidomat.com/ja-nein-generator
curl -I https://entscheidomat.com/robots.txt
curl -I https://entscheidomat.com/sitemap.xml
curl -I http://entscheidomat.com/
curl -I https://www.entscheidomat.com/
```

Erwartungen:

- Startseite, Toolseiten, `robots.txt` und `sitemap.xml`: `200`
- HTTP und `www`: ein permanenter Redirect auf `https://entscheidomat.com`
- keine Cloudflare- oder Proxy-404-Seiten

Danach im Browser prüfen:

- Canonical URLs
- Titel und Meta-Beschreibungen
- Open-Graph-Vorschau
- alle sieben Toolseiten
- Impressum und Datenschutzerklärung

## 7. SEO nach dem Launch

1. Property in Google Search Console und Bing Webmaster Tools bestätigen.
2. `https://entscheidomat.com/sitemap.xml` einreichen.
3. Nach einigen Tagen Coverage, Indexierung und Core Web Vitals prüfen.
4. Regelmäßig die Umami-Daten und Suchanfragen aus der Search Console auswerten.

Die App erzeugt statisch unter anderem:

- `/robots.txt`
- `/sitemap.xml`
- `/opengraph-image`
- `/twitter-image`

## Aktualisierungen deployen

Bei jeder Änderung:

```bash
cd /opt/entscheidomat
git pull
docker compose up -d --build
docker compose logs --tail=100 app
```

Ohne Git zuerst die neuen Dateien übertragen und anschließend nur die letzten
zwei Befehle ausführen.

Bei einem Fehler lässt sich der vorherige, funktionierende Stand am einfachsten
über den vorherigen Git-Commit und einen erneuten Build wiederherstellen.

## Betrieb und Diagnose

```bash
# Container-Status
docker compose ps

# Live-Logs
docker compose logs -f app

# Neustart ohne Neubau
docker compose restart app

# Lokalen Container-Check ausführen
docker compose exec app wget --spider -q http://localhost:3000/
```

Für Caddy:

```bash
sudo systemctl status caddy
sudo journalctl -u caddy -f
```

Richte zusätzlich einen externen Uptime-Monitor für mindestens diese URLs ein:

- `https://entscheidomat.com/`
- `https://entscheidomat.com/robots.txt`
- `https://entscheidomat.com/sitemap.xml`

## Datenschutz und rechtliche Launch-Checkliste

Vor der öffentlichen Veröffentlichung müssen die Angaben in Impressum und
Datenschutzerklärung auf die tatsächliche Konfiguration abgestimmt werden:

- vollständige ladungsfähige Geschäftsanschrift des Einzelunternehmens
- tatsächlicher Name des Hostinganbieters
- Serverstandort Texas, USA, sowie Speicherdauer der Server-Logfiles
- dokumentierte Grundlage für den Datenübertragungsmechanismus in die USA
- Umami Cloud mit gewählter Datenregion EU und die passende
  Auftragsverarbeitungs-/Datenschutzdokumentation
- Umsatzsteuer-ID oder Wirtschafts-ID nur, falls tatsächlich vorhanden

Die vorhandenen Texte sind ein Pre-Launch-Stand und keine individuelle
Rechtsberatung. Vor dem Livegang sollte die finale Fassung rechtlich geprüft
werden.

## Lokale Entwicklung

```bash
npm ci
npm run dev
npm run lint
npm run build
```

Die lokale App ist anschließend unter `http://localhost:3000` erreichbar.

## Tech-Stack

- Next.js 16, React 19 und TypeScript
- Tailwind CSS v4
- Docker mit Multi-Stage-Build
- Caddy als Reverse Proxy
- Cloudflare optional für DNS/CDN
- Umami Cloud, Datenregion EU
