# PolyHermes 部署文档 本文档介绍如何部署 PolyHermes 项目,包括后端和前端的不同部署方式。 ## 目录 - [一体化部署(推荐)](#一体化部署推荐) - [使用 Docker Hub 镜像](#使用-docker-hub-镜像推荐生产环境首选) - [使用外部 Nginx 反向代理](#使用外部-nginx-反向代理生产环境推荐) - [后端部署](#后端部署) - [Java 直接部署](#java-直接部署) - [Docker 部署](#docker-部署) - [前端部署](#前端部署) - [环境配置](#环境配置) - [常见问题](#常见问题) ## 一体化部署(推荐) 将前后端一起部署到一个 Docker 容器中,使用 Nginx 提供前端静态文件并代理后端 API。 ### 前置要求 - Docker 20.10+ - Docker Compose 2.0+ ### 部署步骤 1. **使用 Docker Hub 镜像(推荐,生产环境首选)** 使用官方构建的 Docker 镜像,无需本地构建,快速部署。 **方式 1:独立部署(无需 clone 代码,推荐生产环境)** 适用于生产环境,无需下载项目代码,只需配置文件即可部署。 ```bash # 1. 创建部署目录 mkdir polyhermes && cd polyhermes # 2. 下载生产环境配置文件 # 从 GitHub 下载 docker-compose.prod.yml 和 docker-compose.prod.env.example curl -O https://raw.githubusercontent.com/WrBug/PolyHermes/main/docker-compose.prod.yml curl -O https://raw.githubusercontent.com/WrBug/PolyHermes/main/docker-compose.prod.env.example # 3. 创建配置文件 cp docker-compose.prod.env.example .env # 4. 编辑 .env 文件,修改以下必需配置: # - DB_PASSWORD: 数据库密码(建议使用强密码) # - JWT_SECRET: JWT 密钥(使用 openssl rand -hex 64 生成) # - ADMIN_RESET_PASSWORD_KEY: 管理员密码重置密钥(使用 openssl rand -hex 32 生成) # # 生成随机密钥示例: # openssl rand -hex 64 # 用于 JWT_SECRET # openssl rand -hex 32 # 用于 ADMIN_RESET_PASSWORD_KEY # 5. 启动服务 docker-compose -f docker-compose.prod.yml up -d # 6. 查看日志 docker-compose -f docker-compose.prod.yml logs -f # 7. 停止服务 docker-compose -f docker-compose.prod.yml down ``` **方式 2:使用部署脚本(需要 clone 代码)** ```bash # 如果已经 clone 了代码 ./deploy.sh --use-docker-hub ``` **方式 3:修改现有 docker-compose.yml** ```bash # 1. 修改 docker-compose.yml # 取消注释:image: wrbug/polyhermes:latest # 注释掉 build 部分 # 2. 创建 .env 文件(见下方环境配置) # 3. 启动服务 docker-compose up -d ``` **优势**: - ✅ 无需本地构建,快速部署 - ✅ 无需 clone 代码,只需配置文件即可部署 - ✅ 使用官方构建的镜像,包含正确的版本号 - ✅ 支持多架构(amd64、arm64),自动选择匹配的架构 - ✅ 生产环境推荐方式 **拉取特定版本**: ```bash # 修改 docker-compose.prod.yml 中的镜像标签 # image: wrbug/polyhermes:v1.0.0 # 或使用环境变量 export IMAGE_TAG=v1.0.0 # 在 docker-compose.prod.yml 中使用: image: wrbug/polyhermes:${IMAGE_TAG:-latest} ``` 2. **本地构建部署(开发环境)** 适用于开发环境或需要自定义构建的场景。 ```bash # 使用部署脚本 ./deploy.sh ``` 脚本会自动: - 检查 Docker 环境 - 创建 `.env` 配置文件(如果不存在) - 构建 Docker 镜像(包含前后端) - 启动服务(应用 + MySQL) **注意**:本地构建的版本号会显示为 `dev`。 3. **手动部署** ```bash # 创建 .env 文件 cat > .env < .env < .env.production < ServerName your-domain.com DocumentRoot /path/to/frontend/dist # API 代理 ProxyPass /api http://localhost:8000/api ProxyPassReverse /api http://localhost:8000/api # WebSocket 代理 ProxyPass /ws ws://localhost:8000/ws ProxyPassReverse /ws ws://localhost:8000/ws # 前端路由(SPA) Options Indexes FollowSymLinks AllowOverride All Require all granted RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] ``` #### 方式3:使用 serve(开发/测试) ```bash # 安装 serve npm install -g serve # 启动服务 serve -s dist -l 3000 ``` ## 环境配置 ### 后端环境变量 | 变量名 | 说明 | 默认值 | 必需 | |--------|------|--------|------| | `SPRING_PROFILES_ACTIVE` | Spring Profile | `dev` | 否 | | `DB_URL` | 数据库连接 URL | - | 是(生产) | | `DB_USERNAME` | 数据库用户名 | `root` | 是(生产) | | `DB_PASSWORD` | 数据库密码 | - | 是(生产) | | `SERVER_PORT` | 服务器端口 | `8000` | 否 | | `POLYGON_RPC_URL` | Polygon RPC 地址 | `https://polygon-rpc.com` | 否 | | `JWT_SECRET` | JWT 密钥 | - | 是(生产) | | `ADMIN_RESET_PASSWORD_KEY` | 管理员密码重置密钥 | - | 是(生产) | ### 前端环境变量 | 变量名 | 说明 | 默认值 | |--------|------|--------| | `VITE_API_URL` | 后端 API 地址 | `http://127.0.0.1:8000` | | `VITE_WS_URL` | WebSocket 地址 | `ws://127.0.0.1:8000` | ### 配置文件说明 #### 后端配置文件 - `application.properties` - 基础配置(所有环境共享) - `application-dev.properties` - 开发环境配置 - `application-prod.properties` - 生产环境配置 通过 `--spring.profiles.active=prod` 或环境变量 `SPRING_PROFILES_ACTIVE=prod` 切换环境。 #### 前端环境变量 Vite 使用 `.env.production` 文件在构建时注入环境变量。构建脚本会自动创建此文件。 ## 常见问题 ### 1. 数据库连接失败 **问题**: 后端无法连接数据库 **解决方案**: - 检查数据库服务是否运行 - 检查数据库连接 URL、用户名、密码是否正确 - 检查防火墙是否允许连接 - 对于 Docker 部署,确保使用正确的数据库地址(`mysql` 而非 `localhost`) ### 2. 前端无法连接后端 **问题**: 前端请求后端 API 失败 **解决方案**: - 检查后端服务是否运行 - 检查 `VITE_API_URL` 配置是否正确 - 检查 CORS 配置(如果跨域) - 检查网络连接和防火墙 ### 3. WebSocket 连接失败 **问题**: WebSocket 无法建立连接 **解决方案**: - 检查 `VITE_WS_URL` 配置是否正确 - 检查 WebSocket 代理配置(Nginx/Apache) - 检查防火墙是否允许 WebSocket 连接 - 检查后端 WebSocket 服务是否正常 ### 4. Docker 容器无法访问数据库 **问题**: Docker 容器中的后端无法连接宿主机数据库 **解决方案**: - 使用 `host.docker.internal` 作为数据库地址(Mac/Windows) - 使用 Docker 网络连接(推荐使用 docker-compose) - 检查数据库是否允许远程连接 ### 5. 构建失败 **问题**: 前端或后端构建失败 **解决方案**: - 检查 Node.js 版本(需要 18+) - 检查 Java 版本(需要 17+) - 清理缓存后重新构建: ```bash # 前端 rm -rf node_modules dist npm install npm run build # 后端 ./gradlew clean build ``` ## 生产环境检查清单 - [ ] 修改所有默认密码和密钥(JWT_SECRET、ADMIN_RESET_PASSWORD_KEY、数据库密码) - [ ] 配置正确的数据库连接(使用 SSL) - [ ] 设置正确的 Spring Profile(`prod`) - [ ] 配置正确的后端 API 地址(前端) - [ ] 配置反向代理(Nginx/Apache) - [ ] 配置 HTTPS(生产环境推荐) - [ ] 配置防火墙规则 - [ ] 设置日志轮转 - [ ] 配置监控和告警 - [ ] 定期备份数据库 ## 性能优化建议 ### 后端 - 调整 JVM 参数(堆内存、GC 策略) - 配置数据库连接池大小 - 启用 HTTP 压缩 - 配置缓存策略 ### 前端 - 启用 Gzip 压缩(Nginx) - 配置静态资源缓存 - 使用 CDN 加速 - 启用 HTTP/2 ## 安全建议 - 使用 HTTPS(生产环境必须) - 配置 CORS 白名单 - 定期更新依赖包 - 使用强密码和密钥 - 限制数据库访问权限 - 配置防火墙规则 - 定期备份数据 - 监控异常访问 ## 技术支持 如有问题,请提交 Issue 到 [GitHub](https://github.com/WrBug/PolyHermes) 或联系 [Twitter](https://x.com/quant_tr)。