Docker Stack Traefik: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 1: Zeile 1:
Dieser Artikel baut auf dem [[Docker-Stack-Traefik|Docker-Stack mit Traefik]] auf und integriert ihn in das SIEM. Der Wazuh-Agent läuft dabei auf dem '''Docker-Host''', nicht in den Containern. Drei Telemetriequellen werden eingebunden: Docker-Engine-Events, die Anwendungslogs und Datei-Integritätsüberwachung auf den Volumes.
+
Dieser Artikel beschreibt einen Docker-Aufbau, bei dem '''Traefik''' als zentraler Reverse-Proxy in einem eigenen Projekt läuft und die Anwendungen '''Nextcloud''' und '''MediaWiki''' als jeweils eigenständige Compose-Projekte betrieben werden. Die Verbindung erfolgt über ein gemeinsames, extern angelegtes Docker-Netz. Jede Anwendung bringt ihre eigene Datenbank mit. Traefik terminiert TLS mit einem statischen Wildcard-Zertifikat.
  
 
==Konzept==
 
==Konzept==
  
; Agent auf dem Host
+
; Drei getrennte Projekte
* Der Wazuh-Agent wird auf dem Docker-Host installiert. Über das <code>docker-listener</code>-Modul liest er die Events der Docker-Engine direkt vom Socket.
+
* Traefik, Nextcloud und MediaWiki liegen in '''drei eigenen Verzeichnissen''' mit jeweils eigener <code>docker-compose.yml</code>. Jedes Projekt ist unabhängig start- und stoppbar.
  
; Was im SIEM ankommt
+
; Gemeinsames externes Netz
* Container start, stop und die
+
* Das Netz <code>proxy</code> wird einmalig von Hand angelegt. Traefik hängt sich hinein, die Anwendungen treten ihm als <code>external</code> bei. So findet Traefik die Container, ohne dass alles in einem Compose-File stehen muss.
* Image-Pulls
 
* <code>docker exec</code> in laufende Container (jemand klettert in den Container)
 
* Netzwerk- und Volume-Events
 
  
; Drei Quellen
+
; Statisches Zertifikat
* Engine-Events (docker-listener), Anwendungslogs (Traefik, Nextcloud, MediaWiki) und FIM auf den Daten-Volumes.
+
* Im Lab gibt es kein ACME nach außen. Das Wildcard-Zertifikat liegt unter <code>/etc/ssl/own.crt</code> und <code>/etc/ssl/own.key</code> und wird per File-Provider als Default registriert.
  
==Voraussetzung: Python-Modul docker==
+
; Pro App eine eigene Datenbank
 +
* Jede Anwendung hat einen eigenen MariaDB-Container in einem eigenen, app-internen Netz. Es gibt '''keine''' gemeinsame Datenbank. Eine kompromittierte Anwendung kann nicht an die Daten der anderen gelangen.
  
Das <code>docker-listener</code>-Modul benötigt das Python-<code>docker</code>-SDK in der '''Wazuh-eigenen''' Python-Umgebung. Ohne dieses Modul startet der Listener still nicht.
+
==Verzeichnisstruktur==
  
; SDK in die Wazuh-Python-Umgebung installieren
+
<pre>
* <code>/var/ossec/framework/python/bin/pip3 install docker</code>
+
docker/
 +
├── traefik/
 +
│  ├── docker-compose.yml
 +
│  └── dynamic/
 +
│      └── tls.yml
 +
├── nextcloud/
 +
│  └── docker-compose.yml
 +
└── mediawiki/
 +
    └── docker-compose.yml
 +
</pre>
  
; Installation prüfen
+
==Externes Netz anlegen==
* <code>/var/ossec/framework/python/bin/pip3 show docker</code>
 
  
==Agent-Konfiguration (ossec.conf)==
+
Einmalig, bevor irgendein Projekt startet:
  
Der folgende Block kommt in die <code>/var/ossec/etc/ossec.conf</code> des Agents auf dem Docker-Host.
+
; Proxy-Netz erstellen
 +
* <code>docker network create proxy</code>
  
===docker-listener aktivieren===
+
==Projekt 1: Traefik==
  
<syntaxhighlight lang="xml">
+
Verzeichnis <code>traefik/</code>.
<wodle name="docker-listener">
+
 
   <interval>10m</interval>
+
===traefik/docker-compose.yml===
   <attempts>5</attempts>
+
 
  <run_on_start>yes</run_on_start>
