diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..50c46b1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,35 @@ +FROM python:3.13-slim AS build + +ENV UV_LINK_MODE=copy +WORKDIR /app + +RUN python -m pip install --no-cache-dir uv + +COPY pyproject.toml uv.lock ./ +RUN uv sync --locked --no-dev --no-install-project + + +FROM python:3.13-slim AS run + +ENV PATH="/app/.venv/bin:${PATH}" \ + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + VIRTUAL_ENV=/app/.venv + +WORKDIR /app + +RUN useradd --system --create-home --shell /usr/sbin/nologin appuser + +COPY --from=build --chown=appuser:appuser /app/.venv /app/.venv +COPY --chown=appuser:appuser adapter /app/adapter +COPY --chown=appuser:appuser config /app/config +COPY --chown=appuser:appuser domain /app/domain +COPY --chown=appuser:appuser repository /app/repository +COPY --chown=appuser:appuser usecase /app/usecase +COPY --chown=appuser:appuser main.py /app/main.py + +USER appuser + +EXPOSE 8123 + +CMD ["python", "main.py"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..86e1bbb --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,32 @@ +services: + app: + build: + context: . + dockerfile: Dockerfile + target: run + depends_on: + - otel-collector + environment: + APP_API_TOKEN: ${APP_API_TOKEN:?APP_API_TOKEN is required} + APP_SIGNING_KEY: ${APP_SIGNING_KEY:?APP_SIGNING_KEY is required} + APP_ENV: docker + APP_HTTP_HOST: 0.0.0.0 + APP_HTTP_PORT: '8123' + APP_LOGGING_OUTPUT: otel + APP_METRICS_ENABLED: 'true' + APP_TRACING_ENABLED: 'true' + APP_OTEL_LOGS_ENDPOINT: http://otel-collector:4318/v1/logs + APP_OTEL_METRICS_ENDPOINT: http://otel-collector:4318/v1/metrics + APP_OTEL_TRACES_ENDPOINT: http://otel-collector:4318/v1/traces + ports: + - '127.0.0.1:8123:8123' + + otel-collector: + image: grafana/otel-lgtm:latest + ports: + - '127.0.0.1:3000:3000' + volumes: + - lgtm-data:/data + +volumes: + lgtm-data: