WordPress mit HTTPS, Traefik & Docker Compose – Einfache 3 Schritte Anleitung

Es gibt viele Wege, WordPress zu hosten – von Managed-Hosting-Lösungen bis zur Selbstinstallation auf einem eigenen Server. In dieser Anleitung zeige ich dir, wie du WordPress sicher und mit HTTPS auf deinem Server betreibst – komplett isoliert via Docker Compose mit Traefik als Reverse Proxy und automatischer Let’s Encrypt-Zertifikatsverwaltung.

Warum nutze ich Docker Compose?

  • All-in-One-Konfiguration: Beschreibe alle notwendigen Dienste (WordPress, Certbot, Reverse Proxy) in einer einzigen `docker-compose.yml`-Datei.
  • Isolation: Keine Abhängigkeiten zu deinem Server – alles läuft in einem Container.
  • Automatisierte HTTPS-Zertifikate: Traefik kümmern sich um SSL/TLS, ohne manuelles Eingreifen.

Es gibt natürlich auch andere Möglichkeiten. Für mich hat sich Docker Compose aber bewährt.

Voraussetzungen

  • Server:
    • Öffentliche IPv4-Adresse
    • SSH-Zugriff
    • Docker und Docker Compose installiert (Anleitung)
  • Domain: Bereits konfigurierte Domain mit korrekter A/AAAA-Record-Zuordnung.
  • Grundkenntnisse: Linux-Befehle, Docker-Grundlagen von Vorteil!

WordPress Docker Compose Setup – Schritt für Schritt

1. `docker-compose.yml` erstellen

Basierend auf meinen bisherigen Erfahrungen und den Herausforderungen, die mir begegnet sind, habe ich die Docker Compose Datei kontinuierlich optimiert und verbessert. Mittlerweile bin ich zufrieden.
Erstelle eine Datei `docker-compose.yml` mit folgendem Inhalt, idealerweise in einem WordPress Ordner:

services:
  traefik:
    image: traefik:latest
    restart: unless-stopped
    container_name: traefik
    command:
      - '--entryPoints.web.address=:80'
      - '--entryPoints.websecure.address=:443'
      - '--providers.docker=true'
      - '--certificatesResolvers.myresolver.acme.httpChallenge=true'
      - '--certificatesResolvers.myresolver.acme.httpChallenge.entryPoint=web'
      - '--certificatesResolvers.myresolver.acme.email=DEINE_EMAIL@deine-domain.de' # 🔴 Mail anpassen
      - '--certificatesResolvers.myresolver.acme.storage=/letsencrypt/acme.json'
      - '--log.level=DEBUG'
      - '--accesslog=true'
      - '--accesslog.fields.defaultmode=keep'
      - '--accesslog.fields.names.ClientAddr=keep'
      - '--accesslog.fields.names.RequestHost=keep'
      - '--accesslog.fields.names.RequestPath=keep'
      - '--accesslog.fields.names.RouterName=keep'
      - '--accesslog.fields.names.ServiceName=keep'
      - '--accesslog.fields.names.EntryPoint=keep'
    ports:
      - '80:80'
      - '443:443'
      - '8080:8080'
    volumes:
      - '/var/run/docker.sock:/var/run/docker.sock:ro'
      - './letsencrypt:/letsencrypt'
  wordpress:
    image: wordpress:latest
    restart: unless-stopped
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: password # 🔴 Passwort anpassen
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - './wp_data:/var/www/html'
    labels:
      # Allgemein
      - 'traefik.enable=true'
      - 'traefik.http.routers.wordpress.rule=Host(`deine-domain.de`) || Host(`www.deine-domain.de`)' # 🔴 Domains anpassen
      # HTTPS aktivieren
      - 'traefik.http.routers.wordpress.entrypoints=websecure'
      - 'traefik.http.routers.wordpress.tls.certresolver=myresolver'
      # HTTP to HTTPS
      - 'traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https'
      - 'traefik.http.routers.wordpress.middlewares=redirect-to-https@docker'
      - 'traefik.http.routers.wordpress-http.rule=Host(`deine-domain.de`) || Host(`www.deine-domain.de`)' # 🔴 Domains anpassen
      - 'traefik.http.routers.wordpress-http.entrypoints=web'
      # HSTS Header
      - 'traefik.http.middlewares.hsts.headers.stsSeconds=31536000'
      - "traefik.http.middlewares.hsts.headers.stsIncludeSubdomains=true"
      - "traefik.http.middlewares.hsts.headers.stsPreload=true"
      - "traefik.http.routers.wordpress.middlewares=hsts@docker"
  db:
    image: mariadb:10.6.4-focal
    restart: unless-stopped
    volumes:
      - './db_data:/var/lib/mysql'
    environment:
      MYSQL_ROOT_PASSWORD: password # 🔴 Passwort anpassen
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: password # 🔴 Passwort anpassen

2. Anpassungen vornehmen

  • Ersetze alle 🔴 markierten Stellen:
    • `DEINE_EMAIL@deine-domain.de` → Deine E-Mail für Let’s Encrypt-Benachrichtigungen.
    • `deine-domain.de` → Deine registrierte Domain.
    • `password` → Starke Passwörter.

3. Docker-Container starten

Führe im Verzeichnis der `docker-compose.yml` folgenden Befehl aus:

docker compose up -d

Überprüfung & Erfolgskontrolle

  1. HTTPS prüfen: Öffne `https://deine-domain.de` – es sollte eine sichere Verbindung (🔒) und die WordPress-Installationsseite erscheinen.
  2. Container-Status:
    docker compose ps
    Alle Services sollten `running` anzeigen.

Fazit

Mit dieser Docker-Compose-Lösung hast du eine sichere und leicht wartbare WordPress-Instanz mit automatischer HTTPS-Verschlüsselung. Das Setup ist ideal für alle, die maximale Kontrolle über ihre Infrastruktur wünschen – ohne komplexe Server-Konfiguration.

Viel Erfolg beim Umsetzen! Hast du Fragen oder Anregungen? Hinterlasse mir gerne einen Kommentar. Möchtest du den Container einfach aktualisieren? Dann findest du hier eine weitere Anleitung.

Schreibe jetzt einen Kommentar!