diff options
| -rw-r--r-- | f3s/argocd-apps/README.md | 179 | ||||
| -rw-r--r-- | f3s/argocd-apps/infra/registry.yaml (renamed from f3s/argocd-apps/registry.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/monitoring/alloy.yaml (renamed from f3s/argocd-apps/alloy.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/monitoring/grafana-ingress.yaml (renamed from f3s/argocd-apps/grafana-ingress.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/monitoring/loki.yaml (renamed from f3s/argocd-apps/loki.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/monitoring/prometheus.yaml (renamed from f3s/argocd-apps/prometheus.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/monitoring/pushgateway.yaml (renamed from f3s/argocd-apps/pushgateway.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/monitoring/tempo.yaml (renamed from f3s/argocd-apps/tempo.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/services/anki-sync-server.yaml (renamed from f3s/argocd-apps/anki-sync-server.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/services/audiobookshelf.yaml (renamed from f3s/argocd-apps/audiobookshelf.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/services/filebrowser.yaml (renamed from f3s/argocd-apps/filebrowser.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/services/immich.yaml (renamed from f3s/argocd-apps/immich.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/services/keybr.yaml (renamed from f3s/argocd-apps/keybr.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/services/kobo-sync-server.yaml (renamed from f3s/argocd-apps/kobo-sync-server.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/services/miniflux.yaml (renamed from f3s/argocd-apps/miniflux.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/services/opodsync.yaml (renamed from f3s/argocd-apps/opodsync.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/services/radicale.yaml (renamed from f3s/argocd-apps/radicale.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/services/syncthing.yaml (renamed from f3s/argocd-apps/syncthing.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/services/tracing-demo.yaml (renamed from f3s/argocd-apps/tracing-demo.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/services/wallabag.yaml (renamed from f3s/argocd-apps/wallabag.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/services/webdav.yaml (renamed from f3s/argocd-apps/webdav.yaml) | 0 | ||||
| -rw-r--r-- | f3s/argocd-apps/test/example-apache-volume-claim.yaml (renamed from f3s/argocd-apps/example-apache-volume-claim.yaml) | 0 |
22 files changed, 179 insertions, 0 deletions
diff --git a/f3s/argocd-apps/README.md b/f3s/argocd-apps/README.md new file mode 100644 index 0000000..e12bacc --- /dev/null +++ b/f3s/argocd-apps/README.md @@ -0,0 +1,179 @@ +# ArgoCD Applications + +This directory contains ArgoCD Application manifests that define all workloads deployed to the f3s cluster. + +## Directory Structure + +Applications are organized by Kubernetes namespace: + +``` +argocd-apps/ +├── monitoring/ # Observability stack (namespace: monitoring) +│ ├── alloy.yaml # Log collection (DaemonSet) +│ ├── grafana-ingress.yaml # Grafana external access +│ ├── loki.yaml # Log aggregation +│ ├── prometheus.yaml # Metrics collection and monitoring (kube-prometheus-stack) +│ ├── pushgateway.yaml # Prometheus Pushgateway for metrics ingestion +│ └── tempo.yaml # Distributed tracing +├── services/ # User-facing applications (namespace: services) +│ ├── anki-sync-server.yaml # Anki flashcard synchronization +│ ├── audiobookshelf.yaml # Audiobook/podcast streaming +│ ├── filebrowser.yaml # Web-based file browser +│ ├── freshrss.yaml # RSS feed reader +│ ├── immich.yaml # Photo management +│ ├── keybr.yaml # Typing practice +│ ├── kobo-sync-server.yaml # KOReader sync server +│ ├── miniflux.yaml # Minimalist RSS reader +│ ├── opodsync.yaml # Podcast synchronization +│ ├── radicale.yaml # CalDAV/CardDAV server +│ ├── syncthing.yaml # File synchronization +│ ├── tracing-demo.yaml # Distributed tracing demo app +│ ├── wallabag.yaml # Read-it-later service +│ └── webdav.yaml # WebDAV server +├── infra/ # Infrastructure services (namespace: infra) +│ └── registry.yaml # Private Docker registry +└── test/ # Test/example applications (namespace: test) + └── example-apache-volume-claim.yaml # Example Apache with PVC + +``` + +## Application Count by Namespace + +- **monitoring**: 6 applications +- **services**: 13 applications +- **infra**: 1 application +- **test**: 1 application + +**Total**: 21 applications + +## Usage + +### Apply all applications + +```bash +# Apply all applications at once +kubectl apply -f argocd-apps/ -R + +# Or apply by namespace +kubectl apply -f argocd-apps/monitoring/ +kubectl apply -f argocd-apps/services/ +kubectl apply -f argocd-apps/infra/ +kubectl apply -f argocd-apps/test/ +``` + +### View application status + +```bash +# List all applications +argocd app list + +# View specific application +argocd app get miniflux + +# View by namespace (using labels) +argocd app list -l "namespace=monitoring" +``` + +### Sync all applications + +```bash +# Sync all applications +argocd app sync -l "argocd.argoproj.io/instance" + +# Sync specific namespace +argocd app sync -l "namespace=monitoring" +``` + +## Application Manifest Structure + +Each Application manifest follows this pattern: + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: <app-name> + namespace: cicd # ArgoCD runs in the cicd namespace + finalizers: + - resources-finalizer.argocd.argoproj.io +spec: + project: default + source: + repoURL: https://codeberg.org/snonux/conf.git + targetRevision: master + path: f3s/<app-name>/helm-chart + destination: + server: https://kubernetes.default.svc + namespace: <target-namespace> + syncPolicy: + automated: + prune: true # Delete resources removed from Git + selfHeal: true # Automatically revert manual changes + syncOptions: + - CreateNamespace=false + retry: + limit: 3 + backoff: + duration: 5s + factor: 2 + maxDuration: 1m +``` + +## Sync Policies + +All applications use automated sync with: + +- **prune: true** - Resources removed from Git are deleted from the cluster +- **selfHeal: true** - Manual changes in the cluster are automatically reverted to match Git + +Exception: **prometheus** has `prune: false` for safety due to its complexity. + +## Complex Applications + +Some applications use advanced ArgoCD features: + +### Multi-Source Applications + +**prometheus.yaml** combines multiple sources: +- Upstream Helm chart from prometheus-community +- Custom manifests from Git (recording rules, dashboards, hooks) + +### Sync Waves and Hooks + +**prometheus.yaml** uses sync waves to control deployment order: +- Wave 0: PersistentVolumes, RBAC +- Wave 1: Secrets, ConfigMaps +- Wave 3: PrometheusRule CRDs (recording rules) +- Wave 4: Dashboard ConfigMaps +- Wave 10: PostSync hook (Grafana restart) + +## Disaster Recovery + +To rebuild the entire cluster from scratch: + +1. Bootstrap k3s cluster +2. Create namespaces: +```bash +kubectl create namespace cicd +kubectl create namespace monitoring +kubectl create namespace services +kubectl create namespace infra +kubectl create namespace test +``` + +3. Install ArgoCD (see `/home/paul/git/conf/f3s/argocd/`) + +4. Apply all Application manifests: +```bash +kubectl apply -f argocd-apps/ -R +``` + +5. ArgoCD automatically deploys all 21 applications + +Total recovery time: ~30 minutes. + +## See Also + +- [ArgoCD Documentation](https://argo-cd.readthedocs.io) +- [f3s Configuration Repository](https://codeberg.org/snonux/conf/src/branch/master/f3s) +- Blog post: f3s: Kubernetes with FreeBSD - Part X: GitOps with ArgoCD diff --git a/f3s/argocd-apps/registry.yaml b/f3s/argocd-apps/infra/registry.yaml index 2948233..2948233 100644 --- a/f3s/argocd-apps/registry.yaml +++ b/f3s/argocd-apps/infra/registry.yaml diff --git a/f3s/argocd-apps/alloy.yaml b/f3s/argocd-apps/monitoring/alloy.yaml index c5574b1..c5574b1 100644 --- a/f3s/argocd-apps/alloy.yaml +++ b/f3s/argocd-apps/monitoring/alloy.yaml diff --git a/f3s/argocd-apps/grafana-ingress.yaml b/f3s/argocd-apps/monitoring/grafana-ingress.yaml index bc99f02..bc99f02 100644 --- a/f3s/argocd-apps/grafana-ingress.yaml +++ b/f3s/argocd-apps/monitoring/grafana-ingress.yaml diff --git a/f3s/argocd-apps/loki.yaml b/f3s/argocd-apps/monitoring/loki.yaml index c7985c2..c7985c2 100644 --- a/f3s/argocd-apps/loki.yaml +++ b/f3s/argocd-apps/monitoring/loki.yaml diff --git a/f3s/argocd-apps/prometheus.yaml b/f3s/argocd-apps/monitoring/prometheus.yaml index 4265168..4265168 100644 --- a/f3s/argocd-apps/prometheus.yaml +++ b/f3s/argocd-apps/monitoring/prometheus.yaml diff --git a/f3s/argocd-apps/pushgateway.yaml b/f3s/argocd-apps/monitoring/pushgateway.yaml index 46d69ca..46d69ca 100644 --- a/f3s/argocd-apps/pushgateway.yaml +++ b/f3s/argocd-apps/monitoring/pushgateway.yaml diff --git a/f3s/argocd-apps/tempo.yaml b/f3s/argocd-apps/monitoring/tempo.yaml index 0fd6bc1..0fd6bc1 100644 --- a/f3s/argocd-apps/tempo.yaml +++ b/f3s/argocd-apps/monitoring/tempo.yaml diff --git a/f3s/argocd-apps/anki-sync-server.yaml b/f3s/argocd-apps/services/anki-sync-server.yaml index 850af3e..850af3e 100644 --- a/f3s/argocd-apps/anki-sync-server.yaml +++ b/f3s/argocd-apps/services/anki-sync-server.yaml diff --git a/f3s/argocd-apps/audiobookshelf.yaml b/f3s/argocd-apps/services/audiobookshelf.yaml index e90e374..e90e374 100644 --- a/f3s/argocd-apps/audiobookshelf.yaml +++ b/f3s/argocd-apps/services/audiobookshelf.yaml diff --git a/f3s/argocd-apps/filebrowser.yaml b/f3s/argocd-apps/services/filebrowser.yaml index 5e32211..5e32211 100644 --- a/f3s/argocd-apps/filebrowser.yaml +++ b/f3s/argocd-apps/services/filebrowser.yaml diff --git a/f3s/argocd-apps/immich.yaml b/f3s/argocd-apps/services/immich.yaml index 6fac25b..6fac25b 100644 --- a/f3s/argocd-apps/immich.yaml +++ b/f3s/argocd-apps/services/immich.yaml diff --git a/f3s/argocd-apps/keybr.yaml b/f3s/argocd-apps/services/keybr.yaml index 411ca6a..411ca6a 100644 --- a/f3s/argocd-apps/keybr.yaml +++ b/f3s/argocd-apps/services/keybr.yaml diff --git a/f3s/argocd-apps/kobo-sync-server.yaml b/f3s/argocd-apps/services/kobo-sync-server.yaml index eaae84c..eaae84c 100644 --- a/f3s/argocd-apps/kobo-sync-server.yaml +++ b/f3s/argocd-apps/services/kobo-sync-server.yaml diff --git a/f3s/argocd-apps/miniflux.yaml b/f3s/argocd-apps/services/miniflux.yaml index 9b3a23a..9b3a23a 100644 --- a/f3s/argocd-apps/miniflux.yaml +++ b/f3s/argocd-apps/services/miniflux.yaml diff --git a/f3s/argocd-apps/opodsync.yaml b/f3s/argocd-apps/services/opodsync.yaml index b4b0e54..b4b0e54 100644 --- a/f3s/argocd-apps/opodsync.yaml +++ b/f3s/argocd-apps/services/opodsync.yaml diff --git a/f3s/argocd-apps/radicale.yaml b/f3s/argocd-apps/services/radicale.yaml index d12d771..d12d771 100644 --- a/f3s/argocd-apps/radicale.yaml +++ b/f3s/argocd-apps/services/radicale.yaml diff --git a/f3s/argocd-apps/syncthing.yaml b/f3s/argocd-apps/services/syncthing.yaml index 6cec5d3..6cec5d3 100644 --- a/f3s/argocd-apps/syncthing.yaml +++ b/f3s/argocd-apps/services/syncthing.yaml diff --git a/f3s/argocd-apps/tracing-demo.yaml b/f3s/argocd-apps/services/tracing-demo.yaml index 30ab9b0..30ab9b0 100644 --- a/f3s/argocd-apps/tracing-demo.yaml +++ b/f3s/argocd-apps/services/tracing-demo.yaml diff --git a/f3s/argocd-apps/wallabag.yaml b/f3s/argocd-apps/services/wallabag.yaml index e723b64..e723b64 100644 --- a/f3s/argocd-apps/wallabag.yaml +++ b/f3s/argocd-apps/services/wallabag.yaml diff --git a/f3s/argocd-apps/webdav.yaml b/f3s/argocd-apps/services/webdav.yaml index 3c3158b..3c3158b 100644 --- a/f3s/argocd-apps/webdav.yaml +++ b/f3s/argocd-apps/services/webdav.yaml diff --git a/f3s/argocd-apps/example-apache-volume-claim.yaml b/f3s/argocd-apps/test/example-apache-volume-claim.yaml index e918e87..e918e87 100644 --- a/f3s/argocd-apps/example-apache-volume-claim.yaml +++ b/f3s/argocd-apps/test/example-apache-volume-claim.yaml |
