Initial commit: Vollständige Homelab-Dokumentation (Stand 2026-04-15)

- Proxmox Host pve-braetter (Hardware, Storage, Bridges)
- 14x LXC Container (CT 100-303) vollständig dokumentiert
- 8x VMs (103-201) vollständig dokumentiert
- Netzwerk-Übersicht mit komplettem IP-Belegungsplan
- Dienste-Übersicht aller Web-Interfaces, DBs, Monitoring
- PostgreSQL 16 HA Cluster (Patroni/etcd) detailliert
This commit is contained in:
2026-04-15 09:57:15 +02:00
commit c31d596b78
25 changed files with 1157 additions and 0 deletions

35
lxc/CT100-patchmon.md Normal file
View File

@@ -0,0 +1,35 @@
# CT 100 — patchmon
## Systemdaten
| Eigenschaft | Wert |
|-------------|------|
| VMID | 100 |
| Hostname | patchmon |
| IP | 192.168.0.78/24 (DHCP) |
| OS | Debian GNU/Linux 13 (trixie) |
| CPU | 2 vCores |
| RAM | 2048 MB |
| Disk | Container:100/vm-100-disk-0.raw, 4 GB |
| Bridge | vmbr0 |
| Autostart | ja |
| Status | running |
## Dienste
| Dienst | Port | Beschreibung |
|--------|------|-------------|
| nginx | 3000 (extern), 3001 | Webserver / Reverse Proxy für PatchMon |
| patchmon-server | 3001 | PatchMon Backend-Service |
| postgresql@17 | 5432 (lokal) | PostgreSQL 17 Datenbank |
| redis-server | 6379 (lokal) | Redis Cache |
| postfix | 25 (lokal) | Mailversand |
## Zugriff
- **PatchMon UI:** http://192.168.0.78:3000
- **SSH:** `ssh claude@192.168.0.78`
## Beschreibung
PatchMon ist ein selbst entwickeltes Patch-Monitoring-System zur Überwachung von Software-Updates und Sicherheits-Patches im gesamten Netzwerk. Es verwendet PostgreSQL 17 als Datenbank und Redis als Cache.

View File

@@ -0,0 +1,46 @@
# CT 101 — nginxproxymanager
## Systemdaten
| Eigenschaft | Wert |
|-------------|------|
| VMID | 101 |
| Hostname | nginxproxymanager |
| IP | 192.168.0.79/24 (DHCP) |
| OS | Debian GNU/Linux 12 (bookworm) |
| CPU | 2 vCores |
| RAM | 2048 MB |
| Disk | Container:101/vm-101-disk-0.raw, 8 GB |
| Bridge | vmbr0 |
| Autostart | ja |
| Status | running |
## Dienste
| Dienst | Port | Beschreibung |
|--------|------|-------------|
| openresty (nginx) | 80, 443 | Reverse Proxy (HTTP/HTTPS) |
| npm | 3000 | NPM Backend-API |
| npm Admin UI | 81 | Nginx Proxy Manager Weboberfläche |
| postfix | 25 (lokal) | Mailversand |
## Zugriff
- **NPM Admin:** http://192.168.0.79:81
- **SSH:** `ssh claude@192.168.0.79`
## Konfiguration
- Proxy-Hosts: `/data/nginx/proxy_host/`
- SSL-Zertifikate: `/data/custom_ssl/`
- Datenbank: `/data/database.sqlite`
## Konfigurierte Proxy-Hosts (Auszug)
| Domain | Ziel | Conf |
|--------|------|------|
| notes.braetter-int.de | http://192.168.0.92 | 22.conf |
## Beschreibung
Nginx Proxy Manager als zentraler Reverse Proxy für alle extern erreichbaren Dienste. Verwaltet SSL-Zertifikate und HTTP/HTTPS-Weiterleitungen.

32
lxc/CT102-octoprint.md Normal file
View File

