deploy folder restructured, preparing for flux, removed ghost pvc nextcloud-data, simplification of pvc names

This commit is contained in:
Márcio Fernandes
2026-07-14 10:19:05 +00:00
parent 6438530fba
commit 3e8e2a4987
41 changed files with 316 additions and 426 deletions
+3
View File
@@ -0,0 +1,3 @@
**
!.gitignore
!**.example
@@ -0,0 +1,3 @@
PBS_REPOSITORY=????
PBS_PASSWORD=????
PBS_FINGERPRINT=???
+123
View File
@@ -0,0 +1,123 @@
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup
namespace: cloud-limbosolutions-com
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
backoffLimit: 1
template:
metadata:
labels:
app: backup-pbs
backups.infra.limbosolutions.com/pbs: "true"
spec:
restartPolicy: Never
initContainers:
- name: mariadb-client
resources:
limits:
memory: "512Mi"
cpu: "500m"
requests:
memory: "256Mi"
cpu: "250m"
image: alpine/mysql
command: ["sh", "-c"]
args:
- |
set -e
mkdir -p /data/mariadb-export
echo "TRACE: Exporting database"
#mysqldump --column-statistics=0 -u ${MYSQL_USER} -h ${MYSQL_HOST} ${MYSQL_DB} > /data/mariadb-export/backup.sql
mysqldump -u ${MYSQL_USER} -h ${MYSQL_HOST} ${MYSQL_DB} > /data/mariadb-export/backup.sql
echo "TRACE: Exporting database finished"
env:
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: nextcloud-mariadb
key: MARIADB_USER
- name: MYSQL_PWD
valueFrom:
secretKeyRef:
name: nextcloud-mariadb
key: MARIADB_PASSWORD
- name: MYSQL_DB
valueFrom:
secretKeyRef:
name: nextcloud-mariadb
key: MARIADB_DATABASE
- name: MYSQL_HOST
value: nextcloud-mariadb.cloud-limbosolutions-com.svc.cluster.local
volumeMounts:
- name: backup-var
mountPath: /data/mariadb-export
subPath: mariadb-export
containers:
- name: gitea-pbs-client
image: oci.limbosolutions.com/public/pbs-client
env:
- name: MODE
value: shell
- name: PBS_REPOSITORY
valueFrom:
secretKeyRef:
name: backup-secret
key: PBS_REPOSITORY
- name: PBS_PASSWORD
valueFrom:
secretKeyRef:
name: backup-secret
key: PBS_PASSWORD
- name: PBS_FINGERPRINT
valueFrom:
secretKeyRef:
name: backup-secret
key: PBS_FINGERPRINT
command: ["bash", "-c"]
args:
- |
set -e
SCRIPT_START_TIME=$(date +%s)
proxmox-backup-client backup nextcloud-html.pxar:/data/nextcloud-html mariadb-data.pxar:/data/mariadb-data mariadb-export.pxar:/data/mariadb-export --include-dev /data/nextcloud-html --include-dev /data/mariadb-data --include-dev /data/mariadb-export --backup-id "nextcloud-full" -ns cloud.limbosolutions.com && \
SCRIPT_DURATION=$(($(date +%s) - SCRIPT_START_TIME)) && \
echo "INFO: Finished Backup of cloud.limbosolutions.com ($((SCRIPT_DURATION / 60 / 60)):$((SCRIPT_DURATION / 60)):$((SCRIPT_DURATION % 60)))"
volumeMounts:
- name: nextcloud-html
mountPath: /data/nextcloud-html
- name: db-data
mountPath: /data/mariadb-data
- name: backup-var
mountPath: /tmp
subPath: tmp
- name: backup-var
mountPath: /data/mariadb-export
subPath: mariadb-export
volumes:
- name: nextcloud-html
persistentVolumeClaim:
claimName: nextcloud-nextcloud
- name: db-data
persistentVolumeClaim:
claimName: mariadb-data-nextcloud-mariadb-0
- name: backup-var
emptyDir: {}
+14
View File
@@ -0,0 +1,14 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./backup-pbs-cronjob.yaml
secretGenerator:
- name: backup-secret
envs:
- ./.env.d/pbs.env
generatorOptions:
disableNameSuffixHash: true
namespace: cloud-limbosolutions-com
+3
View File
@@ -0,0 +1,3 @@
**
!.gitignore
!**.example
@@ -0,0 +1,5 @@
# values bust be equal to nextcloud deployment
MARIADB_USER=????
MARIADB_PASSWORD=????
MARIADB_ROOT_PASSWORD=???
MARIADB_DATABASE=???
+17
View File
@@ -0,0 +1,17 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: cloud-limbosolutions-com
generatorOptions:
disableNameSuffixHash: true
secretGenerator:
- name: nextcloud-mariadb
envs:
- ./.env.d/nextcloud-mariadb.env
resources:
- ./storage-limbosolutions-com
- ./mariadb-deploy.yaml
+68
View File
@@ -0,0 +1,68 @@
apiVersion: v1
kind: Service
metadata:
name: nextcloud-mariadb
spec:
clusterIP: None
selector:
app: nextcloud-mariadb
ports:
- name: mysql
port: 3306
targetPort: 3306
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nextcloud-mariadb
spec:
serviceName: nextcloud-mariadb
replicas: 1
selector:
matchLabels:
app: nextcloud-mariadb
template:
metadata:
labels:
app: nextcloud-mariadb
spec:
containers:
- name: mariadb
image: mariadb:11.4
env:
- name: MARIADB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: nextcloud-mariadb
key: MARIADB_ROOT_PASSWORD
- name: MARIADB_USER
valueFrom:
secretKeyRef:
name: nextcloud-mariadb
key: MARIADB_USER
- name: MARIADB_PASSWORD
valueFrom:
secretKeyRef:
name: nextcloud-mariadb
key: MARIADB_PASSWORD
- name: MARIADB_DATABASE
valueFrom:
secretKeyRef:
name: nextcloud-mariadb
key: MARIADB_DATABASE
ports:
- containerPort: 3306
volumeMounts:
- name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mariadb-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
@@ -0,0 +1,267 @@
image:
repository: nextcloud
flavor: apache
tag: "33"
pullPolicy: Always
replicaCount: 1
livenessProbe:
initialDelaySeconds: 60
periodSeconds: 60
timeoutSeconds: 5
failureThreshold: 6
readinessProbe:
initialDelaySeconds: 60
periodSeconds: 60
timeoutSeconds: 5
failureThreshold: 12
# ------------------------------------------------------------------------------
# Nextcloud maintenance mode & Kubernetes probes
# ------------------------------------------------------------------------------
# When performing upgrades or running `occ upgrade`, Nextcloud may return 503
# on /status.php until the database migration is complete. During this period,
# Kubernetes will repeatedly kill the pod because the readiness/liveness probes
# fail before the upgrade finishes.
#
# To prevent Kubernetes from terminating the pod during maintenance or upgrades,
# temporarily disable both probes. This allows the container to stay alive long
# enough for you to exec into it and run:
#
# php occ upgrade
#
# After the upgrade completes, reenable the probes.
#
# Example:
#
# livenessProbe:
# enabled: false
#
# readinessProbe:
# enabled: false
# ------------------------------------------------------------------------------
internalDatabase:
enabled: false
mariadb:
enabled: false
externalDatabase:
enabled: true
type: mysql
host: nextcloud-mariadb.cloud-limbosolutions-com.svc.cluster.local
user: "SET_BY_PRIVATE_VALUES"
password: "SET_BY_PRIVATE_VALUES"
database: "SET_BY_PRIVATE_VALUES"
port: 3306
persistence:
enabled: true
accessMode: ReadWriteOnce
size: 8Gi
nextcloudData:
accessMode: ReadWriteOnce
size: 8Gi
resources:
limits:
cpu: "1"
memory: 3000Mi
requests:
cpu: "0.5"
memory: 512Mi
redis:
enabled: false
## Cronjob to execute Nextcloud background tasks
## ref: https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/background_jobs_configuration.html#cron
##
cronjob:
enabled: true
nextcloud:
extraEnv:
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: nextcloud-redis
key: redis-password
defaultConfigs:
redis.config.php: false
extraInitContainers:
- name: data-folder-structure-fix
image: busybox
command:
- sh
- -c
- |
# Create only parents
mkdir -p /mnt/users
mkdir -p /mnt/shared
# Fix permissions on parents pvc folder data-folder-structure
chown 33:33 /mnt/users
chown 33:33 /mnt/shared
chown 33:33 /mnt/users/marcio.fernandes
chown 33:33 /mnt/users/marcio.fernandes/Documents
chown 33:33 /mnt/users/marcio.fernandes/Photos
chown 33:33 /mnt/shared/Gaming
chown 33:33 /mnt/shared/Music
chown 33:33 /mnt/shared/Videos
chown 33:33 /mnt/shared/NerdStuff
volumeMounts:
- name: data-folder-structure
mountPath: /mnt
- name: mf-nextcloud
mountPath: /mnt/users/marcio.fernandes
- name: mf-documents
mountPath: /mnt/users/marcio.fernandes/Documents
- name: mf-photos
mountPath: /mnt/users/marcio.fernandes/Photos
- name: media-gaming
mountPath: /mnt/shared/Gaming
- name: media-music
mountPath: /mnt/shared/Music
- name: media-videos
mountPath: /mnt/shared/Videos
- name: it-storage
mountPath: /mnt/shared/NerdStuff
securityContext:
runAsUser: 33
runAsGroup: 33
fsGroup: 33
fsGroupChangePolicy: "OnRootMismatch"
phpConfigs:
php.ini: |-
memory_limit = 1024M
extraVolumes:
- name: mf-documents
persistentVolumeClaim:
claimName: nextcloud-mf-documents
- name: mf-photos
persistentVolumeClaim:
claimName: nextcloud-mf-gallery
- name: media-gaming
persistentVolumeClaim:
claimName: nextcloud-media-gaming
- name: media-music
persistentVolumeClaim:
claimName: nextcloud-media-music
- name: media-videos
persistentVolumeClaim:
claimName: nextcloud-media-videos
- name: it-storage
persistentVolumeClaim:
claimName: nextcloud-it-storage
- name: mf-nextcloud
persistentVolumeClaim:
claimName: nextcloud-mf
- name: data-folder-structure
emptyDir: {}
extraVolumeMounts:
- name: data-folder-structure
mountPath: /mnt
- name: mf-nextcloud
mountPath: /mnt/users/marcio.fernandes
- name: mf-documents
mountPath: /mnt/users/marcio.fernandes/Documents
- name: mf-photos
mountPath: /mnt/users/marcio.fernandes/Photos
- name: media-gaming
mountPath: /mnt/shared/Gaming
- name: media-music
mountPath: /mnt/shared/Music
- name: media-videos
mountPath: /mnt/shared/Videos
- name: it-storage
mountPath: /mnt/shared/NerdStuff
configs:
global.config.php: |-
<?php
$CONFIG = array (
'allow_local_remote_servers' => true,
'loglevel' => 1
);
phone.config.php: |-
<?php
$CONFIG = array (
'default_phone_region' => 'PT',
);
https.config.php: |-
<?php
$CONFIG = array (
'overwritehost' => 'cloud.limbosolutions.com',
'overwrite.cli.url' => 'https://cloud.limbosolutions.com',
'overwriteprotocol' => 'https',
'trusted_proxies' =>
array (
0 => '127.0.0.1',
1 => '::1',
2 => '10.0.0.0/8',
),
);
# A value of 1 e.g. will only run these background jobs between 01:00am UTC and 05:00am UTC:
# https://docs.nextcloud.com/server/30/admin_manual/configuration_server/background_jobs_configuration.html
maintenance.config.php: |-
<?php
$CONFIG = array (
'maintenance_window_start' => 1,
);
redis.config.php: |-
<?php
$CONFIG = array (
'memcache.local' => '\OC\Memcache\APCu',
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
'host' => 'nextcloud-redis-master',
'port' => 6379,
'timeout' => 1.5,
'password' => getenv('REDIS_PASSWORD'),
'dbindex' => 0,
),
);
onlyoffice.config.php: |-
<?php
$CONFIG = array (
'onlyoffice' =>
array (
'verify_peer_off' => true,
'allow_local_remote_servers' => true,
'allow_external_storage' => true,
),
);
ingress:
enabled: false
@@ -0,0 +1,9 @@
architecture: standalone
auth:
enabled: true
password: "SET_BY_PRIVATE_VALUES"
master:
persistence:
enabled: false
replica:
replicaCount: 0
@@ -0,0 +1,12 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: cloud-limbosolutions-com
resources:
- nextcloud-mf-documents.yaml
- nextcloud-mf-gallery.yaml
- nextcloud-mf.yaml
- nextcloud-media-gaming.yaml
- nextcloud-media-music.yaml
- nextcloud-media-videos.yaml
- nextcloud-it-storage.yaml
@@ -0,0 +1,33 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: nextcloud-it-storage
spec:
storageClassName: storage-limbosolutions-com
accessModes:
- ReadWriteMany
capacity:
storage: 1000Gi
csi:
driver: storage-limbosolutions-com-csi-driver
volumeHandle: nextcloud-it-storage
volumeAttributes:
collection: storage
path: /buckets/storage
volumeServerAccess: filerProxy
persistentVolumeReclaimPolicy: Retain
volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nextcloud-it-storage
spec:
storageClassName: storage-limbosolutions-com
volumeName: nextcloud-it-storage
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1000Gi
@@ -0,0 +1,37 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: nextcloud-media-gaming
spec:
storageClassName: storage-limbosolutions-com
accessModes:
- ReadWriteMany
capacity:
storage: 64Gi
csi:
driver: storage-limbosolutions-com-csi-driver
volumeHandle: nextcloud-media-gaming
volumeAttributes:
collection: media.gaming
path: /buckets/media.gaming
volumeServerAccess: filerProxy
persistentVolumeReclaimPolicy: Retain
volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nextcloud-media-gaming
spec:
storageClassName: storage-limbosolutions-com
volumeName: nextcloud-media-gaming
accessModes:
- ReadWriteMany
resources:
requests:
storage: 64Gi
@@ -0,0 +1,37 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: nextcloud-media-music
spec:
storageClassName: storage-limbosolutions-com
accessModes:
- ReadWriteMany
capacity:
storage: 64Gi
csi:
driver: storage-limbosolutions-com-csi-driver
volumeHandle: nextcloud-media-music
volumeAttributes:
collection: media.music
path: /buckets/media.music
volumeServerAccess: filerProxy
persistentVolumeReclaimPolicy: Retain
volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nextcloud-media-music
spec:
storageClassName: storage-limbosolutions-com
volumeName: nextcloud-media-music
accessModes:
- ReadWriteMany
resources:
requests:
storage: 64Gi
@@ -0,0 +1,34 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: nextcloud-media-videos
spec:
storageClassName: storage-limbosolutions-com
accessModes:
- ReadWriteMany
capacity:
storage: 2000Gi
csi:
driver: storage-limbosolutions-com-csi-driver
volumeHandle: nextcloud-media-videos
volumeAttributes:
collection: media.videos
path: /buckets/media.videos
volumeServerAccess: filerProxy
persistentVolumeReclaimPolicy: Retain
volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nextcloud-media-videos
spec:
storageClassName: storage-limbosolutions-com
volumeName: nextcloud-media-videos
accessModes:
- ReadWriteMany
resources:
requests:
storage: 64Gi
@@ -0,0 +1,35 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: nextcloud-mf-documents
spec:
storageClassName: storage-limbosolutions-com
accessModes:
- ReadWriteMany
capacity:
storage: 64Gi
csi:
driver: storage-limbosolutions-com-csi-driver
volumeHandle: nextcloud-mf-documents
volumeAttributes:
collection: mf.documents
path: /buckets/mf.documents
volumeServerAccess: filerProxy
diskType: "ssd"
persistentVolumeReclaimPolicy: Retain
volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nextcloud-mf-documents
spec:
storageClassName: storage-limbosolutions-com
volumeName: nextcloud-mf-documents
accessModes:
- ReadWriteMany
resources:
requests:
storage: 64Gi
@@ -0,0 +1,33 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: nextcloud-mf-gallery
spec:
storageClassName: storage-limbosolutions-com
accessModes:
- ReadWriteMany
capacity:
storage: 64Gi
csi:
driver: storage-limbosolutions-com-csi-driver
volumeHandle: nextcloud-mf-gallery
volumeAttributes:
collection: mf.gallery
path: /buckets/mf.gallery
volumeServerAccess: filerProxy
persistentVolumeReclaimPolicy: Retain
volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nextcloud-mf-gallery
spec:
storageClassName: storage-limbosolutions-com
volumeName: nextcloud-mf-gallery
accessModes:
- ReadWriteMany
resources:
requests:
storage: 64Gi
@@ -0,0 +1,33 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: nextcloud-mf
spec:
storageClassName: storage-limbosolutions-com
accessModes:
- ReadWriteMany
capacity:
storage: 64Gi
csi:
driver: storage-limbosolutions-com-csi-driver
volumeHandle: nextcloud-mf
volumeAttributes:
collection: mf.ssd.nexcloud
path: /buckets/mf.ssd.nexcloud
volumeServerAccess: filerProxy
persistentVolumeReclaimPolicy: Retain
volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nextcloud-mf
spec:
storageClassName: storage-limbosolutions-com
volumeName: nextcloud-mf
accessModes:
- ReadWriteMany
resources:
requests:
storage: 64Gi
+2
View File
@@ -0,0 +1,2 @@
**
!.gitignore
+50
View File
@@ -0,0 +1,50 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: onlyoffice
spec:
replicas: 1
selector:
matchLabels:
app: onlyoffice
template:
metadata:
labels:
app: onlyoffice
spec:
containers:
- name: onlyoffice
image: onlyoffice/documentserver:latest
ports:
- containerPort: 80
env:
- name: JWT_ENABLED
value: "true"
- name: JWT_SECRET
valueFrom:
secretKeyRef:
name: onlyoffice
key: secret
resources:
limits:
memory: "2048Mi"
cpu: "1000m"
requests:
memory: "256Mi"
cpu: "250m"
volumeMounts:
- name: onlyoffice-data
mountPath: /var/www/onlyoffice/Data
- name: onlyoffice-logs
mountPath: /var/log/onlyoffice
volumes:
- name: onlyoffice-data
persistentVolumeClaim:
claimName: onlyoffice-data
- name: onlyoffice-logs
persistentVolumeClaim:
claimName: onlyoffice-logs
+16
View File
@@ -0,0 +1,16 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
secretGenerator:
- name: onlyoffice
envs:
- ./.env.d/onlyoffice.env
generatorOptions:
disableNameSuffixHash: true
namespace: cloud-limbosolutions-com
resources:
- ./deployment.yaml
- ./service.yaml
- ./pvc.yaml
+22
View File
@@ -0,0 +1,22 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: onlyoffice-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: onlyoffice-logs
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
+10
View File
@@ -0,0 +1,10 @@
apiVersion: v1
kind: Service
metadata:
name: onlyoffice
spec:
ports:
- port: 80
targetPort: 80
selector:
app: onlyoffice
+3
View File
@@ -0,0 +1,3 @@
**
!*.example
!.gitignore
@@ -0,0 +1 @@
JWT_SECRET_KEY= ????
+37
View File
@@ -0,0 +1,37 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: nextcloud-whiteboard
labels:
app: nextcloud-whiteboard
spec:
replicas: 1
selector:
matchLabels:
app: nextcloud-whiteboard
template:
metadata:
labels:
app: nextcloud-whiteboard
spec:
containers:
- name: whiteboard-ws
image: ghcr.io/nextcloud-releases/whiteboard:stable
ports:
- containerPort: 3002
env:
- name: NEXTCLOUD_URL
value: https://cloud.limbosolutions.com
- name: JWT_SECRET_KEY
valueFrom:
secretKeyRef:
name: nextcloud-whiteboard
key: JWT_SECRET_KEY
resources:
limits:
memory: "256Mi"
cpu: "200m"
requests:
memory: "64Mi"
cpu: "50m"
+14
View File
@@ -0,0 +1,14 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
secretGenerator:
- name: nextcloud-whiteboard
envs:
- ./.env.d/whiteboard.env
generatorOptions:
disableNameSuffixHash: true
resources:
- ./deployment.yaml
- ./service.yaml
+12
View File
@@ -0,0 +1,12 @@
apiVersion: v1
kind: Service
metadata:
name: nextcloud-whiteboard
spec:
selector:
app: nextcloud-whiteboard
ports:
- name: ws
port: 3002
targetPort: 3002
type: ClusterIP