Сертификат Let's Encrypt для lms.cdto.life (Moodle 4.5)
Сертификат используется в контейнере BBB-CONT22-1 (HAProxy на порту 443). После выпуска сертификат добавляется в /etc/haproxy/certs/ и HAProxy перезагружается.
Требования: DNS A-запись lms.cdto.life указывает на IP сервера (89.179.242.240).
Вариант 1: Certbot в BBB (HTTP-01, порт 80)
Подходит, если порт 80 доступен из интернета (трафик доходит до сервера и до BBB).
Автоматический скрипт (рекомендуется)
На хосте выполнить:
sudo /home/cdto/DENKART/scripts/issue-lms-cdto-life-cert.sh
Скрипт:
1. Останавливает nginx в BBB (освобождает порт 80).
2. Запускает certbot certonly --standalone -d lms.cdto.life в контейнере.
3. Запускает nginx.
4. Копирует fullchain+privkey в /etc/haproxy/certs/lms.cdto.life.pem.
5. Перезагружает HAProxy.
После выполнения проверьте в браузере: https://lms.cdto.life — сертификат должен быть валидным для lms.cdto.life.
Вручную (в контейнере BBB)
lxc exec BBB-CONT22-1 -- systemctl stop nginx
lxc exec BBB-CONT22-1 -- certbot certonly --standalone \
-d lms.cdto.life \
--non-interactive --agree-tos --email admin@cdto.life
lxc exec BBB-CONT22-1 -- systemctl start nginx
lxc exec BBB-CONT22-1 -- bash -c 'cat /etc/letsencrypt/live/lms.cdto.life/fullchain.pem /etc/letsencrypt/live/lms.cdto.life/privkey.pem > /etc/haproxy/certs/lms.cdto.life.pem && chmod 600 /etc/haproxy/certs/lms.cdto.life.pem && chown haproxy:haproxy /etc/haproxy/certs/lms.cdto.life.pem'
lxc exec BBB-CONT22-1 -- systemctl reload haproxy
Вариант 2: DNS-01 (когда порт 80 недоступен)
Подходит, если провайдер блокирует входящие 80/443 или трафик не доходит до BBB. Нужен доступ к управлению DNS домена cdto.life (добавление TXT-записи для _acme-challenge.lms.cdto.life).
2.1. Ручной DNS-01 (certbot --manual)
На хосте или в контейнере с установленным certbot:
sudo certbot certonly --manual --preferred-challenges dns \
-d lms.cdto.life \
--agree-tos --email admin@cdto.life
Certbot выведет значение для TXT-записи. Добавьте в DNS:
- Имя (Host):
_acme-challenge.lms.cdto.life - Тип: TXT
- Значение: строка, выданная certbot
После распространения DNS (1–5 мин) нажмите Enter в certbot. Сертификат появится в /etc/letsencrypt/live/lms.cdto.life/ на той машине, где запускали certbot.
Перенос в BBB и HAProxy: если certbot выполнялся на хосте, скопируйте сертификат в BBB и соберите .pem для HAProxy:
# На хосте (путь к сертификату после certbot)
sudo cat /etc/letsencrypt/live/lms.cdto.life/fullchain.pem /etc/letsencrypt/live/lms.cdto.life/privkey.pem | lxc exec BBB-CONT22-1 -- tee /etc/haproxy/certs/lms.cdto.life.pem > /dev/null
lxc exec BBB-CONT22-1 -- chmod 600 /etc/haproxy/certs/lms.cdto.life.pem
lxc exec BBB-CONT22-1 -- chown haproxy:haproxy /etc/haproxy/certs/lms.cdto.life.pem
lxc exec BBB-CONT22-1 -- systemctl reload haproxy
2.2. DNS-01 с плагином (Cloudflare и др.)
Если используется Cloudflare (или другой плагин certbot-dns-*):
# Установка плагина (на хосте или в контейнере)
sudo apt install certbot python3-certbot-dns-cloudflare
# Файл с API-токеном, например /root/.secrets/cloudflare.ini:
# dns_cloudflare_api_token = YOUR_TOKEN
sudo certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
-d lms.cdto.life \
--non-interactive --agree-tos --email admin@cdto.life
Далее перенесите сертификат в BBB и перезагрузите HAProxy (как в 2.1).
Продление сертификата
- В BBB обычно настроен certbot.timer (systemd). Он продлевает все сертификаты в
/etc/letsencrypt/live/. - После продления нужно обновить файл в HAProxy и перезагрузить HAProxy. Рекомендуется добавить хук certbot в контейнере BBB:
bash
lxc exec BBB-CONT22-1 -- bash -c 'echo -e "#!/bin/bash\nif echo \"\$RENEWED_DOMAINS\" | grep -q lms.cdto.life; then\n cat /etc/letsencrypt/live/lms.cdto.life/fullchain.pem /etc/letsencrypt/live/lms.cdto.life/privkey.pem > /etc/haproxy/certs/lms.cdto.life.pem\n chown haproxy:haproxy /etc/haproxy/certs/lms.cdto.life.pem\n systemctl reload haproxy\nfi" > /etc/letsencrypt/renewal-hooks/deploy/update-haproxy-lms.sh && chmod +x /etc/letsencrypt/renewal-hooks/deploy/update-haproxy-lms.sh'
Проверка
# С хоста
curl -sI https://lms.cdto.life/ | head -5
echo | openssl s_client -connect lms.cdto.life:443 -servername lms.cdto.life 2>/dev/null | openssl x509 -noout -subject -dates -ext subjectAltName
В subjectAltName должно быть DNS:lms.cdto.life.
Связанные документы: Чек-лист Фазы 5 (веб и SSL), Сертификат school.cdto.life. Отчёт о выполнении настройки SSL для lms.cdto.life (12.02.2026).