Сертификат 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).