# Der Tunnel, und sonst nichts.
#
# Ein eigenes, winziges Abbild ist der ganze Sinn dieses Containers. wg0 lebte
# bisher im Container des Provisionierungs-Arbeiters, also in `clupilot-app`,
# und das wird bei fast jeder Freigabe neu gebaut. Ein neu gebauter Container
# bekommt eine neue Adresse im Compose-Netz, die Weiterleitung für den
# WireGuard-Port wird neu geschrieben, und jede bestehende Sitzung reisst ab.
# Der Tunnel hing damit am Veröffentlichungstakt der Anwendung — und daran, dass
# ein Warteschlangen-Arbeiter nicht abstürzt.
#
# Dieses Abbild aendert sich fast nie. Damit fasst `docker compose up -d` den
# Container bei einem gewoehnlichen Update nicht mehr an, und der Tunnel steht
# einfach.
#
# Alpine mit fester Nebenversion, nicht `alpine:latest`: ein Abbild, das sich
# unter der Hand erneuert, ist genau das, was hier nicht passieren soll.
FROM alpine:3.20

# wireguard-tools bringt `wg` und `wg-quick`. wg-quick ist ein Bash-Skript und
# ruft `ip` auf — beides muss mit. iptables ist nicht für uns, sondern für den
# Fall, dass eine wg0.conf eines Tages PostUp-Regeln mitbringt: dann scheitert
# der Start sonst an einem fehlenden Programm, und das faellt erst im Betrieb auf.
RUN apk add --no-cache \
        wireguard-tools \
        bash \
        iproute2 \
        iptables

COPY entrypoint.sh /usr/local/bin/vpn-hub
RUN chmod +x /usr/local/bin/vpn-hub

# Gesund, wenn wg0 steht — oder wenn es (noch) gar keine Konfiguration gibt.
# Eine Installation ohne eingerichteten Tunnel ist kein Fehlerzustand, und ein
# dauerhaft „unhealthy" gemeldeter Container waere eine Warnung, die niemand
# mehr liest.
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
    CMD sh -c '[ -f /etc/wireguard/wg0.conf ] || exit 0; wg show wg0 >/dev/null 2>&1'

ENTRYPOINT ["/usr/local/bin/vpn-hub"]
