You are currently viewing Docker mit WordPress, MySQL und NGINX auf dem Raspberry-Pi

Docker mit WordPress, MySQL und NGINX auf dem Raspberry-Pi

  • Beitrags-Autor:
  • Beitrags-Kategorie:IT

Wie in meinem letzten Artikel bereits erwähnt, hoste ich diese Website wie auch einige andere Seiten auf einem Raspberry-Pi 4 mit 8 GB RAM. Den Zugriff hatte ich ja bereits beschrieben, aber was läuft denn so auf Raspberry-Pi?

Betriebssystem

Das Betriebssystem installiert man am einfachsten auf seine Raspberry-Pi, in dem man den Raspberry Pi Imager verwendet. Das Programm kann man einfach herunterladen, seine SD-Karte für seinen Raspberry Pi in den Kartenleser einlegen, das gewünschte Betriebssystem (ich habe mich für Ubuntu entschieden) wählen und auf die SD-Karte schreiben lassen. Fertig. Nach der Installation und erfolgt der Zugriff per SSH. Am einfachsten schaut man auf seiner FRITZ!-Box nach, welche IP der Raspberry-Pi hat und loggt sich entsprechend ein. Da ich normalerweise auf einem Windows-Rechner arbeite nutze ich den SSH Client Putty und um Dateien zu kopieren das Tool WinSCP.

Docker

Erst einmal müssen wir uns Docker auf dem Raspberry-Pi installieren. Dazu gibt es haufenweise Tutorials im Netz, z.B. hier. Wenn wir das geschafft haben, können wir mal ein Docker Image ausprobieren, z.B. WordPress. Wichtig ist hier darauf zu achten, dass man Docker-Images benötigt, die die arm64 Architektur unterstützen und nicht nur einen x86/x64, da der Raspberry-Pi nun mal über eine Arm-Architektur verfügt und die herkömmlichen Docker-Images daher nicht notwendigerweise kompatibel sind. Das schränkt die Verwendung in bestimmten Bereichen ein, sehr populäre Images gibt es aber auch für diese Architektur. Hier ist einmal ein Beispiel für eine docker-compose.yml für WordPress auf Port 8080 mit einer MySQL Datenbank. Wir können die docker-compose.yml einfach auf unseren Raspberry-Pi kopieren und mit dem Befehl „docker-compose up“ im gleichen Verzeichnis starten. Nun werden alle benötigten Images geladen und die Docker-Container gestartet. Falls ihr beim ersten Zugriff einen Datenbankfehler bekommt, habt einfach noch ein bisschen Geduld. Das einrichten der Datenbank beim ersten Start dauert ein wenig.

version: "3.9"
    
services:
   db-celfers:
    image: mysql/mysql-server
    volumes:
      - db_data_celfers:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: <yourpassword>
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: <yourpassword>
    networks:
     - celfers
    
  wordpress-celfers:
    depends_on:
      - db-celfers
    image: wordpress:5.9
    volumes:
      - wordpress_data_celfers:/var/www/html
    ports:
      - "8080:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db-celfers
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: <yourpassword>
      WORDPRESS_DB_NAME: wordpress
    networks:
     - celfers
volumes:
  db_data_celfers: {}
  wordpress_data_celfers: {}
networks:
  celfers:
   driver: bridge

Über den direkten Aufruf per IP kommen wir nun schon auf unsere WordPressinstanz aus dem internen Netzwerk, z. B. über den Browser per URL http://192.168.178.30:8080/, wobei 192.168.178.30 durch die IP-Adresse von deinem Raspberry-Pi zu ersetzen ist.

NGINX

Nun wollen wir aber noch aus dem Internet heraus zugreifen können und die Verbindung mit SSL/TLS also https absichern. Dazu nutze ich den NGINX Webserver zusammen mit CertBot für die SSL/TLS Zertifikate.

Für die Installation von NGINX gibt es diverse Tutorials im Netz, zum Beispiel hier. Damit ihr eine grobe Vorstellung habt, wie mein NGINX eingerichtet ist, habe ich euch eine ähnliche Konfigurationsdatei, wie ich sie verwende, mitgebracht:

server {
		listen	80;
		client_max_body_size 500M;
		server_name celfers.de www.celfers.de;
		location / {
			proxy_pass	http://127.0.0.1:8080/;
			proxy_redirect off;
			proxy_set_header	Host	$host;
			proxy_set_header	X-Real-IP	$remote_addr;
			proxy_set_header	X-Forwarded-Proto $scheme;
			proxy_set_header	X-Forwarded-For	$proxy_add_x_forwarded_for;
			proxy_set_header	X-Forwarded-Proto $scheme;
			proxy_set_header	X-Original-Request $request_uri;
	}
}

server {
		listen	443;
		client_max_body_size 500M;
		ssl on;
		ssl_certificate /etc/letsencrypt/live/www.celfers.de/fullchain.pem;
		ssl_certificate_key /etc/letsencrypt/live/www.celfers.de/privkey.pem;
		ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
		ssl_ciphers         HIGH:!aNULL:!MD5;
		server_name celfers.de www.celfers.de;
		location / {
			proxy_pass	http://127.0.0.1:8080/;
			proxy_redirect off;
			proxy_set_header	Host	$host;
			proxy_set_header	X-Real-IP	$remote_addr;
			proxy_set_header	X-Forwarded-Proto $scheme;
			proxy_set_header	X-Forwarded-For	$proxy_add_x_forwarded_for;
			proxy_set_header	X-Forwarded-Proto $scheme;
			proxy_set_header	X-Original-Request $request_uri;
	}
}

Eine solche Datei legt ihr in euren nginx Ordner, z. B. in /etc/nginx/sites-available/celfers.de.conf und erzeugt einen symbolic Link auf diese Datei in /etc/nginx/sites-enabled/ (einfach mit dem Befehl sudo ln -s <quelle> <ziel>). Nun werden alle Anfragen auf Port 80 und 443 die vom server „www.celfers.de“ kommen (s. server_name Eintrag) vom nginx weitergeleitet. Mit dem Befehl „sudo nginx -s reload“ könnt ihr übrigens die NGINX Konfigurationsdatei neu laden.

Ich wünsche euch viel Spaß beim Basteln und Ausprobieren! Ich hoffe ihr habt einen Überblick bekommen, was notwendig ist, um einen Docker-Container mit WordPress auf dem Raspberry-Pi mit einem NGINX als Reverse Proxy laufen zu lassen. Über die verlinkten Seiten, solltet ihr auf alle notwendigen Tutorials kommen, um eure Umgebung entsprechend einzurichten. Das Setup ist gut erweiterbar, um weitere WordPressinstanzen oder auch andere Docker-Container, z. B. euren eigenen Java-Minecraft-Server-Container oder auch einen Nextcloud-Container. Ihr könnt also kreativ werden. 😉

Bis zum nächsten Mal,

Carsten Elfers