1. Was ist Proxmox?
  2. Warum der Wechsel zu Proxmox?
  3. Container-Dienste auf dem neuen Proxmox Server
  4. Fazit
  5. Bereitgestellte Stacks und Konfigurationen für X86-64 Architektur (64 bit)
  6. AdGuardHome
  7. Watchtower
  8. WireGuard
  9. BOINC
  10. Caddy
  11. Prometheus-Grafana
  12. Uptime Kuma
  13. Vaultwarden
  14. Nextcloud
  15. Nextcloud config.php
  16. Traccar
  17. Fazit

Ich habe kürzlich meinen Setup von einem Raspberry Pi auf einen Proxmox Ubuntu Server migriert. Dieser Wechsel ermöglicht es mir, meine Container effizienter zu verwalten und von der höheren Rechenleistung des Servers zu profitieren. Hier ist eine detaillierte Beschreibung meiner neuen Docker-Stacks auf dem Proxmox Ubuntu Server sowie eine Erklärung, warum Proxmox eine exzellente Wahl für diese Migration war.

Was ist Proxmox?

Proxmox ist eine Open-Source-Virtualisierungsplattform, die auf Debian Linux basiert. Sie bietet umfassende Funktionen zur Verwaltung von virtuellen Maschinen (VMs) und Containern. Proxmox unterstützt sowohl KVM (Kernel-based Virtual Machine) als auch LXC (Linux Containers), was eine flexible und leistungsstarke Umgebung für die Ausführung von verschiedenen Workloads ermöglicht. Hier sind einige der Hauptmerkmale von Proxmox:

  1. Virtuelle Maschinen und Container: Proxmox erlaubt es, sowohl VMs als auch Container auf demselben Host zu betreiben. Dies bietet die Flexibilität, verschiedene Anwendungsszenarien abzudecken, von leichten Containern bis hin zu vollständigen Betriebssystem-VMs.
  2. Einfache Verwaltung: Mit einem benutzerfreundlichen Web-Interface können Benutzer alle Aspekte ihrer virtuellen Infrastruktur verwalten. Dies umfasst die Erstellung, Verwaltung und Überwachung von VMs und Containern, Netzwerk- und Speicherverwaltung sowie Backup und Wiederherstellung.
  3. Zuverlässigkeit und Redundanz: Proxmox bietet eingebaute Funktionen für Hochverfügbarkeit (High Availability, HA), was sicherstellt, dass VMs und Container auch bei einem Hardware-Ausfall verfügbar bleiben. Zudem unterstützt es die Erstellung von Snapshots und Backups, um Datenverluste zu verhindern.
  4. Skalierbarkeit: Proxmox ist für den Einsatz in kleinen Heimnetzwerken ebenso geeignet wie in großen Rechenzentren. Es skaliert gut mit der Hardware und kann mehrere Hosts in einem Cluster verwalten, was eine zentrale Verwaltung und eine einfache Erweiterung der Infrastruktur ermöglicht.
  5. Kostenlos und Open Source: Proxmox VE (Virtual Environment) ist kostenlos verfügbar und unter der GNU AGPL, v3 lizenziert. Dies macht es zu einer attraktiven Option für viele Anwender, die eine kosteneffiziente Virtualisierungsplattform suchen.

Warum der Wechsel zu Proxmox?