@@ -0,0 +1,32 @@
# CT 102 — octoprint
## Systemdaten
| Eigenschaft | Wert |
|-------------|------|
| VMID | 102 |
| Hostname | octoprint |
| IP | 192.168.0.80/24 |
| OS | Debian GNU/Linux 13 (trixie) |
| CPU | 1 vCore |
| RAM | 1024 MB |
| Disk | Container:102/vm-102-disk-0.raw, 4 GB |
| Bridge | vmbr0 |
| Autostart | ja |
| Status | running |
## Dienste
| Dienst | Port | Beschreibung |
|--------|------|-------------|
| octoprint | 5000 | OctoPrint Web-UI |
| postfix | 25 (lokal) | Mailversand |
## Zugriff
- **OctoPrint Web:** http://192.168.0.80:5000
- **SSH:** `ssh claude@192.168.0.80`
## Beschreibung
OctoPrint ist eine webbasierte Oberfläche zur Steuerung und Überwachung von 3D-Druckern. Läuft als eigener Service unter dem octoprint-User.

63
lxc/CT109-notes.md Normal file
View File

@@ -0,0 +1,63 @@
# CT 109 — notes.braetter.local
## Systemdaten
| Eigenschaft | Wert |
|-------------|------|
| VMID | 109 |
| Hostname | notes.braetter.local |
| IP | 192.168.0.92/24 |
| OS | Ubuntu 24.04.4 LTS |
| CPU | 2 vCores |
| RAM | 2048 MB |
| Disk | osdisk:109/vm-109-disk-0.raw, 150 GB |
| Bridge | vmbr0 |
| Autostart | ja |
| Status | running |
## Dienste
| Dienst | Port | Beschreibung |
|--------|------|-------------|
| nginx | 80 | Reverse Proxy zu Gunicorn |
| notesmanager (gunicorn) | 5000 (lokal) | Flask Python App |
| postfix | 25 (lokal) | Mailversand |
## Zugriff
- **Notes Web:** http://notes.braetter-int.de (extern) / http://192.168.0.92 (intern)
- **SSH:** `ssh nicolay@192.168.0.92` (Passwort: N17b011975)
## Anwendung
- **Framework:** Python 3 / Flask
- **WSGI:** Gunicorn (3 Worker)
- **Webserver:** Nginx als Reverse Proxy
- **Pfad:** `/opt/notesmanager/`
- **Systemd:** `notesmanager.service`
### Anwendungs-Struktur
```
/opt/notesmanager/
├── app/
│ ├── __init__.py # Flask App Factory
│ ├── models.py # SQLAlchemy Models
│ ├── routes.py # Routen
│ ├── static/ # CSS, JS
│ └── templates/ # Jinja2 Templates
├── deploy/
│ ├── notesmanager.nginx # Nginx-Config
│ └── notesmanager.service # Systemd-Service
├── requirements.txt
├── run.py
└── gunicorn.conf.py
```
### Datenbank
SQLite — `instance/` Verzeichnis
## Gitea Repository
http://gitea.braetter.local/braetter/noteapp

58
lxc/CT202-logserver.md Normal file
View File

