# [Anleitung] PatchMon (Zentrales Server- & Update-Monitoring) via Docker Compose einrichten
Hallo zusammen,
wer mehrere Linux-Server, LXC-Container oder Docker-Hosts betreibt und den Überblick über ausstehende Sicherheitsupdates, Kernel-Patches und den Systemstatus behalten möchte, findet in **PatchMon** eine extrem schlanke und moderne Open-Source-Lösung. Das Tool sammelt die Update-Stände eurer Systeme zentral und bereitet sie übersichtlich in einem Dashboard auf.
Hier ist das fertige Docker Compose Setup für euren eigenen PatchMon-Server – komplett anonymisiert und sicher für den produktiven Einsatz.
### ⚠️ Wichtige Vorbereitung vor dem Kopieren:
Achtet darauf, dass ihr für eure Live-Instanz die geheimen Schlüssel (
JWT_SECRET und
ENCRYPTION_KEY) durch lange, zufällige Zeichenketten ersetzt. Im Verbindungsstring der Datenbank (
DATABASE_URL) muss das Sonderzeichen
? im Passwort URL-kodiert werden (aus
? wird
%3F), damit PostgreSQL die Verbindung fehlerfrei herstellt.
---
### Der Docker Compose Stack
yaml
version: '3.8'
services:
# 1. Die Datenbank (PostgreSQL 17)
patchmon-db:
image: postgres:17-alpine
container_name: v2-patchmon-db
restart: unless-stopped
environment:
POSTGRES_DB: patchmon
POSTGRES_USER: patchmon_user
POSTGRES_PASSWORD: DEIN_SICHERES_DATENBANK_PASSWORT # <--- ANPASSEN!
volumes:
- v2_patchmon_db_data:/var/lib/postgresql/data
networks:
- default
# 2. Der Job-Queue-Speicher (Redis 7)
patchmon-redis:
image: redis:7-alpine
container_name: v2-patchmon-redis
restart: unless-stopped
volumes:
- v2_patchmon_redis_data:/data
networks:
- default
# 3. Der PatchMon Hauptserver (Dashboard & API)
patchmon-server:
image: ghcr.io/patchmon/patchmon-server:latest
container_name: v2-patchmon-server
restart: unless-stopped
depends_on:
- patchmon-db
- patchmon-redis
networks:
default:
lan_network:
ipv4_address: DEINE_FREIE_CONTAINER_IP # <--- FREIE IP AUS EUREM NETZWERK EINTRAGEN!
environment:
# WICHTIG: Das Passwort muss hier identisch zu oben sein. Das "?" am Ende MUSS als "%3F" kodiert werden!
- DATABASE_URL=postgresql://patchmon_user<img class='smiley' style='width:20px;height:20px;' src='../../images/smiley/grin.svg' alt='Grinsen'>EIN_SICHERES_DATENBANK_PASSWORT%3F@patchmon-db:5432/patchmon?sslmode=disable
- REDIS_URL=redis://v2-patchmon-redis:6379/0
- REDIS_HOST=v2-patchmon-redis
- REDIS_PORT=6379
# Zwingt den Web-Server, auf die korrekte URL / IP-Adresse zu lauschen
- APP_URL=https://deine-domain.de # <--- EURE SPÄTERE HTTPs-DOMAIN!
- CORS_ORIGIN=https://deine-domain.de
# Schalter für die Ersteinrichtung: Öffnet die Webregistrierung für das erste Admin-Konto
# TIPP: Nach dem Erstellen des ersten Admins im Live-Betrieb auf "true" setzen!
- REGISTRATION_DISABLED=false
# Generiert hier zwei völlig unterschiedliche, lange Zufallsketten für die Absicherung!
- JWT_SECRET=HIER_EINEN_LANGEN_ZUFÄLLIGEN_STRING_EINTRAGEN
- ENCRYPTION_KEY=HIER_EINEN_ZWEITEN_LANGEN_ZUFÄLLIGEN_STRING_EINTRAGEN
volumes:
v2_patchmon_db_data:
v2_patchmon_redis_data:
networks:
lan_network:
name: NAME_EURES_EXISTIERENDEN_NETZWERKS # <--- NAME EURES EXISTIERENDEN EXTERNEN NETZWERKS!
external: true
---
### 🌐 Einrichtung im Nginx Proxy Manager (NPM)
Um das PatchMon-Dashboard sicher zu erreichen und die Update-Meldungen eurer externen Server verschlüsselt zu empfangen, legt ihr im NPM einen neuen **Proxy Host** an:
1. **Domain Names:**
patchmon.deine-domain.de
2. **Scheme:**
http
3. **Forward Hostname / IP:**
DEINE_FREIE_CONTAINER_IP *(Die oben vergebene IP des PatchMon-Containers)*
4. **Forward Port:**
3000 *(Standard-Port des PatchMon-Servers)*
5. **Websockets Support:** 🟩 **Häkchen setzen / Aktivieren!** *(Wichtig für Live-Status-Updates im Dashboard).*
6. **SSL:** Ein neues Let's Encrypt Zertifikat anfordern und *Force SSL* aktivieren.