stack.basicstack.de/apps/bookstack/bookstack-deployment.yaml
CTO Agent 0e5566d3b9 Add missing mysql-data-encrypted PVC definition to bookstack manifests
The MySQL deployment was referencing a PVC that wasn't defined in the
manifests. This PVC exists in the cluster but wasn't tracked by Argo CD.
Adding the definition ensures Argo CD can properly manage all resources
and prevents sync issues.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-12 17:11:14 +00:00

275 lines
6 KiB
YAML

---
apiVersion: v1
kind: Namespace
metadata:
name: bookstack
---
# MySQL Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: bookstack
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: mysql-root-password
- name: MYSQL_DATABASE
valueFrom:
secretKeyRef:
name: mysql
key: mysql-database
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql
key: mysql-user
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: mysql-password
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "1000m"
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-data-encrypted
---
# MySQL Data PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-data-encrypted
namespace: bookstack
spec:
accessModes:
- ReadWriteOnce
storageClassName: hcloud-volumes-encrypted
resources:
requests:
storage: 20Gi
---
# MySQL Service
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: bookstack
spec:
type: ClusterIP
selector:
app: mysql
ports:
- port: 3306
targetPort: 3306
protocol: TCP
---
# Bookstack Config PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: bookstack-config
namespace: bookstack
spec:
accessModes:
- ReadWriteOnce
storageClassName: hcloud-volumes-encrypted
resources:
requests:
storage: 5Gi
---
# Bookstack Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: bookstack
namespace: bookstack
spec:
replicas: 1
selector:
matchLabels:
app: bookstack
template:
metadata:
labels:
app: bookstack
spec:
initContainers:
- name: wait-for-mysql
image: busybox:latest
command:
- sh
- -c
- |
until nc -z mysql 3306; do
echo "Waiting for MySQL to be ready..."
sleep 2
done
echo "MySQL is ready!"
containers:
- name: bookstack
image: lscr.io/linuxserver/bookstack:latest
ports:
- containerPort: 80
name: http
env:
- name: PUID
value: "1000"
- name: PGID
value: "1000"
- name: TZ
value: "Europe/Berlin"
- name: APP_URL
value: "https://books.basicstack.de"
- name: DB_HOST
value: "mysql"
- name: DB_PORT
value: "3306"
- name: DB_DATABASE
valueFrom:
secretKeyRef:
name: mysql
key: mysql-database
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: mysql
key: mysql-user
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: mysql-password
# OIDC Configuration
- name: AUTH_METHOD
value: "oidc"
- name: AUTH_AUTO_INITIATE
value: "true"
- name: OIDC_NAME
value: "Pocket ID"
- name: OIDC_DISPLAY_NAME_CLAIMS
value: "name"
- name: OIDC_CLIENT_ID
value: "158bc0f7-e569-47c1-8dd2-269b9812cb18"
- name: OIDC_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: bookstack-oidc
key: client-secret
- name: OIDC_ISSUER
value: "https://auth.basicstack.de"
- name: OIDC_ISSUER_DISCOVER
value: "true"
- name: OIDC_PUBLIC_KEY
value: ""
- name: OIDC_AUTH_ENDPOINT
value: ""
- name: OIDC_TOKEN_ENDPOINT
value: ""
- name: OIDC_DUMP_USER_DETAILS
value: "false"
- name: OIDC_USER_TO_GROUPS
value: "true"
- name: OIDC_GROUPS_CLAIM
value: "groups"
- name: OIDC_REMOVE_FROM_GROUPS
value: "false"
volumeMounts:
- name: bookstack-config
mountPath: /config
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "1Gi"
cpu: "1000m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 6
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 3
volumes:
- name: bookstack-config
persistentVolumeClaim:
claimName: bookstack-config
---
# Bookstack Service
apiVersion: v1
kind: Service
metadata:
name: bookstack
namespace: bookstack
spec:
type: ClusterIP
selector:
app: bookstack
ports:
- port: 80
targetPort: 80
protocol: TCP
---
# Bookstack Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: bookstack
namespace: bookstack
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
traefik.ingress.kubernetes.io/router.entrypoints: websecure
spec:
ingressClassName: traefik
tls:
- hosts:
- books.basicstack.de
secretName: bookstack-tls
rules:
- host: books.basicstack.de
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: bookstack
port:
number: 80