44
submitted 10 months ago by filister@lemmy.world to c/selfhosted@lemmy.world

Do you guys have any success with setting up an arr stack with rootless Podman Quadlets? I really like the idea of Quadlets, but I can't make it work.

Any guide and/or experience sharing would be greatly appreciated.

I have set up a Rocky Linux 10 with Podman 5.4.2 but after downloading the containers the quadlets were crashing.

Shall I continue digging this rabbit hole or shall I switch back to Docker Compose?

you are viewing a single comment's thread
view the rest of the comments
[-] Eldaroth@lemmy.world 8 points 10 months ago* (last edited 10 months ago)

Nice, did the move from docker to podman a couple of months ago myself. Now running the arr stack, nextcloud, immich and some other services as quadlets. File permission due to podmans rootless nature usually was the culprit if something was not working properly.

I can share my quadlet systemd files I use for the arr stack. I deployed it as a pod:

[Unit]
Description=Arr-stack pod

[Pod]
PodName=arr-stack
# Jellyseerr Port Mapping
PublishPort=8055:5055
# Sonarr Port Mapping
PublishPort=8089:8989
# Radarr Port Mapping
PublishPort=8078:7878
# Prowlarr Port Mapping
PublishPort=8096:9696
# Flaresolverr Port Mapping
PublishPort=8091:8191
# qBittorrent Port Mapping
PublishPort=8080:8080
***
[Unit]
Description=Gluetun Container

[Container]
ContainerName=gluetun
EnvironmentFile=global.env
EnvironmentFile=gluetun.env
Environment=FIREWALL_INPUT_PORTS=8080
Image=docker.io/qmcgaw/gluetun:v3.40.0
Pod=arr-stack.pod
AutoUpdate=registry
PodmanArgs=--privileged
AddCapability=NET_ADMIN
AddDevice=/dev/net/tun:/dev/net/tun

Volume=%h/container_volumes/gluetun/conf:/gluetun:Z,U

Secret=openvpn_user,type=env,target=OPENVPN_USER
Secret=openvpn_password,type=env,target=OPENVPN_PASSWORD

[Service]
Restart=always

[Install]
WantedBy=default.target
***
[Unit]
Description=qBittorrent Container
Requires=gluetun.service
After=gluetun.service

[Container]
ContainerName=qbittorrent
EnvironmentFile=global.env
Environment=WEBUI_PORT=8080
Image=lscr.io/linuxserver/qbittorrent:5.1.2
AutoUpdate=registry
UserNS=keep-id:uid=1000,gid=1000
Pod=arr-stack.pod
Network=container:gluetun

Volume=%h/container_volumes/qbittorrent/conf:/config:Z,U
Volume=%h/Downloads/completed:/downloads:z,U
Volume=%h/Downloads/incomplete:/incomplete:z,U
Volume=%h/Downloads/torrents:/torrents:z,U

[Service]
Restart=always

[Install]
WantedBy=default.target
***
[Unit]
Description=Prowlarr Container
Requires=gluetun.service
After=gluetun.service

[Container]
ContainerName=prowlarr
EnvironmentFile=global.env
Image=lscr.io/linuxserver/prowlarr:2.0.5
AutoUpdate=registry
UserNS=keep-id:uid=1000,gid=1000
Pod=arr-stack.pod
Network=container:gluetun

HealthCmd=["curl","--fail","http://127.0.0.1:9696/prowlarr/ping"]
HealthInterval=30s
HealthRetries=10

Volume=%h/container_volumes/prowlarr/conf:/config:Z,U

[Service]
Restart=always

[Install]
WantedBy=default.target
***
[Unit]
Description=Flaresolverr Container

[Container]
ContainerName=flaresolverr
EnvironmentFile=global.env
Image=ghcr.io/flaresolverr/flaresolverr:v3.4.0
AutoUpdate=registry
Pod=arr-stack.pod
Network=container:gluetun

[Service]
Restart=always

[Install]
WantedBy=default.target
***
[Unit]
Description=Radarr Container

[Container]
ContainerName=radarr
EnvironmentFile=global.env
Image=lscr.io/linuxserver/radarr:5.27.5
AutoUpdate=registry
UserNS=keep-id:uid=1000,gid=1000
Pod=arr-stack.pod
Network=container:gluetun

HealthCmd=["curl","--fail","http://127.0.0.1:7878/radarr/ping"]
HealthInterval=30s
HealthRetries=10

# Disable SecurityLabels due to SMB share
SecurityLabelDisable=true
Volume=%h/container_volumes/radarr/conf:/config:Z,U
Volume=/mnt/movies:/movies
Volume=%h/Downloads/completed/radarr:/downloads:z,U

[Service]
Restart=always

[Install]
WantedBy=default.target
***
[Unit]
Description=Sonarr Container

[Container]
ContainerName=sonarr
EnvironmentFile=global.env
Image=lscr.io/linuxserver/sonarr:4.0.15
AutoUpdate=registry
UserNS=keep-id:uid=1000,gid=1000
Pod=arr-stack.pod
Network=container:gluetun

HealthCmd=["curl","--fail","http://127.0.0.1:8989/sonarr/ping"]
HealthInterval=30s
HealthRetries=10

