vault: sync harbor pulls

This commit is contained in:
Brad Stein 2026-01-14 10:07:31 -03:00
parent b8e50bb0a6
commit b1f9df4d83
46 changed files with 254 additions and 141 deletions

View File

@ -21,7 +21,7 @@ spec:
kubernetes.io/arch: arm64 kubernetes.io/arch: arm64
node-role.kubernetes.io/worker: "true" node-role.kubernetes.io/worker: "true"
imagePullSecrets: imagePullSecrets:
- name: harbor-bstein-robot - name: harbor-regcred
containers: containers:
- name: backend - name: backend
image: registry.bstein.dev/bstein/bstein-dev-home-backend:0.1.1-92 # {"$imagepolicy": "bstein-dev-home:bstein-dev-home-backend"} image: registry.bstein.dev/bstein/bstein-dev-home-backend:0.1.1-92 # {"$imagepolicy": "bstein-dev-home:bstein-dev-home-backend"}

View File

@ -19,7 +19,7 @@ spec:
kubernetes.io/arch: arm64 kubernetes.io/arch: arm64
node-role.kubernetes.io/worker: "true" node-role.kubernetes.io/worker: "true"
imagePullSecrets: imagePullSecrets:
- name: harbor-bstein-robot - name: harbor-regcred
containers: containers:
- name: frontend - name: frontend
image: registry.bstein.dev/bstein/bstein-dev-home-frontend:0.1.1-92 # {"$imagepolicy": "bstein-dev-home:bstein-dev-home-frontend"} image: registry.bstein.dev/bstein/bstein-dev-home-frontend:0.1.1-92 # {"$imagepolicy": "bstein-dev-home:bstein-dev-home-frontend"}

View File

@ -6,7 +6,9 @@ resources:
- namespace.yaml - namespace.yaml
- image.yaml - image.yaml
- rbac.yaml - rbac.yaml
- vault-serviceaccount.yaml
- secretproviderclass.yaml - secretproviderclass.yaml
- vault-sync-deployment.yaml
- chat-ai-gateway-deployment.yaml - chat-ai-gateway-deployment.yaml
- chat-ai-gateway-service.yaml - chat-ai-gateway-service.yaml
- frontend-deployment.yaml - frontend-deployment.yaml

View File

@ -11,16 +11,16 @@ spec:
roleName: "bstein-dev-home" roleName: "bstein-dev-home"
objects: | objects: |
- objectName: "atlas-portal-db__PORTAL_DATABASE_URL" - objectName: "atlas-portal-db__PORTAL_DATABASE_URL"
secretPath: "kv/data/atlas/bstein-dev-home/atlas-portal-db" secretPath: "kv/data/atlas/portal/atlas-portal-db"
secretKey: "PORTAL_DATABASE_URL" secretKey: "PORTAL_DATABASE_URL"
- objectName: "bstein-dev-home-keycloak-admin__client_secret" - objectName: "bstein-dev-home-keycloak-admin__client_secret"
secretPath: "kv/data/atlas/bstein-dev-home/bstein-dev-home-keycloak-admin" secretPath: "kv/data/atlas/portal/bstein-dev-home-keycloak-admin"
secretKey: "client_secret" secretKey: "client_secret"
- objectName: "chat-ai-keys__homepage" - objectName: "chat-ai-keys__homepage"
secretPath: "kv/data/atlas/bstein-dev-home/chat-ai-keys" secretPath: "kv/data/atlas/portal/chat-ai-keys"
secretKey: "homepage" secretKey: "homepage"
- objectName: "chat-ai-keys__matrix" - objectName: "chat-ai-keys__matrix"
secretPath: "kv/data/atlas/bstein-dev-home/chat-ai-keys" secretPath: "kv/data/atlas/portal/chat-ai-keys"
secretKey: "matrix" secretKey: "matrix"
- objectName: "chat-ai-keys-runtime__homepage" - objectName: "chat-ai-keys-runtime__homepage"
secretPath: "kv/data/atlas/shared/chat-ai-keys-runtime" secretPath: "kv/data/atlas/shared/chat-ai-keys-runtime"
@ -34,3 +34,12 @@ spec:
- objectName: "portal-e2e-client__client_secret" - objectName: "portal-e2e-client__client_secret"
secretPath: "kv/data/atlas/shared/portal-e2e-client" secretPath: "kv/data/atlas/shared/portal-e2e-client"
secretKey: "client_secret" secretKey: "client_secret"
- objectName: "harbor-pull__dockerconfigjson"
secretPath: "kv/data/atlas/harbor-pull/bstein-dev-home"
secretKey: "dockerconfigjson"
secretObjects:
- secretName: harbor-regcred
type: kubernetes.io/dockerconfigjson
data:
- objectName: harbor-pull__dockerconfigjson
key: .dockerconfigjson

View File

@ -0,0 +1,6 @@
# services/bstein-dev-home/vault-serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: bstein-dev-home-vault-sync
namespace: bstein-dev-home

View File

