In dieser Anleitung zeige ich euch, wie ihr innerhalb weniger Minuten Healthchecks mittels Docker und Traefik bereitstellen könnt.
Bei Healthchecks handelt es sich um ein Monitoring Tool mit dem ihr eure Cron-Jobs oder Skripte überwachen und z.B. auch deren Laufzeit messen könnt. Zusätzlich können Logs oder Status Codes übergeben und in Healthchecks angesehen werden.
Datum | Änderungen |
---|---|
21.08.2024 | Aktualisierung der Anleitung, DB-Container auf Postgres umgestellt |
16.08.2023 | Erstellung dieser Anleitung |
01.06.2023 | Anpassung der Traefik Labels, MariaDB Healthcheck hinzugefügt @christian |
1. Vorraussetzung
- Docker mit Docker Compose installiert (Anleitung für Ubuntu / Debian)
- TRAEFIK V2 + 3 – REVERSE-PROXY MIT CROWDSEC IM STACK EINRICHTEN
2. Verzeichnis anlegen
Als ersten Schritt legen wir uns ein Verzeichnis für Healthchecks an:
mkdir -p /opt/containers/healthchecks
3. Anlegen der docker-compose.yml
nano /opt/containers/healthchecks/docker-compose.yml
Inhalt der docker-compose.yml
services: healthchecks-app: image: healthchecks/healthchecks container_name: healthchecks-app restart: unless-stopped security_opt: - no-new-privileges:true command: bash -c 'while !</dev/tcp/healthchecks-db/5432; do sleep 1; done; uwsgi /opt/healthchecks/docker/uwsgi.ini' environment: - ALLOWED_HOSTS=healthchecks.euredomain.de - DB=postgres - DB_HOST=healthchecks-db - DB_PORT=5432 - DB_NAME=healthchecks_database - DB_USER=postgres - DB_PASSWORD=postgres_pw - DEBUG=False - DEFAULT_FROM_EMAIL=mail@euredomain.de - EMAIL_HOST=mail.euredomain.de - EMAIL_HOST_USER=mail@euredomain.de - EMAIL_HOST_PASSWORD=mail_pw - EMAIL_PORT=587 - EMAIL_USE_TLS=True - EMAIL_USE_VERIFICATION=True - MATTERMOST_ENABLED=False - MSTEAMS_ENABLED=False - OPSGENIE_ENABLED=False - PAGERTREE_ENABLED=False - PD_ENABLED=False - PING_BODY_LIMIT=10000 - PROMETHEUS_ENABLED=False - REGISTRATION_OPEN=False - SECRET_KEY=super-sicherer-secret-key - SITE_NAME=Healthchecks - SITE_ROOT=https://healthchecks.euredomain.de - SLACK_ENABLED=False - SPIKE_ENABLED=False - USE_PAYMENTS=False - VICTOROPS_ENABLED=False - WEBHOOKS_ENABLED=False - ZULIP_ENABLED=False - TZ=Europe/Berlin volumes: - /etc/localtime:/etc/localtime:ro labels: - "traefik.enable=true" - "traefik.http.routers.healthchecks.entrypoints=websecure" - "traefik.http.routers.healthchecks.rule=Host(`healthchecks.euredomain.de`)" - "traefik.http.routers.healthchecks.tls=true" - "traefik.http.routers.healthchecks.tls.certresolver=http_resolver" - "traefik.http.routers.healthchecks.middlewares=default@file" - "traefik.http.routers.healthchecks.service=healthchecks" - "traefik.http.services.healthchecks.loadbalancer.server.port=8000" - "traefik.docker.network=proxy" networks: - proxy - default depends_on: healthchecks-db: condition: service_healthy healthchecks-db: image: postgres:16 container_name: healthchecks-db restart: unless-stopped security_opt: - no-new-privileges:true healthcheck: test: ["CMD-SHELL", "pg_isready"] interval: 5s timeout: 5s retries: 5 environment: - POSTGRES_DB=healthchecks_database - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres_pw - PGUSER=postgres - TZ=Europe/Berlin volumes: - ./pgsql-data:/var/lib/postgresql/data networks: - default healthchecks-backup: image: tiredofit/db-backup container_name: healthchecks-backup restart: unless-stopped security_opt: - no-new-privileges:true environment: - DB01_TYPE=pgsql - DB01_HOST=healthchecks-db - DB01_NAME=healthchecks_database - DB01_USER=postgres - DB01_PASS=postgres_pw - DEFAULT_BACKUP_BEGIN=0300 - DEFAULT_BACKUP_INTERVAL=1440 - DEFAULT_CLEANUP_TIME=8640 - DEFAULT_COMPRESSION=GZ - DEFAULT_COMPRESSION_LEVEL=9 - DEFAULT_CREATE_LATEST_SYMLINK=FALSE - DEFAULT_FILESYSTEM_PATH_PERMISSION=755 - DEFAULT_FILESYSTEM_PERMISSION=644 - CONTAINER_ENABLE_MONITORING=FALSE - TZ=Europe/Berlin volumes: - /etc/localtime:/etc/localtime:ro - ./backups:/backup depends_on: - healthchecks-db networks: - default networks: default: name: healthchecks proxy: external: true
Notwendige Anpassungen:
- 3x Eure URL (“healthchecks.euredomain.de”)
- 3x DB-Name (“healthchecks_database”)
- 3x DB-PW (“postgres_pw”):
Ihr könnt natürlich auch einen eigenen DB-User nehmen, dann müsst ihr aber beim DB-Container andere Variablen setzen. - Eure Mail-Server-Daten:
- EMAIL_HOST (“mail.euredomain.de”)
Domain eures Mail-Servers - DEFAULT_FROM_EMAIL / EMAIL_HOST_USER (“mail@euredomain.de”)
Absender der Mails von Healthchecks - EMAIL_HOST_PASSWORD (“mail_pw”)
Passwort des oben genannten Mail-Accounts - EMAIL_PORT / EMAIL_USE_TLS
individuell und passend zu eurem Mail-Server einstellen
- EMAIL_HOST (“mail.euredomain.de”)
- 1x Secret Key (“super-sicherer-secret-key”):
Kein Passwort, aber wichtig fürs Backend. Am Besten lang und kompliziert. - Environment-Variablen des Containers “healthchecks-app”:
Ich habe hier quasi alle möglichen Dienste, mit denen man informiert werden kann, deaktiviert. Das könnt ihr natürlich ändern. Welche Variablen es gibt, findet ihr hier in der Doku von Healthchecks.
Anmerkung zum Backup-Container:
Ich habe hier als dritten Container – neben der eigentlichen Anwendung und dem DB-Container – noch einen Backup-Container hinzugefügt. Dieser macht automatisch ein Backup eurer Datenbank. Die Parameter zum Einstellen der Backups findet ihr hier.
4. Healthchecks starten
docker compose -f /opt/containers/healthchecks/docker-compose.yml up -d
5. Super-User einrichten
Damit ihr einen Admin-User habt, müsst ihr diesen über die Kommandozeile erstellen. Wechselt zunächst in das Verzeichnis:
cd /opt/containers/healthchecks
Gebt dann folgenden Befehl ein und wählt dann im folgenden Schritt euren Usernamen und euer Passwort:
docker compose run healthchecks-app /opt/healthchecks/manage.py createsuperuser
6. Healthchecks testen und einrichten
Ruft im Browser eure URL (“healthchecks.euredomain.de”) auf und loggt euch dort mit den zuvor gewählten Zugangsdaten ein.
Nun könnt ihr eure Checks einrichten. Die URL für den Check bzw. die ID findet ihr in der Übersicht. Falls ihr Fragen zu Healthchecks habt, dann werden diese sehr wahrscheinlich in der Doku beantwortet.
7. Runitor einrichten
Damit ihr z.B. von einem Cron-Job automatisch euer Skript starten und den Ping absetzen könnt, gibt es das Tool Runitor.
Damit kann man extrem einfach und kompakt beides in einer Zeile machen. Positiver Nebeneffekt: Ihr seht in Healthchecks direkt wenn euer Skript läuft und die Laufzeit wird dabei auch direkt noch gemessen. Auch etwaige Rückgabewerte oder Logs werden direkt mitgeschickt.
Wir installieren uns also Runitor:
wget https://github.com/bdd/runitor/releases/download/v0.10.1/runitor-v0.10.1-linux-amd64 -O runitor mv runitor /usr/local/bin/ chmod +x /usr/local/bin/runitor
Nun nutzen wir den bereits eingerichteten ersten Check in Healthchecks und probieren aus, ob alles klappt:
runitor -uuid f0d8fc16-e713-4bf8-9f83-0def8819b62e -api-url https://healthchecks.deinedomain.de/ping -- ifconfig
Wir rufen also lokal “ifconfig” auf und prüfen dann in der Healthchecks-UI im Browser, ob unser neuer Healthchecks-Server die Infos bekommen hat.
Wichtig hierbei ist die “uuid”, die wir immer aus der Web-Oberfläche von Healthchecks kopieren können. Die “api-url” bleibt immer konstant. Sie muss dort stehen, da sonst der Default-Server von Healthchecks genommen wird. Die URL kann wohl auch via Umgebungsvariable “HC_API_URL” gesetzt werden. Dies habe ich aber nicht getestet. Der eigentliche Skript-Aufruf kommt dann nach den beiden Strichen “–“. Die UUID oben ist eine zufällig generierte. Ihr müsst sie natürlich mit eurer UUID tauschen.
Nach dem gleichen Muster können jetzt entsprechende Cron-Jobs abgeändert werden und wir haben immer im Überblick was unsere Skripte so machen.
8. Quellen
https://healthchecks.io/docs/self_hosted_docker/
https://github.com/tiredofit/docker-db-backup
https://github.com/bdd/runitor
Danke für die Anleitung, gerade durch gegangen.
In den logs ist mir aber aufgefallen das die db nicht ganz glücklich ist mit folgender Fehlermeldung:
Der Fehler ist bei dem Aufruf des healthchecks.
Einfach die Zeile 69 von
austauschen zu
oder wer parameter mag
Es wäre schön, wenn Anleitungen, die nicht mehr funktionieren, korrigiert werden.
Oder aber im Text ganz oben der Hinweis erfolgt.
Besser noch: nicht funktionierende Anleitungen löschen, wenn der Ersteller diese nicht mehr überarbeiten kann oder möchte.
Hallo, bei mir startet der DB-Container nicht(wartet). Kann es sein, dass der healthcheck nicht funktioniert?
Gruß Lars