Die Lernplattform Moodle ist das weltweit führende Open-Source-Learning-Management-System (LMS). Diese Anleitung dokumentiert die Installation der aktuellen Version Moodle 5.0 auf einem Ubuntu-basierten System.
Wir verwenden dabei eine moderne und performante Technologiekombination: den Apache-Webserver, PHP 8.4 in der schnellen FPM-Implementierung und die robuste PostgreSQL Datenbank. Zusätzlich integrieren wir den Open-Source-Virenscanner ClamAV direkt in das Setup, um die Sicherheit hochgeladener Dateien zu gewährleisten.
Die in dieser Anleitung beschriebenen Schritte wurden mit größtmöglicher Sorgfalt zusammengestellt und in einer Testumgebung geprüft. Dennoch können wir keine Gewähr für die Vollständigkeit, Richtigkeit oder Aktualität der Inhalte übernehmen.
Die Umsetzung der beschriebenen Konfigurationen erfolgt ausschließlich auf eigene Verantwortung und Gefahr. Vor Änderungen an Servern oder Datenbanken sollten Sie stets vollständige Backups anlegen und die Schritte zunächst in einer Test- oder Staging-Umgebung prüfen.
Wir übernehmen keine Haftung für direkte oder indirekte Schäden, Datenverluste, Sicherheitslücken oder Ausfallzeiten, die durch die Verwendung dieser Anleitung entstehen könnten.
Fertige Lernplattform statt Bastellösung.
Wenn Sie sich nicht selbst um Installation, Updates und Sicherheit kümmern möchten, richten wir Ihnen gerne eine betriebsbereite, DSGVO-konforme Lernplattform ein – inklusive Server, Backup-Konzept und technischer Wartung. Sie konzentrieren sich auf Inhalte und Schulungen, wir kümmern uns um den Rest.
Was sind die Vorteile dieses modernen Setups?
Die bewusste Wahl der Komponenten bietet erhebliche Vorteile hinsichtlich Sicherheit, Performance und Wartbarkeit im Produktivbetrieb:
- PHP 8.4 FPM: Die neueste PHP-Version bietet nicht nur erhebliche Geschwindigkeitssteigerungen im Vergleich zu älteren Versionen (z. B. 7.x oder 8.2), sondern auch wichtige Sicherheits-Patches und Verbesserungen der Code-Qualität. Durch FPM (FastCGI Process Manager) wird die PHP-Ausführung effizient vom Webserver entkoppelt.
- PostgreSQL: PostgreSQL gilt als eine der sichersten und funktionsreichsten Open-Source-Datenbanken. Im Gegensatz zu MySQL/MariaDB nutzt es in modernen Installationen standardmäßig die sichere SCRAM-SHA-256-Authentifizierung, was die Datenintegrität und den Schutz von Passwörtern verbessert.
- ClamAV-Integration: Die direkte Einbindung von ClamAV sorgt dafür, dass alle über Moodle hochgeladenen Dateien automatisch auf Viren und Malware gescannt werden. Dies ist ein essenzieller Baustein für eine sichere Lernumgebung.
Warum nutzen wir hier (noch) kein Docker?
Wir haben uns bewusst gegen die sofortige Dockerisierung in diesem ersten Schritt entschieden. Dies dient der Schaffung einer transparenten und belastbaren Grundlage für den stabilen Produktivbetrieb.
Die Gründe sind pragmatisch:
- Kein offizielles Produktiv-Setup: Moodle bietet kein offizielles, für den Produktionseinsatz vorgesehenes Docker-Compose-Setup an. Produktive Setups variieren stark (z. B. bezüglich Backup, HA, Storage).
- Verständnis der Architektur: Eine klassische Installation macht essenzielle Moodle-Aspekte wie die Dateistruktur (moodledata), Berechtigungen, Cronjobs und Backup-Strategien direkt auf dem Betriebssystem transparent.
- Vorbereitung für Phase 2: Nach erfolgreicher Dokumentation der Betriebsprozesse kann dieses Wissen gezielt in eine eigene, robuste, und wartbare Docker-Lösung (Phase 2) übersetzt werden, anstatt blind ein generisches Drittanbieter-Setup zu übernehmen.
Auf Basis der jetzt dokumentierten Betriebsprozesse (Volumes, Backups, Cron, ClamAV, Upgrade-Pfad) bauen wir ein eigenes, wartbares Docker-Setup (Compose/Dokploy). Ziel: reproduzierbare Deployments, Rollbacks, Healthchecks, getrennte Volumes, Logging/Monitoring – ohne die Risiken generischer Third-Party-Stacks.
Wie wird die Installation Schritt für Schritt durchzuführen?
Stellen Sie sicher, dass Sie über einen Ubuntu-Server mit sudo-Rechten verfügen. Die folgenden Schritte werden in chronologischer Reihenfolge ausgeführt.
System-Updates und PHP 8.4 Vorbereitung
Führen Sie zunächst ein Systemupdate durch, installieren Sie den Apache-Webserver und binden Sie das Sury-Repository ein, um das aktuellste PHP 8.4 zu erhalten.
# System aktualisieren und Apache installieren
sudo apt update && sudo apt upgrade -y
# Apache2 installieren
sudo apt install apache2 -y
Debian (Trixie)
# Tools zur Repository-Verwaltung installieren
sudo apt install -y dirmngr ca-certificates curl apt-transport-https lsb-release
# GPG-Schlüssel und Sury-Repository für PHP 8.4 hinzufügen
curl -sSL https://packages.sury.org/php/apt.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/sury-php.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/sury-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list
# Paketliste aktualisieren, um PHP 8.4 zu finden
sudo apt update
Für Debian
Ubuntu (24.04)
sudo apt install -y software-properties-common ca-certificates curl lsb-release apt-transport-https
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
Für Ubuntu
Brauchen Sie Unterstützung?
Wenn Sie sich bei der Umsetzung der Schritte unsicher sind oder eine individuelle, zu Ihrer Umgebung passende Lösung wünschen, kontaktieren Sie uns gerne unverbindlich. Wir prüfen Ihre Anforderungen, unterstützen bei der Einrichtung von Server, Datenbank & Sicherheit und finden gemeinsam eine passende Lösung für Ihre Praxis oder Ihr Unternehmen.
PHP 8.4 und Moodle-Abhängigkeiten installieren
Wir installieren PHP 8.4 FPM zusammen mit allen notwendigen Moodle-Erweiterungen. Besonders wichtig sind der PostgreSQL-Treiber (php8.4-pgsql) und die explizite Installation des ClamAV-Daemon.
# PHP 8.4 FPM und Moodle-Erweiterungen (PostgreSQL-Treiber) installieren
sudo apt install -y \
php8.4 \
php8.4-cli \
php8.4-fpm \
php8.4-pgsql \
php8.4-curl \
php8.4-gd \
php8.4-intl \
php8.4-mbstring \
php8.4-xml \
php8.4-zip \
php8.4-soap \
php8.4-opcache \
php8.4-common
# Zusätzliche Moodle-Abhängigkeiten (inklusive ClamAV-Daemon)
sudo apt install -y graphviz aspell ghostscript clamav clamav-daemon git
# Sicherstellen, dass ältere, inkompatible PHP-Versionen entfernt werden
sudo apt remove --purge -y php8.2* php8.3*
# PHP 8.4 FPM Konfiguration in Apache aktivieren und Dienste neu starten
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.4-fpm
sudo systemctl restart apache2
PostgreSQL-Datenbank einrichten
Moodle benötigt eine robuste Datenbank, um alle Nutzerdaten, Kursstrukturen und Aktivitäten zuverlässig zu speichern. Wir entscheiden uns für PostgreSQL, da es für seine Stabilität und hervorragende Performance unter Last bekannt ist.
Für die Bereitstellung haben wir drei Ansätze evaluiert:
1. native Installation auf demselben Host,
2. Betrieb als Docker-Container und
3. Containerbereitstellung über das Deployment-Tool Dokploy.
Im Folgenden stellen wir alle drei Varianten vor, damit Sie den für Ihre Umgebung passenden Weg wählen können.
Native Installation auf demselben Host
Der erste Schritt ist die Installation des Datenbankservers selbst.
sudo apt install postgresql postgresql-contrib
postgresql: Installiert den PostgreSQL-Serverkern und die notwendigen Programme.postgresql-contrib: Fügt nützliche Erweiterungen und Zusatzmodule hinzu, die in der Praxis oft benötigt werden.
Datenbank-Benutzer und -Datenbank erstellen
Nach der Installation läuft der PostgreSQL-Dienst im Hintergrund. Wir müssen nun einen speziellen Benutzer und eine dedizierte Datenbank für Moodle einrichten. Dies gewährleistet, dass Moodle isolierte Zugriffsrechte besitzt, was ein wichtiges Sicherheitsprinzip darstellt.
# Wechsel zum postgres-Benutzer und psql-Kommandozeile aufrufen
sudo -u postgres psql
Wir wechseln zum Standard-Administrationsbenutzer von PostgreSQL (postgres), um administrative Befehle ausführen zu können. Der Befehl psql öffnet die interaktive Kommandozeile der Datenbank.
Die SQL-Befehle im Detail
Im psql-Prompt führen Sie die folgenden Befehle aus. Denken Sie daran, EXAMPLE_PASS durch ein komplexes, sicheres Passwort zu ersetzen!
A. Benutzer erstellen
CREATE USER "moodle_user" WITH ENCRYPTED PASSWORD 'EXAMPLE_PASS';
CREATE USER "moodle_user": Erstellt den neuen Datenbankbenutzer, der später von Moodle verwendet wird, um sich mit der Datenbank zu verbinden.WITH ENCRYPTED PASSWORD 'EXAMPLE_PASS': Legt das Passwort fest. PostgreSQL speichert dieses Passwort sicher, wobei moderne Versionen automatisch das sichere SCRAM-SHA-256-Verfahren verwenden.
B. Datenbank erstellen und kodieren
CREATE DATABASE moodle OWNER "moodle_user" ENCODING 'UTF8' LC_COLLATE 'C' LC_CTYPE 'C' TEMPLATE template0;
Dieser Befehl ist entscheidend für die Unicode-Unterstützung und die korrekte Sortierung:
CREATE DATABASE moodle: Erstellt die eigentliche Datenbank.OWNER "moodle_user": Weist den zuvor erstellten Moodle-Benutzer als Eigentümer der Datenbank zu.ENCODING 'UTF8': Dies ist das PostgreSQL-Äquivalent zumutf8mb4von MySQL und stellt sicher, dass alle Unicode-Zeichen (einschließlich Emojis und komplexe Alphabete) korrekt gespeichert werden können.LC_COLLATE 'C' LC_CTYPE 'C': Diese Einstellung stellt sicher, dass die Datenbank sprachneutral sortiert und vergleicht. Dies ist für Moodle wichtig, um Kompatibilitätsprobleme in verschiedenen Sprachen zu vermeiden.
C. Berechtigungen erteilen
GRANT ALL PRIVILEGES ON DATABASE moodle TO "moodle_user";
Dieser Befehl erteilt dem moodle alle Rechte, die er benötigt, um Tabellen zu erstellen, Daten zu lesen, zu schreiben und zu aktualisieren.
D. Kommandozeile verlassen
\q
Schließt die psql-Sitzung und kehrt zur normalen Shell zurück.
Nach diesen Schritten ist die Datenbank-Basis für Moodle 5.0 mit dem sicheren und Unicode-fähigen PostgreSQL erfolgreich eingerichtet.
Betrieb als Docker-Container
Wir erstellen ein docker-compose.yml, das die beim nativen Setup erläuterten Einstellungen übernimmt und damit einen gleichwertig konfigurierten Container bereitstellt.
services:
db:
image: postgres:17.6
container_name: moodle-postgres
restart: unless-stopped
environment:
POSTGRES_USER: moodle_user
POSTGRES_PASSWORD: EXAMPLE_PASS
POSTGRES_DB: moodle
POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=C.UTF-8"
LANG: C.UTF-8
LC_ALL: C.UTF-8
ports:
- "5432:5432"
volumes:
- /var/docker/moodle/postgres_data:/var/lib/postgresql/data
- ./initdb/01-grants.sql:/docker-entrypoint-initdb.d/01-grants.sql:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U moodle_user -d moodle"]
interval: 10s
timeout: 5s
retries: 5Die in diesem Abschnitt erläuterte Initialisierung (Berechtigungen) führen wir mithilfe eines SQL-Init-Skripts (01-grants.sql) aus.
-- Rechte f r Moodle-DB
ALTER DATABASE moodle OWNER TO moodle_user;
GRANT ALL PRIVILEGES ON DATABASE moodle TO moodle_user;
-- (optional, aber sinnvoll ^`^s wenn die DB frisch ist)
\c moodle
ALTER SCHEMA public OWNER TO moodle_user;
GRANT USAGE ON SCHEMA public TO moodle_user;
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
Datenbankbereitstellung mit Dokploy
Wir gehen davon aus, dass Sie bereits ein Projekt im Dokploy angelegt haben.
Folgen Sie den Schritte in den Bildern.
Schritt 1: Wählen Sie unter Create Service "Database" aus.

Schritt 2: Wählen Sie nun PostgreSQL als Datenbanktyp aus. Tragen Sie anschließend alle wichtigen Details ein, wie den Datenbanknamen, den Datenbankbenutzer und das Datenbank-Passwort. Überprüfen Sie die weiteren Einstellungen und klicken Sie abschließend auf Datenbank erstellen (Create Database).

- Konfiguration ist erstellt

- Klicken Sie nun auf die gerade erstellte Konfiguration, um die Detailansicht zu öffnen.

Schritt 3 : Um die Umgebungsvariablen für die Datenbank festzulegen, wechseln Sie zum Reiter Environment und tragen den Code-Snippet unten ein.
POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=C.UTF-8"
LANG: C.UTF-8
LC_ALL: C.UTF-8
Schritt 4: Wechseln Sie nun zum Tag Advanced und binden die Volumes, wie hier beschrieben an.

- Wechseln Sie anschließend zum Bereich
Bind Mount. Fügen Sie die untenstehenden Volume-Details ein, um das Volume einzubinden. Speichern Sie anschließend Ihre Eingabe im AbschnittBind Mount.
cd /var/docker/
sudo mkdir moodle
cd moodle/
sudo mkdir postgres_data
sudo mkdir init_db
# Host Path
/var/docker/moodle/postgres_data
# Mount Path (In the container)
/var/lib/postgresql/data- Klicken Sie erneut auf Volume hinzufügen (Add Volume) und wechseln Sie dann zum File Mount-Bereich. Kopieren Sie die unten stehenden Einträge und fügen Sie diese in den Content-Abschnitt (Inhalt) ein.
-- Rechte f r Moodle-DB
ALTER DATABASE moodle OWNER TO moodle_user;
GRANT ALL PRIVILEGES ON DATABASE moodle TO moodle_user;
-- (optional, aber sinnvoll ^`^s wenn die DB frisch ist)
\c moodle
ALTER SCHEMA public OWNER TO moodle_user;
GRANT USAGE ON SCHEMA public TO moodle_user;
REVOKE CREATE ON SCHEMA public FROM PUBLIC;File Path - /var/docker/moodle/init_db/01-grants.sql
Mount Path(In the container) - /docker-entrypoint-initdb.d/01-grants.sql
- Sobald beide Volumes (Bind Mount und File Mount) hinzugefügt wurden, sieht die Übersicht wie folgt aus,

