2026-07-04 18:15:24 +02:00
|
|
|
|
# Deployment – Kairo Jinkendo
|
|
|
|
|
|
|
|
|
|
|
|
**Stand:** 2026-07-04
|
|
|
|
|
|
**Server:** Raspberry Pi 5 (`192.168.2.49`) — gleicher Host wie Shinkan/Mitai
|
|
|
|
|
|
**Runner:** Gitea Actions (`/home/lars/gitea-runner/`)
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Port- und Pfad-Übersicht
|
|
|
|
|
|
|
|
|
|
|
|
| | Production | Development |
|
|
|
|
|
|
|---|------------|-------------|
|
|
|
|
|
|
| **Git-Branch** | `main` | `develop` |
|
|
|
|
|
|
| **Server-Verzeichnis** | `/home/lars/docker/kairo` | `/home/lars/docker/kairo-dev` |
|
|
|
|
|
|
| **Frontend-Port** | 3004 | 3097 |
|
|
|
|
|
|
| **Backend-Port** | 8004 | 8097 |
|
|
|
|
|
|
| **PostgreSQL (localhost)** | 5436 | 5437 |
|
|
|
|
|
|
| **Domain** | kairo.jinkendo.de | dev.kairo.jinkendo.de |
|
|
|
|
|
|
|
|
|
|
|
|
**Familien-Referenz (bereits belegt):**
|
|
|
|
|
|
|
|
|
|
|
|
| App | Prod UI/API | Dev UI/API |
|
|
|
|
|
|
|-----|-------------|------------|
|
|
|
|
|
|
| Mitai | 3002 / 8002 | 3099 / 8099 |
|
|
|
|
|
|
| Shinkan | 3003 / 8003 | 3098 / 8098 |
|
|
|
|
|
|
| **Kairo** | **3004 / 8004** | **3097 / 8097** |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Einmalige Server-Einrichtung
|
|
|
|
|
|
|
|
|
|
|
|
Auf dem Pi als User `lars` ausführen:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-07-04 19:03:57 +02:00
|
|
|
|
# Deploy-Verzeichnisse anlegen
|
2026-07-04 18:15:24 +02:00
|
|
|
|
mkdir -p /home/lars/docker/kairo
|
|
|
|
|
|
mkdir -p /home/lars/docker/kairo-dev
|
|
|
|
|
|
|
|
|
|
|
|
# Production
|
|
|
|
|
|
cd /home/lars/docker/kairo
|
|
|
|
|
|
git clone http://192.168.2.144:3000/Lars/Kairo-Jinkendo.git .
|
|
|
|
|
|
git checkout main
|
|
|
|
|
|
cp .env.example .env
|
|
|
|
|
|
# .env bearbeiten (DB_PASSWORD, SMTP, OPENROUTER, …)
|
|
|
|
|
|
|
|
|
|
|
|
# Development
|
|
|
|
|
|
cd /home/lars/docker/kairo-dev
|
|
|
|
|
|
git clone http://192.168.2.144:3000/Lars/Kairo-Jinkendo.git .
|
|
|
|
|
|
git checkout develop
|
|
|
|
|
|
cp .env.example .env
|
|
|
|
|
|
# .env mit Dev-Werten bearbeiten (siehe Kommentare in .env.example)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
> **Hinweis:** Erstes `docker compose up` funktioniert erst, wenn `backend/` und `frontend/` mit Dockerfiles vorhanden sind.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-07-04 19:03:57 +02:00
|
|
|
|
## Medien (optional, derzeit nicht eingerichtet)
|
|
|
|
|
|
|
|
|
|
|
|
Kairo benötigt **aktuell keine Medien-Speicherung**. Es sind keine Medien-Verzeichnisse auf dem Pi anzulegen.
|
|
|
|
|
|
|
|
|
|
|
|
Falls später Datei-Uploads o. Ä. nötig werden:
|
|
|
|
|
|
|
|
|
|
|
|
1. **NAS-Freigabe** auf dem Synology anlegen (nicht auf dem Raspberry Pi speichern).
|
|
|
|
|
|
2. **Mount auf dem Pi** einrichten (z. B. `/mnt/nas/kairo-media` bzw. `/mnt/nas/kairo-media/dev`).
|
|
|
|
|
|
3. **`docker-compose.override.yml`** im jeweiligen Deploy-Verzeichnis ergänzen (wird von Git ignoriert):
|
|
|
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
|
services:
|
|
|
|
|
|
backend:
|
|
|
|
|
|
environment:
|
|
|
|
|
|
MEDIA_ROOT: /app/media
|
|
|
|
|
|
volumes:
|
|
|
|
|
|
- /mnt/nas/kairo-media:/app/media # Dev: …/kairo-media/dev
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
4. Im Backend `MEDIA_ROOT` auswerten — erst wenn die App Medien unterstützt.
|
|
|
|
|
|
|
|
|
|
|
|
Analog Shinkan (`SHINKAN_MEDIA_HOST`), aber bewusst **nicht** Teil des Initial-Setups.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-07-04 18:15:24 +02:00
|
|
|
|
## Reverse Proxy (Synology / Fritz!Box)
|
|
|
|
|
|
|
|
|
|
|
|
Analog zu Shinkan — neue Hostnamen im Proxy eintragen:
|
|
|
|
|
|
|
|
|
|
|
|
| Hostname | Ziel (Pi) |
|
|
|
|
|
|
|----------|-----------|
|
|
|
|
|
|
| `kairo.jinkendo.de` | `http://192.168.2.49:3004` |
|
|
|
|
|
|
| `dev.kairo.jinkendo.de` | `http://192.168.2.49:3097` |
|
|
|
|
|
|
|
|
|
|
|
|
SSL/TLS wie bei den Schwester-Apps (Let's Encrypt über Synology).
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Gitea Actions
|
|
|
|
|
|
|
|
|
|
|
|
Workflows unter `.gitea/workflows/`:
|
|
|
|
|
|
|
|
|
|
|
|
| Workflow | Trigger | Aktion |
|
|
|
|
|
|
|----------|---------|--------|
|
|
|
|
|
|
| `deploy-dev.yml` | Push auf `develop` | Build + Deploy nach `kairo-dev/` |
|
|
|
|
|
|
| `deploy-prod.yml` | Push auf `main` | Build + Deploy nach `kairo/` |
|
|
|
|
|
|
| `test.yml` | PR/Push `develop`, nach Deploy | pytest, Lint, Frontend-Build, k6, Playwright |
|
|
|
|
|
|
|
|
|
|
|
|
Health-Checks nach Deploy:
|
|
|
|
|
|
|
|
|
|
|
|
- Dev: `curl http://localhost:8097/api/version` und `http://localhost:3097/api/version`
|
|
|
|
|
|
- Prod: `curl http://localhost:8004/api/version` und `http://localhost:3004/api/version`
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Gitea Secrets (für E2E-Tests)
|
|
|
|
|
|
|
|
|
|
|
|
In Gitea unter Repository → Settings → Actions → Secrets (analog Shinkan):
|
|
|
|
|
|
|
|
|
|
|
|
| Secret | Verwendung |
|
|
|
|
|
|
|--------|------------|
|
|
|
|
|
|
| `E2E_DEV_TEST_EMAIL` | Playwright Dev-Login |
|
|
|
|
|
|
| `E2E_DEV_TEST_PASSWORD` | Playwright Dev-Login |
|
|
|
|
|
|
| `E2E_PROD_TEST_EMAIL` | Playwright Prod-Login |
|
|
|
|
|
|
| `E2E_PROD_TEST_PASSWORD` | Playwright Prod-Login |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Manuelles Deploy
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Development
|
|
|
|
|
|
cd /home/lars/docker/kairo-dev
|
|
|
|
|
|
git fetch origin develop && git reset --hard origin/develop
|
|
|
|
|
|
docker compose -f docker-compose.dev-env.yml build --no-cache
|
|
|
|
|
|
docker compose -f docker-compose.dev-env.yml up -d
|
|
|
|
|
|
|
|
|
|
|
|
# Production
|
|
|
|
|
|
cd /home/lars/docker/kairo
|
|
|
|
|
|
git fetch origin main && git reset --hard origin/main
|
|
|
|
|
|
docker compose build --no-cache
|
|
|
|
|
|
docker compose up -d
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Nächster Schritt (App-Code)
|
|
|
|
|
|
|
|
|
|
|
|
1. `backend/` mit FastAPI-Skeleton (main.py, Dockerfile, migrations/)
|
|
|
|
|
|
2. `frontend/` mit React/Vite-Skeleton (Dockerfile, nginx.conf)
|
|
|
|
|
|
3. Erster Push auf `develop` → Auto-Deploy Dev
|
|
|
|
|
|
4. Reverse-Proxy-Einträge für Domains aktivieren
|
|
|
|
|
|
5. Gitea E2E-Secrets setzen
|