37 lines
1.4 KiB
Docker
37 lines
1.4 KiB
Docker
# CluPilot Terminal-Bruecke: loest ein Ticket ein, baut SSH auf und verbindet
|
|
# PTY und WebSocket. Sonst nichts — kein Laravel, keine Datenbank.
|
|
FROM python:3.12-slim
|
|
|
|
ENV PYTHONDONTWRITEBYTECODE=1 \
|
|
PYTHONUNBUFFERED=1
|
|
|
|
WORKDIR /app
|
|
|
|
COPY requirements.txt .
|
|
RUN pip install --no-cache-dir -r requirements.txt
|
|
|
|
COPY bridge.py .
|
|
|
|
# 8082, nicht 8081: dieser Container teilt sich den Netz-Namensraum mit
|
|
# queue-provisioning (siehe docker-compose.yml), und dort lauscht der
|
|
# VPN-Gateway bereits auf 8081 (VPN_HEALTH_PORT). Zwei Zuhoerer auf demselben
|
|
# Port im selben Namensraum bedeuten, dass der zweite beim Start stirbt —
|
|
# unter `restart: unless-stopped` in einer Schleife, die niemand sofort liest.
|
|
ENV PORT=8082
|
|
|
|
# Unprivilegiert. Die Bruecke oeffnet nur eine TCP-Verbindung nach aussen und
|
|
# einen Zuhoerer ueber 1024; root braucht sie fuer nichts davon.
|
|
RUN useradd --create-home --uid 10001 bridge
|
|
USER bridge
|
|
|
|
EXPOSE 8082
|
|
|
|
# Ueber /healthz, nicht ueber einen blossen Verbindungsversuch: ein TCP-Socket,
|
|
# der sofort wieder zugeht, ist fuer die websockets-Bibliothek ein
|
|
# abgebrochener Handschlag — alle 30 Sekunden ein Fehler mit Stapelabzug im Log
|
|
# dieses Dienstes. Siehe process_request() in bridge.py.
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
CMD python -c "import os,urllib.request; urllib.request.urlopen('http://127.0.0.1:'+os.environ.get('PORT','8082')+'/healthz', timeout=4).read()"
|
|
|
|
CMD ["python", "bridge.py"]
|