🚪 Единственный вход машины. Держит 80 и 443, владеет сертификатом и знает карту: какой порт — чей сосед.
🧭 Вход ничей. Он не часть продукта и никогда ею не станет: продуктов за ним несколько, они живут в своих репозиториях и переезжают порознь. Отдай вход одному из них — и остальные окажутся его гостями, а их доступность станет его заботой.
🎯 Смысл границы: за входом можно менять что угодно, не трогая вход, и наоборот. Соседи друг о друге не знают вовсе — знает только карта, и она здесь одна.
| Часть | Назначение |
|---|---|
compose.yaml |
nginx с картой и клиент за сертификатом — больше ничего |
nginx/templates/00-tls |
сертификат и общие для всех соседей заголовки |
nginx/templates/01-entry |
80 порт: проверка сертификата и переезд на https |
nginx/templates/30-neurobox-console |
сосед на 443 и 8443 — пульт бокса |
nginx/templates/40-presets |
сосед на 9787 — служба пресетов зоны скинов, без авторизации |
➕ Добавить соседа — положить рядом один файл: порт, имя сети, имя контейнера, и опубликовать
порт в compose.yaml. Всё, что вход знает о соседе, помещается в эти строки, и это не бедность
описания, а его граница.
Сосед сейчас один и стоит на главном порту (и на 8443 заодно — адрес остался от короткого соседства с витриной). Правило записано заранее, до второго соседа, и не зря.
Браузер считает два места разными, только если у них различается схема, имя или порт. Пути он не различает вовсе. Поселив соседей на общий порт по разным путям, мы получили бы для браузера одно место: общее хранилище, общие права, общий доступ к чужому API от имени вошедшего. Дыра в одном стала бы дырой в другом — при том что у продуктов нет ни строчки общего кода.
🏁 Правильный конец истории — домен: поддомены разводят соседей по-настоящему, и все живут на 443. Тогда из карты уходят порты и появляются имена; больше здесь не меняется ничего.
Выписан на машину, а не на продукт: соседей несколько, и свой сертификат каждому означал бы выдачу на каждого новосёла.
Выдача — разовым шагом в обычном подъёме, до nginx: без сертификата nginx не стартует, а уже поднятый занял бы порт, нужный проверке. Повторный запуск при живом сертификате не делает ничего, поэтому шаг и стоит в подъёме, а не в инструкции, которую забудут выполнить.
Продление — через файл на диске у живого nginx, не занимая порт. Обычный способ (занять порт на время проверки) требует остановить вход, а сертификат здесь живёт неделю: сайт исчезал бы на минуту раз в несколько дней.
Когда продлевать, решает сам удостоверяющий центр: клиент спрашивает его об этом и следует ответу. Своя формула на коротком сертификате промахивается легко, а промах виден только просроченным замком у посетителя.
cp .env.example .env
docker compose up -dСети соседей должны существовать: вход к ним подключается, но не заводит их. Это названо ценой прямо — карта, ведущая в место, которого нет, не работает по определению.
Проверить карту, не поднимая:
docker compose config -q📥 На входе — запросы из сети и файлы сертификата. 📤 На выходе — те же запросы соседям по внутренним сетям докера, уже без TLS.
🚦 Упал сосед — вход отдаёт 502 и живёт дальше. Упал вход — снаружи не видно никого: это его единственная настоящая ответственность, и других он на себя не берёт.