From 1e7013269e98951e9676d4c1052512bdc6902a9a Mon Sep 17 00:00:00 2001 From: Robert Rapp Date: Thu, 15 Jan 2026 03:47:06 +0100 Subject: [PATCH] Add example env and healthcheck --- Dockerfile | 5 ++++- example.env | 19 +++++++++++++++++++ healthcheck.sh | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 example.env create mode 100644 healthcheck.sh diff --git a/Dockerfile b/Dockerfile index 7936626..9f3c6fc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,12 +5,15 @@ WORKDIR /app COPY update.py /app/update.py COPY entrypoint.sh /app/entrypoint.sh +COPY healthcheck.sh /app/healthcheck.sh RUN pip install --no-cache-dir requests==2.32.3 \ - && chmod +x /app/entrypoint.sh + && chmod +x /app/entrypoint.sh /app/healthcheck.sh ENV OUT_DIR=/data VOLUME ["/data"] ENTRYPOINT ["/app/entrypoint.sh"] +HEALTHCHECK --interval=5m --timeout=10s --start-period=30s --retries=3 \ + CMD /app/healthcheck.sh diff --git a/example.env b/example.env new file mode 100644 index 0000000..866b001 --- /dev/null +++ b/example.env @@ -0,0 +1,19 @@ +# Required +MAXMIND_LICENSE_KEY= + +# Optional (helps with rate limits) +PDB_API_KEY= + +# Output data location shared with the detection service +OUT_DIR=/data + +# PeeringDB settings +PDB_BASE=https://www.peeringdb.com +PDB_INFO_TYPE=Educational/Research +PDB_LIMIT=250 + +# HTTP settings +HTTP_TIMEOUT=30 + +# Update interval (seconds, default 30 days) +INTERVAL_SECONDS=2592000 diff --git a/healthcheck.sh b/healthcheck.sh new file mode 100644 index 0000000..97a7601 --- /dev/null +++ b/healthcheck.sh @@ -0,0 +1,49 @@ +#!/bin/sh +set -eu + +OUT_DIR="${OUT_DIR:-/data}" +PDB_BASE="${PDB_BASE:-https://www.peeringdb.com}" +INFO_TYPE="${PDB_INFO_TYPE:-Educational/Research}" + +if [ -z "${MAXMIND_LICENSE_KEY:-}" ]; then + echo "[health] MAXMIND_LICENSE_KEY missing" >&2 + exit 1 +fi + +if [ ! -d "${OUT_DIR}" ]; then + echo "[health] OUT_DIR missing: ${OUT_DIR}" >&2 + exit 1 +fi + +if [ ! -s "${OUT_DIR}/GeoLite2-ASN.mmdb" ]; then + echo "[health] GeoLite2-ASN.mmdb missing in ${OUT_DIR}" >&2 + exit 1 +fi + +if [ ! -s "${OUT_DIR}/nren_asns.txt" ]; then + echo "[health] nren_asns.txt missing in ${OUT_DIR}" >&2 + exit 1 +fi + +mm_url="https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-ASN&license_key=${MAXMIND_LICENSE_KEY}&suffix=tar.gz" +mm_code="$(curl -fsS -o /dev/null -w "%{http_code}" "${mm_url}" || true)" +if [ "${mm_code}" != "200" ]; then + echo "[health] MaxMind download not accessible (status ${mm_code})" >&2 + exit 1 +fi + +pdb_code="000" +pdb_url="${PDB_BASE}/api/net" +pdb_args="--get --data-urlencode info_type=${INFO_TYPE} --data-urlencode limit=1 --data-urlencode skip=0 --data-urlencode fields=asn,status,info_type" +if [ -n "${PDB_API_KEY:-}" ]; then + pdb_code="$(curl -fsS -o /dev/null -w "%{http_code}" -H "Accept: application/json" -H "Authorization: Api-Key ${PDB_API_KEY}" ${pdb_args} "${pdb_url}" || true)" +else + pdb_code="$(curl -fsS -o /dev/null -w "%{http_code}" -H "Accept: application/json" ${pdb_args} "${pdb_url}" || true)" +fi + +if [ "${pdb_code}" != "200" ] && [ "${pdb_code}" != "429" ]; then + echo "[health] PeeringDB not accessible (status ${pdb_code})" >&2 + exit 1 +fi + +exit 0