Hogyan futtassunk egy teljes Moodle rendszert Dockerrel?

Az online oktatás térnyerésével a Moodle egyre inkább a digitális tanulás gerincévé válik világszerte. Ez a robusztus, nyílt forráskódú tanulásmenedzsment rendszer (LMS) hatalmas rugalmasságot kínál, de a hagyományos telepítése és karbantartása időigényes és néha kihívásokkal teli lehet. Itt jön képbe a Docker, a konténerizálás forradalmi technológiája, amely egyszerűsíti az alkalmazások telepítését, futtatását és kezelését. Ebben a cikkben részletesen bemutatjuk, hogyan futtathatunk egy teljes, stabil és könnyen karbantartható Moodle rendszert Dockerrel, kihasználva a technológia minden előnyét.

Miért Moodle és miért Docker?

A Moodle az egyik legelterjedtebb LMS a világon. Funkciók gazdag tárházát kínálja: tananyagok feltöltése, interaktív feladatok létrehozása, vizsgáztatás, fórumok, csoportmunka és sok más. Számos oktatási intézmény és vállalat alapozza rá digitális képzéseit. Hagyományosan a Moodle telepítése egy webszerverre (Apache vagy Nginx), egy PHP környezetre és egy adatbázisra (MySQL/MariaDB vagy PostgreSQL) támaszkodik, amelyek mindegyikét külön kell telepíteni és konfigurálni. Ez a „monolitikus” megközelítés gyakran verziókonfliktusokhoz, függőségi problémákhoz és nehézkes környezeti szinkronizációhoz vezethet.

A Docker egy platform, amely lehetővé teszi az alkalmazások és azok függőségeinek „konténerekbe” való csomagolását. Egy konténer egy könnyű, önálló, futtatható szoftvercsomag, amely mindent tartalmaz, ami az alkalmazás futtatásához szükséges: kód, futtatókörnyezet, rendszereszközök, rendszertárak és konfigurációk. A konténerek izoláltan futnak egymástól és a gazdagéptől, ami rendkívül konzisztens futtatási környezetet biztosít. Íme, miért érdemes a Moodle-t Dockerrel futtatni:

  • Környezeti konzisztencia: A Moodle rendszered pontosan ugyanúgy fog működni a fejlesztői gépeden, a tesztkörnyezetben és az éles szerveren, kiküszöbölve a „nálam működik” típusú problémákat.
  • Egyszerű telepítés és kezelés: A komplex telepítési folyamat helyett a Moodle és minden függősége percek alatt telepíthető és indítható a Docker Compose segítségével.
  • Skálázhatóság és hordozhatóság: A konténerek könnyen mozgathatók különböző gazdagépek között, és skálázhatók, ha több erőforrásra van szükség. Fejlesztési és tesztelési környezetek létrehozása soha nem volt még ilyen egyszerű.
  • Verziókezelés: Különböző Moodle verziók tesztelése vagy több Moodle példány futtatása egyetlen gépen is gyerekjáték, anélkül, hogy egymást zavarnák.
  • Erőforrás-hatékonyság: A konténerek kevesebb erőforrást igényelnek, mint a virtuális gépek, ami optimalizáltabb szerverhasználatot eredményez.

A Moodle Docker környezet alapvető komponensei

Egy tipikus, Dockerizált Moodle rendszer több egymással kommunikáló konténerből épül fel. Ezek a következők:

  1. Moodle alkalmazás konténer (PHP-FPM): Ez a konténer tartalmazza magát a Moodle forráskódot és a PHP futtatókörnyezetet (gyakran PHP-FPM formájában). Ez felel a Moodle logikájának feldolgozásáért.
  2. Adatbázis konténer: A Moodle minden adatát egy adatbázisban tárolja. Választhatunk PostgreSQL vagy MySQL/MariaDB adatbázis-kezelő rendszert. Ez a konténer dedikáltan az adatbázis futtatására szolgál.
  3. Webszerver konténer (Nginx vagy Apache): Ez a konténer (általában Nginx a performancia és egyszerűség miatt) fogadja a bejövő HTTP/HTTPS kéréseket, és továbbítja azokat a PHP-FPM konténernek feldolgozásra, majd visszaküldi a válaszokat a felhasználóknak.
  4. Moodle Data Volume: A Moodle nem csak az adatbázisban tárolja az adatokat. A felhasználók által feltöltött fájlok, a gyorsítótárazott adatok és egyéb futásidejű adatok egy külön könyvtárban (moodledata) helyezkednek el. Ezt a könyvtárat egy dedikált Docker Volume-ként kell kezelni, hogy az adatok megmaradjanak, még akkor is, ha a Moodle konténert újraépítjük vagy frissítjük.
  5. Cache konténer (opcionális, de ajánlott): A nagyobb Moodle rendszerek performanciájának javítása érdekében érdemes egy gyorsítótárazó szolgáltatást (pl. Redis vagy Memcached) is beépíteni. Ez segít csökkenteni az adatbázis terhelését és felgyorsítja az oldalbetöltést.

