summaryrefslogtreecommitdiff
path: root/gemfeed/examples/conf/f3s
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-10-02 11:28:55 +0300
committerPaul Buetow <paul@buetow.org>2025-10-02 11:28:55 +0300
commit2b034797107660d4d83f8a7acdc55d32db785b82 (patch)
tree522fb586193c8a65ca6aee42df64eecc3555f644 /gemfeed/examples/conf/f3s
parent4d7d90638186ac71067232007607f6637d560a4d (diff)
Update content for md
Diffstat (limited to 'gemfeed/examples/conf/f3s')
-rw-r--r--gemfeed/examples/conf/f3s/anki-sync-server/Justfile12
-rw-r--r--gemfeed/examples/conf/f3s/anki-sync-server/docker-image/Dockerfile39
-rw-r--r--gemfeed/examples/conf/f3s/anki-sync-server/docker-image/Justfile6
-rw-r--r--gemfeed/examples/conf/f3s/anki-sync-server/docker-image/entrypoint.sh31
-rw-r--r--gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/Chart.yaml5
-rw-r--r--gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/deployment.yaml35
-rw-r--r--gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/ingress.yaml20
-rw-r--r--gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/persistent-volume.yaml27
-rw-r--r--gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/service.yaml15
-rw-r--r--gemfeed/examples/conf/f3s/audiobookshelf/Justfile12
-rw-r--r--gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/Chart.yaml5
-rw-r--r--gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/templates/deployment.yaml53
-rw-r--r--gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/templates/ingress.yaml20
-rw-r--r--gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/templates/persistent-volumes.yaml83
-rw-r--r--gemfeed/examples/conf/f3s/example-apache-volume-claim/Justfile12
-rw-r--r--gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/Chart.yaml5
-rw-r--r--gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-deployment.yaml41
-rw-r--r--gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-ingress.yaml41
-rw-r--r--gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-persistent-volume.yaml27
-rw-r--r--gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-service.yaml17
-rw-r--r--gemfeed/examples/conf/f3s/example-apache/Justfile12
-rw-r--r--gemfeed/examples/conf/f3s/example-apache/helm-chart/Chart.yaml5
-rw-r--r--gemfeed/examples/conf/f3s/example-apache/helm-chart/templates/apache-deployment.yaml21
-rw-r--r--gemfeed/examples/conf/f3s/example-apache/helm-chart/templates/apache-ingress.yaml40
-rw-r--r--gemfeed/examples/conf/f3s/example-apache/helm-chart/templates/apache-service.yaml16
-rw-r--r--gemfeed/examples/conf/f3s/freshrss/Justfile12
-rw-r--r--gemfeed/examples/conf/f3s/freshrss/helm-chart/Chart.yaml6
-rw-r--r--gemfeed/examples/conf/f3s/freshrss/helm-chart/templates/deployment.yaml48
-rw-r--r--gemfeed/examples/conf/f3s/freshrss/helm-chart/templates/ingress.yaml21
-rw-r--r--gemfeed/examples/conf/f3s/freshrss/helm-chart/templates/persistent-volumes.yaml28
-rw-r--r--gemfeed/examples/conf/f3s/miniflux/Justfile12
-rw-r--r--gemfeed/examples/conf/f3s/miniflux/helm-chart/Chart.yaml5
-rw-r--r--gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/deployment.yaml92
-rw-r--r--gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/ingress.yaml20
-rw-r--r--gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/persistent-volumes.yaml27
-rw-r--r--gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/service.yaml23
-rw-r--r--gemfeed/examples/conf/f3s/opodsync/Justfile12
-rw-r--r--gemfeed/examples/conf/f3s/opodsync/helm-chart/Chart.yaml5
-rw-r--r--gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/configmap-nginx.yaml46
-rw-r--r--gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/deployment.yaml43
-rw-r--r--gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/ingress.yaml20
-rw-r--r--gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/persistent-volumes.yaml27
-rw-r--r--gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/service.yaml15
-rw-r--r--gemfeed/examples/conf/f3s/radicale/Justfile12
-rw-r--r--gemfeed/examples/conf/f3s/radicale/helm-chart/Chart.yaml5
-rw-r--r--gemfeed/examples/conf/f3s/radicale/helm-chart/templates/deployment.yaml67
-rw-r--r--gemfeed/examples/conf/f3s/radicale/helm-chart/templates/ingress.yaml20
-rw-r--r--gemfeed/examples/conf/f3s/radicale/helm-chart/templates/persistent-volumes.yaml55
-rw-r--r--gemfeed/examples/conf/f3s/registry/Justfile12
-rw-r--r--gemfeed/examples/conf/f3s/registry/helm-chart/Chart.yaml5
-rw-r--r--gemfeed/examples/conf/f3s/registry/helm-chart/templates/deployment.yaml29
-rw-r--r--gemfeed/examples/conf/f3s/registry/helm-chart/templates/pv.yaml14
-rw-r--r--gemfeed/examples/conf/f3s/registry/helm-chart/templates/pvc.yaml12
-rw-r--r--gemfeed/examples/conf/f3s/registry/helm-chart/templates/service.yaml14
-rw-r--r--gemfeed/examples/conf/f3s/syncthing/Justfile12
-rw-r--r--gemfeed/examples/conf/f3s/syncthing/helm-chart/Chart.yaml5
-rw-r--r--gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/deployment.yaml33
-rw-r--r--gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/ingress.yaml20
-rw-r--r--gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/persistent-volume.yaml55
-rw-r--r--gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/service.yaml19
-rw-r--r--gemfeed/examples/conf/f3s/wallabag/Justfile12
-rw-r--r--gemfeed/examples/conf/f3s/wallabag/helm-chart/Chart.yaml5
-rw-r--r--gemfeed/examples/conf/f3s/wallabag/helm-chart/templates/deployment.yaml51
-rw-r--r--gemfeed/examples/conf/f3s/wallabag/helm-chart/templates/ingress.yaml20
-rw-r--r--gemfeed/examples/conf/f3s/wallabag/helm-chart/templates/persistent-volumes.yaml55
65 files changed, 1594 insertions, 0 deletions
diff --git a/gemfeed/examples/conf/f3s/anki-sync-server/Justfile b/gemfeed/examples/conf/f3s/anki-sync-server/Justfile
new file mode 100644
index 00000000..73d679c7
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/anki-sync-server/Justfile
@@ -0,0 +1,12 @@
+NAMESPACE := "services"
+RELEASE_NAME := "anki-sync-server"
+CHART_PATH := "./helm-chart"
+
+install:
+ helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+
+upgrade:
+ helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+
+delete:
+ helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
diff --git a/gemfeed/examples/conf/f3s/anki-sync-server/docker-image/Dockerfile b/gemfeed/examples/conf/f3s/anki-sync-server/docker-image/Dockerfile
new file mode 100644
index 00000000..81fad856
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/anki-sync-server/docker-image/Dockerfile
@@ -0,0 +1,39 @@
+FROM rust:1.85.0-alpine3.20 AS builder
+
+ARG ANKI_VERSION
+
+RUN apk update && apk add --no-cache build-base protobuf && rm -rf /var/cache/apk/*
+
+RUN cargo install --git https://github.com/ankitects/anki.git \
+--tag ${ANKI_VERSION} \
+--root /anki-server \
+--locked \
+anki-sync-server
+
+FROM alpine:3.21.0
+
+# Default PUID and PGID values (can be overridden at runtime). Use these to
+# ensure the files on the volume have the permissions you need.
+ENV PUID=1000
+ENV PGID=1000
+
+COPY --from=builder /anki-server/bin/anki-sync-server /usr/local/bin/anki-sync-server
+
+RUN apk update && apk add --no-cache bash su-exec && rm -rf /var/cache/apk/*
+
+EXPOSE 8080
+
+COPY entrypoint.sh /entrypoint.sh
+RUN chmod +x /entrypoint.sh
+
+ENTRYPOINT ["/entrypoint.sh"]
+CMD ["anki-sync-server"]
+
+# This health check will work for Anki versions 24.08.x and newer.
+# For older versions, it may incorrectly report an unhealthy status, which should not be the case.
+HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
+ CMD wget -qO- http://127.0.0.1:8080/health || exit 1
+
+VOLUME /anki_data
+
+LABEL maintainer="Jean Khawand <jk@jeankhawand.com>"
diff --git a/gemfeed/examples/conf/f3s/anki-sync-server/docker-image/Justfile b/gemfeed/examples/conf/f3s/anki-sync-server/docker-image/Justfile
new file mode 100644
index 00000000..5da854f3
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/anki-sync-server/docker-image/Justfile
@@ -0,0 +1,6 @@
+all:
+ docker build -t anki-sync-server:25.07.5b --build-arg ANKI_VERSION=25.07.5 .
+f3s:
+ docker build -t anki-sync-server:25.07.5b --build-arg ANKI_VERSION=25.07.5 .
+ docker tag anki-sync-server:25.07.5b r0.lan.buetow.org:30001/anki-sync-server:25.07.5b
+ docker push r0.lan.buetow.org:30001/anki-sync-server:25.07.5b
diff --git a/gemfeed/examples/conf/f3s/anki-sync-server/docker-image/entrypoint.sh b/gemfeed/examples/conf/f3s/anki-sync-server/docker-image/entrypoint.sh
new file mode 100644
index 00000000..9a72cca3
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/anki-sync-server/docker-image/entrypoint.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+set -o errexit
+set -o nounset
+set -o pipefail
+
+# Default PUID and PGID if not provided
+export PUID=${PUID:-1000}
+export PGID=${PGID:-1000}
+
+# These values are fixed and cannot be overwritten from the outside for
+# convenience and safety reasons
+export SYNC_PORT=8080
+export SYNC_BASE=/anki_data
+
+# Check if group exists, create if not
+if ! getent group anki-group > /dev/null 2>&1; then
+ addgroup -g "$PGID" anki-group
+fi
+
+# Check if user exists, create if not
+if ! id -u anki > /dev/null 2>&1; then
+ adduser -D -H -u "$PUID" -G anki-group anki
+fi
+
+# Fix ownership of mounted volumes
+mkdir -p /anki_data
+#chown anki:anki-group /anki_data
+
+# Run the provided command as the `anki` user
+exec su-exec anki "$@"
+
diff --git a/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/Chart.yaml b/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/Chart.yaml
new file mode 100644
index 00000000..632f09ae
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v2
+name: anki-sync-server
+description: A Helm chart for deploying the Anki Sync Server.
+version: 0.1.0
+appVersion: "25.07.5b"
diff --git a/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/deployment.yaml b/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/deployment.yaml
new file mode 100644
index 00000000..181b6c97
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/deployment.yaml
@@ -0,0 +1,35 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: anki-sync-server
+ namespace: services
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: anki-sync-server
+ template:
+ metadata:
+ labels:
+ app: anki-sync-server
+ spec:
+ containers:
+ - name: anki-sync-server
+ image: registry.lan.buetow.org:30001/anki-sync-server:25.07.5b
+ ports:
+ - containerPort: 8080
+ env:
+ - name: SYNC_PORT
+ value: "8080"
+ - name: SYNC_USER1
+ valueFrom:
+ secretKeyRef:
+ name: anki-sync-server-secret
+ key: SYNC_USER1
+ volumeMounts:
+ - name: anki-data
+ mountPath: /anki_data
+ volumes:
+ - name: anki-data
+ persistentVolumeClaim:
+ claimName: anki-data-pvc
diff --git a/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/ingress.yaml b/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/ingress.yaml
new file mode 100644
index 00000000..010c5884
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/ingress.yaml
@@ -0,0 +1,20 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: anki-sync-server-ingress
+ namespace: services
+ annotations:
+ spec.ingressClassName: traefik
+ traefik.ingress.kubernetes.io/router.entrypoints: web
+spec:
+ rules:
+ - host: anki.f3s.buetow.org
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: anki-sync-server-service
+ port:
+ number: 8080
diff --git a/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/persistent-volume.yaml b/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/persistent-volume.yaml
new file mode 100644
index 00000000..da715ea2
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/persistent-volume.yaml
@@ -0,0 +1,27 @@
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: anki-data-pv
+spec:
+ capacity:
+ storage: 10Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/anki-sync-server/anki_data
+ type: Directory
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: anki-data-pvc
+ namespace: services
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 10Gi
diff --git a/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/service.yaml b/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/service.yaml
new file mode 100644
index 00000000..a8eb183e
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/anki-sync-server/helm-chart/templates/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: anki-sync-server
+ name: anki-sync-server-service
+ namespace: services
+spec:
+ ports:
+ - name: web
+ port: 8080
+ protocol: TCP
+ targetPort: 8080
+ selector:
+ app: anki-sync-server
diff --git a/gemfeed/examples/conf/f3s/audiobookshelf/Justfile b/gemfeed/examples/conf/f3s/audiobookshelf/Justfile
new file mode 100644
index 00000000..bc020beb
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/audiobookshelf/Justfile
@@ -0,0 +1,12 @@
+NAMESPACE := "services"
+RELEASE_NAME := "audiobookshelf"
+CHART_PATH := "./helm-chart"
+
+install:
+ helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+
+upgrade:
+ helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+
+delete:
+ helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
diff --git a/gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/Chart.yaml b/gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/Chart.yaml
new file mode 100644
index 00000000..dbd55e07
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v2
+name: audiobookshelf
+description: A Helm chart for deploying Audiobookshelf.
+version: 0.1.0
+appVersion: "latest"
diff --git a/gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/templates/deployment.yaml b/gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/templates/deployment.yaml
new file mode 100644
index 00000000..65e536ab
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/templates/deployment.yaml
@@ -0,0 +1,53 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: audiobookshelf
+ namespace: services
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: audiobookshelf
+ template:
+ metadata:
+ labels:
+ app: audiobookshelf
+ spec:
+ containers:
+ - name: audiobookshelf
+ image: ghcr.io/advplyr/audiobookshelf
+ ports:
+ - containerPort: 80
+ volumeMounts:
+ - name: audiobookshelf-config
+ mountPath: /config
+ - name: audiobookshelf-audiobooks
+ mountPath: /audiobooks
+ - name: audiobookshelf-podcasts
+ mountPath: /podcasts
+ volumes:
+ - name: audiobookshelf-config
+ persistentVolumeClaim:
+ claimName: audiobookshelf-config-pvc
+ - name: audiobookshelf-audiobooks
+ persistentVolumeClaim:
+ claimName: audiobookshelf-audiobooks-pvc
+ - name: audiobookshelf-podcasts
+ persistentVolumeClaim:
+ claimName: audiobookshelf-podcasts-pvc
+---
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: audiobookshelf
+ name: audiobookshelf-service
+ namespace: services
+spec:
+ ports:
+ - name: web
+ port: 80
+ protocol: TCP
+ targetPort: 80
+ selector:
+ app: audiobookshelf
diff --git a/gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/templates/ingress.yaml b/gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/templates/ingress.yaml
new file mode 100644
index 00000000..6e4f7ac7
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/templates/ingress.yaml
@@ -0,0 +1,20 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: audiobookshelf-ingress
+ namespace: services
+ annotations:
+ spec.ingressClassName: traefik
+ traefik.ingress.kubernetes.io/router.entrypoints: web
+spec:
+ rules:
+ - host: audiobookshelf.f3s.buetow.org
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: audiobookshelf-service
+ port:
+ number: 80
diff --git a/gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/templates/persistent-volumes.yaml b/gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/templates/persistent-volumes.yaml
new file mode 100644
index 00000000..8691d141
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/audiobookshelf/helm-chart/templates/persistent-volumes.yaml
@@ -0,0 +1,83 @@
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: audiobookshelf-config-pv
+spec:
+ capacity:
+ storage: 1Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/audiobookshelf/config
+ type: Directory
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: audiobookshelf-config-pvc
+ namespace: services
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 1Gi
+---
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: audiobookshelf-audiobooks-pv
+spec:
+ capacity:
+ storage: 300Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/audiobookshelf/audiobooks
+ type: Directory
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: audiobookshelf-audiobooks-pvc
+ namespace: services
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 300Gi
+---
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: audiobookshelf-podcasts-pv
+spec:
+ capacity:
+ storage: 50Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/audiobookshelf/podcasts
+ type: Directory
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: audiobookshelf-podcasts-pvc
+ namespace: services
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 50Gi
diff --git a/gemfeed/examples/conf/f3s/example-apache-volume-claim/Justfile b/gemfeed/examples/conf/f3s/example-apache-volume-claim/Justfile
new file mode 100644
index 00000000..e8003e8b
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/example-apache-volume-claim/Justfile
@@ -0,0 +1,12 @@
+NAMESPACE := "test"
+RELEASE_NAME := "example-apache-volume-claim"
+CHART_PATH := "./helm-chart"
+
+install:
+ helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+
+upgrade:
+ helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+
+delete:
+ helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
diff --git a/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/Chart.yaml b/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/Chart.yaml
new file mode 100644
index 00000000..78d53976
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v2
+name: apache-volume-claim
+description: A Helm chart for deploying Apache with a persistent volume claim.
+version: 0.1.0
+appVersion: "1.0"
diff --git a/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-deployment.yaml b/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-deployment.yaml
new file mode 100644
index 00000000..78706a34
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-deployment.yaml
@@ -0,0 +1,41 @@
+# Apache HTTP Server Deployment
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: apache-deployment
+ namespace: test
+spec:
+ replicas: 2
+ selector:
+ matchLabels:
+ app: apache
+ template:
+ metadata:
+ labels:
+ app: apache
+ spec:
+ containers:
+ - name: apache
+ image: httpd:latest
+ ports:
+ # Container port where Apache listens
+ - containerPort: 80
+ readinessProbe:
+ httpGet:
+ path: /
+ port: 80
+ initialDelaySeconds: 5
+ periodSeconds: 10
+ livenessProbe:
+ httpGet:
+ path: /
+ port: 80
+ initialDelaySeconds: 15
+ periodSeconds: 10
+ volumeMounts:
+ - name: apache-htdocs
+ mountPath: /usr/local/apache2/htdocs/
+ volumes:
+ - name: apache-htdocs
+ persistentVolumeClaim:
+ claimName: example-apache-pvc
diff --git a/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-ingress.yaml b/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-ingress.yaml
new file mode 100644
index 00000000..b26f95bd
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-ingress.yaml
@@ -0,0 +1,41 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: apache-ingress
+ namespace: test
+ namespace: test
+ annotations:
+ spec.ingressClassName: traefik
+ traefik.ingress.kubernetes.io/router.entrypoints: web
+spec:
+ rules:
+ - host: f3s.buetow.org
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: apache-service
+ port:
+ number: 80
+ - host: standby.f3s.buetow.org
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: apache-service
+ port:
+ number: 80
+ - host: www.f3s.buetow.org
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: apache-service
+ port:
+ number: 80
diff --git a/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-persistent-volume.yaml b/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-persistent-volume.yaml
new file mode 100644
index 00000000..7df28e6b
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-persistent-volume.yaml
@@ -0,0 +1,27 @@
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: example-apache-pv
+spec:
+ capacity:
+ storage: 1Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/example-apache
+ type: Directory
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: example-apache-pvc
+ namespace: test
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 1Gi
diff --git a/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-service.yaml b/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-service.yaml
new file mode 100644
index 00000000..1105e3a7
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/example-apache-volume-claim/helm-chart/templates/apache-service.yaml
@@ -0,0 +1,17 @@
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: apache
+ name: apache-service
+ namespace: test
+spec:
+ ports:
+ - name: web
+ port: 80
+ protocol: TCP
+ # Expose port 80 on the service
+ targetPort: 80
+ selector:
+ # Link this service to pods with the label app=apache
+ app: apache
diff --git a/gemfeed/examples/conf/f3s/example-apache/Justfile b/gemfeed/examples/conf/f3s/example-apache/Justfile
new file mode 100644
index 00000000..579b9253
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/example-apache/Justfile
@@ -0,0 +1,12 @@
+NAMESPACE := "test"
+RELEASE_NAME := "example-apache"
+CHART_PATH := "./helm-chart"
+
+install:
+ helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+
+upgrade:
+ helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+
+delete:
+ helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
diff --git a/gemfeed/examples/conf/f3s/example-apache/helm-chart/Chart.yaml b/gemfeed/examples/conf/f3s/example-apache/helm-chart/Chart.yaml
new file mode 100644
index 00000000..6d496436
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/example-apache/helm-chart/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v2
+name: apache
+description: A Helm chart for deploying Apache
+version: 0.1.0
+appVersion: "1.0"
diff --git a/gemfeed/examples/conf/f3s/example-apache/helm-chart/templates/apache-deployment.yaml b/gemfeed/examples/conf/f3s/example-apache/helm-chart/templates/apache-deployment.yaml
new file mode 100644
index 00000000..364de1da
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/example-apache/helm-chart/templates/apache-deployment.yaml
@@ -0,0 +1,21 @@
+# Apache HTTP Server Deployment
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: apache-deployment
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: apache
+ template:
+ metadata:
+ labels:
+ app: apache
+ spec:
+ containers:
+ - name: apache
+ image: httpd:latest
+ ports:
+ # Container port where Apache listens
+ - containerPort: 80
diff --git a/gemfeed/examples/conf/f3s/example-apache/helm-chart/templates/apache-ingress.yaml b/gemfeed/examples/conf/f3s/example-apache/helm-chart/templates/apache-ingress.yaml
new file mode 100644
index 00000000..aa575edd
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/example-apache/helm-chart/templates/apache-ingress.yaml
@@ -0,0 +1,40 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: apache-ingress
+ namespace: test
+ annotations:
+ spec.ingressClassName: traefik
+ traefik.ingress.kubernetes.io/router.entrypoints: web
+spec:
+ rules:
+ - host: f3s.buetow.org
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: apache-service
+ port:
+ number: 80
+ - host: standby.f3s.buetow.org
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: apache-service
+ port:
+ number: 80
+ - host: www.f3s.buetow.org
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: apache-service
+ port:
+ number: 80
diff --git a/gemfeed/examples/conf/f3s/example-apache/helm-chart/templates/apache-service.yaml b/gemfeed/examples/conf/f3s/example-apache/helm-chart/templates/apache-service.yaml
new file mode 100644
index 00000000..93b24acb
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/example-apache/helm-chart/templates/apache-service.yaml
@@ -0,0 +1,16 @@
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: apache
+ name: apache-service
+spec:
+ ports:
+ - name: web
+ port: 80
+ protocol: TCP
+ # Expose port 80 on the service
+ targetPort: 80
+ selector:
+ # Link this service to pods with the label app=apache
+ app: apache
diff --git a/gemfeed/examples/conf/f3s/freshrss/Justfile b/gemfeed/examples/conf/f3s/freshrss/Justfile
new file mode 100644
index 00000000..d88fe3d4
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/freshrss/Justfile
@@ -0,0 +1,12 @@
+NAMESPACE := "services"
+RELEASE_NAME := "freshrss"
+CHART_PATH := "./helm-chart"
+
+install:
+ helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+
+upgrade:
+ helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+
+delete:
+ helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
diff --git a/gemfeed/examples/conf/f3s/freshrss/helm-chart/Chart.yaml b/gemfeed/examples/conf/f3s/freshrss/helm-chart/Chart.yaml
new file mode 100644
index 00000000..05cd76a0
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/freshrss/helm-chart/Chart.yaml
@@ -0,0 +1,6 @@
+apiVersion: v2
+name: freshrss
+description: A Helm chart for deploying FreshRSS.
+version: 0.1.0
+appVersion: "latest"
+
diff --git a/gemfeed/examples/conf/f3s/freshrss/helm-chart/templates/deployment.yaml b/gemfeed/examples/conf/f3s/freshrss/helm-chart/templates/deployment.yaml
new file mode 100644
index 00000000..99f114cb
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/freshrss/helm-chart/templates/deployment.yaml
@@ -0,0 +1,48 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: freshrss
+ namespace: services
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: freshrss
+ template:
+ metadata:
+ labels:
+ app: freshrss
+ spec:
+ securityContext:
+ runAsUser: 65534 # nobody
+ runAsGroup: 65534 # nobody / nogroup
+ fsGroup: 65534 # ensure mounted volumes are group-writable
+ runAsNonRoot: true
+ containers:
+ - name: freshrss
+ image: freshrss/freshrss:latest
+ ports:
+ - containerPort: 80
+ volumeMounts:
+ - name: freshrss-data
+ mountPath: /var/www/FreshRSS/data
+ volumes:
+ - name: freshrss-data
+ persistentVolumeClaim:
+ claimName: freshrss-data-pvc
+---
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: freshrss
+ name: freshrss-service
+ namespace: services
+spec:
+ ports:
+ - name: web
+ port: 80
+ protocol: TCP
+ targetPort: 80
+ selector:
+ app: freshrss
diff --git a/gemfeed/examples/conf/f3s/freshrss/helm-chart/templates/ingress.yaml b/gemfeed/examples/conf/f3s/freshrss/helm-chart/templates/ingress.yaml
new file mode 100644
index 00000000..67409615
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/freshrss/helm-chart/templates/ingress.yaml
@@ -0,0 +1,21 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: freshrss-ingress
+ namespace: services
+ annotations:
+ spec.ingressClassName: traefik
+ traefik.ingress.kubernetes.io/router.entrypoints: web
+spec:
+ rules:
+ - host: freshrss.f3s.buetow.org
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: freshrss-service
+ port:
+ number: 80
+
diff --git a/gemfeed/examples/conf/f3s/freshrss/helm-chart/templates/persistent-volumes.yaml b/gemfeed/examples/conf/f3s/freshrss/helm-chart/templates/persistent-volumes.yaml
new file mode 100644
index 00000000..813d2acb
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/freshrss/helm-chart/templates/persistent-volumes.yaml
@@ -0,0 +1,28 @@
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: freshrss-data-pv
+spec:
+ capacity:
+ storage: 1Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/freshrss/data
+ type: Directory
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: freshrss-data-pvc
+ namespace: services
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 1Gi
+
diff --git a/gemfeed/examples/conf/f3s/miniflux/Justfile b/gemfeed/examples/conf/f3s/miniflux/Justfile
new file mode 100644
index 00000000..5becacfe
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/miniflux/Justfile
@@ -0,0 +1,12 @@
+NAMESPACE := "services"
+RELEASE_NAME := "miniflux"
+CHART_PATH := "./helm-chart"
+
+install:
+ helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+
+upgrade:
+ helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+
+delete:
+ helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
diff --git a/gemfeed/examples/conf/f3s/miniflux/helm-chart/Chart.yaml b/gemfeed/examples/conf/f3s/miniflux/helm-chart/Chart.yaml
new file mode 100644
index 00000000..f88e3f3d
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/miniflux/helm-chart/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v2
+name: miniflux
+description: A Helm chart for deploying Miniflux.
+version: 0.1.0
+appVersion: "latest"
diff --git a/gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/deployment.yaml b/gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/deployment.yaml
new file mode 100644
index 00000000..08647a73
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/deployment.yaml
@@ -0,0 +1,92 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: miniflux-server
+ labels:
+ app: miniflux-server
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: miniflux-server
+ template:
+ metadata:
+ labels:
+ app: miniflux-server
+ spec:
+ initContainers:
+ - name: wait-for-postgres
+ image: postgres:17
+ command: ["/bin/sh", "-c"]
+ args:
+ - |
+ echo "Waiting for Postgres at miniflux-postgres:5432...";
+ until pg_isready -h miniflux-postgres -p 5432 -U miniflux; do
+ echo "Postgres not ready, sleeping...";
+ sleep 2;
+ done;
+ echo "Postgres is ready."
+ containers:
+ - name: miniflux
+ image: miniflux/miniflux:latest
+ ports:
+ - containerPort: 8080
+ env:
+ - name: CREATE_ADMIN
+ value: "1"
+ - name: ADMIN_USERNAME
+ value: "admin"
+ - name: ADMIN_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: miniflux-admin-password
+ key: admin_password
+ - name: RUN_MIGRATIONS
+ value: "1"
+ - name: POLLING_FREQUENCY
+ value: "10"
+ - name: POSTGRES_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: miniflux-db-password
+ key: fluxdb_password
+ command: ["/bin/sh", "-c"]
+ args:
+ - export DATABASE_URL="postgres://miniflux:${POSTGRES_PASSWORD}@miniflux-postgres:5432/miniflux?sslmode=disable"; exec /usr/bin/miniflux
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: miniflux-postgres
+ labels:
+ app: miniflux-postgres
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: miniflux-postgres
+ template:
+ metadata:
+ labels:
+ app: miniflux-postgres
+ spec:
+ containers:
+ - name: miniflux-postgres
+ image: postgres:17
+ ports:
+ - containerPort: 5432
+ env:
+ - name: POSTGRES_USER
+ value: "miniflux"
+ - name: POSTGRES_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: miniflux-db-password
+ key: fluxdb_password
+ volumeMounts:
+ - name: miniflux-postgres-data
+ mountPath: /var/lib/postgresql/data
+ volumes:
+ - name: miniflux-postgres-data
+ persistentVolumeClaim:
+ claimName: miniflux-postgres-pvc
diff --git a/gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/ingress.yaml b/gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/ingress.yaml
new file mode 100644
index 00000000..95f18389
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/ingress.yaml
@@ -0,0 +1,20 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: miniflux-ingress
+ namespace: services
+ annotations:
+ spec.ingressClassName: traefik
+ traefik.ingress.kubernetes.io/router.entrypoints: web
+spec:
+ rules:
+ - host: flux.f3s.buetow.org
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: miniflux
+ port:
+ number: 8080
diff --git a/gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/persistent-volumes.yaml b/gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/persistent-volumes.yaml
new file mode 100644
index 00000000..2c4331c8
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/persistent-volumes.yaml
@@ -0,0 +1,27 @@
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: miniflux-postgres-pv
+spec:
+ capacity:
+ storage: 1Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/miniflux/data
+ type: Directory
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: miniflux-postgres-pvc
+ namespace: services
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 1Gi
diff --git a/gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/service.yaml b/gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/service.yaml
new file mode 100644
index 00000000..6855888f
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/miniflux/helm-chart/templates/service.yaml
@@ -0,0 +1,23 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: miniflux
+spec:
+ selector:
+ app: miniflux-server
+ ports:
+ - protocol: TCP
+ port: 8080
+ targetPort: 8080
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: miniflux-postgres
+spec:
+ selector:
+ app: miniflux-postgres
+ ports:
+ - protocol: TCP
+ port: 5432
+ targetPort: 5432
diff --git a/gemfeed/examples/conf/f3s/opodsync/Justfile b/gemfeed/examples/conf/f3s/opodsync/Justfile
new file mode 100644
index 00000000..3143637b
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/opodsync/Justfile
@@ -0,0 +1,12 @@
+NAMESPACE := "services"
+RELEASE_NAME := "opodsync"
+CHART_PATH := "./helm-chart"
+
+install:
+ helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+
+upgrade:
+ helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+
+delete:
+ helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}} \ No newline at end of file
diff --git a/gemfeed/examples/conf/f3s/opodsync/helm-chart/Chart.yaml b/gemfeed/examples/conf/f3s/opodsync/helm-chart/Chart.yaml
new file mode 100644
index 00000000..8d41abe1
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/opodsync/helm-chart/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v2
+name: opodsync
+description: A Helm chart for deploying the opodsync.
+version: 0.1.0
+appVersion: "latest"
diff --git a/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/configmap-nginx.yaml b/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/configmap-nginx.yaml
new file mode 100644
index 00000000..b4c2ef62
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/configmap-nginx.yaml
@@ -0,0 +1,46 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: opodsync-nginx-config
+ namespace: services
+data:
+ nginx.conf: |
+ worker_processes 1;
+ events { worker_connections 1024; }
+ http {
+ variables_hash_bucket_size 128;
+ include mime.types;
+ default_type application/octet-stream;
+ sendfile on;
+ keepalive_timeout 65;
+
+ upstream backend {
+ server 127.0.0.1:8080;
+ }
+
+ server {
+ listen 8081;
+
+ # Preserve client details
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+
+ # Root path internally proxies to /gpodder on backend
+ location = / {
+ proxy_pass http://backend/gpodder;
+ }
+
+ # Pass through existing /gpodder paths unchanged
+ location /gpodder {
+ proxy_pass http://backend;
+ }
+
+ # Fallback: proxy everything else as-is
+ location / {
+ proxy_pass http://backend;
+ }
+ }
+ }
+
diff --git a/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/deployment.yaml b/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/deployment.yaml
new file mode 100644
index 00000000..b0f11d9e
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/deployment.yaml
@@ -0,0 +1,43 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: opodsync
+ namespace: services
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: opodsync
+ template:
+ metadata:
+ labels:
+ app: opodsync
+ spec:
+ containers:
+ - name: opodsync
+ image: ganeshlab/opodsync
+ env:
+ - name: GPODDER_BASE_URL
+ value: "https://gpodder.f3s.buetow.org/gpodder"
+ - name: GPODDER_ALLOW_REGISTRATIONS
+ value: "true"
+ ports:
+ - containerPort: 8080
+ volumeMounts:
+ - name: opodsync-data
+ mountPath: /var/www/server/data
+ - name: nginx-proxy
+ image: nginx:1.25-alpine
+ ports:
+ - containerPort: 8081
+ volumeMounts:
+ - name: nginx-config
+ mountPath: /etc/nginx/nginx.conf
+ subPath: nginx.conf
+ volumes:
+ - name: opodsync-data
+ persistentVolumeClaim:
+ claimName: opodsync-data-pvc
+ - name: nginx-config
+ configMap:
+ name: opodsync-nginx-config
diff --git a/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/ingress.yaml b/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/ingress.yaml
new file mode 100644
index 00000000..a29d27bf
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/ingress.yaml
@@ -0,0 +1,20 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: opodsync-ingress
+ namespace: services
+ annotations:
+ spec.ingressClassName: traefik
+ traefik.ingress.kubernetes.io/router.entrypoints: web
+spec:
+ rules:
+ - host: gpodder.f3s.buetow.org
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: opodsync-service
+ port:
+ number: 80
diff --git a/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/persistent-volumes.yaml b/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/persistent-volumes.yaml
new file mode 100644
index 00000000..0a6dedc0
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/persistent-volumes.yaml
@@ -0,0 +1,27 @@
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: opodsync-data-pv
+spec:
+ capacity:
+ storage: 1Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/opodsync/data
+ type: DirectoryOrCreate
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: opodsync-data-pvc
+ namespace: services
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 1Gi \ No newline at end of file
diff --git a/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/service.yaml b/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/service.yaml
new file mode 100644
index 00000000..16763f03
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/opodsync/helm-chart/templates/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: opodsync
+ name: opodsync-service
+ namespace: services
+spec:
+ ports:
+ - name: web
+ port: 80
+ protocol: TCP
+ targetPort: 8081
+ selector:
+ app: opodsync
diff --git a/gemfeed/examples/conf/f3s/radicale/Justfile b/gemfeed/examples/conf/f3s/radicale/Justfile
new file mode 100644
index 00000000..6be7406a
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/radicale/Justfile
@@ -0,0 +1,12 @@
+NAMESPACE := "services"
+RELEASE_NAME := "radicale"
+CHART_PATH := "./helm-chart"
+
+install:
+ helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+
+upgrade:
+ helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+
+delete:
+ helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
diff --git a/gemfeed/examples/conf/f3s/radicale/helm-chart/Chart.yaml b/gemfeed/examples/conf/f3s/radicale/helm-chart/Chart.yaml
new file mode 100644
index 00000000..421dd485
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/radicale/helm-chart/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v2
+name: radicale
+description: A Helm chart for deploying a gpodder sync server.
+version: 0.1.0
+appVersion: "latest"
diff --git a/gemfeed/examples/conf/f3s/radicale/helm-chart/templates/deployment.yaml b/gemfeed/examples/conf/f3s/radicale/helm-chart/templates/deployment.yaml
new file mode 100644
index 00000000..725fcba1
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/radicale/helm-chart/templates/deployment.yaml
@@ -0,0 +1,67 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: radicale
+ namespace: services
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: radicale
+ template:
+ metadata:
+ labels:
+ app: radicale
+ spec:
+ initContainers:
+ - name: debug-auth-and-mounts
+ image: busybox:1.36
+ command: ["/bin/sh", "-c"]
+ args:
+ - |
+ set -eu
+ echo "=== /proc/mounts ===" && cat /proc/mounts || true
+ echo "=== df -h ===" && df -h || true
+ echo "=== ls -lna / ===" && ls -lna / || true
+ echo "=== ls -lna /auth ===" && ls -lna /auth || true
+ echo "=== ls -lna /collections ===" && ls -lna /collections || true
+ echo "=== find /auth (maxdepth 2) ===" && find /auth -maxdepth 2 || true
+ [ -f /auth/htpasswd ] && { echo "=== stat /auth/htpasswd ==="; stat /auth/htpasswd || true; } || echo "htpasswd missing in init"
+ volumeMounts:
+ - name: radicale-collections
+ mountPath: /collections
+ - name: radicale-auth
+ mountPath: /auth
+ containers:
+ - name: radicale
+ image: registry.lan.buetow.org:30001/radicale:latest
+ ports:
+ - containerPort: 8080
+ volumeMounts:
+ - name: radicale-collections
+ mountPath: /collections
+ - name: radicale-auth
+ mountPath: /auth
+ volumes:
+ - name: radicale-collections
+ persistentVolumeClaim:
+ claimName: radicale-collections-pvc
+ - name: radicale-auth
+ persistentVolumeClaim:
+ claimName: radicale-auth-pvc
+---
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: radicale
+ name: radicale-service
+ namespace: services
+spec:
+ ports:
+ - name: web
+ port: 80
+ protocol: TCP
+ targetPort: 8080
+ selector:
+ app: radicale
diff --git a/gemfeed/examples/conf/f3s/radicale/helm-chart/templates/ingress.yaml b/gemfeed/examples/conf/f3s/radicale/helm-chart/templates/ingress.yaml
new file mode 100644
index 00000000..680ab7d8
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/radicale/helm-chart/templates/ingress.yaml
@@ -0,0 +1,20 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: radicale-ingress
+ namespace: services
+ annotations:
+ spec.ingressClassName: traefik
+ traefik.ingress.kubernetes.io/router.entrypoints: web
+spec:
+ rules:
+ - host: radicale.f3s.buetow.org
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: radicale-service
+ port:
+ number: 80
diff --git a/gemfeed/examples/conf/f3s/radicale/helm-chart/templates/persistent-volumes.yaml b/gemfeed/examples/conf/f3s/radicale/helm-chart/templates/persistent-volumes.yaml
new file mode 100644
index 00000000..95d64883
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/radicale/helm-chart/templates/persistent-volumes.yaml
@@ -0,0 +1,55 @@
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: radicale-collections-pv
+spec:
+ capacity:
+ storage: 1Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/radicale/collections
+ type: Directory
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: radicale-collections-pvc
+ namespace: services
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 1Gi
+---
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: radicale-auth-pv
+spec:
+ capacity:
+ storage: 1Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/radicale/auth
+ type: Directory
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: radicale-auth-pvc
+ namespace: services
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 1Gi
diff --git a/gemfeed/examples/conf/f3s/registry/Justfile b/gemfeed/examples/conf/f3s/registry/Justfile
new file mode 100644
index 00000000..297d95a7
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/registry/Justfile
@@ -0,0 +1,12 @@
+NAMESPACE := "infra"
+RELEASE_NAME := "registry"
+CHART_PATH := "./helm-chart"
+
+install:
+ helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+
+upgrade:
+ helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+
+delete:
+ helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
diff --git a/gemfeed/examples/conf/f3s/registry/helm-chart/Chart.yaml b/gemfeed/examples/conf/f3s/registry/helm-chart/Chart.yaml
new file mode 100644
index 00000000..0f7d68fa
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/registry/helm-chart/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v2
+name: registry
+description: A Helm chart for deploying a private Docker registry.
+version: 0.1.0
+appVersion: "2.0"
diff --git a/gemfeed/examples/conf/f3s/registry/helm-chart/templates/deployment.yaml b/gemfeed/examples/conf/f3s/registry/helm-chart/templates/deployment.yaml
new file mode 100644
index 00000000..70522f8d
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/registry/helm-chart/templates/deployment.yaml
@@ -0,0 +1,29 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: docker-registry
+ namespace: infra
+ labels:
+ app: docker-registry
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: docker-registry
+ template:
+ metadata:
+ labels:
+ app: docker-registry
+ spec:
+ containers:
+ - name: registry
+ image: registry:2
+ ports:
+ - containerPort: 5000
+ volumeMounts:
+ - name: registry-storage
+ mountPath: /var/lib/registry
+ volumes:
+ - name: registry-storage
+ persistentVolumeClaim:
+ claimName: docker-registry-pvc
diff --git a/gemfeed/examples/conf/f3s/registry/helm-chart/templates/pv.yaml b/gemfeed/examples/conf/f3s/registry/helm-chart/templates/pv.yaml
new file mode 100644
index 00000000..fb747ca0
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/registry/helm-chart/templates/pv.yaml
@@ -0,0 +1,14 @@
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: docker-registry-pv
+spec:
+ capacity:
+ storage: 5Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/registry
+ type: Directory
diff --git a/gemfeed/examples/conf/f3s/registry/helm-chart/templates/pvc.yaml b/gemfeed/examples/conf/f3s/registry/helm-chart/templates/pvc.yaml
new file mode 100644
index 00000000..e769c893
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/registry/helm-chart/templates/pvc.yaml
@@ -0,0 +1,12 @@
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: docker-registry-pvc
+ namespace: infra
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 5Gi
diff --git a/gemfeed/examples/conf/f3s/registry/helm-chart/templates/service.yaml b/gemfeed/examples/conf/f3s/registry/helm-chart/templates/service.yaml
new file mode 100644
index 00000000..a97f14e0
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/registry/helm-chart/templates/service.yaml
@@ -0,0 +1,14 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: docker-registry-service
+ namespace: infra
+spec:
+ selector:
+ app: docker-registry
+ ports:
+ - protocol: TCP
+ port: 5000
+ targetPort: 5000
+ nodePort: 30001
+ type: NodePort
diff --git a/gemfeed/examples/conf/f3s/syncthing/Justfile b/gemfeed/examples/conf/f3s/syncthing/Justfile
new file mode 100644
index 00000000..4be94ee2
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/syncthing/Justfile
@@ -0,0 +1,12 @@
+NAMESPACE := "services"
+RELEASE_NAME := "syncthing"
+CHART_PATH := "./helm-chart"
+
+install:
+ helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+
+upgrade:
+ helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+
+delete:
+ helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
diff --git a/gemfeed/examples/conf/f3s/syncthing/helm-chart/Chart.yaml b/gemfeed/examples/conf/f3s/syncthing/helm-chart/Chart.yaml
new file mode 100644
index 00000000..2b982524
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/syncthing/helm-chart/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v2
+name: syncthing
+description: A Helm chart for deploying Syncthing.
+version: 0.1.0
+appVersion: "latest"
diff --git a/gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/deployment.yaml b/gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/deployment.yaml
new file mode 100644
index 00000000..9a85a174
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/deployment.yaml
@@ -0,0 +1,33 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: syncthing
+ namespace: services
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: syncthing
+ template:
+ metadata:
+ labels:
+ app: syncthing
+ spec:
+ containers:
+ - name: syncthing
+ image: lscr.io/linuxserver/syncthing:latest
+ ports:
+ - containerPort: 8384
+ - containerPort: 22000
+ volumeMounts:
+ - name: syncthing-config
+ mountPath: /config
+ - name: syncthing-data
+ mountPath: /data
+ volumes:
+ - name: syncthing-config
+ persistentVolumeClaim:
+ claimName: syncthing-config-pvc
+ - name: syncthing-data
+ persistentVolumeClaim:
+ claimName: syncthing-data-pvc
diff --git a/gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/ingress.yaml b/gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/ingress.yaml
new file mode 100644
index 00000000..b1e68e1f
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/ingress.yaml
@@ -0,0 +1,20 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: syncthing-ingress
+ namespace: services
+ annotations:
+ spec.ingressClassName: traefik
+ traefik.ingress.kubernetes.io/router.entrypoints: web
+spec:
+ rules:
+ - host: syncthing.f3s.buetow.org
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: syncthing-service
+ port:
+ number: 8384
diff --git a/gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/persistent-volume.yaml b/gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/persistent-volume.yaml
new file mode 100644
index 00000000..793ae608
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/persistent-volume.yaml
@@ -0,0 +1,55 @@
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: syncthing-config-pv
+spec:
+ capacity:
+ storage: 1Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/syncthing/config
+ type: Directory
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: syncthing-config-pvc
+ namespace: services
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 1Gi
+---
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: syncthing-data-pv
+spec:
+ capacity:
+ storage: 300Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/syncthing/data
+ type: Directory
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: syncthing-data-pvc
+ namespace: services
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 300Gi \ No newline at end of file
diff --git a/gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/service.yaml b/gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/service.yaml
new file mode 100644
index 00000000..74bf5ed4
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/syncthing/helm-chart/templates/service.yaml
@@ -0,0 +1,19 @@
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: syncthing
+ name: syncthing-service
+ namespace: services
+spec:
+ ports:
+ - name: web
+ port: 8384
+ protocol: TCP
+ targetPort: 8384
+ - name: data
+ port: 22000
+ protocol: TCP
+ targetPort: 22000
+ selector:
+ app: syncthing
diff --git a/gemfeed/examples/conf/f3s/wallabag/Justfile b/gemfeed/examples/conf/f3s/wallabag/Justfile
new file mode 100644
index 00000000..6c3a8818
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/wallabag/Justfile
@@ -0,0 +1,12 @@
+NAMESPACE := "services"
+RELEASE_NAME := "wallabag"
+CHART_PATH := "./helm-chart"
+
+install:
+ helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+
+upgrade:
+ helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+
+delete:
+ helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
diff --git a/gemfeed/examples/conf/f3s/wallabag/helm-chart/Chart.yaml b/gemfeed/examples/conf/f3s/wallabag/helm-chart/Chart.yaml
new file mode 100644
index 00000000..2fb05aba
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/wallabag/helm-chart/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v2
+name: wallabag
+description: A Helm chart for deploying Wallabag.
+version: 0.1.0
+appVersion: "latest"
diff --git a/gemfeed/examples/conf/f3s/wallabag/helm-chart/templates/deployment.yaml b/gemfeed/examples/conf/f3s/wallabag/helm-chart/templates/deployment.yaml
new file mode 100644
index 00000000..25dcffdc
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/wallabag/helm-chart/templates/deployment.yaml
@@ -0,0 +1,51 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: wallabag
+ namespace: services
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: wallabag
+ template:
+ metadata:
+ labels:
+ app: wallabag
+ spec:
+ containers:
+ - name: wallabag
+ image: wallabag/wallabag
+ ports:
+ - containerPort: 80
+ env:
+ - name: SYMFONY__ENV__DOMAIN_NAME
+ value: "https://bag.f3s.buetow.org"
+ volumeMounts:
+ - name: wallabag-data
+ mountPath: /var/www/wallabag/data
+ - name: wallabag-images
+ mountPath: /var/www/wallabag/web/assets/images
+ volumes:
+ - name: wallabag-data
+ persistentVolumeClaim:
+ claimName: wallabag-data-pvc
+ - name: wallabag-images
+ persistentVolumeClaim:
+ claimName: wallabag-images-pvc
+---
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ app: wallabag
+ name: wallabag-service
+ namespace: services
+spec:
+ ports:
+ - name: web
+ port: 80
+ protocol: TCP
+ targetPort: 80
+ selector:
+ app: wallabag
diff --git a/gemfeed/examples/conf/f3s/wallabag/helm-chart/templates/ingress.yaml b/gemfeed/examples/conf/f3s/wallabag/helm-chart/templates/ingress.yaml
new file mode 100644
index 00000000..deb489aa
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/wallabag/helm-chart/templates/ingress.yaml
@@ -0,0 +1,20 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: wallabag-ingress
+ namespace: services
+ annotations:
+ spec.ingressClassName: traefik
+ traefik.ingress.kubernetes.io/router.entrypoints: web
+spec:
+ rules:
+ - host: bag.f3s.buetow.org
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: wallabag-service
+ port:
+ number: 80
diff --git a/gemfeed/examples/conf/f3s/wallabag/helm-chart/templates/persistent-volumes.yaml b/gemfeed/examples/conf/f3s/wallabag/helm-chart/templates/persistent-volumes.yaml
new file mode 100644
index 00000000..6f5346aa
--- /dev/null
+++ b/gemfeed/examples/conf/f3s/wallabag/helm-chart/templates/persistent-volumes.yaml
@@ -0,0 +1,55 @@
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: wallabag-data-pv
+spec:
+ capacity:
+ storage: 1Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/wallabag/data
+ type: Directory
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: wallabag-data-pvc
+ namespace: services
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 1Gi
+---
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: wallabag-images-pv
+spec:
+ capacity:
+ storage: 1Gi
+ volumeMode: Filesystem
+ accessModes:
+ - ReadWriteOnce
+ persistentVolumeReclaimPolicy: Retain
+ hostPath:
+ path: /data/nfs/k3svolumes/wallabag/images
+ type: Directory
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: wallabag-images-pvc
+ namespace: services
+spec:
+ storageClassName: ""
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 1Gi