stadtwerke/innungsapp
knuthtimo-lab 1a69cbe462 docker fehler seed 2026-03-07 19:55:45 +01:00
..
apps Postgres 2026-03-04 14:13:16 +01:00
packages/shared Postgres 2026-03-04 14:13:16 +01:00
.dockerignore push 2026-02-27 15:19:24 +01:00
.env.example Postgres 2026-03-04 14:13:16 +01:00
.env.production.example Postgres 2026-03-04 14:13:16 +01:00
.gitignore Postgres 2026-03-04 14:13:16 +01:00
CLAUDE.md feat: Implement initial admin and mobile application UI, including styling, layouts, authentication, and legal page components. 2026-03-03 16:54:11 +01:00
README.md Postgres 2026-03-04 14:13:16 +01:00
build_output.txt feat: Implement Next.js middleware for subdomain-based tenant routing and authentication, create the admin application's main page, and add Google site verification. 2026-03-02 23:01:21 +01:00
dev_detailed.txt push 2026-02-27 15:19:24 +01:00
dev_output.txt push 2026-02-27 15:19:24 +01:00
docker-compose.yml docker fehler seed 2026-03-07 19:55:45 +01:00
package.json Postgres 2026-03-04 14:13:16 +01:00
pnpm-lock.yaml feat: Initialize new admin application with a landing page, cookie consent, and theme switching functionality. 2026-03-02 23:33:11 +01:00
pnpm-workspace.yaml Rebuild as InnungsApp project: replace stadtwerke analysis with full documentation 2026-02-18 19:03:37 +01:00
test.png feat: Implement initial admin and mobile application UI, including styling, layouts, authentication, and legal page components. 2026-03-03 16:54:11 +01:00
turbo.json Rebuild as InnungsApp project: replace stadtwerke analysis with full documentation 2026-02-18 19:03:37 +01:00

README.md

InnungsApp

Digitale Plattform fuer Innungen mit Admin-Dashboard (Next.js) und Mobile App (Expo).

Stack

Layer Technology
Monorepo pnpm Workspaces + Turborepo
Admin Dashboard Next.js 15 (App Router)
Mobile App Expo + React Native
API tRPC v11
Auth better-auth (magic links + credential login)
Database PostgreSQL + Prisma ORM (jsonb fuer Landing-Page-Felder)
Styling Tailwind CSS (admin), NativeWind (mobile)

Projektstruktur

innungsapp/
|-- apps/
|   |-- admin/
|   `-- mobile/
|-- packages/
|   `-- shared/
|       `-- prisma/
|-- docker-compose.yml
`-- README.md

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
  • pnpm >= 9
  • SMTP-Zugang (fuer Einladungen und Magic Links)

1. Abhaengigkeiten installieren

pnpm install

2. Umgebungsvariablen setzen (Admin lokal)

cp .env.example .env

Danach .env anpassen (mindestens DATABASE_URL, BETTER_AUTH_SECRET, SMTP-Werte).

3. DB vorbereiten (lokal)

Lokale PostgreSQL-DB starten (nur falls noch nicht aktiv):

docker compose up -d postgres

Prisma vorbereiten:

pnpm db:generate
pnpm db:push

Optional Demo-Daten:

pnpm db:seed
pnpm db:seed-superadmin

4. Entwicklung starten

pnpm --filter @innungsapp/admin dev
pnpm --filter @innungsapp/mobile dev

Oder parallel:

pnpm dev

Production Deployment (Docker, Admin)

Dieser Abschnitt ist der verbindliche Weg fuer den Productive-Server.

Voraussetzungen

  • Linux Server mit Docker + Docker Compose
  • DNS-Eintrag auf den Server
  • SMTP-Zugangsdaten
  • Reverse Proxy (z. B. Nginx) fuer HTTPS

1. Repository klonen

git clone <repo-url>
cd innungsapp

2. Production-Env anlegen

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)
  • EMAIL_FROM
  • SMTP_HOST
  • SMTP_PORT
  • SMTP_SECURE
  • SMTP_USER
  • SMTP_PASS
  • SUPERADMIN_EMAIL
  • SUPERADMIN_PASSWORD

3. Container bauen und starten

docker compose up -d --build

Hinweis zum DB-Start:

  • Wenn Prisma-Migrationen vorhanden sind, wird prisma migrate deploy ausgefuehrt.
  • Wenn keine Migrationen vorhanden sind, wird einmalig prisma db push ausgefuehrt.

4. Healthcheck und Logs pruefen

docker compose logs -f admin
curl -fsS http://localhost:3010/api/health

Erwartet: JSON mit "status":"ok", z. B.

{"status":"ok","timestamp":"2026-03-04T12:34:56.789Z"}

5. Superadmin anlegen (nur beim ersten Start)

docker compose exec -w /app admin node packages/shared/prisma/seed-superadmin.js

Login-Daten kommen aus .env:

  • E-Mail: SUPERADMIN_EMAIL
  • Passwort: SUPERADMIN_PASSWORD

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:3010 weiterleiten und TLS terminieren. Beispiel:

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;

  location / {
    proxy_pass http://localhost:3010;
    proxy_http_version 1.1;
    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;
  }
}

7. Updates einspielen

git pull
docker compose up -d --build
docker compose logs -f admin

8. Backup und Restore (Docker Volumes)

Vorher die exakten Volumenamen pruefen:

docker volume ls | grep pg_data
docker volume ls | grep uploads_data

Backup:

mkdir -p backups
docker run --rm \
  -v innungsapp_pg_data:/volume \
  -v "$(pwd)/backups:/backup" \
  alpine sh -c "tar czf /backup/pg_data_$(date +%F_%H%M).tar.gz -C /volume ."

Restore (nur bei gestoppter App):

docker compose down
docker run --rm \
  -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:

# 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):

# 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)

cd apps/mobile
eas build --platform all --profile production
eas submit --platform all

Wichtig:

  • In apps/mobile/eas.json sind Submit-Placeholders vorhanden und muessen ersetzt werden.
  • Fuer Production darf keine API-URL auf localhost zeigen.

Troubleshooting

migrate deploy oder db push fehlschlaegt

  • DATABASE_URL 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 http://localhost:3010/api/health pruefen

Login funktioniert nicht nach Seed

  • Seed-Command erneut ausfuehren
  • In DB pruefen, ob user und account Eintraege fuer superadmin@innungsapp.de existieren

Weiterfuehrende Doku

  • Produkt-Roadmap: ../ROADMAP.md
  • Architektur: ../ARCHITECTURE.md
  • API Design: ../API_DESIGN.md