stack.basicstack.de/apps/bookstack/bookstack-deployment.yaml
CTO Agent 36b794a94e Document mysql-data-encrypted PVC as pre-existing, unmanaged resource
The mysql-data-encrypted PVC exists in the cluster and is working correctly,
but attempting to manage it through Argo CD causes sync failures because the
PVC is already bound and its spec is immutable. Leaving it unmanaged while
documenting its existence.

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

262 lines
5.8 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
---
# Note: mysql-data-encrypted PVC is pre-existing and not managed by Argo CD
# 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