diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e557a44 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +.venv/ +.git/ +.idea/ +.pytest_cache/ +.ruff_cache/ +*.md +*.pyc +__pycache__/ +.env diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..4332b87 --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +PROVIDER_URL=http://localhost:8000/v1 +PROVIDER_API_KEY=your-api-key +PROVIDER_MODEL=gpt-4 diff --git a/.mk/inside.mk b/.mk/inside.mk new file mode 100644 index 0000000..a9ddb2f --- /dev/null +++ b/.mk/inside.mk @@ -0,0 +1,7 @@ +.PHONY: uvicorn-dev uvicorn-prod + +uvicorn-dev: + uvicorn src.main:app --host 0.0.0.0 --port 8000 --reload + +uvicorn-prod: + uvicorn src.main:app --host 0.0.0.0 --port 8000 diff --git a/.mk/outside.mk b/.mk/outside.mk new file mode 100644 index 0000000..92dc6c2 --- /dev/null +++ b/.mk/outside.mk @@ -0,0 +1,7 @@ +.PHONY: up-dev up-prod + +up-dev: + docker compose --profile dev up $(ARGS) + +up-prod: + docker compose --profile prod up $(ARGS) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e090658 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,52 @@ +FROM python:3.14-slim as base + +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 + +WORKDIR /app +RUN apt update && apt install make -y + +FROM base as builder + +RUN apt install git -y +RUN pip install uv + +COPY pyproject.toml uv.lock ./ +RUN uv sync --frozen --no-install-project --no-dev +RUN uv pip install git+https://git.lambda.coredump.ru/platform/agent_api.git + +FROM base as production + +RUN useradd --create-home --shell /bin/bash appuser + +COPY --from=builder /app/.venv /app/.venv +ENV PATH="/app/.venv/bin:$PATH" + +COPY src/ /app/src/ +COPY Makefile ./ +COPY .mk/ ./.mk/ + +USER appuser + +EXPOSE 8000 + +CMD ["make", "uvicorn-prod"] + +FROM base as development + +RUN pip install uv + +COPY pyproject.toml uv.lock ./ +RUN uv sync --frozen --no-install-project + +COPY --from=agent_api . /agent_api/ +RUN uv pip install -e /agent_api/ + +ENV PATH="/app/.venv/bin:$PATH" + +COPY Makefile ./ +COPY .mk/ ./.mk/ + +EXPOSE 8000 + +CMD ["make", "uvicorn-dev"] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d011b17 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +.DEFAULT_GOAL := help + +-include .mk/outside.mk +-include .mk/inside.mk + +help: + @echo "Outside commands:" + @echo " make up-dev - build and run dev container" + @echo " make up-prod - build and run prod container" + @echo "" + @echo "Inside container:" + @echo " make uvicorn-dev - run with hot reload" + @echo " make uvicorn-prod - run production" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..32ec3ae --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,26 @@ +services: + agent: + image: mrkan0/lambda-agent:latest + ports: + - "8000:8000" + env_file: + - .env + restart: unless-stopped + profiles: + - prod + + agent-dev: + build: + context: . + target: development + additional_contexts: + agent_api: ${AGENT_API_PATH} + volumes: + - ./src:/app/src + - ${AGENT_API_PATH}:/agent-api/ + ports: + - "8000:8000" + env_file: + - .env + profiles: + - dev