docker-compose for portainer with traefik v2 给出 "failure: unable to retrieve server settings and status"

docker-compose for portainer with traefik v2 gives "failure: unable to retrieve server settings and status"

我目前很难将我的 traefik v1 容器更新到 v2。我设置了一个带有自动 http->https 转发功能的 traefik 容器。现在我想得到 portainer 运行 以下 docker-compose 文件:

version: '3.3'
volumes:
  portainer: {}
networks:
  web:
    external: true
services:
  portainer:
    image: portainer/portainer:latest
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data
    command: |
      --no-analytics
      --data /data
      --admin-password "the_hashed_password"
      -H unix:///var/run/docker.sock
    networks:
      web:
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.portainer.entrypoints=websecure"
      - "traefik.http.routers.portainer.rule=Host(`portainer.myserver.domain`)"
      - "traefik.http.services.portainer.loadbalancer.server.port=9000"
      - "traefik.http.routers.portainer.tls=true"
      - "traefik.http.routers.portainer.tls.certresolver=leresolver"
      - "traefik.http.routers.portainer.middlewares=authportainer"
      # generate with: sudo docker run --rm -ti xmartlabs/htpasswd user password
      - "traefik.http.middlewares.authportainer.basicauth.users=myuser:my_hashed_password"

现在,当我用 docker-compose up 启动容器时,我得到:

portainer_1  | 2020/04/19 16:10:04 Starting Portainer 1.23.2 on :9000
...
portainer_1  | 2020/04/19 16:10:04 server: Listening on 0.0.0.0:8000...

访问 http://portainer.myserver.domain 正确转发到 https://portainer.myserver.domain。 在使用 myuser 进行身份验证后,将显示一个空白页面,并显示一条褪色消息 toast "Failure. Unable to retrieve server settings and status"。使用 traefik v1 时,设置可以正常工作。我不明白的是我是否需要对端口 8000 做任何事情(我在旧的工作环境中没有)。

如何调试这样的场景?
我的 docker-compose 文件有什么问题?

P.S。为简洁起见,我省略了 traefik 配置文件。如果需要,我会添加它(它适用于简单的容器)。

我遇到了类似的问题,可以通过扩展路由器规则来解决(另见Traefik documentation):

- "traefik.http.routers.portainer.rule=Host(`portainer.myserver.domain`) || (Host(`portainer.myserver.domain`) && PathPrefix(`/api`))"

这样,Traefik 现在应该正确路由 Portainer 前端的 api 请求。

希望这对你也有帮助!

P.S。关于你的调试问题,我通过检查浏览器的网络交互来解决这个问题,这表明对 portainer.myserver.domain/api/xyz 的所有调用都返回了 404 错误。

经过太多时间我想通了两件事:

  1. 这里的浏览器was/is有问题
  2. latest is not what it says(那个无关但我在调试时想到的)

关于浏览器 - 我使用 Firefox 78.0.1,并且总是在一台特定的机器上使用 docker。似乎缓存了一些不应该缓存的数据,缓存导致错误页面。我不知道 portainer 是否在浏览器缓存中存储了一些数据(如 cookie),但是让它忘记了网站see heremade portainer正常工作。请注意,按 F5Shift+F5 在这里不起作用,重新启动浏览器也不起作用。

如果您遇到类似的问题,您也可以在私有 window 中加载页面。根据您浏览器的配置,这应该可以防止它使用以前缓存的数据。

对我来说这是一个缓存问题。

  1. 转到浏览器的 Dev-Console
  2. 打开“网络存储”
  3. 删除 portainer 的本地存储url(右键单击)