# 部署故障排查指南 ## SSH 连接断开问题 ### 问题现象 执行 `scripts/deploy-prod.sh` 后: - SSH 连接立即断开 - 无法重新连接服务器 - 服务器可能完全无响应 ### 根本原因 **Docker 构建过程耗尽服务器内存,导致系统 OOM (Out of Memory) 崩溃** #### 技术细节 1. **同时构建多个镜像**:原脚本使用 `docker compose up -d --build` 会并行构建 backend 和 frontend 2. **前端构建超高内存消耗**:Node.js/npm 构建过程可能消耗 1-2GB 内存 3. **无资源限制**:所有容器没有 memory limit,可无限制消耗系统资源 4. **连锁反应**: - Docker 构建吃满内存 - Linux OOM Killer 开始杀进程 - SSH daemon 被杀死 → 连接断开 - 系统核心服务被杀 → 无法重连 - 最严重时整个系统死机 ### 立即恢复方法 #### 方法 1:物理/远程控制台重启 ```bash # 通过云服务商控制台重启服务器 # 重启后立即禁用 Docker 自动启动 sudo systemctl disable docker sudo systemctl stop docker # 清理所有容器 cd /path/to/hfb_sys docker compose -f deploy/docker-compose.prod.yml down ``` #### 方法 2:强制重启前快速执行 如果还能短暂连接,立即执行: ```bash sudo systemctl stop docker sudo killall -9 dockerd containerd ``` ### 根本解决方案(已修复) #### 1. 添加资源限制(docker-compose.prod.yml) 所有服务现在都有明确的内存和 CPU 限制: - MySQL: 512M memory, 1 CPU - Redis: 256M memory, 0.5 CPU - MinIO: 512M memory, 0.5 CPU - Backend: 512M memory, 1 CPU - Frontend: 256M memory, 0.5 CPU 总计:~2GB 内存(适合 4GB 服务器) #### 2. 串行构建(deploy-prod.sh) 修改后的脚本: ```bash # 先构建 backend compose build backend # 再构建 frontend compose build frontend # 最后启动(不再构建) compose up -d --no-build ``` 这样可以避免内存峰值,但会增加 1-2 分钟部署时间。 ### 安全部署流程 #### 首次部署 ```bash # 1. 在本地或有充足资源的机器上预构建镜像 docker compose -f deploy/docker-compose.prod.yml build # 2. 保存镜像 docker save -o backend.tar :latest docker save -o frontend.tar :latest # 3. 上传到服务器 scp *.tar server:/tmp/ # 4. 在服务器上加载 ssh server docker load -i /tmp/backend.tar docker load -i /tmp/frontend.tar # 5. 使用 --no-build 启动 ./scripts/deploy-prod.sh --no-build ``` #### 日常更新(推荐) ```bash # 直接使用修复后的脚本 ./scripts/deploy-prod.sh # 或者只更新不重新构建 ./scripts/deploy-prod.sh --no-build ``` ### 监控服务器资源 #### 部署前检查 ```bash # 查看可用内存 free -h # 查看 CPU 负载 uptime # 建议:至少保留 1GB 可用内存 ``` #### 部署中监控 ```bash # 另一个终端实时监控 watch -n 1 'free -h && docker stats --no-stream' ``` ### 服务器配置建议 #### 最低配置 - 内存:4GB - CPU:2 核 - 磁盘:20GB #### 推荐配置 - 内存:8GB - CPU:4 核 - 磁盘:50GB - 启用 Swap:4GB #### 启用 Swap(紧急缓冲) ```bash # 创建 4GB swap sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 永久启用 echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab ``` ### 其他可能原因 #### 1. 网络超时 ```bash # 增加 SSH 保活 # 编辑 ~/.ssh/config Host your-server ServerAliveInterval 60 ServerAliveCountMax 3 ``` #### 2. Docker daemon 崩溃 ```bash # 查看 Docker 日志 sudo journalctl -u docker -n 100 --no-pager # 重启 Docker sudo systemctl restart docker ``` #### 3. 磁盘满 ```bash # 检查磁盘空间 df -h # 清理 Docker 垃圾 docker system prune -a --volumes -f ``` ## 预防措施清单 - [x] 所有服务添加 memory/CPU 限制 - [x] 串行构建避免内存峰值 - [ ] 启用服务器 Swap - [ ] 部署前检查可用内存 - [ ] 设置 SSH 保活 - [ ] 定期清理 Docker 磁盘 - [ ] 监控部署过程资源使用 ## 紧急联系 如果服务器完全无响应: 1. 联系云服务商客服强制重启 2. 通过 VNC/控制台登录 3. 考虑升级服务器配置