Files
2026-04-29 10:53:12 +08:00

346 lines
6.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 部署指南
> 本文档提供个人记账与预算管理系统的部署方案,包括本地部署、服务器部署、数据库备份与恢复。
---
## 一、本地部署(开发环境)
### 1.1 前置条件
- 安装 Node.js 18+https://nodejs.org/
- 安装 Githttps://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"
```
添加到 crontabLinux/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