255 lines
6.6 KiB
Markdown
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
|