Schritt 5: Nachdem die Volumes gemountet sind, wechseln Sie zurück zum Reiter General (Allgemein). Dort müssen wir den External Port (Externer Port) für die Kommunikation über das Internet aktivieren. Stellen Sie diesen auf den Port 5432 ein und klicken Sie auf Speichern (Save). Nach dem Speichern startet die Bereitstellung (Deployment) der Datenbank automatisch.

- Sobald das Deployment abgeschlossen ist, können Sie im Reiter Logs (Protokolle) überprüfen, ob die Datenbankverbindung erfolgreich gestartet wurde.

Moodle 5.0 Quellcode und Verzeichnisse vorbereiten
Wir holen den Moodle-Quellcode (v5.0) aus dem Git-Repo und legen das nicht öffentlich erreichbare Datenverzeichnis moodledata an.
# Wechsel in das Webroot-Verzeichnis
cd /var/www/html
# Moodle v5.0.0 klonen
git clone https://github.com/moodle/moodle.git moodle
cd moodle/
# Herausfinden, welche Version aktuell und stabil ist.
git branch -a
Moodle klonen
#aus der Ausgabe die letzte Stabile Version nehmen
#...
remotes/origin/MOODLE_405_STABLE
remotes/origin/MOODLE_500_STABLE
remotes/origin/MOODLE_501_STABLE # dies z.B.
remotes/origin/main
#...git checkout v5.0.1# Eigentümer für das Web-Verzeichnis setzen (www-data ist der Apache-Benutzer)
sudo chown -R www-data:www-data moodle
# Datenverzeichnis erstellen und Berechtigungen setzen (erlaubt kurzzeitig Schreibzugriff für den Installer)
sudo mkdir /var/moodledata
sudo chown -R www-data /var/moodledata
sudo chmod -R 0770 /var/moodledata
Apache DocumentRoot anpassen
Um Moodle korrekt auszuführen und die Performance für größere Uploads und Kurse zu optimieren, passen wir die Apache- und PHP-Einstellungen an.
Wir stellen den Webserver so ein, dass er direkt in den Moodle-Ordner zeigt.
sudo nano /etc/apache2/sites-available/000-default.conf
Ändern Sie die Zeile DocumentRoot auf den Moodle-Pfad:
DocumentRoot /var/www/html/moodle
PHP 8.4 FPM Limits erhöhen
Moodle benötigt oft höhere Limits, besonders für das Hochladen großer Dateien oder die Verarbeitung komplexer Kurse.
sudo nano /etc/php/8.4/fpm/php.ini
Passen Sie die folgenden Parameter an Ihre Werte an (Werte von 2048M sind für große Installationen empfohlen):
| Parameter | Empfohlener Wert | Zweck |
| max_input_vars | 5000 | Erhöht die Anzahl der verarbeitbaren Formularvariablen. |
| memory_limit | 2048M | Maximaler Speicher, den PHP verwenden darf. |
| upload_max_filesize | 2048M | Maximale Dateigröße für Uploads. |
| post_max_size | 2048M | Maximale Größe der POST-Daten (muss gleich oder größer als upload_max_filesize sein). |
Hinweis:
In derphp.iniistmax_input_varsmit einem führenden;auskommentiert. Entfernen Sie das;
Innanokönnen sie mit der Tastenkombination^wsuchen. Mitcontrol+xund anschliessend mit"y"speichern und raus.
Dienste neu starten und prüfen
Die Änderungen werden erst nach einem Neustart wirksam.
# PHP-FPM und Apache neu starten
sudo systemctl restart php8.4-fpm
sudo systemctl restart apache2
ClamAV konfigurieren
Vor dem Start des Web-Installers konfigurieren wir den Virenschutz. ClamAV prüft Datei-Uploads in Moodle (z. B. Aufgabenabgaben, Kursdateien) auf Malware. Das senkt Risiko durch infizierte Anhänge und erfüllt viele Sicherheits-/Compliance-Vorgaben.
ClamAV-Dienste starten
Der Virenscanner und der Aktualisierungsdienst müssen laufen.
# ClamAV-Datenbanken initialisieren/aktualisieren (kann einige Minuten dauern)
sudo freshclam
# ClamAV Daemon und Freshclam-Dienste starten und für den Systemstart aktivieren
sudo systemctl enable clamav-daemon
sudo systemctl enable clamav-freshclam
sudo systemctl start clamav-daemon
sudo systemctl start clamav-freshclam
Unix-Socket-Pfad für Moodle ermitteln
Führen Sie den folgen Befehl aus:
grep -E '^\s*LocalSocket' /etc/clamav/clamd.confWert von LocalSocket ablesen. Notieren Sie den vollständigen Pfad, z. B.: /var/run/clamav/clamd.ctl
Nicht allein herumprobieren – wir helfen gern.
Wenn Sie bei der Einrichtung von PHP und PostgreSQL nicht weiterkommen oder lieber einen Profi drüberschauen lassen möchten, schreiben Sie uns einfach. Gemeinsam klären wir Ihre Fragen, analysieren Ihre aktuelle Umgebung und unterstützen Sie bei einer sauberen, sicheren Umsetzung.
Wie überprüfe ich den Erfolg der Installation?
Abschluss des Web-Setups
Öffnen Sie nun Ihren Browser, um die grafische Installation abzuschließen.
Installationsseite aufrufen
Rufen Sie die IP-Adresse Ihres Servers auf, gefolgt von install.php. Ersetzen Sie die Beispiel-IP durch die tatsächliche Adresse Ihres Servers.
Beispiel: http://192.168.110.30/install.php



