Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2d17c0a70d | |||
| 4e4ffa7f97 | |||
| 9b96c94d5d | |||
| ab38abf661 | |||
| 94565837f1 | |||
| 700328d677 | |||
| 23315dd5ad | |||
| 7945518a47 | |||
| 037e3fc46b | |||
| 8930cb8459 |
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ ping: {}
|
|||||||
|
|
||||||
providers:
|
providers:
|
||||||
docker:
|
docker:
|
||||||
|
endpoint: "tcp://docker-socket-proxy:2375"
|
||||||
exposedByDefault: false
|
exposedByDefault: false
|
||||||
|
|
||||||
file:
|
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
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,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
|
||||||
|
|||||||
Reference in New Issue
Block a user