[Docker] Emby on Synology NAS

[Docker] Emby on Synology NAS

Let’s complete the media-server hat-trick. I’ve run Plex since the early days (lifetime pass in hand), and I love that Jellyfin puts zero core features behind a paywall. Emby lands somewhere in between: polished apps and a solid DVR ecosystem, but hardware-accelerated transcoding requires Emby Premiere (paid). If that trade-off doesn’t thrill you, fair! I still don’t “prefer” Emby over the other two—but in the spirit of fairness (and because you asked), here’s a tidy install guide for Synology that gets Emby up and running quickly. We’ll stick to installation only; how you organize and watch your library is your call.

TL;DR: Set PUID/PGID, prefer host networking for easy discovery/DLNA, map /dev/dri if your NAS supports iGPU, and remember hardware transcoding needs Emby Premiere.

Prerequisites

  • Synology DSM with Container Manager (Docker) enabled
  • Folders (example layout):
    • /volume1/docker/emby/config (config & metadata)
    • /volume1/docker/emby/cache (transcodes/cache)
    • /volume1/docker/media (your libraries; swap to your actual paths)
  • Your NAS user’s PUID/PGID
    • Tip: the first DSM user is often PUID 1026 / PGID 100
    • Confirm via SSH: id <your_username>
  • (Optional) iGPU for hardware acceleration (Intel Quick Sync / VAAPI, etc.)

Option A — LinuxServer.io image (with PUID/PGID)

Save as docker-compose.yml:

services:
  emby:
    image: lscr.io/linuxserver/emby:latest
    container_name: emby
    network_mode: host
    environment:
      - PUID=1026           # change to your UID
      - PGID=100            # change to your GID
      - TZ=Asia/Seoul       # change to your timezone
    volumes:
      - /volume1/docker/emby/config:/config
      - /volume1/docker/emby/cache:/cache
      - /volume1/docker/emby/media:/media
#    devices:
#      - /dev/dri:/dev/dri   # optional; only for HW acceleration-capable NAS
    restart: unless-stopped

Why host networking? Emby uses TCP 8096 (HTTP) / 8920 (HTTPS) and UDP 7359 for discovery; DLNA uses 1900/udp. In host mode, multicast/broadcast “just works.”


Option B — Official Emby image

Prefer the official image? Swap it in:

services:
  emby:
    image: emby/embyserver:latest
    container_name: emby
    network_mode: host
    environment:
      - TZ=Asia/Seoul
    volumes:
      - /volume1/docker/emby/config:/config
      - /volume1/docker/emby/cache:/cache
      - /volume1/docker/emby/media:/media
#    devices:
#      - /dev/dri:/dev/dri
    restart: unless-stopped
The official image doesn’t use PUID/PGID variables like LinuxServer does; if you hit permission issues, ensure your NAS user has the right access on the mapped shares.

If You Must Use Bridge Mode

Host mode is simplest. If something else blocks it, publish the ports explicitly:

    ports:
      - "8096:8096"       # HTTP web UI
      - "8920:8920"       # HTTPS (if enabled)
      - "7359:7359/udp"   # local discovery
      - "1900:1900/udp"   # DLNA/SSDP
DLNA and discovery can be finicky through bridge mode; host is happier if your network allows it.

Deploy

From the folder with your docker-compose.yml:

docker compose up -d

Then visit http://<your-nas-ip>:8096 and complete the setup wizard.


Reverse Proxy (Optional)

Prefer a friendly URL?

https://emby.yourdomain.com

Create a reverse proxy rule in DSM that points to Emby’s 8096 (host mode) or to the published port (bridge). A subdomain is generally smoother than a sub-path.


Folder Permissions (Important)

Match your shared-folder permissions to the account behind your PUID/PGID. At minimum, grant read (and write if you want Emby to manage transcodes/artwork). Mis-matched permissions = invisible media and broken metadata.


Optional: Hardware Acceleration on Synology

Yes—Emby Premiere is required to unlock hardware-accelerated transcoding.

Checklist

  1. Confirm the iGPU device on the NAS ls -l /dev/dri Expect something like card0 and renderD128.
  2. Map the device into the container (already shown): devices: - /dev/dri:/dev/dri
  3. Fix render-device permissions if needed
    If logs show “permission denied” on /dev/dri/renderD*, find the device’s group ID: ls -n /dev/dri/renderD* Add that GID to the container: group_add: - "109" # example; replace with your render group GID Redeploy: docker compose up -d
  4. Enable in Emby
    Dashboard → Settings → Transcoding → enable Hardware acceleration (VAAPI / Intel QSV / NVENC as applicable) → Save.
  5. Test
    Play something that forces a transcode (e.g., 4K HEVC → 1080p) and verify that the playback info/logs show VAAPI/QSV/NVENC in use.

Notes

  • Don’t run the container as privileged unless you’re diagnosing.
  • Codec support varies by CPU/iGPU; mixed HW decode + SW encode is normal on some chips.
  • Reboot after major DSM updates to re-expose /dev/dri if it disappears.

Common Gotchas

  • Wrong PUID/PGID → configs/cache not writable; verify with id <user>.
  • Bridge mode + no discovery/DLNA → make sure 7359/udp and 1900/udp are published, or switch to host.
  • Reverse proxy via sub-path → subdomain is easier; sub-path may need extra rewrites.

Final Take

If you already own Plex Pass, Plex remains a strong default. If you want no paywalls, Jellyfin is delightful. Emby sits between them: sleek apps and good TV/DVR, but with paid HW transcoding. If that mix fits your needs, the Docker setup on Synology is painless—and now you’ve got all three princes of media servers lined up on your NAS.