CluPilotCloud/docker/terminal/Dockerfile

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"]