Files
entscheidomat/README.md
2026-07-23 21:59:15 +02:00

255 lines
6.6 KiB
Markdown

# 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