# Bridge between External Secrets and Vaultwarden: `bw serve` logged in as the # bot account. Needs the Secret bitwarden-cli (created by hand; the bot logs in # with email + password, so keep password login enabled for it, i.e. no # SSO_ONLY, or switch the image to API-key login): # kubectl -n external-secrets create secret generic bitwarden-cli \ # --from-literal=BW_HOST=https://vw.hexor.cy \ # --from-literal=BW_USERNAME= --from-literal=BW_PASSWORD= # Image source: Dockerfile-bitwarden-cli in this directory. apiVersion: apps/v1 kind: Deployment metadata: name: bitwarden-cli labels: reloader.stakater.com/auto: "true" app.kubernetes.io/instance: bitwarden-cli app.kubernetes.io/name: bitwarden-cli spec: replicas: 1 strategy: type: RollingUpdate selector: matchLabels: app.kubernetes.io/name: bitwarden-cli app.kubernetes.io/instance: bitwarden-cli template: metadata: labels: app.kubernetes.io/name: bitwarden-cli app.kubernetes.io/instance: bitwarden-cli spec: nodeSelector: kubernetes.io/arch: amd64 containers: - name: bitwarden-cli image: ultradesu/bitwarden-client:2025.12.1 imagePullPolicy: IfNotPresent resources: requests: memory: "128Mi" cpu: "300m" limits: memory: "512Mi" cpu: "1000m" env: - name: BW_HOST valueFrom: secretKeyRef: name: bitwarden-cli key: BW_HOST - name: BW_USER valueFrom: secretKeyRef: name: bitwarden-cli key: BW_USERNAME - name: BW_PASSWORD valueFrom: secretKeyRef: name: bitwarden-cli key: BW_PASSWORD ports: - name: http containerPort: 8087 protocol: TCP livenessProbe: exec: command: - wget - -q - http://127.0.0.1:8087/sync - --post-data='' initialDelaySeconds: 20 failureThreshold: 3 timeoutSeconds: 1 periodSeconds: 120 readinessProbe: tcpSocket: port: 8087 initialDelaySeconds: 20 failureThreshold: 3 timeoutSeconds: 1 periodSeconds: 10 startupProbe: tcpSocket: port: 8087 initialDelaySeconds: 10 failureThreshold: 30 timeoutSeconds: 1 periodSeconds: 5 --- apiVersion: v1 kind: Service metadata: name: bitwarden-cli labels: app.kubernetes.io/instance: bitwarden-cli app.kubernetes.io/name: bitwarden-cli spec: type: ClusterIP ports: - port: 8087 targetPort: http protocol: TCP name: http selector: app.kubernetes.io/name: bitwarden-cli app.kubernetes.io/instance: bitwarden-cli --- # Only the External Secrets controller may talk to the bridge: it serves the whole vault. apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: external-secret-2-bw-cli spec: podSelector: matchLabels: app.kubernetes.io/instance: bitwarden-cli app.kubernetes.io/name: bitwarden-cli ingress: - from: - podSelector: matchLabels: app.kubernetes.io/instance: external-secrets app.kubernetes.io/name: external-secrets