Files
iotlcm/docs/deploy/operations.md
T
Dai0814 e43640d0fe docs: 部署手册改为平台部署,替换原文档站自身部署说明
原 /deploy/ 内容是文档站自身(VitePress/Node/nginx)的部署说明,
与用户所需的「IotLCM 平台部署手册」不符。

改为基于 iotlcm-public/iotlcm-deploy 部署仓的平台部署手册:
- 部署概览:部署构成、三步流程、端口规划、关键约束
- 环境准备:硬件分档、系统与 Docker 版本、镜像仓库、防火墙、可选外部依赖
- 配置说明:.env 必填 8 项与可选 4 项、10 份应用配置逐项说明
- 启动与验证:首次初始化流程、7 步验证清单、首次登录必做项
- 可选服务:运营商挡板 onelink-mock、飞书 bot、反向代理(含 HTTPS)
- 升级与备份:版本固定、升级回滚、备份与恢复、日志清理、监控指标
- 故障排查:启动/功能/性能/网络四类共 20 个问题

删除原 6 页(docker-nginx / path-prefix / static-hosting / local-dev /
offline / faq),侧边栏同步改为「部署手册 + 运维」两组。
2026-10-28 14:00:58 +08:00

185 lines
4.2 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.
---
title: 升级与备份
description: 版本固定、升级回滚、数据备份与日志清理
outline: deep
---
# 升级与备份
## 版本固定
生产环境**必须固定镜像标签**,不要用 `latest`:
- `latest` 会随仓库推送变化,同一份编排在不同时间拉到的镜像不同
- 出问题无法确定运行版本
- 回滚时没有明确目标
`.env` 中指定:
```bash
TAG=1.0.3
```
记录当前部署版本:
```bash
echo "$(date '+%Y-%m-%d %H:%M') TAG=$(grep '^TAG=' .env | cut -d= -f2)" >> deploy-history.log
```
## 升级
```bash
# 1. 备份(不要跳过,见下节)
./backup.sh
# 2. 拉新镜像
vi .env # 修改 TAG
docker compose pull
# 3. 更新
docker compose up -d
# 4. 验证
docker compose ps
docker compose logs --tail=50 admin-svr
```
滚动更新单个服务减少中断:
```bash
docker compose up -d --no-deps admin-svr
```
## 回滚
```bash
vi .env # TAG 改回旧版本
docker compose pull
docker compose up -d
```
::: warning 数据库变更不能随代码回滚
若新版本含数据库结构变更,回滚代码后数据库仍是新结构。升级前确认变更可逆,或保留升级前的完整备份。
:::
## 数据库重建
`schema/` 脚本只在 `data/mysql` 为空时执行:
| 情况 | 是否需要重建 |
| --- | --- |
| 升级应用镜像 | 否 |
| 修改 `config/` | 否,重启对应服务即可 |
| 修改 `schema/` 脚本 | 是(会丢数据) |
| 首次初始化失败 | 是 |
```bash
docker compose down
sudo rm -rf ./data/mysql
docker compose up -d
```
::: danger 生产环境禁止清空 data/mysql
生产数据必须通过数据库工具单独备份与迁移,不能依赖 schema 重建。
:::
## 备份
### 备份脚本
```bash
#!/bin/bash
set -euo pipefail
cd "$(dirname "$0")"
STAMP=$(date '+%Y%m%d-%H%M%S')
DEST="./backups/${STAMP}"
mkdir -p "$DEST"
echo "[1/3] 导出数据库..."
docker compose exec -T mysql sh -c \
'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --single-transaction --routines --triggers --events db_iotlcm' \
| gzip > "${DEST}/db_iotlcm.sql.gz"
echo "[2/3] 备份配置..."
tar czf "${DEST}/config.tar.gz" config/ .env
echo "[3/3] 备份上传文件..."
tar czf "${DEST}/upload.tar.gz" data/upload/ 2>/dev/null || echo " 上传目录为空,跳过"
echo "完成:${DEST}"
ls -lh "$DEST"
```
```bash
chmod +x backup.sh && ./backup.sh
```
### 只备份数据库
```bash
docker compose exec -T mysql sh -c \
'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --single-transaction db_iotlcm' \
| gzip > "db_iotlcm-$(date +%Y%m%d).sql.gz"
```
### 恢复
```bash
gunzip -c db_iotlcm-20260101.sql.gz | \
docker compose exec -T mysql sh -c \
'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" db_iotlcm'
```
### 备份内容与优先级
| 内容 | 位置 | 重要性 |
| --- | --- | --- |
| 数据库 | MySQL 容器内 `db_iotlcm` | **最高**,业务数据全部在此 |
| 配置 | `config/` + `.env` | 高,丢失需重新配置 |
| 上传文件 | `data/upload/` | 中,附件与图片 |
| Redis 数据 | `data/redis/` | 低,缓存可重建 |
| RabbitMQ 队列 | `data/rabbitmq/` | 低,未消费消息会丢失 |
| 日志 | `data/logs/` | 低,排障用 |
### 备份策略
| 场景 | 频率 | 保留 |
| --- | --- | --- |
| 生产 | 每日一次 + 升级前 | 30 天 |
| 试用 | 有数据变更时 | 7 天 |
备份文件应转存到异机或对象存储,不要与数据库同盘。
## 日志清理
日志写在 `data/logs/` 下按服务分目录,应用侧已按小时轮转(`{Y-m-d-H}.log`)。清理旧日志:
```bash
# 删除 7 天前的日志
find ./data/logs -name '*.log' -mtime +7 -delete
```
建议配置 cron 定期执行:
```cron
0 3 * * * root find /path/to/iotlcm-deploy/data/logs -name '*.log' -mtime +7 -delete
```
## 监控
基础组件自带端点:
| 服务 | 端点 |
| --- | --- |
| RabbitMQ | `http://<host>:15672` 管理界面 |
| Consul | `http://<host>:8500/ui` |
| MySQL | `docker compose exec mysql mysqladmin status` |
建议告警指标:
- MySQL 连接数与磁盘使用率
- Redis 内存使用率
- RabbitMQ 队列积压(`iotlcm.batch.execute`、`iotlcm.app.business`)
- worker-svr 全量同步任务失败数