CluPilotCloud/docker/vpn-hub/entrypoint.sh

51 lines
2.0 KiB
Bash

#!/bin/sh
# Der Prozess 1 des Tunnel-Containers.
#
# Er zieht wg0 hoch und tut danach nichts mehr. Genau das ist die Aufgabe: der
# Netz-Namensraum dieses Containers ist das, worin wg0, der Provisionierungs-
# Arbeiter, die Terminal-Bruecke, der interne DNS und das interne Gateway
# zusammen leben. Er darf nur enden, wenn Docker ihn beendet.
#
# Vorher stand hier — im Container des Arbeiters — `exec php artisan queue:work`.
# Damit hing der Namensraum am Leben eines PHP-Prozesses: ein Zeitueberlauf, ein
# fataler Fehler, ein Speicherlimit, und jede WireGuard-Sitzung riss ab.
set -u
CONF=/etc/wireguard/wg0.conf
# Ohne Konfiguration kein Tunnel — aber sehr wohl ein laufender Container. Sonst
# koennte eine Installation, in der der Betreiber den Tunnel noch gar nicht
# eingerichtet hat, den halben Stapel nicht starten: vier Dienste haengen an
# diesem Namensraum und kommen ohne ihn nicht hoch.
if [ -f "$CONF" ]; then
# `|| true`: liegt das Interface aus einem frueheren Leben noch da, ist das
# kein Grund, den Container sterben zu lassen. Die Zeile darunter sagt in
# jedem Fall, was Sache ist.
wg-quick up wg0 || true
if wg show wg0 >/dev/null 2>&1; then
echo "[vpn-hub] wg0 steht — $(wg show wg0 peers | grep -c .) Zugaenge geladen"
else
echo "[vpn-hub] WARNUNG: wg0 kam nicht hoch. $CONF pruefen." >&2
fi
else
echo "[vpn-hub] Kein $CONF — der Tunnel ist auf diesem Server noch nicht eingerichtet."
fi
# Sauber abbauen, wenn Docker den Container beendet. Ohne das laeuft `docker
# compose stop` in seine Zeitueberschreitung und schlaegt mit SIGKILL zu.
stop() {
echo "[vpn-hub] Beende — wg0 wird abgebaut."
wg-quick down wg0 2>/dev/null || true
exit 0
}
trap stop TERM INT
# Warten, bis jemand kommt. `sleep` im Hintergrund plus `wait`, nicht `sleep`
# im Vordergrund: ein Signal erreicht die Shell nur, wenn sie gerade auf `wait`
# steht — sonst kaeme das `trap` oben erst nach Ablauf des Schlafs zum Zug.
while true; do
sleep 86400 &
wait $!
done