Seerr
Unified media request management (Plex, Jellyfin, Emby) on FreeBSD.
Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions, including the security model for host vs. container privileges.
Deployment
Database Where the app keeps its data. The default needs nothing else running.
SQLite PostgreSQL Your own
seerr:latest — data in /path/to/containers /seerr
A file in the app's config folder. Right for one person, nothing extra to run.
1. Save as .env and fill in what is empty:
2. Save as compose.yaml:
name : seerr
services :
seerr :
image : ghcr.io/daemonless/seerr:latest
container_name : seerr
restart : unless-stopped
environment :
- PUID=1000
- PGID=1000
- TZ=UTC
- DB_TYPE=${DB_TYPE:-sqlite}
- DB_HOST=${DB_HOST:-}
- DB_PORT=${DB_PORT:-5432}
- DB_USER=${DB_USER:-}
- DB_PASS=${DB_PASS:-}
- DB_NAME=${DB_NAME:-}
volumes :
- /path/to/containers /seerr:/config
ports :
- 5055:5055
Then run podman-compose up -d.
seerr:latest · postgres:17 — data in /path/to/containers /seerr, /containers /seerr/postgres
One more container, its data in its own folder. For a household, or an app that wants it.
1. Save as .env and fill in what is empty:
# Database: PostgreSQL
DB_TYPE=postgres
DB_HOST=postgres
DB_PORT=5432
DB_USER=seerr
DB_PASS= # set one
DB_NAME=seerr
DATABASE_LOCATION=/containers /seerr/postgres
2. Save as compose.yaml:
name : seerr
services :
seerr :
depends_on : [ postgres ]
image : ghcr.io/daemonless/seerr:latest
container_name : seerr
restart : unless-stopped
environment :
- PUID=1000
- PGID=1000
- TZ=UTC
- DB_TYPE=${DB_TYPE:-sqlite}
- DB_HOST=${DB_HOST:-}
- DB_PORT=${DB_PORT:-5432}
- DB_USER=${DB_USER:-}
- DB_PASS=${DB_PASS:-}
- DB_NAME=${DB_NAME:-}
volumes :
- /path/to/containers /seerr:/config
ports :
- 5055:5055
postgres :
image : ghcr.io/daemonless/postgres:17
restart : always
annotations :
org.freebsd.jail.allow.sysvipc : "true"
environment :
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASS}
- POSTGRES_DB=${DB_NAME}
volumes :
- "${DATABASE_LOCATION}:/var/lib/postgresql/data"
Then run podman-compose up -d.
seerr:latest · your own database — data in /path/to/containers /seerr
A database you already run, here or on another machine. Nothing extra runs; you give the address and the account.
1. Save as .env and fill in Kind, Host, Port, User, Password, Database:
# Database: Your own
DB_TYPE= # Kind: postgres
DB_HOST= # Host
DB_PORT= # Port
DB_USER= # User
DB_PASS= # Password
DB_NAME= # Database
2. Save as compose.yaml:
name : seerr
services :
seerr :
image : ghcr.io/daemonless/seerr:latest
container_name : seerr
restart : unless-stopped
environment :
- PUID=1000
- PGID=1000
- TZ=UTC
- DB_TYPE=${DB_TYPE:-sqlite}
- DB_HOST=${DB_HOST:-}
- DB_PORT=${DB_PORT:-5432}
- DB_USER=${DB_USER:-}
- DB_PASS=${DB_PASS:-}
- DB_NAME=${DB_NAME:-}
volumes :
- /path/to/containers /seerr:/config
ports :
- 5055:5055
Then run podman-compose up -d.
Database Where the app keeps its data. The default needs nothing else running.
SQLite PostgreSQL Your own
seerr:latest — data in /path/to/containers /seerr
A file in the app's config folder. Right for one person, nothing extra to run.
# .env
DIRECTOR_PROJECT=seerr
PUID=1000
PGID=1000
TZ=UTC
DB_TYPE=sqlite
DB_HOST=
DB_PORT=5432
DB_USER=
DB_PASS=<DB_PASS>
DB_NAME=
# appjail-director.yml
options :
- virtualnet : ':<random> default'
- nat :
services :
seerr :
name : seerr
options :
- container : 'args:--pull'
- expose : '5055 :5055 proto:tcp'
oci :
user : root
environment :
- PUID : !ENV '${PUID}'
- PGID : !ENV '${PGID}'
- TZ : !ENV '${TZ}'
- DB_TYPE : !ENV '${DB_TYPE}'
- DB_HOST : !ENV '${DB_HOST}'
- DB_PORT : !ENV '${DB_PORT}'
- DB_USER : !ENV '${DB_USER}'
- DB_PASS : !ENV '${DB_PASS}'
- DB_NAME : !ENV '${DB_NAME}'
volumes :
- SEERR_CONFIG_PATH : /config
volumes :
SEERR_CONFIG_PATH :
device : '/containers /seerr '
# Makejail
ARG tag=latest
OPTION container=boot
OPTION overwrite=force
OPTION from=ghcr.io/daemonless /seerr:${tag}
Save the files above, then run appjail-director up.
seerr:latest · postgres:17 — data in /path/to/containers /seerr, /containers /seerr/postgres
One more container, its data in its own folder. For a household, or an app that wants it.
# .env
DIRECTOR_PROJECT=seerr
PUID=1000
PGID=1000
TZ=UTC
DB_TYPE=postgres
DB_HOST=seerr_postgres
DB_PORT=5432
DB_USER=seerr
DB_PASS=
DB_NAME=seerr
DATABASE_LOCATION=/containers/seerr/postgres
# appjail-director.yml
options :
- virtualnet : ':<random> default'
- nat :
services :
seerr :
name : seerr
options :
- container : 'args:--pull'
- expose : '5055 :5055 proto:tcp'
oci :
user : root
environment :
- PUID : !ENV '${PUID}'
- PGID : !ENV '${PGID}'
- TZ : !ENV '${TZ}'
- DB_TYPE : !ENV '${DB_TYPE}'
- DB_HOST : !ENV '${DB_HOST}'
- DB_PORT : !ENV '${DB_PORT}'
- DB_USER : !ENV '${DB_USER}'
- DB_PASS : !ENV '${DB_PASS}'
- DB_NAME : !ENV '${DB_NAME}'
volumes :
- SEERR_CONFIG_PATH : /config
seerr-postgres :
name : seerr_postgres
priority : 10
options :
- from : ghcr.io/daemonless/postgres:17
- template : !ENV '${PWD}/postgres-template.conf'
oci :
environment :
- POSTGRES_USER : !ENV '${DB_USER}'
- POSTGRES_PASSWORD : !ENV '${DB_PASS}'
- POSTGRES_DB : !ENV '${DB_NAME}'
volumes :
- database : /var/lib/postgresql/data
volumes :
SEERR_CONFIG_PATH :
device : '/containers /seerr '
database :
device : !ENV '${DATABASE_LOCATION}'
# Makejail
ARG tag=latest
OPTION container=boot
OPTION overwrite=force
OPTION from=ghcr.io/daemonless /seerr:${tag}
# The jail PostgreSQL runs in: SysV shared memory, which a jail does not
# get by default. ip4/ip6 are set here because the director's ip4_inherit
# option is a no-op in AppJail 5.5.0.
exec.start: "/bin/sh /etc/rc"
exec.stop: "/bin/sh /etc/rc.shutdown jail"
sysvmsg: new
sysvsem: new
sysvshm: new
mount.devfs
persist
ip4: inherit
ip6: inherit
Save the files above, then run appjail-director up.
seerr:latest · your own database — data in /path/to/containers /seerr
A database you already run, here or on another machine. Nothing extra runs; you give the address and the account.
# .env
DIRECTOR_PROJECT=seerr
PUID=1000
PGID=1000
TZ=UTC
DB_TYPE=
DB_HOST=
DB_PORT=
DB_USER=
DB_PASS=
DB_NAME=
# appjail-director.yml
options :
- virtualnet : ':<random> default'
- nat :
services :
seerr :
name : seerr
options :
- container : 'args:--pull'
- expose : '5055 :5055 proto:tcp'
oci :
user : root
environment :
- PUID : !ENV '${PUID}'
- PGID : !ENV '${PGID}'
- TZ : !ENV '${TZ}'
- DB_TYPE : !ENV '${DB_TYPE}'
- DB_HOST : !ENV '${DB_HOST}'
- DB_PORT : !ENV '${DB_PORT}'
- DB_USER : !ENV '${DB_USER}'
- DB_PASS : !ENV '${DB_PASS}'
- DB_NAME : !ENV '${DB_NAME}'
volumes :
- SEERR_CONFIG_PATH : /config
volumes :
SEERR_CONFIG_PATH :
device : '/containers /seerr '
# Makejail
ARG tag=latest
OPTION container=boot
OPTION overwrite=force
OPTION from=ghcr.io/daemonless /seerr:${tag}
Save the files above, then run appjail-director up.
Access at: http://localhost:5055
Interactive Configuration
Parameters
Environment Variables
Variable
Default
Description
PUID
1000
User ID for the application process
PGID
1000
Group ID for the application process
TZ
UTC
Timezone for the container
DB_TYPE
sqlite
sqlite or postgres; set by the Database choice
DB_HOST
``
PostgreSQL host (Database choice)
DB_PORT
5432
PostgreSQL port (Database choice)
DB_USER
``
PostgreSQL user (Database choice)
DB_PASS
<DB_PASS>
PostgreSQL password (Database choice)
DB_NAME
``
PostgreSQL database name (Database choice)
Volumes
Path
Description
/config
Configuration and database directory
Ports
Port
Protocol
Description
5055
TCP
Web UI
Implementation Details
Architectures: amd64, aarch64
User: bsd (UID/GID set via PUID/PGID ). Defaults to 1000:1000.
Base: Built on ghcr.io/daemonless /base (FreeBSD 15.1).
Need help? Join our Discord community.