Wähle einen Artikel
Moodle auf vServer/VPS installieren
Moodle auf vServer/VPS installieren

VPS von dogado - gehostet in Deutschland

Behalte die Kontrolle über deinen vServer/VPS und steuere deine Online-Präsenz souverän. Profitiere von Hochgeschwindigkeits-NVME-SSDs, die bis zu 6-mal schneller sind als herkömmliche.

Server-Racks mit blauer Beleuchtung, Frontpaneele mit Laufwerkschächten, Lüftungsgitter und Netzwerkausrüstung.

0. Überblick

1. Moodle installieren

1.1 Einleitung

Moodle (https://moodle.org) ist eine Open-Source-Kurs- und -Lernplattform. Viele Schulen und Universitäten nutzen die Plattform. In Moodle lassen sich Kurse, Nutzer und Inhalte einfach verwalten. Ebenfalls gibt es viele Plugins, durch die Moodle erweitert werden kann.

1.2 Infos zu yml-Dateien

Bei yml-Dateien ist es sehr wichtig, dass die Zeilen alle richtig eingerückt sind. Die Zeilen MÜSSEN immer mit der Leertaste eingerückt werden. Es dürfen KEINE Tabs enthalten sein. Ihr könnt den nachfolgenden Code immer online „überprüfen“ lassen. Die meisten Fehler entstehen nämlich durch die falsche Formatierung. Ein Dienst zum Überprüfen ist zum Beispiel: https://codebeautify.org/yaml-validator

1.3 Vorbereitung

Diese Anleitung basiert auf dem aktuellen Betriebssystem Debian 13. Moodle werden wir unter Docker realisieren. Dies ermöglicht uns später sehr schnelle Updates und eine schnelle Installation.

Um Moodle neben anderen Diensten auf unserem Server betreiben zu können, nutzen wir hier den Reverse Proxy Traefik. Die Anleitung dazu findet ihr hier: Traefik Reverseproxy auf vServer installieren

1.3.1 Verzeichnis erstellen

Wir erstellen uns ein neues Verzeichnis, in welchem wir später alle Daten von Moodle abspeichern. Dazu gebt ihr Folgendes in der Konsole ein:

mkdir -p /opt/containers/moodle/{database,moodledata,html}

Ihr könnt hier auch ein anderes Verzeichnis verwenden. Dann müsst ihr aber die gesamte Anleitung entsprechend anpassen.

Nun müsst ihr noch die Rechte der Ordner anpassen. Dazu gebt ihr Folgendes ein:

chown 65534:65534 /opt/containers/moodle/moodledata /opt/containers/moodle/html

Dies ist notwendig, da Moodle aus Sicherheitsgründen unter dem Benutzer mit der ID 65534 läuft.

1.3.2 docker-compose.yml erstellen

Nun können wir mit der eigentlichen „Installation“ von Moodle beginnen. Dazu öffnet ihr folgende Datei:

nano /opt/containers/moodle/docker-compose.yml

Nun kopiert ihr folgenden Code in die Datei. Dieser Code ist unser Bauplan für die Moodle-Container.

services:
  moodle-db:
    image: mariadb:11.8
    container_name: moodle-db
    restart: unless-stopped
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      - TZ=Europe/Berlin
      - MARIADB_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - MARIADB_DATABASE=moodle
      - MARIADB_USER=moodle
      - MARIADB_PASSWORD=${DB_PASSWORD}
      - MARIADB_AUTO_UPGRADE=1
    volumes:
      - ./database:/var/lib/mysql
    networks:
      - default

  moodle:
    image: erseco/alpine-moodle:v5.3.0
    container_name: moodle
    restart: unless-stopped
    depends_on:
      - moodle-db
    environment:
      - SITE_URL=https://${MOODLE_DOMAIN}
      - SSLPROXY=true
      - DB_TYPE=mariadb
      - DB_HOST=moodle-db
      - DB_PORT=3306
      - DB_NAME=moodle
      - DB_USER=moodle
      - DB_PASS=${DB_PASSWORD}
      - MOODLE_USERNAME=${MOODLE_ADMIN_USER}
      - MOODLE_PASSWORD=${MOODLE_ADMIN_PASSWORD}
      - MOODLE_EMAIL=${MOODLE_ADMIN_EMAIL}
      - MOODLE_SITENAME=Moodle
      - MOODLE_LANGUAGE=de
      - SMTP_HOST=${SMTP_HOST}
      - SMTP_PORT=${SMTP_PORT}
      - SMTP_USER=${SMTP_USER}
      - SMTP_PASSWORD=${SMTP_PASSWORD}
      - SMTP_PROTOCOL=${SMTP_PROTOCOL}
      - MOODLE_MAIL_NOREPLY_ADDRESS=${MOODLE_NOREPLY}
      - client_max_body_size=200M
      - post_max_size=200M
      - upload_max_filesize=200M
      - POST_CONFIGURE_COMMANDS=php /var/www/html/admin/cli/cfg.php --name=timezone --set=Europe/Berlin && php /var/www/html/admin/cli/cfg.php --name=country --set=DE
    volumes:
      - ./moodledata:/var/www/moodledata
      - ./html:/var/www/html
    networks:
      - proxy
      - default
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=proxy"
      - "traefik.http.routers.moodle.rule=Host(`${MOODLE_DOMAIN}`)"
      - "traefik.http.routers.moodle.entrypoints=websecure"
      - "traefik.http.routers.moodle.middlewares=moodle-headers"
      - "traefik.http.services.moodle.loadbalancer.server.port=8080"
      - "traefik.http.middlewares.moodle-headers.headers.stsSeconds=31536000"
      - "traefik.http.middlewares.moodle-headers.headers.stsIncludeSubdomains=true"
      - "traefik.http.middlewares.moodle-headers.headers.stsPreload=true"
      - "traefik.http.middlewares.moodle-headers.headers.contentTypeNosniff=true"

networks:
  proxy:
    external: true

Infos zu den Parametern

  • Moodle-Version:

Hier ist bewusst die Moodle-Version 5.3 gewählt, da es sich dabei um eine LTS-Version mit Sicherheitsupdates bis zum 01.10.2029 (https://moodledev.io/general/releases) handelt. Ihr könnt auch „latest“ verwenden, um immer die aktuellste Version zu nutzen. Im Kapitel 6 findet ihr mehr Informationen zum Thema Updates.

  • Dateigröße:

Hier wird festgelegt, wie groß eine Datei (zum Beispiel Video) maximal sein darf. Dies wurde hier auf 200 MB beschränkt. Diesen Wert könnt ihr nach Belieben verändern:

      - client_max_body_size=200M
      - post_max_size=200M
      - upload_max_filesize=200M

1.3.3 Konfigurationsskript erstellen

Damit ihr nicht selbst die Passwörter und Domain von Hand eintragen müsst, nutzen wir ein kleines Skript, welches uns hilft. Dazu erstellt ihr euch eine neue Datei:

nano /opt/containers/moodle/setup.sh

Inhalt:

#!/bin/bash

cd /opt/containers/moodle

read -rp "Domain für Moodle (z. B. moodle.euredomain.de): " DOMAIN
read -rp "E-Mail-Adresse des Administrators: " EMAIL

cat > .env <<EOF
MOODLE_DOMAIN=${DOMAIN}
MOODLE_ADMIN_USER=admin
MOODLE_ADMIN_PASSWORD=$(openssl rand -hex 12)
MOODLE_ADMIN_EMAIL=${EMAIL}
DB_ROOT_PASSWORD=$(openssl rand -hex 24)
DB_PASSWORD=$(openssl rand -hex 24)
SMTP_HOST=
SMTP_PORT=587
SMTP_USER=
SMTP_PASSWORD=
SMTP_PROTOCOL=tls
MOODLE_NOREPLY=${EMAIL}
EOF

chmod 600 .env

echo
echo "Fertig. Moodle wird unter https://${DOMAIN} erreichbar sein."

Anschließend startet ihr das Skript:

bash /opt/containers/moodle/setup.sh

So sieht die Ausgabe des Skriptes aus:

Domain für Moodle (z. B. moodle.euredomain.de): moodle.testbereich.net
E-Mail-Adresse des Administrators: admin@testbereich.net

Fertig. Moodle wird unter https://moodle.testbereich.net erreichbar sein.

Überprüft noch, ob die Datei korrekt angelegt wurde. Dazu gebt ihr folgenden Befehl ein:

cat /opt/containers/moodle/.env

Die Ausgabe sollte so aussehen:

cat /opt/containers/moodle/.env
MOODLE_DOMAIN=moodle.testbereich.net
MOODLE_ADMIN_USER=admin
MOODLE_ADMIN_PASSWORD=092b00a4dd8bebd4d16ab2a5
MOODLE_ADMIN_EMAIL=admin@testbereich.net
DB_ROOT_PASSWORD=8df8f6a5a61a8158e0812d1dfd5d73446ac50b4fa5d9ba70
DB_PASSWORD=42d93f6546d44c94956bd038c4d09c48fa97ccde7b284860
SMTP_HOST=
SMTP_PORT=587
SMTP_USER=
SMTP_PASSWORD=
SMTP_PROTOCOL=tls
MOODLE_NOREPLY=admin@testbereich.net

Hier findet ihr auch euer Admin-Kennwort. Ihr könnt es so verwenden oder abändern. Wichtig: Nicht alle Sonderzeichen werden im Kennwort unterstützt. Sollte es hier zu einem Problem kommen, bricht später die Einrichtung ab. Daher verwendet ihr idealerweise nur Buchstaben und Zahlen.

Ebenfalls könnt ihr den Benutzernamen des Administrators ändern. Dieser Name darf aber nur aus Kleinbuchstaben und Zahlen bestehen. Diese Daten werden bei jedem Neustart des Containers übernommen. Solltet ihr also später auf der Webseite euer Kennwort ändern, so wird es nach einem Neustart des Containers auf den Wert in der .env-Datei zurückgesetzt.

1.3.4 Docker Compose überprüfen

Mit einem kurzen Befehl könnt ihr überprüfen, ob die Docker-Compose-Datei formal korrekt ist:

cd /opt/containers/moodle
docker compose config --quiet && echo "Syntax OK"

Die Ausgabe sollte „Syntax OK“ sein, wenn alles korrekt formatiert ist.

2. Moodle starten

Gebt nun Folgendes ein, um eure Moodle-Container zu starten:

cd /opt/containers/moodle
docker compose up -d

Beim ersten Start des Containers wird Moodle initialisiert. Dies bedeutet, dass die Datenbank eingerichtet, eure Einstellungen übernommen werden und vieles mehr. Daher dauert es einige Minuten, bis Moodle im Browser erreichbar ist.

Den aktuellen Status könnt ihr mit folgendem Befehl verfolgen:

docker compose logs -f moodle

Wartet so lange, bis ihr Folgendes in der Konsole seht: „Die Installation wurde erfolgreich abgeschlossen“.

Terminalfenster mit blauem Text moodle und weißen Statusmeldungen, z. B. Die Installation wurde erfolgreich abgeschlossen.

Jetzt könnt ihr die Ausgabe mit „STRG+C“ beenden. Geht nun mit eurem Webbrowser auf eure Webseite (z. B. moodle.euredomain.de). Das sollte so aussehen.

Linke Hälfte: Fensterausschnitt mit blauem Schild 'Willkommen bei Moodle'. Rechte Hälfte: weißes Moodle-Anmeldeformular.

Meldet euch mit euren Zugangsdaten aus Schritt 1.3.3 an. Jetzt seid ihr im Backend von Moodle und könnt diverse Einstellungen anpassen:

Moodle-Administrationsseite mit Registrierungsformular: Felder für Organisationsname, Organisationsart, Sprache, Land, E‑Mail.

Hier könnt ihr noch eine Beschreibung, den Namen sowie weitere Sachen anpassen.

3. E-Mail-Versand einrichten

Um Moodle vollständig nutzen zu können, müsst ihr noch einen E-Mail-Server hinterlegen. Dies ist notwendig, um zum Beispiel Kennwörter per E-Mail zurückzusetzen oder Benutzer an Termine zu erinnern. Hier könnt ihr euren bisherigen E-Mail-Server verwenden oder euch mit unserer Anleitung einen eigenen Mailserver mittels mailcow realisieren.

Öffnet folgende Datei, um eure E-Mail-Zugangsdaten einzugeben:

nano /opt/containers/moodle/.env

Hier findet ihr folgende Parameter:

SMTP_HOST=
SMTP_PORT=587
SMTP_USER=
SMTP_PASSWORD=
SMTP_PROTOCOL=tls

So könnte eine Beispielkonfiguration aussehen:

SMTP_HOST=mail.euredomain.de
SMTP_PORT=587
SMTP_USER=moodle@euredomain.de
SMTP_PASSWORD='euer-postfach-passwort'
SMTP_PROTOCOL=tls
MOODLE_NOREPLY=moodle@euredomain.de

Bei „MOODLE_NOREPLY“ tragt ihr die identische Adresse wie bei „SMTP_USER“ ein, da es sonst zu Problemen mit eurem Mailserver kommen kann.

Setzt das Passwort in einfache Anführungszeichen. So dürfen darin auch Sonderzeichen wie $ oder # vorkommen. Verwendet euer Anbieter Port 465, tragt ihr bei SMTP_PORT den Wert 465 und bei SMTP_PROTOCOL den Wert ssl ein. Nun startet ihr den Container neu, damit die Änderungen übernommen werden:

cd /opt/containers/moodle
docker compose up -d

Nachdem der Container gestartet ist, geht ihr in Moodle in folgenden Bereich: „Website-Administration“ → „Server“ → „E-Mail“ → „Ausgehende E-Mails“:

Screenshot einer Moodle-Website-Administration; orange markierter Titel 'Website-Administration' und Server-Linkliste.

Hier seht ihr nun die Einstellungen, die ihr in der .env-Datei getätigt habt. Solltet ihr hier einen Fehler sehen, so ändert ihn NICHT im Webinterface, sondern in der .env-Datei. Wie beim Administrator-Kennwort werden diese Einstellungen bei jedem Containerstart auf die Werte der .env-Datei zurückgesetzt.

Scrollt weiter nach unten, bis ihr „Test für ausgehende E-Mails“ findet:

Screenshot einer E-Mail-Einstellungen-Seite mit der Überschrift 'Test für ausgehende E-Mails', Hinweistext und blauem Link.

Gebt hier nun eine Empfängeradresse sowie Absenderadresse an. Als Absenderadresse holt ihr eure „SMTP_USER“-Adresse aus der .env-Datei.

Moodle-Seite mit Kopfzeile, Navigationsmenü, Überschrift 'Test für ausgehende E-Mails', drei Felder und zwei Buttons.

Wenn der E-Mail-Versand korrekt funktioniert hat, erhaltet ihr folgende Meldung auf der Webseite:

Grünes Hinweisfenster: Die Website hat erfolgreich eine Testnachricht an den E-Mail-Server gesendet; Von: und An: Adressen

Zudem erhaltet ihr noch eine solche E-Mail:

Screenshot einer Moodle-Testmitteilung; Titel mit Datum 16. October 2026, 12:41:19; Text zur Prüfung der E-Mails.

4. Sprachpakete installieren

Deutsch und Englisch sind bereits als Sprachpakete vorinstalliert. Solltet ihr noch weitere Sprachen benötigen, könnt ihr diese einfach hinzufügen. Geht dazu in folgenden Bereich: „Website-Administration“ → „Allgemein“ → „Sprache“ → „Sprachpakete“

Moodle-Website-Administration: Oberes Menü mit markierter Website-Administration und hervorgehobener Website registrieren

Hier könnt ihr beliebige weitere Sprachen installieren:

Screenshot einer Moodle-Seite zur Sprachpakete-Verwaltung mit zwei Listen: Installierte und Verfügbare Sprachpakete.

5. Moodle sichern und wiederherstellen

5.1 Moodle-Sicherung erstellen

Durch den Einsatz von Docker habt ihr den Vorteil, dass alle wichtigen Daten wie die Datenbank, Konfigurationsdateien sowie Benutzerdaten in einem Verzeichnis liegen. Ihr könnt also einfach dieses Verzeichnis sichern und habt ein komplettes Backup. Damit ihr dies nicht von Hand machen müsst, wollen wir hier ein Skript verwenden. Zuerst legen wir noch ein Verzeichnis an, in dem unsere Backups liegen werden:

mkdir -p /opt/containers/moodle-backup

Dies ist notwendig, da wir sonst unsere Backups immer wieder mitsichern würden.

Legt folgende Datei für das Skript an:

nano /opt/containers/moodle/backup.sh

Inhalt:

#!/bin/bash

MOODLE=/opt/containers/moodle         # Moodle-Verzeichnis
LOKAL=/opt/containers/moodle-backup   # Hier entsteht das Archiv

DATUM=$(date +%F_%H-%M)
ARCHIV=moodle-${DATUM}.tar.gz

cd "$MOODLE"
mkdir -p "$LOKAL"

echo "Wartungsmodus einschalten ..."
docker exec moodle php /var/www/html/admin/cli/maintenance.php --enable

echo "Container stoppen ..."
docker compose stop

echo "Archiv erstellen ..."
tar -czf "$LOKAL/$ARCHIV" -C "$(dirname "$MOODLE")" "$(basename "$MOODLE")"
chmod 600 "$LOKAL/$ARCHIV"

echo "Container starten ..."
docker compose start
sleep 60
docker exec moodle php /var/www/html/admin/cli/maintenance.php --disable

echo "Lokale Archive älter als 7 Tage löschen ..."
find "$LOKAL" -name 'moodle-*.tar.gz' -mtime +7 -delete

echo "Fertig: $LOKAL"

Das Skript löscht alle Backups im Verzeichnis, welche älter als 7 Tage sind. Diese Funktion könnt ihr ändern, indem ihr folgende Zeile anpasst:

find "$LOKAL" -name 'moodle-*.tar.gz' -mtime +7 -delete

Wenn ihr die Zeile komplett löscht, bleiben die Backups ewig erhalten. Ebenfalls könnt ihr auch die „7“ zum Beispiel auf „30“ erhöhen, um die Backups der letzten 30 Tage zu haben.

Jetzt könnt ihr das Skript starten:

bash /opt/containers/moodle/backup.sh

Die Ausgabe sollte dann so aussehen:

Dunkles Terminalfenster mit Befehlen zum Moodle-Backup; Statusmeldungen wie 'Stopped' und 'Started' neben Containernamen.

Anschließend überprüft ihr, ob die Sicherung existiert:

ls -l /opt/containers/moodle-backup

Hier sollte nun euer Backup zu sehen sein:

ls -l /opt/containers/moodle-backup
total 130240
-rw------- 1 root root 133365241 Oct 15 15:07 moodle-2026-10-15_15-07.tar.gz

Es kann sinnvoll sein, die Datei noch an einen anderen Ort zu sichern, falls der komplette Server einen Fehler hat.

5.2 Sicherung wiederherstellen

Um eine Sicherung wiederherzustellen, beendet ihr zuerst die aktuelle Instanz von Moodle:

cd /opt/containers/moodle
docker compose down

Anschließend könnt ihr die bisherige Instanz löschen oder umbenennen. Umbenennen hat den Vorteil, dass ihr später noch darauf zugreifen könnt.

Umbenennen:
mv /opt/containers/moodle /opt/containers/moodle-alt

Löschen:
rm -R /opt/containers/moodle

Nun stellt ihr das Backup wieder her. Dazu ermittelt ihr zuerst den Namen des Backups:

ls -l /opt/containers/moodle-backup

In meinem Fall lautet der Name „moodle-2026-10-15_15-07.tar.gz“.

ls -l /opt/containers/moodle-backup
total 130240
-rw------- 1 root root 133365241 Oct 15 15:07 moodle-2026-10-15_15-07.tar.gz

Dieses Backup stelle ich nun wieder her. Ihr müsst den Namen entsprechend bei euch anpassen:

tar -xzpf /opt/containers/moodle-backup/moodle-2026-10-15_15-07.tar.gz --numeric-owner -C /opt/containers

Jetzt könnt ihr Moodle starten:

cd /opt/containers/moodle
docker compose up -d

Wartet einen kurzen Moment und beendet anschließend den Wartungsmodus, welchen das Backupskript aktiviert hat.

docker exec moodle php /var/www/html/admin/cli/maintenance.php --disable

6. Moodle aktualisieren

Mittels Docker lässt sich Moodle sehr einfach updaten. Es reicht, die Versionsnummer in der Docker-Compose-Datei auszutauschen. Einen Überblick über die verfügbaren Moodle-Images bekommt ihr hier: https://hub.docker.com/r/erseco/alpine-moodle/tags

Zusätzlich könnt ihr euch hier informieren, wie lange welche Version unterstützt wird: https://moodledev.io/general/releases

Ebenfalls seht ihr auf dieser Seite die Release Notes zu allen Versionen. Ihr solltet euch diese vor dem Update durchlesen und grundsätzlich vor jedem Update ein Backup erstellen.

Nachdem ihr euch für eine Version entschieden habt, öffnet ihr diese Datei:

nano /opt/containers/moodle/docker-compose.yml

Dort passt ihr nur folgende Zeile an:

  moodle:
    image: erseco/alpine-moodle:v5.3.0

Jetzt könnt ihr das Image herunterladen und starten:

cd /opt/containers/moodle/
docker compose down
docker compose pull 
docker compose up -d

Nach dem Start schaut ihr euch das Log an, um zu verifizieren, dass alles korrekt läuft:

docker compose logs -f moodle
Nächster Artikel
MongoDB auf vServer/VPS installieren
Weitere passende Themen
Finde den passenden vServer zu deinem Projekt