Files
mokeeText/docs/DEPLOY.md
2026-07-15 16:08:17 +08:00

311 lines
8.8 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.
# MoKeeText 部署文档
## 部署架构
```
Internet
┌───────┴───────┐
│ 反向代理/Nginx │ (运维侧管理SSL 终端)
└───────┬───────┘
┌─────────────┼─────────────┐
│ │ │
:3006 (前端) :4006 (后端) :3306 (MySQL)
│ │ │
┌─────────┴──┐ ┌──────┴──────┐ ┌──┴──────────┐
│ Nginx │ │ FastAPI │ │ MySQL 8.0 │
│ (Alpine) │ │ (Python3.12)│ │ (远程) │
│ │ │ │ │ │
│ 静态文件 │ │ API + ORM │ │ 10.20.1.122 │
└────────────┘ └─────────────┘ └──────────────┘
容器: frontend 容器: backend 外部服务
```
**两个容器**
- **frontend** — Nginx Alpine挂载 Vue 构建产物,端口 3006
- **backend** — Python 3.12-slimUvicorn 运行 FastAPI端口 4006
**跨域通信**:前端直接跨域请求后端 APINginx **不代理** `/api/`。CORS 在后端 FastAPI 中配置。
---
## 环境信息
| 项目 | 值 |
|------|-----|
| 服务器 IP | `101.132.183.138` |
| SSH 用户 | `root` |
| SSH 认证 | 密钥(~/.ssh/id_rsa |
| 项目路径 | `/data/mokee/mokeetext` |
| 前端域名 | `https://mokeetext.zgitm.com` → 端口 `3006` |
| 后端域名 | `https://mokeetext.server.zgitm.com` → 端口 `4006` |
| 数据库 | MySQL `10.20.1.122:3306` / 库 `mokeetext` |
| 数据库用户 | `mokeetext` |
---
## 服务器目录结构
```
/data/mokee/mokeetext/
├── docker-compose.yml # 容器编排(由 deploy.py 上传)
├── backend/
│ ├── Dockerfile
│ ├── app.py
│ ├── models.py
│ ├── config.py
│ ├── logger.py
│ ├── init_db.py
│ ├── requirements.txt
│ ├── routes/
│ │ ├── notes.py
│ │ ├── websites.py
│ │ ├── import_api.py
│ │ ├── upload.py
│ │ └── share.py
│ └── middleware/
│ └── user_context.py
├── frontend/
│ ├── Dockerfile.frontend
│ ├── nginx.conf
│ └── static/
│ └── dist/ # Vue 构建产物Nginx 托管)
└── logs/ # 应用日志(挂载到宿主机)
├── mokeetext.log # 按天轮转
└── current.log
```
---
## 日常部署流程
### 前置条件
1. SSH 密钥已配置到服务器
2. 本地已安装 Python 3.12 + paramiko
### 快速部署(仅前端改动)
大多数改动只需要重新构建前端并重建 frontend 容器:
```bash
# 1. 构建前端
cd frontend
npx vite build
# 2. 部署
cd ..
python deploy/deploy.py
```
`deploy.py` 会自动:
1. SSH 连接到服务器
2. 清理旧的 JS/CSS 文件
3. SFTP 上传新的 `static/dist/` 文件
4. 执行 `docker compose up -d --build frontend`
### 后端改动部署
如果修改了后端代码:
```bash
# 1. 上传后端文件
scp backend/*.py root@101.132.183.138:/data/mokee/mokeetext/backend/
scp backend/routes/*.py root@101.132.183.138:/data/mokee/mokeetext/backend/routes/
scp backend/middleware/*.py root@101.132.183.138:/data/mokee/mokeetext/backend/middleware/
# 2. 重建后端容器
ssh root@101.132.183.138 'cd /data/mokee/mokeetext && docker compose up -d --build backend'
```
### Docker Compose 配置变更
如果修改了 `docker-compose.yml`
```bash
scp deploy/docker-compose.yml root@101.132.183.138:/data/mokee/mokeetext/docker-compose.yml
ssh root@101.132.183.138 'cd /data/mokee/mokeetext && docker compose up -d --build'
```
---
## 首次部署(从零搭建)
### 1. 服务器准备
```bash
# SSH 到服务器
ssh root@101.132.183.138
# 安装 Docker如果尚未安装
curl -fsSL https://get.docker.com | sh
# 创建项目目录
mkdir -p /data/mokee/mokeetext/{backend/routes,backend/middleware,frontend/static/dist,logs}
```
### 2. 上传文件
```bash
# 在本地上传所有文件
scp deploy/docker-compose.yml root@101.132.183.138:/data/mokee/mokeetext/
scp backend/*.py backend/*.txt backend/Dockerfile backend/.dockerignore \
root@101.132.183.138:/data/mokee/mokeetext/backend/
scp backend/routes/*.py root@101.132.183.138:/data/mokee/mokeetext/backend/routes/
scp backend/middleware/*.py root@101.132.183.138:/data/mokee/mokeetext/backend/middleware/
scp frontend/Dockerfile.frontend frontend/nginx.conf frontend/.dockerignore \
root@101.132.183.138:/data/mokee/mokeetext/frontend/
# 构建前端并上传
cd frontend && npx vite build && cd ..
scp -r frontend/static/dist/* root@101.132.183.138:/data/mokee/mokeetext/frontend/static/dist/
```
### 3. 启动服务
```bash
ssh root@101.132.183.138 'cd /data/mokee/mokeetext && docker compose up -d --build'
```
### 4. 验证
```bash
# 检查容器状态
ssh root@101.132.183.138 'cd /data/mokee/mokeetext && docker compose ps'
# 检查后端健康
curl https://mokeetext.server.zgitm.com/api/notes
# 检查前端
curl https://mokeetext.zgitm.com
```
---
## 常用运维命令
### 容器管理
```bash
# 查看运行状态
ssh root@101.132.183.138 'cd /data/mokee/mokeetext && docker compose ps'
# 查看日志
ssh root@101.132.183.138 'cd /data/mokee/mokeetext && docker compose logs --tail=50 backend'
ssh root@101.132.183.138 'cd /data/mokee/mokeetext && docker compose logs --tail=50 frontend'
# 重启单个服务
ssh root@101.132.183.138 'cd /data/mokee/mokeetext && docker compose restart backend'
# 停止所有服务
ssh root@101.132.183.138 'cd /data/mokee/mokeetext && docker compose down'
# 完全重建(清除缓存)
ssh root@101.132.183.138 'cd /data/mokee/mokeetext && docker compose build --no-cache && docker compose up -d'
```
### 日志查看
```bash
# 应用日志(按天拆分)
ssh root@101.132.183.138 'ls -la /data/mokee/mokeetext/logs/'
ssh root@101.132.183.138 'tail -100 /data/mokee/mokeetext/logs/current.log'
# 实时跟踪
ssh root@101.132.183.138 'tail -f /data/mokee/mokeetext/logs/current.log'
```
### 数据库操作
```bash
# 进入 MySQL
ssh root@101.132.183.138 'docker exec -it mokeetext-backend-1 python -c "
import pymysql
conn = pymysql.connect(host=\"10.20.1.122\", user=\"mokeetext\", password=\"mokee.\", database=\"mokeetext\")
print(\"connected\")
conn.close()
"'
```
---
## 环境变量
### Backend 容器
| 变量 | 默认值 | 说明 |
|------|--------|------|
| `MYSQL_HOST` | `10.20.1.122` | 数据库主机 |
| `MYSQL_PORT` | `3306` | 数据库端口 |
| `MYSQL_USER` | `mokeetext` | 数据库用户 |
| `MYSQL_PASSWORD` | `mokee.` | 数据库密码 |
| `MYSQL_DATABASE` | `mokeetext` | 数据库名 |
| `LOG_DIR` | `/data/mokee/mokeetext/logs` | 日志目录 |
这些在 `docker-compose.yml` 中定义,可通过 `.env` 文件覆盖。
### Frontend 构建
| 变量 | 说明 |
|------|------|
| `VITE_API_BASE` | 生产环境 API 地址 |
| `VITE_LOGIN_URL` | 统一登录页地址 |
| `VITE_SYSTEM_CODE` | 系统编码 |
定义在 `frontend/.env.production` 中。
---
## 回滚
如果部署出现问题:
```bash
# 1. 回到上一个前端镜像
ssh root@101.132.183.138 'cd /data/mokee/mokeetext && docker compose up -d frontend'
# Docker 会使用缓存的镜像层
# 2. 如果有备份的 dist 文件
scp backup-dist/* root@101.132.183.138:/data/mokee/mokeetext/frontend/static/dist/
ssh root@101.132.183.138 'cd /data/mokee/mokeetext && docker compose restart frontend'
# 3. 极端情况:重建所有容器
ssh root@101.132.183.138 'cd /data/mokee/mokeetext && docker compose down && docker compose up -d --build'
```
---
## 故障排查
### 前端页面空白
1. 检查 Nginx 容器是否运行:`docker compose ps frontend`
2. 检查 dist 文件是否存在:`ls /data/mokee/mokeetext/frontend/static/dist/`
3. 检查 Nginx 日志:`docker compose logs frontend`
### API 返回 500
1. 检查后端容器日志:`docker compose logs backend --tail=100`
2. 检查数据库连接:确认 MySQL 可访问
3. 检查应用日志:`tail -100 /data/mokee/mokeetext/logs/current.log`
### CORS 错误
1. 确认前端请求的 API 地址正确
2. 确认 `app.py``allow_origins` 包含当前域名
3. 确认请求未经过 Nginx 代理(前端直接调后端)
### 容器无法启动
```bash
# 查看构建日志
ssh root@101.132.183.138 'cd /data/mokee/mokeetext && docker compose build --progress=plain'
# 检查端口占用
ssh root@101.132.183.138 'netstat -tlnp | grep -E "3006|4006"'
```