+
<syntaxhighlight lang="yaml">
   <disabled>no</disabled>
+
services:
</wodle>
+
  traefik:
 +
    image: traefik:v3.3
 +
    container_name: traefik
 +
    restart: unless-stopped
 +
    command:
 +
      - "--providers.docker=true"
 +
      - "--providers.docker.exposedbydefault=false"
 +
      - "--providers.docker.network=proxy"
 +
      - "--providers.file.directory=/etc/traefik/dynamic"
 +
      - "--providers.file.watch=true"
 +
      - "--entrypoints.web.address=:80"
 +
      - "--entrypoints.websecure.address=:443"
 +
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
 +
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
 +
    ports:
 +
      - "80:80"
 +
      - "443:443"
 +
    volumes:
 +
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
 +
      - "./dynamic:/etc/traefik/dynamic:ro"
 +
      - "/etc/ssl/own.crt:/etc/ssl/own.crt:ro"
 +
      - "/etc/ssl/own.key:/etc/ssl/own.key:ro"
 +
    networks:
 +
      - proxy
 +
 
 +
networks:
 +
   proxy:
 +
    external: true
 +
</syntaxhighlight>
 +
 
 +
===traefik/dynamic/tls.yml===
 +
 
 +
<syntaxhighlight lang="yaml">
 +
tls:
 +
   certificates:
 +
    - certFile: /etc/ssl/own.crt
 +
      keyFile: /etc/ssl/own.key
 +
   stores:
 +
    default:
 +
      defaultCertificate:
 +
        certFile: /etc/ssl/own.crt
 +
        keyFile: /etc/ssl/own.key
 
</syntaxhighlight>
 
</syntaxhighlight>
  
; interval / attempts
+
; provider.docker.network=proxy
* Der Listener verbindet sich beim Start mit dem Docker-Socket. <code>attempts</code> regelt, wie oft er es bei Nichterreichbarkeit erneut versucht.
+
* Sagt Traefik, über welches Netz die Backends erreichbar sind. Wichtig, sobald Container an mehreren Netzen hängen.
  
; run_on_start
+
; Default-Zertifikat
* Startet das Modul direkt beim Hochfahren des Agents, nicht erst nach dem ersten Intervall.
+
* Durch das <code>default</code>-Store reicht an jedem Router ein einfaches <code>tls=true</code>. Ein eigener Cert-Verweis pro Router entfällt.
  
===Anwendungslogs einsammeln===
+
; external: true
 +
* Das Netz wird nicht von diesem Projekt erzeugt, sondern als bereits vorhanden vorausgesetzt (siehe oben).
  
Die Container loggen auf <code>stdout</code>. Bei json-file-Logtreiber liegen die Logs auf dem Host und können direkt als Datei eingelesen werden. Einfacher und stabiler ist es, die relevanten Anwendungslogs auf ein gemountetes Verzeichnis zu schreiben und dieses zu überwachen.
+
==Projekt 2: Nextcloud==
  
<syntaxhighlight lang="xml">
+
Verzeichnis <code>nextcloud/</code>.
<localfile>
+
 
  <log_format>json</log_format>
