diff options
| author | Robert Günzler <r@gnzler.io> | 2026-02-23 14:12:22 +0100 |
|---|---|---|
| committer | Robert Günzler <r@gnzler.io> | 2026-02-23 14:12:36 +0100 |
| commit | 4fa05f4c140205450f63337626680c65f2879896 (patch) | |
| tree | 889c0b239eea1e98aa7b2290b1db2028a4cb34aa /bundles/svtree-containers | |
| parent | 090a357ef46473e76b0cd0e0e1b013e6080a7360 (diff) | |
replace containers,www with svtree modules equivalents
Signed-off-by: Robert Günzler <r@gnzler.io>
Diffstat (limited to 'bundles/svtree-containers')
18 files changed, 244 insertions, 0 deletions
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/svtree-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 new file mode 100644 index 0000000..be33d99 --- /dev/null +++ b/bundles/svtree-containers/files/etc/containers/containers.conf.d/10-firewall-driver.conf @@ -0,0 +1,2 @@ +[network] +firewall_driver = "nftables" diff --git a/bundles/svtree-containers/files/etc/init.d/podman-healthcheck b/bundles/svtree-containers/files/etc/init.d/podman-healthcheck new file mode 100644 index 0000000..8e12fa4 --- /dev/null +++ b/bundles/svtree-containers/files/etc/init.d/podman-healthcheck @@ -0,0 +1,11 @@ +#!/sbin/openrc-run + +description="Run podman healthchecks when containers start." + +supervisor=supervise-daemon +command="/bin/podman-healthcheckd" + +depend() +{ + need localmount +} diff --git a/bundles/svtree-containers/files/etc/periodic/15min/podman-healthcheck b/bundles/svtree-containers/files/etc/periodic/15min/podman-healthcheck new file mode 100755 index 0000000..7aa6d41 --- /dev/null +++ b/bundles/svtree-containers/files/etc/periodic/15min/podman-healthcheck @@ -0,0 +1,4 @@ +#!/bin/sh +set -eu +/bin/podman-healthcheck >/dev/null 2>&1 +exit 0 diff --git a/bundles/svtree-containers/files/etc/periodic/weekly/podman-prune b/bundles/svtree-containers/files/etc/periodic/weekly/podman-prune new file mode 100755 index 0000000..5715b95 --- /dev/null +++ b/bundles/svtree-containers/files/etc/periodic/weekly/podman-prune @@ -0,0 +1,4 @@ +#!/bin/sh +set -eu +/usr/bin/podman system prune --force --all --volumes >/dev/null 2>&1 +exit 0 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/svtree-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 new file mode 100644 index 0000000..83c1762 --- /dev/null +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/consumer-for @@ -0,0 +1 @@ ++service-srv diff --git a/bundles/svtree-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 new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/notification-fd @@ -0,0 +1 @@ +3 diff --git a/bundles/svtree-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 new file mode 100644 index 0000000..0db7d83 --- /dev/null +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/pipeline-name @@ -0,0 +1 @@ ++service diff --git a/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/run b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/run new file mode 100644 index 0000000..d558f3c --- /dev/null +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/run @@ -0,0 +1,10 @@ +#!/bin/execlineb -P + +envfile -I /etc/s6-rc/system.conf +importas -sCuD "/run/log" s6_log_dir s6_log_dir + +envfile -I /etc/s6-rc/+service.conf +importas -sCuD "n3 s2000000 T" s6_log_directives s6_log_directives + +foreground { install -d ${s6_log_dir}/+service } +exec -c s6-log -d3 -b -- ${s6_log_directives} ${s6_log_dir}/+service diff --git a/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/type b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/type new file mode 100644 index 0000000..5883cff --- /dev/null +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-log/type @@ -0,0 +1 @@ +longrun diff --git a/bundles/svtree-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 new file mode 100644 index 0000000..cba6eea --- /dev/null +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/producer-for @@ -0,0 +1 @@ ++service-log diff --git a/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/run b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/run new file mode 100755 index 0000000..3ca06e2 --- /dev/null +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/run @@ -0,0 +1,23 @@ +#!/bin/execlineb -P + +# load location of deployments from system config +envfile /etc/s6-rc/system.conf +importas -iu deployments_dir deployments_dir + +# route all logs to stdout +fdmove -c 2 1 + +ifthenelse { eltest -e ${deployments_dir}/+service/secret.yaml } +{ + foreground { podman secret rm -i +service } + foreground { podman secret create +service ${deployments_dir}/+service/secret.yaml } +} +{ + # noop +} + +exec podman play kube \ + --log-driver=passthrough \ + --replace \ + --wait \ + ${deployments_dir}/+service/kube.yaml diff --git a/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/type b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/type new file mode 100644 index 0000000..5883cff --- /dev/null +++ b/bundles/svtree-containers/files/etc/s6-rc/templates/container/+service-srv/type @@ -0,0 +1 @@ +longrun 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/svtree-containers/metadata.py b/bundles/svtree-containers/metadata.py new file mode 100644 index 0000000..85fa34b --- /dev/null +++ b/bundles/svtree-containers/metadata.py @@ -0,0 +1,12 @@ +defaults = { + "apk": { + "packages": { + "crun": {}, + "podman": {}, + "prometheus-podman-exporter": {}, + }, + }, + "metrics": { + "podman": {}, + }, +} |