План перехода к архитектуре: 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.life →
proxy_pass https://10.218.14.1:9090(Cockpit),proxy_ssl_verify off. - docs.cdto.group, docs.cdto.life →
proxy_pass http://10.218.14.102:80(или :8090 — по факту работы docs-denkart). - school.cdto.life →
proxy_pass http://10.218.14.37:80(BigBlueButton).
За основу взять:
config/nginx/denkart-routing.confconfig/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 в контейнере).
Связанные документы
- Маршрутизация через nginx-reverse-proxy
- Сохранение перед изменениями
- Быстрая инструкция по роутеру
- Скрипты:
config/iptables/port-forwarding-rules-nginx-proxy.sh,scripts/save-state-before-migration.sh