diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..c82e37a4 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +**/__pycache__ +**/venv +**/.venv +**/.python-version +**/.git +**/.github diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 00000000..62e254bf --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,77 @@ +# Select the image to build based on SERVER_TYPE, defaulting to fastapi_server, or docker-compose build args +ARG SERVER_TYPE=fastapi_server + +# === Python environment from uv === +FROM python:3.10-slim AS builder +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ + +# Used for build Python packages +RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources \ + && apt-get update \ + && apt-get install -y --no-install-recommends gcc python3-dev \ + && rm -rf /var/lib/apt/lists/* + +# Configure uv environment +ENV UV_COMPILE_BYTECODE=1 \ + UV_NO_CACHE=1 \ + UV_LINK_MODE=copy \ + UV_PROJECT_ENVIRONMENT=/usr/local \ + UV_INDEX=https://mirrors.aliyun.com/pypi/simple + +# Install dependencies with cache +RUN --mount=type=cache,target=/root/.cache/uv \ + --mount=type=bind,source=backend/uv.lock,target=uv.lock \ + --mount=type=bind,source=backend/pyproject.toml,target=pyproject.toml \ + uv sync --frozen --no-default-groups --group server + +# === Runtime base server image === +FROM python:3.10-slim AS base_server + +SHELL ["/bin/bash", "-c"] + +RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources \ + && apt-get update \ + && apt-get install -y --no-install-recommends supervisor \ + && rm -rf /var/lib/apt/lists/* + +COPY . /fba + +COPY --from=builder /usr/local /usr/local + +# Install plugin dependencies +WORKDIR /fba +ENV PYTHONPATH=/fba +RUN python3 backend/scripts/init_plugin.py + +# === FastPAI server iamge === +FROM base_server AS fastapi_server + +WORKDIR /fba + +COPY deploy/backend/supervisord.conf /etc/supervisor/supervisord.conf +COPY deploy/backend/fastapi_server.conf /etc/supervisor/conf.d/ + +RUN mkdir -p /var/log/fastapi_server + +EXPOSE 8001 + +CMD ["uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port","8000"] + +# === Celery server iamge === +FROM base_server AS celery + +WORKDIR /fba/backend/ + +COPY deploy/backend/supervisord.conf /etc/supervisor/supervisord.conf +COPY deploy/backend/celery.conf /etc/supervisor/conf.d/ + +RUN mkdir -p /var/log/celery + +RUN chmod +x celery-start.sh + +EXPOSE 8555 + +CMD ["./celery-start.sh"] + +# Build image +FROM ${SERVER_TYPE} diff --git a/backend/backend.dockerfile b/backend/backend.dockerfile deleted file mode 100644 index 61c3473b..00000000 --- a/backend/backend.dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -FROM python:3.10-slim - -SHELL ["/bin/bash", "-c"] - -WORKDIR /fba - -COPY . . - -RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources \ - && sed -i 's|security.debian.org/debian-security|mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list.d/debian.sources - -RUN apt-get update \ - && apt-get install -y --no-install-recommends gcc python3-dev supervisor \ - && rm -rf /var/lib/apt/lists/* \ - # 某些包可能存在同步不及时导致安装失败的情况,可更改为官方源:https://pypi.org/simple - && pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple \ - && pip install -r backend/requirements.txt -i https://mirrors.aliyun.com/pypi/simple \ - && pip install gunicorn aio_pika wait-for-it -i https://mirrors.aliyun.com/pypi/simple - -ENV TZ="Asia/Shanghai" - -RUN mkdir -p /var/log/fastapi_server - -COPY deploy/backend/supervisord.conf /etc/supervisor/supervisord.conf - -COPY deploy/backend/fastapi_server.conf /etc/supervisor/conf.d/ - -EXPOSE 8001 - -CMD ["uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/backend/celery.dockerfile b/backend/celery.dockerfile deleted file mode 100644 index 616e9d72..00000000 --- a/backend/celery.dockerfile +++ /dev/null @@ -1,34 +0,0 @@ -FROM python:3.10-slim - -SHELL ["/bin/bash", "-c"] - -WORKDIR /fba - -COPY . . - -RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources \ - && sed -i 's|security.debian.org/debian-security|mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list.d/debian.sources - -RUN apt-get update \ - && apt-get install -y --no-install-recommends gcc python3-dev supervisor \ - && rm -rf /var/lib/apt/lists/* \ - # 某些包可能存在同步不及时导致安装失败的情况,可更改为官方源:https://pypi.org/simple - && pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple \ - && pip install -r backend/requirements.txt -i https://mirrors.aliyun.com/pypi/simple \ - && pip install aio_pika wait-for-it -i https://mirrors.aliyun.com/pypi/simple - -ENV TZ="Asia/Shanghai" - -RUN mkdir -p /var/log/celery - -COPY deploy/backend/supervisord.conf /etc/supervisor/supervisord.conf - -COPY deploy/backend/celery.conf /etc/supervisor/conf.d/ - -WORKDIR /fba/backend/ - -RUN chmod +x celery-start.sh - -EXPOSE 8555 - -CMD ["./celery-start.sh"] diff --git a/backend/pyproject.toml b/backend/pyproject.toml index afe7cf3a..473a1f8e 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -61,7 +61,7 @@ lint = [ ] server = [ "gunicorn==21.2.0", - "aio_pika==9.4.3", + "aio-pika==9.4.3", "wait-for-it>=2.2.2", ] diff --git a/backend/uv.lock b/backend/uv.lock index d2dd2b49..790b4c2e 100644 --- a/backend/uv.lock +++ b/backend/uv.lock @@ -1,4 +1,5 @@ version = 1 +revision = 1 requires-python = ">=3.10, <3.13" [[package]] diff --git a/deploy/backend/docker-compose/docker-compose.yml b/deploy/backend/docker-compose/docker-compose.yml index fed4a8ab..378431b6 100644 --- a/deploy/backend/docker-compose/docker-compose.yml +++ b/deploy/backend/docker-compose/docker-compose.yml @@ -2,7 +2,7 @@ services: fba_server: build: context: ../../../ - dockerfile: backend/backend.dockerfile + dockerfile: backend/Dockerfile image: fba_server:latest container_name: fba_server restart: always @@ -11,6 +11,7 @@ services: - fba_redis - fba_celery volumes: + - .env.server:/fba/backend/.env - fba_static:/fba/backend/app/static networks: - fba_network @@ -23,7 +24,7 @@ services: supervisorctl restart fba_mysql: - image: mysql:8.0.29 + image: mysql:8.0.41 ports: - "${DOCKER_MYSQL_MAP_PORT:-3306}:3306" container_name: fba_mysql @@ -42,23 +43,23 @@ services: --collation-server=utf8mb4_general_ci --lower_case_table_names=1 - # fba_postgres: - # image: postgres:16 - # ports: - # - "${DOCKER_POSTGRES_MAP_PORT:-5432}:5432" - # container_name: fba_postgres - # restart: always - # environment: - # POSTGRES_DB: fba - # POSTGRES_PASSWORD: 123456 - # TZ: Asia/Shanghai - # volumes: - # - fba_postgres:/var/lib/postgresql/data - # networks: - # - fba_network +# fba_postgres: +# image: postgres:16 +# ports: +# - "${DOCKER_POSTGRES_MAP_PORT:-5432}:5432" +# container_name: fba_postgres +# restart: always +# environment: +# POSTGRES_DB: fba +# POSTGRES_PASSWORD: 123456 +# TZ: Asia/Shanghai +# volumes: +# - fba_postgres:/var/lib/postgresql/data +# networks: +# - fba_network fba_redis: - image: redis:6.2.7 + image: redis ports: - "${DOCKER_REDIS_MAP_PORT:-6379}:6379" container_name: fba_redis @@ -66,7 +67,7 @@ services: environment: - TZ=Asia/Shanghai volumes: - - fba_redis:/var/lib/redis + - fba_redis:/usr/local/etc/redis networks: - fba_network @@ -85,32 +86,32 @@ services: networks: - fba_network - # fba_ui: - # build: - # context: /root/fastapi_best_architecture_ui - # dockerfile: Dockerfile - # image: fba_ui:latest - # ports: - # - "80:80" - # - "443:443" - # container_name: fba_ui - # restart: always - # depends_on: - # - fba_server - # command: - # - nginx - # - -g - # - daemon off; - # volumes: - # # - local_ssl_pem_path:/etc/ssl/xxx.pem - # # - local_ssl_key_path:/etc/ssl/xxx.key - # - fba_static:/www/fba_server/backend/static - # networks: - # - fba_network +# fba_ui: +# build: +# context: /root/fastapi_best_architecture_ui +# dockerfile: Dockerfile +# image: fba_ui:latest +# ports: +# - "80:80" +# - "443:443" +# container_name: fba_ui +# restart: always +# depends_on: +# - fba_server +# command: +# - nginx +# - -g +# - daemon off; +# volumes: +# # - local_ssl_pem_path:/etc/ssl/xxx.pem +# # - local_ssl_key_path:/etc/ssl/xxx.key +# - fba_static:/www/fba_server/backend/static +# networks: +# - fba_network fba_rabbitmq: hostname: fba_rabbitmq - image: rabbitmq:3.12.7 + image: rabbitmq:3.13.7 ports: - "15672:15672" - "5672:5672" @@ -127,7 +128,9 @@ services: fba_celery: build: context: ../../../ - dockerfile: backend/celery.dockerfile + dockerfile: backend/Dockerfile + args: + - SERVER_TYPE=celery image: fba_celery:latest ports: - "8555:8555"