add: Docker support with multi-stage build and Compose

This commit is contained in:
Petar Zivkovic 2026-02-06 22:54:28 +01:00
parent c964a3fadd
commit d60bb77bf0
10 changed files with 229 additions and 4 deletions

28
.dockerignore Normal file
View File

@ -0,0 +1,28 @@
.git
.gitignore
.gitattributes
*.pyc
.DS_Store
Thumbs.db
.idea/
.vscode/
__pycache__/
.venv/
env/
venv/
.uv-cache
.env
.env.*
node_modules/
WareHouse/
data/
temp/
logs
.aider*
/frontend
README*
compose.yml
Dockerfile

7
.env.docker Normal file
View File

@ -0,0 +1,7 @@
BACKEND_BIND=0.0.0.0
FRONTEND_HOST=0.0.0.0
FRONTEND_PORT=5173
# Frontend points to the backend service name and exposed port
VITE_API_BASE_URL=http://backend:6400

2
.gitignore vendored
View File

@ -26,4 +26,4 @@ logs/
node_modules/ node_modules/
data/ data/
temp/ temp/
WareHouse/ WareHouse/

63
Dockerfile Normal file
View File

@ -0,0 +1,63 @@
# ---- Builder: install deps with compilers and uv ----
FROM python:3.12-slim AS builder
ARG DEBIAN_FRONTEND=noninteractive
WORKDIR /app
# System deps required to build Python packages
RUN apt-get update && apt-get install -y --no-install-recommends \
pkg-config \
build-essential \
python3-dev \
libcairo2-dev \
&& rm -rf /var/lib/apt/lists/*
# Install uv just for dependency resolution/install
RUN pip install --no-cache-dir uv
# Install the project virtualenv outside /app so bind-mounts don't hide it
ENV UV_PROJECT_ENVIRONMENT=/opt/venv
# Copy dependency files first to maximize cache
COPY pyproject.toml ./
# If you have a lock file, uncomment the next line for reproducible builds:
# COPY uv.lock ./
# Create the project virtualenv and install deps
RUN uv sync --no-cache
# ---- Runtime: minimal image with only runtime libs + app ----
FROM python:3.12-slim AS runtime
ARG DEBIAN_FRONTEND=noninteractive
ARG BACKEND_BIND=0.0.0.0
WORKDIR /app
# Install only runtime system libraries (no compilers)
# Keep libcairo if your deps need it; remove if unnecessary
RUN apt-get update && apt-get install -y --no-install-recommends \
libcairo2 \
&& rm -rf /var/lib/apt/lists/*
# Copy the prebuilt virtualenv from the builder
COPY --from=builder /opt/venv /opt/venv
# Copy the rest of the application code
COPY . .
# Use the venv Python by default and keep Python output unbuffered.
# Bake default bind/port into the image; can be overridden at runtime.
ENV PATH="/opt/venv/bin:${PATH}" \
PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
BACKEND_BIND=${BACKEND_BIND}
# Drop privileges
RUN useradd -m appuser && chown -R appuser:appuser /app
USER appuser
# EXPOSE is informational; compose controls published ports
EXPOSE 6400
# Command to run the backend server, parameterized by env
CMD ["sh", "-c", "python server_main.py --port 6400 --host ${BACKEND_BIND:-0.0.0.0}"]

View File

@ -118,7 +118,7 @@ ChatDev 已从一个专门的软件开发多智能体系统演变为一个全面
cd frontend && npm install cd frontend && npm install
``` ```
### ⚡️ 运行应用 ### ⚡️ 运行应用(本地)
#### 使用 Makefile推荐 #### 使用 Makefile推荐
@ -171,6 +171,25 @@ make dev
检查所有 YAML 文件的语法与 schema 错误。 检查所有 YAML 文件的语法与 schema 错误。
### 🐳 使用 Docker 运行
你也可以通过 Docker Compose 运行整个应用。该方式可简化依赖管理,并提供一致的运行环境。
1. **前置条件**
* 已安装 [Docker](https://docs.docker.com/get-docker/) 和 [Docker Compose](https://docs.docker.com/compose/install/)。
* 请确保在项目根目录中存在用于配置 API Key 的 `.env` 文件。
2. **构建并运行**
```bash
# 在项目根目录执行
docker compose up --build
```
3. **访问地址**
* **后端**`http://localhost:6400`
* **前端**`http://localhost:5173`
> 服务在异常退出后会自动重启,本地文件的修改会同步映射到容器中,便于实时开发。
### 🔑 配置 ### 🔑 配置
* **环境变量**:在项目根目录创建一个 `.env` 文件。 * **环境变量**:在项目根目录创建一个 `.env` 文件。

View File

@ -131,7 +131,6 @@ See our paper in [Multi-Agent Collaboration via Evolving Orchestration](https://
### ⚡️ Run the Application ### ⚡️ Run the Application
#### Using Makefile (Recommended) #### Using Makefile (Recommended)
**Start both Backend and Frontent**: **Start both Backend and Frontent**:
@ -183,6 +182,24 @@ make dev
``` ```
Checks all YAML files for syntax and schema errors. Checks all YAML files for syntax and schema errors.
### 🐳 Run with Docker
Alternatively, you can run the entire application using Docker Compose. This method simplifies dependency management and provides a consistent environment.
1. **Prerequisites**:
* [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/) installed.
* Ensure you have a `.env` file in the project root for your API keys.
2. **Build and Run**:
```bash
# From the project root
docker compose up --build
```
3. **Access**:
* **Backend**: `http://localhost:6400`
* **Frontend**: `http://localhost:5173`
> The services will automatically restart if they crash, and local file changes will be reflected inside the containers for live development.
--- ---

33
compose.yml Normal file
View File

@ -0,0 +1,33 @@
services:
backend:
build:
context: .
dockerfile: Dockerfile
target: runtime
container_name: chatdev_backend
volumes:
- .:/app
ports:
- "6400:6400"
env_file:
- .env
- .env.docker
restart: unless-stopped
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
target: dev
container_name: chatdev_frontend
volumes:
- ./frontend:/app
- /app/node_modules
ports:
- "${FRONTEND_PORT:-5173}:5173"
env_file:
- .env
- .env.docker
depends_on:
- backend
restart: unless-stopped

25
frontend/.dockerignore Normal file
View File

@ -0,0 +1,25 @@
.git
.gitignore
.gitattributes
*.pyc
.DS_Store
Thumbs.db
.idea/
.vscode/
__pycache__/
.venv/
env/
venv/
.uv-cache
.env
.env.*
node_modules/
temp/
logs
.aider*
README*
compose.yml
Dockerfile

2
frontend/.gitignore vendored
View File

@ -7,7 +7,7 @@ yarn-error.log*
pnpm-debug.log* pnpm-debug.log*
lerna-debug.log* lerna-debug.log*
node_modules node_modules/
dist dist
dist-ssr dist-ssr
*.local *.local

33
frontend/Dockerfile Normal file
View File

@ -0,0 +1,33 @@
# ---- Dependencies: install node_modules once (cached) ----
FROM node:24-alpine AS deps
WORKDIR /app
COPY package*.json ./
# Prefer reproducible installs; fall back if no lockfile
RUN npm ci --no-audit --no-fund || npm install --no-audit --no-fund
# ---- Dev runtime: hot-reload server ----
FROM node:24-alpine AS dev
WORKDIR /app
ENV NODE_ENV=development
COPY --from=deps /app/node_modules /app/node_modules
COPY . .
EXPOSE 5173
CMD ["npm", "run", "dev", "--", "--host"]
# ---- Build: create production assets ----
FROM node:24-alpine AS build
WORKDIR /app
ENV NODE_ENV=production
ARG VITE_API_BASE_URL=http://backend:6400
ENV VITE_API_BASE_URL=""
COPY --from=deps /app/node_modules /app/node_modules
COPY . .
RUN npm run build
# ---- Prod runtime: serve static dist with nginx ----
FROM nginx:alpine AS prod
# For SPA deep links you might add a custom nginx.conf with index.html fallback.
# COPY frontend/nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]