# 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 | SQLite + Prisma ORM | | Styling | Tailwind CSS (admin), NativeWind (mobile) | ## Projektstruktur ```text innungsapp/ |-- apps/ | |-- admin/ | `-- mobile/ |-- packages/ | `-- shared/ | `-- prisma/ |-- docker-compose.yml `-- README.md ``` ## Local Setup ### Voraussetzungen - Node.js >= 20 - pnpm >= 9 - SMTP-Zugang (fuer Einladungen und Magic Links) ### 1. Abhaengigkeiten installieren ```bash pnpm install ``` ### 2. Umgebungsvariablen setzen (Admin lokal) ```bash cp .env.example apps/admin/.env.local ``` Danach `apps/admin/.env.local` anpassen (mindestens `BETTER_AUTH_SECRET`, SMTP-Werte). ### 3. DB vorbereiten (lokal) ```bash pnpm db:generate pnpm db:push ``` Optional Demo-Daten: ```bash pnpm db:seed ``` ### 4. Entwicklung starten ```bash pnpm --filter @innungsapp/admin dev pnpm --filter @innungsapp/mobile dev ``` Oder parallel: ```bash 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 ```bash git clone cd innungsapp ``` ### 2. Production-Env anlegen ```bash cp .env.production.example .env ``` Pflichtwerte in `.env`: - `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` ### 3. Container bauen und starten ```bash 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 ```bash docker compose logs -f admin curl -fsS http://localhost:3000/api/health ``` Erwartet: JSON mit `status: "ok"`. ### 5. Superadmin anlegen (nur beim ersten Start) ```bash docker compose exec -w /app admin node packages/shared/prisma/seed-superadmin.js ``` Default Login: - E-Mail: `superadmin@innungsapp.de` - Passwort: `demo1234` Passwort direkt nach dem ersten Login aendern. ### 6. HTTPS (Reverse Proxy) Nginx sollte auf `localhost:3000` weiterleiten und TLS terminieren. Beispiel: ```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; location / { proxy_pass http://localhost:3000; 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 ```bash git pull docker compose up -d --build docker compose logs -f admin ``` ### 8. Backup und Restore (Docker Volumes) Vorher die exakten Volumenamen pruefen: ```bash docker volume ls | grep db_data docker volume ls | grep uploads_data ``` Backup: ```bash mkdir -p backups docker run --rm \ -v innungsapp_db_data:/volume \ -v "$(pwd)/backups:/backup" \ alpine sh -c "tar czf /backup/db_data_$(date +%F_%H%M).tar.gz -C /volume ." ``` Restore (nur bei gestoppter App): ```bash docker compose down docker run --rm \ -v innungsapp_db_data:/volume \ -v "$(pwd)/backups:/backup" \ alpine sh -c "rm -rf /volume/* && tar xzf /backup/.tar.gz -C /volume" docker compose up -d ``` ## Mobile Release (EAS) ```bash 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 - Rechte auf `/app/data` pruefen - 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 ### 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`