Skip to content

Dispatcharr Dispatcharr

Description / nameInput element
Container Registry
Container Configuration Root Path
Timezone
Dispatcharr Host Port
Dispatcharr /data Path

Build Status Last Commit sysvipc Required

Dispatcharr — stream dispatching and channel management.

Requires ocijail with annotation support (≥ 0.6.0)

This image needs the jail permission allow.sysvipc, applied via OCI annotations. FreeBSD quarterly ships ocijail 0.4.0, which has no annotation support — the container starts but the permission is silently dropped, so the app can crash or misbehave. Point your pkg repos at the latest branch (ocijail ≥ 0.6.0) and run with the annotation flag shown below. See the ocijail guide.

Port 9191
Registry ghcr.io/daemonless/dispatcharr
Daemonless daemonless/dispatcharr
Source Dispatcharr/Dispatcharr
Website dispatcharr.io

Version Tags

Tag Description Best For
latest FreeBSD Port. Built from latest FreeBSD packages. Most users — recommended.

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

services:
  dispatcharr:
    image: "ghcr.io/daemonless/dispatcharr:latest"
    container_name: dispatcharr
    environment:
      - TZ=UTC  # Timezone (e.g. America/New_York)
      - POSTGRES_DB=dispatcharr  # PostgreSQL database name (default: dispatcharr)
      - POSTGRES_USER=dispatcharr  # PostgreSQL username (default: dispatcharr)
      - POSTGRES_PASSWORD=dispatcharr  # PostgreSQL password (default: dispatcharr)
      - CELERY_NICE_LEVEL=5  # niceness for Celery workers (default: 5)
      - DISPATCHARR_PORT=  # Web UI port (default: 9191)
      - DJANGO_SECRET_KEY=<DJANGO_SECRET_KEY>  # Django secret key — auto-generated if not set, persisted to /data/secret_key
      - REDIS_HOST=  # Redis hostname (default: 127.0.0.1)
      - REDIS_PORT=  # Redis port (default: 6379)
      - DISABLE_ML_DOWNLOADS=  # Set false to enable ML channel matching (requires torch — not available in this build)
    volumes:
      - "/path/to/containers/dispatcharr:/data"
    ports:
      - "9191:9191"
    annotations:
      org.freebsd.jail.allow.sysvipc: "true"
    restart: unless-stopped
podman run -d --name dispatcharr \
  -p 9191:9191 \
  --annotation 'org.freebsd.jail.allow.sysvipc=true' \
  -e TZ=UTC \
  -e POSTGRES_DB=dispatcharr \
  -e POSTGRES_USER=dispatcharr \
  -e POSTGRES_PASSWORD=dispatcharr \
  -e CELERY_NICE_LEVEL=5 \
  -e DISPATCHARR_PORT= \
  -e DJANGO_SECRET_KEY=<DJANGO_SECRET_KEY> \
  -e REDIS_HOST= \
  -e REDIS_PORT= \
  -e DISABLE_ML_DOWNLOADS= \
  -v /path/to/containers/dispatcharr:/data \
  ghcr.io/daemonless/dispatcharr:latest
- name: Deploy dispatcharr
  containers.podman.podman_container:
    name: dispatcharr
    image: "ghcr.io/daemonless/dispatcharr:latest"
    state: started
    restart_policy: always
    env:
      TZ: "UTC"
      POSTGRES_DB: "dispatcharr"
      POSTGRES_USER: "dispatcharr"
      POSTGRES_PASSWORD: "dispatcharr"
      CELERY_NICE_LEVEL: "5"
      DISPATCHARR_PORT: ""
      DJANGO_SECRET_KEY: "<DJANGO_SECRET_KEY>"
      REDIS_HOST: ""
      REDIS_PORT: ""
      DISABLE_ML_DOWNLOADS: ""
    ports:
      - "9191:9191"
    volumes:
      - "/path/to/containers/dispatcharr:/data"
    annotation:
      org.freebsd.jail.allow.sysvipc: "true"
# .env

DIRECTOR_PROJECT=dispatcharr
TZ=UTC
POSTGRES_DB=dispatcharr
POSTGRES_USER=dispatcharr
POSTGRES_PASSWORD=dispatcharr
CELERY_NICE_LEVEL=5
DISPATCHARR_PORT=
DJANGO_SECRET_KEY=<DJANGO_SECRET_KEY>
REDIS_HOST=
REDIS_PORT=
DISABLE_ML_DOWNLOADS=
# appjail-director.yml

options:
  - virtualnet: ':<random> default'
  - nat:
