vault backup: 2026-10-15 20:03:12

This commit is contained in:
2026-10-15 20:03:12 +03:00
parent d3a7a24f2d
commit 1494fdb95f
6 changed files with 571 additions and 37 deletions
+7 -7
View File
@@ -1,6 +1,6 @@
{
"collapse-filter": false,
"search": "",
"search": "api",
"showTags": true,
"showAttachments": true,
"hideUnresolved": true,
@@ -9,14 +9,14 @@
"colorGroups": [],
"collapse-display": false,
"showArrow": true,
"textFadeMultiplier": 0,
"nodeSizeMultiplier": 1.39824742268041,
"lineSizeMultiplier": 1,
"textFadeMultiplier": 0.2,
"nodeSizeMultiplier": 1.82062647754137,
"lineSizeMultiplier": 1.71471631205674,
"collapse-forces": false,
"centerStrength": 0.518713248970312,
"repelStrength": 10,
"centerStrength": 0.280901722391084,
"repelStrength": 6.59067882472138,
"linkStrength": 1,
"linkDistance": 250,
"scale": 0.8476850695340034,
"scale": 1.2273915140938336,
"close": false
}
+15 -30
View File
@@ -4,39 +4,24 @@
"type": "split",
"children": [
{
"id": "6a223f6f51a2d245",
"id": "07a826a4e91de77c",
"type": "tabs",
"children": [
{
"id": "9d3abe0b002165bf",
"id": "8ba21877fd5b84c6",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "HomeLab/LXC- Gitea.md",
"file": "HomeLab/LXC - HomePage.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "LXC- Gitea"
}
},
{
"id": "b3558acf9e721e10",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "HomeLab/LXC - npm_keenetic_setup.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "LXC - npm_keenetic_setup"
"title": "LXC - HomePage"
}
}
],
"currentTab": 1
]
}
],
"direction": "vertical"
@@ -70,7 +55,7 @@
"state": {
"type": "search",
"state": {
"query": "[\"tags\"]",
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
@@ -203,10 +188,17 @@
"obsidian-excalidraw-plugin:New drawing": false
}
},
"active": "b3558acf9e721e10",
"active": "8ba21877fd5b84c6",
"lastOpenFiles": [
"HomeLab/LXC - Nginx Proxy Manager.md",
"Hermes/hermes_hindsight_lxc_guide.md",
"VPN/amneziavpn-docker-guide.md",
"VPN/amnezia-vpn-keenetic-kn1011.md",
"VPN/Amnezia for Keenetic.md",
"Hermes/hermes-desktop-connect-guide.md",
"Hermes/Hermes Agent - Настройка.md",
"HomeLab/LXC- Gitea.md",
"HomeLab/LXC - npm_keenetic_setup.md",
"HomeLab/LXC - Nginx Proxy Manager.md",
"HomeLab/npm_keenetic_setup.md",
"HomeLab/PVE - Description.md",
"HomeLab/PVE - General - Description.md",
@@ -216,7 +208,6 @@
"HomeLab/Proxmox/Proxmox - settings.md",
"HomeLab/Valtwarden.md",
"HomeLab/Proxmox/Proxmox HA manual install.md",
"HomeLab/LXC- Gitea.md",
"HomeLab/LXC - PBS Proxmox Backup Server.md",
"HomeLab/LXC - HomePage.md",
"HomeLab/ssh config.md",
@@ -225,15 +216,9 @@
"HomeLab/Docker - qBittorent.md",
"HomeLab/Docker - General.md",
"HomeLab/wireshark.md",
"HomeLab/VE - HAOS - HomeAssistant.md",
"().md",
"HomeLab/PVE Proxmox - Installation.md",
"OMV - Guides",
"README.md",
"SBC - Hardware/Pasted image 20260901214038.png",
"SBC - Hardware/Pasted image 20260517222623.png",
"SBC - Hardware/Radxa E25.md",
"Network/Settings.md",
"SBC - Hardware",
"Hermes/oled_cpu_mon.py",
"Hermes",
@@ -1,3 +1,4 @@
#polza #api
Описание на Habr:
AI провайдер: polza.ai
+139
View File
@@ -0,0 +1,139 @@
# Настройка памяти Hindsight для ИИ-агента Hermes в LXC
Это руководство содержит инструкции по установке, конфигурированию и запуску долгосрочной памяти **Hindsight** (от Vectorize.io) для ИИ-агента **Hermes Agent** (от Nous Research) внутри изолированного контейнера LXC с использованием API-провайдера **Polza AI**.
---
## 1. Ресурсная сетка для LXC (Polza AI Оптимизация)
Так как инференс LLM и вычисление эмбеддингов полностью делегированы на сервера [Polza AI](https://polza.ai/), локальные требования к контейнеру минимальны:
* **Процессор (CPU):** 2 ядра (vCPU) — достаточно для работы PostgreSQL и маршрутизации запросов.
* **Оперативная память (RAM):** 2 ГБ — около 1 ГБ займет ОС и Hermes, еще 1 ГБ зарезервирует PostgreSQL для кэширования векторных индексов.
* **Дисковая подсистема (Storage):** 10–15 ГБ (желательно на NVMe/SSD для быстрого I/O при поиске по индексам `pgvector`).
* **Сеть:** Обязателен исходящий доступ в интернет для выполнения API-запросов к эндпоинтам Polza AI.
---
## 2. Пошаговая установка в контейнере
Зайдите в консоль вашего LXC-контейнера и выполните следующие шаги:
```bash
# 1. Обновление системы и установка зависимостей
apt update && apt upgrade -y
apt install -y python3 python3-pip postgresql postgresql-contrib git curl
# 2. Установка расширения pgvector для PostgreSQL
# (Необходимо для хранения долгосрочной векторной памяти)
apt install -y postgresql-15-pgvector || apt install -y postgresql-16-pgvector
# 3. Настройка базы данных
su - postgres -c "psql -c "CREATE USER hindsight_user WITH PASSWORD 'secure_password_here';""
su - postgres -c "psql -c "CREATE DATABASE hindsight_memory OWNER hindsight_user;""
su - postgres -c "psql -d hindsight_memory -c "CREATE EXTENSION IF NOT EXISTS vector;""
# 4. Установка Hermes Agent и плагина Hindsight
pip3 install hermes-agent-cli
hermes plugins install hindsight
```
---
## 3. Конфигурация (~/.hermes/hindsight/config.json)
Создайте или отредактируйте конфигурационный файл плагина. Замените `sk-polza-ВАШ_КЛЮЧ_ИЗ_КОНСОЛИ` на ваш реальный токен из личного кабинета Polza AI.
```json
{
"memory_enabled": false,
"hindsight": {
"mode": "local_embedded",
"database": {
"host": "127.0.0.1",
"port": 5432,
"user": "hindsight_user",
"password": "secure_password_here",
"dbname": "hindsight_memory"
},
"llm_provider": {
"type": "openai_compatible",
"base_url": "https://polza.ai/api/v1",
"api_key": "sk-polza-ВАШ_КЛЮЧ_ИЗ_КОНСОЛИ",
"model": "nousresearch/hermes-3-llama-3.1-70b"
},
"embedding_provider": {
"type": "openai_compatible",
"base_url": "https://polza.ai/api/v1",
"api_key": "sk-polza-ВАШ_КЛЮЧ_ИЗ_КОНСОЛИ",
"model": "openai/text-embedding-3-small"
},
"auto_recall": true,
"auto_retain": true
}
}
```
*Отключение стандартной памяти:* Команда `hermes tools disable memory` предотвратит дублирование контекста и сэкономит входящие токены.
---
## 4. Настройка автозапуска через systemd
Чтобы демон памяти автоматически поднимался при перезапуске LXC-контейнера, создайте системную службу.
Создайте файл `/etc/systemd/system/hindsight-daemon.service`:
```ini
[Unit]
Description=Hindsight Memory Daemon for Hermes Agent
After=postgresql.service
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/hermes memory daemon start
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user-target
```
Активируйте и запустите службу:
```bash
systemctl daemon-reload
systemctl enable hindsight-daemon.service
systemctl start hindsight-daemon.service
```
---
## 5. Использование и команды ИИ-агента
При включенных параметрах `auto_recall` и `auto_retain` Hermes работает полностью автономно. Но вы можете управлять памятью и вручную в окне чата:
* **Ручное сохранение факта:**
> *"Запомни, что тестовый сервер развернут на порту 8080 с конфигурацией дебага."*
*(Hermes вызовет инструмент `hindsight_retain`)*
* **Извлечение контекста:**
> *"На каком порту мы тестировали сервер?"*
*(Hermes выполнит поиск через `hindsight_recall`)*
* **Синтез знаний (Рефлексия):**
Периодически запускайте процесс консолидации памяти, чтобы объединить разрозненные факты и очистить базу от устаревшего "шума":
```bash
hermes memory reflect --force
```
---
## 6. Логи и Диагностика в LXC
Если агент теряет контекст, проверьте следующие точки отказа внутри контейнера:
* **Статус демона памяти:** `systemctl status hindsight-daemon.service`
* **Просмотр логов Hindsight:** `tail -f ~/.hermes/logs/hindsight-embed.log`
* **Проверка подключения к PostgreSQL:** `psql -U hindsight_user -d hindsight_memory -h 127.0.0.1`
* **Проверка доступности шлюза Polza AI:** `curl -I https://polza.ai/api/v1/models`
+3
View File
@@ -14,6 +14,9 @@ https://github.com/homarr-labs/dashboard-icons
Настройки находятся в `/opt/homepage/config/`
PVE: token-id `homepage@pve!monitor`
`0fe6ef73-380b-4f4e-a403-7ac07c4cd021`
#filesystem #linux
Директория `/opt` в Linux, сокращение от *optional* - аналог `Programm Files` установка стороннего ПО.
+406
View File
@@ -0,0 +1,406 @@
# AmneziaVPN в Docker: полный гайд
**Цель:** поднять в Docker контейнере клиент AmneziaVPN (AmneziaWG 3.1), подключить его по пользовательскому `.conf` от Amnezia Premium и сделать его VPN-шлюзом для домашней сети.
**Автор:** Hermes Agent • Среда: LXC-контейнер (Docker 29.4.1, ядро Proxmox 6.17.13-2-pve)
---
## 1. Что потребуется
| Компонент | Значение |
|-----------|----------|
| Хост | Linux с Docker 20.10+ (тестировалось: LXC 29.4.1) |
| `/dev/net/tun` | Должен существовать и быть открыт |
| `ip_forward` | `1` |
| `.conf` файл | Amnezia Premium / AmneziaWG 3.1 конфиг |
| Версии | `amneziawg-go` v3.1.20260828, `amneziawg-tools` v3.1.20260812 |
Пример `.conf` (Amnezia Premium, конфиг 3.1):
```ini
[Interface]
Address = 100.85.175.118/32
DNS = 100.64.0.1, 8.8.4.4
PrivateKey = fSdjHMi8tAzL2wbNxsylQW1FAIXdn2/ODPGWr569J/w=
Jc = 5
Jmin = 10
Jmax = 80
H1 = 1
H2 = 2
H3 = 3
H4 = 4
HeaderProtectionKey = 8H1SggRhZ8iT8ZYZlS/RPf6SItoxb8OeXX2rNwMgc3M=
RekeyAfterTime = 100-120
RekeyTimeout = 3-8
RejectAfterTime = 150-180
KeepaliveTimeout = 7-13
MaxHandshakeAttempts = 15-20
ContentPaddingAddition = 10-100
[Peer]
PublicKey = FfgUO6z0plGUntTW3T8fsFsZ250GcQZEKlCgj1fkRFc=
PresharedKey = +Is1eWUUQ5UXYD8E7zigG32KaThcGC/YolOVS7LeDGU=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 78.17.149.78:8344
PersistentKeepalive = 25-35
```
> ⚠️ **НЕ** выкладывай `.conf` ни в чат, ни на сторонние сайты. Его приватный ключ — твой доступ. Файл копируется только на сервер.
---
## 2. Подготовка хоста
```bash
# Проверить Tun-устройство и форвардинг
ls -la /dev/net/tun
cat /proc/sys/net/ipv4/ip_forward # должно быть 1
# Включить форвардинг (если 0)
echo 1 > /proc/sys/net/ipv4/ip_forward
# Проверить Docker
docker --version
```
**На LXC (виртуальном контейнере Proxmox)** убедись, что:
- `/dev/net/tun` существует (создаётся через настройки LXC)
- `net.ipv4.ip_forward=1` установлен (в Proxmox: LXC → Options → Features)
---
## 3. Скачивание репозиториев
> ⚠️ Сборку ведём из **локальных** копий репозиториев (COPY в Dockerfile), так как DNS внутри build-контейнера нестабилен.
```bash
mkdir -p /root/awg-src
cd /root/awg-src
# Правильный DNS на хосте LXC
echo "nameserver 8.8.8.8" > /etc/resolv.conf
git clone --depth 1 --branch v3.1.20260828 https://github.com/amnezia-vpn/amneziawg-go.git
git clone --depth 1 --branch v3.1.20260812 https://github.com/amnezia-vpn/amneziawg-tools.git
```
**Проверка тегов** (актуальные на момент сборки):
```bash
git ls-remote --tags https://github.com/amnezia-vpn/amneziawg-go.git | tail
# v3.1.20260813, v3.1.20260814, v3.1.20260828
git ls-remote --tags https://github.com/amnezia-vpn/amneziawg-tools.git | tail
# v3.0.20260805, v3.1.20260812
```
> Найдите **последний** тег v3.1.* — они выходят часто и содержат исправления DPI-обхода.
---
## 4. Директория сборки
```bash
mkdir -p /root/awg-builder
cp -r /root/awg-src/amneziawg-go /root/awg-builder/
cp -r /root/awg-src/amneziawg-tools /root/awg-builder/
```
---
## 5. Dockerfile
**`/root/awg-builder/Dockerfile`**
```dockerfile
# syntax=docker/dockerfile:1
FROM golang:alpine AS go-build
RUN apk add --no-cache make gcc musl-dev linux-headers
COPY amneziawg-go /src/amneziawg-go
RUN cd /src/amneziawg-go && make && cp amneziawg-go /go/bin/
COPY amneziawg-tools /src/amneziawg-tools
RUN cd /src/amneziawg-tools/src && make && cp wg /go/bin/awg
FROM alpine:3.21
RUN apk add --no-cache iptables ip6tables iproute2 bash openresolv
COPY --from=go-build /go/bin/amneziawg-go /usr/bin/
COPY --from=go-build /go/bin/awg /usr/bin/
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
```
> **Почему `cp wg /go/bin/awg`**: в `amneziawg-tools` бинарь надёжнее назвать `awg`. Это клиентская утилита управления интерфейсом.
**Healthcheck** (необязателен): добавить в Dockerfile ```HEALTHCHECK``` — можно пропустить, статус смотрим через `awg show`.
---
## 6. entrypoint.sh
Скрипт: поднимает интерфейс, загружает конфиг (с фолбэком на минимальный), настраивает policy routing и NAT.
**`/root/awg-builder/entrypoint.sh`**
```bash
#!/bin/bash
CONFIG_DIR=/config
for f in "${CONFIG_DIR}"/*.conf; do
[ -f "$f" ] || continue
IFACE=$(basename "$f" .conf)
echo "Starting AmneziaWG interface: ${IFACE}"
modprobe amneziawg 2>/dev/null || true
if ! ip link show "${IFACE}" 2>/dev/null | grep -q UP; then
ip link add "${IFACE}" type amneziawg 2>/dev/null || {
echo "[*] Using userspace amneziawg-go"
amneziawg-go "${IFACE}" 2>/dev/null || true
sleep 1
}
fi
TMPF=$(mktemp)
grep -v -E '^(Address|DNS)' "$f" > "$TMPF"
if ! awg setconf "${IFACE}" "$TMPF" 2>/dev/null; then
echo "[!] Trying minimal config"
{
echo "[Interface]"
grep -E '^PrivateKey' "$f"
echo "ListenPort = 51820"
echo ""
echo "[Peer]"
grep -E '^(PublicKey|PresharedKey|AllowedIPs|Endpoint|PersistentKeepalive)' "$f"
} | awg setconf "${IFACE}" /dev/stdin 2>/dev/null || {
echo "[!] FATAL: cannot parse config"
rm -f "$TMPF"
continue
}
fi
rm -f "$TMPF"
IP=$(grep ^Address "$f" | head -1 | cut -d= -f2 | tr -d ' ' | cut -d, -f1)
[ -n "$IP" ] && ip addr add "$IP" dev "${IFACE}" 2>/dev/null || true
ip link set "${IFACE}" up
echo "[*] ${IFACE} UP: ${IP}"
done
# --- Policy routing: только forwarded LAN-трафик через VPN ---
mkdir -p /etc/iproute2
if ! grep -q "awg-vpn" /etc/iproute2/rt_tables 2>/dev/null; then
echo "100 awg-vpn" >> /etc/iproute2/rt_tables 2>/dev/null || true
fi
ip route add 0.0.0.0/0 dev awg0 table 100 2>/dev/null || true
# Пометить forwarded LAN-трафик (не на LAN) меткой 100
iptables -t mangle -C PREROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MARK --set-mark 100 2>/dev/null || \
iptables -t mangle -A PREROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MARK --set-mark 100 2>/dev/null || true
# Пакеты с меткой 100 → таблица awg-vpn (через awg0)
ip rule add fwmark 100 lookup 100 priority 5000 2>/dev/null || true
# NAT для LAN через туннель
iptables -t nat -C POSTROUTING -s 192.168.1.0/24 -o awg0 -j MASQUERADE 2>/dev/null || \
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o awg0 -j MASQUERADE 2>/dev/null || true
echo 1 > /proc/sys/net/ipv4/ip_forward 2>/dev/null || true
echo "[*] AmneziaWG client running"
awg show 2>/dev/null || true
sleep infinity
```
> **Как работает policy routing**:
> - Локальный (исходящий) трафик **самого LXC** (SSH и т.д.) → идёт напрямую через `eth0`
> - Только **forwarded** трафик из LAN → помечается меткой → направляется в таблицу `awg-vpn` → уходит через `awg0`
> - Это сохраняет доступ к управлению LXC, не ломая VPN-шлюз
---
## 7. Редактирование сети под свою подсеть
В скрипте выше я использовал `192.168.1.0/24` — это **основной LAN сегмент**, который пойдёт через VPN.
**Если нужна отдельная VPN-подсеть** (например `192.168.2.0/24`), замени в двух местах:
- `iptables -t mangle ... -s 192.168.1.0/24` → `-s 192.168.2.0/24`
- `iptables -t nat ... -s 192.168.1.0/24 ... -o awg0` → `-s 192.168.2.0/24`
Подробнее про отдельную подсеть см. раздел «Расширенный сценарий» ниже.
---
## 8. Запуск
1. **Создай директорию конфига** и положи туда `.conf`:
```bash
mkdir -p /root/awg-config
cp /путь/к/de.conf /root/awg-config/awg0.conf
# ↑ имя файла = имя интерфейса (awg0)
```
2. **Собери образ:**
```bash
cd /root/awg-builder
docker build -t amneziawg-client:latest .
```
3. **Запусти контейнер:**
```bash
docker run -dit \
--name=amneziawg-client \
-v /root/awg-config:/config \
--network=host \
--device=/dev/net/tun:/dev/net/tun \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
--restart always \
amneziawg-client:latest
```
4. **Проверь:**
```bash
docker ps --filter name=amneziawg-client # Up, restart always
docker logs amneziawg-client # интерфейс UP, handshake
docker exec amneziawg-client awg show # самый наглядный статус
```
---
## 9. Проверка работоспособности
```bash
# Статус интерфейса и handshake (главное)
docker exec amneziawg-client awg show
# Должно быть: "latest handshake: N seconds ago" и ненулевые transfer
# Внешний IP с самого LXC (через awg0):
curl -s ifconfig.me
# Это будет IP VPN-провайдера
# Статус NAT/маршрутизации
docker exec amneziawg-client iptables -t mangle -L PREROUTING -n -v
docker exec amneziawg-client iptables -t nat -L POSTROUTING -n -v
# Проверка forwarded трафика из LAN:
# с устройства в 192.168.1.0/24, у которого шлюз = 192.168.1.147
curl -s ifconfig.me
# Тоже IP VPN-провайдера
```
**Полезный признак нормальной работы:**
```
peer: FfgUO6z0plGUntTW3T8fsFsZ250GcQZEKlCgj1fkRFc=
latest handshake: 42 seconds ago ← периодически обновляется
transfer: 1.24 MiB received, 3.2 MiB sent ← данные идут
```
Если `latest handshake` отсутствует и `received = 0` — пакеты не доходят до сервера. Причины: файрвол роутера блокирует UDP, неверный Endpoint в `.conf`, фильтрация DPI.
---
## 10. Включение шлюза для LAN
Когда туннель поднят, чтобы устройства LAN пошли через VPN, на **роутере** меняют шлюз по умолчанию или статический маршрут:
**Keenetic (веб-интерфейс):**
1. `Интернет-центр → Маршрутизация → Статические маршруты`
2. Добавить:
- Сеть назначения: `0.0.0.0`
- Маска: `0.0.0.0`
- Шлюз: `192.168.1.147`
- (или конкретная VPN-подсеть, если не вся LAN)
**На телефоне (временная проверка):**
- Wi-Fi → IP-настройки → Статический → Маршрутизатор = `192.168.1.147`
---
## 11. Питфоллы и их решение
| Проблема | Причина | Решение |
|----------|---------|---------|
| `Unknown device type. Falling back to userspace` | Нет модуля ядра amneziawg | Нормально; userspace (amneziawg-go) работает |
| `Line unrecognized: S3=145` | Старая версия `awg`, не знает v3.1 параметры | Собрать свежую amneziawg-tools v3.1.x (п.3) |
| `Address=/DNS=` line error | `awg setconf` не понимает `wg-quick` директивы | Убрать `Address`/`DNS` из `setconf` (см. entrypoint) |
| `/proc/sys/...ip_forward: Read-only` | Ограничение LXC / контейнера | Включить заранее на хосте (п.2) |
| Диск забит (`no space left on device`) | Сборки и образы жрут место | `docker system prune`, расширить диск |
| `gcc not found` при сборке tools | Нет компилятора | `apk add gcc musl-dev` в Dockerfile |
| `linux/types.h` нет | Нужны linux-headers | `apk add linux-headers` |
| `cockpit`/быстрые списки GitHub таймаут | DNS внутри build-контейнера | Клонировать на хосте, `COPY` в Dockerfile |
---
## 12. Расширенный сценарий: отдельная VPN-подсеть (вариант B)
Нужно, чтобы не вся LAN уходила в VPN, а только отдельные устройства в своей подсети (`192.168.2.0/24`).
**На LXC добавить alias-IP шлюза:**
```bash
ip addr add 192.168.2.1/32 dev eth0
# persistence: netplan / LXC interface
```
**entrypoint.sh — расширить маршрутизацию:**
```bash
# Вторая подсеть → тоже через VPN
iptables -t mangle -A PREROUTING -s 192.168.2.0/24 ! -d 192.168.2.0/24 -j MARK --set-mark 100
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o awg0 -j MASQUERADE
```
**DHCP сервер для 192.168.2.0/24** (dnsmasq на LXC или Docker):
```
interface=eth0
dhcp-range=192.168.2.100,192.168.2.200,255.255.255.0,24h
dhcp-option=3,192.168.2.1
dhcp-option=6,100.64.0.1,8.8.8.8
```
**Keenetic — статический маршрут:**
- Сеть: `192.168.2.0`, маска `255.255.255.0`, шлюз `192.168.1.147`
**Keenetic — гостевая сеть с другой подсетью:**
- Создать вторую SSID, IP `192.168.2.1/24`, DHCP `192.168.2.x`
---
## 13. Обновление версий AWG
Поскольку AmneziaWG 3.x развивается быстро (новые теги), при проблемах с DPI-блокировками:
```bash
# Узнать свежие теги
git ls-remote --tags https://github.com/amnezia-vpn/amneziawg-go.git | tail
git ls-remote --tags https://github.com/amnezia-vpn/amneziawg-tools.git | tail
# Пересобрать из свежих копий
cd /root/awg-src/amneziawg-go && git fetch --tags && git checkout v3.1.XXXXXXX
cd /root/awg-src/amneziawg-tools && git fetch --tags && git checkout v3.1.XXXXXXX
cp -r /root/awg-src/amneziawg-*/* /root/awg-builder/
docker build -t amneziawg-client:latest /root/awg-builder/
```
---
## 14. Безопасность и данные
- **Приватный ключ** в `.conf` не попадает в логи/память ассистента — только в файл на сервере.
- Не выкладывай `.conf` в чат, репозитории, скриншоты.
- `.conf` читается из `/root/awg-config/awg0.conf` только контейнером.
- Права: `chmod 600 /root/awg-config/awg0.conf`.
---
## Итоговая структура файлов
```
/root/awg-config/awg0.conf ← твой .conf (private)
/root/awg-builder/Dockerfile
/root/awg-builder/entrypoint.sh
/root/awg-builder/amneziawg-go/ ← исходники (3.1.20260828)
/root/awg-builder/amneziawg-tools/ ← исходники (3.1.20260812)
/root/awg-src/ ← свежие клоны (для апдейтов)
```
**Контейнер:** `amneziawg-client` = полностью автономный AWG-шлюз, ставится как `--restart always`, не зависит от остальных Docker-сервисов.