繁体   English   中英

Traefik 反向代理服务进入不允许 BASE URL 更改的子文件夹

[英]Traefik reverse proxy service into sub folder that doesn't allow BASE URL changing

我最近进入了自我托管,我发现 tailscale 是在我所有设备上访问我想要的服务的最佳方式,但输入端口真的很烦人,我正在尝试为一些重要服务启用 SSL。 现在大多数关于反向托管的指南都说要使用子域,但我不想这样做,因此想让它们在子文件夹而不是子域中访问。 我一直在尝试设置一个反向代理来做到这一点,现在我已经尝试了 Nginx 代理管理器、Caddy 和 Traefik,我发现 Traefik 是最容易理解的菜鸟。

我正在尝试使用 traefik 来反向代理东西以取得一些成功,简单的服务,比如只有一页的服务,但对于更大的服务,它不起作用。

这是我的 traefik docker-compose.yml

version: "3"

networks:
  # network created for reverse proxy such that all other
  # containers are also on it can communicate with each other
  revProxy-net:
    name: revProxy-net
    driver: bridge

services:
  traefik:
    image: traefik:v3.0.0-beta2
    container_name: traefik
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    volumes:
      - ./config:/etc/traefik
      - ./logs:/var/log/traefik
      - /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - revProxy-net
    restart: unless-stopped

这是 traefik.yml

global:
  checkNewVersion: true
  sendAnonymousUsage: false # true by default

# (Optional) Log information
# ---
log:
  level: ERROR # DEBUG, INFO, WARNING, ERROR, CRITICAL
  format: common # common, json, logfmt
  filePath: /var/log/traefik/traefik.log

# (Optional) Accesslog
# ---
accesslog:
format: common # common, json, logfmt
filePath: /var/log/traefik/access.log

# (Optional) Enable API and Dashboard
# ---
api:
  dashboard: true # true by default
  insecure: true # Don't do this in production!

# Entry Points configuration
# ---
entryPoints:
  web:
    address: :80
    # (Optional) Redirect to HTTPS
    # ---
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https

  websecure:
    address: :443

certificatesResolvers:
  tailsolver:
    tailscale: {}

providers:
  docker:
    exposedByDefault: false # Default is true
  file:
    # watch for dynamic configuration changes
    directory: /etc/traefik
    watch: true

让我们看一下简单的(它只有一个 html 和一个加载的 js 文件),它适用于此配置,可在https://lenovo-ideapad-320-15ikb.tail9ece4.ts.net/glances/上访问

version: "3"
services:
  glances:
    image: nicolargo/glances:latest-full
    container_name: glances
    restart: always
    ports:
      - 61208-61209:61208-61209
    environment:
      - GLANCES_OPT=-w
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./glances.conf:/etc/glances.conf
    pid: host
    networks:
      - revProxy-net
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.glances.entrypoints=web,websecure"
      - "traefik.http.routers.glances.rule=Host(`lenovo-ideapad-320-15ikb.tail9ece4.ts.net`) && PathPrefix(`/glances`)"
      - "traefik.http.middlewares.strip-glances.stripprefix.prefixes=/glances"
      - "traefik.http.routers.glances.middlewares=strip-glances@docker"
      - "traefik.http.routers.glances.tls=true"
      - "traefik.http.routers.glances.tls.certresolver=tailsolver"
      - "traefik.http.routers.glances.tls.domains[0].main=lenovo-ideapad-320-15ikb.tail9ece4.ts.net"

networks:
  revProxy-net:
    external: true

但是当我尝试在 jellyfin 上使用同样的东西时,它会在转到https://lenovo-ideapad-320-15ikb.tail9ece4.ts.net/jellyfin/时给出Bad Gateway ,这是 jellyfin docker-compose.yml

version: "2.1"
#name: media-stack
services:
  jellyfin:
    image: lscr.io/linuxserver/jellyfin:latest
    container_name: jellyfin
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=${TZ_NAME}
      #- JELLYFIN_PublishedServerUrl=192.168.0.25 #optional
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=all
    volumes:
      - ./jellyfin/config:/config
      - /home/sagnik/Projects/yt-diff/yt-dlp/:/yt-dlp
      # Removed for testing purposes
    ports:
      - ${JELLYFIN_PORT}:8096
      - 8920:8920
      - 7359:7359/udp
      - 1900:1900/udp
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [ gpu ]
    restart: unless-stopped
    labels:
      - 'traefik.enable=true'
      ## HTTP Router
      #### Entry point where Jellyfin is accessible via
      #### Change secure to https in the line below to have accessible without needing to specify a port and change the SSLHost option below
      - 'traefik.http.routers.jellyfin.entryPoints=web,websecure'
      #### Host or Path where Jellyfin is accessible
      #### Remove (or change) this rule if you'd rather have Jellyfin accessible at a PathPrefix URI
      - 'traefik.http.routers.jellyfin.rule=Host(`lenovo-ideapad-320-15ikb.tail9ece4.ts.net`) && PathPrefix(`/jellyfin`)'
      #### Prefix stripper
      - "traefik.http.middlewares.strip-jellyfin.stripprefix.prefixes=/jellyfin"
      - "traefik.http.routers.jellyfin.middlewares=strip-jellyfin@docker"
      #### Using the tailscale ones
      - "traefik.http.routers.jellyfin.tls=true"
      - "traefik.http.routers.jellyfin.tls.certresolver=tailsolver"
      - "traefik.http.routers.jellyfin.tls.domains[0].main=lenovo-ideapad-320-15ikb.tail9ece4.ts.net"
    networks:
      - revProxy-net

networks:
  revProxy-net:
    external: true

我已经尝试阅读文档,并阅读了为某些服务更改 base url 的方法,但我不明白发生了什么。

你忘了港口!

- 'traefik.http.routers.jellyfin.service=jellyfin-svc'
- 'traefik.http.services.jellyfin-svc.loadBalancer.server.port=8096'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM