vault backup: 2026-10-15 20:03:12
This commit is contained in:
Vendored
+7
-7
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"collapse-filter": false,
|
"collapse-filter": false,
|
||||||
"search": "",
|
"search": "api",
|
||||||
"showTags": true,
|
"showTags": true,
|
||||||
"showAttachments": true,
|
"showAttachments": true,
|
||||||
"hideUnresolved": true,
|
"hideUnresolved": true,
|
||||||
@@ -9,14 +9,14 @@
|
|||||||
"colorGroups": [],
|
"colorGroups": [],
|
||||||
"collapse-display": false,
|
"collapse-display": false,
|
||||||
"showArrow": true,
|
"showArrow": true,
|
||||||
"textFadeMultiplier": 0,
|
"textFadeMultiplier": 0.2,
|
||||||
"nodeSizeMultiplier": 1.39824742268041,
|
"nodeSizeMultiplier": 1.82062647754137,
|
||||||
"lineSizeMultiplier": 1,
|
"lineSizeMultiplier": 1.71471631205674,
|
||||||
"collapse-forces": false,
|
"collapse-forces": false,
|
||||||
"centerStrength": 0.518713248970312,
|
"centerStrength": 0.280901722391084,
|
||||||
"repelStrength": 10,
|
"repelStrength": 6.59067882472138,
|
||||||
"linkStrength": 1,
|
"linkStrength": 1,
|
||||||
"linkDistance": 250,
|
"linkDistance": 250,
|
||||||
"scale": 0.8476850695340034,
|
"scale": 1.2273915140938336,
|
||||||
"close": false
|
"close": false
|
||||||
}
|
}
|
||||||
Vendored
+15
-30
@@ -4,39 +4,24 @@
|
|||||||
"type": "split",
|
"type": "split",
|
||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"id": "6a223f6f51a2d245",
|
"id": "07a826a4e91de77c",
|
||||||
"type": "tabs",
|
"type": "tabs",
|
||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"id": "9d3abe0b002165bf",
|
"id": "8ba21877fd5b84c6",
|
||||||
"type": "leaf",
|
"type": "leaf",
|
||||||
"state": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "HomeLab/LXC- Gitea.md",
|
"file": "HomeLab/LXC - HomePage.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"source": false
|
"source": false
|
||||||
},
|
},
|
||||||
"icon": "lucide-file",
|
"icon": "lucide-file",
|
||||||
"title": "LXC- Gitea"
|
"title": "LXC - HomePage"
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"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"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
]
|
||||||
"currentTab": 1
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"direction": "vertical"
|
"direction": "vertical"
|
||||||
@@ -70,7 +55,7 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "search",
|
"type": "search",
|
||||||
"state": {
|
"state": {
|
||||||
"query": "[\"tags\"]",
|
"query": "",
|
||||||
"matchingCase": false,
|
"matchingCase": false,
|
||||||
"explainSearch": false,
|
"explainSearch": false,
|
||||||
"collapseAll": false,
|
"collapseAll": false,
|
||||||
@@ -203,10 +188,17 @@
|
|||||||
"obsidian-excalidraw-plugin:New drawing": false
|
"obsidian-excalidraw-plugin:New drawing": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"active": "b3558acf9e721e10",
|
"active": "8ba21877fd5b84c6",
|
||||||
"lastOpenFiles": [
|
"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 - npm_keenetic_setup.md",
|
||||||
|
"HomeLab/LXC - Nginx Proxy Manager.md",
|
||||||
"HomeLab/npm_keenetic_setup.md",
|
"HomeLab/npm_keenetic_setup.md",
|
||||||
"HomeLab/PVE - Description.md",
|
"HomeLab/PVE - Description.md",
|
||||||
"HomeLab/PVE - General - Description.md",
|
"HomeLab/PVE - General - Description.md",
|
||||||
@@ -216,7 +208,6 @@
|
|||||||
"HomeLab/Proxmox/Proxmox - settings.md",
|
"HomeLab/Proxmox/Proxmox - settings.md",
|
||||||
"HomeLab/Valtwarden.md",
|
"HomeLab/Valtwarden.md",
|
||||||
"HomeLab/Proxmox/Proxmox HA manual install.md",
|
"HomeLab/Proxmox/Proxmox HA manual install.md",
|
||||||
"HomeLab/LXC- Gitea.md",
|
|
||||||
"HomeLab/LXC - PBS Proxmox Backup Server.md",
|
"HomeLab/LXC - PBS Proxmox Backup Server.md",
|
||||||
"HomeLab/LXC - HomePage.md",
|
"HomeLab/LXC - HomePage.md",
|
||||||
"HomeLab/ssh config.md",
|
"HomeLab/ssh config.md",
|
||||||
@@ -225,15 +216,9 @@
|
|||||||
"HomeLab/Docker - qBittorent.md",
|
"HomeLab/Docker - qBittorent.md",
|
||||||
"HomeLab/Docker - General.md",
|
"HomeLab/Docker - General.md",
|
||||||
"HomeLab/wireshark.md",
|
"HomeLab/wireshark.md",
|
||||||
"HomeLab/VE - HAOS - HomeAssistant.md",
|
|
||||||
"().md",
|
|
||||||
"HomeLab/PVE Proxmox - Installation.md",
|
|
||||||
"OMV - Guides",
|
"OMV - Guides",
|
||||||
"README.md",
|
|
||||||
"SBC - Hardware/Pasted image 20260901214038.png",
|
"SBC - Hardware/Pasted image 20260901214038.png",
|
||||||
"SBC - Hardware/Pasted image 20260517222623.png",
|
"SBC - Hardware/Pasted image 20260517222623.png",
|
||||||
"SBC - Hardware/Radxa E25.md",
|
|
||||||
"Network/Settings.md",
|
|
||||||
"SBC - Hardware",
|
"SBC - Hardware",
|
||||||
"Hermes/oled_cpu_mon.py",
|
"Hermes/oled_cpu_mon.py",
|
||||||
"Hermes",
|
"Hermes",
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#polza #api
|
||||||
Описание на Habr:
|
Описание на Habr:
|
||||||
|
|
||||||
AI провайдер: polza.ai
|
AI провайдер: polza.ai
|
||||||
|
|||||||
@@ -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`
|
||||||
@@ -14,6 +14,9 @@ https://github.com/homarr-labs/dashboard-icons
|
|||||||
|
|
||||||
Настройки находятся в `/opt/homepage/config/`
|
Настройки находятся в `/opt/homepage/config/`
|
||||||
|
|
||||||
|
PVE: token-id `homepage@pve!monitor`
|
||||||
|
`0fe6ef73-380b-4f4e-a403-7ac07c4cd021`
|
||||||
|
|
||||||
#filesystem #linux
|
#filesystem #linux
|
||||||
Директория `/opt` в Linux, сокращение от *optional* - аналог `Programm Files` установка стороннего ПО.
|
Директория `/opt` в Linux, сокращение от *optional* - аналог `Programm Files` установка стороннего ПО.
|
||||||
|
|
||||||
|
|||||||
@@ -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-сервисов.
|
||||||
Reference in New Issue
Block a user