Несколько реплик local-backend
local-backend можно запустить в нескольких экземплярах на одном хосте — запросы между ними распределяет nginx из состава дистрибутива. Общее состояние реплики держат в базе: в compose задано DISTRIBUTED_STATE=postgres.
Это вертикальное масштабирование одной машины. Если задача — пережить отказ сервера, нужна схема на двух нодах.
Запуск
С nginx:
./scripts/prepare-nginx.sh
docker compose --profile proxy up -d --scale backend-local=2
Без nginx:
docker compose up -d --scale backend-local=2
Число реплик можно менять той же командой; лишние контейнеры compose остановит сам.
Имя сервиса backend
В командах docker compose сервис backend называется backend-local. В прежних версиях дистрибутива он назывался local-backend. Если команда отвечает no such service: backend-local, стенд ещё не обновлён — используйте прежнее имя или обновите стенд командой ./update.sh.
Ограничения
| Ограничение | Почему | Что делать |
|---|---|---|
Прямой доступ к API с хоста при --scale недоступен |
docker-compose.publish-backend.yml публикует фиксированный порт хоста, и вторая реплика его занять не сможет |
Ставить nginx и ходить в API через него |
| RADIUS на хост не публикуется | UDP-порт нельзя отдать нескольким контейнерам сразу | Один экземпляр local-backend на хост либо две ноды с RADIUS_UDP_BINDING=all |
| Слушатель RADIUS работает только у лидера | Владелец аренды один — при RADIUS_UDP_BINDING=leader остальные реплики UDP не слушают |
Учитывать при планировании: масштабирование ускоряет HTTP API, но не RADIUS |
Оверлей docker-compose.publish-radius.yml при нескольких репликах подключать не нужно: install.sh и update.sh замечают, что реплик больше одной, не включают оверлей в COMPOSE_FILE и печатают предупреждение. ./doctor.sh в этом случае выдаёт [WARN], а не ошибку.
Проверка
docker compose ps backend-local
./doctor.sh
В выводе docker compose ps должно быть столько контейнеров backend, сколько задано в --scale. В отчёте doctor.sh обратите внимание на строку о репликах и публикации UDP: она подтверждает, что оверлей RADIUS не подключён — для этой схемы это нормально.
После обновления ./update.sh удаляет предыдущие образы только тогда, когда все реплики перешли в healthy. Если хотя бы одна не поднялась, образы остаются на диске — подробнее в разделе «Старые образы и место на диске».