feat: deploy to Frostmoln production

The AWS deploy-prod job has failed since CI left AWS (no k8s.unbound.se
context on the runners). Deploys now go to the Frostmoln production
cluster (namespace schemas), the way the sites do.

Frostmoln enforces restricted Pod Security: the pod runs as the image's
non-root user with a matching securityContext. The prod-only manifests
move to the prod-frostmoln target; the ALB ingress becomes a Traefik one
with a Let's Encrypt certificate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ma8eHhW59hLAJuLzBnLvUu
This commit is contained in:
argoyleandClaude Opus 5.5 committed 2026-10-14 22:15:38 +02:00
1 parent acf6f8df62
commit 1646ee1bc3
8 files changed
+63 -38

No files matched your search

File renamed without changes.
+13 -5
View File
@@ -23,6 +23,11 @@ spec:
app.kubernetes.io/name: schemas-app
app.kubernetes.io/instance: schemas
spec:
securityContext:
runAsNonRoot: true
runAsUser: 101
seccompProfile:
type: RuntimeDefault
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
@@ -39,19 +44,23 @@ spec:
- name: schemas-app
image: ${IMAGE}
imagePullPolicy: IfNotPresent
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
ports:
- containerPort: 80
- containerPort: 8080
readinessProbe:
httpGet:
path: /
port: 80
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 5
livenessProbe:
httpGet:
path: /
port: 80
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
@@ -71,9 +80,8 @@ metadata:
labels:
app.kubernetes.io/name: schemas-app
spec:
type: NodePort
selector:
app.kubernetes.io/name: schemas-app
ports:
- port: 80
targetPort: 80
targetPort: 8080
+21
View File
@@ -0,0 +1,21 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: schemas-app
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
traefik.ingress.kubernetes.io/router.tls.certresolver: letsencrypt
spec:
ingressClassName: traefik
rules:
- host: "schemas.unbound.se"
http:
paths:
# Everything but /query, which the schemas API's longer path takes.
- path: /
pathType: Prefix
backend:
service:
name: schemas-app
port:
number: 80
-25
View File
@@ -1,25 +0,0 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: schemas-app-ingress
annotations:
alb.ingress.kubernetes.io/group.name: "default"
alb.ingress.kubernetes.io/group.order: "15"
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: instance
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]'
alb.ingress.kubernetes.io/ssl-redirect: "443"
alb.ingress.kubernetes.io/healthcheck-path: '/'
spec:
ingressClassName: "alb"
rules:
- host: "schemas.unbound.se"
http:
paths:
- path: /*
pathType: ImplementationSpecific
backend:
service:
name: schemas-app
port:
number: 80
File renamed without changes.