USB and NAS are unavailable on this machine; the zip is the only path for personal SQLite and media. Provider keys stay out of git. Co-authored-by: Cursor <cursoragent@cursor.com>
6.7 KiB
| title | status | date | document_role | canonical_handover |
|---|---|---|---|---|
| Kanshō – Arbeitsauftrag Heim-Entwicklung, Server, Docker, Postgres | Arbeitsauftrag für die Session nach dem Laptop-Transfer | 2026-09-07 | Cursor Implementation Brief / Home Environment Setup | docs/architecture/technical/environment_handover.md |
Arbeitsauftrag: Heim-Entwicklungsumgebung, Server und Datenübernahme
Arbeite nicht auf der Urlaubs-SQLite als führende Instanz. Voraussetzung: laptop_closeout.md ist erfüllt (origin/main inkl. transfer/-Zip). USB/NAS sind auf dem Laptop nicht der Weg.
Lies zuerst:
docs/architecture/technical/environment_handover.mddocs/architecture/technical/documentation_index.mddocs/architecture/technical/runtime_and_deploy.mddocs/architecture/technical/product_frame_and_stack.mddocs/architecture/technical/mvp_implementation.md§1 und §4- fachlich nur
docs/architecture/functional/guardrails.md, falls Egress oder Mapping berührt wird
Mitai-Muster liegen unter C:\dev\mitai (Compose, Workflows). Kanshō-Ports, Host-Pfade und Datenbanken nicht aus Mitai kopieren.
Keine Slice-2- oder Memory-Implementierung in diesem Auftrag. Kein Commit, bis der Nutzer ihn verlangt.
Offene Host-Fragen, vor Phase B klären
In runtime_and_deploy.md §1/§6/§7 eintragen, nicht nur im Chat lassen:
- Derselbe Raspberry-Pi wie Mitai, eigenes Compose-Projekt?
- Eigenes Postgres (empfohlen) oder gemeinsame Instanz mit getrennter Database?
- Host-Pfade analog
/home/lars/docker/…– konkrete Kanshō-Verzeichnisse? - Dev-/Prod-Domains und Kanshō-Ports (lokal bleiben 5188/8018)?
- Welle 2 zuerst SQLite im Volume oder direkt Postgres?
Solange 1–4 offen sind: nur Phase A ausführen.
Phase A – Kontinuität (SQLite, ohne Docker)
Ziel: Dieselbe Anwendung wie auf dem Laptop, mit den Urlaubsdaten, auf dem Heimrechner.
git clone https://gitea.stommer.de/Lars/Kansho.git(Windows-PfadempfehlungC:\dev\Kansho, wenn frei).git log -1muss den Opening-Fix und die Transfer-Doku enthalten. Fehlt das, zuerst Laptop-Push nachholen..\scripts\dev-setup.ps1backend/.envneu ausbackend/.env.exampleplus Provider-Keys (Passwortmanager / OpenRouter). Keys sind nicht im Zip und nicht in Git.- Backend aus, dann Restore aus dem geklonten Tree:
.\scripts\backup-local.ps1 restore -Archive .\transfer\kansho-laptop-20260907.zip -Confirm -Replace
-
Start: Backend
--port 8018, Frontendnpm run dev(5188). -
Abnahme Phase A:
GET /api/health- Login mit bestehendem Admin
- Space
Kroatien 2026und Test-Space sichtbar - Journal Days und mindestens ein Entry mit Medien
- Identity-Mappings unter Admin vorhanden, Keys nicht in der DB
- Ein Dialogzug: ohne gültige Policy fail-closed; mit konfiguriertem Generate über Privacy Gateway
.\scripts\test-mvp.ps1grün (Temp-Isolation)
Danach ist der Laptop nicht mehr Source of Truth. Weitere Dialoge nur noch hier.
Phase B – Docker-Gerüst (noch ohne fachliche Postgres-Migration, falls so entschieden)
Erst nach beantworteten Host-Fragen.
Muster Mitai, eigene Namen:
docker-compose.yml(Prod-ähnlich: Frontend-Nginx, Backend, Postgres 16)docker-compose.dev.yml/docker-compose.dev-env.ymlnach Familienbrauchbackend/Dockerfile,frontend/Dockerfile- Root-
.env.examplefür Compose-Secrets (DB-Passwort, Provider-Keys). Bestehendesbackend/.env.examplenicht stillschweigend ersetzen. - Volumes für App-Daten und Medien. Keine Mitai-Volume-Namen (
bodytrack_*). - Healthcheck Backend; Startup: DB ready → Migrationen → Uvicorn.
- Lokale Ports nicht 3002/8002/5173/8000.
Zwischenstand zulässig: Compose startet Backend weiterhin auf SQLite im Volume, Postgres-Container schon mitlaufen, App noch nicht umgestellt. Das muss in runtime_and_deploy.md explizit stehen.
Abnahme Phase B:
docker compose upstartet die drei Dienste- Frontend erreicht Backend über
/api - Secrets nur in Host-
.env - Re-Restore oder Volume-Mount der Phase-A-Daten dokumentiert
scripts/test-mvp.ps1bleibt der lokale Nicht-Docker-Weg
Phase C – PostgreSQL als App-Persistenz
Eigene Implementierung, kein stilles Umbenennen von db.py.
- Adapter oder Dual-Backend: SQLite bleibt für Laptop/Tests zulässig, bis Postgres abgenommen ist.
schema.sqlund die bestehendenschema_migrationsnach Postgres-Dialekt führen (keinPRAGMA,datetime('now')prüfen, Typen).- Startpfad wie entschieden: Postgres ready → nummerierte SQL-Dateien → App. Fail-fast.
- Einmaliges Migrationsskript SQLite → Postgres (Profile, Spaces, Journal, Medien-Metadaten, Mappings, Prompts). Medien-Dateien separat ins Volume.
- Probe auf Kopie, nicht auf dem einzigen Backup.
- Danach Backup-Strategie für Postgres (nicht nur
backup-local.ps1). Restore-Übung wiederholen.
Abnahme Phase C:
- Leere Instanz startet und migriert
- Übernommene Urlaubsdaten: Entry-Anzahl, Message-Anzahl, ein Medien-GET
- Privacy Gateway unverändert fail-closed
- Tests gegen Postgres oder klar getrennte SQLite-Testmatrix
- Additive Doku in
runtime_and_deploy.md,mvp_implementation.md§1/§4,data_architecture.mdnur soweit Persistenzgrenzen betroffen sind
Phase D – Gitea CI/CD
Erst wenn Runner und Host-Pfade existieren (runtime_and_deploy.md §4).
Vorlage: C:\dev\mitai\.gitea\workflows\ (deploy-dev.yml, deploy-prod.yml, test.yml).
- Branch
developanlegen, wenn Dev-Deploy gewünscht - Kanshō-Pfade, nicht
/home/lars/docker/bodytrack - Healthcheck auf Kanshō-Ports
- Testjob: Backend-Tests + Frontend-Build; keine Live-Provider-Keys im Runner
Phase E – Transfer testen (Ende-zu-Ende)
Nach Phase A zwingend, nach B/C erneut:
- Neues Backup auf der Heiminstanz erzeugen und an einem Temp-Pfad wiederherstellen.
- Einen Journal Day öffnen, kurzen Dialog, Generate nur wenn Keys gesetzt.
- Opening-Invariante: abgeschlossener Vortag erzeugt keinen falschen Plan-Impuls.
- Admin → Schnittstellen: Keys aus
.env, nicht aus der DB. - Kein Klartext-Detect in
KANSHO_ENV=production. - Regression:
.\scripts\test-mvp.ps1
Grenzen
- Keine Mitai-Körperlogik, keine gemeinsamen Tabellen mit Mitai.
- Keine Lockerung der Guardrails „weil Docker intern ist“.
- Keine Produktiv-Domain erfinden.
- Watchtower nicht still einschalten.
Idea_seconmd_sclide.mdund Memory-Handover nicht in diesem Auftrag implementieren.
Abschlussbericht
- Welche Phasen tatsächlich gelaufen sind
- Gewählte Host-Pfade, Ports, Compose-Projektnamen
- Ob Daten SQLite oder Postgres führen
- Restore-Nachweis (Anzahlen, ein Medienbeispiel ohne Inhalt zu zitieren)
- Offene Punkte für die nächste Session