Docker Stack Traefik: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „Dieser Artikel beschreibt einen kompletten Docker-Compose-Stack mit '''Traefik''' als Reverse-Proxy, einer gemeinsamen '''MariaDB''' und den beiden Webanwendun…“)
 
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
Dieser Artikel beschreibt einen kompletten Docker-Compose-Stack mit '''Traefik''' als Reverse-Proxy, einer gemeinsamen '''MariaDB''' und den beiden Webanwendungen '''Nextcloud''' und '''MediaWiki'''. Traefik erkennt die Container automatisch über Labels und terminiert TLS mit einem statischen Wildcard-Zertifikat.
+
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==
  
; Traefik als Reverse-Proxy
+
; Drei getrennte Projekte
* Im Gegensatz zu HAProxy werden die Backends nicht von Hand konfiguriert. Traefik liest die Docker-Labels der Container und erzeugt Router und Services dynamisch.
+
* 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.
 +
 
 +
; Gemeinsames externes Netz
 +
* 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.
  
 
; Statisches Zertifikat
 
; Statisches Zertifikat
* Im Lab gibt es kein ACME/Let's-Encrypt 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.
+
* 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.
  
; Eine Datenbank für beide Apps
+
; Pro App eine eigene Datenbank
* Ein gemeinsamer MariaDB-Container hält zwei getrennte Datenbanken (<code>nextcloud</code> und <code>mediawiki</code>) mit jeweils eigenem Benutzer.
+
* 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==
 
==Verzeichnisstruktur==
  
 
<pre>
 
<pre>
docker-stack/
+
docker/
├── docker-compose.yml
 
 
├── traefik/
 
├── traefik/
 +
│  ├── docker-compose.yml
 
│  └── dynamic/
 
│  └── dynamic/
 
│      └── tls.yml
 
│      └── tls.yml
└── db-init/
+
├── nextcloud/
     └── 01-init.sql
+
│  └── docker-compose.yml
 +
└── mediawiki/
 +
     └── docker-compose.yml
 
</pre>
 
</pre>
  
==docker-compose.yml==
+
==Externes Netz anlegen==
 +
 
 +
Einmalig, bevor irgendein Projekt startet:
 +
 
 +
; Proxy-Netz erstellen
 +
* <code>docker network create proxy</code>
 +
 
 +
==Projekt 1: Traefik==
 +
 
 +
Verzeichnis <code>traefik/</code>.
 +
 
 +
===traefik/docker-compose.yml===
  
 
<syntaxhighlight lang="yaml">
 
<syntaxhighlight lang="yaml">
 
services:
 
services:
 
  # Traefik - Reverse Proxy (statisches Wildcard-Cert)
 
 
   traefik:
 
   traefik:
 
     image: traefik:v3.3
 
     image: traefik:v3.3
Zeile 37: Zeile 51:
 
       - "--providers.docker=true"
 
       - "--providers.docker=true"
 
       - "--providers.docker.exposedbydefault=false"
 
       - "--providers.docker.exposedbydefault=false"
 +
      - "--providers.docker.network=proxy"
 
       - "--providers.file.directory=/etc/traefik/dynamic"
 
       - "--providers.file.directory=/etc/traefik/dynamic"
 
       - "--providers.file.watch=true"
 
       - "--providers.file.watch=true"
Zeile 48: Zeile 63:
 
     volumes:
 
     volumes:
 
       - "/var/run/docker.sock:/var/run/docker.sock:ro"
 
       - "/var/run/docker.sock:/var/run/docker.sock:ro"
       - "./traefik/dynamic:/etc/traefik/dynamic:ro"
+
       - "./dynamic:/etc/traefik/dynamic:ro"
 
       - "/etc/ssl/own.crt:/etc/ssl/own.crt:ro"
 
       - "/etc/ssl/own.crt:/etc/ssl/own.crt:ro"
 
       - "/etc/ssl/own.key:/etc/ssl/own.key:ro"
 
       - "/etc/ssl/own.key:/etc/ssl/own.key:ro"
Zeile 54: Zeile 69:
 
       - proxy
 
       - proxy
  
   # MariaDB - gemeinsame DB fuer Nextcloud + MediaWiki
+
networks:
   db:
+
   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>
 +
 
 +
; 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 <code>default</code>-Store reicht an jedem Router ein einfaches <code>tls=true</code>. 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 <code>nextcloud/</code>.
 +
 
 +
===nextcloud/docker-compose.yml===
 +
 
 +
<syntaxhighlight lang="yaml">
 +
services:
 +
   nextcloud-db:
 
     image: mariadb:11
 
     image: mariadb:11
     container_name: db
+
     container_name: nextcloud-db
 
     restart: unless-stopped
 
     restart: unless-stopped
 
     command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
 
     command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
 
     environment:
 
     environment:
       MARIADB_ROOT_PASSWORD: rootpass