Der Umstieg von einem Raspberry Pi zu einem Proxmox Ubuntu Server auf einem leistungsstarken Minis Forum PC mit i7, 32 GB RAM und 1 TB Festplatte brachte viele Vorteile mit sich:

  1. Leistungssteigerung: Der Minis Forum PC bietet im Vergleich zum Raspberry Pi eine deutlich höhere Rechenleistung, mehr Arbeitsspeicher und eine größere Speicherkapazität. Dies ermöglicht das gleichzeitige Ausführen mehrerer ressourcenintensiver Container und VMs ohne Leistungseinbußen.
  2. Effiziente Verwaltung: Proxmox bietet eine zentrale und benutzerfreundliche Oberfläche, die die Verwaltung von Containern und VMs vereinfacht. Dies spart Zeit und reduziert den Administrationsaufwand.
  3. Erweiterte Funktionen: Funktionen wie Snapshots, Backups und Hochverfügbarkeit bieten zusätzliche Sicherheit und Zuverlässigkeit, die auf einem Raspberry Pi nur schwer oder gar nicht umzusetzen wären.
  4. Flexibilität: Mit Proxmox kann ich nicht nur Docker-Container effizient verwalten, sondern auch andere Virtualisierungs- und Containerisierungstechnologien nutzen. Dies eröffnet neue Möglichkeiten für die Optimierung und Erweiterung meiner Infrastruktur.

Container-Dienste auf dem neuen Proxmox Server

Mein neuer Proxmox Ubuntu Server hostet eine Vielzahl von Container-Diensten, die zuvor auf dem Raspberry Pi liefen. Diese umfassen:

  • Adguard Home: Ein leistungsfähiger Werbeblocker und DNS-Server, der für eine saubere und sichere Internetverbindung sorgt.
  • Watchtower: Ein automatisches Update-Tool für Docker-Container, das die Aktualität und Sicherheit der Dienste gewährleistet.
  • WireGuard: Ein modernes VPN, das für eine sichere und schnelle Verbindung sorgt.
  • Boinc: Ein Client für verteiltes Rechnen, der bei wissenschaftlichen Projekten unterstützt.
  • Caddy: Ein Webserver mit automatischer HTTPS-Unterstützung, der als Reverse Proxy dient.
  • Prometheus-Grafana: Ein Monitoring- und Visualisierungstool, das umfassende Einblicke in die Systemleistung bietet.
  • Uptime Kuma: Ein Tool zur Überwachung der Verfügbarkeit von Diensten.
  • Vaultwarden: Ein selbst gehosteter Passwort-Manager, der für sichere Speicherung und Verwaltung von Passwörtern sorgt.
  • Nextcloud: Eine Plattform für File-Sharing und Collaboration, die als private Cloud dient.
  • Traccar: Eine Anwendung zur GPS-Tracking und Flottenmanagement.

Fazit

Die Migration vom Raspberry Pi auf den Proxmox Ubuntu Server war ein erfolgreicher Schritt, der zahlreiche Vorteile mit sich brachte. Die gesteigerte Leistung, verbesserte Ressourcennutzung, vereinfachte Verwaltung und erhöhte Sicherheit haben die Effizienz und Zuverlässigkeit meines Setups deutlich verbessert. Proxmox hat sich als leistungsfähige und flexible Plattform erwiesen, die den Anforderungen meiner Container-Dienste bestens gerecht wird.

Bereitgestellte Stacks und Konfigurationen für X86-64 Architektur (64 bit)

AdGuardHome

version: '3'

services:
  adguardhome:
    image: adguard/adguardhome:latest
    container_name: adguardhome
    ports:
      - "53:53/tcp"     # DNS
      - "53:53/udp"     # DNS
      - "8080:80/tcp"   # Web-UI (auf Port 8080 des Hosts)
      - "3000:3000/tcp" # Für Erstkonfiguration benötigt
    volumes:
      - /etc/adguardhome/work:/opt/adguardhome/work
      - /etc/adguardhome/conf:/opt/adguardhome/conf
    restart: always
    deploy:
      labels:
        - com.docker.security.seccomp.profile=default

volumes:
  adguard_work:
  adguard_conf:

