Files
home-docker/home-apps/demo-service/k8s-manifest.yaml
T
Junv (via Hermes) a8a09c6675 fix(demo-service): restore admin UI, add canvas error page for 401/403/404
- admin-ui.html extracted from git history
- Caddy handle_errors serves canvas page for all HTML errors
- Error page served directly by Caddy (correct status code preserved)
- Republished hermes-stats and my-awesome-demo
- Modular file structure: _config.py, _loaders.py, admin-ui.html, error-page.html
2026-06-14 11:36:04 +10:00

183 lines
4.0 KiB
YAML

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: demo-sites-pvc
namespace: home-apps
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: nfs-client
---
apiVersion: v1
kind: ConfigMap
metadata:
name: demo-caddy-config
namespace: home-apps
data:
Caddyfile: |
# Caddy for Demo Service — internal server, TLS handled by Nginx Ingress
# Auth is handled by the Python API
:80 {
log {
output stdout
format json
}
handle /api/* {
reverse_proxy localhost:3000 {
header_up Host {host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto https
}
}
handle /admin {
reverse_proxy localhost:3000
}
handle /admin/* {
reverse_proxy localhost:3000
}
handle / {
reverse_proxy localhost:3000
}
# Block access to internal files
@blocked path_regexp blocked \.(draft|bak)$
handle @blocked {
error 404
}
# Static demo sites — public
handle_path /* {
root * /data/demos
file_server {
index index.html
}
}
header {
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
-Server
}
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-service
namespace: home-apps
labels:
app: demo-service
spec:
replicas: 1
selector:
matchLabels:
app: demo-service
template:
metadata:
labels:
app: demo-service
spec:
containers:
- name: caddy
image: mirror.gcr.io/caddy:2
ports:
- containerPort: 80
name: http
volumeMounts:
- name: caddy-config
mountPath: /etc/caddy/Caddyfile
subPath: Caddyfile
- name: demo-data
mountPath: /data/demos
- name: error-page
mountPath: /app/static/error-page.html
subPath: error-page.html
resources:
requests:
memory: 32Mi
cpu: 50m
limits:
memory: 128Mi
cpu: 200m
- name: api
image: docker.io/library/demo-manager:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000
name: api
env:
- name: DEMO_ROOT
value: /data/demos
- name: DEMO_API_KEY
value: hermes-demo-secret-key-change-me
- name: OAUTH_PROXY_URL
value: https://pass.junv.cc
volumeMounts:
- name: demo-data
mountPath: /data/demos
resources:
requests:
memory: 64Mi
cpu: 100m
limits:
memory: 256Mi
cpu: 500m
volumes:
- name: caddy-config
configMap:
name: demo-caddy-config
- name: demo-data
persistentVolumeClaim:
claimName: demo-sites-pvc
- name: error-page
configMap:
name: error-page-html
---
apiVersion: v1
kind: Service
metadata:
name: demo-service
namespace: home-apps
spec:
selector:
app: demo-service
ports:
- port: 80
targetPort: 80
name: http
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-service-ingress
namespace: home-apps
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
kubernetes.io/tls-acme: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- demo.junv.cc
secretName: demo-service-tls
rules:
- host: demo.junv.cc
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: demo-service
port:
number: 80