Moodle 5.0 Lernplattform produktiv installieren: Komplettanleitung für Ubuntu + PHP 8.4 + PostgreSQL + ClamAV

Installationsanleitung Moodle 5.0 mit PHP 8.4, PostgreSQL und ClamAV Virenschutz.

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.

🔴
Haftungsausschluss / Disclaimer
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.

Kontaktieren Sie uns

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:

  1. 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).
  2. 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.
  3. 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.
💡
Phase 2: Dockerisierung folgt
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.

Kontaktieren Sie uns

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 zum utf8mb4 von 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: 5

Die 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.

Datenbankdienst erstellen
Datenbankdienst erstellen

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).

Postgresql-Datenbank-Erstellung für Moodle
Neue Datenbank konfigurieren und erstelle
  • Konfiguration ist erstellt
Erfolgreich erstellte Moodle-Datenbank im Service-Dashboard
Datenbank im Dashboard
  • Klicken Sie nun auf die gerade erstellte Konfiguration, um die Detailansicht zu öffnen.
Deploy Settings für die Moodle-Datenbank mit Zugangsdaten
Datenbank-Zugangsdaten und Port

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
Umgebungsvariablen für Moodle-Datenbank-Spracheinstellungen konfigurieren
Umgebungsvariablen speichern

Schritt 4: Wechseln Sie nun zum Tag Advanced und binden die Volumes, wie hier beschrieben an.

Erweiterte Einstellungen der Datenbank zur Volume-Konfiguration
Datenbank-Volumes hinzufügen
  • 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 Abschnitt Bind Mount.
🔴
Wichtig: Stellen Sie sicher, dass das Verzeichnis bereits auf Ihrem Host-Server existiert. Wenn nicht, erstellen Sie es zuerst.
cd /var/docker/
sudo mkdir moodle
cd moodle/
sudo mkdir postgres_data
sudo mkdir init_db
Konfiguration von Docker-Volumes für die Moodle-PostgreSQL-Datenbank
Daten-Volumes hinzufügen und mounten
# 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
Ausführung von Initialisierungsskripten (SQL) über Datei-Mount
SQL-Initialisierungsskript einbinden
  • Sobald beide Volumes (Bind Mount und File Mount) hinzugefügt wurden, sieht die Übersicht wie folgt aus,
Übersicht der konfigurierten Volumes und Mounts für die Datenbank
konfigurierte Volumes

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.

Allgemeine Deploy-Einstellungen und Port 5432 speichern
Externe Datenbank-Ports speichern
  • Sobald das Deployment abgeschlossen ist, können Sie im Reiter Logs (Protokolle) überprüfen, ob die Datenbankverbindung erfolgreich gestartet wurde.
PostgreSQL-Datenbankstart und -Protokolle
Datenbank-Startprotokolle überwachen

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):

ParameterEmpfohlener WertZweck
max_input_vars5000Erhöht die Anzahl der verarbeitbaren Formularvariablen.
memory_limit2048MMaximaler Speicher, den PHP verwenden darf.
upload_max_filesize2048MMaximale Dateigröße für Uploads.
post_max_size2048MMaximale Größe der POST-Daten (muss gleich oder größer als upload_max_filesize sein).
Hinweis:
In der php.ini ist max_input_vars mit einem führenden ; auskommentiert. Entfernen Sie das ;
In nano können sie mit der Tastenkombination ^w suchen. Mit control + x und 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.conf

Wert 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.

Kontaktieren Sie uns

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
Sprache auswählen
Sprache auswählen
Verzeichnis zum Speichern der Daten eingeben
Verzeichnis zum Speichern der Daten eingeben
Datenbank auswählen
Datenbank auswählen

PostgreSQL-Datenbankdetails im Web-Setup:

  • Datenbank-Treiber: PostgreSQL
  • Datenbank-Name: moodle
  • Datenbank-Benutzer: moodle-user
  • Passwort: EXAMPLE_PASS (Ihr gewähltes, sicheres Passwort)
Datenbankanmeldedaten eingeben
Datenbankanmeldedaten eingeben

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.

Übersicht der Moodle-Admin-Werkzeuge und Antiviren-Plugins
Moodle-Website-Administration

