Moves the production deploy from AWS to the Frostmoln production cluster (namespace sites).
deploy-prod (AWS) has failed since CI left AWS: the runners have no k8s.unbound.se context, so the site on AWS still runs an older image. It's replaced by deploy-prod-frostmoln, the same pattern as Shiny's deploy-frostmoln-staging: FROSTMOLN_PRODUCTION_DEPLOY_KEY + FROSTMOLN_PRODUCTION_CLUSTER_ID (org), BUILDTOOLS_FROSTMOLN_PRODUCTION (org, target prod-frostmoln), deploy prod-frostmoln -n sites.
Frostmoln enforces restricted Pod Security: the served image is nginxinc/nginx-unprivileged (uid 101, port 8080), with a matching securityContext; the Service is ClusterIP.
Checked locally: the image serves /health and / (200) as uid 101 with all capabilities dropped.
Merge after infra's feat/frostmoln-production-sites is applied (namespace + org secret). The hostnames keep pointing at AWS until the Route 53 switch, a separate step; the certificate is issued after that.
Moves the production deploy from AWS to the Frostmoln production cluster (namespace `sites`).
- `deploy-prod` (AWS) has failed since CI left AWS: the runners have no `k8s.unbound.se` context, so the site on AWS still runs an older image. It's replaced by `deploy-prod-frostmoln`, the same pattern as Shiny's `deploy-frostmoln-staging`: `FROSTMOLN_PRODUCTION_DEPLOY_KEY` + `FROSTMOLN_PRODUCTION_CLUSTER_ID` (org), `BUILDTOOLS_FROSTMOLN_PRODUCTION` (org, target `prod-frostmoln`), `deploy prod-frostmoln -n sites`.
- Frostmoln enforces restricted Pod Security: the served image is `nginxinc/nginx-unprivileged` (uid 101, port 8080), with a matching securityContext; the Service is ClusterIP.
- `ingress-prod.yaml` (ALB) → `ingress-prod-frostmoln.yaml` (Traefik, Let's Encrypt).
Checked locally: the image serves `/health` and `/` (200) as uid 101 with all capabilities dropped.
**Merge after** infra's `feat/frostmoln-production-sites` is applied (namespace + org secret). The hostnames keep pointing at AWS until the Route 53 switch, a separate step; the certificate is issued after that.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01Ma8eHhW59hLAJuLzBnLvUu
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 sites), the way Shiny deploys to Frostmoln staging.
Frostmoln enforces restricted Pod Security, so the served image is
nginx-unprivileged (uid 101, port 8080) with a matching securityContext.
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
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Moves the production deploy from AWS to the Frostmoln production cluster (namespace
sites).deploy-prod(AWS) has failed since CI left AWS: the runners have nok8s.unbound.secontext, so the site on AWS still runs an older image. It's replaced bydeploy-prod-frostmoln, the same pattern as Shiny'sdeploy-frostmoln-staging:FROSTMOLN_PRODUCTION_DEPLOY_KEY+FROSTMOLN_PRODUCTION_CLUSTER_ID(org),BUILDTOOLS_FROSTMOLN_PRODUCTION(org, targetprod-frostmoln),deploy prod-frostmoln -n sites.nginxinc/nginx-unprivileged(uid 101, port 8080), with a matching securityContext; the Service is ClusterIP.ingress-prod.yaml(ALB) →ingress-prod-frostmoln.yaml(Traefik, Let's Encrypt).Checked locally: the image serves
/healthand/(200) as uid 101 with all capabilities dropped.Merge after infra's
feat/frostmoln-production-sitesis applied (namespace + org secret). The hostnames keep pointing at AWS until the Route 53 switch, a separate step; the certificate is issued after that.🤖 Generated with Claude Code
https://claude.ai/code/session_01Ma8eHhW59hLAJuLzBnLvUu