f7cab5ad5c
mirror-to-gitee / mirror (push) Successful in 14s
把原来 12 个独立仓合并为单仓多服务结构,各仓完整提交历史通过
read-tree 并入保留(137 个提交,blame 可追溯)。
目录:
admin-svr/ admin-ui/ app/{server,app}/ openapi/ worker-svr/
upstream-chan/ upstream-proxy/ sms/ bot/ docs/ onelink-mock/ deploy/
同时:
- 新增根 README(目录说明、快速开始、源码构建、镜像发布、许可)
- 新增根 Makefile(make build / test / images / docs)
- 新增根 .gitattributes / .gitignore,删掉 12 份重复的 Apache LICENSE
(admin-ui/ 与 app/app/ 的 MIT 上游许可保留)
- 各服务的 .gitea/workflows 收敛到仓根:trigger-jenkins.yml(tag 构建全部
服务)+ mirror-to-gitee.yml(自动建 Gitee 仓后镜像)
- 文档内跨仓绝对链接改为仓内相对路径;部署/构建文档改为单仓路径
4.2 KiB
4.2 KiB
title, description, outline
| title | description | outline |
|---|---|---|
| 升级与备份 | 版本固定、升级回滚、数据备份与日志清理 | deep |
升级与备份
版本固定
生产环境必须固定镜像标签,不要用 latest:
latest会随仓库推送变化,同一份编排在不同时间拉到的镜像不同- 出问题无法确定运行版本
- 回滚时没有明确目标
docker-compose.yml 中指定:
TAG=1.0.3
记录当前部署版本:
echo "$(date '+%Y-%m-%d %H:%M') 镜像=$(grep -m1 'iotlcm-admin-svr:' docker-compose.yml)" >> deploy-history.log
升级
# 1. 备份(不要跳过,见下节)
./backup.sh
# 2. 拉新镜像
vi docker-compose.yml # 修改镜像 TAG
docker compose pull
# 3. 更新
docker compose up -d
# 4. 验证
docker compose ps
docker compose logs --tail=50 admin-svr
滚动更新单个服务减少中断:
docker compose up -d --no-deps admin-svr
回滚
vi docker-compose.yml # TAG 改回旧版本
docker compose pull
docker compose up -d
::: warning 数据库变更不能随代码回滚 若新版本含数据库结构变更,回滚代码后数据库仍是新结构。升级前确认变更可逆,或保留升级前的完整备份。 :::
数据库重建
schema/ 脚本只在 data/mysql 为空时执行:
| 情况 | 是否需要重建 |
|---|---|
| 升级应用镜像 | 否 |
修改 config/ |
否,重启对应服务即可 |
修改 schema/ 脚本 |
是(会丢数据) |
| 首次初始化失败 | 是 |
docker compose down
sudo rm -rf ./data/mysql
docker compose up -d
::: danger 生产环境禁止清空 data/mysql 生产数据必须通过数据库工具单独备份与迁移,不能依赖 schema 重建。 :::
备份
备份脚本
#!/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/ docker-compose.yml
echo "[3/3] 备份上传文件..."
tar czf "${DEST}/upload.tar.gz" data/upload/ 2>/dev/null || echo " 上传目录为空,跳过"
echo "完成:${DEST}"
ls -lh "$DEST"
chmod +x backup.sh && ./backup.sh
只备份数据库
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"
恢复
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/ + docker-compose.yml |
高,丢失需重新配置 |
| 上传文件 | data/upload/ |
中,附件与图片 |
| Redis 数据 | data/redis/ |
低,缓存可重建 |
| RabbitMQ 队列 | data/rabbitmq/ |
低,未消费消息会丢失 |
| 日志 | data/logs/ |
低,排障用 |
备份策略
| 场景 | 频率 | 保留 |
|---|---|---|
| 生产 | 每日一次 + 升级前 | 30 天 |
| 试用 | 有数据变更时 | 7 天 |
备份文件应转存到异机或对象存储,不要与数据库同盘。
日志清理
日志写在 data/logs/ 下按服务分目录,应用侧已按小时轮转({Y-m-d-H}.log)。清理旧日志:
# 删除 7 天前的日志
find ./data/logs -name '*.log' -mtime +7 -delete
建议配置 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 全量同步任务失败数