+
===nextcloud/docker-compose.yml===
  <location>/var/lib/docker/containers/*/*-json.log</location>
 
</localfile>
 
</syntaxhighlight>
 
  
; json-Logtreiber
+
<syntaxhighlight lang="yaml">
* Docker schreibt pro Container eine <code>*-json.log</code>. Wazuh kann diese als <code>json</code> einlesen und die Felder direkt auswerten.
+
services:
 +
  nextcloud-db:
 +
    image: mariadb:11
 +
    container_name: nextcloud-db
 +
    restart: unless-stopped
 +
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
 +
    environment:
 +
      MARIADB_ROOT_PASSWORD: nc-rootpass
 +
      MARIADB_DATABASE: nextcloud
 +
      MARIADB_USER: nextcloud
 +
      MARIADB_PASSWORD: nextcloudpass
 +
      MARIADB_AUTO_UPGRADE: "1"
 +
    volumes:
 +
      - db:/var/lib/mysql
 +
    networks:
 +
      - back
  
==FIM auf den Volumes==
+
  nextcloud:
 +
    image: nextcloud:30-apache
 +
    container_name: nextcloud
 +
    restart: unless-stopped
 +
    depends_on:
 +
      - nextcloud-db
 +
    environment:
 +
      MYSQL_HOST: nextcloud-db
 +
      MYSQL_DATABASE: nextcloud
 +
      MYSQL_USER: nextcloud
 +
      MYSQL_PASSWORD: nextcloudpass
 +
      NEXTCLOUD_ADMIN_USER: admin
 +
      NEXTCLOUD_ADMIN_PASSWORD: adminpass
 +
      NEXTCLOUD_TRUSTED_DOMAINS: cloud.it2XX.xinmen.de.int
 +
      OVERWRITEPROTOCOL: https
 +
    volumes:
 +
      - data:/var/www/html
 +
    networks:
 +
      - proxy
 +
      - back
 +
    labels:
 +
      - "traefik.enable=true"
 +
      - "traefik.http.routers.nextcloud.rule=Host(`cloud.it2XX.xinmen.de.int`)"
 +
      - "traefik.http.routers.nextcloud.entrypoints=websecure"
 +
      - "traefik.http.routers.nextcloud.tls=true"
 +
      - "traefik.http.services.nextcloud.loadbalancer.server.port=80"
 +
      - "traefik.http.middlewares.nc-dav.redirectregex.regex=https://([^/]*)/.well-known/(card|cal)dav"
 +
      - "traefik.http.middlewares.nc-dav.redirectregex.replacement=https://$${1}/remote.php/dav/"
 +
      - "traefik.http.routers.nextcloud.middlewares=nc-dav"
  
Datei-Integritätsüberwachung auf den Daten-Volumes der Anwendungen. Veränderungen an hochgeladenen Dateien oder an der Wiki-Konfiguration lösen ein FIM-Event aus (Rule 554 bei neuen Dateien).
+
networks:
 +
  proxy:
 +
    external: true
 +
  back:
  
<syntaxhighlight lang="xml">
+
volumes:
<syscheck>
+
  db:
   <directories check_all="yes" realtime="yes">/var/lib/docker/volumes/docker-stack_nextcloud_data/_data/data</directories>
+
   data:
  <directories check_all="yes" realtime="yes">/var/lib/docker/volumes/docker-stack_mediawiki_data/_data</directories>
 
</syscheck>
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
; realtime
+
; Zwei Netze
* <code>realtime="yes"</code> meldet Änderungen sofort über inotify, statt erst beim nächsten Scan-Durchlauf.
+
* Der Web-Container hängt an <code>proxy</code> (für Traefik) und an <code>back</code> (für die DB). Die Datenbank hängt '''nur''' an <code>back</code> und ist damit weder von außen noch von anderen Projekten erreichbar.
  
; Volume-Pfade
+
; DB-Anlage über Env
* Die genauen Pfade hängen vom Compose-Projektnamen ab (Präfix des Verzeichnisses). Mit dem folgenden Befehl ermitteln.
+
* MariaDB legt Datenbank und Benutzer beim ersten Start selbst an. Kein Init-Skript nötig.
* <code>docker volume inspect docker-stack_nextcloud_data</code>
 
  
==Kompletter ossec.conf-Block==
+
==Projekt 3: MediaWiki==
  
Alle drei Bausteine (docker-listener, Anwendungslogs, FIM) am Stück zum Einfügen in die <code>/var/ossec/etc/ossec.conf</code> des Agents auf dem Docker-Host. Die Volume-Pfade ggf. an den eigenen Compose-Projektnamen anpassen.
+
Verzeichnis <code>mediawiki/</code>.
  
<syntaxhighlight lang="xml">
+
===mediawiki/docker-compose.yml===
<wodle name="docker-listener">
 
  <interval>10m</interval>
 
  <attempts>5</attempts>
 
  <run_on_start>yes</run_on_start>
 
  <disabled>no</disabled>
 
</wodle>
 
  
<localfile>
+
<syntaxhighlight lang="yaml">
   <log_format>json</log_format>
+
services:
  <location>/var/lib/docker/containers/*/*-json.log</location>
+
   mediawiki-db:
</localfile>
+
    image: mariadb:11
 +
    container_name: mediawiki-db
 +
    restart: unless-stopped
 +
    environment:
 +
      MARIADB_ROOT_PASSWORD: mw-rootpass
 +
      MARIADB_DATABASE: mediawiki
 +
      MARIADB_USER: mediawiki
 +
      MARIADB_PASSWORD: mediawikipass
 +
      MARIADB_AUTO_UPGRADE: "1"
 +
    volumes:
 +
      - db:/var/lib/mysql
 +
    networks:
 +
      - back
  
