## Major Changes ### 1. Complete README.md Rewrite Replaced minimal, disorganized README with comprehensive documentation: **New Sections:** - Quick start guide - Available stacks overview (Media, Database, Secrets) - Security features comparison table - Prerequisites and requirements - Detailed configuration guide - Multiple deployment options - Verification and testing procedures - Resource allocation overview - Common tasks (update, logs, restart) - Troubleshooting quick reference - Migration guide - Best practices - Contributing guidelines **Removed:** - Random pgAdmin permission notes - Paperless-ngx Caddy configuration (not relevant to this repo) - Scattered external links ### 2. Documentation Reorganization **Created docs/ directory:** ``` docs/ ├── IMPROVEMENTS.md (was DOCKER_COMPOSE_IMPROVEMENTS.md) ├── SOCKET_PROXY.md (was SOCKET_PROXY_GUIDE.md) ├── TROUBLESHOOTING.md (was TROUBLESHOOTING.md) └── RECYCLARR.md (NEW - comprehensive guide) ``` **Benefits:** - Cleaner root directory - Logical organization - Consistent naming - Easy to navigate ### 3. Recyclarr Configuration Template **Created RECYCLARR_CONFIG_TEMPLATE.yml:** - Fixed base_url to use service names (http://sonarr:8989) - Removed localhost references (they don't work in Docker) - Added clear placeholders for API keys - Included comprehensive comments - Added examples for custom formats - Both 1080p and 4K profiles included **Key fix - Service names instead of localhost:** ```yaml # ✅ Correct base_url: http://sonarr:8989 # ❌ Wrong (doesn't work in Docker) base_url: http://localhost:8989 ``` ### 4. New RECYCLARR.md Documentation Comprehensive guide covering: - Quick start with clear steps - How to get API keys - Configuration examples - Testing and validation - Common issues and fixes - Quality profiles explained - Custom formats guide - Maintenance procedures - Advanced configuration - Troubleshooting checklist ## Repository Structure Improvements ### Before (Disorganized) ``` . ├── README.md (minimal, random notes) ├── DOCKER_COMPOSE_IMPROVEMENTS.md ├── SOCKET_PROXY_GUIDE.md ├── TROUBLESHOOTING.md └── docker-compose-files/ ``` ### After (Organized) ``` . ├── README.md (comprehensive, professional) ├── RECYCLARR_CONFIG_TEMPLATE.yml (ready to use) ├── docs/ │ ├── IMPROVEMENTS.md │ ├── SOCKET_PROXY.md │ ├── TROUBLESHOOTING.md │ └── RECYCLARR.md └── docker-compose-files/ ``` ## Documentation Highlights ### README.md Features - Professional structure with emoji icons - Clear table of contents - Quick start in 4 commands - Service comparison tables - Security features highlighted - Multiple deployment patterns - Comprehensive troubleshooting - External resources section - Credits and support info ### RECYCLARR.md Features - Step-by-step configuration - Visual examples (✅/❌) - Common errors explained - Testing procedures - Quality profile guide - TRaSH Guides integration ## User Feedback Addressed User requested: 1. ✅ Fix recyclarr config (localhost → service names) 2. ✅ Improve folder structure 3. ✅ Consolidate documentation into one main README All addressed: - Recyclarr template with correct URLs - Docs organized in docs/ directory - Comprehensive README.md as single entry point - Supporting docs in logical subdirectory ## Benefits ### For New Users - Clear getting started guide - Examples for everything - Troubleshooting in README - Links to detailed docs ### For Existing Users - Migration guide provided - Backward compatible - Clear upgrade path - Better troubleshooting ### For Maintainers - Organized structure - Consistent formatting - Easy to update - Professional presentation ## Breaking Changes None - This is pure documentation reorganization: - Old file paths still work (git tracks renames) - No code changes - Template additions only - README links updated ## Stats - README.md: ~500 lines of comprehensive documentation - RECYCLARR.md: ~300 lines of detailed guide - RECYCLARR_CONFIG_TEMPLATE.yml: Working configuration template - docs/ directory: 4 organized documentation files ## Related - Addresses recyclarr localhost issue - Improves repository professionalism - Makes project more accessible - Follows documentation best practices
14 KiB
Docker Compose Troubleshooting Guide
Common Issues and Solutions
1. Watchtower Cannot Update Jellyseerr
Issue: Watchtower fails to update hotio/jellyseerr with errors like "image not found" or "unauthorized".
Root Cause: The hotio/jellyseerr image on Docker Hub is unofficial/outdated. The official Jellyseerr image is under a different registry.
Solution:
The template has been updated to use the official image:
jellyseerr:
image: fallenbagel/jellyseerr:latest # ✅ Official image
Alternative Options:
-
Official Jellyseerr (Recommended)
image: fallenbagel/jellyseerr:latest -
Hotio GHCR Version
image: ghcr.io/hotio/jellyseerr:latest
Action Required:
- Stop the container:
docker-compose down jellyseerr - Update your compose file with the new image
- Pull new image:
docker pull fallenbagel/jellyseerr:latest - Start container:
docker-compose up -d jellyseerr
Synology-Specific Note: In Synology Container Manager, you may need to manually remove the old container and create a new one with the correct image if the name doesn't match.
2. Recyclarr Configuration Errors
Issue: Recyclarr logs show errors like:
└── X base_url must start with 'http' or 'https'
Root Causes:
- ❌ Using
localhostin Docker:base_url: http://localhost:8989won't work - ❌ Empty API keys:
api_key:with no value - ❌ Wrong config file location: Config not mounted properly
Solution:
Step 1: Fix base_url (Use Docker Service Names)
Wrong:
base_url: http://localhost:8989 # ❌ Won't work in Docker
Correct:
base_url: http://sonarr:8989 # ✅ Use service name from docker-compose
base_url: http://radarr:7878 # ✅ Use service name from docker-compose
Step 2: Get API Keys
For Sonarr:
- Open Sonarr WebUI (http://your-nas:8989)
- Go to: Settings → General → Security
- Copy the API Key
For Radarr:
- Open Radarr WebUI (http://your-nas:7878)
- Go to: Settings → General → Security
- Copy the API Key
Step 3: Update Configuration File
Location: {{DOCKERCONFDIR}}/recyclarr/recyclarr.yml
sonarr:
web-1080p-v4:
base_url: http://sonarr:8989
api_key: abc123def456ghi789jkl012mno345pq # Your actual API key
delete_old_custom_formats: true
replace_existing_custom_formats: true
include:
- template: sonarr-quality-definition-series
- template: sonarr-v4-quality-profile-web-1080p
- template: sonarr-v4-custom-formats-web-1080p
radarr:
uhd-bluray-web:
base_url: http://radarr:7878
api_key: xyz789abc456def123ghi890jkl567mno # Your actual API key
delete_old_custom_formats: true
replace_existing_custom_formats: true
include:
- template: radarr-quality-definition-movie
- template: radarr-quality-profile-uhd-bluray-web
- template: radarr-custom-formats-uhd-bluray-web
Step 4: Test Configuration
# Test Recyclarr config
docker exec -it recyclarr recyclarr config list
# Test sync (dry run)
docker exec -it recyclarr recyclarr sync --preview
# Actually sync
docker exec -it recyclarr recyclarr sync
Step 5: Fix Volume Mount (if needed)
Ensure your docker-compose has the correct volume mount:
recyclarr:
volumes:
- {{DOCKERCONFDIR}}/recyclarr:/config # Config file should be in this directory
Your config file should be at:
{{DOCKERCONFDIR}}/recyclarr/recyclarr.yml
Template Provided: A proper config template has been created at:
config-files/recyclarr/recyclarr.yml.template
3. Docker Image Source Reliability
✅ Recommended Image Sources
| Service | Recommended Image | Registry | Notes |
|---|---|---|---|
| Sonarr | ghcr.io/hotio/sonarr:latest |
GitHub | Hotio official GHCR |
| Radarr | ghcr.io/hotio/radarr:latest |
GitHub | Hotio official GHCR |
| Prowlarr | ghcr.io/hotio/prowlarr:latest |
GitHub | Hotio official GHCR |
| Bazarr | ghcr.io/hotio/bazarr:nightly |
GitHub | Hotio official GHCR |
| qBittorrent | ghcr.io/hotio/qbittorrent:latest |
GitHub | Hotio official GHCR |
| SABnzbd | ghcr.io/hotio/sabnzbd:latest |
GitHub | Hotio official GHCR |
| Jellyseerr | fallenbagel/jellyseerr:latest |
Docker Hub | Official Jellyseerr |
| Emby | lscr.io/linuxserver/emby:latest |
LinuxServer | LinuxServer.io official |
| PostgreSQL | postgres:17-alpine |
Docker Hub | Official PostgreSQL |
| Vault | hashicorp/vault:1.19.2 |
Docker Hub | Official HashiCorp |
| Gluetun | qmcgaw/gluetun:latest |
Docker Hub | Well-maintained |
| FlareSolverr | flaresolverr/flaresolverr:latest |
Docker Hub | Official |
| Watchtower | containrrr/watchtower:latest |
Docker Hub | Official |
| Recyclarr | ghcr.io/recyclarr/recyclarr:latest |
GitHub | Official |
| pgAdmin | dpage/pgadmin4:9.2.0 |
Docker Hub | Official |
⚠️ Images to Avoid
| Image | Issue | Use Instead |
|---|---|---|
hotio/jellyseerr |
Outdated/unofficial on Docker Hub | fallenbagel/jellyseerr:latest |
linuxserver/sonarr |
Use Hotio for better updates | ghcr.io/hotio/sonarr:latest |
Untagged images (:latest implied) |
Unpredictable updates | Always specify :latest explicitly |
4. Synology Container Manager Issues
Issue: Watchtower Permissions on Synology
Symptom: Watchtower cannot update containers, shows permission errors or does nothing.
Important: Watchtower requires write access to /var/run/docker.sock to function. While :ro (read-only) is more secure, it breaks Watchtower's ability to actually update containers.
Correct Configuration:
watchtower:
image: containrrr/watchtower:latest
volumes:
# Must be writable for Watchtower to stop/start containers
- /var/run/docker.sock:/var/run/docker.sock
environment:
# Security mitigation: Limit scope to prevent unintended updates
WATCHTOWER_SCOPE: "media-stack" # Only update containers with this scope label
# Or use label-based filtering
WATCHTOWER_LABEL_ENABLE: "com.centurylinklabs.watchtower.enable"
# Monitor only mode (notifications but no updates)
WATCHTOWER_MONITOR_ONLY: "false" # Set to "true" to disable updates
Security Best Practices:
-
Use Scoping - Limit which containers Watchtower can touch:
environment: WATCHTOWER_SCOPE: "media-stack"Then label containers:
services: radarr: labels: - "com.centurylinklabs.watchtower.scope=media-stack" -
Use Label Filtering - Only update containers with specific label:
environment: WATCHTOWER_LABEL_ENABLE: "com.centurylinklabs.watchtower.enable"Then on containers you want updated:
services: radarr: labels: - "com.centurylinklabs.watchtower.enable=true" -
Monitor-Only Mode - Get notifications without auto-updates:
environment: WATCHTOWER_MONITOR_ONLY: "true" WATCHTOWER_NOTIFICATION_URL: "slack://token" -
Disable Watchtower for Critical Services:
vault: labels: - "com.centurylinklabs.watchtower.enable=false" # Never auto-update -
Use Socket-Proxy (Recommended for Production):
For maximum security, use a socket-proxy to restrict Docker API access:
socket-proxy: volumes: - /var/run/docker.sock:/var/run/docker.sock:ro # Read-only! environment: CONTAINERS: 1 # Allow container management IMAGES: 1 # Allow image pulls EXEC: 0 # Deny command execution SECRETS: 0 # Deny secrets access watchtower: environment: DOCKER_HOST: tcp://socket-proxy:2375 # Use proxy # No docker.sock volume needed!See:
SOCKET_PROXY_GUIDE.mdfor complete implementation guide
Solution 2: Use Synology's Built-in Container Updates
Instead of Watchtower, use Synology Container Manager's built-in auto-update feature:
- Open Container Manager
- Select container
- Settings → Enable auto-restart
- Configure update schedule in Container Manager settings
Solution 3: Manual Updates via Synology
# SSH into Synology
cd /volume1/docker/compose-files
docker-compose pull
docker-compose up -d
Issue: Health Checks Not Working on Synology
Symptom: Services marked as "unhealthy" or health checks ignored.
Cause: Synology DSM 7.x has limited Docker Compose version support.
Solution:
-
Check Docker Compose version:
docker-compose --version -
If version < 1.27.0, upgrade or simplify health checks:
healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8989 || exit 1"] interval: 30s timeout: 10s retries: 3 # Remove start_period if not supported -
Alternatively, remove
condition: service_healthyand use simpledepends_on:depends_on: - prowlarr # Without condition
5. Service Won't Start - Dependency Issues
Issue: Service fails with "dependency failed to start" or "waiting for service health".
Diagnosis:
# Check service status
docker ps -a
# Check logs
docker logs <container_name>
# Check health
docker inspect <container_name> | grep -A 10 Health
Solutions:
-
Increase start_period:
healthcheck: start_period: 90s # Give service more time to initialize -
Check healthcheck command:
# Test healthcheck manually docker exec <container> curl -f http://localhost:8989/ping -
Temporary workaround - Remove health conditions:
depends_on: - prowlarr # Simple dependency without health check
6. Network Connectivity Issues
Issue: Services can't communicate (e.g., Radarr can't reach Prowlarr).
Diagnosis:
# Check networks
docker network ls
# Inspect network
docker network inspect vpn_network
# Test connectivity from inside container
docker exec radarr ping prowlarr
docker exec radarr curl http://prowlarr:9696/ping
Solutions:
-
Ensure all services on same network:
services: radarr: networks: - vpn-network # ✅ Same network prowlarr: networks: - vpn-network # ✅ Same network -
Recreate network:
docker-compose down docker network prune docker-compose up -d -
Check VPN container network mode:
qBittorrent uses
network_mode: service:gluetun, meaning:- It shares Gluetun's network
- Accessed via
http://<synology-ip>:8080, NOThttp://qbittorrent:8080 - Other services need to use Gluetun's IP or host IP
7. Resource Limit Issues
Issue: Container keeps restarting or shows OOM (Out of Memory) errors.
Diagnosis:
# Check resource usage
docker stats
# Check logs for OOM
docker logs <container> | grep -i "out of memory\|oom\|killed"
Solutions:
-
Increase memory limits:
deploy: resources: limits: memory: 2G # Increase if needed -
Monitor before setting limits:
# Run without limits first, monitor actual usage docker stats --no-stream -
Adjust based on workload:
- Emby transcoding: 4-8GB
- Download clients: 1-2GB
- Arr services: 512MB-1GB
- Utility services: 256-512MB
8. Configuration Persistence Issues
Issue: Container loses configuration after restart.
Diagnosis:
# Check volume mounts
docker inspect <container> | grep -A 20 Mounts
# Check host directory permissions
ls -la {{DOCKERCONFDIR}}/service-name
Solutions:
-
Verify volume paths:
volumes: - {{DOCKERCONFDIR}}/radarr:/config # ✅ Host:Container -
Check directory exists:
mkdir -p {{DOCKERCONFDIR}}/radarr chown -R {{PUID}}:{{PGID}} {{DOCKERCONFDIR}}/radarr -
Synology-specific permissions:
# For pgAdmin chown -R 5050:5050 {{DOCKERCONFDIR}}/pgadmin # For other services chown -R {{PUID}}:{{PGID}} {{DOCKERCONFDIR}}/service-name
Quick Fixes Checklist
Before Opening an Issue
- Check container logs:
docker logs <container> - Verify all environment variables are set in
.env - Confirm volume paths exist and have correct permissions
- Test health checks manually inside container
- Check network connectivity between services
- Verify image is pulled correctly:
docker images - Try recreating container:
docker-compose up -d --force-recreate <service> - Check Synology Container Manager for any specific errors
Common Commands
# View logs
docker logs -f <container>
# Restart service
docker-compose restart <service>
# Recreate service
docker-compose up -d --force-recreate <service>
# Full restart
docker-compose down && docker-compose up -d
# Check health
docker ps
docker inspect <container> | grep -A 10 Health
# Shell into container
docker exec -it <container> /bin/bash
# or
docker exec -it <container> /bin/sh
# View resource usage
docker stats
# Check networks
docker network ls
docker network inspect <network_name>
Getting Help
When reporting issues, include:
- Synology Model & DSM Version
- Docker & Docker Compose versions
- Complete error logs (
docker logs <container>) - Relevant compose file snippet
- Environment variables (redact sensitive values)
- Output of:
docker ps -a,docker stats,docker network ls
Last Updated: 2025-11-23