@ -0,0 +1,34 @@
# services/bstein-dev-home/vault-sync-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: bstein-dev-home-vault-sync
namespace: bstein-dev-home
spec:
replicas: 1
selector:
matchLabels:
app: bstein-dev-home-vault-sync
template:
metadata:
labels:
app: bstein-dev-home-vault-sync
spec:
serviceAccountName: bstein-dev-home-vault-sync
containers:
- name: sync
image: alpine:3.20
command: ["/bin/sh", "-c"]
args:
- "sleep infinity"
volumeMounts:
- name: vault-secrets
mountPath: /vault/secrets
readOnly: true
volumes:
- name: vault-secrets
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: bstein-dev-home-vault

View File

@ -20,7 +20,7 @@ spec:
kubernetes.io/arch: arm64 kubernetes.io/arch: arm64
node-role.kubernetes.io/worker: "true" node-role.kubernetes.io/worker: "true"
imagePullSecrets: imagePullSecrets:
- name: harbor-bstein-robot - name: harbor-regcred
containers: containers:
- name: sync - name: sync
image: registry.bstein.dev/bstein/bstein-dev-home-backend:0.1.1-92 # {"$imagepolicy": "bstein-dev-home:bstein-dev-home-backend"} image: registry.bstein.dev/bstein/bstein-dev-home-backend:0.1.1-92 # {"$imagepolicy": "bstein-dev-home:bstein-dev-home-backend"}

View File

@ -4,6 +4,8 @@ kind: ServiceAccount
metadata: metadata:
name: comms-secrets-ensure name: comms-secrets-ensure
namespace: comms namespace: comms
imagePullSecrets:
- name: harbor-regcred
--- ---
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole kind: ClusterRole

View File

@ -4,6 +4,8 @@ kind: ServiceAccount
metadata: metadata:
name: mas-admin-client-secret-writer name: mas-admin-client-secret-writer
namespace: comms namespace: comms
imagePullSecrets:
- name: harbor-regcred
--- ---
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
kind: Role kind: Role

View File

@ -4,6 +4,8 @@ kind: ServiceAccount
metadata: metadata:
name: mas-db-ensure name: mas-db-ensure
namespace: comms namespace: comms
imagePullSecrets:
- name: harbor-regcred
--- ---
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole kind: ClusterRole

View File

@ -61,6 +61,9 @@ spec:
- objectName: "synapse-oidc__client-secret" - objectName: "synapse-oidc__client-secret"
secretPath: "kv/data/atlas/comms/synapse-oidc" secretPath: "kv/data/atlas/comms/synapse-oidc"
secretKey: "client-secret" secretKey: "client-secret"
- objectName: "harbor-pull__dockerconfigjson"
secretPath: "kv/data/atlas/harbor-pull/comms"
secretKey: "dockerconfigjson"
secretObjects: secretObjects:
- secretName: turn-shared-secret - secretName: turn-shared-secret
type: Opaque type: Opaque
@ -132,3 +135,8 @@ spec:
data: data:
- objectName: synapse-oidc__client-secret - objectName: synapse-oidc__client-secret
key: client-secret key: client-secret
- secretName: harbor-regcred
type: kubernetes.io/dockerconfigjson
data:
- objectName: harbor-pull__dockerconfigjson
key: .dockerconfigjson

View File

@ -4,6 +4,8 @@ kind: ServiceAccount
metadata: metadata:
name: othrys-synapse-signingkey-job name: othrys-synapse-signingkey-job
namespace: comms namespace: comms
imagePullSecrets:
- name: harbor-regcred
--- ---
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
kind: Role kind: Role

View File

@ -18,6 +18,8 @@ spec:
fsGroupChangePolicy: OnRootMismatch fsGroupChangePolicy: OnRootMismatch
nodeSelector: nodeSelector:
node-role.kubernetes.io/worker: "true" node-role.kubernetes.io/worker: "true"
imagePullSecrets:
- name: harbor-regcred
affinity: affinity:
nodeAffinity: nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: requiredDuringSchedulingIgnoredDuringExecution:

View File

@ -13,9 +13,17 @@ spec:
- objectName: "xmr-payout__address" - objectName: "xmr-payout__address"
secretPath: "kv/data/atlas/crypto/xmr-payout" secretPath: "kv/data/atlas/crypto/xmr-payout"
secretKey: "address" secretKey: "address"
- objectName: "harbor-pull__dockerconfigjson"
secretPath: "kv/data/atlas/harbor-pull/crypto"
secretKey: "dockerconfigjson"
secretObjects: secretObjects:
- secretName: xmr-payout - secretName: xmr-payout
type: Opaque type: Opaque
data: data:
- objectName: xmr-payout__address - objectName: xmr-payout__address
key: address key: address
- secretName: harbor-regcred
type: kubernetes.io/dockerconfigjson
data:
- objectName: harbor-pull__dockerconfigjson
key: .dockerconfigjson

View File

@ -29,6 +29,8 @@ spec:
values: values:
externalURL: https://registry.bstein.dev externalURL: https://registry.bstein.dev
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: harbor-regcred
expose: expose:
type: ingress type: ingress
tls: tls:

View File