<syscheck>
+
  mediawiki:
  <directories check_all="yes" realtime="yes">/var/lib/docker/volumes/docker-stack_nextcloud_data/_data/data</directories>
+
    image: mediawiki:1.43
  <directories check_all="yes" realtime="yes">/var/lib/docker/volumes/docker-stack_mediawiki_data/_data</directories>
+
    container_name: mediawiki
</syscheck>
+
    restart: unless-stopped
</syntaxhighlight>
+
    depends_on:
 +
      - mediawiki-db
 +
    volumes:
 +
      - data:/var/www/html/images
 +
      # LocalSettings.php nach dem Setup einhaengen:
 +
      # - ./LocalSettings.php:/var/www/html/LocalSettings.php:ro
 +
    networks:
 +
      - proxy
 +
      - back
 +
    labels:
 +
      - "traefik.enable=true"
 +
      - "traefik.http.routers.mediawiki.rule=Host(`wiki.it2XX.xinmen.de.int`)"
 +
      - "traefik.http.routers.mediawiki.entrypoints=websecure"
 +
      - "traefik.http.routers.mediawiki.tls=true"
 +
      - "traefik.http.services.mediawiki.loadbalancer.server.port=80"
  
==Agent neu starten==
+
networks:
 +
  proxy:
 +
    external: true
 +
  back:
  
<syntaxhighlight lang="bash">
+
volumes:
systemctl restart wazuh-agent
+
  db:
 +
  data:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==Funktionsprüfung==
+
; Gleiche Struktur wie Nextcloud
 +
* Eigene DB im internen <code>back</code>-Netz, der Web-Container zusätzlich am <code>proxy</code>-Netz für Traefik.
 +
 
 +
==Inbetriebnahme==
  
===Modul-Status im Agent-Log===
+
Reihenfolge: erst das Netz, dann Traefik, dann die Anwendungen.
  
; ossec.log auf dem Agent prüfen
+
; Externes Netz anlegen (einmalig)
* <code>tail -f /var/ossec/logs/ossec.log</code>
+
* <code>docker network create proxy</code>
  
; Auf docker-listener-Meldungen achten
+
; Zertifikat ablegen
* <code>grep docker-listener /var/ossec/logs/ossec.log</code>
+
* <code>cd traefik && ./get-cert.sh</code>
  
Erscheint hier eine Meldung über ein fehlendes Python-Modul, wurde das <code>docker</code>-SDK nicht in die Wazuh-Python-Umgebung installiert (siehe oben).
+
; Traefik starten
 +
* <code>cd traefik && docker compose up -d</code>
  
===Event auslösen===
+
; Nextcloud starten
 +
* <code>cd ../nextcloud && docker compose up -d</code>
  
; Test-Container starten und wieder entfernen
+
; MediaWiki starten
* <code>docker run --rm hello-world</code>
+
* <code>cd ../mediawiki && docker compose up -d</code>
  
; In einen laufenden Container klettern
+
; Status je Projekt prüfen
* <code>docker exec -it nextcloud sh</code>
+
* <code>docker compose ps</code>
  
===Im Manager prüfen===
+
==DNS==
  
; archives.json mitlesen (alle Events)
+
Beide Hostnamen müssen auf den Docker-Host zeigen:
* <code>tail -f /var/ossec/logs/archives/archives.json</code>
 
  
; alerts.json mitlesen (nur Alerts)
+
; Nextcloud
* <code>tail -f /var/ossec/logs/alerts/alerts.json</code>
+
* <code>cloud.it2XX.xinmen.de.int</code>
  
Die Docker-Events erscheinen mit dem Decoder <code>docker</code>. Das <code>docker exec</code> ist didaktisch der interessanteste Fall: Es zeigt, dass ein Eindringen in einen laufenden Container im SIEM sichtbar wird.
+
; MediaWiki
 +
* <code>wiki.it2XX.xinmen.de.int</code>
  
==Hinweis zum Datenfluss==
+
==MediaWiki-Setup abschließen==
  
; Engine-Events vs. Anwendungslogs
+
; Erstaufruf im Browser
* Der docker-listener meldet, '''dass''' ein Container gestartet oder betreten wurde – nicht, was innerhalb der Anwendung passiert. Für Angriffe auf die Webanwendung (z.B. gegen MediaWiki oder Nextcloud) liefern die Anwendungslogs und FIM die Telemetrie.
+
* MediaWiki startet ohne <code>LocalSettings.php</code> mit dem Web-Installer. Als Datenbank-Host <code>mediawiki-db</code>, Datenbank <code>mediawiki</code>, Benutzer <code>mediawiki</code> angeben.
  
