Сборка: добавить production packaging flow через .deb

Добавлен package-режим в tools/build.sh: --package, --dist-dir, --version. Реализована сборка Debian-пакета, metadata/control, postinst/postrm и SHA256SUMS. Установочные пути унифицированы под /usr/sbin и /lib/systemd/system для production-модели.
This commit is contained in:
2026-05-10 17:26:11 +05:00
parent 76c6b52f4e
commit 9d2d2bc0c2
9 changed files with 307 additions and 143 deletions
+37 -120
View File
@@ -1,156 +1,73 @@
# Установка AWG2 Harness на production-хост
# Installation
## 1. Предусловия
## Deployment contract
Хост:
- Build выполняется на отдельной Debian 13 amd64 build-machine.
- Production-хост получает готовый Debian-пакет.
- На production-хосте не требуются Rust/cargo/source tree.
- Amnezia должна быть уже установлена и работать через Docker.
- Production-конфиг создаётся вручную; [`config.example.toml`](../config.example.toml) не копируется автоматически как боевой конфиг.
- Debian 13 amd64;
- root-доступ;
- SSH настроен заранее;
- AmneziaWG/AWG 2.0 установлена официальным способом;
- контейнер Amnezia запускается через Docker;
- сервер выделенный, без соседних сервисов, чьи сетевые правила нужно сохранять.
## A. Build machine
На хосте должны быть доступны:
```bash
docker
systemctl
ip
tc
wg
nsenter
modprobe
nft
```
`tc/ip/wg` внутри контейнера полезны для fallback, но целевая модель — host tools + вход в network namespace контейнера.
## 2. Сборка бинаря
Сборку лучше выполнять на отдельной build-машине с тем же целевым ABI.
### A1. Подготовка build environment
```bash
./tools/build.sh --prepare-build-env --bootstrap-rust --yes
./tools/build.sh
```
Альтернатива (ручной запуск cargo из корня репозитория):
### A2. Build и тесты
```bash
cargo build --locked --manifest-path traffic_core/Cargo.toml --release
./tools/build.sh --build
```
Проверки перед переносом:
### A3. Сборка пакета
```bash
cargo fmt --manifest-path traffic_core/Cargo.toml --all --check
cargo clippy --locked --manifest-path traffic_core/Cargo.toml --all-targets -- -D warnings
cargo test --locked --manifest-path traffic_core/Cargo.toml --release
file traffic_core/target/release/awg2-harness
ldd traffic_core/target/release/awg2-harness
./tools/build.sh --package
sha256sum -c dist/SHA256SUMS
```
## 3. Установка файлов
## B. Transfer artifacts
```bash
scp dist/awg2-harness_*_amd64.deb root@vpn-host:/root/
scp config.toml root@vpn-host:/root/awg2-harness.config.toml
```
## C. Production host
### C1. Install package
```bash
apt install ./awg2-harness_*_amd64.deb
```
### C2. Install config
```bash
install -m 0755 traffic_core/target/release/awg2-harness /usr/local/bin/awg2-harness
install -d -m 0755 /etc/awg2-harness
install -m 0644 config.toml /etc/awg2-harness/config.toml
install -m 0644 /root/awg2-harness.config.toml /etc/awg2-harness/config.toml
```
Важно: production-установка **не должна** автоматически копировать [`config.example.toml`](../config.example.toml) как боевой конфиг.
Если используется [`tools/build.sh`](../tools/build.sh), режим `--install` завершится ошибкой при отсутствии `/etc/awg2-harness/config.toml`.
Режим `--install` копирует только бинарь и unit, выполняет `systemctl daemon-reload`, но не делает `systemctl enable --now`.
Сначала подготовьте осознанный production-конфиг вручную.
Проверка конфига:
### C3. Validate and apply
```bash
awg2-harness validate-config --config /etc/awg2-harness/config.toml
```
## 4. Первичное применение traffic topology
```bash
awg2-harness apply-limits --config /etc/awg2-harness/config.toml
awg2-harness apply-firewall --config /etc/awg2-harness/config.toml
awg2-harness status --config /etc/awg2-harness/config.toml
```
Ожидается:
- найден контейнер `amnezia-awg2` или `amnezia-awg`;
- найден network namespace контейнера;
- найден AWG/WG-интерфейс;
- найдены peers из `wg show all allowed-ips`;
- создана egress topology на AWG/WG-интерфейсе;
- создан `ifb0`;
- создан ingress redirect в `ifb0`;
- на каждого peer есть egress и ingress class/filter;
- если anti-torrent включён, в Amnezia netns есть `table inet awg2_harness` и drop counter отображается в status.
## 5. Настройка swap
### C4. Enable daemon
```bash
awg2-harness ensure-swap --config /etc/awg2-harness/config.toml
swapon --show
cat /proc/sys/vm/swappiness
```
Ожидается `/swapfile` размером 2 ГБ, права `0600`, запись в `/etc/fstab`, низкая склонность к использованию.
## 6. Установка systemd unit
`/etc/systemd/system/awg2-harness.service`:
Reference unit в репозитории: [`awg2-harness.service`](../awg2-harness.service).
```ini
[Unit]
Description=AWG2 Harness multi-orchestrator
After=network-online.target docker.service
Wants=network-online.target
Requires=docker.service
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/awg2-harness daemon --config /etc/awg2-harness/config.toml
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
```
Активация:
```bash
systemd-analyze verify /etc/systemd/system/awg2-harness.service
systemctl daemon-reload
systemctl enable --now awg2-harness.service
```
## 7. Проверка после запуска daemon
## D. Manual source-tree install (staging/debug only)
```bash
systemctl status awg2-harness.service
journalctl -u awg2-harness.service -n 100 --no-pager
awg2-harness status --config /etc/awg2-harness/config.toml
```
Режим [`./tools/build.sh --install`](../tools/build.sh) предназначен для staging/debug с checkout-репозиторием.
## 8. Проверка auto-healing
```bash
docker restart amnezia-awg2
sleep 30
awg2-harness status --config /etc/awg2-harness/config.toml
```
Затем проверить Docker restart и host reboot. После каждого события status должен показывать healthy state без ручного запуска old bash.
## 9. Rollback
Production-путь AWG2 Harness не включает возврат к old bash в штатный процесс выкладки.
Это **не** основной production deployment path.