docs: update architecture to reflect Proxmox migration and correct network configurations

Revised multiple documents to align with the migration from Incus to Proxmox VE 8.4.10. Updated hypervisor, IP ranges, subnet details, and NAT configurations across all relevant files. Marked Incus sections as historical for clarity. Added AI-Stack setup guide for Proxmox LXC.
This commit is contained in:
2026-03-06 13:50:56 +01:00
parent 09b0b1a462
commit 5ab0c9524e
26 changed files with 749 additions and 40 deletions
@@ -6,44 +6,112 @@ owner: DevOps Engineer
# SSoT Konfigurations-Masterplan für Zora (ARM64)
## 1. System-Umgebung (Infrastruktur)
| Parameter | Wert | Erklärung |
|:-------------------|:--------------|:-------------------------------------------------|
| **Architektur** | `linux/arm64` | Native Architektur von Zora (Host). |
| **Host-IP (Zora)** | `10.0.6.1` | Gateway für alle Container (Bridge `incusbr0`). |
| **Projekt-IP** | `10.0.6.50` | Feste IP für den Docker-Host `prod-meldestelle`. |
| **DNS-Server** | `10.0.6.1` | Zora übernimmt die Namensauflösung. |
| Parameter | Wert | Erklärung |
|:-----------------------|:----------------|:-------------------------------------------------------------|
| **Architektur** | `linux/arm64` | Native Architektur von Zora (CIX P1 / CP8180). |
| **Hypervisor** | Proxmox VE 8.4.10 | `pve.mo-code.at` — Web-UI: `https://pve.mo-code.at:8006` |
| **Proxmox-Node-IP** | `10.0.0.20` | SSH: `ssh root@10.0.0.20` |
| **Netz-Bridge** | `vmbr0` | Alle VMs und Container im Subnetz `10.0.0.0/24` |
| **Gateway (Router)** | `10.0.0.138` | Standard-Gateway für alle VMs/Container |
### VM & Container Übersicht
| ID | Name | Typ | IP | Start-Reihenfolge | Zweck |
|:----|:------------------|:-----|:--------------|:------------------|:-----------------------------|
| 100 | pangolin-client | LXC | `10.0.0.21` | order=1, up=30 | Pangolin Tunnel Client |
| 101 | gitea | LXC | `10.0.0.22` | order=2, up=30 | Gitea Server |
| 102 | gitea-runner | VM | `10.0.0.23` | — | Gitea CI/CD Runner (aarch64) |
| 103 | immich | LXC | `10.0.0.24` | order=3, up=30 | Immich Foto-Server |
| 110 | meldestelle-host | VM | `10.0.0.50` | — | Docker App-Stack |
| 111 | ai-stack | LXC | `10.0.0.60` | — | Ollama + Open WebUI (geplant)|
### Detaillierte Ressourcen-Konfiguration
#### CT 100 — pangolin-client (LXC)
| Parameter | Wert |
|:-----------------|:---------------------------------------|
| **OS** | Ubuntu, arm64 |
| **CPU** | 4 Cores (cpulimit=4) |
| **RAM** | 512 MiB + 512 MiB Swap |
| **Disk** | 8 GB (`local:100/vm-100-disk-0.raw`) |
| **Netzwerk** | eth0 → vmbr0, IP `10.0.0.21/24`, GW `10.0.0.138`, Firewall: Yes |
| **Typ** | Unprivileged, nesting=1 |
| **Autostart** | Ja — order=1, up=30 |
#### CT 101 — gitea (LXC)
| Parameter | Wert |
|:-----------------|:---------------------------------------|
| **OS** | Ubuntu, arm64 |
| **CPU** | 4 Cores |
| **RAM** | 1.00 GiB + 512 MiB Swap |
| **Disk** | 20 GB (`local:101/vm-101-disk-0.raw`) |
| **Netzwerk** | eth0 → vmbr0, IP `10.0.0.22/24`, GW `10.0.0.138`, Firewall: Yes |
| **Typ** | Unprivileged, nesting=1 |
| **Autostart** | Ja — order=2, up=30 |
#### CT 103 — immich (LXC)
| Parameter | Wert |
|:-----------------|:---------------------------------------|
| **OS** | Ubuntu, arm64 |
| **CPU** | 8 Cores |
| **RAM** | 10.00 GiB + 512 MiB Swap |
| **Root Disk** | 200 GB (`local:103/vm-103-disk-0.raw`) |
| **Mount Point** | mp0: `/mnt/immich_gross``/mnt/fotos` (Foto-Bibliothek) |
| **Netzwerk** | eth0 → vmbr0, IP `10.0.0.24/24`, GW `10.0.0.138`, Firewall: Yes |
| **Typ** | Unprivileged, nesting=1, keyctl=1, fuse=1 |
| **Autostart** | Ja — order=3, up=30 |
#### VM 102 — gitea-runner (QEMU/KVM)
| Parameter | Wert |
|:-----------------|:-----------------------------------------------------------------|
| **BIOS** | OVMF (UEFI) |
| **Machine** | virt (ARM64) |
| **CPU** | 8 Cores (1 Socket, host-type, numa=1) |
| **RAM** | 16.00 GiB (balloon=0, kein Dynamic Memory) |
| **Disk** | 50 GB SSD (`local:102/vm-102-disk-1.qcow2`, aio=io_uring, iothread=1) |
| **EFI Disk** | `local:102/vm-102-disk-0.qcow2`, efitype=4m, 64 MB |
| **Netzwerk** | virtio, bridge=vmbr0, Firewall: Yes |
| **SCSI** | VirtIO SCSI single |
## 2. Mail-Relay (SSoT Identity)
Diese Daten müssen in der Spring Boot `application.yml` oder `.env` abgeglichen werden.
* **SMTP-Host:** `10.0.6.1` (Zora Host Relay)
* **SMTP-Host:** `10.0.0.20` (Zora Proxmox-Node als Mail-Relay)
* **SMTP-Port:** `25` (Passwortloser interner Zugriff via `mynetworks`)
* **Absender:** `zora@mo-code.at` (Verifizierte World4You Identität)
## 3. Docker-Image Checkliste (ARM64 Kompatibilität)
Bitte prüfe in deinen `docker-compose.yaml` Dateien, ob diese Images genutzt werden (alle unterstützen offiziell ARM64):
| Dienst | Empfohlenes Image | Status |
|:---------------|:---------------------------------|:-----------------------------------------------|
| **Datenbank** | `postgres:15-alpine` | ARM64 Support: Ja |
| **Cache** | `valkey/valkey:8-alpine` | ARM64 Support: Ja (Besserer Support als Redis) |
| **Identity** | `quay.io/keycloak/keycloak:24.0` | ARM64 Support: Ja (Offiziell) |
| **Monitoring** | `prom/prometheus:latest` | ARM64 Support: Ja |
| **Dashboards** | `grafana/grafana:latest` | ARM64 Support: Ja |
| Dienst | Empfohlenes Image | Status |
|:---------------|:-------------------------------------------|:-----------------------------------------------|
| **Datenbank** | `postgres:16-alpine` | ARM64 Support: Ja |
| **Cache** | `valkey/valkey:9-alpine` | ARM64 Support: Ja (Besserer Support als Redis) |
| **Identity** | `quay.io/keycloak/keycloak:26.4` | ARM64 Support: Ja (Offiziell) |
| **Monitoring** | `prom/prometheus:v3.7.3` | ARM64 Support: Ja |
| **Dashboards** | `grafana/grafana:12.3` | ARM64 Support: Ja |
## 4. Backend & Gateway (Spring Boot)
Da du diese selbst baust, ist die Dockerfile-Konfiguration entscheidend:
* **Base Image:** Nutze `eclipse-temurin:17-jre-alpine` oder `21-jre-alpine`. Diese sind für ARM64 optimiert.
* **Build-Prozess:** Dein Gitea-Runner auf Zora baut automatisch für ARM64, da er auf der gleichen Hardware läuft.
* **Base Image:** `eclipse-temurin:25-jre-alpine` (ARM64-native, via Gitea-Pipeline gebaut)
* **Build-Prozess:** Gitea-Runner (VM 102, `10.0.0.23`) baut nativ für `linux/arm64`
## 5. Keycloak SSoT Integration
Wichtige Endpunkte für deine Microservices in der IDEA:
* **External Issuer:** `https://auth.mo-code.at/realms/mocode-realm`
* **Internal Issuer:** `http://infra-keycloak:8080/realms/mocode-realm` (Für die Kommunikation innerhalb des Docker-Netzwerks)
* **Client-ID:** `meldestelle-client`
## 6. Cloudflare Tunnel Routing
Stelle sicher, dass deine Ingress-Rules auf die IP der Meldestelle zeigen:
* `api.mo-code.at` -> `http://10.0.6.50:8080` (Gateway)
* `auth.mo-code.at` -> `http://10.0.6.50:8180` (Keycloak)
* `git.mo-code.at` -> `http://10.0.6.100:3000` (Gitea LXC - bereits aktiv)
* **External Issuer:** `http://10.0.0.50:8180/realms/meldestelle`
* **Internal Issuer:** `http://keycloak:8080/realms/meldestelle` (Docker-intern)
* **Client-IDs:** `api-gateway`, `web-app`
## 6. Pangolin Tunnel Routing
> Pangolin läuft auf CT 100 (pangolin-client, `10.0.0.21`) als Tunnel-Client zu `pangolin.mo-code.at`.
| Route | Ziel (intern) | Port | Sichtbarkeit |
|:-----------------------|:---------------|:-------|:---------------------|
| `api.mo-code.at` | `10.0.0.50` | `8081` | Öffentlich |
| `auth.mo-code.at` | `10.0.0.50` | `8180` | Öffentlich |
| `git.mo-code.at` | `10.0.0.22` | `3000` | Öffentlich |
| `photos.mo-code.at` | `10.0.0.24` | `2283` | Nur intern / VPN |
| `ai.mo-code.at` | `10.0.0.60` | `3001` | Nur intern / VPN |