PostgreSQL-Datenbankdetails im Web-Setup:
- Datenbank-Treiber: PostgreSQL
- Datenbank-Name: moodle
- Datenbank-Benutzer: moodle-user
- Passwort: EXAMPLE_PASS (Ihr gewähltes, sicheres Passwort)

Admin-Konto, Site-Einstellungen & ClamAV-Pfad eintragen
Führen Sie die weiteren Installationsschritte durch, bis Sie den Admin-Bereich erreichen.
ClamAV-Konfiguration (nach Abschluss des Haupt-Installers):
Navigieren Sie im Moodle-Admin-Bereich zu Website-Administration > Sicherheit > Website-Sicherheit.
Suchen Sie den Abschnitt Antivirus plugin.

Anti-Virus aktivieren: Setzen Sie den Haken.


Zuletzt die Socket-Einstellung einpfelgen. Den Wert hatten wir bereits ermittelt.

Finales Sicherheits-Cleanup
Nach Abschluss der Web-Installation muss der Schreibzugriff auf das Datenverzeichnis aus Sicherheitsgründen restriktiver gesetzt werden.
# Berechtigungen für /var/moodledata korrigieren
sudo chmod -R 0700 /var/moodledata
Das Verzeichnis ist nun nur noch für den Apache-Benutzer (www-data) les- und schreibbar.
1. Cron aktivieren:
*/1 * * * * sudo -u www-data /usr/bin/php /var/www/html/moodle/admin/cli/cron.php >/dev/null 2>&12. Backups einrichten: Täglich DB-Dump + moodledata (Rotation), monatlicher Restore-Test.
3. Monitoring aktivieren: HTTP-200, PHP-FPM, PostgreSQL, ClamAV (Socket + Freshclam-Alter), TLS-Ablauf, Disk/INodes – mit Alarmierung.
Fazit – Was bringt dieses Setup in der Praxis?
Dieses Setup bietet eine hochmoderne, sichere und stabile Basis für Moodle 5.0. Durch die Nutzung von PHP 8.4, PostgreSQL mit sicherer Authentifizierung und der direkten Integration von ClamAV übertrifft es die Standardanforderungen vieler Hosting-Umgebungen. Die klare Trennung der Komponenten ohne sofortige Dockerisierung schafft eine hervorragende Grundlage, um die Betriebsprozesse transparent zu halten.
Nächste Schritte sind die Einrichtung des Moodle-Cronjobs und die Konzeption einer konsistenten Backup-Strategie (Datenbank + Dateien), bevor die Umgebung produktiv genutzt werden kann.
Im nächsten Artikel zeigen wir die Docker-Variante von Moodle: Aufbau des Stacks, Volumes/Backups, Monitoring-Checks, Upgrade-Pfad und sichere Rollbacks.
Angebot bekommen, aber noch kein gutes Gefühl dabei? Sprechen Sie uns an – wir helfen Ihnen unverbindlich weiter.