模块拆分 init

This commit is contained in:
2026-08-27 14:53:22 +08:00
parent e6ddea33a2
commit 3ea59551db
15 changed files with 2191 additions and 1399 deletions
+300 -178
View File
@@ -1,177 +1,315 @@
# MoldInsight Linux 部署指南
# geMoldInsight Linux 部署指南
## 系统要求
- Linux 系统 (Ubuntu 20.04+ / CentOS 8+)
- Python 3.8+
- PostgreSQL 12+
> 本文档描述的是 **当前模块化架构** 下的 Linux 部署方式,而不是历史单体 `src.main:app` 方案。
当前项目支持三种部署模式:
- **unified**:gemold + inventory 统一部署
- **gemold-only**:仅部署模具分析后端
- **inventory-only**:仅部署进销存后端
项目保持:
- **同一 Git 仓库**
- **同一 PostgreSQL 数据库**
- **共享认证体系**
- **按模块独立部署**
- **复用服务器上已存在的 PostgreSQL / Redis / RustFS(或 MinIO 兼容存储)**
详细架构蓝图见:
- [BACKEND_MODULARIZATION_BLUEPRINT.md](../BACKEND_MODULARIZATION_BLUEPRINT.md)
---
## 1. 系统要求
### 基础要求
- Linux(Ubuntu 22.04+ / Debian 12+ / CentOS Stream 9+)
- Python 3.12
- Git
- 服务器上已可访问的 PostgreSQL 15+
- 服务器上已可访问的 Redis 7+
## 1. 环境准备
### 按模块附加要求
#### gemold / unified 需要
- 服务器上已可访问的 MinIO 或 RustFS 兼容对象存储
- PythonOCC 运行环境
- Celery worker(推荐与 gemold 一起部署)
#### inventory-only 需要
- PostgreSQL
- Redis
- 不依赖 MinIO / RustFS
- 不依赖 Celery worker
---
## 2. 代码获取与目录约定
### 安装系统依赖
```bash
# Ubuntu/Debian
sudo apt update
sudo apt install python3 python3-pip python3-venv postgresql postgresql-contrib git
# CentOS/RHEL
sudo yum update
sudo yum install python3 python3-pip postgresql postgresql-server git
```
### 配置PostgreSQL
```bash
# 启动PostgreSQL服务
sudo systemctl start postgresql
sudo systemctl enable postgresql
# 创建数据库和用户
sudo -u postgres psql
```
在PostgreSQL中执行:
```sql
CREATE DATABASE moldinsight;
CREATE USER molduser WITH PASSWORD 'moldpassword';
GRANT ALL PRIVILEGES ON DATABASE moldinsight TO molduser;
\q
```
## 2. 项目部署
### 克隆或复制项目
```bash
# 如果使用Git
cd /opt
sudo git clone <your-repo-url> moldinsight
sudo chown -R $USER:$USER moldinsight
cd moldinsight
# 或者直接复制项目文件到Linux服务器
sudo git clone <your-repo-url> geMoldInsight
sudo chown -R $USER:$USER geMoldInsight
cd geMoldInsight
```
### 创建Python虚拟环境
后续示例默认项目位于:
```bash
cd moldinsight_project
python3 -m venv venv
source venv/bin/activate
/opt/geMoldInsight
```
### 安装依赖
---
## 3. Python 环境准备
```bash
python3.12 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
```
## 3. 环境配置
> 如果需要 gemold 分析能力,请额外准备 PythonOCC 运行环境。该依赖通常通过 conda 或预构建运行镜像提供,而不是直接由 pip 安装。
---
## 4. 环境变量配置
复制模板:
### 修改环境配置文件
编辑 `.env` 文件:
```bash
nano .env
cp .env.example .env
```
修改为Linux环境的配置:
```env
# 数据库配置(Linux环境)
DATABASE_URL=postgresql+asyncpg://molduser:moldpassword@localhost:5432/moldinsight
或部署场景参考:
# 服务配置
DEBUG=false
```bash
cp deploy/.env.example .env
```
至少需要配置(并指向服务器上已存在的基础设施):
```env
HOST=0.0.0.0
PORT=8000
# Redis配置(可选)
REDIS_HOST=localhost
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=moldinsight
DB_USER=moldinsight_user
DB_PASSWORD=change-me
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=
# Kafka配置(可选)
KAFKA_BOOTSTRAP_SERVERS=localhost:9092
KAFKA_SECURITY_PROTOCOL=PLAINTEXT
SECRET_KEY=change-me-in-production
ADMIN_USERNAME=admin
ADMIN_PASSWORD=change-me
RUSTFS_ENDPOINT=http://127.0.0.1:9000
RUSTFS_ACCESS_KEY=minioadmin
RUSTFS_SECRET_KEY=minioadmin
```
### 创建必要的目录
说明:
- `RUSTFS_*` 仅 **gemold / unified** 模式需要
- `inventory-only` 可不使用对象存储
- 当前配置读取实现见 [settings.py](../../src/shared/config/settings.py)
---
## 5. 数据库初始化
项目当前使用 Alembic 管理迁移,应用启动时也会执行初始化流程。
首次部署建议:
1. 确保服务器上的 PostgreSQL / Redis / 对象存储服务已可访问
2. 启动应用前确认 `.env` 中的 `DB_HOST` / `REDIS_HOST` / `RUSTFS_ENDPOINT` 指向真实服务地址
3. 让应用执行初始化/升级逻辑
相关实现参考:
- [init_db.py](../../src/shared/database/init_db.py)
> 当前项目是 **单数据库** 设计,因此 unified / gemold-only / inventory-only 都连接到同一个数据库与同一 migration head。
---
## 6. 启动方式
## 6.1 inventory-only
```bash
mkdir -p uploads html_output logs
chmod 755 uploads html_output logs
source .venv/bin/activate
uvicorn src.entrypoints.inventory:app --host 0.0.0.0 --port 8001
```
## 4. 启动服务
适合:
- 只提供进销存能力
- 不需要模具分析与异步任务
---
## 6.2 gemold-only
### 开发模式启动
```bash
cd moldinsight_project
source venv/bin/activate
python src/main.py
source .venv/bin/activate
uvicorn src.entrypoints.moldinsight:app --host 0.0.0.0 --port 8000
```
### 生产环境启动(使用Gunicorn)
适合:
- 单独部署模具分析能力
- 文件上传 / 分析 / 导出 / 批量分析
### gemold Celery worker
建议同时启动 worker:
```bash
# 安装Gunicorn
pip install gunicorn uvloop httptools
# 启动服务
cd moldinsight_project
source venv/bin/activate
gunicorn src.main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
source .venv/bin/activate
celery -A src.celery_app.celery_app worker --loglevel=info
```
## 5. 系统服务配置(可选)
> gemold 的异步处理链路依赖 Celery + Redis;若只启动 HTTP 服务而不启动 worker,上传分析任务可能无法完整处理。
---
## 6.3 unified
当前仓库仍保留历史统一入口 [main.py](../../src/main.py),但它更适合作为**过渡参考**,不建议作为长期标准入口。
在正式完成组合层重构前,如需统一部署,可优先使用反向代理或部署编排层统一暴露 gemold 与 inventory;后续会演进为显式 `unified_app.py`。
蓝图参考:
- [BACKEND_MODULARIZATION_BLUEPRINT.md](../BACKEND_MODULARIZATION_BLUEPRINT.md)
---
## 7. systemd 部署示例
## 7.1 inventory-only 服务
创建:
### 创建systemd服务文件
```bash
sudo nano /etc/systemd/system/moldinsight.service
sudo nano /etc/systemd/system/gemold-inventory.service
```
添加以下内容:
```ini
[Unit]
Description=MoldInsight Geometry Analysis Service
After=network.target postgresql.service
Description=geMoldInsight Inventory API
After=network.target postgresql.service redis.service
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/moldinsight/moldinsight_project
Environment=PATH=/opt/moldinsight/moldinsight_project/venv/bin
ExecStart=/opt/moldinsight/moldinsight_project/venv/bin/gunicorn src.main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
WorkingDirectory=/opt/geMoldInsight
Environment=PATH=/opt/geMoldInsight/.venv/bin
ExecStart=/opt/geMoldInsight/.venv/bin/uvicorn src.entrypoints.inventory:app --host 0.0.0.0 --port 8001
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
```
### 启用并启动服务
启用:
```bash
sudo systemctl daemon-reload
sudo systemctl enable moldinsight
sudo systemctl start moldinsight
sudo systemctl status moldinsight
sudo systemctl enable gemold-inventory
sudo systemctl start gemold-inventory
```
## 6. Nginx反向代理配置(可选)
---
## 7.2 gemold-only API 服务
创建:
### 安装Nginx
```bash
# Ubuntu/Debian
sudo apt install nginx
# CentOS/RHEL
sudo yum install nginx
sudo nano /etc/systemd/system/gemold-moldinsight.service
```
### 创建Nginx配置文件
```ini
[Unit]
Description=geMoldInsight MoldInsight API
After=network.target postgresql.service redis.service
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/geMoldInsight
Environment=PATH=/opt/geMoldInsight/.venv/bin
ExecStart=/opt/geMoldInsight/.venv/bin/uvicorn src.entrypoints.moldinsight:app --host 0.0.0.0 --port 8000
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
```
---
## 7.3 gemold Celery worker 服务
创建:
```bash
sudo nano /etc/nginx/sites-available/moldinsight
sudo nano /etc/systemd/system/gemold-celery.service
```
添加以下内容:
```ini
[Unit]
Description=geMoldInsight MoldInsight Celery Worker
After=network.target postgresql.service redis.service
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/geMoldInsight
Environment=PATH=/opt/geMoldInsight/.venv/bin
ExecStart=/opt/geMoldInsight/.venv/bin/celery -A src.celery_app.celery_app worker --loglevel=info
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
```
---
## 8. Nginx 反向代理示例
### 8.1 inventory-only
```nginx
server {
listen 80;
server_name your-domain.com;
server_name inventory.example.com;
location / {
proxy_pass http://127.0.0.1:8001;
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;
}
}
```
### 8.2 gemold-only
```nginx
server {
listen 80;
server_name gemold.example.com;
location / {
proxy_pass http://127.0.0.1:8000;
@@ -180,102 +318,86 @@ server {
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;
expires 30d;
}
}
```
### 启用站点并重启Nginx
```bash
sudo ln -s /etc/nginx/sites-available/moldinsight /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
```
### 8.3 unified(示意)
## 7. 防火墙配置
统一对外时,可由网关做模块路由,也可直接暴露统一组合后的应用入口。组合层标准化完成前,更推荐通过部署编排或网关来实现统一对外访问。
---
## 9. 验证部署
### 9.1 健康检查
inventory-only:
```bash
# Ubuntu/Debian (ufw)
sudo ufw allow 80
sudo ufw allow 8000
sudo ufw allow ssh
sudo ufw enable
# CentOS/RHEL (firewalld)
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=8000/tcp
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
curl http://127.0.0.1:8001/health
```
## 8. 验证部署
gemold-only:
### 检查服务状态
```bash
# 检查应用服务
curl http://localhost:8000/health
# 检查数据库连接
sudo -u postgres psql -d moldinsight -c "SELECT version();"
curl http://127.0.0.1:8000/health
```
### 测试文件上传
访问 `http://your-server-ip:8000` 上传STP文件测试功能。
### 9.2 基础能力验证
## 9. 故障排除
#### inventory-only
- 登录接口可用
- `/api/products` 返回数据
- `/api/inventory` 返回数据
### 常见问题
#### gemold-only
- 登录接口可用
- `/api/upload` 可访问
- 上传后 worker 能正常消费任务
- `/api/status/{task_id}` 能看到进度
1. **数据库连接失败**
- 检查PostgreSQL服务状态:`sudo systemctl status postgresql`
- 验证数据库连接:`psql -h localhost -U molduser -d moldinsight`
---
2. **端口被占用**
- 检查端口使用:`netstat -tulpn | grep 8000`
- 修改端口或停止占用进程
## 10. 常见问题
3. **权限问题**
- 确保目录权限正确:`chmod 755 uploads html_output logs`
- 检查文件所有者:`ls -la`
### 1. 为什么不再推荐 `src.main:app`?
因为当前项目已演进为模块化结构,`src.main:app` 更适合作为过渡兼容入口,而不是长期部署标准。应优先围绕 [entrypoints/](../../src/entrypoints/) 部署。
4. **依赖安装失败**
- 更新pip:`pip install --upgrade pip`
- 使用国内镜像:`pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple`
### 2. inventory-only 为什么不需要对象存储?
因为对象存储主要服务于 gemold 分析产物(HTML、导出文件等)。纯 inventory 部署不需要这部分基础设施。
## 10. 备份和恢复
### 3. gemold-only 为什么建议同时部署 Celery?
因为模具分析任务通常走异步处理链路,仅启动 API 而不启动 worker,会影响上传后的任务处理。
---
## 11. Docker Compose 说明
当前 [docker-compose.yml](../../docker-compose.yml) 仅启动:
- `moldinsight`
- `moldinsight-celery`
- `inventory`
它**不会**再拉起:
- PostgreSQL
- Redis
- MinIO
这些基础设施应由服务器现有服务提供,并通过 `.env` 传入连接信息。
示例:
### 数据库备份
```bash
# 备份数据库
sudo -u postgres pg_dump moldinsight > moldinsight_backup.sql
# 恢复数据库
sudo -u postgres psql -d moldinsight < moldinsight_backup.sql
docker compose --profile full up -d
```
### 文件备份
```bash
# 备份上传的文件和配置
tar -czf moldinsight_backup.tar.gz uploads/ html_output/ .env requirements.txt
```
---
## 快速启动脚本
## 12. 推荐阅读
创建启动脚本 `start.sh`:
```bash
#!/bin/bash
cd /opt/moldinsight/moldinsight_project
source venv/bin/activate
python src/main.py
```
赋予执行权限:
```bash
chmod +x start.sh
./start.sh
```
现在您的MoldInsight项目已经可以在Linux环境下正常运行!
- [README.md](../../README.md)
- [BACKEND_MODULARIZATION_BLUEPRINT.md](../BACKEND_MODULARIZATION_BLUEPRINT.md)
- [DEPLOY_PORT.md](./DEPLOY_PORT.md)
- [PORT_CONFIG.md](./PORT_CONFIG.md)