Hier ist ein ausführlicher Blog-Artikel, der den gesamten Einrichtungsprozess – von der Oracle Cloud VM-Sicherheitsgruppe über Docker Compose und Caddy bis hin zu den WordPress-Proxy-Optimierungen – übersichtlich zusammenfasst. Alle sensiblen Daten (IP-Adressen, Passwörter, Domain-Präfixe) wurden unkenntlich gemacht bzw. durch Platzhalter ersetzt.

🚀 WordPress mit automatischem SSL (Caddy) auf Oracle Cloud (OCI) Always Free

In dieser Anleitung schauen wir uns an, wie man eine vollfunktionsfähige, performante und neustartresistente WordPress-Instanz auf einer Oracle Cloud Infrastructure (OCI) „Always Free“ VM aufsetzt. als Reverse Proxy nutzen wir Caddy, der die SSL-Zertifikate von Let’s Encrypt vollautomatisch verwaltet.

📋 Inhaltsverzeichnis

  1. Architekturübersicht
  2. Oracle Cloud Firewall & Netzwerk (Ingress Rules)
  3. WordPress & MySQL mit Docker Compose
  4. Caddy Reverse Proxy & Auto-SSL Setup
  5. WordPress Reverse Proxy Anpassung (wp-config.php)
  6. Neustart-Sicherheit (Reboot Resilience)

1. Architekturübersicht

Anstelle von schweren Control Panels setzen wir auf eine schlanke Docker-Architektur:

  • Host: Oracle Linux (OCI Always Free Instance)
  • Containers:
    • wordpress_app: WordPress Anwendung
    • wordpress_db: MySQL 8.0 Datenbank
    • caddy: Reverse Proxy mit automatischem ACME/SSL Management

2. Oracle Cloud Firewall & Netzwerk (Ingress Rules)

Damit der Webserver aus dem Internet erreichbar ist, müssen die Ports 80 (HTTP) und 443 (HTTPS) in zwei Ebenen geöffnet werden.

A. OCI Security List (Oracle Console)

In der Oracle Cloud Console unter Networking > Virtual Cloud Networks > VCN Details > Security Lists folgende Ingress Rules hinzufügen:

SourceIP ProtocolDestination Port RangeZweck
0.0.0.0/0TCP80HTTP / ACME Challenge
0.0.0.0/0TCP443HTTPS Verschlüsselung

B. OS Firewall (firewalld) auf der VM

Auf der SSH-Konsole der Instance ausführen:

Bash

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

3. WordPress & MySQL mit Docker Compose

Wir erstellen das Docker-Setup für WordPress und die Datenbank.

Ordner anlegen

Bash

mkdir -p ~/wordpress && cd ~/wordpress

~/wordpress/docker-compose.yml

YAML

version: '3.8'

services:
  wordpress_db:
    image: mysql:8.0
    container_name: wordpress_db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: YOUR_ROOT_PASSWORD
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress_user
      MYSQL_PASSWORD: YOUR_DB_PASSWORD
    volumes:
      - db_data:/var/lib/mysql

  wordpress_app:
    image: wordpress:latest
    container_name: wordpress_app
    restart: unless-stopped
    depends_on:
      - wordpress_db
    ports:
      - "127.0.0.1:8080:80" # Nur lokal ansprechbar, Caddy leitet weiter
    environment:
      WORDPRESS_DB_HOST: wordpress_db:3306
      WORDPRESS_DB_USER: wordpress_user
      WORDPRESS_DB_PASSWORD: YOUR_DB_PASSWORD
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html

volumes:
  db_data:
  wp_data:

Starte die Container:

Bash

docker compose up -d

4. Caddy Reverse Proxy & Auto-SSL Setup

Caddy übernimmt das Routing und holt automatisch SSL-Zertifikate von Let’s Encrypt.

Ordner anlegen

Bash

mkdir -p ~/caddy && cd ~/caddy

~/caddy/docker-compose.yml

YAML

version: '3.8'

services:
  caddy:
    image: caddy:latest
    container_name: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    extra_hosts:
      - "host.docker.internal:host-gateway"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config

volumes:
  caddy_data:
  caddy_config:

~/caddy/Caddyfile

Wichtig: Um OCI Hairpin-NAT Probleme mit der öffentlichen IP zu umgehen, leiten wir auf die interne Docker-Bridge IP (172.17.0.1) oder host.docker.internal weiter.

Code-Snippet

YOUR_DOMAIN.duckdns.org {
    reverse_proxy 172.17.0.1:8080 {
        header_up X-Forwarded-Proto https
        header_up Host {host}
    }
}

Starte Caddy:

Bash

docker compose up -d

5. WordPress Reverse Proxy Anpassung (wp-config.php)

Damit WordPress versteht, dass es sich hinter einem HTTPS Reverse Proxy befindet (und keine Redirect-Schleifen auf Port 8080 erzeugt), tragen wir Folgendes in die wp-config.php ein:

PHP

// Führe diesen Code am Anfang der wp-config.php im Container aus:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

define('WP_HOME', 'https://YOUR_DOMAIN.duckdns.org');
define('WP_SITEURL', 'https://YOUR_DOMAIN.duckdns.org');
define('FORCE_SSL_ADMIN', true);

6. Neustart-Sicherheit (Reboot Resilience)

Damit alle Dienste nach einem Server-Neustart (z. B. durch Oracle-Wartungsarbeiten) automatisch wieder hochfahren, sichern wir den Docker-Daemon und die Restart-Policies ab:

Bash

# 1. Docker-Dienst beim Systemstart aktivieren
sudo systemctl enable docker

# 2. Neustart-Policy für alle laufenden Container auf 'unless-stopped' setzen
docker update --restart unless-stopped $(docker ps -q)

🎯 Fazit

Das Setup läuft jetzt vollständig isoliert in Docker, verwendet moderne HTTPS-Verschlüsselung mit automatischem Renewal und übersteht Reboots der Oracle VM ohne manuelles Eingreifen.

Share this content: