Commit Graph
35 Commits
Author SHA1 Message Date
Admin Bot 3188ce3e6a chore: add gateway-config-secret with matching fixes
CI / CI (pull_request) Successful in 2m57s
Also updates gateway-config-secret.enc.yaml with the same port fixes.

NOTE: This file is currently in plaintext and should be encrypted with SOPS:
  export SOPS_AGE_RECIPIENTS=age1e5fq3hwxy78psus2nfvmtmua36g0u3suk78ephw6246l974d2utsvn0hla
  sops --encrypt k8s/gateway-config-secret.enc.yaml

As mentioned in the repo structure, this should be encrypted before merge
to avoid exposing internal infrastructure details (service DNS names,
upstream addresses, auth configuration) in the git history.
2026-09-13 08:52:03 +09:00
Admin Bot 45254a48b0 fix: gateway authentik port from 80 to 9000
CI / CI (pull_request) Successful in 3m9s
NetworkPolicy allows gateway→iam only on ports 9000/9443, but config
used port 80 for JWKS fetch and token endpoints. This caused
'operation not permitted' errors and JWKS refresh failures.

Affects:
- auth.jwksUrl: uses port 9000 (Authentik HTTP)
- auth.tokenUrl: uses port 9000 for token exchange
- iam adapter upstream: routes to port 9000

