This commit is contained in:
2026-03-04 14:13:16 +01:00
parent b7d826e29c
commit 56ea3348d6
41 changed files with 846 additions and 162 deletions

View File

@@ -11,7 +11,7 @@ Digitale Plattform fuer Innungen mit Admin-Dashboard (Next.js) und Mobile App (E
| Mobile App | Expo + React Native |
| API | tRPC v11 |
| Auth | better-auth (magic links + credential login) |
| Database | SQLite + Prisma ORM |
| Database | PostgreSQL + Prisma ORM (`jsonb` fuer Landing-Page-Felder) |
| Styling | Tailwind CSS (admin), NativeWind (mobile) |
## Projektstruktur
@@ -30,6 +30,11 @@ innungsapp/
## Local Setup
Port-Hinweis:
- Ohne Docker (lokales `pnpm dev`): App typischerweise auf `http://localhost:3000`
- Mit Docker Compose: App auf `http://localhost:3010` (Container-intern weiter `3000`)
### Voraussetzungen
- Node.js >= 20
@@ -45,13 +50,21 @@ pnpm install
### 2. Umgebungsvariablen setzen (Admin lokal)
```bash
cp .env.example apps/admin/.env.local
cp .env.example .env
```
Danach `apps/admin/.env.local` anpassen (mindestens `BETTER_AUTH_SECRET`, SMTP-Werte).
Danach `.env` anpassen (mindestens `DATABASE_URL`, `BETTER_AUTH_SECRET`, SMTP-Werte).
### 3. DB vorbereiten (lokal)
Lokale PostgreSQL-DB starten (nur falls noch nicht aktiv):
```bash
docker compose up -d postgres
```
Prisma vorbereiten:
```bash
pnpm db:generate
pnpm db:push
@@ -61,6 +74,7 @@ Optional Demo-Daten:
```bash
pnpm db:seed
pnpm db:seed-superadmin
```
### 4. Entwicklung starten
@@ -102,6 +116,10 @@ cp .env.production.example .env
Pflichtwerte in `.env`:
- `DATABASE_URL` (PostgreSQL DSN, z. B. `postgresql://innungsapp:...@postgres:5432/innungsapp?schema=public`)
- `POSTGRES_DB`
- `POSTGRES_USER`
- `POSTGRES_PASSWORD`
- `BETTER_AUTH_SECRET` (mindestens 32 Zeichen)
- `BETTER_AUTH_URL` (z. B. `https://app.deine-innung.de`)
- `NEXT_PUBLIC_APP_URL` (gleich wie `BETTER_AUTH_URL`)
@@ -111,6 +129,8 @@ Pflichtwerte in `.env`:
- `SMTP_SECURE`
- `SMTP_USER`
- `SMTP_PASS`
- `SUPERADMIN_EMAIL`
- `SUPERADMIN_PASSWORD`
### 3. Container bauen und starten
@@ -127,10 +147,14 @@ Hinweis zum DB-Start:
```bash
docker compose logs -f admin
curl -fsS http://localhost:3000/api/health
curl -fsS http://localhost:3010/api/health
```
Erwartet: JSON mit `status: "ok"`.
Erwartet: JSON mit `"status":"ok"`, z. B.
```json
{"status":"ok","timestamp":"2026-03-04T12:34:56.789Z"}
```
### 5. Superadmin anlegen (nur beim ersten Start)
@@ -138,16 +162,20 @@ Erwartet: JSON mit `status: "ok"`.
docker compose exec -w /app admin node packages/shared/prisma/seed-superadmin.js
```
Default Login:
Login-Daten kommen aus `.env`:
- E-Mail: `superadmin@innungsapp.de`
- Passwort: `demo1234`
- E-Mail: `SUPERADMIN_EMAIL`
- Passwort: `SUPERADMIN_PASSWORD`
Passwort direkt nach dem ersten Login aendern.
Hinweis:
- In `NODE_ENV=production` bricht der Seed ab, wenn `SUPERADMIN_PASSWORD` fehlt.
- In Entwicklung wird ohne `SUPERADMIN_PASSWORD` als Fallback `demo1234` genutzt.
- Der Seed ist idempotent (`upsert`) und kann bei Bedarf erneut ausgefuehrt werden.
### 6. HTTPS (Reverse Proxy)
Nginx sollte auf `localhost:3000` weiterleiten und TLS terminieren.
Nginx sollte auf `localhost:3010` weiterleiten und TLS terminieren.
Beispiel:
```nginx
@@ -165,7 +193,7 @@ server {
ssl_certificate_key /etc/letsencrypt/live/app.deine-innung.de/privkey.pem;
location / {
proxy_pass http://localhost:3000;
proxy_pass http://localhost:3010;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
@@ -188,7 +216,7 @@ docker compose logs -f admin
Vorher die exakten Volumenamen pruefen:
```bash
docker volume ls | grep db_data
docker volume ls | grep pg_data
docker volume ls | grep uploads_data
```
@@ -197,9 +225,9 @@ Backup:
```bash
mkdir -p backups
docker run --rm \
-v innungsapp_db_data:/volume \
-v innungsapp_pg_data:/volume \
-v "$(pwd)/backups:/backup" \
alpine sh -c "tar czf /backup/db_data_$(date +%F_%H%M).tar.gz -C /volume ."
alpine sh -c "tar czf /backup/pg_data_$(date +%F_%H%M).tar.gz -C /volume ."
```
Restore (nur bei gestoppter App):
@@ -207,12 +235,59 @@ Restore (nur bei gestoppter App):
```bash
docker compose down
docker run --rm \
-v innungsapp_db_data:/volume \
-v innungsapp_pg_data:/volume \
-v "$(pwd)/backups:/backup" \
alpine sh -c "rm -rf /volume/* && tar xzf /backup/<backup-file>.tar.gz -C /volume"
docker compose up -d
```
### 9. Verifizierte Kommandos (Stand 4. Maerz 2026)
Die folgenden Befehle wurden in dieser Umgebung erfolgreich ausgefuehrt:
```bash
# 1) Postgres starten (falls noch nicht aktiv)
docker compose up -d postgres
# 2) Prisma Client generieren
(cd packages/shared && npx prisma generate)
# 3) Initiale PostgreSQL-Migration erstellen (einmalig)
(cd packages/shared && \
DATABASE_URL="postgresql://innungsapp:innungsapp@localhost:5432/innungsapp?schema=public" \
npx prisma migrate dev --name init_postgres --schema=prisma/schema.prisma --create-only)
# 4) Migration anwenden
(cd packages/shared && \
DATABASE_URL="postgresql://innungsapp:innungsapp@localhost:5432/innungsapp?schema=public" \
npx prisma migrate deploy --schema=prisma/schema.prisma)
# 5) Gesamtes Setup bauen und starten
docker compose up -d --build
# 6) Superadmin seeden (mit ENV-Werten)
docker compose exec -e SUPERADMIN_EMAIL=superadmin@innungsapp.de \
-e SUPERADMIN_PASSWORD='demo1234' \
-w /app admin node packages/shared/prisma/seed-superadmin.js
# 7) Laufzeitstatus pruefen
docker compose ps
docker compose logs --tail 80 admin
curl -fsS http://localhost:3010/api/health
```
Optionale SQL-Verifikation (wurde ebenfalls erfolgreich getestet):
```bash
# JSONB-Spalten pruefen
docker compose exec -T postgres psql -U innungsapp -d innungsapp -c \
"SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'organizations' AND column_name IN ('landing_page_features','landing_page_footer') ORDER BY column_name;"
# Seeded Superadmin pruefen
docker compose exec -T postgres psql -U innungsapp -d innungsapp -c \
"SELECT u.email, u.role, u.email_verified, a.provider_id, (a.password IS NOT NULL) AS has_password FROM \"user\" u LEFT JOIN account a ON a.user_id = u.id AND a.provider_id = 'credential' WHERE u.email = 'superadmin@innungsapp.de';"
```
## Mobile Release (EAS)
```bash
@@ -231,14 +306,14 @@ Wichtig:
### `migrate deploy` oder `db push` fehlschlaegt
- `DATABASE_URL` pruefen
- Rechte auf `/app/data` pruefen
- `postgres` Container Healthcheck pruefen (`docker compose ps`)
- Logs: `docker compose logs -f admin`
### Healthcheck liefert Fehler
- Containerstatus: `docker compose ps`
- App-Logs lesen
- Reverse Proxy testweise umgehen und direkt `localhost:3000` pruefen
- Reverse Proxy testweise umgehen und direkt `http://localhost:3010/api/health` pruefen
### Login funktioniert nicht nach Seed