about summary refs log tree commit diff
path: root/bundles
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2026-02-23 14:12:22 +0100
committerRobert Günzler <r@gnzler.io>2026-02-23 14:12:36 +0100
commit4fa05f4c140205450f63337626680c65f2879896 (patch)
tree889c0b239eea1e98aa7b2290b1db2028a4cb34aa /bundles
parent090a357ef46473e76b0cd0e0e1b013e6080a7360 (diff)
replace containers,www with svtree modules equivalents
Signed-off-by: Robert Günzler <r@gnzler.io>
Diffstat (limited to 'bundles')
-rw-r--r--bundles/containers/items.py62
-rwxr-xr-xbundles/svtree-containers/files/bin/podman-healthcheck32
-rwxr-xr-xbundles/svtree-containers/files/bin/podman-healthcheckd34
-rw-r--r--bundles/svtree-containers/files/etc/containers/containers.conf.d/10-firewall-driver.conf (renamed from bundles/containers/files/etc/containers/containers.conf.d/10-firewall-driver.conf)0
-rw-r--r--bundles/svtree-containers/files/etc/init.d/podman-healthcheck (renamed from bundles/containers/files/etc/init.d/podman-healthcheck)0
-rwxr-xr-xbundles/svtree-containers/files/etc/periodic/15min/podman-healthcheck (renamed from bundles/containers/files/etc/periodic/15min/podman-healthcheck)0
-rwxr-xr-xbundles/svtree-containers/files/etc/periodic/weekly/podman-prune (renamed from bundles/containers/files/etc/periodic/weekly/podman-prune)0
-rw-r--r--bundles/svtree-containers/files/etc/s6-rc/services/podman-exporter.run7
-rw-r--r--bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/consumer-for (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-log/consumer-for)0
-rw-r--r--bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/notification-fd (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-log/notification-fd)0
-rw-r--r--bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/pipeline-name (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-log/pipeline-name)0
-rw-r--r--bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/run (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-log/run)0
-rw-r--r--bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/type (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-log/type)0
-rw-r--r--bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/producer-for (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-srv/producer-for)0
-rwxr-xr-xbundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/run (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-srv/run)0
-rw-r--r--bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/type (renamed from bundles/containers/files/etc/s6-rc/templates/container/+service-srv/type)0
-rw-r--r--bundles/svtree-containers/files/etc/traefik/podman-exporter.yaml13
-rw-r--r--bundles/svtree-containers/items.py86
-rw-r--r--bundles/svtree-containers/metadata.py (renamed from bundles/containers/metadata.py)4
-rw-r--r--bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/consumer-for (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-log/consumer-for)0
-rw-r--r--bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/notification-fd (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-log/notification-fd)0
-rw-r--r--bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/pipeline-name (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-log/pipeline-name)0
-rw-r--r--bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/run (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-log/run)0
-rw-r--r--bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/type (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-log/type)0
-rw-r--r--bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/notification-fd (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-srv/notification-fd)0
-rw-r--r--bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/producer-for (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-srv/producer-for)0
-rwxr-xr-xbundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/run (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-srv/run)0
-rw-r--r--bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/type (renamed from bundles/www/files/etc/s6-rc/templates/www/+service-srv/type)0
-rw-r--r--bundles/svtree-www/items.py (renamed from bundles/www/items.py)12
-rw-r--r--bundles/svtree-www/metadata.py (renamed from bundles/www/metadata.py)0
30 files changed, 183 insertions, 67 deletions
diff --git a/bundles/containers/items.py b/bundles/containers/items.py
deleted file mode 100644
index ea5b341..0000000
--- a/bundles/containers/items.py
+++ /dev/null
@@ -1,62 +0,0 @@
-if node.os != "alpine":
-    raise BundleError(f"{node.name}: OS {node.os} is not supported.")
-
-from os.path import join
-
-# TODO: healthcheck metrics?
-svc_openrc = {
-    "podman-healthcheck": {
-        "runlevel": "default",
-        "enabled": True,
-        "needs": {"file:/etc/init.d/podman-healthcheck"},
-    },
-}
-
-directories = {
-    "/etc/s6-rc/src/containers/contents.d": { 'purge': True },
-}
-
-files = {
-    "/etc/containers/containers.conf.d/10-firewall-driver.conf": {
-        "needs": {
-            "bundle:firewall",
-        },
-    },
-
-    "/etc/s6-rc/templates/container/+service-srv/run": { "mode": "0755" },
-    "/etc/s6-rc/templates/container/+service-log/run": { "mode": "0755" },
-    "/etc/s6-rc/src/default/contents.d/containers": {
-        "content_type": "text",
-        "content": "",
-        "triggers": {
-            "svc_openrc:svtree:reload",
-        },
-    },
-    "/etc/s6-rc/src/containers/type": {
-        "content_type": "text",
-        "content": "bundle",
-        "triggers": {
-            "svc_openrc:svtree:reload",
-        },
-    },
-
-    "/bin/podman-healthcheck": { "mode": "0755" },
-    "/etc/periodic/15min/podman-healthcheck": { "mode": "0755" },
-    "/etc/periodic/weekly/podman-prune": { "mode": "0755" },
-    "/bin/podman-healthcheckd": { "mode": "0755" },
-    "/etc/init.d/podman-healthcheck": { "mode": "0755" },
-}
-
-repo.libs.gen.add_files_recursive(
-    files,
-    join(repo.path, "bundles", "containers", "files"),
-)
-
-for container, _ in node.metadata.get("containers", {}).items():
-    svc_s6rc[container] = {
-        "bundle": "containers",
-        "generate": "container",
-        "triggers": {
-            "svc_openrc:svtree:reload",
-        },
-    }
diff --git a/bundles/svtree-containers/files/bin/podman-healthcheck b/bundles/svtree-containers/files/bin/podman-healthcheck
new file mode 100755
index 0000000..ab3dcc7
--- /dev/null
+++ b/bundles/svtree-containers/files/bin/podman-healthcheck
@@ -0,0 +1,32 @@
+#!/bin/sh
+set -eu
+[ -n "${DEBUG:-}" ] && set -x
+
+healthcheck() {
+	local container=${1:?}
+
+	podman healthcheck run "$container" >/dev/null 2>&1 || true
+
+	podman inspect --format '{{if .State.Health}}{{.Name}} {{.State.Health.Status}}{{end}}' "$container" | (
+		read -r name status
+
+		test -n "$name" || return
+
+		printf '%s (%s) is %s\n' "$container" "$name" "$status"
+		case "$status" in
+		healthy) ;;
+		*)
+			# tgnotify "!!! service $container unhealthy"
+			;;
+		esac
+	)
+}
+
+main() {
+	case "${1:-}" in
+	"") podman container ls --format '{{.ID}}' | xargs -n1 $0 ;;
+	*) healthcheck "$1" ;;
+	esac
+}
+
+main $@
diff --git a/bundles/svtree-containers/files/bin/podman-healthcheckd b/bundles/svtree-containers/files/bin/podman-healthcheckd
new file mode 100755
index 0000000..cdbef0e
--- /dev/null
+++ b/bundles/svtree-containers/files/bin/podman-healthcheckd
@@ -0,0 +1,34 @@
+#!/bin/sh
+set -eu
+[ -n "${DEBUG:-}" ] && set -x
+
+healthcheck_with_retry() {
+	local container="${1:-}"
+
+	podman inspect --format '{{with .Config.Healthcheck}}{{.StartPeriod}} {{.Timeout}} {{.Retries}}{{end}}' "$container" |
+		(
+			read -r start_period timeout retries
+			test -n "$start_period$timeout$retries" || return
+
+			sleep "$start_period"
+
+			podman-healthcheck "$container" && return
+
+			count=0
+			while [ "$count" -lt "$retries" ]; do
+				sleep "$timeout"
+				podman-healthcheck "$container" && return
+				count=$((count + 1))
+			done
+		)
+
+}
+
+main() {
+	podman events --filter 'type=container' --filter 'event=start' --format '{{.ID}}' |
+		while read -r container; do
+			healthcheck_with_retry "$container" || true
+		done
+}
+
+main $@
diff --git a/bundles/containers/files/etc/containers/containers.conf.d/10-firewall-driver.conf b/bundles/svtree-containers/files/etc/containers/containers.conf.d/10-firewall-driver.conf
index be33d99..be33d99 100644
--- a/bundles/containers/files/etc/containers/containers.conf.d/10-firewall-driver.conf
+++ b/bundles/svtree-containers/files/etc/containers/containers.conf.d/10-firewall-driver.conf
diff --git a/bundles/containers/files/etc/init.d/podman-healthcheck b/bundles/svtree-containers/files/etc/init.d/podman-healthcheck
index 8e12fa4..8e12fa4 100644
--- a/bundles/containers/files/etc/init.d/podman-healthcheck
+++ b/bundles/svtree-containers/files/etc/init.d/podman-healthcheck
diff --git a/bundles/containers/files/etc/periodic/15min/podman-healthcheck b/bundles/svtree-containers/files/etc/periodic/15min/podman-healthcheck
index 7aa6d41..7aa6d41 100755
--- a/bundles/containers/files/etc/periodic/15min/podman-healthcheck
+++ b/bundles/svtree-containers/files/etc/periodic/15min/podman-healthcheck
diff --git a/bundles/containers/files/etc/periodic/weekly/podman-prune b/bundles/svtree-containers/files/etc/periodic/weekly/podman-prune
index 5715b95..5715b95 100755
--- a/bundles/containers/files/etc/periodic/weekly/podman-prune
+++ b/bundles/svtree-containers/files/etc/periodic/weekly/podman-prune
diff --git a/bundles/svtree-containers/files/etc/s6-rc/services/podman-exporter.run b/bundles/svtree-containers/files/etc/s6-rc/services/podman-exporter.run
new file mode 100644
index 0000000..01b0ebf
--- /dev/null
+++ b/bundles/svtree-containers/files/etc/s6-rc/services/podman-exporter.run
@@ -0,0 +1,7 @@
+#!/bin/sh
+exec prometheus-podman-exporter \
+	--collector.enable-all \
+	--collector.enhance-metrics \
+	--web.disable-exporter-metrics \
+	--web.listen-address=:9882 \
+	--web.telemetry-path=/metrics/podman
diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/consumer-for b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/consumer-for
index 83c1762..83c1762 100644
--- a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/consumer-for
+++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/consumer-for
diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/notification-fd b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/notification-fd
index 00750ed..00750ed 100644
--- a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/notification-fd
+++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/notification-fd
diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/pipeline-name b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/pipeline-name
index 0db7d83..0db7d83 100644
--- a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/pipeline-name
+++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/pipeline-name
diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/run b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/run
index d558f3c..d558f3c 100644
--- a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/run
+++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/run
diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/type b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/type
index 5883cff..5883cff 100644
--- a/bundles/containers/files/etc/s6-rc/templates/container/+service-log/type
+++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/type
diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-srv/producer-for b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/producer-for
index cba6eea..cba6eea 100644
--- a/bundles/containers/files/etc/s6-rc/templates/container/+service-srv/producer-for
+++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/producer-for
diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-srv/run b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/run
index 3ca06e2..3ca06e2 100755
--- a/bundles/containers/files/etc/s6-rc/templates/container/+service-srv/run
+++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/run
diff --git a/bundles/containers/files/etc/s6-rc/templates/container/+service-srv/type b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/type
index 5883cff..5883cff 100644
--- a/bundles/containers/files/etc/s6-rc/templates/container/+service-srv/type
+++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/type
diff --git a/bundles/svtree-containers/files/etc/traefik/podman-exporter.yaml b/bundles/svtree-containers/files/etc/traefik/podman-exporter.yaml
new file mode 100644
index 0000000..471446c
--- /dev/null
+++ b/bundles/svtree-containers/files/etc/traefik/podman-exporter.yaml
@@ -0,0 +1,13 @@
+http:
+  services:
+    podman-exporter:
+      loadBalancer:
+        servers:
+          - url: http://${node.metadata.get("container_gateway", "10.89.0.1")}:9882
+
+  routers:
+    podman-exporter:
+      rule: Path(`/metrics/podman`)
+      entryPoints:
+        - metrics
+      service: podman-exporter
diff --git a/bundles/svtree-containers/items.py b/bundles/svtree-containers/items.py
new file mode 100644
index 0000000..320ab75
--- /dev/null
+++ b/bundles/svtree-containers/items.py
@@ -0,0 +1,86 @@
+if node.os != "alpine":
+    raise BundleError(f"{node.name}: OS {node.os} is not supported.")
+
+from os.path import join
+
+# TODO: healthcheck metrics?
+svc_openrc = {
+    "podman-healthcheck": {
+        "runlevel": "default",
+        "enabled": True,
+        "needs": {
+            "file:/etc/init.d/podman-healthcheck",
+        },
+    },
+}
+
+svc_s6rc = {
+    "podman-exporter": {
+        "bundle": "services",
+        "generate": "service",
+        "needs": {
+            "file:/etc/s6-rc/services/podman-exporter.run",
+        },
+    }
+}
+
+files = {
+    "/etc/containers/containers.conf.d/10-firewall-driver.conf": {
+        "needs": {
+            "bundle:firewall",
+        },
+    },
+    "/etc/s6-rc/templates/container/+service-srv/run": {"mode": "0755"},
+    "/etc/s6-rc/templates/container/+service-log/run": {"mode": "0755"},
+    "/etc/s6-rc/src/default/contents.d/containers": {
+        "content_type": "text",
+        "content": "",
+        "triggers": {
+            "svc_openrc:svtree:reload",
+        },
+    },
+    "/etc/s6-rc/src/containers/type": {
+        "content_type": "text",
+        "content": "bundle",
+        "triggers": {
+            "svc_openrc:svtree:reload",
+        },
+    },
+    # healthchecks
+    "/bin/podman-healthcheck": {"mode": "0755"},
+    "/etc/periodic/15min/podman-healthcheck": {"mode": "0755"},
+    "/etc/periodic/weekly/podman-prune": {"mode": "0755"},
+    "/bin/podman-healthcheckd": {"mode": "0755"},
+    "/etc/init.d/podman-healthcheck": {"mode": "0755"},
+    # monitoring
+    "/etc/s6-rc/services/podman-exporter.run": {
+        "mode": "0755",
+        "triggers": {
+            "svc_s6rc:podman-exporter:restart",
+        },
+    },
+    "/etc/traefik/podman-exporter.yaml": {
+        "content_type": "mako",
+    },
+}
+
+repo.libs.gen.add_files_recursive(
+    files,
+    join(repo.bundles_dir, "svtree-containers", "files"),
+)
+
+# TODO: can we use purge = True here?
+
+directories = {
+    "/etc/s6-rc/src/containers/contents.d": {},
+}
+
+for container, _ in node.metadata.get("containers", {}).items():
+    svc_s6rc[container] = {
+        "bundle": "containers",
+        "generate": "container",
+        "triggers": {
+            "svc_openrc:svtree:reload",
+        },
+    }
+
diff --git a/bundles/containers/metadata.py b/bundles/svtree-containers/metadata.py
index dc5832c..85fa34b 100644
--- a/bundles/containers/metadata.py
+++ b/bundles/svtree-containers/metadata.py
@@ -3,6 +3,10 @@ defaults = {
         "packages": {
             "crun": {},
             "podman": {},
+            "prometheus-podman-exporter": {},
         },
     },
