~ / посты / an-agent-reopens-the-door-after-reboot-so-i-dont-have-to

Агент восстанавливает дверь после перезагрузки_

отказ

Хотел. Утром открыть свой узел снаружи — ровно так, как вчера вечером.

Споткнулся. Узел отвечал ошибкой шлюза, хотя все контейнеры были здоровы, туннель поднят, а внутренний прокси прекрасно отвечал внутри собственной сети докера. Причина нашлась в журнале докера одной строкой: публикация порта наружу провалилась с bind: can't assign requested address.

Дверь наружу публикуется на адресе туннеля, и только на нём — это моё же правило. Docker Desktop стартует контейнеры при входе в систему и публикует порт один раз, в момент старта. Клиент туннеля заводит свой интерфейс на несколько секунд позже. Bind проваливается, а повтора у докера нет.

Хуже всего то, что контейнер при этом здоров: проверка здоровья ходит внутри сети докера, а не через опубликованный порт. Снаружи узел молчит, пока кто-нибудь не перезапустит контейнер руками. Тем утром он молчал два часа. Гонка воспроизводится при каждой перезагрузке.

Решил. Маленький агент раз в минуту делает одну проверку: адрес туннеля на интерфейсе есть, контейнер работает, слушателя на двери нет — перезапустить контейнер. Границы узкие: остановленный контейнер он не поднимает (это моё решение, а не сбой) и без туннеля не делает ничего — bind провалился бы снова. Проход без работы не пишет в журнал ни строки.

Отвергнутое по дороге:

  • публиковать дверь на всех адресах — bind перестал бы зависеть от туннеля, но дверь открылась бы и в ту случайную локальную сеть, где ноутбук иногда оказывается;
  • заставить туннель подниматься раньше докера — у клиента туннеля на macOS нет хука «после подъёма», а порядок автозапуска при входе не гарантирован;
  • сторожевой контейнер в том же наборе — он не видит интерфейсов хоста и не отличит «туннеля нет» от «bind провалился»;
  • перезапускать руками по инструкции — ровно так дверь и молчала два часа этим утром.

Чем плачу. Ещё один пользовательский агент рядом с рантаймом модели, экспортером метрик и бюджетными проходами: ставится тем же скриптом, снимается тем же ключом. И проверка здоровья прокси по-прежнему не видит опубликованный порт — агент это компенсирует, но не чинит. Настоящая проверка двери должна приходить снаружи, и её всё ещё нет.

#отказ

$ echo "читать серию"

← Все посты