@ -49,6 +49,9 @@ spec:
- objectName: "harbor-oidc__CONFIG_OVERWRITE_JSON" - objectName: "harbor-oidc__CONFIG_OVERWRITE_JSON"
secretPath: "kv/data/atlas/harbor/harbor-oidc" secretPath: "kv/data/atlas/harbor/harbor-oidc"
secretKey: "CONFIG_OVERWRITE_JSON" secretKey: "CONFIG_OVERWRITE_JSON"
- objectName: "harbor-pull__dockerconfigjson"
secretPath: "kv/data/atlas/harbor-pull/harbor"
secretKey: "dockerconfigjson"
secretObjects: secretObjects:
- secretName: harbor-core - secretName: harbor-core
type: Opaque type: Opaque
@ -85,3 +88,8 @@ spec:
data: data:
- objectName: harbor-oidc__CONFIG_OVERWRITE_JSON - objectName: harbor-oidc__CONFIG_OVERWRITE_JSON
key: CONFIG_OVERWRITE_JSON key: CONFIG_OVERWRITE_JSON
- secretName: harbor-regcred
type: kubernetes.io/dockerconfigjson
data:
- objectName: harbor-pull__dockerconfigjson
key: .dockerconfigjson

View File

@ -6,7 +6,9 @@ resources:
- namespace.yaml - namespace.yaml
- pvc.yaml - pvc.yaml
- serviceaccount.yaml - serviceaccount.yaml
- vault-serviceaccount.yaml
- secretproviderclass.yaml - secretproviderclass.yaml
- vault-sync-deployment.yaml
- deployment.yaml - deployment.yaml
- realm-settings-job.yaml - realm-settings-job.yaml
- portal-e2e-client-job.yaml - portal-e2e-client-job.yaml
@ -33,9 +35,6 @@ configMapGenerator:
files: files:
- test_portal_token_exchange.py=scripts/tests/test_portal_token_exchange.py - test_portal_token_exchange.py=scripts/tests/test_portal_token_exchange.py
- test_keycloak_execute_actions_email.py=scripts/tests/test_keycloak_execute_actions_email.py - test_keycloak_execute_actions_email.py=scripts/tests/test_keycloak_execute_actions_email.py
- name: portal-e2e-client-secret-sync-script
files:
- sso_portal_e2e_client_secret_sync.sh=scripts/sso_portal_e2e_client_secret_sync.sh
- name: harbor-oidc-secret-ensure-script - name: harbor-oidc-secret-ensure-script
files: files:
- harbor_oidc_secret_ensure.sh=scripts/harbor_oidc_secret_ensure.sh - harbor_oidc_secret_ensure.sh=scripts/harbor_oidc_secret_ensure.sh

View File

@ -4,6 +4,8 @@ kind: ServiceAccount
metadata: metadata:
name: mas-secrets-ensure name: mas-secrets-ensure
namespace: sso namespace: sso
imagePullSecrets:
- name: harbor-regcred
--- ---
apiVersion: batch/v1 apiVersion: batch/v1
kind: Job kind: Job

View File

@ -1,32 +0,0 @@
# services/keycloak/portal-e2e-client-secret-sync-cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: portal-e2e-client-secret-sync
namespace: sso
spec:
schedule: "*/10 * * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 3
jobTemplate:
spec:
backoffLimit: 1
template:
spec:
serviceAccountName: portal-e2e-client-secret-sync
restartPolicy: Never
containers:
- name: sync
image: bitnami/kubectl@sha256:554ab88b1858e8424c55de37ad417b16f2a0e65d1607aa0f3fe3ce9b9f10b131
command: ["/usr/bin/env", "bash"]
args: ["/scripts/sso_portal_e2e_client_secret_sync.sh"]
volumeMounts:
- name: script
mountPath: /scripts
readOnly: true
volumes:
- name: script
configMap:
name: portal-e2e-client-secret-sync-script
defaultMode: 0555

View File

@ -1,31 +0,0 @@
# services/keycloak/portal-e2e-client-secret-sync-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: portal-e2e-client-secret-sync
namespace: sso
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: portal-e2e-client-secret-sync-source
namespace: sso
rules:
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["portal-e2e-client"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: portal-e2e-client-secret-sync-source
namespace: sso
subjects:
- kind: ServiceAccount
name: portal-e2e-client-secret-sync
namespace: sso
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: portal-e2e-client-secret-sync-source

View File

@ -2,7 +2,7 @@
apiVersion: batch/v1 apiVersion: batch/v1
kind: Job kind: Job
metadata: metadata:
name: keycloak-realm-settings-17 name: keycloak-realm-settings-18
namespace: sso namespace: sso
spec: spec:
backoffLimit: 0 backoffLimit: 0
@ -29,15 +29,15 @@ spec:
- name: KEYCLOAK_REALM - name: KEYCLOAK_REALM
value: atlas value: atlas
- name: KEYCLOAK_SMTP_HOST - name: KEYCLOAK_SMTP_HOST
value: mailu-front.mailu-mailserver.svc.cluster.local value: smtp.postmarkapp.com
- name: KEYCLOAK_SMTP_PORT - name: KEYCLOAK_SMTP_PORT
value: "25" value: "587"
- name: KEYCLOAK_SMTP_FROM - name: KEYCLOAK_SMTP_FROM
value: no-reply@bstein.dev value: no-reply-sso@bstein.dev
- name: KEYCLOAK_SMTP_FROM_NAME - name: KEYCLOAK_SMTP_FROM_NAME
value: Atlas SSO value: Atlas SSO
- name: KEYCLOAK_SMTP_REPLY_TO - name: KEYCLOAK_SMTP_REPLY_TO
value: no-reply@bstein.dev value: no-reply-sso@bstein.dev
- name: KEYCLOAK_SMTP_REPLY_TO_NAME - name: KEYCLOAK_SMTP_REPLY_TO_NAME
value: Atlas SSO value: Atlas SSO
command: ["/bin/sh", "-c"] command: ["/bin/sh", "-c"]
@ -118,8 +118,10 @@ spec:
"fromDisplayName": os.environ["KEYCLOAK_SMTP_FROM_NAME"], "fromDisplayName": os.environ["KEYCLOAK_SMTP_FROM_NAME"],
"replyTo": os.environ["KEYCLOAK_SMTP_REPLY_TO"], "replyTo": os.environ["KEYCLOAK_SMTP_REPLY_TO"],
"replyToDisplayName": os.environ["KEYCLOAK_SMTP_REPLY_TO_NAME"], "replyToDisplayName": os.environ["KEYCLOAK_SMTP_REPLY_TO_NAME"],
"auth": "false", "user": os.environ["KEYCLOAK_SMTP_USER"],
"starttls": "false", "password": os.environ["KEYCLOAK_SMTP_PASSWORD"],
"auth": "true",
"starttls": "true",
"ssl": "false", "ssl": "false",
} }
) )

