stack.basicstack.de/apps/pangolin/pangolin-deployment.yaml
CTO Agent 2e8e8ee3eb Fix Pangolin health probes: route to Web UI port 3002 instead of Internal API port 3001
Pangolin runs three servers:
- Dashboard API on port 3000
- Internal API on port 3001
- Web UI on port 3002

The current configuration was routing traffic to port 3001 (Internal API), which
returns 404 for the root path, causing health probe failures and restart loops.

Changes:
- Update containerPort from 3001 to 3002
- Update livenessProbe to check port 3002
- Update readinessProbe to check port 3002
- Update Service to expose port 3002
- Update Ingress to route to port 3002

This allows health probes to pass (port 3002 returns 200 for /) and routes
web traffic to the correct Web UI server.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-26 17:16:03 +00:00

149 lines
3.4 KiB
YAML

---
# Pangolin Data PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pangolin-data
namespace: pangolin
annotations:
argocd.argoproj.io/sync-options: Delete=false
spec:
accessModes:
- ReadWriteOnce
storageClassName: hcloud-volumes-encrypted
resources:
requests:
storage: 10Gi
---
# Pangolin Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: pangolin
namespace: pangolin
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: pangolin
template:
metadata:
labels:
app: pangolin
spec:
containers:
- name: pangolin
image: fosrl/pangolin:1.21.0
ports:
- containerPort: 3002
name: http
env:
- name: PANGOLIN_URL
value: "https://pangolin.basicstack.de"
- name: DATABASE_PATH
value: "/data/pangolin.db"
# OIDC Configuration
- name: OIDC_ENABLED
value: "true"
- name: OIDC_ISSUER
value: "https://auth.basicstack.de"
- name: OIDC_CLIENT_ID
valueFrom:
secretKeyRef:
name: pangolin-secrets
key: oidc-client-id
- name: OIDC_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: pangolin-secrets
key: oidc-client-secret
- name: OIDC_CALLBACK_URL
value: "https://pangolin.basicstack.de/auth/callback"
- name: OIDC_SCOPES
value: "openid profile email groups"
# Admin Credentials
- name: ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: pangolin-secrets
key: admin-password
volumeMounts:
- name: pangolin-data
mountPath: /data
- name: config
mountPath: /app/config/config.yml
subPath: config.yml
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "1Gi"
cpu: "500m"
livenessProbe:
httpGet:
path: /
port: 3002
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 6
readinessProbe:
httpGet:
path: /
port: 3002
initialDelaySeconds: 30
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 3
volumes:
- name: pangolin-data
persistentVolumeClaim:
claimName: pangolin-data
- name: config
configMap:
name: pangolin-config
---
# Pangolin Service
apiVersion: v1
kind: Service
metadata:
name: pangolin
namespace: pangolin
spec:
type: ClusterIP
selector:
app: pangolin
ports:
- port: 3002
targetPort: 3002
protocol: TCP
---
# Pangolin Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pangolin
namespace: pangolin
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
traefik.ingress.kubernetes.io/router.entrypoints: websecure
spec:
ingressClassName: traefik
tls:
- hosts:
- pangolin.basicstack.de
secretName: pangolin-tls
rules:
- host: pangolin.basicstack.de
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: pangolin
port:
number: 3002