Richtigstellung zuerst: der vorige Commit trägt die Nachricht "Nichts davon gebaut", enthält aber bereits die Schema-Änderung an CaseTemplate und CaseCounter. Ein abgebrochener Aufruf hatte die Datei schon geschrieben, und das nachfolgende `git add -A` hat sie mitgenommen. Die Nachricht war damit falsch. Hier ist die Änderung vollständig und geprüft. Das Muster des Aktenzeichens gehört zur Vorlage: Präfix und Stellenzahl je Fallart, ein Nummernkreis je Präfix und Jahr. Die Abteilung führt gewachsene Präfixe wie AKT-PA-2026-62843 neben dem AfiS-2026-0042 aus dem Glossar. Die Migration ist von Hand geschrieben, weil der Wechsel des Primärschlüssels auf CaseCounter den bestehenden Zähler erhalten muss: eine zurückgesetzte Nummer wäre ein doppeltes Aktenzeichen. Vorher und nachher geprüft. parseCaseNumber zerlegt von hinten, damit Präfixe mit Bindestrich funktionieren. Ein Test belegt, dass AKT-PA und AfiS getrennte Nummernkreise führen. Dazu start.sh für die lokale Entwicklung, solange der Dockge-Stack nicht läuft: Datenbank hochfahren, Migrationen, Grundzustand, Worker und Web. Mit --ohne-worker für Arbeit ohne Discord und --nur-db für die Datenbank allein.
AfiS-Aktensystem
Fallakten-, Personalakten- und Ermittlungsverwaltung für die Abteilung für innere Sicherheit eines SCP-RP-Servers. Anmeldung und Berechtigungen laufen vollständig über Discord.
Los geht's
- Ordner in ein leeres Git-Repository legen
- Discord-Application anlegen, Bot einladen, Server Members Intent aktivieren
- Claude Code im Projektordner starten
Gehostet wird als ein Dockge-Stack auf dem Homeserver. Die fertige compose.yaml und die
Einrichtungsschritte stehen in docs/11-betrieb.md. Die .env wird nicht im Repository
gepflegt, sondern im .env-Reiter von Dockge; .env.example ist nur die Vorlage.
Claude Code liest CLAUDE.md von selbst. Die Fachdokumente liegen in docs/, der Bauplan
in TASKS.md.
Erste Anweisung an Claude Code
Lies CLAUDE.md und alle Dateien in docs/. Fass in fünf Sätzen zusammen, was gebaut wird, und nenn mir alles, was in den Dokumenten widersprüchlich oder unklar ist, bevor du anfängst. Baue noch nichts.
Danach Phase für Phase aus TASKS.md. Siehe docs/12-arbeiten-mit-claude-code.md.
Aufbau
CLAUDE.md Projektanweisung, wird automatisch gelesen
TASKS.md Bauplan in neun Phasen
docs/ Fachdokumente, dazu 13-entscheidungen.md
compose.yaml Der Dockge-Stack
.env.example Vorlage für den .env-Reiter in Dockge
web/ Next.js 15, App Router
worker/ discord.js, Rollen-Abgleich
pdf/ Playwright, PDF-Erzeugung
packages/db/ Prisma-Schema, Migrationen, Seed
docker/ Dockerfiles für web, worker und pdf
Lokal entwickeln
Node 22 und pnpm 9.
corepack enable && pnpm install
docker run -d --name afis-db -e POSTGRES_DB=afis -e POSTGRES_USER=afis \
-e POSTGRES_PASSWORD=afis -p 5434:5432 postgres:16-alpine
cp .env.example .env
# DATABASE_URL und DIRECT_DATABASE_URL auf localhost:5434 zeigen lassen
pnpm --filter @afis/db run build # erzeugt den Prisma-Client
pnpm db:deploy && pnpm db:seed
pnpm dev
Prüfen wie die CI:
pnpm lint && pnpm typecheck && pnpm test
pnpm test:e2e
pnpm test legt sich eine eigene Datenbank afis_test an und lässt die
Entwicklungsdatenbank in Ruhe. Grund in docs/13-entscheidungen.md.
Betrieb kurz gefasst
| Verwaltung | Dockge, ein Stack namens afis unter /opt/stacks/afis/ |
| Erreichbarkeit | Cloudflare Tunnel, kein offener Port am Router |
| Aktualisieren | Dockge → Stack → Update, Migration läuft automatisch mit |
| Backup | zwei Dauerläufer mit Cron: nächtlicher Dump plus restic offsite |