Migration einer bestehenden Moodle-Installation
Diese Anleitung beschreibt, wie Sie eine bestehende Moodle-Installation zu edulution Moodle migrieren können.
:::warning Wichtig Erstellen Sie vor der Migration unbedingt ein vollständiges Backup Ihrer bestehenden Installation! :::
Übersicht des Migrationsprozesses
Voraussetzungen
- Bestehende Moodle-Installation (Version 3.9 oder höher)
- Zugriff auf Datenbank und Dateisystem der alten Installation
- Ausreichend Speicherplatz für Backup und neue Installation
- Geplante Wartungszeit (empfohlen: 2-4 Stunden)
Schritt 1: Backup der alten Installation
1.1 Wartungsmodus aktivieren
Aktivieren Sie den Wartungsmodus auf der alten Installation:
# Via Moodle CLI
php /pfad/zu/moodle/admin/cli/maintenance.php --enable
# Oder via moosh (falls installiert)
moosh maintenance-on
1.2 Datenbank-Backup
MariaDB/MySQL:
mysqldump -u moodle_user -p \
--single-transaction \
--routines \
--triggers \
--events \
moodle_database > moodle_backup_$(date +%Y%m%d).sql
PostgreSQL:
pg_dump -U moodle_user -Fc moodle_database > moodle_backup_$(date +%Y%m%d).dump
:::note PostgreSQL zu MariaDB Wenn Ihre alte Installation PostgreSQL nutzt, müssen Sie die Datenbank zu MariaDB konvertieren. Siehe PostgreSQL-Migration. :::
1.3 Moodledata-Backup
# Moodledata-Verzeichnis sichern
tar -czvf moodledata_backup_$(date +%Y%m%d).tar.gz /pfad/zu/moodledata/
1.4 Plugin-Liste exportieren
Exportieren Sie die Liste der installierten Plugins:
# Via moosh
moosh plugin-list > installed_plugins.txt
# Oder manuell aus der Datenbank
mysql -u moodle_user -p moodle_database -e \
"SELECT plugin, version FROM mdl_config_plugins WHERE plugin != 'core' ORDER BY plugin;" \
> installed_plugins.txt
Schritt 2: edulution Moodle vorbereiten
2.1 Repository klonen
git clone https://github.com/edulution-io/edulution-moodle.git
cd edulution-moodle
2.2 Basis-Konfiguration
cp .env.example .env
Wichtige Einstellungen für die Migration:
# Gleiche Moodle-Version wie alte Installation
MOODLE_VERSION=MOODLE_405_STABLE
# Migration aktivieren
MIGRATION_MODE=true
# Alte URL für URL-Replacement
OLD_MOODLE_URL=https://alte-moodle.ihre-schule.de
MOODLE_URL=https://moodle.ihre-schule.de
# Keycloak-Einstellungen
KEYCLOAK_URL=https://sso.ihre-schule.de
KEYCLOAK_REALM=schule
KEYCLOAK_CLIENT_ID=moodle
KEYCLOAK_CLIENT_SECRET=<secret>
2.3 Verzeichnisse erstellen
sudo mkdir -p /srv/docker/moodle/{data,db,config,backups,migration}
sudo chown -R 1000:1000 /srv/docker/moodle/
Schritt 3: Datenbank migrieren
3.1 Backup in Migrations-Verzeichnis kopieren
cp moodle_backup_*.sql /srv/docker/moodle/migration/
3.2 Container starten (ohne Moodle)
# Nur Datenbank starten
docker compose up -d db
# Warten bis DB bereit
docker compose logs -f db
# Warten auf: "ready for connections"
3.3 Datenbank importieren
# Datenbank erstellen
docker compose exec db mysql -u root -p -e "CREATE DATABASE moodle CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# Backup importieren
docker compose exec -T db mysql -u root -p moodle < /srv/docker/moodle/migration/moodle_backup_*.sql
3.4 URLs in Datenbank ersetzen
# In Container einloggen
docker compose exec db mysql -u root -p moodle
# URLs ersetzen
UPDATE mdl_config SET value = 'https://moodle.ihre-schule.de' WHERE name = 'wwwroot';
# Alle URLs in Inhalten ersetzen
UPDATE mdl_course SET summary = REPLACE(summary, 'https://alte-moodle.ihre-schule.de', 'https://moodle.ihre-schule.de');
UPDATE mdl_course_sections SET summary = REPLACE(summary, 'https://alte-moodle.ihre-schule.de', 'https://moodle.ihre-schule.de');
# ... weitere Tabellen je nach Bedarf
:::tip Automatisches URL-Replacement
edulution Moodle kann URLs automatisch beim Start ersetzen. Setzen Sie in der .env:
MIGRATION_URL_REPLACE=true
MIGRATION_OLD_URL=https://alte-moodle.ihre-schule.de
:::
Schritt 4: Moodledata migrieren
4.1 Backup extrahieren
# Moodledata extrahieren
tar -xzvf moodledata_backup_*.tar.gz -C /srv/docker/moodle/
# Umbenennen falls nötig
mv /srv/docker/moodle/moodledata /srv/docker/moodle/data
# Oder wenn bereits extrahiert:
# mv /srv/docker/moodle/pfad/zu/moodledata/* /srv/docker/moodle/data/
# Berechtigungen setzen
sudo chown -R 33:33 /srv/docker/moodle/data/
4.2 Cache-Verzeichnisse leeren
# Alte Caches entfernen
rm -rf /srv/docker/moodle/data/cache/*
rm -rf /srv/docker/moodle/data/localcache/*
rm -rf /srv/docker/moodle/data/temp/*
rm -rf /srv/docker/moodle/data/trashdir/*
rm -rf /srv/docker/moodle/data/sessions/*
Schritt 5: Plugins abgleichen
5.1 Plugin-Liste erstellen
Erstellen Sie config/plugins.json basierend auf Ihrer exportierten Plugin-Liste:
{
"plugins": [
{
"component": "mod_attendance",
"name": "Anwesenheit",
"required": true,
"description": "Anwesenheitstracking"
},
{
"component": "mod_questionnaire",
"name": "Fragebogen",
"required": true
},
{
"component": "block_xp",
"name": "Level Up XP",
"required": false
}
]
}
5.2 Nicht verfügbare Plugins
Manche Plugins sind möglicherweise nicht im Moodle Plugin-Verzeichnis verfügbar. Für diese:
{
"component": "local_custom_plugin",
"name": "Custom Plugin",
"required": true,
"source_url": "https://github.com/org/plugin/archive/main.zip"
}
:::warning Inkompatible Plugins Einige Plugins sind möglicherweise nicht mit der neuen Moodle-Version kompatibel. Testen Sie diese vor der endgültigen Migration. :::
Schritt 6: Moodle starten
6.1 Container hochfahren
docker compose up -d moodle
6.2 Upgrade durchführen
# Logs beobachten
docker compose logs -f moodle
# Datenbank-Upgrade (falls nicht automatisch)
docker compose exec moodle php admin/cli/upgrade.php --non-interactive
6.3 Caches leeren
docker compose exec moodle php admin/cli/purge_caches.php
Schritt 7: OAuth2/SSO konfigurieren
7.1 Keycloak-Client erstellen
Falls noch nicht vorhanden, erstellen Sie den Moodle-Client in Keycloak:
Client ID: moodle
Client Protocol: openid-connect
Access Type: confidential
Valid Redirect URIs: https://moodle.ihre-schule.de/*
7.2 OAuth2 in Moodle aktivieren
# OAuth2-Issuer erstellen
docker compose exec moodle moosh auth-manage enable oauth2
# Oder via Admin-UI
# Site administration → Plugins → Authentication → Manage authentication
7.3 Bestehende Benutzer verknüpfen
Die Migration der Benutzer-Zuordnung kann auf verschiedene Weisen erfolgen:
Option A: Automatische Verknüpfung via E-Mail
# In .env setzen
OAUTH2_LINK_BY_EMAIL=true
Benutzer werden automatisch mit ihrem Keycloak-Account verknüpft, wenn die E-Mail-Adresse übereinstimmt.
Option B: Manuelles Linking-Script
docker compose exec moodle php /opt/scripts/link_oauth2_users.php
Option C: Benutzer müssen sich neu verknüpfen
Benutzer können sich mit ihrem alten Passwort anmelden und dann ihren Keycloak-Account verknüpfen.
Schritt 8: Test und Validierung
8.1 Funktionstest-Checkliste
- Admin-Login funktioniert
- SSO-Login funktioniert
- Kurse sind sichtbar
- Kursinhalt wird korrekt angezeigt
- Dateien sind zugänglich
- Aktivitäten funktionieren (Quiz, Aufgaben, etc.)
- Einschreibungen sind korrekt
- Bewertungen sind vorhanden
- Kalender zeigt Termine
- Nachrichten funktionieren
8.2 Datenintegritäts-Check
# Datenbank-Prüfung
docker compose exec moodle php admin/cli/check_database_schema.php
# Datei-Prüfung
docker compose exec moodle php admin/cli/fix_orphaned_files.php --preview
Schritt 9: DNS umstellen
Wenn alle Tests erfolgreich waren:
9.1 DNS-Eintrag ändern
moodle.ihre-schule.de A <neue-server-ip>
9.2 Propagation abwarten
# DNS-Propagation prüfen
dig moodle.ihre-schule.de
9.3 SSL-Zertifikat prüfen
# Zertifikat prüfen
docker compose logs traefik | grep -i certificate
Schritt 10: Alte Installation deaktivieren
Nach erfolgreicher Migration und Testphase:
10.1 Alte Installation herunterfahren
# Auf altem Server
systemctl stop apache2 # oder nginx
systemctl stop mysql
10.2 Backup aufbewahren
Bewahren Sie das Backup der alten Installation für mindestens 30 Tage auf.
PostgreSQL zu MariaDB
Falls Ihre alte Installation PostgreSQL nutzt:
Konvertierungsprozess
- pgloader installieren
apt install pgloader
- Konvertierungskonfiguration erstellen
LOAD DATABASE
FROM postgresql://user:pass@localhost/moodle_pg
INTO mysql://root:pass@localhost/moodle_mysql
WITH include no drop, create tables, no truncate,
create indexes, reset sequences, foreign keys
SET maintenance_work_mem to '128MB',
work_mem to '12MB'
CAST type text to varchar(16777215),
type boolean to tinyint using (boolean-to-int ?column),
type bytea to blob;
- Konvertierung ausführen
pgloader migration.load
:::warning Manuelle Nacharbeit Nach der Konvertierung sind möglicherweise manuelle Anpassungen an den Datentypen erforderlich. :::
Fehlerbehebung
Fehler: "Table doesn't exist"
# Datenbank neu importieren mit korrektem Präfix
docker compose exec db mysql -u root -p moodle -e "SHOW TABLES LIKE 'mdl_%';"
Fehler: "File not found"
# Moodledata-Berechtigungen prüfen
docker compose exec moodle ls -la /var/www/moodledata/
Fehler: "Plugin incompatible"
# Plugin-Verzeichnis manuell entfernen
docker compose exec moodle rm -rf /var/www/html/moodle/mod/problematic_plugin
docker compose exec moodle php admin/cli/upgrade.php
Rollback
Falls die Migration fehlschlägt:
- DNS zurück auf alte Installation
- Wartungsmodus auf alter Installation deaktivieren
- Neue Container herunterfahren
- Fehler analysieren und beheben
- Migration erneut versuchen
Nächste Schritte
Nach erfolgreicher Migration: