feat: добавить аддон ext-proxy — проксировать внешние сервисы через ingress-nginx

Helm chart (один чарт создаёт Service + Endpoints + Ingress на каждый прокси):
- _helpers.tpl: хелперы ext-proxy.resourceName, ext-proxy.labels
- service.yaml: ClusterIP без selector — имя совпадает с Endpoints
- endpoints.yaml: внешние IP(s) + порт; несколько IP → round-robin через kube-proxy
- ingress.yaml: слияние аннотаций (defaults → сгенерированные → уровень прокси);
  поддержка TLS, basic auth, WebSocket, несколько хостов, маршрутизация по пути
- secret-auth.yaml: htpasswd Secret создаётся только при auth.enabled=true + credentials
- NOTES.txt: список прокси + команды проверки после установки

Ansible роль:
- defaults/main.yml: ext_proxy_namespace, ext_proxy_defaults, ext_proxy_proxies
- tasks/main.yml: валидация → namespace → копировать chart → lint → helm upgrade --install --atomic
- templates/values.yaml.j2: преобразование Ansible-переменных в Helm values через to_yaml

Интеграция: Makefile addon-ext-proxy, флаг addons.yml, playbooks/addons.yml,
            docs/addons.md, README.md (счётчик 37 аддонов)

README.md на русском языке с полной документацией:
архитектура, настройка, функции, DNS, проверка, примеры манифестов, устранение неисправностей

Дополнительно: splitgw_deploy_mode изменён на k8s
This commit is contained in:
Sergey Antropoff
2026-04-26 07:21:41 +03:00
parent 07fdc9a994
commit aae7941416
19 changed files with 1408 additions and 3 deletions

View File

@@ -67,6 +67,7 @@ make addon-netbird
| 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) |
| ext-proxy | `addon_ext_proxy` | Проксировать внешние сервисы (IP:PORT) через ingress-nginx по домену — Service + Endpoints + Ingress | [](../addons/ext-proxy/README.md) |
## Конфигурация addons.yml
@@ -116,6 +117,9 @@ addon_mediaserver: false # Plex + *arr + Transmission + Prowlarr/Hyste
# ── Split Gateway ─────────────────────────────────────────────────────────────
addon_splitgw: false # sing-box + Hysteria2 TPROXY (host или k8s DaemonSet)
# ── External Services Ingress Proxy ───────────────────────────────────────────
addon_ext_proxy: false # проксировать внешние сервисы через ingress-nginx
```
## Зависимости между аддонами
@@ -136,6 +140,7 @@ addon_splitgw: false # sing-box + Hysteria2 TPROXY (host или k8
| `crowdsec` | `ingress-nginx` | Bouncer интеграция при addon_crowdsec |
| `mediaserver` | `csi-nfs` (рекомендуется) | Shared PVC требует RWX StorageClass |
| `splitgw` | Hysteria2 сервер (vault_hysteria2_url) | URL из Shadowrocket / NekoBox |
| `ext-proxy` | `ingress-nginx` | Требует работающий Ingress controller |
## MediaServer
@@ -176,6 +181,36 @@ Samba получает IP от kube-vip (`LoadBalancer`) — подключен
Подробнее: [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-ext-proxy
```
Конфигурация в `group_vars/all/addons.yml`:
```yaml
ext_proxy_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/ext-proxy/README.md](../addons/ext-proxy/README.md)
---
## Split Gateway
Прозрачный split-tunnel proxy на базе sing-box с Hysteria2 как outbound. Перехватывает трафик с TV/устройств через TPROXY и маршрутизирует по правилам: YouTube → Hysteria2, RU-сервисы и частные сети → прямой маршрут.