Compare commits
111 Commits
864b899513
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 8f3d1fa86d | |||
| 2ef1c4b148 | |||
| 4289ecc8e9 | |||
| 486cd9ea52 | |||
| 887d1998d7 | |||
| af844b4007 | |||
| 749155fcab | |||
| e5b911ca81 | |||
| 3be27e2f4a | |||
| 341f1a0185 | |||
| f6a48ad404 | |||
| 048967695e | |||
| 4c21cb56f8 | |||
| 5bcc27bcb3 | |||
| fb62c3778a | |||
| 529eabb00d | |||
| 13116bc03c | |||
| 111a505a1b | |||
| 928e49b8fa | |||
| af91845e38 | |||
| 75b3e91d1d | |||
| d6d55b7bc5 | |||
| 1df8658ef3 | |||
| b831a8496f | |||
| 9410f41c1a | |||
| 9cf1adb7e3 | |||
| edc6ca3300 | |||
| efb47a5628 | |||
| c532441dd7 | |||
| 7e13bb2ae3 | |||
| 30cb746391 | |||
| a467d3a5f0 | |||
| e80a953683 | |||
| f967d99fed | |||
| 66aca4e702 | |||
| c300ef0f0a | |||
| 663dac0a38 | |||
| 2ce2834aba | |||
| f6dcb27565 | |||
| cdd8574f8a | |||
| e5c660e99d | |||
| 38f8ffbe2e | |||
| deb8363f23 | |||
| 09fc6d45b7 | |||
| af8a36aa92 | |||
| 1b5c4653bb | |||
| 28f98acf77 | |||
| ab5ce23e4d | |||
| 175c447dd6 | |||
| 9dbabadc20 | |||
| 2c51a095a3 | |||
| 5c202cc664 | |||
| cdcce3204f | |||
| 38ec6559f8 | |||
| 6fcab99ce3 | |||
| 976df2143e | |||
| 1494fdb95f | |||
| d3a7a24f2d | |||
| e9e9f1b157 | |||
| a255ab849a | |||
| ed1ad17077 | |||
| 8b20ac3597 | |||
| 99f9a7489e | |||
| fb33f0d197 | |||
| 00d29441e0 | |||
| 632707446e | |||
| 95015ed808 | |||
| 67ecde53bf | |||
| 5252a17263 | |||
| 14c01b0ded | |||
| ee256d36a2 | |||
| b8a8b3f2e6 | |||
| 464589c8ea | |||
| 442fbc481e | |||
| abbf572d82 | |||
| 17a48246ed | |||
| 7dd514bf75 | |||
| a9af2aefc9 | |||
| 926dd923b1 | |||
| c39f264c45 | |||
| dda329e683 | |||
| 51e1273bc4 | |||
| ea9b7bacd0 | |||
| f09b1ef1c6 | |||
| 728cfdaa9b | |||
| 9d2a2a018c | |||
| 76280c24a1 | |||
| 3d4ef0c71f | |||
| cf00605d06 | |||
| 8b94fca101 | |||
| 768a4b84e8 | |||
| 8faea77988 | |||
| 7e426872d4 | |||
| 720002c361 | |||
| 7b7bad1da4 | |||
| 0a6f8dbe4b | |||
| 43072339c4 | |||
| e5e39cda08 | |||
| 2feae37fc4 | |||
| d9fac18134 | |||
| ef1c3c8ac0 | |||
| 6cd34dc388 | |||
| 8cab34311e | |||
| f9b4814681 | |||
| f03423434f | |||
| 5211296283 | |||
| 62cc2590b3 | |||
| 7c695a216d | |||
| 3aa65c8f41 | |||
| f6813d9f76 | |||
| 260bfa1f7e |
@@ -1,87 +0,0 @@
|
|||||||
# General Action
|
|
||||||
## HomeLab
|
|
||||||
AI анализ:
|
|
||||||
> [!note]- ai prompt
|
|
||||||
> Роль: девопс инженер, эксперт в области linux и сетевой инфраструктуры HomeLab.
|
|
||||||
> Задача: проанализировать общую идею, текущую аппаратную и программную конфигурацию, сервисы и основные аспекты. В случае необходимости подели на подзадачи. Задавай уточняющие вопросы и найди узкие места в архитектуре. В случае спорных вариантов предложи альтернативное решение, для построения надежного HomeLab сервера.
|
|
||||||
> Общая идея: построение надежного HomeLab сервера для домашнего использования, с целью совершенствования навыков сетевого инженера. Изучение linux и клиент-серверной архитектуры, внутренних сервисов, архитектуры сетей, работа с LXC и docker контейнерами. Косвенно, при построении я получаю полезные сервисы, которые можно использовать дома и при отладки своих своих внутренних Pet проектов. Возможность подключения к своему серверу из любой точки мира, где есть интернет
|
|
||||||
> Аппаратная конфигурация: 1. Роутер keenetic giga kn1011. 2. PC - NUC на i3-8109U CPU с 16GB DDR. 3. NAS WD My Book с HDD 500GB. Соединение PC-роутер LAN 1G порт1. NAS - роутер LAN порт2. Роутер имеет статический, "белый" IP.
|
|
||||||
> Программная конфигурация: на PC установлен Poroxmox Virtual Environment 9.1.9 который имеет следующую конфигурацию: LXC - gitea, adguard, debian, homepage, docker, nginxproxymanager, jellyfin. Все LXС контейнеры имеют тип Unprivileged. Так же установлен HomeAssistant OS в VM. Дополнительно в LXC docker установлены образы Portainer, HomeLable, Drawio и qBittorrent. В Proxmox прокинута SMB Public папка c NAS WD, с автомонтированием папки mnt/share в fstab. Каталог mnt/share подключен к следующим LXC (docker и jellyfin) В docker контейнере она используется как рабочий каталог для qBittorrent. Jellyfin использует ее как медиатеку с фильмами и музыкой. Так же к NUC подключен Sonoff USB - ZigBee dongle который проброшен в VM HomeAssistan. SSH доступ к Proxmox: вход по паролю - запрещен, прописаны rsa25595 ключи, стандартный порт изменен.
|
|
||||||
> Сервисы: На текущий момент настроены и активно используются следующие сервисы: 1 VM HomeAssistant OS - управляет сценариями умного дома (скрипты автоматизации, zigbee устройства и тд. 2 LXC Gitea - как основной домашний репозиторий для pet проектов и wiki obsidian. 3 LXC Jellyfin - основной сриминговый медиасервер для музыки, фильмов и сериалов используется в связке с qbittorrent докер образом, который развернут в LXC docker. 4 LXC HomePage - основная web страница HomeLab, для удобства доступа к ресурсам. 5 Adguard - использовался долгое время, как основной DNS сервер, фильтруя трафик, пока я не задумал устанвить NginxProxyserver, на время экспериментов adguard остановлен. 6 LXC Debian - предусмотрен как контейнер с ОС debian для отработки различных сценариев внутри ОС, там установлен VPN Xray vless, с панелью 3x-ui. ВПН пока не используется 7. LXC docker - задумывался как отдельный LXC контейнер для отработки навыков взаимодействия с docker (установка,запуск,настройка образов). Сейчас там установлены следующие images: homelable - визуализация сетевой инфраструктуры (пощупал, но пока не настроил. планирую вернуться к этому) drawio - как собственный ресурс. Практически не используется,нужен ли? и qbittorren - используется для закачки torrent образов
|
|
||||||
> Основные аспекты: 1. Для доступа из внешнего мира в роутере переадресация портов: Проброшены TCP/UDP порты к UI Proxmox VE, HomeAssistant VM, Gitea и Jellyfin LXC. 2 В роутере разделение на VLAN и подсети не настроено. Роутер имеет возможность настройки системы доменных для использования сервисов. 3 NAS планирую менять на что-то более надежное с возможностью RAID-1. Резервное копирование пока не настроено.
|
|
||||||
|
|
||||||
|
|
||||||
- [ ] **Security**:
|
|
||||||
- [ ] VLAN и сегментация сети
|
|
||||||
- [ ] Начал разбираться (создаются сегменты в )
|
|
||||||
- [ ]
|
|
||||||
- [ ] Fail2ban - установка?
|
|
||||||
- [ ] Разобраться с SSL сертификатом
|
|
||||||
- [ ] Обратный прокси Traefik в LXC контейнер как systemd unit
|
|
||||||
- [ ] LXC позволяет изолировать трафик от ОС
|
|
||||||
- [x] Nginx Proxy Manager
|
|
||||||
- [x] Установить LXC контейнер
|
|
||||||
- [ ] Настроить маршрутизацию
|
|
||||||
- [ ] **Software**:
|
|
||||||
- [ ] HomeLab - перевести на систему доменных имен от Netcrazy ???
|
|
||||||
- [ ] Медиа серверы:
|
|
||||||
- [x] Jellyfin - установить
|
|
||||||
- [x] Jellyfin - настроить SMB Share (NAS) + FSTAB (Youtube пример [настройки](https://www.youtube.com/watch?v=nmxj0A_1ZDo)))
|
|
||||||
- [x] Jellyfin - kinopoisk добавить ([ссылка на github]())
|
|
||||||
- [ ] Jellyfin - добавить онлайн радио ([m3u плейлисты на github](https://github.com/junguler/m3u-radio-music-playlists))
|
|
||||||
- [ ] Jellyfin - добавить в HomePage
|
|
||||||
- [ ]
|
|
||||||
- [ ] Jellyfin - настроить ssh подключение (по ключу) + добавить в конфиг
|
|
||||||
- [ ] jellyseerr - подумать об использовании
|
|
||||||
- [ ] Kavita - управление и чтение книгами
|
|
||||||
- [ ] qBittorrent
|
|
||||||
- [x] Установить. Настроить
|
|
||||||
- [ ] Вопрос с отдачей ??
|
|
||||||
- [x] Прокинуть SMB папку для закачек
|
|
||||||
- [ ] Разобраться с репликацией и бэкапами Proxmox
|
|
||||||
- [ ] Разобраться с маршрутизацией VPN на роутере - <font color="#ff0000">не получается </font>
|
|
||||||
- [ ] Директории Linux - изучить
|
|
||||||
|
|
||||||
- [ ] **Hardware**:
|
|
||||||
- [ ] Rack - спроектировать кронштейн для NAS
|
|
||||||
- [ ] Rack - определиться с местом
|
|
||||||
- [ ] NAS - подумать о использовании SSD
|
|
||||||
- [ ] Подобрать что-то готовое?
|
|
||||||
## Development
|
|
||||||
- [ ] Buildroot:
|
|
||||||
- [ ]
|
|
||||||
|
|
||||||
## Music
|
|
||||||
- The Eagles - Hotel California
|
|
||||||
-
|
|
||||||
#### Services
|
|
||||||
- [ ] `vaultwarden` - сервис хранения паролей (установить) или выбрать другой
|
|
||||||
- [ ] `traefik` - обратный прокси
|
|
||||||
- [ ] [Введение в Traefic](https://habr.com/ru/articles/508636/)
|
|
||||||
- [ ] `homepage` - настроить (https://gethomepage.dev/)
|
|
||||||
- [ ] https://gethomepage.dev/widgets/services/booklore/
|
|
||||||
- [ ] https://www.youtube.com/watch?v=X6Aw666tA0s
|
|
||||||
- [ ] `Homelable` - визуализация сетевой инфраструктуры (Zabbix)
|
|
||||||
- [x] Установить в Docker
|
|
||||||
- [x] Разобраться с сетью
|
|
||||||
- [ ] Нормально оформить
|
|
||||||
- [ ] `AdGuard` донастроить
|
|
||||||
- [ ] `Immich` - сервис для управления фото и видео (наподобие Google Photo) - если будет NAS
|
|
||||||
- [ ] `Alpine Nextcloude` - облачное хранилище.
|
|
||||||
- [ ] `WordPress` - установить, посмотреть
|
|
||||||
|
|
||||||
---
|
|
||||||
### Closed
|
|
||||||
- [x] Установить Kompas 3D
|
|
||||||
- [x] DrawIO - установить в docker
|
|
||||||
- [x] Установить в Docker - Homelable - визуализация сетевой инфраструктуры
|
|
||||||
- [x] XRAY/VLESS - каскадный VPN - работает, но при доступе через мобильный интернет - нет
|
|
||||||
- [x] 3X-UI на HomeLab в Debian LXC
|
|
||||||
- [ ] Настроить VPN доступ к Debian LXC
|
|
||||||
- [x] Правила маршрутизации
|
|
||||||
- [x] Настроить WireGuard - <font color="#00b050">выполнено - настроен на роутере</font>
|
|
||||||
- [x] Описать необходимые настройки
|
|
||||||
- [x] Поменять порт? - смена порта не помогло.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"theme": "moonstone",
|
"theme": "system",
|
||||||
"cssTheme": "Blue Topaz"
|
"cssTheme": "Blue Topaz"
|
||||||
}
|
}
|
||||||
Vendored
+7
-7
@@ -8,15 +8,15 @@
|
|||||||
"collapse-color-groups": false,
|
"collapse-color-groups": false,
|
||||||
"colorGroups": [],
|
"colorGroups": [],
|
||||||
"collapse-display": false,
|
"collapse-display": false,
|
||||||
"showArrow": false,
|
"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.5854447980613413,
|
"scale": 1.2273915140938336,
|
||||||
"close": false
|
"close": false
|
||||||
}
|
}
|
||||||
+1
-3
@@ -32,7 +32,5 @@
|
|||||||
"debugMode": false,
|
"debugMode": false,
|
||||||
"useInternalPlugins": false
|
"useInternalPlugins": false
|
||||||
},
|
},
|
||||||
"HomeLab/Proxmox/Gitea.md": "LiGitlab",
|
"HomeLab/! Tasks - planned action.md": "LiListTodo"
|
||||||
"HomeLab/Proxmox/HAOS.md": "LiHome",
|
|
||||||
"! Tasks - planned action.md": "LiListTodo"
|
|
||||||
}
|
}
|
||||||
Vendored
+84
-35
@@ -4,21 +4,63 @@
|
|||||||
"type": "split",
|
"type": "split",
|
||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"id": "33a2a97b96bd8220",
|
"id": "07a826a4e91de77c",
|
||||||
"type": "tabs",
|
"type": "tabs",
|
||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"id": "26f4162438aca424",
|
"id": "59e95575b246226f",
|
||||||
"type": "leaf",
|
"type": "leaf",
|
||||||
"state": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "! Tasks - planned action.md",
|
"file": "HomeLab/PVE - General - Description.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"source": false
|
"source": false
|
||||||
},
|
},
|
||||||
"icon": "lucide-file",
|
"icon": "lucide-file",
|
||||||
"title": "! Tasks - planned action"
|
"title": "PVE - General - Description"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "8b120fb1370cad0c",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "markdown",
|
||||||
|
"state": {
|
||||||
|
"file": "HomeLab/LXC - HomePage.md",
|
||||||
|
"mode": "source",
|
||||||
|
"source": false
|
||||||
|
},
|
||||||
|
"icon": "lucide-file",
|
||||||
|
"title": "LXC - HomePage"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "9e3de6fdbaf270bf",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "markdown",
|
||||||
|
"state": {
|
||||||
|
"file": "HomeLab/PVE - General - Description.md",
|
||||||
|
"mode": "source",
|
||||||
|
"source": false
|
||||||
|
},
|
||||||
|
"icon": "lucide-file",
|
||||||
|
"title": "PVE - General - Description"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "b0621f0563bd94d8",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "markdown",
|
||||||
|
"state": {
|
||||||
|
"file": "HomeLab/VE - HAOS - HomeAssistant.md",
|
||||||
|
"mode": "source",
|
||||||
|
"source": false
|
||||||
|
},
|
||||||
|
"icon": "lucide-file",
|
||||||
|
"title": "VE - HAOS - HomeAssistant"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -55,7 +97,7 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "search",
|
"type": "search",
|
||||||
"state": {
|
"state": {
|
||||||
"query": "[\"tags\"]",
|
"query": "tag:#omv_share_folders",
|
||||||
"matchingCase": false,
|
"matchingCase": false,
|
||||||
"explainSearch": false,
|
"explainSearch": false,
|
||||||
"collapseAll": false,
|
"collapseAll": false,
|
||||||
@@ -80,7 +122,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"direction": "horizontal",
|
"direction": "horizontal",
|
||||||
"width": 261.5
|
"width": 287.5
|
||||||
},
|
},
|
||||||
"right": {
|
"right": {
|
||||||
"id": "e15b551b89442450",
|
"id": "e15b551b89442450",
|
||||||
@@ -188,38 +230,45 @@
|
|||||||
"obsidian-excalidraw-plugin:New drawing": false
|
"obsidian-excalidraw-plugin:New drawing": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"active": "26f4162438aca424",
|
"active": "59e95575b246226f",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
"HomeLab/! Services.md",
|
"HomeLab/PVE - Description.md",
|
||||||
"! Tasks - planned action.md",
|
"HomeLab/Alice - root.md",
|
||||||
"HomeLab/Proxmox/Proxmox.md",
|
|
||||||
"().md",
|
|
||||||
"HomeLab/Docker - General.md",
|
|
||||||
"HomeLab/Proxmox/Proxmox - settings.md",
|
|
||||||
"Linux/CLI/СLI FileSystem.md",
|
|
||||||
"Linux/CLI/СLI Kernel and System.md",
|
|
||||||
"Linux/CLI/СLI Hardware (i2c,uart,gpio).md",
|
|
||||||
"HomeLab/Amnezia for Keenetic.md",
|
|
||||||
"HomeLab/ssh config.md",
|
|
||||||
"HomeLab/Radxa E25.md",
|
|
||||||
"HomeLab/Nginx Proxy Manager.md",
|
|
||||||
"HomeLab/HomePage.md",
|
|
||||||
"HomeLab/Docker - qBittorent.md",
|
|
||||||
"HomeLab/Proxmox/HAOS.md",
|
|
||||||
"HomeLab/Proxmox/Gitea.md",
|
|
||||||
"HomeLab/Proxmox/Proxmox HA manual install.md",
|
|
||||||
"README.md",
|
|
||||||
"Git/Git.md",
|
|
||||||
"Linux/CLI/СLI Boot & Device tree.md",
|
|
||||||
"HomeLab/Files/Pasted image 20260426160841.png",
|
|
||||||
"Pasted image 20260517222623.png",
|
|
||||||
"VPN/VPN (WireGuard & 3x-UI VLESS Reality).md",
|
|
||||||
"HomeLab/wireshark.md",
|
"HomeLab/wireshark.md",
|
||||||
"HomeLab/Valtwarden.md",
|
"HomeLab/Docker - General.md",
|
||||||
"Linux/CLI/СLI Network SSH other.md",
|
"HomeLab/Docker - qBittorent.md",
|
||||||
"Network/Settings.md",
|
"HomeLab/! Tasks - planned action.md",
|
||||||
"VPN/XRAY VLESS Guide.pdf",
|
"HomeLab/PVE - General - Description.md",
|
||||||
|
"HomeLab/LXC - HomePage.md",
|
||||||
|
"HomeLab/LXC - Jellyfin.md",
|
||||||
|
"HomeLab/LXC - Nginx Proxy Manager.md",
|
||||||
|
"HomeLab/LXC - npm_keenetic_setup.md",
|
||||||
|
"HomeLab/LXC - PBS Proxmox Backup Server.md",
|
||||||
|
"HomeLab/OMV - Open Media Vault.md",
|
||||||
|
"HomeLab/OMV - Guide-NFS-Share (PVE-PBS).md",
|
||||||
|
"HomeLab/LXC- Gitea.md",
|
||||||
|
"HomeLab/LXC - Valtwarden.md",
|
||||||
|
"HomeLab/HomeLab AI Analisys.md",
|
||||||
|
"Pasted image 20261029215430.png",
|
||||||
|
"README.md",
|
||||||
|
"Untitled.md",
|
||||||
|
"SBC - Hardware/Radxa E52C.md",
|
||||||
|
"SBC - Hardware/Radxa E25.md",
|
||||||
|
"SBC - Hardware/Pasted image 20260901214038.png",
|
||||||
|
"SBC - Hardware/Pasted image 20260517222623.png",
|
||||||
|
"HomeLab/VE - HAOS - HomeAssistant.md",
|
||||||
|
"HomeLab/LXC - Alpine-Nextcloud.md",
|
||||||
|
"HomeLab/OMV-qbittorrent-guide.md",
|
||||||
|
"jfn.embeddevio.netcraze.pro.md",
|
||||||
|
"HomeLab/OMV-Backups-Guide.md",
|
||||||
|
"Linux/Files/GPIO_diagram.jpg",
|
||||||
|
"OMV - Guides",
|
||||||
|
"SBC - Hardware",
|
||||||
|
"Hermes/oled_cpu_mon.py",
|
||||||
|
"Hermes",
|
||||||
"HomeLab/Files/Pasted image 20260427212721.png",
|
"HomeLab/Files/Pasted image 20260427212721.png",
|
||||||
|
"HomeLab/Files/Pasted image 20260426160841.png",
|
||||||
|
"VPN/XRAY VLESS Guide.pdf",
|
||||||
"VPN",
|
"VPN",
|
||||||
"Excalidraw",
|
"Excalidraw",
|
||||||
"HomeLab/Files/HomeLab Network.drawio",
|
"HomeLab/Files/HomeLab Network.drawio",
|
||||||
|
|||||||
@@ -0,0 +1,84 @@
|
|||||||
|
---
|
||||||
|
title: "Точечные маршруты Telegram API через AmneziaWG VPN"
|
||||||
|
date: 2026-10-19
|
||||||
|
tags: [telegram, vpn, amneziawg, routing, network, hermes]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Telegram API через AmneziaWG VPN: точечные маршруты
|
||||||
|
|
||||||
|
**Проблема:** ISP блокирует Telegram API (ConnectTimeout на `api.telegram.org`). AmneziaWG VPN на `192.168.1.147` обходит DPI, но направлять **весь** трафик Hermes LXC (`192.168.1.44`) через VPN нельзя — провайдер LLM (polza.ai) перестаёт работать при полном туннелировании.
|
||||||
|
|
||||||
|
**Решение:** точечные статические маршруты — только подсети Telegram API через VPN-шлюз, остальной трафик напрямую через Keenetic.
|
||||||
|
|
||||||
|
## Сеть
|
||||||
|
|
||||||
|
| Устройство | IP | Роль |
|
||||||
|
|---|---|---|
|
||||||
|
| Keenetic Giga | 192.168.1.1 | Основной шлюз (default gateway) |
|
||||||
|
| Hermes LXC | 192.168.1.44 | Hermes Agent (TUI, gateway) |
|
||||||
|
| VPN-шлюз LXC | 192.168.1.147 | Docker + AmneziaWG (awg0) |
|
||||||
|
|
||||||
|
## Подсети Telegram API
|
||||||
|
|
||||||
|
```
|
||||||
|
149.154.160.0/20
|
||||||
|
91.108.56.0/22
|
||||||
|
91.108.4.0/22
|
||||||
|
91.108.8.0/22
|
||||||
|
```
|
||||||
|
|
||||||
|
## Команды
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Добавить маршруты (вручную)
|
||||||
|
ip route add 149.154.160.0/20 via 192.168.1.147
|
||||||
|
ip route add 91.108.56.0/22 via 192.168.1.147
|
||||||
|
ip route add 91.108.4.0/22 via 192.168.1.147
|
||||||
|
ip route add 91.108.8.0/22 via 192.168.1.147
|
||||||
|
|
||||||
|
# Проверить
|
||||||
|
ip route get 149.154.166.110
|
||||||
|
# → 149.154.166.110 via 192.168.1.147 dev eth0 src 192.168.1.44
|
||||||
|
|
||||||
|
curl -v --connect-timeout 10 https://api.telegram.org
|
||||||
|
# → TLS handshake (успех)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Автоматическое восстановление после перезагрузки
|
||||||
|
|
||||||
|
Файл: `/etc/network/if-up.d/telegram-vpn-routes`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/sh
|
||||||
|
ip route add 149.154.160.0/20 via 192.168.1.147 2>/dev/null
|
||||||
|
ip route add 91.108.56.0/22 via 192.168.1.147 2>/dev/null
|
||||||
|
ip route add 91.108.4.0/22 via 192.168.1.147 2>/dev/null
|
||||||
|
ip route add 91.108.8.0/22 via 192.168.1.147 2>/dev/null
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
chmod +x /etc/network/if-up.d/telegram-vpn-routes
|
||||||
|
```
|
||||||
|
|
||||||
|
## Проверка работы Telegram backend в Hermes
|
||||||
|
|
||||||
|
```bash
|
||||||
|
journalctl -u hermes-gateway --no-pager -n 20 | grep telegram
|
||||||
|
```
|
||||||
|
|
||||||
|
Успешное подключение:
|
||||||
|
```
|
||||||
|
[Telegram] Connected to Telegram (polling mode)
|
||||||
|
```
|
||||||
|
|
||||||
|
Если контейнер `amneziawg-client` на 1.147 упал:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh 192.168.1.147 "docker start amneziawg-client"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Важно
|
||||||
|
|
||||||
|
- **Только Telegram** идёт через VPN. Polza.ai, web_search, и остальной трафик Hermes — напрямую через Keenetic.
|
||||||
|
- Если контейнер `amneziawg-client` на 1.147 не работает — Telegram backend не сможет подключиться (маршруты есть, но awg0 нет).
|
||||||
|
- При добавлении новых подсетей Telegram API обновить и скрипт `/etc/network/if-up.d/telegram-vpn-routes`.
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
#polza #api
|
||||||
|
Описание на Habr:
|
||||||
|
|
||||||
|
AI провайдер: polza.ai
|
||||||
|
API: `pza_emOW7E0WsoXli4c85T5t_j2q1_Nk2dIT`
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,453 @@
|
|||||||
|
|
||||||
|
# Гайд: Установка 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
|
||||||
|
```
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
#hermes #guide
|
||||||
|
# Подключение Hermes Desktop (Windows) к серверу
|
||||||
|
|
||||||
|
Общая схема:
|
||||||
|
|
||||||
|
[Windows] --LAN--> [Сервер 192.168.1.44:9119]
|
||||||
|
Hermes Desktop Hermes Dashboard
|
||||||
|
(тот же агент, что в этом сеансе)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Что уже сделано на сервере
|
||||||
|
|
||||||
|
- Dashboard запущен на `0.0.0.0:9119` (слушает все интерфейсы)
|
||||||
|
- Basic auth включена: логин `admin`, пароль `agent`
|
||||||
|
- Dashboard **автоматически стартует при загрузке сервера** (systemd-сервис `hermes-dashboard.service`)
|
||||||
|
- При падении перезапускается автоматически через 10 секунд
|
||||||
|
|
||||||
|
Проверить статус можно с сервера:
|
||||||
|
|
||||||
|
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:9119/api/health
|
||||||
|
# → 200
|
||||||
|
|
||||||
|
systemctl status hermes-dashboard.service
|
||||||
|
# → active (running)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Подключение из Hermes Desktop (Windows)
|
||||||
|
|
||||||
|
1. Открой Hermes Desktop на Windows
|
||||||
|
2. Нажми `Ctrl+K` (Cmd+K на Mac) — откроется палитра команд
|
||||||
|
3. Набери **Remote Gateway** и выбери `Connect to Remote Gateway...` (или найди в Settings → Gateway → Remote)
|
||||||
|
4. Введи данные:
|
||||||
|
- **URL сервера:** `http://192.168.1.44:9119`
|
||||||
|
- **Логин:** `admin`
|
||||||
|
- **Пароль:** `agent`
|
||||||
|
5. После подключения в левой панели появится серверный профиль — можно выбирать его и общаться как обычно.
|
||||||
|
|
||||||
|
> Если Windows подключён через VPN или из другой подсети — IP может отличаться.
|
||||||
|
> Узнать текущий IP сервера: `hostname -I`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Управление сервисом (на сервере)
|
||||||
|
|
||||||
|
Сервис уже установлен и активен. Команды управления:
|
||||||
|
|
||||||
|
| Действие | Команда |
|
||||||
|
|----------|---------|
|
||||||
|
| Статус | `systemctl status hermes-dashboard.service` |
|
||||||
|
| Стоп | `systemctl stop hermes-dashboard.service` |
|
||||||
|
| Старт | `systemctl start hermes-dashboard.service` |
|
||||||
|
| Рестарт | `systemctl restart hermes-dashboard.service` |
|
||||||
|
| Отключить автозапуск | `systemctl disable hermes-dashboard.service` |
|
||||||
|
| Логи (свежие) | `journalctl -u hermes-dashboard.service -n 50` |
|
||||||
|
| Логи (хвост) | `journalctl -u hermes-dashboard.service -f` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Безопасность
|
||||||
|
|
||||||
|
- Доступ к dashboard возможен из **любого устройства в той же LAN** (подсеть 192.168.1.0/24), кто знает логин/пароль
|
||||||
|
- За пределами LAN dashboard **недоступен** — сервер не торчит в интернет
|
||||||
|
- Пароль хранится в `/root/.hermes/config.yaml` — не свети этот файл
|
||||||
|
- Для доступа из интернета — облачный relay (Nous Portal) или VPN/SSH-туннель
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Что если не работает
|
||||||
|
|
||||||
|
| Симптом | Решение |
|
||||||
|
|---------|---------|
|
||||||
|
| Desktop пишет "Connection refused" | Сервис не запущен → `systemctl start hermes-dashboard.service` |
|
||||||
|
| 401 Unauthorized | Неправильный логин или пароль — проверь в `config.yaml` секцию `basic_auth` |
|
||||||
|
| Desktop видит сервер, но не отвечает | `hermes doctor` на сервере — проверить модель и соединение |
|
||||||
|
| Нет соединения после ребута сервера | Сервис включён в автозапуск, проверь статус `systemctl status hermes-dashboard.service` |
|
||||||
@@ -0,0 +1,140 @@
|
|||||||
|
#hermes #hermes_hindsight_lxc_guide #guide
|
||||||
|
# Настройка памяти 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`
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
import time, os
|
||||||
|
from luma.core.interface.serial import i2c
|
||||||
|
from luma.oled.device import ssd1306
|
||||||
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
|
||||||
|
serial = i2c(port=1, address=0x3C)
|
||||||
|
device = ssd1306(serial)
|
||||||
|
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 10)
|
||||||
|
font_big = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 16)
|
||||||
|
device.cleanup = lambda: None
|
||||||
|
|
||||||
|
|
||||||
|
def get_cpu():
|
||||||
|
with open('/proc/loadavg') as f:
|
||||||
|
parts = f.read().split()
|
||||||
|
load = float(parts[0])
|
||||||
|
cores = os.cpu_count() or 4
|
||||||
|
percent = (load / cores) * 100
|
||||||
|
return min(percent, 100), load
|
||||||
|
|
||||||
|
|
||||||
|
def get_ram():
|
||||||
|
with open('/proc/meminfo') as f:
|
||||||
|
lines = f.readlines()
|
||||||
|
mem_total = int([l for l in lines if 'MemTotal' in l][0].split()[1])
|
||||||
|
mem_avail = int([l for l in lines if 'MemAvailable' in l][0].split()[1])
|
||||||
|
used = mem_total - mem_avail
|
||||||
|
return used / mem_total * 100, used // 1024, mem_total // 1024
|
||||||
|
|
||||||
|
|
||||||
|
def get_temp():
|
||||||
|
try:
|
||||||
|
with open('/sys/class/thermal/thermal_zone0/temp') as f:
|
||||||
|
return int(f.read()) / 1000
|
||||||
|
except:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
while True:
|
||||||
|
cpu_pct, load = get_cpu()
|
||||||
|
ram_pct, used_mb, total_mb = get_ram()
|
||||||
|
temp = get_temp()
|
||||||
|
|
||||||
|
img = Image.new('1', device.size, 'black')
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
|
||||||
|
draw.rectangle((0, 0, 127, 63), outline='white', fill='black')
|
||||||
|
|
||||||
|
bar_w = 90
|
||||||
|
bar_h = 12
|
||||||
|
|
||||||
|
# CPU bar
|
||||||
|
draw.rectangle((32, 4, 32 + bar_w, 4 + bar_h), outline='white', fill='black')
|
||||||
|
fill_w = int(bar_w * cpu_pct / 100)
|
||||||
|
if fill_w > 0:
|
||||||
|
draw.rectangle((32 + 1, 4 + 1, 32 + fill_w, 4 + bar_h - 1), fill='white')
|
||||||
|
draw.text((2, 5), 'CPU', font=font, fill='white')
|
||||||
|
draw.text((32 + bar_w + 4, 3), f'{cpu_pct:.0f}%', font=font_big, fill='white')
|
||||||
|
draw.text((2, 20), f'Load: {load:.2f}', font=font, fill='white')
|
||||||
|
|
||||||
|
# RAM bar
|
||||||
|
draw.rectangle((32, 36, 32 + bar_w, 36 + bar_h), outline='white', fill='black')
|
||||||
|
fill_w2 = int(bar_w * ram_pct / 100)
|
||||||
|
if fill_w2 > 0:
|
||||||
|
draw.rectangle((32 + 1, 36 + 1, 32 + fill_w2, 36 + bar_h - 1), fill='white')
|
||||||
|
draw.text((2, 38), 'RAM', font=font, fill='white')
|
||||||
|
draw.text((32 + bar_w + 4, 36), f'{ram_pct:.0f}%', font=font_big, fill='white')
|
||||||
|
|
||||||
|
# Temp and PID at bottom
|
||||||
|
draw.text((2, 52), f'Temp: {temp:.1f}C', font=font, fill='white')
|
||||||
|
draw.text((72, 52), f'PID: {os.getpid()}', font=font, fill='white')
|
||||||
|
|
||||||
|
device.display(img)
|
||||||
|
time.sleep(1)
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
#homelab #proxmox #Gitea #homeassistant #haos #adguard #wireguard
|
|
||||||
|
|
||||||
### Useful resources
|
|
||||||
Про домашнюю лабораторию: [Prohomelab](https://prohomelab.com/)
|
|
||||||
Proxmox Community Scripts [Proxmox Community-scripts](https://community-scripts.org/)
|
|
||||||
|
|
||||||
![[Pasted image 20260426160841.png]]
|
|
||||||
|
|
||||||
## HomeLab Guide
|
|
||||||
|
|
||||||
|
|
||||||
## Network route table
|
|
||||||
**Home Network IP:** 192.168.1.XXX
|
|
||||||
**External IP:** <font color="#ff0000">89.109.8.114</font>
|
|
||||||
|
|
||||||
**NAS:** 192.168.1.141
|
|
||||||
Каталог `/mnt/share` подключен к Jellyfin и Docker (//Public/)
|
|
||||||
|
|
||||||
|
|
||||||
Тест работы AdGuard: https://adblock-tester.com/
|
|
||||||
Keeneetic: `emb` `3haMJf9ZdNpCktq`
|
|
||||||
|
|
||||||
|
|
||||||
| Home Service | State | SSH | Port Internal | Port External | <center>IP or DNS</center> | <center>user</center> | <center>psw</center> | Include <br>Services | <center>Proxmox <br>VE Script</center><br> |
|
|
||||||
| ----------------------- | ------------------------------------------ | ------------ | ------------- | ------------- | ------------------------------------------------ | --------------------- | -------------------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| **Keenetic** | <center>✔️</center> | | | | http://mrtrand.keenetic.pro | admin | 1eU$_RhMp8 | | |
|
|
||||||
| **Proxmox UI** | <center>✔️</center> | | 8006 | 8002 | 192.168.1.116 | root | Px@R4_hOm3 | | |
|
|
||||||
| **Proxmox SSH** | <center>✔️</center> | key <br>only | 58220 | 2202 | 192.168.1.116 | | | | |
|
|
||||||
| **Home Assistant** | <center>✔️</center> | | 8123 | 8003 | 192.168.1.43<br>http://ha.mrtrand.keenetic.pro | embeddevio | Sm@R4_hOm3<br> | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/vm/haos-vm.sh)"` |
|
|
||||||
| **Debian** | <center>✔️</center> | key <br>only | | | 192.168.1.44 | | | 3x-UI | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/debian.sh)"` |
|
|
||||||
| **Gitea** | <center>✔️</center> | | 3000 | 8004 | 192.168.1.111<br>http://git.mrtrand.keenetic.pro | | | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/gitea.sh)"` |
|
|
||||||
| **AdGuard Home** | <center>✔️ требуется донастройка?</center> | | 3000 | | 192.168.1.148 | embeddevio | Ad@R4_hOm3 | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/adguard.sh)"` |
|
|
||||||
| **Docker<br>Portainer** | <center>✔️</center> | | 9443 | | 192.168.1.147 | admin | Dokr@R4_hOm3 | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/docker.sh)"` |
|
|
||||||
| **Homepage** | | | 3000 | | 192.168.1.92:3000 | | | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/homepage.sh)"` |
|
|
||||||
| **Jellyfin** | <center>✔️</center> | | 8096 | 55240 | [192.168.1.76:8096](http://192.168.1.76:8096) | embeddevio | JiF@R4_hOm3 | | `var_os='ubuntu' bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/jellyfin.sh)"` |
|
|
||||||
| Alpine Nextcloude | <center>❌</center> | | | | | | | | |
|
|
||||||
| Nginx Proxy Manager | <center>+-</center> | | | | 192.168.1.101:81 | embeddevio | NgX@R4_hOm3 | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/nginxproxymanager.sh)"` |
|
|
||||||
|
|
||||||
**Планы:**
|
|
||||||
- [ ] SSL сертификат для Proxmox
|
|
||||||
- [ ] Нужна регистрация на хостинге (каком)
|
|
||||||
- [ ] Нужен Nginx ?
|
|
||||||
[192.168.1.76:8096](http://192.168.1.76:8096)
|
|
||||||
### Proxmox Application & Services
|
|
||||||
|
|
||||||
| Service | Location | Connect | Description | usr/psw | Repositories |
|
|
||||||
| ------------- | ---------- | --------------------------- | ----------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------ |
|
|
||||||
| Homelable | Docker | https://192.168.1.147:9443/ | Визуализация сетевой инфраструктуры | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/homelable.sh)"` |
|
|
||||||
| Drawio | Docker | http://192.168.1.147:8080/ | | | |
|
|
||||||
| Poratiner | Docker | http://192.168.1.147:3000/ | | | |
|
|
||||||
| qBittorrent | Docker | http://192.168.1.147:8081/ | | admin qBt@R4_hOm3 | |
|
|
||||||
| 3x-UI + VLESS | Debian LXC | | | | |
|
|
||||||
|
|
||||||
### 3x-UI Panel
|
|
||||||
Username: `1lK1HHY131`
|
|
||||||
Password: `yguXrSEJxk`
|
|
||||||
Port: `5324`
|
|
||||||
WebBasePath: `SY9zL3JA9b8qPhnE7r`
|
|
||||||
Access URL: https://89.109.8.114:8007/SY9zL3JA9b8qPhnE7r
|
|
||||||
IP homenet: `192.168.1.44:5324`
|
|
||||||
|
|
||||||
### RT Internet configuration
|
|
||||||
Username: `KPMAa7Lz`
|
|
||||||
Password: `PF2Rgt`
|
|
||||||
Protocol (type): `PPPoE`
|
|
||||||
IPv4 Settings:
|
|
||||||
1. Configuration: Auto DHCP
|
|
||||||
2. Ignnore DNSv4 from ISP
|
|
||||||
IPv6 Settings:
|
|
||||||
3. Configuration: disable
|
|
||||||
ISP Requirements:
|
|
||||||
4. MAC - by default
|
|
||||||
5. MTU size: 1500
|
|
||||||
|
|
||||||
JiF@Tati@n9
|
|
||||||
@@ -0,0 +1,171 @@
|
|||||||
|
|
||||||
|
AI анализ:
|
||||||
|
> [!note]- ai prompt
|
||||||
|
> Роль: девопс инженер, эксперт в области linux и сетевой инфраструктуры HomeLab.
|
||||||
|
> Задача: проанализировать общую идею, текущую аппаратную и программную конфигурацию, сервисы и основные аспекты. В случае необходимости подели на подзадачи. Задавай уточняющие вопросы и найди узкие места в архитектуре. В случае спорных вариантов предложи альтернативное решение, для построения надежного HomeLab сервера.
|
||||||
|
>
|
||||||
|
> Общая идея: построение надежного HomeLab сервера для домашнего использования, с целью совершенствования навыков сетевого инженера. Изучение linux и клиент-серверной архитектуры, внутренних сервисов, архитектуры сетей, работа с LXC и docker контейнерами. Косвенно, при построении я получаю полезные сервисы, которые можно использовать дома и при отладки своих своих внутренних Pet проектов. Возможность подключения к своему серверу из любой точки мира, где есть интернет
|
||||||
|
>
|
||||||
|
> Аппаратная конфигурация:
|
||||||
|
> 1. Роутер keenetic giga kn1011.
|
||||||
|
> 2. Server PC - NUC на i3-8109U CPU с 16GB DDR.
|
||||||
|
> 3. NAS - OpenmediaVault с RAID1 8TB на Intel(R) Celeron(R) CPU 1037U @ 1.80GHz с 4GB DDR.
|
||||||
|
> 4. NAS - WD MyBook (его будем исключать из системы после полного перехода на NAS OMV)
|
||||||
|
>
|
||||||
|
> Соединение PC-роутер LAN1. NAS - роутер LAN2. Роутер имеет статический, "белый" IP.
|
||||||
|
> Программная конфигурация Server и используемые сервисы:
|
||||||
|
> 1. Poroxmox Virtual Environment 9.1.9 который имеет следующую конфигурацию:
|
||||||
|
> 1. HomeAssistant OS в VM
|
||||||
|
> 1. Управляет сценариями умного дома (скрипты автоматизации, zigbee устройства и тд)
|
||||||
|
> 2. LXC - Gitea
|
||||||
|
> 1. Основной домашний репозиторий для pet проектов и wiki obsidian
|
||||||
|
> 3. LXC - adguard
|
||||||
|
> 1. Использовался долгое время, как основной DNS сервер, фильтруя трафик, пока я не задумал устанвить NginxProxyserver, на время экспериментов adguard остановлен.
|
||||||
|
> 4. LXC - debian
|
||||||
|
> 1. предусмотрен как контейнер с ОС debian для отработки различных сценариев внутри ОС, там установлен VPN Xray vless, с панелью 3x-ui. ВПН пока не используется
|
||||||
|
> 5. LXC - homepage
|
||||||
|
> 1. Основная web страница HomeLab, для удобства доступа к ресурсам
|
||||||
|
> 6. LXC - docker включающие следующие образы:
|
||||||
|
> 1. задумывался как отдельный LXC контейнер для отработки навыков взаимодействия с docker (установка,запуск,настройка образов). Сейчас там установлены следующие images: homelable - визуализация сетевой инфраструктуры (пощупал, но пока не настроил. планирую вернуться к этому) drawio - как собственный ресурс. Практически не используется,нужен ли? и qbittorren - используется для закачки torrent образов
|
||||||
|
>
|
||||||
|
> 7. LXC - nginxproxymanager
|
||||||
|
> 1. Пока не используется
|
||||||
|
> 8. LXC - jellyfin.
|
||||||
|
> 1. Стриминговый медиасервер для музыки, фильмов и сериалов используется в связке с qbittorrent докер образом, который развернут в LXC docker
|
||||||
|
> 2. Все LXС контейнеры имеют тип Unprivileged.
|
||||||
|
> 3.
|
||||||
|
> 4. В Proxmox VE прокинута SMB Public папка c NAS WD, с автомонтированием папки mnt/share в fstab. Каталог mnt/share подключен к следующим LXC (docker и jellyfin) В docker контейнере она используется как рабочий каталог для qBittorrent. Jellyfin использует ее как медиатеку с фильмами и музыкой. Так же к NUC подключен Sonoff USB - ZigBee dongle который проброшен в VM HomeAssistan. SSH доступ к Proxmox: вход по паролю - запрещен, прописаны rsa25595 ключи, стандартный порт изменен.
|
||||||
|
>
|
||||||
|
|
||||||
|
>Основные аспекты: 1. Для доступа из внешнего мира в роутере переадресация портов: Проброшены TCP/UDP порты к UI Proxmox VE, HomeAssistant VM, Gitea и Jellyfin LXC. 2 В роутере разделение на VLAN и подсети не настроено. Роутер имеет возможность настройки системы доменных для использования сервисов. 3 NAS планирую менять на что-то более надежное с возможностью RAID-1. Резервное копирование пока не настроено.
|
||||||
|
|
||||||
|
OpenMediaVault - настройка сервиса HomeLab. Я только собрал NAS на с RAID1 8TB на Intel(R) Celeron(R) CPU 1037U @ 1.80GHz с 4GB DDR. Создал Multiple Device подготовил File Systems включил SMB CIFTS сервис и подключил папку как сетевой диск. Давай подробно разберем что нужно сделать при первоначальной настройке OMV пройдемся по шагам. Определим необходимые для меня сервисы, которые я пл
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
1.
|
||||||
|
2. Matrix - мессенджер
|
||||||
|
3. **Telegraph**
|
||||||
|
1. Статья про мою HomeLab:
|
||||||
|
2. Статья про Harness memory
|
||||||
|
3. Статья по настройке MCP для GItea
|
||||||
|
4.
|
||||||
|
4. **Security**. Безопасность
|
||||||
|
1. [ ] Alice - получить root
|
||||||
|
2. [ ] Drawio - удалить из контейнера
|
||||||
|
3. [ ] Gitea
|
||||||
|
1. [ ] Перенести Gitea на OMV - share подготовлена
|
||||||
|
2. [x] внести в домен
|
||||||
|
2. [ ] Vaultwarden - отдельный сегмент сети???
|
||||||
|
3. [x] Удалить лишние заметки с доменными именами от KeeDNS
|
||||||
|
4. [ ] Проработка шаблонов заметок по HomeLab
|
||||||
|
5. [ ] Подумать о связке NPM + домен `embeddevio.space` на Reg.ru
|
||||||
|
6. [ ] LXC NginxProxyManager как реверс-прокси с SSL и ограничением доступа по IP через авторизацию
|
||||||
|
1. [x] Разобраться с SSL сертификатом - использую KeeDNS
|
||||||
|
2. [x] Описать как настроить NPM
|
||||||
|
3. [ ] step-ca (Smallstep CA) - свой центр сертификации ???
|
||||||
|
7. [ ] SSL сертификат для Proxmox
|
||||||
|
8. [ ] Обратный прокси Traefik в LXC контейнер как systemd unit (LXC позволяет изолировать трафик от ОС)
|
||||||
|
9. [ ] Сегментация сети VLAN
|
||||||
|
1. [ ] VLAN10 - сервера, NUC, NAS
|
||||||
|
2. [ ] VLAN20 - IoT устройства
|
||||||
|
3. [ ] VLAN30 - Гостевая (обычная сеть)
|
||||||
|
4. [ ] firewall - настройка межсетевого экрана
|
||||||
|
10. [ ] Fail2ban - установка (нужна ли)
|
||||||
|
5. **Services**
|
||||||
|
1. [ ] HomePage
|
||||||
|
1. [ ] настройка доступа из вне - ок.
|
||||||
|
2. [ ] добавить Vaultvarden
|
||||||
|
3. [ ] добавление новых сервисов
|
||||||
|
4. [ ] Проработка панели ()
|
||||||
|
2. [ ] Внедрение мониторинга
|
||||||
|
1. [ ] Netdata - метрики в реальном времени и оповещения в Telegram. Или разверните **Prometheus + Grafana** (но это ресурсоемко).
|
||||||
|
2. [ ] Zabbix - cсистема мониторинга?
|
||||||
|
- [ ] **Software**:
|
||||||
|
|
||||||
|
- [ ] Медиа серверы:
|
||||||
|
- [x] Jellyfin - установить
|
||||||
|
- [x] Jellyfin - настроить SMB Share (NAS) + FSTAB (Youtube пример [настройки](https://www.youtube.com/watch?v=nmxj0A_1ZDo)))
|
||||||
|
- [x] Jellyfin - kinopoisk добавить ([ссылка на github]())
|
||||||
|
- [x] Jellyfin - добавить онлайн радио ([m3u плейлисты на github](https://github.com/junguler/m3u-radio-music-playlists))
|
||||||
|
- [x] Jellyfin - добавить в HomePage
|
||||||
|
- [ ] Jellyfin - настроить ssh подключение (по ключу) + добавить в конфиг
|
||||||
|
- [ ] jellyseerr - подумать об использовании
|
||||||
|
- [ ] Kavita - управление и чтение книгами
|
||||||
|
- [ ] Разобраться с маршрутизацией VPN на роутере - <font color="#ff0000">не получается </font>
|
||||||
|
- [ ] Директории Linux - изучить
|
||||||
|
|
||||||
|
|
||||||
|
## Development
|
||||||
|
- [ ] Buildroot:
|
||||||
|
- [ ] Разработка CPU-Monitor
|
||||||
|
- [ ] PCB на ESP32 + 2 OLED SSD1306
|
||||||
|
|
||||||
|
## Music
|
||||||
|
- The Eagles - Hotel California
|
||||||
|
-
|
||||||
|
#### Service
|
||||||
|
- [ ] `traefik` - обратный прокси
|
||||||
|
- [ ] [Введение в Traefic](https://habr.com/ru/articles/508636/)
|
||||||
|
- [ ] `homepage` - настроить (https://gethomepage.dev/)
|
||||||
|
- [ ] https://gethomepage.dev/widgets/services/booklore/
|
||||||
|
- [ ] https://www.youtube.com/watch?v=X6Aw666tA0s
|
||||||
|
- [ ] `Homelable` - визуализация сетевой инфраструктуры (Zabbix)
|
||||||
|
- [x] Установить в Docker
|
||||||
|
- [x] Разобраться с сетью
|
||||||
|
- [ ] Нормально оформить
|
||||||
|
- [ ] `AdGuard` донастроить
|
||||||
|
- [ ] `Immich` - сервис для управления фото и видео (наподобие Google Photo) - если будет NAS
|
||||||
|
- [ ] `WordPress` - установить, посмотреть
|
||||||
|
|
||||||
|
---
|
||||||
|
### Closed
|
||||||
|
- [x] Память и навыки для ботов (Агентов) - сделано
|
||||||
|
- [x] Vaultvarden - установить.
|
||||||
|
1. [x] Настроить https - выполнено
|
||||||
|
2. [x] Расширение для браузера - выполнено
|
||||||
|
3. [x] Приложение на телефон - выполнено
|
||||||
|
- [x] `Alpine Nextcloude` - облачное хранилище LXC в PVE а OMV использование как хранилку
|
||||||
|
- [x] Настроить доступ к VPN (пока через шлюз 192.168.1.147)
|
||||||
|
1. Свой Amnezia WG в отдельном docker контейнере 192.168.1.144
|
||||||
|
- [x] Hingsight - подключить к ИИ + гайд подключения #hermes_hindsight_lxc_guide
|
||||||
|
- [x] Описать как настроить Nextcloude c NPM
|
||||||
|
- [x] HomeLab - для основных сервисов назначены домены 4 го порядка Netcrazy
|
||||||
|
- [x] Заменить прямой проброс портов на WireGuard
|
||||||
|
- [x] qBittorrent
|
||||||
|
- [x] переезд на NAS в OpenMediaVault
|
||||||
|
- [x] Установить. Настроить
|
||||||
|
- [x] Вопрос с отдачей ??
|
||||||
|
- [x] Прокинуть SMB папку для закачек
|
||||||
|
- [x] **Backup**. Настроить резервное копирование через PBS (на внешний диск или NAS?)
|
||||||
|
- [x] Разобраться с репликацией и бэкапами Proxmox
|
||||||
|
1. [x] OMV - Backup на внешний диск
|
||||||
|
2. [x] NAS - отключить бэкапы с внешнего HDD
|
||||||
|
1. [x] Backup - настроить расписание снятие Snapshot (раз в неделю) на NAS
|
||||||
|
2. [x] Backup - синхронизация важных папок (Gitea, HomeAssistant)
|
||||||
|
3. [x] Backup - Garbage Collection. Настроить автоматическую очистку диска
|
||||||
|
4. [x] Backup - Prune. Настроить автоматическое удаление старых копий
|
||||||
|
- [x] Установить Proxmox Backup Server.
|
||||||
|
1. [x] Подключить HDD для бэкапов
|
||||||
|
2. [x] Связать PBS и PVE
|
||||||
|
3. [x] Backup - настроить расписание снятие Snapshot (раз в неделю) на внешний HDD
|
||||||
|
4. [x] Backup - Garbage Collection. Настроить автоматическую очистку диска
|
||||||
|
5. [x] Backup - Prune. Настроить автоматическое удаление старых копий
|
||||||
|
- [x] Установить Kompas 3D
|
||||||
|
- [x] DrawIO - установить в docker
|
||||||
|
- [x] Установить в Docker - Homelable - визуализация сетевой инфраструктуры
|
||||||
|
- [x] XRAY/VLESS - каскадный VPN - работает, но при доступе через мобильный интернет - нет
|
||||||
|
- [x] 3X-UI на HomeLab в Debian LXC
|
||||||
|
- [ ] Настроить VPN доступ к Debian LXC
|
||||||
|
- [x] Правила маршрутизации
|
||||||
|
- [x] Настроить WireGuard - <font color="#00b050">выполнено - настроен на роутере</font>
|
||||||
|
- [x] Описать необходимые настройки
|
||||||
|
- [x] Поменять порт? - смена порта не помогло.
|
||||||
|
- [ ] **Hardware**:
|
||||||
|
- [x] Rack - спроектировать кронштейн для NAS
|
||||||
|
- [x] Rack - определиться с местом
|
||||||
|
- [x] NAS - подумать о использовании SSD
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
Описание: [Community](https://hackalice.me/)
|
||||||
|
|
||||||
|
Колонка: YNDX- 00025 - Яндекс Станция Лайт 2
|
||||||
|
|
||||||
|
|
||||||
|
1. Установка git
|
||||||
|
```bash
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install git
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Установка eQuasar - конфигурация nginx для перехвата запросов Quasar. Она отвечает за `get_sync_info` с включённым network ADB и возвращает `{"hasUpdate":false}` на `check_updates`, а остальные запросы проксирует дальше.
|
||||||
|
```bash
|
||||||
|
git clone https://git.gay/iwakura/eQuasar.git
|
||||||
|
cd eQuasar
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Установка nginx ещё не установлен на Ubuntu/Debian:
|
||||||
|
```bash
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Копирование файлов из репозитория в пути, которые использует eQuasar
|
||||||
|
```bash
|
||||||
|
sudo install -d /opt/fakequasar
|
||||||
|
sudo cp -r copymetoroot/opt/fakequasar/certs /opt/fakequasar/
|
||||||
|
sudo install -d /etc/nginx/sites-enabled
|
||||||
|
sudo cp copymetoroot/etc/nginx/sites-enabled/quasar \
|
||||||
|
/etc/nginx/sites-enabled/quasar
|
||||||
|
sudo nginx -t
|
||||||
|
sudo systemctl reload nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Установка dnsmasq - легковесного DNS / DHCP TFTP сервера ([wiki](https://ru.wikipedia.org/wiki/Dnsmasq) )
|
||||||
|
```bash
|
||||||
|
sudo apt install dnsmasq
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Создать файл конфигурации `nano /etc/dnsmasq.d/quasar.conf`
|
||||||
|
```bash
|
||||||
|
# вписать этот конфиг в файл
|
||||||
|
port=53
|
||||||
|
no-resolv
|
||||||
|
server=8.8.8.8
|
||||||
|
server=1.1.1.1
|
||||||
|
|
||||||
|
# не слушать на IPv6-интерфейсах
|
||||||
|
listen-address=192.168.1.125
|
||||||
|
bind-interfaces
|
||||||
|
|
||||||
|
# quasar.yandex.net — на eQuasar (v4), AAAA пустой
|
||||||
|
address=/quasar.yandex.net/192.168.1.125
|
||||||
|
address=/quasar.yandex.net/::
|
||||||
|
|
||||||
|
# quasar.yandex.ru — то же самое
|
||||||
|
address=/quasar.yandex.ru/192.168.1.125
|
||||||
|
address=/quasar.yandex.ru/::
|
||||||
|
|
||||||
|
# scbh.yandex.net — то же самое
|
||||||
|
address=/scbh.yandex.net/192.168.1.125
|
||||||
|
address=/scbh.yandex.net/::
|
||||||
|
|
||||||
|
# блокируемые домены (пустой ответ = недоступны)
|
||||||
|
address=/strm.yandex.ru/
|
||||||
|
address=/strm.yandex.ru/::
|
||||||
|
address=/rpc.alice.yandex.net/
|
||||||
|
address=/rpc.alice.yandex.net/::
|
||||||
|
address=/uniproxy.alice.yandex.net/
|
||||||
|
address=/uniproxy.alice.yandex.net/::
|
||||||
|
address=/alice.yandex.net/
|
||||||
|
address=/alice.yandex.net/::
|
||||||
|
address=/alice-ats.yandex.net/
|
||||||
|
address=/alice-ats.yandex.net/::
|
||||||
|
address=/alice-ats-test.yandex.net/
|
||||||
|
address=/alice-ats-test.yandex.net/::
|
||||||
|
```
|
||||||
|
|
||||||
|
Перезагрузить dnsmasq
|
||||||
|
`systemctl restart dnsmasq`
|
||||||
|
|
||||||
|
7. В настройках роутера, для сети, в DNS указать IP: контейнера
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
|
||||||
|
Задача: проанализировать общую идею, текущую аппаратную и программную конфигурацию, сервисы и основные аспекты. В случае необходимости подели на подзадачи. Задавай уточняющие вопросы и найди узкие места в архитектуре. В случае спорных вариантов предложи альтернативное решение, для построения надежного HomeLab сервера.
|
||||||
|
|
||||||
|
Общая идея: построение надежного HomeLab сервера для домашнего использования, с целью совершенствования навыков сетевого инженера. Изучение linux и клиент-серверной архитектуры, внутренних сервисов, архитектуры сетей, работа с LXC и docker контейнерами. Косвенно, при построении я получаю полезные сервисы, которые можно использовать дома и при отладки своих своих внутренних Pet проектов. Возможность подключения к своему серверу из любой точки мира, где есть интернет
|
||||||
|
|
||||||
|
Аппаратная конфигурация:
|
||||||
|
|
||||||
|
1. Роутер keenetic giga kn1011.
|
||||||
|
2. Server PC - NUC на i3-8109U CPU с 16GB DDR.
|
||||||
|
3. NAS - OpenmediaVault с RAID1 8TB на Intel(R) Celeron(R) CPU 1037U @ 1.80GHz с 4GB DDR.
|
||||||
|
4. Raspberry Pi 5
|
||||||
|
|
||||||
|
Соединение PC-роутер LAN1. NAS - роутер LAN2. Роутер имеет статический, "белый" IP.
|
||||||
|
|
||||||
|
Программная конфигурация Server и используемые сервисы:
|
||||||
|
1. Poroxmox Virtual Environment 9.1.9 который имеет следующую конфигурацию:
|
||||||
|
1. HomeAssistant OS в VM
|
||||||
|
1. Управляет сценариями умного дома (скрипты автоматизации, zigbee устройства и тд)
|
||||||
|
2. LXC - Proxmox Backup Server
|
||||||
|
1. Используется для создания бэкапов на внешний HDD диск, подключенный к Server
|
||||||
|
3. LXC - Gitea
|
||||||
|
1. Основной домашний репозиторий для pet проектов и wiki obsidian
|
||||||
|
4. LXC - adguard
|
||||||
|
1. Использовался долгое время, как основной DNS сервер, фильтруя трафик, пока я не задумал устанвить NginxProxyserver, на время экспериментов adguard остановлен.
|
||||||
|
5. LXC - debian
|
||||||
|
1. предусмотрен как контейнер с ОС debian для отработки различных сценариев внутри ОС, там установлен VPN Xray vless, с панелью 3x-ui. ВПН пока не используется
|
||||||
|
6. LXC - homepage
|
||||||
|
1. Основная web страница HomeLab, для удобства доступа к ресурсам
|
||||||
|
7. LXC - docker включающие следующие образы:
|
||||||
|
1. задумывался как отдельный LXC контейнер для отработки навыков взаимодействия с docker (установка,запуск,настройка образов). Сейчас там установлены следующие images: homelable - визуализация сетевой инфраструктуры (пощупал, но пока не настроил. планирую вернуться к этому) drawio - как собственный ресурс. Практически не используется,нужен ли? и qbittorren - используется для закачки torrent образов
|
||||||
|
8. LXC - nginxproxymanager
|
||||||
|
1. Пока не используется
|
||||||
|
9. LXC - jellyfin.
|
||||||
|
1. Стриминговый медиасервер для музыки, фильмов и сериалов используется в связке с qbittorrent докер образом, который развернут в LXC docker
|
||||||
|
2. Все LXС контейнеры имеют тип Unprivileged.
|
||||||
|
3. В Proxmox VE прокинута SMB Public папка c NAS WD, с автомонтированием папки mnt/share в fstab. Каталог mnt/share подключен к следующим LXC (docker и jellyfin) В docker контейнере она используется как рабочий каталог для qBittorrent. Jellyfin использует ее как медиатеку с фильмами и музыкой. Так же к NUC подключен Sonoff USB - ZigBee dongle который проброшен в VM HomeAssistan. SSH доступ к Proxmox: вход по паролю - запрещен, прописаны rsa25595 ключи, стандартный порт изменен.
|
||||||
|
|
||||||
|
Основные аспекты:
|
||||||
|
1. Для доступа из внешнего мира в роутере переадресация портов: Проброшены TCP/UDP порты к UI Proxmox VE, HomeAssistant VM, Gitea и Jellyfin LXC.
|
||||||
|
2. В роутере разделение на VLAN и подсети не настроено. Роутер имеет возможность настройки системы доменных для использования сервисов.
|
||||||
|
3. NAS необходимо исключать из системы после полного перехода и настройки NAS OMV
|
||||||
|
4. OMV
|
||||||
|
1. Я только собрал NAS на с RAID1 8TB на Intel(R) Celeron(R) CPU 1037U @ 1.80GHz с 4GB DDR.
|
||||||
|
2. Создал Multiple Device подготовил File Systems включил SMB CIFTS сервис и подключил папку как сетевой диск.
|
||||||
|
3. Необходимо разобраться с первичной настройкой, пройтись по шагам и определить (предложить сервисы для меня)
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
Описание на Habr:
|
|
||||||
|
|
||||||
Настройки находятся в `/opt/homepage/config/`
|
|
||||||
|
|
||||||
#filesystem #linux
|
|
||||||
Директория `/opt` в Linux, сокращение от *optional* - аналог `Programm Files` установка стороннего ПО.
|
|
||||||
Стандартный путь `/usr/bin` - но тут файлы разбрасываются по разным системным папкам (бинарники в bin, библиотеки в lib)
|
|
||||||
|
|
||||||
Традиция для LXC скриптов.
|
|
||||||
|
|
||||||
Иконки тут: https://github.com/homarr-labs/dashboard-icons
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
#git #nextcloude #lxc #settings
|
||||||
|
|
||||||
|
### IP: 192.168.1.80:443
|
||||||
|
[cloude.embeddevio.netcraze.pro]()
|
||||||
|
|
||||||
|
## Install
|
||||||
|
Community description: https://community-scripts.org/categories?category=files-and-downloads&preview=alpine-nextcloud
|
||||||
|
```bash
|
||||||
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/alpine-nextcloud.sh)"
|
||||||
|
```
|
||||||
|
## Creds
|
||||||
|
При первом запуске тут:
|
||||||
|
```bash
|
||||||
|
cat /root/nextcloud.creds
|
||||||
|
```
|
||||||
|
После первого запуска необходимо сменить пароль
|
||||||
|
```
|
||||||
|
ncAdmin
|
||||||
|
YnD36WDuTgh2P
|
||||||
|
```
|
||||||
|
`NxC@R4_hOm3`
|
||||||
|
|
||||||
|
Учетка Тани:
|
||||||
|
`Tatiana`
|
||||||
|
`Wt0chk@_4!`
|
||||||
|
|
||||||
|
### Settings
|
||||||
|
1. Для доступа необходимо выполнить настройку безопасного https доступа к Nextcloude через NPM
|
||||||
|
1. Открыть файл конфигурации: `nano /etc/nextcloud/config.php`
|
||||||
|
2. Найти секцию `trusted_domains` и добавить туда параметры NPM (cм пример ниже)
|
||||||
|
```bash
|
||||||
|
'trusted_domains' =>
|
||||||
|
array (
|
||||||
|
0 => 'localhost',
|
||||||
|
1 => '192.168.1.80',
|
||||||
|
2 => 'cloude.embeddevio.netcraze.pro',
|
||||||
|
),
|
||||||
|
'trusted_proxies' =>
|
||||||
|
array (
|
||||||
|
0 => '192.168.1.60', // <- ВНИМАНИЕ: Замените этот IP на IP-адрес вашего Nginx Proxy Manager!
|
||||||
|
),
|
||||||
|
'overwritehost' => 'cloude.embeddevio.netcraze.pro',
|
||||||
|
'overwriteprotocol' => 'https',
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Сохранить изменения и перезапустить Nexcloude
|
||||||
|
```bash
|
||||||
|
systemctl restart apache2 || systemctl restart nginx || rc-service apache2 restart || rc-service nginx restart
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Настройка внешнего хранилища Nexcloude
|
||||||
|
#cloude-storage
|
||||||
|
1. Создать NFS шару на OMV
|
||||||
|
1. В настройках NFS `rw,subtree_check,all_squash,anonuid=33,anongid=33`
|
||||||
|
2. Смена владельца/группы и прав доступа
|
||||||
|
1. `chown -R 33:33 /srv/dev-disk-by-uuid-89fa7fa2-3064-4836-92ca-9cc3c832ce66/cloude-storage/`
|
||||||
|
2. `chmod -R 777 /srv/dev-disk-by-uuid-89fa7fa2-3064-4836-92ca-9cc3c832ce66/cloude-storage/`
|
||||||
|
2. Подключаем NFS папку к PVE через UI #nfs-to_pve
|
||||||
|
3. Пробрасываем папку из PVE в контейнер через точку монтирования #nfs-to-lxc
|
||||||
|
4. Перезагружаем контейнер `pct <ID> reload`
|
||||||
|
5. Подключение NFS хранилища в Nextcloude
|
||||||
|
1. Изменить файл конфигурации `nano /etc/nextcloud/config.php`
|
||||||
|
1. Прописать директорию: `'datadirectory' => '/var/lib/nextcloud/data'`
|
||||||
|
2. Перезагрузить `nginx` и `php-fpm85` выполнив команды:
|
||||||
|
1. `rc-service nginx restart` и `rc-service php-fpm85 restart`
|
||||||
|
3. Создание проверочного файла в директории NFS шары
|
||||||
|
1. Выполнить команду в консоли Nextcloude: `su -s /bin/sh nextcloud -c 'echo "# Nextcloud data directory" > /mnt/cloude-storage/.ncdata'`
|
||||||
|
2. Убедиться что файл успешно создан: `cat /mnt/cloude-storage/.ncdata`
|
||||||
|
6. Troubleshutting - Возможные проблемы
|
||||||
|
1. `Ваш каталог данных доступен для чтения другими пользователями.`
|
||||||
|
1. Открыть файл конфигурации: `nano /etc/nextcloud/config.php`
|
||||||
|
2. Добавить строчку `'check_data_directory_permissions' => false,`
|
||||||
|
2. Перезагрузить `nginx` и `php-fpm85` выполнив команды:
|
||||||
|
1. `rc-service nginx restart` и `rc-service php-fpm85 restart`
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
#homepage #lxc #settings #guide
|
||||||
|
### IP: 192.168.1.92
|
||||||
|
|
||||||
|
**PVE - LXC Script Installation**
|
||||||
|
```bash
|
||||||
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/homepage.sh)"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Описание для разработчика:**
|
||||||
|
https://gethomepage.dev/configs/settings/
|
||||||
|
|
||||||
|
**Иконки для использования:**
|
||||||
|
https://github.com/homarr-labs/dashboard-icons
|
||||||
|
|
||||||
|
Настройки находятся в `/opt/homepage/config/`
|
||||||
|
|
||||||
|
How to connect
|
||||||
|
1. **Подключение Proxmox**
|
||||||
|
- https://gethomepage.dev/configs/proxmox/
|
||||||
|
2. **Подключение Jellyfin**
|
||||||
|
- https://gethomepage.dev/widgets/services/jellyfin/#info-widgets
|
||||||
|
|
||||||
|
|
||||||
|
PVE creds
|
||||||
|
>token-id `api@pam!monitor`
|
||||||
|
>API `ce356c78-d4d4-43d5-97a0-79ca0f84f856`
|
||||||
|
|
||||||
|
|
||||||
|
Jellyfin creds
|
||||||
|
8b9dfc9e19cb4ae9be44a557e86f88df
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -k -H "Authorization: PVEAPIToken=homepage@pve!monitor=b51f4eab-c923-41b4-9e05-6f6abe9f65b5" https://192.168.1.116:8006
|
||||||
|
```
|
||||||
|
|
||||||
|
#filesystem #linux
|
||||||
|
Директория `/opt` в Linux, сокращение от *optional* - аналог `Programm Files` установка стороннего ПО.
|
||||||
|
Стандартный путь `/usr/bin` - но тут файлы разбрасываются по разным системным папкам (бинарники в bin, библиотеки в lib)
|
||||||
|
|
||||||
|
1. Настройка доступа к панели через NPM:
|
||||||
|
1. Открыть файл `/opt/homepage/.env`
|
||||||
|
2. Добавить `HOMEPAGE_ALLOWED_HOSTS=homepage.mydomain.com,localhost:3000,192.168.1.92:3000`
|
||||||
|
3. Перезапустить сервис `systemctl restart homepage`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#jellyfin #lxc #jellyfin_lxc_guide #guide
|
||||||
|
### IP: 192.168.1.76:8096
|
||||||
|
[jfn.embeddevio.netcraze.pro](https://jfn.embeddevio.netcraze.pro)
|
||||||
|
pwd:
|
||||||
|
# Table of Content
|
||||||
|
* [Введение](#Description)
|
||||||
|
* [Установка программы](# Install Alpine)
|
||||||
|
# Description
|
||||||
|
Менеджер паролей — это приложение, которое безопасно хранит ваши логины, пароли, заметки и другие секреты в зашифрованной форме и помогает автоматически подставлять данные при входе в сайты/приложения. Преимущества: сильные уникальные пароли для каждого сервиса, генерация случайных паролей, синхронизация между устройствами, централизованное хранилище паролей и ssh-ключей, а также история изменений.
|
||||||
|
|
||||||
|
# Creds
|
||||||
|
==Jellyfin creds for HomePage== `8b9dfc9e19cb4ae9be44a557e86f88df `
|
||||||
|
==jellyfin server== `http://89.109.8.114:55240` или `jfn.embeddevio.netcraze.pro`
|
||||||
|
|
||||||
|
|
||||||
|
# Install
|
||||||
|
Community description:
|
||||||
|
```bash
|
||||||
|
var_os='ubuntu' bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/jellyfin.sh)"
|
||||||
|
```
|
||||||
|
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
#nginx_proxy_manager #npm #settings #lxc #guide
|
||||||
|
|
||||||
|
### IP: 192.168.1.101:81
|
||||||
|
Описание на Habr:
|
||||||
|
|
||||||
|
**PVE - LXC Script Installation**
|
||||||
|
```bash
|
||||||
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/nginxproxymanager.sh)"
|
||||||
|
```
|
||||||
|
### Description
|
||||||
|
Это обратный прокси (Reverse Proxy).
|
||||||
|
Основан на веб-сервере Nginx
|
||||||
|
Сервис используется для организации доступа к приложениям через единую точку входа. В качестве точки входа может быть как доменное имя, так и IP адрес, с дальнейшей маршрутизацией до конечного приложения.
|
||||||
|
|
||||||
|
### Peculiar Properties
|
||||||
|
- Встроенный Веб - интерфейс
|
||||||
|
- Настройка переадресации доменов, кастомизация 404 страниц
|
||||||
|
- Наличие сервиса Let's Encrypt для выпуска бесплатных SSL сертификатов с возможностью самоподписания
|
||||||
|
- Функционал по обеспечению безопасности (Access-control list)
|
||||||
|
### AI Configuration Promt
|
||||||
|
```
|
||||||
|
Ты — опытный системный администратор и сетевой инженер. Помоги мне пошагово настроить **нативный Nginx как обратный прокси** в уже созданном **непривилегированном LXC-контейнере** на Proxmox PVE. Не предлагай Nginx Proxy Manager, Docker и другие GUI-решения. Нужен именно Nginx, установленный пакетом в LXC.
|
||||||
|
|
||||||
|
**Контекст моей инфраструктуры:**
|
||||||
|
|
||||||
|
- Роутер: Keenetic Giga KN-1011, есть белый IP.
|
||||||
|
|
||||||
|
- WireGuard уже настроен на Keenetic. Через VPN я захожу в домашнюю сеть и управляю Proxmox и внутренними сервисами.
|
||||||
|
|
||||||
|
- Есть доменные имена от KeeneticDNS. Хочу использовать их для публикации отдельных сервисов через Nginx.
|
||||||
|
|
||||||
|
- Proxmox PVE установлен. Веб-интерфейс Proxmox (8006) **нельзя** выставлять в интернет; доступ к нему — только через WireGuard/локальную сеть.
|
||||||
|
|
||||||
|
- Непривилегированный LXC-контейнер для Nginx уже создан. ОС внутри пока не настраивал.
|
||||||
|
|
||||||
|
- Цель: Nginx в LXC как единая точка входа для публикации конкретных сервисов по доменным именам, с HTTPS. Управление Proxmox и чувствительными сервисами — только через VPN.
|
||||||
|
|
||||||
|
|
||||||
|
**Что мне нужно от тебя:**
|
||||||
|
|
||||||
|
1. Веди меня **строго пошагово**, не выдавай всю инструкцию сразу. После каждого шага давай команды, ожидаемый результат и checkpoint. Не переходи к следующему шагу, пока я не подтвержу, что предыдущий выполнен.
|
||||||
|
|
||||||
|
2. В начале задай все уточняющие вопросы, которые нужны: версия ОС в LXC, IP-адрес LXC, IP и порты сервисов, которые нужно опубликовать, точные доменные имена KeeneticDNS, нужно ли публиковать сервисы наружу или только внутри VPN, есть ли поддержка DNS API у KeeneticDNS для ACME DNS-01.
|
||||||
|
|
||||||
|
3. Предложи и обоснуй схему получения SSL-сертификатов: Let's Encrypt через HTTP-01, DNS-01 или внутренний CA. Учти, что KeeneticDNS может не поддерживать ACME DNS API. Если DNS-01 невозможен — предложи безопасный обходной путь. Не открывай лишние порты без необходимости.
|
||||||
|
|
||||||
|
4. Помоги спланировать сеть и проброс портов на Keenetic: какие порты открыть на LXC, какие правила сделать на роутере, как проверить DNS и hairpin NAT. Напомни, что порт 8006 Proxmox остаётся закрытым.
|
||||||
|
|
||||||
|
5. Настрой базовую безопасность LXC: обновления, пользователи, SSH только из LAN/VPN, firewall внутри LXC, минимальный набор пакетов.
|
||||||
|
|
||||||
|
6. Установи и настрой Nginx: отдельные server-блоки, редирект HTTP→HTTPS, proxy_pass, необходимые заголовки `Host`, `X-Real-IP`, `X-Forwarded-For`, `X-Forwarded-Proto`, поддержка WebSocket, `client_max_body_size`, таймауты, логи. Добавь разумные security headers. Если уместно — предложи basic auth или ограничение по IP для чувствительных сервисов.
|
||||||
|
|
||||||
|
7. Настрой автоматическое продление сертификатов и проверку `certbot renew --dry-run` или аналог.
|
||||||
|
|
||||||
|
8. Дай команды проверки: `nginx -t`, `curl -I`, проверка сертификата, проверка извне и изнутри, проверка WebSocket, просмотр логов.
|
||||||
|
|
||||||
|
9. Предупреди о типичных ошибках: конфликт KeenDNS с портами 80/443, hairpin NAT, права в непривилегированном LXC, SELinux/AppArmor, обновления Nginx, уязвимости.
|
||||||
|
|
||||||
|
10. В конце помоги сделать backup конфигов и краткий чек-лист эксплуатации.
|
||||||
|
|
||||||
|
|
||||||
|
**Формат ответа:**
|
||||||
|
|
||||||
|
- Сначала — уточняющие вопросы.
|
||||||
|
|
||||||
|
- Затем — план из пронумерованных этапов.
|
||||||
|
|
||||||
|
- Далее — только первый этап с командами в code blocks, ожидаемым результатом и checkpoint.
|
||||||
|
|
||||||
|
- Пиши на русском, кратко и точно. Если шаг опасен или необратим — явно предупреди.
|
||||||
|
|
||||||
|
|
||||||
|
Начни с уточняющих вопросов и плана.
|
||||||
|
|
||||||
|
Этот ответ сгенерирован AI, только для справки.
|
||||||
|
```
|
||||||
|
### Settings
|
||||||
|
1. Первичная настройка маршрутизатора (роутера)
|
||||||
|
1. Включить правило переадресации портов 443 и 80 для доступа к NPM - требуется Let s Encrypt
|
||||||
|
(необходимо для доступа из внешнего мира и самоподписания SSL):
|
||||||
|
1. Вход - провайдер
|
||||||
|
2. Выход: NPM - Nginx Proxy Manager
|
||||||
|
3. Протокол: TCP/UDP
|
||||||
|
4. Открываемый порт: 443
|
||||||
|
5. Повторить п.1 - 4 но только для порта 80 - протокол только TCP
|
||||||
|
2. Для работы необходимо иметь доменное имя:
|
||||||
|
1. В данном случае настройка описана с использованием доменного имени от KeenDNS
|
||||||
|
2. Альтернативный вариант - использование зарегистрированного домена.
|
||||||
|
1. Зарегистрировал домен `embeddevio.space` на Reg.ru
|
||||||
|
3. Добавление сервисов домашней сети:
|
||||||
|
1. Hosts - Proxy Hosts - Add Proxy Host
|
||||||
|
1. Domain Names: `domaine_name.embeddevio.netcraze.pro`
|
||||||
|
2. Sheme: выбираем схему на которой работает ваш сервис `http` или `https`
|
||||||
|
3. Forward Hostname / IP: `192.168.1.44` - IP адрес сервиса
|
||||||
|
4. Forward Port: `80` `443` or `8086` порт Вашего сервиса
|
||||||
|
5. Чек-боксы:
|
||||||
|
1. `Chache Assets` - кеширование статических файлов (обычно оставляют вкл)
|
||||||
|
2. `Block Common Exploits` - базовая защита от веб-атак
|
||||||
|
3. `Websockets Support` - поддержка протокола вебсокет (чаты/дашборды и пр. в реальном времени)
|
||||||
|
6. Вкладка SSL
|
||||||
|
1. `SSL Certificate` Запросить (добавить) новый или выбрать существующий
|
||||||
|
2. `Force SSL` - Перенаправляет все http на https - рекомендуется включить
|
||||||
|
3. `HSTS Enable` - HTTP Strict Transport Security - защита от перехвата трафика (включать с осторожностью)
|
||||||
|
4. `HTTP/2 Support` - Включение протокола HTTP/2 для ускорения загрузки
|
||||||
|
5. `HSTS Sub-domains`
|
||||||
|
2. Выполнив шаги п.1 добавить Ваши сервисы. Стоит учитывать, что некоторые, добавляемые сервисы требуют внутренней настройки (например Nextcloude и HomePage)
|
||||||
|
### Подробный гайд по настройке:
|
||||||
|
[NPM Keenetic Setup](obsidian://open?vault=wikipedia&file=HomeLab%2FLXC%20-%20npm_keenetic_setup)
|
||||||
@@ -0,0 +1,179 @@
|
|||||||
|
#PBS #Backup #lxc
|
||||||
|
|
||||||
|
### IP: 192.168.1.116:81
|
||||||
|
|
||||||
|
**PVE - LXC Script Installation**
|
||||||
|
```bash
|
||||||
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/proxmox-backup-server.sh)"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Creds
|
||||||
|
|
||||||
|
| UI | https://192.168.1.91:8007/ |
|
||||||
|
| --- | -------------------------- |
|
||||||
|
| usr | root |
|
||||||
|
| psw | Px@R4_hOm3 |
|
||||||
|
|
||||||
|
---
|
||||||
|
## Настройка сохранения бэкапов на NAS
|
||||||
|
### 1. Подключение NFS в Backup PVE и проброс в PVE
|
||||||
|
1. Настройка Backup в PBS
|
||||||
|
1. Создать хранилище для backup PBS
|
||||||
|
1. Создаем Share Folder
|
||||||
|
1. в параметрах обязательно: rw,sync,no_root_squash,no_subtree_check
|
||||||
|
2. Подключаем в Service NFS доступ для PVE
|
||||||
|
2. Подключить NFS директорию в PVE
|
||||||
|
1. mkdir `mnt/pve/pbs-storage`
|
||||||
|
3. Прописать в `/etc/fstab` точку монтирования
|
||||||
|
1. 192.168.1.73:/pbs-storage /mnt/pve/pbs-storage nfs defaults,_netdev,nofail 0 0
|
||||||
|
4. Примонтировать
|
||||||
|
1. `mount -a `
|
||||||
|
2. `systemctl daemon-reload && mount -a`
|
||||||
|
5. Просмотр примонтированных устройств
|
||||||
|
1. `findmnt -t nfs,nfs4,cifs`
|
||||||
|
6. В конфигурации LXC контейнера добавить точку монтирования и перезагрузить контейнер
|
||||||
|
1. `mp1: /mnt/pve/pbs-storage,mp=/mnt/backup-omv`
|
||||||
|
2. перезагрузка контейнер
|
||||||
|
7. Проверка что все успешно примонтировалось
|
||||||
|
1. `df -h /mnt/backup-omv`
|
||||||
|
8. Выдача "прав" пользователя backup для NFS
|
||||||
|
1. `chown -R backup:backup /mnt/backup-omv`
|
||||||
|
|
||||||
|
### 2. Настройки PBS и связка его с Proxmox VE
|
||||||
|
После того, как подключили HDD и добавили его точку монтирования необходимо:
|
||||||
|
1. Создать Datastore и "подключить" каталог к базе данных в PBS
|
||||||
|
1. Левая часть Datastore - Add Datastore
|
||||||
|
2. Name - придумать `hdd-backup` далее оно будет использовано при настройке в Proxmox VE
|
||||||
|
3. Backing Path - путь к точке монтирования в контейнере `/mnt/backup-disk`
|
||||||
|
4. Add
|
||||||
|
2. Зайти в Proxmox VE и подключить хранилище PBS
|
||||||
|
1. **Storage** - Add - ProxmoxBackupServer
|
||||||
|
1. ID (придумать)
|
||||||
|
2. Server - прописать IP LXC контейнера `192.168.1.91`
|
||||||
|
3. User и Password:
|
||||||
|
1. usr: root@pam (Пользователь обязательно формата `user@pam`)
|
||||||
|
2. pwd: <> пароль от pbs
|
||||||
|
4. Datastorage `backup-omv` (имя прописанное в PBS)
|
||||||
|
5. Fingerprint - получить в PBS (на главной странице Show Fingerprint)
|
||||||
|
1. `5f:8b:02:b4:59:4e:f7:52:6b:28:87:57:76:cf:61:fa:8f:87:24:22:a6:32:71:0c:60:36:88:a5:63:5d:a3:05`
|
||||||
|
2. Подтвердить.
|
||||||
|
3. В случае успеха - будет подключено Proxmox БД для backup
|
||||||
|
|
||||||
|
### 3. Настройка автоматического резервного копирования и управления бэкапами
|
||||||
|
Proxmox VE - Datacenter
|
||||||
|
1. Backup - Add:
|
||||||
|
1. Node - оставить без изменений или выбрать нужную ноду
|
||||||
|
2. Storage - выбрать `PBS` подключенную ранее БД
|
||||||
|
3. Schedule: - установить расписание (sunday 1:00)
|
||||||
|
4. Selection mode: `include selected VMs`
|
||||||
|
1. Отметить нужные VM и LXC
|
||||||
|
2. Proxmox Backup Server - ИСКЛЮЧИТЬ
|
||||||
|
2. Storage:
|
||||||
|
1. Backup Retention - Настройка срока хранения резервных копий.
|
||||||
|
1. Если планируется выполнять бэкап - раз в неделю, установить следующие параметры:
|
||||||
|
PBS будет автоматически оставлять бэкапы за последние 4 воскресенья. Из более старых бэкапов он выберет по одному воскресному бэкапу за каждый прошлый месяц и сохранит их на год. Всё остальное будет автоматически удалено.
|
||||||
|
1. Keep Last: 2
|
||||||
|
2. Keep Montly: 12
|
||||||
|
3. Keep Weekly: 4
|
||||||
|
4. Keep Yearly: 12
|
||||||
|
5. Остальные параметры не устанавливать
|
||||||
|
3. PBS - Datastore - `backup-omv`
|
||||||
|
1. Garbage Collection - Настройка сборщика мусора
|
||||||
|
1. PBS - Datastore - Prune & GC
|
||||||
|
2. Garbage Collect Jobs - Edit
|
||||||
|
1. GC Schedule - `sun 04:00`
|
||||||
|
2. Verify Jobs - Настройка верификации бэкапов
|
||||||
|
1. Add:
|
||||||
|
1. Schedule: `sat 12:00`
|
||||||
|
2. Skip Verified `check`
|
||||||
|
3. Re-Verify After: `30` days
|
||||||
|
|
||||||
|
### 4. Настройка gmail уведомлений PVE:
|
||||||
|
1. Создать "пароль приложения" в gmail
|
||||||
|
1. `fnwfetzjihvqcned`
|
||||||
|
2. Зайдите в веб-интерфейс **PVE** → **Datacenter** → **Notifications** → вкладка **Targets**.
|
||||||
|
1. Нажмите **Add** (Добавить) → выберите **SMTP**.
|
||||||
|
3. Заполните форму строго по вашим параметрам:
|
||||||
|
- **Target Name:** `gmail-smtp` (любое имя латиницей)
|
||||||
|
- **Server:** `smtp.gmail.com`
|
||||||
|
- **Port:** `587`
|
||||||
|
- **Encryption:** `STARTTLS`
|
||||||
|
- **Author:** `Proxmox VE` (имя отправителя, которое вы увидите в письме)
|
||||||
|
- **From Address:** Ваш_адрес@gmail.com
|
||||||
|
- **Recipients** - поле оставить пустым
|
||||||
|
- **Additional Recipient** Ваш_адрес@gmail.com
|
||||||
|
- **Username:** Ваш_адрес@gmail.com
|
||||||
|
- **Password:** Вставьте **16-значный пароль приложения** из Шага 1.
|
||||||
|
4. Перенаправление уведомлений бэкапы на этот SMTP:
|
||||||
|
1. Перейдите на вкладку **Matchers** (в этом же окне `Notifications`). Дважды нажмите на дефолтный матчер **default-match**. В поле **Target to notify** вместо _mail-to-root_ выберите ваш новый `gmail-smtp`. Нажмите _Save_.
|
||||||
|
5. Повторить действия п.2 - 5 для PBS:
|
||||||
|
6. Проверить работоспособность отправки:
|
||||||
|
1. Нажать кнопку Test и проверить получение писем.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
---
|
||||||
|
### PBS - Настройка backups на внешний HDD
|
||||||
|
1. Подготовка HDD - Форматирование
|
||||||
|
```bash
|
||||||
|
# определить идентификатор устройства
|
||||||
|
lsblk
|
||||||
|
|
||||||
|
# Перезапись диска или создание одного общего раздела
|
||||||
|
fdisk /dev/sdb
|
||||||
|
|
||||||
|
# Последовательность команд по созданию раздела
|
||||||
|
# g — создать новую чистую таблицу разделов GPT.
|
||||||
|
# n — создать новый раздел.
|
||||||
|
# 1 — номер раздела (оставьте по умолчанию).
|
||||||
|
# Enter — первый сектор (оставьте по умолчанию).
|
||||||
|
# Enter — последний сектор (оставьте по умолчанию, чтобы занять весь диск)
|
||||||
|
# w - сохранить изменения и выйти.
|
||||||
|
|
||||||
|
# Форматирование в ext4 (флаг m 1 снижает резервируемое системой место, для root c 5% до 1%)
|
||||||
|
mkfs.ext4 -m 1 /dev/sdb1
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Получить уникальный идентификатор UUID ( скопировать полученный параметр `UUID="e6718965-033b-459a-864b-f945ed650fd9"` )
|
||||||
|
```bash
|
||||||
|
blkid /dev/sdb1
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Создать точку монтирования
|
||||||
|
```bash
|
||||||
|
mkdir /mnt/backup-disk
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Прописать автомонтирование в конфигурационный файл `fstab`
|
||||||
|
```bash
|
||||||
|
nano /etc/fstab
|
||||||
|
|
||||||
|
# добавить строчку
|
||||||
|
UUID=e6718965-033b-459a-864b-f945ed650fd9 /mnt/backup-disk ext4 defaults 0 2
|
||||||
|
|
||||||
|
#сохранить изменения и выйти
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Примонтировать диск без перезагрузки
|
||||||
|
```bash
|
||||||
|
systemctl daemon-reload
|
||||||
|
|
||||||
|
mount -a
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Проверка что монтирование выполнено успешно
|
||||||
|
```bash
|
||||||
|
df -h
|
||||||
|
```
|
||||||
|
|
||||||
|
7. Модификация прав доступа к файлу `/mnt/backup-disk`
|
||||||
|
```bash
|
||||||
|
chmod 777 /mnt/backup-disk
|
||||||
|
```
|
||||||
|
|
||||||
|
8. Добавим точку монтирования в LXC контейнер
|
||||||
|
```bash
|
||||||
|
nano /etc/pve/lxc/108.conf
|
||||||
|
|
||||||
|
mp0: /mnt/backup-disk,mp=/mnt/backup-disk
|
||||||
|
```
|
||||||
@@ -1,10 +1,17 @@
|
|||||||
|
#vaultwarden #lxc #vaultwarden_lxc_guide #guide
|
||||||
|
### IP: 192.168.1.123:8000
|
||||||
|
[vwd.embeddevio.netcraze.pro]()
|
||||||
|
|
||||||
|
# Table of Content
|
||||||
|
* [Введение](#Description)
|
||||||
|
* [Установка программы](# Install Alpine)
|
||||||
|
# Description
|
||||||
Менеджер паролей — это приложение, которое безопасно хранит ваши логины, пароли, заметки и другие секреты в зашифрованной форме и помогает автоматически подставлять данные при входе в сайты/приложения. Преимущества: сильные уникальные пароли для каждого сервиса, генерация случайных паролей, синхронизация между устройствами, централизованное хранилище паролей и ssh-ключей, а также история изменений.
|
Менеджер паролей — это приложение, которое безопасно хранит ваши логины, пароли, заметки и другие секреты в зашифрованной форме и помогает автоматически подставлять данные при входе в сайты/приложения. Преимущества: сильные уникальные пароли для каждого сервиса, генерация случайных паролей, синхронизация между устройствами, централизованное хранилище паролей и ssh-ключей, а также история изменений.
|
||||||
|
|
||||||
[Установка Vaultwarden — простая альтернатива Bitwarden на своем сервере](https://prohomelab.com/posts/vaultwarden/)
|
[Установка Vaultwarden — простая альтернатива Bitwarden на своем сервере](https://prohomelab.com/posts/vaultwarden/)
|
||||||
|
|
||||||
### Guide
|
# Install Alpine
|
||||||
1. Скачиваем/сами составляем `docker-compose.yml`.
|
Community description: https://community-scripts.org/categories?category=authentication-and-security&preview=vaultwarden
|
||||||
2. Создаём папку для данных и задаём на нее права.
|
```bash
|
||||||
3. Запускаем `docker compose up -d`.
|
var_os='alpine' bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/vaultwarden.sh)"
|
||||||
4. Настраиваем reverse-proxy (обязательно) и TLS (Let’s Encrypt / SWAG / Traefik). Без ssl сертификата приложение нормально не функционирует.
|
```
|
||||||
5. Настраиваем `ADMIN_TOKEN`, выключаем свободную регистрацию пользователей(если нужно), делаем бэкапы.
|
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
#npm #ssl #keenetic #npm_keenetic_setup #guide
|
||||||
|
# Настройка Nginx Proxy Manager (NPM) в связке с Keenetic
|
||||||
|
|
||||||
|
Руководство по переносу маршрутизации трафика и управлению SSL-сертификатами Let's Encrypt с роутера Keenetic (при наличии белого IP) на специализированный реверс-прокси **Nginx Proxy Manager**, развернутый в LXC-контейнере.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Архитектурная схема
|
||||||
|
|
||||||
|
```
|
||||||
|
[Интернет]
|
||||||
|
↓ (порты 80, 443)
|
||||||
|
[Роутер Keenetic] (Проброс портов / NAT)
|
||||||
|
↓
|
||||||
|
[LXC: Nginx Proxy Manager] (Терминация SSL, маршрутизация)
|
||||||
|
├── → https://ha.domain.link → [LXC: Home Assistant] (порт 8123)
|
||||||
|
├── → https://nas.domain.link → [TrueNAS / Synology] (порт 5001)
|
||||||
|
└── → https://proxmox.domain.link → [Proxmox VE] (порт 8006)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Шаг 1. Подготовка роутера Keenetic
|
||||||
|
|
||||||
|
Поскольку обработкой SSL и субдоменов теперь будет заниматься NPM, на роутере нужно отключить встроенное проксирование и настроить прямой проброс портов.
|
||||||
|
|
||||||
|
1. **Отключение встроенного проксирования KeenDNS:**
|
||||||
|
* Перейдите в **Сетевые правила** → **KeenDNS**.
|
||||||
|
* Удалите (или отключите) все правила из секции **«Доступ к веб-ресурсам домашней сети»**, чтобы Keenetic не перехватывал субдомены 4-го порядка.
|
||||||
|
2. **Проброс портов (NAT):**
|
||||||
|
* Перейдите в **Сетевые правила** → **Переадресация**.
|
||||||
|
* Создайте два правила для вашего интерфейса «Провайдер» (основной интернет-канал):
|
||||||
|
* **HTTP:** Внешний порт `80` → IP-адрес вашего LXC NPM → Внутренний порт `80`.
|
||||||
|
* **HTTPS:** Внешний порт `443` → IP-адрес вашего LXC NPM → Внутренний порт `443`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Шаг 2. Выпуск Wildcard-сертификата в NPM (DNS Challenge)
|
||||||
|
|
||||||
|
Чтобы не открывать порт 80 для каждой проверки Let's Encrypt и автоматически защитить все субдомены вида `*.yourdomain.keenetic.link`, настроим проверку через DNS API.
|
||||||
|
|
||||||
|
> 💡 **Примечание:** Так как Keenetic не всегда предоставляет полноценный API-доступ сторонним утилитам для доменов `*.keenetic.link`, для выпуска Wildcard-сертификата в NPM рекомендуется использовать связку со сторонним бесплатным DNS-провайдером (например, **Cloudflare**, перенеся туда управление зоной, либо используя Cloudflare-сертификат).
|
||||||
|
> Если вы остаетесь на чистом `keenetic.link`, используйте метод проверки **HTTP Challenge** (через порт 80).
|
||||||
|
|
||||||
|
### Инструкция для выпуска общего Wildcard-сертификата (через DNS API Cloudflare/других):
|
||||||
|
1. Откройте веб-интерфейс NPM (обычно порт `81`).
|
||||||
|
2. Перейдите во вкладку **SSL Certificates** → **Add SSL Certificate** → **Let's Encrypt**.
|
||||||
|
3. Заполните поля:
|
||||||
|
* **Domain Names:** `yourdomain.keenetic.link` и затем на следующей строчке `*.yourdomain.keenetic.link`.
|
||||||
|
* Включите тумблер **Use a DNS Challenge**.
|
||||||
|
* В списке **DNS Provider** выберите вашего провайдера (например, Cloudflare).
|
||||||
|
* Вставьте ваш секретный API-токен в текстовое поле конфигурации ниже.
|
||||||
|
4. Согласитесь с условиями Let's Encrypt и нажмите **Save**. В течение 1–2 минут сертификат будет готов.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Шаг 3. Добавление прокси-хоста (на примере Home Assistant)
|
||||||
|
|
||||||
|
1. В интерфейсе NPM перейдите во вкладку **Hosts** → **Proxy Hosts** → **Add Proxy Host**.
|
||||||
|
2. Во вкладке **Details** заполните параметры:
|
||||||
|
* **Domain Names:** `ha.yourdomain.keenetic.link` (замените `ha` на ваш субдомен 4-го порядка).
|
||||||
|
* **Scheme:** `http` *(большинство сервисов внутри локальной сети работают по HTTP)*.
|
||||||
|
* **Forward Name/IP:** Локальный IP-адрес вашего Home Assistant (например, `192.168.1.100`).
|
||||||
|
* **Forward Port:** Порт сервиса (для HA по умолчанию `8123`).
|
||||||
|
* Включите тумблеры: **Block Common Exploits** и **Websockets Support** *(критически важно для работы Home Assistant!)*.
|
||||||
|
3. Перейдите во вкладку **SSL**:
|
||||||
|
* В выпадающем списке **SSL Certificate** выберите выпущенный ранее Wildcard-сертификат.
|
||||||
|
* Включите тумблеры: **Force SSL** (для автоматического редиректа с HTTP на HTTPS) и **HTTP/2 Support**.
|
||||||
|
4. Нажмите **Save**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Шаг 4. Настройка доверенного прокси в Home Assistant
|
||||||
|
|
||||||
|
Home Assistant по умолчанию блокирует запросы от обратных прокси-серверов в целях безопасности. Без этого шага при попытке войти через веб-интерфейс вы получите ошибку **«400: Bad Request»**.
|
||||||
|
|
||||||
|
1. Откройте конфигурационный файл Home Assistant (`configuration.yaml`).
|
||||||
|
2. Добавьте или отредактируйте следующий блок кода:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
http:
|
||||||
|
use_x_forwarded_for: true
|
||||||
|
trusted_proxies:
|
||||||
|
- 192.168.1.50 # !!! ЗАМЕНИТЕ НА РЕАЛЬНЫЙ IP-АДРЕС ВАШЕГО LXC-КОНТЕЙНЕРА С NPM !!!
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Сохраните файл и **перезапустите** Home Assistant через панель разработчика или перезагрузив контейнер HA.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Чек-лист проверки работоспособности
|
||||||
|
- [ ] Порты 80 и 443 проброшены на Keenetic в сторону IP NPM.
|
||||||
|
- [ ] При переходе по адресу `https://ha.yourdomain.keenetic.link` открывается окно авторизации Home Assistant.
|
||||||
|
- [ ] В адресной строке браузера горит значок «замочка» (сертификат валиден, выпущен Let's Encrypt).
|
||||||
|
- [ ] Мобильное приложение Home Assistant Companion успешно подключается снаружи по новому адресу.
|
||||||
@@ -1,4 +1,10 @@
|
|||||||
|
#git #gitea #lxc #settings
|
||||||
|
# IP: 192.168.1.111:3000
|
||||||
|
https://git.embeddevio.netcraze.pro/
|
||||||
|
|
||||||
|
| usr | embeddev.iot@gmail.com |
|
||||||
|
| --- | -------------------------- |
|
||||||
|
| psw | GiT@R4_hOm3 |
|
||||||
### Зеркалирование c GitHub
|
### Зеркалирование c GitHub
|
||||||
1. GitHub - Получить PAT Personal Access Token
|
1. GitHub - Получить PAT Personal Access Token
|
||||||
1. Settings - Password and Authentication - Develop settings - Personal access tokens - Tokens(classic)
|
1. Settings - Password and Authentication - Develop settings - Personal access tokens - Tokens(classic)
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#nginx_proxy_manager #npm
|
|
||||||
|
|
||||||
Описание на Habr:
|
|
||||||
### Description
|
|
||||||
Это обратный прокси (Reverse Proxy).
|
|
||||||
Основан на веб-сервере Nginx
|
|
||||||
Сервис используется для организации доступа к приложениям через единую точку входа. В качестве точки входа может быть как доменное имя, так и IP адрес, с дальнейшей маршрутизацией до конечного приложения.
|
|
||||||
|
|
||||||
### Peculiar Properties
|
|
||||||
- Встроенный Веб - интерфейс
|
|
||||||
- Настройка переадресации доменов, кастомизация 404 страниц
|
|
||||||
- Наличие сервиса Let's Encrypt для выпуска бесплатных SSL сертификатов с возможностью самоподписания
|
|
||||||
- Функционал по обеспечению безопасности (Access-control list)
|
|
||||||
|
|
||||||
### Settings
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,327 @@
|
|||||||
|
#omv #settings #nfs-share #pve #pbs #nfs #mount #lxc
|
||||||
|
|
||||||
|
# Гайд: Разшаривание 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 через UI
|
||||||
|
#nfs-to_pve
|
||||||
|
**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)
|
||||||
|
При подключении NFS через UI - отдельно точку монтирования создавать не нужно
|
||||||
|
Создаём точку монтирования на **хосте 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 контейнер
|
||||||
|
#nfs-to-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-шар
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
#omv #nas
|
||||||
|
# IP: 192.168.1.73
|
||||||
|
#OpenMediaVault https://omv.embeddevio.netcraze.pro/
|
||||||
|
|
||||||
|
`admin`
|
||||||
|
`OmV@R4_hOm3`
|
||||||
|
|
||||||
|
# Spec:
|
||||||
|
> **Система:** OMV 8.5.9-1 (Synchrony) / Debian 13 Trixie
|
||||||
|
> **Hardware:** RAID1 8TB на Intel(R) Celeron(R) CPU 1037U @ 1.80GHz с 4GB
|
||||||
|
> **Docker:** Qbittorrent
|
||||||
|
---
|
||||||
|
|
||||||
|
# Description on File System and Shared Folder:
|
||||||
|
Настройка шары папок описано тут: #omv_share_folders
|
||||||
|
|
||||||
|
1. `/dev/md0` - EXT4 - RAID1 на 8TB
|
||||||
|
1. `Media` - каталог для хранения медиафайлов
|
||||||
|
1. Расшарен по NFS и SMB для Jellyfin и Qbittorrent
|
||||||
|
2. Древо каталогов:
|
||||||
|
1. `Shared Music` - Каталог Музыки
|
||||||
|
2. `Movies ` - Каталог Фильмов
|
||||||
|
3. `Shared Video ` - Каталог сериалов
|
||||||
|
4. `watch` - каталог "ожидания" для торрент файлов (QBittorrent)
|
||||||
|
5. `incomplete` - незавершенные закачки торрент
|
||||||
|
3. `Media` через NFS примонтирован к PVE - `/mnt/pve/OMV-Media`
|
||||||
|
1. `OMV-Media` используется в LXC Jellyfin через точку монтирования mp1: `/mnt/pve/OMV-Media` проброшен в `mnt/share`
|
||||||
|
1. Каталоги Jellyfin:
|
||||||
|
1. `/mnt/share/Shared Music ` - Каталог Музыки
|
||||||
|
2. `/mnt/share/Movies ` - Каталог Фильмов
|
||||||
|
3. `/mnt/share/Shared Video` - Каталог Сериалов
|
||||||
|
2. `pbs-storage` - бэкапы Proxmox Backup Server
|
||||||
|
1. по NFS смонтирован в `/mnt/pve/pbs-storage` в PVE
|
||||||
|
2. в PBS примонтирован через mp1 и доступен как `/mnt/backup-omv`
|
||||||
|
3. `git-storage` - каталог для Git репозитория #git-storage
|
||||||
|
4. `cloude-storage` - каталог для сервиса Nexcloude #cloude-storage
|
||||||
|
1.
|
||||||
|
2. `/dev/md1` - EXT4 - Внешний USB для бэкапов OMV
|
||||||
|
1. `omv_backup` - `/dev/sdd1` - OMV-Backup
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
#omv #gmail #notification #backup #lxc
|
||||||
|
# Настройка бэкапов системы на внешний HDD
|
||||||
|
|
||||||
|
> **Система:** OMV 8.5.9-1 (Synchrony) / Debian 13 Trixie
|
||||||
|
---
|
||||||
|
|
||||||
|
1. Установить плагин
|
||||||
|
1. `openmediavault-backup`
|
||||||
|
2. Подключить внешний HDD (ext4)
|
||||||
|
1.
|
||||||
|
3. System - Backup
|
||||||
|
4. System - Notification -settings
|
||||||
|
1. Enable - `check`
|
||||||
|
2. SMTP server - `smtp.gmail.com`
|
||||||
|
3. SMTP port: `587`
|
||||||
|
4. Encryption mode: STARTTLS
|
||||||
|
5. Sender mail: `embeddev.iot@gmail.com`
|
||||||
|
6. Authentication required -`check`
|
||||||
|
7. User name: embeddev.iot@gmail.com
|
||||||
|
8. Password: `lgrmlzxysqhezhpg` (application pass)
|
||||||
|
9. Recipient: embeddev.iot@gmail.com
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Самый простой способ — без Docker. qBittorrent есть в репозиториях Debian 13.
|
||||||
@@ -0,0 +1,194 @@
|
|||||||
|
#homelab #proxmox #Gitea #homeassistant #haos #adguard #wireguard #debian #lxc #pve #omv #jellyfin #nas #portaineer #pbs #homepage #qbittorrent
|
||||||
|
|
||||||
|
## HomeServer:
|
||||||
|
**Home Network IP:** 192.168.1.XXX
|
||||||
|
**External IP:** <font color="#ff0000">89.109.8.114</font>
|
||||||
|
|
||||||
|
### Внешний доступ к лабе:
|
||||||
|
Администрирование - WireGuard
|
||||||
|
|
||||||
|
Keenetic: embeddevio.netcraze.pro
|
||||||
|
Домен на reg.ru: https://embeddevio.space/
|
||||||
|
|
||||||
|
==Доменные имена Nginx Proxy Manager:==
|
||||||
|
#Nextcloude https://cloude.embeddevio.netcraze.pro/
|
||||||
|
#Jellyfin https://jfn.embeddevio.netcraze.pro/
|
||||||
|
#OpenMediaVault https://omv.embeddevio.netcraze.pro/
|
||||||
|
#Vaultvarden https://vwd.embeddevio.netcraze.pro/
|
||||||
|
#HomeAssistant https://ha.embeddevio.netcraze.pro/
|
||||||
|
|
||||||
|
|
||||||
|
==Старые доменные имена от netcraze==
|
||||||
|
Proxmox: https://proxmox.embeddevio.netcraze.pro
|
||||||
|
HomeAssistant: https://ha.embeddevio.netcraze.pro
|
||||||
|
NAS: https://nas.embeddevio.netcraze.pro
|
||||||
|
Qbittorrent: https://qbt.embeddevio.netcraze.pro
|
||||||
|
|
||||||
|
|
||||||
|
## HomeLab Table
|
||||||
|
1. **Keenetic** - http://192.168.1.1/
|
||||||
|
2. **NUC - Proxmox VE** - [192.168.1.116:8006](https://192.168.1.116:8006/)
|
||||||
|
1. VM (Vitrual Macheens)
|
||||||
|
1. ==100 - HomeAssistant OS== - http://192.168.1.43:8123/
|
||||||
|
2. LXC (Linux Containeers)
|
||||||
|
1. ==101 - Gitea== - http://192.168.1.111:3000/
|
||||||
|
2. ==102 - AdGuard== - http://192.168.1.148/
|
||||||
|
3. ==103 - Debian== Embeddev
|
||||||
|
1. ==*Hermes Agent*== - http://192.168.1.44:9119/
|
||||||
|
2. 3x-ui Xray Vless Reality - https://192.168.1.44:5324/SY9zL3JA9b8qPhnE7r/
|
||||||
|
4. ==104 - Homepage== http://192.168.1.92:3000/
|
||||||
|
5. ==105 - Docker ==
|
||||||
|
1. Portaineer - https://192.168.1.147:9443/
|
||||||
|
2. Homelable - http://192.168.1.147:3000/
|
||||||
|
3. Drawio - http://192.168.1.147:8080/
|
||||||
|
4. AmneziaWG - no ui
|
||||||
|
6. ==106 - Nginxproxymanager== - http://192.168.1.101:81/
|
||||||
|
7. ==107 - Jellyfin== - http://192.168.1.76:8096/
|
||||||
|
8. ==108 - Proxmox Backup Server== - https://192.168.1.91:8007/
|
||||||
|
9. ==109 - Debian== HealtyChel - под вопросом
|
||||||
|
10. 110
|
||||||
|
3. **NAS - OpenMediaVault** - http://192.168.1.73/
|
||||||
|
1. Qbittorrent - http://192.168.1.73:8080/
|
||||||
|
2. Immich
|
||||||
|
4. **Raspberry PI5**
|
||||||
|
|
||||||
|
## Hardware info
|
||||||
|
#### NUC8i3BEH
|
||||||
|
``` bash
|
||||||
|
# dmidecode 3.6
|
||||||
|
Getting SMBIOS data from sysfs.
|
||||||
|
SMBIOS 3.2.1 present.
|
||||||
|
|
||||||
|
Handle 0x0001, DMI type 1, 27 bytes
|
||||||
|
System Information
|
||||||
|
Manufacturer: Intel(R) Client Systems
|
||||||
|
Product Name: NUC8i3BEH
|
||||||
|
Version: J72753-304
|
||||||
|
Serial Number: G6BE92400LXJ
|
||||||
|
UUID: 48ea7e15-d51a-aa83-aea7-1c697a03fe73
|
||||||
|
Wake-up Type: Power Switch
|
||||||
|
SKU Number: BOXNUC8i3BEH
|
||||||
|
Family: Intel NUC
|
||||||
|
|
||||||
|
Physical Memory Array
|
||||||
|
Location: System Board Or Motherboard
|
||||||
|
Use: System Memory
|
||||||
|
Error Correction Type: None
|
||||||
|
Maximum Capacity: 32 GB
|
||||||
|
Error Information Handle: Not Provided
|
||||||
|
Number Of Devices: 2
|
||||||
|
|
||||||
|
Handle 0x003C, DMI type 17, 40 bytes
|
||||||
|
Memory Device
|
||||||
|
Array Handle: 0x003B
|
||||||
|
Error Information Handle: Not Provided
|
||||||
|
Total Width: 64 bits
|
||||||
|
Data Width: 64 bits
|
||||||
|
Size: 8 GB
|
||||||
|
Form Factor: SODIMM
|
||||||
|
Set: None
|
||||||
|
Locator: SODIMM1
|
||||||
|
Bank Locator: Memory Channel A
|
||||||
|
Type: DDR4
|
||||||
|
Type Detail: Synchronous
|
||||||
|
Speed: 2667 MT/s
|
||||||
|
Manufacturer: Samsung
|
||||||
|
Serial Number: 338CC169
|
||||||
|
Asset Tag: 9876543210
|
||||||
|
Part Number: M471A1K43CB1-CTD
|
||||||
|
Rank: 1
|
||||||
|
Configured Memory Speed: 2400 MT/s
|
||||||
|
Minimum Voltage: 1.2 V
|
||||||
|
Maximum Voltage: 1.2 V
|
||||||
|
Configured Voltage: 1.2 V
|
||||||
|
|
||||||
|
Handle 0x003D, DMI type 17, 40 bytes
|
||||||
|
Memory Device
|
||||||
|
Array Handle: 0x003B
|
||||||
|
Error Information Handle: Not Provided
|
||||||
|
Total Width: 64 bits
|
||||||
|
Data Width: 64 bits
|
||||||
|
Size: 8 GB
|
||||||
|
Form Factor: SODIMM
|
||||||
|
Set: None
|
||||||
|
Locator: SODIMM2
|
||||||
|
Bank Locator: Memory Channel B
|
||||||
|
Type: DDR4
|
||||||
|
Type Detail: Synchronous
|
||||||
|
Speed: 2667 MT/s
|
||||||
|
Manufacturer: Samsung
|
||||||
|
Serial Number: 338CC19A
|
||||||
|
Asset Tag: 9876543210
|
||||||
|
Part Number: M471A1K43CB1-CTD
|
||||||
|
Rank: 1
|
||||||
|
Configured Memory Speed: 2400 MT/s
|
||||||
|
Minimum Voltage: 1.2 V
|
||||||
|
Maximum Voltage: 1.2 V
|
||||||
|
Configured Voltage: 1.2 V
|
||||||
|
```
|
||||||
|
#### OpenMediaVault
|
||||||
|
```bash
|
||||||
|
root@openmediavault:~# dmidecode -t system
|
||||||
|
# dmidecode 3.6
|
||||||
|
Getting SMBIOS data from sysfs.
|
||||||
|
SMBIOS 2.7 present.
|
||||||
|
|
||||||
|
Handle 0x0001, DMI type 1, 27 bytes
|
||||||
|
System Information
|
||||||
|
Manufacturer: Gigabyte Technology Co., Ltd.
|
||||||
|
Product Name: To be filled by O.E.M.
|
||||||
|
Version: To be filled by O.E.M.
|
||||||
|
Serial Number: To be filled by O.E.M.
|
||||||
|
UUID: 03aa02fc-0414-0590-4d06-2f0700080009
|
||||||
|
Wake-up Type: Power Switch
|
||||||
|
SKU Number: To be filled by O.E.M.
|
||||||
|
Family: To be filled by O.E.M.
|
||||||
|
|
||||||
|
# dmidecode 3.6
|
||||||
|
Getting SMBIOS data from sysfs.
|
||||||
|
SMBIOS 2.7 present.
|
||||||
|
|
||||||
|
Handle 0x0007, DMI type 16, 23 bytes
|
||||||
|
Physical Memory Array
|
||||||
|
Location: System Board Or Motherboard
|
||||||
|
Use: System Memory
|
||||||
|
Error Correction Type: None
|
||||||
|
Maximum Capacity: 32 GB
|
||||||
|
Error Information Handle: Not Provided
|
||||||
|
Number Of Devices: 2
|
||||||
|
|
||||||
|
Handle 0x0040, DMI type 17, 34 bytes
|
||||||
|
Memory Device
|
||||||
|
Array Handle: 0x0007
|
||||||
|
Error Information Handle: Not Provided
|
||||||
|
Total Width: Unknown
|
||||||
|
Data Width: Unknown
|
||||||
|
Size: No Module Installed
|
||||||
|
Form Factor: DIMM
|
||||||
|
Set: None
|
||||||
|
Locator: ChannelB-DIMM0
|
||||||
|
Bank Locator: BANK 2
|
||||||
|
Type: Unknown
|
||||||
|
Type Detail: None
|
||||||
|
|
||||||
|
Handle 0x0041, DMI type 17, 34 bytes
|
||||||
|
Memory Device
|
||||||
|
Array Handle: 0x0007
|
||||||
|
Error Information Handle: Not Provided
|
||||||
|
Total Width: 64 bits
|
||||||
|
Data Width: 64 bits
|
||||||
|
Size: 4 GB
|
||||||
|
Form Factor: DIMM
|
||||||
|
Set: None
|
||||||
|
Locator: ChannelA-DIMM0
|
||||||
|
Bank Locator: BANK 0
|
||||||
|
Type: DDR3
|
||||||
|
Type Detail: Synchronous
|
||||||
|
Speed: 1333 MT/s
|
||||||
|
Manufacturer: Hynix/Hyundai
|
||||||
|
Serial Number: 01815948
|
||||||
|
Asset Tag: 9876543210
|
||||||
|
Part Number: HMT351U6CFR8C-H9
|
||||||
|
Rank: 2
|
||||||
|
Configured Memory Speed: 1333 MT/s
|
||||||
|
```
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
#homelab #proxmox #Gitea #homeassistant #haos #adguard #wireguard
|
||||||
|
|
||||||
|
### Useful resources
|
||||||
|
Про домашнюю лабораторию: [Prohomelab](https://prohomelab.com/)
|
||||||
|
Proxmox Community Scripts [Proxmox Community-scripts](https://community-scripts.org/)
|
||||||
|
|
||||||
|
![[Pasted image 20260426160841.png]]
|
||||||
|
|
||||||
|
|
||||||
|
## Network route table
|
||||||
|
**Home Network IP:** 192.168.1.XXX
|
||||||
|
**External IP:** <font color="#ff0000">89.109.8.114</font>
|
||||||
|
|
||||||
|
## Wifi:
|
||||||
|
EMBNET2G / 5G
|
||||||
|
`Ae19co90$!eT`
|
||||||
|
|
||||||
|
|
||||||
|
Тест работы AdGuard: https://adblock-tester.com/
|
||||||
|
Keeneetic: `emb` `3haMJf9ZdNpCktq`
|
||||||
|
|
||||||
|
## HomeLab system map table
|
||||||
|
|
||||||
|
| Home Service | State | SSH | Port Internal | Port External | <center>IP or DNS</center> | <center>user</center> | <center>psw</center> | Include <br>Services | <center>Proxmox <br>VE Script</center><br> |
|
||||||
|
| ------------------------- | ------------------------------------------ | ------------ | ------------- | ------------- | --------------------------------------------- | --------------------- | -------------------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------- |
|
||||||
|
| **Keenetic** | <center>✔️</center> | | | | http://mrtrand.keenetic.pro | admin | 1eU$_RhMp8 | | |
|
||||||
|
| **Proxmox UI** | <center>✔️</center> | | 8006 | 8002 | 192.168.1.116 | root | Px@R4_hOm3 | | |
|
||||||
|
| **Proxmox SSH** | <center>✔️</center> | key <br>only | 58220 | 2202 | 192.168.1.116 | | | | |
|
||||||
|
| **Proxmox Backup Server** | | | 8007 | | https://192.168.1.91:8007/ | root | Px@R4_hOm3 | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/proxmox-backup-server.sh)"` |
|
||||||
|
| **Home Assistant** | <center>✔️</center> | | 8123 | 8003 | 192.168.1.43 | embeddevio | Sm@R4_hOm3<br> | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/vm/haos-vm.sh)"` |
|
||||||
|
| **Debian** | <center>✔️</center> | key <br>only | | | 192.168.1.44 | | | 3x-UI | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/debian.sh)"` |
|
||||||
|
| **Gitea** | <center>✔️</center> | | 3000 | 8004 | 192.168.1.111<br> | | | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/gitea.sh)"` |
|
||||||
|
| **AdGuard Home** | <center>✔️ требуется донастройка?</center> | | 3000 | | 192.168.1.148 | embeddevio | Ad@R4_hOm3 | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/adguard.sh)"` |
|
||||||
|
| **Docker<br>Portainer** | <center>✔️</center> | | 9443 | | 192.168.1.147 | admin | Dokr@R4_hOm3 | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/docker.sh)"` |
|
||||||
|
| **Homepage** | | | 3000 | | 192.168.1.92:3000 | | | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/homepage.sh)"` |
|
||||||
|
| **Jellyfin** | <center>✔️</center> | | 8096 | 55240 | [192.168.1.76:8096](http://192.168.1.76:8096) | embeddevio | JiF@R4_hOm3 | | `var_os='ubuntu' bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/jellyfin.sh)"` |
|
||||||
|
| **Alpine Nextcloude** | <center>✔️</center> | | | | 192.168.1.80:81 | | | | |
|
||||||
|
| Nginx Proxy Manager | <center>✔️</center> | | не настроен | | 192.168.1.101:81 | embeddevio | NgX@R4_hOm3 | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/nginxproxymanager.sh)"` |
|
||||||
|
| **OpenMediaVault** | <center>✔️</center> | | | | 192.168.1.73 | admin/embeddevio | OmV@R4_hOm3 | | |
|
||||||
|
| | | | | | | root | digitex1990 | | |
|
||||||
|
|
||||||
|
### Proxmox Application & Services
|
||||||
|
|
||||||
|
| Service | Location | Connect | Description | usr/psw | Repositories |
|
||||||
|
| ---------------- | ---------- | --------------------------- | ----------------------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------ |
|
||||||
|
| Homelable | Docker LXC | https://192.168.1.147:9443/ | Визуализация сетевой инфраструктуры | | `bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/homelable.sh)"` |
|
||||||
|
| Drawio | Docker LXC | http://192.168.1.147:8080/ | | | |
|
||||||
|
| Poratiner | Docker | http://192.168.1.147:3000/ | | | |
|
||||||
|
| 3x-UI + VLESS | Debian LXC | | | | |
|
||||||
|
| Hermes Dashboard | Debian LXC | http://192.168.1.44:9119/ | Hermes Agent | embeddevio<br>HmA@R4_hOm3 | |
|
||||||
|
| | | | | | |
|
||||||
|
|
||||||
|
### 3x-UI Panel
|
||||||
|
Username: `1lK1HHY131`
|
||||||
|
Password: `yguXrSEJxk`
|
||||||
|
Port: `5324`
|
||||||
|
WebBasePath: `SY9zL3JA9b8qPhnE7r`
|
||||||
|
Access URL: https://89.109.8.114:8007/SY9zL3JA9b8qPhnE7r
|
||||||
|
IP homenet: `192.168.1.44:5324`
|
||||||
|
|
||||||
|
### RT Internet configuration
|
||||||
|
Username: `KPMAa7Lz`
|
||||||
|
Password: `PF2Rgt`
|
||||||
|
Protocol (type): `PPPoE`
|
||||||
|
IPv4 Settings:
|
||||||
|
1. Configuration: Auto DHCP
|
||||||
|
2. Ignnore DNSv4 from ISP
|
||||||
|
IPv6 Settings:
|
||||||
|
3. Configuration: disable
|
||||||
|
ISP Requirements:
|
||||||
|
4. MAC - by default
|
||||||
|
5. MTU size: 1500
|
||||||
|
|
||||||
|
JiF@Tati@n9
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
|
#PBS #Backup
|
||||||
### Instalation
|
### Instalation
|
||||||
[Proxmox.com](https://pve.proxmox.com/wiki/Main_Page)
|
[Proxmox.com](https://pve.proxmox.com/wiki/Main_Page)
|
||||||
|
|
||||||
### Proxmox Community-Scripts
|
### Proxmox Community-Scripts
|
||||||
|
|
||||||
Скрипт для обновления всех LXC контейнеров ([PVE LCX Apps Update](https://community-scripts.org/scripts/update-apps))
|
Скрипт для обновления всех LXC контейнеров ([PVE LCX Apps Update](https://community-scripts.org/scripts/update-apps))
|
||||||
```bash
|
```bash
|
||||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/pve/update-apps.sh)"
|
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/pve/update-apps.sh)"
|
||||||
```
|
```
|
||||||
|
|
||||||
+1
-9
@@ -1,4 +1,4 @@
|
|||||||
![[Proxmox HA manual install-1776339003771.webp]]
|
#haos #vm #pve #guide ![[Proxmox HA manual install-1776339003771.webp]]
|
||||||
## Install HAOS with Automatization Script
|
## Install HAOS with Automatization Script
|
||||||
|
|
||||||
|
|
||||||
@@ -15,20 +15,12 @@
|
|||||||
системные требования довольно минимальны - следующие _предложения_ следует скорректировать в соответствии с вашими потребностями
|
системные требования довольно минимальны - следующие _предложения_ следует скорректировать в соответствии с вашими потребностями
|
||||||
|
|
||||||
- Общие: Что угодно
|
- Общие: Что угодно
|
||||||
|
|
||||||
- ОС: Не используйте носители
|
- ОС: Не используйте носители
|
||||||
|
|
||||||
- Система: Машина - q35; BIOS - OVMF (UEFI); Хранилище EFI - Что угодно, что вы обычно используете для хранения; Снимите флажок "предварительно зарегистрировать ключи"
|
- Система: Машина - q35; BIOS - OVMF (UEFI); Хранилище EFI - Что угодно, что вы обычно используете для хранения; Снимите флажок "предварительно зарегистрировать ключи"
|
||||||
|
|
||||||
- Диски: Удалите все существующие диски, мы добавим образ qcow2 позже
|
- Диски: Удалите все существующие диски, мы добавим образ qcow2 позже
|
||||||
|
|
||||||
- CPU: 4 ядра (или сколько хотите)
|
- CPU: 4 ядра (или сколько хотите)
|
||||||
|
|
||||||
- Память: 4096 (или сколько хотите)
|
- Память: 4096 (или сколько хотите)
|
||||||
|
|
||||||
- Сеть: Что угодно, что вы обычно делаете
|
- Сеть: Что угодно, что вы обычно делаете
|
||||||
|
|
||||||
|
|
||||||
Пока не запускайте виртуальную машину.
|
Пока не запускайте виртуальную машину.
|
||||||
|
|
||||||
## Прикрепить образ qcow2
|
## Прикрепить образ qcow2
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#mount #umount
|
#mount #umount #pve #settings #mount #flash #smb #lxc
|
||||||
|
|
||||||
### Mount USB Flash in LXC - прокидывание USB флешки в LXC контейнер
|
### Mount USB Flash in LXC - прокидывание USB флешки в LXC контейнер
|
||||||
Управление осуществляется из Shell гипервизора Proxmox
|
Управление осуществляется из Shell гипервизора Proxmox
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
#haos #mqtt #zigbee #esphome
|
#haos #mqtt #zigbee #esphome #homeassistant
|
||||||
|
|
||||||
|
# IP: 192.168.1.43:8123
|
||||||
|
[ha.embeddevio.netcraze.pro]()
|
||||||
|
|
||||||
### Install HAOS in Proxmox with Automatization Script
|
### Install HAOS in Proxmox with Automatization Script
|
||||||
[Installation Guide](https://smarthomescene.com/guides/how-to-install-home-assistant-on-proxmox-the-easy-way/)
|
[Installation Guide](https://smarthomescene.com/guides/how-to-install-home-assistant-on-proxmox-the-easy-way/)
|
||||||
@@ -29,9 +32,9 @@
|
|||||||
ha network info
|
ha network info
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git init --bare
|
git init --bare
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Настройки SSH через расширение
|
||||||
@@ -0,0 +1,471 @@
|
|||||||
|
#omv #settings #docker #lxc #qbittorrent #nfs #mount #lxc
|
||||||
|
# Установка qBittorrent на OpenMediaVault 8.5.9-1 (Synchrony)
|
||||||
|
|
||||||
|
> **Система:** OMV 8.5.9-1 (Synchrony) / Debian 13 Trixie
|
||||||
|
> **Дата:** октябрь 2026
|
||||||
|
> **Два варианта:** нативный пакет (apt) — проще, или Docker-контейнер — изолированно
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Содержание
|
||||||
|
|
||||||
|
1. [Вариант A: Нативная установка (qbittorrent-nox)](#вариант-a-нативная-установка-qbittorrent-nox)
|
||||||
|
2. [Вариант B: Установка через Docker (рекомендуется)](#вариант-b-установка-через-docker-рекомендуется)
|
||||||
|
3. [Первый вход и настройка](#первый-вход-и-настройка)
|
||||||
|
4. [Интеграция с OMV — shared folders](#интеграция-с-omv--shared-folders)
|
||||||
|
5. [Безопасность](#безопасность)
|
||||||
|
6. [Обновление](#обновление)
|
||||||
|
7. [Troubleshooting](#troubleshooting)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Вариант A: Нативная установка (qbittorrent-nox)
|
||||||
|
|
||||||
|
Самый простой способ — без Docker. qBittorrent есть в репозиториях Debian 13.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Установка
|
||||||
|
apt update
|
||||||
|
apt install -y qbittorrent-nox
|
||||||
|
|
||||||
|
# 2. Создаём пользователя (не запускать от root!)
|
||||||
|
adduser --system --group --home /var/lib/qbittorrent qbittorrent
|
||||||
|
|
||||||
|
# 3. Структура каталогов
|
||||||
|
mkdir -p /srv/qbittorrent/{config,downloads,torrents}
|
||||||
|
chown -R qbittorrent:qbittorrent /srv/qbittorrent
|
||||||
|
|
||||||
|
# 4. Первый запуск — создаст конфиг
|
||||||
|
su -s /bin/bash qbittorrent -c 'qbittorrent-nox --profile=/srv/qbittorrent/config' &
|
||||||
|
sleep 5
|
||||||
|
pkill qbittorrent-nox
|
||||||
|
```
|
||||||
|
|
||||||
|
Теперь правим конфиг:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nano /srv/qbittorrent/config/qBittorrent/qBittorrent.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
Минимальные настройки:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[LegalNotice]
|
||||||
|
Accepted=true
|
||||||
|
|
||||||
|
[Preferences]
|
||||||
|
Connection\PortRangeMin=6881
|
||||||
|
Connection\DHTEnabled=true
|
||||||
|
Connection\PeXEnabled=true
|
||||||
|
Connection\UPnPEnabled=false
|
||||||
|
Connection\ListenPort=6881
|
||||||
|
|
||||||
|
[BitTorrent]
|
||||||
|
Session\DefaultSavePath=/srv/qbittorrent/downloads
|
||||||
|
Session\TempPath=/srv/qbittorrent/torrents
|
||||||
|
Session\TempPathEnabled=true
|
||||||
|
Session\Port=6881
|
||||||
|
|
||||||
|
[WebUI]
|
||||||
|
WebUI\Port=8080
|
||||||
|
WebUI\Address=0.0.0.0
|
||||||
|
WebUI\UseUPnP=false
|
||||||
|
WebUI\Server\Enabled=true
|
||||||
|
WebUI\Server\Host=0.0.0.0
|
||||||
|
WebUI\Server\Port=8080
|
||||||
|
WebUI\CSRFProtection=true
|
||||||
|
WebUI\ClickjackingProtection=true
|
||||||
|
WebUI\HostHeaderValidation=false
|
||||||
|
```
|
||||||
|
|
||||||
|
**Systemd-сервис:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat > /etc/systemd/system/qbittorrent-nox.service << 'SERVICE'
|
||||||
|
[Unit]
|
||||||
|
Description=qBittorrent-nox (headless)
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=qbittorrent
|
||||||
|
Group=qbittorrent
|
||||||
|
ExecStart=/usr/bin/qbittorrent-nox --profile=/srv/qbittorrent/config
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10
|
||||||
|
LimitNOFILE=65536
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
SERVICE
|
||||||
|
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable --now qbittorrent-nox
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверка:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
systemctl status qbittorrent-nox
|
||||||
|
journalctl -u qbittorrent-nox -n 20
|
||||||
|
```
|
||||||
|
|
||||||
|
Веб-интерфейс: `http://192.168.1.73:8080`
|
||||||
|
Логин: `admin`, пароль — смотреть в логе:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
journalctl -u qbittorrent-nox | grep -i password
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Вариант B: Установка через Docker (рекомендуется)
|
||||||
|
|
||||||
|
Изоляция от системы, лёгкое обновление, проброс портов, отсутствие конфликтов зависимостей.
|
||||||
|
|
||||||
|
### Шаг 1. Установка Docker (если ещё не установлен)
|
||||||
|
|
||||||
|
**1.1. Установка omv-extras (плагин OMV)**
|
||||||
|
|
||||||
|
Через веб-интерфейс:
|
||||||
|
> **System → Plugins** → установить `openmediavault-omvextrasorg`
|
||||||
|
Или через CLI (если плагина нет в списке):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget -4 -q --timeout=30 -O /tmp/omvextras.deb \
|
||||||
|
'https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/openmediavault-omvextrasorg_latest_all8.deb'
|
||||||
|
dpkg -i /tmp/omvextras.deb
|
||||||
|
apt-get install -f -y
|
||||||
|
```
|
||||||
|
|
||||||
|
**1.2. Установка Docker CE**
|
||||||
|
|
||||||
|
Через веб: **System → omv-extras → Docker CE → Save → Apply**
|
||||||
|
|
||||||
|
Или вручную:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Добавить репозиторий Docker
|
||||||
|
apt update && apt install -y ca-certificates curl gnupg
|
||||||
|
install -m 0755 -d /etc/apt/keyrings
|
||||||
|
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
|
||||||
|
chmod a+r /etc/apt/keyrings/docker.asc
|
||||||
|
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian trixie stable" \
|
||||||
|
> /etc/apt/sources.list.d/docker.list
|
||||||
|
|
||||||
|
apt update && apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||||
|
systemctl enable --now docker
|
||||||
|
```
|
||||||
|
|
||||||
|
**1.3. Добавить пользователя OMV (admin) в группу docker** (чтобы не писать sudo):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
usermod -aG docker $(whoami)
|
||||||
|
# выйти и зайти заново
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 2. Структура каталогов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Основная директория для Docker-стеков
|
||||||
|
mkdir -p /srv/docker/qbittorrent/{config,downloads,torrents,watch}
|
||||||
|
```
|
||||||
|
|
||||||
|
Если на OVM есть данные шары (например, `/shared/Downloads`), можно смонтировать их напрямую:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p /srv/docker/qbittorrent/downloads
|
||||||
|
# Или сделать симлинк:
|
||||||
|
ln -s /shared/Downloads /srv/docker/qbittorrent/downloads
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 3. Docker Compose файл
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p /srv/docker/qbittorrent
|
||||||
|
nano /srv/docker/qbittorrent/docker-compose.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
qbittorrent:
|
||||||
|
image: lscr.io/linuxserver/qbittorrent:latest
|
||||||
|
container_name: qbittorrent
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "8080:8080" # Веб-интерфейс
|
||||||
|
- "6881:6881" # Торрент-трафик (TCP)
|
||||||
|
- "6881:6881/udp" # Торрент-трафик (UDP/DHT)
|
||||||
|
environment:
|
||||||
|
- PUID=1000 # ID пользователя OMV (id <username>)
|
||||||
|
- PGID=100 # Группа users
|
||||||
|
- TZ=Europe/Moscow
|
||||||
|
- WEBUI_PORT=8080
|
||||||
|
- UMASK=002 # Права для скачанных файлов: 775
|
||||||
|
volumes:
|
||||||
|
- ./config:/config
|
||||||
|
- ./downloads:/downloads
|
||||||
|
- ./watch:/watch # Папка для .torrent-файлов (опционально)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Важно:** `PUID`/`PGID` должны совпадать с владельцем папки downloads.
|
||||||
|
Узнать свои ID:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
id $(whoami)
|
||||||
|
# uid=1000(admin) gid=100(users)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 4. Запуск
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /srv/docker/qbittorrent
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
# Проверка
|
||||||
|
docker compose ps
|
||||||
|
docker compose logs -f
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 5. Настройка UFW (если включён)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ufw allow 8080/tcp comment 'qBittorrent Web UI'
|
||||||
|
ufw allow 6881/tcp comment 'qBittorrent Torrent TCP'
|
||||||
|
ufw allow 6881/udp comment 'qBittorrent Torrent UDP'
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Первый вход и настройка
|
||||||
|
|
||||||
|
1. Открыть в браузере: `http://192.168.1.73:8080`
|
||||||
|
2. **Логин:** `admin`
|
||||||
|
3. **Пароль:** генерируется при первом запуске
|
||||||
|
|
||||||
|
**Для нативной установки:**
|
||||||
|
```bash
|
||||||
|
journalctl -u qbittorrent-nox | grep password
|
||||||
|
```
|
||||||
|
|
||||||
|
**Для Docker:**
|
||||||
|
```bash
|
||||||
|
docker logs qbittorrent | grep password
|
||||||
|
```
|
||||||
|
|
||||||
|
Пример вывода:
|
||||||
|
```
|
||||||
|
**********
|
||||||
|
* qBittorrent *
|
||||||
|
* A qBittorrent Web UI password has been set: "xxxXxXxXxX" *
|
||||||
|
**********
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Сразу сменить пароль: **Tools → Options → Web UI → Authentication**
|
||||||
|
5. Настроить пути загрузки: **Options → Downloads**
|
||||||
|
- Save files to: `/downloads`
|
||||||
|
- Copy .torrent files to: `/watch` (если используете watch-папку)
|
||||||
|
|
||||||
|
6. **Опционально:** включить OpenTrackers подписку:
|
||||||
|
**Tools → Options → BitTorrent → Automatic Torrent Management**
|
||||||
|
Добавить: `https://github.com/ngosang/trackerslist/raw/master/trackers_best.txt`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Интеграция с OMV — shared folders
|
||||||
|
#omv_share_folders
|
||||||
|
Чтобы скачанные файлы были доступны по SMB/NFS:
|
||||||
|
|
||||||
|
**Через веб OMV:**
|
||||||
|
1. **Storage → Shared Folders** → создать shared folder `/srv/docker/qbittorrent/downloads` (или `/shared/Downloads`)
|
||||||
|
2. **Services → SMB/CIFS → Shares** → добавить шару
|
||||||
|
3. **Services → SMB/CIFS → Settings** → включить
|
||||||
|
4. 3. **Services → NFS → Settings** → включить
|
||||||
|
|
||||||
|
**Через Docker (проброс готовой шары):**
|
||||||
|
|
||||||
|
Если шара уже есть (например, `/shared/Downloads`):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
volumes:
|
||||||
|
- ./config:/config
|
||||||
|
- /shared/Downloads:/downloads # проброс существующей шары
|
||||||
|
- /shared/Torrents/watch:/watch
|
||||||
|
```
|
||||||
|
|
||||||
|
**Права:** убедиться, что `PUID`/`PGID` в docker-compose совпадают с владельцем шары.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ls -la /shared/Downloads
|
||||||
|
# Если владелец nobody:nogroup — ставь PUID=65534, PGID=65534
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Безопасность
|
||||||
|
|
||||||
|
### 1. Сменить пароль по умолчанию
|
||||||
|
|
||||||
|
После первого входа: **Tools → Options → Web UI → Current password / New password**
|
||||||
|
|
||||||
|
### 2. Отключить удалённый доступ (если не нужен)
|
||||||
|
|
||||||
|
Закрыть порт 8080 на интерфейсе WAN (через роутер или UFW):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ufw deny 8080
|
||||||
|
ufw allow from 192.168.1.0/24 to any port 8080 # только локальная сеть
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Reverse proxy с HTTPS (рекомендуется)
|
||||||
|
|
||||||
|
Через Nginx Proxy Manager:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# в docker-compose.yml NPM
|
||||||
|
services:
|
||||||
|
nginx-proxy-manager:
|
||||||
|
image: jc21/nginx-proxy-manager:latest
|
||||||
|
ports:
|
||||||
|
- "80:80"
|
||||||
|
- "81:81"
|
||||||
|
- "443:443"
|
||||||
|
volumes:
|
||||||
|
- ./data:/data
|
||||||
|
- ./letsencrypt:/etc/letsencrypt
|
||||||
|
```
|
||||||
|
|
||||||
|
В веб-интерфейсе NPM (`http://192.168.1.73:81`):
|
||||||
|
|
||||||
|
1. **Proxy Hosts → Add Proxy Host**
|
||||||
|
2. Domain: `torrent.home.local` (или ваш домен)
|
||||||
|
3. Forward Host/IP: `qbittorrent` (имя контейнера) или `192.168.1.73`
|
||||||
|
4. Forward Port: `8080`
|
||||||
|
5. **SSL → Request Let's Encrypt** → включить Force SSL
|
||||||
|
|
||||||
|
### 4. VPN для торрентов (опционально)
|
||||||
|
|
||||||
|
Маршрутизация qBittorrent через VPN-контейнер:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
gluetun: # VPN-клиент
|
||||||
|
image: qmcgaw/gluetun:latest
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
environment:
|
||||||
|
- VPN_SERVICE_PROVIDER=your_vpn
|
||||||
|
- VPN_TYPE=wireguard
|
||||||
|
- WIREGUARD_PRIVATE_KEY=...
|
||||||
|
- WIREGUARD_ADDRESSES=...
|
||||||
|
- WIREGUARD_DNS=...
|
||||||
|
ports:
|
||||||
|
- "6881:6881"
|
||||||
|
- "6881:6881/udp"
|
||||||
|
volumes:
|
||||||
|
- ./gluetun:/gluetun
|
||||||
|
|
||||||
|
qbittorrent:
|
||||||
|
image: lscr.io/linuxserver/qbittorrent:latest
|
||||||
|
network_mode: "service:gluetun" # трафик через VPN
|
||||||
|
environment:
|
||||||
|
- WEBUI_PORT=8080
|
||||||
|
volumes:
|
||||||
|
- ./config:/config
|
||||||
|
- ./downloads:/downloads
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Обновление
|
||||||
|
|
||||||
|
### Нативная установка
|
||||||
|
|
||||||
|
```bash
|
||||||
|
apt update && apt upgrade -y qbittorrent-nox
|
||||||
|
systemctl restart qbittorrent-nox
|
||||||
|
```
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /srv/docker/qbittorrent
|
||||||
|
docker compose pull
|
||||||
|
docker compose up -d
|
||||||
|
# Старый образ останется — удалить:
|
||||||
|
docker image prune -f
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### qBittorrent не запускается
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Нативная установка
|
||||||
|
journalctl -u qbittorrent-nox -n 50
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
docker logs qbittorrent --tail 50
|
||||||
|
```
|
||||||
|
|
||||||
|
### Нет доступа к веб-интерфейсу
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверить, слушается ли порт
|
||||||
|
ss -tlnp | grep 8080
|
||||||
|
|
||||||
|
# Если слушается только на 127.0.0.1 — проверить:
|
||||||
|
# WebUI\Address=0.0.0.0 в qBittorrent.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Не скачиваются торренты — нет DHT
|
||||||
|
|
||||||
|
Проверить, открыт ли порт 6881:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# С хоста
|
||||||
|
curl -s https://www.yougetsignal.com/tools/open-ports/ | grep 6881
|
||||||
|
# Или
|
||||||
|
nc -zv 192.168.1.73 6881
|
||||||
|
```
|
||||||
|
|
||||||
|
Возможно, порт закрыт роутером — пробросить порт 6881 (TCP+UDP) на OMV.
|
||||||
|
|
||||||
|
### Docker не стартует после перезагрузки
|
||||||
|
|
||||||
|
```bash
|
||||||
|
systemctl enable docker
|
||||||
|
```
|
||||||
|
|
||||||
|
### Контейнер restart'ится в цикле
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker logs qbittorrent | tail -30
|
||||||
|
# Типичная причина: несовпадение PUID/PGID с правами на /config
|
||||||
|
# Исправить: chown -R 1000:100 /srv/docker/qbittorrent/config
|
||||||
|
```
|
||||||
|
|
||||||
|
### Неверный пароль при первом входе
|
||||||
|
|
||||||
|
Удалить конфиг и запустить заново:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Docker
|
||||||
|
rm -rf /srv/docker/qbittorrent/config
|
||||||
|
docker compose down && docker compose up -d
|
||||||
|
|
||||||
|
# Нативная
|
||||||
|
rm -rf /srv/qbittorrent/config
|
||||||
|
systemctl restart qbittorrent-nox
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ссылки
|
||||||
|
|
||||||
|
- [linuxserver/qbittorrent — Docker Hub](https://hub.docker.com/r/linuxserver/qbittorrent)
|
||||||
|
- [qBittorrent — официальный сайт](https://qbittorrent.org)
|
||||||
|
- [OpenMediaVault Extras (omv-extras)](https://github.com/OpenMediaVault-Plugin-Developers/packages)
|
||||||
|
- [OpenTrackers список](https://github.com/ngosang/trackerslist)
|
||||||
+72
-51
@@ -1,77 +1,98 @@
|
|||||||
|
#ssh #open-ssh
|
||||||
|
|
||||||
Директория `/user/.ssh/`
|
Директория `/user/.ssh/`
|
||||||
|
|
||||||
``` python
|
``` python
|
||||||
# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
|
# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
|
||||||
|
Host RP3_192.168.1.110
|
||||||
Host RP3_192.168.1.110
|
HostName 192.168.1.110
|
||||||
HostName 192.168.1.110
|
User emb
|
||||||
User emb
|
|
||||||
|
|
||||||
Host rp5_wifi
|
Host rp5_wifi
|
||||||
HostName 192.168.1.45
|
HostName 192.168.1.46
|
||||||
User emb
|
User emb
|
||||||
IdentityFile ~/.ssh/id_ed25519
|
IdentityFile ~/.ssh/id_ed25519
|
||||||
IdentitiesOnly yes
|
IdentitiesOnly yes
|
||||||
|
|
||||||
# [NO USED] OLD HomeServer External IP
|
# [NO USED] OLD HomeServer External IP
|
||||||
Host ha-server
|
Host ha-server
|
||||||
HostName 89.109.8.114
|
HostName 89.109.8.114
|
||||||
User emb
|
User emb
|
||||||
IdentityFile ~/.ssh/id_ed25519
|
IdentityFile ~/.ssh/id_ed25519
|
||||||
IdentitiesOnly yes
|
IdentitiesOnly yes
|
||||||
Port 2202
|
Port 2202
|
||||||
|
|
||||||
# Proxmox - HomeServer
|
# Proxmox - HomeServer
|
||||||
Host homelab
|
Host homelab
|
||||||
HostName 192.168.1.116
|
HostName 192.168.1.116
|
||||||
User root
|
User root
|
||||||
IdentityFile ~/.ssh/id_ed25519
|
IdentityFile ~/.ssh/id_ed25519
|
||||||
IdentitiesOnly yes
|
IdentitiesOnly yes
|
||||||
Port 58220
|
Port 58220
|
||||||
|
|
||||||
# HomeAssistant on Proxmox
|
# HomeAssistant on Proxmox
|
||||||
Host homelab_haos
|
Host homelab_haos
|
||||||
HostName 192.168.1.43
|
HostName 192.168.1.43
|
||||||
User root
|
User root
|
||||||
IdentityFile ~/.ssh/id_ed25519
|
IdentityFile ~/.ssh/id_ed25519
|
||||||
IdentitiesOnly yes
|
IdentitiesOnly yes
|
||||||
|
|
||||||
# Debian on Proxmox
|
# Debian on Proxmox
|
||||||
Host homelab_deb
|
Host homelab_deb
|
||||||
HostName 192.168.1.44
|
HostName 192.168.1.44
|
||||||
User root
|
User root
|
||||||
IdentityFile ~/.ssh/id_ed25519
|
IdentityFile ~/.ssh/id_ed25519
|
||||||
IdentitiesOnly yes
|
IdentitiesOnly yes
|
||||||
|
# hermes agent - проброс портов
|
||||||
|
LocalForward localhost:9119 127.0.0.1:9119
|
||||||
|
|
||||||
|
# Debian on Proxmox HealtyChel
|
||||||
|
Host homelab_debhc
|
||||||
|
HostName 192.168.1.125
|
||||||
|
User root
|
||||||
|
IdentityFile ~/.ssh/id_ed25519
|
||||||
|
IdentitiesOnly yes
|
||||||
|
# hermes agent - проброс портов
|
||||||
|
LocalForward localhost:9119 127.0.0.1:9119
|
||||||
|
|
||||||
# Docker LXC on Proxmox
|
# Docker LXC on Proxmox
|
||||||
Host homelab_docker
|
Host homelab_docker
|
||||||
HostName 192.168.1.147
|
HostName 192.168.1.147
|
||||||
User root
|
User root
|
||||||
IdentityFile ~/.ssh/id_ed25519
|
IdentityFile ~/.ssh/id_ed25519
|
||||||
IdentitiesOnly yes
|
IdentitiesOnly yes
|
||||||
|
|
||||||
# HomePage LXC on Proxmox
|
# HomePage LXC on Proxmox
|
||||||
Host homelab_page
|
Host homelab_page
|
||||||
HostName 192.168.1.92
|
HostName 192.168.1.92
|
||||||
User root
|
User root
|
||||||
IdentityFile ~/.ssh/id_ed25519
|
IdentityFile ~/.ssh/id_ed25519
|
||||||
IdentitiesOnly yes
|
IdentitiesOnly yes
|
||||||
Port 22
|
Port 22
|
||||||
|
|
||||||
# Gitea LXC on Proxmox
|
# Gitea LXC on Proxmox
|
||||||
Host homelab_git
|
Host homelab_git
|
||||||
HostName 192.168.1.111
|
HostName 192.168.1.111
|
||||||
User root
|
User root
|
||||||
IdentityFile ~/.ssh/id_ed25519
|
IdentityFile ~/.ssh/id_ed25519
|
||||||
IdentitiesOnly yes
|
IdentitiesOnly yes
|
||||||
Port 22
|
Port 22
|
||||||
# Port 8004
|
# Port 8004
|
||||||
|
|
||||||
# Radxa E25 SBC
|
# Radxa E25 SBC
|
||||||
Host radxa
|
Host radxa
|
||||||
HostName 192.168.1.142
|
HostName 192.168.1.142
|
||||||
User radxa
|
User radxa
|
||||||
IdentityFile ~/.ssh/id_ed25519
|
IdentityFile ~/.ssh/id_ed25519
|
||||||
IdentitiesOnly yes
|
IdentitiesOnly yes
|
||||||
Port 22
|
Port 22
|
||||||
|
|
||||||
|
# OpenMediaVault
|
||||||
|
Host homelab_omv
|
||||||
|
HostName 192.168.1.73
|
||||||
|
User root
|
||||||
|
IdentityFile ~/.ssh/id_ed25519
|
||||||
|
IdentitiesOnly yes
|
||||||
|
Port 22
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 5.6 MiB After Width: | Height: | Size: 5.6 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 821 KiB |
@@ -0,0 +1,96 @@
|
|||||||
|
## Description
|
||||||
|
![[Pasted image 20261029215430.png|295]]
|
||||||
|
|
||||||
|
|
||||||
|
Radxa E52C https://docs.radxa.com/en/e/e52c
|
||||||
|
Radxa Github https://github.com/radxa
|
||||||
|
Radxa Schematic: https://dl.radxa.com/e/e52c/hw/radxa_e52c_v1.2_schematic.pdf
|
||||||
|
|
||||||
|
Radxa Wiki: https://wiki.radxa.com/Rock3/installusb-install-radxa-e25
|
||||||
|
https://wikidevi.wi-cat.ru/Radxa_E25_(D2E8)
|
||||||
|
Forum Radxa Community: https://forum.radxa.com/
|
||||||
|
Документация и файлы: https://dl.radxa.com/cm3i/e25/
|
||||||
|
|
||||||
|
# Images:
|
||||||
|
|
||||||
|
|
||||||
|
## Debian microSD Installation Guide
|
||||||
|
1. Скачать образ системы (Debian or OpenWRT)
|
||||||
|
2. С помощью Balena Etcher записать образ на microSD
|
||||||
|
3. Подключить питание к TypeC и Ethernet
|
||||||
|
1. Debian: установить SSH соединение:
|
||||||
|
1. user: `radxa`
|
||||||
|
2. psw: `radxa`
|
||||||
|
2. OpenWRT
|
||||||
|
1. usr: `root`
|
||||||
|
2. psw: `password`
|
||||||
|
3. ip: 192.168.1.1
|
||||||
|
4. Обновить систему:
|
||||||
|
```bash
|
||||||
|
sudo apt update && sudo apt upgrade -y
|
||||||
|
```
|
||||||
|
При возникновении проблем с репозиториями
|
||||||
|
```bash
|
||||||
|
sudo sed -i '/bullseye-backports/d' /etc/apt/sources.list /etc/apt/sources.list.d/* 2>/dev/null
|
||||||
|
```
|
||||||
|
При возникновении необходимости **downgrade** выполнить принудительное обновлениt:
|
||||||
|
```bash
|
||||||
|
sudo apt dist-upgrade --allow-downgrades
|
||||||
|
```
|
||||||
|
Перезагрузить систему
|
||||||
|
```bash
|
||||||
|
sudo systemctl -r reboot
|
||||||
|
```
|
||||||
|
Удалить неиспользуемые пакеты:
|
||||||
|
```bash
|
||||||
|
sudo apt autoremove -y
|
||||||
|
```
|
||||||
|
|
||||||
|
### Setting with rsetup
|
||||||
|
Настройка SBC с помощью стандартной утилиты `rsetup`
|
||||||
|
|
||||||
|
|
||||||
|
## OpenWRT microSD Installation Guide
|
||||||
|
IP-адрес по умолчанию:
|
||||||
|
192.168.1.1
|
||||||
|
Пароль root по умолчанию:
|
||||||
|
password
|
||||||
|
|
||||||
|
|
||||||
|
## EMMC Installation Guide
|
||||||
|
1. Скачайте и распакуйте на свой компьютер следующие компоненты:
|
||||||
|
1. **Утилиту RKDevTool** (версии 2.84 или новее) и **Драйвер DriverAssitant** от Rockchip.
|
||||||
|
2. **Файл загрузчика (MiniLoader)**: обычно это файл вида `RK356x_SPL_Loader_v1.XX.bin`
|
||||||
|
3. **Образ системы**: скачайте нужный дистрибутив с [официального сайта Radxa](https://docs.radxa.com/en/rock3/e25). Распакуйте архив, чтобы получить чистый файл
|
||||||
|
4.
|
||||||
|
```bash
|
||||||
|
apt update && apt upgrade -y
|
||||||
|
apt install -y docker.io
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Настройка автозапуска
|
||||||
|
```bash
|
||||||
|
systemctl enable docker
|
||||||
|
systemctl start docker
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Установка Docker Compose
|
||||||
|
```bash
|
||||||
|
apt install -y docker-compose
|
||||||
|
```
|
||||||
|
|
||||||
|
## Manual
|
||||||
|
1. Просмотр списка образов
|
||||||
|
```bash
|
||||||
|
docker image ls
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Загрузка образа из Docker Hub
|
||||||
|
```bash
|
||||||
|
docker pull redis:7-alpine
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Запуск докер контейнера
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
## Pinout
|
||||||
|
[Raspberry PI 5 Documentation](https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#flagship-series)
|
||||||
|
![[Pasted image 20260901214038.png]]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[SPI Display Module Documentation](https://www.lcdwiki.com/3.2inch_SPI_Module_ILI9341_SKU:MSP3218)
|
||||||
|
|
||||||
|
### 3.2 TFT SPI Module Display ILI9341
|
||||||
|
[SPI Display Module Documentation](https://www.lcdwiki.com/3.2inch_SPI_Module_ILI9341_SKU:MSP3218)
|
||||||
|
|
||||||
|
| Pin Number RP5 | Pin Number LCD | Pin Label | Description |
|
||||||
|
| -------------------------------- | -------------- | --------- | -------------------------------------------------------------------------------------------- |
|
||||||
|
| 2,4 - 5V / 1 - 3V3 | 1 | VCC | 5V/3.3V power input |
|
||||||
|
| 6,9,14 | 2 | GND | Ground |
|
||||||
|
| Pin 24 (**GPIO 8 / SPI0_CE0**) | 3 | CS | LCD chip select signal, low level enable |
|
||||||
|
| Pin 11 (**GPIO 17**) | 4 | RESET | LCD reset signal, low level reset |
|
||||||
|
| Pin 13 (**GPIO 27**) | 5 | DC/RS | LCD register / data selection signal,<br><br>high level: register, low level: data |
|
||||||
|
| Pin 19 (**GPIO 10 / SPI0_MOSI**) | 6 | SDI(MOSI) | SPI bus write data signal |
|
||||||
|
| Pin 23 (**GPIO 11 / SPI0_SCLK**) | 7 | SCK | SPI bus clock signal |
|
||||||
|
| Pin 1 (**3.3V**) | 8 | LED | Backlight control, high level lighting,<br><br>if not controlled, connect 3.3V always bright |
|
||||||
|
| Pin 21 (**GPIO 9 / SPI0_MISO**) | 9 | SDO(MISO) | SPI bus read data signal, if you do not need to the read function, you can not connect it |
|
||||||
|
| | 10 | T_CLK | Touch SPI bus clock signal |
|
||||||
|
| | 11 | T_CS | Touch screen chip select signal, low level enable |
|
||||||
|
| | 12 | T_DIN | Touch SPI bus input |
|
||||||
|
| | 13 | T_DO | Touch SPI bus output |
|
||||||
|
| | 14 | T_IRQ | Touch screen interrupt signal, low level when touch is detected |
|
||||||
|
|
||||||
|
### RP5 Display module connection
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt update && sudo apt upgrade -y
|
||||||
|
```
|
||||||
|
При возникновении проблем с репозиториями
|
||||||
|
```bash
|
||||||
|
sudo sed -i '/bullseye-backports/d' /etc/apt/sources.list /etc/apt/sources.list.d/* 2>/dev/null
|
||||||
|
```
|
||||||
|
При возникновении необходимости **downgrade** выполнить принудительное обновлениt:
|
||||||
|
```bash
|
||||||
|
sudo apt dist-upgrade --allow-downgrades
|
||||||
|
```
|
||||||
|
Перезагрузить систему
|
||||||
|
```bash
|
||||||
|
sudo systemctl -r reboot
|
||||||
|
```
|
||||||
|
Удалить неиспользуемые пакеты:
|
||||||
|
```bash
|
||||||
|
sudo apt autoremove -y
|
||||||
|
```
|
||||||
|
|
||||||
|
### Setting with rsetup
|
||||||
|
Настройка SBC с помощью стандартной утилиты `rsetup`
|
||||||
|
|
||||||
|
|
||||||
|
## OpenWRT microSD Installation Guide
|
||||||
|
IP-адрес по умолчанию:
|
||||||
|
192.168.1.1
|
||||||
|
Пароль root по умолчанию:
|
||||||
|
password
|
||||||
|
|
||||||
|
|
||||||
|
## EMMC Installation Guide
|
||||||
|
1. Скачайте и распакуйте на свой компьютер следующие компоненты:
|
||||||
|
1. **Утилиту RKDevTool** (версии 2.84 или новее) и **Драйвер DriverAssitant** от Rockchip.
|
||||||
|
2. **Файл загрузчика (MiniLoader)**: обычно это файл вида `RK356x_SPL_Loader_v1.XX.bin`
|
||||||
|
3. **Образ системы**: скачайте нужный дистрибутив с [официального сайта Radxa](https://docs.radxa.com/en/rock3/e25). Распакуйте архив, чтобы получить чистый файл
|
||||||
|
4.
|
||||||
|
```bash
|
||||||
|
apt update && apt upgrade -y
|
||||||
|
apt install -y docker.io
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Настройка автозапуска
|
||||||
|
```bash
|
||||||
|
systemctl enable docker
|
||||||
|
systemctl start docker
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Установка Docker Compose
|
||||||
|
```bash
|
||||||
|
apt install -y docker-compose
|
||||||
|
```
|
||||||
|
|
||||||
|
## Manual
|
||||||
|
1. Просмотр списка образов
|
||||||
|
```bash
|
||||||
|
docker image ls
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Загрузка образа из Docker Hub
|
||||||
|
```bash
|
||||||
|
docker pull redis:7-alpine
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Запуск докер контейнера
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
@@ -0,0 +1,443 @@
|
|||||||
|
# Подключение OLED дисплея SSD1306 128x64 к Raspberry Pi 5
|
||||||
|
|
||||||
|
## Содержание
|
||||||
|
|
||||||
|
1. [Подключение по I2C](#1-подключение-по-i2c)
|
||||||
|
2. [Настройка I2C на RPi5](#2-настройка-i2c-на-rpi5)
|
||||||
|
3. [Установка ПО](#3-установка-по)
|
||||||
|
4. [Проверка дисплея](#4-проверка-дисплея)
|
||||||
|
5. [Статическое изображение](#5-статическое-изображение)
|
||||||
|
6. [CPU/Монитор в реальном времени](#6-cpumонитор-в-реальном-времени)
|
||||||
|
7. [Systemd-сервис для автостарта](#7-systemd-сервис-для-автостарта)
|
||||||
|
8. [Решение проблем](#8-решение-проблем)
|
||||||
|
9. [Приложение: полный код скриптов](#9-приложение-полный-код-скриптов)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Подключение по I2C
|
||||||
|
|
||||||
|
SSD1306 подключается по I2C-шине. Пины I2C на Raspberry Pi 5:
|
||||||
|
|
||||||
|
| Пин | Название | GPIO | Назначение |
|
||||||
|
|-----|----------|------|------------|
|
||||||
|
| 3 | SDA | GPIO2 | I2C Data |
|
||||||
|
| 5 | SCL | GPIO3 | I2C Clock |
|
||||||
|
| 1 | 3.3V | — | Питание |
|
||||||
|
| 6 | GND | — | Земля |
|
||||||
|
|
||||||
|
**Схема подключения:**
|
||||||
|
```
|
||||||
|
RPi5 OLED SSD1306
|
||||||
|
GPIO2 (Pin 3) ─────── SDA
|
||||||
|
GPIO3 (Pin 5) ─────── SCL
|
||||||
|
3.3V (Pin 1) ─────── VCC
|
||||||
|
GND (Pin 6) ─────── GND
|
||||||
|
```
|
||||||
|
|
||||||
|
**Важно:** Для I2C нужны подтягивающие резисторы (pull-up) 4.7 кОм на линиях SDA и SCL к 3.3V. На большинстве готовых OLED-модулей они уже впаяны — дополнительно ставить не нужно.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Настройка I2C на RPi5
|
||||||
|
|
||||||
|
На Raspberry Pi 5 I2C по умолчанию **отключён** в `/boot/firmware/config.txt`.
|
||||||
|
|
||||||
|
### 2.1. Включение I2C
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo sed -i 's/#dtparam=i2c_arm=on/dtparam=i2c_arm=on/' /boot/firmware/config.txt
|
||||||
|
sudo reboot
|
||||||
|
```
|
||||||
|
|
||||||
|
**Проверка после перезагрузки:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo /usr/sbin/i2cdetect -y 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Вывод (пример — если дисплей подключён):
|
||||||
|
```
|
||||||
|
0 1 2 3 4 5 6 7 8 9 a b c d e f
|
||||||
|
00: -- -- -- -- -- -- -- --
|
||||||
|
...
|
||||||
|
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
Адрес **0x3C** — стандартный для SSD1306 (может быть 0x3D, проверяйте по даташиту).
|
||||||
|
|
||||||
|
**Заметка:** `i2cdetect` лежит в `/usr/sbin/` — этого каталога нет в PATH обычного пользователя. Используйте полный путь или `sudo`.
|
||||||
|
|
||||||
|
### 2.2. Альтернатива: raspi-config
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo raspi-config
|
||||||
|
# → Interface Options → I2C → Enable
|
||||||
|
sudo reboot
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Установка ПО
|
||||||
|
|
||||||
|
### 3.1. Системные пакеты
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-get install -y i2c-tools python3-pip python3-smbus python3-pil
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2. Виртуальное окружение Python
|
||||||
|
|
||||||
|
На Raspberry Pi OS Bookworm используется `external-managed-environment` — `pip install` напрямую не работает. Обязательно создаём venv:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 -m venv ~/oled-env
|
||||||
|
source ~/oled-env/bin/activate
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3. Установка luma.oled
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install luma.oled Pillow
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверка установки:
|
||||||
|
```bash
|
||||||
|
python3 -c "from luma.core.interface.serial import i2c; from luma.oled.device import ssd1306; print('OK')"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Проверка дисплея
|
||||||
|
|
||||||
|
После включения I2C и установки ПО — быстрый тест сканирует шину и зажигает пиксели:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source ~/oled-env/bin/activate
|
||||||
|
python3 -c "
|
||||||
|
from luma.core.interface.serial import i2c
|
||||||
|
from luma.oled.device import ssd1306
|
||||||
|
from PIL import Image, ImageDraw
|
||||||
|
|
||||||
|
serial = i2c(port=1, address=0x3C)
|
||||||
|
device = ssd1306(serial)
|
||||||
|
|
||||||
|
img = Image.new('1', device.size, 'black')
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
draw.rectangle((0, 0, 127, 63), outline='white', fill='black')
|
||||||
|
draw.text((20, 25), 'Hello!', fill='white')
|
||||||
|
|
||||||
|
device.display(img)
|
||||||
|
device.cleanup = lambda: None
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
Если дисплей показывает рамку и текст — всё работает.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Статическое изображение
|
||||||
|
|
||||||
|
Скрипт `/home/emb/oled_show.py` — выводит статический текст и завершается, оставляя изображение на дисплее.
|
||||||
|
|
||||||
|
```python
|
||||||
|
#!/home/emb/oled-env/bin/python3
|
||||||
|
import sys, os, signal
|
||||||
|
from luma.core.interface.serial import i2c
|
||||||
|
from luma.oled.device import ssd1306
|
||||||
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
|
||||||
|
serial = i2c(port=1, address=0x3C)
|
||||||
|
device = ssd1306(serial)
|
||||||
|
|
||||||
|
img = Image.new('1', device.size, 'black')
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 11)
|
||||||
|
|
||||||
|
draw.rectangle((0, 0, 127, 63), outline='white', fill='black')
|
||||||
|
draw.text((2, 2), 'RPi5 Ready!', font=font, fill='white')
|
||||||
|
draw.text((2, 16), 'I2C 128x64', font=font, fill='white')
|
||||||
|
draw.text((2, 30), '192.168.1.46', font=font, fill='white')
|
||||||
|
draw.text((2, 50), 'by Hermes', font=font, fill='white')
|
||||||
|
|
||||||
|
device.display(img)
|
||||||
|
device.cleanup = lambda: None # <-- КЛЮЧЕВОЙ МОМЕНТ
|
||||||
|
print('OLED ready')
|
||||||
|
```
|
||||||
|
|
||||||
|
### Почему `device.cleanup = lambda: None`?
|
||||||
|
|
||||||
|
Библиотека `luma.oled` в деструкторе объекта `device` вызывает команду 0xAE (DISPLAY OFF), что гасит дисплей при завершении скрипта. Замена `cleanup` на пустую функцию предотвращает это.
|
||||||
|
|
||||||
|
Если вам нужно, чтобы скрипт работал постоянно (и дисплей не гас _никогда_), добавьте `signal.pause()` в конец — процесс останется висеть.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. CPU/Монитор в реальном времени
|
||||||
|
|
||||||
|
Скрипт `/home/emb/oled_cpu_mon.py` — отображает загрузку CPU, RAM и температуру с обновлением раз в секунду.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import time, os
|
||||||
|
from luma.core.interface.serial import i2c
|
||||||
|
from luma.oled.device import ssd1306
|
||||||
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
|
||||||
|
serial = i2c(port=1, address=0x3C)
|
||||||
|
device = ssd1306(serial)
|
||||||
|
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 10)
|
||||||
|
font_big = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 16)
|
||||||
|
device.cleanup = lambda: None
|
||||||
|
|
||||||
|
|
||||||
|
def get_cpu():
|
||||||
|
with open('/proc/loadavg') as f:
|
||||||
|
parts = f.read().split()
|
||||||
|
load = float(parts[0])
|
||||||
|
cores = os.cpu_count() or 4
|
||||||
|
percent = (load / cores) * 100
|
||||||
|
return min(percent, 100), load
|
||||||
|
|
||||||
|
|
||||||
|
def get_ram():
|
||||||
|
with open('/proc/meminfo') as f:
|
||||||
|
lines = f.readlines()
|
||||||
|
mem_total = int([l for l in lines if 'MemTotal' in l][0].split()[1])
|
||||||
|
mem_avail = int([l for l in lines if 'MemAvailable' in l][0].split()[1])
|
||||||
|
used = mem_total - mem_avail
|
||||||
|
return used / mem_total * 100, used // 1024, mem_total // 1024
|
||||||
|
|
||||||
|
|
||||||
|
def get_temp():
|
||||||
|
try:
|
||||||
|
with open('/sys/class/thermal/thermal_zone0/temp') as f:
|
||||||
|
return int(f.read()) / 1000
|
||||||
|
except:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
while True:
|
||||||
|
cpu_pct, load = get_cpu()
|
||||||
|
ram_pct, used_mb, total_mb = get_ram()
|
||||||
|
temp = get_temp()
|
||||||
|
|
||||||
|
img = Image.new('1', device.size, 'black')
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
|
||||||
|
draw.rectangle((0, 0, 127, 63), outline='white', fill='black')
|
||||||
|
|
||||||
|
# CPU bar
|
||||||
|
bar_w = 90
|
||||||
|
bar_h = 12
|
||||||
|
draw.rectangle((32, 4, 32 + bar_w, 4 + bar_h), outline='white', fill='black')
|
||||||
|
fill_w = int(bar_w * cpu_pct / 100)
|
||||||
|
if fill_w > 0:
|
||||||
|
draw.rectangle((32 + 1, 4 + 1, 32 + fill_w, 4 + bar_h - 1), fill='white')
|
||||||
|
draw.text((2, 5), 'CPU', font=font, fill='white')
|
||||||
|
draw.text((32 + bar_w + 4, 3), f'{cpu_pct:.0f}%', font=font_big, fill='white')
|
||||||
|
draw.text((2, 20), f'Load: {load:.2f}', font=font, fill='white')
|
||||||
|
|
||||||
|
# RAM bar
|
||||||
|
draw.rectangle((32, 36, 32 + bar_w, 36 + bar_h), outline='white', fill='black')
|
||||||
|
fill_w2 = int(bar_w * ram_pct / 100)
|
||||||
|
if fill_w2 > 0:
|
||||||
|
draw.rectangle((32 + 1, 36 + 1, 32 + fill_w2, 36 + bar_h - 1), fill='white')
|
||||||
|
draw.text((2, 38), 'RAM', font=font, fill='white')
|
||||||
|
draw.text((32 + bar_w + 4, 36), f'{ram_pct:.0f}%', font=font_big, fill='white')
|
||||||
|
|
||||||
|
# Temp and PID at bottom
|
||||||
|
draw.text((2, 52), f'Temp: {temp:.1f}C', font=font, fill='white')
|
||||||
|
draw.text((72, 52), f'PID: {os.getpid()}', font=font, fill='white')
|
||||||
|
|
||||||
|
device.display(img)
|
||||||
|
time.sleep(1)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Визуальная схема расположения на дисплее:
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────┐
|
||||||
|
│ CPU ████████████████░░░░ 45% │
|
||||||
|
│ Load: 1.80 │
|
||||||
|
│ RAM ██████████░░░░░░░░ 32% │
|
||||||
|
│ Temp: 52.3C PID: 2535 │
|
||||||
|
└─────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Systemd-сервис для автостарта
|
||||||
|
|
||||||
|
Чтобы скрипт запускался автоматически при включении RPi5 и перезапускался при падении — используем systemd.
|
||||||
|
|
||||||
|
### 7.1. Создание сервиса
|
||||||
|
|
||||||
|
**Предварительно:** убедитесь, что модуль `i2c-dev` загружается при старте:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo i2c-dev | sudo tee /etc/modules-load.d/i2c-dev.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
Создать сервис:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo tee /etc/systemd/system/oled-display.service > /dev/null << 'EOF'
|
||||||
|
[Unit]
|
||||||
|
Description=OLED Display Service
|
||||||
|
After=multi-user.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=emb
|
||||||
|
ExecStart=/home/emb/oled-env/bin/python3 /home/emb/oled_cpu_mon.py
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
| Параметр | Значение | Пояснение |
|
||||||
|
|----------|----------|-----------|
|
||||||
|
| `User=emb` | emb | Запуск от вашего пользователя |
|
||||||
|
| `ExecStart` | venv/bin/python3 + скрипт | Полный путь к интерпретатору |
|
||||||
|
| `Restart=always` | — | Перезапуск при любом завершении |
|
||||||
|
| `RestartSec=5` | 5 | Пауза между перезапусками |
|
||||||
|
|
||||||
|
### 7.2. Активация и управление
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl daemon-reload # перечитать конфиги
|
||||||
|
sudo systemctl enable oled-display.service # автостарт при boot
|
||||||
|
sudo systemctl restart oled-display.service # запустить сейчас
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.3. Базовые команды
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Статус
|
||||||
|
sudo systemctl status oled-display.service
|
||||||
|
|
||||||
|
# Остановка
|
||||||
|
sudo systemctl stop oled-display.service
|
||||||
|
|
||||||
|
# Запуск
|
||||||
|
sudo systemctl start oled-display.service
|
||||||
|
|
||||||
|
# Отключение автостарта
|
||||||
|
sudo systemctl disable oled-display.service
|
||||||
|
|
||||||
|
# Логи
|
||||||
|
sudo journalctl -u oled-display.service -n 20
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.4. Смена скрипта
|
||||||
|
|
||||||
|
Чтобы переключить сервис на другой скрипт (например, со статического на монитор):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo sed -i 's|oled_show.py|oled_cpu_mon.py|' /etc/systemd/system/oled-display.service
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl restart oled-display.service
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.5. Обновление скрипта без простоя
|
||||||
|
|
||||||
|
Если сервис уже работает:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl stop oled-display.service
|
||||||
|
# редактируем /home/emb/oled_cpu_mon.py
|
||||||
|
sudo systemctl restart oled-display.service
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Решение проблем
|
||||||
|
|
||||||
|
### 8.1. Дисплей пустой после запуска
|
||||||
|
|
||||||
|
**Причина:** деструктор luma.oled отключает дисплей.
|
||||||
|
|
||||||
|
**Решение:** `device.cleanup = lambda: None` перед выходом из скрипта.
|
||||||
|
|
||||||
|
### 8.2. I2C device not found после перезагрузки (стартовая гонка)
|
||||||
|
|
||||||
|
**Симптом:** сервис падает в логах с `I2C device not found: /dev/i2c-1`, хотя после ручного запуска всё работает.
|
||||||
|
|
||||||
|
**Причина:** systemd запускает сервис до загрузки модуля `i2c-dev`.
|
||||||
|
|
||||||
|
**Решение:** добавить ожидание устройства в скрипте:
|
||||||
|
|
||||||
|
```python
|
||||||
|
import os, time
|
||||||
|
for attempt in range(30):
|
||||||
|
if os.path.exists('/dev/i2c-1'):
|
||||||
|
break
|
||||||
|
time.sleep(1)
|
||||||
|
else:
|
||||||
|
raise RuntimeError('I2C device /dev/i2c-1 not found after 30s')
|
||||||
|
```
|
||||||
|
|
||||||
|
Также можно загружать модуль принудительно: `echo i2c-dev | sudo tee /etc/modules-load.d/i2c-dev.conf`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo /usr/sbin/i2cdetect -y 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Если адрес не отображается:
|
||||||
|
- Проверьте физическое подключение пинов SDA/SCL/3.3V/GND
|
||||||
|
- Включите I2C в `/boot/firmware/config.txt` и перезагрузите
|
||||||
|
- Проверьте `ls /dev/i2c*` — если шины нет, загрузите модуль: `sudo modprobe i2c-dev`
|
||||||
|
|
||||||
|
### 8.3. pip install не работает
|
||||||
|
|
||||||
|
Ошибка: `error: externally-managed-environment`
|
||||||
|
|
||||||
|
**Причина:** Raspberry Pi OS Bookworm включает PEP 668.
|
||||||
|
|
||||||
|
**Решение:** всегда используйте venv.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 -m venv ~/oled-env
|
||||||
|
source ~/oled-env/bin/activate
|
||||||
|
pip install luma.oled Pillow
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.4. i2cdetect: command not found
|
||||||
|
|
||||||
|
**Причина:** `/usr/sbin/` не в PATH обычного пользователя.
|
||||||
|
|
||||||
|
**Решение:** `sudo /usr/sbin/i2cdetect -y 1`
|
||||||
|
|
||||||
|
### 8.5. systemd-сервис падает
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo journalctl -u oled-display.service -n 20
|
||||||
|
```
|
||||||
|
|
||||||
|
Типичные ошибки:
|
||||||
|
- `SyntaxError` — проверьте скрипт на синтаксис
|
||||||
|
- `ModuleNotFoundError` — проверьте путь в `ExecStart` (должен вести к python из venv)
|
||||||
|
- `PermissionError` — файл скрипта должен быть читаемым для пользователя
|
||||||
|
|
||||||
|
### 8.6. Дисплей показывает мусор/рябь
|
||||||
|
|
||||||
|
- Сделайте полную инициализацию контроллера (последовательность 0xAE ... 0xAF)
|
||||||
|
- Проверьте питание — 3.3V стабильно?
|
||||||
|
- Убедитесь что нет конфликта адресов (другие I2C устройства на той же шине)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Приложение: полный код скриптов
|
||||||
|
|
||||||
|
### 9.1. static_text.py — статический текст
|
||||||
|
|
||||||
|
Полный код доступен в файле `/home/emb/oled_show.py` на целевой системе.
|
||||||
|
|
||||||
|
### 9.2. cpu_mon.py — монитор CPU/RAM/Температура
|
||||||
|
|
||||||
|
Полный код доступен в файле `/home/emb/oled_cpu_mon.py` на целевой системе.
|
||||||
|
|
||||||
|
Создано: Hermes Agent · Raspberry Pi 5 · Debian Bookworm · SSD1306 128×64 I2C
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
Gitea Hermes token
|
||||||
|
ea5b73c654a2d836341e67a2e78e5ac959961006
|
||||||
|
|
||||||
|
hermes webhook
|
||||||
|
3MfprNofyxdPWUuEM368vLW3aMru5nQYGUDfBTg9YM0
|
||||||
|
|
||||||
|
|
||||||
|
http://192.168.1.111:3000/embeddevio/awg-dash.git
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
# Настройка Amnezia VPN на роутере Keenetic Giga KN-1011
|
||||||
|
|
||||||
|
Роутер Keenetic Giga (KN-1011) под управлением KeeneticOS поддерживает подключение к VPN через протоколы **OpenVPN** и **WireGuard**. Amnezia VPN умеет экспортировать конфигурации в оба формата, что позволяет подключить роутер к вашему собственному VPN-серверу, развёрнутому через Amnezia.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Экспорт конфигурации из Amnezia VPN
|
||||||
|
|
||||||
|
### 1.1. На устройстве, где установлен Amnezia VPN
|
||||||
|
|
||||||
|
1. Откройте приложение **Amnezia VPN**.
|
||||||
|
2. Перейдите на вкладку **Сервер** (Server) / **Подключения** (Connections).
|
||||||
|
3. Нажмите кнопку **Поделиться** (Share) / **Экспорт** (Export) рядом с вашим подключением.
|
||||||
|
4. Выберите формат экспорта:
|
||||||
|
|
||||||
|
| Если роутер использует | Выберите формат |
|
||||||
|
|------------------------|----------------|
|
||||||
|
| OpenVPN | **For OpenVPN connection** (`.ovpn`) |
|
||||||
|
| WireGuard (родной) | **For WireGuard connection** (`.conf`) |
|
||||||
|
|
||||||
|
> **Протокол AmneziaWG (awg) НЕ поддерживается роутером Keenetic.**
|
||||||
|
> Если у вас включён AmneziaWG, временно переключитесь в приложении на обычный WireGuard или OpenVPN, экспортируйте конфиг, затем можно вернуть обратно.
|
||||||
|
|
||||||
|
5. Сохраните полученный файл на компьютер (`.ovpn` или `.conf`).
|
||||||
|
|
||||||
|
### 1.2. Если доступна только ссылка `vpn://`
|
||||||
|
|
||||||
|
На серверах Amnezia Self-hosted и Premium иногда конфиг выдаётся в виде URI `vpn://...`. Его нужно преобразовать: откройте этот URI в приложении Amnezia, выберите нужный протокол (OpenVPN или WireGuard), после чего экспортируйте как описано выше.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Установка необходимого компонента на роутере
|
||||||
|
|
||||||
|
Зайдите в веб-интерфейс роутера:
|
||||||
|
- **Адрес:** `http://my.keenetic.net` или `http://192.168.1.1`
|
||||||
|
- **Логин/пароль:** по умолчанию `admin` / `1234` (если не меняли)
|
||||||
|
|
||||||
|
### 2.1. Для OpenVPN
|
||||||
|
|
||||||
|
1. Перейдите: **Управление** → **Общие настройки системы** (или **System Settings**).
|
||||||
|
2. В блоке **Обновление KeeneticOS и компонентов** нажмите **Выбор компонентов** (Component options).
|
||||||
|
3. Найдите компонент **OpenVPN-клиент и сервер** (OpenVPN client and server).
|
||||||
|
4. Установите флажок и нажмите **Сохранить**.
|
||||||
|
5. Роутер скачает и установит компонент (может потребоваться перезагрузка).
|
||||||
|
|
||||||
|
### 2.2. Для WireGuard
|
||||||
|
|
||||||
|
1. Перейдите: **Управление** → **Общие настройки системы**.
|
||||||
|
2. Нажмите **Выбор компонентов**.
|
||||||
|
3. Найдите компонент **WireGuard VPN**.
|
||||||
|
4. Установите флажок → **Сохранить**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Создание VPN-подключения
|
||||||
|
|
||||||
|
### 3.1. Через OpenVPN (.ovpn)
|
||||||
|
|
||||||
|
1. Откройте экспортированный файл `.ovpn` в любом текстовом редакторе (Блокнот, Notepad++).
|
||||||
|
2. Выделите ВЕСЬ текст файла (Ctrl+A) и скопируйте (Ctrl+C).
|
||||||
|
|
||||||
|
3. В веб-интерфейсе роутера перейдите:
|
||||||
|
**Интернет** → **Другие подключения** (Other connections).
|
||||||
|
|
||||||
|
4. В блоке **VPN-подключения** нажмите **Создать подключение** (Create connection).
|
||||||
|
|
||||||
|
5. Заполните:
|
||||||
|
|
||||||
|
| Поле | Значение |
|
||||||
|
|-------------------------|----------|
|
||||||
|
| **Использовать для выхода в интернет** | ☑ (включить) |
|
||||||
|
| **Имя подключения** | Например `Amnezia-OVPN` |
|
||||||
|
| **Тип (протокол)** | **OpenVPN** |
|
||||||
|
| **Конфигурация OpenVPN** | Вставьте скопированный текст (Ctrl+V) |
|
||||||
|
| **Получать маршруты с удалённой стороны** | ☑ (включить) |
|
||||||
|
|
||||||
|
6. При необходимости нажмите **Показать дополнительные настройки** и укажите:
|
||||||
|
- **Подключаться через** → «Любое интернет-подключение»
|
||||||
|
- **Расписание работы** → выключить (или настроить по желанию)
|
||||||
|
|
||||||
|
7. Нажмите **Сохранить**, затем переведите переключатель в положение **Вкл**.
|
||||||
|
|
||||||
|
#### Типичные проблемы с OpenVPN на Keenetic
|
||||||
|
|
||||||
|
| Ошибка в логе | Решение |
|
||||||
|
|--------------|---------|
|
||||||
|
| `auth-user-pass without inline credentials` | Найдите и удалите строку `auth-user-pass` — она должна быть заменена на блок `<auth-user-pass>...</auth-user-pass>` с логином и паролем внутри |
|
||||||
|
| `block-outside-dns` | Добавьте в конфиг строку: `pull-filter ignore "block-outside-dns"` |
|
||||||
|
| `cipher BF-CBC` / `keysize` | Замените `cipher BF-CBC` на: `data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305` и `data-ciphers-fallback AES-256-CBC` |
|
||||||
|
| `Unrecognized option: client-ip` | Добавьте: `ignore-unknown-option client-ip block-ipv6` |
|
||||||
|
|
||||||
|
> Лог OpenVPN доступен в веб-интерфейсе: **Диагностика** → **Системный журнал**, фильтр по `OpenVPN0`.
|
||||||
|
|
||||||
|
### 3.2. Через WireGuard (.conf)
|
||||||
|
|
||||||
|
Keenetic умеет импортировать WireGuard-конфигурацию напрямую из файла:
|
||||||
|
|
||||||
|
1. В веб-интерфейсе перейдите: **Интернет** → **Другие подключения**.
|
||||||
|
|
||||||
|
2. В блоке **WireGuard** нажмите **Импорт из файла** (Import from a file).
|
||||||
|
|
||||||
|
3. Выберите файл `.conf`, экспортированный из Amnezia.
|
||||||
|
|
||||||
|
4. После импорта нажмите **Сохранить**.
|
||||||
|
|
||||||
|
5. Включите подключение переключателем в положение **Вкл**.
|
||||||
|
|
||||||
|
Если импорт из файла недоступен (старая версия KeeneticOS), настройте вручную:
|
||||||
|
|
||||||
|
1. Нажмите **Создать подключение** → тип **WireGuard**.
|
||||||
|
2. Заполните поля из файла `.conf`:
|
||||||
|
|
||||||
|
| Поле в веб-интерфейсе | Значение из `.conf` |
|
||||||
|
|-----------------------|---------------------|
|
||||||
|
| Приватный ключ (PrivateKey) | `[Interface] PrivateKey = ...` |
|
||||||
|
| Адрес (Address) | `[Interface] Address = ...` |
|
||||||
|
| DNS-сервер (DNS) | `[Interface] DNS = ...` |
|
||||||
|
| Открытый ключ пира (Peer PublicKey) | `[Peer] PublicKey = ...` |
|
||||||
|
| Endpoint (адрес сервера:порт) | `[Peer] Endpoint = ...` |
|
||||||
|
| Разрешённые IP (AllowedIPs) | `[Peer] AllowedIPs = ...` |
|
||||||
|
| PersistentKeepalive | `[Peer] PersistentKeepalive = ...` |
|
||||||
|
|
||||||
|
3. Сохраните и включите.
|
||||||
|
|
||||||
|
> ⚠️ **Важно:** родной WireGuard на Keenetic **не поддерживает** параметры обфускации AmneziaWG (`Jc`, `Jmin`, `Jmax`, `S1`, `S2`, `H1`–`H4`). Если в вашем конфиге есть эти параметры — используйте OpenVPN, либо переключитесь в Amnezia на обычный WireGuard перед экспортом.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Настройка приоритетов и политик трафика
|
||||||
|
|
||||||
|
Чтобы весь трафик роутера шёл через VPN:
|
||||||
|
|
||||||
|
1. Перейдите: **Интернет** → **Приоритеты подключений** (Connection priorities).
|
||||||
|
2. На вкладке **Правила по умолчанию**:
|
||||||
|
- Найдите созданное VPN-подключение
|
||||||
|
- Перетащите его мышью на самый верх списка
|
||||||
|
- Нажмите **Сохранить**
|
||||||
|
|
||||||
|
3. Если хотите направлять через VPN только определённые устройства:
|
||||||
|
- Перейдите на вкладку **Привязка политик** (Policy bindings)
|
||||||
|
- Создайте правило, выбрав устройство и нужное VPN-подключение
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Проверка подключения
|
||||||
|
|
||||||
|
1. Перейдите: **Диагностика** → **Ping**.
|
||||||
|
2. Введите `8.8.8.8` и нажмите **Проверить**.
|
||||||
|
3. Убедитесь, что пинг проходит.
|
||||||
|
4. Дополнительно проверьте внешний IP-адрес роутера на главной странице (должен совпадать с IP вашего VPN-сервера).
|
||||||
|
|
||||||
|
Просмотр статуса VPN:
|
||||||
|
- **Интернет** → **Другие подключения** — переключатель должен быть зелёным (Вкл).
|
||||||
|
- **Диагностика** → **Системный журнал** — поиск по `OpenVPN0` или `Wireguard0`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Если что-то не работает
|
||||||
|
|
||||||
|
| Симптом | Вероятная причина |
|
||||||
|
|---------|-------------------|
|
||||||
|
| Подключение не включается | Не установлен компонент OpenVPN/WireGuard в системе |
|
||||||
|
| OpenVPN: ошибка в логе | Несовместимая директива — см. таблицу в п. 3.1 |
|
||||||
|
| WireGuard: нет соединения | Конфиг содержит параметры AmneziaWG — используйте OpenVPN |
|
||||||
|
| VPN есть, но интернет не работает | Неправильные приоритеты подключений (п. 4) |
|
||||||
|
| Нет доступа к локальным ресурсам | В OpenVPN-конфиге `redirect-gateway` или в `AllowedIPs = 0.0.0.0/0` — роутер не видит локальную сеть. Используйте AllowedIPs по умолчанию от провайдера или отключите VPN для локальных адресов |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Сводка — что поддерживается на KN-1011
|
||||||
|
|
||||||
|
| Протокол | Поддержка | Способ подключения |
|
||||||
|
|----------|-----------|-------------------|
|
||||||
|
| **OpenVPN** (TUN, UDP/TCP) | ✅ Полная | Вставка текста `.ovpn` в поле конфигурации |
|
||||||
|
| **WireGuard** (обычный) | ✅ Полная | Импорт `.conf` файла или ручной ввод |
|
||||||
|
| **AmneziaWG** (awg) | ❌ **НЕ поддерживается** | Требуется OpenWRT с кастомным ядром |
|
||||||
|
| **OpenVPN over Cloak** | ❌ Не поддерживается | Только через сторонний клиент |
|
||||||
|
| **XRay (VLESS Reality)** | ❌ Не поддерживается | Только через сторонний клиент |
|
||||||
|
|
||||||
|
**Вывод:** для Keenetic используйте **OpenVPN** (рекомендуется) или обычный **WireGuard** без обфускации.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> **Источники:** официальная документация Keenetic (support.keenetic.com), документация Amnezia (docs.amnezia.org), GitHub amnezia-vpn/amnezia-client.
|
||||||
@@ -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