前言:为什么需要自动化更新?

在 Docker 化部署中,保持应用更新是确保安全性和功能完整性的关键。然而,手动更新既耗时又容易出错,特别是对于需要多服务协调的应用。本文将手把手教您在 1Panel 中为 MoonTV 应用搭建安全、可靠、零中断的自动更新系统。

本教程适用于所有基于 Docker Compose 部署的应用,特别针对需要保留数据的服务(如数据库)提供优化方案

一、MoonTV 应用架构分析

核心组件与服务依赖

图表

代码

  • moontv-core:前端服务,需要频繁更新

  • moontv-redis:数据存储服务,需保持稳定

  • 关键依赖:核心服务依赖 Redis 的数据支持

更新挑战与解决方案

挑战

传统更新方案

本教程方案

服务中断

整个应用停止

仅更新核心服务

数据丢失风险

Redis 随核心重启

Redis 持续运行

版本回退困难

手动恢复备份

1Panel 自动快照

二、准备工作

1. 确认 MoonTV 部署路径

在 1Panel 控制台查看应用安装路径:

text

/opt/1panel/docker/compose/moontv  # 此为示例路径,请替换为您的实际路径

2. 检查 Docker Compose 文件

确保您的 docker-compose.yml 包含以下关键配置:

yaml

services:
  moontv-core:
    image: ghcr.io/lunatechlab/moontv:latest
    depends_on:
      - moontv-redis
  moontv-redis:
    image: redis:alpine

三、创建安全更新脚本

1. 编写更新脚本 moontv-update.sh

bash

#!/bin/bash
# MoonTV 安全更新脚本 v1.2
# 创建于:2025-08-08

# 配置区 ==================================
COMPOSE_DIR="/opt/1panel/docker/compose/moontv"  # 替换为您的实际路径
LOG_FILE="/var/log/moontv-update.log"
# =========================================

# 进入Compose目录
cd "$COMPOSE_DIR" || exit 1

# 更新核心服务
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始更新moontv-core..." | tee -a "$LOG_FILE"
docker compose pull moontv-core | tee -a "$LOG_FILE"
docker compose up -d --force-recreate --no-deps moontv-core | tee -a "$LOG_FILE"

# 清理旧镜像
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 清理系统..." | tee -a "$LOG_FILE"
docker image prune -af | tee -a "$LOG_FILE"

# 完成通知
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 更新成功完成!" | tee -a "$LOG_FILE"

2. 脚本功能解析

  1. 智能备份:使用 1Panel API 创建带时间戳的应用快照

  2. 精准更新

    • 只拉取 moontv-core 的新镜像

    • 使用 --no-deps 保持 Redis 运行

    • --force-recreate 确保使用新镜像

  3. 资源清理:自动删除无用镜像释放空间

  4. 完整日志:详细记录每个步骤到日志文件

四、在 1Panel 中配置自动更新

1. 上传脚本文件

通过 1Panel 文件管理或 SSH 创建脚本:

bash

sudo nano /opt/1panel/task/shell/moontv-update.sh

粘贴脚本内容并保存

2. 设置执行权限

bash

sudo chmod +x /opt/1panel/task/shell/moontv-update.sh

3. 配置计划任务

  1. 进入 1Panel → 计划任务

  2. 选择 Shell 脚本新建任务

  3. 填写配置:

    • 任务名称MoonTV 自动更新

    • 执行周期0 4 * * *(每天凌晨4点更新)

    • 脚本路径/opt/1panel/task/shell/moontv-update.sh

    • 超时时间600(10分钟)

    • 启用 执行成功通知

图表

代码

五、高级配置与优化建议

1. 版本锁定策略

修改 docker-compose.yml 避免使用 latest 标签:

diff

services:
  moontv-core:
-   image: ghcr.io/lunatechlab/moontv:latest
+   image: ghcr.io/lunatechlab/moontv:v1.2.5

2. 添加健康检查

docker-compose.yml 中增加健康检查:

yaml

services:
  moontv-core:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
      interval: 30s
      timeout: 5s
      retries: 3

3. 更新验证机制

在脚本末尾添加状态检查:

bash

# 检查服务状态
SERVICE_STATUS=$(docker compose ps -q moontv-core | xargs docker inspect -f '{{.State.Status}}')
if [ "$SERVICE_STATUS" = "running" ]; then
  echo "服务状态验证成功"
else
  echo "警告:服务未正常运行!"
  # 自动回滚到上一个版本
  docker compose logs moontv-core >> "$LOG_FILE"
  1panel backups recover --name latest
fi

六、更新效果验证

成功更新日志示例

text

[2025-08-09 04:00:01] 创建应用快照...
Backup created: pre-update-20250809-040001
[2025-08-09 04:00:15] 开始更新moontv-core...
moontv-core: Pulling from lunatechlab/moontv
Digest: sha256:7a3b6...c84
Status: Downloaded newer image
Recreating moontv-core... done
[2025-08-09 04:02:30] 清理系统...
Deleted Images: 1.2GB freed
[2025-08-09 04:02:45] 更新成功完成!

监控关键指标

更新后检查:

  1. 服务运行状态:docker compose ps

  2. 容器日志:docker compose logs moontv-core

  3. 资源占用:docker stats

  4. 用户访问:实时监控访问日志

七、故障排除指南

常见问题与解决方案

问题现象

可能原因

解决方案

更新后服务未启动

新版本配置不兼容

检查日志,回滚备份

磁盘空间不足

未清理旧镜像

增加 docker image prune -af

Redis 连接失败

网络配置变更

检查 networks 配置

权限错误

脚本执行权限

chmod +x 添加权限

紧急回滚步骤

  1. 进入 1Panel → 备份管理

  2. 选择更新前创建的备份

  3. 点击 恢复

  4. 选择 恢复应用和数据

  5. 确认恢复

结语:拥抱自动化运维

通过本教程,您已成功在 1Panel 中为 MoonTV 搭建了生产级的自动更新系统。这套方案不仅适用于 MoonTV,稍作调整即可用于任何 Docker Compose 应用:

  1. 数据库类应用:保持数据服务稳定,仅更新应用服务

  2. 微服务架构:分批更新不同服务,避免全系统中断

  3. CI/CD 管道:结合 Git 仓库实现更复杂的部署流程

自动化运维的核心价值:让您专注于业务创新,而非基础设施维护

资源扩展

附录:完整脚本下载链接 | 示例 Compose 文件 | 更新监控面板配置