feat: better traefik configuration, plex reverse proxying, anubis tests

krasovs.ky 2ea2d2ee 59f331e9

verified
-5
butane/fcos.yml.tftpl
···
tcp dport 7881 accept
# allow plex
-
tcp dport 32400 accept
-
udp dport 1900 accept
-
udp dport 5353 accept
-
tcp dport 8324 accept
udp dport { 32410, 32412, 32413, 32414 } accept
-
tcp dport 32469 accept
# allow minecraft bds
udp dport 19132 accept
···
tcp dport 7881 accept
# allow plex
udp dport { 32410, 32412, 32413, 32414 } accept
# allow minecraft bds
udp dport 19132 accept
+1
configs/containers/systemd/3x-ui.container.tftpl
···
Label="traefik.http.routers.3x-ui.rule=Host(`3x.${base_domain}`)"
Label="traefik.http.routers.3x-ui.service=3x-ui"
Label="traefik.http.services.3x-ui.loadbalancer.server.port=2053"
Label="traefik.http.routers.3x-ui-sub.rule=Host(`3x.${base_domain}`) && (PathPrefix(`/sub/`) || PathPrefix(`/json/`))"
Label="traefik.http.routers.3x-ui-sub.service=3x-ui-sub"
Label="traefik.http.services.3x-ui-sub.loadbalancer.server.port=2096"
···
Label="traefik.http.routers.3x-ui.rule=Host(`3x.${base_domain}`)"
Label="traefik.http.routers.3x-ui.service=3x-ui"
Label="traefik.http.services.3x-ui.loadbalancer.server.port=2053"
+
Label="traefik.http.routers.3x-ui.middlewares=anubis@file"
Label="traefik.http.routers.3x-ui-sub.rule=Host(`3x.${base_domain}`) && (PathPrefix(`/sub/`) || PathPrefix(`/json/`))"
Label="traefik.http.routers.3x-ui-sub.service=3x-ui-sub"
Label="traefik.http.services.3x-ui-sub.loadbalancer.server.port=2096"
+28
configs/containers/systemd/anubis.container.tftpl
···
···
+
[Unit]
+
Description=Anubis Quadlet
+
+
[Container]
+
Image=ghcr.io/techarohq/anubis:v1.23.1
+
AutoUpdate=registry
+
ContainerName=anubis
+
+
User=1000:1000
+
+
Environment="BIND=:8080"
+
Environment="TARGET= "
+
Environment="PUBLIC_URL=https://anubis.${base_domain}"
+
Environment="REDIRECT_DOMAINS=*.${base_domain}"
+
Environment="COOKIE_DOMAIN=${base_domain}"
+
+
Label="traefik.enable=true"
+
Label="traefik.http.routers.anubis.rule=Host(`anubis.${base_domain}`)"
+
Label="traefik.http.services.anubis.loadbalancer.server.port=8080"
+
+
Network=reverse-proxy.network
+
+
[Service]
+
TimeoutStartSec=900
+
Restart=always
+
+
[Install]
+
WantedBy=multi-user.target default.target
+1 -1
configs/containers/systemd/element-web.container.tftpl
···
Description=Element Web Quadlet
[Container]
-
Image=docker.io/vectorim/element-web:v1.12.3
AutoUpdate=registry
ContainerName=element-web
···
Description=Element Web Quadlet
[Container]
+
Image=docker.io/vectorim/element-web:v1.12.4
AutoUpdate=registry
ContainerName=element-web
+1 -1
configs/containers/systemd/immich/immich-server.container.tftpl
···
After=immich-valkey.service immich-postgres.service
[Container]
-
Image=ghcr.io/immich-app/immich-server:v2.2.3
AutoUpdate=registry
ContainerName=immich-server
···
After=immich-valkey.service immich-postgres.service
[Container]
+
Image=ghcr.io/immich-app/immich-server:v2.3.1
AutoUpdate=registry
ContainerName=immich-server
+1 -1
configs/containers/systemd/matrix/matrix-synapse.container.tftpl
···
After=matrix-valkey.service matrix-postgres.service
[Container]
-
Image=docker.io/matrixdotorg/synapse:v1.142.0
AutoUpdate=registry
ContainerName=matrix-synapse
···
After=matrix-valkey.service matrix-postgres.service
[Container]
+
Image=docker.io/matrixdotorg/synapse:v1.142.1
AutoUpdate=registry
ContainerName=matrix-synapse
+10 -4
configs/containers/systemd/plex.container.tftpl
···
Environment=PLEX_UID=1000
Environment=PLEX_GID=1000
Environment=TZ=Europe/Belgrade
-
# In my setup source IP is not preserved for local network (due to SNAT hairpinning rule)
-
Environment=ALLOWED_NETWORKS=192.168.100.1/32
Label="glance.name=Plex"
Label="glance.icon=di:plex"
Label="glance.url=https://app.plex.tv"
Label="glance.description=Personal Media Server"
Label="glance.hide=false"
Volume=/var/mnt/docker/app_data/plex:/config:Z
Volume=/var/mnt/media/tv_shows:/data/tv_shows:z
···
Volume=/var/mnt/media/music:/data/music:z
Tmpfs=/transcode:size=8G,rw:Z
-
# Host network for simplicity
-
Network=host
AddDevice=/dev/dri
···
Environment=PLEX_UID=1000
Environment=PLEX_GID=1000
Environment=TZ=Europe/Belgrade
+
Environment=ADVERTISE_IP="https://plex.${base_domain}/"
Label="glance.name=Plex"
Label="glance.icon=di:plex"
Label="glance.url=https://app.plex.tv"
Label="glance.description=Personal Media Server"
Label="glance.hide=false"
+
+
Label="traefik.enable=true"
+
Label="traefik.http.routers.plex.rule=Host(`plex.${base_domain}`)"
+
Label="traefik.http.services.plex.loadbalancer.server.port=32400"
Volume=/var/mnt/docker/app_data/plex:/config:Z
Volume=/var/mnt/media/tv_shows:/data/tv_shows:z
···
Volume=/var/mnt/media/music:/data/music:z
Tmpfs=/transcode:size=8G,rw:Z
+
Network=reverse-proxy.network
+
PublishPort=32410:32410/udp
+
PublishPort=32412:32412/udp
+
PublishPort=32413:32413/udp
+
PublishPort=32414:32414/udp
AddDevice=/dev/dri
+5
configs/traefik/file/anubis.yml
···
···
+
http:
+
middlewares:
+
anubis:
+
forwardAuth:
+
address: http://anubis:8080/.within.website/x/cmd/anubis/api/check
+1
configs/traefik/traefik.yml
···
to: websecure
websecure:
address: ":443"
http:
middlewares:
- security-headers@file
···
to: websecure
websecure:
address: ":443"
+
asDefault: true
http:
middlewares:
- security-headers@file