Anti-Virus aktivieren: Setzen Sie den Haken.

Moodle-Einstellungsseite für Antiviren-Plugins, ClamAV aktivieren
ClamAV Antivirus aktivieren
Moodle-Statusmeldung: Ein Antiviren-Scanner (ClamAV) ist erfolgreich aktiviert.
Antivirus erfolgreich aktiviert

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

Konfigurationseinstellungen für das ClamAV-Antiviren-Plugin in Moodle
ClamAV Einstellungen speichern

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.

💡
Pflichtschritte nach dem Sicherheits-Cleanup
1. Cron aktivieren: */1 * * * * sudo -u www-data /usr/bin/php /var/www/html/moodle/admin/cli/cron.php >/dev/null 2>&1
2. 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.

💡
Mehr in Teil 2
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.

Kontaktieren Sie uns

Häufig gestellte Fragen

Welche Systemvoraussetzungen sind für Moodle 5.0 auf Ubuntu sinnvoll?
Nutzen Sie Ubuntu mit PHP 8.4 FPM, PostgreSQL und ausreichend Ressourcen.

Empfohlen sind mindestens 2 vCPU, 4–8 GB RAM, schnelle SSDs, Apache oder NGINX, aktivierter Cron und ein separater Speicherort für moodledata. Für >500 Nutzer sollten RAM/CPU und PHP-FPM-Worker erhöht werden.

  • CPU/RAM: ab 2 vCPU, 4–8 GB RAM (mehr bei >500 Nutzer:innen)
  • Webserver: Apache oder NGINX mit PHP 8.4 FPM
  • Datenbank: PostgreSQL mit SCRAM-SHA-256
  • Storage: SSD, separates moodledata (nicht im Webroot)
  • Cron: System-Cron oder php admin/cli/cron.php minütlich


  1. Planen Sie Kapazitäten nach Nutzerzahl/Kurslast.
  2. Trennen Sie Code, DB und moodledata sauber.
Warum PostgreSQL statt MySQL/MariaDB für Moodle 5.0?
PostgreSQL liefert robuste Transaktionen, starke Abfragen und native SCRAM-SHA-256-Sicherheit.

Unter hoher Last punktet PostgreSQL mit CTEs, JSON-Funktionen und konsistenter Performance. Das Standard-Auth-Verfahren SCRAM-SHA-256 reduziert Risiken bei Logins und passt gut zu größeren Kurs-/Reporting-Lasten.

  • Stabilität: ACID-Transaktionen, konsistente Planner
  • Leistung: CTE/JSON-Features für Berichte
  • Sicherheit: SCRAM-SHA-256 by default
  • Skalierung: saubere Indizes/Partitionierung möglich


  1. Nutzen Sie password_encryption_policy = scram-sha-256.
  2. Pflegen Sie Indizes auf Kurs-/Log-Tabellen.
Wie richte ich ClamAV in Moodle korrekt ein (Daemon vs. Command line)?
Bevorzugen Sie clamd über Unix-Socket für maximale Geschwindigkeit.

Prüfen Sie in clamd.conf den LocalSocket und wählen Sie in Moodle die Methode "Unix domain socket". Tragen Sie z. B. /var/run/clamav/clamd.ctl ein. Alternativ kann pathtoclam=/usr/bin/clamdscan genutzt werden (langsamer).

  • Daemon: clamd mit LocalSocket (empfohlen)
  • Moodle: Running method = Unix domain socket
  • Pfad: /var/run/clamav/clamd.ctl
  • Fallback: pathtoclam=/usr/bin/clamdscan


  1. Aktualisieren Sie Signaturen (freshclam).
  2. Setzen Sie Limits passend zur Upload-Größe.
Welche PHP-Limits sind praxisnah für größere Kurse/Uploads?
Setzen Sie realistische Upload- und Speicherlimits und passen Sie ClamAV an.

Bewährte Startwerte: max_input_vars=5000, memory_limit=2048M, upload_max_filesize=2048M, post_max_size=2048M. Stimmen Sie ClamAV-Parameter (MaxFileSize, MaxScanSize, StreamMaxLength) auf die Upload-Größe ab; danach PHP-FPM/Webserver neustarten.

  • PHP INI: memory_limit=2048M
  • Uploads: upload_max_filesize=2048M, post_max_size=2048M
  • Eingaben: max_input_vars=5000
  • ClamAV: Limits ≥ erwartete Upload-Größe


  1. Reload: systemctl reload php8.4-fpm.
  2. Webserver neu laden für Konfig-Übernahme.
