# 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*