Logo
活死人の行知路

同步N8N镜像至腾讯云个人镜像仓库


📅 | 📝 287 字
#docker

1 背景

目前 n8n 的官方镜像仓库是 docker.n8n.io/n8nio/n8n(以前常用的是 docker.io/n8nio/n8n),国内直接拉取经常超时或失败。以下两种主流且相对稳定的解决路径,按推荐顺序排列:

  • 路径1:公共/第三方同步镜像源。这种方式最简单,0配置成本,网上推荐使用“轩辕镜像”,一直让我登录充钱,我很不喜欢,所以我没考虑这个方案。
  • 路径2:个人镜像仓库。这种方式就是自己用腾讯云 CCR(个人版免费)做中转(最稳,长期可控,推荐生产/长期使用)。

2 步骤详解

  1. 开通 & 初始化腾讯云个人版容器镜像服务

    • 登录腾讯云控制台 → 搜索「容器镜像服务」或直接访问:https://console.cloud.tencent.com/tcr
    • 如果是首次使用,点击「实例管理」→ 选择“广州”(只有广州能创建个人版) → 「初始化密码」,你的腾讯云账号 ID(纯数字,例如 10001xxxxxxxxxx,在右上角头像 → 基本信息 里能看到)
    • 初始化个人版实例(会要求设置一个命名空间,例如 myusern8n-mirror,全局唯一,记下来)
  2. 创建镜像仓库(可选但推荐)

    • 左侧导航 →「镜像仓库」→「新建」
    • 命名空间:选你刚才创建的
    • 仓库名称:建议叫 n8n(或 n8n-mirror
    • 类型:公有(最方便,拉取不用登录)或私有(更安全,但每次都要 docker login)
    • 创建后会得到完整镜像地址前缀,例如:ccr.ccs.tencentyun.com/myuser/n8n
  3. 在能访问外网的环境(强烈推荐 GitHub Actions)同步镜像

    方式A:最简单 – 用 GitHub Actions + crane / skopeo / regctl 等工具(推荐)

    1. 新建一个 GitHub 仓库(名字随便,例如 docker-sync-n8n)

    2. 在仓库 Settings → Secrets and variables → Actions 新增以下 Repository secret:

      变量名说明示例值
      TCR_USERNAME10001xxxxxxxxxx你的腾讯云账号 ID(纯数字)
      TCR_PASSWORD你刚才设置/重置的固定密码个人版登录密码
      TCR_NAMESPACE你的命名空间einscat
    3. 在仓库创建 .github/workflows/sync-n8n.yml 文件,内容示例(使用 crane 工具,简单可靠):

    name: Sync n8n to TCR (using skopeo)
    
    on:
    workflow_dispatch:          # 手动触发(用于测试)
    schedule:
        - cron: '0 3 * * 0'       # 每周日 UTC 03:00 自动同步
    
    jobs:
    sync:
        runs-on: ubuntu-latest
        steps:
        - name: Checkout code
            uses: actions/checkout@v4
    
        - name: Install skopeo
            run: |
            sudo apt-get update
            sudo apt-get install -y skopeo
    
        - name: Clean old auth (optional but safe)
            run: rm -f ~/.docker/config.json || true
    
        - name: Login to Tencent TCR Personal
            run: |
            echo "${{ secrets.TCR_PASSWORD }}" | skopeo login ccr.ccs.tencentyun.com \
                --username ${{ secrets.TCR_USERNAME }} --password-stdin
            echo "Login completed."
            skopeo inspect docker://ccr.ccs.tencentyun.com/${{ secrets.TCR_NAMESPACE }}/n8n:latest || echo "Inspect failed (normal if image not exist yet)"
    
        # 同步主 n8n 镜像
        - name: Copy n8n:latest from official to TCR
            run: |
            skopeo copy --remove-signatures \
                docker://docker.n8n.io/n8nio/n8n:latest \
                docker://ccr.ccs.tencentyun.com/${{ secrets.TCR_NAMESPACE }}/n8n:latest
    
        - name: Optional - Copy specific version (e.g. if you want pinned)
            run: |
            # 取消注释下面行来同步特定版本
            # skopeo copy --remove-signatures \
            #   docker://docker.n8n.io/n8nio/n8n:1.53.2 \
            #   docker://ccr.ccs.tencentyun.com/${{ secrets.TCR_NAMESPACE }}/n8n:1.53.2
    

    如果仓库是公有的,推送后拉取不用登录;如果是私有,服务器上也要 docker login 同样用账号ID + 密码

    1. 提交后去 Actions 页面手动触发一次 workflow,等待几分钟~十几分钟完成。

    成功后,你的镜像地址就是: ccr.ccs.tencentyun.com/einscat/n8n:latest

  4. 在国内服务器上拉取使用

    • 如果你创建的是公有仓库:

      docker pull ccr.ccs.tencentyun.com/einscat/n8n:latest
      
    • 如果是私有仓库,先登录:

      docker login --username=你的腾讯云账号ID ccr.ccs.tencentyun.com
      # 密码就是你 TCR 个人版设置的访问凭证密码(控制台-我的镜像-访问凭证)
      

    然后正常 docker pull 即可。

腾讯云个人版 TCR 的登录方式跟企业版/标准版不一样,它不使用 AccessKey/SecretKey 来做 crane/docker login,而是用腾讯云账号的数字 ID 作为 username + 你手动设置的固定登录密码。