Zero-Cost WordPress: Das perfekte OCI + Caddy Docker-Setup
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
- Architekturübersicht
- Oracle Cloud Firewall & Netzwerk (Ingress Rules)
- WordPress & MySQL mit Docker Compose
- Caddy Reverse Proxy & Auto-SSL Setup
- WordPress Reverse Proxy Anpassung (
wp-config.php) - 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 Anwendungwordpress_db: MySQL 8.0 Datenbankcaddy: 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:
| Source | IP Protocol | Destination Port Range | Zweck |
0.0.0.0/0 | TCP | 80 | HTTP / ACME Challenge |
0.0.0.0/0 | TCP | 443 | HTTPS 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) oderhost.docker.internalweiter.
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:

Leave a Reply