hulai-website/DEPLOY.md
2026-03-22 21:18:05 +08:00

5.1 KiB

呼籁官网 部署说明

项目结构

hulai-website/       # 官网前端Nuxt 3 SSR
hulai-admin-web/     # 管理后台前端Vue 3 + Element Plus
hulai-admin-api/     # 管理后台后端FastAPI + MySQL

环境要求

  • Node.js >= 20
  • pnpmnpm install -g pnpm
  • pm2npm 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

五、自动导出 & 重建

管理后台编辑内容保存后,系统自动:

  1. 将数据库数据导出为 JSON 文件(写入 hulai-website/data/
  2. 写入触发文件 /tmp/gw-rebuild-trigger
  3. cron 每分钟检测触发文件 → 执行 pnpm buildpm2 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