feat(apps): forte-drop web + mcp argocd apps (prod) #18
Reference in New Issue
Block a user
Delete Branch "feat/forte-drop-apps"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
ArgoCD Applications + Keycloak clients + sealed secret for forte-drop web + mcp (PROD).
What changed
forte-dropNamespace at sync-wave -1,Prune=false(avoids first-sync race for namespaced resources; doesn't cascade-delete on base removal).forterealm within ~2 min.apps/overlays/upc-dev(NOT base → stays out of upc-prod).Post-merge manual step (one-time)
auth-oidcSealedSecret for the web sidecar is still commented out — it needs theclient-secretthe Keycloak registrar writes toforte-drop-oidc-credentialsafter first sync:Depends on
Review
🤖 Generated with Claude Code
Two ArgoCD apps from the same forte-drop image: - forte-drop (web): admin + public drops, sidecar in oidc mode, ingress drop-k8s.hackathon.forteapps.net. - forte-drop-mcp (mcp): MCP-over-HTTP, sidecar in mcp mode, ingress mcp.drop-k8s.hackathon.forteapps.net. Plus two labeled Keycloak client config Secrets — the registrar creates the OIDC clients in the forte realm within ~2 min. Sealed secrets (forte-drop-secrets + auth-oidc) added in a follow-up commit by the maintainer: cd /Users/sten/dev/work/forte_k8/launchpad kubeseal --format=yaml \ --controller-name=sealed-secrets-controller \ --controller-namespace=kube-system \ < private/forte-drop-secrets.yaml \ > apps/base/forte-drop/forte-drop-secrets-sealed.yaml # auth-oidc: wait for registrar, copy client-secret into private/, # then seal as apps/base/forte-drop/auth-oidc-sealed.yaml. # (mcp deployment is sidecar type=mcp — no auth-oidc Secret needed; # only the web deployment requires it.)Inline review
@@ -0,0 +22,4 @@"directAccessGrantsEnabled": false,"serviceAccountsEnabled": false,"publicClient": false,"redirectUris": ["https://drop-k8s.hackathon.forteapps.net/auth/callback"],Hardcoded URL in redirectUris should be templated or moved to values to support different environments.
#ai-review-inline
@@ -0,0 +23,4 @@"serviceAccountsEnabled": false,"publicClient": false,"redirectUris": ["https://drop-k8s.hackathon.forteapps.net/auth/callback"],"webOrigins": ["https://drop-k8s.hackathon.forteapps.net"],Hardcoded URL in webOrigins should be templated or moved to values to support different environments.
#ai-review-inline
Inline review
@@ -0,0 +22,4 @@"directAccessGrantsEnabled": false,"serviceAccountsEnabled": false,"publicClient": false,"redirectUris": ["https://drop-k8s.hackathon.forteapps.net/auth/callback"],Hardcoded URL in redirectUris should be templated or moved to values to support different environments.
#ai-review-inline
@@ -0,0 +23,4 @@"serviceAccountsEnabled": false,"publicClient": false,"redirectUris": ["https://drop-k8s.hackathon.forteapps.net/auth/callback"],"webOrigins": ["https://drop-k8s.hackathon.forteapps.net"],Hardcoded URL in webOrigins should be templated or moved to values to support different environments.
#ai-review-inline
Inline review
@@ -0,0 +19,4 @@sources:- repoURL: ssh://git@git.forteapps.net:2222/Forte/forte-helm.gitpath: forteapptargetRevision: HEADUsing 'HEAD' for targetRevision can lead to unpredictable deployments - prefer a specific tag or branch.
#ai-review-inline
@@ -0,0 +24,4 @@valueFiles:- $values/forte-drop-mcp/values.yaml- repoURL: ssh://git@git.forteapps.net:2222/Forte/helm-prod-values.gittargetRevision: HEADUsing 'HEAD' for targetRevision can lead to unpredictable deployments - prefer a specific tag or branch.
#ai-review-inline
Inline review
@@ -0,0 +19,4 @@sources:- repoURL: ssh://git@git.forteapps.net:2222/Forte/forte-helm.gitpath: forteapptargetRevision: HEADUsing 'HEAD' for targetRevision can lead to unpredictable deployments - prefer a specific tag or branch.
#ai-review-inline
@@ -0,0 +24,4 @@valueFiles:- $values/forte-drop-mcp/values.yaml- repoURL: ssh://git@git.forteapps.net:2222/Forte/helm-prod-values.gittargetRevision: HEADUsing 'HEAD' for targetRevision can lead to unpredictable deployments - prefer a specific tag or branch.
#ai-review-inline
Inline review
@@ -0,0 +2,4 @@# Claude Desktop) discover this via /.well-known/oauth-protected-resource and# request tokens with aud=https://mcp.drop-k8s.hackathon.forteapps.net/mcp.apiVersion: v1kind: SecretPlain-text Secret should not be committed to Git - use SealedSecret or the Keycloak client registrar instead.
#ai-review-inline
@@ -0,0 +15,4 @@"name": "Forte Drop (MCP)","enabled": true,"protocol": "openid-connect","clientAuthenticatorType": "client-secret",Client secret authentication requires a secret value which should not be stored in plain-text Git.
#ai-review-inline
@@ -0,0 +19,4 @@sources:- repoURL: ssh://git@git.forteapps.net:2222/Forte/forte-helm.gitpath: forteapptargetRevision: HEADUsing 'HEAD' as targetRevision can lead to unstable deployments; prefer a specific tag, branch, or commit hash for better control.
#ai-review-inline
Inline review
@@ -0,0 +24,4 @@valueFiles:- $values/forte-drop/values.yaml- repoURL: ssh://git@git.forteapps.net:2222/Forte/helm-prod-values.gittargetRevision: HEADUsing 'HEAD' as targetRevision can lead to unstable deployments; prefer a specific tag, branch, or commit hash for better control.
#ai-review-inline
Inline review
@@ -0,0 +24,4 @@valueFiles:- $values/forte-drop/values.yaml- repoURL: ssh://git@git.forteapps.net:2222/Forte/helm-prod-values.gittargetRevision: HEADUsing 'HEAD' as targetRevision can lead to unstable deployments; prefer a specific tag, branch, or commit hash for better control.
#ai-review-inline
Inline review
@@ -0,0 +24,4 @@valueFiles:- $values/forte-drop/values.yaml- repoURL: ssh://git@git.forteapps.net:2222/Forte/helm-prod-values.gittargetRevision: HEADUsing 'HEAD' as targetRevision can lead to unstable deployments; prefer a specific tag, branch, or commit hash for better control.
#ai-review-inline
Inline review
@@ -0,0 +6,4 @@- keycloak-client-forte-drop.yaml- forte-drop-pdb.yaml- forte-drop-secrets-sealed.yaml# - auth-oidc-sealed.yaml # added in follow-up commit (after Keycloak registrar creates client_secret)Commented-out resource should be removed or uncommented if needed for proper GitOps hygiene.
#ai-review-inline
Inline review
@@ -6,3 +8,4 @@# No patches needed — base already has "upc-dev" paths# upc-dev is the default/base cluster# forte-drop and forte-drop-mcp are scoped to upc-dev only — they haveLine comment is truncated mid-sentence, making it unclear.
#ai-review-inline
@@ -7,2 +9,4 @@# No patches needed — base already has "upc-dev" paths# upc-dev is the default/base cluster# forte-drop and forte-drop-mcp are scoped to upc-dev only — they have# hackathon-domain hardcoded values and must not sync to upc-prod.Line comment is truncated mid-sentence, making it unclear.
#ai-review-inline
Inline review
@@ -6,3 +8,4 @@# No patches needed — base already has "upc-dev" paths# upc-dev is the default/base cluster# forte-drop and forte-drop-mcp are scoped to upc-dev only — they haveLine comment is truncated mid-sentence, making it unclear.
#ai-review-inline
@@ -7,2 +9,4 @@# No patches needed — base already has "upc-dev" paths# upc-dev is the default/base cluster# forte-drop and forte-drop-mcp are scoped to upc-dev only — they have# hackathon-domain hardcoded values and must not sync to upc-prod.Line comment is truncated mid-sentence, making it unclear.
#ai-review-inline
Inline review
@@ -0,0 +1,18 @@---Remove unnecessary '# added' comments from the SealedSecret file as they add no value and clutter the configuration.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1Remove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1kind: SealedSecretRemove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1kind: SealedSecretmetadata:Remove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +2,4 @@apiVersion: bitnami.com/v1alpha1kind: SealedSecretmetadata:name: forte-drop-secretsRemove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +4,4 @@metadata:name: forte-drop-secretsnamespace: forte-dropspec:Remove unnecessary '# added' comment.
#ai-review-inline
Inline review
@@ -0,0 +1,18 @@---Remove unnecessary '# added' comments from the SealedSecret file as they add no value and clutter the configuration.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1Remove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1kind: SealedSecretRemove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1kind: SealedSecretmetadata:Remove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +2,4 @@apiVersion: bitnami.com/v1alpha1kind: SealedSecretmetadata:name: forte-drop-secretsRemove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +4,4 @@metadata:name: forte-drop-secretsnamespace: forte-dropspec:Remove unnecessary '# added' comment.
#ai-review-inline
Inline review
@@ -0,0 +1,18 @@---Remove unnecessary '# added' comments from the SealedSecret file as they add no value and clutter the configuration.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1Remove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1kind: SealedSecretRemove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1kind: SealedSecretmetadata:Remove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +2,4 @@apiVersion: bitnami.com/v1alpha1kind: SealedSecretmetadata:name: forte-drop-secretsRemove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +4,4 @@metadata:name: forte-drop-secretsnamespace: forte-dropspec:Remove unnecessary '# added' comment.
#ai-review-inline
Inline review
@@ -0,0 +1,18 @@---Remove unnecessary '# added' comments from the SealedSecret file as they add no value and clutter the configuration.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1Remove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1kind: SealedSecretRemove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1kind: SealedSecretmetadata:Remove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +2,4 @@apiVersion: bitnami.com/v1alpha1kind: SealedSecretmetadata:name: forte-drop-secretsRemove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +4,4 @@metadata:name: forte-drop-secretsnamespace: forte-dropspec:Remove unnecessary '# added' comment.
#ai-review-inline
Inline review
@@ -0,0 +3,4 @@kind: SealedSecretmetadata:name: forte-drop-secretsnamespace: forte-dropRemove unnecessary '# added' comment.
#ai-review-inline
Inline review
@@ -0,0 +1,18 @@---Remove unnecessary '# added' comments from the SealedSecret file as they add no value and clutter the configuration.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1Remove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1kind: SealedSecretRemove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +1,18 @@---apiVersion: bitnami.com/v1alpha1kind: SealedSecretmetadata:Remove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +2,4 @@apiVersion: bitnami.com/v1alpha1kind: SealedSecretmetadata:name: forte-drop-secretsRemove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +4,4 @@metadata:name: forte-drop-secretsnamespace: forte-dropspec:Remove unnecessary '# added' comment.
#ai-review-inline
Inline review
@@ -0,0 +3,4 @@kind: SealedSecretmetadata:name: forte-drop-secretsnamespace: forte-dropRemove unnecessary '# added' comment.
#ai-review-inline
Inline review
@@ -0,0 +5,4 @@name: forte-drop-secretsnamespace: forte-dropspec:encryptedData:Remove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +6,4 @@namespace: forte-dropspec:encryptedData:PASSWORD_GATE_SECRET: AgAlZOSURqrQo7dqylFYetr50dWEgWNWTtBEjwgmIp/aFbr2X29xSD0gHpANIF+eXuZ1zGvTX9j2r4YoXgmcb/MjKMd85mYG7FTa0PFdxSxighvKOS3BWQwb7chgNFHMwiZNQAAMNUD6NjlfLZXS0V2SMI+5zz2siYjt8OfgLKfSx5v8+zDFb+pGrCUuUZlMaqFF2ZmOryYNMYYq69iE2EW8UQcP49tmP4aaPx5wIGq6nIo+Qc/c6L4K83nK5ijHEipkgEs0Z0vDTDT4ZBbV0Qyif+Uc1j0eG9+vvIkHBCrGC0WbLOCXiSwmzYF5U2uTRKUbkiPWfohW1Ds2hqveIwg6oSOhK6B+O9s17QagKenYBEER2WAXLq/BLbFpwwijZcGaVnIYsFLUjcheQVPEdaxIyOPh3/qhDjEBX7PevwDzEyOGB6W54TAndx/Go6+Mnvq4aefTOsD+Jy9Iqc3SI3mDoTCSuDMrgnE4QUlImm+Qtk+qPC35n36B9s7yqsHZISbC4zBGAwk7MFfhwTZ3t4z3WXBjevT1zFfs/NeQaRPlcRtO7656C62qroOITty0rT4JAbz93fanqHlqFmiMrYNUIu3wlbr/NGgMlZ1kRVnwIryVup5vljZmvhRtF+TGMwIA+3zbO9U3NasjScnh5sraOauIf7kVsBYTU/2oKb37HvroyILXd8fbpPq+lZ1ejcvVseC+heOI6hvvH/DYztgFn5s9egzcfauicCijWtk1jn0ym1RzOYBotP0VFhXX5bF1HHoGGwQWC32fgqFWwxJ8Remove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +7,4 @@spec:encryptedData:PASSWORD_GATE_SECRET: AgAlZOSURqrQo7dqylFYetr50dWEgWNWTtBEjwgmIp/aFbr2X29xSD0gHpANIF+eXuZ1zGvTX9j2r4YoXgmcb/MjKMd85mYG7FTa0PFdxSxighvKOS3BWQwb7chgNFHMwiZNQAAMNUD6NjlfLZXS0V2SMI+5zz2siYjt8OfgLKfSx5v8+zDFb+pGrCUuUZlMaqFF2ZmOryYNMYYq69iE2EW8UQcP49tmP4aaPx5wIGq6nIo+Qc/c6L4K83nK5ijHEipkgEs0Z0vDTDT4ZBbV0Qyif+Uc1j0eG9+vvIkHBCrGC0WbLOCXiSwmzYF5U2uTRKUbkiPWfohW1Ds2hqveIwg6oSOhK6B+O9s17QagKenYBEER2WAXLq/BLbFpwwijZcGaVnIYsFLUjcheQVPEdaxIyOPh3/qhDjEBX7PevwDzEyOGB6W54TAndx/Go6+Mnvq4aefTOsD+Jy9Iqc3SI3mDoTCSuDMrgnE4QUlImm+Qtk+qPC35n36B9s7yqsHZISbC4zBGAwk7MFfhwTZ3t4z3WXBjevT1zFfs/NeQaRPlcRtO7656C62qroOITty0rT4JAbz93fanqHlqFmiMrYNUIu3wlbr/NGgMlZ1kRVnwIryVup5vljZmvhRtF+TGMwIA+3zbO9U3NasjScnh5sraOauIf7kVsBYTU/2oKb37HvroyILXd8fbpPq+lZ1ejcvVseC+heOI6hvvH/DYztgFn5s9egzcfauicCijWtk1jn0ym1RzOYBotP0VFhXX5bF1HHoGGwQWC32fgqFWwxJ8PGPASSWORD: AgC5TnoWNEQK13fJHfxM8/ZHRlX85Kd11d8Ig+PgMGcLkxab7fvZJuzg7VX0iksK2UG/c1w1q8fRigMl1WWxmZvW2zM4/BsF45WR99QGt4Z1dhTFHdL5/7OZq2jDMYY5x/7gzCccb2pMAZS7p4rjnJM0EPd7YuMlhXZwIjXcck9Qu8GDpyEu1gg2A1tIfUzjvD+HeTbs6NLy16WHYpMG7Wv4WBNNPO+0k5Z0OwwXmIFSJvSMUHWBg/u2JCJ/1DL0zLyRCdXXOB8VVGok3TFbNscGQqFtFkaaVd0rA4Ao6abrsezcsfZFkcSsfVhATAw+M8ORYRC642BFJjzbhGSbDBsYq7aYyT86MVoqnRJgXK7/K2qzIeT9agM3sJm3ZuRjVCBDGdp/Xo2Rbtely8PH4GwEZI+vRFhTFAj5maduHMt0ZmScusOKuGvr0kFFXKw6XthBT3Arg5Q40upiBtPPrpWhWJYtgT3EfFuXNoc1c1Do7UZ5cmfe51sOBkMZjYk7+8B8a2IejKRflynBcCDQ7r2u76SF18dS5/R7jdOlreyL0yuEiULicKpX8BXPa9dN6Xja8OVPfIHvk0+TwnaYx7YaZDEXlyG0GKv9R3i0wykL1RdDCii6eRSJAp1UFmnCKZJJd9Y6djw7XBAd9G/ux8Vz45XkP+f2Kfgx32HmZsqPq2xaW5DoAeM33uDMfi3Ist+FVRtffuSrTQwBNp76VyhI7YY9MSB5JR1sBUGxGXtAGg==Remove unnecessary '# added' comment.
#ai-review-inline
Inline review
@@ -0,0 +5,4 @@name: forte-drop-secretsnamespace: forte-dropspec:encryptedData:Remove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +6,4 @@namespace: forte-dropspec:encryptedData:PASSWORD_GATE_SECRET: AgAlZOSURqrQo7dqylFYetr50dWEgWNWTtBEjwgmIp/aFbr2X29xSD0gHpANIF+eXuZ1zGvTX9j2r4YoXgmcb/MjKMd85mYG7FTa0PFdxSxighvKOS3BWQwb7chgNFHMwiZNQAAMNUD6NjlfLZXS0V2SMI+5zz2siYjt8OfgLKfSx5v8+zDFb+pGrCUuUZlMaqFF2ZmOryYNMYYq69iE2EW8UQcP49tmP4aaPx5wIGq6nIo+Qc/c6L4K83nK5ijHEipkgEs0Z0vDTDT4ZBbV0Qyif+Uc1j0eG9+vvIkHBCrGC0WbLOCXiSwmzYF5U2uTRKUbkiPWfohW1Ds2hqveIwg6oSOhK6B+O9s17QagKenYBEER2WAXLq/BLbFpwwijZcGaVnIYsFLUjcheQVPEdaxIyOPh3/qhDjEBX7PevwDzEyOGB6W54TAndx/Go6+Mnvq4aefTOsD+Jy9Iqc3SI3mDoTCSuDMrgnE4QUlImm+Qtk+qPC35n36B9s7yqsHZISbC4zBGAwk7MFfhwTZ3t4z3WXBjevT1zFfs/NeQaRPlcRtO7656C62qroOITty0rT4JAbz93fanqHlqFmiMrYNUIu3wlbr/NGgMlZ1kRVnwIryVup5vljZmvhRtF+TGMwIA+3zbO9U3NasjScnh5sraOauIf7kVsBYTU/2oKb37HvroyILXd8fbpPq+lZ1ejcvVseC+heOI6hvvH/DYztgFn5s9egzcfauicCijWtk1jn0ym1RzOYBotP0VFhXX5bF1HHoGGwQWC32fgqFWwxJ8Remove unnecessary '# added' comment.
#ai-review-inline
@@ -0,0 +7,4 @@spec:encryptedData:PASSWORD_GATE_SECRET: AgAlZOSURqrQo7dqylFYetr50dWEgWNWTtBEjwgmIp/aFbr2X29xSD0gHpANIF+eXuZ1zGvTX9j2r4YoXgmcb/MjKMd85mYG7FTa0PFdxSxighvKOS3BWQwb7chgNFHMwiZNQAAMNUD6NjlfLZXS0V2SMI+5zz2siYjt8OfgLKfSx5v8+zDFb+pGrCUuUZlMaqFF2ZmOryYNMYYq69iE2EW8UQcP49tmP4aaPx5wIGq6nIo+Qc/c6L4K83nK5ijHEipkgEs0Z0vDTDT4ZBbV0Qyif+Uc1j0eG9+vvIkHBCrGC0WbLOCXiSwmzYF5U2uTRKUbkiPWfohW1Ds2hqveIwg6oSOhK6B+O9s17QagKenYBEER2WAXLq/BLbFpwwijZcGaVnIYsFLUjcheQVPEdaxIyOPh3/qhDjEBX7PevwDzEyOGB6W54TAndx/Go6+Mnvq4aefTOsD+Jy9Iqc3SI3mDoTCSuDMrgnE4QUlImm+Qtk+qPC35n36B9s7yqsHZISbC4zBGAwk7MFfhwTZ3t4z3WXBjevT1zFfs/NeQaRPlcRtO7656C62qroOITty0rT4JAbz93fanqHlqFmiMrYNUIu3wlbr/NGgMlZ1kRVnwIryVup5vljZmvhRtF+TGMwIA+3zbO9U3NasjScnh5sraOauIf7kVsBYTU/2oKb37HvroyILXd8fbpPq+lZ1ejcvVseC+heOI6hvvH/DYztgFn5s9egzcfauicCijWtk1jn0ym1RzOYBotP0VFhXX5bF1HHoGGwQWC32fgqFWwxJ8PGPASSWORD: AgC5TnoWNEQK13fJHfxM8/ZHRlX85Kd11d8Ig+PgMGcLkxab7fvZJuzg7VX0iksK2UG/c1w1q8fRigMl1WWxmZvW2zM4/BsF45WR99QGt4Z1dhTFHdL5/7OZq2jDMYY5x/7gzCccb2pMAZS7p4rjnJM0EPd7YuMlhXZwIjXcck9Qu8GDpyEu1gg2A1tIfUzjvD+HeTbs6NLy16WHYpMG7Wv4WBNNPO+0k5Z0OwwXmIFSJvSMUHWBg/u2JCJ/1DL0zLyRCdXXOB8VVGok3TFbNscGQqFtFkaaVd0rA4Ao6abrsezcsfZFkcSsfVhATAw+M8ORYRC642BFJjzbhGSbDBsYq7aYyT86MVoqnRJgXK7/K2qzIeT9agM3sJm3ZuRjVCBDGdp/Xo2Rbtely8PH4GwEZI+vRFhTFAj5maduHMt0ZmScusOKuGvr0kFFXKw6XthBT3Arg5Q40upiBtPPrpWhWJYtgT3EfFuXNoc1c1Do7UZ5cmfe51sOBkMZjYk7+8B8a2IejKRflynBcCDQ7r2u76SF18dS5/R7jdOlreyL0yuEiULicKpX8BXPa9dN6Xja8OVPfIHvk0+TwnaYx7YaZDEXlyG0GKv9R3i0wykL1RdDCii6eRSJAp1UFmnCKZJJd9Y6djw7XBAd9G/ux8Vz45XkP+f2Kfgx32HmZsqPq2xaW5DoAeM33uDMfi3Ist+FVRtffuSrTQwBNp76VyhI7YY9MSB5JR1sBUGxGXtAGg==Remove unnecessary '# added' comment.
#ai-review-inline
Inline review
What changed: Added new ArgoCD Applications for Forte Drop web service and MCP service with supporting Kubernetes resources.
Affected services/namespaces:
forte-dropnamespaceforte-drop(web) andforte-drop-mcpapplicationsupc-devoverlay (excluded from production)Infrastructure impact:
Security notes:
#ai-review-summary
ai-review triage
Gått igjennom alle inline-kommentarene. Én fikset, resten avvist med begrunnelse.
Fikset
auth-oidc-sealed.yamllinje (61a8a2b) — erstattet med en tydelig NOTE som forklarer at det er et bevisst post-deploy steg (krever registrar-generert client-secret), ikke en disabled resource.Avvist — konvensjon
vaultwarden(https://vaultwarden.forteapps.net/*), gitea, grafana, argocd. Ingen templating finnes i launchpad for dette. Realmen er per-cluster (id.forteapps.net dev / id.fortedigital.com prod), og forte-drop er scoped til upc-dev-overlay. Templating ville vært en ny abstraksjon ingen andre clients bruker.targetRevision: HEAD→main(×3) — alle eksisterende apps (mcp10x, argo-mcp, ts-mcp) brukerHEAD(6/6). Å endre kun forte-drop = inkonsistent.Avvist — false positives
client.json), inneholder ingen secret-verdi.clientAuthenticatorType: client-secretbetyr Keycloak genererer secret; den står ikke i Git. Self-service-mønster per DEVELOPER-GUIDE.md.grep "# added"= ingen treff. Disse kommentarene finnes ikke i fila.Klar for menneskelig review.
Din AI gjør en feil tolkning med secrets. Du trenger ikke vente på at noe skal opprettes og lage SealedSecret.
Du har allerede definert Keycloak client her
apps/base/forte-drop/keycloak-client-forte-drop.yamlDette blir synket til keycloak namespace, en CronJob plukker opp og lager klienten og en secret, og dette pushes til ditt namespace som en secret. Så ingen ny SealedSecret skal være nødvendig.
Og du vurderer selv om
ai-reviewlabel er noe som gir deg verdi. Jeg ser at den av og til blir litt chatty med mange meldinger, men dette kan vi justere i instructions og kanskje ha et tak på 5-10 mest kritiske.@@ -0,0 +25,4 @@"redirectUris": ["https://drop-k8s.hackathon.forteapps.net/auth/callback"],"webOrigins": ["https://drop-k8s.hackathon.forteapps.net"],"defaultClientScopes": ["openid","email","profile"]}Det du mangler her er hvor du vil at
Secretskal bli laget og med hvilke keys:Detaljert forklaring, hvis interessant:
What a Developer Should Push
A developer deploying a new application must create a Config Secret in their application's namespace. This Secret contains the desired Keycloak client configuration.
The Format
Kubernetes Secret YAML:
How It Works: Client ID vs Client Secret
Client ID (Pre-determined by Developer):
clientId(e.g.,"myapp")client-id)Client Secret (Generated by Keycloak):
Keycloak auto-generates a cryptographically secure secret
The CronJob fetches it via:
GET /admin/realms/forte/clients/{uuid}/client-secretThe CronJob then creates/updates TWO Secrets:
1. Target Namespace Secret (
myapp/myapp-oidc-credentials):2. Central Backup Secret (
secrets/myapp-oidc-credentials):Developer Workflow
Create Config Secret in your Helm chart or Kustomize (in your app's namespace)
Deploy - Kyverno policy clones it to
keycloaknamespace automaticallyWait - CronJob picks it up within 2 minutes
Reference the generated credential Secret in your Deployment:
Change Detection
The CronJob computes a SHA256 hash of
client.json. If unchanged and credential Secret exists, it skips processing. To force re-sync, modify any field inclient.json(e.g., add trailing space toname).@@ -0,0 +10,4 @@keycloak.forteapps.net/client-config: "true"stringData:client.json: |{Du trenger ikke en egen klient for mcp server. Det lages automatisk når du legger inn
auth.type: mcpi helm values. Så denne kan slettes.Per platform review (danijel): - keycloak-client-forte-drop: add the secret{} block telling the registrar where to write the credential Secret + key names (forte-drop-oidc-credentials, client-id/client-secret). The forte-helm oidc sidecar consumes that registrar-created Secret — no manual auth-oidc SealedSecret step (removed that NOTE). - Delete keycloak-client-forte-drop-mcp: auth.type: mcp auto-registers the MCP client; no manual config needed. - Re-seal forte-drop-secrets with all shared env (BASE_DOMAIN, PG*, S3_*, PASSWORD_GATE_SECRET) so both deployments get identical values via envSecretName (values extraEnv now carries only APP_MODE).Oppdatert etter platform-review (@danijel.simeunovic, på helm-prod-values #3)
Reviewen kom på #3 men flere punkter gjaldt launchpad-manifestene her. Adressert i
338b4de:secret-blokken — forteller registrar hvor + med hvilke keys credential-secreten lages:keycloak-client-forte-drop-mcp.yaml—auth.type: mcpauto-registrerer mcp-klienten via chart. Ingen manuell config nødvendig.forte-drop-oidc-credentialsautomatisk og sidecaren (auth.type: oidc) konsumerer den. Ingen seal-by-hand. Slettet NOTE-en i kustomization.forte-drop-secretsmed all delt env (BASE_DOMAIN, PG*, S3_*, PASSWORD_GATE_SECRET, 12 keys) — begge deployments mounter den viaenvSecretName, så valuesextraEnvhar nå kunAPP_MODE.Tilhørende: app-en gjort helt auth-uvitende i egen forte_drop PR (slettet JWT/OIDC-kode). Klar for re-review.
Gode tilbakemeldinger! Jeg tror jeg forstår litt og litt mer 😄 den ai-reviewen er litt chatty ja!
Jeg har prøvd å justere litt og be om maks 10 kommentarer, men forstår ikke enda hvorfor den ignorerer... :)
Jeg så for meg at dette skulle plasseres i
apps/overlays/upc-dev, ikke ibase/.... Jeg innser at det ligger flere ting der som helst skulle flyttes, men det er min feil fordi de ble lagt inn før overlays kom inn i bilde.Skal jeg flytte det dit?
Ja, gjerne.
Flyttet til
apps/overlays/upc-dev(335dd13)Som avtalt —
forte-drop,forte-drop-mcpogforte-drop-postgresqlflyttet fraapps/base/tilapps/overlays/upc-dev/(rengit mv, historikk bevart). De var aldri listet iapps/base/kustomization.yaml— kun wiret inn via upc-dev-overlayet — så de hører hjemme her sammen meddbunk-demo.Utover selve flyttingen:
../../base/forte-drop*→ lokale refsforte-drop-postgresqlApplicationpath:apps/base/...→apps/overlays/upc-dev/forte-drop-postgresql/resources(selv-referanse til repoet, måtte følge med)Verifisert render-nøytralt:
kubectl kustomize apps/overlays/upc-devskiller seg kun på postgres-path-linjaapps/overlays/upc-prodrender byte-identisk (forte-drop når aldri prod)Review-gate (CLAUDE.md): codex +
/code-reviewbegge rene, ingen funn. Lot resten avapps/base/urørt — de andre appene der deles mellom clustere; de "flere ting" du nevnte kan tas i egen PR.Klar for re-review @danijel.simeunovic
Two ArgoCD apps from the same forte-drop image: - forte-drop (web): admin + public drops, sidecar in oidc mode, ingress drop-k8s.hackathon.forteapps.net. - forte-drop-mcp (mcp): MCP-over-HTTP, sidecar in mcp mode, ingress mcp.drop-k8s.hackathon.forteapps.net. Plus two labeled Keycloak client config Secrets — the registrar creates the OIDC clients in the forte realm within ~2 min. Sealed secrets (forte-drop-secrets + auth-oidc) added in a follow-up commit by the maintainer: cd /Users/sten/dev/work/forte_k8/launchpad kubeseal --format=yaml \ --controller-name=sealed-secrets-controller \ --controller-namespace=kube-system \ < private/forte-drop-secrets.yaml \ > apps/base/forte-drop/forte-drop-secrets-sealed.yaml # auth-oidc: wait for registrar, copy client-secret into private/, # then seal as apps/base/forte-drop/auth-oidc-sealed.yaml. # (mcp deployment is sidecar type=mcp — no auth-oidc Secret needed; # only the web deployment requires it.)Per platform review (danijel): - keycloak-client-forte-drop: add the secret{} block telling the registrar where to write the credential Secret + key names (forte-drop-oidc-credentials, client-id/client-secret). The forte-helm oidc sidecar consumes that registrar-created Secret — no manual auth-oidc SealedSecret step (removed that NOTE). - Delete keycloak-client-forte-drop-mcp: auth.type: mcp auto-registers the MCP client; no manual config needed. - Re-seal forte-drop-secrets with all shared env (BASE_DOMAIN, PG*, S3_*, PASSWORD_GATE_SECRET) so both deployments get identical values via envSecretName (values extraEnv now carries only APP_MODE).Du er utrolig god på detaljerte kommentarer og oppdateringer, veldig imponert! Bra jobba!