|
|
1 개월 전 | |
|---|---|---|
| .. | ||
| packages | 4 달 전 | |
| 生产环境数据库备份的shell脚本 | 1 개월 전 | |
| README.md | 1 개월 전 | |
| backend.env.production.example | 1 개월 전 | |
| deploy-checklist.md | 4 달 전 | |
| deploy-release.sh | 2 달 전 | |
| nginx-dbapp.shanxiachem.com.conf | 2 달 전 | |
| nginx-shanxia-miniprogram-static.conf | 3 달 전 | |
| nginx-shanxia2.0.conf | 1 개월 전 | |
| web-admin.env.production.example | 1 개월 전 | |
目标机器:
121.43.228.102
与现有 CRM(80 端口 /web.conf)并存,通过 9911(前端)+ 9111(后端) 独立端口部署山峡一体化门户。
┌─────────────────────────────────────────┐
│ 121.43.228.102 │
│ │
浏览器 ──────────►│ nginx :9911 │
(管理端) │ ├─ / → 静态 dist (SPA) │
│ └─ /api/* → 127.0.0.1:9111 │
│ │
│ uvicorn :9111 (FastAPI) │
│ ├─ MySQL 47.99.164.66:3306 │
│ ├─ Redis 47.99.164.66:16379 │
│ └─ MinIO 47.99.164.66:20004 │
│ │
浏览器 ──────────►│ nginx :80 (现有 CRM,保持不变) │
(CRM) │ └─ /prod-api/* → :8080 │
└─────────────────────────────────────────┘
| 项 | 说明 |
|---|---|
| 端口隔离 | CRM 继续占用 80;shanxia2.0 使用 9911/9111,互不影响 |
| 同库同中间件 | 数据库、Redis、MinIO 与本地开发一致(远程 47.99.164.66) |
| Nginx 反代 API | 前端 VITE_API_URL=/api,由 Nginx 转发到后端,避免浏览器跨域 |
| 后端仅本机监听 | 9111 建议只绑定 127.0.0.1,对外只暴露 9911 |
| 环境文件分离 | 生产使用 backend/.env.production,不直接使用开发 .env |
| 构建在本地/CI | 服务器只放 dist 与 Python 源码,不在生产机跑 pnpm dev |
| 路径 | 内容 |
|---|---|
/iflytek/shanxia2.0/backend |
Python 后端源码 + venv + .env.production |
/iflytek/shanxia2.0/web/dist |
前端 pnpm build 产物(仓库对应 web-admin/dist) |
/etc/nginx/conf.d/shanxia2.0.conf |
Nginx 站点配置(见同目录模板) |
仓库前端工程名为
web-admin,部署到服务器时目录按约定命名为web/dist。
python3-venv)47.99.164.66:3306 / 16379 / 20004shanxia2.0(与本地 DATABASE_URL 一致)docs/sql/shanxia2.0.sqldocs/sql/2026*.sql 等迁移文件docs/sql/optional-sys-api-request-log.sql(不建表则设置 API_REQUEST_LOG_ENABLED=false)# 本地打包示例(排除 venv、日志、缓存)
cd /path/to/shanxia2.0
tar czf shanxia2.0-backend.tar.gz \
--exclude='backend/venv' \
--exclude='backend/logs' \
--exclude='backend/__pycache__' \
--exclude='backend/.env' \
backend/
生产环境部署/backend.env.production.example → 服务器 backend/.env.productionbackend/.env 中的 DATABASE / Redis / MinIO 值为基准填入DEBUG=falseSECRET_KEY → 随机长字符串(勿用默认值)LOGIN_RSA_PRIVATE_KEY_PEM → 固定 PEM(多 worker / 重启后登录公钥不变)BACKEND_CORS_ORIGINS=["http://121.43.228.102:9911"](若后续绑域名一并加入)PUBLIC_WEB_ORIGIN=http://121.43.228.102:9911(公开 H5 页链接)生产环境部署/web-admin.env.production.example → web-admin/.env.productioncd web-admin
pnpm install
pnpm build
# 产物:web-admin/dist/
tar czf shanxia2.0-web-dist.tar.gz -C web-admin dist
# 在本地执行(示例)
scp shanxia2.0-backend.tar.gz root@121.43.228.102:/iflytek/shanxia2.0/
scp shanxia2.0-web-dist.tar.gz root@121.43.228.102:/iflytek/shanxia2.0/
scp 生产环境部署/nginx-shanxia2.0.conf root@121.43.228.102:/etc/nginx/conf.d/
在服务器解压:
mkdir -p /iflytek/shanxia2.0/backend /iflytek/shanxia2.0/web
cd /iflytek/shanxia2.0
tar xzf shanxia2.0-backend.tar.gz
mkdir -p web && tar xzf shanxia2.0-web-dist.tar.gz -C web
# 解压后路径应为 /iflytek/shanxia2.0/web/dist/index.html
cd /iflytek/shanxia2.0/backend
# 创建虚拟环境并安装依赖
python3 -m venv venv
./venv/bin/pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 确认环境文件
ls -la .env.production
# 启动(端口 9111,2 worker)
PORT=9111 WORKERS=2 ENV_FILE=./.env.production ./start-prod.sh start
# 查看状态与日志
./start-prod.sh status
./start-prod.sh logs
健康检查(服务器本机):
curl -s http://127.0.0.1:9111/health
# 期望:{"status":"healthy"}
nginx-shanxia2.0.conf(已按 9911 / 9111 写好)nginx -t
nginx -s reload
# 或 systemctl reload nginx
curl -s http://127.0.0.1:9911/health
curl -s http://127.0.0.1:9911/api/... # 任选一个公开接口
curl -I http://127.0.0.1:9911/
| 检查项 | 操作 | 期望 |
|---|---|---|
| 静态页 | 浏览器打开 http://121.43.228.102:9911 |
登录页正常 |
| 登录 | admin / 111111(或实际账号) | RSA 登录成功,进入工作台 |
| API 代理 | F12 Network 看请求 | 均为同源 /api/...,无 CORS 报错 |
| 附件 | 上传/预览 | MinIO URL 可访问 |
| 路由 | 刷新任意 #/pl/... 页面 |
不出现 404(SPA fallback) |
| CRM 不受影响 | 访问 http://121.43.228.102 |
CRM 仍正常 |
| 对比项 | CRM (web.conf) |
shanxia2.0 (shanxia2.0.conf) |
|---|---|---|
| 监听端口 | 80 | 9911 |
| 静态根目录 | /iflytek/prod/dist |
/iflytek/shanxia2.0/web/dist |
| API 前缀 | /prod-api/ |
/api/ |
| 后端端口 | 8080 (Java) | 9111 (Python) |
| SSE | 有专用 location | 当前门户暂无 SSE,可后续按需追加 |
shanxia2.0 的 Nginx 写法参照 CRM 的代理头、超时、Gzip、SPA fallback,仅替换端口与路径前缀。
.env.production)详见 backend.env.production.example。与本地 .env 对齐的字段:
DATABASE_URLREDIS_*MINIO_* / STORAGE_TYPE=minioDEFAULT_TENANT_NO=shanxia2.0API_ENCRYPT_*(当前本地为 false,生产保持一致即可;若开启需前后端同时开启且密钥一致)生产额外注意:
DEBUG=falseLOGIN_ALLOW_PLAINTEXT_LOGIN=falseLOGIN_RSA_PRIVATE_KEY_PEM(可从本地生成后复制,或使用 openssl genrsa 2048).env.production,构建时生效)详见 web-admin.env.production.example:
VITE_API_URL=/api(走 Nginx 同源代理)VITE_BASE_URL=/VITE_API_ENCRYPT_ENABLED=false(与后端一致)VITE_MINIO_BASE_URL=https://res.shanxiachem.com/ruoyi(与后端 MINIO_BASE_URL 一致)macOS 本机从仓库根目录执行(凭据读自根目录 生产机器账号密码,密码不写进脚本):
./生产环境部署/deploy-release.sh
# 已有 dist 时可跳过构建:
./生产环境部署/deploy-release.sh --skip-build
顺序:本地 pnpm build → 备份远程 web → 同步 dist(保留远程 dist/src)→ 备份远程 backend → 替换 backend/app → PORT=9111 WORKERS=1 ENV_FILE=./.env.production ./start-prod.sh restart → 健康检查。
备份落在 /iflytek/shanxia2.0/bak/web-* 与 backend-*。依赖:ssh、rsync、sshpass(brew install hudochenkov/sshpass/sshpass)、pnpm。
cd /iflytek/shanxia2.0/backend
# 上传新代码后
./venv/bin/pip install -r requirements.txt
PORT=9111 WORKERS=1 ENV_FILE=./.env.production ./start-prod.sh restart
# 本地 build 后上传 dist;务必保留远程 dist/src
rsync -avz --delete --exclude 'src/' web-admin/dist/ root@121.43.228.102:/iflytek/shanxia2.0/web/dist/
# 无需重启后端;浏览器强刷或清缓存
docs/sql/ 编写增量 SQL| 组件 | 路径 |
|---|---|
| 后端 | /iflytek/shanxia2.0/backend/logs/backend-prod.log |
| Nginx | 按现有 CRM 同样 log 目录配置(可在 conf 中取消注释) |
可使用 systemd unit 管理 start-prod.sh:
# /etc/systemd/system/shanxia2.0-backend.service
[Unit]
Description=shanxia2.0 FastAPI Backend
After=network.target
[Service]
Type=forking
WorkingDirectory=/iflytek/shanxia2.0/backend
Environment=PORT=9111
Environment=WORKERS=2
Environment=ENV_FILE=/iflytek/shanxia2.0/backend/.env.production
ExecStart=/iflytek/shanxia2.0/backend/start-prod.sh start
ExecStop=/iflytek/shanxia2.0/backend/start-prod.sh stop
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable shanxia2.0-backend
systemctl start shanxia2.0-backend
/iflytek/shanxia2.0/bak/web-* 中对应备份覆盖回 web(注意勿误删业务依赖的 dist/src)bak/backend-* 还原后,在 backend 目录执行 PORT=9111 WORKERS=1 ENV_FILE=./.env.production ./start-prod.sh restartmysqldumpportal.shanxiachem.com + SSL,并更新 BACKEND_CORS_ORIGINSAPI_ENCRYPT_ENABLED=true,前后端密钥与排除路径保持一致http://121.43.228.102:9911/api 或单独域名/health 做存活探测;对接现有 Spring Boot Admin 以外的监控| 文件 | 用途 |
|---|---|
README.md |
本文档 |
deploy-release.sh |
macOS 一键发版(前端→后端,含备份与健康检查) |
nginx-shanxia2.0.conf |
Nginx 站点模板 |
backend.env.production.example |
后端生产环境变量模板 |
web-admin.env.production.example |
前端构建环境变量模板 |
deploy-checklist.md |
上线检查清单(可打印) |