Развёртывание агента
Контейнер
Section titled “Контейнер”Агент и Xray — один образ astral-agent: бинарник агента запускает Xray дочерним процессом. Нет Docker-сокета, межконтейнерных сигналов и рассинхронизации версий агент/Xray — пара версий фиксируется тегом образа.
# docker-compose.yml на нодеservices: astral-agent: image: ghcr.io/astralvpn/astral-agent:${ASTRAL_AGENT_VERSION} restart: unless-stopped network_mode: host environment: ASTRAL_BACKEND_ADDR: ${ASTRAL_BACKEND_ADDR} # host:port control plane ASTRAL_ENROLL_TOKEN: ${ASTRAL_ENROLL_TOKEN} # нужен только до первого enrollment volumes: - ./data:/var/lib/astral-agentnetwork_mode: host— инбаунды создаются в панели на произвольных портах; перечислить их вports:заранее нельзя../data— identity агента, кэш последнего конфига, буфер трафика (Обзор). После enrollmentASTRAL_ENROLL_TOKENигнорируется (identity уже на диске) — протухший токен в.envбезвреден.- Бутстрап-конфигурация — два значения. Сертификаты, ключи и вся конфигурация Xray приходят по стриму, в файлах ноды их настраивать не нужно.
Ansible
Section titled “Ansible”Роль astral-agent (в deploy/ansible, репозиторий):
- Docker Engine + Compose plugin.
- Рендер
docker-compose.ymlи.envиз шаблона. docker compose pull && docker compose up -d.- Файрвол: наружу открыты только порты инбаундов; входящих management-портов у ноды нет.
all: hosts: nl-1: ansible_host: 203.0.113.10 astral_enroll_token: "{{ vault_nl1_enroll_token }}" # ansible-vault astral_agent_version: "1.4.0"Роль идемпотентна: конфиги перезаписываются всегда, контейнер пересоздаётся (handler) только при изменении образа или .env.
Обновление и откат
Section titled “Обновление и откат”Правка astral_agent_version в inventory → прогон плейбука; раскатка по группам хостов (canary) — средствами inventory. Откат — та же правка назад. Совместимость версий агента и backend обеспечивается эволюцией proto (gRPC API): порядок обновления компонентов не важен.
При рестарте контейнера агент поднимает Xray из локального кэша до установления стрима — обновление агента не ждёт связности с панелью.