从本地上传部署包到服务器:
# 在本地执行
scp -r deploy-package root@8.159.134.106:/tmp/
SSH 连接到服务器:
ssh root@8.159.134.106
cd /data/ai
BACKUP_DIR="/data/ai/backup_$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_DIR
# 备份现有文件
if [ -d "server" ]; then cp -r server $BACKUP_DIR/; fi
if [ -d "frontend" ]; then cp -r frontend $BACKUP_DIR/; fi
echo "备份完成: $BACKUP_DIR"
cd /data/ai
# 移动临时文件到目标位置
rm -rf server frontend
mv /tmp/deploy-package/server .
mv /tmp/deploy-package/frontend .
# 安装依赖
cd server
npm install --production
# 生成 Prisma Client
npx prisma generate
echo "文件部署完成!"
# 后端 API 反向代理 (bookapi.rrbrr.com)
cat > /etc/nginx/sites-available/book-api << 'EOF'
server {
listen 80;
server_name bookapi.rrbrr.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
proxy_cache_bypass $http_upgrade;
}
}
EOF
# 前端静态文件 (book.rrbrr.com)
cat > /etc/nginx/sites-available/book-frontend << 'EOF'
server {
listen 80;
server_name book.rrbrr.com;
root /data/ai/frontend;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
EOF
# 启用站点
ln -sf /etc/nginx/sites-available/book-api /etc/nginx/sites-enabled/
ln -sf /etc/nginx/sites-available/book-frontend /etc/nginx/sites-enabled/
# 移除默认站点
rm -f /etc/nginx/sites-enabled/default
# 测试并重载
nginx -t
systemctl reload nginx
echo "Nginx 配置完成!"
cd /data/ai/server
# 安装 PM2
npm install -g pm2
# 停止旧服务
pm2 delete server 2>/dev/null || true
# 启动服务
pm2 start dist/app.js --name server
# 保存并设置开机启动
pm2 save
pm2 startup
# 查看服务状态
pm2 status
在域名管理后台添加 DNS 记录:
# 检查后端服务状态
pm2 status
curl http://localhost:3000/api/health
# 检查前端
curl http://localhost/
# 检查 nginx 状态
systemctl status nginx
# 查看日志
pm2 logs server
# 重启服务
pm2 restart server
# 停止服务
pm2 stop server
# 测试配置
nginx -t
# 重载配置
systemctl reload nginx
# 重启 Nginx
systemctl restart nginx
# Nginx 访问日志
tail -f /var/log/nginx/access.log
# Nginx 错误日志
tail -f /var/log/nginx/error.log
# 后端日志
pm2 logs server --lines 50
lsof -i:3000.env 文件存在pm2 logs serverls -la /data/ai/frontend/nginx -tsystemctl status mysqlcat /data/ai/server/.env在服务器上创建并执行:
cat > /data/ai/deploy.sh << 'EOFSCRIPT'
#!/bin/bash
set -e
echo "开始部署..."
# 备份
BACKUP_DIR="/data/ai/backup_$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_DIR
[ -d "server" ] && cp -r server $BACKUP_DIR/
[ -d "frontend" ] && cp -r frontend $BACKUP_DIR/
# 部署
rm -rf server frontend
mv /tmp/deploy-package/server .
mv /tmp/deploy-package/frontend .
# 安装依赖
cd server
npm install --production
npx prisma generate
# 重启服务
pm2 restart server
echo "部署完成!"
EOFSCRIPT
chmod +x /data/ai/deploy.sh
/data/ai/deploy.sh