diff --git a/docs/architecture/ai-apps-stacks.md b/docs/architecture/ai-apps-stacks.md new file mode 100644 index 0000000..e6e3e6e --- /dev/null +++ b/docs/architecture/ai-apps-stacks.md @@ -0,0 +1,79 @@ +# ai-apps — Service Stack Inventory + +**Stand:** 2026-04-11 +**Host:** Hetzner cx22 (8 GB RAM, 2 vCPU shared, 75 GB Disk) +**Netzwerke:** Public 91.98.226.44, Privat 10.0.0.8 +**OS:** Debian / Docker 29.x + Compose v5 +**Swap:** 2 GB (/swapfile in fstab) + +## Service-Übersicht + +| Stack | Containers | Exposed | Domain(s) | DB | Memory (peak) | +|---|---|---|---|---|---| +| **shared** | traefik, portainer | 80, 443 | `traefik.sdda.eu`, `containers.sdda.eu` | — | ~200 MB | +| **n8n** | n8n, n8n-db | — (via Traefik) | `n8n.sdda.eu` | Postgres 16 | ~400 MB | +| **locosoft-hilfe-system** | locosoft-backend, locosoft-frontend, locosoft-db, locosoft-redis, chromadb | — | `locosoft.sdda.eu`, `chromadb.sdda.eu` | Postgres 16 + Redis + ChromaDB | ~1.5 GB | +| **eh-search** | eh-search, eh-search-redis | 10.0.0.8:8200 (privat) | via Pegasus nginx `/api/search` | Redis | ~250 MB | +| **loco-replica** | loco-replica-db | 10.0.0.8:5433 (privat) | — | Postgres 17 | ~300 MB | +| **electric-horses-audits** | eh-audits | — (n8n-triggered) | — | — | ~200 MB | +| **forgejo** ★NEU★ | forgejo, forgejo-db | 222 (SSH), via Traefik | **`code.sdda.eu`** | Postgres 16 | ~800 MB | + +**Gesamt-Schätzwert:** ~3.5 GB Peak, gemessener Durchschnitt ~1.9 GB + Cache. + +## Traefik (shared) +- **Version:** 3.6.2 +- **ACME Resolver:** `letsencrypt` (HTTP-Challenge, Email `info@sdda.eu`) +- **Dynamic Config:** `/opt/shared/traefik/dynamic/` (File Provider für Middlewares: `authentik.yml`, `authentik-outpost.yml`) +- **Docker Network:** `traefik-public` (external, alle Web-Services hängen dort) +- **ACME Store:** `/opt/shared/traefik/acme.json` + +## Authentik Integration +- **Authentik-Server:** separater Host `authentik-sso` (138.199.202.82 / 10.0.0.7), **NICHT** auf ai-apps +- **ForwardAuth-Apps** (existing): `locosoft-forward-auth`, `n8n-forward-auth` (beide Proxy Provider, Embedded Outpost) +- **Native OIDC-Apps** (neu ab 2026-04-11): `forgejo` (OAuth2/OpenID Provider, siehe `../Forgejo/adr/0003-*.md`) + +## Stack-Organisation +Jeder Stack lebt in eigenem Verzeichnis unter `/opt/ai-apps//`: +``` +/opt/ai-apps/ +├── electric-horses-audits/ +├── eh-search/ +├── forgejo/ ← NEW 2026-04-11 +├── locosoft-hilfe-system/ +├── loco-replica/ +├── mobile-refdata/ ← scripts only +└── n8n/ + +/opt/shared/ ← Traefik + Portainer +/opt/backups/ ← centralised backup target +``` + +**Pattern:** Jeder Stack hat eine eigene `docker-compose.yml` und `.env`, eigene interne Netzwerke, gemeinsames `traefik-public` für Web-Exposure. + +## Ressourcen-Bewertung (2026-04-11) +- **RAM:** 7.6 GB total, 1.9 GB wirklich in use, 5.7 GB available (inkl. Cache), 250 MB free, 2 GB Swap aktiv +- **Disk:** 20 GB frei von 75 GB (73% belegt) +- **Load:** ~0.1 (idle) +- **Fazit:** Forgejo passt noch rein, aber der Spielraum für zukünftige Services (z.B. Forgejo Actions, Monitoring, Semantic Search Index) ist begrenzt. Bei >85% RAM-Auslastung: Upgrade auf cx32 (16 GB, +4 €/Monat). + +## DNS Einträge unter `sdda.eu` die auf ai-apps zeigen (91.98.226.44) +- `ai.sdda.eu` (Alias) +- `containers.sdda.eu` (Portainer) +- `traefik.sdda.eu` (Traefik Dashboard) +- `chromadb.sdda.eu` +- `locosoft.sdda.eu` +- `n8n.sdda.eu` +- **`code.sdda.eu`** ← Forgejo (NEU) + +## Backups (Stand 2026-04-11) +- **forgejo:** Cron 03:00 → `/opt/backups/forgejo/`, Retention 14 Tage (seit M7.1) +- **andere Stacks:** Keine zentrale Backup-Infrastruktur. Hetzner Cloud Snapshots manuell. Rclone → Nextcloud noch nicht eingerichtet (geplant M7.5). + +## Zugriff +- **SSH:** `ssh ai-apps` (User root, Key-basiert) +- **Portainer:** https://containers.sdda.eu (admin) +- **Traefik Dashboard:** https://traefik.sdda.eu + +## OpenProject-Referenz +- **M7.1** (#1119) — Forgejo Deployment: https://openproject.sdda.eu/work_packages/1119 +- **M7** (#1118) — Operations & Documentation Foundation (Parent Phase)