FROM python:3.12-slim

# Docker CLI + compose plugin are required for lifecycle commands.
RUN apt-get update \
    && apt-get install -y --no-install-recommends ca-certificates curl gnupg \
    && 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", "*"]
