Глубокий анализ маршрутизации и план перехода на nginx-reverse-proxy

Дата: 2026-02-08
Заказчик: CDTO Dkvark
Технический директор: AI Denkart
Цель: Единая точка входа через контейнер nginx-reverse-proxy; при отключении BBB-CONT22-1 должны продолжать работать denkart.cdto.group и docs.cdto.life.


1. Текущая архитектура маршрутизации (как сейчас работает)

1.1 Цепочка трафика (при включённом BBB-CONT22-1)

Роутер (89.179.242.240)
     порты 80, 443
Хост (192.168.1.112, интерфейс enp13s0)
     iptables: PREROUTING DNAT 80/443  10.218.14.37
BBB-CONT22-1 (10.218.14.37)
    ├── HAProxy слушает *:443 (SSL-терминация, certbundle.pem)
       По Host:
        denkart.cdto.life, docs.cdto.life  backend nginx-443  Nginx 127.0.0.1:443
        school.cdto.life  backend nginx-http2 (BigBlueButton)
    
    └── Nginx в BBB:
         127.0.0.1:443  нет в конфиге; HAProxy ссылается на 127.0.0.1:443 (опечатка в haproxy-routing.cfg  там localhost:443)
         127.0.0.1:8443  виртуальные хосты по server_name:
            - denkart.cdto.life  proxy_pass http://10.218.14.102:80 (docs-denkart)
            - docs.cdto.life    proxy_pass http://10.218.14.102:80 (docs-denkart)
            - denkart.cdto.group  proxy_pass https://10.218.14.1:9090 (Cockpit)
            - docs.cdto.group   proxy_pass https://10.218.14.102:443 (docs-denkart)
         127.0.0.1:81/82 (proxy_protocol)  denkart.cdto.life  Cockpit (10.218.14.1:9090)

Фактически в BBB используется HAProxy :443 и Nginx :8443 / :81. Маршрутизация по заголовку Host выполняется внутри BBB-CONT22-1. Бэкенды:

Домен / Host Куда идёт запрос Бэкенд
denkart.cdto.group HAProxy → Nginx :8443 Cockpit 10.218.14.1:9090
docs.cdto.group HAProxy → Nginx :8443 docs-denkart 10.218.14.102:443
denkart.cdto.life HAProxy → Nginx :8443 docs-denkart 10.218.14.102:80 (в bbb-https-routing.conf denkart.cdto.life идёт в docs!)
docs.cdto.life HAProxy → Nginx :8443 docs-denkart 10.218.14.102:80
school.cdto.life HAProxy → nginx-http2 BigBlueButton (локально в BBB)

Важно: В config/nginx/bbb-https-routing.conf для denkart.cdto.life указан proxy_pass в docs-denkart (10.218.14.102:80), а не в Cockpit. Cockpit обслуживает denkart.cdto.group. Для denkart.cdto.life в том же файле — прокси в docs. Значит либо на практике используется только denkart.cdto.group для Cockpit, либо есть ещё конфиг (denkart-cockpit-https-bbb.conf — там только denkart.cdto.life на портах 81/82 в Cockpit). Итог: вся точка входа — один контейнер BBB-CONT22-1. Пока он запущен, все три домена работают.

1.2 Почему при отключении BBB-CONT22-1 всё падает

  • iptables на хосте направляет весь трафик 80/443 только в 10.218.14.37 (BBB-CONT22-1).
  • Контейнеры docs-denkart (10.218.14.102) и Cockpit (хост 10.218.14.1:9090) сами по себе не получают входящий трафик с интернета — они доступны только из внутренней сети и через BBB.
  • При lxc stop BBB-CONT22-1 пакеты по-прежнему уходят на 10.218.14.37, но контейнер не отвечает → все домены (denkart, docs, school) становятся недоступны.

Вывод: Текущая архитектура не отказоустойчива: один контейнер (BBB) является единой точкой входа для всех сервисов.


2. Целевая архитектура (единая точка входа — nginx-reverse-proxy)

2.1 Схема после перехода

Роутер (89.179.242.240)
    ↓ 80, 443
Хост (192.168.1.112)
    ↓ iptables: DNAT 80/443 (и опционально 8443) → 10.218.14.200
nginx-reverse-proxy (10.218.14.200) :80, :443, :8443
    По server_name:
    • denkart.cdto.group (и при необходимости denkart.cdto.life) → Cockpit https://10.218.14.1:9090
    • docs.cdto.group (и docs.cdto.life) → docs-denkart http://10.218.14.102:80
    • school.cdto.life → BBB-CONT22-1 http://10.218.14.37:80

При остановленном BBB-CONT22-1:
- denkart.cdto.group и docs.cdto.life продолжают работать (прокси на хост и docs-denkart).
- school.cdto.life будет возвращать 502 Bad Gateway или таймаут (nginx-reverse-proxy не сможет достучаться до 10.218.14.37).

2.2 Готовые артефакты в репозитории

Компонент Файл / скрипт Назначение
Конфиг nginx в прокси config/nginx/nginx-reverse-proxy-routing.conf Маршрутизация по Host, SSL, заглушки для неиспользуемых доменов
iptables для прокси config/iptables/port-forwarding-rules-nginx-proxy.sh DNAT/FORWARD/POSTROUTING на 10.218.14.200
Сохранение состояния scripts/save-state-before-migration.sh Снимки конфигов, iptables, LXD snapshots
План по фазам docs/operations/MIGRATION-PLAN-NGINX-REVERSE-PROXY.md Фазы 0–4
Точка восстановления config/snapshots/state-pre-nginx-proxy-migration-2026-02-08-014722/ Снимок от 08.02.2026