# Disable SecurityLabels due to SMB share
SecurityLabelDisable=true
Volume=%h/container_volumes/sonarr/conf:/config:Z,U
Volume=/mnt/tv:/tv
Volume=%h/Downloads/completed/sonarr:/downloads:z,U

[Service]
Restart=always

[Install]
WantedBy=default.target
***
[Unit]
Description=Jellyseerr Container

[Container]
ContainerName=jellyseerr
EnvironmentFile=global.env
Image=docker.io/fallenbagel/jellyseerr:2.7.3
AutoUpdate=registry
Pod=arr-stack.pod
Network=container:gluetun

Volume=%h/container_volumes/jellyseerr/conf:/app/config:Z,U

[Service]
Restart=always

[Install]
WantedBy=default.target

I run my podman containers in a VM running Alma Linux. Works pretty great so far.

Had the same issue when debugging systemctl errors, journalctl not being very helpful. At one point I just ran podman logs -f <container> in another terminal in a while loop just to catch the logs of the application. Not the most sophisticated approach, but it works ๐Ÿ˜„

[-] greylinux1@lemmy.ml 1 points 2 months ago

nice ๐Ÿ‘Œ , this is what I've been looking for, out of interest, as you have split all the containers out of the pod now do you have a setup guide for this ? or similar to above showing maybe an examples of the global.env file and network setup ?

do you find Flaresolverr is still a reliable option ? I've seen mention of alternatives like Byparr

[-] Eldaroth@lemmy.world 2 points 1 month ago

Sorry didn't find the time until now to reply. Also in the process of migrating everything to my Kubernetes cluster, so this is not as up to date in regards to image versions as it should be.

This is my current setup, with only qBittorrent and SABnzbd going through the Gluetun VPN container. Everything else just uses my regular home internet:

***
[Unit]
Description=Flaresolverr Container

[Container]
ContainerName=flaresolverr
HostName=flaresolverr
EnvironmentFile=global.env
Image=ghcr.io/flaresolverr/flaresolverr:v3.4.6
AutoUpdate=registry
PublishPort=8091:8191
Network=arr-stack.network

[Service]
Restart=always

[Install]
WantedBy=default.target
***
[Unit]
Description=qBittorrent Container
Wants=gluetun.service
After=gluetun.service

[Container]
ContainerName=qbittorrent
HostName=qbittorrent
EnvironmentFile=global.env
Environment=WEBUI_PORT=8080
Image=lscr.io/linuxserver/qbittorrent:5.1.4
AutoUpdate=registry
UserNS=keep-id:uid=1000,gid=1000
Network=container:gluetun

Volume=%h/container_volumes/qbittorrent/conf:/config:Z,U
Volume=%h/Downloads/completed:/downloads:z,U
Volume=%h/Downloads/incomplete:/incomplete:z,U
Volume=%h/Downloads/torrents:/torrents:z,U

Memory=1.5g

[Service]
Restart=always

[Install]
WantedBy=default.target
***
[Unit]
Description=Recyclarr TRaSH Guide Sync Container
Wants=radarr.service sonarr.service
After=radarr.service sonarr.service

[Container]
ContainerName=recyclarr
HostName=recyclarr
EnvironmentFile=global.env
Image=ghcr.io/recyclarr/recyclarr:8
AutoUpdate=registry
UserNS=keep-id:uid=1000,gid=1000
Network=arr-stack.network

Secret=sonarr_api_key,type=env,target=SONARR_API_KEY
Secret=radarr_api_key,type=env,target=RADARR_API_KEY

Volume=%h/container_volumes/recyclarr/conf:/config:Z,U

[Service]
Restart=always

[Install]
WantedBy=default.target
***
[Unit]
Description=SABnzbd Container
Wants=gluetun.service
After=gluetun.service

[Container]
ContainerName=sabnzbd
HostName=sabnzbd
Image=lscr.io/linuxserver/sabnzbd:4.5.5
AutoUpdate=registry
UserNS=keep-id:uid=1000,gid=1000
Network=container:gluetun
EnvironmentFile=global.env

Volume=%h/container_volumes/sabnzbd/conf:/config:Z,U
Volume=%h/Downloads/sabnzbd/completed:/downloads:z,U
Volume=%h/Downloads/sabnzbd/incomplete:/incomplete-downloads:z,U

Memory=1.5g

[Service]
Restart=always

[Install]
WantedBy=default.target
***
[Unit]
Description=Sonarr Container
After=gluetun.service prowlarr.service
Wants=gluetun.service prowlarr.service

[Container]
ContainerName=sonarr
HostName=sonarr
EnvironmentFile=global.env
Image=lscr.io/linuxserver/sonarr:4.0.17
AutoUpdate=registry
UserNS=keep-id:uid=1000,gid=1000
PublishPort=8089:8989
Network=arr-stack.network

HealthCmd=["curl","--fail","http://127.0.0.1:8989/sonarr/ping"]
HealthInterval=30s
HealthRetries=10

