Глубокий анализ маршрутизации и план перехода на 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. План перехода (с сохранением и копиями файлов)
Обязательные принципы
- Перед началом — полное сохранение состояния (точка восстановления).
- Перед изменением любого файла — создавать копию с суффиксом
.bakили вconfig/snapshots/с датой. - Не удалять старые правила 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. Связанные документы
- План перехода по фазам
- Маршрутизация через nginx-reverse-proxy
- Сохранение перед изменениями
- Скрипты:
config/iptables/port-forwarding-rules-nginx-proxy.sh,scripts/save-state-before-migration.sh - Снимок состояния:
config/snapshots/state-pre-nginx-proxy-migration-2026-02-08-014722/
Итог: Текущая маршрутизация полностью завязана на BBB-CONT22-1. Переход на nginx-reverse-proxy как единую точку входа выполняется по фазам с обязательным сохранением состояния и копированием изменяемых файлов. После перехода отключение BBB не затрагивает denkart.cdto.group и docs.cdto.life.