Official Agent DVR image. Website: https://www.ispyconnect.com
DISCLAIMER: Buy me coffee link below is NOT affiliated in anyway with the main iSpy AgentDVR. The docker image publisher is NOT affiliated with the main iSpy AgentDVR either.
| Architecture | Available | Tag | Status |
|---|---|---|---|
| x86-64 | ✅ | amd64-<version tag> | Tested "WORKING" |
| arm64 | ✅ | arm64v8-<version tag> | Tested "WORKING" |
| armhf | ✅ | arm32v7-<version tag> | Tested "WORKING" (4.8.2.0 and newer versions) |
-
⚠️ ⚠️ ⚠️ Directory structure reverted to/AgentDVRfrom/home/agentdvr/AgentDVR. It is SPECIALLY IMPORTANT to correctly apply this change in unRAID, Synology NAS and other GUID based container deployer.⚠️ ⚠️ ⚠️ -
⚠️ Base image updated to Debian Trixie⚠️ -
⚠️ ZSTD compression applied to reduce image size and save bandwidth. Docker Engine 23.0 or later and for Podman deployment Podman Machine v5.1 or later is required for image version 6.5.7.0 and later!⚠️ -
⚠️ ⚠️ ⚠️ VERY IMPORTANT: TURN Server Port range is changed from50000-50010to50000-50100. Please set the range in Docker CLI or Docker Compose to50000-50100⚠️⚠️⚠️ - The ARMHF image has been fixed. For ARM32-bit/ARMHF devices, use image version 4.8.2.0 or newer.
- For GPU HW-Accelerated Encode/Decode please use version 5.3.5.0 or NEWER images.
-
⚠️ ⚠️ ⚠️ It is Discouraged to use BETA on mission-critical environments!!! - Read the update information and use older tags with caution.
| Tag | Available | Description | Status |
|---|---|---|---|
| stable | ✅ | "iSpy Agent DVR" Most Stable image to date | Tested "WORKING". An image will be made "stable" if an image remains "latest" for at least 5 days |
| latest | ✅ | "iSpy Agent DVR" Latest releases image | Tested "WORKING" |
| beta | "iSpy Agent DVR" BETA releases image | ||
| 7.4.5.0 | ✅ | "iSpy Agent DVR" Static version 7.4.5.0 image | Tested "WORKING" |
| 7.2.4.0-beta | "iSpy Agent DVR" 7.2.4.0 beta release for testing |
docker-compose (recommended, docs)
---
services:
ispyagentdvr:
image: mekayelanik/ispyagentdvr:latest
container_name: ispyagentdvr
environment:
- PUID=1000
- PGID=1000
- AGENTDVR_WEBUI_PORT=8090
- TZ=Asia/Dhaka
volumes:
- /path/to/config:/AgentDVR/Media/XML
- /path/to/recordings:/AgentDVR/Media/WebServerRoot/Media
- /path/to/models:/AgentDVR/Media/Models
- /path/to/commands:/AgentDVR/Commands
ports:
- 8090:8090
- 3478:3478/udp
- 50000-50100:50000-50100/udp
restart: unless-stopped
Note:
- On Raspberry Pi and other low-power ARM SBCs, wait about 30 seconds after deployment before opening WebUI, then refresh if needed.
- With many cameras, startup may take longer.
docker cli ( docs)
docker run -d \
--name=ispyagentdvr \
-e PUID=1000 \
-e PGID=1000 \
-e AGENTDVR_WEBUI_PORT=8090
-e TZ=Asia/Dhaka \
-p 8090:8090 \
-p 3478:3478/udp \
-p 50000-50100:50000-50100/udp \
-v /path/to/config:/AgentDVR/Media/XML \
-v /path/to/recordings:/AgentDVR/Media/WebServerRoot/Media \
-v /path/to/models:/AgentDVR/Media/Models \
-v /path/to/commands:/AgentDVR/Commands \
--restart unless-stopped \
mekayelanik/ispyagentdvr:latest
Dedicated local IP using MACVLAN ( docs)
---
services:
ispyagentdvr:
image: ghcr.io/mekayelanik/ispyagentdvr:latest
container_name: ispyagentdvr
environment:
- PUID=1000
- PGID=1000
- AGENTDVR_WEBUI_PORT=8090
- TZ=Asia/Dhaka
volumes:
- /path/to/config:/AgentDVR/Media/XML
- /path/to/recordings:/AgentDVR/Media/WebServerRoot/Media
- /path/to/models:/AgentDVR/Media/Models
- /path/to/commands:/AgentDVR/Commands
ports:
- 8090:8090
- 3478:3478/udp
- 50000-50100:50000-50100/udp
restart: unless-stopped
hostname: ispyagentdvr
domainname: local
mac_address: AB-BC-C0-D1-E2-EF
networks:
macvlan-1:
ipv4_address: 192.168.2.12
networks:
macvlan-1:
name: macvlan-1
external: TrueTo make MACVLAN work, set valid values for mac_address, ipv4_address, subnet, ip_range, and gateway.
In the case of MACVLAN, you must access the WebUI using http://ipv4_address:8090
One must use images from 5.3.5.0 or NEWER images to get the provisioned GPU HW-Acceleration. Older images will not work. If you face any issues, please report this on GitHub of this image. The GitHub link can be found at the bottom of this page.
docker-compose (recommended, docs)
---
services:
ispyagentdvr:
image: ghcr.io/mekayelanik/ispyagentdvr:latest
container_name: ispyagentdvr
environment:
- PUID=1000
- PGID=1000
- AGENTDVR_WEBUI_PORT=8090
- TZ=Asia/Dhaka
volumes:
- /path/to/config:/AgentDVR/Media/XML
- /path/to/recordings:/AgentDVR/Media/WebServerRoot/Media
- /path/to/models:/AgentDVR/Media/Models
- /path/to/commands:/AgentDVR/Commands
ports:
- 8090:8090
- 3478:3478/udp
- 50000-50100:50000-50100/udp
restart: unless-stopped
docker cli ( docs)
docker run -d \
--name=ispyagentdvr \
-e PUID=1000 \
-e PGID=1000 \
-e AGENTDVR_WEBUI_PORT=8090 \
-e TZ=Asia/Dhaka \
-p 8090:8090 \
-p 3478:3478/udp \
-p 50000-50100:50000-50100/udp \
-v /path/to/config:/AgentDVR/Media/XML \
-v /path/to/recordings:/AgentDVR/Media/WebServerRoot/Media \
-v /path/to/models:/AgentDVR/Media/Models \
-v /path/to/commands:/AgentDVR/Commands \
--restart unless-stopped \
mekayelanik/ispyagentdvr:latestTo get GPU Hardware acceleration from Nvidia, user MUST INSTALL THE "LATEST" Nvidia Drivers & Nvidia Container Toolkit on the Host Machine/Server/VM/LXC provided by Nvidia. Instructions for Nvidia Container Toolkit can be found here:
Nvidia-Container-ToolkitWe added the necessary environment variable that will utilize all the features available on a GPU on the host. Once Nvidia container runtime is installed on your host you will need to re/create the docker container with the nvidia container runtime `--runtime=nvidia` and add an environment variable `-e NVIDIA_VISIBLE_DEVICES=all` (can also be set to a specific gpu's UUID, this can be discovered by running `nvidia-smi --query-gpu=gpu_name,gpu_uuid --format=csv` ). NVIDIA automatically mounts the GPU and drivers from your host into the AgentDVR docker container.
The following have to be added in docker-compose file/docker-cli cm respectively
docker compose
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
- /dev/dri/card0:/dev/dri/card0
- /dev/kfd:/dev/kfddocker cli
--device /dev/dri/renderD128:/dev/dri/renderD128 --device /dev/dri:/dev/dri/card0 --device /dev/kfd:/dev/kfdThe following have to be added in docker-compose file/docker-cli cm respectively
docker compose
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
- /dev/dri/card0:/dev/dri/card0docker cli
--device /dev/dri/renderD128:/dev/dri/renderD128 --device /dev/dri/card0:/dev/dri/card0docker run -d \
--name=ispyagentdvr \
-e PUID=1000 \
-e PGID=1000 \
-e AGENTDVR_WEBUI_PORT=8090 \
-e TZ=Asia/Dhaka \
-p 8090:8090 \
-p 3478:3478/udp \
-p 50000-50100:50000-50100/udp \
-v /path/to/config:/AgentDVR/Media/XML \
-v /path/to/recordings:/AgentDVR/Media/WebServerRoot/Media \
-v /path/to/models:/AgentDVR/Media/Models \
-v /path/to/commands:/AgentDVR/Commands \
--restart unless-stopped \
`for dev in dri dma_heap mali0 rga mpp_service \
iep mpp-service vpu_service vpu-service \
hevc_service hevc-service rkvdec rkvenc vepu h265e ; do \
[ -e "/dev/$dev" ] && echo " --device /dev/$dev"; \
done`
mekayelanik/ispyagentdvr:latestDISCLAIMER: Jellyfin FFMPEG and corresponding ideas were used in this image to enable the HW-Acceleration
Container images use runtime parameters. These are separated by a colon and indicate <external>:<internal>. For example, -p 8090:80 exposes port 80 inside the container on host port 8090.
| Parameter | Function |
|---|---|
-p 8090
|
Map AgentDVR WebUI Port to HOST |
-p 3478/udp
|
Map Main port used for TURN server communication to HOST |
-p 50000-50100//udp
|
Map Ports from AgentDVR to HOST, to be used to create connections or WebRTC. These will be used as needed |
-e PUID=1000
|
For UserID - see below for explanation |
-e PGID=1000
|
For GroupID - see below for explanation |
-e TZ=Asia/Dhaka
|
Specify a timezone to use, see this list. |
-e AGENTDVR_WEBUI_PORT=8090
|
Specify a Port to Expose AgentDVR WebUI |
-v /AgentDVR/Media/XML
|
Contains all relevant configuration files. |
-v /AgentDVR/Media/WebServerRoot/Media
|
Location of Surveillance Recordings on disk. |
-v /AgentDVR/Media/Models
|
Model files location for AgentDVR. |
-v /AgentDVR/Commands
|
Location to store desired iSpy Agent DVR Commands. |
When using volumes ( -v flags) permissions issues can arise between the host OS and the container, One can avoid this issue by allowing you to specify the user PUID and group PGID.
Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic.
In this instance PUID=1000 and PGID=1000, to find yours use id user as below:
$ id username
uid=1000(docker user) gid=1000(docker group) groups=1000(docker group)To use a Non-host network, you will need to open up ports for this to properly work, thus the UDP ports listed in the sample runs.
To access WebUI go to the container's http://container's ip:8090 or http://ipv4_address:8090
Below are the instructions for updating containers:
- Update all images:
docker compose pull- or update a single image:
docker compose pull ispyagentdvr
- or update a single image:
- Let compose update all containers as necessary:
docker compose up -d- or update a single container (recommended):
docker compose up -d ispyagentdvr
- or update a single container (recommended):
- To remove the old unused images run:
docker image prune
- Update the image:
docker pull mekayelanik/ispyagentdvr:latest - Stop the running container:
docker stop ispyagentdvr - Delete the container:
docker rm ispyagentdvr - Recreate a new container with the same docker run parameters as instructed above (if mapped correctly to a host folder, your
/AgentDVR/Media/XMLfolder and settings will be preserved) - To remove the old unused images run:
docker image prune
Via Watchtower auto-updater (only use if you don't remember the original parameters)
-
Pull the latest image at its tag and replace it with the same env variables in one run:
docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ containrrr/watchtower\ --run-once ispyagentdvr -
To remove the old unused images run:
docker image prune
- You can also use Diun for update notifications. Other tools that automatically update containers unattended are not encouraged
If you had the old format of audio and video volumes please move them to the new media folder before starting the container again.
It would look something like this:
mkdir -p /ispyagentdvr/media/old && \
mv /path/to/recordings/audio /ispyagentdvr/media/old && \
mv /path/to/recordings/video /ispyagentdvr/media/old- Audio playback on Linux host: If you experiencing sound playback issues on Linux server hosts (Debian/Ubuntu etc.), i.e. Action sound won't play through server's speaker, add these lines to docker-compose.yml:
group_add:
- audio
devices:
- /dev/snd:/dev/snd
- ARM SBCs: Raspberry Pi 4+ may support limited acceleration with proper host setup. Performance can vary; if you get a reliable VAAPI/VPU configuration, share it via GitHub and it can be documented with credit.
- Things to make sure before Submitting a issue:
- Update your Docker Engine to the latest available, specially on OSX. After updating the docker engine please check if the issue has been resolved.
- Inspect the
AgentDVR-IP:AGENTDVR_WEBUI_PORT/logs.htmlfor Error list - If you intend to run this image on Raspberry Pi 5 then use Ubuntu or Ubuntu Server as your OS. There is a bug in Debian that fatally affects the execution of AgentDVR and many other applications that are written on .Net Core. Other Raspberry Pi doesn't have this issue at the time of writing this.
- When reporting issues, include your Docker Compose/Docker CLI deployment command and relevant
logs.htmloutput.
- Major Changes
- 7.2.0.0: -
⚠️ ⚠️ ⚠️ NEW directory mapping required for persistant AI model storage/AgentDVR/Media/Models⚠️ ⚠️ ⚠️ - 6.6.2.0: -
⚠️ ⚠️ ⚠️ Directory structure reverted to/AgentDVRfrom/home/agentdvr/AgentDVR. It is SPECIALLY IMPORTANT to correctly apply this change in unRAID, Synology NAS and other GUID based container deployer.⚠️ ⚠️ ⚠️ - 6.6.2.0: -
⚠️ ⚠️ ⚠️ Base image changed to Debian Trixie from Bookworm (mekayelanik:ispyagentdvr-trixie-slim-vlc-jellyfin-ffmpeg-7.1.1-7-intel-25.31.34666.3)⚠️ ⚠️ ⚠️ - 6.6.2.0: - ✅ UPDATED: Intel driver Version to: 25.31.34666.3 and AMD Mesa Driver Version to: 25.2.2-1
- 6.6.2.0: -
⚠️ ⚠️ ⚠️ Armhf will not get any Jellyfin FFMEG from now on as the suppoprt has been dropped by Jellyfin. Instead, FFMEG from Debian SID will be used for ARMHF builds.⚠️ ⚠️ ⚠️ - 6.5.7.0: -
⚠️ ⚠️ ⚠️ ZSTD compression applied to reduce image size and save bandwidth. Docker Engine 23.0 or later and in case of Podman deployment, Podman Machine v5.1 or later is required for image version 6.5.7.0 and later!⚠️ ⚠️ ⚠️ - 6.3.4.0: - ✅ Regular version updated to 6.3.4.0. Updated Intel GPU driver to Comute Runtime Version: 25.18.33578.6, AMD Mesa Driver Version: 25.0.7-1 and updated jellyfin-ffmpeg to 7.1.1-6
- 6.1.3.0: - ✅ Regular version updated to 6.1.3.0. Using BETA images in a mission-critical environment is STRICTLY DISCOURAGED
⚠️ - 6.0.9.0: -
⚠️ ⚠️ ⚠️ Updated Intel GPU driver and updated jellyfin-ffmpeg to 7.0.2-9⚠️ ⚠️ ⚠️ - 6.0.1.0: -
⚠️ ⚠️ ⚠️ Added driver support for Intel Battlemage GPUs⚠️ ⚠️ ⚠️ - 5.8.4.0: -
⚠️ ⚠️ ⚠️ Config files file format changed from XML to JSON⚠️ ⚠️ ⚠️ - 5.8.1.0: -
⚠️ FFMPEG version bumped from 6.0.1 to 7.0.2 - 5.8.1.0: -
mekayelank/ispyagentdvrimage is now fully backword compatible withdoitandbedone/ispyagentdvrimage. From now on, you don't have to change the directory mapping to switch fromdoitandbedone/ispyagentdvrtomekayelank/ispyagentdvr, UNLESS you are using unRAID/Synology NAS or other GUI based container deployer. In that case, you will have to follow the contents of the documentation to deploy this image
To submit this Docker image specific issues or requests visit this docker image's Github Link: https://www.github.com/MekayelAnik/ispyagentdvr-docker
For iSpy AgentDVR-related issues and requests, please visit: https://www.reddit.com/r/ispyconnect/
To have a deeper dive into the custom base image of this container, please visit: https://github.com/MekayelAnik/ispyagentdvr-base-image
