V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
potatouu
V2EX  ›  问与答

traefik 反代 adguardhome 无法访问

  •  
  •   potatouu · 2023-04-25 17:12:20 +08:00 · 1031 次点击
    这是一个创建于 560 天前的主题,其中的信息可能已经有所发展或是发生改变。
    http:
    routers:
    adhome:
    entryPoints:
    - "web"
    rule: "Host(`ad.ptato.t`)"
    service: adguardhome-adhome@docker
    middlewares:
    - redirect
    adhome-tls:
    entryPoints:
    - "websecure"
    rule: "Host(`ad.ptato.t`)"
    service: adguardhome-adhome@docker
    tls:
    certResolver: "mytlschallenge"
    options: adhome

    services:
    adhome:
    loadBalancer:
    servers:
    - url: "https://172.21.0.9:80/"

    这是 traefik 的配置。


    version: '3'
    services:
    adguardhome:
    image: adguard/adguardhome
    restart: always
    ports:
    - 5222:53/tcp
    - 5222:53/udp
    - 3000:80/tcp
    networks:
    traefik_default:
    ipv4_address: 172.21.0.9
    volumes:
    - ./work:/opt/adguardhome/work
    - ./conf:/opt/adguardhome/conf

    networks:
    traefik_default:
    external: true
    这是 adguardhome 的文件,使用主机 IP:80 可以正常访问,改成其他端口也可以正常访问,但是反代后用域名无法访问,域名已经解析到主机 IP ,其他容器代理都正常

    访问提示 Bad Gateway ,请问下什么原因呢
    第 1 条附言  ·  2023-04-26 17:42:49 +08:00
    容器内部测试都能 ping 通,好像是 traefik 无法检测到 adguardhome 的面板端口,只有显示 53 的 DNS 端口,不知道什么原因,有大腿知道吗
    traefik 面板截图
    https://imgur.com/a/rUvUqPC
    13 条回复    2023-04-27 17:42:33 +08:00
    kaedeair
        1
    kaedeair  
       2023-04-25 17:44:09 +08:00
    Bad Gateway 是网关与服务不能通信,启用 dashboard 和 debug 模式检查一下是哪里的问题。你的 traefik 必须和 adguard 的容器能互相访问,可以进 traefik 的 shell 检查
    kaedeair
        2
    kaedeair  
       2023-04-25 17:51:47 +08:00
    adguardhome 的 yml 加入以下试试?
    labels:
    - "traefik.http.services.adguardhome-adhome.loadbalancer.server.port=80"
    potatouu
        3
    potatouu  
    OP
       2023-04-25 21:06:48 +08:00
    @kaedeair 还是不行
    zx900930
        4
    zx900930  
       2023-04-25 22:19:41 +08:00
    url: "http://172.21.0.9:80"

    你多打了一个 s
    potatouu
        5
    potatouu  
    OP
       2023-04-26 17:39:04 +08:00
    @zx900930 试过了也不可以,尴尬
    zx900930
        6
    zx900930  
       2023-04-26 17:56:09 +08:00
    @potatouu 那你的 traefik 容器肯定没办法访问 172.21.0.9:80
    1. docker exec -it traefik /bin/sh 进到 traefik 的 shell, ping 一下 172.21.0.9, 如果 ping 不通, 检查一下 traefik 和 adg 容器的网段和 Gateway 是否一致.
    2. 如果上述办法行不通, 尝试把 URL 改成 外部 ip 地址:3000 看看能否访问, 如果还不行检查一下是不是启用了 iptables.
    3. 暂时把 middleware 去掉, 控制一下变量.
    potatouu
        7
    potatouu  
    OP
       2023-04-26 18:06:18 +08:00
    @zx900930 traefik 容器可以 ping 通 adhome 容器,相互通信是正常的,使用主机 IP:3000 可以正常访问 adguardhome 面板,但是代理后通过域名访问就是 bad gateway
    zx900930
        8
    zx900930  
       2023-04-26 18:49:29 +08:00
    provider 是 docker 不是 file, 那么生效的就不是你的 dynamic_config.yml 里的
    services:
    adhome:
    loadBalancer:
    servers:
    - url: "http://172.21.0.9:80/"
    内容.

    转而是去 docker api 里提取, 而你又没有在 label 里指定端口, 所以出现了默认 53 端口的问题.

    在你的 adg docker compose 里加入以下内容
    labels:
    - "traefik.enable=true"
    - "traefik.http.routers.adhome.rule=Host(`ad.ptato.t`)"
    - "traefik.http.routers.adhome.entrypoints=websecure"
    - "traefik.http.routers.adhome.tls.certresolver=mytlschallenge"
    - "traefik.docker.network=traefik_default"
    - "traefik.http.services.adhome.loadbalancer.server.port=80"
    zx900930
        9
    zx900930  
       2023-04-26 18:51:48 +08:00
    或者直接把
    service: adguardhome-adhome@docker
    改成
    service: adhome
    potatouu
        10
    potatouu  
    OP
       2023-04-26 20:03:21 +08:00
    @zx900930
    使用 labels 标签后配置为
    version: '3'
    services:
    adguardhome:
    image: adguard/adguardhome
    restart: always
    container_name: adguardhome
    ports:
    - 5222:53/tcp
    - 5222:53/udp
    - 3000:3001/tcp
    networks:
    traefik_default:
    ipv4_address: 172.21.0.9
    volumes:
    - ./work:/opt/adguardhome/work
    - ./conf:/opt/adguardhome/conf
    labels:
    - "traefik.enable=true"
    - "traefik.http.routers.adhome.rule=Host(`ad.ptato.t`)"
    - "traefik.http.routers.adhome.entrypoints=websecure"
    - "traefik.http.routers.adhome.tls.certresolver=mytlschallenge"
    - "traefik.docker.network=traefik_default"
    - "traefik.http.services.adhome.loadbalancer.server.port=80"

    networks:
    traefik_default:
    external: true

    还是无法实现代理,我是使用 traefik 动态独立文件配置的,是否会和该方法有冲突呢,使用第二种方法在 traefik 面板中提示找不到该服务,也无法实现代理,感谢回复
    zx900930
        11
    zx900930  
       2023-04-26 23:01:30 +08:00
    @potatouu
    ports:
    - 5222:53/tcp
    - 5222:53/udp
    - 3000:3001/tcp

    你修改过后把 80 口变成了 3001
    那么此时 traefik.http.services.adhome.loadbalancer.server.port=3001

    其次, 使用 label 和 dynamic_config 这两种办法都不冲突, 可以共存的. 前者会显示 provider 是 docker, 后者是 file.
    potatouu
        12
    potatouu  
    OP
       2023-04-27 17:40:14 +08:00
    @zx900930 期间重新部署了 adguardhome ,唯一不同的是这次直接使用了 host 网络,面板端口还是 3001 ,按照此方法访问提示 404
    potatouu
        13
    potatouu  
    OP
       2023-04-27 17:42:33 +08:00
    @zx900930 面板中 servers 的 URL 显示是 http://127.0.0.1:3001 ,但是我 adguardhome 登入设置使用的是容器地址 172.17.0.1:3001 ,我想应该是这个问题,但是不知道如何去解决
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3579 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:46 · PVG 12:46 · LAX 20:46 · JFK 23:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.