A containerized ZoneMinder surveillance system built on Debian Bullseye, providing a complete video surveillance solution with web interface, database, and SSL support.
This project is community-maintained and no longer actively used by the original author. While functional, please note:
- AMD64 builds: Available with latest ZoneMinder versions
- ARM64 builds: Fully supported via automated builds
- Testing: Limited testing is performed on new versions - use at your own risk
- Support: Community-based support only
- 🔒 SSL/TLS Support - Self-signed certificates or custom SSL certificates
- 🗄️ Persistent Storage - Configuration and recordings stored in mounted volumes
- 📧 Email Notifications - Integrated msmtp for email alerts
- 🔧 Easy Configuration - Environment variable based setup
- 🌐 Multi-Architecture - Support for both AMD64 and ARM64 platforms
- 🔗 SWAG Integration - Compatible with LinuxServer.io SWAG reverse proxy
docker run -d \
--name=zoneMinder \
-p 443:443 \
-e TZ=Europe/Rome \
-e SELFSIGNED=0 \
-e FQDN=your.fqdn \
--shm-size=1g \
-v /mystorage/ZoneMinder/config:/config \
-v /mystorage/ZoneMinder/zmcache:/var/cache/zoneminder \
--restart unless-stopped \
nardo86/zoneminderversion: '3.8'
services:
zoneminder:
image: nardo86/zoneminder
container_name: zoneminder
ports:
- "443:443"
environment:
- TZ=Europe/Rome
- SELFSIGNED=0
- FQDN=your.fqdn
volumes:
- /mystorage/ZoneMinder/config:/config
- /mystorage/ZoneMinder/zmcache:/var/cache/zoneminder
shm_size: '1gb'
restart: unless-stoppedThis container is built following the official ZoneMinder installation guide.
ARM64 builds are compiled from source using the official build process due to lack of pre-built ARM64 packages.
Email Configuration: Uses msmtp (replacing deprecated ssmtp) with Gmail-ready configuration template created at /config/msmtprc.
Available at: https://hub.docker.com/r/nardo86/zoneminder
| Variable | Description | Default |
|---|---|---|
TZ |
Timezone setting | Etc/UTC |
FQDN |
Fully Qualified Domain Name for Apache2 configuration | localhost |
SELFSIGNED |
Use self-signed certificates (1) or custom SSL certificates (0) | 0 |
Self-signed certificates (SELFSIGNED=1):
- Automatically generated on first run
- Suitable for testing and internal use
Custom SSL certificates (SELFSIGNED=0):
- Mount your certificates to
/sslcert/liveand/sslcert/archive - Compatible with Let's Encrypt certificates from SWAG
version: '3.8'
services:
zoneminder:
image: nardo86/zoneminder
container_name: zoneminder
ports:
- "443:443"
environment:
- TZ=Europe/Rome
- SELFSIGNED=0
- FQDN=your.domain.com
volumes:
- /mystorage/ZoneMinder/config:/config
- /mystorage/ZoneMinder/zmcache:/var/cache/zoneminder
- /mystorage/Swag/etc/letsencrypt/live:/sslcert/live
- /mystorage/Swag/etc/letsencrypt/archive:/sslcert/archive
shm_size: '1gb'
restart: unless-stoppedThe shm-size parameter allocates shared memory for ZoneMinder:
- Size depends on number of cameras and recording settings
- Start with 1GB and adjust based on performance
- Warning: Don't over-allocate as it may cause system instability
Once running, access ZoneMinder at: https://your.fqdn:443/zm
To transfer data from another ZoneMinder instance (reference):
-
Backup database on old system:
mysqldump -p zm > /config/zm-dbbackup.sql -
Restore database on new system:
mysql -p zm < /config/zm-dbbackup.sql -
Sync recordings:
rsync -r -t -p -o -g -v --progress --delete user@oldSystem:/var/cache/zoneminder/* /var/cache/zoneminder/ -
Cleanup and audit:
zmaudit.pl
If the container gets stuck on "Waiting mysql startup..." message:
-
Access container:
docker exec -it zoneminder bash -
Manual database start with detailed logging:
/usr/bin/mysqld_safe --skip-syslog
-
Check logs for specific error messages to diagnose database issues
- Monitor shared memory usage:
df -h /dev/shm - Adjust
shm-sizebased on camera count and recording settings - Check system memory usage to prevent swapping
- 🔒 Use strong passwords for ZoneMinder admin account
- 🌐 Consider using a reverse proxy with proper SSL certificates
- 🔄 Keep container updated with security patches
- 📋 Regularly backup your configuration and recordings
- 🚫 Avoid exposing directly to internet without additional security layers
This is a community-maintained project. Contributions are welcome:
- 🐛 Bug Reports: Please include container logs and system information
- 🔧 Pull Requests: Test thoroughly before submitting
- 📚 Documentation: Help improve this README
- 🧪 Testing: Help test new versions on different architectures
This project was developed with the assistance of Claude AI (Anthropic). While functional, please be aware that:
- Security considerations: The configuration may not be optimized for production environments
- Best practices: Some settings might not follow enterprise-grade security standards
- Testing required: Thoroughly test in your environment before production use
- No warranty: Use at your own risk - review all configurations before deployment
- Community input welcome: Issues and improvements are encouraged via GitHub issues/PRs
Recommendation: Have a security professional review the setup before production deployment.
This is a community project maintained on a volunteer basis.
If this project helped you:
- ⭐ Star the repository on GitHub
- 🐛 Report issues and bugs
- 🔧 Contribute improvements
- ☕ Feel free to consider donating if my work helped you! https://paypal.me/ErosNardi
For issues:
- Check existing GitHub issues
- Review security considerations
- Test in isolated environment
- Provide detailed reproduction steps
- Be patient - this is maintained on volunteer basis
- AMD64: Latest ZoneMinder version (automatically updated)
- ARM64: Latest ZoneMinder version (fully supported)
- Base Image: Debian Bullseye Slim
- Web Server: Apache2 with SSL
- Database: MariaDB
- Mail: msmtp (replaces deprecated ssmtp)