346 lines
6.0 KiB
Markdown
346 lines
6.0 KiB
Markdown
# 部署指南
|
||
|
||
> 本文档提供个人记账与预算管理系统的部署方案,包括本地部署、服务器部署、数据库备份与恢复。
|
||
|
||
---
|
||
|
||
## 一、本地部署(开发环境)
|
||
|
||
### 1.1 前置条件
|
||
|
||
- 安装 Node.js 18+:https://nodejs.org/
|
||
- 安装 Git:https://git-scm.com/
|
||
|
||
### 1.2 克隆项目
|
||
|
||
```bash
|
||
git clone <your-repo-url>
|
||
cd personal-finance-budget-system
|
||
```
|
||
|
||
### 1.3 配置环境变量
|
||
|
||
**后端**:
|
||
|
||
```bash
|
||
cd backend
|
||
copy .env.example .env # Windows
|
||
# cp .env.example .env # macOS/Linux
|
||
```
|
||
|
||
**前端**:
|
||
|
||
```bash
|
||
cd frontend
|
||
copy .env.example .env # Windows
|
||
# cp .env.example .env # macOS/Linux
|
||
```
|
||
|
||
### 1.4 安装依赖并启动
|
||
|
||
```bash
|
||
# 后端
|
||
cd backend
|
||
npm install
|
||
npm run db:generate
|
||
npm run db:push
|
||
npm run dev
|
||
|
||
# 新开终端,启动前端
|
||
cd frontend
|
||
npm install
|
||
npm run dev
|
||
```
|
||
|
||
### 1.5 访问应用
|
||
|
||
- 前端:`http://localhost:5173`
|
||
- 后端 API:`http://localhost:3001`
|
||
- Prisma Studio:`http://localhost:5555`
|
||
|
||
---
|
||
|
||
## 二、服务器部署(生产环境)
|
||
|
||
### 2.1 使用 PM2 部署(推荐)
|
||
|
||
#### 2.1.1 安装 PM2
|
||
|
||
```bash
|
||
npm install -g pm2
|
||
```
|
||
|
||
#### 2.1.2 后端部署
|
||
|
||
```bash
|
||
cd backend
|
||
|
||
# 安装生产依赖
|
||
npm install --production
|
||
|
||
# 配置生产环境变量
|
||
# 编辑 .env 文件,修改数据库路径等
|
||
DATABASE_URL="file:./prod.db"
|
||
PORT=3001
|
||
|
||
# 生成 Prisma 客户端并推送数据库结构
|
||
npm run db:generate
|
||
npm run db:push
|
||
|
||
# 使用 PM2 启动服务
|
||
pm2 start src/index.js --name finance-backend
|
||
|
||
# 设置开机自启
|
||
pm2 save
|
||
pm2 startup
|
||
```
|
||
|
||
#### 2.1.3 前端部署
|
||
|
||
```bash
|
||
cd frontend
|
||
|
||
# 配置生产环境变量
|
||
# 编辑 .env.production
|
||
VITE_API_BASE_URL=http://your-server-ip:3001
|
||
|
||
# 构建
|
||
npm run build
|
||
|
||
# 构建产物在 frontend/dist/ 目录
|
||
```
|
||
|
||
#### 2.1.4 使用 Nginx 托管前端
|
||
|
||
```nginx
|
||
server {
|
||
listen 80;
|
||
server_name your-domain.com;
|
||
|
||
# 前端静态文件
|
||
location / {
|
||
root /path/to/personal-finance-budget-system/frontend/dist;
|
||
try_files $uri $uri/ /index.html;
|
||
}
|
||
|
||
# 后端 API 代理(可选,避免跨域)
|
||
location /api {
|
||
proxy_pass http://localhost:3001;
|
||
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;
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2.2 使用 Docker 部署
|
||
|
||
#### 2.2.1 创建 Dockerfile(后端)
|
||
|
||
```dockerfile
|
||
# backend/Dockerfile
|
||
FROM node:20-alpine
|
||
|
||
WORKDIR /app
|
||
|
||
COPY package*.json ./
|
||
RUN npm install --production
|
||
|
||
COPY . .
|
||
|
||
RUN npm run db:generate
|
||
|
||
EXPOSE 3001
|
||
|
||
CMD ["node", "src/index.js"]
|
||
```
|
||
|
||
#### 2.2.2 创建 docker-compose.yml
|
||
|
||
```yaml
|
||
# docker-compose.yml
|
||
version: '3.8'
|
||
|
||
services:
|
||
backend:
|
||
build: ./backend
|
||
ports:
|
||
- "3001:3001"
|
||
volumes:
|
||
- ./backend/prisma:/app/prisma # 持久化数据库
|
||
environment:
|
||
- DATABASE_URL=file:./prod.db
|
||
- PORT=3001
|
||
restart: always
|
||
|
||
frontend:
|
||
image: node:20-alpine
|
||
working_dir: /app
|
||
volumes:
|
||
- ./frontend:/app
|
||
command: sh -c "npm install && npm run build"
|
||
depends_on:
|
||
- backend
|
||
```
|
||
|
||
#### 2.2.3 启动
|
||
|
||
```bash
|
||
docker-compose up -d
|
||
```
|
||
|
||
---
|
||
|
||
## 三、数据库备份与恢复
|
||
|
||
### 3.1 备份数据库
|
||
|
||
SQLite 数据库为单文件,直接拷贝即可:
|
||
|
||
```bash
|
||
# 备份
|
||
cp backend/prisma/dev.db backend/prisma/dev.db.backup.$(date +%Y%m%d)
|
||
|
||
# 或使用 tar 打包
|
||
tar czf db-backup-$(date +%Y%m%d).tar.gz backend/prisma/dev.db
|
||
```
|
||
|
||
### 3.2 恢复数据库
|
||
|
||
```bash
|
||
# 恢复
|
||
cp backend/prisma/dev.db.backup.20260428 backend/prisma/dev.db
|
||
|
||
# 或从 tar 恢复
|
||
tar xzf db-backup-20260428.tar.gz -C backend/prisma/
|
||
```
|
||
|
||
### 3.3 导出 SQL(可选)
|
||
|
||
```bash
|
||
cd backend
|
||
npx prisma db pull # 从现有数据库拉取 schema
|
||
npx prisma db push # 推送到新的数据库实例
|
||
```
|
||
|
||
### 3.4 自动备份脚本
|
||
|
||
创建定时备份脚本 `backup.sh`:
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
BACKUP_DIR="./backups"
|
||
DATE=$(date +%Y%m%d_%H%M%S)
|
||
DB_FILE="./backend/prisma/dev.db"
|
||
|
||
mkdir -p $BACKUP_DIR
|
||
cp $DB_FILE "$BACKUP_DIR/dev.db.$DATE.backup"
|
||
|
||
# 保留最近 7 天的备份
|
||
find $BACKUP_DIR -name "*.backup" -mtime +7 -delete
|
||
|
||
echo "备份完成: $BACKUP_DIR/dev.db.$DATE.backup"
|
||
```
|
||
|
||
添加到 crontab(Linux/macOS):
|
||
|
||
```bash
|
||
# 每天凌晨 2 点备份
|
||
0 2 * * * /path/to/backup.sh
|
||
```
|
||
|
||
---
|
||
|
||
## 四、常见问题排查
|
||
|
||
### 4.1 后端启动失败
|
||
|
||
**问题**: `Error: Cannot find module '@prisma/client'`
|
||
|
||
**解决**:
|
||
```bash
|
||
cd backend
|
||
npm run db:generate
|
||
```
|
||
|
||
**问题**: `Error: P1001: Can't reach database server`
|
||
|
||
**解决**: 检查 `.env` 中的 `DATABASE_URL` 是否正确。
|
||
|
||
### 4.2 前端构建失败
|
||
|
||
**问题**: `Type error: Cannot find module '@/services/apiClient'`
|
||
|
||
**解决**: 检查 `tsconfig.json` 中的 `paths` 配置是否正确。
|
||
|
||
**问题**: 构建后页面空白
|
||
|
||
**解决**: 检查 `vite.config.js` 中的 `base` 配置,确保部署路径正确。
|
||
|
||
### 4.3 API 跨域问题
|
||
|
||
**问题**: 前端请求后端报 CORS 错误
|
||
|
||
**解决**:
|
||
1. 确认后端已安装并启用 `cors` 中间件
|
||
2. 生产环境应配置具体的前端域名,而非 `*`
|
||
|
||
### 4.4 数据库文件权限问题(Linux)
|
||
|
||
**问题**: `SQLITE_ERROR: unable to open database file`
|
||
|
||
**解决**:
|
||
```bash
|
||
# 检查权限
|
||
ls -la backend/prisma/dev.db
|
||
|
||
# 修改权限
|
||
chmod 644 backend/prisma/dev.db
|
||
chown $(whoami) backend/prisma/dev.db
|
||
```
|
||
|
||
### 4.5 端口被占用
|
||
|
||
**问题**: `Error: listen EADDRINUSE: address already in use 0.0.0.0:3001`
|
||
|
||
**解决**:
|
||
```bash
|
||
# 查看占用端口的进程
|
||
# Windows
|
||
netstat -ano | findstr :3001
|
||
taskkill /PID <PID> /F
|
||
|
||
# Linux/macOS
|
||
lsof -i :3001
|
||
kill -9 <PID>
|
||
```
|
||
|
||
或修改端口:
|
||
|
||
```bash
|
||
# 修改 .env
|
||
PORT=3002
|
||
```
|
||
|
||
---
|
||
|
||
## 五、生产环境安全检查清单
|
||
|
||
部署前请确认以下事项:
|
||
|
||
- [ ] 移除 `/api/init-test-data` 测试接口
|
||
- [ ] 接入 JWT 鉴权,从 Token 解析 userId
|
||
- [ ] CORS 限制为前端域名
|
||
- [ ] 配置请求频率限制(Rate Limit)
|
||
- [ ] 配置 HTTPS 强制
|
||
- [ ] 限制请求体大小(防 DoS)
|
||
- [ ] 数据库文件定期备份
|
||
- [ ] 配置日志监控和告警
|
||
- [ ] 移除 `.env` 文件中的敏感信息(如提交到 Git)
|
||
|
||
---
|
||
|
||
**最后更新**: 2026-04-28
|