+
       MARIADB_ROOT_PASSWORD: nc-rootpass
 +
      MARIADB_DATABASE: nextcloud
 +
      MARIADB_USER: nextcloud
 +
      MARIADB_PASSWORD: nextcloudpass
 
       MARIADB_AUTO_UPGRADE: "1"
 
       MARIADB_AUTO_UPGRADE: "1"
 
     volumes:
 
     volumes:
       - db_data:/var/lib/mysql
+
       - db:/var/lib/mysql
      - ./db-init:/docker-entrypoint-initdb.d:ro
 
 
     networks:
 
     networks:
       - backend
+
       - back
  
  # Nextcloud
 
 
   nextcloud:
 
   nextcloud:
 
     image: nextcloud:30-apache
 
     image: nextcloud:30-apache
Zeile 75: Zeile 126:
 
     restart: unless-stopped
 
     restart: unless-stopped
 
     depends_on:
 
     depends_on:
       - db
+
       - nextcloud-db
 
     environment:
 
     environment:
       MYSQL_HOST: db
+
       MYSQL_HOST: nextcloud-db
 
       MYSQL_DATABASE: nextcloud
 
       MYSQL_DATABASE: nextcloud
 
       MYSQL_USER: nextcloud
 
       MYSQL_USER: nextcloud
Zeile 86: Zeile 137:
 
       OVERWRITEPROTOCOL: https
 
       OVERWRITEPROTOCOL: https
 
     volumes:
 
     volumes:
       - nextcloud_data:/var/www/html
+
       - data:/var/www/html
 
     networks:
 
     networks:
 
       - proxy
 
       - proxy
       - backend
+
       - back
 
     labels:
 
     labels:
 
       - "traefik.enable=true"
 
       - "traefik.enable=true"
Zeile 100: Zeile 151:
 
       - "traefik.http.routers.nextcloud.middlewares=nc-dav"
 
       - "traefik.http.routers.nextcloud.middlewares=nc-dav"
  
   # MediaWiki
+
networks:
 +
   proxy:
 +
    external: true
 +
  back:
 +
 
 +
volumes:
 +
  db:
 +
  data:
 +
</syntaxhighlight>
 +
 
 +
; Zwei Netze
 +
* 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.
 +
 
 +
; DB-Anlage über Env
 +
* MariaDB legt Datenbank und Benutzer beim ersten Start selbst an. Kein Init-Skript nötig.
 +
 
 +
==Projekt 3: MediaWiki==
 +
 
 +
Verzeichnis <code>mediawiki/</code>.
 +
 
 +
===mediawiki/docker-compose.yml===
 +
 
 +
<syntaxhighlight lang="yaml">
 +
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:
 
   mediawiki:
 
     image: mediawiki:1.43
 
     image: mediawiki:1.43
Zeile 106: Zeile 195:
 
     restart: unless-stopped
 
     restart: unless-stopped
 
     depends_on:
 
     depends_on:
       - db
+
       - mediawiki-db
 
     volumes:
 
     volumes:
       - mediawiki_data:/var/www/html/images
+
       - data:/var/www/html/images
 
       # LocalSettings.php nach dem Setup einhaengen:
 
       # LocalSettings.php nach dem Setup einhaengen:
 
       # - ./LocalSettings.php:/var/www/html/LocalSettings.php:ro
 
       # - ./LocalSettings.php:/var/www/html/LocalSettings.php:ro
 
     networks:
 
     networks:
 
       - proxy
 
       - proxy
       - backend
+
       - back
 
     labels:
 
     labels:
 
       - "traefik.enable=true"
 
       - "traefik.enable=true"
Zeile 123: Zeile 212:
 
networks:
 
networks:
 
   proxy:
 
   proxy:
   backend:
+
    external: true
 +
   back:
  
 
volumes:
 
volumes:
   db_data:
+
   db:
   nextcloud_data:
+
   data:
  mediawiki_data:
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==Erklärung der Bausteine==
+
; 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.
  
===Traefik===
+
==Inbetriebnahme==
  
; Docker-Provider mit Opt-in
+
Reihenfolge: erst das Netz, dann Traefik, dann die Anwendungen.
* <code>exposedbydefault=false</code> sorgt dafür, dass nur Container mit <code>traefik.enable=true</code> veröffentlicht werden. Alles andere bleibt unsichtbar.
 
  
; File-Provider für TLS
+
; Externes Netz anlegen (einmalig)
* Das statische Zertifikat wird nicht über Labels, sondern über eine Datei eingebunden (siehe <code>tls.yml</code>). <code>watch=true</code> lädt Änderungen ohne Neustart.
+
* <code>docker network create proxy</code>
  
