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