# Deployment – Kanshō **Stand:** 2026-09-07 **Server:** Raspberry Pi 5 (`192.168.2.49`) — gleicher Host wie Mitai/Shinkan/Kairo, **eigene** Compose-Projekte **Runner:** Gitea Actions (`/home/lars/gitea-runner/`) **Repo:** `http://192.168.2.144:3000/Lars/Kansho.git` Kanonische Runtime-Entscheidungen: `docs/architecture/technical/runtime_and_deploy.md`. Datenübernahme SQLite → Postgres: `backend/sqlite_to_postgres.py` (Probe auf Kopie, `--confirm`). --- ## Port- und Pfad-Übersicht | | Production | Development | |---|------------|-------------| | **Git-Branch** | `main` | `develop` | | **Server-Verzeichnis** | `/home/lars/docker/kansho` | `/home/lars/docker/kansho-dev` | | **Frontend-Port** | 3006 | 3096 | | **Backend-Port** | 8005 | 8096 | | **PostgreSQL** | nur Compose-Netz, DB `kansho` | nur Compose-Netz, DB `kansho_dev` | | **Domain** | kansho.jinkendo.de | dev.kansho.jinkendo.de | | **Öffentliche URL** | https://kansho.jinkendo.de | https://dev.kansho.jinkendo.de | | **Compose** | `docker-compose.yml` | `docker-compose.dev-env.yml` | Prod-Frontend ist **3006**, nicht 3005: auf dem Pi lauscht Bookstack bereits auf `0.0.0.0:3005`. Dev 3096/8096 und Prod-API 8005 waren frei. Lokal ohne Docker bleibt Windows: Frontend **5188**, Backend **8018**, SQLite unter `backend/data/`. --- ## Einmalige Server-Einrichtung ```bash mkdir -p /home/lars/docker/kansho /home/lars/docker/kansho-dev cd /home/lars/docker/kansho-dev git clone http://192.168.2.144:3000/Lars/Kansho.git . git checkout develop cp .env.example .env # DB_PASSWORD und Provider-Keys setzen cd /home/lars/docker/kansho git clone http://192.168.2.144:3000/Lars/Kansho.git . git checkout main cp .env.example .env # Prod-DB_PASSWORD und Provider-Keys setzen ``` Host-nginx: `nginx/kansho.conf` und `nginx/kansho-dev.conf` nach `/etc/nginx/sites-available/`, dann `nginx/certbot-setup.sh`. DNS A/AAAA für `dev.kansho.jinkendo.de` und `kansho.jinkendo.de` auf den Reverse-Proxy. Bis TLS steht, bleibt der LAN-Zugriff über die Publish-Ports. Gitea: Actions aktivieren. Derselbe Pi-Runner wie die Schwesterprodukte (`ubuntu-latest`). Watchtower bleibt aus. --- ## Gitea Actions | Workflow | Trigger | Zweck | |----------|---------|--------| | `deploy-dev.yml` | Push `develop` | Deploy nach `/home/lars/docker/kansho-dev`, Health `localhost:8096` | | `deploy-prod.yml` | Push `main` | Deploy nach `/home/lars/docker/kansho`, Health `localhost:8005` | | `test.yml` | nach erfolgreichem `Deploy Development` | pytest auf `kansho_test`, nicht-schreibender Smoke gegen die laufende Dev-API, Frontend-Build. Keine Live-Provider-Keys. | Prod nur über Merge `develop` → `main`, kein direkter Prod-Schreibzugriff. --- ## Datenübernahme (persönlich, Klasse A/B) 1. Phase-A-SQLite auf dem Heimrechner ist führend, bis der Dev-Import grün ist. 2. Schema auf der Zielinstanz durch normalen Container-Start anlegen (leeres Postgres). 3. Import auf **Dev zuerst**: ```bash # Zip oder laufende SQLite + Medien in den Dev-Container legen, dann: docker compose -f docker-compose.dev-env.yml exec -T backend \ python sqlite_to_postgres.py --confirm \ --sqlite /tmp/kansho.sqlite \ --media-src /tmp/media \ --media-dest /app/data/media ``` Windows-Vorbereitung (Kopie, nicht das einzige Backup): ```powershell .\scripts\backup-local.ps1 create # Archiv prüfen, dann SQLite+Medien auf den Pi kopieren — nicht nach Gitea. ``` 4. Abnahme Dev: Profilanzahl, Journal-Days/Entries, Messages, ein Medien-GET, Gateway fail-closed, `KANSHO_ENV=production` ohne Klartext-Detect. 5. Erst dann derselbe Import nach Prod (`--confirm`, leeres Volume). `--replace` nur auf einer bewussten Kopie. `debug.persist_traces` nach dem Import prüfen. --- ## Postgres-Backup (Server) Kein Ersatz durch `backup-local.ps1` (das bleibt der SQLite-Weg). ```bash # Dump cd /home/lars/docker/kansho docker compose exec -T postgres pg_dump -U kansho kansho > "/home/lars/backups/kansho-$(date -u +%Y%m%d).sql" # Medienvolume docker run --rm -v kansho_kansho-media:/src -v /home/lars/backups:/dst alpine \ tar -C /src -czf /dst/kansho-media-$(date -u +%Y%m%d).tgz . ``` Restore-Übung vor dem ersten Prod-Dialogbestand nach dem Cutover wiederholen. Dump und Medien nicht an Provider und nicht in öffentliche Remotes. --- ## Manuelles Deploy ```bash # Development cd /home/lars/docker/kansho-dev git fetch origin develop && git reset --hard origin/develop docker compose -f docker-compose.dev-env.yml build --no-cache backend frontend docker compose -f docker-compose.dev-env.yml up -d --wait curl -sf http://localhost:8096/api/health # Production cd /home/lars/docker/kansho git fetch origin main && git reset --hard origin/main docker compose build --no-cache backend frontend docker compose up -d --wait curl -sf http://localhost:8005/api/health ``` Laptop-Checkout nach erfolgreichem Heim-Restore und Dev-Import nur noch Archiv. Keine parallelen Schreibzugriffe auf denselben persönlichen Bestand.