services:
  dispatcharr:
    name: dispatcharr
    options:
      - container: 'boot args:--pull'
      - expose: '9191:9191 proto:tcp'
    oci:
      user: root
      environment:
        - TZ: !ENV '${TZ}'
        - POSTGRES_DB: !ENV '${POSTGRES_DB}'
        - POSTGRES_USER: !ENV '${POSTGRES_USER}'
        - POSTGRES_PASSWORD: !ENV '${POSTGRES_PASSWORD}'
        - CELERY_NICE_LEVEL: !ENV '${CELERY_NICE_LEVEL}'
        - DISPATCHARR_PORT: !ENV '${DISPATCHARR_PORT}'
        - DJANGO_SECRET_KEY: !ENV '${DJANGO_SECRET_KEY}'
        - REDIS_HOST: !ENV '${REDIS_HOST}'
        - REDIS_PORT: !ENV '${REDIS_PORT}'
        - DISABLE_ML_DOWNLOADS: !ENV '${DISABLE_ML_DOWNLOADS}'
    volumes:
      - DISPATCHARR_DATA_PATH: /data
volumes:
  DISPATCHARR_DATA_PATH:
    device: '/path/to/containers/dispatcharr'
1
2
3
4
5
6
7
# Makejail

ARG tag=latest

OPTION overwrite=force
OPTION from=ghcr.io/daemonless/dispatcharr:${tag}
SET allow.sysvipc=1
appjail oci run -Pd \
  -o overwrite=force \
  -o container="args:--pull" \
  -o virtualnet=":<random> default" \
  -o nat \
  -o expose="9191:9191 proto:tcp" \
  -e TZ=UTC \
  -e POSTGRES_DB=dispatcharr \
  -e POSTGRES_USER=dispatcharr \
  -e POSTGRES_PASSWORD=dispatcharr \
  -e CELERY_NICE_LEVEL=5 \
  -e DISPATCHARR_PORT= \
  -e DJANGO_SECRET_KEY=<DJANGO_SECRET_KEY> \
  -e REDIS_HOST= \
  -e REDIS_PORT= \
  -e DISABLE_ML_DOWNLOADS= \
  -o fstab="/path/to/containers/dispatcharr /data <pseudofs>" \
  ghcr.io/daemonless/dispatcharr:latest dispatcharr

Access at: http://localhost:9191

Interactive Configuration

Parameters

Environment Variables

Variable Default Description
TZ UTC Timezone (e.g. America/New_York)
POSTGRES_DB dispatcharr PostgreSQL database name (default: dispatcharr)
POSTGRES_USER dispatcharr PostgreSQL username (default: dispatcharr)
POSTGRES_PASSWORD dispatcharr PostgreSQL password (default: dispatcharr)
CELERY_NICE_LEVEL 5 niceness for Celery workers (default: 5)
DISPATCHARR_PORT `` Web UI port (default: 9191)
DJANGO_SECRET_KEY <DJANGO_SECRET_KEY> Django secret key — auto-generated if not set, persisted to /data/secret_key
REDIS_HOST `` Redis hostname (default: 127.0.0.1)
REDIS_PORT `` Redis port (default: 6379)
DISABLE_ML_DOWNLOADS `` Set false to enable ML channel matching (requires torch — not available in this build)

Volumes

Path Description
/data Persistent data — PostgreSQL cluster, media, backups, logos

Ports

Port Protocol Description
9191 TCP Web UI

Work in Progress: This is an all-in-one (AIO) image — PostgreSQL, Redis, Nginx, Celery, Daphne, and the Django app all run inside a single container.

First run: the container initialises a fresh PostgreSQL cluster under /data/postgres and runs Django migrations automatically. This takes a few extra seconds on first start.

PostgreSQL requires allow.sysvipc in the jail. Add the annotation to your podman run command or compose deploy block:

podman run --annotation 'org.freebsd.jail.allow.sysvipc=true' ...

DJANGO_SECRET_KEY: if not provided, a random key is auto-generated on first start and persisted to /data/secret_key. Set it explicitly if you need a stable key across container recreations.

AI channel matching (torch / sentence-transformers) is not available in this build — PyTorch exists in FreeBSD ports but Python 3.13 support is not yet available (FreeBSD bug #285957, expected ~2027). The rest of Dispatcharr is fully functional.

Implementation Details

  • Architectures: amd64
  • User: bsd (UID/GID set via PUID/PGID). Defaults to 1000:1000.
  • Base: Built on ghcr.io/daemonless/base (FreeBSD 15.1).
  • sysvipc: Requires --annotation 'org.freebsd.jail.allow.sysvipc=true' (ocijail 0.5.0+)

Need help? Join our Discord community.