Dockerfile просто копировал бинарник, собранный ОТДЕЛЬНЫМ шагом прямо на
CI-раннере (ubuntu-24.04, glibc 2.39), в рантайм-образ debian:bookworm-slim
(glibc 2.36) — любой запуск падал: "GLIBC_2.38 not found". Затронуто
абсолютно любое развёртывание этого образа, не конкретная нода.
Теперь Dockerfile компилирует Rust ВНУТРИ себя, на том же bookworm, что и
рантайм (multi-stage + cargo-chef, тот же паттерн, что в
netrunner-backend/Dockerfile) — версии glibc гарантированно совпадают
независимо от ОС раннера. build.yml больше не собирает бинарник отдельным
шагом, только docker build; добавлен registry-кэш слоёв (type=gha требует
GitHub Actions Cache, у self-hosted act_runner его нет — см. аналогичный
фикс в netrunner-backend этой сессии).
Проверено локально: docker build проходит чисто, ./netrunner-proxy --help
запускается без ошибок glibc (до фикса — падал сразу).
--metrics-port (0.0.0.0, в отличие от --health-port — тот 127.0.0.1-only)
отдаёт netrunner_connections_active/total, netrunner_auth_validate_duration_seconds,
netrunner_auth_failures_total, netrunner_circuit_breaker_open. Тот же
hand-rolled HTTP-паттерн, что и health.rs — без HTTP-фреймворка ради
одного эндпоинта.
scripts/generate-prometheus-targets.mjs генерит список scrape-таргетов
из nodes.json — job update-observability-targets в deploy.yml гоняет
его при каждом деплое нод и заливает на VPS с данными
(netrunner-data/observability/targets/nodes.json), чтобы центральный
Prometheus не терял из виду ноды без ручной правки конфига.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- .gitea/workflows/build.yml — cargo build --release + docker build/push в
ghcr.io/nineap/netrunner-proxy:latest (Dockerfile сам не компилирует Rust,
ждёт уже готовый target/release/netrunner-server).
- .gitea/workflows/deploy.yml — только вручную (workflow_dispatch), параметр
target: имя ноды из nodes.json или "all". Job "resolve" фильтрует список,
job "deploy" — matrix по результату, каждая нода видна в прогоне отдельной
строкой. Деплой пересоздаёт контейнер (pull+rm+run), не просто restart —
иначе новый образ не подхватится.
- nodes.json — список нод (name/host/proxy_port/decoy_host), шаблон с
CHANGE_ME — заполнить реальными IP.
Нужные секреты: GHCR_TOKEN (тот же, что и в остальных репо), PROXY_NODES_SSH_KEY
(общий master-ключ на все ноды), PROXY_INTERNAL_SECRET, BACKEND_URL (те же
значения, что уже настроены у бэкенда).