@@ -0,0 +1,58 @@
# CT 202 — logserver
## Systemdaten
| Eigenschaft | Wert |
|-------------|------|
| VMID | 202 |
| Hostname | logserver |
| IP | 192.168.0.241/24 |
| OS | Debian GNU/Linux 13 (trixie) |
| CPU | 2 vCores |
| RAM | 2048 MB |
| Disk | nasstorage:202/vm-202-disk-0.raw, 1000 GB |
| Bridge | vmbr0 |
| Autostart | ja |
| Status | running |
## Dienste
| Dienst | Port | Beschreibung |
|--------|------|-------------|
| rsyslog / syslog | 514 UDP/TCP | Zentrale Log-Sammlung |
| promtail | 9080 | Log-Shipper zu IDS-Monitor/Loki |
| fail2ban | - | Brute-Force-Schutz |
| avahi-daemon | - | mDNS Discovery |
| postfix | - | Mailversand für Alarme |
## Zugriff
- **SSH:** `ssh claude@192.168.0.241`
## Automatisierungs-Skripte (cron.daily)
| Skript | Funktion |
|--------|---------|
| `anomalie_check.sh` | Erkennt Anomalien in Logs, IP-Lookup via ipinfo.io, Alarm-Mail |
| `dienst_watchdog.sh` | Überwacht kritische Dienste, Neustart bei Ausfall |
| `security_audit.sh` | Täglicher Sicherheits-Audit |
| `smarthome_scan.sh` | Scannt SmartHome-Geräte |
| `parse_nmap.sh` | Parst NMAP-Scan-Ergebnisse |
| `mail_fix.py` | Postfix-Reparatur-Skript |
| `trauer_report.py` | Pentest-Report-Generator (www.trauer.de) |
**Pfad:** `/home/claude/scripts/`
## Log-Eingang (rsyslog)
Alle LXC/VMs senden Logs per syslog-Protokoll an Port 514.
## Alarm-Mails
`anomalie_check.sh` sendet bei Auffälligkeiten E-Mails mit:
- Angreifer-IP
- IP-Lookup: Land, Stadt, ASN/Org, Hostname (via ipinfo.io)
- Gescannte Pfade / HTTP-Methoden
- Anzahl der Versuche
- HTTP-Status-Codes
- Bei SSH: Versuchte Benutzernamen

42
lxc/CT207-ids-monitor.md Normal file
View File

@@ -0,0 +1,42 @@
# CT 207 — ids-monitor
## Systemdaten
| Eigenschaft | Wert |
|-------------|------|
| VMID | 207 |
| Hostname | ids-monitor |
| IP | 192.168.0.85/24 |
| OS | Ubuntu 24.04.4 LTS |
| CPU | 2 vCores |
| RAM | 3072 MB |
| Disk | osdisk:207/vm-207-disk-0.raw, 20 GB |
| Bridge | vmbr0 |
| Autostart | ja |
| Status | running |
## Dienste
| Dienst | Port | Beschreibung |
|--------|------|-------------|
| suricata | - | IDS/IPS Netzwerk-Analyse |
| loki | 3100, 9096 | Log-Aggregation |
| grafana-server | 3000 | Dashboards / Visualisierung |
| promtail | 9080, 39471 | Log-Shipper |
| fail2ban | - | Brute-Force-Schutz |
| postfix | 25 (lokal) | Mailversand |
## Zugriff
- **Grafana:** http://192.168.0.85:3000
- **Loki API:** http://192.168.0.85:3100
- **SSH:** `ssh claude@192.168.0.85`
## Beschreibung
Zentrales IDS/SIEM-System:
- **Suricata** analysiert den Netzwerktraffic auf bekannte Angriffsmuster (Signaturen)
- **Loki** sammelt Logs aus dem gesamten Netz (inkl. Logserver via Promtail)
- **Grafana** visualisiert die gesammelten Daten in Dashboards
- **Promtail** shippt lokale Logs an Loki und empfängt Logs vom Logserver (192.168.0.241)

38
lxc/CT208-netbox.md Normal file
View File

@@ -0,0 +1,38 @@
# CT 208 — netbox.braetter.local
## Systemdaten
| Eigenschaft | Wert |
|-------------|------|
| VMID | 208 |
| Hostname | netbox.braetter.local |
| IP | 192.168.0.86/24 |
| OS | Ubuntu 24.04 LTS |
| CPU | 2 vCores |
| RAM | 2048 MB |
| Disk | osdisk:208/vm-208-disk-0.raw, 40 GB |
| Bridge | vmbr0 |
| Autostart | ja |
| Status | stopped |
## Anwendung
- **NetBox Version:** 4.2.6
- **Installation:** Nativ (kein Docker)
- **Funktion:** IPAM (IP Address Management) + DCIM (Data Center Infrastructure Management)
- **Eingerichtet:** 2026-04-09
## Zugriff
- **NetBox Web:** http://192.168.0.86 (wenn gestartet)
- **SSH:** `ssh nicolay@192.168.0.86`
## Starten
```bash
sudo pct start 208
```
## Beschreibung
NetBox dient zur vollständigen Dokumentation der Netzwerk-Infrastruktur: IP-Adressen, VLANs, Geräte, Racks, Kabel und Verbindungen.

