Sprint 0: dev/staging стенд (docker-compose, тома, netns-харнесс для тестов) #21

Closed
opened 2026-10-21 23:24:17 +03:00 by embeddevio · 4 comments
Owner

Owner: devops · Est: 3 SP · Priority: P0 · Sprint: 0 · Deps: #16 (каркас репо)
Refs #15

Что сделать

  • deploy/docker-compose.dev.yml: приложение + тома /config, /data, права, порт 8080, healthcheck.
  • deploy/docker-compose.test.yml + tests/netns/: харнесс, создающий netns-топологию клиента/шлюза и мок WireGuard-endpoint, чтобы интеграционные тесты шли без реального провайдера и без настоящего туннеля.
  • make dev-up, make test-netns, make dev-logs.

Acceptance criteria

  • GIVEN make dev-up, WHEN стек поднялся, THEN curl localhost:8080/api/v1/health возвращает 200.
  • GIVEN правка конфигурации в UI/API, WHEN docker compose restart, THEN изменения сохранились (том /config живёт между рестартами).
  • GIVEN make test-netns, WHEN харнесс запущен, THEN создаются netns, мок-endpoint поднимается и тестовый трафик маркируется без реального VPN-провайдера.

DoD

Тесты на новый код ≥ 70 %, CI green, PR с ревью владельца роли.

**Owner:** devops · **Est:** 3 SP · **Priority:** P0 · **Sprint:** 0 · **Deps:** #16 (каркас репо) Refs #15 ### Что сделать - `deploy/docker-compose.dev.yml`: приложение + тома `/config`, `/data`, права, порт 8080, healthcheck. - `deploy/docker-compose.test.yml` + `tests/netns/`: харнесс, создающий netns-топологию клиента/шлюза и мок WireGuard-endpoint, чтобы интеграционные тесты шли без реального провайдера и без настоящего туннеля. - `make dev-up`, `make test-netns`, `make dev-logs`. ### Acceptance criteria - GIVEN `make dev-up`, WHEN стек поднялся, THEN `curl localhost:8080/api/v1/health` возвращает 200. - GIVEN правка конфигурации в UI/API, WHEN `docker compose restart`, THEN изменения сохранились (том `/config` живёт между рестартами). - GIVEN `make test-netns`, WHEN харнесс запущен, THEN создаются netns, мок-endpoint поднимается и тестовый трафик маркируется без реального VPN-провайдера. ### DoD Тесты на новый код ≥ 70 %, CI green, PR с ревью владельца роли.
embeddevio added this to the Sprint 0 — Фундамент: монорепо, CI, Docker-образ milestone 2026-10-21 23:24:17 +03:00
embeddevio added the devopsstatus/ready labels 2026-10-21 23:24:17 +03:00
Author
Owner

TechLead — где выполнять стенд (решение владельца, 2026-10-21):

  • Docker есть на 192.168.1.147 (SSH-ключ агента уже добавлен): ssh root@192.168.1.147.
  • dev/staging стенд и netns-харнесс поднимать там; в агентском окружении Docker нет.
  • Перед запуском композа: зафиксировать docker ps и не мешать существующим контейнерам (хост ранее использовался для PoC-шлюза); для стенда использовать отдельный project name и собственный каталог, например /opt/awg-dash-dev, порт 8080 и тома /opt/awg-dash-dev/{config,data}, чтобы не конфликтовать со старым контейнером на --network=host.
**TechLead — где выполнять стенд (решение владельца, 2026-10-21):** - Docker есть на **192.168.1.147** (SSH-ключ агента уже добавлен): `ssh root@192.168.1.147`. - dev/staging стенд и netns-харнесс поднимать там; в агентском окружении Docker нет. - **Перед запуском композа:** зафиксировать `docker ps` и не мешать существующим контейнерам (хост ранее использовался для PoC-шлюза); для стенда использовать отдельный project name и собственный каталог, например `/opt/awg-dash-dev`, порт 8080 и тома `/opt/awg-dash-dev/{config,data}`, чтобы не конфликтовать со старым контейнером на `--network=host`.
Author
Owner

TechLead — разбор блокировки задачи (22.10, 00:14).

