This commit is contained in:
2026-02-25 21:01:06 +03:00
parent b0d2746490
commit b532527f32
12 changed files with 719 additions and 42 deletions

View File

@@ -106,7 +106,17 @@ docker restart adguard
**Сеть:** proxy_network.
**Основные файлы конфигурации:**
- `services.yaml` — список сервисов, виджеты (NPM, AdGuard, Proxmox и др.), ссылки, пинги. Пароли и токены виджетов хранятся здесь (не коммитить в открытый репозиторий).
- `services.yaml` — список сервисов, виджеты (NPM, AdGuard, Proxmox и др.), ссылки, пинги. Пароли и токены виджетов хранятся здесь (не коммитить в открытый репозиторий). В список сервисов добавлен **Vaultwarden** (менеджер паролей на контейнере 103): ссылка на `https://vault.katykhin.ru` (если в NPM настроен proxy) или на `http://192.168.1.103:8280` (доступ по LAN по IP). Пример записи в `services.yaml`:
```yaml
- Vaultwarden
description: Менеджер паролей (Bitwarden-совместимый)
icon: vaultwarden.png
href: https://vault.katykhin.ru
target: _blank
```
(При использовании только LAN по IP укажите `href: http://192.168.1.103:8280`. Иконка: в [документации Homepage](https://gethomepage.dev/docs/services/) или локальный файл в `config/images/`.)
- `docker.yaml` — подключение к Docker через dockerproxy (host/port).
- `settings.yaml`, `widgets.yaml`, `bookmarks.yaml`, `custom.css`, `proxmox.yaml`, `kubernetes.yaml` при необходимости.
@@ -254,5 +264,6 @@ docker logs vpn-route-check
## Связь с другими документами
- [Архитектура и подключение](../architecture/architecture.md) — таблица контейнеров, домены, схема сети.
- [Контейнер 103 (Gitea, Vaultwarden)](container-103.md) — сервис Vaultwarden (менеджер паролей), добавляемый на дашборд Homepage.
- [Выпуск сертификата Let's Encrypt (DNS-01)](../network/ssl-letsencrypt-dns01.md) — certbot, Beget API, интеграция с NPM.
- [Роутер Netcraze Speedster](../network/router-netcraze-speedster.md) — VPN и telnet, используемые vpn-route-check.

View File

@@ -1,4 +1,4 @@
# Контейнер 103 (Gitea): Gitea, PostgreSQL, act_runner, CouchDB (Obsidian)
# Контейнер 103 (Gitea): Gitea, PostgreSQL, act_runner, CouchDB (Obsidian), Vaultwarden
Подробное описание LXC-контейнера **103** на Proxmox (192.168.1.103): Git-сервер Gitea с Actions (runner), база PostgreSQL, CouchDB для синхронизации Obsidian (домен obsidian.katykhin.ru).
@@ -21,15 +21,17 @@
- **Debian (CT 103):** логин `root` (пароль — в менеджере паролей или как настраивал при установке).
- **Gitea (веб):** http://192.168.1.103:3000 (или через NPM по домену git.katykhin.ru, если настроен). Учётные записи — пользователи Gitea. Репозитории могут иметь origin на Gitea; при необходимости пуш в GitHub — отдельный remote (например `github`), команда вида `git push github main`.
- **CouchDB (Obsidian sync):** http://192.168.1.103:5984. Админ (пользователь **obsidian**) и пароль заданы в `/opt/docker/couchdb/local.d/local.ini` (секция `[admins]`); клиент Obsidian подключается по URL и своим учётным данным.
- **Vaultwarden (менеджер паролей):** http://192.168.1.103:8280 (только LAN, без домена). Админ-доступ по токену `ADMIN_TOKEN` из `/opt/docker/vaultwarden/.env` (файл только на сервере, не коммитить).
---
## Сервисы (Docker)
Два независимых набора сервисов:
Три набора сервисов:
1. **Gitea (compose)** — в `/opt/gitea/`: Gitea, PostgreSQL, act_runner. Сеть **gitea_default**.
2. **CouchDB** — запущен отдельным контейнером (без compose в репозитории), данные в `/opt/docker/couchdb/`.
3. **Vaultwarden (compose)** — в `/opt/docker/vaultwarden/`: менеджер паролей Vaultwarden (совместим с клиентами Bitwarden).
| Контейнер | Образ | Порты (хост) | Назначение |
|-----------------|--------------------------|------------------|------------|
@@ -37,6 +39,7 @@
| gitea-db-1 | postgres:16-alpine | — | БД Gitea |
| gitea-runner-1 | gitea/act_runner:latest | — | Gitea Actions (CI) |
| couchdb | couchdb:3 | 5984 | Бэкенд синхронизации Obsidian (obsidian.katykhin.ru) |
| vaultwarden | vaultwarden/server:latest | 8280 | Менеджер паролей Vaultwarden (Bitwarden-совместимый), доступ из LAN |
---
@@ -131,6 +134,59 @@ curl -s http://192.168.1.103:5984/
---
## 5. Vaultwarden (менеджер паролей)
**Назначение:** self-hosted менеджер паролей (совместим с официальными клиентами Bitwarden) для хранения всех кредов (Proxmox, контейнеры, БД, API-ключи и т.д.).
**Каталог:** `/opt/docker/vaultwarden/`
**Compose:** `docker-compose.yml`. Запуск/обновление:
```bash
cd /opt/docker/vaultwarden
docker compose pull
docker compose up -d
```
**Образ:** `vaultwarden/server:latest`.
**Порты:**
- 8280 (хост) → 80 (контейнер).
**Доступ в локальной сети:** с любого устройства в LAN (192.168.1.x) Vaultwarden уже доступен по адресу **`http://192.168.1.103:8280`** — дополнительная настройка не нужна. Клиенты Bitwarden на домашних устройствах можно настроить на этот URL.
**Доступ по домену (опционально):** если нужен **https://vault.katykhin.ru** и из LAN, и по VPN, в NPM (контейнер 100) настраивают:
- **Proxy Host:** `vault.katykhin.ru` → upstream `192.168.1.103:8280`, включить SSL (Let's Encrypt или custom).
- **Access List:** создать список, разрешающий только подсети **192.168.1.0/24** (LAN) и **10.10.99.0/24** (WireGuard VPN); для всех остальных — отказ. Эту access list привязать к proxy host `vault.katykhin.ru`. Тогда с интернета без VPN доступ к домену будет закрыт; из дома и по VPN — открыт.
- В compose Vaultwarden при использовании домена задать `DOMAIN=https://vault.katykhin.ru` и перезапустить контейнер.
**Тома:**
- `/opt/docker/vaultwarden/data``/data` (все данные Vaultwarden: база, вложения, и т.п.).
**Переменные окружения (compose):**
- `WEBSOCKET_ENABLED=true` — включает поддержку веб-сокетов.
- `SIGNUPS_ALLOWED=false` — запрещает свободную регистрацию; пользователей создаёт админ.
- `INVITATIONS_ALLOWED=true` — разрешает приглашения.
- `DOMAIN=http://192.168.1.103:8280` — базовый URL (для LAN; при выдаче наружу поменять на `https://<домен>`).
- `ROCKET_PORT=80`, `ROCKET_ADDRESS=0.0.0.0` — HTTP-сервер внутри контейнера.
- `TZ=Europe/Moscow` — часовой пояс.
**Файл `.env` (секреты):**
- Путь: `/opt/docker/vaultwarden/.env`.
- В нём как минимум задаётся `ADMIN_TOKEN=<случайный токен>` для доступа к админке.
- Файл создаётся на хосте (права `600`), **не коммитить** в репозиторий и не копировать в открытые места.
**Проверка работы:**
```bash
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Ports}}' | grep vaultwarden
curl -s http://127.0.0.1:8280/ | head -c 200
```
После этого интерфейс открывается по **`http://192.168.1.103:8280`** из домашней сети. Клиенты Bitwarden (ПК, телефон в LAN) настраивают на этот URL — сервис уже открыт в локальной сети без NPM. Если позже добавить домен в NPM (см. выше), в клиентах можно перейти на `https://vault.katykhin.ru`.
---
## Порты (сводка на хосте)
| Порт | Сервис / примечание |
@@ -138,6 +194,7 @@ curl -s http://192.168.1.103:5984/
| 3000 | Gitea (веб) |
| 2222 | Gitea (SSH для git) |
| 5984 | CouchDB (Obsidian sync) |
| 8280 | Vaultwarden (менеджер паролей, HTTP по IP из LAN) |
---

View File

@@ -0,0 +1,203 @@
# Контейнер 109 (local-vpn): локальный WireGuard VPN
Подробное описание LXC-контейнера **109** на Proxmox (192.168.1.109): локальный VPN-сервер на WireGuard для доступа к внутренней сети и сервисам (в т.ч. Vaultwarden) только через зашифрованный туннель.
---
## Общие сведения
- **Хостнейм:** local-vpn
- **ID:** 109
- **IP:** 192.168.1.109/24
- **ОС:** Debian 12 (bookworm)
- **Ресурсы:** 1 core, 256 MB RAM, 1 GB диск на `local-lvm`
- **Доступ:** с Proxmox — `ssh root@192.168.1.150``pct exec 109 -- bash`.
Назначение контейнера — поднимать локальный WireGuard, через который:
- клиенты (iOS/macOS) получают доступ к сети `192.168.1.0/24` (LAN),
- DNS внутри VPN идёт через AdGuard на CT 100 (`192.168.1.100`),
- доступ к Vaultwarden (`vault.katykhin.ru` → NPM → 192.168.1.103:8280) можно ограничить **только через этот VPN** (ограничение на уровне NPM/фаервола, см. соответствующую документацию).
---
## Создание контейнера
Контейнер создан на Proxmox командой вида (выполнено на хосте 192.168.1.150):
```bash
pct create 109 local:vztmpl/debian-12-standard_12.12-1_amd64.tar.zst \
--hostname local-vpn \
--cores 1 \
--memory 256 \
--rootfs local-lvm:1 \
--net0 name=eth0,bridge=vmbr0,ip=192.168.1.109/24,gw=192.168.1.1,firewall=1 \
--features keyctl=1,nesting=1
pct start 109
```
---
## WireGuard (wg0) внутри контейнера
### Пакеты и подготовка
Внутри CT 109:
```bash
apt-get update
apt-get install -y wireguard-tools iptables
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-wg-forward.conf
sysctl -p /etc/sysctl.d/99-wg-forward.conf
```
### Ключи и конфиг
Ключи сервера и клиентов лежат в `/etc/wireguard/` (файлы `server.key/.pub`, `ios.key/.pub`, `macos.key/.pub`).
Основной конфиг интерфейса — `/etc/wireguard/wg0.conf`:
```ini
[Interface]
Address = 10.10.99.1/24
ListenPort = 43123
PrivateKey = <server-private-key>
# Включение форвардинга LAN <-> VPN с NAT
PostUp = iptables -A FORWARD -i wg0 -o eth0 -s 10.10.99.0/24 -d 192.168.1.0/24 -j ACCEPT; \
iptables -A FORWARD -i eth0 -o wg0 -d 10.10.99.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT; \
iptables -t nat -A POSTROUTING -s 10.10.99.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -o eth0 -s 10.10.99.0/24 -d 192.168.1.0/24 -j ACCEPT; \
iptables -D FORWARD -i eth0 -o wg0 -d 10.10.99.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT; \
iptables -t nat -D POSTROUTING -s 10.10.99.0/24 -o eth0 -j MASQUERADE
[Peer]
# iOS
PublicKey = <ios-public-key>
AllowedIPs = 10.10.99.2/32
[Peer]
# macOS
PublicKey = <macos-public-key>
AllowedIPs = 10.10.99.3/32
```
- **Серверный адрес:** `10.10.99.1/24` (подсеть VPN).
- **Порт WireGuard:** `43123/UDP`.
- **NAT:** MASQUERADE на выход в `192.168.1.0/24`, чтобы не настраивать статические маршруты на роутере.
### Запуск и автозапуск
```bash
wg-quick up wg0 # ручной запуск
wg show # проверить состояние
systemctl enable wg-quick@wg0 # автозапуск при старте CT
systemctl start wg-quick@wg0
```
Проверка интерфейса:
```bash
ip a show wg0
```
Ожидаемый адрес: `10.10.99.1/24`.
---
## Конфиги клиентов (split-tunnel + DNS через AdGuard)
Клиентские конфиги удобно хранить в `/etc/wireguard/clients/` внутри CT (и оттуда забирать на устройства).
### Базовые параметры для всех клиентов
- **Адрес клиента в VPN:** `10.10.99.X/32` (уникальный для каждого устройства).
- **DNS:** `192.168.1.100` (AdGuard на CT 100).
- **Endpoint сервера:** `185.35.193.144:43123` (внешний IP + порт, проброшенный на CT 109).
- **Split tunnel:**
- `AllowedIPs = 10.10.99.0/24, 192.168.1.0/24`
→ через VPN идут только:
- сама VPN-подсеть `10.10.99.0/24`,
- внутренняя сеть `192.168.1.0/24` (все домашние сервисы, в т.ч. NPM и Vaultwarden).
Весь остальной интернет идёт **напрямую** у клиента.
Пример для iOS:
```ini
[Interface]
Address = 10.10.99.2/32
PrivateKey = <ios-private-key>
DNS = 192.168.1.100
[Peer]
PublicKey = <server-public-key>
Endpoint = 185.35.193.144:43123
AllowedIPs = 10.10.99.0/24, 192.168.1.0/24
PersistentKeepalive = 25
```
Пример для macOS:
```ini
[Interface]
Address = 10.10.99.3/32
PrivateKey = <macos-private-key>
DNS = 192.168.1.100
[Peer]
PublicKey = <server-public-key>
Endpoint = 185.35.193.144:43123
AllowedIPs = 10.10.99.0/24, 192.168.1.0/24
PersistentKeepalive = 25
```
> **Важно:** реальные ключи (`PrivateKey`, `PublicKey`) хранятся только в контейнере (`/etc/wireguard/*.key/.pub`) и **не попадают** в этот репозиторий. В примерах выше использовать плейсхолдеры и заменять их актуальными значениями при выдаче конфигов на устройства.
---
## Firewall и ограничения доступа к Vaultwarden (общая схема)
Идея ограничения доступа:
- **На роутере (192.168.1.1):**
- открыть только UDP-порт `43123`,
- пробросить его на `192.168.1.109:43123` (CT 109),
- остальные порты для CT 109 снаружи не открывать.
- **На Proxmox firewall (уровень ноды / CT 109):**
- разрешить входящий `UDP 43123` к CT 109,
- разрешить ESTABLISHED/RELATED,
- разрешить исходящий трафик из CT 109 в LAN (`192.168.1.0/24`) и к нужным внешним DNS (если потребуется).
- **На уровне NPM (CT 100) / Vaultwarden (CT 103):**
- создать proxy host `vault.katykhin.ru` → upstream `192.168.1.103:8280`,
- ограничить доступ к этому хосту **только из VPN** — либо по исходному адресу (подсеть WireGuard `10.10.99.0/24`, если используется маршрутизация без NAT), либо по IP сервера VPN (`192.168.1.109`, если используется NAT в CT 109),
- отключить доступ к Vaultwarden из LAN напрямую по домену (и при желании по IP).
Точная реализация правил на роутере и в NPM описывается в соответствующих документах (`router-netcraze-speedster`, `container-100` / NPM); здесь зафиксирована лишь роль контейнера 109 и параметры WireGuard.
---
## On-Demand для iOS/macOS
Для автоматического включения VPN **вне домашнего WiFi** используется профиль `.mobileconfig` с правилами On-Demand. Подробно: [Генерация .mobileconfig для WireGuard VPN (On-Demand)](../network/vpn-mobileconfig-wireguard.md).
- если подключен WiFi с SSID из списка (например `HomeWiFi`) → VPN **отключён**;
- во всех остальных случаях (другой WiFi, сотовые данные) → VPN **включается автоматически**.
**macOS:** профиль `wireguard-macos-ondemand.mobileconfig`. Перед установкой замени `HomeWiFi` на реальный SSID домашней сети (секция `OnDemandRules``SSIDMatch`). Установка: двойной клик по файлу → «Системные настройки» → «Профили» → установить. Туннель появится в приложении WireGuard.
**iOS:** профиль `wireguard-ios-ondemand.mobileconfig`. То же правило: замени `HomeWiFi` на SSID домашней сети. Установка: отправить файл на iPhone (AirDrop, почта, файлы) → открыть → «Установить» в предложенном профиле → при необходимости «Настройки» → «Основные» → «VPN и управление устройством» → установить профиль. Туннель «Local VPN (WireGuard)» появится в приложении WireGuard; включи один раз вручную, далее On-Demand будет управлять подключением.
Оба файла содержат приватные ключи и добавлены в `.gitignore` — в репозиторий не коммитить.
---
## Связь с другими документами
- [Архитектура и подключение](../architecture/architecture.md) — общее описание хостов, IP, доменов (контейнер 109 нужно добавить как исключение ID ↔ IP при необходимости).
- [Контейнер 100 (NPM)](container-100.md) — настройка proxy host `vault.katykhin.ru` и ограничение доступа только через VPN.
- [Контейнер 103 (Vaultwarden)](container-103.md) — сам сервис Vaultwarden и доступ по `192.168.1.103:8280` из LAN/VPN.
- [Роутер Netcraze Speedster](../network/router-netcraze-speedster.md) — проброс UDP 43123 и общие правила фаервола/маршрутизации.