; Zusammenspiel
+
; LocalSettings.php einhängen
* Erst die Kombination macht das Bild vollständig: Engine-Ebene (Container-Lifecycle), Anwendungs-Ebene (Logs) und Datei-Ebene (FIM).
+
* Nach dem Setup die generierte <code>LocalSettings.php</code> ins <code>mediawiki/</code>-Verzeichnis legen, den auskommentierten Volume-Mount aktivieren und den Container neu starten.
 +
* <code>docker compose up -d mediawiki</code>

Aktuelle Version vom 27. Juni 2026, 16:26 Uhr

Dieser Artikel beschreibt einen Docker-Aufbau, bei dem Traefik als zentraler Reverse-Proxy in einem eigenen Projekt läuft und die Anwendungen Nextcloud und MediaWiki als jeweils eigenständige Compose-Projekte betrieben werden. Die Verbindung erfolgt über ein gemeinsames, extern angelegtes Docker-Netz. Jede Anwendung bringt ihre eigene Datenbank mit. Traefik terminiert TLS mit einem statischen Wildcard-Zertifikat.

Konzept

Drei getrennte Projekte
  • Traefik, Nextcloud und MediaWiki liegen in drei eigenen Verzeichnissen mit jeweils eigener docker-compose.yml. Jedes Projekt ist unabhängig start- und stoppbar.
Gemeinsames externes Netz
  • Das Netz proxy wird einmalig von Hand angelegt. Traefik hängt sich hinein, die Anwendungen treten ihm als external bei. So findet Traefik die Container, ohne dass alles in einem Compose-File stehen muss.
Statisches Zertifikat
  • Im Lab gibt es kein ACME nach außen. Das Wildcard-Zertifikat liegt unter /etc/ssl/own.crt und /etc/ssl/own.key und wird per File-Provider als Default registriert.
Pro App eine eigene Datenbank
  • Jede Anwendung hat einen eigenen MariaDB-Container in einem eigenen, app-internen Netz. Es gibt keine gemeinsame Datenbank. Eine kompromittierte Anwendung kann nicht an die Daten der anderen gelangen.

Verzeichnisstruktur

docker/
├── traefik/
│   ├── docker-compose.yml
│   └── dynamic/
│       └── tls.yml
├── nextcloud/
│   └── docker-compose.yml
└── mediawiki/
    └── docker-compose.yml

Externes Netz anlegen

Einmalig, bevor irgendein Projekt startet:

Proxy-Netz erstellen
  • docker network create proxy

Projekt 1: Traefik

Verzeichnis traefik/.

traefik/docker-compose.yml

services:
  traefik:
    image: traefik:v3.3
    container_name: traefik
    restart: unless-stopped
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.network=proxy"
      - "--providers.file.directory=/etc/traefik/dynamic"
      - "--providers.file.watch=true"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./dynamic:/etc/traefik/dynamic:ro"
      - "/etc/ssl/own.crt:/etc/ssl/own.crt:ro"
      - "/etc/ssl/own.key:/etc/ssl/own.key:ro"
    networks:
      - proxy

networks:
  proxy:
    external: true

traefik/dynamic/tls.yml

tls:
  certificates:
    - certFile: /etc/ssl/own.crt
      keyFile: /etc/ssl/own.key
  stores:
    default:
      defaultCertificate:
        certFile: /etc/ssl/own.crt
        keyFile: /etc/ssl/own.key
provider.docker.network=proxy
  • Sagt Traefik, über welches Netz die Backends erreichbar sind. Wichtig, sobald Container an mehreren Netzen hängen.
Default-Zertifikat
  • Durch das default-Store reicht an jedem Router ein einfaches tls=true. Ein eigener Cert-Verweis pro Router entfällt.
external
true
  • Das Netz wird nicht von diesem Projekt erzeugt, sondern als bereits vorhanden vorausgesetzt (siehe oben).

Projekt 2: Nextcloud

Verzeichnis nextcloud/.

nextcloud/docker-compose.yml