View File

@ -24,3 +24,6 @@ export PORTAL_E2E_CLIENT_SECRET="$(read_secret portal-e2e-client__client_secret)
export LDAP_ADMIN_PASSWORD="$(read_secret openldap-admin__LDAP_ADMIN_PASSWORD)" export LDAP_ADMIN_PASSWORD="$(read_secret openldap-admin__LDAP_ADMIN_PASSWORD)"
export LDAP_CONFIG_PASSWORD="$(read_secret openldap-admin__LDAP_CONFIG_PASSWORD)" export LDAP_CONFIG_PASSWORD="$(read_secret openldap-admin__LDAP_CONFIG_PASSWORD)"
export LDAP_BIND_PASSWORD="${LDAP_ADMIN_PASSWORD}" export LDAP_BIND_PASSWORD="${LDAP_ADMIN_PASSWORD}"
export KEYCLOAK_SMTP_USER="$(read_secret postmark-relay__relay-username)"
export KEYCLOAK_SMTP_PASSWORD="$(read_secret postmark-relay__relay-password)"

View File

@ -1,20 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
SOURCE_NAMESPACE="${SOURCE_NAMESPACE:-sso}"
DEST_NAMESPACE="${DEST_NAMESPACE:-bstein-dev-home}"
SECRET_NAME="${SECRET_NAME:-portal-e2e-client}"
client_id="$(kubectl -n "${SOURCE_NAMESPACE}" get secret "${SECRET_NAME}" -o jsonpath='{.data.client_id}')"
client_secret="$(kubectl -n "${SOURCE_NAMESPACE}" get secret "${SECRET_NAME}" -o jsonpath='{.data.client_secret}')"
cat <<EOF | kubectl -n "${DEST_NAMESPACE}" apply -f - >/dev/null
apiVersion: v1
kind: Secret
metadata:
name: ${SECRET_NAME}
type: Opaque
data:
client_id: ${client_id}
client_secret: ${client_secret}
EOF

View File

@ -46,6 +46,15 @@ spec:
- objectName: "oauth2-proxy-oidc__cookie_secret" - objectName: "oauth2-proxy-oidc__cookie_secret"
secretPath: "kv/data/atlas/sso/oauth2-proxy-oidc" secretPath: "kv/data/atlas/sso/oauth2-proxy-oidc"
secretKey: "cookie_secret" secretKey: "cookie_secret"
- objectName: "postmark-relay__relay-username"
secretPath: "kv/data/atlas/shared/postmark-relay"
secretKey: "relay-username"
- objectName: "postmark-relay__relay-password"
secretPath: "kv/data/atlas/shared/postmark-relay"
secretKey: "relay-password"
- objectName: "harbor-pull__dockerconfigjson"
secretPath: "kv/data/atlas/harbor-pull/sso"
secretKey: "dockerconfigjson"
secretObjects: secretObjects:
- secretName: openldap-admin - secretName: openldap-admin
type: Opaque type: Opaque
@ -63,3 +72,8 @@ spec:
key: client_secret key: client_secret
- objectName: oauth2-proxy-oidc__cookie_secret - objectName: oauth2-proxy-oidc__cookie_secret
key: cookie_secret key: cookie_secret
- secretName: harbor-regcred
type: kubernetes.io/dockerconfigjson
data:
- objectName: harbor-pull__dockerconfigjson
key: .dockerconfigjson

View File

@ -4,3 +4,5 @@ kind: ServiceAccount
metadata: metadata:
name: sso-vault name: sso-vault
namespace: sso namespace: sso
imagePullSecrets:
- name: harbor-regcred

View File

@ -0,0 +1,6 @@
# services/keycloak/vault-serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: sso-vault-sync
namespace: sso

View File