38
lxc/CT209-authentik.md Normal file
View File

@@ -0,0 +1,38 @@
# CT 209 — authentik.braetter.local
## Systemdaten
| Eigenschaft | Wert |
|-------------|------|
| VMID | 209 |
| Hostname | authentik.braetter.local |
| IP | 192.168.0.87/24 |
| OS | Ubuntu 24.04 LTS |
| CPU | 2 vCores |
| RAM | 3072 MB |
| Disk | osdisk:209/vm-209-disk-0.raw, 40 GB |
| Bridge | vmbr0 |
| Autostart | ja |
| Status | stopped |
## Anwendung
- **authentik Version:** 2026.2.2
- **Installation:** Docker Compose
- **Funktion:** Single Sign-On (SSO) / Identity Provider (IdP)
- **Eingerichtet:** 2026-04-09
## Zugriff
- **authentik Web:** http://192.168.0.87 (wenn gestartet)
- **SSH:** `ssh nicolay@192.168.0.87`
## Starten
```bash
sudo pct start 209
```
## Beschreibung
authentik ist ein selbst-gehosteter Identity Provider für SSO-Integration in interne Dienste. Unterstützt OIDC, SAML, LDAP und OAuth2.

42
lxc/CT210-wazuh.md Normal file
View File

@@ -0,0 +1,42 @@
# CT 210 — wazuh.braetter.local
## Systemdaten
| Eigenschaft | Wert |
|-------------|------|
| VMID | 210 |
| Hostname | wazuh.braetter.local |
| IP | 192.168.0.88/24 |
| OS | Ubuntu 24.04 LTS |
| CPU | 4 vCores |
| RAM | 6144 MB |
| Disk | osdisk:210/vm-210-disk-0.raw, 80 GB |
| Bridge | vmbr0 |
| Autostart | ja |
| Status | stopped |
## Anwendung
- **Wazuh Version:** 4.12.0
- **Installation:** Docker Compose
- **Funktion:** SIEM, HIDS, Log-Analyse, Compliance
- **Eingerichtet:** 2026-04-09
## Zugriff
- **Wazuh Dashboard:** https://192.168.0.88 (wenn gestartet)
- **SSH:** `ssh nicolay@192.168.0.88`
## Wazuh Agents
Folgende Systeme senden Daten an Wazuh:
- vaultwarden (192.168.0.90) — wazuh-agent.service
- workfs (192.168.0.91) — wazuh-agent.service
- outline (192.168.0.240) — wazuh-agent.service
- ovpn-gw (192.168.0.175) — wazuh-agent.service
## Starten
```bash
sudo pct start 210
```

41
lxc/CT211-aqualog.md Normal file
View File

@@ -0,0 +1,41 @@
# CT 211 — aqualog.braetter.local
## Systemdaten
| Eigenschaft | Wert |
|-------------|------|
| VMID | 211 |
| Hostname | aqualog.braetter.local |
| IP | 192.168.0.246/24 |
| OS | Ubuntu 24.04.4 LTS |
| CPU | 4 vCores |
| RAM | 8192 MB |
| Disk | osdisk:211/vm-211-disk-0.raw, 150 GB |
| Bridge | vmbr0 |
| Autostart | nein |
| Status | running |
## Dienste
| Dienst | Port | Beschreibung |
|--------|------|-------------|
| nginx | 80 | Webserver / Reverse Proxy |
| aquarium-api (node) | 3001 (lokal) | Node.js/Express Backend |
| postfix | 25 (lokal) | Mailversand |
## Zugriff
- **Aquarium Logbuch:** http://192.168.0.246
- **SSH:** `ssh nicolay@192.168.0.246`
## Anwendung
- **Frontend:** React 18 + Vite
- **Backend:** Node.js / Express
- **Webserver:** Nginx (Port 80, dient React-Build + Proxy zu API)
- **App-Pfad:** `/var/www/aquarium/` (Frontend-Build), Backend als Systemd-Service
- **Systemd:** `aquarium-api.service`
## Gitea Repository
http://gitea.braetter.local/braetter/aqualog