services:
  nextcloud-db:
    image: mariadb:11
    container_name: nextcloud-db
    restart: unless-stopped
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    environment:
      MARIADB_ROOT_PASSWORD: nc-rootpass
      MARIADB_DATABASE: nextcloud
      MARIADB_USER: nextcloud
      MARIADB_PASSWORD: nextcloudpass
      MARIADB_AUTO_UPGRADE: "1"
    volumes:
      - db:/var/lib/mysql
    networks:
      - back

  nextcloud:
    image: nextcloud:30-apache
    container_name: nextcloud
    restart: unless-stopped
    depends_on:
      - nextcloud-db
    environment:
      MYSQL_HOST: nextcloud-db
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: nextcloudpass
      NEXTCLOUD_ADMIN_USER: admin
      NEXTCLOUD_ADMIN_PASSWORD: adminpass
      NEXTCLOUD_TRUSTED_DOMAINS: cloud.it2XX.xinmen.de.int
      OVERWRITEPROTOCOL: https
    volumes:
      - data:/var/www/html
    networks:
      - proxy
      - back
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nextcloud.rule=Host(`cloud.it2XX.xinmen.de.int`)"
      - "traefik.http.routers.nextcloud.entrypoints=websecure"
      - "traefik.http.routers.nextcloud.tls=true"
      - "traefik.http.services.nextcloud.loadbalancer.server.port=80"
      - "traefik.http.middlewares.nc-dav.redirectregex.regex=https://([^/]*)/.well-known/(card|cal)dav"
      - "traefik.http.middlewares.nc-dav.redirectregex.replacement=https://$${1}/remote.php/dav/"
      - "traefik.http.routers.nextcloud.middlewares=nc-dav"

networks:
  proxy:
    external: true
  back:

volumes:
  db:
  data:
Zwei Netze
  • Der Web-Container hängt an proxy (für Traefik) und an back (für die DB). Die Datenbank hängt nur an back und ist damit weder von außen noch von anderen Projekten erreichbar.
DB-Anlage über Env
  • MariaDB legt Datenbank und Benutzer beim ersten Start selbst an. Kein Init-Skript nötig.

Projekt 3: MediaWiki

Verzeichnis mediawiki/.

mediawiki/docker-compose.yml

services:
  mediawiki-db:
    image: mariadb:11
    container_name: mediawiki-db
    restart: unless-stopped
    environment:
      MARIADB_ROOT_PASSWORD: mw-rootpass
      MARIADB_DATABASE: mediawiki
      MARIADB_USER: mediawiki
      MARIADB_PASSWORD: mediawikipass
      MARIADB_AUTO_UPGRADE: "1"
    volumes:
      - db:/var/lib/mysql
    networks:
      - back

  mediawiki:
    image: mediawiki:1.43
    container_name: mediawiki
    restart: unless-stopped
    depends_on:
      - mediawiki-db
    volumes:
      - data:/var/www/html/images
      # LocalSettings.php nach dem Setup einhaengen:
      # - ./LocalSettings.php:/var/www/html/LocalSettings.php:ro
    networks:
      - proxy
      - back
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.mediawiki.rule=Host(`wiki.it2XX.xinmen.de.int`)"
      - "traefik.http.routers.mediawiki.entrypoints=websecure"
      - "traefik.http.routers.mediawiki.tls=true"
      - "traefik.http.services.mediawiki.loadbalancer.server.port=80"

networks:
  proxy:
    external: true
  back:

volumes:
  db:
  data:
Gleiche Struktur wie Nextcloud
  • Eigene DB im internen back-Netz, der Web-Container zusätzlich am proxy-Netz für Traefik.

Inbetriebnahme

Reihenfolge: erst das Netz, dann Traefik, dann die Anwendungen.

Externes Netz anlegen (einmalig)
  • docker network create proxy
Zertifikat ablegen
  • cd traefik && ./get-cert.sh
Traefik starten
  • cd traefik && docker compose up -d
Nextcloud starten
  • cd ../nextcloud && docker compose up -d
MediaWiki starten
  • cd ../mediawiki && docker compose up -d
Status je Projekt prüfen
  • docker compose ps

DNS

Beide Hostnamen müssen auf den Docker-Host zeigen:

Nextcloud
  • cloud.it2XX.xinmen.de.int
MediaWiki
  • wiki.it2XX.xinmen.de.int

MediaWiki-Setup abschließen

Erstaufruf im Browser
  • MediaWiki startet ohne LocalSettings.php mit dem Web-Installer. Als Datenbank-Host mediawiki-db, Datenbank mediawiki, Benutzer mediawiki angeben.
LocalSettings.php einhängen
  • Nach dem Setup die generierte LocalSettings.php ins mediawiki/-Verzeichnis legen, den auskommentierten Volume-Mount aktivieren und den Container neu starten.
  • docker compose up -d mediawiki