@ -0,0 +1,34 @@
# services/keycloak/vault-sync-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: sso-vault-sync
namespace: sso
spec:
replicas: 1
selector:
matchLabels:
app: sso-vault-sync
template:
metadata:
labels:
app: sso-vault-sync
spec:
serviceAccountName: sso-vault-sync
containers:
- name: sync
image: alpine:3.20
command: ["/bin/sh", "-c"]
args:
- "sleep infinity"
volumeMounts:
- name: vault-secrets
mountPath: /vault/secrets
readOnly: true
volumes:
- name: vault-secrets
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: sso-vault

View File

@ -22,7 +22,7 @@ spec:
repository: registry.bstein.dev/streaming/data-prepper repository: registry.bstein.dev/streaming/data-prepper
tag: "2.8.0" tag: "2.8.0"
imagePullSecrets: imagePullSecrets:
- name: harbor-robot-pipeline - name: harbor-regcred
config: config:
data-prepper-config.yaml: | data-prepper-config.yaml: |
ssl: false ssl: false

View File

@ -19,6 +19,9 @@ spec:
- objectName: "oauth2-proxy-logs-oidc__cookie_secret" - objectName: "oauth2-proxy-logs-oidc__cookie_secret"
secretPath: "kv/data/atlas/logging/oauth2-proxy-logs-oidc" secretPath: "kv/data/atlas/logging/oauth2-proxy-logs-oidc"
secretKey: "cookie_secret" secretKey: "cookie_secret"
- objectName: "harbor-pull__dockerconfigjson"
secretPath: "kv/data/atlas/harbor-pull/logging"
secretKey: "dockerconfigjson"
secretObjects: secretObjects:
- secretName: oauth2-proxy-logs-oidc - secretName: oauth2-proxy-logs-oidc
type: Opaque type: Opaque
@ -29,3 +32,8 @@ spec:
key: client_secret key: client_secret
- objectName: oauth2-proxy-logs-oidc__cookie_secret - objectName: oauth2-proxy-logs-oidc__cookie_secret
key: cookie_secret key: cookie_secret
- secretName: harbor-regcred
type: kubernetes.io/dockerconfigjson
data:
- objectName: harbor-pull__dockerconfigjson
key: .dockerconfigjson

View File

@ -40,6 +40,9 @@ spec:
- objectName: "mailu-sync-credentials__client-secret" - objectName: "mailu-sync-credentials__client-secret"
secretPath: "kv/data/atlas/mailu/mailu-sync-credentials" secretPath: "kv/data/atlas/mailu/mailu-sync-credentials"
secretKey: "client-secret" secretKey: "client-secret"
- objectName: "harbor-pull__dockerconfigjson"
secretPath: "kv/data/atlas/harbor-pull/mailu-mailserver"
secretKey: "dockerconfigjson"
secretObjects: secretObjects:
- secretName: mailu-secret - secretName: mailu-secret
type: Opaque type: Opaque
@ -76,3 +79,8 @@ spec:
key: client-id key: client-id
- objectName: mailu-sync-credentials__client-secret - objectName: mailu-sync-credentials__client-secret
key: client-secret key: client-secret
- secretName: harbor-regcred
type: kubernetes.io/dockerconfigjson
data:
- objectName: harbor-pull__dockerconfigjson
key: .dockerconfigjson

View File

@ -5,6 +5,8 @@ kind: ServiceAccount
metadata: metadata:
name: vip-controller name: vip-controller
namespace: mailu-mailserver namespace: mailu-mailserver
imagePullSecrets:
- name: harbor-regcred
--- ---
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
kind: Role kind: Role

View File

@ -22,6 +22,8 @@ spec:
prometheus.io/port: "9400" prometheus.io/port: "9400"
spec: spec:
serviceAccountName: default serviceAccountName: default
imagePullSecrets:
- name: harbor-regcred
runtimeClassName: nvidia runtimeClassName: nvidia
affinity: affinity:
nodeAffinity: nodeAffinity:

View File

@ -275,8 +275,8 @@ spec:
GF_AUTH_ANONYMOUS_ORG_ROLE: "Viewer" GF_AUTH_ANONYMOUS_ORG_ROLE: "Viewer"
GF_SMTP_ENABLED: "true" GF_SMTP_ENABLED: "true"
GF_SMTP_HOST: "smtp.postmarkapp.com:587" GF_SMTP_HOST: "smtp.postmarkapp.com:587"
GF_SMTP_FROM: "alerts@bstein.dev" GF_SMTP_FROM: "no-reply-grafana@bstein.dev"
GF_SMTP_FROM_NAME: "Atlas Alerts" GF_SMTP_FROM_NAME: "Atlas Grafana"
GRAFANA_ALERT_EMAILS: "alerts@bstein.dev" GRAFANA_ALERT_EMAILS: "alerts@bstein.dev"
GF_SECURITY_ALLOW_EMBEDDING: "true" GF_SECURITY_ALLOW_EMBEDDING: "true"
GF_AUTH_GENERIC_OAUTH_ENABLED: "true" GF_AUTH_GENERIC_OAUTH_ENABLED: "true"

View File

