This commit is contained in:
Timo Knuth
2026-02-27 15:19:24 +01:00
parent b7f8221095
commit 253c3c1c6d
134 changed files with 11188 additions and 1871 deletions

View File

@@ -108,13 +108,148 @@ Alle API-Endpunkte sind typsicher über tRPC definiert:
## Deployment
### Admin (Vercel)
### Admin — Docker (empfohlen für Self-Hosting)
**Voraussetzungen:** Docker + Docker Compose auf dem Server installiert.
#### Schritt 1: Repository klonen
```bash
git clone <repo-url>
cd innungsapp
```
#### Schritt 2: Umgebungsvariablen anlegen
```bash
cp .env.production.example .env
```
Dann `.env` öffnen und **alle Werte** befüllen:
| Variable | Beschreibung |
|---|---|
| `BETTER_AUTH_SECRET` | Zufälliger String (min. 32 Zeichen) — z.B. `openssl rand -hex 32` |
| `BETTER_AUTH_URL` | Öffentliche URL der App, z.B. `https://app.deine-innung.de` |
| `NEXT_PUBLIC_APP_URL` | Gleicher Wert wie `BETTER_AUTH_URL` |
| `EMAIL_FROM` | Absender-Adresse für Magic Links |
| `SMTP_HOST` | SMTP-Server-Adresse |
| `SMTP_PORT` | Meistens `587` (STARTTLS) oder `465` (SSL) |
| `SMTP_USER` | SMTP-Benutzername |
| `SMTP_PASS` | SMTP-Passwort |
#### Schritt 3: Container bauen und starten
```bash
docker compose up -d --build
```
Der Build dauert beim ersten Mal ~23 Minuten. Danach läuft die App auf **Port 3000**.
Logs prüfen:
```bash
docker compose logs -f admin
```
#### Schritt 4: Superadmin anlegen (nur beim ersten Start)
```bash
docker compose exec admin node -e "
const { PrismaClient } = require('@prisma/client');
const { scryptSync, randomBytes } = require('crypto');
const prisma = new PrismaClient();
// Superadmin wird via seed-superadmin.ts angelegt
"
```
Einfacher: Den Seed direkt ausführen:
```bash
docker compose exec -w /app admin \
node packages/shared/prisma/seed-superadmin.js
```
> Standard-Login nach Seed: `superadmin@innungsapp.de` / `demo1234`
> **Passwort sofort in den Einstellungen ändern!**
#### Schritt 5: Reverse Proxy (HTTPS)
Nginx-Beispielkonfiguration für `app.deine-innung.de`:
```nginx
server {
listen 80;
server_name app.deine-innung.de;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name app.deine-innung.de;
ssl_certificate /etc/letsencrypt/live/app.deine-innung.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.deine-innung.de/privkey.pem;
client_max_body_size 20M;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
```
SSL-Zertifikat mit Certbot:
```bash
certbot --nginx -d app.deine-innung.de
```
#### Updates einspielen
```bash
git pull
docker compose up -d --build
```
Datenbank und Uploads bleiben dabei erhalten (Docker Volumes).
#### Häufige Befehle
```bash
# Status prüfen
docker compose ps
# Logs ansehen
docker compose logs -f admin
# Container neustarten
docker compose restart admin
# In Container einloggen
docker compose exec admin sh
# App stoppen
docker compose down
# App stoppen + Daten löschen (Vorsicht!)
docker compose down -v
```
---
### Admin — Vercel (Alternative)
```bash
# Umgebungsvariablen in Vercel setzen:
# DATABASE_URL, BETTER_AUTH_SECRET, BETTER_AUTH_URL, SMTP_*
# Deploy
vercel --cwd apps/admin
```