# Аддоны Все аддоны управляются через флаги в `group_vars/all/addons.yml`. Порядок установки в `playbooks/addons.yml` фиксирован (NFS → CSI → Ingress → cert-manager → остальные). ## Установка аддонов ```bash # Установить все включённые аддоны: make install-addons # Конкретный аддон (флаг из addons.yml игнорируется): make addon- # Примеры: 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) | | ingress-add-domains | `addon_ingress_add_domains` | Добавить домены к существующим K8s сервисам — только Ingress, без Service/Endpoints | [→](../addons/ingress-add-domains/README.md) | | yandex-dns-controller | `addon_yandex_dns_controller` | CronJob-контроллер Yandex 360 DNS — ConfigMap → DNS, safe mode (managed:true only) | [→](../addons/yandex-dns-controller/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 addon_ingress_add_domains: false # добавить домены к существующим K8s сервисам (только Ingress) ``` ## Зависимости между аддонами | Аддон | Зависит от | Автоинтеграция | |---|---|---| | `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// ← конфиг каждого сервиса /data/data/downloads/ ← Transmission /data/data/movies/ ← Radarr /data/data/series/ ← Sonarr /data/data/music/ ← Lidarr ``` Samba получает IP от kube-vip (`LoadBalancer`) — подключение из LAN: `\\\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) --- ## Ingress Add Domains Добавляет дополнительные домены к уже существующим K8s сервисам. Создаёт **только Ingress** в namespace целевого сервиса — Service и Endpoints не трогает. Поддерживает TLS с cert-manager, basic auth (автохэш пароля), WebSocket. ```bash make addon-ingress-add-domains ``` Конфигурация в `group_vars/all/addons.yml`: ```yaml ingress_add_domains_entries: - name: gitea-local hosts: [gitea.local] service: name: gitea-http namespace: gitea port: 3000 - name: gitea-home hosts: [gitea.home.ru] service: name: gitea-http namespace: gitea port: 3000 tls: enabled: true certManager: enabled: true issuer: letsencrypt-prod auth: enabled: true username: admin password: "{{ vault_gitea_password }}" ``` Подробнее: [addons/ingress-add-domains/README.md](../addons/ingress-add-domains/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: "" ```