Telepítés lépésről lépésre – a gyakorlatban Docker Compose-zal

A Docker Compose az a kulcseszköz, amellyel egy többkonténeres Docker alkalmazást definiálhatunk és futtathatunk. Segítségével egyetlen YAML fájlban (docker-compose.yml) leírhatjuk az összes szolgáltatást, azok kapcsolatait és beállításait.

1. Előkészületek

Mielőtt belekezdenénk, győződjünk meg róla, hogy a Docker és a Docker Compose telepítve van a rendszerünkön. Ha még nem, kövessük a hivatalos Docker dokumentációt. Hozzunk létre egy projektkönyvtárat a Moodle projektünknek:


mkdir moodle-docker
cd moodle-docker

Ebben a könyvtárban fogjuk létrehozni a docker-compose.yml fájlunkat és a webszerver konfigurációját.

2. A `docker-compose.yml` fájl felépítése

Hozzuk létre a docker-compose.yml fájlt a moodle-docker könyvtárunkban, és adjuk hozzá a következő tartalmat. Ez egy alapvető, de működő konfiguráció lesz:


version: '3.8'

services:
  db:
    image: postgres:13-alpine # Vagy mariadb:10.6
    restart: always
    environment:
      POSTGRES_DB: moodle
      POSTGRES_USER: moodleuser
      POSTGRES_PASSWORD: your_strong_database_password # Cseréld le egy erős jelszóra!
    volumes:
      - moodle_db_data:/var/lib/postgresql/data # Vagy /var/lib/mysql
    networks:
      - moodle_network

  moodle:
    image: moodlehq/moodle-php-fpm:latest # A hivatalos Moodle PHP-FPM image
    restart: always
    environment:
      MOODLE_DB_HOST: db
      MOODLE_DB_NAME: moodle
      MOODLE_DB_USER: moodleuser
      MOODLE_DB_PASS: your_strong_database_password
      MOODLE_WWW_ROOT: http://localhost:8080 # Cseréld a domain nevedre éles környezetben
      # Ezek a környezeti változók segítik a config.php generálását
    volumes:
      - moodle_app:/var/www/html # Moodle forráskód
      - moodle_data:/var/www/moodledata # Moodle adatkönyvtár
    depends_on:
      - db
    networks:
      - moodle_network

  nginx:
    image: nginx:stable-alpine
    restart: always
    ports:
      - "8080:80" # Hozzáférés a 8080-as porton keresztül
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf # Saját Nginx konfiguráció
      - moodle_app:/var/www/html:ro # Csak olvasható hozzáférés a Moodle forráskódhoz
    depends_on:
      - moodle
    networks:
      - moodle_network

volumes:
  moodle_db_data:
  moodle_app:
  moodle_data:

networks:
  moodle_network:
    driver: bridge

3. Nginx konfiguráció

Hozzuk létre az nginx.conf fájlt ugyanabban a könyvtárban, ahol a docker-compose.yml található. Ez fogja konfigurálni az Nginx-et, hogy megfelelően szolgálja ki a Moodle-t:


server {
    listen 80;
    server_name localhost; # Cseréld a domain nevedre éles környezetben

    index index.php index.html index.htm;
    root /var/www/html;

    client_max_body_size 200M; # Maximális feltölthető fájlméret

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        fastcgi_pass moodle:9000; # A "moodle" szolgáltatás neve és a PHP-FPM portja
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /.ht {
        deny all;
    }
}

4. Indítás és első lépések

Most, hogy minden konfigurációs fájl a helyén van, indítsuk el a Moodle rendszert a Docker Compose segítségével:


