diff --git a/DEPLOY_PORT.md b/DEPLOY_PORT.md new file mode 100644 index 0000000..7555407 --- /dev/null +++ b/DEPLOY_PORT.md @@ -0,0 +1,170 @@ +# 部署时端口配置说明 + +## 生产环境部署端口配置 + +本项目现在使用统一的端口配置文件 `.env`,部署时需要相应调整配置。 + +### Gunicorn 启动配置 + +**推荐方式(使用 .env 配置):** + +```bash +# 创建启动脚本 +cat > start_production.sh << 'EOF' +#!/bin/bash +cd /opt/moldinsight/moldinsight_project +source venv/bin/activate + +# 从 .env 读取端口配置 +if [ -f .env ]; then + PORT=$(grep '^PORT=' .env | cut -d'=' -f2) +else + PORT=8000 +fi + +# 启动服务 +gunicorn src.main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:${PORT} +EOF + +chmod +x start_production.sh +./start_production.sh +``` + +### systemd 服务配置 + +创建 `/etc/systemd/system/moldinsight.service`: + +```ini +[Unit] +Description=MoldInsight Geometry Analysis Service +After=network.target postgresql.service + +[Service] +Type=simple +User=www-data +Group=www-data +WorkingDirectory=/opt/moldinsight/moldinsight_project +Environment=PATH=/opt/moldinsight/moldinsight_project/venv/bin +Environment="PORT=8000" +ExecStart=/opt/moldinsight/moldinsight_project/venv/bin/gunicorn src.main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:${PORT} +Restart=always + +[Install] +WantedBy=multi-user.target +``` + +**重要:** 在 `[Service]` 部分添加 `Environment="PORT=8000"`,或在 `.env` 文件中配置 `PORT=8000`。 + +### Nginx 反向代理配置 + +```nginx +upstream moldinsight_backend { + server 127.0.0.1:8000; # 对应 .env 中的 PORT +} + +server { + listen 80; + server_name your-domain.com; + + location / { + proxy_pass http://moldinsight_backend; + 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; + } + + location /static { + alias /opt/moldinsight/moldinsight_project/static; + } + + location /html_output { + alias /opt/moldinsight/moldinsight_project/html_output; + } +} +``` + +### Docker 部署 + +Docker 部署自动从 `.env` 读取配置,无需额外设置: + +```bash +# .env 文件配置 +PORT=8000 # 容器内端口 +HOST_PORT=8080 # 宿主机端口 + +# 启动 +docker-compose up -d +``` + +### 修改生产环境端口 + +1. **编辑 .env 文件** + ```bash + PORT=9000 # 修改应用端口 + ``` + +2. **重启服务** + ```bash + # systemd + sudo systemctl restart moldinsight + + # Docker + docker-compose down && docker-compose up -d + + # 手动启动 + ./start_production.sh + ``` + +3. **更新 Nginx 配置(如果使用)** + ```nginx + upstream moldinsight_backend { + server 127.0.0.1:9000; # 更新为新端口 + } + ``` + ```bash + sudo nginx -t && sudo nginx -s reload + ``` + +### 防火墙配置 + +如果修改了端口,需要更新防火墙规则: + +```bash +# UFW (Ubuntu/Debian) +sudo ufw allow 9000/tcp +sudo ufw delete allow 8000/tcp # 删除旧端口 + +# firewall-cmd (CentOS/RHEL) +sudo firewall-cmd --permanent --add-port=9000/tcp +sudo firewall-cmd --permanent --remove-port=8000/tcp +sudo firewall-cmd --reload +``` + +### 健康检查 + +修改端口后,更新健康检查命令: + +```bash +# 检查服务状态 +curl http://localhost:9000/health +curl http://your-domain.com/health +``` + +## 快速参考 + +| 部署方式 | 端口配置位置 | 重启命令 | +|---------|------------|---------| +| 直接运行 | `.env` 中的 `PORT` | Ctrl+C 后重新运行 | +| Gunicorn | `.env` 中的 `PORT` | `systemctl restart moldinsight` | +| Docker | `.env` 中的 `PORT` 和 `HOST_PORT` | `docker-compose restart` | +| Nginx代理 | Nginx配置中的 `proxy_pass` | `nginx -s reload` | + +## 注意事项 + +⚠️ **重要:** +1. 所有端口配置统一在 `.env` 文件中管理 +2. 修改端口后需要同步更新相关配置(Nginx、防火墙等) +3. 确保新端口没有被其他服务占用 +4. 生产环境建议使用 Nginx 反向代理,对外提供 80/443 端口 +5. .env 文件不应提交到版本控制系统,使用 `.env.example` 作为模板 diff --git a/PORT_CONFIG.md b/PORT_CONFIG.md new file mode 100644 index 0000000..51aef3c --- /dev/null +++ b/PORT_CONFIG.md @@ -0,0 +1,107 @@ +# 端口配置说明 + +## ⚠️ 重要提示 + +本项目现在采用**统一端口配置管理**,所有端口配置集中在一个地方: + +**唯一修改端口的地方:** `.env` 文件中的端口配置部分 + +## 配置说明 + +编辑项目根目录下的 `.env` 文件: + +```bash +# ================================ +# 端口配置 - 唯一修改端口的地方 +# ================================ +# 应用端口(容器内端口) +PORT=8000 +# Docker映射到宿主机的端口(docker-compose使用) +HOST_PORT=10001 +# ================================ +``` + +### 端口含义 + +| 变量 | 用途 | 默认值 | 说明 | +|------|------|--------|------| +| `PORT` | 应用监听端口 | 8000 | FastAPI/Uvicorn 服务监听的端口 | +| `HOST_PORT` | 宿主机映射端口 | 10001 | Docker Compose 映射到宿主机的端口 | + +### 使用场景 + +#### 1. 本地直接运行(Python) +```bash +python src/main.py +``` +服务将在 `http://localhost:8000` 启动(使用 `PORT` 配置) + +#### 2. Docker Compose 运行 +```bash +docker-compose up +``` +服务将在 `http://localhost:10001` 访问(使用 `HOST_PORT` 配置) +容器内部使用 `PORT` 配置的端口(8000) + +#### 3. 修改端口 + +**场景A:只想修改外部访问端口(Docker)** +```bash +# .env 文件 +PORT=8000 # 容器内不变 +HOST_PORT=8080 # 宿主机改为8080 +``` +访问地址:`http://localhost:8080` + +**场景B:修改应用端口(容器内/本地运行)** +```bash +# .env 文件 +PORT=9000 # 应用改为9000 +HOST_PORT=10001 # 宿主机映射到10001 +``` +- 本地运行:`http://localhost:9000` +- Docker运行:`http://localhost:10001` (映射到容器内9000) + +**场景C:同时修改两个端口** +```bash +# .env 文件 +PORT=9000 +HOST_PORT=9000 +``` +- 本地运行:`http://localhost:9000` +- Docker运行:`http://localhost:9000` + +## 配置文件说明 + +### 配置读取优先级 + +1. **`config/settings.py`** - 从 `.env` 读取 `PORT` 和 `HOST` +2. **`src/main.py`** - 从 `settings` 获取端口配置 +3. **`docker-compose.yml`** - 从 `.env` 读取 `HOST_PORT` 和 `PORT` + +### 相关文件 + +- **`.env`** - ⭐ 唯一需要修改的配置文件 +- **`config/settings.py`** - 配置读取逻辑(无需修改) +- **`src/main.py`** - 使用配置启动服务(无需修改) +- **`docker-compose.yml`** - Docker端口映射(自动读取 `.env`) +- **`start.sh` / `start_fixed.sh`** - 启动脚本(自动读取 `.env`) + +## 常见问题 + +### Q: 为什么 Docker 宿主机端口和应用端口分开配置? +A: 这样可以灵活调整容器端口而不影响外部访问,也避免端口冲突。 + +### Q: 修改后需要重启吗? +A: 是的,修改 `.env` 后需要重启服务才能生效: +- 本地运行:Ctrl+C 停止后重新 `python src/main.py` +- Docker: `docker-compose down && docker-compose up` + +### Q: 如何避免端口冲突? +A: 确保 `HOST_PORT` 不与其他服务冲突,可以使用 `netstat -an | grep <端口>` 检查端口占用情况。 + +### Q: 可以使用 80 端口吗? +A: 可以,但需要管理员权限: +- Linux/Mac: 使用 sudo +- Docker: 需要容器有足够权限 +- 生产环境建议使用反向代理(如 Nginx) diff --git a/PORT_REFACTOR_SUMMARY.md b/PORT_REFACTOR_SUMMARY.md new file mode 100644 index 0000000..da85a5d --- /dev/null +++ b/PORT_REFACTOR_SUMMARY.md @@ -0,0 +1,192 @@ +# 端口配置重构总结 + +## 修改内容 + +本次重构将项目的端口配置统一到 `.env` 文件中,确保整个项目只有一个地方需要修改端口。 + +## 修改的文件 + +### 1. ⭐ `.env` - 唯一配置入口 +**变更:** 添加了统一的端口配置区域 +```bash +# ================================ +# 端口配置 - 唯一修改端口的地方 +# ================================ +# 应用端口(容器内端口) +PORT=8000 +# Docker映射到宿主机的端口(docker-compose使用) +HOST_PORT=10001 +# ================================ +``` + +### 2. `src/main.py` +**变更:** 从硬编码的环境变量读取改为从 `config.settings` 读取 +```python +# 修改前 +host = os.getenv('HOST', '0.0.0.0') +port = int(os.getenv('PORT', '8000')) + +# 修改后 +from config.settings import settings +# ... +host=settings.HOST, +port=settings.PORT +``` + +### 3. `docker-compose.yml` +**变更:** 端口映射从硬编码改为从环境变量读取 +```yaml +# 修改前 +ports: + - "10001:8000" +environment: + - PORT=8000 + +# 修改后 +ports: + - "${HOST_PORT:-10001}:${CONTAINER_PORT:-8000}" +environment: + - HOST=${HOST:-0.0.0.0} + - PORT=${CONTAINER_PORT:-8000} +``` + +### 4. `start.sh` 和 `start_fixed.sh` +**变更:** 自动从 `.env` 读取端口并显示正确的访问地址 +```bash +# 添加 +PORT=$(grep '^PORT=' .env 2>/dev/null | cut -d'=' -f2 || echo '8000') +echo "🌐 服务将在 http://localhost:${PORT} 启动" +``` + +### 5. `README.md` +**变更:** 更新访问说明,提示端口配置位置 + +### 6. 新增文件 +- `.env.example` - 配置文件模板 +- `PORT_CONFIG.md` - 端口配置详细说明 +- `DEPLOY_PORT.md` - 部署时端口配置指南 + +## 配置读取流程 + +``` +.env 文件 + ↓ +config/settings.py (读取 PORT 和 HOST) + ↓ +src/main.py (使用 settings.PORT) + ↓ +uvicorn 启动服务 +``` + +Docker 部署流程: +``` +.env 文件 + ↓ +docker-compose.yml (读取 HOST_PORT 和 PORT) + ↓ +容器映射和内部启动 +``` + +## 如何修改端口 + +### 方法 1:修改应用端口 +```bash +# 编辑 .env +PORT=9000 # 修改此行 +``` +- 本地运行:`http://localhost:9000` +- Docker运行:需同时修改 `HOST_PORT=9000` + +### 方法 2:修改 Docker 外部访问端口 +```bash +# 编辑 .env +HOST_PORT=8080 # 修改此行(PORT 保持不变) +``` +- Docker运行:`http://localhost:8080` +- 容器内仍使用 PORT 配置的端口 + +## 测试验证 + +### 测试 1:本地运行 +```bash +# 修改 .env 中的 PORT +PORT=9999 + +# 启动服务 +python src/main.py + +# 验证 +curl http://localhost:9999/health +``` + +### 测试 2:Docker 运行 +```bash +# 修改 .env +PORT=8000 +HOST_PORT=9999 + +# 启动容器 +docker-compose up -d + +# 验证 +curl http://localhost:9999/health +``` + +### 测试 3:启动脚本 +```bash +# 修改 .env +PORT=8888 + +# 运行启动脚本 +./start.sh + +# 检查输出是否显示正确的端口 +``` + +## 注意事项 + +1. ✅ 所有端口配置集中在 `.env` 文件 +2. ✅ 无需修改代码文件即可更改端口 +3. ✅ 支持本地运行和 Docker 部署两种场景 +4. ✅ 提供了详细的配置文档 +5. ⚠️ 修改端口后需要重启服务 +6. ⚠️ Docker 部署时需要同时考虑容器内外端口 +7. ⚠️ 确保新端口没有被占用 + +## 文件清单 + +### 修改的文件 +- `.env` - 添加端口配置区域 +- `src/main.py` - 统一使用 settings 配置 +- `docker-compose.yml` - 支持环境变量配置端口 +- `start.sh` - 自动读取和显示端口 +- `start_fixed.sh` - 自动读取和显示端口 +- `README.md` - 更新访问说明 + +### 新增的文件 +- `.env.example` - 配置模板 +- `PORT_CONFIG.md` - 端口配置详细说明 +- `DEPLOY_PORT.md` - 部署配置指南 +- `PORT_REFACTOR_SUMMARY.md` - 本文档 + +## 回滚方案 + +如果需要回滚,按以下步骤操作: + +```bash +git checkout -- src/main.py +git checkout -- docker-compose.yml +git checkout -- start.sh start_fixed.sh +git checkout -- .env +git checkout -- README.md + +# 删除新增文件 +rm .env.example PORT_CONFIG.md DEPLOY_PORT.md PORT_REFACTOR_SUMMARY.md +``` + +## 联系支持 + +如有问题,请查看: +- `PORT_CONFIG.md` - 端口配置详细说明 +- `DEPLOY_PORT.md` - 部署配置指南 +- `.env.example` - 配置示例