FROM python:3.12-slim # Docker CLI + compose plugin are required for lifecycle commands. # git + openssh-client are required for deploying stacks from a Git repository # (services/git_service.py); ssh only for repositories reached over SSH. RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates curl gnupg git openssh-client \ && install -m 0755 -d /etc/apt/keyrings \ && curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc \ && chmod a+r /etc/apt/keyrings/docker.asc \ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo $VERSION_CODENAME) stable" > /etc/apt/sources.list.d/docker.list \ && apt-get update \ && apt-get install -y --no-install-recommends docker-ce-cli docker-compose-plugin \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . ENV STACKS_DIR=/opt/stacks \ DATA_DIR=/data \ PORT=5008 EXPOSE 5008 HEALTHCHECK --interval=30s --timeout=5s --start-period=10s \ CMD curl -fsS http://localhost:5008/api/health || exit 1 # --proxy-headers: nginx setzt X-Forwarded-For, ohne dieses Flag ignoriert # uvicorn den Header und request.client.host ist fuer JEDE Anfrage die IP des # Frontend-Containers -- was das Login-Rate-Limit global statt pro IP wirken # laesst und die IP-Spalte im Audit-Log wertlos macht. # # forwarded-allow-ips=* vertraut dem Header von jedem Absender. Das ist hier # richtig, weil der Backend-Port nur im Docker-Netz erreichbar ist (siehe # "expose" statt "ports" in docker-compose.yml). Wer 5008 direkt nach aussen # gibt, muss den Wert auf die IP des eigenen Proxys einschraenken -- sonst # kann ein Client seine eigene Herkunfts-IP faelschen. CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "5008", \ "--proxy-headers", "--forwarded-allow-ips", "*"]