vault backup: 2026-10-09 21:27:26
This commit is contained in:
Vendored
+43
-27
@@ -13,15 +13,30 @@
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "HomeLab/Proxmox/Proxmox - Installation - Backups.md",
|
||||
"file": "SBC - Hardware/Radxa E25.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "Proxmox - Installation - Backups"
|
||||
"title": "Radxa E25"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "bfbd778442b4387f",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "SBC - Hardware/ssd1306-rpi5-guide.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "ssd1306-rpi5-guide"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
"currentTab": 1
|
||||
}
|
||||
],
|
||||
"direction": "vertical"
|
||||
@@ -188,39 +203,40 @@
|
||||
"obsidian-excalidraw-plugin:New drawing": false
|
||||
}
|
||||
},
|
||||
"active": "26f4162438aca424",
|
||||
"active": "512da625ab202830",
|
||||
"lastOpenFiles": [
|
||||
"HomeLab/! Services.md",
|
||||
"Hermes/hermes-desktop-connect-guide.md",
|
||||
"Hermes/Hermes Agent - Настройка.md",
|
||||
"Hermes/guide-hermes-lxc-server-desktop.md",
|
||||
"VPN/amnezia-vpn-keenetic-kn1011.md",
|
||||
"VPN/Amnezia for Keenetic.md",
|
||||
"HomeLab/Valtwarden.md",
|
||||
"HomeLab/wireshark.md",
|
||||
"VPN/VPN (WireGuard & 3x-UI VLESS Reality).md",
|
||||
"SBC - Hardware/Raspberry PI5 + 3.2 SPI TFT (ILI9341).md",
|
||||
"SBC - Hardware/Radxa E25.md",
|
||||
"Git/Git.md",
|
||||
"SBC - Hardware",
|
||||
"HomeLab AI Analisys.md",
|
||||
"Network/Settings.md",
|
||||
"HomeLab/Proxmox/HAOS.md",
|
||||
"HomeLab/Proxmox/Gitea.md",
|
||||
"SBC - Hardware/ssd1306-rpi5-guide.md",
|
||||
"HomeLab/Services - description.md",
|
||||
"HomeLab/guide-nfs-omv-pve-pbs.md",
|
||||
"HomeLab/omv-qbittorrent-guide.md",
|
||||
"HomeLab/Docker - qBittorent.md",
|
||||
"HomeLab/Proxmox/Proxmox - Installation - Backups.md",
|
||||
"HomeLab/Proxmox/Proxmox - settings.md",
|
||||
"! Tasks - planned action.md",
|
||||
"HomeLab/omv-qbittorrent-guide.md",
|
||||
"HomeLab/Proxmox/Proxmox - Installation - Backups.md",
|
||||
"HomeLab/Hermes/hermes-desktop-connect-guide.md",
|
||||
"HomeLab/Hermes/Hermes Agent.md",
|
||||
"HomeLab/Docker - General.md",
|
||||
"HomeLab/Docker - qBittorent.md",
|
||||
"HomeLab AI Analisys.md",
|
||||
"HomeLab/Raspberry PI5 + 3.2 SPI TFT (ILI9341).md",
|
||||
"Linux Embedded/Linux - GPIO.md",
|
||||
"HomeLab/Proxmox/Gitea.md",
|
||||
"HomeLab/Hermes/amnezia-vpn-keenetic-kn1011.md",
|
||||
"HomeLab/Proxmox/Proxmox HA manual install.md",
|
||||
"HomeLab/Proxmox/HAOS.md",
|
||||
"HomeLab/HomePage.md",
|
||||
"HomeLab/Nginx Proxy Manager.md",
|
||||
"HomeLab/ssh config.md",
|
||||
"HomeLab/Hermes/ssd1306-rpi5-guide.md",
|
||||
"HomeLab/Hermes/oled_cpu_mon.py",
|
||||
"HomeLab/Hermes",
|
||||
"().md",
|
||||
"Hermes/oled_cpu_mon.py",
|
||||
"Hermes",
|
||||
"HomeLab/Files/Pasted image 20260427212721.png",
|
||||
"HomeLab/Files/Pasted image 20260426160841.png",
|
||||
"Pasted image 20260901214038.png",
|
||||
"HomeLab/Radxa E25.md",
|
||||
"HomeLab/wireshark.md",
|
||||
"HomeLab/Valtwarden.md",
|
||||
"HomeLab/Amnezia for Keenetic.md",
|
||||
"Linux/CLI/СLI FileSystem.md",
|
||||
"Pasted image 20260517222623.png",
|
||||
"VPN/XRAY VLESS Guide.pdf",
|
||||
"VPN",
|
||||
|
||||
@@ -0,0 +1,452 @@
|
||||
# Гайд: Установка Hermes Agent на LXC Debian и подключение с Windows Desktop
|
||||
|
||||
> Схема: Debian LXC (сервер Hermes) ↔ Windows ПК (Hermes Desktop)
|
||||
|
||||
---
|
||||
|
||||
## 1. Подготовка LXC контейнера
|
||||
|
||||
### 1.1. Создать LXC (если ещё нет)
|
||||
|
||||
На **хосте PVE**:
|
||||
|
||||
```bash
|
||||
pveam update
|
||||
pveam available | grep debian
|
||||
pveam download local debian-12-standard_12.7-1_amd64.tar.zst
|
||||
|
||||
pct create 300 local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst \
|
||||
--hostname hermes-server \
|
||||
--storage local-lvm \
|
||||
--memory 4096 \
|
||||
--cores 4 \
|
||||
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
|
||||
--password \
|
||||
--start
|
||||
|
||||
pct enter 300
|
||||
```
|
||||
|
||||
### 1.2. Настроить внутри контейнера
|
||||
|
||||
```bash
|
||||
# Стандартное обновление
|
||||
apt update && apt upgrade -y
|
||||
|
||||
# Зависимости Hermes
|
||||
apt install -y git curl build-essential python3 python3-pip python3-venv
|
||||
|
||||
# uv (менеджер Python для Hermes)
|
||||
curl -fsSL https://astral.sh/uv/install.sh | bash
|
||||
source ~/.bashrc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Установка Hermes Agent из GitHub
|
||||
|
||||
### 2.1. Ручной clone + установка (рекомендуется для сервера)
|
||||
|
||||
```bash
|
||||
cd /opt
|
||||
git clone --recurse-submodules https://github.com/NousResearch/hermes-agent.git
|
||||
cd hermes-agent
|
||||
|
||||
# Создать venv через uv
|
||||
uv venv venv --python 3.11
|
||||
export VIRTUAL_ENV="$(pwd)/venv"
|
||||
|
||||
# Установить со всеми extras
|
||||
uv pip install -e ".[all,dev]"
|
||||
|
||||
# Опционально: browser tools
|
||||
npm install
|
||||
```
|
||||
|
||||
> **Альтернатива (проще, но через инсталлятор):**
|
||||
> ```bash
|
||||
> curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
|
||||
> ```
|
||||
> После этого репозиторий лежит в `~/.hermes/hermes-agent/`. Этот вариант тоже устанавливает `hermes` команду.
|
||||
|
||||
### 2.2. Создать конфигурацию
|
||||
|
||||
```bash
|
||||
# Создать структуру директорий
|
||||
mkdir -p ~/.hermes/{cron,sessions,logs,skills}
|
||||
|
||||
# Если ставили вручную — симлинк для `hermes` команды
|
||||
mkdir -p ~/.local/bin
|
||||
ln -sf /opt/hermes-agent/venv/bin/hermes ~/.local/bin/hermes
|
||||
export PATH="$HOME/.local/bin:$PATH"
|
||||
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
|
||||
|
||||
# Базовая конфигурация
|
||||
cp /opt/hermes-agent/cli-config.yaml.example ~/.hermes/config.yaml
|
||||
|
||||
# API-ключи
|
||||
cat >> ~/.hermes/.env <<'EOF'
|
||||
# Минимум — один LLM провайдер:
|
||||
OPENROUTER_API_KEY=sk-or-v1-xxxxxxxxxxxx
|
||||
|
||||
# Опционально:
|
||||
# ANTHROPIC_API_KEY=sk-ant-...
|
||||
# OPENAI_API_KEY=sk-...
|
||||
EOF
|
||||
chmod 600 ~/.hermes/.env
|
||||
```
|
||||
|
||||
### 2.3. Проверка установки
|
||||
|
||||
```bash
|
||||
hermes doctor
|
||||
hermes chat -q "Привет, проверка связи"
|
||||
# Если работает — всё ок, выйти через /exit
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Запуск Hermes как сервера (hermes serve)
|
||||
|
||||
### 3.1. Настройка аутентификации
|
||||
|
||||
В `~/.hermes/.env` добавить:
|
||||
|
||||
```bash
|
||||
cat >> ~/.hermes/.env <<'EOF'
|
||||
# Учётные данные для подключения Desktop
|
||||
HERMES_DASHBOARD_BASIC_AUTH_USERNAME=admin
|
||||
HERMES_DASHBOARD_BASIC_AUTH_PASSWORD=придумайте-надёжный-пароль
|
||||
# Стабильный ключ — чтобы сессии сохранялись после перезапуска
|
||||
HERMES_DASHBOARD_BASIC_AUTH_SECRET=$(openssl rand -base64 32)
|
||||
EOF
|
||||
chmod 600 ~/.hermes/.env
|
||||
```
|
||||
|
||||
### 3.2. Запуск вручную (проверка)
|
||||
|
||||
```bash
|
||||
hermes serve --host 0.0.0.0 --port 9119
|
||||
```
|
||||
|
||||
Должно запуститься без ошибок. Проверить:
|
||||
|
||||
```bash
|
||||
# Из контейнера
|
||||
curl -s http://127.0.0.1:9119/api/status
|
||||
|
||||
# С другого узла в сети (PVE, Windows)
|
||||
curl -s http://<IP LXC>:9119/api/status
|
||||
```
|
||||
|
||||
> **Примечание:** `hermes serve` — это головной backend, к которому подключается Desktop. Если нужны также Telegram/Discord — их gateway запускается отдельно (`hermes gateway start`).
|
||||
|
||||
### 3.3. systemd-сервис для автозапуска
|
||||
|
||||
```bash
|
||||
cat > /etc/systemd/system/hermes-serve.service <<'EOF'
|
||||
[Unit]
|
||||
Description=Hermes Agent Serve Backend
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
Group=root
|
||||
WorkingDirectory=/root
|
||||
ExecStart=/root/.local/bin/hermes serve --host 0.0.0.0 --port 9119
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
Environment=HERMES_HOME=/root/.hermes
|
||||
# Timeout для graceful shutdown
|
||||
TimeoutStopSec=30
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
```
|
||||
|
||||
> Если ставили через официальный инсталлятор, путь к `hermes` может быть другим. Проверить:
|
||||
> ```bash
|
||||
> which hermes
|
||||
> # или
|
||||
> find / -name hermes -type f 2>/dev/null
|
||||
> ```
|
||||
|
||||
Активация:
|
||||
|
||||
```bash
|
||||
systemctl daemon-reload
|
||||
systemctl enable hermes-serve
|
||||
systemctl start hermes-serve
|
||||
systemctl status hermes-serve
|
||||
```
|
||||
|
||||
Логи:
|
||||
|
||||
```bash
|
||||
journalctl -u hermes-serve -f
|
||||
```
|
||||
|
||||
### 3.4. Запуск Dashboard (веб-интерфейс)
|
||||
|
||||
Если нужен ещё и веб-интерфейс для администрирования, запустить отдельно:
|
||||
|
||||
```bash
|
||||
hermes dashboard --host 0.0.0.0 --port 9120 --no-open
|
||||
# Доступно: http://<IP LXC>:9120
|
||||
```
|
||||
|
||||
Тоже можно под systemd (аналогично `hermes-serve`, только ExecStart поменять).
|
||||
|
||||
---
|
||||
|
||||
## 4. Подключение NFS-шары OMV к LXC
|
||||
|
||||
Чтобы конфигурация, сессии и навыки сохранялись даже после пересоздания контейнера — хранить `~/.hermes/` на NFS.
|
||||
|
||||
### 4.1. Монтирование NFS в LXC
|
||||
|
||||
Внутри **LXC-контейнера**:
|
||||
|
||||
```bash
|
||||
# Установить NFS-клиент
|
||||
apt install -y nfs-common
|
||||
|
||||
# Создать точку монтирования
|
||||
mkdir -p /mnt/hermes-data
|
||||
|
||||
# Проверить монтирование
|
||||
mount -t nfs 192.168.1.73:/export/hermes-data /mnt/hermes-data \
|
||||
-o rw,vers=4,hard,timeo=600,no_root_squash
|
||||
|
||||
ls -la /mnt/hermes-data/
|
||||
```
|
||||
|
||||
### 4.2. Перенос данных на NFS
|
||||
|
||||
```bash
|
||||
# Если в ~/.hermes/ уже есть данные
|
||||
cp -a ~/.hermes/* /mnt/hermes-data/
|
||||
# Или если NFS шара пустая — просто создать структуру
|
||||
mkdir -p /mnt/hermes-data/{cron,sessions,logs,skills}
|
||||
```
|
||||
|
||||
### 4.3. Переместить HERMES_HOME на NFS
|
||||
|
||||
```bash
|
||||
# Переместить домашнюю директорию Hermes
|
||||
mv ~/.hermes ~/.hermes.bak
|
||||
ln -s /mnt/hermes-data ~/.hermes
|
||||
|
||||
# Проверить
|
||||
ls -la ~/.hermes
|
||||
hermes doctor
|
||||
```
|
||||
|
||||
**Или** без симлинка — через переменную окружения:
|
||||
|
||||
```bash
|
||||
echo 'HERMES_HOME=/mnt/hermes-data' >> ~/.bashrc
|
||||
source ~/.bashrc
|
||||
# + обновить systemd unit
|
||||
# Environment=HERMES_HOME=/mnt/hermes-data
|
||||
```
|
||||
|
||||
### 4.4. Автомонтирование NFS (fstab)
|
||||
|
||||
В `/etc/fstab` LXC:
|
||||
|
||||
```bash
|
||||
192.168.1.73:/export/hermes-data /mnt/hermes-data nfs4 rw,hard,timeo=600,rsize=1048576,wsize=1048576,_netdev 0 0
|
||||
```
|
||||
|
||||
**Внимание:** если NFS не смонтируется — `hermes serve` не запустится. Можно сделать `After=mnt-hermes-data.mount` в systemd unit, но проще сделать startup script, который ждёт mount.
|
||||
|
||||
---
|
||||
|
||||
## 5. Установка Hermes Desktop на Windows
|
||||
|
||||
### 5.1. Скачать и установить
|
||||
|
||||
**Способ 1 (рекомендуется):**
|
||||
1. Скачать установщик с [hermes-agent.nousresearch.com/desktop](https://hermes-agent.nousresearch.com/desktop) (MSIX/App Installer)
|
||||
2. Запустить, пройти установку
|
||||
|
||||
**Способ 2 (через PowerShell):**
|
||||
```powershell
|
||||
iex (irm https://hermes-agent.nousresearch.com/install.ps1)
|
||||
```
|
||||
|
||||
### 5.2. Первый запуск
|
||||
|
||||
1. Запустить Hermes Desktop
|
||||
2. Пропустить Onboarding / Choose provider later
|
||||
3. Открыть **Settings → Gateways**
|
||||
|
||||
### 5.3. Подключение к серверу в LXC
|
||||
|
||||
**Settings → Gateways → Connection mode → Remote gateway**
|
||||
|
||||
| Поле | Значение |
|
||||
|------|---------|
|
||||
| Remote URL | `http://<IP-LXC>:9119` (например `http://192.168.1.200:9119`) |
|
||||
| Имя соединения | `hermes-server` (произвольно) |
|
||||
|
||||
Нажать **Connect / Sign in** → ввести:
|
||||
- **Username:** `admin` (из `HERMES_DASHBOARD_BASIC_AUTH_USERNAME`)
|
||||
- **Password:** (из `HERMES_DASHBOARD_BASIC_AUTH_PASSWORD`)
|
||||
|
||||
После успешного входа — Desktop подключён к удалённому серверу. Профили, сессии, скиллы — всё с сервера.
|
||||
|
||||
> **Проблема с HTTP:** если сервер без HTTPS, Desktop может ругаться на небезопасное соединение. Решения:
|
||||
> - Обернуть через Tailscale (см. раздел 7)
|
||||
> - Использовать SSH-туннель (раздел 6)
|
||||
> - Включить разрешение HTTP в настройках Windows Desktop (Settings → Advanced → Allow insecure connections)
|
||||
|
||||
---
|
||||
|
||||
## 6. SSH-туннель (альтернатива прямому HTTP)
|
||||
|
||||
Если не хотите открывать порт 9119 наружу или HTTPS нет:
|
||||
|
||||
### На Windows (PowerShell или WSL2)
|
||||
|
||||
```bash
|
||||
# SSH-туннель: локальный порт 9119 → LXC:9119
|
||||
ssh -L 9119:localhost:9119 root@<IP-LXC> -N
|
||||
```
|
||||
|
||||
После этого в Desktop указать `http://127.0.0.1:9119`. Трафик идёт через SSH.
|
||||
|
||||
### Автоматизация через systemd на Windows (WSL)
|
||||
|
||||
Создать скрипт `/etc/systemd/system/hermes-tunnel.service`:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=SSH tunnel to Hermes LXC
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/bin/ssh -L 9119:localhost:9119 root@<IP-LXC> -N -o ExitOnForwardFailure=yes
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
User=<ваш-user>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. Tailscale вариант (рекомендуется)
|
||||
|
||||
Если Tailscale уже настроен — просто используйте Tailscale IP вместо локального.
|
||||
|
||||
```bash
|
||||
# Установить Tailscale на LXC
|
||||
curl -fsSL https://tailscale.com/install.sh | sh
|
||||
tailscale up
|
||||
|
||||
# На Windows — установить Tailscale, войти в ту же сеть
|
||||
```
|
||||
|
||||
В Desktop указать: `http://<Tailscale-IP-LXC>:9119`
|
||||
|
||||
Tailscale даёт:
|
||||
- **Автоматический HTTPS** (магически, через `https://<machine>.ts.net`)
|
||||
- **Zero-trust сеть** — порт не нужно открывать в локальной сети
|
||||
- **Постоянные IP**, даже если LXC пересоздаётся
|
||||
|
||||
> После Tailscale можно использовать HTTPS: `https://<machine>.ts.net:9119` — Desktop не будет ругаться на небезопасное соединение.
|
||||
|
||||
---
|
||||
|
||||
## 8. Полная проверка
|
||||
|
||||
### 8.1. На LXC
|
||||
|
||||
```bash
|
||||
# Сервер работает?
|
||||
systemctl status hermes-serve
|
||||
|
||||
# Порт открыт?
|
||||
ss -tlnp | grep 9119
|
||||
|
||||
# NFS смонтирована?
|
||||
df -h | grep nfs
|
||||
ls -la ~/.hermes/
|
||||
```
|
||||
|
||||
### 8.2. С Windows
|
||||
|
||||
```bash
|
||||
# Проверить TCP-доступность
|
||||
Test-NetConnection -ComputerName <IP-LXC> -Port 9119
|
||||
|
||||
# Или через curl (если есть)
|
||||
curl http://<IP-LXC>:9119/api/status
|
||||
```
|
||||
|
||||
### 8.3. В Desktop
|
||||
|
||||
1. Открыть чат — должна появиться сессия на сервере
|
||||
2. Отправить сообщение — должен прийти ответ от агента
|
||||
3. Файлы перетаскиваются через Desktop → загружаются на LXC
|
||||
4. Скиллы, настройки, сессии — все на сервере
|
||||
|
||||
---
|
||||
|
||||
## 9. Типовые проблемы и решения
|
||||
|
||||
| Проблема | Причина | Решение |
|
||||
|----------|---------|---------|
|
||||
| `hermes serve` не запускается | Нет API-ключа в `.env` | Проверить `~/.hermes/.env`, добавить `OPENROUTER_API_KEY` |
|
||||
| Desktop: "Connection refused" | Порт 9119 не открыт / LXC не доступен | `systemctl status hermes-serve`, проверить firewall на PVE |
|
||||
| Desktop: "Unauthorized" | Неверный логин/пароль | Проверить `HERMES_DASHBOARD_BASIC_AUTH_USERNAME/PASSWORD` в `.env` |
|
||||
| После перезапуска LXC всё сбросилось | `HERMES_HOME` на локальной FS | Переместить на NFS (раздел 4), проверить fstab |
|
||||
| Desktop: "Cannot connect to insecure backend" | HTTP без HTTPS | Использовать Tailscale HTTPS или `Allow insecure connections` |
|
||||
| LXC не может смонтировать NFS | OMV NFS шара без `no_root_squash` | Включить `no_root_squash` в настройках NFS на OMV |
|
||||
| `hermes doctor` ругается на зависимости | Часть пакетов не установлена | `apt install -y build-essential git curl python3 python3-pip` |
|
||||
| Медленная загрузка файлов через Desktop | Rsize/wsize малые | В fstab на LXC: `rsize=1048576,wsize=1048576` |
|
||||
| Desktop обновляется, а сервер нет | Разные версии | `hermes update` на LXC, потом перезапустить `systemctl restart hermes-serve` |
|
||||
|
||||
---
|
||||
|
||||
## 10. Структура сервера (итог)
|
||||
|
||||
```
|
||||
LXC Debian (192.168.1.xxx)
|
||||
├── /opt/hermes-agent/ — исходники (git clone)
|
||||
├── /opt/hermes-agent/venv/ — виртуальное окружение Python
|
||||
├── /root/.local/bin/hermes — симлинк на исполняемый файл
|
||||
├── ~/.hermes/ → /mnt/hermes-data/ — конфиг, сессии, скиллы на NFS
|
||||
├── /etc/systemd/system/hermes-serve.service — сервис автозапуска
|
||||
└── systemd: hermes-serve (порт 9119)
|
||||
|
||||
OMV (192.168.1.73)
|
||||
├── NFS export: /export/hermes-data → LXC /mnt/hermes-data
|
||||
|
||||
Windows ПК
|
||||
└── Hermes Desktop → remote gateway: http://<LXC_IP>:9119
|
||||
```
|
||||
|
||||
## 11. Команды для быстрого старта (шпаргалка)
|
||||
|
||||
```bash
|
||||
# LXC — установка
|
||||
git clone --recurse-submodules https://github.com/NousResearch/hermes-agent.git /opt/hermes-agent
|
||||
cd /opt/hermes-agent && uv venv venv --python 3.11
|
||||
export VIRTUAL_ENV="$(pwd)/venv" && uv pip install -e ".[all,dev]"
|
||||
ln -sf /opt/hermes-agent/venv/bin/hermes ~/.local/bin/hermes
|
||||
|
||||
# LXC — конфиг
|
||||
echo 'OPENROUTER_API_KEY=sk-or-v1-...' >> ~/.hermes/.env
|
||||
echo 'HERMES_DASHBOARD_BASIC_AUTH_USERNAME=admin' >> ~/.hermes/.env
|
||||
echo 'HERMES_DASHBOARD_BASIC_AUTH_PASSWORD=my-password' >> ~/.hermes/.env
|
||||
chmod 600 ~/.hermes/.env
|
||||
|
||||
# LXC — запуск сервера
|
||||
hermes serve --host 0.0.0.0 --port 9119
|
||||
|
||||
# Desktop (Windows) — Settings → Gateways → Remote → http://<LXC_IP>:9119
|
||||
```
|
||||
@@ -1,7 +1,5 @@
|
||||
#homelab #proxmox #Gitea #homeassistant #haos #adguard #wireguard
|
||||
|
||||
|
||||
|
||||
### Useful resources
|
||||
Про домашнюю лабораторию: [Prohomelab](https://prohomelab.com/)
|
||||
Proxmox Community Scripts [Proxmox Community-scripts](https://community-scripts.org/)
|
||||
@@ -0,0 +1,325 @@
|
||||
# Гайд: Разшаривание NFS на OMV и подключение к PVE + PBS
|
||||
|
||||
> Инфраструктура: OMV 8 (192.168.1.73), Proxmox VE, Proxmox Backup Server (отдельная VM/CT)
|
||||
|
||||
---
|
||||
|
||||
## 1. Настройка NFS-шары на OMV
|
||||
|
||||
### 1.1. Через веб-интерфейс
|
||||
|
||||
**Services → NFS → Settings**
|
||||
- [x] Enable NFS v4
|
||||
- [x] Enable async (повышает производительность)
|
||||
- Порт: 2049 (по умолчанию)
|
||||
- Apply
|
||||
|
||||
**Services → NFS → Shares → Add**
|
||||
|
||||
| Поле | Значение |
|
||||
|------|---------|
|
||||
| Shared folder | `/путь/к/шаре` (создать заранее через Storage → Shared Folders) |
|
||||
| Client | `192.168.1.0/24` — вся локальная сеть |
|
||||
| Options | `rw,subtree_check,no_root_squash` |
|
||||
|
||||
> **`no_root_squash` критически важен для LXC**: без него клиентский root внутри контейнера будет преобразован в nobody и не сможет писать в шару.
|
||||
|
||||
**Применить**: кнопка `Apply` (галочка) вверху.
|
||||
|
||||
### 1.2. Через CLI — проверка
|
||||
|
||||
```bash
|
||||
# Убедиться, что NFS запущен
|
||||
systemctl status nfs-server
|
||||
|
||||
# Просмотреть экспорты
|
||||
showmount -e localhost
|
||||
|
||||
# Или файл конфигурации
|
||||
cat /etc/exports
|
||||
|
||||
# Пример содержимого:
|
||||
# /srv/mergerfs/pool/backup 192.168.1.0/24(rw,subtree_check,no_root_squash,sync)
|
||||
```
|
||||
|
||||
> **Важно**: после каждого Apply в веб-UI OMV переписывает `/etc/exports`. Ручные правки там не переживают следующего Apply.
|
||||
|
||||
---
|
||||
|
||||
## 2. Подключение NFS к PVE и проброс в LXC
|
||||
|
||||
### 2.1. Создание PVE Storage для NFS
|
||||
|
||||
**Datacenter → Storage → Add → NFS**
|
||||
|
||||
| Поле | Значение |
|
||||
|------|---------|
|
||||
| ID | `nfs-omv` (произвольное имя) |
|
||||
| Server | `192.168.1.73` |
|
||||
| Export | Путь из `/etc/exports` на OMV (например `/export/backup`) |
|
||||
| Content | Выбрать, для чего это хранилище: `Container template`, `ISO image`, `VZDump backup file`, `Container`, `Snippets` |
|
||||
|
||||
**Через CLI** (альтернатива):
|
||||
|
||||
```bash
|
||||
pvesm add nfs nfs-omv --server 192.168.1.73 --path /mnt/pve/nfs-omv --export /export/backup
|
||||
```
|
||||
|
||||
**Проверка**:
|
||||
```bash
|
||||
pvesm status | grep nfs-omv
|
||||
# Должно показать storage nfs-omv online
|
||||
```
|
||||
|
||||
> **Ограничение**: PVE NFS storage не позволяет пробросить NFS-шару напрямую в LXC как bind mount. Для LXC нужен ручной mount на **хосте** PVE, потом `mp0` проброс.
|
||||
|
||||
---
|
||||
|
||||
### 2.2. Монтирование NFS на хосте PVE (для LXC)
|
||||
|
||||
Создаём точку монтирования на **хосте Proxmox**:
|
||||
|
||||
```bash
|
||||
# Создать директорию
|
||||
mkdir -p /mnt/nfs-omv-backup
|
||||
|
||||
# Монтировать (проверка)
|
||||
mount -t nfs 192.168.1.73:/export/backup /mnt/nfs-omv-backup -o rw,vers=4,hard,timeo=600,rsize=1048576,wsize=1048576,no_root_squash
|
||||
|
||||
# Проверить
|
||||
ls -la /mnt/nfs-omv-backup
|
||||
df -h /mnt/nfs-omv-backup
|
||||
```
|
||||
|
||||
> **Варианты опций**:
|
||||
> - `vers=4` — NFSv4 (безопаснее, быстрее)
|
||||
> - `vers=3` — NFSv3 (если v4 не работает)
|
||||
> - `hard` — процессы ждут восстановления соединения (vs `soft` — таймаут с ошибкой)
|
||||
> - `no_root_squash` — root на LXC может писать как root
|
||||
> - `rsize,wsize=1048576` — максимальный размер блока (1 МБ) для производительности
|
||||
|
||||
Если шару надо использовать как хранилище **CT templates** или **VZDump backup**, лучше сначала смонтировать, потом добавить через `pvesm add dir`:
|
||||
|
||||
```bash
|
||||
pvesm add dir nfs-omv-lxc --path /mnt/nfs-omv-backup --content vztmpl,backup,snippets
|
||||
```
|
||||
|
||||
#### 2.2.1. Автомонтирование (fstab)
|
||||
|
||||
Добавить в `/etc/fstab` на **хосте PVE**:
|
||||
|
||||
```bash
|
||||
# OMV NFS share — для проброса в LXC
|
||||
192.168.1.73:/export/backup /mnt/nfs-omv-backup nfs4 rw,hard,timeo=600,rsize=1048576,wsize=1048576,_netdev 0 0
|
||||
```
|
||||
|
||||
Проверка автомонтирования:
|
||||
```bash
|
||||
umount /mnt/nfs-omv-backup
|
||||
mount -a
|
||||
df -h | grep nfs
|
||||
```
|
||||
|
||||
> **`_netdev`** — система не пытается монтировать NFS до поднятия сети.
|
||||
|
||||
---
|
||||
|
||||
### 2.3. Проброс NFS-шары в LXC контейнер
|
||||
|
||||
Редактировать конфиг контейнера `/etc/pve/lxc/<CT_ID>.conf`:
|
||||
|
||||
```bash
|
||||
# Синтаксис: mp0: /путь/на/хосте,mp=/путь/в/LXC
|
||||
mp0: /mnt/nfs-omv-backup,mp=/mnt/backup
|
||||
```
|
||||
|
||||
**Через CLI**:
|
||||
```bash
|
||||
pct set <CT_ID> -mp0 /mnt/nfs-omv-backup,mp=/mnt/backup
|
||||
```
|
||||
|
||||
**В веб-интерфейсе PVE**: выбрать контейнер → Resources → Add → Mount Point.
|
||||
|
||||
**Проверка внутри LXC**:
|
||||
```bash
|
||||
pct enter <CT_ID>
|
||||
ls -la /mnt/backup
|
||||
touch /mnt/backup/test-root && rm /mnt/backup/test-root
|
||||
```
|
||||
|
||||
> Если `touch` выдаёт `Permission denied` — на OMV включено `root_squash` (сменить на `no_root_squash`).
|
||||
|
||||
---
|
||||
|
||||
### 2.4. Полный пример: LXC с backup-шара
|
||||
|
||||
```bash
|
||||
# Хост PVE: монтируем NFS
|
||||
mkdir -p /mnt/nfs-omv-backup
|
||||
echo '192.168.1.73:/export/backup /mnt/nfs-omv-backup nfs4 rw,hard,timeo=600,_netdev 0 0' >> /etc/fstab
|
||||
mount -a
|
||||
|
||||
# Пробрасываем в LXC (ID = 200)
|
||||
pct set 200 -mp0 /mnt/nfs-omv-backup,mp=/mnt/backup
|
||||
|
||||
# Внутри LXC: проверяем
|
||||
pct enter 200
|
||||
df -h | grep /mnt/backup
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Подключение NFS к PBS (Proxmox Backup Server)
|
||||
|
||||
### 3.1. Вариант A: Через веб-интерфейс PBS
|
||||
|
||||
**Server → Storage → Add → NFS**
|
||||
|
||||
| Поле | Значение |
|
||||
|------|---------|
|
||||
| Server | `192.168.1.73` (OMV) |
|
||||
| Export | `/export/backup` или путь из OMV |
|
||||
| Content | `backup` (основное) |
|
||||
| Node | выбрать текущую ноду PBS |
|
||||
| Enable | [x] |
|
||||
|
||||
**Важно для NFS на PBS:**
|
||||
- PBS хранит данные в собственной структуре (`.chunk` +datastore). **Не надо** указывать уже существующую директорию с файлами — PBS создаст свою иерархию.
|
||||
- NFS-шара НЕ может одновременно быть datastore PBS **и** использоваться для чего-то другого (в PBS своя структура хранения).
|
||||
|
||||
### 3.2. Вариант B: Через CLI на PBS
|
||||
|
||||
```bash
|
||||
pvesm add nfs pbs-nfs-omv \
|
||||
--server 192.168.1.73 \
|
||||
--export /export/pbs-datastore \
|
||||
--content backup
|
||||
```
|
||||
|
||||
**Проверка:**
|
||||
```bash
|
||||
pvesm status | grep pbs-nfs-omv
|
||||
# Должно показать status: available
|
||||
```
|
||||
|
||||
### 3.3. Настройка бэкапа на NFS datastore
|
||||
|
||||
После добавления storage в PBS:
|
||||
|
||||
1. **В PVE**: Datacenter → Backup → Add
|
||||
- Storage: выбрать `pbs-nfs-omv` (имя storage в PBS)
|
||||
- Schedule: по необходимости
|
||||
- Selection Mode: Include/Exclude
|
||||
- Compression: ZSTD (рекомендуется)
|
||||
- Encryption: по желанию
|
||||
- Enable: [x]
|
||||
|
||||
2. **Или ручной бэкап через CLI на PVE**:
|
||||
```bash
|
||||
# Полный бэкап VM 100 в PBS-storage
|
||||
vzdump 100 --mode snapshot --compress zstd --storage pbs-nfs-omv
|
||||
|
||||
# Или с указанием PBS напрямую
|
||||
proxmox-backup-client backup \
|
||||
--backup-id "vm-100" \
|
||||
--backup-type "qemu" \
|
||||
--repository 192.168.1.73:datastore:pbs-nfs-omv
|
||||
```
|
||||
|
||||
### 3.4. Особенности NFS c PBS
|
||||
|
||||
| Аспект | Комментарий |
|
||||
|--------|------------|
|
||||
| **Производительность** | NFS добавляет latency — для PBS лучше локальный диск (ZFS/SATA SSD) |
|
||||
| **Надёжность** | `soft,timeo=600` на PBS клиенте — при временной потере NFS бэкап упадёт с ошибкой, а не зависнет (`hard`) |
|
||||
| **GC (Garbage Collection)** | PBS периодически чистит expired backup snapshots. Убедиться, что NFS шара смонтирована **с опцией `rw`** |
|
||||
| **Verification** | PBS verifying jobs будут читать данные бэкапов — NFS latency замедлит. Нормально для периодических verify |
|
||||
| **Multi-node access** | PBS поддерживает кластер — NFS datastore доступен всем нодам |
|
||||
|
||||
**Рекомендуемый fstab на PBS** (с `soft` для бэкапов):
|
||||
|
||||
```bash
|
||||
192.168.1.73:/export/pbs-datastore /mnt/datastore nfs4 soft,timeo=600,retrans=2,rsize=1048576,wsize=1048576,_netdev 0 0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Проверка работоспособности
|
||||
|
||||
### 4.1. Доступность NFS
|
||||
|
||||
```bash
|
||||
# С любого узла (PVE, PBS, LXC)
|
||||
showmount -e 192.168.1.73
|
||||
|
||||
# Должен показать:
|
||||
# Export list for 192.168.1.73:
|
||||
# /export/backup 192.168.1.0/24
|
||||
```
|
||||
|
||||
### 4.2. Монтирование
|
||||
|
||||
```bash
|
||||
# На PVE хосте
|
||||
mount | grep nfs
|
||||
df -h | grep nfs
|
||||
```
|
||||
|
||||
### 4.3. Проброс в LXC
|
||||
|
||||
```bash
|
||||
pct enter <CT_ID>
|
||||
df -h | grep /mnt/backup # Должна быть видна шара
|
||||
touch /mnt/backup/test && rm /mnt/backup/test # root должен писать
|
||||
```
|
||||
|
||||
### 4.4. Бэкап через PBS
|
||||
|
||||
```bash
|
||||
# В PVE сделать пробный бэкап на PBS storage
|
||||
vzdump <VM_ID> --mode snapshot --compress zstd --storage pbs-nfs-omv
|
||||
# Убедиться, что exit code = 0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Типовые ошибки и решения
|
||||
|
||||
| Проблема | Причина | Решение |
|
||||
|----------|---------|---------|
|
||||
| `mount.nfs: access denied by server` | IP клиента не в списке Client NFS шары | Проверить OMV NFS Share → Client |
|
||||
| `Permission denied` при записи из LXC | `root_squash` на OMV | Включить `no_root_squash` в Options NFS шары |
|
||||
| LXC не стартует с mp0 | Путь на хосте не смонтирован | `mount -a`, проверить `fstab` |
|
||||
| PBS: datastore недоступен | NFS шара упала | `systemctl restart proxmox-backup` |
|
||||
| NFS mount зависает (`hung` | Потеря сети, опция `hard` | `umount -f /mnt/nfs-...` или `soft` опция |
|
||||
| LXC: mount inside container readonly | LXC не имеет `privileged: 1` | Использовать привилегированный контейнер или настроить device cgroup |
|
||||
|
||||
---
|
||||
|
||||
## 6. Сводная схема
|
||||
|
||||
```
|
||||
OMV (192.168.1.73)
|
||||
├── NFS export: /export/backup (no_root_squash, rw)
|
||||
│
|
||||
├── PVE host
|
||||
│ ├── mount /mnt/nfs-omv-backup
|
||||
│ ├── pvesm dir → templates/snippets
|
||||
│ └── mp0 проброс → LXC контейнер /mnt/backup
|
||||
│
|
||||
├── PBS node
|
||||
│ ├── mount /mnt/datastore (export: /export/pbs-datastore)
|
||||
│ ├── pvesm add nfs pbs-nfs-omv
|
||||
│ └── datastore для backup/verify/GC
|
||||
│
|
||||
└── Другие клиенты (RPi5, VM)
|
||||
└── mount -t nfs 192.168.1.73:/export/backup /mnt/shared
|
||||
```
|
||||
|
||||
## 7. Ограничения и рекомендации
|
||||
|
||||
- **NFS → PBS**: для продакшена используйте локальные SSD/NVMe, NFS добавляет latency и риск потери связи во время бэкапа
|
||||
- **no_root_squash**: безопасно только в доверенной подсети (192.168.1.0/24)
|
||||
- **Автомонтирование**: `_netdev` обязателен, иначе система может зависнуть при загрузке до поднятия сети
|
||||
- **PBS datastore**: выделите отдельную NFS-шару для PBS — не смешивайте с общими файлами
|
||||
- **Бэкап конфига OMV**: `omv-confbackup` сохраняет настройки NFS-шар
|
||||
Reference in New Issue
Block a user