Как установить Moodle на облачный сервер
Рассмотрим установку Moodle — бесплатной системы управления обучением (LMS).
Moodle (Modular Object-Oriented Dynamic Learning Environment) — это бесплатная система управления обучением (LMS) с открытым исходным кодом, предназначенная для организации онлайн-курсов и дистанционного образования.
Подготовка инфраструктуры
Для установки Moodle необходим сервер с установленным PHP и базой данных. Требования к аппаратной составляющей минимальны:
- 200 МБ дискового пространства для самой системы Moodle и необходимый объем для размещения данных;
- процессор 1 ядро частотой 1 ГГц — совсем минимум, но лучше взять 2 ядра по 2 ГГц;
- 512 МБ оперативной памяти — минимум, 1 ГБ — рекомендуется, 8 ГБ — для больших нагрузок.
Все приведенные значения являются примерными, потребление ресурсов зависит от посещаемости сервиса и размещаемого контента. Лучшее решение — начать с небольших вычислительных ресурсов и масштабировать их по мере необходимости.
В нашем облаке действует модель оплаты Pay-as-You-Go — средства взимаются только за фактическое потребление ресурсов, поэтому нет смысла брать «про запас». В любой момент можно добрать необходимое за пару кликов в панели управления.
Масштабирование работает и обратную сторону: если нагрузка спадет, можно вернуть ставшие ненужными ресурсы в облако и не платить лишнего.
Начнем с сервера 2 vCPU, 4 GB RAM, 50 GB SSD.

