571 lines
10 KiB
Markdown
571 lines
10 KiB
Markdown
|
|
# 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*
|