Hogyan üzemeltem be a Moodle Course Management System-et
Azaz eLearning rendszer felépítése Docker alapon Nextcloud integrációval
Telepítés
Mindenek előtt adjunk hálát a Dockernek, mert nélküle nemigen telepítenénk ilyen összetett cuccokat, inkább megírnánk magunk - mint ahogy azt még pár nappal ezelőtt is terveztük. Áldott legyen.
Miben is van a Moodle megírva? Nem mindegy? Hát ezért adunk hálát a Dockernek. Még az is lehet, hogy Ruby-ban, mint a GitLab, de az se baj.
Mondjuk ki érti, miért kell egy webalkalmazást Ruby-ban csinálni, mikor ott a jó öreg PHP, meg van már Python, ami ennek a honlapnak is az alapja, ha meg igazán durvát akarunk, programozhatjuk C++(cémegmeg)-ben is. ... Egyesek nem tudják jódolgukban micsinálnak. Jó, hogy nem mindjárt Scratch-ben, vagy Perl-ben ...
A lényegre térve
Először használtam
docker-compose
-t a saját feljesztésű szkriptjeim és konfigurációs fájljaim helyett. Nem esett rosszul. A docker-compose hátránya, hogy a
docker-compose.yml
-ből nem lehet shell parancsokat hívni. Előnye, hogy a docker összes funkciója elérhető rajta keresztül és nem kell évekkel ezelőtt írott szkripteket túrni, hogy lássuk, hogy egy adott beállítást hogyan kell megvalósítani. Elég a
docker-compose
dokumentációját túrni, ami talán rendesen meg van írva. Mert azok ott ráérnek arra is.
Tanulság : ne próbáljunk meg egy kész eszközt saját megoldásokkal kiváltani csak azért, mert nem akarjuk elolvasni a dokumentációját.
Feladat : a régi docker kezelő szkriptjeim lecserélése docker-compose-ra.
docker-compose.yml
version: '2'
services:
nextcloud:
image: 'nextcloud:20.0.2'
network_mode: bridge
ports:
- '127.0.0.1:18083:80'
volumes:
- ./volumes/nextcloud:/var/www/html
extra_hosts:
- 'docker:172.17.42.1'
environment:
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=password
- MYSQL_HOST=172.17.42.1
- NEXTCLOUD_ADMIN_USER=root
- NEXTCLOUD_ADMIN_PASSWORD=password
- NEXTCLOUD_TRUSTED_DOMAINS=cloud.domain.hu
- SMTP_HOST=172.17.42.1
- SMTP_PORT=25
- MAIL_FROM_ADDRESS=cloud@domain.hu
moodle:
image: 'docker.io/bitnami/moodle:3.10.0'
network_mode: bridge
ports:
- '127.0.0.1:18082:8080'
volumes:
- ./volumes/moodle_data:/bitnami/moodle
- ./volumes/moodledata_data:/bitnami/moodledata
extra_hosts:
- 'docker:172.17.42.1'
environment:
- MOODLE_USERNAME=root
- MOODLE_PASSWORD=password
- MOODLE_EMAIL=moodle@domain.hu
- MOODLE_SITE_NAME=moodle
- MOODLE_DATABASE_HOST=172.17.42.1
- MOODLE_DATABASE_PORT_NUMBER=3306
- MOODLE_DATABASE_NAME=moodle
- MOODLE_DATABASE_USER=moodle
- MOODLE_DATABASE_PASSWORD=password
- ALLOW_EMPTY_PASSWORD=yes
Megjegyzések
- Az
image
értéknél fontos a pontos verzió megadása, hogy az ismételtdocker-compose up
hívásokkor még véletlenül se frissüljön automatikusan az image, mint ahogy alatest
tag esetén tenné. - A
network_mode: bridge
szükséges, hogy a konténer a megadott ip címen elérje a docker host-on futó adatbázis szervert. Szép, ha a teljes szolgáltatás saját alhálózaton helyezkedik el, saját adatbázis szerverrel, azaz microservices, de futtasson és backup-oljon külön mysql konténert minden projekthez az, akinek ahhoz van kedve. - Az
extra_hosts
alatti elemek hostname / ip cím párok. Az így definiált hostnevek ugyanúgy használhatóak a konténerben, mintha az /etc/hosts fájlban lennének megadva.
Konténerek indítása
# indítás
docker-compose up
# vagy
# indítás a háttérben
docker-compose up -d
Nginx vhost - reverse proxy
server {
listen 80;
listen 443 ssl;
server_name moodle.domain.hu;
ssl_certificate /etc/letsencrypt/live/moodle.domain.hu/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/moodle.domain.hu/privkey.pem;
if ($scheme = http) {
return 301 https://$host$request_uri;
}
include includes/letsencrypt;
location / {
proxy_pass http://127.0.0.1:18082;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header X-Real-IP $remote_addr;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
}
Megjegyzések
A titkosítást szokás szerint a docker host-on futó nginx reverse proxy intézi, a konténerben levő Moodle meg persze, hogy nem viseli ezt olyan jól. A konfiguráció így némi módosításra szorul.
Konfiguráció: volumes/moodle_data/config.php
$CFG->wwwroot = 'https://moodle.domain.hu';
$CFG->reverseproxy = true;
$CFG->sslproxy = true;
Nextcloud integráció
HTTPS nélkül nem fog működni. Nem úgy megy az manapság, hogy webes szolgáltatásokat csinálunk külső fél, legalább a letsencrypt igénybevétele nélkül.
Nextcloud
Az
Administration / Security / OAuth 2.0 clients
menüpontban felveszünk egy új klienst mondjuk Moodle néven. A
Redirection URI
https://moodle.domain.hu/admin/oauth2callback.php
lesz. Mentés után láthatóvá válik a
Client Identifier
és a
Secret
, amiket a kliens beállításánál használhatunk.
Moodle
A
Site administration / Server / OAuth 2 services / Create new Nextcloud service
menüpontban beállítjuk a Nextcloud OAuth 2 szolgáltatót. A
Name
lehet Nextcloud, a
Client id
és a
Client secret
az előző bekezdésben említett értékek. A
Service base URL
a Nextcloud szolgáltatásunk címe, azaz https://cloud.domain.hu.
A következő lépés:
Site administration / Plugins / Repositories / Manage repositories
, ahol engedélyezzük a Nextcloud-ot, majd a
Settings
menüpontban létrehozunk egy repository-t.
A dolog elméletileg készen van. A felhaszálók felhasználhatnak a Nextcloudban tárolt fájlokat a Moodle tartalmainak szerkesztéséhez.
