背景:我平时喜欢听podcast,但是有些podcast无法直连,所以我给应用支持了配置PROXY_URL,下面是怎么在服务器上使用容器部署的过程:

  1. 创建目录/opt/proxy-client-metacubexd, /opt/proxy-client-metacubexd/data
  2. 使用openssl rand -hex 32生成三个密钥
  3. 创建一个.env文件
METACUBEXD_IMAGE=ghcr.io/metacubex/metacubexd-server:v1.271.0
DOCKER_BRIDGE_IP=172.17.0.1


CONTROL_TOKEN='xx'
CLASH_SECRET='xx'
LUMORA_PROXY_PASSWORD='x'
  1. 创建docker compose文件
services:
  metacubexd:
    image: '${METACUBEXD_IMAGE:?required}'
    restart: unless-stopped
    security_opt:
      - 'no-new-privileges:true'
    environment:
      CONTROL_TOKEN: '${CONTROL_TOKEN:?required}'
      CLASH_SECRET: '${CLASH_SECRET:?required}'
      CONTROL_PORT: '8080'
      CLASH_API_PORT: '9090'
      MIXED_PORT: '7890'
      DATA_DIR: /data
      TZ: UTC
    ports:
      - '${DOCKER_BRIDGE_IP:?required}:17890:7890/tcp'
      - '127.0.0.1:18080:8080/tcp'
      - '127.0.0.1:19090:9090/tcp'
    volumes:
      - './data:/data'
    healthcheck:
      test:
        - CMD
        - wget
        - '-qO-'
        - 'http://127.0.0.1:8080/api/control/health'
      interval: 30s
      timeout: 5s
      start_period: 20s
      retries: 3
  1. 使用docker compose up -d来启动
  2. ssh -N -L 18080:127.0.0.1:18080 -L 19090:127.0.0.1:19090 root@你服务器的ip
  3. 假设已经配置ssh key登录了
  4. 讲本地的18080映射到服务器的18080端口
  5. http://127.0.0.1:18080, 访问这个地址, 根据指引导入订阅连接
  6. 使用刚刚的secret来登录(后端地址是: http://127.0.0.1:19090)
  7. 因为ssh映射了本地的端口, 所以需要填这个地址. 因为我们没有开发到公网使用, 这个就是给服务器上其他服务使用的
  8. 一个坑: 第一次启动会去拉geoip.dat(约 17.4 MB), geosite.dat(4.2 MB), country.mmdb(约 7.9 MB)等信息, 10s的超时时间, 如果超时就会关闭内核, 导致虽然激活了订阅, 还是无法看到分组和rules等信息
  9. 解决办法, 手动下载了放到data目录下. 或者使用另一个proxy来下载
  10. 登录后, 就可以使用UI界面来切换代理等操作了, 和其他可视化控制的软件一样
  11. 这样服务器上的其他服务就可以通过PROXY_URL=http://172.17.0.1:17890来使用了
  12. 172.17.0.1是通过ifconfig | grep -C 5 docker或者ip -4 addr show docker0来找到
  13. 如果需要账号和密码, 那么需要在ui界面中添加一个合并覆盖的override的配置, 在这里http://127.0.0.1:18080/#/profiles,
authentication:
  - "username:pwd"
  1. 这样前面的PROXY_URL就是http://username:pwd@172.17.0.1:17890
  2. 最后可以远程给配置添加上定时刷新