Lalabase
티켓·문서·근무시간·고객대화를 한 곳에 모아 KI로 검색, 소프트웨어 기업 고객 프로젝트용, 오픈소스로 자체 서버·독일 클라우드에 배포
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Cross-Platform WebApp (Browser, Android, iOS) fuer TCH Gastro Services; zentrale Komponente auf Vercel. Entwickelt mit einem factory-template.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Maßgeschneiderte, nicht-kommerzielle Web-App für die Gastronomie-Vorgänge des Tennisclub Heuchelheim (TCH). Sie läuft als installierbare PWA im Browser und auf privaten iOS-/Android-Geräten und ermöglicht die schnelle, einfache Erfassung alltäglicher Vorgänge – mit rollenbasiertem Zugriff. Status: frühe Aufbauphase. Grundgerüst, Persistenz und Login stehen; fachliche Erfassungs-Features folgen. Produktivdaten in der EU (Neon Frankfurt + Vercel fra1). Alle Bausteine sind im Vereinsbetrieb kostenfrei. Hintergrund: ADR-014.README 전문 보기 ↗
Maßgeschneiderte, nicht-kommerzielle Web-App für die Gastronomie-Vorgänge des Tennisclub Heuchelheim (TCH). Sie läuft als installierbare PWA im Browser und auf privaten iOS-/Android-Geräten und ermöglicht die schnelle, einfache Erfassung alltäglicher Vorgänge – mit rollenbasiertem Zugriff.
Status: frühe Aufbauphase. Grundgerüst, Persistenz und Login stehen; fachliche Erfassungs-Features folgen.
| Ebene | Technologie |
|---|---|
| Hosting | Vercel (Hobby, nicht-kommerziell), Function-Region Frankfurt fra1 |
| App | Next.js (App Router) · React · TypeScript |
| Client | PWA (installierbar, iOS + Android) · Tailwind CSS |
| Datenbank | PostgreSQL – lokal (Docker) in DEV, Neon (EU/Frankfurt) in INT/PRD |
| DB-Zugriff | Drizzle ORM – node-postgres lokal, Neon serverless HTTP auf Vercel |
| Auth | Auth.js / NextAuth v5 – E-Mail+Passwort (bcrypt, JWT), Rollen (RBAC) |
| Paketmanager | pnpm · Node ≥ 24 |
Produktivdaten in der EU (Neon Frankfurt + Vercel fra1). Alle Bausteine sind im
Vereinsbetrieb kostenfrei. Hintergrund: ADR-014.
Drei getrennte Stages, gesteuert über NEXT_PUBLIC_STAGE (dev | int | prd):
| Stage | Zweck | Hosting | Datenbank |
|---|---|---|---|
| DEV | lokale Entwicklung | lokal (pnpm dev) | lokale Postgres (Docker) auf dem Dev-System |
| INT | Integrationstests, Migrations-Proben mit produktionsnahen Daten | Vercel, Branch int (Preview) | Neon-Branch von PRD (CoW-Klon, anonymisiert) |
| PRD | Produktion | Vercel, Branch main (Production) | Neon-Produktions-DB |
Sichtbare Unterscheidung: DEV und INT zeigen ein farbiges Banner (DEV grau, INT orange),
ein stage-eingefärbtes Icon (Homescreen/Tab) und ein [DEV]/[INT]-Titel-Suffix. PRD hat
kein Banner und das TCH-Standard-Icon (teal) – so ist Produktion nie mit den anderen zu verwechseln.
Voraussetzungen: Node ≥ 24, pnpm (npm i -g pnpm), Docker mit Docker Compose v2 (docker compose).
pnpm install
bash scripts/install-hooks.sh # lokale Git-Hooks: pre-commit, pre-push, commit-msg (einmalig pro Clone)
cp .env.example .env.local # NEXT_PUBLIC_STAGE=dev, lokale DATABASE_URL, AUTH_SECRET, SEED_ADMIN_*
pnpm db:up # lokale Postgres 18 via Docker Compose v2 (docker-compose.yml)
pnpm db:migrate # Schema anlegen (nutzt .env.local)
pnpm db:seed # ersten Admin anlegen
pnpm dev # http://localhost:3000 → Login → Startseite (mit DEV-Banner)
.env.local (DEV):
NEXT_PUBLIC_STAGE=dev
DATABASE_URL=postgresql://tch:tch@localhost:5432/tch_dev
AUTH_SECRET=<openssl rand -base64 32>
SEED_ADMIN_EMAIL=... / SEED_ADMIN_PASSWORD=...
Zweck: DB-Migrationen verlässlich testen, bevor sie auf PRD laufen – mit produktionsnahen Daten.
INT nutzt einen Neon-Branch der Produktions-DB: ein Copy-on-Write-Klon, der die Produktionsdaten sekundenschnell und ohne Dump/Restore bereitstellt. Der Branch enthält zunächst echte personenbezogene Daten → direkt nach dem Abzweigen anonymisieren (DSGVO).
Einrichtung:
int von der Produktions-Branch erstellen (Region Frankfurt) → dessen Pooled-Connection-String.int existiert im Repo → Vercel deployt ihn als Preview.int (Scope Preview, Git-Branch int):
NEXT_PUBLIC_STAGE=int, DATABASE_URL=<INT-Neon-Branch-Pooled>, AUTH_SECRET=<int-secret>..env.int anlegen (NEXT_PUBLIC_STAGE=int, DATABASE_URL=<INT-Branch>, SEED_ADMIN_*).Automatisch bei jedem INT-Deploy (ADR-015): Das Deploy-Gate frischt INT bei jedem
main-Push selbst auf – Reset von PRD → anonymisieren → migrieren → Admin seeden – bevor
die E2E laufen. Voraussetzung sind die Neon-Secrets (siehe Deploy-Gate).
Fehlen sie, wird der Refresh mit Warnung übersprungen (kein Reset = keine neue PII).
Manueller Refresh-/Testfluss (lokal, identische Schritte):
# (Neon: int-Branch von PRD zurücksetzen = frische Prod-Daten; CI nutzt scripts/project/neon-reset-int.sh)
pnpm db:anonymize:int # Namen/E-Mails überschreiben, Prod-Passwörter entwerten (Guard: nur STAGE=int)
pnpm db:migrate:int # ausstehende Migrationen auf INT testen (vor PRD)
pnpm db:seed:int # bekannten INT-Admin (SEED_ADMIN_*) setzen
db:anonymize:intbricht ab, wennNEXT_PUBLIC_STAGEnichtintist – Schutz vor versehentlichem Ausführen gegen DEV/PRD.
Oberflächentests (E2E) gegen INT – Vercel-Bypass einrichten
Die INT-Preview ist durch Vercel Deployment Protection (SSO) geschützt: jeder Request
wird auf vercel.com/sso-api umgeleitet. Automatisierte Oberflächentests kommen nur mit
einem Protection-Bypass-Secret durch (der Schutz für menschliche Zugriffe bleibt aktiv).
.env.int hinterlegen (gitignored, nie committen):
VERCEL_AUTOMATION_BYPASS_SECRET=<secret-aus-vercel>
pnpm db:seed:int (legt den SEED_ADMIN_*-Login in der INT-DB an).x-vercel-protection-bypass: <VERCEL_AUTOMATION_BYPASS_SECRET>
Ziel-URL (INT): https://tch-gastro-services-git-int-tch-developers.vercel.app.pnpm test:e2e:int (nutzt .env.int: Bypass-Header + INT-Admin-Login).Ohne gültiges Bypass-Secret liefern alle INT-Routen (auch
/login) die Vercel-SSO-Seite – Tests würden dann nicht die App, sondern Vercels Login sehen.
production → Vercel Production. Prod wird nur über das Deploy-Gate aktualisiert (nicht direkt bei main-Merge).NEXT_PUBLIC_STAGE=prd, DATABASE_URL=<PRD-Neon-Pooled>, AUTH_SECRET=<prd-secret>.pnpm db:migrate:prd, ADR-017) – erst nachdem dieselbe Migration auf INT (Reset-from-PRD → anonymisiert → migriert → E2E) grün war, und vor dem Promote (fail-closed: Migration rot → kein Promote). .env.prd ist nur noch für manuelle Sonderfälle (Hotfix/Reparatur) gedacht..github/workflows/deploy-gate.yml entkoppelt Prod vom main-Push:
Push auf main → INT auf den Commit bringen → INT-DB von PRD auffrischen (Reset → anonymisieren →
migrieren → seed) → auf INT-Build warten (/api/version == Commit) → Playwright-E2E gegen INT →
nur bei Grün: PRD-DB migrieren + seeden → main → production → Vercel deployt Prod →
auf PRD-Build warten → /api/health-Check (DB-Read).
VERCEL_AUTOMATION_BYPASS_SECRET, E2E_ADMIN_EMAIL, E2E_ADMIN_PASSWORD,
PRD_DATABASE_URL, PRD_ADMIN_EMAIL, PRD_ADMIN_PASSWORD (Prod-Migration + -Seed, ADR-017).
PRD_DATABASE_URL ist der Prod-Neon-Connection-String; PRD_ADMIN_* das Prod-Login (idempotent geseedet).
Fehlt eines davon, bricht das Gate fail-closed ab – die Prod-Migration wird nie still übersprungen.NEON_API_KEY, NEON_PROJECT_ID, NEON_INT_BRANCH_ID, NEON_PRD_BRANCH_ID,
INT_DATABASE_URL. Seit ADR-017 ebenfalls Pflicht: Der INT-Refresh (Reset-from-PRD → anonymisieren
→ migrieren → E2E) ist die Absicherungs-Vorstufe der automatischen PRD-Migration – ohne ihn liefe
die Prod-Migration ohne den bewiesenen INT-Lauf. Die Branch-IDs (br-…) und das API-Token stehen in
der Neon-Konsole; INT_DATABASE_URL ist der gepoolte Connection-String des INT-Branches (wie in
.env.int). Der Refresh läuft fail-closed: schlägt Reset/Anonymisierung/Migration fehl, gibt es kein Promote.db:migrate:prd + db:seed:prd laufen vor dem
Promote – abgesichert dadurch, dass die INT-Stufe dieselbe Migration gegen prod-nahe, anonymisierte
Daten bereits angewandt und per E2E getestet hat. Migration/Seed rot → kein Promote.PRD_*), (2) Gate einmal grün laufen lassen
(legt/aktualisiert production), (3) dann in Vercel Production Branch = production setzen./api/health
(DB-Read auf die roles-Spalte) – CI-grün ↔ Prod-grün (Factory-ADR-007).Der Promote akkumuliert (main-HEAD → production) und ist selbst-korrigierend – solange das
Gate verlässlich ist. Ein einmal rotes Gate über echten Code-/Migrationsdefekt darf aber nicht
durch einen späteren, evtl. flaky-grünen Lauf still überholt werden (Vorfall 19.07.2026:
#134-rot → #167-flaky-grün → Prod-Defekt). Dagegen schützt der Deploy-Freeze:
db:migrate:int oder db:migrate:prd – setzt das Gate einen persistenten Marker: das
Git-Ref refs/factory/deploy-freeze (zeigt auf den blockierenden Commit-SHA). Reine
Infra-/Vorbereitungsfehler (Secret-Check, Install, INT-Deploy-Timeout, Neon-Reset,
Anonymisierung) frieren nicht ein.main läuft
normal weiter (Merges + Gate-Läufe), nur der Promote pausiert.bash scripts/project/deploy-freeze.sh release (setzt Repo-Schreibrecht + origin
voraus); bash scripts/project/deploy-freeze.sh status zeigt den blockierenden SHA.Die Env-Dateien
.env.local/.env.int/.env.prdsind gitignored – Secrets nie committen. Secret erzeugen:openssl rand -base64 32(nichtnpx auth secret– zieht das falsche CLI).
| Skript | Zweck |
|---|---|
pnpm dev / pnpm build / pnpm start | Entwicklung / Produktions-Build / Start |
pnpm lint · pnpm format · pnpm format:check | ESLint · Prettier |
pnpm test · pnpm test:coverage | Vitest (Unit) |
pnpm test:e2e | Playwright-Oberflächentests gegen DEV (startet Dev-Server; DB via pnpm db:up) |
pnpm test:e2e:int | Playwright gegen INT (Vercel-Preview; benötigt VERCEL_AUTOMATION_BYPASS_SECRET in .env.int) |
pnpm db:up · pnpm db:down | lokale Docker-Postgres starten/stoppen (DEV) |
pnpm db:generate | Drizzle-Migration aus dem Schema erzeugen (offline) |
pnpm db:migrate · db:migrate:int · db:migrate:prd | Migration auf DEV / INT / PRD anwenden |
pnpm db:seed · db:seed:int · db:seed:prd | Login-Admin auf DEV / INT / PRD anlegen (idempotent) |
pnpm db:anonymize:int | INT-Daten anonymisieren (nach Neon-Branch-Refresh; Guard: nur STAGE=int) |
pnpm db:studio | Drizzle Studio (DEV) |
Das GitHub-Repo ist mit einem Vercel-Projekt verbunden:
main → Production (PRD), int → Preview (INT), sonstige PRs → Preview.fra1 ist über vercel.json fixiert.INT ist ein Neon-Branch der PRD-DB (anonymisiert), DEV eine lokale Docker-DB. Migrationen laufen den Weg DEV → INT → PRD.
app/ # Next.js App Router (Seiten, /login, /api/auth, components/StageBanner)
lib/stage.ts # Stage-Erkennung (Banner/Icon/Titel je DEV/INT/PRD)
db/ # Drizzle: schema.ts, index.ts (dualer Treiber), migrations/, seed.ts
auth.ts · auth.config.ts # Auth.js (Node bzw. edge-sichere Config)
proxy.ts # Route-Schutz (Next-16-Nachfolger von middleware)
docker-compose.yml # lokale DEV-Postgres
vercel.json # Vercel-Region fra1
Eine kuratierte Routen-Übersicht (alle Seiten + API-Route-Handler mit Funktion und
Zugriff/Rolle) steht in docs/routes.md; ein Drift-Check im Push-Gate hält sie
mit dem app/-Baum synchron.
Dieses Repo nutzt als Entwicklungs-Harness die dm-Factory (agentische Entwicklung mit Claude Code) – auf GitHub portiert. Praktisch heißt das:
docs/factory/OPERATING.md.bash scripts/start-work.sh "<beschreibung>" (legt GitHub-Issue,
Branch und Task-Datei an). Task-ID = Issue-Nummer..github/workflows/): Lint, Tests, Self-Test, Issue-Sync.docs/factory/OPERATING.md (Runbook), CLAUDE.md, CONTRIBUTING.md, docs/ (ADRs, Guidelines).Die Factory ist reines Werkzeug – sie ist nicht Teil der ausgelieferten Anwendung.
Nutzungsfragen (z. B. Tastaturbedienung im Safari) beantwortet die FAQ.
Siehe docs/CHANGELOG.md.