Seerr (Jellyseerr) media requests
A request page where Jellyfin users ask for films and series, handed to Radarr and Sonarr.
- Standalone container
- Rootless: systemctl --user
- Tested with podman 5.0 and newer
Last updated
See where this fits on the homelab connections map, with every port it uses.
In short: Seerr is the merged successor of Jellyseerr and Overseerr, published as ghcr.io/seerr-team/seerr. It runs rootless on port 5055 with one volume for its settings and database. Users log in with their Jellyfin account, and Seerr talks to Jellyfin, Radarr and Sonarr at host.containers.internal, the host as seen from inside a container.
The quadlet files
Every quadlet file below passes podman's quadlet generator and
systemd-analyze verify on podman 5.0 and the current release. Personal values
are placeholders: replace example.com, /srv/... paths and the
time zone with your own.
seerr.container
Save as ~/.config/containers/systemd/seerr.container
[Unit]
Description=Seerr media requests for Jellyfin, Radarr and Sonarr
StartLimitIntervalSec=0
After=network-online.target jellyfin.service
[Container]
# Seerr is the merged successor of Jellyseerr and Overseerr. The old
# docker.io/fallenbagel/jellyseerr image no longer gets new releases.
Image=ghcr.io/seerr-team/seerr:latest
ContainerName=seerr
AutoUpdate=registry
Environment=TZ=Etc/UTC
Environment=LOG_LEVEL=info
# Reaches Jellyfin, Radarr and Sonarr through host.containers.internal.
PublishPort=5055:5055
Volume=seerr.volume:/app/config:Z
HealthCmd=wget -q -O /dev/null http://127.0.0.1:5055/api/v1/status
HealthInterval=1m
HealthTimeout=10s
HealthRetries=3
HealthStartPeriod=2m
HealthOnFailure=kill
[Service]
Restart=always
RestartSec=30
TimeoutStartSec=900
[Install]
WantedBy=default.target
seerr.volume
Save as ~/.config/containers/systemd/seerr.volume
[Unit]
Description=Seerr data: settings.json, SQLite database, logs
[Volume]
VolumeName=seerr
Caddyfile
Save as /etc/caddy/Caddyfile
requests.example.com {
reverse_proxy 10.0.0.10:5055
}
Why is it built this way?
What it is. Seerr gives your household a friendly page to ask for a film or series. An approved request goes straight to Radarr or Sonarr from the media stack pod, and the result appears in Jellyfin.
Why the new image. Jellyseerr and Overseerr merged into Seerr. The old
fallenbagel/jellyseerr image stopped getting releases, so :latest there
would never update again, and AutoUpdate=registry would quietly do nothing.
Reaching the other apps. Seerr runs in its own network namespace.
host.containers.internal is podman's name for the host, so every app published on
the host is reachable at that name plus its port. The health check calls
/api/v1/status, which answers without a login.
Caddy in front of Seerr
Seerr works behind Caddy without extra headers. Give it its own name, such as
requests.example.com, rather than a sub-path. The
Caddyfile generator writes the block.
Check that it works
systemctl --user status seerr.service
curl -s http://127.0.0.1:5055/api/v1/status; echo
podman exec seerr wget -q -O - http://host.containers.internal:8096/health; echo The last line proves that Seerr can reach Jellyfin. For more about user services, see quadlet basics.
How do I start it?
Run these as your normal user, not as root. Quadlet reads ~/.config/containers/systemd/ for user services.
mkdir -p ~/.config/containers/systemd
systemctl --user daemon-reload
systemctl --user start seerr.service
# open http://<server>:5055 and choose Jellyfin
# Jellyfin URL: http://host.containers.internal:8096
# Radarr: host.containers.internal port 7878, Sonarr: port 8989, with their API keys
Check the result with systemctl --user status and
the logs with journalctl --user -u followed by the
service name. To turn a docker-compose file of your own into files like these, use the
compose to quadlet converter.
Common mistakes
Seerr cannot connect to Jellyfin at localhost:8096
Inside the container, localhost is Seerr itself. Use host.containers.internal:8096 for services published on the host, or the server's LAN address.
The image fallenbagel/jellyseerr never updates
Development moved to Seerr. Switch Image= to ghcr.io/seerr-team/seerr:latest and keep the same volume; read the Seerr migration notes first and back up the volume with podman volume export.
Requests are accepted but never show up in Radarr
Check the Radarr server in Seerr's settings: the test button must pass, and a quality profile and root folder must be selected. Radarr's own log (journalctl --user -u radarr.service) shows refused API calls.
Frequently asked questions
Is Seerr the same as Jellyseerr?
Seerr is the project that Jellyseerr and Overseerr merged into. It supports Jellyfin, Emby and Plex, and reads the same kind of settings.json and database from its /app/config folder.
Where do the Radarr and Sonarr API keys go?
Into Seerr's settings through its web interface; Seerr stores them in settings.json inside its own volume. They never belong in the quadlet file. Back up the volume like any other secret store.
Does Seerr need its own login?
No. Users sign in with their Jellyfin account, and you choose in Seerr who may request and whether requests need approval.