前言 & 流程介绍
首先感谢Maaaa 抛砖引玉,大家在看这个教程之前,请先参照Maaaa大大,在Docker 成功部署了Docker版的Clash, 我这个教程主要帮助通过
a. 1panel 添加shell计划任务,实现每天定时更新订阅(config.yaml)文件,
b. 根据大家的部署的nas ip地址,自动化修改下载下来的config.yaml的参数:
检索external-controller字段,自动加上NAS IP地址;
额外补充 Host 模式必需配置(确保局域网可访问):
自动补充 allow-lan: true(Host 模式必需),
c.并自动重启容器(这样才能重新加载更新后的config.yaml);
操作步骤
-
大家先要在 应用中心 下载1panel, 1panel的安装教程很多,我就在这里累述,大家可以参考论坛的文章;
-
1panel安装后,选择 计划任务, 创建 计划任务,任务类型:Shell 脚本;任务名称随意,如clash_refresh, 执行周期:每天;

-
脚本内容,填写如下,大家只需要替换脚本里的 核心配置项 红色 部分的内容; *
3.1 CONFIG_PATH 是你部署clash容器的放置config.yaml文件路径 ( 获取方法:在飞牛os的文件管理里,找到config.yaml,右键 详细信息,复制原始路径 )
3.2 SUBSCRIBE_URL 是您的clash订阅的地址(服务商提供的URL里复制粘贴),替换xxxxxx的内容,这里要特别留意,有的URL尾部需要加入参数,如&flag=clash,我的地址就需要添加,如果不添加,抓下面的订阅参数会有问题;
3.3 NAS_IP 就是你飞牛OS的IP地址
3.4 MIHOMO_CONTAINER_NAME 为你的clash容器的名称,如果大家参照的是Maaaa大大的流程部署的话,这个名称无需修改,如果是用的别的镜像方式部署的,请按照我下面备注的方式获取你的容器名。
3.5 DOCKER_CMD 为飞牛OS默认Docker路径(无需修改)。
3.6 脚本的地方就不要修改,因为在脚本的核心置顶项做了定义,后面的脚本都是引用,所以特别提醒,# 核心配置项(仅需维护红色的参数这里),不要对其他项目名称修改,影响到后面脚本的引用。

