- 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
The WATCHTOWER_NOTIFICATION_URL and WATCHTOWER_SCHEDULE placeholders
were unquoted in the template, causing YAML parsing issues when URLs
contained special characters (colons, slashes, @ symbols).
After substitution, Discord URLs like:
discord://TOKEN@WEBHOOK_ID
Would appear unquoted in the generated YAML:
WATCHTOWER_NOTIFICATION_URL: discord://TOKEN@WEBHOOK_ID
This caused "illegal argument in config URL" errors because YAML
interprets special characters differently when unquoted.
Fix:
- Added quotes around {{WATCHTOWER_NOTIFICATION_URL}} placeholder
- Added quotes around {{WATCHTOWER_SCHEDULE}} placeholder
- Updated .env.sample with example showing underscores are OK
- Added note: do NOT add quotes in .env file (template handles it)
After fix, generated YAML properly quotes the URL:
WATCHTOWER_NOTIFICATION_URL: "discord://TOKEN@WEBHOOK_ID"
This is why docker run -e worked (shell quoting) but docker-compose
failed (YAML parsing without quotes).
Fixes: Watchtower "illegal argument in config URL" error
Tested: YAML validation passed with Discord URL containing underscores
User impact: No need to URL-encode underscores anymore
Fixed three critical issues reported by user:
1. Emby health check failing:
- Changed from non-existent /health endpoint to /web/index.html
- Increased retries to 5 and start_period to 120s
- Using wget --spider for lightweight check
2. Bazarr health check failing:
- Changed from /api/system/status (requires auth) to root path /
- Increased retries to 5 and start_period to 90s
- Using wget --spider for lightweight check
3. Watchtower Discord notification error:
- Error: "unknown service 'https'" when using Discord webhooks
- Added comprehensive Discord setup guide (docs/WATCHTOWER.md)
- Updated .env.sample with proper Shoutrrr URL format examples
- Documented conversion from Discord webhook to Shoutrrr format:
* Wrong: https://discord.com/api/webhooks/ID/TOKEN
* Correct: discord://TOKEN@ID
Documentation updates:
- Created docs/WATCHTOWER.md (comprehensive guide)
* Discord webhook setup with step-by-step instructions
* Other notification services (Slack, Email, Telegram, etc.)
* Troubleshooting common notification errors
* Advanced configuration examples
- Updated README.md with Watchtower troubleshooting section
- Added WATCHTOWER.md to documentation index
Health check improvements:
- Both services now use wget instead of curl for consistency
- Increased start_period to allow proper initialization
- Increased retries for better resilience
- Using lightweight --spider checks
Fixes: Emby/Bazarr containers unhealthy despite running correctly
Fixes: Watchtower crashes with Discord notification URL format error
Tested: YAML validation passed, health check endpoints verified