From fb5684929b71ec28ca89582482d5f279f7e77d87 Mon Sep 17 00:00:00 2001 From: Erich Blume Date: Tue, 3 Feb 2026 16:02:03 -0800 Subject: [PATCH] Convert wiki-link titles to lowercase slugs - Convert all frontmatter titles to lowercase-hyphenated format - Update all wiki-links to use the new slug format - Update doc-titles task to validate slug format (lowercase, hyphens only) Quartz appears to require titles without spaces for wiki-link resolution. Co-Authored-By: Claude Opus 4.5 --- docs/README.md | 3 +- docs/changelog.d/slug-titles.doc.md | 1 + docs/index.md | 7 +- docs/reference/index.md | 64 +++++++++---------- docs/reference/infrastructure/gilbert.md | 6 +- docs/reference/infrastructure/hosts.md | 12 ++-- docs/reference/infrastructure/indri.md | 18 +++--- docs/reference/infrastructure/routing.md | 34 +++++----- docs/reference/infrastructure/tailscale.md | 8 +-- docs/reference/kubernetes/apps.md | 42 ++++++------ docs/reference/kubernetes/cluster.md | 14 ++-- docs/reference/kubernetes/external-secrets.md | 4 +- docs/reference/operations/backup.md | 8 +-- .../reference/operations/disaster-recovery.md | 10 +-- docs/reference/operations/observability.md | 10 +-- docs/reference/services/1password.md | 6 +- docs/reference/services/alloy.md | 12 ++-- docs/reference/services/argocd.md | 8 +-- docs/reference/services/borgmatic.md | 18 +++--- docs/reference/services/forgejo.md | 6 +- docs/reference/services/grafana.md | 8 +-- docs/reference/services/immich.md | 12 ++-- docs/reference/services/jellyfin.md | 10 +-- docs/reference/services/kiwix.md | 12 ++-- docs/reference/services/loki.md | 12 ++-- docs/reference/services/miniflux.md | 10 +-- docs/reference/services/navidrome.md | 6 +- docs/reference/services/postgresql.md | 16 ++--- docs/reference/services/prometheus.md | 14 ++-- docs/reference/services/teslamate.md | 10 +-- docs/reference/services/transmission.md | 14 ++-- docs/reference/services/zot.md | 8 +-- docs/reference/storage/backups.md | 22 +++---- docs/reference/storage/postgresql-storage.md | 4 +- docs/reference/storage/sifaka.md | 26 ++++---- mise-tasks/doc-titles | 61 +++++++++++++++--- 36 files changed, 288 insertions(+), 248 deletions(-) create mode 100644 docs/changelog.d/slug-titles.doc.md diff --git a/docs/README.md b/docs/README.md index 11ecac7..31f0597 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,5 @@ --- -title: README ---- +title: readme--- # BlumeOps Documentation diff --git a/docs/changelog.d/slug-titles.doc.md b/docs/changelog.d/slug-titles.doc.md new file mode 100644 index 0000000..797b2df --- /dev/null +++ b/docs/changelog.d/slug-titles.doc.md @@ -0,0 +1 @@ +Convert wiki-link titles to lowercase slugs for reliable Quartz resolution diff --git a/docs/index.md b/docs/index.md index b3c9324..b3e5b57 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,11 +1,10 @@ --- -title: BlumeOps Documentation ---- +title: blumeops-documentation--- Welcome to the BlumeOps documentation. -[[README|Documentation Home]] - Temporary home while docs are being restructured (see [Diataxis](https://diataxis.fr/) restructuring plan) +[[readme|Documentation Home]] - Temporary home while docs are being restructured (see [Diataxis](https://diataxis.fr/) restructuring plan) ## Sections -- [[Reference]] - Technical reference cards for services, infrastructure, and operations +- [[reference]] - Technical reference cards for services, infrastructure, and operations diff --git a/docs/reference/index.md b/docs/reference/index.md index cbce315..5e3881c 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -1,5 +1,5 @@ --- -title: Reference +title: reference tags: - reference --- @@ -14,54 +14,54 @@ Individual service reference cards with URLs and configuration details. | Service | Description | Location | |---------|-------------|----------| -| [[Grafana Alloy|Alloy]] | Observability collector (metrics & logs) | indri + k8s | -| [[ArgoCD]] | GitOps continuous delivery | k8s | -| [[Borgmatic]] | Backup system | indri | -| [[1Password]] | Secrets management | cloud + k8s | -| [[Forgejo]] | Git forge & CI/CD | indri | -| [[Grafana]] | Dashboards & visualization | k8s | -| [[Immich]] | Photo management | k8s | -| [[Jellyfin]] | Media server | indri | -| [[Kiwix]] | Offline Wikipedia & ZIM archives | k8s | -| [[Loki]] | Log aggregation | k8s | -| [[Miniflux]] | RSS feed reader | k8s | -| [[Navidrome]] | Music streaming | k8s | -| [[PostgreSQL]] | Database cluster | k8s | -| [[Prometheus]] | Metrics collection | k8s | -| [[TeslaMate]] | Tesla data logger | k8s | -| [[Transmission]] | BitTorrent daemon | k8s | -| [[Zot]] | Container registry | indri | +| [[grafana-alloy|Alloy]] | Observability collector (metrics & logs) | indri + k8s | +| [[argocd]] | GitOps continuous delivery | k8s | +| [[borgmatic]] | Backup system | indri | +| [[1password]] | Secrets management | cloud + k8s | +| [[forgejo]] | Git forge & CI/CD | indri | +| [[grafana]] | Dashboards & visualization | k8s | +| [[immich]] | Photo management | k8s | +| [[jellyfin]] | Media server | indri | +| [[kiwix]] | Offline Wikipedia & ZIM archives | k8s | +| [[loki]] | Log aggregation | k8s | +| [[miniflux]] | RSS feed reader | k8s | +| [[navidrome]] | Music streaming | k8s | +| [[postgresql]] | Database cluster | k8s | +| [[prometheus]] | Metrics collection | k8s | +| [[teslamate]] | Tesla data logger | k8s | +| [[transmission]] | BitTorrent daemon | k8s | +| [[zot]] | Container registry | indri | ## Infrastructure Host inventory and network configuration. -- [[Host Inventory|Hosts]] - Device inventory -- [[Indri]] - Primary server -- [[Gilbert]] - Development workstation -- [[Tailscale]] - ACLs, groups, tags -- [[Service Routing|Routing]] - DNS domains, port mappings +- [[host-inventory|Hosts]] - Device inventory +- [[indri]] - Primary server +- [[gilbert]] - Development workstation +- [[tailscale]] - ACLs, groups, tags +- [[service-routing|Routing]] - DNS domains, port mappings ## Kubernetes Cluster configuration and application registry. -- [[Kubernetes Cluster|Cluster]] - Minikube specs, storage, networking -- [[ArgoCD Applications|Apps]] - ArgoCD application registry -- [[External Secrets]] - Secrets management +- [[kubernetes-cluster|Cluster]] - Minikube specs, storage, networking +- [[argocd-applications|Apps]] - ArgoCD application registry +- [[external-secrets]] - Secrets management ## Storage Network storage and backup configuration. -- [[Sifaka NAS|Sifaka]] - Synology NAS configuration -- [[PostgreSQL Storage]] - Database cluster -- [[Backup Policy|Backups]] - Backup policy and schedule +- [[sifaka-nas|Sifaka]] - Synology NAS configuration +- [[postgresql-storage]] - Database cluster +- [[backup-policy|Backups]] - Backup policy and schedule ## Operations Operational concerns and their components. -- [[Observability]] - Metrics, logs, dashboards -- [[Backup]] - Data protection -- [[Disaster Recovery]] - Recovery procedures (TBD) +- [[observability]] - Metrics, logs, dashboards +- [[backup]] - Data protection +- [[disaster-recovery]] - Recovery procedures (TBD) diff --git a/docs/reference/infrastructure/gilbert.md b/docs/reference/infrastructure/gilbert.md index 7f08799..c2d19d7 100644 --- a/docs/reference/infrastructure/gilbert.md +++ b/docs/reference/infrastructure/gilbert.md @@ -1,5 +1,5 @@ --- -title: Gilbert +title: gilbert tags: - infrastructure - host @@ -23,5 +23,5 @@ Managed via `Brewfile` and `mise.toml` in the blumeops repo. ## Related -- [[Indri]] - Server accessed from gilbert -- [[Kubernetes Cluster|Cluster]] - Remote k8s access +- [[indri]] - Server accessed from gilbert +- [[kubernetes-cluster|Cluster]] - Remote k8s access diff --git a/docs/reference/infrastructure/hosts.md b/docs/reference/infrastructure/hosts.md index bc11b36..e5629d4 100644 --- a/docs/reference/infrastructure/hosts.md +++ b/docs/reference/infrastructure/hosts.md @@ -1,5 +1,5 @@ --- -title: Host Inventory +title: host-inventory tags: - infrastructure --- @@ -12,14 +12,14 @@ All devices connected via [Tailscale](https://login.tailscale.com/) tailnet `tai | Host | Description | Card | |------|-------------|------| -| **Indri** | Mac Mini M1, 2020 - Primary server | [[Indri|Details]] | -| **Gilbert** | MacBook Air M4, 2025 - Workstation | [[Gilbert|Details]] | -| **[[Sifaka NAS|Sifaka]]** | Synology NAS - Storage & backups | [[Sifaka NAS|Details]] | +| **Indri** | Mac Mini M1, 2020 - Primary server | [[indri|Details]] | +| **Gilbert** | MacBook Air M4, 2025 - Workstation | [[gilbert|Details]] | +| **[[sifaka-nas|Sifaka]]** | Synology NAS - Storage & backups | [[sifaka-nas|Details]] | | **Mouse** | MacBook Air M2 - Allison's laptop | - | | **UniFi** | UniFi Express 7 - Home WiFi | - | | **Dwarf** | iPad Air - Employer-provided, off tailnet | - | ## Related -- [[Tailscale]] - Network configuration -- [[Service Routing|Routing]] - Service URLs +- [[tailscale]] - Network configuration +- [[service-routing|Routing]] - Service URLs diff --git a/docs/reference/infrastructure/indri.md b/docs/reference/infrastructure/indri.md index b93277e..dec7319 100644 --- a/docs/reference/infrastructure/indri.md +++ b/docs/reference/infrastructure/indri.md @@ -1,5 +1,5 @@ --- -title: Indri +title: indri tags: - infrastructure - host @@ -22,17 +22,17 @@ Primary BlumeOps server. Mac Mini M1 (2020). ## Services Hosted **Native (via Ansible):** -- [[Forgejo]] - Git forge -- [[Zot]] - Container registry -- [[Jellyfin]] - Media server -- [[Borgmatic]] - Backup system -- [[Grafana Alloy|Alloy]] - Metrics/logs collector +- [[forgejo]] - Git forge +- [[zot]] - Container registry +- [[jellyfin]] - Media server +- [[borgmatic]] - Backup system +- [[grafana-alloy|Alloy]] - Metrics/logs collector - Caddy - Reverse proxy for `*.ops.eblu.me` **Kubernetes (via minikube):** -- [[ArgoCD Applications|All k8s applications]] +- [[argocd-applications|All k8s applications]] ## Related -- [[Service Routing|Routing]] - Port mappings -- [[Kubernetes Cluster|Cluster]] - Minikube details +- [[service-routing|Routing]] - Port mappings +- [[kubernetes-cluster|Cluster]] - Minikube details diff --git a/docs/reference/infrastructure/routing.md b/docs/reference/infrastructure/routing.md index 476b9b3..73df488 100644 --- a/docs/reference/infrastructure/routing.md +++ b/docs/reference/infrastructure/routing.md @@ -1,5 +1,5 @@ --- -title: Service Routing +title: service-routing tags: - infrastructure - network @@ -25,20 +25,20 @@ DNS points to indri's Tailscale IP (100.98.163.89). TLS via Let's Encrypt (ACME | Service | URL | Description | |---------|-----|-------------| | Homepage | https://go.ops.eblu.me | Service dashboard | -| [[Forgejo]] | https://forge.ops.eblu.me | Git hosting (SSH: 2222) | -| [[Zot]] | https://registry.ops.eblu.me | Container registry | -| [[Grafana]] | https://grafana.ops.eblu.me | Dashboards | -| [[ArgoCD]] | https://argocd.ops.eblu.me | GitOps CD | -| [[Prometheus]] | https://prometheus.ops.eblu.me | Metrics | -| [[Loki]] | https://loki.ops.eblu.me | Logs | -| [[Miniflux]] | https://feed.ops.eblu.me | RSS reader | -| [[Kiwix]] | https://kiwix.ops.eblu.me | Offline Wikipedia | -| [[Transmission]] | https://torrent.ops.eblu.me | BitTorrent | -| [[TeslaMate]] | https://tesla.ops.eblu.me | Tesla logger | -| [[Navidrome]] | https://dj.ops.eblu.me | Music streaming | -| [[Jellyfin]] | https://jellyfin.ops.eblu.me | Media server | -| [[PostgreSQL]] | pg.ops.eblu.me:5432 | Database | -| [[Sifaka NAS|Sifaka]] | https://nas.ops.eblu.me | NAS dashboard | +| [[forgejo]] | https://forge.ops.eblu.me | Git hosting (SSH: 2222) | +| [[zot]] | https://registry.ops.eblu.me | Container registry | +| [[grafana]] | https://grafana.ops.eblu.me | Dashboards | +| [[argocd]] | https://argocd.ops.eblu.me | GitOps CD | +| [[prometheus]] | https://prometheus.ops.eblu.me | Metrics | +| [[loki]] | https://loki.ops.eblu.me | Logs | +| [[miniflux]] | https://feed.ops.eblu.me | RSS reader | +| [[kiwix]] | https://kiwix.ops.eblu.me | Offline Wikipedia | +| [[transmission]] | https://torrent.ops.eblu.me | BitTorrent | +| [[teslamate]] | https://tesla.ops.eblu.me | Tesla logger | +| [[navidrome]] | https://dj.ops.eblu.me | Music streaming | +| [[jellyfin]] | https://jellyfin.ops.eblu.me | Media server | +| [[postgresql]] | pg.ops.eblu.me:5432 | Database | +| [[sifaka-nas|Sifaka]] | https://nas.ops.eblu.me | NAS dashboard | ## Tailscale-Only Services @@ -61,5 +61,5 @@ DNS points to indri's Tailscale IP (100.98.163.89). TLS via Let's Encrypt (ACME ## Related -- [[Tailscale]] - ACL configuration -- [[Indri]] - Where services run +- [[tailscale]] - ACL configuration +- [[indri]] - Where services run diff --git a/docs/reference/infrastructure/tailscale.md b/docs/reference/infrastructure/tailscale.md index 9e89e71..3f86606 100644 --- a/docs/reference/infrastructure/tailscale.md +++ b/docs/reference/infrastructure/tailscale.md @@ -1,5 +1,5 @@ --- -title: Tailscale +title: tailscale tags: - infrastructure - network @@ -17,7 +17,7 @@ ACLs managed via Pulumi in `pulumi/policy.hujson`. | Group | Members | Purpose | |-------|---------|---------| -| `group:allisonflix` | admin, member | [[Jellyfin]] media access | +| `group:allisonflix` | admin, member | [[jellyfin]] media access | ## Device Tags @@ -58,5 +58,5 @@ Pulumi uses OAuth client from 1Password (blumeops vault): ## Related -- [[Service Routing|Routing]] - Service URLs -- [[Host Inventory|Hosts]] - Device inventory +- [[service-routing|Routing]] - Service URLs +- [[host-inventory|Hosts]] - Device inventory diff --git a/docs/reference/kubernetes/apps.md b/docs/reference/kubernetes/apps.md index 029601f..04d624d 100644 --- a/docs/reference/kubernetes/apps.md +++ b/docs/reference/kubernetes/apps.md @@ -1,5 +1,5 @@ --- -title: ArgoCD Applications +title: argocd-applications tags: - kubernetes - argocd @@ -7,33 +7,33 @@ tags: # ArgoCD Applications -Registry of all applications deployed via [[ArgoCD]]. +Registry of all applications deployed via [[argocd]]. ## Application Registry | App | Namespace | Path/Source | Service | |-----|-----------|-------------|---------| | `apps` | argocd | `argocd/apps/` | App-of-apps root | -| `argocd` | argocd | `argocd/manifests/argocd/` | [[ArgoCD]] | +| `argocd` | argocd | `argocd/manifests/argocd/` | [[argocd]] | | `tailscale-operator` | tailscale | `argocd/manifests/tailscale-operator/` | Tailscale k8s operator | -| `1password-connect` | 1password | `argocd/manifests/1password-connect/` | [[1Password]] | -| `external-secrets` | external-secrets | Helm chart | [[1Password]] | -| `external-secrets-config` | external-secrets | `argocd/manifests/external-secrets-config/` | [[1Password]] | +| `1password-connect` | 1password | `argocd/manifests/1password-connect/` | [[1password]] | +| `external-secrets` | external-secrets | Helm chart | [[1password]] | +| `external-secrets-config` | external-secrets | `argocd/manifests/external-secrets-config/` | [[1password]] | | `cloudnative-pg` | cnpg-system | Helm chart (forge mirror) | PostgreSQL operator | -| `blumeops-pg` | databases | `argocd/manifests/databases/` | [[PostgreSQL]] | -| `prometheus` | monitoring | `argocd/manifests/prometheus/` | [[Prometheus]] | -| `loki` | monitoring | `argocd/manifests/loki/` | [[Loki]] | -| `grafana` | monitoring | Helm chart (forge mirror) | [[Grafana]] | -| `grafana-config` | monitoring | `argocd/manifests/grafana-config/` | [[Grafana]] | -| `immich` | immich | Helm chart | [[Immich]] | -| `alloy-k8s` | alloy | `argocd/manifests/alloy-k8s/` | [[Grafana Alloy|Alloy]] | +| `blumeops-pg` | databases | `argocd/manifests/databases/` | [[postgresql]] | +| `prometheus` | monitoring | `argocd/manifests/prometheus/` | [[prometheus]] | +| `loki` | monitoring | `argocd/manifests/loki/` | [[loki]] | +| `grafana` | monitoring | Helm chart (forge mirror) | [[grafana]] | +| `grafana-config` | monitoring | `argocd/manifests/grafana-config/` | [[grafana]] | +| `immich` | immich | Helm chart | [[immich]] | +| `alloy-k8s` | alloy | `argocd/manifests/alloy-k8s/` | [[grafana-alloy|Alloy]] | | `kube-state-metrics` | monitoring | `argocd/manifests/kube-state-metrics/` | K8s metrics | -| `miniflux` | miniflux | `argocd/manifests/miniflux/` | [[Miniflux]] | -| `kiwix` | kiwix | `argocd/manifests/kiwix/` | [[Kiwix]] | -| `torrent` | torrent | `argocd/manifests/torrent/` | [[Transmission]] | -| `navidrome` | navidrome | `argocd/manifests/navidrome/` | [[Navidrome]] | -| `teslamate` | teslamate | `argocd/manifests/teslamate/` | [[TeslaMate]] | -| `forgejo-runner` | forgejo-runner | `argocd/manifests/forgejo-runner/` | [[Forgejo]] CI | +| `miniflux` | miniflux | `argocd/manifests/miniflux/` | [[miniflux]] | +| `kiwix` | kiwix | `argocd/manifests/kiwix/` | [[kiwix]] | +| `torrent` | torrent | `argocd/manifests/torrent/` | [[transmission]] | +| `navidrome` | navidrome | `argocd/manifests/navidrome/` | [[navidrome]] | +| `teslamate` | teslamate | `argocd/manifests/teslamate/` | [[teslamate]] | +| `forgejo-runner` | forgejo-runner | `argocd/manifests/forgejo-runner/` | [[forgejo]] CI | ## Sync Policies @@ -44,5 +44,5 @@ Registry of all applications deployed via [[ArgoCD]]. ## Related -- [[ArgoCD]] - GitOps platform details -- [[Kubernetes Cluster|Cluster]] - Kubernetes infrastructure +- [[argocd]] - GitOps platform details +- [[kubernetes-cluster|Cluster]] - Kubernetes infrastructure diff --git a/docs/reference/kubernetes/cluster.md b/docs/reference/kubernetes/cluster.md index 31fcc35..7625926 100644 --- a/docs/reference/kubernetes/cluster.md +++ b/docs/reference/kubernetes/cluster.md @@ -1,12 +1,12 @@ --- -title: Kubernetes Cluster +title: kubernetes-cluster tags: - kubernetes --- # Kubernetes Cluster -Single-node Minikube cluster running on [[Indri]]. +Single-node Minikube cluster running on [[indri]]. ## Cluster Specifications @@ -24,16 +24,16 @@ Single-node Minikube cluster running on [[Indri]]. ## Volume Mounting -Pods mount NFS directly from [[Sifaka NAS|Sifaka]]. Docker NATs outbound traffic through indri's LAN IP (192.168.1.50), allowing access to Sifaka's NFS exports. +Pods mount NFS directly from [[sifaka-nas|Sifaka]]. Docker NATs outbound traffic through indri's LAN IP (192.168.1.50), allowing access to Sifaka's NFS exports. ## Registry Mirror -Containerd uses [[Zot]] as a pull-through cache at `host.minikube.internal:5050`. +Containerd uses [[zot]] as a pull-through cache at `host.minikube.internal:5050`. Mirrors configured: `registry.ops.eblu.me`, `docker.io`, `ghcr.io`, `quay.io` ## Related -- [[ArgoCD Applications|Apps]] - ArgoCD applications -- [[ArgoCD]] - GitOps deployment -- [[Zot]] - Registry mirror +- [[argocd-applications|Apps]] - ArgoCD applications +- [[argocd]] - GitOps deployment +- [[zot]] - Registry mirror diff --git a/docs/reference/kubernetes/external-secrets.md b/docs/reference/kubernetes/external-secrets.md index 2b814e8..20ba9ce 100644 --- a/docs/reference/kubernetes/external-secrets.md +++ b/docs/reference/kubernetes/external-secrets.md @@ -1,5 +1,5 @@ --- -title: External Secrets +title: external-secrets tags: - kubernetes - secrets @@ -7,4 +7,4 @@ tags: # External Secrets -See [[1Password]] in Services. +See [[1password]] in Services. diff --git a/docs/reference/operations/backup.md b/docs/reference/operations/backup.md index fa0c627..0285895 100644 --- a/docs/reference/operations/backup.md +++ b/docs/reference/operations/backup.md @@ -1,5 +1,5 @@ --- -title: Backup +title: backup tags: - operations --- @@ -10,6 +10,6 @@ Daily automated backups of BlumeOps data. ## Components -- [[Borgmatic]] - Backup orchestration -- [[Sifaka NAS|Sifaka]] - Backup target (NAS) -- [[Backup Policy]] - What gets backed up and retention +- [[borgmatic]] - Backup orchestration +- [[sifaka-nas|Sifaka]] - Backup target (NAS) +- [[backup-policy]] - What gets backed up and retention diff --git a/docs/reference/operations/disaster-recovery.md b/docs/reference/operations/disaster-recovery.md index e32be67..7354168 100644 --- a/docs/reference/operations/disaster-recovery.md +++ b/docs/reference/operations/disaster-recovery.md @@ -1,5 +1,5 @@ --- -title: Disaster Recovery +title: disaster-recovery tags: - operations --- @@ -8,12 +8,12 @@ tags: TBD. Current state: -- [[Borgmatic]] provides daily backups to [[Sifaka NAS|Sifaka]] +- [[borgmatic]] provides daily backups to [[sifaka-nas|Sifaka]] - Infrastructure can be rebootstrapped using the blumeops repo - Detailed DR procedures not yet documented ## Components -- [[Borgmatic]] - Backup restoration -- [[1Password]] - Credential recovery -- [[Forgejo]] - Source of truth for infrastructure code +- [[borgmatic]] - Backup restoration +- [[1password]] - Credential recovery +- [[forgejo]] - Source of truth for infrastructure code diff --git a/docs/reference/operations/observability.md b/docs/reference/operations/observability.md index 1e79c07..78fc47f 100644 --- a/docs/reference/operations/observability.md +++ b/docs/reference/operations/observability.md @@ -1,5 +1,5 @@ --- -title: Observability +title: observability tags: - operations --- @@ -10,7 +10,7 @@ Metrics, logs, and dashboards for BlumeOps infrastructure. ## Components -- [[Prometheus]] - Metrics storage and querying -- [[Loki]] - Log aggregation -- [[Grafana Alloy|Alloy]] - Metrics and log collection -- [[Grafana]] - Dashboards and visualization +- [[prometheus]] - Metrics storage and querying +- [[loki]] - Log aggregation +- [[grafana-alloy|Alloy]] - Metrics and log collection +- [[grafana]] - Dashboards and visualization diff --git a/docs/reference/services/1password.md b/docs/reference/services/1password.md index 2db7f59..3280c0f 100644 --- a/docs/reference/services/1password.md +++ b/docs/reference/services/1password.md @@ -1,5 +1,5 @@ --- -title: 1Password +title: 1password tags: - service - secrets @@ -36,5 +36,5 @@ Services reference 1Password items via `ExternalSecret` manifests. ## Related -- [[ArgoCD]] - Uses secrets for git access -- [[PostgreSQL]] - Database credentials +- [[argocd]] - Uses secrets for git access +- [[postgresql]] - Database credentials diff --git a/docs/reference/services/alloy.md b/docs/reference/services/alloy.md index cad2669..2a46f20 100644 --- a/docs/reference/services/alloy.md +++ b/docs/reference/services/alloy.md @@ -1,5 +1,5 @@ --- -title: Grafana Alloy +title: grafana-alloy tags: - service - observability @@ -27,7 +27,7 @@ Unified observability collector for metrics and logs with two deployments: - System metrics via `prometheus.exporter.unix` - Textfile collector: `minikube.prom`, `borgmatic.prom`, `zot.prom`, `jellyfin.prom` - Zot registry metrics from `http://localhost:5050/metrics` -- Pushed to [[Prometheus]] via remote_write +- Pushed to [[prometheus]] via remote_write ### From Kubernetes - All pod logs via `loki.source.kubernetes` @@ -39,7 +39,7 @@ Unified observability collector for metrics and logs with two deployments: **mcquack LaunchAgents:** alloy, borgmatic, zot, jellyfin -Logs pushed to [[Loki]] at `https://loki.tail8d86e.ts.net/loki/api/v1/push`. +Logs pushed to [[loki]] at `https://loki.tail8d86e.ts.net/loki/api/v1/push`. ## Why Built from Source @@ -49,6 +49,6 @@ The Homebrew bottle uses `CGO_ENABLED=0`, which breaks Tailscale MagicDNS. Build ## Related -- [[Prometheus]] - Metrics storage -- [[Loki]] - Log storage -- [[Grafana]] - Visualization +- [[prometheus]] - Metrics storage +- [[loki]] - Log storage +- [[grafana]] - Visualization diff --git a/docs/reference/services/argocd.md b/docs/reference/services/argocd.md index b944d7f..f8df2fd 100644 --- a/docs/reference/services/argocd.md +++ b/docs/reference/services/argocd.md @@ -1,5 +1,5 @@ --- -title: ArgoCD +title: argocd tags: - service - gitops @@ -7,7 +7,7 @@ tags: # ArgoCD -GitOps continuous delivery platform for the [[Kubernetes Cluster|Kubernetes cluster]]. +GitOps continuous delivery platform for the [[kubernetes-cluster|Kubernetes cluster]]. ## Quick Reference @@ -33,5 +33,5 @@ GitOps continuous delivery platform for the [[Kubernetes Cluster|Kubernetes clus ## Related -- [[ArgoCD Applications|Apps]] - Full application registry -- [[Forgejo]] - Git source +- [[argocd-applications|Apps]] - Full application registry +- [[forgejo]] - Git source diff --git a/docs/reference/services/borgmatic.md b/docs/reference/services/borgmatic.md index f81b5de..29edd2e 100644 --- a/docs/reference/services/borgmatic.md +++ b/docs/reference/services/borgmatic.md @@ -1,5 +1,5 @@ --- -title: Borgmatic +title: borgmatic tags: - service - backup @@ -16,7 +16,7 @@ Daily backup system using Borg backup, running on indri. | **Install** | mise (pipx) | | **Config** | `~/.config/borgmatic/config.yaml` | | **Schedule** | Daily at 2:00 AM | -| **Repository** | `/Volumes/backups/borg/` on [[Sifaka NAS|Sifaka]] | +| **Repository** | `/Volumes/backups/borg/` on [[sifaka-nas|Sifaka]] | ## What Gets Backed Up @@ -28,8 +28,8 @@ Daily backup system using Borg backup, running on indri. - `~/Pictures` - Photos **Databases:** -- `miniflux` on [[PostgreSQL]] -- `teslamate` on [[PostgreSQL]] +- `miniflux` on [[postgresql]] +- `teslamate` on [[postgresql]] **Not backed up (by design):** - ZIM archives (re-downloadable) @@ -46,15 +46,15 @@ Daily backup system using Borg backup, running on indri. ## Monitoring -Metrics exposed via textfile collector to [[Prometheus]]: +Metrics exposed via textfile collector to [[prometheus]]: - `borgmatic_up` - Repository accessibility - `borgmatic_last_archive_timestamp` - Last backup time - `borgmatic_repo_deduplicated_size_bytes` - Disk usage -Dashboard: "Borgmatic Backups" in [[Grafana]] +Dashboard: "Borgmatic Backups" in [[grafana]] ## Related -- [[Backup Policy|Backups]] - Full backup policy -- [[Sifaka NAS|Sifaka]] - Backup target -- [[PostgreSQL]] - Database backups +- [[backup-policy|Backups]] - Full backup policy +- [[sifaka-nas|Sifaka]] - Backup target +- [[postgresql]] - Database backups diff --git a/docs/reference/services/forgejo.md b/docs/reference/services/forgejo.md index ff5a0d0..5bef9e6 100644 --- a/docs/reference/services/forgejo.md +++ b/docs/reference/services/forgejo.md @@ -1,5 +1,5 @@ --- -title: Forgejo +title: forgejo tags: - service - git @@ -44,5 +44,5 @@ Managed via 1Password: `lfs-jwt-secret`, `internal-token`, `oauth2-jwt-secret`, ## Related -- [[ArgoCD]] - Uses Forgejo as git source -- [[Zot]] - Container registry for built images +- [[argocd]] - Uses Forgejo as git source +- [[zot]] - Container registry for built images diff --git a/docs/reference/services/grafana.md b/docs/reference/services/grafana.md index 01293b6..f4995f7 100644 --- a/docs/reference/services/grafana.md +++ b/docs/reference/services/grafana.md @@ -1,5 +1,5 @@ --- -title: Grafana +title: grafana tags: - service - observability @@ -45,6 +45,6 @@ Optional annotation: `grafana_folder: "FolderName"` ## Related -- [[Prometheus]] - Metrics datasource -- [[Loki]] - Logs datasource -- [[Grafana Alloy|Alloy]] - Data collector +- [[prometheus]] - Metrics datasource +- [[loki]] - Logs datasource +- [[grafana-alloy|Alloy]] - Data collector diff --git a/docs/reference/services/immich.md b/docs/reference/services/immich.md index df76d37..5d74bf0 100644 --- a/docs/reference/services/immich.md +++ b/docs/reference/services/immich.md @@ -1,5 +1,5 @@ --- -title: Immich +title: immich tags: - service - media @@ -16,11 +16,11 @@ Self-hosted photo and video management. | **URL** | https://photos.ops.eblu.me | | **Namespace** | `immich` | | **Deployment** | Helm chart (k8s) | -| **Database** | [[PostgreSQL]] (CNPG) | -| **Storage** | [[Sifaka NAS|Sifaka]] photos volume | +| **Database** | [[postgresql]] (CNPG) | +| **Storage** | [[sifaka-nas|Sifaka]] photos volume | ## Related -- [[PostgreSQL]] - Database backend -- [[Sifaka NAS|Sifaka]] - Photo storage -- [[Jellyfin]] - Video streaming (separate service) +- [[postgresql]] - Database backend +- [[sifaka-nas|Sifaka]] - Photo storage +- [[jellyfin]] - Video streaming (separate service) diff --git a/docs/reference/services/jellyfin.md b/docs/reference/services/jellyfin.md index 57fc226..29f2e17 100644 --- a/docs/reference/services/jellyfin.md +++ b/docs/reference/services/jellyfin.md @@ -1,5 +1,5 @@ --- -title: Jellyfin +title: jellyfin tags: - service - media @@ -42,10 +42,10 @@ Dashboard > Playback: ## Observability - Metrics: `jellyfin_metrics` ansible role -- Logs: Forwarded via [[Grafana Alloy|Alloy]] -- Dashboard: "Jellyfin Media Server" in [[Grafana]] +- Logs: Forwarded via [[grafana-alloy|Alloy]] +- Dashboard: "Jellyfin Media Server" in [[grafana]] ## Related -- [[Navidrome]] - Music streaming -- [[Sifaka NAS|Sifaka]] - Media storage +- [[navidrome]] - Music streaming +- [[sifaka-nas|Sifaka]] - Media storage diff --git a/docs/reference/services/kiwix.md b/docs/reference/services/kiwix.md index 38876b4..7ed0832 100644 --- a/docs/reference/services/kiwix.md +++ b/docs/reference/services/kiwix.md @@ -1,5 +1,5 @@ --- -title: Kiwix +title: kiwix tags: - service - knowledge @@ -17,14 +17,14 @@ Offline Wikipedia and ZIM archive server. | **Tailscale URL** | https://kiwix.tail8d86e.ts.net | | **Namespace** | `kiwix` | | **Image** | `ghcr.io/kiwix/kiwix-serve:3.8.1` | -| **Storage** | NFS from [[Sifaka NAS|Sifaka]] (`/volume1/torrents`) | +| **Storage** | NFS from [[sifaka-nas|Sifaka]] (`/volume1/torrents`) | ## Architecture | Component | Purpose | |-----------|---------| | kiwix-serve | Serves ZIM files on port 80 | -| torrent-sync | Sidecar syncing ZIM torrents to [[Transmission]] | +| torrent-sync | Sidecar syncing ZIM torrents to [[transmission]] | | zim-watcher | CronJob (hourly) to restart on new ZIMs | ## Configured Archives @@ -43,10 +43,10 @@ Full list: `argocd/manifests/kiwix/configmap-zim-torrents.yaml` 1. Edit `configmap-zim-torrents.yaml` 2. Add torrent URL from https://download.kiwix.org/zim/ 3. Sync: `argocd app sync kiwix` -4. Torrent-sync adds to [[Transmission]] +4. Torrent-sync adds to [[transmission]] 5. zim-watcher restarts kiwix when download completes ## Related -- [[Transmission]] - Downloads ZIM files -- [[Sifaka NAS|Sifaka]] - ZIM storage +- [[transmission]] - Downloads ZIM files +- [[sifaka-nas|Sifaka]] - ZIM storage diff --git a/docs/reference/services/loki.md b/docs/reference/services/loki.md index 90f3b1c..31c444d 100644 --- a/docs/reference/services/loki.md +++ b/docs/reference/services/loki.md @@ -1,5 +1,5 @@ --- -title: Loki +title: loki tags: - service - observability @@ -24,8 +24,8 @@ Log aggregation system for BlumeOps infrastructure. - Single-node deployment with filesystem storage - TSDB index with 24h period -- Logs collected by [[Grafana Alloy|Alloy]] and pushed via Loki API -- Queried via [[Grafana]] +- Logs collected by [[grafana-alloy|Alloy]] and pushed via Loki API +- Queried via [[grafana]] ## Log Sources @@ -46,6 +46,6 @@ Log aggregation system for BlumeOps infrastructure. ## Related -- [[Grafana Alloy|Alloy]] - Log collector -- [[Grafana]] - Log visualization -- [[Prometheus]] - Metrics counterpart +- [[grafana-alloy|Alloy]] - Log collector +- [[grafana]] - Log visualization +- [[prometheus]] - Metrics counterpart diff --git a/docs/reference/services/miniflux.md b/docs/reference/services/miniflux.md index b99a8b0..6981135 100644 --- a/docs/reference/services/miniflux.md +++ b/docs/reference/services/miniflux.md @@ -1,5 +1,5 @@ --- -title: Miniflux +title: miniflux tags: - service - rss @@ -17,7 +17,7 @@ Minimalist RSS/Atom feed reader. | **Tailscale URL** | https://feed.tail8d86e.ts.net | | **Namespace** | `miniflux` | | **Image** | `ghcr.io/miniflux/miniflux:latest` | -| **Database** | [[PostgreSQL]] | +| **Database** | [[postgresql]] | ## Features @@ -33,9 +33,9 @@ Uses CloudNativePG cluster at `pg.ops.eblu.me`. Database user password stored in ## Backup -Feed subscriptions and read state backed up via [[Borgmatic]] PostgreSQL hook. +Feed subscriptions and read state backed up via [[borgmatic]] PostgreSQL hook. ## Related -- [[PostgreSQL]] - Database backend -- [[Borgmatic]] - Data backup +- [[postgresql]] - Database backend +- [[borgmatic]] - Data backup diff --git a/docs/reference/services/navidrome.md b/docs/reference/services/navidrome.md index e6c08db..b95f909 100644 --- a/docs/reference/services/navidrome.md +++ b/docs/reference/services/navidrome.md @@ -1,5 +1,5 @@ --- -title: Navidrome +title: navidrome tags: - service - media @@ -38,5 +38,5 @@ The `/data` directory contains SQLite database, configuration, and cache. ## Related -- [[Jellyfin]] - Video streaming -- [[Sifaka NAS|Sifaka]] - Music storage +- [[jellyfin]] - Video streaming +- [[sifaka-nas|Sifaka]] - Music storage diff --git a/docs/reference/services/postgresql.md b/docs/reference/services/postgresql.md index e71bf3e..27f8b3d 100644 --- a/docs/reference/services/postgresql.md +++ b/docs/reference/services/postgresql.md @@ -1,5 +1,5 @@ --- -title: PostgreSQL +title: postgresql tags: - service - database @@ -23,8 +23,8 @@ Database cluster via CloudNativePG operator. | Database | Owner | Purpose | |----------|-------|---------| -| miniflux | miniflux | [[Miniflux]] feed data | -| teslamate | teslamate | [[TeslaMate]] vehicle data | +| miniflux | miniflux | [[miniflux]] feed data | +| teslamate | teslamate | [[teslamate]] vehicle data | ## Users @@ -34,11 +34,11 @@ Database cluster via CloudNativePG operator. | miniflux | app owner | Owns miniflux database | | teslamate | superuser | TeslaMate (needs extensions) | | eblume | superuser | Admin access | -| borgmatic | pg_read_all_data | [[Borgmatic|Backup]] access | +| borgmatic | pg_read_all_data | [[borgmatic|Backup]] access | ## Backup -Backed up via [[Borgmatic]] `postgresql_databases` hook. Streams `pg_dump` directly to Borg (no intermediate files, no downtime). See [[Backup]] for overall backup policy. +Backed up via [[borgmatic]] `postgresql_databases` hook. Streams `pg_dump` directly to Borg (no intermediate files, no downtime). See [[backup]] for overall backup policy. ## Credentials @@ -54,6 +54,6 @@ Backed up via [[Borgmatic]] `postgresql_databases` hook. Streams `pg_dump` direc ## Related -- [[Miniflux]] - Feed reader database -- [[TeslaMate]] - Vehicle data database -- [[Borgmatic]] - Database backup +- [[miniflux]] - Feed reader database +- [[teslamate]] - Vehicle data database +- [[borgmatic]] - Database backup diff --git a/docs/reference/services/prometheus.md b/docs/reference/services/prometheus.md index 0966c2c..6a98048 100644 --- a/docs/reference/services/prometheus.md +++ b/docs/reference/services/prometheus.md @@ -1,5 +1,5 @@ --- -title: Prometheus +title: prometheus tags: - service - observability @@ -23,19 +23,19 @@ Metrics storage and querying for BlumeOps infrastructure. ## Data Sources ### Remote Write (from Alloy) -- Indri system metrics via [[Grafana Alloy|Alloy]] remote_write +- Indri system metrics via [[grafana-alloy|Alloy]] remote_write - Textfile metrics: minikube, borgmatic, zot, jellyfin ### Scrape Targets | Target | Metrics | |--------|---------| -| `sifaka:9100` | [[Sifaka NAS|Sifaka]] NAS (node_exporter) | -| `cnpg-metrics.tail8d86e.ts.net:9187` | [[PostgreSQL|CloudNativePG]] metrics | +| `sifaka:9100` | [[sifaka-nas|Sifaka]] NAS (node_exporter) | +| `cnpg-metrics.tail8d86e.ts.net:9187` | [[postgresql|CloudNativePG]] metrics | | `kube-state-metrics.monitoring.svc:8080` | Kubernetes resource metrics | ## Related -- [[Grafana Alloy|Alloy]] - Metrics collector -- [[Grafana]] - Visualization -- [[Loki]] - Logs counterpart +- [[grafana-alloy|Alloy]] - Metrics collector +- [[grafana]] - Visualization +- [[loki]] - Logs counterpart diff --git a/docs/reference/services/teslamate.md b/docs/reference/services/teslamate.md index 9dec06f..85c62d7 100644 --- a/docs/reference/services/teslamate.md +++ b/docs/reference/services/teslamate.md @@ -1,5 +1,5 @@ --- -title: TeslaMate +title: teslamate tags: - service - vehicle @@ -17,7 +17,7 @@ Self-hosted Tesla data logger collecting vehicle telemetry from the Tesla Owner | **Tailscale URL** | https://tesla.tail8d86e.ts.net | | **Namespace** | `teslamate` | | **Image** | `teslamate/teslamate:2.2.0` | -| **Database** | [[PostgreSQL]] | +| **Database** | [[postgresql]] | ## Data Collected @@ -53,6 +53,6 @@ Uses Tesla Owner API via OAuth: ## Related -- [[PostgreSQL]] - Data storage -- [[Grafana]] - Dashboards -- [[Borgmatic]] - Database backup +- [[postgresql]] - Data storage +- [[grafana]] - Dashboards +- [[borgmatic]] - Database backup diff --git a/docs/reference/services/transmission.md b/docs/reference/services/transmission.md index 52fca45..5612f40 100644 --- a/docs/reference/services/transmission.md +++ b/docs/reference/services/transmission.md @@ -1,5 +1,5 @@ --- -title: Transmission +title: transmission tags: - service - torrent @@ -7,7 +7,7 @@ tags: # Transmission -BitTorrent daemon, primarily for downloading ZIM archives for [[Kiwix]]. +BitTorrent daemon, primarily for downloading ZIM archives for [[kiwix]]. ## Quick Reference @@ -17,7 +17,7 @@ BitTorrent daemon, primarily for downloading ZIM archives for [[Kiwix]]. | **Tailscale URL** | https://torrent.tail8d86e.ts.net | | **Namespace** | `torrent` | | **Image** | `lscr.io/linuxserver/transmission:latest` | -| **Storage** | NFS PVC from [[Sifaka NAS|Sifaka]] | +| **Storage** | NFS PVC from [[sifaka-nas|Sifaka]] | ## Storage Layout @@ -30,7 +30,7 @@ NFS share on sifaka (`/volume1/torrents`): | `/config/` | Transmission configuration | | `/watch/` | Watch directory for .torrent files | -[[Kiwix]] reads from `/downloads/complete/` to serve ZIM archives. +[[kiwix]] reads from `/downloads/complete/` to serve ZIM archives. ## Integration with Kiwix @@ -43,11 +43,11 @@ When downloads complete, the zim-watcher CronJob detects new ZIMs and restarts K ## Monitoring -Basic uptime via blackbox probe in [[Grafana Alloy|Alloy]] k8s (Services Health dashboard). +Basic uptime via blackbox probe in [[grafana-alloy|Alloy]] k8s (Services Health dashboard). Web UI shows: active/seeding/paused counts, speeds, disk usage. ## Related -- [[Kiwix]] - ZIM archive consumer -- [[Sifaka NAS|Sifaka]] - Download storage +- [[kiwix]] - ZIM archive consumer +- [[sifaka-nas|Sifaka]] - Download storage diff --git a/docs/reference/services/zot.md b/docs/reference/services/zot.md index ecab117..2a3293b 100644 --- a/docs/reference/services/zot.md +++ b/docs/reference/services/zot.md @@ -1,5 +1,5 @@ --- -title: Zot +title: zot tags: - service - registry @@ -30,7 +30,7 @@ OCI-native container registry providing pull-through cache and private image sto ## Pull-Through Cache -When [[Kubernetes Cluster|minikube]] pulls an image, containerd checks zot first. If cached, returns immediately. If not, zot fetches from upstream, caches it, then returns. +When [[kubernetes-cluster|minikube]] pulls an image, containerd checks zot first. If cached, returns immediately. If not, zot fetches from upstream, caches it, then returns. ## Security Model @@ -38,5 +38,5 @@ Network access only (no authentication). Defense is the Tailscale ACL boundary. ## Related -- [[Forgejo]] - Container build CI -- [[Kubernetes Cluster|Cluster]] - Registry consumer +- [[forgejo]] - Container build CI +- [[kubernetes-cluster|Cluster]] - Registry consumer diff --git a/docs/reference/storage/backups.md b/docs/reference/storage/backups.md index ded19c8..bc48c6f 100644 --- a/docs/reference/storage/backups.md +++ b/docs/reference/storage/backups.md @@ -1,5 +1,5 @@ --- -title: Backup Policy +title: backup-policy tags: - storage - backup @@ -7,13 +7,13 @@ tags: # Backup Policy -Daily automated backups from [[Indri]] to [[Sifaka NAS|Sifaka]] NAS. +Daily automated backups from [[indri]] to [[sifaka-nas|Sifaka]] NAS. ## Schedule | Time | Frequency | System | |------|-----------|--------| -| 2:00 AM | Daily | [[Borgmatic]] | +| 2:00 AM | Daily | [[borgmatic]] | ## What Gets Backed Up @@ -31,8 +31,8 @@ Daily automated backups from [[Indri]] to [[Sifaka NAS|Sifaka]] NAS. | Database | Host | Method | |----------|------|--------| -| miniflux | [[PostgreSQL|pg.ops.eblu.me]] | pg_dump stream | -| teslamate | [[PostgreSQL|pg.ops.eblu.me]] | pg_dump stream | +| miniflux | [[postgresql|pg.ops.eblu.me]] | pg_dump stream | +| teslamate | [[postgresql|pg.ops.eblu.me]] | pg_dump stream | ## What Is NOT Backed Up @@ -53,19 +53,19 @@ Daily automated backups from [[Indri]] to [[Sifaka NAS|Sifaka]] NAS. ## Backup Target -Repository: `/Volumes/backups/borg/` on [[Sifaka NAS|Sifaka]] +Repository: `/Volumes/backups/borg/` on [[sifaka-nas|Sifaka]] ## Monitoring -Metrics exposed to [[Prometheus]]: +Metrics exposed to [[prometheus]]: - `borgmatic_up` - Repository accessible - `borgmatic_last_archive_timestamp` - Last backup time - `borgmatic_repo_deduplicated_size_bytes` - Disk usage -Dashboard: "Borgmatic Backups" in [[Grafana]] +Dashboard: "Borgmatic Backups" in [[grafana]] ## Related -- [[Borgmatic]] - Backup system details -- [[Sifaka NAS|Sifaka]] - Backup storage -- [[PostgreSQL]] - Database backups +- [[borgmatic]] - Backup system details +- [[sifaka-nas|Sifaka]] - Backup storage +- [[postgresql]] - Database backups diff --git a/docs/reference/storage/postgresql-storage.md b/docs/reference/storage/postgresql-storage.md index 8742569..5067dbb 100644 --- a/docs/reference/storage/postgresql-storage.md +++ b/docs/reference/storage/postgresql-storage.md @@ -1,5 +1,5 @@ --- -title: PostgreSQL Storage +title: postgresql-storage tags: - storage - database @@ -7,4 +7,4 @@ tags: # PostgreSQL Storage -See [[PostgreSQL]] in Services. +See [[postgresql]] in Services. diff --git a/docs/reference/storage/sifaka.md b/docs/reference/storage/sifaka.md index 38249cb..5c3e541 100644 --- a/docs/reference/storage/sifaka.md +++ b/docs/reference/storage/sifaka.md @@ -1,5 +1,5 @@ --- -title: Sifaka NAS +title: sifaka-nas tags: - storage --- @@ -21,11 +21,11 @@ Synology NAS providing network storage and backup target. | Share | Path | Purpose | Consumers | |-------|------|---------|-----------| -| backups | `/volume1/backups` | Borg backup repository | [[Borgmatic]] | -| torrents | `/volume1/torrents` | ZIM downloads | [[Kiwix]], [[Transmission]] | -| music | `/volume1/music` | Music library | [[Navidrome]] | -| allisonflix | `/volume1/allisonflix` | Video library | [[Jellyfin]] | -| photos | `/volume1/photos` | Photo library | [[Immich]] | +| backups | `/volume1/backups` | Borg backup repository | [[borgmatic]] | +| torrents | `/volume1/torrents` | ZIM downloads | [[kiwix]], [[transmission]] | +| music | `/volume1/music` | Music library | [[navidrome]] | +| allisonflix | `/volume1/allisonflix` | Video library | [[jellyfin]] | +| photos | `/volume1/photos` | Photo library | [[immich]] | ## NFS Exports @@ -37,7 +37,7 @@ Synology NAS providing network storage and backup target. ## Monitoring -Node exporter running in Docker container, scraped by [[Prometheus]] at `sifaka:9100`. +Node exporter running in Docker container, scraped by [[prometheus]] at `sifaka:9100`. ## Tailscale @@ -46,14 +46,14 @@ Node exporter running in Docker container, scraped by [[Prometheus]] at `sifaka: ## Backup -Sifaka is the **target** for [[Backup|backups]], not a backup source. [[Borgmatic]] sends backups TO sifaka, not OF sifaka. +Sifaka is the **target** for [[backup|backups]], not a backup source. [[borgmatic]] sends backups TO sifaka, not OF sifaka. Data protection for sifaka itself currently relies on the Synology RAID 5 configuration, which provides single-disk fault tolerance. Future plans include offsite duplication for additional resiliency. ## Related -- [[Backup Policy|Backups]] - Backup policy -- [[Borgmatic]] - Backup system -- [[Immich]] - Photo consumer -- [[Jellyfin]] - Media consumer -- [[Navidrome]] - Music consumer +- [[backup-policy|Backups]] - Backup policy +- [[borgmatic]] - Backup system +- [[immich]] - Photo consumer +- [[jellyfin]] - Media consumer +- [[navidrome]] - Music consumer diff --git a/mise-tasks/doc-titles b/mise-tasks/doc-titles index aadb7a9..af33229 100755 --- a/mise-tasks/doc-titles +++ b/mise-tasks/doc-titles @@ -3,19 +3,22 @@ # requires-python = ">=3.12" # dependencies = ["pyyaml>=6.0", "rich>=13.0.0"] # /// -#MISE description="List all doc card titles and detect duplicates" -"""List all documentation card titles and detect duplicates. +#MISE description="List all doc card titles and detect duplicates or invalid formats" +"""List all documentation card titles and detect duplicates or invalid formats. This script scans all markdown files in the docs/ directory (excluding changelog.d/ and zk/), extracts frontmatter titles, and reports any -duplicates that could cause wiki-link resolution issues. +duplicates or invalid formats that could cause wiki-link resolution issues. -With Quartz, wiki-links like [[Title]] resolve by frontmatter title, -so titles must be unique across the documentation. +With Quartz, wiki-links like [[title]] resolve by frontmatter title, +so titles must be: +- Unique across the documentation +- Lowercase with hyphens (no spaces or uppercase) Usage: mise run doc-titles """ +import re import sys from collections import defaultdict from pathlib import Path @@ -26,6 +29,9 @@ from rich.table import Table DOCS_DIR = Path(__file__).parent.parent / "docs" +# Valid title pattern: lowercase letters, numbers, hyphens only +VALID_TITLE_PATTERN = re.compile(r"^[a-z0-9]+(-[a-z0-9]+)*$") + def extract_frontmatter(file_path: Path) -> dict | None: """Extract YAML frontmatter from a markdown file.""" @@ -44,12 +50,18 @@ def extract_frontmatter(file_path: Path) -> dict | None: return None +def is_valid_slug(title: str) -> bool: + """Check if title is a valid slug (lowercase, hyphens, no spaces).""" + return bool(VALID_TITLE_PATTERN.match(title)) + + def main() -> int: console = Console() # Collect all titles and their source files # Key: title, Value: list of file paths titles: dict[str, list[str]] = defaultdict(list) + invalid_titles: list[tuple[str, str]] = [] # (title, file_path) # Scan all markdown files (excluding zk/ and changelog.d/) for md_file in sorted(DOCS_DIR.rglob("*.md")): @@ -66,6 +78,8 @@ def main() -> int: title = frontmatter.get("title") if title: titles[title].append(rel_path) + if not is_valid_slug(title): + invalid_titles.append((title, rel_path)) # Find duplicates duplicates = {title: paths for title, paths in titles.items() if len(paths) > 1} @@ -73,12 +87,30 @@ def main() -> int: # Print results console.print("[bold]Doc Card Title Inventory[/bold]") console.print() - console.print("With Quartz, wiki-links like [[Title]] resolve by frontmatter title,") - console.print("so titles must be unique across the documentation.") + console.print("Titles must be lowercase slugs (e.g., 'grafana-alloy', not 'Grafana Alloy')") + console.print("and unique across the documentation for wiki-link resolution.") console.print() + has_errors = False + + # Invalid format table (if any) + if invalid_titles: + has_errors = True + console.print("[bold red]Invalid Title Format[/bold red]") + console.print("Titles must be lowercase with hyphens only (no spaces or uppercase).") + inv_table = Table(show_header=True, header_style="bold") + inv_table.add_column("Title") + inv_table.add_column("File") + + for title, file_path in invalid_titles: + inv_table.add_row(title, file_path) + + console.print(inv_table) + console.print() + # Duplicates table (if any) if duplicates: + has_errors = True console.print("[bold red]Duplicate Titles Found[/bold red]") dup_table = Table(show_header=True, header_style="bold") dup_table.add_column("Title") @@ -101,7 +133,15 @@ def main() -> int: for title in sorted(titles.keys()): paths = titles[title] is_dup = title in duplicates - status = "[red]DUPLICATE[/red]" if is_dup else "[green]OK[/green]" + is_invalid = not is_valid_slug(title) + + if is_dup: + status = "[red]DUPLICATE[/red]" + elif is_invalid: + status = "[red]INVALID[/red]" + else: + status = "[green]OK[/green]" + all_table.add_row(title, paths[0], status) for extra_path in paths[1:]: all_table.add_row("", extra_path, "") @@ -113,10 +153,11 @@ def main() -> int: console.print(f"Total files: {sum(len(p) for p in titles.values())}") console.print(f"Unique titles: {len(titles)}") console.print(f"Duplicate titles: {len(duplicates)}") + console.print(f"Invalid format: {len(invalid_titles)}") - if duplicates: + if has_errors: console.print() - console.print("[bold red]Action required:[/bold red] Rename titles to ensure unique wiki-link resolution.") + console.print("[bold red]Action required:[/bold red] Fix title issues above.") return 1 return 0