#!/bin/bash
# Mihomo 配置下载 + API 地址替换脚本(NAS IP:192.168.31.96)
# 核心配置项(仅需维护这里)
CONFIG_PATH="/vol1/1000/docker/clash/config.yaml"
SUBSCRIBE_URL="https://XXXXXXXXX&flag=clash"
NAS_IP="192.168.31.96" # 修正为你的 NAS 实际 IP
MIHOMO_CONTAINER_NAME="mihomo" # 飞牛OS上的Mihomo容器名(执行 docker ps 查看)
DOCKER_CMD="/usr/bin/docker" # 飞牛OS默认Docker路径(无需修改)
# 1. 下载订阅配置(覆盖原有配置)
echo "===== 开始下载 Clash 订阅配置 ====="
wget -O "$CONFIG_PATH" "$SUBSCRIBE_URL" --connect-timeout 30 --tries 2
# 检查下载是否成功
if [ $? -ne 0 ]; then
echo "❌ 错误:配置文件下载失败(网络问题/订阅链接无效)"
exit 1
fi
echo "✅ 配置文件下载成功,路径:$CONFIG_PATH"
# 2. 替换 external-controller 为 NAS 实际 IP
echo "===== 开始替换 API 监听地址 ====="
# -i.bak:修改前自动备份原文件(生成 config.yaml.bak)
sed -i.bak \
's/^external-controller: .*/external-controller: '"$NAS_IP"':9090/' \
"$CONFIG_PATH"
# 3. 验证替换结果
if grep -q "external-controller: $NAS_IP:9090" "$CONFIG_PATH"; then
echo "✅ API 地址替换成功:external-controller: $NAS_IP:9090"
# 可选:确认无误后删除备份文件(注释掉则保留备份)
# rm -f "${CONFIG_PATH}.bak"
else
echo "⚠️ 警告:API 地址替换失败!可能是配置文件中无 external-controller 行"
# 自动补充 external-controller 配置(避免缺失)
echo -e "\nexternal-controller: $NAS_IP:9090" >> "$CONFIG_PATH"
echo "✅ 已自动补充 external-controller 配置到文件末尾"
fi
# 4. 额外补充 Host 模式必需配置(确保局域网可访问)
if ! grep -q "allow-lan: true" "$CONFIG_PATH"; then
echo -e "\nallow-lan: true" >> "$CONFIG_PATH"
echo "✅ 自动补充 allow-lan: true(Host 模式必需)"
fi
# ====================== 飞牛OS新增:重启Mihomo容器逻辑 ======================
echo -e "\n===== 飞牛OS:开始重启 Mihomo 容器 ====="
# 步骤1:检查Docker命令是否存在(适配飞牛OS环境)
if [ ! -x "$DOCKER_CMD" ]; then
echo "❌ 错误:飞牛OS未找到Docker命令,路径:$DOCKER_CMD"
else
# 步骤2:检查容器是否存在(飞牛OS容器名大小写敏感)
CONTAINER_EXIST=$($DOCKER_CMD ps -a --format "{{.Names}}" | grep -w "$MIHOMO_CONTAINER_NAME")
if [ -z "$CONTAINER_EXIST" ]; then
echo "❌ 错误:飞牛OS中容器 $MIHOMO_CONTAINER_NAME 不存在(执行 docker ps -a 核对)"
else
# 步骤3:获取飞牛OS中容器当前状态
CONTAINER_STATUS=$($DOCKER_CMD inspect -f '{{.State.Status}}' "$MIHOMO_CONTAINER_NAME" 2>/dev/null)
echo "ℹ️ 飞牛OS容器 $MIHOMO_CONTAINER_NAME 当前状态:$CONTAINER_STATUS"
# 步骤4:重启/启动容器(适配飞牛OS容器管理逻辑)
if [ "$CONTAINER_STATUS" = "running" ]; then
$DOCKER_CMD restart "$MIHOMO_CONTAINER_NAME" >/dev/null 2>&1
else
$DOCKER_CMD start "$MIHOMO_CONTAINER_NAME" >/dev/null 2>&1
fi
# 步骤5:验证重启结果(飞牛OS容器启动需短暂等待)
sleep 3
NEW_STATUS=$($DOCKER_CMD inspect -f '{{.State.Status}}' "$MIHOMO_CONTAINER_NAME" 2>/dev/null)
if [ "$NEW_STATUS" = "running" ]; then
echo "✅ 飞牛OS容器 $MIHOMO_CONTAINER_NAME 重启/启动成功"
else
echo "❌ 飞牛OS容器 $MIHOMO_CONTAINER_NAME 重启失败,当前状态:$NEW_STATUS"
fi
fi
fi
# ==========================================================================
echo "===== 所有操作完成 ====="
echo "===== 所有操作完成 ====="
- 脚本修改完后,点击 确认;回到了 计划任务 的列表,如下图,这时候你可以点击“执行” 按钮,手动执行一次; 另外你也可以手动文本打开更新后的config.yaml检查下是不是已经正确修改了external-controller的地址;

- 查看 报告,如果没有报错说明已经更新成功;

- 这个脚本后续就会每天按照你的定义的时间进行更新,当然你也可以像手机客户端一样,进飞牛手机app,打开1panel,手动点“执行”,进行手动更新; *
补充:
- 因为不同的服务商提供的节点文件config.yaml可能会有细微的不同,但基本上主要是external-controller(缺失,或者是没有指向NAS IP),或者是缺失allow-lan: true(Host 模式必需),这个脚本都可以自动化的修订,如果是修订其他的参数的,可以在脚本的:# 2. 替换 external-controller 为 NAS 实际 IP,类似 's/^external-controller: .*/external-controller: '"$NAS_IP"':9090/' \ ,添加新的字段修改;