Update: 29.07.2024 – optimierter Watchtower-Stack

  1. String-Quotes bei Umgebungsvariablen:
    • Vorteil: Das Angeben von Anführungszeichen (") um Zahlen und E-Mail-Adressen stellt sicher, dass sie korrekt als Strings und nicht als numerische Werte oder andere Typen interpretiert werden. Dies kann Fehler vermeiden, insbesondere wenn die YAML-Datei von unterschiedlichen Parsern verarbeitet wird.
  2. Labels für Security-Profile:
    • Neu: labels: - com.docker.security.seccomp.profile=default
    • Vorteil: Das Hinzufügen eines Security-Labels sorgt dafür, dass der Container mit einem standardisierten Sicherheitsprofil (seccomp) läuft. Dies bietet eine zusätzliche Sicherheitsebene, indem es bestimmte unsichere Systemaufrufe innerhalb des Containers blockiert.
  3. Ressourcenlimits:
    • Neu: deploy: resources: limits: cpus: '0.50' memory: 512M
    • Vorteil: Durch das Setzen von Ressourcenlimits (CPU und Speicher) wird verhindert, dass der Watchtower-Container zu viele Systemressourcen verbraucht. Dies hilft dabei, die Stabilität des Systems zu erhalten und sicherzustellen, dass andere Container genügend Ressourcen zur Verfügung haben.

Watchtower

version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      WATCHTOWER_MONITOR_ONLY: 'false'
      WATCHTOWER_CLEANUP: "true"
      WATCHTOWER_POLL_INTERVAL: 43200
      WATCHTOWER_NOTIFICATIONS: email
      WATCHTOWER_NOTIFICATION_EMAIL_FROM: "your-email-from@example.com"
      WATCHTOWER_NOTIFICATION_EMAIL_TO: "your-email-to@example.com"
      WATCHTOWER_NOTIFICATION_EMAIL_SERVER: "your-email-server.example.com"
      WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER: "your-email-user@example.com"
      WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD: "your-email-password"
      WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT: "587"
      WATCHTOWER_NOTIFICATION_EMAIL_DELAY: 2
    restart: unless-stopped
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 512M
      labels:
        - com.docker.security.seccomp.profile=default

Hinweis für die Leser: Bitte ersetzen Sie die Platzhalter in den Umgebungsvariablen durch Ihre eigenen Werte:

  • your-email-from@example.com – Die E-Mail-Adresse, von der Benachrichtigungen gesendet werden sollen.
  • your-email-to@example.com – Die E-Mail-Adresse, an die Benachrichtigungen gesendet werden sollen.
  • your-email-server.example.com – Der SMTP-Server für den E-Mail-Versand.
  • your-email-user@example.com – Der Benutzername für den SMTP-Server.
  • your-email-password – Das Passwort für den SMTP-Server.
  • 587 – Der Port des SMTP-Servers (lassen Sie diesen Wert unverändert, es sei denn, Ihr Server verwendet einen anderen Port).

Mögliche Auswirkungen: durch den Einsatz des Standard-Seccomp-Profils

  • Kompatibilität: Die meisten Standard-Containeranwendungen funktionieren problemlos mit dem Standard-Seccomp-Profil. Dennoch gibt es spezialisierte Anwendungen, die möglicherweise spezielle Systemaufrufe benötigen, die durch das Standard-Seccomp-Profil blockiert werden. In solchen Fällen müssen Sie das Profil möglicherweise anpassen oder ein anderes Sicherheitsprofil verwenden.
  • Leistung: Das Seccomp-Profil selbst hat in der Regel keine signifikanten Auswirkungen auf die Leistung. Es handelt sich um eine Sicherheitsmaßnahme, die auf Systemaufrufe wirkt, nicht auf die allgemeine Arbeitslast oder den Ressourcenverbrauch des Containers.

Zusammenfassung: Das Label com.docker.security.seccomp.profile=default kann sicher auf die meisten Ihrer Container-Stacks angewendet werden, um deren Sicherheit zu erhöhen. Es wird empfohlen, dies zu tun, es sei denn, es gibt spezifische Gründe oder Kompatibilitätsprobleme, die dagegen sprechen. Testen Sie die Anwendung Ihrer Stacks nach der Implementierung des Labels, um sicherzustellen, dass alle Funktionen wie erwartet arbeiten.

WireGuard

version: '3'

services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy:latest
    container_name: wg-easy
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    volumes:
      - /etc/wireguard:/etc/wireguard
    environment:
      - WG_HOST=your.domain.example.com
      - PASSWORD=your_secure_password
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv4.ip_forward=1
    restart: unless-stopped
    deploy:
      labels:
        - com.docker.security.seccomp.profile=default

Hinweis für die Leser: Bitte ersetzen Sie die Platzhalter in den Umgebungsvariablen durch Ihre eigenen Werte:

  • your-.domain.example.com – Der Hostname oder die IP-Adresse des WireGuard-Servers.
  • your_secure_password – Das Passwort zur Authentifizierung.

BOINC

version: '3.8'

services:
  boinc:
    image: boinc/client:latest  # Anpassung auf das X86-64 Image
    container_name: boinc
    restart: unless-stopped
    volumes:
      - ./boinc_data:/var/lib/boinc-client
    environment:
      - BOINC_CMD_LINE_OPTIONS=--allow_remote_gui_rpc
      - BOINC_GUI_RPC_PASSWORD=ERSETZE_MICH_MIT_DEINEM_PASSWORT
      - BOINC_REMOTE_HOST="0.0.0.0"
    ports:
      - "31416:31416"
    deploy:
      labels:
        - com.docker.security.seccomp.profile=default

Hinweis für die Leser: Bitte ersetzen Sie die Platzhalter in den Umgebungsvariablen durch Ihre eigenen Werte:

  • ERSETZE_MICH_MIT_DEINEM_PASSWORT – Das Passwort zur Authentifizierung.

Caddy

version: '3.7'

services:
  caddy:
    image: caddy:latest
    container_name: caddy
    volumes:
      - /etc/caddy/caddy-data:/data
      - /etc/caddy/caddy-config:/config
      - /etc/caddy/Caddyfile:/etc/caddy/Caddyfile
    ports:
      - "80:80"
      - "443:443"
    networks:
      - caddy-reverse-proxy_proxy
    restart: unless-stopped
    deploy:
      labels:
        - com.docker.security.seccomp.profile=default

networks:
  caddy-reverse-proxy_proxy:
    external: true

Prometheus-Grafana

version: '3.8'

services:
  prometheus:
    image: bitnami/prometheus:latest
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    networks:
      - monitoring
    restart: unless-stopped
    deploy:
      labels:
        - com.docker.security.seccomp.profile=default

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_USER="your-admin-user"
      - GF_SECURITY_ADMIN_PASSWORD="your-admin-password"
    volumes:
      - /etc/grafana/grafana.ini:/etc/grafana/grafana.ini
      - /etc/grafana/grafana-storage:/var/lib/grafana
      - /etc/grafana/grafana.key:/etc/grafana/grafana.key
      - /etc/grafana/grafana.crt:/etc/grafana/grafana.crt
    networks:
      - monitoring
    depends_on:
      - prometheus
    restart: unless-stopped
    deploy:
      labels:
        - com.docker.security.seccomp.profile=default

networks:
  monitoring:

Hinweis für die Leser: Bitte ersetzen Sie die Platzhalter in den Umgebungsvariablen durch Ihre eigenen Werte:

  • your-admin-user – Der Benutzername für die Grafana-Admin-Anmeldung.
  • your-admin-password – Das Passwort für die Grafana-Admin-Anmeldung.

Uptime Kuma

version: '3.3'

services:
uptime-kuma:
image: louislam/uptime-kuma:latest
ports:
- "3001:3001"
volumes:
- uptime-kuma-data:/app/data
restart: unless-stopped

volumes:
uptime-kuma-data:

Vaultwarden

version: '3.8'

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    environment:
      - DOMAIN=https://your.domain.example.com
      - LOGIN_RATELIMIT_MAX_BURST=3
      - LOGIN_RATELIMIT_SECONDS=30
      - LOGIN_RATELIMIT_BLOCK_DURATION=86400
      - ADMIN_RATELIMIT_MAX_BURST=3
      - ADMIN_RATELIMIT_SECONDS=30
      - ADMIN_RATELIMIT_BLOCK_DURATION=86400
      - ADMIN_TOKEN=$$argon2id$$v=19$$m=65540,t=3,p=4$$anonymized$anonymized$anonymized
      - WEBSOCKET_ENABLED=true
      - SENDS_ALLOWED=true
      - EMERGENCY_ACCESS_ALLOWED=true
      - WEB_VAULT_ENABLED=true
      - SIGNUPS_ALLOWED=false
      - SIGNUPS_VERIFY=true
      - SIGNUPS_VERIFY_RESEND_TIME=3600
      - SIGNUPS_VERIFY_RESEND_LIMIT=3
      - SMTP_HOST="smtp.example.com"
      - SMTP_FROM="user@example.com"
      - SMTP_SECURITY=starttls
      - SMTP_PORT=587
      - SMTP_USERNAME="user@example.com"
      - SMTP_PASSWORD="your_smtp_password"
      - SMTP_AUTH_MECHANISM="Login"
      - TZ="Europe/Berlin"
    volumes:
      - /etc/vaultwarden/vaultwarden-data:/data
      - /etc/vaultwarden/logs:/data/logs
    networks:
      - caddy-reverse-proxy_proxy
    restart: unless-stopped
    deploy:
      labels:
        - com.docker.security.seccomp.profile=default

networks:
  caddy-reverse-proxy_proxy:
    external: true

Hinweis für die Leser: Bitte ersetzen Sie die Platzhalter in den Umgebungsvariablen durch Ihre eigenen Werte:

  • DOMAIN=https://your.domain.example.com -> Ersetzen Sie your.domain.example.com durch Ihre eigene Domain.
  • ADMIN_TOKEN=$$argon2id$$v=19$$m=65540,t=3,p=4$$anonymized$anonymized$anonymized -> Ersetzen Sie den gesamten Wert nach ADMIN_TOKEN= durch Ihren eigenen verschlüsselten Admin-Token.
  • SMTP_HOST="smtp.example.com" -> Ersetzen Sie smtp.example.com durch den Hostnamen Ihres SMTP-Servers.
  • SMTP_FROM="user@example.com" -> Ersetzen Sie user@example.com durch die E-Mail-Adresse, die als Absender verwendet werden soll.
  • SMTP_USERNAME="user@example.com" -> Ersetzen Sie user@example.com durch Ihren SMTP-Benutzernamen.
  • SMTP_PASSWORD="your_smtp_password" -> Ersetzen Sie your_smtp_password durch Ihr SMTP-Passwort.

Nextcloud

version: '3'

services:
  db:
    image: mariadb:latest
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: always
    volumes:
      - /etc/nextcloud/db:/var/lib/mysql
      - /etc/docker-pw/mysql_root_password.txt:/run/secrets/mysql_root_password:ro
      - /etc/docker-pw/mysql_password.txt:/run/secrets/mysql_password:ro
    environment:
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_root_password
      - MYSQL_PASSWORD_FILE=/run/secrets/mysql_password
      - MYSQL_DATABASE="nextcloud"
      - MYSQL_USER="nextcloud"
    networks:
      - nextcloud_network
    deploy:
      labels:
        - com.docker.security.seccomp.profile=default

  app:
    image: nextcloud:latest
    ports:
      - "8080:80"
    links:
      - db
    volumes:
      - /etc/nextcloud/nextcloud:/var/www/html
      - /mnt/raid1:/mnt/raid1
      - /etc/nextcloud/php.ini:/usr/local/etc/php/php.ini
      - /etc/nextcloud/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
      - /etc/nextcloud/config:/var/www/html/config
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    restart: always
    environment:
      - MYSQL_DATABASE="nextcloud"
      - MYSQL_USER="nextcloud"
      - MYSQL_HOST="db"
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_root_password
      - MYSQL_PASSWORD_FILE=/run/secrets/mysql_password
      - PHP_MEMORY_LIMIT="512M"
      - PHP_UPLOAD_LIMIT="20G"
    networks:
      - nextcloud_network
    deploy:
      labels:
        - com.docker.security.seccomp.profile=default

  clamav:
    image: clamav/clamav:latest
    container_name: nextav
    restart: always
    volumes:
      - /var/lib/clamav:/var/lib/clamav
      - /mnt/raid1:/mnt/raid1
      - clamav_tmp:/tmp
    networks:
      nextcloud_network:
        ipv4_address: 172.30.0.6
    deploy:
      labels:
        - com.docker.security.seccomp.profile=default

  redis:
    image: redis:latest
    container_name: nextredis
    restart: always
    volumes:
      - /etc/nextcloud/redis_data:/data
    networks:
      - nextcloud_network
    deploy:
      labels:
        - com.docker.security.seccomp.profile=default

networks:
  nextcloud_network:
    ipam:
      config:
        - subnet: 172.30.0.0/16

volumes:
  clamav_tmp:

Hinweis für die Leser: Bitte stellen Sie sicher, dass die Dateien, die sensible Daten enthalten (z. B. mysql_root_password.txt und mysql_password.txt), sicher gespeichert und nur von autorisierten Personen zugänglich sind.

Caddyfile

yourdomain.example.com {
reverse_proxy your.internal.ip:8080 {
header_up X-Real-IP {remote_host}
}

# Sicherheitskopfzeilen
header Strict-Transport-Security "max-age=31536000;"
header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';"
header X-Content-Type-Options "nosniff"
header X-Frame-Options "SAMEORIGIN"
header X-XSS-Protection "1; mode=block"
header Referrer-Policy "no-referrer"
header Permissions-Policy "geolocation=(), microphone=(), camera=()"

# Umleitungen für .well-known URLs
redir /.well-known/carddav /remote.php/dav/ 301
redir /.well-known/caldav /remote.php/dav/ 301

}

Hinweis für die Leser:

Domain:

  • Ersetzen Sie yourdomain.example.com durch Ihre eigene Domain. Dies ist die öffentliche URL, unter der Ihre Nextcloud-Instanz erreichbar ist.
  • Interne IP-Adresse und Port: Ersetzen Sie your.internal.ip durch die interne IP-Adresse und 8080 durch den Port, auf dem Ihre Nextcloud-Instanz läuft. Dies ist die interne Adresse Ihres Nextcloud-Servers.

Nextcloud config.php

<?php
$CONFIG = array (
  'htaccess.RewriteBase' => '/',
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'redis' =>
  array (
    'host' => 'redis',
    'port' => 6379,
  ),
  'apps_paths' =>
  array (
    0 =>
    array (
      'path' => '/var/www/html/apps',
      'url' => '/apps',
      'writable' => false,
    ),
    1 =>
    array (
      'path' => '/var/www/html/custom_apps',
      'url' => '/custom_apps',
      'writable' => true,
    ),
  ),
  'instanceid' => 'ocxxxxxxxxxxxx',
  'passwordsalt' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  'trusted_domains' =>
  array (
    0 => 'nextcloud.your-domain.com',
  ),
  'overwriteprotocol' => 'https',
  'overwrite.cli.url' => 'https://nextcloud.your-domain.com',
  'trusted_proxies' =>
  array (
    0 => 'xxx.xxx.xxx.xxx',
  ),
  'default_phone_region' => 'XX',
  'datadirectory' => '/var/www/html/data',
  'dbtype' => 'mysql',
  'version' => '29.0.4.1',
  'dbname' => 'nextcloud',
  'dbhost' => 'db',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'mysql.utf8mb4' => true,
  'dbuser' => 'nextcloud',
  'dbpassword' => 'xxxxxxxxxxxxxxxx',
  'installed' => false,
  'mail_smtpmode' => 'smtp',
  'mail_smtpsecure' => 'tls',
  'mail_sendmailmode' => 'smtp',
  'mail_from_address' => 'xxxxxx',
  'mail_domain' => 'xxxxxx.com',
  'mail_smtphost' => 'smtp.xxxxxx.com',
  'mail_smtpport' => '587',
  'mail_smtpauth' => 1,
  'mail_smtpname' => 'xxxxxx',
  'mail_smtppassword' => 'xxxxxxxxxxxx',
  'memcache.local' => '\\OC\\Memcache\\APCu',
  'twofactor_enforced' => 'true',
  'twofactor_enforced_groups' =>
  array (
    0 => 'admin',
  ),
  'twofactor_enforced_excluded_groups' =>
  array (
  ),
  'maintenance_window_start' => 1,
  'maintenance' => false,
  'loglevel' => 2,
  'app_install_overwrite' =>
  array (
    0 => 'geoblocker',
    1 => 'cfg_share_links',
    2 => 'files_rightclick',
    3 => 'twofactor_email',
  ),
  'theme' => '',
);

Traccar

version: "3" # Legt die Version der Docker Compose-Syntax fest

services:
  # Dienstname: app
  app:
    image: traccar/traccar:latest # Gibt das Docker-Image an, das für diesen Dienst verwendet werden soll. Es wird die neueste Version des Traccar-Images verwendet.
    container_name: traccar # Name des zu erstellenden Containers
    hostname: traccar # Hostname des Containers
    restart: unless-stopped # Neustart-Richtlinie. Der Container wird neu gestartet, wenn er nicht explizit gestoppt wird.

    ports: # Ports-Zuordnung vom Host zum Container
      - "8081:8082" # Zuordnung von Port 8081 auf dem Host zu Port 8082 im Container

    volumes: # Definiert Volume-Mounts für den Container
      - /etc/traccar/logs:/opt/traccar/logs:rw # Mounten des Logs-Verzeichnisses vom Host in den Container mit Lese- und Schreibberechtigung
      - /etc/traccar/traccar.xml:/opt/traccar/conf/traccar.xml:ro # Mounten der Konfigurationsdatei traccar.xml vom Host in den Container mit Nur-Lese-Berechtigungen
      - /etc/traccar-db:/opt/traccar/data # In diesem Beispiel wird das Verzeichnis /etc/traccar-db auf Ihrem Host-System auf das Verzeichnis /opt/traccar/data im Container abgebildet.
    deploy:
      labels:
        - com.docker.security.seccomp.profile=default

Hinweis für die Leser: Bitte stellen Sie sicher, dass die Konfigurationsdateien und Verzeichnisse, die sensible Daten enthalten könnten, sicher gespeichert und nur von autorisierten Personen zugänglich sind.

Das hinzugefügte Label com.docker.security.seccomp.profile=default erhöht die Sicherheit des Containers, indem es bestimmte gefährliche Systemaufrufe blockiert. Dies bietet zusätzlichen Schutz vor potenziellen Sicherheitsbedrohungen.

Fazit

Die Migration vom Raspberry Pi auf den Proxmox Ubuntu Server war ein erfolgreicher Schritt, der zahlreiche Vorteile mit sich brachte. Die gesteigerte Leistung, verbesserte Ressourcennutzung, vereinfachte Verwaltung und erhöhte Sicherheit haben die Effizienz und Zuverlässigkeit meines Setups deutlich verbessert. Proxmox hat sich als leistungsfähige und flexible Plattform erwiesen, die den Anforderungen meiner Container-Dienste bestens gerecht wird.