+    "metrics": {
+        "podman": {},
+    },
 }
diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-log/consumer-for b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/consumer-for
index 83c1762..83c1762 100644
--- a/bundles/www/files/etc/s6-rc/templates/www/+service-log/consumer-for
+++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/consumer-for
diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-log/notification-fd b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/notification-fd
index 00750ed..00750ed 100644
--- a/bundles/www/files/etc/s6-rc/templates/www/+service-log/notification-fd
+++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/notification-fd
diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-log/pipeline-name b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/pipeline-name
index 0db7d83..0db7d83 100644
--- a/bundles/www/files/etc/s6-rc/templates/www/+service-log/pipeline-name
+++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/pipeline-name
diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-log/run b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/run
index d558f3c..d558f3c 100644
--- a/bundles/www/files/etc/s6-rc/templates/www/+service-log/run
+++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/run
diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-log/type b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/type
index 5883cff..5883cff 100644
--- a/bundles/www/files/etc/s6-rc/templates/www/+service-log/type
+++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-log/type
diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/notification-fd b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/notification-fd
index 00750ed..00750ed 100644
--- a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/notification-fd
+++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/notification-fd
diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/producer-for b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/producer-for
index cba6eea..cba6eea 100644
--- a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/producer-for
+++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/producer-for
diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/run b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/run
index 677d7e1..677d7e1 100755
--- a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/run
+++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/run
diff --git a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/type b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/type
index 5883cff..5883cff 100644
--- a/bundles/www/files/etc/s6-rc/templates/www/+service-srv/type
+++ b/bundles/svtree-www/files/etc/s6-rc/templates/www/+service-srv/type
diff --git a/bundles/www/items.py b/bundles/svtree-www/items.py
index b6f0cfd..086bc33 100644
--- a/bundles/www/items.py
+++ b/bundles/svtree-www/items.py
@@ -3,10 +3,6 @@ if node.os != "alpine":
 
 from os.path import join
 
-directories = {
-    "/etc/s6-rc/src/www/contents.d": { 'purge': True }
-}
-
 files = {
     "/etc/s6-rc/templates/www/+service-srv/run": { "mode": "0755" },
     "/etc/s6-rc/templates/www/+service-log/run": { "mode": "0755" },
@@ -28,9 +24,15 @@ files = {
 
 repo.libs.gen.add_files_recursive(
     files,
-    join(repo.path, "bundles", "www", "files"),
+    join(repo.bundles_dir, "svtree-www", "files"),
 )
 
+# TODO: can we use purge = True here?
+
+directories = {
+    "/etc/s6-rc/src/www/contents.d": {}
+}
+
 for www, _ in node.metadata.get("www", {}).items():
     svc_s6rc[www] = {
         "bundle": "www",
diff --git a/bundles/www/metadata.py b/bundles/svtree-www/metadata.py
index 1d5700a..1d5700a 100644
--- a/bundles/www/metadata.py
+++ b/bundles/svtree-www/metadata.py