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 错误。
经过太多时间我想通了两件事:
- 这里的浏览器was/is有问题
- latest is not what it says(那个无关但我在调试时想到的)
关于浏览器 - 我使用 Firefox 78.0.1,并且总是在一台特定的机器上使用 docker。似乎缓存了一些不应该缓存的数据,缓存导致错误页面。我不知道 portainer 是否在浏览器缓存中存储了一些数据(如 cookie),但是让它忘记了网站(see here)made portainer正常工作。请注意,按 F5
或 Shift+F5
在这里不起作用,重新启动浏览器也不起作用。
如果您遇到类似的问题,您也可以在私有 window 中加载页面。根据您浏览器的配置,这应该可以防止它使用以前缓存的数据。
对我来说这是一个缓存问题。
- 转到浏览器的 Dev-Console
- 打开“网络存储”
- 删除 portainer 的本地存储url(右键单击)
我目前很难将我的 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 错误。
经过太多时间我想通了两件事:
- 这里的浏览器was/is有问题
- latest is not what it says(那个无关但我在调试时想到的)
关于浏览器 - 我使用 Firefox 78.0.1,并且总是在一台特定的机器上使用 docker。似乎缓存了一些不应该缓存的数据,缓存导致错误页面。我不知道 portainer 是否在浏览器缓存中存储了一些数据(如 cookie),但是让它忘记了网站(see here)made portainer正常工作。请注意,按 F5
或 Shift+F5
在这里不起作用,重新启动浏览器也不起作用。
如果您遇到类似的问题,您也可以在私有 window 中加载页面。根据您浏览器的配置,这应该可以防止它使用以前缓存的数据。
对我来说这是一个缓存问题。
- 转到浏览器的 Dev-Console
- 打开“网络存储”
- 删除 portainer 的本地存储url(右键单击)