@ -31,6 +31,9 @@ spec:
- objectName: "postmark-relay__relay-password" - objectName: "postmark-relay__relay-password"
secretPath: "kv/data/atlas/shared/postmark-relay" secretPath: "kv/data/atlas/shared/postmark-relay"
secretKey: "relay-password" secretKey: "relay-password"
- objectName: "harbor-pull__dockerconfigjson"
secretPath: "kv/data/atlas/harbor-pull/monitoring"
secretKey: "dockerconfigjson"
secretObjects: secretObjects:
- secretName: grafana-admin - secretName: grafana-admin
type: Opaque type: Opaque
@ -55,3 +58,8 @@ spec:
key: username key: username
- objectName: postmark-relay__relay-password - objectName: postmark-relay__relay-password
key: password key: password
- secretName: harbor-regcred
type: kubernetes.io/dockerconfigjson
data:
- objectName: harbor-pull__dockerconfigjson
key: .dockerconfigjson

View File

@ -18,13 +18,13 @@ data:
'default_phone_region' => 'US', 'default_phone_region' => 'US',
'mail_smtpmode' => 'smtp', 'mail_smtpmode' => 'smtp',
'mail_sendmailmode' => 'smtp', 'mail_sendmailmode' => 'smtp',
'mail_smtphost' => 'mail.bstein.dev', 'mail_smtphost' => 'smtp.postmarkapp.com',
'mail_smtpport' => '587', 'mail_smtpport' => '587',
'mail_smtpsecure' => 'tls', 'mail_smtpsecure' => 'tls',
'mail_smtpauth' => true, 'mail_smtpauth' => true,
'mail_smtpauthtype' => 'LOGIN', 'mail_smtpauthtype' => 'LOGIN',
'mail_domain' => 'bstein.dev', 'mail_domain' => 'bstein.dev',
'mail_from_address' => 'no-reply', 'mail_from_address' => 'no-reply-nextcloud',
'datadirectory' => '/var/www/html/data', 'datadirectory' => '/var/www/html/data',
'apps_paths' => 'apps_paths' =>
array ( array (

View File

@ -194,13 +194,13 @@ spec:
value: https://cloud.bstein.dev value: https://cloud.bstein.dev
# SMTP (external secret: nextcloud-smtp with keys username, password) # SMTP (external secret: nextcloud-smtp with keys username, password)
- name: SMTP_HOST - name: SMTP_HOST
value: mail.bstein.dev value: smtp.postmarkapp.com
- name: SMTP_PORT - name: SMTP_PORT
value: "587" value: "587"
- name: SMTP_SECURE - name: SMTP_SECURE
value: tls value: tls
- name: MAIL_FROM_ADDRESS - name: MAIL_FROM_ADDRESS
value: no-reply value: no-reply-nextcloud
- name: MAIL_DOMAIN - name: MAIL_DOMAIN
value: bstein.dev value: bstein.dev
# OIDC (external secret: nextcloud-oidc with keys client-id, client-secret) # OIDC (external secret: nextcloud-oidc with keys client-id, client-secret)

View File

@ -32,11 +32,11 @@ spec:
secretPath: "kv/data/atlas/nextcloud/nextcloud-oidc" secretPath: "kv/data/atlas/nextcloud/nextcloud-oidc"
secretKey: "client-secret" secretKey: "client-secret"
- objectName: "nextcloud-smtp__smtp-username" - objectName: "nextcloud-smtp__smtp-username"
secretPath: "kv/data/atlas/nextcloud/nextcloud-smtp" secretPath: "kv/data/atlas/shared/postmark-relay"
secretKey: "smtp-username" secretKey: "relay-username"
- objectName: "nextcloud-smtp__smtp-password" - objectName: "nextcloud-smtp__smtp-password"
secretPath: "kv/data/atlas/nextcloud/nextcloud-smtp" secretPath: "kv/data/atlas/shared/postmark-relay"
secretKey: "smtp-password" secretKey: "relay-password"
- objectName: "keycloak-admin__username" - objectName: "keycloak-admin__username"
secretPath: "kv/data/atlas/shared/keycloak-admin" secretPath: "kv/data/atlas/shared/keycloak-admin"
secretKey: "username" secretKey: "username"

View File

@ -71,7 +71,7 @@ spec:
- name: SMTP_SECURE - name: SMTP_SECURE
value: "false" value: "false"
- name: SMTP_PORT - name: SMTP_PORT
value: "25" value: "587"
volumeMounts: volumeMounts:
- name: user-data - name: user-data
mountPath: /var/lib/outline/data mountPath: /var/lib/outline/data

View File

@ -44,11 +44,11 @@ spec:
secretPath: "kv/data/atlas/outline/outline-smtp" secretPath: "kv/data/atlas/outline/outline-smtp"
secretKey: "SMTP_HOST" secretKey: "SMTP_HOST"
- objectName: "SMTP_PASSWORD" - objectName: "SMTP_PASSWORD"
secretPath: "kv/data/atlas/outline/outline-smtp" secretPath: "kv/data/atlas/shared/postmark-relay"
secretKey: "SMTP_PASSWORD" secretKey: "relay-password"
- objectName: "SMTP_USERNAME" - objectName: "SMTP_USERNAME"
secretPath: "kv/data/atlas/outline/outline-smtp" secretPath: "kv/data/atlas/shared/postmark-relay"
secretKey: "SMTP_USERNAME" secretKey: "relay-username"
- objectName: "AWS_ACCESS_KEY_ID" - objectName: "AWS_ACCESS_KEY_ID"
secretPath: "kv/data/atlas/outline/outline-s3" secretPath: "kv/data/atlas/outline/outline-s3"
secretKey: "AWS_ACCESS_KEY_ID" secretKey: "AWS_ACCESS_KEY_ID"

View File

@ -19,6 +19,8 @@ spec:
nodeSelector: nodeSelector:
kubernetes.io/arch: arm64 kubernetes.io/arch: arm64
node-role.kubernetes.io/worker: "true" node-role.kubernetes.io/worker: "true"
imagePullSecrets:
- name: harbor-regcred
securityContext: securityContext:
runAsNonRoot: true runAsNonRoot: true
runAsUser: 65532 runAsUser: 65532

View File

@ -19,6 +19,9 @@ spec:
- objectName: "pegasus-secrets__JELLYFIN_API_KEY" - objectName: "pegasus-secrets__JELLYFIN_API_KEY"
secretPath: "kv/data/atlas/pegasus/pegasus-secrets" secretPath: "kv/data/atlas/pegasus/pegasus-secrets"
secretKey: "JELLYFIN_API_KEY" secretKey: "JELLYFIN_API_KEY"
- objectName: "harbor-pull__dockerconfigjson"
secretPath: "kv/data/atlas/harbor-pull/jellyfin"
secretKey: "dockerconfigjson"
secretObjects: secretObjects:
- secretName: pegasus-secrets - secretName: pegasus-secrets
type: Opaque type: Opaque
@ -29,3 +32,8 @@ spec:
key: JELLYFIN_URL key: JELLYFIN_URL
- objectName: pegasus-secrets__JELLYFIN_API_KEY - objectName: pegasus-secrets__JELLYFIN_API_KEY
key: JELLYFIN_API_KEY key: JELLYFIN_API_KEY
- secretName: harbor-regcred
type: kubernetes.io/dockerconfigjson
data:
- objectName: harbor-pull__dockerconfigjson
key: .dockerconfigjson

View File

@ -44,8 +44,8 @@ spec:
secretPath: "kv/data/atlas/planka/planka-smtp" secretPath: "kv/data/atlas/planka/planka-smtp"
secretKey: "SMTP_HOST" secretKey: "SMTP_HOST"
- objectName: "SMTP_PASSWORD" - objectName: "SMTP_PASSWORD"
secretPath: "kv/data/atlas/planka/planka-smtp" secretPath: "kv/data/atlas/shared/postmark-relay"
secretKey: "SMTP_PASSWORD" secretKey: "relay-password"
- objectName: "SMTP_PORT" - objectName: "SMTP_PORT"
secretPath: "kv/data/atlas/planka/planka-smtp" secretPath: "kv/data/atlas/planka/planka-smtp"
secretKey: "SMTP_PORT" secretKey: "SMTP_PORT"
@ -56,5 +56,5 @@ spec:
secretPath: "kv/data/atlas/planka/planka-smtp" secretPath: "kv/data/atlas/planka/planka-smtp"
secretKey: "SMTP_TLS_REJECT_UNAUTHORIZED" secretKey: "SMTP_TLS_REJECT_UNAUTHORIZED"
- objectName: "SMTP_USER" - objectName: "SMTP_USER"
secretPath: "kv/data/atlas/planka/planka-smtp" secretPath: "kv/data/atlas/shared/postmark-relay"
secretKey: "SMTP_USER" secretKey: "relay-username"

View File

@ -76,35 +76,35 @@ path \"kv/metadata/atlas/${path}\" {
} }
write_policy_and_role "outline" "outline" "outline-vault" \ write_policy_and_role "outline" "outline" "outline-vault" \
"outline/*" "" "outline/* shared/postmark-relay" ""
write_policy_and_role "planka" "planka" "planka-vault" \ write_policy_and_role "planka" "planka" "planka-vault" \
"planka/*" "" "planka/* shared/postmark-relay" ""
write_policy_and_role "bstein-dev-home" "bstein-dev-home" "bstein-dev-home" \ write_policy_and_role "bstein-dev-home" "bstein-dev-home" "bstein-dev-home,bstein-dev-home-vault-sync" \
"bstein-dev-home/* shared/chat-ai-keys-runtime shared/portal-e2e-client" "" "portal/* shared/chat-ai-keys-runtime shared/portal-e2e-client harbor-pull/bstein-dev-home" ""
write_policy_and_role "gitea" "gitea" "gitea-vault" \ write_policy_and_role "gitea" "gitea" "gitea-vault" \
"gitea/*" "" "gitea/*" ""
write_policy_and_role "vaultwarden" "vaultwarden" "vaultwarden-vault" \ write_policy_and_role "vaultwarden" "vaultwarden" "vaultwarden-vault" \
"vaultwarden/*" "" "vaultwarden/* shared/postmark-relay" ""
write_policy_and_role "sso" "sso" "sso-vault,mas-secrets-ensure" \ write_policy_and_role "sso" "sso" "sso-vault,sso-vault-sync,mas-secrets-ensure" \
"sso/* shared/keycloak-admin shared/portal-e2e-client" "" "sso/* shared/keycloak-admin shared/portal-e2e-client shared/postmark-relay harbor-pull/sso" ""
write_policy_and_role "mailu-mailserver" "mailu-mailserver" "mailu-vault-sync" \ write_policy_and_role "mailu-mailserver" "mailu-mailserver" "mailu-vault-sync" \
"mailu/* shared/postmark-relay" "" "mailu/* shared/postmark-relay harbor-pull/mailu-mailserver" ""
write_policy_and_role "harbor" "harbor" "harbor-vault-sync" \ write_policy_and_role "harbor" "harbor" "harbor-vault-sync" \
"harbor/*" "" "harbor/* harbor-pull/harbor" ""
write_policy_and_role "nextcloud" "nextcloud" "nextcloud-vault" \ write_policy_and_role "nextcloud" "nextcloud" "nextcloud-vault" \
"nextcloud/* shared/keycloak-admin" "" "nextcloud/* shared/keycloak-admin shared/postmark-relay" ""
write_policy_and_role "comms" "comms" "comms-vault,atlasbot" \ write_policy_and_role "comms" "comms" "comms-vault,atlasbot" \
"comms/* shared/chat-ai-keys-runtime" "" "comms/* shared/chat-ai-keys-runtime harbor-pull/comms" ""
write_policy_and_role "jenkins" "jenkins" "jenkins-vault-sync" \ write_policy_and_role "jenkins" "jenkins" "jenkins-vault-sync" \
"jenkins/*" "" "jenkins/*" ""
write_policy_and_role "monitoring" "monitoring" "monitoring-vault-sync" \ write_policy_and_role "monitoring" "monitoring" "monitoring-vault-sync" \
"monitoring/* shared/postmark-relay" "" "monitoring/* shared/postmark-relay harbor-pull/monitoring" ""
write_policy_and_role "logging" "logging" "logging-vault-sync" \ write_policy_and_role "logging" "logging" "logging-vault-sync" \
"logging/*" "" "logging/* harbor-pull/logging" ""
write_policy_and_role "pegasus" "jellyfin" "pegasus-vault-sync" \ write_policy_and_role "pegasus" "jellyfin" "pegasus-vault-sync" \
"pegasus/*" "" "pegasus/* harbor-pull/jellyfin" ""
write_policy_and_role "crypto" "crypto" "crypto-vault-sync" \ write_policy_and_role "crypto" "crypto" "crypto-vault-sync" \
"crypto/*" "" "crypto/* harbor-pull/crypto" ""
write_policy_and_role "sso-secrets" "sso" "mas-secrets-ensure" \ write_policy_and_role "sso-secrets" "sso" "mas-secrets-ensure" \
"shared/keycloak-admin" \ "shared/keycloak-admin" \

