summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-01-07 22:48:29 +0200
committerPaul Buetow <paul@buetow.org>2026-01-07 22:48:29 +0200
commitf7624de03b894d31347ec15c9571e8cfe83903ff (patch)
tree88a35208c57c3fc7be94196574a99ce3322e522f
parentf1925c872c496c914da99fcbf3a07c9292e911a7 (diff)
Migrate 8 remaining simple service apps to ArgoCD
Apps migrated in this commit: - anki-sync-server (custom images, 1 PVC) - syncthing (file sync, 2 PVCs) - audiobookshelf (3 PVCs) - radicale (CalDAV/CardDAV) - opodsync (podcast sync, 2-container pod) - kobo-sync-server (eReader sync) - filebrowser (3 PVCs) - webdav (WebDAV server) All apps: - Created ArgoCD Application manifests - Updated Justfiles with ArgoCD commands - All synced successfully and healthy - Zero downtime migrations Also includes: - Updated migration progress tracker (12/23 apps, 52%) - Deleted freshrss directory (app no longer needed) Progress: 12/23 apps (52%) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
-rw-r--r--f3s/CLAUDE.md3
-rw-r--r--f3s/anki-sync-server/Justfile59
-rw-r--r--f3s/argocd-apps/anki-sync-server.yaml28
-rw-r--r--f3s/argocd-apps/audiobookshelf.yaml28
-rw-r--r--f3s/argocd-apps/filebrowser.yaml28
-rw-r--r--f3s/argocd-apps/kobo-sync-server.yaml28
-rw-r--r--f3s/argocd-apps/miniflux.yaml28
-rw-r--r--f3s/argocd-apps/opodsync.yaml28
-rw-r--r--f3s/argocd-apps/radicale.yaml28
-rw-r--r--f3s/argocd-apps/syncthing.yaml28
-rw-r--r--f3s/argocd-apps/tracing-demo.yaml28
-rw-r--r--f3s/argocd-apps/webdav.yaml28
-rw-r--r--f3s/audiobookshelf/Justfile42
-rw-r--r--f3s/filebrowser/Justfile44
-rw-r--r--f3s/freshrss/Justfile12
-rw-r--r--f3s/freshrss/README.md29
-rw-r--r--f3s/freshrss/helm-chart/Chart.yaml6
-rw-r--r--f3s/freshrss/helm-chart/templates/deployment.yaml48
-rw-r--r--f3s/freshrss/helm-chart/templates/ingress.yaml21
-rw-r--r--f3s/freshrss/helm-chart/templates/persistent-volumes.yaml28
-rw-r--r--f3s/kobo-sync-server/Justfile42
-rw-r--r--f3s/miniflux/Justfile67
-rw-r--r--f3s/opodsync/Justfile42
-rw-r--r--f3s/radicale/Justfile42
-rw-r--r--f3s/syncthing/Justfile42
-rw-r--r--f3s/tracing-demo/Justfile45
-rw-r--r--f3s/webdav/Justfile42
27 files changed, 656 insertions, 238 deletions
diff --git a/f3s/CLAUDE.md b/f3s/CLAUDE.md
index 18cf7d2..5592e84 100644
--- a/f3s/CLAUDE.md
+++ b/f3s/CLAUDE.md
@@ -1,2 +1 @@
-Read /home/paul/Notes/snippets/f3s/f3s.md
-
+@/home/paul/Notes/snippets/f3s/f3s.md
diff --git a/f3s/anki-sync-server/Justfile b/f3s/anki-sync-server/Justfile
index 73d679c..8c6cd97 100644
--- a/f3s/anki-sync-server/Justfile
+++ b/f3s/anki-sync-server/Justfile
@@ -1,12 +1,55 @@
NAMESPACE := "services"
-RELEASE_NAME := "anki-sync-server"
-CHART_PATH := "./helm-chart"
+APP_NAME := "anki-sync-server"
-install:
- helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+# Build Docker image
+build:
+ just -f docker-image-Justfile build
-upgrade:
- helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+# Push image to registry
+push:
+ just -f docker-image-Justfile push
-delete:
- helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
+# Build and push
+build-push: build push
+
+# Show deployment status
+status:
+ @echo "=== Pods ==="
+ @kubectl get pods -n {{NAMESPACE}} | grep anki
+ @echo ""
+ @echo "=== Service ==="
+ @kubectl get svc -n {{NAMESPACE}} anki-sync-server-service
+ @echo ""
+ @echo "=== Ingress ==="
+ @kubectl get ingress -n {{NAMESPACE}} anki-sync-server-ingress
+ @echo ""
+ @echo "=== PVC ==="
+ @kubectl get pvc -n {{NAMESPACE}} anki-data-pvc
+ @echo ""
+ @echo "=== ArgoCD Status ==="
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' 2>/dev/null && echo "" || echo "Not found"
+
+# View logs
+logs lines="100":
+ kubectl logs -n {{NAMESPACE}} -l app=anki-sync-server --tail={{lines}} -f
+
+# Port forward
+port-forward port="8080":
+ @echo "Forwarding anki-sync-server to localhost:{{port}}"
+ kubectl port-forward -n {{NAMESPACE}} svc/anki-sync-server-service {{port}}:8080
+
+# Trigger ArgoCD sync
+sync:
+ @echo "Triggering ArgoCD sync..."
+ @kubectl annotate application {{APP_NAME}} -n cicd argocd.argoproj.io/refresh=normal --overwrite
+ @sleep 2
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' && echo ""
+
+# Show ArgoCD application details
+argocd-status:
+ argocd app get {{APP_NAME}} --core
+
+# Restart
+restart:
+ @echo "Restarting anki-sync-server..."
+ kubectl rollout restart -n {{NAMESPACE}} deployment/anki-sync-server
diff --git a/f3s/argocd-apps/anki-sync-server.yaml b/f3s/argocd-apps/anki-sync-server.yaml
new file mode 100644
index 0000000..850af3e
--- /dev/null
+++ b/f3s/argocd-apps/anki-sync-server.yaml
@@ -0,0 +1,28 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+ name: anki-sync-server
+ namespace: cicd
+ finalizers:
+ - resources-finalizer.argocd.argoproj.io
+spec:
+ project: default
+ source:
+ repoURL: https://codeberg.org/snonux/conf.git
+ targetRevision: master
+ path: f3s/anki-sync-server/helm-chart
+ destination:
+ server: https://kubernetes.default.svc
+ namespace: services
+ syncPolicy:
+ automated:
+ prune: true
+ selfHeal: true
+ syncOptions:
+ - CreateNamespace=false
+ retry:
+ limit: 3
+ backoff:
+ duration: 5s
+ factor: 2
+ maxDuration: 1m
diff --git a/f3s/argocd-apps/audiobookshelf.yaml b/f3s/argocd-apps/audiobookshelf.yaml
new file mode 100644
index 0000000..e90e374
--- /dev/null
+++ b/f3s/argocd-apps/audiobookshelf.yaml
@@ -0,0 +1,28 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+ name: audiobookshelf
+ namespace: cicd
+ finalizers:
+ - resources-finalizer.argocd.argoproj.io
+spec:
+ project: default
+ source:
+ repoURL: https://codeberg.org/snonux/conf.git
+ targetRevision: master
+ path: f3s/audiobookshelf/helm-chart
+ destination:
+ server: https://kubernetes.default.svc
+ namespace: services
+ syncPolicy:
+ automated:
+ prune: true
+ selfHeal: true
+ syncOptions:
+ - CreateNamespace=false
+ retry:
+ limit: 3
+ backoff:
+ duration: 5s
+ factor: 2
+ maxDuration: 1m
diff --git a/f3s/argocd-apps/filebrowser.yaml b/f3s/argocd-apps/filebrowser.yaml
new file mode 100644
index 0000000..5e32211
--- /dev/null
+++ b/f3s/argocd-apps/filebrowser.yaml
@@ -0,0 +1,28 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+ name: filebrowser
+ namespace: cicd
+ finalizers:
+ - resources-finalizer.argocd.argoproj.io
+spec:
+ project: default
+ source:
+ repoURL: https://codeberg.org/snonux/conf.git
+ targetRevision: master
+ path: f3s/filebrowser/helm-chart
+ destination:
+ server: https://kubernetes.default.svc
+ namespace: services
+ syncPolicy:
+ automated:
+ prune: true
+ selfHeal: true
+ syncOptions:
+ - CreateNamespace=false
+ retry:
+ limit: 3
+ backoff:
+ duration: 5s
+ factor: 2
+ maxDuration: 1m
diff --git a/f3s/argocd-apps/kobo-sync-server.yaml b/f3s/argocd-apps/kobo-sync-server.yaml
new file mode 100644
index 0000000..eaae84c
--- /dev/null
+++ b/f3s/argocd-apps/kobo-sync-server.yaml
@@ -0,0 +1,28 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+ name: kobo-sync-server
+ namespace: cicd
+ finalizers:
+ - resources-finalizer.argocd.argoproj.io
+spec:
+ project: default
+ source:
+ repoURL: https://codeberg.org/snonux/conf.git
+ targetRevision: master
+ path: f3s/kobo-sync-server/helm-chart
+ destination:
+ server: https://kubernetes.default.svc
+ namespace: services
+ syncPolicy:
+ automated:
+ prune: true
+ selfHeal: true
+ syncOptions:
+ - CreateNamespace=false
+ retry:
+ limit: 3
+ backoff:
+ duration: 5s
+ factor: 2
+ maxDuration: 1m
diff --git a/f3s/argocd-apps/miniflux.yaml b/f3s/argocd-apps/miniflux.yaml
new file mode 100644
index 0000000..9b3a23a
--- /dev/null
+++ b/f3s/argocd-apps/miniflux.yaml
@@ -0,0 +1,28 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+ name: miniflux
+ namespace: cicd
+ finalizers:
+ - resources-finalizer.argocd.argoproj.io
+spec:
+ project: default
+ source:
+ repoURL: https://codeberg.org/snonux/conf.git
+ targetRevision: master
+ path: f3s/miniflux/helm-chart
+ destination:
+ server: https://kubernetes.default.svc
+ namespace: services
+ syncPolicy:
+ automated:
+ prune: true
+ selfHeal: true
+ syncOptions:
+ - CreateNamespace=false
+ retry:
+ limit: 3
+ backoff:
+ duration: 5s
+ factor: 2
+ maxDuration: 1m
diff --git a/f3s/argocd-apps/opodsync.yaml b/f3s/argocd-apps/opodsync.yaml
new file mode 100644
index 0000000..b4b0e54
--- /dev/null
+++ b/f3s/argocd-apps/opodsync.yaml
@@ -0,0 +1,28 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+ name: opodsync
+ namespace: cicd
+ finalizers:
+ - resources-finalizer.argocd.argoproj.io
+spec:
+ project: default
+ source:
+ repoURL: https://codeberg.org/snonux/conf.git
+ targetRevision: master
+ path: f3s/opodsync/helm-chart
+ destination:
+ server: https://kubernetes.default.svc
+ namespace: services
+ syncPolicy:
+ automated:
+ prune: true
+ selfHeal: true
+ syncOptions:
+ - CreateNamespace=false
+ retry:
+ limit: 3
+ backoff:
+ duration: 5s
+ factor: 2
+ maxDuration: 1m
diff --git a/f3s/argocd-apps/radicale.yaml b/f3s/argocd-apps/radicale.yaml
new file mode 100644
index 0000000..d12d771
--- /dev/null
+++ b/f3s/argocd-apps/radicale.yaml
@@ -0,0 +1,28 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+ name: radicale
+ namespace: cicd
+ finalizers:
+ - resources-finalizer.argocd.argoproj.io
+spec:
+ project: default
+ source:
+ repoURL: https://codeberg.org/snonux/conf.git
+ targetRevision: master
+ path: f3s/radicale/helm-chart
+ destination:
+ server: https://kubernetes.default.svc
+ namespace: services
+ syncPolicy:
+ automated:
+ prune: true
+ selfHeal: true
+ syncOptions:
+ - CreateNamespace=false
+ retry:
+ limit: 3
+ backoff:
+ duration: 5s
+ factor: 2
+ maxDuration: 1m
diff --git a/f3s/argocd-apps/syncthing.yaml b/f3s/argocd-apps/syncthing.yaml
new file mode 100644
index 0000000..6cec5d3
--- /dev/null
+++ b/f3s/argocd-apps/syncthing.yaml
@@ -0,0 +1,28 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+ name: syncthing
+ namespace: cicd
+ finalizers:
+ - resources-finalizer.argocd.argoproj.io
+spec:
+ project: default
+ source:
+ repoURL: https://codeberg.org/snonux/conf.git
+ targetRevision: master
+ path: f3s/syncthing/helm-chart
+ destination:
+ server: https://kubernetes.default.svc
+ namespace: services
+ syncPolicy:
+ automated:
+ prune: true
+ selfHeal: true
+ syncOptions:
+ - CreateNamespace=false
+ retry:
+ limit: 3
+ backoff:
+ duration: 5s
+ factor: 2
+ maxDuration: 1m
diff --git a/f3s/argocd-apps/tracing-demo.yaml b/f3s/argocd-apps/tracing-demo.yaml
new file mode 100644
index 0000000..30ab9b0
--- /dev/null
+++ b/f3s/argocd-apps/tracing-demo.yaml
@@ -0,0 +1,28 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+ name: tracing-demo
+ namespace: cicd
+ finalizers:
+ - resources-finalizer.argocd.argoproj.io
+spec:
+ project: default
+ source:
+ repoURL: https://codeberg.org/snonux/conf.git
+ targetRevision: master
+ path: f3s/tracing-demo/helm-chart
+ destination:
+ server: https://kubernetes.default.svc
+ namespace: services
+ syncPolicy:
+ automated:
+ prune: true
+ selfHeal: true
+ syncOptions:
+ - CreateNamespace=false
+ retry:
+ limit: 3
+ backoff:
+ duration: 5s
+ factor: 2
+ maxDuration: 1m
diff --git a/f3s/argocd-apps/webdav.yaml b/f3s/argocd-apps/webdav.yaml
new file mode 100644
index 0000000..3c3158b
--- /dev/null
+++ b/f3s/argocd-apps/webdav.yaml
@@ -0,0 +1,28 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+ name: webdav
+ namespace: cicd
+ finalizers:
+ - resources-finalizer.argocd.argoproj.io
+spec:
+ project: default
+ source:
+ repoURL: https://codeberg.org/snonux/conf.git
+ targetRevision: master
+ path: f3s/webdav/helm-chart
+ destination:
+ server: https://kubernetes.default.svc
+ namespace: services
+ syncPolicy:
+ automated:
+ prune: true
+ selfHeal: true
+ syncOptions:
+ - CreateNamespace=false
+ retry:
+ limit: 3
+ backoff:
+ duration: 5s
+ factor: 2
+ maxDuration: 1m
diff --git a/f3s/audiobookshelf/Justfile b/f3s/audiobookshelf/Justfile
index bc020be..b74631a 100644
--- a/f3s/audiobookshelf/Justfile
+++ b/f3s/audiobookshelf/Justfile
@@ -1,12 +1,38 @@
NAMESPACE := "services"
-RELEASE_NAME := "audiobookshelf"
-CHART_PATH := "./helm-chart"
+APP_NAME := "audiobookshelf"
-install:
- helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+status:
+ @echo "=== Pods ==="
+ @kubectl get pods -n {{NAMESPACE}} | grep audiobookshelf
+ @echo ""
+ @echo "=== Service ==="
+ @kubectl get svc -n {{NAMESPACE}} audiobookshelf-service
+ @echo ""
+ @echo "=== Ingress ==="
+ @kubectl get ingress -n {{NAMESPACE}} audiobookshelf-ingress
+ @echo ""
+ @echo "=== PVCs ==="
+ @kubectl get pvc -n {{NAMESPACE}} | grep audiobookshelf
+ @echo ""
+ @echo "=== ArgoCD Status ==="
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' 2>/dev/null && echo ""
-upgrade:
- helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+logs lines="100":
+ kubectl logs -n {{NAMESPACE}} -l app=audiobookshelf --tail={{lines}} -f
-delete:
- helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
+port-forward port="8000":
+ @echo "Forwarding audiobookshelf to localhost:{{port}}"
+ kubectl port-forward -n {{NAMESPACE}} svc/audiobookshelf-service {{port}}:8000
+
+sync:
+ @echo "Triggering ArgoCD sync..."
+ @kubectl annotate application {{APP_NAME}} -n cicd argocd.argoproj.io/refresh=normal --overwrite
+ @sleep 2
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' && echo ""
+
+argocd-status:
+ argocd app get {{APP_NAME}} --core
+
+restart:
+ @echo "Restarting audiobookshelf..."
+ kubectl rollout restart -n {{NAMESPACE}} deployment/audiobookshelf
diff --git a/f3s/filebrowser/Justfile b/f3s/filebrowser/Justfile
index 2479d83..d8b55a6 100644
--- a/f3s/filebrowser/Justfile
+++ b/f3s/filebrowser/Justfile
@@ -1,16 +1,38 @@
NAMESPACE := "services"
-RELEASE_NAME := "filebrowser"
-CHART_PATH := "./helm-chart"
+APP_NAME := "filebrowser"
-install:
- helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+status:
+ @echo "=== Pods ==="
+ @kubectl get pods -n {{NAMESPACE}} | grep filebrowser
+ @echo ""
+ @echo "=== Service ==="
+ @kubectl get svc -n {{NAMESPACE}} filebrowser-service
+ @echo ""
+ @echo "=== Ingress ==="
+ @kubectl get ingress -n {{NAMESPACE}} filebrowser-ingress
+ @echo ""
+ @echo "=== PVCs ==="
+ @kubectl get pvc -n {{NAMESPACE}} | grep filebrowser
+ @echo ""
+ @echo "=== ArgoCD Status ==="
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' 2>/dev/null && echo ""
-upgrade:
- helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+logs lines="100":
+ kubectl logs -n {{NAMESPACE}} -l app=filebrowser --tail={{lines}} -f
-delete:
- helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
- kubectl delete pvc filebrowser-data-pvc filebrowser-database-pvc filebrowser-config-pvc -n {{NAMESPACE}} --ignore-not-found
- kubectl delete pv filebrowser-data-pv filebrowser-database-pv filebrowser-config-pv --ignore-not-found
+port-forward port="8080":
+ @echo "Forwarding filebrowser to localhost:{{port}}"
+ kubectl port-forward -n {{NAMESPACE}} svc/filebrowser-service {{port}}:8080
-deinstall: delete
+sync:
+ @echo "Triggering ArgoCD sync..."
+ @kubectl annotate application {{APP_NAME}} -n cicd argocd.argoproj.io/refresh=normal --overwrite
+ @sleep 2
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' && echo ""
+
+argocd-status:
+ argocd app get {{APP_NAME}} --core
+
+restart:
+ @echo "Restarting filebrowser..."
+ kubectl rollout restart -n {{NAMESPACE}} deployment/filebrowser
diff --git a/f3s/freshrss/Justfile b/f3s/freshrss/Justfile
deleted file mode 100644
index d88fe3d..0000000
--- a/f3s/freshrss/Justfile
+++ /dev/null
@@ -1,12 +0,0 @@
-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/f3s/freshrss/README.md b/f3s/freshrss/README.md
deleted file mode 100644
index 1a88372..0000000
--- a/f3s/freshrss/README.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# FreshRSS Helm Chart
-
-This chart deploys FreshRSS using a single Deployment, Service, Ingress, and a hostPath-backed PersistentVolume/PersistentVolumeClaim for data.
-
-## Prerequisites
-
-Before installing the chart, you must manually create the hostPath directory used by the PersistentVolume (see `templates/persistent-volumes.yaml`):
-
-- `/data/nfs/k3svolumes/freshrss/data`
-
-Example commands:
-
-```bash
-sudo mkdir -p /data/nfs/k3svolumes/freshrss/data
-# Ensure write permissions for the runtime user/group (nobody:nogroup = 65534:65534)
-sudo chown -R 65534:65534 /data/nfs/k3svolumes/freshrss/data
-```
-
-## Installing the Chart
-
-To install the chart with the release name `freshrss`, run:
-
-```bash
-helm install freshrss . --namespace services --create-namespace
-```
-
-## Access
-
-- Ingress host: `freshrss.f3s.lan.buetow.org`
diff --git a/f3s/freshrss/helm-chart/Chart.yaml b/f3s/freshrss/helm-chart/Chart.yaml
deleted file mode 100644
index 05cd76a..0000000
--- a/f3s/freshrss/helm-chart/Chart.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-apiVersion: v2
-name: freshrss
-description: A Helm chart for deploying FreshRSS.
-version: 0.1.0
-appVersion: "latest"
-
diff --git a/f3s/freshrss/helm-chart/templates/deployment.yaml b/f3s/freshrss/helm-chart/templates/deployment.yaml
deleted file mode 100644
index 99f114c..0000000
--- a/f3s/freshrss/helm-chart/templates/deployment.yaml
+++ /dev/null
@@ -1,48 +0,0 @@
-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/f3s/freshrss/helm-chart/templates/ingress.yaml b/f3s/freshrss/helm-chart/templates/ingress.yaml
deleted file mode 100644
index 6740961..0000000
--- a/f3s/freshrss/helm-chart/templates/ingress.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-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/f3s/freshrss/helm-chart/templates/persistent-volumes.yaml b/f3s/freshrss/helm-chart/templates/persistent-volumes.yaml
deleted file mode 100644
index 813d2ac..0000000
--- a/f3s/freshrss/helm-chart/templates/persistent-volumes.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-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/f3s/kobo-sync-server/Justfile b/f3s/kobo-sync-server/Justfile
index d1c198f..09a0690 100644
--- a/f3s/kobo-sync-server/Justfile
+++ b/f3s/kobo-sync-server/Justfile
@@ -1,12 +1,38 @@
NAMESPACE := "services"
-RELEASE_NAME := "koreader-sync-server"
-CHART_PATH := "./helm-chart"
+APP_NAME := "kobo-sync-server"
-install:
- helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+status:
+ @echo "=== Pods ==="
+ @kubectl get pods -n {{NAMESPACE}} | grep kobo
+ @echo ""
+ @echo "=== Service ==="
+ @kubectl get svc -n {{NAMESPACE}} kobo-sync-server-service
+ @echo ""
+ @echo "=== Ingress ==="
+ @kubectl get ingress -n {{NAMESPACE}} kobo-sync-server-ingress
+ @echo ""
+ @echo "=== PVC ==="
+ @kubectl get pvc -n {{NAMESPACE}} kobo-data-pvc
+ @echo ""
+ @echo "=== ArgoCD Status ==="
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' 2>/dev/null && echo ""
-upgrade:
- helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+logs lines="100":
+ kubectl logs -n {{NAMESPACE}} -l app=kobo-sync-server --tail={{lines}} -f
-delete:
- helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
+port-forward port="8080":
+ @echo "Forwarding kobo-sync-server to localhost:{{port}}"
+ kubectl port-forward -n {{NAMESPACE}} svc/kobo-sync-server-service {{port}}:8080
+
+sync:
+ @echo "Triggering ArgoCD sync..."
+ @kubectl annotate application {{APP_NAME}} -n cicd argocd.argoproj.io/refresh=normal --overwrite
+ @sleep 2
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' && echo ""
+
+argocd-status:
+ argocd app get {{APP_NAME}} --core
+
+restart:
+ @echo "Restarting kobo-sync-server..."
+ kubectl rollout restart -n {{NAMESPACE}} deployment/kobo-sync-server
diff --git a/f3s/miniflux/Justfile b/f3s/miniflux/Justfile
index 5becacf..229c6cb 100644
--- a/f3s/miniflux/Justfile
+++ b/f3s/miniflux/Justfile
@@ -1,12 +1,63 @@
NAMESPACE := "services"
-RELEASE_NAME := "miniflux"
-CHART_PATH := "./helm-chart"
+APP_NAME := "miniflux"
-install:
- helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+# Show deployment status
+status:
+ @echo "=== Pods ==="
+ @kubectl get pods -n {{NAMESPACE}} -l app=miniflux-server
+ @kubectl get pods -n {{NAMESPACE}} -l app=miniflux-postgres
+ @echo ""
+ @echo "=== Services ==="
+ @kubectl get svc -n {{NAMESPACE}} | grep miniflux
+ @echo ""
+ @echo "=== Ingress ==="
+ @kubectl get ingress -n {{NAMESPACE}} miniflux-ingress
+ @echo ""
+ @echo "=== PVC ==="
+ @kubectl get pvc -n {{NAMESPACE}} miniflux-postgres-pvc
+ @echo ""
+ @echo "=== ArgoCD Status ==="
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' 2>/dev/null && echo "" || echo "Not found"
-upgrade:
- helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+# View logs from miniflux server (default 100 lines)
+logs lines="100":
+ kubectl logs -n {{NAMESPACE}} -l app=miniflux-server --tail={{lines}} -f
-delete:
- helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
+# View logs from postgres
+logs-postgres lines="100":
+ kubectl logs -n {{NAMESPACE}} -l app=miniflux-postgres --tail={{lines}} -f
+
+# Port forward to miniflux web UI
+port-forward port="8080":
+ @echo "Forwarding miniflux to localhost:{{port}}"
+ kubectl port-forward -n {{NAMESPACE}} svc/miniflux {{port}}:8080
+
+# Port forward to postgres
+port-forward-postgres port="5432":
+ @echo "Forwarding postgres to localhost:{{port}}"
+ kubectl port-forward -n {{NAMESPACE}} svc/miniflux-postgres {{port}}:5432
+
+# Trigger ArgoCD sync
+sync:
+ @echo "Triggering ArgoCD sync..."
+ @kubectl annotate application {{APP_NAME}} -n cicd argocd.argoproj.io/refresh=normal --overwrite
+ @sleep 2
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' && echo ""
+
+# Show ArgoCD application details
+argocd-status:
+ argocd app get {{APP_NAME}} --core
+
+# Restart miniflux server
+restart:
+ @echo "Restarting miniflux server..."
+ kubectl rollout restart -n {{NAMESPACE}} deployment/miniflux-server
+
+# Restart postgres
+restart-postgres:
+ @echo "Restarting postgres..."
+ kubectl rollout restart -n {{NAMESPACE}} deployment/miniflux-postgres
+
+# Execute psql in postgres pod
+psql:
+ kubectl exec -it -n {{NAMESPACE}} deployment/miniflux-postgres -- psql -U miniflux
diff --git a/f3s/opodsync/Justfile b/f3s/opodsync/Justfile
index 3143637..7ae8875 100644
--- a/f3s/opodsync/Justfile
+++ b/f3s/opodsync/Justfile
@@ -1,12 +1,38 @@
NAMESPACE := "services"
-RELEASE_NAME := "opodsync"
-CHART_PATH := "./helm-chart"
+APP_NAME := "opodsync"
-install:
- helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+status:
+ @echo "=== Pods ==="
+ @kubectl get pods -n {{NAMESPACE}} | grep opodsync
+ @echo ""
+ @echo "=== Service ==="
+ @kubectl get svc -n {{NAMESPACE}} opodsync-service
+ @echo ""
+ @echo "=== Ingress ==="
+ @kubectl get ingress -n {{NAMESPACE}} opodsync-ingress
+ @echo ""
+ @echo "=== PVCs ==="
+ @kubectl get pvc -n {{NAMESPACE}} | grep opodsync
+ @echo ""
+ @echo "=== ArgoCD Status ==="
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' 2>/dev/null && echo ""
-upgrade:
- helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+logs lines="100":
+ kubectl logs -n {{NAMESPACE}} -l app=opodsync -c opodsync --tail={{lines}} -f
-delete:
- helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}} \ No newline at end of file
+port-forward port="8080":
+ @echo "Forwarding opodsync to localhost:{{port}}"
+ kubectl port-forward -n {{NAMESPACE}} svc/opodsync-service {{port}}:8080
+
+sync:
+ @echo "Triggering ArgoCD sync..."
+ @kubectl annotate application {{APP_NAME}} -n cicd argocd.argoproj.io/refresh=normal --overwrite
+ @sleep 2
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' && echo ""
+
+argocd-status:
+ argocd app get {{APP_NAME}} --core
+
+restart:
+ @echo "Restarting opodsync..."
+ kubectl rollout restart -n {{NAMESPACE}} deployment/opodsync
diff --git a/f3s/radicale/Justfile b/f3s/radicale/Justfile
index 6be7406..fbdbaa7 100644
--- a/f3s/radicale/Justfile
+++ b/f3s/radicale/Justfile
@@ -1,12 +1,38 @@
NAMESPACE := "services"
-RELEASE_NAME := "radicale"
-CHART_PATH := "./helm-chart"
+APP_NAME := "radicale"
-install:
- helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+status:
+ @echo "=== Pods ==="
+ @kubectl get pods -n {{NAMESPACE}} | grep radicale
+ @echo ""
+ @echo "=== Service ==="
+ @kubectl get svc -n {{NAMESPACE}} radicale-service
+ @echo ""
+ @echo "=== Ingress ==="
+ @kubectl get ingress -n {{NAMESPACE}} radicale-ingress
+ @echo ""
+ @echo "=== PVC ==="
+ @kubectl get pvc -n {{NAMESPACE}} radicale-data-pvc
+ @echo ""
+ @echo "=== ArgoCD Status ==="
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' 2>/dev/null && echo ""
-upgrade:
- helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+logs lines="100":
+ kubectl logs -n {{NAMESPACE}} -l app=radicale --tail={{lines}} -f
-delete:
- helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
+port-forward port="5232":
+ @echo "Forwarding radicale to localhost:{{port}}"
+ kubectl port-forward -n {{NAMESPACE}} svc/radicale-service {{port}}:5232
+
+sync:
+ @echo "Triggering ArgoCD sync..."
+ @kubectl annotate application {{APP_NAME}} -n cicd argocd.argoproj.io/refresh=normal --overwrite
+ @sleep 2
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' && echo ""
+
+argocd-status:
+ argocd app get {{APP_NAME}} --core
+
+restart:
+ @echo "Restarting radicale..."
+ kubectl rollout restart -n {{NAMESPACE}} deployment/radicale
diff --git a/f3s/syncthing/Justfile b/f3s/syncthing/Justfile
index 4be94ee..a2ebcf4 100644
--- a/f3s/syncthing/Justfile
+++ b/f3s/syncthing/Justfile
@@ -1,12 +1,38 @@
NAMESPACE := "services"
-RELEASE_NAME := "syncthing"
-CHART_PATH := "./helm-chart"
+APP_NAME := "syncthing"
-install:
- helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+status:
+ @echo "=== Pods ==="
+ @kubectl get pods -n {{NAMESPACE}} | grep syncthing
+ @echo ""
+ @echo "=== Service ==="
+ @kubectl get svc -n {{NAMESPACE}} syncthing-service
+ @echo ""
+ @echo "=== Ingress ==="
+ @kubectl get ingress -n {{NAMESPACE}} syncthing-ingress
+ @echo ""
+ @echo "=== PVCs ==="
+ @kubectl get pvc -n {{NAMESPACE}} | grep syncthing
+ @echo ""
+ @echo "=== ArgoCD Status ==="
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' 2>/dev/null && echo ""
-upgrade:
- helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+logs lines="100":
+ kubectl logs -n {{NAMESPACE}} -l app=syncthing --tail={{lines}} -f
-delete:
- helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
+port-forward port="8384":
+ @echo "Forwarding syncthing to localhost:{{port}}"
+ kubectl port-forward -n {{NAMESPACE}} svc/syncthing-service {{port}}:8384
+
+sync:
+ @echo "Triggering ArgoCD sync..."
+ @kubectl annotate application {{APP_NAME}} -n cicd argocd.argoproj.io/refresh=normal --overwrite
+ @sleep 2
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' && echo ""
+
+argocd-status:
+ argocd app get {{APP_NAME}} --core
+
+restart:
+ @echo "Restarting syncthing..."
+ kubectl rollout restart -n {{NAMESPACE}} deployment/syncthing
diff --git a/f3s/tracing-demo/Justfile b/f3s/tracing-demo/Justfile
index d1bc474..79d2cdd 100644
--- a/f3s/tracing-demo/Justfile
+++ b/f3s/tracing-demo/Justfile
@@ -16,26 +16,39 @@ push:
# Build and push images
build-push: build push
-# Install Helm chart
-install:
- helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+# Trigger ArgoCD sync
+sync:
+ @echo "Triggering ArgoCD sync..."
+ @kubectl annotate application {{RELEASE_NAME}} -n cicd argocd.argoproj.io/refresh=normal --overwrite
+ @sleep 2
+ @kubectl get application {{RELEASE_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' && echo ""
-# Upgrade Helm chart
-upgrade:
- helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
-
-# Delete Helm release
-delete:
- helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
-
-# Rebuild images, import, and upgrade deployment
-rebuild: build import upgrade
+# Show ArgoCD application details
+argocd-status:
+ argocd app get {{RELEASE_NAME}} --core
# Check deployment status
status:
- kubectl get pods -n {{NAMESPACE}} | grep tracing-demo
- kubectl get svc -n {{NAMESPACE}} | grep -E '(frontend|middleware|backend)-service'
- kubectl get ingress -n {{NAMESPACE}} tracing-demo-ingress
+ @echo "=== Pods ==="
+ @kubectl get pods -n {{NAMESPACE}} | grep tracing-demo
+ @echo ""
+ @echo "=== Services ==="
+ @kubectl get svc -n {{NAMESPACE}} | grep -E '(frontend|middleware|backend)-service'
+ @echo ""
+ @echo "=== Ingress ==="
+ @kubectl get ingress -n {{NAMESPACE}} tracing-demo-ingress
+ @echo ""
+ @echo "=== ArgoCD Status ==="
+ @kubectl get application {{RELEASE_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' 2>/dev/null && echo "" || echo "Not found"
+
+# Restart all pods
+restart:
+ @echo "Restarting frontend..."
+ @kubectl rollout restart -n {{NAMESPACE}} deployment/tracing-demo-frontend
+ @echo "Restarting middleware..."
+ @kubectl rollout restart -n {{NAMESPACE}} deployment/tracing-demo-middleware
+ @echo "Restarting backend..."
+ @kubectl rollout restart -n {{NAMESPACE}} deployment/tracing-demo-backend
# View logs from all services
logs:
diff --git a/f3s/webdav/Justfile b/f3s/webdav/Justfile
index 3ee3d88..3a4de2f 100644
--- a/f3s/webdav/Justfile
+++ b/f3s/webdav/Justfile
@@ -1,14 +1,38 @@
NAMESPACE := "services"
-RELEASE_NAME := "webdav"
-CHART_PATH := "./helm-chart"
+APP_NAME := "webdav"
-install:
- helm install {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}} --create-namespace
+status:
+ @echo "=== Pods ==="
+ @kubectl get pods -n {{NAMESPACE}} | grep webdav
+ @echo ""
+ @echo "=== Service ==="
+ @kubectl get svc -n {{NAMESPACE}} webdav-service
+ @echo ""
+ @echo "=== Ingress ==="
+ @kubectl get ingress -n {{NAMESPACE}} webdav-ingress
+ @echo ""
+ @echo "=== PVC ==="
+ @kubectl get pvc -n {{NAMESPACE}} webdav-data-pvc
+ @echo ""
+ @echo "=== ArgoCD Status ==="
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' 2>/dev/null && echo ""
-upgrade:
- helm upgrade {{RELEASE_NAME}} {{CHART_PATH}} --namespace {{NAMESPACE}}
+logs lines="100":
+ kubectl logs -n {{NAMESPACE}} -l app=webdav --tail={{lines}} -f
-delete:
- helm uninstall {{RELEASE_NAME}} --namespace {{NAMESPACE}}
+port-forward port="8080":
+ @echo "Forwarding webdav to localhost:{{port}}"
+ kubectl port-forward -n {{NAMESPACE}} svc/webdav-service {{port}}:8080
-deinstall: delete
+sync:
+ @echo "Triggering ArgoCD sync..."
+ @kubectl annotate application {{APP_NAME}} -n cicd argocd.argoproj.io/refresh=normal --overwrite
+ @sleep 2
+ @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' && echo ""
+
+argocd-status:
+ argocd app get {{APP_NAME}} --core
+
+restart:
+ @echo "Restarting webdav..."
+ kubectl rollout restart -n {{NAMESPACE}} deployment/webdav