Files
DDUp/docs/deployment-guide.md
2026-01-22 12:57:26 +08:00

571 lines
10 KiB
Markdown
Raw 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.

# Vitals 云服务器部署指南
本指南详细介绍如何将 Vitals 部署到云服务器,实现公网访问。
## 目录
- [准备工作](#准备工作)
- [服务器初始化](#第一步服务器初始化)
- [安装 Docker](#第二步安装-docker)
- [配置防火墙](#第三步配置防火墙)
- [上传项目代码](#第四步上传项目代码)
- [配置环境变量](#第五步配置环境变量)
- [启动服务](#第六步启动服务)
- [配置 Nginx](#第七步安装配置-nginx)
- [配置域名](#第八步配置域名)
- [配置 HTTPS](#第九步配置-https)
- [自动备份](#第十步配置自动备份)
- [运维命令](#常用运维命令)
---
## 准备工作
### 购买云服务器
**推荐配置:**
| 配置项 | 推荐值 |
|--------|--------|
| CPU | 1核 |
| 内存 | 2GB |
| 硬盘 | 40GB SSD |
| 系统 | Ubuntu 22.04 LTS |
| 带宽 | 1-5Mbps |
**云厂商选择:**
| 厂商 | 价格参考 | 特点 |
|------|----------|------|
| 阿里云 | ~¥50/月 | 国内访问快,需备案 |
| 腾讯云 | ~¥45/月 | 国内访问快,需备案 |
| Vultr/DigitalOcean | ~$6/月 | 无需备案,海外访问 |
| Bandwagon | ~$50/年 | 便宜,适合个人 |
**购买后记录:**
- 服务器公网 IP: `_______________`
- SSH 端口: `22`
- root 密码或 SSH 密钥
---
## 第一步:服务器初始化
```bash
# 1. SSH 登录服务器
ssh root@你的服务器IP
# 2. 更新系统
apt update && apt upgrade -y
# 3. 设置时区
timedatectl set-timezone Asia/Shanghai
# 4. 安装常用工具
apt install -y vim curl wget git unzip
```
---
## 第二步:安装 Docker
```bash
# 1. 安装 Docker
curl -fsSL https://get.docker.com | sh
# 2. 启动并设置开机自启
systemctl start docker
systemctl enable docker
# 3. 验证安装
docker --version
# 4. 安装 Docker Compose 插件
apt install -y docker-compose-plugin
# 5. 验证
docker compose version
```
---
## 第三步:配置防火墙
```bash
# 1. 安装 ufw
apt install -y ufw
# 2. 配置规则
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp # SSH
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS
# 3. 启用防火墙
ufw enable
# 4. 查看状态
ufw status
```
---
## 第四步:上传项目代码
### 方式 A从本地上传
在本地机器执行:
```bash
# 1. 打包项目(排除不需要的文件)
cd /path/to/vitals
tar -czvf vitals.tar.gz \
--exclude='.git' \
--exclude='data' \
--exclude='__pycache__' \
--exclude='.coverage' \
--exclude='*.pyc' \
--exclude='.DS_Store' \
.
# 2. 上传到服务器
scp vitals.tar.gz root@你的服务器IP:/opt/
# 3. SSH 登录服务器解压
ssh root@你的服务器IP
cd /opt
mkdir -p vitals
tar -xzvf vitals.tar.gz -C vitals
rm vitals.tar.gz
```
### 方式 B从 Git 仓库拉取
```bash
ssh root@你的服务器IP
cd /opt
git clone https://github.com/你的用户名/vitals.git
```
---
## 第五步:配置环境变量
```bash
cd /opt/vitals
# 1. 复制模板
cp .env.example .env
# 2. 生成 JWT 密钥
openssl rand -hex 32
# 记录输出的随机字符串
# 3. 编辑配置
vim .env
```
编辑 `.env` 文件内容:
```bash
# 管理员账户
ADMIN_USERNAME=admin
ADMIN_PASSWORD=YourStrongPassword123!
# JWT 密钥(粘贴上面生成的随机字符串)
JWT_SECRET=粘贴上面生成的64位随机字符串
# AI 食物识别(可选)
DASHSCOPE_API_KEY=
DEEPSEEK_API_KEY=
```
**密码要求:**
- 至少 12 位
- 包含大小写字母和数字
- 建议包含特殊字符
---
## 第六步:启动服务
```bash
cd /opt/vitals
# 1. 创建数据目录
mkdir -p /opt/vitals/data
chmod 755 /opt/vitals/data
# 2. 构建并启动
docker compose up -d --build
# 3. 查看运行状态
docker compose ps
# 4. 查看日志
docker compose logs -f
# 5. 测试是否正常运行
curl http://localhost:8080/api/today
```
如果看到 JSON 响应,说明服务已正常运行。
---
## 第七步:安装配置 Nginx
```bash
# 1. 安装 Nginx
apt install -y nginx
# 2. 创建站点配置
vim /etc/nginx/sites-available/vitals
```
配置文件内容:
```nginx
server {
listen 80;
server_name _; # 先用下划线表示匹配所有,后面改成域名
# 文件上传大小限制
client_max_body_size 10M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
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;
# WebSocket 支持(如需要)
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
```
启用配置:
```bash
# 3. 创建软链接启用站点
ln -s /etc/nginx/sites-available/vitals /etc/nginx/sites-enabled/
# 4. 删除默认站点(可选)
rm /etc/nginx/sites-enabled/default
# 5. 测试配置
nginx -t
# 6. 重载 Nginx
systemctl reload nginx
# 7. 设置开机自启
systemctl enable nginx
```
**测试访问:**
浏览器打开 `http://你的服务器IP`,应该能看到 Vitals 首页。
---
## 第八步:配置域名
### 8.1 购买/准备域名
- 国内服务器需要备案域名
- 海外服务器可用未备案域名
### 8.2 添加 DNS 解析
在域名服务商控制台添加 A 记录:
| 主机记录 | 记录类型 | 记录值 |
|----------|----------|--------|
| vitals | A | 你的服务器IP |
等待 DNS 生效(通常几分钟到几小时)。
### 8.3 更新 Nginx 配置
```bash
vim /etc/nginx/sites-available/vitals
```
`server_name _;` 改为:
```nginx
server_name vitals.你的域名.com;
```
重载配置:
```bash
nginx -t && systemctl reload nginx
```
---
## 第九步:配置 HTTPS
**强烈推荐**:生产环境必须启用 HTTPS。
```bash
# 1. 安装 Certbot
apt install -y certbot python3-certbot-nginx
# 2. 申请证书(自动配置 Nginx
certbot --nginx -d vitals.你的域名.com
# 按提示操作:
# - 输入邮箱
# - 同意条款
# - 选择是否重定向 HTTP 到 HTTPS推荐选 2
# 3. 验证自动续期
certbot renew --dry-run
# 4. 查看证书状态
certbot certificates
```
证书会自动续期Certbot 会创建 systemd timer 处理。
---
## 第十步:配置自动备份
### 10.1 创建备份脚本
```bash
vim /opt/vitals/backup.sh
```
脚本内容:
```bash
#!/bin/bash
BACKUP_DIR="/opt/vitals/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
cp /opt/vitals/data/vitals.db $BACKUP_DIR/vitals_$DATE.db
# 保留最近 7 天的备份
find $BACKUP_DIR -name "vitals_*.db" -mtime +7 -delete
echo "$(date): Backup completed - vitals_$DATE.db"
```
### 10.2 设置定时任务
```bash
# 设置执行权限
chmod +x /opt/vitals/backup.sh
# 添加定时任务(每天凌晨 3 点备份)
crontab -e
```
添加一行:
```
0 3 * * * /opt/vitals/backup.sh >> /var/log/vitals-backup.log 2>&1
```
### 10.3 验证备份
```bash
# 手动执行一次
/opt/vitals/backup.sh
# 查看备份文件
ls -la /opt/vitals/backups/
```
---
## 常用运维命令
### 服务管理
```bash
cd /opt/vitals
# 查看服务状态
docker compose ps
# 查看日志
docker compose logs -f
# 查看最近 100 行日志
docker compose logs --tail 100
# 重启服务
docker compose restart
# 停止服务
docker compose down
# 启动服务
docker compose up -d
```
### 更新部署
```bash
cd /opt/vitals
# 1. 备份数据
./backup.sh
# 2. 拉取新代码(如果用 Git
git pull
# 3. 重新构建并启动
docker compose down
docker compose up -d --build
# 4. 查看日志确认正常
docker compose logs -f
```
### 资源监控
```bash
# 查看容器资源使用
docker stats
# 查看磁盘使用
df -h
# 查看内存使用
free -h
```
### 故障排查
```bash
# 查看 Nginx 错误日志
tail -f /var/log/nginx/error.log
# 查看应用日志
docker compose logs -f
# 进入容器调试
docker compose exec vitals /bin/bash
# 检查端口占用
ss -tlnp | grep 8080
```
---
## 部署完成检查清单
| 检查项 | 命令/操作 | 预期结果 |
|--------|-----------|----------|
| 服务运行 | `docker compose ps` | 状态为 running |
| API 响应 | `curl localhost:8080/api/today` | 返回 JSON |
| HTTP 访问 | 浏览器打开 `http://IP` | 显示首页 |
| HTTPS 访问 | 浏览器打开 `https://域名` | 显示首页,有锁图标 |
| 登录功能 | 访问 `/login` 用 admin 登录 | 登录成功 |
| 管理后台 | 访问 `/admin` | 显示管理面板 |
| 自动备份 | `ls /opt/vitals/backups/` | 有备份文件 |
---
## 安全检查清单
| 项目 | 要求 |
|------|------|
| 管理员密码 | 至少 12 位,包含大小写字母、数字、特殊字符 |
| JWT 密钥 | 使用 `openssl rand -hex 32` 生成的随机字符串 |
| HTTPS | 生产环境必须启用 |
| 防火墙 | 只开放必要端口 (22, 80, 443) |
| SSH | 建议禁用密码登录,使用密钥认证 |
| 定期备份 | 配置 cron 定时备份数据库 |
| 系统更新 | 定期执行 `apt update && apt upgrade` |
---
## 最终访问地址
部署完成后,可通过以下地址访问:
| 页面 | 地址 |
|------|------|
| 首页 | `https://vitals.你的域名.com` |
| 登录 | `https://vitals.你的域名.com/login` |
| 注册 | `https://vitals.你的域名.com/register` |
| 管理后台 | `https://vitals.你的域名.com/admin` |
---
## 其他部署方案
如果不想使用云服务器,还可以考虑以下方案:
### 内网穿透(临时测试)
- **Cloudflare Tunnel** - 免费,需要域名托管在 Cloudflare
- **ngrok** - 简单快速,免费版有限制
### PaaS 平台(零运维)
- **Railway.app** - 简单易用,有免费额度
- **Fly.io** - 全球部署,有免费额度
- **Render** - 自动部署,有免费额度
---
## 常见问题
### Q: 访问显示 502 Bad Gateway
检查 Docker 容器是否正常运行:
```bash
docker compose ps
docker compose logs
```
### Q: HTTPS 证书申请失败
1. 确认域名 DNS 已生效:`nslookup vitals.你的域名.com`
2. 确认 80 端口可访问
3. 确认 Nginx 配置正确
### Q: 忘记管理员密码
```bash
cd /opt/vitals
# 修改 .env 中的 ADMIN_PASSWORD
vim .env
# 重启服务
docker compose restart
```
### Q: 数据库损坏
从备份恢复:
```bash
# 停止服务
docker compose down
# 恢复备份
cp /opt/vitals/backups/vitals_最新日期.db /opt/vitals/data/vitals.db
# 启动服务
docker compose up -d
```
---
*最后更新: 2026-01-22*