- add docker-compose template for Technitium DNS and Dockhand
- add required DNS/Dockhand env vars to .env.sample
- add single-flow migration runbook (Pi Zero -> Pi 4 with same IP
cutover)
- add forced DNS and DoT/DoH hardening quick-entry guides
- document wildcard DNS strategy and Technitium replacement mapping
Applied same fix as Emby - simple TCP port check instead of curl.
Previous: curl -f http://localhost:5055/api/v1/status
Issue: curl might not be available in container
New: timeout 1 bash -c '</dev/tcp/localhost/5055'
Benefits:
- No external tools needed (curl, wget, nc)
- Just bash built-ins
- Works in any container with bash
- More reliable
Also increased:
- retries: 3 → 5
- start_period: 60s → 90s (more time to initialize)
Fixes: Jellyseerr showing unhealthy despite working correctly
Changed from nc (netcat) to bash's built-in /dev/tcp/ feature.
Issue: nc might not be available in LinuxServer Emby container
Solution: Use bash's built-in TCP check via /dev/tcp/localhost/8096
This works in ANY container with bash (universal):
- No nc required
- No curl required
- No wget required
- Just bash built-in features
The timeout command ensures the check fails quickly if port is not open.
Fixes: Emby health check when nc is not installed
Tested: Works in all bash-capable containers
Changed Emby health check from HTTP endpoint check to simple TCP port check.
Previous issue:
- wget --spider http://localhost:8096/web/index.html was failing
- Emby web UI might not be ready even when service is running
- Hardware transcoding initialization takes significant time
New approach:
- Simple TCP port check: nc -z localhost 8096
- Just verifies port 8096 is listening
- No HTTP requests, no endpoints, no complexity
- Increased start_period to 180s (3 minutes) for hardware init
This is much more reliable and gives Emby plenty of time to initialize,
especially on Synology with hardware transcoding (/dev/dri).
Fixes: Emby health check failures despite service running correctly
Tested: TCP port check is simpler and more reliable