SecurityLabelDisable=true
Volume=%h/container_volumes/sonarr/conf:/config:Z,U
Volume=/mnt/eldanas/tv:/tv
Volume=%h/Downloads/completed/sonarr:/downloads:z,U
Volume=%h/Downloads/sabnzbd/completed/tv:/downloads-usenet:z,U

[Service]
Restart=always

[Install]
WantedBy=default.target
***
[Unit]
Description=Prowlarr Container
Wants=gluetun.service flaresolverr.service
After=gluetun.service flaresolverr.service

[Container]
ContainerName=prowlarr
HostName=prowlarr
EnvironmentFile=global.env
Image=lscr.io/linuxserver/prowlarr:2.3.5
AutoUpdate=registry
UserNS=keep-id:uid=1000,gid=1000
PublishPort=8096:9696
Network=arr-stack.network

HealthCmd=["curl","--fail","http://127.0.0.1:9696/prowlarr/ping"]
HealthInterval=30s
HealthRetries=10

Volume=%h/container_volumes/prowlarr/conf:/config:Z,U

[Service]
Restart=always

[Install]
WantedBy=default.target
***
[Unit]
Description=Radarr Container
After=gluetun.service prowlarr.service
Wants=gluetun.service prowlarr.service

[Container]
ContainerName=radarr
HostName=radarr
EnvironmentFile=global.env
Image=lscr.io/linuxserver/radarr:6.1.1
AutoUpdate=registry
UserNS=keep-id:uid=1000,gid=1000
PublishPort=8078:7878
Network=arr-stack.network

HealthCmd=["curl","--fail","http://127.0.0.1:7878/radarr/ping"]
HealthInterval=30s
HealthRetries=10

SecurityLabelDisable=true
Volume=%h/container_volumes/radarr/conf:/config:Z,U
Volume=/mnt/eldanas/movies:/movies
Volume=%h/Downloads/completed/radarr:/downloads:z,U
Volume=%h/Downloads/sabnzbd/completed/movies:/downloads-usenet:z,U

[Service]
Restart=always

[Install]
WantedBy=default.target
***
[Unit]
Description=Gluetun Container

[Container]
ContainerName=gluetun
HostName=gluetun
EnvironmentFile=global.env
EnvironmentFile=gluetun.env
Environment=FIREWALL_INPUT_PORTS=8080
Image=docker.io/qmcgaw/gluetun:v3.41.1
AutoUpdate=registry
PodmanArgs=--privileged
AddCapability=NET_ADMIN
AddDevice=/dev/net/tun:/dev/net/tun
PublishPort=8080:8080
# SABnzbd Port Mapping
PublishPort=8085:8085
# Gluetun Port Mapping
PublishPort=8123:8000
Network=arr-stack.network

Volume=%h/container_volumes/gluetun/conf:/gluetun:Z,U

Secret=proton_wireguard_private_key,type=env,target=WIREGUARD_PRIVATE_KEY

[Service]
Restart=always

[Install]
WantedBy=default.target
***
[Unit]
Description=Seerr Container
After=gluetun.service
Wants=gluetun.service

[Container]
ContainerName=seerr
HostName=seerr
EnvironmentFile=global.env
Image=ghcr.io/seerr-team/seerr:v3.2.0
UserNS=keep-id:uid=1000,gid=1000
AutoUpdate=registry
PublishPort=8055:5055
Network=arr-stack.network

Volume=%h/container_volumes/seerr/conf:/app/config:Z,U

[Service]
Restart=always

[Install]
WantedBy=default.target

The global.env file only contains env variables like TZ or the PUID and PGID which are used in almost all my containers.

[-] greylinux1@lemmy.ml 2 points 1 month ago

Thank you so much for this, I managed to cobble together a working stack after asking the question, but your unit files have quite a few additions, I've since added these to my setup.๐Ÿ˜Š

I had to use byparr in place of flaresolverr and for port forwarding to be updated to qbittorrent I had to use a sidecar container qsticky.

I also had issues with gluetun dropping the forwarded port sometimes hours sometimes days after setting it. I've since switched to latest for gluetun as it has some fixes, that may work. I'll test it for a while to see if it improves or possibly switch to hotio's image of qbittorrent with vpn support.

load more comments (5 replies)
this post was submitted on 11 Oct 2025
44 points (97.8% liked)

Selfhosted

61901 readers
30 users here now

A place to share alternatives to popular online services that can be self-hosted without giving up privacy or locking you into a service you don't control.

Rules:

Detailed Rules Post

  1. Be civil.

  2. No spam.

  3. Posts are to be related to self-hosting.

  4. Don't duplicate the full text of your blog or readme if you're providing a link.

  5. Submission headline should match the article title.

  6. No trolling.

  7. Promotion posts require active participation, with an account that is at least 30 days old. F/LOSS without a paywall has exceptions, with requirements. See the rules link for details. Tags [CBH] or [AIP] are required, see the links in Rule 8 for details.

  8. AI-related discussions and AI-involved promotional posts have additional requirements for tagging, as noted in Rule 7 and the AI & Promotional Post Expanded Rules post, and find example disclosures here.

Resources:

Any issues on the community? Report it using the report flag.

Questions? DM the mods!

founded 3 years ago
MODERATORS