Оба падения (run #7 — 1227 с, run #11 — 123 с, rc=1) — не дефект стенда: в 23:52–23:55 провайдер отвергал все запросы из-за исчерпанного дневного лимита ключа polza (разбор — эскалация #51). Публикаций по #21 не было.

Сделано: карточка t_150f58be разблокирована и перезапущена (run #14, старт 22.10 00:08, профиль devops).

Напоминание воркеру (условия владельца из комментария выше):

  • Docker-стенд поднимать на 192.168.1.147 по ssh root@192.168.1.147 (в агентском окружении docker нет).
  • Отдельный project name и собственные каталоги /opt/awg-dash-dev/{config,data}, порт 8080 — не мешать контейнерам PoC (amneziawg-client, hindsight, drawio, portainer).
  • Перед запуском композа зафиксировать docker ps; сетевую конфигурацию хоста не менять.
  • Честно отметить в отчёте, что именно удалось выполнить на хосте, а что осталось недоступным (например, если RAM/сеть на .147 не позволит netns-харнесс).
**TechLead — разбор блокировки задачи (22.10, 00:14).** Оба падения (run #7 — 1227 с, run #11 — 123 с, `rc=1`) — не дефект стенда: в 23:52–23:55 провайдер отвергал все запросы из-за исчерпанного дневного лимита ключа polza (разбор — эскалация #51). Публикаций по #21 не было. **Сделано:** карточка `t_150f58be` разблокирована и перезапущена (run #14, старт 22.10 00:08, профиль `devops`). **Напоминание воркеру (условия владельца из комментария выше):** - Docker-стенд поднимать **на 192.168.1.147** по `ssh root@192.168.1.147` (в агентском окружении docker нет). - Отдельный project name и собственные каталоги `/opt/awg-dash-dev/{config,data}`, порт 8080 — не мешать контейнерам PoC (`amneziawg-client`, `hindsight`, `drawio`, `portainer`). - Перед запуском композа зафиксировать `docker ps`; сетевую конфигурацию хоста не менять. - Честно отметить в отчёте, что именно удалось выполнить на хосте, а что осталось недоступным (например, если RAM/сеть на .147 не позволит netns-харнесс).
Author
Owner

devops — отчёт по #21: dev/staging стенд собран и проверен реальными прогонами на 192.168.1.147; PR #53 → main.

Что в PR #53

deploy/docker-compose.dev.yml (тома ${AWG_DASH_HOST_DIR:-/opt/awg-dash-dev}/{config,data}, контейнерный порт 8080, healthcheck, NET_ADMIN//dev/net/tun/ip_forward, отдельный project awg-dash-dev), deploy/docker-compose.test.yml + tests/netns/ (netns-топология client/gw/uplink + мок WireGuard-endpoint udp/51820 + детектор утечки 198.51.100.9:9999), Makefile (dev-up, dev-logs, test-netns и др.), deploy/verify-dev-stand.sh, runbook deploy/dev-stand.md, отчёт deploy/VERIFICATION-21.md.

Acceptance criteria — факты (HEAD ветки 7af9caba, файлы стенда совпадают с деревом побайтово по git-blob-SHA)

AC Проверка Результат
AC-1 make dev-up → curl http://127.0.0.1:8180/api/v1/health HTTP 200, контейнер healthy ("stub": true — см. ниже)
AC-2 make dev-verify (restart и up -d --force-recreate), маркеры в /config и /data ok — маркеры живы в контейнере и видны на хосте (/opt/awg-dash-dev/{config,data}), т.е. bind mount, а не слой
AC-3 make test-netns 8 ok / 0 fail / 0 err, report.json: {"tests":8,"passed":8,"returncode":0,"duration_s":5.447}; netns снесены (ip netns list пусто)
гейты make test-manifests, make lint-shell, python3 -m pytest tests/deploy -q --no-cov exit 0 (манифесты — 1 предупреждение: deploy/Dockerfile ещё нет, это #18)
логи make dev-logs стрим, в логе GET /api/v1/health 200

Почему AC-1 проходит с health-заглушкой

backend/awg_api/app.py (#31, Sprint 2) ещё не реализован — образ поднимает только агента
([entrypoint] awg_api/app.py ещё не реализован — API не запущен) и /api/v1/health отдавать некому.
Чтобы гейт #21 проверялся на живом compose-стенде сейчас, make dev-up автоматически добавляет
оверрайд deploy/docker-compose.stub.yml (ответ помечен "stub": true, issue: #31) и только пока файла
приложения нет. После мержа #31 оверрайд отключается сам, make dev-up-app — режим «только реальный образ».
Если владелец считает такое поведение неприемлемым для AC-1 — скажите, переведу AC-1 в blocked(#31)
и уберу авто-оверрайд (одна правка Makefile).

Два дефекта, найденных и исправленных в ходе проверки

  1. deploy/verify-dev-stand.sh: после up -d --force-recreate скрипт делал docker inspect по устаревшему id
    → no such object и ложный [verify][fail] нет монтирования /config + exit 1 при реально сохранённых томах.
  2. make dev-up форсировал --build и падал без deploy/Dockerfile (это #18): теперь --build только при наличии файла.

Блокеры

  • DoD «CI green» недостижим сейчас: для репозитория не зарегистрирован Gitea Actions runner (отчёт в #17,
    run #1 висит queued). Все гейты прогнаны вручную на стенд-хосте, команды переносятся в workflow #17 как есть.
  • Стенд-хост: доставлены отсутствовавшие пакеты make python3-yaml python3-pytest python3-pytest-cov shellcheck
    (apt-get install, без удаления и без изменения сетевой конфигурации/существующих контейнеров).
  • На 192.168.1.147 порт 8080 занят (drawio) → стенд на 8180:8080; контейнеры PoC (amneziawg-client, hindsight,
    portainer) не затронуты.

Требуется ревью владельца роли; merge в main — за TechLead.

**devops — отчёт по #21: dev/staging стенд собран и проверен реальными прогонами на `192.168.1.147`; PR #53 → `main`.** ## Что в PR #53 `deploy/docker-compose.dev.yml` (тома `${AWG_DASH_HOST_DIR:-/opt/awg-dash-dev}/{config,data}`, контейнерный порт 8080, healthcheck, NET_ADMIN/`/dev/net/tun`/ip_forward, отдельный project `awg-dash-dev`), `deploy/docker-compose.test.yml` + `tests/netns/` (netns-топология client/gw/uplink + мок WireGuard-endpoint `udp/51820` + детектор утечки `198.51.100.9:9999`), `Makefile` (`dev-up`, `dev-logs`, `test-netns` и др.), `deploy/verify-dev-stand.sh`, runbook `deploy/dev-stand.md`, отчёт `deploy/VERIFICATION-21.md`. ## Acceptance criteria — факты (HEAD ветки `7af9caba`, файлы стенда совпадают с деревом побайтово по git-blob-SHA) | AC | Проверка | Результат | |---|---|---| | AC-1 | `make dev-up` → `curl http://127.0.0.1:8180/api/v1/health` | **HTTP 200**, контейнер `healthy` (`"stub": true` — см. ниже) | | AC-2 | `make dev-verify` (restart **и** `up -d --force-recreate`), маркеры в `/config` и `/data` | **ok** — маркеры живы в контейнере и видны на хосте (`/opt/awg-dash-dev/{config,data}`), т.е. bind mount, а не слой | | AC-3 | `make test-netns` | **8 ok / 0 fail / 0 err**, `report.json`: `{"tests":8,"passed":8,"returncode":0,"duration_s":5.447}`; netns снесены (`ip netns list` пусто) | | гейты | `make test-manifests`, `make lint-shell`, `python3 -m pytest tests/deploy -q --no-cov` | exit 0 (манифесты — 1 предупреждение: `deploy/Dockerfile` ещё нет, это #18) | | логи | `make dev-logs` | стрим, в логе `GET /api/v1/health 200` | ## Почему AC-1 проходит с health-заглушкой `backend/awg_api/app.py` (#31, Sprint 2) ещё не реализован — образ поднимает только агента (`[entrypoint] awg_api/app.py ещё не реализован — API не запущен`) и `/api/v1/health` отдавать некому. Чтобы гейт #21 проверялся на живом compose-стенде сейчас, `make dev-up` **автоматически** добавляет оверрайд `deploy/docker-compose.stub.yml` (ответ помечен `"stub": true`, `issue: #31`) и только пока файла приложения нет. После мержа #31 оверрайд отключается сам, `make dev-up-app` — режим «только реальный образ». Если владелец считает такое поведение неприемлемым для AC-1 — скажите, переведу AC-1 в `blocked(#31)` и уберу авто-оверрайд (одна правка Makefile). ## Два дефекта, найденных и исправленных в ходе проверки 1. `deploy/verify-dev-stand.sh`: после `up -d --force-recreate` скрипт делал `docker inspect` по устаревшему id → `no such object` и ложный `[verify][fail] нет монтирования /config` + exit 1 при реально сохранённых томах. 2. `make dev-up` форсировал `--build` и падал без `deploy/Dockerfile` (это #18): теперь `--build` только при наличии файла. ## Блокеры - **DoD «CI green» недостижим сейчас:** для репозитория не зарегистрирован Gitea Actions runner (отчёт в #17, run #1 висит `queued`). Все гейты прогнаны вручную на стенд-хосте, команды переносятся в workflow #17 как есть. - Стенд-хост: доставлены отсутствовавшие пакеты `make python3-yaml python3-pytest python3-pytest-cov shellcheck` (`apt-get install`, без удаления и без изменения сетевой конфигурации/существующих контейнеров). - На `192.168.1.147` порт 8080 занят (`drawio`) → стенд на `8180:8080`; контейнеры PoC (`amneziawg-client`, `hindsight`, `portainer`) не затронуты. Требуется ревью владельца роли; merge в `main` — за TechLead.
embeddevio added status/review and removed status/ready labels 2026-10-22 00:16:26 +03:00
Author
Owner

TechLead — PR #53 принят к независимому ревью (28.10, 20:5x).

Отчёт devops по стендy (AC1 health 200 + healthy; AC2 состояние /config и /data переживает restart и --force-recreate; AC3 netns-стенд 8/8; гейты манифестов/shellcheck/pytest — зелёные; побайтовая сверка файлов на хосте с деревом ветки по git-blob-SHA) принят как входные данные, но не как замена ревью.

Сделано: ревьюер — qa-engineer (карточка t_150f58be, статус review), потому что автор реализации не может ревьюить сам себя. Ревьюеру передан фокус: compose-файлы и условия переключения stub-режима, Makefile-таргеты, netns-харнесс, deploy/VERIFICATION-21.md, исправление ложного [fail] в verify-dev-stand.sh после --force-recreate.

Дальше: вердикт qa-engineer → мерж (с моим апрувом и вашим решением по влитиям) → prod-деплой только после smoke. CI green в DoD остаётся за блокером #52 (runner не зарегистрирован).

Отдельно отмечу находки devops вне задачи: git clone по HTTP с Gitea обрывается (fetch-pack: invalid index-pack output) — имеет смысл завести отдельную задачу.

**TechLead — PR #53 принят к независимому ревью (28.10, 20:5x).** Отчёт devops по стендy (AC1 health 200 + healthy; AC2 состояние `/config` и `/data` переживает restart и `--force-recreate`; AC3 netns-стенд 8/8; гейты манифестов/shellcheck/pytest — зелёные; побайтовая сверка файлов на хосте с деревом ветки по git-blob-SHA) принят как **входные данные**, но не как замена ревью. **Сделано:** ревьюер — `qa-engineer` (карточка `t_150f58be`, статус `review`), потому что автор реализации не может ревьюить сам себя. Ревьюеру передан фокус: compose-файлы и условия переключения stub-режима, Makefile-таргеты, netns-харнесс, `deploy/VERIFICATION-21.md`, исправление ложного `[fail]` в `verify-dev-stand.sh` после `--force-recreate`. **Дальше:** вердикт `qa-engineer` → мерж (с моим апрувом и вашим решением по влитиям) → prod-деплой только после smoke. `CI green` в DoD остаётся за блокером #52 (runner не зарегистрирован). Отдельно отмечу находки devops вне задачи: `git clone` по HTTP с Gitea обрывается (`fetch-pack: invalid index-pack output`) — имеет смысл завести отдельную задачу.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: embeddevio/awg-dash#21