我正在运行Docker服务(OwnTracks Recorder),使用Traefik作为身份验证的反向代理。它的设置是通过docker-compose;这是服务上的标签:
labels:
- traefik.enable=true
- traefik.frontend.rule=PathPrefixStrip:/owntracks
- traefik.frontend.auth.basic=user1:hash1,user2:hash2
这按预期工作。我试图解决的问题是Owntracks实际上有两个元素:一个仪表板,它将在https://example.com/owntracks,一个api,在https://example.com/owntracks/pub。虽然owntracks本身没有内置身份验证,但我想将仪表板限制为只有user1,同时允许所有经过身份验证的用户访问api。 Owntrack的documentation使用ngnix作为示例,我认为在我的情况下可能看起来像:
location /owntracks/dashboard/ {
auth_basic ....;
proxy_pass http://127.0.0.1:8083/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
location /owntracks/pub/ {
auth_basic ....;
proxy_pass http://127.0.0.1:8083/pub/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
问题是,我无法弄清楚如何在Traefik中配置这样的东西。据我了解,你会得到一个整个容器的traefik.frontend.auth.basic“label”?理想情况下,我更喜欢通过Owntracks的docker-compose文件中的标签进行设置,以避免在Traefik本身中需要自定义每服务配置(即我可以依赖Traefik自动发现服务)。
任何指针将不胜感激。
解决方案是使用细分。 Traefik的documentation有点误导:
段标签用于定义暴露多个端口的容器的路由。段是一组适用于容器暴露的端口的标签。您可以定义与容器中公开的端口一样多的段。
实际上,段不仅可以用于使用多个端口的容器,而且可以定义比容器上暴露的端口更多的段。在这种情况下,它很简单:
labels:
- traefik.enable=true
- traefik.segment1.frontend.rule=PathPrefix:/owntracks/pub;ReplacePath:/pub
- traefik.segment1.frontend.auth.basic=user1:hash1,user2:hash2
- traefik.segment2.frontend.rule=PathPrefixStrip:/owntracks
- traefik.segment2.frontend.auth.basic=user1:hash1