Compare commits

...

10 Commits

Author SHA1 Message Date
git 2d17c0a70d modified: core/docker-compose.yml
modified:   core/traefik/dynamic.yml
	modified:   core/traefik/traefik.yml
	modified:   monitoring/portainer/docker-compose.yml
	modified:   monitoring/prometheus/docker-compose.yml
	modified:   monitoring/uptime-kuma/docker-compose.yml
2026-04-08 09:57:39 +10:00
git 4e4ffa7f97 Merge branch 'main' of https://github.com/beatz174-bit/docker 2026-04-08 09:19:39 +10:00
git 9b96c94d5d modified: default-environment.env
modified:   monitoring/docker-exporter/exporter.py
	modified:   monitoring/node-red/docker-compose.yml
	modified:   monitoring/prometheus/docker-compose.yml
2026-04-08 09:18:33 +10:00
beatz174-bit ab38abf661 Merge pull request #11 from beatz174-bit/codex/refactor-services-to-use-docker-socket-proxy
Switch services from bind-mounting /var/run/docker.sock to docker-socket-proxy (use TCP DOCKER_HOST)
2026-04-08 09:18:22 +10:00
beatz174-bit 94565837f1 use shared prometheus docker-socket-proxy across services 2026-04-08 09:17:44 +10:00
beatz174-bit 700328d677 Merge pull request #10 from beatz174-bit/codex/check-docker-exporter.py-for-excessive-requests
Reduce upstream registry lookups in docker exporter
2026-04-07 22:21:46 +10:00
beatz174-bit 23315dd5ad Reduce registry calls in docker exporter checks 2026-04-07 22:21:27 +10:00
beatz174-bit 7945518a47 Merge pull request #9 from beatz174-bit/codex/enhance-docker-security-configurations
Use docker-socket-proxy and drop container privileges for monitoring services
2026-04-07 22:05:14 +10:00
beatz174-bit 037e3fc46b Merge branch 'main' into codex/enhance-docker-security-configurations 2026-04-07 22:04:32 +10:00
beatz174-bit 8930cb8459 Use single shared docker socket proxy service 2026-04-07 22:01:23 +10:00
11 changed files with 103 additions and 29 deletions
+1 -1
View File
@@ -7,6 +7,7 @@ services:
read_only: true read_only: true
hostname: traefik.lan.ddnsgeek.com hostname: traefik.lan.ddnsgeek.com
depends_on: depends_on:
- docker-socket-proxy
- error-pages - error-pages
- authelia - authelia
- crowdsec - crowdsec
@@ -21,7 +22,6 @@ services:
# - ${PROJECT_ROOT}/secrets/stack-secrets.env # - ${PROJECT_ROOT}/secrets/stack-secrets.env
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ${PROJECT_ROOT}/core/traefik/data/letsencrypt:/letsencrypt - ${PROJECT_ROOT}/core/traefik/data/letsencrypt:/letsencrypt
- ${PROJECT_ROOT}/core/traefik/data/logs:/logs - ${PROJECT_ROOT}/core/traefik/data/logs:/logs
- ${PROJECT_ROOT}/core/traefik/dynamic.yml:/etc/traefik/dynamic.yml:ro - ${PROJECT_ROOT}/core/traefik/dynamic.yml:/etc/traefik/dynamic.yml:ro
+4 -1
View File
@@ -17,8 +17,11 @@ services:
container_name: docker-update-exporter-test container_name: docker-update-exporter-test
stdin_open: true stdin_open: true
tty: true tty: true
depends_on:
- docker-socket-proxy
environment:
DOCKER_HOST: tcp://docker-socket-proxy:2375
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ${PROJECT_ROOT}/monitoring/docker-exporter/data:/data:rw - ${PROJECT_ROOT}/monitoring/docker-exporter/data:/data:rw
# - ${PROJECT_ROOT}/services-up.sh:/app/services-up.sh:ro # - ${PROJECT_ROOT}/services-up.sh:/app/services-up.sh:ro
+1 -1
View File
@@ -4,7 +4,7 @@ http:
plugin: plugin:
crowdsec-bouncer: crowdsec-bouncer:
crowdsecMode: live crowdsecMode: live
crowdsecLapiKey: ${CROWDSEC_LAPI_KEY} crowdsecLapiKey: HeneLa2mazFVzl5+DQRKOdchBuJxKdjrHsHBE/03Acs
crowdsecLapiHost: crowdsec:8080 crowdsecLapiHost: crowdsec:8080
crowdsecLapiScheme: http crowdsecLapiScheme: http
+1
View File
@@ -13,6 +13,7 @@ ping: {}
providers: providers:
docker: docker:
endpoint: "tcp://docker-socket-proxy:2375"
exposedByDefault: false exposedByDefault: false
file: file:
+4
View File
@@ -58,3 +58,7 @@ GOTIFY_REGISTRATION=false
# Portainer # Portainer
PORTAINER_GODEBUG=netdns=cgo PORTAINER_GODEBUG=netdns=cgo
# Node-red
DOCKER_SOCKET_PROXY_HOST=tcp://docker-socket-proxy:2375
DOCKER_SOCKET_PROXY_LOG_LEVEL=info
+34 -14
View File
@@ -19,7 +19,7 @@ logger = logging.getLogger("docker-update-exporter")
# --- Config --- # --- Config ---
EXPORTER_PORT = 9105 EXPORTER_PORT = 9105
CHECK_INTERVAL = 60 CHECK_INTERVAL = 3600
CACHE_TTL = int(os.getenv("CACHE_TTL", "300")) CACHE_TTL = int(os.getenv("CACHE_TTL", "300"))
SERVICES_UP_SCRIPT = os.getenv("SERVICES_UP_SCRIPT", "/compose/services-up.sh") SERVICES_UP_SCRIPT = os.getenv("SERVICES_UP_SCRIPT", "/compose/services-up.sh")
CACHE_FILE = os.getenv("CACHE_FILE", "/data/remote_digest_cache.json") CACHE_FILE = os.getenv("CACHE_FILE", "/data/remote_digest_cache.json")
@@ -411,6 +411,9 @@ def check_containers():
svc_map = parse_compose_services(compose_files, project_name, project_root) svc_map = parse_compose_services(compose_files, project_name, project_root)
containers = client.containers.list() containers = client.containers.list()
pending_metrics = []
remote_targets = set()
for container in containers: for container in containers:
proj = container.labels.get("com.docker.compose.project") proj = container.labels.get("com.docker.compose.project")
if not proj: if not proj:
@@ -423,30 +426,47 @@ def check_containers():
if svc in svc_map: if svc in svc_map:
compose_image = svc_map[svc]["image"] compose_image = svc_map[svc]["image"]
update_flag = 0
local_digest = get_local_digest(running) local_digest = get_local_digest(running)
remote_target = compose_image or running remote_target = compose_image or running
remote_digest = get_remote_digest(remote_target)
# If we cannot determine a local digest, we cannot compare and should
# avoid spending a registry lookup for this container.
if local_digest:
remote_targets.add(remote_target)
pending_metrics.append({
"container_name": container.name,
"service": svc,
"compose_image": compose_image,
"running_image": running,
"project_name": proj,
"remote_target": remote_target,
"local_digest": local_digest,
})
remote_digests = {target: get_remote_digest(target) for target in remote_targets}
for payload in pending_metrics:
local_digest = payload["local_digest"]
remote_target = payload["remote_target"]
remote_digest = remote_digests.get(remote_target)
update_flag = 1 if (local_digest and remote_digest and local_digest != remote_digest) else 0
logger.info( logger.info(
"Digest comparison: container=%s service=%s running=%s target=%s local=%s remote=%s", "Digest comparison: container=%s service=%s running=%s target=%s local=%s remote=%s",
container.name, payload["container_name"],
svc, payload["service"],
running, payload["running_image"],
remote_target, remote_target,
local_digest, local_digest,
remote_digest, remote_digest,
) )
if local_digest and remote_digest and local_digest != remote_digest:
update_flag = 1
set_container_update_metric( set_container_update_metric(
container_name=container.name, container_name=payload["container_name"],
compose_image=compose_image, compose_image=payload["compose_image"],
running_image=running, running_image=payload["running_image"],
project_name=proj, project_name=payload["project_name"],
update_flag=update_flag, update_flag=update_flag,
) )
+8 -3
View File
@@ -6,14 +6,19 @@ services:
container_name: node-red container_name: node-red
profiles: ["monitoring","all"] profiles: ["monitoring","all"]
restart: unless-stopped restart: unless-stopped
privileged: true depends_on:
- docker-socket-proxy
environment: environment:
- TZ=${TZ} DOCKER_HOST: ${DOCKER_SOCKET_PROXY_HOST}
TZ: ${TZ}
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
# ports: # ports:
# - "1880:1880" # - "1880:1880"
volumes: volumes:
- ${PROJECT_ROOT}/monitoring/node-red/data:/data - ${PROJECT_ROOT}/monitoring/node-red/data:/data
- /var/run/docker.sock:/var/run/docker.sock:rw
- ${PROJECT_ROOT}:/compose/docker:ro - ${PROJECT_ROOT}:/compose/docker:ro
- /home/nixos/raspi:/compose/raspi:ro - /home/nixos/raspi:/compose/raspi:ro
- ${PROJECT_ROOT}/default-environment.env:/usr/src/node-red/default-environment.env:ro - ${PROJECT_ROOT}/default-environment.env:/usr/src/node-red/default-environment.env:ro
+3 -2
View File
@@ -4,9 +4,10 @@ services:
image: portainer/portainer-ce:latest image: portainer/portainer-ce:latest
container_name: portainer container_name: portainer
restart: unless-stopped restart: unless-stopped
command: -H unix:///var/run/docker.sock depends_on:
- docker-socket-proxy
command: -H ${DOCKER_SOCKET_PROXY_HOST}
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ${PROJECT_ROOT}/monitoring/portainer/data:/data - ${PROJECT_ROOT}/monitoring/portainer/data:/data
networks: networks:
# - traefik_reverse_proxy # - traefik_reverse_proxy
+42 -5
View File
@@ -1,6 +1,35 @@
#version: "3.8" #version: "3.8"
services: services:
docker-socket-proxy:
profiles: ["monitoring","all","prometheus","prometheus-exporters"]
image: tecnativa/docker-socket-proxy:latest
container_name: docker-socket-proxy
restart: unless-stopped
environment:
LOG_LEVEL: ${DOCKER_SOCKET_PROXY_LOG_LEVEL}
DISTRIBUTION: 1
CONTAINERS: 1
EVENTS: 1
IMAGES: 1
INFO: 1
NETWORKS: 1
PING: 1
POST: 1
SERVICES: 1
TASKS: 1
VERSION: 1
VOLUMES: 1
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
networks:
- monitor
- traefik
prometheus: prometheus:
profiles: ["monitoring","all","prometheus"] profiles: ["monitoring","all","prometheus"]
image: prom/prometheus:latest image: prom/prometheus:latest
@@ -140,13 +169,15 @@ services:
telegraf: telegraf:
profiles: ["monitoring","all","prometheus"] profiles: ["monitoring","all","prometheus"]
image: telegraf:latest image: telegraf:latest
group_add:
- "131"
privileged: true
container_name: telegraf container_name: telegraf
restart: unless-stopped restart: unless-stopped
depends_on:
- docker-socket-proxy
# cap_drop:
# - ALL
security_opt:
- no-new-privileges:true
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ${PROJECT_ROOT}/monitoring/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro - ${PROJECT_ROOT}/monitoring/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro
networks: networks:
# - edge # - edge
@@ -170,10 +201,12 @@ services:
# - ${PROJECT_ROOT}/services-up.sh:/app/services-up.sh:ro # - ${PROJECT_ROOT}/services-up.sh:/app/services-up.sh:ro
environment: environment:
LOG_LEVEL: ${DOCKER_EXPORTER_LOG_LEVEL} LOG_LEVEL: ${DOCKER_EXPORTER_LOG_LEVEL}
DOCKER_HOST: ${DOCKER_SOCKET_PROXY_HOST}
depends_on:
- docker-socket-proxy
volumes: volumes:
- ~/.docker/config.json:/root/.docker/config.json:ro - ~/.docker/config.json:/root/.docker/config.json:ro
- /var/run/docker.sock:/var/run/docker.sock
- ${PROJECT_ROOT}/monitoring/docker-exporter/data:/data:rw - ${PROJECT_ROOT}/monitoring/docker-exporter/data:/data:rw
- ${PROJECT_ROOT}:/compose:ro - ${PROJECT_ROOT}:/compose:ro
# - ${PROJECT_ROOT}/default-environment.env:/compose/default-environment.env:ro # - ${PROJECT_ROOT}/default-environment.env:/compose/default-environment.env:ro
@@ -198,6 +231,10 @@ services:
# ports: # ports:
# - "9105:9105" # - "9105:9105"
restart: unless-stopped restart: unless-stopped
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
networks: networks:
# - edge # - edge
- monitor - monitor
+1 -1
View File
@@ -2,7 +2,7 @@
interval = "10s" interval = "10s"
[[inputs.docker]] [[inputs.docker]]
endpoint = "unix:///var/run/docker.sock" endpoint = "tcp://docker-socket-proxy:2375"
gather_services = false gather_services = false
[[outputs.prometheus_client]] [[outputs.prometheus_client]]
+4 -1
View File
@@ -4,8 +4,11 @@ services:
image: louislam/uptime-kuma:2.1.1 image: louislam/uptime-kuma:2.1.1
container_name: monitor-kuma container_name: monitor-kuma
restart: always restart: always
depends_on:
- docker-socket-proxy
environment:
DOCKER_HOST: ${DOCKER_SOCKET_PROXY_HOST}
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ${PROJECT_ROOT}/monitoring/uptime-kuma/data:/app/data - ${PROJECT_ROOT}/monitoring/uptime-kuma/data:/app/data
# ports: # ports:
# - 8888:3001 # - 8888:3001