Files
K3S/docs/addons.md
Sergey Antropoff e9e0ffa3c2 refactor: переименовать аддон ext-proxy → ingress-proxypass
- addons/ext-proxy/ → addons/ingress-proxypass/ (git mv, история сохранена)
- Все переменные Ansible: ext_proxy_* → ingress_proxypass_*
- Все имена ресурсов K8s: ext-proxy → ingress-proxypass (namespace, chart, release)
- Helm-хелперы: "ext-proxy.*" → "ingress-proxypass.*"
- Makefile: addon-ext-proxy → addon-ingress-proxypass
- group_vars/all/addons.yml: addon_ext_proxy → addon_ingress_proxypass
- playbooks/addons.yml: обновлена ссылка на роль
- docs/addons.md, README.md: обновлены все упоминания
2026-04-26 07:32:02 +03:00

305 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Аддоны
Все аддоны управляются через флаги в `group_vars/all/addons.yml`. Порядок установки в `playbooks/addons.yml` фиксирован (NFS → CSI → Ingress → cert-manager → остальные).
## Установка аддонов
```bash
# Установить все включённые аддоны:
make install-addons
# Конкретный аддон (флаг из addons.yml игнорируется):
make addon-<name>
# Примеры:
make addon-prometheus-stack
make addon-argocd
make addon-jenkins
make addon-netbird
```
## Каталог аддонов
| Аддон | Флаг | Описание | README |
|---|---|---|---|
| **Сеть** | | | |
| ingress-nginx | `addon_ingress_nginx` | HTTP/S Ingress controller | [](../addons/ingress-nginx/README.md) |
| cert-manager | `addon_cert_manager` | TLS сертификаты (Let's Encrypt / self-signed) | [](../addons/cert-manager/README.md) |
| istio | `addon_istio` | Service mesh + Kiali UI | [](../addons/istio/README.md) |
| netbird | `addon_netbird` | Self-hosted WireGuard VPN | [](../addons/netbird/README.md) |
| crowdsec | `addon_crowdsec` | IDS/IPS, nginx bouncer | [](../addons/crowdsec/README.md) |
| **Хранилище** | | | |
| nfs-server | `addon_nfs_server` | NFS сервер | [](../addons/nfs-server/README.md) |
| csi-nfs | `addon_csi_nfs` | CSI NFS Driver + StorageClass | [](../addons/csi-nfs/README.md) |
| longhorn | `addon_longhorn` | Distributed block storage | [](../addons/longhorn/README.md) |
| minio | `addon_minio` | S3-совместимое объектное хранилище | [](../addons/minio/README.md) |
| csi-s3 | `addon_csi_s3` | S3/MinIO как PVC | [](../addons/csi-s3/README.md) |
| csi-ceph | `addon_csi_ceph` | Rook-Ceph distributed storage | [](../addons/csi-ceph/README.md) |
| csi-glusterfs | `addon_csi_glusterfs` | GlusterFS CSI driver | [](../addons/csi-glusterfs/README.md) |
| **Базы данных** | | | |
| postgresql | `addon_postgresql` | PostgreSQL (shared для аддонов) | [](../addons/postgresql/README.md) |
| mysql | `addon_mysql` | MySQL (Bitnami) | [](../addons/mysql/README.md) |
| databasus | `addon_databasus` | Web UI для бэкапов БД | [](../addons/databasus/README.md) |
| **Observability** | | | |
| metrics-server | `addon_metrics_server` | kubectl top + HPA | [](../addons/metrics-server/README.md) |
| prometheus-stack | `addon_prometheus_stack` | Prometheus + Grafana + Alertmanager | [](../addons/prometheus-stack/README.md) |
| loki | `addon_loki` | Агрегация логов | [](../addons/loki/README.md) |
| promtail | `addon_promtail` | Агент сбора логов → Loki | [](../addons/promtail/README.md) |
| tempo | `addon_tempo` | Distributed tracing | [](../addons/tempo/README.md) |
| pushgateway | `addon_pushgateway` | Метрики batch-задач | [](../addons/pushgateway/README.md) |
| **CI/CD** | | | |
| jenkins | `addon_jenkins` | Jenkins CI/CD + k8s agents | [](../addons/jenkins/README.md) |
| gitea | `addon_gitea` | Git hosting + Gitea Actions | [](../addons/gitea/README.md) |
| argocd | `addon_argocd` | GitOps (ArgoCD) | [](../addons/argocd/README.md) |
| **Безопасность** | | | |
| vault | `addon_vault` | HashiCorp Vault | [](../addons/vault/README.md) |
| external-secrets | `addon_external_secrets` | External Secrets Operator → Vault | [](../addons/external-secrets/README.md) |
| vaultwarden | `addon_vaultwarden` | Self-hosted Bitwarden | [](../addons/vaultwarden/README.md) |
| **Инфраструктура** | | | |
| harbor | `addon_harbor` | Container registry + proxy cache | [](../addons/harbor/README.md) |
| kubernetes-dashboard | `addon_kubernetes_dashboard` | K8S Web UI | [](../addons/kubernetes-dashboard/README.md) |
| velero | `addon_velero` | Бэкап кластера + PVC в S3 | [](../addons/velero/README.md) |
| smtp-relay | `addon_smtp_relay` | Postfix relay для email из подов | [](../addons/smtp-relay/README.md) |
| **Файловые хранилища** | | | |
| nextcloud | `addon_nextcloud` | Nextcloud облачное хранилище | [](../addons/nextcloud/README.md) |
| owncloud | `addon_owncloud` | ownCloud OCIS | [](../addons/owncloud/README.md) |
| **Медиасервер** | | | |
| mediaserver | `addon_mediaserver` | Plex, Sonarr, Radarr, Lidarr, Bazarr, Prowlarr + Hysteria2 sidecar, Overseerr, Transmission, Samba | [](../addons/mediaserver/README.md) |
| **Сеть / VPN** | | | |
| splitgw | `addon_splitgw` | Прозрачный split-tunnel gateway: sing-box + Hysteria2 TPROXY, YouTube→прокси, RU→прямой | [](../addons/splitgw/README.md) |
| ingress-proxypass | `addon_ingress_proxypass` | Проксировать внешние сервисы (IP:PORT) через ingress-nginx по домену — Service + Endpoints + Ingress | [](../addons/ingress-proxypass/README.md) |
## Конфигурация addons.yml
```yaml
# group_vars/all/addons.yml — включи нужные аддоны:
# ── Core ──────────────────────────────────────────────────────────────────────
addon_ingress_nginx: true # обязателен для большинства аддонов
addon_cert_manager: true # TLS сертификаты
addon_metrics_server: true # kubectl top + HPA
# ── Observability ─────────────────────────────────────────────────────────────
addon_prometheus_stack: true # Prometheus + Grafana + Alertmanager
addon_loki: true # логи
addon_promtail: true # агент сбора логов
addon_tempo: false # distributed tracing
addon_pushgateway: false # batch метрики
# ── Хранилище ─────────────────────────────────────────────────────────────────
addon_longhorn: false # distributed block storage
addon_minio: false # S3 объектное хранилище
addon_csi_s3: false # S3 как PVC
# ── Базы данных ───────────────────────────────────────────────────────────────
addon_postgresql: false # shared PostgreSQL
addon_mysql: false
# ── CI/CD ─────────────────────────────────────────────────────────────────────
addon_gitea: false
addon_jenkins: false
addon_argocd: false
# ── Безопасность ──────────────────────────────────────────────────────────────
addon_vault: false
addon_external_secrets: false
addon_vaultwarden: false
addon_crowdsec: false
# ── Инфраструктура ────────────────────────────────────────────────────────────
addon_harbor: false
addon_velero: false
addon_netbird: false
addon_smtp_relay: false
# ── Медиасервер ───────────────────────────────────────────────────────────────
addon_mediaserver: false # Plex + *arr + Transmission + Prowlarr/Hysteria2 + Samba
# ── Split Gateway ─────────────────────────────────────────────────────────────
addon_splitgw: false # sing-box + Hysteria2 TPROXY (host или k8s DaemonSet)
# ── External Services Ingress Proxy ───────────────────────────────────────────
addon_ingress_proxypass: false # проксировать внешние сервисы через ingress-nginx
```
## Зависимости между аддонами
| Аддон | Зависит от | Автоинтеграция |
|---|---|---|
| `promtail` | `loki` | URL Loki берётся автоматически |
| `loki` | `minio` (опционально) | S3 backend при addon_minio: true |
| `velero` | `minio` | S3 backend для бэкапов |
| `csi-s3` | `minio` (опционально) | Endpoint берётся автоматически |
| `gitea` | `postgresql` (опционально) | Своя БД при addon_postgresql: true |
| `harbor` | `postgresql` (опционально) | Своя БД при addon_postgresql: true |
| `nextcloud` | `postgresql` (опционально) | Своя БД при addon_postgresql: true |
| `databasus` | `postgresql`, `mysql`, `minio` | Все подключения автоматические |
| `jenkins` | `vault` (опционально) | JCasC Vault URL при addon_vault: true |
| `external-secrets` | `vault` | ClusterSecretStore к Vault |
| `istio` | `prometheus-stack` (опционально) | Kiali ↔ Prometheus/Grafana авто |
| `crowdsec` | `ingress-nginx` | Bouncer интеграция при addon_crowdsec |
| `mediaserver` | `csi-nfs` (рекомендуется) | Shared PVC требует RWX StorageClass |
| `splitgw` | Hysteria2 сервер (vault_hysteria2_url) | URL из Shadowrocket / NekoBox |
| `ingress-proxypass` | `ingress-nginx` | Требует работающий Ingress controller |
## MediaServer
Полный self-hosted медиасервер: Plex, *arr стек, Transmission, Prowlarr с Hysteria2 SOCKS5 прокси и Samba для LAN-доступа.
```bash
make addon-mediaserver
# Без Hysteria2 прокси:
make addon-mediaserver ARGS="-e mediaserver_hysteria2_enabled=false"
```
Минимальная конфигурация в vault.yml:
```yaml
vault_plex_claim_token: "claim-xxxxxxxxx" # https://plex.tv/claim (4 мин)
# URL из Shadowrocket / NekoBox / Hiddify — автоматически разберётся:
vault_hysteria2_url: "hysteria2://password@vps.example.com:443?obfs=salamander&obfs-password=secret"
vault_samba_password: "my-samba-password"
vault_transmission_password: "my-torrent-password"
```
Hysteria2 работает только как **sidecar в Prowlarr поде** — не cluster-wide VPN. Init-контейнер автоматически прописывает SOCKS5 `127.0.0.1:1080` в `config.xml` Prowlarr.
Все 9 сервисов используют **один shared PVC** (RWX NFS):
```
/data/config/<service>/ ← конфиг каждого сервиса
/data/data/downloads/ ← Transmission
/data/data/movies/ ← Radarr
/data/data/series/ ← Sonarr
/data/data/music/ ← Lidarr
```
Samba получает IP от kube-vip (`LoadBalancer`) — подключение из LAN: `\\<ip>\media`.
Подробнее: [addons/mediaserver/README.md](../addons/mediaserver/README.md)
## External Services Ingress Proxy
Проксирует внешние сервисы (вне кластера) через ingress-nginx по доменному имени. Для каждого сервиса автоматически создаёт `Service (ClusterIP, no selector)` + `Endpoints` + `Ingress`. Поддерживает TLS, basic auth, WebSocket, несколько хостов и несколько backend IP.
```bash
make addon-ingress-proxypass
```
Конфигурация в `group_vars/all/addons.yml`:
```yaml
ingress_proxypass_proxies:
- name: plex
hosts: [plex.home.ru]
ips: [192.168.1.50]
port: 32400
- name: grafana
hosts: [grafana.home.ru]
ips: [192.168.1.60]
port: 3000
tls:
enabled: true
secretName: wildcard-cert
```
Подробнее: [addons/ingress-proxypass/README.md](../addons/ingress-proxypass/README.md)
---
## Split Gateway
Прозрачный split-tunnel proxy на базе sing-box с Hysteria2 как outbound. Перехватывает трафик с TV/устройств через TPROXY и маршрутизирует по правилам: YouTube → Hysteria2, RU-сервисы и частные сети → прямой маршрут.
```bash
# Режим systemd (установка на хост из группы [splitgw]):
make addon-splitgw
# Режим K8s DaemonSet:
make addon-splitgw ARGS="-e splitgw_deploy_mode=k8s"
```
Настройки в `group_vars/all/addons.yml`:
```yaml
# IP-адреса устройств, трафик которых перехватывается:
splitgw_tv_sources:
- "192.168.1.100/32" # Smart TV
# IP роутера (для разворота DNS):
splitgw_router_ip: "192.168.1.1"
# URL из Shadowrocket / NekoBox (разбирается автоматически):
# vault_hysteria2_url задаётся в vault.yml
```
Vault секрет (тот же что для mediaserver):
```yaml
vault_hysteria2_url: "hysteria2://password@vps.example.com:443?obfs=salamander&obfs-password=secret"
```
Keenetic: создай политику маршрутизации для TV с шлюзом на ноду splitgw.
Подробнее: [addons/splitgw/README.md](../addons/splitgw/README.md)
---
## Prometheus метрики
Все аддоны создают ServiceMonitor автоматически при `addon_prometheus_stack: true`:
- ingress-nginx, cert-manager, ArgoCD, Gitea, Harbor, Jenkins
- PostgreSQL, MySQL, MinIO, Loki, Tempo, Pushgateway
- Longhorn, Velero, CrowdSec, Vaultwarden, Nextcloud, ownCloud
## Vault секреты
Полный список vault.yml переменных — `group_vars/all/vault.yml.example`:
```yaml
vault_k3s_token: ""
vault_grafana_user: "admin"
vault_grafana_password: ""
vault_kiali_token: ""
vault_gitea_admin_password: ""
vault_gitea_db_password: ""
vault_harbor_admin_password: "Harbor12345"
vault_harbor_db_password: ""
vault_postgresql_postgres_password: ""
vault_postgresql_password: ""
vault_mysql_root_password: ""
vault_mysql_password: ""
vault_minio_root_user: "admin"
vault_minio_root_password: ""
vault_velero_s3_access_key: ""
vault_velero_s3_secret_key: ""
vault_crowdsec_enroll_key: ""
vault_nextcloud_admin_password: ""
vault_nextcloud_db_password: ""
vault_owncloud_admin_password: ""
vault_jenkins_admin_password: ""
vault_netbird_coturn_password: ""
vault_netbird_router_setup_key: ""
vault_netbird_exit_node_setup_key: ""
vault_plex_claim_token: ""
vault_hysteria2_url: "" # URL целиком из Shadowrocket/NekoBox — для mediaserver и splitgw
vault_hysteria2_server: ""
vault_hysteria2_auth: ""
vault_samba_password: ""
vault_transmission_password: ""
vault_vaultwarden_admin_token: ""
vault_vaultwarden_smtp_password: ""
vault_smtp_relay_password: ""
vault_glusterfs_heketi_secret: ""
vault_databasus_db_password: ""
vault_aws_kms_access_key: ""
vault_aws_kms_secret_key: ""
vault_transit_seal_token: ""
vault_azure_kv_client_secret: ""
vault_eso_approle_secret_id: ""
```