Files
javadandCursor b93ecf1691 Initial commit of the Kamidso API.
Keep source, config, and deploy files. Leave runtime data, uploads, and logs out of git.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-10 13:43:09 +03:30

104 lines
3.0 KiB
Docker

# Kamidso API. Build context is backend/ (Coolify base directory /backend,
# and the backend service in docker-compose.yml).
#
# Cache contract:
# 1. Base image and apt packages
# 2. requirements.txt -> pip install into /opt/venv
# 3. Application source
# A Python edit must leave the pip layer CACHED. A requirements.txt edit must not.
#
# The app is not installed as a distribution. `python -m kamidso.cli` imports
# the tree from /app, so source changes stay in the last COPY.
# requirements.txt is the install input (same file Liara uses).
# pyproject.toml is for local tooling and is not the image install input.
#
# Mirrors are build args. Empty values keep Debian and PyPI.
ARG PYTHON_IMAGE=python:3.12-slim-bookworm
FROM ${PYTHON_IMAGE} AS builder
# Build-only proxy. Do not copy these into an ENV; the running API must not
# use a global proxy. OpenRouter goes through OPENROUTER_PROXY_URL at runtime.
ARG HTTP_PROXY
ARG HTTPS_PROXY
ARG http_proxy
ARG https_proxy
ARG NO_PROXY
ARG no_proxy
ARG DEBIAN_MIRROR
ARG DEBIAN_SECURITY_MIRROR
ENV PIP_DISABLE_PIP_VERSION_CHECK=1 \
PYTHONDONTWRITEBYTECODE=1
COPY docker/apt-mirror.py /tmp/apt-mirror.py
RUN python /tmp/apt-mirror.py \
&& apt-get update && apt-get install -y --no-install-recommends \
build-essential \
gcc \
g++ \
git \
pkg-config \
libffi-dev \
libssl-dev \
&& rm -rf /var/lib/apt/lists/*
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH" \
VIRTUAL_ENV=/opt/venv
WORKDIR /build
COPY requirements.txt .
# Empty keeps https://pypi.org/simple. Set in Coolify for an Iran mirror.
# Defaults are empty strings so `set -u` does not fail when the arg is omitted.
ARG PIP_INDEX_URL=
ARG PIP_TRUSTED_HOST=
RUN --mount=type=cache,target=/root/.cache/pip \
set -eu; \
index_args=""; \
if [ -n "${PIP_INDEX_URL}" ]; then index_args="--index-url ${PIP_INDEX_URL}"; fi; \
trust_args=""; \
if [ -n "${PIP_TRUSTED_HOST}" ]; then trust_args="--trusted-host ${PIP_TRUSTED_HOST}"; fi; \
python -m pip install --upgrade pip $index_args $trust_args \
&& python -m pip install $index_args $trust_args -r requirements.txt
FROM ${PYTHON_IMAGE}
ARG DEBIAN_MIRROR
ARG DEBIAN_SECURITY_MIRROR
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
PYTHONUTF8=1 \
PATH="/opt/venv/bin:$PATH" \
VIRTUAL_ENV=/opt/venv \
KAMIDSO_HOST=0.0.0.0 \
KAMIDSO_PORT=5670
COPY docker/apt-mirror.py /tmp/apt-mirror.py
RUN python /tmp/apt-mirror.py \
&& apt-get update && apt-get install -y --no-install-recommends \
curl \
git \
graphviz \
libgomp1 \
libgfortran5 \
&& rm -rf /var/lib/apt/lists/* \
&& rm -f /tmp/apt-mirror.py
COPY --from=builder /opt/venv /opt/venv
WORKDIR /app
COPY . .
EXPOSE 5670
HEALTHCHECK --interval=20s --timeout=5s --start-period=180s --retries=10 \
CMD curl -fsS http://127.0.0.1:5670/health/live || exit 1
CMD ["python", "-m", "kamidso.cli", "serve", "--host", "0.0.0.0", "--port", "5670"]