Fixes: Gateway unable to validate JWT tokens, all chat/inference requests
returned 401 with 'token is unverifiable' error.
2026-09-13 08:48:08 +09:00
rock e61885254b feat: route qwen2.5:3b-instruct to CPU service (#20)
CI / CI (push) Successful in 3m4s
Route `qwen2.5:3b-instruct` to `qwen-cpu.llm-serving:80` (CPU on cp-2) instead of `ornith-predictor` (GPU on worker-1).

Companion to homelab GPU rebalance PR.
2026-09-09 02:10:59 +00:00
poimenandrock 1c64d8ff0e feat(config): add tokenUrl, clientId, clientSecret to auth config (#17)
Closes homelab#12 (P3.7)

## Changes

- `AuthConfig`: added `TokenURL`, `ClientID`, `ClientSecret` fields
- `loader.go`: reads `tokenUrl`/`clientId` from YAML, `ClientSecret` from `AUTH_CLIENT_SECRET` env
- `deployment.yaml`: `AUTH_CLIENT_SECRET` from `api-gw-client-secret` Secret (optional)
- `gateway-config-secret.enc.yaml` + `configmap.yaml`: added `tokenUrl` and `clientId`

## Secret never in YAML

`clientSecret` deliberately omitted from YAML struct. Loaded from env only.

## Tests

3 tests: full config load, env-only secret, backward compat (missing fields = zero).

Co-authored-by: poimen <[email protected]>
2026-09-08 23:43:29 +00:00
Admin Bot c2fa3445bd fix(s3): correct MinIO service port and allow egress
MinIO ClusterIP service listens on port 80 (targetPort 9000).
Config had port 9000 which caused 30s timeout then 502 — gateway
connected to service port 9000 which doesn't exist on the ClusterIP.

Changes:
- configmap.yaml: S3 upstream :9000 → :80
- gateway-config-secret.enc.yaml: same
- network-policy.yaml: add port 80 egress to storage namespace

Verified: S3 adapter now reaches MinIO (403 AccessDenied = auth issue,
not connectivity).
2026-09-08 09:58:36 -07:00
Admin Bot 2bcf6c82fc fix: move gateway config from plaintext ConfigMap to SOPS-encrypted Secret 2026-09-05 00:28:45 -07:00
Admin Bot 33910fe8e9 fix: update gateway auth to use api-gw provider with llm:inference permission
CI / Vet, test, build (push) Successful in 4m39s
CI / Build and push image (push) Successful in 1m59s
2026-09-04 21:52:36 -07:00
Admin Bot e7bd818459 temp: use portfolio-agent OIDC for LLM testing
CI / Vet, test, build (push) Successful in 4m4s
CI / Build and push image (push) Successful in 1m32s
2026-09-04 19:25:20 -07:00
Admin Bot a55e4c7b43 fix: use pod ports (9000/9443) for authentik egress, not service ports
CI / Vet, test, build (push) Successful in 4m3s
CI / Build and push image (push) Successful in 1m31s
2026-09-04 19:09:43 -07:00
Admin Bot d998d7e63c fix: add egress rules for iam, sqs, temporal, poimen, storage namespaces
CI / Build and push image (push) Canceled after 0s
CI / Vet, test, build (push) Canceled after 2m47s
2026-09-04 19:06:50 -07:00
Admin Bot ea6974cdad fix: Use internal Authentik for JWKS in gateway auth config
CI / Vet, test, build (push) Successful in 3m46s
CI / Build and push image (push) Successful in 1m20s
2026-09-03 16:33:36 -07:00
Admin Bot 8ba4e0facc fix: allow portfolio namespace to reach api-gateway for LLM chat
CI / Vet, test, build (push) Successful in 3m52s
CI / Build and push image (push) Successful in 1m17s
2026-09-01 11:15:23 -07:00
Admin Bot 14cc67833c feat(auth): wire JWT validation into /v1/* LLM endpoints
CI / Vet, test, build (push) Successful in 3m52s
CI / Build and push image (push) Successful in 1m17s
2026-08-31 23:01:59 -07:00
Admin Bot f9addf945d feat(tracing): add OpenTelemetry instrumentation to API gateway
CI / Vet, test, build (push) Successful in 3m43s
CI / Build and push image (push) Successful in 1m33s
- Add internal/tracing package with OTel tracer initialization
- HTTP middleware for server-side tracing (request/response attributes)
- Transport wrapper for client-side upstream call tracing
- Update proxy to use tracing transport
- Add OTEL_* env vars to k8s deployment

Traces flow: api-gateway -> otel-collector -> tempo -> grafana
2026-08-31 15:01:56 -07:00
Admin Bot de34a6c8cc fix(network): allow poimen namespace to access api-gateway
CI / Vet, test, build (push) Canceled after 2m38s
CI / Build and push image (push) Canceled after 0s
Enable Poimen orchestrator and worker pods to reach the LLM API gateway
in the api namespace.

The api-gateway NetworkPolicy was only allowing traffic from:
- ingress-nginx (external ingress)
- monitoring (Prometheus scraping)

Added new ingress rule to allow:
- poimen namespace (orchestrator-job and worker pods)
- Port 8080 (api-gateway service port)

This fixes the DNS resolution error where orchestrator pods couldn't
reach http://api-gateway.api:8080/health from within the cluster.

Managed via ArgoCD in homelab/k8s/argocd/apps/55-api-gateway.yaml
which syncs from this repo's k8s/ directory.
2026-08-31 14:59:29 -07:00
Admin Bot 95045e80f6 fix: SQS gateway JWT validation, MinIO/Temporal native JWT support
CI / Vet, test, build (push) Successful in 2m9s
CI / Build and push image (push) Successful in 45s
Auth strategy clarified per service:
- SQS: Gateway validates JWT (kmsvc code unverified, needs Phase 3)
- MinIO: Native JWT/OIDC support (validates itself, Phase 3: load-test)
- Temporal: Native JWT via jwtKeyProvider (Phase 3: configure)
- Memory, IAM: Services validate JWTs (dumb pipe)

SQS now requires Authorization header at gateway.
Phase 3 will implement actual JWT signature validation against Authentik.
2026-08-27 11:33:04 -07:00
Admin Bot 139bc80529 refactor: dispatcher as dumb pipe + add gRPC detection for Temporal
CI / Vet, test, build (push) Canceled after 24s
CI / Build and push image (push) Canceled after 0s
BREAKING CHANGE: Gateway no longer validates JWTs at dispatcher level.
Each upstream service (MinIO, Authentik, Temporal) validates bearer
tokens independently. Gateway passes Authorization header through unchanged.

Changes:
- Removed JWT validation from Dispatcher
- Removed internal/auth JWT validator usage
- Added gRPC URL scheme detection (grpc://)
- Added temporal-frontend with gRPC config (returns 501 not-implemented)
- All adapters now auth: required: false (services validate own tokens)
- Gateway is now a transparent routing layer, not auth gateway

gRPC forwarding requires grpcproxy middleware (future Phase 9).
For now, gRPC clients should connect directly to temporal-frontend:7233.
2026-08-27 11:16:15 -07:00
Admin Bot 57d64039d5 config: set memory to public (no JWT required), only iam protected
CI / Vet, test, build (push) Successful in 2m6s
CI / Build and push image (push) Successful in 45s
- sqs, s3, memory: public APIs (auth not required)
- memory: uses static API key internally, no JWT validation needed
- iam: protected by JWT validation + iam:admin capability check
- revoked tokens detected via JWKS key rotation (15min cache TTL)
2026-08-27 11:11:37 -07:00
Admin Bot 46dc24a26c fix: remove workflow adapter (temporal-frontend is gRPC-only, not HTTP)
CI / Vet, test, build (push) Successful in 2m3s
CI / Build and push image (push) Successful in 44s
Per homelab/project-usage/jwt-auth-rollout.md, temporal-frontend (port 7233)
is gRPC-specific for workers/SDKs. External HTTP access is unresolved design.
Disabled until gRPC ingress is added. Keeps only: sqs, memory, s3, iam.
2026-08-27 09:48:46 -07:00
Admin Bot e7536a80ce fix: correct SQS port from 8080 to 9090
CI / Vet, test, build (push) Successful in 2m11s
CI / Build and push image (push) Successful in 43s
2026-08-27 09:07:12 -07:00
Admin Bot f4193fe6e1 fix: correct service names in adapter upstreams (management-service.sqs, minio.storage, authentik-server.iam)
CI / Vet, test, build (push) Successful in 2m9s
CI / Build and push image (push) Successful in 48s
2026-08-27 09:03:58 -07:00
Admin Bot 50503445f7 fix: add serviceaccount manifest (was in deleted rbac.yaml)
CI / Vet, test, build (push) Successful in 2m5s
CI / Build and push image (push) Successful in 57s
2026-08-26 19:49:11 -07:00
Admin Bot 62e23d6876 chore: remove CRD, RBAC, and CR manifests (adapters now in ConfigMap)
CI / Vet, test, build (push) Successful in 2m8s
CI / Build and push image (push) Successful in 43s
2026-08-26 16:47:15 -07:00
Admin Bot 81e228e818 feat: add stakater reloader annotation for configmap auto-reload
CI / Vet, test, build (push) Successful in 2m5s
CI / Build and push image (push) Successful in 51s
2026-08-26 16:41:42 -07:00
Admin Bot 9c5fb0ce84 feat: load service adapters from ConfigMap, remove k8s API dependency
CI / Vet, test, build (push) Canceled after 2m10s
CI / Build and push image (push) Canceled after 0s
Adapters defined in config.yaml alongside routes and models.
Parsed by existing config loader, populated into registry at startup.
Removed: client-go deps, REST loader, informer, nginx proxy,
CiliumNetworkPolicy, apis/gateway/v1/ (duplicate types).
Kept: merged CI pipeline, imagePullPolicy Always, CA certs in Dockerfile.
2026-08-26 16:39:30 -07:00
Admin Bot 951a4399d6 feat: unblock 8.9 memory adapter extended (all 33 tasks GREEN)
Build and push / Build and push image (push) Successful in 1m1s
Build / Build and push image (push) Successful in 50s
CI / Test, vet, build (push) Failing after 1m9s
2026-08-26 13:54:23 -07:00
Admin Bot 425611ec42 feat: phase 8 serviceadapter crd rollout (32/33 tasks) 2026-08-26 13:47:36 -07:00
Story Crater Bot 9740334d24 ci(main): push latest tag on main commits, auto-deploy via kustomization
Build and push / Build and push image (push) Successful in 29s
Build / Build and push image (push) Successful in 27s
CI / Test, vet, build (push) Successful in 2m17s
2026-08-21 20:56:47 -07:00
Story Crater Bot a949707aaf deploy: bump gateway to v0.1.1 with llm-client label 2026-08-20 00:10:27 -07:00
Story Crater Bot 2aabd4288b fix: label gateway pods llm-client=true so upstreams accept them
llm-serving-default-deny admits only llm-client=true pods on 8080; without the
label every dispatch timed out with 502.
2026-08-20 00:06:23 -07:00
Story Crater Bot 500eb74577 fix: match namespaces by kubernetes.io/metadata.name in netpol egress
kube-system and llm-serving carry only the automatic label, so DNS and
upstream egress matched nothing and every dispatch failed with 502.
2026-08-20 00:04:17 -07:00
Story Crater Bot d7362985f9 deploy: bump gateway image to v0.1.0 2026-08-19 23:57:21 -07:00
Story Crater Bot fd45c2c0d3 deploy: pin gateway image to v0.0.0 2026-08-19 22:50:03 -07:00
Story Crater Bot b0ce2fb67c feat: build and publish the gateway image via Forgejo Actions
- Dockerfile: multi-stage, distroless nonroot, CGO_ENABLED=0 static, commit
  SHA stamped via VERSION build arg.
- .forgejo/workflows/ci.yaml: Forgejo reads .forgejo/, not .github/, and the
  runner declares only the "docker" label. Verify job on every push; image
  build and push gated to main.
- Drop .github/workflows/ci.yml — this remote is Forgejo, so it never ran.
- deployment.yaml: image from the Forgejo registry, forgejo-registry pull
  secret, runAsUser 65532 to match distroless nonroot.
- kustomization.yaml: pin the tag in one place. Promoting a build is a
  one-line newTag bump, never :latest.
2026-08-19 21:48:11 -07:00
Story Crater BotandClaude Opus 5 058f11cf2b chore: initial commit of Go API gateway
CI / Test (push) Canceled after 0s
CI / Vet (push) Canceled after 0s
CI / Build (push) Canceled after 0s
CI / Security (govulncheck) (push) Canceled after 0s
Baseline for the Kong replacement on api.riotpiao.com. Brings the working
tree under version control for the first time: gateway source, the task
board that drives the agent runs, test fixtures, and K8s manifests.

Anchor the gateway ignore rule to the repo root. Unanchored, "gateway"
also matched the cmd/gateway/ source directory, so the program entrypoint
was excluded from every commit.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-08-19 20:54:34 -07:00