Warum liegt `moodledata` außerhalb des Webroots und wie sichere ich es ab?
moodledata darf nie direkt per HTTP erreichbar sein, nur über Moodle.

Speichern Sie moodledata z. B. unter /var/moodledata, setzen Sie restriktive Rechte (Eigentümer www-data, chmod -R 0700) und sichern Sie Backups/Rotation. Optional eignen sich separate Partitionen/NFS und Monitoring von Inodes sowie Speicherplatz.

  • Pfad: /var/moodledata (außerhalb Webroot)
  • Rechte: chown -R www-data:www-data, chmod -R 0700
  • Security: keine Webserver-Location dorthin
  • Backup: inkrementell + Rotation


  1. Prüfen Sie regelmäßig Inodes/Platz.
  2. Testen Sie Restores stichprobenartig.
Wie prüfe ich, ob Moodle 5.0 „gesund“ läuft (Health-Checks)?
Definieren Sie messbare Checks für App, PHP, DB, AV und Zertifikate.

Zentrale Indikatoren sind HTTP-200 der Login-Seite, minütlicher Cron, geringe PHP-FPM-Queues, keine DB-Langläufer/Locks, aktuelle ClamAV-Signaturen, ausreichende TLS-Restlaufzeit und freie Disk-/Inodes. Alarmieren Sie via Checkmk/Prometheus.

  • App: /login/index.php liefert 200
  • Cron: minütlich erfolgreich
  • PHP-FPM: keine langen Queues
  • DB: keine Langläufer/Locks
  • ClamAV: Signaturen < 24 h alt
  • TLS: Restlaufzeit > 21 Tage
  • Disk/INodes: > 15 % frei


CheckZielwert
HTTP-Status200
Cron≥ 1×/Minute
PHP-FPM Queue< 5 dauerhaft
DB Lockskeine Langläufer
ClamAV DB< 24 h alt
TLS> 21 Tage
Disk/Inodes> 15 % frei
Kann/soll ich Moodle 5.0 gleich dockerisieren?
Starten Sie nativ; dockerisieren Sie erst nach solidem Betriebsverständnis.

Nativ lernen Sie Rechte, Cron, Upgrades, Backups und ClamAV richtig kennen. In Phase 2 bauen Sie eine eigene Docker-Variante (Compose/Dokploy) mit externen Volumes, Healthchecks, Logging/Monitoring und klarem Upgrade-Pfad.

  • Phase 1: natives Setup verstehen
  • Phase 2: Docker mit externen Volumes
  • Healthchecks: App, DB, Cron
  • Observability: Logs/Metriken/Traces


  1. Dokumentieren Sie Images/Tags.
  2. Automatisieren Sie Backups/Restores.
Wie führe ich Updates/Upgrades sicher durch (Core/Plugins/PHP)?
Backup, Wartungsmodus, Code-Update, CLI-Upgrade, Tests und Rollback-Bereitschaft.

Erstellen Sie immer DB- und moodledata-Backups, aktivieren Sie den Wartungsmodus, aktualisieren Sie den Code und führen Sie php admin/cli/upgrade.php aus. Prüfen Sie Plugin-Kompatibilität (5.0-ready) und testen Sie PHP-Minors auf Staging.

  • Backup: DB + moodledata
  • Wartung: Maintenance mode aktiv
  • Upgrade: php admin/cli/upgrade.php
  • Plugins: Kompatibilität prüfen
  • Nachlauf: Cron/Logs/Alarme prüfen


  1. Halten Sie einen Rollback-Plan vor.
  2. Dokumentieren Sie alle Änderungen nachvollziehbar.

Schedule an Appointment Directly

Let's harness digital opportunities together and lead your business successfully into the future!

Better digital. Simply hisys.
ADDRESS
HomeIT-System
Thusinthan Kajendran
Schichtmeisterweg 2
44625 Herne
CONTACT
© 2024 - 2025 HomeIT-System.