Caddy Reverse Proxy, Docker-Compose, Systemd-Configs & Infrastructure-as-Code
- Mermaid 100%
| caddy | ||
| portainer | ||
| diagram.mmd | ||
| NETWORK.md | ||
| network.png | ||
| README.md | ||
Infrastructure
Infrastructure-as-Code für das ki-tools.business-Netzwerk.
Repo-Struktur
infrastructure/
├── README.md # Diese Datei – Übersicht
├── NETWORK.md # Netzwerk-Topologie mit Mermaid-Diagramm
├── diagram.mmd # Mermaid-Quellcode
├── network.png # Exportiertes Topologie-Diagramm
├── caddy/
│ └── Caddyfile # Live-Reverse-Proxy-Config (alle Domains)
├── portainer/
│ └── README.md # Portainer-Stacks und Docker-Setup
├── docker-compose/ # (geplant)
├── systemd/ # (geplant)
└── scripts/ # (geplant)
Host-Übersicht
| Host | IP | Rolle(n) | SSH | Zugang Web |
|---|---|---|---|---|
| caddy-gate | 10.200.200.1 |
Caddy Reverse Proxy – SSL-Terminierung für 8 Domains | ✅ | – |
| spark1 | 192.168.99.36 |
GPU-Node – vLLM (JL-Spark / JL-Spark-2), 48GB VRAM | ✅ | – |
| spark2 | 192.168.99.74 |
GPU-Node – vLLM (Cluster mit spark1), 48GB VRAM | ✅ | – |
| nofx | 192.168.99.75 |
KlawTrade Dashboard, jltrade API (:8080), NATS, Postgres | ✅ | nofx.ki-tools.business |
| ac-host | 192.168.99.76 |
Guacamole, Hermes-SaaS-Portal, ttyd, MCP-SearXNG (Node), socat-Proxys | ✅ | ac.ki-tools.business / portal.ki-tools.business |
| main-host | 192.168.99.65 |
Portainer CE, Forgejo (Git), OpenCloud, Nextcloud Office | – | portainer/git/files/office.ki-tools.business |
| searxng | 192.168.99.8 |
SearXNG Private Search Engine | – | suche.ki-tools.business |
| smb-vision | 192.168.99.45 |
SMB-Share (Agent Hermes), Vision-Modell (LM Studio) | – | SMB / HTTP :1234 |
SSH-Zugriff nur intern aus 192.168.99.0/24.
Caddy-Gate (10.200.200.1) ist reiner Reverse Proxy.
SSH-Passwörter stehen auf dem SMB-Share (/mnt/agent-hermes/docs/infrastructure/credentials.md), nicht im Repo.
Domain-Map
| Domain | Ziel-IP | Port | Dienst |
|---|---|---|---|
portainer.ki-tools.business |
192.168.99.65 |
9443 | Portainer CE |
git.ki-tools.business |
192.168.99.65 |
3000 | Forgejo |
files.ki-tools.business |
192.168.99.65 |
9200 | OpenCloud |
office.ki-tools.business |
192.168.99.65 |
9900 | Nextcloud Office |
suche.ki-tools.business |
192.168.99.8 |
8080 | SearXNG |
ac.ki-tools.business |
192.168.99.76 |
8080 | Guacamole (RDP/SSH) |
portal.ki-tools.business |
192.168.99.76 |
8000 | Hermes-SaaS-Portal |
nofx.ki-tools.business |
192.168.99.75 |
8080 | KlawTrade / jltrade-Dashboard |
LLM-API-Endpoints
| Endpoint | Model | Host | Port |
|---|---|---|---|
spark1:8888/v1 |
JL-Spark (Text) | 192.168.99.36 | 8888 |
spark1:8888/v1 |
JL-Spark-2 (Text, 512K) | 192.168.99.36 | 8888 |
192.168.99.45:1234/v1 |
Vision-Modell | 192.168.99.45 | 1234 |
Subnetze
| Netz | Zweck |
|---|---|
192.168.99.0/24 |
Interne Dienste – inkl. SSH |
10.200.200.0/24 |
Caddy-Gate (DMZ / WAN) |
172.19.0.0/16 |
Docker-Bridge kollegen-net (ac-host) |
192.168.177.0/24 |
RoCE Rail 1 (GPU-Cluster) |
192.168.178.0/24 |
RoCE Rail 2 (GPU-Cluster) |
Caddy-Management
Immer zuerst ein Backup erstellen, vor jeder Änderung:
cp /etc/caddy/Caddyfile /etc/caddy/Caddyfile.$(date +%Y%m%d_%H%M%S).bak
Dann editieren, validieren, laden:
caddy fmt --overwrite /etc/caddy/Caddyfile
caddy validate --config /etc/caddy/Caddyfile
systemctl reload caddy
# oder
caddy reload --config /etc/caddy/Caddyfile
Logs:
journalctl -u caddy -n 30 --no-pager
Portal-Management (ac-host)
Das Hermes-SaaS-Portal auf 192.168.99.76 (ac-host):
# Portal: portal.ki-tools.business (Admin: admin / ki-tools-2026)
ssh root@192.168.99.76
# Service
systemctl status hermes-saas
journalctl -u hermes-saas -n 50 --no-pager
# Binary + Templates
ls -la /opt/hermes-saas/
# DB: /root/.hermes-saas/portal.db
# SQLite DB-Check
sqlite3 /root/.hermes-saas/portal.db "SELECT id, username, role, last_login FROM users;"
sqlite3 /root/.hermes-saas/portal.db "SELECT id, user_id, docker_name, port, status FROM containers;"
Neuer Einladungstoken (von außen per Admin-Seite) oder manuell:
python3 -c "import uuid; print(uuid.uuid4())" | xargs -I TOKEN \
sqlite3 /root/.hermes-saas/portal.db \
"INSERT INTO invite_tokens (token, created_by, max_uses, use_count, active) VALUES ('TOKEN', 1, 1, 0, 1);"
Admin-Passwort zurücksetzen (Python mit bcrypt):
python3 -c "import bcrypt, sys; sys.stdout.write(bcrypt.hashpw(b'ki-tools-2026', bcrypt.gensalt()).decode())" | \
xargs -I HASH sqlite3 /root/.hermes-saas/portal.db \
"UPDATE users SET password = 'HASH' WHERE username = 'admin';"
Siehe NETWORK.md für das Topologie-Diagramm.