Замечание по конфигу nginx-reverse-proxy: В nginx-reverse-proxy-routing.conf домены docs.cdto.life и denkart.cdto.life добавлены в те же блоки server_name, что и docs.cdto.group и denkart.cdto.group; после деплоя оба варианта доменов (.life и .group) будут вести на те же бэкенды (документация и Cockpit).


3. План перехода (с сохранением и копиями файлов)

Обязательные принципы

  1. Перед началом — полное сохранение состояния (точка восстановления).
  2. Перед изменением любого файла — создавать копию с суффиксом .bak или в config/snapshots/ с датой.
  3. Не удалять старые правила iptables, пока не проверена работа через nginx-reverse-proxy.

Фаза 0. Точка восстановления (обязательно первым шагом)

Шаг Действие Команда / проверка
0.1 Полное сохранение состояния cd /home/cdto/DENKART/scripts && ./save-state-before-migration.sh pre-nginx-proxy-migration
0.2 Проверить созданную директорию ls -la /home/cdto/DENKART/config/snapshots/state-pre-nginx-proxy-migration-*
0.3 Закоммитить и выгрузить в репозиторий cd /home/cdto/DENKART && 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

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


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

Шаг Действие Детали
1.1 Проверить контейнер и IP lxc list nginx-reverse-proxy — должен быть RUNNING, IP 10.218.14.200 (при необходимости: scripts/setup-container-ipv4.sh)
1.2 Установить/проверить nginx в контейнере При необходимости: scripts/setup-nginx-reverse-proxy.sh
1.3 Копия конфига перед изменением cp /home/cdto/DENKART/config/nginx/nginx-reverse-proxy-routing.conf /home/cdto/DENKART/config/nginx/nginx-reverse-proxy-routing.conf.bak.$(date +%Y%m%d)
1.4 Скопировать конфиг в контейнер lxc file push /home/cdto/DENKART/config/nginx/nginx-reverse-proxy-routing.conf nginx-reverse-proxy/etc/nginx/sites-enabled/01-routing.conf
1.5 Сертификаты в контейнер Скопировать с хоста в /etc/ssl/denkart/ контейнера: denkart.cdto.group., school.cdto.life. (или настроить Certbot в контейнере)
1.6 Заглушка и проверка Разместить stub в /var/www/stub контейнера; lxc exec nginx-reverse-proxy -- nginx -t и systemctl reload nginx
1.7 Проверка маршрутов изнутри хоста curl -k -H "Host: denkart.cdto.group" https://10.218.14.200/ — ожидается 200 или редирект Cockpit

Критерий выхода: Запрос к 10.218.14.200 с Host denkart.cdto.group возвращает ответ от Cockpit.


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

Шаг Действие Детали
2.1 Копия скрипта iptables cp /home/cdto/DENKART/config/iptables/port-forwarding-rules-nginx-proxy.sh /home/cdto/DENKART/config/iptables/port-forwarding-rules-nginx-proxy.sh.bak.$(date +%Y%m%d)
2.2 Сохранить текущие правила (на случай отката) sudo iptables-save > /home/cdto/DENKART/config/snapshots/iptables-before-nginx-proxy-$(date +%Y%m%d).rules
2.3 Удалить старые правила для BBB (80/443 → 10.218.14.37) Вручную или скриптом отката (см. комментарии в config/iptables/port-forwarding-rules.sh)
2.4 Применить правила для 10.218.14.200 sudo /home/cdto/DENKART/config/iptables/port-forwarding-rules-nginx-proxy.sh
2.5 Сохранить правила для восстановления после перезагрузки sudo netfilter-persistent save или sudo iptables-save | sudo tee /etc/iptables/rules.v4 (по вашей схеме)
2.6 Проверка с хоста curl -sI -k -H "Host: denkart.cdto.group" https://192.168.1.112/ — ожидается HTTP/2 200 или 301

Критерий выхода: С хоста по 192.168.1.112 denkart.cdto.group и docs.cdto.group открываются через nginx-reverse-proxy.


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

Шаг Действие Детали
3.1 При работающем BBB Открыть https://school.cdto.life, https://denkart.cdto.group/system, https://docs.cdto.life/
3.2 При остановленном BBB lxc stop BBB-CONT22-1; проверить: denkart.cdto.group и docs.cdto.life доступны, school.cdto.life — 502/таймаут
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

Критерий выхода: Все три домена работают при включённом BBB; при выключенном BBB работают denkart и docs; документация обновлена.


Фаза 4. Откат при проблемах

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

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


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

Аспект Сейчас После перехода
Куда идёт 80/443 с хоста 10.218.14.37 (BBB-CONT22-1) 10.218.14.200 (nginx-reverse-proxy)
Где маршрутизация по Host В BBB (HAProxy + Nginx) В nginx-reverse-proxy
При остановке BBB Все домены недоступны Недоступен только school.cdto.life
Отказоустойчивость Нет Да (Cockpit и docs не зависят от BBB)

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


Итог: Текущая маршрутизация полностью завязана на BBB-CONT22-1. Переход на nginx-reverse-proxy как единую точку входа выполняется по фазам с обязательным сохранением состояния и копированием изменяемых файлов. После перехода отключение BBB не затрагивает denkart.cdto.group и docs.cdto.life.