mirror of
https://github.com/wahyd4/home-docker.git
synced 2026-08-08 20:15:03 +10:00
226 lines
6.4 KiB
YAML
226 lines
6.4 KiB
YAML
# Template for Exposing External Services (Outside K8s)
|
|
#
|
|
# Use this template when you have services running on your local network
|
|
# (e.g., http://192.168.1.4:3031) and want to expose them with:
|
|
# - A custom domain (e.g., myapp.junv.cc)
|
|
# - Automatic HTTPS certificate from Let's Encrypt
|
|
# - Through your existing NGINX Ingress Controller
|
|
#
|
|
# HOW TO USE:
|
|
# 1. Copy this template
|
|
# 2. Replace ALL_CAPS placeholders with your values
|
|
# 3. Save as home-apps/SERVICENAME.yaml
|
|
# 4. Apply: kubectl apply -f home-apps/SERVICENAME.yaml
|
|
#
|
|
# EXAMPLE:
|
|
# Service: http://192.168.1.4:3031 → https://myapp.junv.cc
|
|
#
|
|
---
|
|
# Service without selector (no pods, points to external endpoint)
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: SERVICENAME # e.g., home-assistant, grafana-external
|
|
namespace: home-apps
|
|
spec:
|
|
ports:
|
|
- name: http
|
|
port: 80 # Port exposed within cluster
|
|
targetPort: EXTERNAL_PORT # e.g., 3031, 8080, 9090
|
|
protocol: TCP
|
|
---
|
|
# Manual EndpointSlice pointing to external IP
|
|
apiVersion: discovery.k8s.io/v1
|
|
kind: EndpointSlice
|
|
metadata:
|
|
name: SERVICENAME # MUST match Service name exactly
|
|
namespace: home-apps
|
|
labels:
|
|
kubernetes.io/service-name: SERVICENAME # Required: links EndpointSlice to Service
|
|
addressType: IPv4
|
|
endpoints:
|
|
- addresses:
|
|
- EXTERNAL_IP # e.g., 192.168.1.4
|
|
ports:
|
|
- name: http # Should match Service port name
|
|
port: EXTERNAL_PORT # e.g., 3031
|
|
protocol: TCP
|
|
---
|
|
# Ingress with automatic TLS certificate
|
|
apiVersion: networking.k8s.io/v1
|
|
kind: Ingress
|
|
metadata:
|
|
name: SERVICENAME-ingress
|
|
namespace: home-apps
|
|
annotations:
|
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
|
# Optional: Add OAuth2 protection (uncomment to enable)
|
|
# nginx.ingress.kubernetes.io/auth-url: "https://pass.junv.cc/oauth2/auth"
|
|
# nginx.ingress.kubernetes.io/auth-signin: "https://pass.junv.cc/oauth2/start?rd=https://$host$escaped_request_uri"
|
|
# Optional: Proxy settings for specific backends
|
|
# nginx.ingress.kubernetes.io/proxy-body-size: "100m"
|
|
# nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
|
|
# nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
|
|
# Optional: Websocket support (for apps like Home Assistant)
|
|
# nginx.ingress.kubernetes.io/websocket-services: "SERVICENAME"
|
|
spec:
|
|
ingressClassName: nginx
|
|
tls:
|
|
- hosts:
|
|
- DOMAIN.junv.cc # e.g., homeassistant.junv.cc, grafana.junv.cc
|
|
secretName: SERVICENAME-tls # cert-manager will create this automatically
|
|
rules:
|
|
- host: DOMAIN.junv.cc
|
|
http:
|
|
paths:
|
|
- path: /
|
|
pathType: Prefix
|
|
backend:
|
|
service:
|
|
name: SERVICENAME
|
|
port:
|
|
number: 80
|
|
|
|
---
|
|
# ============================================================================
|
|
# REAL WORLD EXAMPLE 1: Home Assistant on 192.168.1.4:8123
|
|
# ============================================================================
|
|
# apiVersion: v1
|
|
# kind: Service
|
|
# metadata:
|
|
# name: home-assistant-external
|
|
# namespace: home-apps
|
|
# spec:
|
|
# ports:
|
|
# - name: http
|
|
# port: 80
|
|
# targetPort: 8123
|
|
# protocol: TCP
|
|
# ---
|
|
# apiVersion: discovery.k8s.io/v1
|
|
# kind: EndpointSlice
|
|
# metadata:
|
|
# name: home-assistant-external
|
|
# namespace: home-apps
|
|
# labels:
|
|
# kubernetes.io/service-name: home-assistant-external
|
|
# addressType: IPv4
|
|
# endpoints:
|
|
# - addresses:
|
|
# - 192.168.1.4
|
|
# ports:
|
|
# - name: http
|
|
# port: 8123
|
|
# protocol: TCP
|
|
# ---
|
|
# apiVersion: networking.k8s.io/v1
|
|
# kind: Ingress
|
|
# metadata:
|
|
# name: home-assistant-external-ingress
|
|
# namespace: home-apps
|
|
# annotations:
|
|
# cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
|
# nginx.ingress.kubernetes.io/websocket-services: "home-assistant-external"
|
|
# spec:
|
|
# ingressClassName: nginx
|
|
# tls:
|
|
# - hosts:
|
|
# - ha.junv.cc
|
|
# secretName: home-assistant-external-tls
|
|
# rules:
|
|
# - host: ha.junv.cc
|
|
# http:
|
|
# paths:
|
|
# - path: /
|
|
# pathType: Prefix
|
|
# backend:
|
|
# service:
|
|
# name: home-assistant-external
|
|
# port:
|
|
# number: 80
|
|
|
|
---
|
|
# ============================================================================
|
|
# REAL WORLD EXAMPLE 2: Proxmox Web UI on 192.168.1.5:8006
|
|
# ============================================================================
|
|
# apiVersion: v1
|
|
# kind: Service
|
|
# metadata:
|
|
# name: proxmox-external
|
|
# namespace: home-apps
|
|
# spec:
|
|
# ports:
|
|
# - name: https
|
|
# port: 8006
|
|
# targetPort: 8006
|
|
# protocol: TCP
|
|
# ---
|
|
# apiVersion: discovery.k8s.io/v1
|
|
# kind: EndpointSlice
|
|
# metadata:
|
|
# name: proxmox-external
|
|
# namespace: home-apps
|
|
# labels:
|
|
# kubernetes.io/service-name: proxmox-external
|
|
# addressType: IPv4
|
|
# endpoints:
|
|
# - addresses:
|
|
# - 192.168.1.5
|
|
# ports:
|
|
# - name: https
|
|
# port: 8006
|
|
# protocol: TCP
|
|
# ---
|
|
# apiVersion: networking.k8s.io/v1
|
|
# kind: Ingress
|
|
# metadata:
|
|
# name: proxmox-external-ingress
|
|
# namespace: home-apps
|
|
# annotations:
|
|
# cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
|
# # Backend uses HTTPS, tell NGINX to use it
|
|
# nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
|
|
# # Skip TLS verification (self-signed cert on backend)
|
|
# nginx.ingress.kubernetes.io/proxy-ssl-verify: "false"
|
|
# spec:
|
|
# ingressClassName: nginx
|
|
# tls:
|
|
# - hosts:
|
|
# - proxmox.junv.cc
|
|
# secretName: proxmox-external-tls
|
|
# rules:
|
|
# - host: proxmox.junv.cc
|
|
# http:
|
|
# paths:
|
|
# - path: /
|
|
# pathType: Prefix
|
|
# backend:
|
|
# service:
|
|
# name: proxmox-external
|
|
# port:
|
|
# number: 8006
|
|
|
|
---
|
|
# ============================================================================
|
|
# COMPARISON: NPM vs Native Kubernetes
|
|
# ============================================================================
|
|
#
|
|
# Nginx Proxy Manager (*.r.junv.cc):
|
|
# ✅ Web UI - easy to add services
|
|
# ✅ Good for non-technical users
|
|
# ❌ Extra hop (NGINX Ingress → NPM → External Service)
|
|
# ❌ More resources (NPM pod + database)
|
|
# ❌ Not GitOps - config stored in database
|
|
#
|
|
# Native K8s (this template):
|
|
# ✅ GitOps - version controlled YAML
|
|
# ✅ Native K8s - no extra components
|
|
# ✅ Direct routing (NGINX Ingress → External Service)
|
|
# ✅ Automatic cert renewal via cert-manager
|
|
# ❌ Must write/copy YAML for each service
|
|
# ❌ No web UI
|
|
#
|
|
# RECOMMENDATION:
|
|
# - Use NPM (*.r.junv.cc) for quick ad-hoc services or non-tech users
|
|
# - Use this template for permanent services you want in GitOps
|