You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
6.2 KiB
6.2 KiB
部署指南
本项目提供多种部署方式,推荐使用 PM2 一键部署,简单快捷。
🚀 方案一:PM2 一键部署(推荐)
最简单的部署方式,适合 VPS、云服务器等场景。
Windows 部署
# 1. 运行部署脚本
.\deploy.ps1
Linux/macOS 部署
# 1. 添加执行权限
chmod +x deploy.sh
# 2. 运行部署脚本
./deploy.sh
部署脚本会自动完成:
- ✅ 检查并安装必要工具(Node.js、pnpm、PM2)
- ✅ 安装项目依赖
- ✅ 构建前后端项目
- ✅ 创建生产环境配置
- ✅ 运行数据库迁移
- ✅ 使用 PM2 启动服务
- ✅ 配置开机自启动
常用命令
# 查看服务状态
pm2 status
# 查看日志
pm2 logs
# 查看指定服务日志
pm2 logs just-demo-backend
pm2 logs just-demo-frontend
# 重启服务
pm2 restart all
pm2 restart just-demo-backend
# 停止服务
pm2 stop all
# 删除服务
pm2 delete all
访问地址
部署成功后,可通过以下地址访问:
🐳 方案二:Docker Compose 部署
适合需要容器化部署的场景。
1. 创建 Dockerfile
backend/Dockerfile:
FROM node:18-alpine
WORKDIR /app
# 安装 pnpm
RUN npm install -g pnpm
# 复制依赖文件
COPY package.json pnpm-lock.yaml ./
# 安装依赖
RUN pnpm install --prod
# 复制构建产物
COPY dist ./dist
COPY database ./database
COPY knexfile.js ./
# 创建上传目录
RUN mkdir -p uploads
EXPOSE 3000
CMD ["node", "dist/app.js"]
frontend/Dockerfile:
FROM node:18-alpine
WORKDIR /app
# 安装 serve
RUN npm install -g serve
# 复制构建产物
COPY dist ./dist
EXPOSE 5500
CMD ["serve", "dist", "-p", "5500", "-s"]
2. 创建 docker-compose.yml
version: '3.8'
services:
backend:
build:
context: ./backend
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- PORT=3000
- JWT_SECRET=${JWT_SECRET}
- FRONTEND_URL=http://localhost:5500
volumes:
- ./backend/database:/app/database
- ./backend/uploads:/app/uploads
restart: always
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
ports:
- "5500:5500"
depends_on:
- backend
restart: always
3. 部署
# 构建项目
pnpm build
# 启动容器
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止容器
docker-compose down
☁️ 方案三:云平台部署
3.1 Vercel + Railway
前端部署到 Vercel:
- 在 Vercel 导入项目
- 设置构建配置:
- Build Command:
cd frontend && pnpm install && pnpm build - Output Directory:
frontend/dist
- Build Command:
后端部署到 Railway:
- 在 Railway 创建新项目
- 连接 GitHub 仓库
- 设置环境变量:
NODE_ENV=production PORT=3000 JWT_SECRET=your-secret-key FRONTEND_URL=your-vercel-url
3.2 Render
- 在 Render 创建 Web Service
- 后端配置:
- Build Command:
cd backend && pnpm install && pnpm build - Start Command:
cd backend && node dist/app.js
- Build Command:
- 前端配置:
- Build Command:
cd frontend && pnpm install && pnpm build - Publish Directory:
frontend/dist
- Build Command:
📝 生产环境配置
必要的环境变量
在 backend/.env 文件中配置:
NODE_ENV=production
PORT=3000
JWT_SECRET=你的超级密钥-至少32字符
FRONTEND_URL=http://your-frontend-domain.com
UPLOAD_DIR=uploads
生成安全的 JWT_SECRET
# Linux/macOS
openssl rand -base64 32
# Windows PowerShell
[Convert]::ToBase64String((1..32 | ForEach-Object { Get-Random -Maximum 256 }))
🔒 安全建议
- 修改 JWT_SECRET:不要使用默认密钥
- 配置 HTTPS:使用 nginx + Let's Encrypt
- 限制文件上传大小:防止恶意上传
- 定期备份数据库:备份
backend/database/*.sqlite3 - 配置防火墙:只开放必要端口
🌐 使用 Nginx 反向代理(可选)
安装 Nginx
# Ubuntu/Debian
sudo apt update
sudo apt install nginx
# CentOS/RHEL
sudo yum install nginx
配置文件
创建 /etc/nginx/sites-available/just-demo:
server {
listen 80;
server_name your-domain.com;
# 前端
location / {
proxy_pass http://localhost:5500;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
# 后端 API
location /api {
proxy_pass http://localhost: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;
}
}
启用配置
sudo ln -s /etc/nginx/sites-available/just-demo /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
🔧 故障排查
服务无法启动
# 查看详细日志
pm2 logs --lines 100
# 检查端口占用
# Linux/macOS
lsof -i :3000
# Windows
netstat -ano | findstr :3000
数据库错误
# 重新运行迁移
cd backend
pnpm migrate:rollback:prod
pnpm migrate:prod
前端无法访问后端
检查 backend/.env 中的 FRONTEND_URL 配置是否正确。
📊 性能优化
- 启用 PM2 集群模式:充分利用多核 CPU
- 配置 Nginx 缓存:加快静态资源访问
- 使用 CDN:加速前端资源加载
- 定期清理日志:防止日志文件过大
🔄 更新部署
# 1. 拉取最新代码
git pull
# 2. 重新构建
pnpm build
# 3. 重启服务
pm2 restart all
# 或使用部署脚本
./deploy.sh
📞 技术支持
如遇问题,请检查:
- Node.js 版本是否 >= 16
- 端口 3000 和 5500 是否被占用
- 数据库文件是否有读写权限
- 环境变量是否配置正确