View File

@ -36,19 +36,19 @@ spec:
- name: DOMAIN - name: DOMAIN
value: "https://vault.bstein.dev" value: "https://vault.bstein.dev"
- name: SMTP_HOST - name: SMTP_HOST
value: "mailu-front.mailu-mailserver.svc.cluster.local" value: "smtp.postmarkapp.com"
- name: SMTP_PORT - name: SMTP_PORT
value: "25" value: "587"
- name: SMTP_SECURITY - name: SMTP_SECURITY
value: "starttls" value: "starttls"
- name: SMTP_ACCEPT_INVALID_HOSTNAMES - name: SMTP_ACCEPT_INVALID_HOSTNAMES
value: "true" value: "false"
- name: SMTP_ACCEPT_INVALID_CERTS - name: SMTP_ACCEPT_INVALID_CERTS
value: "true" value: "false"
- name: SMTP_FROM - name: SMTP_FROM
value: "postmaster@bstein.dev" value: "no-reply-vaultwarden@bstein.dev"
- name: SMTP_FROM_NAME - name: SMTP_FROM_NAME
value: "Atlas Vaultwarden" value: "Vaultwarden"
ports: ports:
- name: http - name: http
containerPort: 80 containerPort: 80

View File

@ -9,3 +9,6 @@ read_secret() {
export DATABASE_URL="$(read_secret vaultwarden-db-url__DATABASE_URL)" export DATABASE_URL="$(read_secret vaultwarden-db-url__DATABASE_URL)"
export ADMIN_TOKEN="$(read_secret vaultwarden-admin__ADMIN_TOKEN)" export ADMIN_TOKEN="$(read_secret vaultwarden-admin__ADMIN_TOKEN)"
export SMTP_USERNAME="$(read_secret postmark-relay__relay-username)"
export SMTP_PASSWORD="$(read_secret postmark-relay__relay-password)"

View File

@ -16,3 +16,9 @@ spec:
- objectName: "vaultwarden-admin__ADMIN_TOKEN" - objectName: "vaultwarden-admin__ADMIN_TOKEN"
secretPath: "kv/data/atlas/vaultwarden/vaultwarden-admin" secretPath: "kv/data/atlas/vaultwarden/vaultwarden-admin"
secretKey: "ADMIN_TOKEN" secretKey: "ADMIN_TOKEN"
- objectName: "postmark-relay__relay-username"
secretPath: "kv/data/atlas/shared/postmark-relay"
secretKey: "relay-username"
- objectName: "postmark-relay__relay-password"
secretPath: "kv/data/atlas/shared/postmark-relay"
secretKey: "relay-password"