docker-compose up -d

Ez a parancs letölti a szükséges Docker image-eket, létrehozza a konténereket és a volume-okat, majd elindítja az összes szolgáltatást háttérben. Az első indítás eltarthat néhány percig.

Miután minden elindult, nyissuk meg a böngészőnket, és navigáljunk a http://localhost:8080 címre (vagy arra a portra és domainre, amit konfiguráltunk). Ekkor meg kell jelennie a Moodle telepítő varázslójának. Kövessük a lépéseket a telepítés befejezéséhez. Az adatbázis beállításainál a már megadott adatokat használjuk (db host, moodleuser, your_strong_database_password, moodle adatbázis).

5. Moodle Cron job beállítása

A Moodle-nak szüksége van egy rendszeresen futó cron jobra a háttérfeladatok (pl. e-mailek küldése, feladatok ütemezése) elvégzéséhez. Docker környezetben ezt a Moodle konténeren belül kell futtatni. Hozzáadhatunk egy külön szolgáltatást a docker-compose.yml fájlhoz, vagy futtathatjuk a cron parancsot közvetlenül a konténeren belül.

Egyszerű megoldás a docker-compose.yml kiegészítése egy `cron` szolgáltatással:


  cron:
    image: moodlehq/moodle-php-fpm:latest
    restart: always
    volumes:
      - moodle_app:/var/www/html
      - moodle_data:/var/www/moodledata
    command: php /var/www/html/admin/cli/cron.php
    depends_on:
      - db
    networks:
      - moodle_network
    # A crontab helyett használhatunk Docker healthcheck-et és restart policy-t,
    # vagy egy saját Dockerfile-t, ami tartalmazza a cron démon indítását.
    # Egy éles rendszeren érdemesebb egy dedikált cron konténert használni,
    # vagy a Moodle image-et kiegészíteni cron démonnal.

A fenti `cron` szolgáltatás *csak egyszer* futtatja a cron scriptet indításkor, és utána leáll. A Moodle cron-nak rendszeresen kell futnia. Ehhez érdemes egy dedikált `Dockerfile`-t létrehozni a Moodle alkalmazás számára, amiben beállítjuk a `crond` démont, vagy egy külső `cron` service-t használni, ami a `docker exec` segítségével hívja meg a scriptet rendszeres időközönként. Egy egyszerűbb, de működőképes megoldás lehet egy külső cron job beállítása a gazdagépen, ami a docker exec -t moodle_moodle_1 php /var/www/html/admin/cli/cron.php parancsot futtatja. Éles környezetben azonban javasolt egy robusztusabb megoldás.

Haladó konfigurációk és finomhangolás

Adatmegőrzés és biztonsági mentés

A Docker volumes kulcsfontosságúak az adatok megőrzéséhez. Ahogy láthattuk, a moodle_db_data, moodle_app és moodle_data volume-ok biztosítják, hogy az adatbázis adatai, a Moodle forráskód és a felhasználói fájlok függetlenek legyenek a konténerek életciklusától. A biztonsági mentéshez egyszerűen le kell menteni ezeket a volume-okat.


docker-compose down # Leállítja a rendszert
docker cp moodle-docker_moodle_db_data:/var/lib/postgresql/data ./db_backup # Adatbázis mentése
docker cp moodle-docker_moodle_data:/var/www/moodledata ./moodledata_backup # Moodle Data mentése
# A moodle_app volume a forráskódot tartalmazza, ami általában a Git-ből is lekérhető.
docker-compose up -d # Visszaállítja a rendszert

Performancia optimalizálás

  • Cache integráció: Adjuk hozzá a Redis szolgáltatást a docker-compose.yml fájlhoz, és konfiguráljuk a Moodle-t, hogy használja azt.
    
      redis:
        image: redis:alpine
        restart: always
        networks:
          - moodle_network
            

    Ezután a Moodle admin felületén engedélyezzük a Redis cache-t a „Site administration > Plugins > Caching” menüpont alatt, és állítsuk be a Redis hostot redis-re (a szolgáltatás neve a Docker Compose-ban).

  • PHP-FPM finomhangolás: A Moodle PHP-FPM konténer beállításait optimalizálhatjuk egy saját php.ini fájl vagy a PHP-FPM konfigurációjának módosításával (pl. a pm.max_children, pm.start_servers paraméterek beállítása).
  • Adatbázis optimalizálás: Az adatbázis konténer számára több memóriát és CPU-t rendelhetünk, illetve az adatbázis motor konfigurációját is finomhangolhatjuk (pl. shared_buffers PostgreSQL esetén).

