План перехода к архитектуре: nginx-reverse-proxy как единственная точка входа

Дата: 2026-02-08
Статус перехода: В процессе (по факту трафик 80/443 может ещё идти в BBB-CONT22-1 — проверить iptables).
Цель: Весь веб-трафик 80/443 принимать в контейнере nginx-reverse-proxy (10.218.14.200) и маршрутизировать по Host на бэкенды (docs-denkart, BBB-CONT22-1, Cockpit).
Результат: При остановке BBB-CONT22-1 остаются доступны denkart.cdto.group и docs.cdto.group (и при настройке — docs.cdto.life).

Перед началом: выполнить полное сохранение (фаза 0) и при любом изменении файлов создавать копии (.bak или в config/snapshots/). Подробный анализ и расширенный план: ROUTING-ANALYSIS-AND-NGINX-PROXY-MIGRATION-PLAN.md.


Фаза 0. Сохранение текущего состояния (обязательно перед началом)

Шаг Действие Команда / проверка
0.1 Полное сохранение состояния ./scripts/save-state-before-migration.sh pre-nginx-proxy-migration
0.2 Проверить созданную директорию ls -la config/snapshots/state-pre-nginx-proxy-migration-*
0.3 Закоммитить и выгрузить в репозиторий git add -A && git commit -m "Состояние перед переходом на nginx-reverse-proxy" && git push origin develop
0.4 (Рекомендуется) Создать тег точки отката git tag -a v1.5-pre-nginx-proxy -m "До перехода на nginx-reverse-proxy" && git push origin v1.5-pre-nginx-proxy

Критерий выхода из фазы 0: Снимки созданы, коммит запушен, при необходимости тег создан. Откат возможен по инструкции в BACKUP-BEFORE-CHANGES.md.


Фаза 1. Подготовка nginx-reverse-proxy

Правило: перед изменением любого конфига создавать копию (например config/nginx/nginx-reverse-proxy-routing.conf.bak.$(date +%Y%m%d)).

Шаг Действие Детали
1.1 Убедиться, что контейнер запущен и имеет IPv4 lxc list nginx-reverse-proxy — IP 10.218.14.200
1.2 Установить/проверить nginx и certbot в контейнере По необходимости: scripts/setup-nginx-reverse-proxy.sh
1.3 Создать копию конфига, затем править cp config/nginx/nginx-reverse-proxy-routing.conf config/nginx/nginx-reverse-proxy-routing.conf.bak.$(date +%Y%m%d); затем создать/обновить конфиг (см. раздел «Конфиг nginx в nginx-reverse-proxy» ниже)
1.4 Настроить SSL (сертификаты) Вариант A: Certbot в контейнере для всех доменов. Вариант B: копировать bundle/cert с хоста (например из BBB-CONT22-1 или certs-work)
1.5 Проверить маршруты по server_name denkart.cdto.group, denkart.cdto.life → 10.218.14.1:9090; docs.* → 10.218.14.102; school.cdto.life → 10.218.14.37:80
1.6 nginx -t и systemctl reload nginx внутри контейнера Ошибок быть не должно

Критерий выхода из фазы 1: Изнутри хоста запрос curl -k -H "Host: denkart.cdto.group" https://10.218.14.200/ возвращает 200 (или редирект на Cockpit).


Фаза 2. Переключение iptables на nginx-reverse-proxy

Правило: сохранить текущие правила iptables перед переключением: sudo iptables-save > config/snapshots/iptables-before-nginx-proxy-$(date +%Y%m%d).rules. Копия скрипта: cp config/iptables/port-forwarding-rules-nginx-proxy.sh config/iptables/port-forwarding-rules-nginx-proxy.sh.bak.$(date +%Y%m%d).

Шаг Действие Детали
2.1 Удалить старые правила DNAT/FORWARD/POSTROUTING для 10.218.14.37 (80/443) Вручную или скриптом отката; см. config/iptables/port-forwarding-rules.sh
2.2 Применить правила для 10.218.14.200 sudo ./config/iptables/port-forwarding-rules-nginx-proxy.sh (или скопировать команды из скрипта)
2.3 Сохранить правила для восстановления после перезагрузки sudo netfilter-persistent save или iptables-save в нужный файл по вашей схеме
2.4 Проверить с хоста по внешнему IP или по 192.168.1.112 curl -sI -k -H "Host: denkart.cdto.group" https://192.168.1.112/ — ожидается HTTP/2 200 (или 301)

