5.1 KiB
5.1 KiB
呼籁官网 部署说明
项目结构
hulai-website/ # 官网前端(Nuxt 3 SSR)
hulai-admin-web/ # 管理后台前端(Vue 3 + Element Plus)
hulai-admin-api/ # 管理后台后端(FastAPI + MySQL)
环境要求
- Node.js >= 20
- pnpm(
npm install -g pnpm) - pm2(
npm install -g pm2) - Python >= 3.12
- MySQL 8.0
- Nginx
端口规划
| 服务 | 端口 | 说明 |
|---|---|---|
| hulai-admin-api | 9003 | FastAPI 后端(uvicorn) |
| hulai-admin-web | 9001 | 管理后台前端(nginx 静态) |
| hulai-website | 9002 | 官网(nginx 反代 → Nuxt SSR 3001) |
| Nuxt SSR | 3001 | 内部端口,pm2 管理 |
一、后端部署(hulai-admin-api)
1. 创建数据库
CREATE DATABASE hulai_gw CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. 安装依赖
cd hulai-admin-api
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# 注意:如果 bcrypt 报错,降级:pip install bcrypt==4.0.1
3. 配置 .env
cat > .env << 'EOF'
DATABASE_URL=mysql+pymysql://root:密码@localhost:3306/hulai_gw?charset=utf8mb4
JWT_SECRET_KEY=生产环境请用强随机密钥
JWT_ALGORITHM=HS256
JWT_EXPIRE_MINUTES=480
NUXT_DATA_PATH=/opt/gw/hulai-website/data
NUXT_PROJECT_PATH=/opt/gw/hulai-website
UPLOAD_DIR=/opt/gw/hulai-website/public/images
EOF
4. 初始化数据库表
source venv/bin/activate
python3 -c '
from app.database import engine, Base
from app.models import *
Base.metadata.create_all(bind=engine)
print("Tables created")
'
5. 创建管理员账号
python3 -c '
from app.database import SessionLocal
from app.models.user import AdminUser
from app.auth import hash_password
db = SessionLocal()
user = AdminUser(username="admin", password_hash=hash_password("Admin@123456"), role="admin", is_active=True)
db.add(user); db.commit(); db.close()
print("Admin created")
'
6. 启动服务
source venv/bin/activate
ENV=development nohup uvicorn app.main:app --host 0.0.0.0 --port 9003 > /tmp/gw-api.log 2>&1 &
7. 导入现有数据(可选)
如果 hulai-website/data/ 下有 JSON 数据文件,可用脚本导入到数据库:
python3 scripts/import_remaining.py
python3 scripts/import_products.py
二、管理后台前端(hulai-admin-web)
1. 安装依赖 & 构建
cd hulai-admin-web
npm install --legacy-peer-deps
npm run build
构建产物在 dist/ 目录。
三、官网前端(hulai-website)
1. 安装依赖 & 构建
cd hulai-website
pnpm install
pnpm build
2. 用 pm2 启动 SSR 服务
PORT=3001 pm2 start .output/server/index.mjs --name gw-website
pm2 save
pm2 startup # 设置开机自启
四、Nginx 配置
# 管理后台 - 端口 9001
server {
listen 9001;
server_name _;
root /opt/gw/hulai-admin-web/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:9003;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /images/ {
alias /opt/gw/hulai-website/public/images/;
}
}
# 官网 - 端口 9002
server {
listen 9002;
server_name _;
location / {
proxy_pass http://127.0.0.1:3001;
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;
}
}
# 放到 sites-available 并启用
cp gw.conf /etc/nginx/sites-available/gw
ln -sf /etc/nginx/sites-available/gw /etc/nginx/sites-enabled/gw
nginx -t && nginx -s reload
五、自动导出 & 重建
管理后台编辑内容保存后,系统自动:
- 将数据库数据导出为 JSON 文件(写入
hulai-website/data/) - 写入触发文件
/tmp/gw-rebuild-trigger - cron 每分钟检测触发文件 → 执行
pnpm build→pm2 restart
设置 cron
chmod +x /opt/gw/hulai-admin-api/rebuild.sh
(crontab -l 2>/dev/null; echo '* * * * * /opt/gw/hulai-admin-api/rebuild.sh') | crontab -
手动触发重建
/opt/gw/hulai-admin-api/rebuild.sh
查看重建日志
tail -f /tmp/gw-rebuild.log
六、防火墙
ufw allow 9001/tcp comment 'GW admin-web'
ufw allow 9002/tcp comment 'GW website'
ufw reload
七、日常运维
# 查看 API 日志
tail -f /tmp/gw-api.log
# 重启 API
kill $(ps aux | grep 'uvicorn app.main' | grep -v grep | awk '{print $2}')
cd /opt/gw/hulai-admin-api && source venv/bin/activate
ENV=development nohup uvicorn app.main:app --host 0.0.0.0 --port 9003 > /tmp/gw-api.log 2>&1 &
# 重启官网
pm2 restart gw-website
# 重建官网
cd /opt/gw/hulai-website && pnpm build && pm2 restart gw-website
# 查看 pm2 状态
pm2 list
pm2 logs gw-website
八、测试环境信息
| 项目 | 地址 |
|---|---|
| 管理后台 | http://1.182.108.58:9001 |
| 官网 | http://1.182.108.58:9002 |
| API 健康检查 | http://1.182.108.58:9003/api/health |
| 管理员账号 | admin / Admin@123456 |