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.
|
|
@ -7,7 +7,7 @@ owner: DevOps Engineer
|
|||
|
||||
[Gitea](/)
|
||||
|
||||
Open main menu
|
||||
Open the main menu
|
||||
|
||||
Products
|
||||
|
||||
|
|
@ -198,4 +198,4 @@ Private, Fast, Reliable DevOps Platform
|
|||
### Legal
|
||||
|
||||
* [Privacy](/privacy-policy/)
|
||||
* [Terms](/terms-of-service/)
|
||||
* [Terms](/terms-of-service/)
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ Wir validieren die gesamte Architektur-Kette (Frontend -> Gateway -> Service ->
|
|||
4. **Infrastructure Setup (Home-Server):**
|
||||
* Hardware: Minisforum MS-R1 (ARM64, 12 Cores, 10G LAN) ✅ **GELIEFERT (07.02.2026)**.
|
||||
* OS: Debian 12 (Vendor Variant) als Host.
|
||||
* Hypervisor: **Incus** (LXC/LXD Fork).
|
||||
* Hypervisor: **Proxmox VE 8.4.10** (`pve.mo-code.at`).
|
||||
* Virtualization Strategy:
|
||||
* `infra-gitea` (LXC Container): Gitea + Actions Runner (Native ARM Builds).
|
||||
* `docker-host-prod` (VM): Debian VM als Docker Host für den Meldestelle-Stack (Isolation, keine Nesting-Probleme).
|
||||
|
|
|
|||
431
docs/01_Architecture/Minisforum-MS-R1/AI_Stack_Ollama_Setup.md
Normal file
|
|
@ -0,0 +1,431 @@
|
|||
---
|
||||
type: Guide
|
||||
status: ACTIVE
|
||||
owner: DevOps Engineer
|
||||
---
|
||||
# Installations-Anleitung: Lokaler AI-Stack auf Zora (MS-R1)
|
||||
|
||||
> **Ziel:** Ollama + Open WebUI als isolierter Proxmox LXC-Container auf Zora.
|
||||
> Vollständig lokal, datenschutzkonform, erreichbar via Pangolin-Tunnel.
|
||||
> **Datum:** 2026-03-06 | **Aktualisiert:** 2026-03-06 (Incus → Proxmox)
|
||||
|
||||
---
|
||||
|
||||
## Hardware-Profil: CIX P1 (CP8180) — Was steckt drin?
|
||||
|
||||
| Komponente | Detail | Bedeutung für KI |
|
||||
|---|---|---|
|
||||
| **CPU** | 12 Cores: 4x Cortex-X4 (fast, ~2.6GHz) + 4x A720 (medium) + 4x A520 (slow) | Tri-Cluster → großzügige Kern-Zuweisung sinnvoll |
|
||||
| **GPU** | Arm Immortalis-G720 MC10 | Vulkan 1.3 — experimentelle GPU-Beschleunigung möglich |
|
||||
| **RAM** | 64 GB LPDDR5 5500MHz | Auch 70B-Modelle laufen vollständig im RAM! |
|
||||
| **NPU** | CIX P1 integrierte NPU | ⚠️ Aktuell kein Ollama/llama.cpp-Support — Zukunft |
|
||||
| **OS** | Proxmox VE 8.4.10 | Hypervisor auf Debian-Basis, ARM64-native |
|
||||
|
||||
### CPU-Kerne im Detail
|
||||
|
||||
```
|
||||
Cores 0– 3 → Cortex-A520 (Efficiency / langsam)
|
||||
Cores 4– 7 → Cortex-A720 (Balanced / mittel)
|
||||
Cores 8–11 → Cortex-X4 (Performance / schnell)
|
||||
```
|
||||
|
||||
Der AI-Container bekommt 10 Kerne (2–11), Proxmox behält Kern 0–1 für Host-Betrieb.
|
||||
CPU-Governor auf `performance` für die X4-Kerne maximiert den Inferenz-Durchsatz.
|
||||
|
||||
---
|
||||
|
||||
## Architektur-Entscheidung: Warum separater Proxmox LXC-Container?
|
||||
|
||||
```
|
||||
Zora — Proxmox 8.4.10 (10.0.0.20)
|
||||
├── VM 102 gitea-runner (10.0.0.23) ← Gitea CI/CD Runner
|
||||
├── VM 110 meldestelle-host (10.0.0.50) ← Docker App-Stack
|
||||
├── LXC 100 pangolin-client ← Pangolin Tunnel
|
||||
├── LXC 101 gitea (10.0.0.22) ← Gitea Server
|
||||
├── LXC 103 immich ← Immich
|
||||
└── LXC 111 ai-stack (10.0.0.60) ← Ollama + Open WebUI ← NEU
|
||||
```
|
||||
|
||||
**Begründung:** Modelle (5–40 GB pro Modell) wachsen unkontrolliert.
|
||||
Isolierter LXC-Container schützt den App-Stack vor RAM/CPU-Hunger der KI.
|
||||
Unabhängige Updates — Ollama-Modelle liegen im Container-Volume, nicht im Git-Repo.
|
||||
|
||||
---
|
||||
|
||||
## Phase 1 — Proxmox Host vorbereiten
|
||||
|
||||
### 1.1 — CPU Governor auf Performance setzen (auf Proxmox-Node)
|
||||
|
||||
```bash
|
||||
# SSH auf den Proxmox-Node
|
||||
ssh root@10.0.0.20
|
||||
# oder: ssh root@pve.mo-code.at
|
||||
|
||||
# cpufrequtils installieren
|
||||
apt-get install -y cpufrequtils
|
||||
|
||||
# Alle 12 Kerne auf Performance
|
||||
for i in $(seq 0 11); do
|
||||
cpufreq-set -c $i -g performance
|
||||
done
|
||||
|
||||
# Prüfen
|
||||
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
|
||||
# Erwartete Ausgabe: 12x "performance"
|
||||
|
||||
# Persistent machen
|
||||
tee /etc/systemd/system/cpu-performance.service > /dev/null <<'EOF'
|
||||
[Unit]
|
||||
Description=Set CPU Governor to Performance
|
||||
After=multi-user.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/bin/bash -c 'for i in $(seq 0 11); do cpufreq-set -c $i -g performance; done'
|
||||
RemainAfterExit=yes
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable --now cpu-performance.service
|
||||
```
|
||||
|
||||
### 1.2 — Huge Pages aktivieren (bessere RAM-Nutzung für große Modelle)
|
||||
|
||||
```bash
|
||||
# Auf dem Proxmox-Node:
|
||||
echo "vm.nr_hugepages = 512" >> /etc/sysctl.conf
|
||||
sysctl -p
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 2 — Proxmox LXC-Container erstellen
|
||||
|
||||
> ℹ️ **Alle Befehle laufen auf dem Proxmox-Node** (`ssh root@10.0.0.20`)
|
||||
> Alternativ: Proxmox Web-UI unter `https://pve.mo-code.at:8006`
|
||||
|
||||
### 2.1 — Debian 12 Template herunterladen
|
||||
|
||||
```bash
|
||||
# Template-Liste aktualisieren
|
||||
pveam update
|
||||
|
||||
# Debian 12 ARM64 Template suchen und herunterladen
|
||||
pveam available --section system | grep debian-12.*arm64
|
||||
pveam download local debian-12-standard_12.7-1_arm64.tar.zst
|
||||
```
|
||||
|
||||
### 2.2 — Container erstellen (CT 111)
|
||||
|
||||
```bash
|
||||
pct create 111 local:vztmpl/debian-12-standard_12.7-1_arm64.tar.zst \
|
||||
--hostname ai-stack \
|
||||
--arch aarch64 \
|
||||
--cores 10 \
|
||||
--memory 49152 \
|
||||
--swap 4096 \
|
||||
--rootfs local-lvm:200 \
|
||||
--net0 name=eth0,bridge=vmbr0,ip=10.0.0.60/24,gw=10.0.0.138,firewall=1 \
|
||||
--nameserver 10.0.0.138 \
|
||||
--searchdomain mo-code.at \
|
||||
--unprivileged 1 \
|
||||
--features nesting=1 \
|
||||
--password
|
||||
|
||||
# Container starten
|
||||
pct start 111
|
||||
|
||||
# Status prüfen
|
||||
pct status 111
|
||||
pct list
|
||||
```
|
||||
|
||||
### 2.3 — CPU-Pinning konfigurieren (Performance-Kerne für KI)
|
||||
|
||||
```bash
|
||||
# Kerne 2–11 dem Container zuweisen (Kerne 8–11 = X4 Performance-Kerne!)
|
||||
# In der Container-Config:
|
||||
echo "cpulimit: 10" >> /etc/pve/lxc/111.conf
|
||||
echo "cpuunits: 1024" >> /etc/pve/lxc/111.conf
|
||||
|
||||
# Alternativ via Web-UI:
|
||||
# CT 111 → Options → CPU Limit: 10 Cores
|
||||
```
|
||||
|
||||
### 2.4 — In Container einloggen und Basis-Setup
|
||||
|
||||
```bash
|
||||
# Direkt per pct:
|
||||
pct enter 111
|
||||
|
||||
# Im Container:
|
||||
apt-get update && apt-get upgrade -y
|
||||
apt-get install -y curl wget git htop nano ca-certificates gnupg lsb-release
|
||||
|
||||
# Docker installieren (für Open WebUI)
|
||||
curl -fsSL https://get.docker.com | sh
|
||||
systemctl enable --now docker
|
||||
|
||||
# Benutzer anlegen
|
||||
useradd -m -s /bin/bash aiuser
|
||||
usermod -aG docker aiuser
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 3 — Ollama installieren & optimieren
|
||||
|
||||
### 3.1 — Ollama installieren
|
||||
|
||||
```bash
|
||||
# Im Container (pct enter 111):
|
||||
curl -fsSL https://ollama.com/install.sh | sh
|
||||
|
||||
# ARM64 wird automatisch erkannt
|
||||
ollama --version
|
||||
```
|
||||
|
||||
### 3.2 — Ollama-Service konfigurieren (Performance-Tuning)
|
||||
|
||||
```bash
|
||||
mkdir -p /etc/systemd/system/ollama.service.d/
|
||||
cat > /etc/systemd/system/ollama.service.d/override.conf << 'EOF'
|
||||
[Service]
|
||||
# Auf allen Interfaces lauschen (nicht nur localhost)
|
||||
Environment="OLLAMA_HOST=0.0.0.0:11434"
|
||||
|
||||
# Alle zugewiesenen CPU-Kerne nutzen
|
||||
Environment="OLLAMA_NUM_THREADS=10"
|
||||
|
||||
# Modelle 24h im RAM halten (kein ständiges Laden)
|
||||
Environment="OLLAMA_KEEP_ALIVE=24h"
|
||||
|
||||
# Bis zu 2 Modelle gleichzeitig geladen halten
|
||||
Environment="OLLAMA_MAX_LOADED_MODELS=2"
|
||||
|
||||
# Flash Attention aktivieren (schnellere Verarbeitung langer Kontexte)
|
||||
Environment="OLLAMA_FLASH_ATTENTION=1"
|
||||
|
||||
# Kontext-Größe erhöhen für längere Gespräche
|
||||
Environment="OLLAMA_MAX_CONTEXT_LENGTH=8192"
|
||||
EOF
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl restart ollama
|
||||
systemctl status ollama
|
||||
```
|
||||
|
||||
### 3.3 — Vulkan GPU-Beschleunigung (Immortalis-G720)
|
||||
|
||||
> ⚠️ **Experimentell** — CIX P1 + Immortalis-G720 Vulkan-Treiber sind noch nicht
|
||||
> vollständig im Mainline-Kernel. Zuerst ohne Vulkan starten, später nachrüsten.
|
||||
|
||||
```bash
|
||||
# Prüfen ob Vulkan-Device sichtbar ist
|
||||
apt-get install -y vulkan-tools
|
||||
vulkaninfo --summary 2>/dev/null | grep -i "GPU\|device\|driver"
|
||||
|
||||
# Falls Vulkan verfügbar — in override.conf ergänzen:
|
||||
# Environment="OLLAMA_GPU_LAYERS=999"
|
||||
# → Dann ollama neu starten und testen
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 4 — Modelle herunterladen
|
||||
|
||||
### Empfohlene Modelle für 64 GB ARM64
|
||||
|
||||
```bash
|
||||
# Im Container:
|
||||
ollama pull llama3.1:8b # 5 GB — schnell, Allrounder, Deutsch OK
|
||||
ollama pull qwen2.5-coder:14b # 9 GB — Beste Code-Qualität für IDEA!
|
||||
ollama pull nomic-embed-text # 300MB — Pflicht für RAG/Embeddings
|
||||
|
||||
# Optional (wenn du mehr Power willst):
|
||||
ollama pull llama3.1:70b # 40 GB — Maximale Qualität, läuft in 64GB RAM!
|
||||
ollama pull qwen2.5:32b # 20 GB — Gute Balance Qualität/Speed
|
||||
|
||||
# Testen:
|
||||
ollama run llama3.1:8b "Erkläre mir Spring Boot in einem Satz auf Deutsch"
|
||||
```
|
||||
|
||||
### Modell-Entscheidungshilfe
|
||||
|
||||
| Modell | RAM | Speed | Qualität | Empfehlung |
|
||||
|---|---|---|---|---|
|
||||
| `llama3.1:8b` | 5 GB | ⚡⚡⚡ | ★★★ | Täglicher Chat, schnelle Antworten |
|
||||
| `qwen2.5-coder:14b` | 9 GB | ⚡⚡ | ★★★★ | **IDEA-Integration, Kotlin/Java Code** |
|
||||
| `qwen2.5:32b` | 20 GB | ⚡ | ★★★★★ | Tiefe Analysen, Architektur-Fragen |
|
||||
| `llama3.1:70b` | 40 GB | 🐢 | ★★★★★ | Maximale Qualität, geduldige Anfragen |
|
||||
| `nomic-embed-text` | 300 MB | ⚡⚡⚡ | RAG | **Pflicht für Docs-RAG** |
|
||||
|
||||
---
|
||||
|
||||
## Phase 5 — Open WebUI installieren
|
||||
|
||||
```bash
|
||||
# Im Container (pct enter 111):
|
||||
docker run -d \
|
||||
--name open-webui \
|
||||
--restart always \
|
||||
-p 3001:8080 \
|
||||
-v open-webui:/app/backend/data \
|
||||
-e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
|
||||
--add-host=host.docker.internal:10.0.0.60 \
|
||||
ghcr.io/open-webui/open-webui:main
|
||||
|
||||
# Prüfen:
|
||||
docker ps
|
||||
curl http://localhost:3001
|
||||
```
|
||||
|
||||
### 5.1 — Open WebUI RAG-Konfiguration
|
||||
|
||||
```
|
||||
Browser: http://10.0.0.60:3001
|
||||
|
||||
1. Admin-Account anlegen (erster Login)
|
||||
2. Settings → Admin Panel → Connections
|
||||
→ Ollama URL: http://10.0.0.60:11434 ✓
|
||||
|
||||
3. Settings → Admin Panel → Documents
|
||||
→ Embedding Model: nomic-embed-text
|
||||
→ Chunk Size: 1500
|
||||
→ Chunk Overlap: 150
|
||||
|
||||
4. Workspace → Documents → Upload
|
||||
→ Deine /docs/**/*.md Dateien hochladen
|
||||
→ Besonders: 04_Agents/Playbooks/, 01_Architecture/adr/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 6 — Pangolin-Route konfigurieren
|
||||
|
||||
| Route | Ziel | Port | Sichtbarkeit |
|
||||
|---|---|---|---|
|
||||
| `ai.mo-code.at` | `10.0.0.60` | `3001` | Nur intern / VPN! |
|
||||
|
||||
> 🔒 **Sicherheit:** Open WebUI NIEMALS ohne Auth öffentlich exponieren.
|
||||
> Pangolin-Zugang nur via VPN oder mit Basic-Auth absichern.
|
||||
|
||||
---
|
||||
|
||||
## Phase 7 — IntelliJ IDEA Integration
|
||||
|
||||
### Option A: Continue.dev Plugin (empfohlen für Code-Completion)
|
||||
|
||||
```
|
||||
1. IDEA → Settings → Plugins → "Continue" installieren
|
||||
2. Continue-Konfiguration öffnen (~/.continue/config.json):
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"models": [
|
||||
{
|
||||
"title": "Zora-Coder (qwen2.5)",
|
||||
"provider": "ollama",
|
||||
"model": "qwen2.5-coder:14b",
|
||||
"apiBase": "http://10.0.0.60:11434"
|
||||
},
|
||||
{
|
||||
"title": "Zora-Chat (llama3.1)",
|
||||
"provider": "ollama",
|
||||
"model": "llama3.1:8b",
|
||||
"apiBase": "http://10.0.0.60:11434"
|
||||
}
|
||||
],
|
||||
"tabAutocompleteModel": {
|
||||
"title": "Zora-Autocomplete",
|
||||
"provider": "ollama",
|
||||
"model": "qwen2.5-coder:14b",
|
||||
"apiBase": "http://10.0.0.60:11434"
|
||||
},
|
||||
"embeddingsProvider": {
|
||||
"provider": "ollama",
|
||||
"model": "nomic-embed-text",
|
||||
"apiBase": "http://10.0.0.60:11434"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```
|
||||
3. In IDEA:
|
||||
- Ctrl+I → Chat öffnen (Inline-Fragen im Code)
|
||||
- Ctrl+Shift+I → Tab Autocomplete aktivieren
|
||||
- Alle Daten bleiben auf Zora — kein Cloud-Kontakt!
|
||||
```
|
||||
|
||||
### Option B: JetBrains AI Assistant mit lokalem Modell
|
||||
|
||||
```
|
||||
Settings → Tools → AI Assistant
|
||||
→ "Use custom AI provider"
|
||||
→ Endpoint: http://10.0.0.60:11434/v1
|
||||
→ Model: qwen2.5-coder:14b
|
||||
→ API Key: ollama (beliebiger String)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Zukunft: NPU-Beschleunigung
|
||||
|
||||
Der CIX P1 hat eine integrierte NPU, die aktuell **nicht von Ollama/llama.cpp unterstützt** wird.
|
||||
|
||||
**Roadmap:**
|
||||
- `llama.cpp` arbeitet an OpenCL/Vulkan-Backend → Immortalis-G720 wird profitieren
|
||||
- CIX P1 NPU-Treiber müssen von CIX Technology als Open-Source freigegeben werden
|
||||
- **Empfehlung:** System ohne NPU in Betrieb nehmen, NPU-Support nachrüsten sobald verfügbar
|
||||
|
||||
**Monitoring:**
|
||||
- https://github.com/ollama/ollama/issues (Filter: "vulkan", "arm64")
|
||||
- https://github.com/ggml-org/llama.cpp/issues (Filter: "vulkan")
|
||||
|
||||
---
|
||||
|
||||
## Quick-Reference: Wichtige Befehle
|
||||
|
||||
```bash
|
||||
# Container verwalten (auf Proxmox-Node: ssh root@10.0.0.20)
|
||||
pct start 111
|
||||
pct stop 111
|
||||
pct enter 111
|
||||
pct status 111
|
||||
|
||||
# Modelle verwalten (im Container)
|
||||
ollama list # Installierte Modelle
|
||||
ollama pull <modell> # Neues Modell herunterladen
|
||||
ollama rm <modell> # Modell löschen
|
||||
ollama ps # Laufende Modelle
|
||||
|
||||
# Logs
|
||||
journalctl -u ollama -f # Ollama-Logs live
|
||||
docker logs -f open-webui # Open WebUI Logs
|
||||
|
||||
# Performance prüfen
|
||||
htop # CPU/RAM-Auslastung
|
||||
ollama ps # Welches Modell läuft, RAM-Nutzung
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Netz-Übersicht nach diesem Setup
|
||||
|
||||
```
|
||||
Zora — Proxmox 8.4.10 (10.0.0.20)
|
||||
├── VM 102 gitea-runner 10.0.0.23 Gitea CI/CD Runner
|
||||
├── VM 110 meldestelle-host 10.0.0.50 Docker App-Stack
|
||||
├── LXC 101 gitea 10.0.0.22 Gitea Server
|
||||
├── LXC 103 immich Immich
|
||||
└── LXC 111 ai-stack 10.0.0.60 Ollama :11434 | Open WebUI :3001
|
||||
|
||||
Pangolin-Tunnel:
|
||||
├── ai.mo-code.at → 10.0.0.60:3001 (Open WebUI — nur intern/VPN)
|
||||
├── api.mo-code.at → 10.0.0.50:8081 (API Gateway)
|
||||
└── auth.mo-code.at → 10.0.0.50:8180 (Keycloak)
|
||||
```
|
||||
|
|
@ -57,9 +57,11 @@ sudo iptables -t nat -A POSTROUTING -s 10.0.6.0/24 ! -d 10.0.6.0/24 -j MASQUERAD
|
|||
|
||||
Aufgrund der ARM64-Architektur und Kernel-Einschränkungen wurden folgende Anpassungen vorgenommen:
|
||||
|
||||
* **Firewall-Modus:** Das System nutzt `iptables-legacy`, da moderne NFT-Module teilweise fehlen.
|
||||
* **NAT-Regel:** Da Incus die Firewall nicht automatisch verwalten kann, muss der Internetzugriff für Container manuell maskiert werden:
|
||||
`sudo iptables -t nat -A POSTROUTING -s 10.0.6.0/24 ! -d 10.0.6.0/24 -j MASQUERADE`
|
||||
* **Hypervisor:** Proxmox VE 8.4.10 läuft auf Zora (`pve.mo-code.at`, IP `10.0.0.20`).
|
||||
* **Netz-Bridge:** `vmbr0`, Subnetz `10.0.0.0/24`, Gateway `10.0.0.138`.
|
||||
* **Firewall-Modus:** Proxmox verwaltet Firewall und NAT automatisch via `vmbr0` — keine manuelle iptables-Regel nötig.
|
||||
|
||||
> ℹ️ Frühere Einträge zu Incus/iptables-MASQUERADE sind historisch (Testbetrieb Feb 2026) und wurden durch Proxmox abgelöst.
|
||||
|
||||
## Wichtige Befehle
|
||||
|
||||
|
|
@ -70,7 +72,11 @@ Aufgrund der ARM64-Architektur und Kernel-Einschränkungen wurden folgende Anpas
|
|||
|
||||
## 2. Incus_Konfiguration&Bedienungsanleitung.md
|
||||
|
||||
# Infrastruktur-Dokumentation: Incus Virtualisierung
|
||||
> ⚠️ **HISTORISCH (Testbetrieb Feb 2026) — ABGELÖST durch Proxmox VE 8.4.10**
|
||||
> Diese Sektion dokumentiert den ursprünglichen Incus-Testbetrieb. Zora läuft heute auf Proxmox.
|
||||
> Aktueller Stand: `SSoT_Konfigurations-Masterplan_Zora.md`
|
||||
|
||||
# Infrastruktur-Dokumentation: Incus Virtualisierung (HISTORISCH)
|
||||
|
||||
## 1. Virtualisierungs-Strategie
|
||||
|
||||
|
|
|
|||
|
|
@ -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 |
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ Das System nutzt das **Single Source of Truth (SSoT)** Prinzip für den gesamten
|
|||
| Parameter | Wert | Funktion |
|
||||
|:-------------------|:-------------------------|:-------------------------------------------------|
|
||||
| **Zentraler Host** | `zora.mo-code.at` | Primärer Mail-Transfer-Agent (MTA). |
|
||||
| **Gateway IP** | `10.0.6.1` | Interne Erreichbarkeit für alle Container/VMs. |
|
||||
| **Gateway IP** | `10.0.0.20` | Proxmox-Node-IP, interne Erreichbarkeit für alle VMs/Container. |
|
||||
| **Relay Host** | `smtp.world4you.com:587` | Externer Provider für den tatsächlichen Versand. |
|
||||
| **SSoT Account** | `zora@mo-code.at` | Die verifizierte Absender-Identität. |
|
||||
|
||||
|
|
@ -20,7 +20,7 @@ Das System nutzt das **Single Source of Truth (SSoT)** Prinzip für den gesamten
|
|||
## 2. Technische Umsetzung (Der "Postbote")
|
||||
Wir haben Postfix als **Satellitensystem** konfiguriert. Er nimmt Briefe im internen Netzwerk entgegen und bringt sie sicher zum Provider.
|
||||
|
||||
* **Sicherheit:** Postfix lauscht auf Port 25, erlaubt den Versand aber **nur** für Anfragen aus dem internen Netz `10.0.0.0/8` (Incus/Docker).
|
||||
* **Sicherheit:** Postfix lauscht auf Port 25, erlaubt den Versand aber **nur** für Anfragen aus dem internen Netz `10.0.0.0/8` (Proxmox vmbr0 / Docker).
|
||||
* **Authentifizierung:** Nur Zora kennt das Passwort für den World4You-Account (gespeichert in `sasl_passwd`).
|
||||
* **Umschreibung (Canonical Mapping):** Postfix korrigiert automatisch Absender wie `root@zora` oder `grandmo@zora` zu `zora@mo-code.at`, damit der Provider die Mails nicht ablehnt.
|
||||
* **Verschlüsselung:** Die Verbindung zu World4You ist via TLS (STARTTLS) abgesichert.
|
||||
|
|
@ -38,7 +38,7 @@ Ein Dienst stellt einen Zustand fest, der gemeldet werden muss.
|
|||
|
||||
### Phase B: Der interne Transport
|
||||
Der Dienst verbindet sich ohne Passwort (da er sich im vertrauenswürdigen Netz befindet) mit:
|
||||
`SMTP_HOST: 10.0.6.1` | `SMTP_PORT: 25`
|
||||
`SMTP_HOST: 10.0.0.20` | `SMTP_PORT: 25`
|
||||
Dies minimiert das Risiko: Keine Passwörter in `.env`-Dateien von Applikationen.
|
||||
|
||||
### Phase C: Die externe Zustellung
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ owner: DevOps Engineer
|
|||
Keycloak-Secrets.
|
||||
*[ ] **Stack-Launch (dc-infra.yaml):** * Start von **Postgres**, **Keycloak** und **Valkey** (Redis-Alternative).
|
||||
*[ ] **Wichtig:** Kontrolle der Logs auf ARM64-Kompatibilität (`exec format error` vermeiden).
|
||||
*[ ] **Netzwerk-Check:** * Testen der Erreichbarkeit von Zoras Mail-Relay (`10.0.6.1:25`) aus dem neuen Stack heraus.
|
||||
*[ ] **Netzwerk-Check:** * Testen der Erreichbarkeit von Zoras Mail-Relay (`10.0.0.20:25`) aus dem neuen Stack heraus.
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -40,8 +40,8 @@ owner: DevOps Engineer
|
|||
**Ziel:** Den Ping-Service über das Spring Cloud Gateway erreichbar machen.
|
||||
|
||||
*[ ] **Backend-Start (dc-backend.yaml):** * Deployment des **api-gateways** und des **ping-services**.
|
||||
*[ ] **Cloudflare-Tunnel Update:** * Hinzufügen der Route `api.mo-code.at`, die auf die IP der Meldestelle (`10.0.6.50`)
|
||||
und den Port des Gateways (`8080`) zeigt.
|
||||
*[ ] **Pangolin-Tunnel Update:** * Hinzufügen der Route `api.mo-code.at`, die auf die IP der Meldestelle (`10.0.0.50`)
|
||||
und den Port des Gateways (`8081`) zeigt.
|
||||
*[ ] **Keycloak-Veredelung:** * Konfiguration des Realms und Erstellen des Clients für die Meldestelle im
|
||||
Keycloak-Admin-Panel (via `auth.mo-code.at`).
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,73 @@
|
|||
# Journal - 2026-03-06 (Session 2)
|
||||
|
||||
## 📝 Zusammenfassung
|
||||
|
||||
Strategische Planungssession mit dem Lead Architect. Drei konkrete Bugs aus der Tiefenanalyse behoben (Valkey-Inkonsistenz, Dependency Verification, backup.sh Hardcodes). Vollständige Schritt-für-Schritt-Anleitung für das heutige Meldestellen-Host-Setup erstellt. Architektur-Entscheidung für einen lokalen AI-Stack (Ollama + Open WebUI) als separaten Proxmox LXC-Container (CT 111) auf Zora getroffen und Installations-Anleitung dokumentiert. Korrektur: Zora läuft auf Proxmox 8.4.10 (nicht Incus); IPs im Netz 10.0.0.0/24.
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Änderungen
|
||||
|
||||
### 1. Bug-Fixes aus Tiefenanalyse
|
||||
|
||||
* **`dc-backend.yaml`:** ping-service von veralteten `SPRING_DATA_REDIS_*` auf `SPRING_DATA_VALKEY_*` umgestellt — konsistent mit api-gateway.
|
||||
* **`gradle.properties`:** `org.gradle.dependency.verification=lenient` → `strict` — Sicherheits-Level angehoben, da eigene Gitea-Registry vorhanden.
|
||||
* **`config/scripts/backup.sh`:** `.env` via `source` geladen, `grandmo`-Hardcode entfernt, `DB_USER` liest `${POSTGRES_USER}` aus `.env`, `BACKUP_DIR` und `BACKUP_RETENTION_DAYS` konfigurierbar.
|
||||
* **`.env` + `.env.example`:** `BACKUP_DIR` und `BACKUP_RETENTION_DAYS` als neue SSoT-Variablen ergänzt.
|
||||
|
||||
### 2. Neue Dokumentation
|
||||
|
||||
* **`docs/01_Architecture/Minisforum-MS-R1/AI_Stack_Ollama_Setup.md`:** Vollständige Installations-Anleitung für Ollama + Open WebUI auf Zora als Proxmox LXC-Container (CT 111, IP 10.0.0.60). Enthält Hardware-Profil (CIX P1 / CP8180), CPU-Governor-Tuning auf Proxmox-Node, `pct create`-Befehle, Modell-Matrix, Open-WebUI-RAG-Setup, Pangolin-Routing und IntelliJ IDEA Continue.dev-Integration.
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Architektur-Entscheidungen
|
||||
|
||||
### AI-Stack: Separater Proxmox LXC-Container (nicht im App-Repo)
|
||||
|
||||
**Entscheidung:** Ollama + Open WebUI laufen in einem eigenen Proxmox LXC-Container `ai-stack` (CT 111, IP 10.0.0.60), **nicht** als Docker-Service im Meldestelle-Repo.
|
||||
|
||||
**Begründung:**
|
||||
* Modelle (5–40 GB pro Modell) wachsen unkontrolliert — Isolation schützt den App-Stack.
|
||||
* Unabhängige Updates ohne Risiko für den Meldestelle-Produktivbetrieb.
|
||||
* RAM/CPU-Hunger der KI-Inference beeinflusst nicht die Keycloak/Gateway/DB-Verfügbarkeit.
|
||||
|
||||
### Datenschutz: Vollständig lokal via Ollama
|
||||
|
||||
* Kein Byte verlässt das Heimnetz — alle Inferenz läuft auf Zora CPU (CIX P1, 12 Cores).
|
||||
* IDEA-Integration via **Continue.dev Plugin** mit `http://10.0.0.60:11434` als Endpoint.
|
||||
* Pangolin-Route `ai.mo-code.at` → nur intern / VPN exponieren.
|
||||
|
||||
### NPU: Noch nicht nutzbar
|
||||
|
||||
* CIX P1 NPU aktuell **kein** Ollama/llama.cpp-Support.
|
||||
* Immortalis-G720 (Vulkan 1.3) — experimentell, nachrüsten sobald stabil.
|
||||
* Primärer Pfad: CPU-Inferenz mit NEON/SVE2-Optimierungen (ARM64-native Ollama).
|
||||
|
||||
---
|
||||
|
||||
## 📚 Gelerntes
|
||||
|
||||
* **CIX P1 (CP8180) = Tri-Cluster ARM:** 4x Cortex-X4 (fast) + 4x A720 (medium) + 4x A520 (slow) — alle 12 Kerne Ollama zuweisen, CPU-Governor auf `performance` setzen.
|
||||
* **64 GB RAM = 70B-Modelle möglich:** `llama3.1:70b` (~40 GB) läuft vollständig im RAM — einzigartige Stärke dieser Hardware.
|
||||
* **Proxmox vmbr0:** Routing und NAT werden von Proxmox via `vmbr0` automatisch verwaltet — keine manuelle iptables-Regel nötig.
|
||||
* **Kafka-Entscheidung bestätigt:** Bleibt im Build für Phase 3 (Outbox-Pattern / Event-Driven).
|
||||
* **Ghost Services bleiben ON HOLD:** Bewusste Entscheidung — erst Fachexperten-Session (FEI/ÖTO Regelwerk) bevor fachliche Implementierung beginnt.
|
||||
|
||||
---
|
||||
|
||||
## 🔜 Nächste Schritte
|
||||
|
||||
### Heute Abend (Priorität)
|
||||
1. Meldestellen-Host aufsetzen nach Anleitung (siehe Haupt-Session-Log)
|
||||
2. `.env` auf Zora mit Server-IP konfigurieren (`KC_HOSTNAME`, `JWT_ISSUER_URI`)
|
||||
3. Docker-Stack starten (Infra → Backend → Ops)
|
||||
4. Ping-Service + Login verifizieren
|
||||
5. `ai-stack` Proxmox LXC-Container (CT 111) aufsetzen, Ollama + Open WebUI installieren
|
||||
6. Continue.dev in IDEA konfigurieren
|
||||
|
||||
### Nächste Sessions
|
||||
* **Session 2:** Grafana Dashboards einrichten + Pangolin-URLs finalisieren
|
||||
* **Session 3:** Willkommensseite + Design-System (Tokens, Farben, Typografie)
|
||||
* **Session 4:** Fachexperten-Session — FEI/ÖTO Regelwerk, Anforderungen, Rollen definieren
|
||||
* **Session 5:** Admin-Dashboard (Backend) + Rollen-Management in Keycloak
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
---
|
||||
type: Journal
|
||||
status: ACTIVE
|
||||
owner: Curator
|
||||
date: 2026-03-06
|
||||
session: Immich & Pangolin — Konfiguration dokumentiert
|
||||
---
|
||||
|
||||
# Session Log — 2026-03-06: Immich & Pangolin Konfiguration
|
||||
|
||||
## 📋 Kontext
|
||||
|
||||
Ergänzungssession zur Proxmox-Korrektursession vom selben Tag.
|
||||
10 neue Screenshots wurden geliefert, die die vollständige Konfiguration von
|
||||
CT 100 (pangolin-client) und CT 103 (immich) sowie die detaillierten Hardware-Specs
|
||||
von VM 102 (gitea-runner) dokumentieren.
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Änderungen
|
||||
|
||||
### `SSoT_Konfigurations-Masterplan_Zora.md`
|
||||
|
||||
**Neue Daten aus Screenshots (06.03.2026, 13:25–13:27):**
|
||||
|
||||
#### CT 100 — pangolin-client (LXC)
|
||||
- IP ergänzt: `10.0.0.21/24`
|
||||
- Ressourcen dokumentiert: 4 Cores, 512 MiB RAM, 512 MiB Swap, 8 GB Disk
|
||||
- OS: Ubuntu arm64, Unprivileged, nesting=1
|
||||
- Autostart: order=1, up=30
|
||||
|
||||
#### CT 101 — gitea (LXC)
|
||||
- Ressourcen ergänzt: 4 Cores, 1 GiB RAM, 512 MiB Swap, 20 GB Disk
|
||||
- OS: Ubuntu arm64, Unprivileged, nesting=1
|
||||
- Autostart: order=2, up=30
|
||||
|
||||
#### CT 103 — immich (LXC) ← NEU vollständig dokumentiert
|
||||
- IP: `10.0.0.24/24`
|
||||
- Ressourcen: 8 Cores, 10 GiB RAM, 512 MiB Swap
|
||||
- Root Disk: 200 GB (`local:103/vm-103-disk-0.raw`)
|
||||
- Mount Point mp0: `/mnt/immich_gross` → `/mnt/fotos` (externe Foto-Bibliothek)
|
||||
- OS: Ubuntu arm64, Unprivileged
|
||||
- Features: `nesting=1, keyctl=1, fuse=1` (Docker-in-LXC kompatibel)
|
||||
- Autostart: order=3, up=30
|
||||
|
||||
#### VM 102 — gitea-runner (QEMU/KVM) ← Hardware-Details ergänzt
|
||||
- IP: `10.0.0.23/24` (bestätigt)
|
||||
- BIOS: OVMF (UEFI), Machine: virt (ARM64)
|
||||
- CPU: 8 Cores, 1 Socket, host-type, numa=1
|
||||
- RAM: 16 GiB (balloon=0 — kein Dynamic Memory)
|
||||
- Disk: 50 GB SSD (aio=io_uring, iothread=1 — maximale I/O-Performance)
|
||||
- EFI Disk: 64 MB, efitype=4m
|
||||
- Netzwerk: virtio, vmbr0, Firewall aktiv
|
||||
- SCSI: VirtIO SCSI single
|
||||
|
||||
#### Pangolin Tunnel Routing erweitert
|
||||
- Route `photos.mo-code.at` → CT 103 Immich (`10.0.0.24:2283`) ergänzt (intern/VPN)
|
||||
- Pangolin-Kontext-Hinweis: CT 100 (10.0.0.21) ist der Tunnel-Client
|
||||
|
||||
---
|
||||
|
||||
## 📚 Gelernt
|
||||
|
||||
- **Immich Features:** `keyctl=1` und `fuse=1` sind für Docker-in-LXC und Immich-Thumbnail-Verarbeitung notwendig.
|
||||
- **io_uring:** Der Gitea-Runner nutzt modernes async I/O für maximale Build-Performance auf NVMe.
|
||||
- **Start-Reihenfolge:** Pangolin (order=1) → Gitea (order=2) → Immich (order=3) — sinnvolle Abhängigkeitskette.
|
||||
- **balloon=0 beim Runner:** Festes RAM verhindert Memory-Ballooning-Latenzen bei intensiven CI-Builds.
|
||||
|
||||
---
|
||||
|
||||
## 🔜 Nächste Schritte
|
||||
|
||||
1. Pangolin-Route `photos.mo-code.at` im Pangolin-Dashboard anlegen (sobald Immich-Setup abgeschlossen).
|
||||
2. Immich-Setup-Anleitung erstellen (optional, eigene Session).
|
||||
57
docs/99_Journal/2026-03-06_Session_Log_Proxmox_Korrektur.md
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
---
|
||||
type: Journal
|
||||
status: ACTIVE
|
||||
owner: Lead Architect
|
||||
---
|
||||
# Journal - 2026-03-06 (Session 3 — Proxmox-Korrektur)
|
||||
|
||||
## 📝 Zusammenfassung
|
||||
|
||||
Korrektur-Session: Die vorherige Installations-Anleitung für den AI-Stack verwendete fälschlicherweise **Incus** als Container-Technologie und das IP-Subnetz **10.0.6.x**. Die Analyse der Proxmox-Screenshots ergab den korrekten Ist-Stand: Zora läuft auf **Proxmox VE 8.4.10** (`pve.mo-code.at`), alle VMs und Container befinden sich im Subnetz **10.0.0.0/24**. Alle betroffenen Dokumentationsdateien wurden korrigiert.
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Ist-Stand Zora (aus Proxmox-Screenshots)
|
||||
|
||||
| ID | Name | Typ | IP | Specs |
|
||||
|:----|:------------------|:-----|:-------------|:-------------------------------|
|
||||
| 100 | pangolin-client | LXC | — | Pangolin Tunnel |
|
||||
| 101 | gitea | LXC | `10.0.0.22` | Bridge vmbr0, GW 10.0.0.138 |
|
||||
| 102 | gitea-runner | VM | `10.0.0.24` | aarch64, 16 GB RAM, 8 Cores, 50 GB |
|
||||
| 103 | immich | LXC | — | Immich Foto-Server |
|
||||
| 110 | meldestelle-host | VM | `10.0.0.50` | aarch64, 16 GB RAM, 8 Cores, 150 GB |
|
||||
|
||||
* **Proxmox-Node:** `10.0.0.20` / `pve.mo-code.at`
|
||||
* **Netz-Bridge:** `vmbr0`, Subnetz `10.0.0.0/24`, Gateway `10.0.0.138`
|
||||
* **Beide VMs (102, 110):** QEMU KVM, aarch64, UEFI (OVMF), cpu=host, numa=1
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Geänderte Dateien
|
||||
|
||||
| Datei | Änderung |
|
||||
|:------|:---------|
|
||||
| `docs/01_Architecture/Minisforum-MS-R1/AI_Stack_Ollama_Setup.md` | Vollständiger Rewrite: Incus→Proxmox LXC (CT 111), `incus launch`→`pct create`, alle IPs 10.0.6.x→10.0.0.x, Phase 1 auf Proxmox-Node, Incus-NAT-Sektion entfernt |
|
||||
| `docs/99_Journal/2026-03-06_Session_Log_DevOps_und_AI_Stack.md` | AI-Stack-Entscheidung korrigiert: Incus→Proxmox, IPs aktualisiert, iptables→vmbr0 |
|
||||
| `docs/01_Architecture/MASTER_ROADMAP_2026_Q1.md` | Hypervisor: Incus→Proxmox VE 8.4.10 |
|
||||
| `docs/01_Architecture/Minisforum-MS-R1/SSoT_Konfigurations-Masterplan_Zora.md` | Vollständiger Rewrite: Proxmox-Tabelle mit allen VMs/LXCs, IPs korrigiert, Images auf aktuelle Versionen |
|
||||
| `docs/01_Architecture/Minisforum-MS-R1/Zentrales_Mail-Relay-SSoT_Zora.md` | SMTP-Host: 10.0.6.1→10.0.0.20, Incus/Docker→Proxmox vmbr0/Docker |
|
||||
| `docs/07_Infrastructure/Zora_Infrastructure_Deployment_02-2026.md` | Mail-Relay-IP korrigiert, Cloudflare→Pangolin, Port 8080→8081, IP 10.0.6.50→10.0.0.50 |
|
||||
| `docs/01_Architecture/Minisforum-MS-R1/MS-R1_Konfiguration&Bedienung.md` | Firewall-Sektion auf Proxmox aktualisiert, Incus-Sektion als ⚠️ HISTORISCH markiert |
|
||||
|
||||
---
|
||||
|
||||
## 📚 Gelerntes
|
||||
|
||||
* **Incus war Testbetrieb (Feb 2026):** Nach dem Incus-Test wurde auf Proxmox VE umgestellt — alle Docs spiegelten noch den alten Zustand wider.
|
||||
* **Proxmox vmbr0 vereinfacht NAT:** Keine manuellen iptables-MASQUERADE-Regeln nötig — Proxmox erledigt das automatisch.
|
||||
* **Core-Pinning in Proxmox:** Gitea-Runner und Meldestelle-Host sind auf 8 Kerne (4 große + 4 mittlere) gebunden → `cpu=host`, `numa=1` in VM-Config.
|
||||
* **Docs-as-Code Pflicht:** Screenshots als Primärquelle genutzt um den wahren Ist-Stand zu ermitteln — wichtig wenn mündliche Korrekturen noch nicht in Docs eingeflossen sind.
|
||||
|
||||
---
|
||||
|
||||
## 🔜 Nächste Schritte
|
||||
|
||||
1. AI-Stack LXC (CT 111, `10.0.0.60`) in Proxmox erstellen nach `AI_Stack_Ollama_Setup.md`
|
||||
2. Continue.dev Plugin in IDEA konfigurieren
|
||||
3. Grafana Dashboards + Pangolin-URLs finalisieren
|
||||
BIN
docs/ScreenShots/Zora-Config_ 2026-03-06_13-25-37.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
docs/ScreenShots/Zora-Config_ 2026-03-06_13-25-48.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
docs/ScreenShots/Zora-Config_ 2026-03-06_13-26-01.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
docs/ScreenShots/Zora-Config_ 2026-03-06_13-26-23.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
docs/ScreenShots/Zora-Config_ 2026-03-06_13-26-28.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
docs/ScreenShots/Zora-Config_ 2026-03-06_13-26-34.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
docs/ScreenShots/Zora-Config_ 2026-03-06_13-26-46.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
docs/ScreenShots/Zora-Config_ 2026-03-06_13-26-54.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
docs/ScreenShots/Zora-Config_ 2026-03-06_13-27-03.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
docs/ScreenShots/Zora-Config_ 2026-03-06_13-27-12.png
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
docs/ScreenShots/Zora-Config_2026-03-06_13-08-40.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
docs/ScreenShots/Zora-Config_2026-03-06_13-09-07.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
docs/ScreenShots/Zora-Config_2026-03-06_13-09-49.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
docs/ScreenShots/Zora-Config_2026-03-06_13-10-07.png
Normal file
|
After Width: | Height: | Size: 65 KiB |
BIN
docs/ScreenShots/Zora-Config_2026-03-06_13-10-46.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
docs/ScreenShots/Zora-Config_2026-03-06_13-10-57.png
Normal file
|
After Width: | Height: | Size: 70 KiB |