From f34538e3b0862efebc26db8acf81229dd980ce9e Mon Sep 17 00:00:00 2001 From: zhi Date: Fri, 6 Mar 2026 13:06:27 +0000 Subject: [PATCH] feat: no-nginx frontend, host nginx config, configurable ports - Frontend: remove nginx, use serve for static files - Frontend: add Projects/Milestones/Notifications pages - Frontend: fix auth endpoint to match backend (/auth/token) - docker-compose: configurable ports via env vars, reduce frontend resources - Add nginx-host.conf.example for host-level reverse proxy - Add .env.example - Update README with deployment architecture --- .env.example | 15 +++++++++++++ HarborForge.Frontend | 2 +- README.md | 47 +++++++++++++++++++++++++++++++++++------ docker-compose.yml | 40 +++++++++++++---------------------- nginx-host.conf.example | 26 +++++++++++++++++++++++ 5 files changed, 97 insertions(+), 33 deletions(-) create mode 100644 .env.example create mode 100644 nginx-host.conf.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..71c5f7f --- /dev/null +++ b/.env.example @@ -0,0 +1,15 @@ +# MySQL +MYSQL_ROOT_PASSWORD=harborforge_root +MYSQL_DATABASE=harborforge +MYSQL_USER=harborforge +MYSQL_PASSWORD=harborforge_pass +MYSQL_PORT=3306 + +# Backend +SECRET_KEY=change_me_in_production +LOG_LEVEL=INFO +BACKEND_PORT=8000 + +# Frontend +FRONTEND_PORT=3000 +VITE_API_BASE=/api diff --git a/HarborForge.Frontend b/HarborForge.Frontend index 853594f..54d4c43 160000 --- a/HarborForge.Frontend +++ b/HarborForge.Frontend @@ -1 +1 @@ -Subproject commit 853594f4470d3d84ade3111ab52b5605e7b70878 +Subproject commit 54d4c4379a017571d8ecdb8959a30a70879df84a diff --git a/README.md b/README.md index cd66537..0038ae0 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,10 @@ Agent/人类协同任务管理平台 ``` HarborForge/ ├── HarborForge.Backend/ # 后端 (FastAPI + MySQL) -├── HarborForge.Frontend/ # 前端 (React) - 规划中 -├── HarborForge.Cli/ # CLI 工具 - 规划中 -└── docker-compose.yml # 部署配置 +├── HarborForge.Frontend/ # 前端 (React + Vite) +├── docker-compose.yml # Docker 部署配置 +├── nginx-host.conf.example # 宿主机 nginx 配置示例 +└── .env.example # 环境变量模板 ``` ## 快速开始 @@ -20,13 +21,45 @@ git clone https://git.hangman-lab.top/zhi/HarborForge.git cd HarborForge git submodule update --init --recursive -# 启动服务 +# 配置环境变量 cp .env.example .env + +# 启动服务 docker compose up -d ``` +## 部署架构 + +``` +宿主机 nginx (80/443) + ├── / → frontend (Docker, port 3000) + └── /api/ → backend (Docker, port 8000) +``` + +前端 Docker 容器不包含 nginx,使用轻量的 `serve` 提供静态文件。 +API 代理由宿主机 nginx 统一处理。 + +### 宿主机 nginx 配置 + +参考 `nginx-host.conf.example`,复制到 `/etc/nginx/sites-available/` 并修改域名。 + ## 子模块 -- [HarborForge.Backend](https://git.hangman-lab.top/zhi/HarborForge.Backend) - 后端 API -- [HarborForge.Frontend](https://git.hangman-lab.top/zhi/HarborForge.Frontend) - 前端 (规划中) -- [HarborForge.Cli](https://git.hangman-lab.top/zhi/HarborForge.Cli) - CLI 工具 (规划中) +- [HarborForge.Backend](https://git.hangman-lab.top/zhi/HarborForge.Backend) - FastAPI 后端 API +- [HarborForge.Frontend](https://git.hangman-lab.top/zhi/HarborForge.Frontend) - React 前端 + +## 端口 + +| 服务 | 默认端口 | 环境变量 | +|------|----------|----------| +| Frontend | 3000 | `FRONTEND_PORT` | +| Backend | 8000 | `BACKEND_PORT` | +| MySQL | 3306 | `MYSQL_PORT` | + +## 前端页面 + +- 📊 仪表盘 — 统计概览 +- 📋 Issues — 创建、列表、详情、状态变更、评论 +- 📁 项目 — 项目管理、成员、关联 issue +- 🏁 里程碑 — 进度追踪、完成百分比 +- 🔔 通知 — 实时通知中心、未读计数 diff --git a/docker-compose.yml b/docker-compose.yml index 4a54f9b..4c7df8e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,5 @@ version: '3.8' + services: mysql: image: mysql:8.0 @@ -10,16 +11,11 @@ services: MYSQL_USER: ${MYSQL_USER:-harborforge} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-harborforge_pass} volumes: - - mysql_data:/var/lib/mysql + - mysql_data:/var/lib/mysql ports: - - 3306:3306 + - "${MYSQL_PORT:-3306}:3306" healthcheck: - test: - - CMD - - mysqladmin - - ping - - -h - - localhost + test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 5 @@ -28,6 +24,7 @@ services: limits: cpus: '0.5' memory: 512M + backend: build: context: ./HarborForge.Backend @@ -39,53 +36,46 @@ services: SECRET_KEY: ${SECRET_KEY:-change_me_in_production} LOG_LEVEL: ${LOG_LEVEL:-INFO} ports: - - 8000:8000 + - "${BACKEND_PORT:-8000}:8000" depends_on: mysql: condition: service_healthy - volumes: - - ./HarborForge.Backend:/app deploy: resources: limits: cpus: '0.5' memory: 512M healthcheck: - test: - - CMD - - curl - - -f - - http://localhost:8000/health + test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 start_period: 10s + frontend: build: context: ./HarborForge.Frontend dockerfile: Dockerfile + args: + VITE_API_BASE: ${VITE_API_BASE:-/api} container_name: harborforge-frontend restart: unless-stopped ports: - - 3000:3000 + - "${FRONTEND_PORT:-3000}:3000" depends_on: backend: condition: service_healthy deploy: resources: limits: - cpus: '0.5' - memory: 256M + cpus: '0.25' + memory: 128M healthcheck: - test: - - CMD - - wget - - -q - - --spider - - http://localhost:3000 + test: ["CMD", "wget", "-q", "--spider", "http://localhost:3000"] interval: 30s timeout: 10s retries: 3 + volumes: mysql_data: driver: local diff --git a/nginx-host.conf.example b/nginx-host.conf.example new file mode 100644 index 0000000..bad7cbe --- /dev/null +++ b/nginx-host.conf.example @@ -0,0 +1,26 @@ +# 宿主机 nginx 配置示例 +# 复制到 /etc/nginx/sites-available/ 并 symlink 到 sites-enabled/ +# 修改 server_name 为实际域名 + +server { + listen 80; + server_name harborforge.example.com; + + # 前端 + location / { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # API 代理 + location /api/ { + proxy_pass http://127.0.0.1:8000/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +}