HarlekinandClaude Opus 5 73b6dc820e Suchindex ins Schema, Testdatenbank je Lauf frisch
Zwei Funde beim Nachsehen, warum `pnpm db:migrate` hängt.

**Der Befehl hing nicht, er fragte.** `prisma migrate dev` fand einen
Unterschied zwischen schema.prisma und den Migrationen und wartete auf einen
Namen für eine neue Migration. Deren Inhalt wäre gewesen, den GIN-Index über
den Suchvektor zu löschen: er stand nur in der Migration, weil
Unsupported("tsvector") dazu verleitet, den Index für nicht darstellbar zu
halten. Er ist darstellbar. Wer die Frage in Eile beantwortet hätte, hätte die
gestufte Volltextsuche verloren und es erst gemerkt, wenn die Suche leer
bleibt.

packages/db/tests/schema-drift.test.ts prüft das jetzt und nennt im Fehlerfall
das fehlende Stück. Gegengeprobt: ohne die Zeile im Schema schlägt der Test an.

Die Sperre, an der der zweite Versuch scheiterte (P1002), hielt eine verwaiste
Verbindung eines abgeschossenen migrate-dev. Wie man den Halter findet und
freigibt, steht jetzt in docs/11.

**Die Testdatenbank wird verworfen und neu angelegt.** Weil Akten nicht
löschbar sind, hatte sie 2487 angesammelt, und drei Zusicherungen auf eine auf
zehn Einträge begrenzte Liste fanden ihre eigene Akte nicht mehr darin. Das
sieht aus wie ein Fehler im Code und ist keiner. Neu aufsetzen kostet
dreieinhalb Sekunden; KEEP_TEST_DB=1 behält den Bestand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 17:13:34 +02:00
2026-09-01 00:01:49 +02:00
2026-09-01 00:01:29 +02:00
2026-09-01 00:01:29 +02:00
2026-09-01 00:01:29 +02:00

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

  1. Ordner in ein leeres Git-Repository legen
  2. Discord-Application anlegen, Bot einladen, Server Members Intent aktivieren
  3. 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
S
Description
Aktensystem für die AfiS aus dem SCP-RP, mit Discord-Synchro
Readme
1.4 MiB
Languages
TypeScript 91.4%
PLpgSQL 4.5%
CSS 2.3%
JavaScript 0.7%
Shell 0.6%
Other 0.5%