Заходим в панель управления Selectel, далее Продукты → Облачные серверы → Создать сервер. Выбираем 2 vCPU, 4 GB RAM, 50 GB Универсальный SSD и Ubuntu 24.04 в Санкт-Петербурге, ru-1b.
Хотя интерфейс предлагает указать пароль суперпользователя и не требует SSH-ключ, мы настоятельно рекомендуем для подключения к виртуальной машине использовать именно его, как более безопасную альтернативу паролю. Когда вся информация заполнена, нажимаем Создать сервер. После появления сервера в его карточке будет инструкция по подключению. Проверяем.
$ ssh root@139.100.X.X
The authenticity of host '139.100.X.X (139.100.X.X)' can't be established.
ED25519 key fingerprint is SHA256:8v0xKIqzm2Z8vaG5o5Ks+YigHtfwpC4ZJSwGGFOdPbw.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
# Появится приглашение удаленного сервера
root@moodle:~#
Сервер доступен. Осталось привязать домен для упрощения доступа к нему — например, learn.example.com. Купить новый домен или делегировать существующий можно не выходя из панели управления Selectel.
Теперь мы готовы к дальнейшим действиям.
Развертывание Moodle
Moodle — это набор PHP-скриптов, размещенных в корне веб-каталога. Для их выполнения нужны веб-сервер и интерпретатор PHP. Также нужна база данных для хранения данных пользователей. Начнем однако с обеспечения безопасности сервера — установки фаервола.
Установка фаервола
Устанавливаем фаервол в первую очередь, так как некорректная конфигурация может привести к недоступности сервера, а на ранних этапах это менее критично.
В репозиториях Ubuntu есть простой фаервол, который закрывает базовые потребности — ufw.
sudo apt update
sudo apt install ufw
Разрешаем SSH, HTTP, HTTPS и выбираем политику по умолчанию: не пускать.
ufw allow ssh
ufw allow http
ufw allow https
ufw default deny
ufw enable
ufw status
Теперь переходим к установке необходимых компонентов.
Установка базы данных
Для работы Moodle нужна база данных. Особых требований к СУБД нет: это может быть как MySQL или MariaDB, так и PostgreSQL или MSSQL. Мы рассмотрим установку СУБД на примере PostgreSQL.
PostgreSQL доступна в стандартных репозиториях пакетного менеджера Ubuntu, но там имеется только версия 16, а для Moodle нужна хотя бы 17‑я. Поэтому нужно подключить официальные репозитории PostgreSQL, для чего воспользуемся пакетом postgresql-common.
apt install -y postgresql-common
/usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
Затем устанавливаем последнюю версию.
apt install postgresql
По умолчанию в PostgreSQL используется подключение по сокету Unix-domain, а аутентификация производится через системных пользователей. Поэтому для входа в командную строку СУБД нужно переключиться на пользователя postgres.
sudo -u postgres -i
psql
Теперь создаем пользователя и базу данных для moodle.
Внимание!
Обязательно сгенерируйте собственный безопасный пароль!
CREATE USER moodleuser WITH PASSWORD 'yourpassword';
CREATE DATABASE moodle WITH OWNER moodleuser;
Теперь необходимо разрешить подключение к базе данных по inet-сокетам. Откроем файл /etc/postgresql/18/main/pg_hba.conf. Число, в нашем примере это «18», зависит от установленной версии СУБД. Найдем внизу файла такую строку:
# TYPE DATABASE USER ADDRESS METHOD
На следующей строке впишем:
host moodle moodleuser 127.0.0.1/32 password
Адрес 127.0.0.1/32 определяет откуда разрешены подключения.. Для доступа из локальной сети необходимо указать локальную подсеть — хороший вариант для развертывания на одном сервере. Сохраним файл и перезагрузим СУБД.
service postgresql restart
Проверить корректность настроек и наличие доступа можно следующей командой:
psql -U moodleuser -h 127.0.0.1 moodle
После ввода пароля мы должны увидеть строку приглашения PostgreSQL с заданным именем хоста:
Password for user moodleuser:
psql (16.15 (Ubuntu 16.15-0ubuntu0.24.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
moodle=>
База данных создана, продолжаем.
Установка веб-сервера
В первую очередь ставим веб-сервер, который возьмет на себя задачу обработки и маршрутизации входящих запросов, а также вопросы организации безопасного подключения через HTTPS.
Moodle хорошо работает с Apache2, nginx, AMP, IIS и OpenLiteSpeed. В рамках данной статьи рассмотрим установку легковесного nginx.
Как и ранее, nginx доступен в стандартных репозиториях Ubuntu, но там устаревшая версия. Добавляем APT-репозиторий nginx, для чего сначала установим необходимые утилиты для скачивания ключа репозитория.
# Устанавливаем нужные утилиты
apt update
apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
# Скачиваем ключ репозитория
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Убеждаемся, что ключ содержит правильный отпечаток:
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
Запускаем утилиту для работы с OpenPGP.
root@moodle:~# gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
В ответ мы должны увидеть примерно следующую информацию.
pub rsa4096 2024-05-29 [SC]
8540A6F18833A80E9C1653A42FD21310B49F6B46
uid nginx signing key <signing-key-2@nginx.com>
pub rsa2048 2011-08-19 [SC] [expires: 2027-05-24]
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid nginx signing key <signing-key@nginx.com>
pub rsa4096 2024-05-29 [SC]
9E9BE90EACBCDE69FE9B204CBCDCD8A38D88A2B3
uid nginx signing key <signing-key-3@nginx.com>
Видим, что требуемый отпечаток присутствует. Добавляем репозиторий в список источников.
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
https://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
Устанавливаем nginx.
apt update
apt install nginx
Сразу после установки nginx остается выключенным. Сейчас подходящий момент, чтобы отредактировать файл конфигурации и «научить» веб-сервер нашему домену, что также пригодится для создания SSL-сертификата. Открываем файл /etc/nginx/conf.d/default.conf и редактируем директиву server_name.
Было:
server_name localhost;
Стало:
server_name learn.example.com;
Сохраняем и запускаем nginx.
systemctl start nginx

Открываем в браузере learn.example.com — и видим приветствие nginx.
Подключение SSL для домена
Устанавливаем certbot — программу, которая создает сертификаты Let’s Encrypt для доменов. Так как мы используем nginx, то дополнительно установим для него специальный плагин, что упростит подключение HTTPS.
apt install certbot python3-certbot-nginx
Обратите внимание, что домен, на который выписывается сертификат, должен быть указан в файлах конфигурации nginx. Поскольку мы уже это сделали, просто выписываем сертификат.
certbot --nginx -d learn.example.com
В процессе работы программа уточнит email-адрес (обязательно), спросит согласие с условиями сервиса (обязательно) и предложит поделиться почтовым адресом с партнерами (опционально).
После успешного выполнения команды заходим на chat.example.com и видим, что подключение защищено.
Программу certbot удалять не нужно: сертификат истекает через три месяца, а certbot автоматически его продлевает.
Установка PHP
Текущая актуальная версия Moodle 5.3 требует PHP 8.3 или 8.4. К счастью, PHP 8.3 доступен в стандартных репозиториях Ubuntu. Важно использовать пакет с версией в имени, а также явно указать пакет php-fpm для запуска PHP в nginx. Иначе пакетный менеджер возьмет зависимость по умолчанию — libapache2-mod-php8.3, а она зависимость потребует веб-сервер Apache2, который нам не нужен.
apt install php8.3 php8.3-fpm php8.3-pgsql php8.3-common php8.3-curl php8.3-xml php8.3-gd php8.3-intl php8.3-mbstring php8.3-zip php8.3-soap
Для работы Moodle нужна целая россыпь модулей PHP. Среди них один специфичный — драйвер базы данных PostgreSQL (php8.3-pgsql). Если используется другая СУБД, то драйвер необходимо заменить на соответствующий.
Проверяем корректность установки.
root@moodle:~# php -v
PHP 8.3.6 (cli) (built: Sep 2 2026 12:56:02) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.6, Copyright (c) Zend Technologies
with Zend OPcache v8.3.6, Copyright (c), by Zend Technologies
Не отходя от PHP изменим один параметр интерпретатора. Открываем файл /etc/php/8.3/fpm/php.ini и находим такую строку:
;max_input_vars = 1000
Убираем точку с запятой и меняем значение на 5000. Можно больше, главное — не меньше. Это требование Moodle.
max_input_vars = 5000
Повторим эту же правку в файле /etc/php/8.3/cli/php.ini и перезагрузим сервис.
service php8.3-fpm restart
Теперь объединим все компоненты.
Установка Moodle
Создаем каталоги для moodle:
# Создаем каталог для данных moodle. Ключ -p создаст каталог /opt, если его нет
mkdir -p /opt/moodledata
# Передаем владение пользователю www-data, от имени которого запускается php
chown www-data:www-data /opt/moodledata/
# Скачиваем Moodle
wget https://download.moodle.org/download.php/direct/stable503/moodle-5.3.tgz
# Распаковываем
tar xvfz moodle-5.3.tgz
# Переносим в /opt
mv moodle /opt/
После переноса нужно выполнить первоначальную установку. Безопаснее всего это выполнить через командную строку.
# Временно даем владение каталога пользователю www-data
chown www-data /opt/moodle
cd /opt/moodle/admin/cli
# Выполняем настройку, запуская php от пользователя www-data
sudo -u www-data /usr/bin/php install.php
# Забираем владение обратно
chown root /opt/moodle
До начала установки Moodle задаст несколько вопросов: предпочтительный язык, веб-адрес, назначенный системе, данные для подключения к базе данных и данные для входа администратора, а также проверит, что все компоненты PHP доступны, подключение к СУБД корректно. В конце установки будет такой вывод.
Installation completed successfully.
Moodle в процессе работы выполняет периодические задания, но не имеет компонента для инициации периодических заданий. Сделать это можно сделать с помощью cron.
crontab -u www-data -e
Затем вписываем задание.
* * * * * /usr/bin/php /opt/moodle/admin/cli/cron.php >/dev/null
Осталось настроить nginx, чтобы сделать Moodle доступным. Сперва открывает /etc/nginx/nginx.conf и находим директиву user.
user nginx;
Эта директива указывает от имени какого пользователя запускается процесс nginx. FastCGI-процесс PHP запускается от имени www-data и разрешает к себе доступ только для процессов того же пользователя. Меняем пользователя nginx на www-data.
user www-data;
Затем редактируем файл /etc/nginx/conf.d/default.conf.
server {
server_name learn.example.com;
# Меняем корень на /opt/moodle/public
root /opt/moodle/public;
index index.php;
# Настраиваем роутер Moodle
location / {
try_files $uri $uri/ /r.php$is_args$args;
}
# Передаем все .php-файлы интерпретатору в FastCGI-процессе
location ~ \.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.*)$;
set $path_info $fastcgi_path_info;
# Если файл есть, то отдается он, если нет, то путь передается роутеру
try_files $fastcgi_script_name $fastcgi_script_name/ /r.php$is_args$args;
# Параметр подключения к FastCGI-процессу.
# Подключение через Unix-domain-сокет
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
include fastcgi_params;
fastcgi_param PATH_INFO $path_info;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
}
# Прячем файлы, имена которых начинаются с точки, но не с .well-known
location ~ /\.(?!well-known).* {
return 404;
}
# Прячем служебные файлы Moodle, которые есть в каталоге public
location ~ (/vendor/|/node_modules/|composer\.json|/readme|/README|readme\.txt|/upgrade\.txt|/UPGRADING\.md|db/install\.xml|/fixtures/|/behat/|phpunit\.xml|\.lock|environment\.xml) {
deny all;
return 404;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/learn.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/learn.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = learn.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name learn.example.com;
return 404; # managed by Certbot
}
После внесенных правок перезапускаем nginx.
service nginx restart

Если все сделано правильно, то Moodle доступен. Входим с аккаунтом администратора, который определили при настройке.

Заполняем обязательные поля и нажимаем Update profile. Теперь можно заниматься наполнением площадки.
Если нужен русский язык в системе, то выбираем пункт Site administration → General → Language Packs и добавляем необходимые языковые пакеты. Их также можно скачать вручную с официального сайта и распаковать в /opt/moodledata/lang/.
Заключение
Moodle — это бесплатная система управления обучением с открытым исходным кодом. И теперь вы знаете, как легко установить ее на сервер.