Критерий выхода из фазы 2: Трафик на 80/443 с хоста уходит в nginx-reverse-proxy; denkart.cdto.group и docs открываются.


Фаза 3. Проверка и стабилизация

Шаг Действие Детали
3.1 Проверка при работающем BBB Открыть https://school.cdto.life, https://denkart.cdto.group, https://docs.cdto.group
3.2 Проверка при остановленном BBB lxc stop BBB-CONT22-1; denkart и docs должны оставаться доступны, school — 502/503/таймаут
3.3 Запустить BBB обратно lxc start BBB-CONT22-1
3.4 Обновить документацию host-server-passport.md, domains-configuration.md, final-architecture.md — указать nginx-reverse-proxy как единственную точку входа для 80/443
3.5 Закоммитить итоговое состояние Коммит + push; при необходимости тег v1.6-nginx-proxy

Критерий выхода из фазы 3: Все три домена работают; при остановке BBB падает только school; документация и репозиторий обновлены.


Фаза 4. Опционально: упрощение BBB-CONT22-1

После стабилизации можно рассмотреть:

  • Убрать с BBB-CONT22-1 приём 80/443 «снаружи» (оставить только приём от nginx-reverse-proxy по внутренней сети), если это упрощает конфиг.
  • Оставить HAProxy/Nginx в BBB только для внутренней маршрутизации к BigBlueButton — по желанию.

Это не обязательно для достижения целевой схемы и может быть отдельным этапом.


Конфиг nginx в nginx-reverse-proxy (шаблон)

Идея: один или несколько server с listen 80 и listen 443 ssl, общие для доменов cdto.group / cdto.life.

  • denkart.cdto.group, denkart.cdto.lifeproxy_pass https://10.218.14.1:9090 (Cockpit), proxy_ssl_verify off.
  • docs.cdto.group, docs.cdto.lifeproxy_pass http://10.218.14.102:80 (или :8090 — по факту работы docs-denkart).
  • school.cdto.lifeproxy_pass http://10.218.14.37:80 (BigBlueButton).

За основу взять:

  • config/nginx/denkart-routing.conf
  • config/nginx/bbb-https-routing.conf
  • снимок config/snapshots/nginx-docs-denkart-2026-01-23.conf (SSL, server_name для cdto.group).

Сертификаты: в каждом server с listen 443 ssl указать ssl_certificate и ssl_certificate_key (Let's Encrypt или скопированные с хоста).


Откат при проблемах

Что откатить Действие
iptables sudo iptables-restore < config/snapshots/state-pre-nginx-proxy-migration-<timestamp>/iptables.rules
Контейнер nginx-reverse-proxy lxc restore nginx-reverse-proxy pre-proxy-YYYYMMDD-HHMM
Скрипты и конфиги Восстановить из той же директории state-* или git checkout v1.5-pre-nginx-proxy -- config/
Полный откат репозитория git checkout v1.5-pre-nginx-proxy (создать ветку при необходимости)

После отката iptables снова применять старый скрипт: config/iptables/port-forwarding-rules.sh (трафик в BBB-CONT22-1).


Краткая схема после перехода

Роутер (89.179.242.240) → хост (192.168.1.112) → iptables DNAT 80/443
  → nginx-reverse-proxy (10.218.14.200) :80, :443
      → denkart.cdto.group / .life  → Cockpit (10.218.14.1:9090)
      → docs.cdto.group / .life     → docs-denkart (10.218.14.102)
      → school.cdto.life           → BBB-CONT22-1 (10.218.14.37:80)

Важно после перехода

  • IPv4 в nginx-reverse-proxy: В контейнере LXD может не применять статический IPv4 (10.218.14.200) при загрузке. Если после перезагрузки контейнера доступ пропал — с хоста выполнить:
    bash lxc exec nginx-reverse-proxy -- ip addr add 10.218.14.200/24 dev eth0 2>/dev/null lxc exec nginx-reverse-proxy -- ip route add default via 10.218.14.1 2>/dev/null
    Для постоянной настройки: добавить netplan или скрипт в контейнер (см. setup-container-ipv4.sh для примера).

  • Сертификаты: В nginx-reverse-proxy сейчас временный self-signed сертификат. Для продакшена скопировать с хоста реальные сертификаты в /etc/ssl/denkart/ контейнера (или настроить Certbot в контейнере).

Связанные документы