Files
home-docker/home-apps/demo-service.yaml
T
Junv (via Hermes) cbb50ac941 ci(demo-service): move manifest to home-apps/ root for ArgoCD
- ArgoCD 'home-apps' app tracks the home-apps/ directory at root level only
- Move k8s-manifest.yaml to home-apps/demo-service.yaml (sibling of other apps)
- Keep source code (Dockerfile, service.py, etc.) in home-apps/demo-service/ subdirectory
- Update workflow to update the new path
- Also fix imagePullSecrets placement (pod-level not container-level)
2026-06-14 12:10:22 +10:00

187 lines
4.2 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 is updated automatically by .github/workflows/build-demo-service.yml
# on every push that changes home-apps/demo-service/**
image: ghcr.io/wahyd4/demo-manager:git-49703c4
imagePullPolicy: Always
imagePullSecrets:
- name: github-image-pull-secret
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