Amnezia Web Panel: LXC 143 — control-plane VPN-нод (NetBird-only), HOSTKEY Finland хаб; persistence data.json через bind-mount

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
dttb
2026-06-23 13:00:09 +03:00
parent 01930b0fbf
commit a63b4476eb
3 changed files with 93 additions and 3 deletions

View File

@@ -0,0 +1,39 @@
---
date: 2026-06-23
type: decision
tags: [dttb, vpn, amnezia, awg, netbird, control-plane]
---
# Amnezia Web Panel — control-plane VPN-нод на home lab (LXC 143)
## Контекст
Олег арендует HOSTKEY Finland (`151.241.234.241`, Ubuntu 22.04, 2 vCPU/3.9 GB) как **основной VPN-хаб для всех проектов**, старый финский VPS — горячий резерв. Управлять нодами решено через [Amnezia-Web-Panel](https://github.com/PRVTPRO/Amnezia-Web-Panel) (FastAPI/Python, paramiko-SSH; рулит AmneziaWG/WG/Xray-Reality/MTProxy на удалённых Ubuntu).
## Решение: панель — ДОМА, не на VPS
Панель = control-plane с SSH-ключами **ко всем** нодам сразу. Держим её на home lab (LXC 143), VPS оставляем чистым data-plane.
**Почему не на VPS:**
1. **Безопасность.** Финский VPS уже ломали через **RCE в amnezia-panel** (XorDDoS, чистили 2026-04-24). Панель на публичной коробке = ключи ко всему контуру под ударом.
2. Никакого публичного `:5000` + дефолт `admin/admin` + открытый Swagger `/docs`.
3. Переживает пересборку VPS — `data.json` (вся клиентская база) живёт дома.
4. Один пульт на все ноды (Finland + Paris/Singapore + будущие).
## Что развёрнуто (LXC 143, 10.0.0.143)
- Debian 12, unprivileged + nesting/keyctl, rootfs на `work` (local-lvm забит на 94%), ns 1.1.1.1.
- Docker 29.6 + compose, контейнер `prvtpro/amnezia-panel:1.4.4`, `-p 5000:5000`, restart=unless-stopped, onboot=1.
- NetBird `100.70.9.163` / `amnezia-panel.netbird.cloud` (группа Claude-Diag, ключ `1558712D-…`, `--disable-dns`).
- Доступ: LAN `10.0.0.143:5000` + NetBird `100.70.9.163:5000`. **Без NPM, без проброса портов — не публично.**
- Логин `admin` / `AmnPanel!2026-fi` (дефолт сменён; проверено: old→401, new→200).
## Грабли
- **Персистентность (важно).** Upstream `docker-compose.yml` монтирует `amnezia_data:/app/data`, но приложение пишет в **`/app/data.json`** и **`/app/tunnels_state.json`** (в WORKDIR `/app`). Т.е. дефолтный volume — пустышка, при пересоздании контейнера терялась бы вся база. Починено **bind-mount'ом конкретных файлов** в `/opt/amnezia-panel/`.
- Базовый Debian-шаблон без `curl` — ставить перед get.docker.com.
- Хеш пароля: `pbkdf2_hmac('sha256', pwd, salt_hex16, 100000)` → формат `salt$hex`. Смена пароля скриптом — воспроизвести этот алгоритм (`/opt/amnezia-panel/setpw.py`).
## Дальше (TODO)
- [ ] Завести финский VPS в панель (Servers → SSH-креды) и поднять AmneziaWG.
- [ ] VPS: SSH key-only, fw только VPN-порты, fail2ban (не повторить 2026-04-24).
- [ ] Резервный финский VPS: **переустановить ОС начисто** перед использованием, подцепить к панели.
- [ ] Решить failover (AWG сам не переключается): второй endpoint в конфигах клиентов либо переключение через панель/DNS.
- [ ] Проверить лимит трафика HOSTKEY (3 TB/мес) — под «все проекты» может быть тесно.
- [ ] Бэкап `/opt/amnezia-panel/data.json` (вся клиентская база).