The Phase-1 NetworkPolicy from DEV-614 allowed ingress only from the
`pangolin` namespace, under the mistaken assumption that Traefik runs
there. In this cluster Traefik lives in `kube-system`; Pangolin only
renders the Traefik dynamic config and does not sit in the request
path. The policy therefore blocked external calls to
`approval.proofedmesh.basicstack.de`, which 502'd at Traefik.
Point the ingress rule at `kube-system/app.kubernetes.io/name=traefik`
and update the inline comment to match reality.
Verified: `curl -sS https://approval.proofedmesh.basicstack.de/healthz`
→ `{"status":"ok"}` (HTTP 200, LetsEncrypt cert via Traefik ACME).
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Phase-1 Subtask 8/10 (parent DEV-606):
- deploy/approval-service/: SA (no auto-mount), Deployment (replicas=2,
distroless-nonroot, read-only rootfs), ClusterIP :8080, NetworkPolicy
(ingress from pangolin namespace only; egress to signing-service,
transparency-log, trust-pg in agent-trust + pocket-id + DNS), README.
- 10-secret-dev.example.yaml template + the real 10-secret-dev.sealed.yaml
carrying the Pocket-ID client id/secret, WebAuthn RP config, and the
dev signing-service bearer; unsealed in-cluster to Secret
approval-service-dev.
- services/approval-service/Dockerfile: BuildKit multi-stage, context-at-
repo-root, matches the signing/verification/dummy-sink pattern.
- .forgejo/workflows/build-images.yml: new approval-service job pushing
harbor.basicstack.de/basicstack/approval-service:{sha,main} on main.
- Pocket-ID: created proofedmesh-admin group + OIDC client
"ProofedMesh Approval" with PKCE enforced, callback
https://approval.proofedmesh.basicstack.de/oidc/callback, group
restriction to proofedmesh-admin. Client secret stored as Paperclip
secret proposal and in the SealedSecret above — never pasted inline.
Deployment applied cluster-side pending the first CI image build:
`kubectl apply -f deploy/approval-service/` is green; pods ErrImagePull
until the Forgejo workflow completes and pushes the :main tag.
Co-Authored-By: Paperclip <noreply@paperclip.ing>