Biztonság

  • HTTPS: Éles környezetben elengedhetetlen a HTTPS használata. Ezt megvalósíthatjuk egy külső reverse proxy-val (pl. Traefik vagy Caddy, ami automatikusan kezelni tudja a Let’s Encrypt tanúsítványokat), vagy az Nginx konténert kiegészíthetjük SSL tanúsítvánnyal.

    A legegyszerűbb megoldás, ha egy másik konténer kezeli az SSL-t és reverse proxy-ként működik. Például egy Caddy konténer automatikusan lekérdez és megújít Let’s Encrypt tanúsítványokat.

  • Jelszavak kezelése: A docker-compose.yml fájlban szereplő jelszavakat soha ne tároljuk éles környezetben plain text formában. Használjunk Docker Secrets-et vagy környezeti változók helyett fájlokat, melyekben a jelszavak szerepelnek, és azokat mountoljuk be read-only módban.
  • Image frissítés és sebezhetőségi menedzsment: Rendszeresen frissítsük a Docker image-eket a legújabb biztonsági javítások érdekében. A docker-compose pull és docker-compose up -d parancsokkal könnyen frissíthetjük a konténereket.

Fejlesztés vs. Éles rendszer

A fenti telepítés egy jó kiindulópont mind fejlesztési, mind éles környezet számára. Azonban van néhány különbség:

  • Fejlesztés: Gyakran kényelmes a Moodle forráskódját közvetlenül a gazdagépről mountolni (./moodle_app:/var/www/html), hogy a változtatások azonnal megjelenjenek. A hibakereséshez további eszközöket (pl. XDebug) is hozzáadhatunk a PHP-FPM konténerhez.
  • Éles rendszer: Itt a stabilitás, performancia és a biztonság a legfontosabb. A moodle_app volume helyett célszerűbb egy Docker image-be beégetni a Moodle kódot (saját Dockerfile-lal), vagy read-only mountot használni. Erőforrás-limitációkat állíthatunk be a konténerekre, és monitoring eszközöket (pl. Prometheus, Grafana) integrálhatunk.

Gyakori hibák és hibaelhárítás

  • Konténer nem indul el: Használjuk a docker-compose logs <szolgáltatás_név> parancsot a logok ellenőrzésére.
  • Hálózati problémák: Győződjünk meg róla, hogy a konténerek a megfelelő hálózaton vannak, és a portok megfelelően vannak publikálva vagy átirányítva. A docker network inspect moodle_network segíthet.
  • Engedélyezési problémák: A moodledata könyvtárnak írhatónak kell lennie a Moodle konténer számára. Győződjünk meg róla, hogy a volume-ok megfelelő engedélyekkel rendelkeznek.
  • Adatbázis kapcsolódási hibák: Ellenőrizzük az adatbázis konténer logjait, és győződjünk meg róla, hogy a Moodle környezeti változói (MOODLE_DB_HOST stb.) helyesek.

Összegzés

A Moodle rendszer futtatása Dockerrel egy modern, hatékony és rendkívül rugalmas megközelítés az online oktatási platformok üzemeltetésére. A konténerizálás előnyeit kihasználva egyszerűsíthetjük a telepítést, garantálhatjuk a környezeti konzisztenciát, javíthatjuk a skálázhatóságot és biztonságosabbá tehetjük a rendszert.

Bár az első lépések némi ismeretet igényelnek a Docker és a Docker Compose terén, a befektetett idő megtérül a hosszú távú karbantarthatóság és a hibaelhárítás egyszerűségének köszönhetően. Akár fejlesztési, akár éles rendszer kialakításán dolgozunk, a Dockerrel való integráció jelentősen megkönnyíti a Moodle menedzsmentjét, lehetővé téve, hogy a hangsúlyt a tartalomra és az oktatásra helyezhessük a rendszeradminisztráció helyett. Kezdjünk hozzá még ma, és fedezzük fel a Dockerizált Moodle nyújtotta szabadságot!

Leave a Reply

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük