Moodle (Modular Object-Oriented Dynamic Learning Environment) és una plataforma d’aprenentatge en línia de codi obert, més coneguda com a LMS (Learning Management System). Permet als docents crear cursos virtuals, gestionar activitats, avaluacions i comunicació amb l’alumnat.
Aquest document descriu el procés d’instal·lació de Moodle 5.2 sobre un servidor Ubuntu 26.04 LTS, utilitzant Apache 2 com a servidor web, MariaDB com a base de dades i PHP. La comunicació es fa xifrada mitjançant HTTPS amb un certificat autosignat.
| Component | Mínim recomanat |
|---|---|
| Processador | 2 nuclis (x86_64) |
| Memòria RAM | 2 GB (4 GB recomanat) |
| Emmagatzematge | 20 GB lliures per al sistema + espai per a fitxers de curs |
| Xarxa | Connexió a Internet per descarregar paquets |
| Programari | Versió |
|---|---|
| Sistema operatiu | Ubuntu 26.04 LTS |
| Servidor web | Apache 2 |
| Llenguatge | PHP 8.3 |
| Base de dades | MariaDB |
| Moodle | 5.2 (branca estable) |
Abans d’instal·lar qualsevol paquet, cal assegurar-se que el sistema està completament actualitzat per evitar conflictes de dependències.
Actualitza la llista de paquets:
sudo apt updateActualitza els paquets instal·lats:
sudo apt upgradeEstableix el nom curt:
sudo hostnamectl set-hostname moodleEdita /etc/hosts per afegir l’FQDN:
sudo nano /etc/hostsAfegeix:
10.0.2.10 moodle.thos.local moodle
Verifica la resolució:
hostname -fResposta esperada:
moodle.thos.localEn Ubuntu 26.04, i als seus dopòsits oficials només hi ha PHP 8.5, cap versió anterior. Per tenir PHP 8.3 (la recomanada per Moodle 5.x en el moment que s’escriu aquest document) necessites el PPA de tercers d’Ondřej Surý, que és l’estàndard de facto per mantenir múltiples versions de PHP a Ubuntu/Debian.
Instal·la els prerequisits per afegir un dipòsit APT extern:
sudo apt install apt-transport-https lsb-release ca-certificates curl gnupgDescarrega i converteix la clau GPG del dipòsit Sury:
curl -fsSL https://packages.sury.org/php/apt.gpg | sudo gpg --dearmor -o /usr/share/keyrings/deb.sury.org-php.gpgRegistra el dipòsit Sury com a font de paquets APT, associant-lo a la clau GPG que acabes d’importar:
echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.listActualitza la llista de paquets:
sudo apt updateInstal·la Apache, PHP 8.3 amb totes les extensions requerides per Moodle, MariaDB i eines addicionals:
sudo apt install apache2 php8.3 mariadb-server libapache2-mod-php8.3 \
php8.3-mysql php8.3-curl php8.3-zip php8.3-xml php8.3-mbstring \
php8.3-gd php8.3-intl php8.3-soap php8.3-ldap unzip php8.3-ctype \
php8.3-dom php8.3-iconv php8.3-simplexml composerAssegura MariaDB:
sudo mariadb-secure-installationRespon afirmativament a totes les preguntes (establir contrasenya root, eliminar usuaris anònims, desactivar accés remot de root, eliminar la base de dades de test i recarregar privilegis).
| Paquet | Funció |
|---|---|
apache2 |
Servidor web HTTP/HTTPS |
php8.3 |
Intèrpret PHP |
mariadb-server |
Base de dades relacional (compatible MySQL) |
libapache2-mod-php8.3 |
Mòdul PHP per a Apache |
php8.3-mysql |
Connector PHP ↔︎ MariaDB |
php8.3-gd |
Processament d’imatges |
php8.3-mbstring |
Suport per a caràcters multibyte (UTF-8) |
php8.3-xml / dom / simplexml |
Processament XML (requerit per Moodle) |
php8.3-intl |
Internacionalització i localització |
php8.3-ldap |
Autenticació contra servidors LDAP/AD |
php8.3-soap |
Serveis web SOAP |
unzip |
Descomprimir l’arxiu de Moodle |
composer |
Gestor de dependències PHP |
Descarrega la darrera versió estable de Moodle des del lloc oficial:
wget -c https://download.moodle.org/download.php/direct/stable502/moodle-latest-502.zipExtreu el contingut directament al directori web d’Apache:
sudo unzip -q moodle-latest-502.zip -d /var/www/Esborra el fitxer que ja no és necessari:
rm moodle-latest-502.zipMoodle necessita un directori extern al DocumentRoot per emmagatzemar fitxers pujats, la cau i altres dades. Ha d’estar fora del directori accessible via web per motius de seguretat:
sudo mkdir /var/www/moodledataEl directori moodledata NO ha d’estar
dins de /var/www/html ni ser accessible directament des del
navegador, ja que conté dades confidencials dels usuaris.
El servidor web (Apache) s’executa amb l’usuari www-data. Cal donar-li la propietat dels directoris de
Moodle i de dades:
sudo chown -R www-data:www-data /var/www/moodledata /var/www/moodleMoodle requereix que el paràmetre max_input_vars sigui
superior al valor per defecte (1000) per gestionar correctament els
formularis de configuració de cursos complexos. S’ha d’establir en
5000:
Edita el fitxer de configuració de PHP:
sudo nano -l /etc/php/8.3/apache2/php.iniModifica la línia 436. Descomenta i estableix el valor a 5000:
max_input_vars = 5000
Modifica la línia 1071. Descomenta i estableix el valor a 0:
pcre.jit=0
Moodle necessita una base de dades i un usuari dedicat amb tots els
permisos sobre aquesta. Accedeix a la consola de MariaDB com a root:
sudo mysql -u root -pDins de la consola SQL, crea la base de dades, l’usuari i assigna-li els privilegis necessaris:
CREATE DATABASE moodle CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON moodle.* TO umoodle@localhost IDENTIFIED BY 'contrasenya';
FLUSH PRIVILEGES;
EXITEn un entorn de producció, substitueix contrasenya per
una contrasenya segura. Recorda que haureu d’introduir-la durant
l’assistent d’instal·lació web de Moodle.
Per habilitar HTTPS, es genera un certificat autosignat vàlid per 365 dies. Això xifra la comunicació entre el client i el servidor, tot i que el navegador mostrarà un avís de seguretat donat que no està signat per una autoritat de certificació reconeguda.
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/moodle-autosignat.key \
-out /etc/ssl/certs/moodle-autosignat.crt \
-subj "/C=ES/ST=Catalunya/L=Mataro/O=IES Thos i Codina/OU=SMX/CN=moodle.thos.local/emailAddress=ramon@thosicodina.cat"sudo nano /etc/apache2/sites-available/moodle-ssl.conf<VirtualHost *:443>
ServerAdmin webmaster@localhost
ServerName moodle.thos.local
DocumentRoot /var/www/moodle/public
<Directory /var/www/moodle/public>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/moodle-autosignat.crt
SSLCertificateKeyFile /etc/ssl/private/moodle-autosignat.key
<FilesMatch "\.(?:cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
sudo nano /etc/apache2/sites-available/moodle.conf<VirtualHost *:80>
ServerName moodle.thos.local
Redirect permanent / https://moodle.thos.local/
</VirtualHost>
Habilita els mòduls:
sudo a2enmod rewrite headers env dir mime sslHabilita les pàgines de Moodle:
sudo a2ensite moodle.conf moodle-ssl.confVerifica la configuració:
sudo apache2ctl configtestSortida esperada:
Syntax OKReinicia Apache:
sudo systemctl restart apache2.serviceComprova l’estat:
sudo systemctl status apache2.serviceResposta esperada:
● apache2.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: enabled)
Active: active (running) since Wed 2026-07-08 12:42:59 UTC; 5s ago
Invocation: 84093042a3504747b82bf98142b51952
Docs: https://httpd.apache.org/docs/2.4/
Main PID: 15810 (apache2)
Status: "Processing requests..."
Tasks: 6 (limit: 1718)
Memory: 17.1M (peak: 17.1M)
CPU: 58ms
CGroup: /system.slice/apache2.service
├─15810 /usr/sbin/apache2 -k start -DFOREGROUND
├─15813 /usr/sbin/apache2 -k start -DFOREGROUND
├─15814 /usr/sbin/apache2 -k start -DFOREGROUND
├─15815 /usr/sbin/apache2 -k start -DFOREGROUND
├─15816 /usr/sbin/apache2 -k start -DFOREGROUND
└─15817 /usr/sbin/apache2 -k start -DFOREGROUND
de jul. 08 12:42:59 moodle systemd[1]: Starting apache2.service - The Apache HTTP Server...
de jul. 08 12:42:59 moodle systemd[1]: Started apache2.service - The Apache HTTP Server.Un cop finalitzats tots els passos anteriors, cal completar la instal·lació de Moodle mitjançant l’assistent web:
1-. Obre el navegador i accedeix a https://moodle.thos.local
2-. Si el navegador mostra un avís de seguretat pel certificat
autosignat, fes clic a Avançat i accepta el risc per
continuar.
3-. Tria l’idioma.
4-. Confirma el directori de dades: /var/www/moodledata
5-. Selecciona el tipus de base de dades: MariaDB (nativa / millor rendiment)
6-. Introdueix les dades de connexió a la base de dades:
- Servidor de base de dades: localhost
- Nom de la base de dades: moodle
- Usuari de la base de dades: umoodle
- Contrasenya de la base de dades: contrasenya
7-. En aquest punt torna al terminal i fes aquestes modificacions:
sudo nano /var/www/moodle/config.phpAbans de la línia 27 require_once(__DIR__ . '/lib/setup.php'); escriu:
$CFG->routerconfigured = true;
Desplaça’t a la carpeta de Moodle:
cd /var/www/moodle Instal·la les dependències PHP d’un projecte gestionat amb Composer (el gestor de paquets/dependències de PHP, equivalent a npm en Node o pip en Python), a partir del fitxer composer.json/composer.lock que hi ha al directori actual:
sudo composer install --no-dev --classmap-authoritativeDo not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]?
Composer could not detect the root package (moodle/moodle) version, defaulting to '1.0.0'. See https://getcomposer.org/root-version
Installing dependencies from lock file
Verifying lock file contents can be installed on current platform.
Package operations: 48 installs, 0 updates, 0 removals
- Downloading adodb/adodb-php (v5.22.11)
- Downloading psr/http-message (2.0)
- Downloading symfony/polyfill-mbstring (v1.33.0)
- Downloading mtdowling/jmespath.php (2.8.0)
- Downloading ralouphie/getallheaders (3.0.3)
- Downloading psr/http-factory (1.1.0)
- Downloading guzzlehttp/psr7 (2.8.0)
- Downloading guzzlehttp/promises (2.3.0)
- Downloading symfony/deprecation-contracts (v3.6.0)
- Downloading psr/http-client (1.0.3)
- Downloading guzzlehttp/guzzle (7.10.0)
- Downloading aws/aws-crt-php (v1.2.7)
- Downloading aws/aws-sdk-php (3.356.22)
- Downloading composer/pcre (3.3.2)
- Downloading ezyang/htmlpurifier (v4.18.0)
- Downloading firebase/php-jwt (v6.11.1)
- Downloading composer/ca-bundle (1.5.10)
- Downloading maxmind/web-service-common (v0.11.1)
- Downloading maxmind-db/reader (v1.12.1)
- Downloading geoip2/geoip2 (v3.2.0)
- Downloading html2text/html2text (4.3.2)
- Downloading kevinrob/guzzle-cache-middleware (7.0.0)
- Downloading lbuchs/webauthn (v2.2.0)
- Downloading maennchen/zipstream-php (3.2.0)
- Downloading matthiasmullie/path-converter (1.1.3)
- Downloading matthiasmullie/minify (1.3.75)
- Downloading michelf/php-markdown (2.0.0)
- Downloading psr/log (3.0.2)
- Downloading monolog/monolog (3.9.0)
- Downloading mustache/mustache (v3.0.0)
- Downloading openspout/openspout (v4.28.5)
- Downloading psr/container (2.0.2)
- Downloading php-di/invoker (2.3.6)
- Downloading laravel/serializable-closure (v2.0.10)
- Downloading php-di/php-di (7.0.8)
- Downloading phpmailer/phpmailer (v6.9.3)
- Downloading phpxmlrpc/phpxmlrpc (4.11.1)
- Downloading psr/cache (3.0.0)
- Downloading psr/clock (1.0.0)
- Downloading psr/event-dispatcher (1.0.0)
- Downloading psr/simple-cache (3.0.0)
- Downloading redeyeventures/geopattern (v1.1.2)
- Downloading simplepie/simplepie (1.8.1)
- Downloading psr/http-server-handler (1.0.2)
- Downloading psr/http-server-middleware (1.0.2)
- Downloading nikic/fast-route (v1.3.0)
- Downloading slim/slim (4.13.0)
- Downloading spatie/php-cloneable (1.0.2)
- Installing adodb/adodb-php (v5.22.11): Extracting archive
- Installing psr/http-message (2.0): Extracting archive
- Installing symfony/polyfill-mbstring (v1.33.0): Extracting archive
- Installing mtdowling/jmespath.php (2.8.0): Extracting archive
- Installing ralouphie/getallheaders (3.0.3): Extracting archive
- Installing psr/http-factory (1.1.0): Extracting archive
- Installing guzzlehttp/psr7 (2.8.0): Extracting archive
- Installing guzzlehttp/promises (2.3.0): Extracting archive
- Installing symfony/deprecation-contracts (v3.6.0): Extracting archive
- Installing psr/http-client (1.0.3): Extracting archive
- Installing guzzlehttp/guzzle (7.10.0): Extracting archive
- Installing aws/aws-crt-php (v1.2.7): Extracting archive
- Installing aws/aws-sdk-php (3.356.22): Extracting archive
- Installing composer/pcre (3.3.2): Extracting archive
- Installing ezyang/htmlpurifier (v4.18.0): Extracting archive
- Installing firebase/php-jwt (v6.11.1): Extracting archive
- Installing composer/ca-bundle (1.5.10): Extracting archive
- Installing maxmind/web-service-common (v0.11.1): Extracting archive
- Installing maxmind-db/reader (v1.12.1): Extracting archive
- Installing geoip2/geoip2 (v3.2.0): Extracting archive
- Installing html2text/html2text (4.3.2): Extracting archive
- Installing kevinrob/guzzle-cache-middleware (7.0.0): Extracting archive
- Installing lbuchs/webauthn (v2.2.0): Extracting archive
- Installing maennchen/zipstream-php (3.2.0): Extracting archive
- Installing matthiasmullie/path-converter (1.1.3): Extracting archive
- Installing matthiasmullie/minify (1.3.75): Extracting archive
- Installing michelf/php-markdown (2.0.0): Extracting archive
- Installing psr/log (3.0.2): Extracting archive
- Installing monolog/monolog (3.9.0): Extracting archive
- Installing mustache/mustache (v3.0.0): Extracting archive
- Installing openspout/openspout (v4.28.5): Extracting archive
- Installing psr/container (2.0.2): Extracting archive
- Installing php-di/invoker (2.3.6): Extracting archive
- Installing laravel/serializable-closure (v2.0.10): Extracting archive
- Installing php-di/php-di (7.0.8): Extracting archive
- Installing phpmailer/phpmailer (v6.9.3): Extracting archive
- Installing phpxmlrpc/phpxmlrpc (4.11.1): Extracting archive
- Installing psr/cache (3.0.0): Extracting archive
- Installing psr/clock (1.0.0): Extracting archive
- Installing psr/event-dispatcher (1.0.0): Extracting archive
- Installing psr/simple-cache (3.0.0): Extracting archive
- Installing redeyeventures/geopattern (v1.1.2): Extracting archive
- Installing simplepie/simplepie (1.8.1): Extracting archive
- Installing psr/http-server-handler (1.0.2): Extracting archive
- Installing psr/http-server-middleware (1.0.2): Extracting archive
- Installing nikic/fast-route (v1.3.0): Extracting archive
- Installing slim/slim (4.13.0): Extracting archive
- Installing spatie/php-cloneable (1.0.2): Extracting archive
Generating optimized autoload files
17 packages you are using are looking for funding.
Use the `composer fund` command to find out more!Continua amb l’assistent web.
8-. Llegeix i accepta els termes de la llicència.
9-. L’assistent comprovarà els requisits del sistema. Si tot és
correcte, fes clic a Continua.
10-. Moodle instal·larà les taules de la base de dades. Això pot trigar uns minuts. Prem Continua en acabar.
11-. Configura el compte d’administrador: nom, cognom, correu electrònic i contrasenya.
12-. Configura les dades del lloc: nom, descripció i idioma per defecte.
13-. Configura el correu del compte de suport.
Després d’acabar la configuració al navegador, cal aplicar permisos restrictius als fitxers de Moodle per evitar modificacions no autoritzades.
Es transfereix la propietat del directori principal i del fitxer de
configuració a root, de manera que Apache (www-data) no
pugui modificar-los:
sudo chown root:root /var/www/moodle/sudo chown root:root /var/www/moodle/config.phpEl fitxer config.php conté les credencials de la base de
dades. S’estableix com a només lectura:
sudo chmod 644 /var/www/moodle/config.phpNota: La combinació
chown root+chmod 644assegura que Apache pot llegir el fitxerconfig.php, però no pot modificar-lo, protegint les credencials de la base de dades.
Un cop completada la instal·lació, verifica que tot funciona correctament:
# Estat d'Apache
sudo systemctl status apache2.service
# Estat de MariaDB
sudo systemctl status mariadb.service
# Versió de PHP
sudo php -v
# Connexió a la base de dades
mysql -u umoodle -p contrasenyaFinalment, accedeix a https://moodle.thos.local des del navegador i comprova que Moodle carrega correctament.
| Problema | Solució |
|---|---|
| Apache no s’inicia | Comprova els errors amb: journalctl -xe | grep apache2 |
| Error 403 Forbidden | Verifica els permisos de /var/www/moodle i el bloc Directory a moodle-ssl.conf |
| Avís de certificat SSL | Normal amb certificats autosignats. Accepta l’excepció al navegador |
| Error de connexió a la BD | Verifica usuari i contrasenya. Comprova que MariaDB està en marxa |
max_input_vars massa baix |
Verifica que php.ini té max_input_vars = 5000 i reinicia Apache |
moodledata no accessible |
Comprova que /var/www/moodledata existeix i és
propietat de www-data |
Per a qualsevol dubte, consulta la documentació oficial a https://docs.moodle.org.