; HTTP→HTTPS-Redirect global
+
; Zertifikat ablegen
* Die beiden <code>redirections</code>-Zeilen leiten den gesamten Port-80-Verkehr auf HTTPS um. Das muss kein Container selbst regeln.
+
* <code>cd traefik && ./get-cert.sh</code>
 
 
; Docker-Socket read-only
 
* Traefik liest die Container-Labels über den Docker-Socket. Der wird '''read-only''' gemountet.
 
 
 
===MariaDB===
 
 
 
; Gemeinsame Datenbank
 
* Ein Container, zwei Datenbanken. Die Anlage übernimmt das Init-Skript (siehe unten), das beim ersten Start automatisch ausgeführt wird.
 
  
; Transaction-Isolation
+
; Traefik starten
* <code>READ-COMMITTED</code> und <code>binlog-format=ROW</code> sind die von Nextcloud empfohlenen Einstellungen.
+
* <code>cd traefik && docker compose up -d</code>
  
===Netze===
+
; Nextcloud starten
 +
* <code>cd ../nextcloud && docker compose up -d</code>
  
; Zwei Netze trennen Front und Back
+
; MediaWiki starten
* <code>proxy</code> verbindet Traefik mit den Webanwendungen. <code>backend</code> verbindet die Webanwendungen mit der Datenbank. Die DB hängt '''nicht''' am Proxy-Netz und ist damit von außen nicht erreichbar.
+
* <code>cd ../mediawiki && docker compose up -d</code>
  
==Traefik Dynamic Config (tls.yml)==
+
; Status je Projekt prüfen
 
 
Pfad im Container: <code>/etc/traefik/dynamic/tls.yml</code>
 
 
 
<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>
 
 
 
; Default-Zertifikat
 
* Durch das <code>default</code>-Store reicht an jedem Router ein einfaches <code>tls=true</code>. Traefik greift automatisch auf dieses Zertifikat zurück, ein eigener Cert-Verweis pro Router entfällt.
 
 
 
==Datenbank-Init (01-init.sql)==
 
 
 
Pfad: <code>./db-init/01-init.sql</code> – wird beim '''ersten''' Start von MariaDB automatisch ausgeführt.
 
 
 
<syntaxhighlight lang="sql">
 
CREATE DATABASE IF NOT EXISTS nextcloud
 
  CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
 
CREATE USER IF NOT EXISTS 'nextcloud'@'%' IDENTIFIED BY 'nextcloudpass';
 
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'%';
 
 
 
CREATE DATABASE IF NOT EXISTS mediawiki
 
  CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
 
CREATE USER IF NOT EXISTS 'mediawiki'@'%' IDENTIFIED BY 'mediawikipass';
 
GRANT ALL PRIVILEGES ON mediawiki.* TO 'mediawiki'@'%';
 
 
 
FLUSH PRIVILEGES;
 
</syntaxhighlight>
 
 
 
; Nur beim ersten Start
 
* Das Init-Verzeichnis wird nur ausgeführt, solange das Datenverzeichnis <code>db_data</code> leer ist. Bei einem späteren Lauf muss man die Datenbanken von Hand anlegen oder das Volume löschen.
 
 
 
==Inbetriebnahme==
 
 
 
; Zertifikat ablegen
 
* Das Wildcard-Zertifikat zur Domain mit dem vorhandenen Skript ziehen, sodass <code>/etc/ssl/own.crt</code> und <code>/etc/ssl/own.key</code> vorhanden sind.
 
* <code>./get-cert.sh</code>
 
 
 
; Stack starten
 
* <code>docker compose up -d</code>
 
 
 
; Status prüfen
 
 
* <code>docker compose ps</code>
 
* <code>docker compose ps</code>
 
; Logs verfolgen
 
* <code>docker compose logs -f traefik</code>
 
  
 
==DNS==
 
==DNS==
  
Die beiden Hostnamen müssen auf den Docker-Host zeigen:
+
Beide Hostnamen müssen auf den Docker-Host zeigen:
  
 
; Nextcloud
 
; Nextcloud
Zeile 228: Zeile 258:
  
 
; Erstaufruf im Browser
 
; Erstaufruf im Browser
* MediaWiki startet ohne <code>LocalSettings.php</code> mit dem Web-Installer. Als Datenbank-Host <code>db</code>, Datenbank <code>mediawiki</code>, Benutzer <code>mediawiki</code> angeben.
+
* 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.
  
 
; LocalSettings.php einhängen
 
; LocalSettings.php einhängen
* Nach dem Setup wird die generierte <code>LocalSettings.php</code> heruntergeladen, neben das Compose-File gelegt und der auskommentierte Volume-Mount im <code>mediawiki</code>-Service aktiviert. Danach Container neu starten.
+
* 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>
 
* <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