diff --git a/k8s/app/auth.enc.yaml b/k8s/app/auth.enc.yaml new file mode 100644 index 0000000..3c79a05 --- /dev/null +++ b/k8s/app/auth.enc.yaml @@ -0,0 +1,28 @@ +apiVersion: ENC[AES256_GCM,data:TZY=,iv:sKXTsB2VO5ZAL6s/xzqcIgwtlNqk0xxOclb6ErYz02Q=,tag:yfK6Ax8mHaYZQVImcrsLcA==,type:str] +kind: ENC[AES256_GCM,data:Xr4rR7y/,iv:edAtbejU0PElYRZyAntlyuj5WnGf+Eksr+c636ovMc8=,tag:Hwv1higF27NzOTk/8EawYw==,type:str] +metadata: + name: ENC[AES256_GCM,data:Oe7W0UZxilfIUCIJRM4xP2sR,iv:w1NOlc20m8NX/WRT4JhXZ1MWjY0sFQa8ZJDeXemrL2M=,tag:cJ5TV8nKYHQhtLEnQa2mwQ==,type:str] + namespace: ENC[AES256_GCM,data:+4jnzJeY,iv:nfooi5BOr9Exx8r5m00HJRSnFYiSofV9/+heWjJNmww=,tag:TYoi+OJK6+1oe8SpyGeEEg==,type:str] + labels: + app.kubernetes.io/name: ENC[AES256_GCM,data:gxlL3o3C3mA9Th9OaQ==,iv:Hw4a9d9xAnX9MOdFkj3jf524I6wgBwPfoVYmXKUQgtU=,tag:9lTd7W1kx/Uv9E0MVMnclA==,type:str] + app.kubernetes.io/component: ENC[AES256_GCM,data:4DePKA==,iv:6f1Pvu+vWI+VkF8YrlSAM7yMvSckHWk+lu3qeMAz/ew=,tag:krszM09nNTo0EMtLJGw6Ew==,type:str] +type: ENC[AES256_GCM,data:Ri5WKSXq,iv:D1APSbaBiSL1FQS3eKQ2Jbl+BZ2EgKjIbpjh4TjRntU=,tag:rdCSkAFBkGn5qCmEZh6KxQ==,type:str] +stringData: + AUTHENTIK_ISSUER: ENC[AES256_GCM,data:LpLo+01McEw9gNwRqq06GgNXxi40QjmGXWKQfPBEw3rJ2vBaNyAbQv82vsFMdnrwUyTEulPsVvWHO9IS6fGip224UA==,iv:EUME2lcjH103kRgfktAnABT+HA5ckJ8FG/N8x/qKv5M=,tag:GhVZYiEFw8tSRUz/hxTROQ==,type:str] + AUTHENTIK_AUDIENCE: ENC[AES256_GCM,data:vhI7n2TG,iv:Q2E3aE6dx6BMqGHBNrEpUFwdEecmP/ZetkOmx5b4RB8=,tag:y+Wj9riWxFbOV+C04CGoJQ==,type:str] + JWT_CACHE_TTL_SECS: ENC[AES256_GCM,data:8ckJPw==,iv:/OL2ke9KSeUZHC2+wtqh7oNoU0YYlkxtbsXhjiCxLsk=,tag:LzPFyzFCXoaLs892/OKHCQ==,type:str] +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBlSDFVZWdWZ0tVREV1UWVI + YVJ5eVVZdGcwSzdjREkzbkFLTmpWZi9mRnc0CkJ2Ujh4ZWVLMjFUczIzVmYwWEo4 + eGpwZStvY1BYU1FHWEZDV1FhTE4zdWsKLS0tIDRJYmI5UzFVVFRCcCtUM1hYc3d3 + S29NczhTb044SzlVWVBlN2paL0hzSEEKo/Q48c7IxhII1QJIwNDgUp7fSnbe2KOa + cnRlDnfN/6+6xTePnu+4uhmCJqHKprdpH/2RPrj51k4psgiOZdBi7w== + -----END AGE ENCRYPTED FILE----- + recipient: age1e5fq3hwxy78psus2nfvmtmua36g0u3suk78ephw6246l974d2utsvn0hla + lastmodified: "2026-09-08T05:17:56Z" + mac: ENC[AES256_GCM,data:ug9mPSxKAr2ZAci0S2DeYRrmaeQJLeC9N4B6fVRjy+pSaul2tfa9v6trTgrCnEI+VCqQMcDtlUQmrBy6CHoxlcHn8inHXMj+56mVAmxv0riHiyQOwtiZGVm1xX5kKA/z2q9tyT13aSPcsoVeuX6BOuwNjHCdAegsSEbZhuzrP4c=,iv:b2XdpqSeZAwNmbtSMwysHlsfPUJJCAN8qScWEj/JF9c=,tag:d2R/sQCFzB7+P2GUJGnHCg==,type:str] + unencrypted_suffix: _unencrypted + version: 3.13.2 diff --git a/k8s/app/config.yaml b/k8s/app/config.yaml new file mode 100644 index 0000000..8dd8cfb --- /dev/null +++ b/k8s/app/config.yaml @@ -0,0 +1,23 @@ +# Non-sensitive environment variables for poimen-memory +# Change these without redeploying secrets. +apiVersion: v1 +kind: ConfigMap +metadata: + name: poimen-memory-config + namespace: poimen + labels: + app.kubernetes.io/name: poimen-memory + app.kubernetes.io/component: config +data: + # Auth mode: jwt | apikey + MEM_AUTH_MODE: "jwt" + # Rate limiting + MEM_RATE_LIMIT_INGEST: "100" + MEM_RATE_LIMIT_QUERY: "1000" + MEM_IDEMPOTENCY_TTL_SECS: "86400" + # Embeddings + MEM_EMBEDDING_BATCH_SIZE: "32" + # OpenSearch + OPENSEARCH_HOST: "opensearch.poimen.svc.cluster.local:9200" + # Obsidian + OBSIDIAN_URL: "http://obsidian-server.poimen.svc.cluster.local:8080" diff --git a/k8s/app/deployment.yaml b/k8s/app/deployment.yaml index 9a5b714..2bc2700 100644 --- a/k8s/app/deployment.yaml +++ b/k8s/app/deployment.yaml @@ -66,11 +66,16 @@ spec: secretKeyRef: name: poimen-memory-secrets key: llm-api-key - # Server config + # Server config (from ConfigMap) - name: MEM_PORT value: "8080" - name: MEM_HOME value: "/tmp" + envFrom: + - configMapRef: + name: poimen-memory-config + - secretRef: + name: poimen-memory-auth args: - serve - --port diff --git a/k8s/app/kustomization.yaml b/k8s/app/kustomization.yaml index 5bcf789..bc560ce 100644 --- a/k8s/app/kustomization.yaml +++ b/k8s/app/kustomization.yaml @@ -5,6 +5,9 @@ resources: # vault-pvc.yaml removed — memory service uses pgvector, not local storage - deployment.yaml - service.yaml + - config.yaml - obsidian.yaml - # Secret managed separately (SealedSecret in homelab) + # Legacy secret managed separately # - secrets.yaml +generators: + - secret-generator.yaml diff --git a/k8s/app/opensearch-deployment.yaml b/k8s/app/opensearch-deployment.yaml index dba40be..d1fb29f 100644 --- a/k8s/app/opensearch-deployment.yaml +++ b/k8s/app/opensearch-deployment.yaml @@ -53,11 +53,11 @@ data: subject_key: "sub" # JWKS endpoint from Authentik - jwks_uri: "https://authentik.riotpiao.com/application/o/poimen-memory/jwks/" + jwks_uri: "https://authentik.riotpiao.com/application/o/poimen/jwks/" jwks_refresh_interval_ms: 3600000 # 1 hour # Issuer validation - issuer: "https://authentik.riotpiao.com/application/o/poimen-memory/" + issuer: "https://authentik.riotpiao.com/application/o/poimen/" audience: null # Claims mapping diff --git a/k8s/app/secret-generator.yaml b/k8s/app/secret-generator.yaml new file mode 100644 index 0000000..7b4b376 --- /dev/null +++ b/k8s/app/secret-generator.yaml @@ -0,0 +1,11 @@ +# KSOPS generator — ArgoCD decrypts auth.enc.yaml at sync time +apiVersion: viaduct.ai/v1 +kind: ksops +metadata: + name: poimen-memory-auth-generator + annotations: + config.kubernetes.io/function: | + exec: + path: ksops +files: + - auth.enc.yaml