View File

@@ -0,0 +1,150 @@
# CT 300302 — PostgreSQL 16 HA Cluster + CT 303 pgAdmin
## Cluster-Übersicht
| VMID | Hostname | IP | Rolle | Status |
|------|----------|----|-------|--------|
| 300 | sql1 | 192.168.0.220 | Leader (Primary) | running |
| 301 | sql2 | 192.168.0.221 | Replica (Streaming) | running |
| 302 | sql3 | 192.168.0.222 | Replica (Streaming) | running |
| 303 | pgadmin | 192.168.0.223 | pgAdmin4 Web | running |
---
## CT 300 — sql1 (Leader)
| Eigenschaft | Wert |
|-------------|------|
| VMID | 300 |
| IP | 192.168.0.220/24 |
| OS | Ubuntu 24.04 LTS |
| CPU | 2 vCores |
| RAM | 2048 MB |
| Disk | osdisk:300/vm-300-disk-0.raw, 20 GB |
| Autostart | nein |
## CT 301 — sql2 (Replica)
| Eigenschaft | Wert |
|-------------|------|
| VMID | 301 |
| IP | 192.168.0.221/24 |
| OS | Ubuntu 24.04 LTS |
| CPU | 2 vCores |
| RAM | 2048 MB |
| Disk | osdisk:301/vm-301-disk-0.raw, 20 GB |
| Autostart | nein |
## CT 302 — sql3 (Replica)
| Eigenschaft | Wert |
|-------------|------|
| VMID | 302 |
| IP | 192.168.0.222/24 |
| OS | Ubuntu 24.04 LTS |
| CPU | 2 vCores |
| RAM | 2048 MB |
| Disk | osdisk:302/vm-302-disk-0.raw, 20 GB |
| Autostart | nein |
---
## Dienste (alle DB-Nodes)
| Dienst | Port | Beschreibung |
|--------|------|-------------|
| postgresql 16 | 5432 | Datenbank |
| patroni | 8008 | HA-Manager REST API |
| etcd | 2379 (client), 2380 (peer) | Distributed Key-Value Store (DCS) |
| apache2 | 80 | Nur sql1: pgAdmin4 Webserver |
## Patroni Konfiguration
- **Scope:** pg-cluster
- **Namespace:** /db/
- **Datenverzeichnis:** `/var/lib/postgresql/16/patroni`
- **Config:** `/etc/patroni/patroni.yml`
- **Systemd:** `patroni.service`
## etcd Konfiguration
- **Cluster-Token:** pg-etcd-cluster
- **Config:** `/etc/default/etcd`
- **Datenverzeichnis:** `/var/lib/etcd/default`
## Datenbanken & Benutzer
| Datenbank | Eigentümer |
|-----------|-----------|
| nicolay | nicolay |
| testdb | nicolay |
| postgres | postgres |
| Benutzer | Passwort | Rechte |
|----------|----------|--------|
| nicolay | N17b011975 | Login |
| postgres | postgres_pass | Superuser |
| replicator | replicator_pass | Replikation |
| admin | admin | createdb, createrole |
## Zugriff
```bash
# PostgreSQL (immer Leader)
psql -h 192.168.0.220 -U nicolay -d nicolay
# Cluster-Status
pct exec 300 -- /usr/local/bin/patronictl -c /etc/patroni/patroni.yml list
# Patroni REST API
curl http://192.168.0.220:8008/leader
curl http://192.168.0.221:8008/replica
# etcd
etcdctl --endpoints=http://192.168.0.220:2379 endpoint health
```
## Manueller Failover
```bash
pct exec 300 -- /usr/local/bin/patronictl -c /etc/patroni/patroni.yml failover pg-cluster
```
## Verhalten bei Ausfall
| Szenario | Verhalten |
|----------|-----------|
| sql1 fällt aus | Patroni wählt sql2 oder sql3 als neuen Leader (3060s) |
| sql2 oder sql3 fällt aus | Kein Ausfall, Leader läuft weiter |
| 2 Nodes fallen aus | Kein Quorum → Cluster read-only |
---
## CT 303 — pgadmin
| Eigenschaft | Wert |
|-------------|------|
| VMID | 303 |
| Hostname | pgadmin |
| IP | 192.168.0.223/24 |
| OS | Ubuntu 24.04 LTS |
| CPU | 2 vCores |
| RAM | 1024 MB |
| Disk | osdisk:303/vm-303-disk-0.raw, 10 GB |
| Autostart | nein |
### pgAdmin4 Zugriff
- **URL:** http://192.168.0.223/pgadmin4/
- **Login:** nicolay.braetter@googlemail.com / N17b011975
- **Vorkonfigurierte Server:** sql1, sql2, sql3 (alle als "pg-cluster" Gruppe)
### Hinweis Redundanz
pgAdmin läuft auf einem **separaten** LXC, unabhängig von den Datenbank-Nodes. Bei Ausfall von sql1 bleibt pgAdmin erreichbar. Die Server-Verbindungen in pgAdmin zeigen direkt auf die jeweiligen Node-IPs.
## Install-Script
Vollständiges Installations-Script für den kompletten Cluster:
`/home/claude/postgres-ha-install.sh` auf pve-braetter
Gitea: (kein separates Repo — im aqualog-Repo enthalten)

18
lxc/README.md Normal file
View File

@@ -0,0 +1,18 @@
# LXC Container
| VMID | Hostname | IP | OS | Status | Doku |
|------|----------|----|-----|--------|------|
| 100 | patchmon | 192.168.0.78 | Debian 13 | running | [CT100-patchmon.md](CT100-patchmon.md) |
| 101 | nginxproxymanager | 192.168.0.79 | Debian 12 | running | [CT101-nginxproxymanager.md](CT101-nginxproxymanager.md) |
| 102 | octoprint | 192.168.0.80 | Debian 13 | running | [CT102-octoprint.md](CT102-octoprint.md) |
| 109 | notes.braetter.local | 192.168.0.92 | Ubuntu 24.04 | running | [CT109-notes.md](CT109-notes.md) |
| 202 | logserver | 192.168.0.241 | Debian 13 | running | [CT202-logserver.md](CT202-logserver.md) |
| 207 | ids-monitor | 192.168.0.85 | Ubuntu 24.04 | running | [CT207-ids-monitor.md](CT207-ids-monitor.md) |
| 208 | netbox.braetter.local | 192.168.0.86 | Ubuntu 24.04 | stopped | [CT208-netbox.md](CT208-netbox.md) |
| 209 | authentik.braetter.local | 192.168.0.87 | Ubuntu 24.04 | stopped | [CT209-authentik.md](CT209-authentik.md) |
| 210 | wazuh.braetter.local | 192.168.0.88 | Ubuntu 24.04 | stopped | [CT210-wazuh.md](CT210-wazuh.md) |
| 211 | aqualog.braetter.local | 192.168.0.246 | Ubuntu 24.04 | running | [CT211-aqualog.md](CT211-aqualog.md) |
| 300 | sql1 | 192.168.0.220 | Ubuntu 24.04 | running | [CT300-303-postgresql-ha.md](CT300-303-postgresql-ha.md) |
| 301 | sql2 | 192.168.0.221 | Ubuntu 24.04 | running | [CT300-303-postgresql-ha.md](CT300-303-postgresql-ha.md) |
| 302 | sql3 | 192.168.0.222 | Ubuntu 24.04 | running | [CT300-303-postgresql-ha.md](CT300-303-postgresql-ha.md) |
| 303 | pgadmin | 192.168.0.223 | Ubuntu 24.04 | running | [CT300-303-postgresql-ha.md](CT300-303-postgresql-ha.md) |