🤖 Pull request created from `various-fixes` containing PageHead
breadcrumbs and navigation alignment fixes, Umami analytics proxy, and
infrastructure updates.
9.1 KiB
title, description, weight
| title | description | weight |
|---|---|---|
| Композиции и общее ядро | Ядровая композиция на основе include, профили, сети и наслоение окружения. | 15 |
Среда выполнения узла описывается в виде композиций: по одному docker-compose-проекту на сервис в каталоге compositions/<project>/, плюс ядровая композиция — граничные и инфраструктурные сервисы, необходимые каждому узлу. Ядро находится в «commons» и подключается каждым узлом через тонкую обёртку. Благодаря этому его манифест пишется один раз и версионируется вместе с фреймворком.
Обёртка include
Файл compositions/apex/docker-compose.yml каждого узла состоит всего из трёх строк:
name: apex
include:
- ../../commons/compositions/apex/docker-compose.yml
Общий файл полностью параметризован переменными ${APEX_*} и не содержит относительных путей хоста: все точки монтирования разрешаются через переменные, экспортируемые движком при вызове, поэтому один и тот же файл корректно работает на каждом узле.
Если узлу требуется изменить ядровой сервис (например, опубликовать дополнительный порт хоста), переопределение накладывается через список путей в директиве include: без редактирования общего файла:
name: apex
include:
- path:
- ../../commons/compositions/apex/docker-compose.yml
- ./traefik.override.yml
Note
Директива
include:требует Docker Compose версии v2.20 или новее.
Ядровые сервисы и профили
Ядровая композиция определяет общий набор сервисов флота. Всегда включённые сервисы:
- traefik — граничный обратный прокси и якорь сети
direct(всегда занимает.10в подсети узла). Он терминирует TLS через DNS-челлендж, обнаруживает бэкенды по docker-меткам и открывает панель управления на FQDN узла, ограничивая доступ списком разрешённых IP-адресов анклава. - socket-proxy — отфильтрованный прокси для docker-сокета: traefik получает состояние контейнеров через него и никогда не обращается к сокету напрямую.
Опциональные сервисы управляются compose-профилями, которые узел активирует в переменной COMPOSE_PROFILES (задаётся в apex.env):
| Профиль | Сервис | Роль |
|---|---|---|
xray |
xray | Прокси-шлюз с режимом host-network для анклава. |
adguard |
adguard | DNS-фильтрация в сетевом пространстве имён traefik; маршрутизируется по пути /adguard на FQDN узла. |
alloy |
alloy | Агент наблюдаемости на каждом узле (Grafana Alloy). Собирает метрики хоста и контейнеров, а также логи systemd journal и контейнеров, после чего проталкивает их исходящим потоком в центральные Prometheus и Loki (см. Концепция: Модель безопасности). Имя хоста (hostname) контейнера совпадает с APEX_NODE_HOST, благодаря чему метки node и instance автоматически проставляются на всех метриках и потоках логов. |
manual |
resticontainer | Одноразовый контейнер резервного копирования на основе меток (ghcr.io/deytenit/resticontainer). Никогда не запускается командой up; вызывается действием backup/run, которое определяет необходимость бэкапа каждого сервиса по compose-меткам restic.*. |
Сети
Ядровая композиция создаёт три сети узла, а сервисные композиции подключаются к ним через директиву external: true:
| Сеть | Тип | Назначение |
|---|---|---|
direct |
bridge, подсеть = APEX_SUBNET |
Сеть со статическими якорными IP; якорь каждого проекта удерживает здесь фиксированный адрес (см. Концепция: Схема адресации флота). |
enclave |
bridge, internal: true |
Бэкенд-сеть обратного прокси: через неё traefik направляет трафик к целевым сервисам. |
socket |
bridge, internal: true |
Изолирует трафик между traefik и socket-proxy. |
Внутри проекта зависимые контейнеры обычно используют сетевое пространство имён якоря (network_mode: service:<anchor>) вместо прямого подключения к сетям.
Наслоение окружения
Переменные попадают в композицию из трёх слоёв (в порядке возрастания приоритета):
.env— незакоммиченные секреты, символьная ссылка на хранилище уровня 1 (учётные данныеAPEX_RESTIC_*, токеныAPEX_TRAEFIK_*, блок UID/GID).apex.env— закоммиченные несекретные параметры (APEX_TRAEFIK_DIRECT_IP,APEX_RESTIC_REPOSITORY,COMPOSE_PROFILES, опциональныйAPEX_RESTIC_COMPRESSION).- Экспорт движка — переменные идентичности
APEX_*и пути уровней изctx.vars(). Они внедряются в окружение процесса действиями оркестрации и потому имеют наивысший приоритет над обоими файлами.
Критические переменные снабжены суффиксом ?error в общем файле: если секрет не задан, загрузка конфигурации композиции завершается явной ошибкой, предотвращая запуск некорректно настроенного контейнера.
Оркестрация
Команда apex compose <action> управляет всеми композициями на узле:
- Порядок: сначала ядровой проект (он владеет сетями), затем остальные сервисные композиции по алфавиту; команда
downвыполняет действия в обратном порядке. - Env-файлы: для каждого проекта существующие файлы
.envиapex.envпередаются через флаг--env-file. - Команда
up: по умолчанию подразумевает флаг-d; любые дополнительные аргументы передаются напрямую вdocker compose. - Флаг
--dry-run: выводит каждую команду с её рабочим каталогом без выполнения; поддерживается в любом месте командной строки.
См. также: