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: обновлены все упоминания
This commit is contained in:
Sergey Antropoff
2026-04-26 07:32:02 +03:00
parent 12578dda27
commit e9e0ffa3c2
19 changed files with 136 additions and 136 deletions

View File

@@ -58,7 +58,7 @@ DOCKER_RUN := docker run --rm -it \
addon-harbor addon-gitea addon-owncloud addon-nextcloud \
addon-csi-s3 addon-csi-ceph addon-csi-glusterfs addon-vaultwarden \
addon-smtp-relay addon-vault addon-external-secrets \
addon-jenkins addon-netbird addon-mediaserver addon-hysteria2-server addon-splitgw addon-ext-proxy \
addon-jenkins addon-netbird addon-mediaserver addon-hysteria2-server addon-splitgw addon-ingress-proxypass \
add-node remove-node \
add-etcd-node remove-etcd-node \
etcd-backup etcd-restore etcd-list-snapshots \
@@ -420,9 +420,9 @@ addon-splitgw: _check_env _check_image ## Установить Split Gateway —
@printf "$(CYAN)Устанавливаю Split Gateway (sing-box + Hysteria2)...$(NC)\n"
$(DOCKER_RUN) addon splitgw $(ARGS)
addon-ext-proxy: _check_env _check_image ## Проксировать внешние сервисы через ingress-nginx (ARGS="-e ext_proxy_vip=192.168.1.x")
addon-ingress-proxypass: _check_env _check_image ## Проксировать внешние сервисы через ingress-nginx (ARGS="-e ingress_proxypass_vip=192.168.1.x")
@printf "$(CYAN)Устанавливаю External Services Ingress Proxy...$(NC)\n"
$(DOCKER_RUN) addon ext-proxy $(ARGS)
$(DOCKER_RUN) addon ingress-proxypass $(ARGS)
# Generic цель — любой аддон из addons/<name>/playbook.yml
addon-%: _check_env _check_image

View File

@@ -52,7 +52,7 @@ HA-режим (embedded etcd): при отказе **любой одной** н
| **Файловые хранилища** | nextcloud, owncloud |
| **Медиасервер** | mediaserver — Plex, Sonarr, Radarr, Lidarr, Bazarr, Prowlarr + Hysteria2, Overseerr, Transmission, Samba |
| **VPN / Прокси** | splitgw — прозрачный split-tunnel gateway (sing-box + Hysteria2 TPROXY, YouTube → прокси) |
| **Ingress Proxy** | ext-proxy — проксировать внешние сервисы (IP:PORT) через ingress-nginx по домену |
| **Ingress Proxy** | ingress-proxypass — проксировать внешние сервисы (IP:PORT) через ingress-nginx по домену |
Все аддоны включаются флагами в `group_vars/all/addons.yml`. Установка: `make addon-<name>`.

View File

@@ -1,9 +0,0 @@
# Generated by Ansible — do not edit manually.
# Configure via: group_vars/all/addons.yml → ext_proxy_* variables.
# Note: auth.username/password are resolved to htpasswd hashes before this file is written.
defaults:
{{ (ext_proxy_defaults | combine({'auth': _ext_proxy_def_auth_final})) | to_yaml | indent(2, True) }}
proxies:
{{ _ext_proxy_proxies_final | to_yaml | indent(2, True) }}

View File

@@ -24,9 +24,9 @@
```yaml
# group_vars/all/addons.yml
addon_ext_proxy: true
addon_ingress_proxypass: true
ext_proxy_proxies:
ingress_proxypass_proxies:
- name: plex
hosts: [plex.home.ru]
ips: [192.168.1.50]
@@ -41,9 +41,9 @@ ext_proxy_proxies:
**2. Разверни:**
```bash
make addon-ext-proxy
make addon-ingress-proxypass
# с явным VIP в сводке:
make addon-ext-proxy ARGS="-e ext_proxy_vip=192.168.1.100"
make addon-ingress-proxypass ARGS="-e ingress_proxypass_vip=192.168.1.100"
```
**3. Направь DNS на kube-vip:**
@@ -92,10 +92,10 @@ router.home.ru IN A 192.168.1.100
### Глобальные значения по умолчанию
```yaml
ext_proxy_namespace: "ext-proxy" # Kubernetes namespace
ext_proxy_release_name: "ext-proxy" # имя Helm release
ingress_proxypass_namespace: "ingress-proxypass" # Kubernetes namespace
ingress_proxypass_release_name: "ingress-proxypass" # имя Helm release
ext_proxy_defaults:
ingress_proxypass_defaults:
ingressClass: nginx # класс Ingress (должен совпадать с именем в ingress-nginx)
tls:
@@ -128,7 +128,7 @@ ext_proxy_defaults:
### Поля определения прокси
```yaml
ext_proxy_proxies:
ingress_proxypass_proxies:
- name: myservice # (обязательно) уникальное имя → имя ресурса в K8s
hosts: # (обязательно) список хостов
- myservice.home.ru
@@ -169,12 +169,12 @@ ext_proxy_proxies:
Если есть wildcard-сертификат, управляемый cert-manager и хранящийся в Secret:
```yaml
ext_proxy_defaults:
ingress_proxypass_defaults:
tls:
enabled: true
secretName: wildcard-tls # должен существовать в ext_proxy_namespace
secretName: wildcard-tls # должен существовать в ingress_proxypass_namespace
ext_proxy_proxies:
ingress_proxypass_proxies:
- name: plex
hosts: [plex.home.ru]
ips: [192.168.1.50]
@@ -184,7 +184,7 @@ ext_proxy_proxies:
Переопределить TLS для конкретного прокси:
```yaml
ext_proxy_proxies:
ingress_proxypass_proxies:
- name: router
hosts: [router.home.ru]
ips: [192.168.1.1]
@@ -196,7 +196,7 @@ ext_proxy_proxies:
### TLS — автоматический выпуск через cert-manager
```yaml
ext_proxy_defaults:
ingress_proxypass_defaults:
tls:
enabled: true
certManager:
@@ -216,16 +216,16 @@ cert-manager автоматически выпустит сертификат д
```yaml
# group_vars/all/addons.yml
ext_proxy_defaults:
ingress_proxypass_defaults:
auth:
enabled: true
username: admin
password: "{{ vault_ext_proxy_password }}" # пароль из vault
password: "{{ vault_ingress_proxypass_password }}" # пароль из vault
```
```yaml
# group_vars/all/vault.yml
vault_ext_proxy_password: "мойсекретныйпароль"
vault_ingress_proxypass_password: "мойсекретныйпароль"
```
Ansible автоматически вызовет `openssl passwd -apr1` и запишет хэш в Kubernetes Secret. Пароль в открытом виде **не попадает** в Helm values, логи или конфиги.
@@ -233,7 +233,7 @@ Ansible автоматически вызовет `openssl passwd -apr1` и за
Выборочно для конкретного прокси (остальные без auth):
```yaml
ext_proxy_proxies:
ingress_proxypass_proxies:
- name: router
hosts: [router.home.ru]
ips: [192.168.1.1]
@@ -349,10 +349,10 @@ K8s создаёт два адреса в объекте `Endpoints`. kube-proxy
## Как добавить новый внешний сервис
1. Добавь запись в `ext_proxy_proxies` в файле `group_vars/all/addons.yml`:
1. Добавь запись в `ingress_proxypass_proxies` в файле `group_vars/all/addons.yml`:
```yaml
ext_proxy_proxies:
ingress_proxypass_proxies:
# ... существующие записи ...
- name: homeassistant
hosts: [ha.home.ru]
@@ -364,7 +364,7 @@ ext_proxy_proxies:
2. Запусти аддон повторно:
```bash
make addon-ext-proxy
make addon-ingress-proxypass
```
Helm upgrade идемпотентен — существующие ресурсы обновляются, новые добавляются.
@@ -416,7 +416,7 @@ kubectl -n ingress-nginx get svc ingress-nginx-controller
### 1. Убедись что ресурсы созданы
```bash
kubectl -n ext-proxy get all,ingress,endpoints
kubectl -n ingress-proxypass get all,ingress,endpoints
# Ожидаемый вывод:
# NAME TYPE CLUSTER-IP ...
@@ -431,7 +431,7 @@ kubectl -n ext-proxy get all,ingress,endpoints
### 2. Проверь Endpoints заполнены
```bash
kubectl -n ext-proxy describe endpoints plex
kubectl -n ingress-proxypass describe endpoints plex
# Должно показать "Addresses: 192.168.1.50" и "Ports: http 32400/TCP"
```
@@ -439,7 +439,7 @@ kubectl -n ext-proxy describe endpoints plex
```bash
kubectl run curl --rm -it --image=curlimages/curl -- \
curl -v http://plex.ext-proxy.svc.cluster.local:32400
curl -v http://plex.ingress-proxypass.svc.cluster.local:32400
```
### 4. Проверь внешний доступ
@@ -454,7 +454,7 @@ curl http://plex.home.ru/
### 5. Убедись что ingress-nginx применил правила
```bash
kubectl -n ext-proxy describe ingress plex
kubectl -n ingress-proxypass describe ingress plex
# Должно показать Rules → host → plex.home.ru → plex:32400
# Проверь что конфиг nginx обновился:
@@ -470,7 +470,7 @@ kubectl -n ingress-nginx exec -it \
При такой конфигурации:
```yaml
ext_proxy_proxies:
ingress_proxypass_proxies:
- name: plex
hosts:
- plex.home.ru
@@ -489,7 +489,7 @@ apiVersion: v1
kind: Service
metadata:
name: plex
namespace: ext-proxy
namespace: ingress-proxypass
spec:
type: ClusterIP
ports:
@@ -505,7 +505,7 @@ apiVersion: v1
kind: Endpoints
metadata:
name: plex
namespace: ext-proxy
namespace: ingress-proxypass
subsets:
- addresses:
- ip: "192.168.1.50"
@@ -521,7 +521,7 @@ apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: plex
namespace: ext-proxy
namespace: ingress-proxypass
annotations:
nginx.ingress.kubernetes.io/proxy-connect-timeout: "60"
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
@@ -547,12 +547,12 @@ spec:
## Helm Chart — самостоятельное использование без Ansible
Чарт находится в `addons/ext-proxy/role/chart/`. Развернуть напрямую:
Чарт находится в `addons/ingress-proxypass/role/chart/`. Развернуть напрямую:
```bash
# Из корня проекта:
helm upgrade --install ext-proxy addons/ext-proxy/role/chart \
--namespace ext-proxy \
helm upgrade --install ingress-proxypass addons/ingress-proxypass/role/chart \
--namespace ingress-proxypass \
--create-namespace \
--values my-values.yaml
```
@@ -560,7 +560,7 @@ helm upgrade --install ext-proxy addons/ext-proxy/role/chart \
Сгенерировать манифесты без деплоя (для проверки):
```bash
helm template ext-proxy addons/ext-proxy/role/chart \
helm template ingress-proxypass addons/ingress-proxypass/role/chart \
--values my-values.yaml
```
@@ -574,7 +574,7 @@ helm template ext-proxy addons/ext-proxy/role/chart \
```bash
# 1. Проверь Endpoints заполнены:
kubectl -n ext-proxy get endpoints plex
kubectl -n ingress-proxypass get endpoints plex
# "Addresses" не должен быть пустым. Если "<none>" — Endpoints отсутствует или некорректен.
# 2. Проверь доступность внешнего IP с ноды кластера:
@@ -590,10 +590,10 @@ curl -v http://192.168.1.50:32400
```bash
# Проверь наличие endpoints:
kubectl -n ext-proxy describe endpoints plex
kubectl -n ingress-proxypass describe endpoints plex
# Убедись что у service есть ClusterIP:
kubectl -n ext-proxy get svc plex
kubectl -n ingress-proxypass get svc plex
# Проверь логи ingress-nginx:
kubectl -n ingress-nginx logs -l app.kubernetes.io/name=ingress-nginx --tail=100
@@ -608,11 +608,11 @@ kubectl -n ingress-nginx logs -l app.kubernetes.io/name=ingress-nginx --tail=100
curl -v -H "Host: plex.home.ru" http://192.168.1.100/
# 2. Посмотри описание Ingress:
kubectl -n ext-proxy describe ingress plex
kubectl -n ingress-proxypass describe ingress plex
# Раздел "Rules" — хост и путь должны совпадать точно.
# 3. Проверь класс Ingress:
kubectl -n ext-proxy get ingress plex -o jsonpath='{.spec.ingressClassName}'
kubectl -n ingress-proxypass get ingress plex -o jsonpath='{.spec.ingressClassName}'
# Должен совпадать с классом ingress-nginx (обычно "nginx")
```
@@ -633,11 +633,11 @@ curl -H "Host: plex.home.ru" http://<kube-vip-IP>/
```bash
# Проверь наличие TLS Secret в нужном namespace:
kubectl -n ext-proxy get secret wildcard-tls
kubectl -n ingress-proxypass get secret wildcard-tls
# Проверь что cert-manager выпустил сертификат:
kubectl -n ext-proxy get certificate
kubectl -n ext-proxy describe certificate plex
kubectl -n ingress-proxypass get certificate
kubectl -n ingress-proxypass describe certificate plex
# Логи cert-manager:
kubectl -n cert-manager logs -l app=cert-manager --tail=50
@@ -650,18 +650,18 @@ kubectl -n cert-manager logs -l app=cert-manager --tail=50
curl -u admin:мойпароль http://plex.home.ru/
# Убедись что в Secret есть ключ "auth":
kubectl -n ext-proxy get secret plex-auth -o jsonpath='{.data.auth}' | base64 -d
kubectl -n ingress-proxypass get secret plex-auth -o jsonpath='{.data.auth}' | base64 -d
# Должно вывести: admin:$apr1$...
# Проверь аннотации в Ingress:
kubectl -n ext-proxy get ingress plex -o yaml | grep auth
kubectl -n ingress-proxypass get ingress plex -o yaml | grep auth
```
### Обрывы WebSocket-соединения
```bash
# Проверь аннотацию proxy-http-version:
kubectl -n ext-proxy get ingress plex -o yaml | grep proxy-http
kubectl -n ingress-proxypass get ingress plex -o yaml | grep proxy-http
# Для сервисов где нужен длинный таймаут (стриминг):
# Добавь в annotations:
@@ -688,14 +688,14 @@ kubectl -n ingress-nginx exec \
## Удаление
```bash
helm -n ext-proxy uninstall ext-proxy
kubectl delete namespace ext-proxy
helm -n ingress-proxypass uninstall ingress-proxypass
kubectl delete namespace ingress-proxypass
```
Удалить только один прокси без полного сноса релиза:
1. Убери запись из `ext_proxy_proxies` в `group_vars/all/addons.yml`
2. Запусти `make addon-ext-proxy` — Helm upgrade удалит убранные ресурсы
1. Убери запись из `ingress_proxypass_proxies` в `group_vars/all/addons.yml`
2. Запусти `make addon-ingress-proxypass` — Helm upgrade удалит убранные ресурсы
---
@@ -710,16 +710,16 @@ kubectl delete namespace ext-proxy
### Команды Makefile
```bash
make addon-ext-proxy # развернуть / обновить
make addon-ext-proxy ARGS="-e ext_proxy_vip=..." # с явным VIP в сводке
make addon-ingress-proxypass # развернуть / обновить
make addon-ingress-proxypass ARGS="-e ingress_proxypass_vip=..." # с явным VIP в сводке
```
### Переменные Ansible
| Переменная | По умолчанию | Описание |
|---|---|---|
| `ext_proxy_namespace` | `ext-proxy` | Kubernetes namespace |
| `ext_proxy_release_name` | `ext-proxy` | Имя Helm release |
| `ext_proxy_proxies` | `[]` | Список определений внешних сервисов |
| `ext_proxy_defaults.*` | см. defaults | Глобальные значения по умолчанию |
| `ext_proxy_vip` | `""` | kube-vip VIP — отображается в сводке после установки |
| `ingress_proxypass_namespace` | `ingress-proxypass` | Kubernetes namespace |
| `ingress_proxypass_release_name` | `ingress-proxypass` | Имя Helm release |
| `ingress_proxypass_proxies` | `[]` | Список определений внешних сервисов |
| `ingress_proxypass_defaults.*` | см. defaults | Глобальные значения по умолчанию |
| `ingress_proxypass_vip` | `""` | kube-vip VIP — отображается в сводке после установки |

View File

@@ -1,5 +1,5 @@
apiVersion: v2
name: ext-proxy
name: ingress-proxypass
description: |
Proxies external services (outside Kubernetes) through ingress-nginx.
Creates Service + Endpoints + Ingress for each configured host.

View File

@@ -8,7 +8,7 @@ Release : {{ .Release.Name }}
Proxied services:
{{- range .Values.proxies }}
{{- $proxy := . }}
{{- $proxyName := include "ext-proxy.resourceName" $proxy.name }}
{{- $proxyName := include "ingress-proxypass.resourceName" $proxy.name }}
{{- $tlsEnabled := $proxy.tls | default dict | dig "enabled" ($.Values.defaults.tls.enabled | default false) }}
{{- $schema := "http" }}
{{- if $tlsEnabled }}{{ $schema = "https" }}{{ end }}

View File

@@ -1,24 +1,24 @@
{{/*
Normalize a proxy name to be safe as a Kubernetes resource name.
Lowercases, replaces underscores and dots with hyphens, trims to 63 chars.
Usage: {{ include "ext-proxy.resourceName" "my_service.name" }}
Usage: {{ include "ingress-proxypass.resourceName" "my_service.name" }}
*/}}
{{- define "ext-proxy.resourceName" -}}
{{- define "ingress-proxypass.resourceName" -}}
{{- . | lower | replace "_" "-" | replace "." "-" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Chart label string: name-version (used in helm.sh/chart label).
*/}}
{{- define "ext-proxy.chart" -}}
{{- define "ingress-proxypass.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Common labels applied to all resources.
*/}}
{{- define "ext-proxy.labels" -}}
helm.sh/chart: {{ include "ext-proxy.chart" . }}
{{- define "ingress-proxypass.labels" -}}
helm.sh/chart: {{ include "ingress-proxypass.chart" . }}
app.kubernetes.io/name: {{ default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
@@ -26,9 +26,9 @@ app.kubernetes.io/managed-by: {{ .Release.Service }}
{{/*
Resolve a per-proxy boolean setting with fallback to global default.
Usage: {{ include "ext-proxy.boolSetting" (dict "proxy" $proxy "defaults" $d "key" "websocket" "fallback" true) }}
Usage: {{ include "ingress-proxypass.boolSetting" (dict "proxy" $proxy "defaults" $d "key" "websocket" "fallback" true) }}
*/}}
{{- define "ext-proxy.boolSetting" -}}
{{- define "ingress-proxypass.boolSetting" -}}
{{- $proxyVal := index .proxy .key }}
{{- $defaultVal := index .defaults .key }}
{{- if ne $proxyVal nil }}{{ $proxyVal }}
@@ -39,9 +39,9 @@ Usage: {{ include "ext-proxy.boolSetting" (dict "proxy" $proxy "defaults" $d "ke
{{/*
Resolve a per-proxy string setting with fallback to global default.
Usage: {{ include "ext-proxy.strSetting" (dict "proxy" $proxy "defaults" $d "key" "path" "fallback" "/") }}
Usage: {{ include "ingress-proxypass.strSetting" (dict "proxy" $proxy "defaults" $d "key" "path" "fallback" "/") }}
*/}}
{{- define "ext-proxy.strSetting" -}}
{{- define "ingress-proxypass.strSetting" -}}
{{- $proxyVal := index .proxy .key }}
{{- $defaultVal := index .defaults .key }}
{{- if and $proxyVal (ne $proxyVal "") }}{{ $proxyVal }}

View File

@@ -11,7 +11,7 @@ Traffic path:
*/}}
{{- range .Values.proxies }}
{{- $proxy := . }}
{{- $proxyName := include "ext-proxy.resourceName" $proxy.name }}
{{- $proxyName := include "ingress-proxypass.resourceName" $proxy.name }}
{{- $ips := $proxy.ips | default (list $proxy.ip) }}
---
apiVersion: v1
@@ -20,7 +20,7 @@ metadata:
name: {{ $proxyName }}
namespace: {{ $.Release.Namespace }}
labels:
{{- include "ext-proxy.labels" $ | nindent 4 }}
{{- include "ingress-proxypass.labels" $ | nindent 4 }}
app.kubernetes.io/component: {{ $proxyName }}
subsets:
- addresses:

View File

@@ -13,7 +13,7 @@ per-proxy annotations always win, with no duplicate YAML keys.
{{- range .Values.proxies }}
{{- $proxy := . }}
{{- $d := $.Values.defaults }}
{{- $proxyName := include "ext-proxy.resourceName" $proxy.name }}
{{- $proxyName := include "ingress-proxypass.resourceName" $proxy.name }}
{{/* ── Resolve per-proxy settings with fallback to defaults ────────────────── */}}
{{- $ingressClass := $proxy.ingressClass | default $d.ingressClass | default "nginx" }}
@@ -99,7 +99,7 @@ metadata:
name: {{ $proxyName }}
namespace: {{ $.Release.Namespace }}
labels:
{{- include "ext-proxy.labels" $ | nindent 4 }}
{{- include "ingress-proxypass.labels" $ | nindent 4 }}
app.kubernetes.io/component: {{ $proxyName }}
annotations:
{{- toYaml $ann | nindent 4 }}

View File

@@ -13,7 +13,7 @@ Generate credentials with:
{{- range .Values.proxies }}
{{- $proxy := . }}
{{- $d := $.Values.defaults }}
{{- $proxyName := include "ext-proxy.resourceName" $proxy.name }}
{{- $proxyName := include "ingress-proxypass.resourceName" $proxy.name }}
{{- $proxyAuth := $proxy.auth | default dict }}
{{- $defAuth := $d.auth | default dict }}
@@ -30,7 +30,7 @@ metadata:
name: {{ $proxyName }}-auth
namespace: {{ $.Release.Namespace }}
labels:
{{- include "ext-proxy.labels" $ | nindent 4 }}
{{- include "ingress-proxypass.labels" $ | nindent 4 }}
app.kubernetes.io/component: {{ $proxyName }}
type: Opaque
data:

View File

@@ -5,7 +5,7 @@ The Service name MUST match the Endpoints name for K8s to associate them.
*/}}
{{- range .Values.proxies }}
{{- $proxy := . }}
{{- $proxyName := include "ext-proxy.resourceName" $proxy.name }}
{{- $proxyName := include "ingress-proxypass.resourceName" $proxy.name }}
---
apiVersion: v1
kind: Service
@@ -13,7 +13,7 @@ metadata:
name: {{ $proxyName }}
namespace: {{ $.Release.Namespace }}
labels:
{{- include "ext-proxy.labels" $ | nindent 4 }}
{{- include "ingress-proxypass.labels" $ | nindent 4 }}
app.kubernetes.io/component: {{ $proxyName }}
spec:
# ClusterIP with no selector: Kubernetes will not auto-manage endpoints.

View File

@@ -1,10 +1,10 @@
---
# ─── Helm release ─────────────────────────────────────────────────────────────
ext_proxy_namespace: "ext-proxy"
ext_proxy_release_name: "ext-proxy"
ingress_proxypass_namespace: "ingress-proxypass"
ingress_proxypass_release_name: "ingress-proxypass"
# ─── Global defaults (mirror of chart values.defaults) ────────────────────────
ext_proxy_defaults:
ingress_proxypass_defaults:
ingressClass: nginx
tls:
enabled: false
@@ -30,17 +30,17 @@ ext_proxy_defaults:
# ─── Proxy definitions ────────────────────────────────────────────────────────
# Each entry creates: Service + Endpoints + Ingress (+ optional auth Secret)
# All fields support per-entry overrides of ext_proxy_defaults.
# All fields support per-entry overrides of ingress_proxypass_defaults.
#
# Minimal example:
# ext_proxy_proxies:
# ingress_proxypass_proxies:
# - name: plex
# hosts: [plex.home.ru]
# ips: [192.168.1.50]
# port: 32400
#
# Full example:
# ext_proxy_proxies:
# ingress_proxypass_proxies:
# - name: myapp
# hosts:
# - myapp.home.ru
@@ -67,7 +67,7 @@ ext_proxy_defaults:
# # credentials: "admin:$apr1$..."
# annotations:
# nginx.ingress.kubernetes.io/proxy-body-size: "0"
ext_proxy_proxies: []
ingress_proxypass_proxies: []
# kube-vip VIP — shown in post-install summary (informational only)
ext_proxy_vip: ""
ingress_proxypass_vip: ""

View File

@@ -1,21 +1,21 @@
---
# ── Validate inputs ───────────────────────────────────────────────────────────
- name: Validate ext_proxy_proxies is defined and non-empty
- name: Validate ingress_proxypass_proxies is defined and non-empty
ansible.builtin.assert:
that:
- ext_proxy_proxies is defined
- ext_proxy_proxies | length > 0
- ingress_proxypass_proxies is defined
- ingress_proxypass_proxies | length > 0
fail_msg: >
ext_proxy_proxies is empty. Define at least one proxy in
group_vars/all/addons.yml → ext_proxy_proxies.
success_msg: "ext_proxy_proxies: {{ ext_proxy_proxies | length }} service(s) defined"
ingress_proxypass_proxies is empty. Define at least one proxy in
group_vars/all/addons.yml → ingress_proxypass_proxies.
success_msg: "ingress_proxypass_proxies: {{ ingress_proxypass_proxies | length }} service(s) defined"
# ── Create namespace ──────────────────────────────────────────────────────────
- name: Create ext-proxy namespace
- name: Create ingress-proxypass namespace
ansible.builtin.command: >
k3s kubectl create namespace {{ ext_proxy_namespace }}
k3s kubectl create namespace {{ ingress_proxypass_namespace }}
--dry-run=client -o yaml | k3s kubectl apply -f -
become: true
changed_when: false
@@ -24,13 +24,13 @@
- name: Ensure chart temp directory is clean
ansible.builtin.file:
path: /tmp/ext-proxy-chart
path: /tmp/ingress-proxypass-chart
state: absent
become: true
- name: Create chart temp directory
ansible.builtin.file:
path: /tmp/ext-proxy-chart
path: /tmp/ingress-proxypass-chart
state: directory
mode: "0755"
become: true
@@ -38,7 +38,7 @@
- name: Copy Helm chart to master
ansible.builtin.copy:
src: "{{ role_path }}/chart/"
dest: /tmp/ext-proxy-chart/
dest: /tmp/ingress-proxypass-chart/
mode: preserve
become: true
@@ -96,42 +96,42 @@
proxy['auth'] = auth
print(json.dumps({'proxies': proxies, 'def_auth': cleaned_def_auth}))
- "{{ ext_proxy_proxies | to_json }}"
- "{{ ext_proxy_defaults.auth | to_json }}"
- "{{ ingress_proxypass_proxies | to_json }}"
- "{{ ingress_proxypass_defaults.auth | to_json }}"
register: _auth_processed
changed_when: false
no_log: true
- name: Set final proxies and defaults with generated credentials
ansible.builtin.set_fact:
_ext_proxy_proxies_final: "{{ (_auth_processed.stdout | from_json).proxies }}"
_ext_proxy_def_auth_final: "{{ (_auth_processed.stdout | from_json).def_auth }}"
_ingress_proxypass_proxies_final: "{{ (_auth_processed.stdout | from_json).proxies }}"
_ingress_proxypass_def_auth_final: "{{ (_auth_processed.stdout | from_json).def_auth }}"
# ── Template Helm values ──────────────────────────────────────────────────────
- name: Template Helm values
ansible.builtin.template:
src: values.yaml.j2
dest: /tmp/ext-proxy-values.yaml
dest: /tmp/ingress-proxypass-values.yaml
mode: "0640"
become: true
- name: Show generated Helm values
ansible.builtin.command: cat /tmp/ext-proxy-values.yaml
ansible.builtin.command: cat /tmp/ingress-proxypass-values.yaml
become: true
changed_when: false
register: _ext_proxy_values
register: _ingress_proxypass_values
- name: Debug generated values
ansible.builtin.debug:
var: _ext_proxy_values.stdout_lines
var: _ingress_proxypass_values.stdout_lines
# ── Lint chart before deploying ───────────────────────────────────────────────
- name: Lint Helm chart
ansible.builtin.command: >
helm lint /tmp/ext-proxy-chart
--values /tmp/ext-proxy-values.yaml
helm lint /tmp/ingress-proxypass-chart
--values /tmp/ingress-proxypass-values.yaml
become: true
changed_when: false
register: _helm_lint
@@ -139,12 +139,12 @@
# ── Deploy chart ──────────────────────────────────────────────────────────────
- name: Deploy ext-proxy via Helm
- name: Deploy ingress-proxypass via Helm
ansible.builtin.command: >
helm upgrade --install {{ ext_proxy_release_name }}
/tmp/ext-proxy-chart
--namespace {{ ext_proxy_namespace }}
--values /tmp/ext-proxy-values.yaml
helm upgrade --install {{ ingress_proxypass_release_name }}
/tmp/ingress-proxypass-chart
--namespace {{ ingress_proxypass_namespace }}
--values /tmp/ingress-proxypass-values.yaml
--atomic
--wait
--timeout 60s
@@ -156,14 +156,14 @@
- name: Get Ingress list
ansible.builtin.command: >
k3s kubectl -n {{ ext_proxy_namespace }} get ingress -o wide
k3s kubectl -n {{ ingress_proxypass_namespace }} get ingress -o wide
become: true
changed_when: false
register: _ingress_list
- name: Get Endpoints list
ansible.builtin.command: >
k3s kubectl -n {{ ext_proxy_namespace }} get endpoints
k3s kubectl -n {{ ingress_proxypass_namespace }} get endpoints
become: true
changed_when: false
register: _endpoints_list
@@ -177,9 +177,9 @@
- "║ External Services Ingress Proxy — Deployed ║"
- "╚══════════════════════════════════════════════════════════════╝"
- ""
- " Namespace : {{ ext_proxy_namespace }}"
- " Release : {{ ext_proxy_release_name }}"
- " Services : {{ ext_proxy_proxies | length }}"
- " Namespace : {{ ingress_proxypass_namespace }}"
- " Release : {{ ingress_proxypass_release_name }}"
- " Services : {{ ingress_proxypass_proxies | length }}"
- ""
- " Ingress resources:"
- "{{ _ingress_list.stdout_lines | to_yaml }}"
@@ -187,7 +187,7 @@
- " Endpoints:"
- "{{ _endpoints_list.stdout_lines | to_yaml }}"
- ""
- " kube-vip VIP: {{ ext_proxy_vip | default('<check kube-vip>') }}"
- " kube-vip VIP: {{ ingress_proxypass_vip | default('<check kube-vip>') }}"
- " → Point all proxy hostnames to the VIP in DNS/hosts file"
- ""
- " Verify: kubectl -n {{ ext_proxy_namespace }} describe ingress"
- " Verify: kubectl -n {{ ingress_proxypass_namespace }} describe ingress"

View File

@@ -0,0 +1,9 @@
# Generated by Ansible — do not edit manually.
# Configure via: group_vars/all/addons.yml → ingress_proxypass_* variables.
# Note: auth.username/password are resolved to htpasswd hashes before this file is written.
defaults:
{{ (ingress_proxypass_defaults | combine({'auth': _ingress_proxypass_def_auth_final})) | to_yaml | indent(2, True) }}
proxies:
{{ _ingress_proxypass_proxies_final | to_yaml | indent(2, True) }}

View File

@@ -67,7 +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) |
| ingress-proxypass | `addon_ingress_proxypass` | Проксировать внешние сервисы (IP:PORT) через ingress-nginx по домену — Service + Endpoints + Ingress | [](../addons/ingress-proxypass/README.md) |
## Конфигурация addons.yml
@@ -119,7 +119,7 @@ addon_mediaserver: false # Plex + *arr + Transmission + Prowlarr/Hyste
addon_splitgw: false # sing-box + Hysteria2 TPROXY (host или k8s DaemonSet)
# ── External Services Ingress Proxy ───────────────────────────────────────────
addon_ext_proxy: false # проксировать внешние сервисы через ingress-nginx
addon_ingress_proxypass: false # проксировать внешние сервисы через ingress-nginx
```
## Зависимости между аддонами
@@ -140,7 +140,7 @@ addon_ext_proxy: false # проксировать внешние с
| `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 |
| `ingress-proxypass` | `ingress-nginx` | Требует работающий Ingress controller |
## MediaServer
@@ -186,13 +186,13 @@ Samba получает IP от kube-vip (`LoadBalancer`) — подключен
Проксирует внешние сервисы (вне кластера) через ingress-nginx по доменному имени. Для каждого сервиса автоматически создаёт `Service (ClusterIP, no selector)` + `Endpoints` + `Ingress`. Поддерживает TLS, basic auth, WebSocket, несколько хостов и несколько backend IP.
```bash
make addon-ext-proxy
make addon-ingress-proxypass
```
Конфигурация в `group_vars/all/addons.yml`:
```yaml
ext_proxy_proxies:
ingress_proxypass_proxies:
- name: plex
hosts: [plex.home.ru]
ips: [192.168.1.50]
@@ -207,7 +207,7 @@ ext_proxy_proxies:
secretName: wildcard-cert
```
Подробнее: [addons/ext-proxy/README.md](../addons/ext-proxy/README.md)
Подробнее: [addons/ingress-proxypass/README.md](../addons/ingress-proxypass/README.md)
---

View File

@@ -41,7 +41,7 @@ addon_netbird: false # NetBird VPN (управляющий сер
addon_mediaserver: false # MediaServer — Plex, *arr, Transmission, Prowlarr+Hysteria2, Samba
addon_hysteria2_server: false # Hysteria2 VPN сервер на удалённый VPS (группа [hysteria2_server] в inventory)
addon_splitgw: false # Split Gateway — прозрачный прокси sing-box+Hysteria2 (группа [splitgw] в inventory)
addon_ext_proxy: false # External Services Ingress Proxy — проксировать внешние сервисы через ingress-nginx
addon_ingress_proxypass: false # External Services Ingress Proxy — проксировать внешние сервисы через ingress-nginx
# ─── NFS Server ───────────────────────────────────────────────────────────────
nfs_exports:

View File

@@ -300,6 +300,6 @@
hosts: k3s_master[0]
gather_facts: false
become: true
when: addon_ext_proxy | default(false) | bool
when: addon_ingress_proxypass | default(false) | bool
roles:
- role: "{{ playbook_dir }}/../addons/ext-proxy/role"
- role: "{{ playbook_dir }}/../addons/ingress-proxypass/role"