• 纯白色冰淇淋

    简介

    - mihomo 核心 (原 clash.meta) 官方文档: https://wiki.metacubex.one/startup/

    - 常用客户端里, 缺少 linux 服务器的 docker 部署的使用方案

    - 本篇教程在 ubuntu 下的 docker 环境下实现 mihomo 核心代理和自动订阅更新

    项目地址

    https://github.com/pure-white-ice-cream/mihomo-sub

    快速部署```
    services:
    mihomo:
    image: purewhiteicecream/mihomo-sub:latest
    container_name: mihomo-sub
    volumes:
    - /opt/mihomo-sub:/root/.config/mihomo
    environment:
    - "TZ=Asia/Shanghai"
    - "sub_url=https://这里换成你的订阅地址"
    ports:
    - "7890:7890"
    - "9090:9090"
    ```分步解决, 原理同上面的项目

    docker compose```
    services:
    # mihomo 核心
    mihomo:
    image: metacubex/mihomo:v1.19.15
    container_name: mihomo
    restart: always
    environment:
    - "TZ=Asia/Shanghai"
    ports:
    - "7890:7890"
    - "9090:9090"
    # 挂载卷根据自己喜好位置选择
    volumes:
    - "/opt/mihomo:/root/.config/mihomo"

    # 订阅转换工具
    subconverter:
    image: tindy2013/subconverter:0.9.0
    container_name: subconverter
    restart: always
    environment:
    - "TZ=Asia/Shanghai"
    ports:
    - "25500:25500"
    ```WEB 面板

    - 下载最新面板: https://github.com/MetaCubeX/metacubexd/releases

    - 将下载到的文件解压复制到 /root/.config/mihomo/ui 路径下, 保证存在 /root/.config/mihomo/ui/index.html 文件

    定期更新订阅脚本```
    #!/bin/bash

    这里写你的订阅连接, 转换成https://www.urlencoder.org/中的格式

    url=""

    function end {
    log+="\n"
    printf "%b" "$log" >> $LOG_FILE
    exit 0
    }

    CONFIG_DIR="/opt/mihomo"
    CONFIG_FILE="$CONFIG_DIR/config.yaml"
    LOG_FILE="$CONFIG_DIR/log.txt"

    output="" # 保存生成的 config 内容
    log="" # 保存日志内容

    output+="mixed-port: 7890\n"
    output+="external-ui: /root/.config/mihomo/ui\n"

    订阅文件更新

    log+="[$(date -R)] \n\t订阅文件更新...\n\t"
    sub_response=$(curl -s --max-time 15 -w "%{http_code}" -o /tmp/mihomo_temp.yml "http://127.0.0.1:25500/sub?target=clash&url=$url")
    sub_exit_code=$?

    if [ "$sub_exit_code" -ne 0 ]; then
    log+="Error❌️: 网络错误,退出码: $sub_exit_code\n\t"
    end
    elif [ "$sub_response" -ne 200 ]; then
    log+="Error❌️: 订阅文件更新失败,响应码: $sub_response\n\t"
    end
    fi

    output+="$(awk 'NR>=3' /tmp/mihomo_temp.yml)""\n"
    printf "%b" "$output" > $CONFIG_FILE
    log+="订阅文件更新成功 ✅\n\t"

    配置重新加载

    log+="配置重新加载...\n\t"
    reload_response=$(curl -s --max-time 15 -w "%{http_code}" -X PUT "http://127.0.0.1:9090/configs?force=true" -H "Content-Type: application/json" -d '{"path":"","payload":""}')
    reload_exit_code=$?

    if [ "$reload_exit_code" -ne 0 ]; then
    log+="Error❌️: 网络错误,退出码: $reload_exit_code\n\t"
    end
    elif [ "$reload_response" -ne 204 ]; then
    log+="Error❌️: 配置重新加载失败,响应码: $reload_response\n\t"
    end
    fi

    log+="配置重新加载完成 ✅\n\t"
    end

    
    - 编辑定时任务: `crontab -e````
    # 参考写法, 文件路径改成自己脚本的路径
    # m h  dom mon dow   command
    5 * * * * bash /opt/mihomo/sub.sh
    ```title: mihomo核心在docker部署教程
    
    date: 2025/11/04 12:00:00
    
    原作者: 纯白色冰淇淋
    主楼
  • 大帅哥

    感谢大佬教程

    #1
  • 纯白色冰淇淋

    新增内容, 做了个一键部署的镜像

    项目地址

    https://github.com/pure-white-ice-cream/mihomo-sub

    快速部署```
    services:
    mihomo:
    image: purewhiteicecream/mihomo-sub:latest
    container_name: mihomo-sub
    volumes:
    - /opt/mihomo-sub:/root/.config/mihomo
    environment:
    - "TZ=Asia/Shanghai"
    - "sub_url=https://这里换成你的订阅地址"
    ports:
    - "7890:7890"
    - "9090:9090"

    #2
  • 辟支独觉

    这个是用docker部署透明网关吗?

    #3
  • naive

    这个配置文件不是应该自带自动更新吗

    #4
  • 纯白色冰淇淋

    mihomo 官方文档中不支持订阅更新链接这一参数: https://wiki.metacubex.one/config/

    另外一提, 这个镜像是拥有订阅转换功能的

    #5
  • 纯白色冰淇淋

    不是, 这个镜像部署之后提供 mix 代理端口, 其他设备需要将系统代理或者应用代理显式指定到这个端口,

    另外, 这个镜像还提供控制面板的端口, 浏览器可以访问

    #6
  • ChenLiang

    ui按照你的来不行呀

    图片

    图片

    #7
  • 纯白色冰淇淋

    访问路径是 http://xxx.xxx.xxx.xxx/ui 没输入 /ui 回直接调用核心的 api

    #8
  • naomi233

    用proxy-provider,订阅定时更新,可以不用写脚本

    #9
  • 纯白色冰淇淋

    感谢

    目前只在官方相关材料里找到这两个相关的描述, 找不到更详细的资料了, 目前尚未实践, 不知道网上有没有详细教程```

    Mihomo 格式的节点或支持 *ray 的分享格式

    proxy-providers:
    provider1:
    type: http # http 的 path 可空置,默认储存路径为 homedir 的 proxies 文件夹,文件名为 url 的 md5
    url: "url"
    interval: 3600
    path: ./provider1.yaml # 默认只允许存储在 mihomo 的 Home Dir,如果想存储到其他位置,请通过设置 SAFE_PATHS 环境变量指定额外的安全路径。该环境变量的语法同本操作系统的PATH环境变量解析规则(即Windows下以分号分割,其他系统下以冒号分割)
    proxy: DIRECT
    # size-limit: 10240 # 限制下载文件最大为10kb,默认为0即不限制文件大小
    header:
    User-Agent:
    - "Clash/v1.18.0"
    - "mihomo/1.18.3"
    # Accept:
    # - 'application/vnd.github.v3.raw'
    # Authorization:
    # - 'token 1231231'
    health-check:
    enable: true
    interval: 600
    # lazy: true
    url: https://cp.cloudflare.com/generate_204
    # expected-status: 204 # 当健康检查返回状态码与期望值不符时,认为节点不可用
    override: # 覆写节点加载时的一些配置项
    skip-cert-verify: true
    udp: true
    # down: "50 Mbps"
    # up: "10 Mbps"
    # dialer-proxy: proxy
    # interface-name: tailscale0
    # routing-mark: 233
    # ip-version: ipv4-prefer
    # additional-prefix: "[provider1]"
    # additional-suffix: "test"
    # # 名字替换,支持正则表达式
    # proxy-name:
    # - pattern: "test"
    # target: "TEST"
    # - pattern: "IPLC-(.*?)倍"
    # target: "iplc x $1"
    ```proxy-providers 文件内容

    === “yaml” {.yaml linenums="1"} proxies: - name: "ss1" type: ss server: server port: 443 cipher: chacha20-ietf-poly1305 password: "password" - name: "ss2" type: ss server: server port: 443 cipher: chacha20-ietf-poly1305 password: "password"

    === “uri” {.yaml linenums="1"} ss://YWVzLTI1Ni1nY206bWV0YUAxMjcuMC4wLjE6NDQz#home vmess://eyJhZGQiOiIxMjcuMC4wLjEiLCJhaWQiOiIwIiwiYWxwbiI6IiIsImZwIjoiIiwiaG9zdCI6IiIsImlkIjoiMTIyMzQ1Njc4OSIsIm5ldCI6InRjcCIsInBhdGgiOiIiLCJwb3J0IjoiNDQzIiwicHMiOiJ2bWVzcyIsInNjeSI6ImF1dG8iLCJzbmkiOiIiLCJ0bHMiOiIiLCJ0eXBlIjoibm9uZSIsInYiOiIyIn0=

    === “base64” {.text linenums="1"} c3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2YldWMFlVQXhNamN1TUM0d0xqRTZORFF6I2hvbWUKdm1lc3M6Ly9leUpoWkdRaU9pSXhNamN1TUM0d0xqRWlMQ0poYVdRaU9pSXdJaXdpWVd4d2JpSTZJaUlzSW1ad0lqb2lJaXdpYUc5emRDSTZJaUlzSW1sa0lqb2lNVEl5TXpRMU5qYzRPU0lzSW01bGRDSTZJblJqY0NJc0luQmhkR2dpT2lJaUxDSndiM0owSWpvaU5EUXpJaXdpY0hNaU9pSjJiV1Z6Y3lJc0luTmplU0k2SW1GMWRHOGlMQ0p6Ym1raU9pSWlMQ0owYkhNaU9pSWlMQ0owZVhCbElqb2libTl1WlNJc0luWWlPaUl5SW4wPQ==

    !!! note base64 的 uri 通常为提供商提供给 v2ray/xray 的订阅链接内容```
    YAML/uri/base64不可写在同一文件,uri/base64不需要proxies:字段,直接书写即可

    #10
  • 梨叔叔

    佬 我一直没想明白,docker里面的镜像部署这个有啥用,是能把这个网络共享吗?

    #11
  • 竹叶

    能不能实现配置文件,节点列表,规则列表分离,在 github 上看到一个分流规则完善的项目,想规则跟着这个项目的更新,节点另外跟着机场更新 GitHub - Aethersailor/Custom_OpenClash_Rules: 分流完善的 OpenClash 订阅转换模板,搭配保姆级 OpenClash 设置教程,无需套娃其他插件即可实现完美分流、DNS无污染无泄漏,且快速的国内外上网体验,配套自动化域名规则提交机器人

    还有一个问题,目前这个 docker 不支持 ARM,希望能支持 ARM64

    #12
  • huohuo

    我是开7890端口代理,给其他容器用,或者局域网代理

    #13
  • yeluo001

    相当于路由器代理插件的作用,可以通过将设备dns和网关指向docker的代理ip实现科学上网,也可以直接在局域网使用http-proxy等方式直接让设备或docker容器使用本代理

    #14
  • 纯白色冰淇淋

    [运行这个镜像的机器ip:7890] 这个端口可以提供代理服务

    别的应用, 系统, 可以用这个端口, 比如 windows , 比如 linux , 或者 docker 自己, 用来拉镜像

    #15
  • 梨叔叔

    我是开7890端口代理,给其他容器用,或者局域网代理

    了解了 佬

    #16
  • 梨叔叔

    相当于路由器代理插件的作用,可以通过将设备dns和网关指向docker的代理ip实现科学上网,也可以直接在局域网使用http-proxy等方式直接让设备或docker容器使用本代理

    佬 我懂了

    #17
  • 梨叔叔

    [运行这个镜像的机器ip:7890] 这个端口可以提供代理服务

    别的应用, 系统, 可以用这个端口, 比如 windows , 比如 linux , 或者 docker 自己, 用来拉镜像

    好滴好滴 这回懂了

    #18
  • 纯白色冰淇淋

    规则分离应该不难, 可以把规则地址参数留出来给 compose,

    yaml 文件分离这块我始终没在 mihomo 文档上看到相关内容, 所以目前不知道怎么分离

    mihomo 也有 ARM64 所以应该也可以支持,

    我争取后续有空的时候慢慢做

    #19

发表回复

登录后回复