Added vaultwarden

Signed-off-by: Marcus Noble <github@marcusnoble.co.uk>
This commit is contained in:
2026-09-21 20:16:15 +01:00
parent 419974392a
commit 0a8ab347b8
7 changed files with 247 additions and 0 deletions
+25
View File
@@ -0,0 +1,25 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: vaultwarden
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: cluster.fun
destination:
namespace: vaultwarden
name: cluster-fun (v2)
source:
path: manifests/vaultwarden
repoURL: "https://git.cluster.fun/AverageMarcus/cluster.fun.git"
targetRevision: HEAD
syncPolicy:
automated: {}
syncOptions:
- CreateNamespace=true
ignoreDifferences:
- kind: Secret
jsonPointers:
- /data
+5
View File
@@ -0,0 +1,5 @@
# vaultwarden
Note: There's a catch-22 when deploying this in that the Secrets can't be pulled from Vaultwarden as that are needed _for_ Vaultwarden. These need to be manually populated for this to work.
During migration, secrets are still pulled from 1Password.
+51
View File
@@ -0,0 +1,51 @@
apiVersion: v1
kind: Secret
metadata:
name: vaultwarden-credentials
labels:
app: vaultwarden
app.kubernetes.io/name: vaultwarden
annotations:
kube-1password: e75k7oktk43v4mmvbs24vyelwy
kube-1password/vault: Kubernetes
kube-1password/secret-text-parse: "true"
type: Opaque
---
apiVersion: v1
kind: Secret
metadata:
name: vaultwarden-smtp
labels:
app: vaultwarden
app.kubernetes.io/name: vaultwarden
annotations:
kube-1password: 3kiighdh7la4wdfiv5fzgm34yu
kube-1password/vault: Kubernetes
kube-1password/secret-text-parse: "true"
type: Opaque
---
apiVersion: v1
kind: ConfigMap
metadata:
name: vaultwarden-config
labels:
app: vaultwarden
app.kubernetes.io/name: vaultwarden
data:
DOMAIN: "https://vault.cluster.fun"
# Signup Controls
SIGNUPS_ALLOWED: "false"
INVITATIONS_ALLOWED: "true"
INVITATION_ORG_NAME: "Noble"
# Security
SHOW_PASSWORD_HINT: "false"
EXTENDED_LOGGING: "true"
LOG_LEVEL: "info"
REQUIRE_DEVICE_EMAIL: "true"
+84
View File
@@ -0,0 +1,84 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: vaultwarden
labels:
app: vaultwarden
app.kubernetes.io/name: vaultwarden
spec:
replicas: 2
selector:
matchLabels:
app: vaultwarden
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: vaultwarden
app.kubernetes.io/name: vaultwarden
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- vaultwarden
topologyKey: kubernetes.io/hostname
securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containers:
- name: vaultwarden
image: vaultwarden/server:1.37.3-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8080
protocol: TCP
envFrom:
- configMapRef:
name: vaultwarden-config
- secretRef:
name: vaultwarden-credentials
- secretRef:
name: vaultwarden-smtp
volumeMounts:
- name: vaultwarden-data
mountPath: /data
- name: vaultwarden-attachments
mountPath: /data/attachments
resources:
requests:
cpu: "100m"
memory: "128Mi"
livenessProbe:
httpGet:
path: /alive
port: http
initialDelaySeconds: 30
periodSeconds: 30
failureThreshold: 3
readinessProbe:
httpGet:
path: /alive
port: http
initialDelaySeconds: 30
periodSeconds: 30
failureThreshold: 3
volumes:
- name: vaultwarden-data
persistentVolumeClaim:
claimName: vaultwarden-data
- name: vaultwarden-attachments
persistentVolumeClaim:
claimName: vaultwarden-attachments
+37
View File
@@ -0,0 +1,37 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: vaultwarden
labels:
app: vaultwarden
app.kubernetes.io/name: vaultwarden
annotations:
cert-manager.io/cluster-issuer: letsencrypt
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-protocols: "TLSv1.2 TLSv1.3"
nginx.ingress.kubernetes.io/proxy-body-size: "100m"
nginx.ingress.kubernetes.io/client-body-buffer-size: 25m
nginx.ingress.kubernetes.io/proxy-connect-timeout: "300"
nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
nginx.ingress.kubernetes.io/proxy-next-upstream: "300"
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "300"
nginx.ingress.kubernetes.io/limit-rps: "10"
spec:
ingressClassName: nginx
tls:
- hosts:
- vaultwarden.cluster.fun
secretName: vaultwarden-ingress
rules:
- host: vaultwarden.cluster.fun
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: vaultwarden
port:
name: http
+29
View File
@@ -0,0 +1,29 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: vaultwarden-data
labels:
app: vaultwarden
app.kubernetes.io/name: vaultwarden
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: sfs-standard-retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: vaultwarden-attachments
labels:
app: vaultwarden
app.kubernetes.io/name: vaultwarden
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: sfs-standard-retain
+16
View File
@@ -0,0 +1,16 @@
apiVersion: v1
kind: Service
metadata:
name: vaultwarden
labels:
app: vaultwarden
app.kubernetes.io/name: vaultwarden
spec:
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 8080
protocol: TCP
selector:
app: vaultwarden