* fix: treat empty environment variables as unset to fix provider selection When deploying via Docker/Unraid templates, all environment variables are created even when left blank (e.g. LDR_LLM_ANTHROPIC_API_KEY=""). The check_env_setting() function previously treated these empty strings as valid overrides, which caused provider settings to be blanked out and prevented proper provider selection on fresh installs. Empty env vars are now treated as unset, allowing database defaults to take effect normally. Fixes #3339 * fix(tests): update test to match empty env var behavior Update test_env_override_empty_string to assert that empty environment variables are treated as unset (returning DB value) rather than overriding with empty string. This aligns with the fix for #3339. * docs: add ecosystem context for empty env var handling decision Document that treating empty environment variables as unset is standard practice across major projects (botocore, viper, Turborepo, Go stdlib, Docker Compose) with references to the PR discussion. * feat: add warning log for empty env vars, fix references, add tests and docs - Log warning when empty env vars are detected (helps users diagnose Unraid/Docker template issues) - Replace misleading viper/Docker Compose references with CPython official docs and Pallets/Click PR #2223 - Add unit tests: empty string returns None, warning is logged, provider/model/multiple keys handled - Add integration tests: empty string with no DB value, checkbox, number settings - Document empty env var behavior in unraid.md, docker-compose-guide.md, and env_configuration.md * docs: recommend DISABLED instead of Web UI for blocking settings Users can set env vars to a non-empty invalid value like "DISABLED" to explicitly block a key, which is simpler than navigating the UI.
14 KiB
Local Deep Research on Unraid
This guide covers deploying Local Deep Research (LDR) on Unraid servers.
📋 Prerequisites
- Unraid 6.9 or higher
- Docker enabled in Unraid settings (default)
- Minimum 20GB storage (more if using local LLMs)
- Community Applications plugin installed (recommended)
- Optional: NVIDIA GPU for local LLM acceleration
🚀 Installation Methods
Method 1: Using Unraid Template (Recommended)
This is the easiest method for Unraid users.
Step 1: Add Template Repository
- Navigate to Docker tab in Unraid WebUI
- Click on Docker Repositories (at the bottom)
- Add this URL to Template repositories:
https://github.com/LearningCircuit/local-deep-research - Click Save
Step 2: Install Local Deep Research
- Go back to Docker tab
- Click Add Container
- In the Template dropdown, select LocalDeepResearch
- Review the configuration (see Configuration section below)
- Click Apply
Step 3: (Optional) Install Companion Containers
For local LLM and search capabilities, you'll also need:
Install Ollama (for local LLM):
- Add Container → Search "ollama" in Community Applications
- Use
/mnt/user/appdata/local-deep-research/ollamafor config path - Optional: For container communication, create custom network first:
Then add to Extra Parameters:
docker network create ldr-network--network=ldr-network - Apply
Install SearXNG (for local search):
- Add Container → Search "searxng" in Community Applications
- Use
/mnt/user/appdata/local-deep-research/searxngfor config path - Optional: If using custom network from above, add to Extra Parameters:
--network=ldr-network - Apply
Method 2: Docker Compose Manager Plugin
If you prefer docker-compose for multi-container setups:
Step 1: Install Docker Compose Manager
- Go to Apps tab
- Search for "Docker Compose Manager"
- Click Install
Step 2: Create Stack from Repository
- Navigate to Docker tab, scroll to Compose section
- Click Add New Stack
- Name it
local-deep-research - Set Repository URL:
https://github.com/LearningCircuit/local-deep-research.git - Set Compose File:
docker-compose.yml:docker-compose.unraid.yml - Branch:
main - Click Save and Compose Up
That's it! The stack will automatically use Unraid-appropriate paths. No manual configuration needed.
For GPU Support: Change Compose File to:
docker-compose.yml:docker-compose.unraid.yml:docker-compose.gpu.override.yml
For Document Collections: After initial setup, edit docker-compose.unraid.yml in the stack to uncomment your document paths (see Using Local Documents).
Important Note: Containers installed with Docker Compose Manager have limited GUI integration. Updates must be done via the "Update Stack" button in the Compose section, not through the regular Docker UI.
Method 3: Manual Docker Template
For advanced users who want to customize the template:
-
Download the template:
wget -O /boot/config/plugins/dockerMan/templates-user/local-deep-research.xml \ https://raw.githubusercontent.com/LearningCircuit/local-deep-research/main/unraid-templates/local-deep-research.xml -
Go to Docker tab → Add Container
-
Select LocalDeepResearch from template dropdown
-
Configure and Apply
⚙️ Configuration
Volume Mappings
All volumes should be under /mnt/user/appdata/local-deep-research/ for best practices:
| Container Path | Unraid Path (Recommended) | Purpose | Required |
|---|---|---|---|
/data |
/mnt/user/appdata/local-deep-research/data |
User databases, research outputs, cache, logs | Yes |
/scripts |
/mnt/user/appdata/local-deep-research/scripts |
Startup scripts (for Ollama integration) | Yes |
/root/.ollama (ollama) |
/mnt/user/appdata/local-deep-research/ollama |
Downloaded LLM models (5-15GB each) | If using Ollama |
/etc/searxng (searxng) |
/mnt/user/appdata/local-deep-research/searxng |
SearXNG configuration | If using SearXNG |
Performance Tip: If your appdata share is set to "cache-only", you can use /mnt/cache/appdata/local-deep-research/ instead of /mnt/user/appdata/local-deep-research/ for better performance (bypasses FUSE overhead).
Port Configuration
Default Port: 5000
If port 5000 is already in use on your Unraid server:
- In the template, change the Host Port (left side):
5050:5000 - Do NOT change the Container Port (right side) or
LDR_WEB_PORTvariable - Access WebUI at:
http://[unraid-ip]:5050
Environment Variables
Required Variables (DO NOT CHANGE)
These are pre-configured in the template and must not be modified:
| Variable | Value | Purpose |
|---|---|---|
LDR_WEB_HOST |
0.0.0.0 |
Binds to all interfaces for Docker networking |
LDR_WEB_PORT |
5000 |
Internal container port (change host port instead) |
LDR_DATA_DIR |
/data |
Internal data directory path |
Service Connection Variables
Configure these based on your setup:
| Variable | Default | Description |
|---|---|---|
LDR_LLM_OLLAMA_URL |
http://ollama:11434 |
Use this if Ollama is on ldr-networkUse http://[IP]:11434 for external Ollama |
LDR_SEARCH_ENGINE_WEB_SEARXNG_DEFAULT_PARAMS_INSTANCE_URL |
http://searxng:8080 |
Use this if SearXNG is on ldr-networkConfigure external search in WebUI otherwise |
Optional LLM Configuration
Leave these EMPTY unless you want to LOCK the configuration (prevents changes via WebUI):
| Variable | Purpose |
|---|---|
LDR_LLM_PROVIDER |
Force LLM provider (ollama, openai, anthropic, google) |
LDR_LLM_MODEL |
Force specific model name |
LDR_LLM_OPENAI_API_KEY |
Lock OpenAI API key |
LDR_LLM_ANTHROPIC_API_KEY |
Lock Anthropic API key |
LDR_LLM_GOOGLE_API_KEY |
Lock Google API key |
Important: Unraid templates create all environment variables even when fields are left blank. Empty values (
"") are treated as not set — they will not override or lock anything. Only non-empty values act as overrides. This means leaving a field blank in the Unraid template is safe and equivalent to not having the variable at all.Security note: Setting an API key variable to an empty string does not block or clear it. If a key is already stored in the database, it will still be used even when the env var is empty. To explicitly block a key, set it to any non-empty invalid value (e.g.,
DISABLED).
Recommendation: Configure these via the WebUI Settings page instead of environment variables for easier management.
Network Configuration
Recommended: Bridge Mode with Custom Network
For multi-container setup (LDR + Ollama + SearXNG):
- All containers should be on the same network:
ldr-network - Add
--network=ldr-networkto Extra Parameters for each container - Containers can communicate using service names (e.g.,
http://ollama:11434)
Alternative: Individual Containers
If running LDR alone with external services:
- Use bridge network (default)
- Point to external services by IP:
http://192.168.1.100:11434
🎮 Using Local Documents
To search your local documents, use the Collections system in the Web UI:
- Open the LDR Web UI and navigate to the Collections page
- Create a new collection (e.g., "Research Papers", "Project Docs")
- Upload documents directly through the browser — no volume mounts needed
- Select your collection as a search engine, or use "Search All Collections" to search across everything
🎯 GPU Acceleration (NVIDIA)
To use NVIDIA GPU with Ollama for faster local LLM inference:
Step 1: Install NVIDIA Driver Plugin
- Go to Apps tab
- Search for "Nvidia-Driver"
- Install the plugin
- Select appropriate driver version (start with latest, go older if issues occur)
- Reboot Unraid
Step 2: Configure Docker for NVIDIA Runtime
Edit /etc/docker/daemon.json:
nano /etc/docker/daemon.json
Add this configuration:
{
"registry-mirrors": [],
"insecure-registries": [],
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
Restart Docker:
/etc/rc.d/rc.docker restart
Step 3: Enable GPU in Ollama Container
For Template Installation:
- Edit Ollama container
- In Extra Parameters, add:
--runtime=nvidia - Add environment variables:
NVIDIA_DRIVER_CAPABILITIES=allNVIDIA_VISIBLE_DEVICES=all
- Apply
For Docker Compose: Uncomment the GPU sections in the compose file shown above.
Verify GPU is Working
docker exec -it ollama_service nvidia-smi
You should see your GPU listed.
💾 Backup and Restore
Using Unraid's Appdata Backup Plugin
- Install "CA Appdata Backup / Restore" from Community Applications
- Add to backup paths:
/mnt/user/appdata/local-deep-research/ - Schedule regular backups
Manual Backup
# Backup data
tar -czf ldr_backup_$(date +%Y%m%d).tar.gz \
/mnt/user/appdata/local-deep-research/data
# Restore data
tar -xzf ldr_backup_20250120.tar.gz -C /
What to Backup:
- Critical:
/mnt/user/appdata/local-deep-research/data(user databases, research outputs) - Optional:
/mnt/user/appdata/local-deep-research/ollama(models can be re-downloaded) - Optional:
/mnt/user/appdata/local-deep-research/searxng(minimal config)
🔍 Troubleshooting
Settings Don't Persist
Symptom: Settings reset after container restart
Solution:
- Check volume mapping is correct:
/mnt/user/appdata/local-deep-research/data:/data - Ensure
LDR_DATA_DIR=/datais set - Verify
/mnt/user/appdata/local-deep-research/dataexists and has write permissions - Check Unraid logs: Tools → System Log
Container Won't Start
Check dependencies:
- If using
ldr-network, ensure all containers are on the same network - Verify Ollama and SearXNG are running if referenced
- Check logs:
docker logs local-deep-research
Common issues:
- Port 5000 conflict → Change host port mapping
- Network not found → Create network manually:
docker network create ldr-network - Volume permission errors → Ensure paths exist and are writable
Can't Access WebUI
Verify network settings:
- Check container is running: Docker tab
- Verify port mapping: Should show
5000:5000or your custom mapping - Access via:
http://[unraid-ip]:5000 - Check Unraid firewall settings (if enabled)
Test container networking:
docker exec -it local-deep-research wget -O- http://localhost:5000
GPU Not Detected in Ollama
Verify driver installation:
nvidia-smi
Check container runtime:
docker inspect ollama_service | grep -i runtime
Should show "Runtime": "nvidia"
Common issues:
- Wrong driver version → Try older driver in Nvidia-Driver plugin
- Runtime not configured → Check
/etc/docker/daemon.json - GPU already in use by VM → Stop VMs using GPU passthrough
Models Download Slowly or Fail
For Ollama:
- Check disk space: Models are 5-15GB each
- Download manually:
docker exec -it ollama_service ollama pull gemma3:12b - Check download progress:
docker logs -f ollama_service
"Update Ready" Always Shows
This is normal for Docker Compose containers.
Unraid's native Docker UI doesn't integrate with Docker Compose Manager:
- Ignore the "Update Ready" label
- Update via Docker tab → Compose section → Update Stack
🔄 Updates
Manual Updates
For Template Installation:
- Go to Docker tab
- Click container's icon → Force Update
- Container will restart automatically
For Docker Compose Installation:
- Go to Docker tab → Compose section
- Find your
local-deep-researchstack - Click Compose Pull → Compose Up
Automated Updates (Recommended)
Using Watchtower:
Watchtower automatically updates your containers when new images are available.
- Install from Community Applications: Search "Watchtower"
- Configure to monitor your containers
- Set update schedule (default: daily at midnight)
Watchtower will automatically pull new images and restart containers when updates are available.
Alternative: Unraid's built-in Docker Auto Update plugin (if enabled in Settings)
🌐 Advanced Configuration
Reverse Proxy (Nginx Proxy Manager)
To access LDR via custom domain on Unraid:
- Install "Nginx Proxy Manager" from Community Applications
- Add Proxy Host:
- Domain Names:
ldr.yourdomain.com - Forward Hostname/IP:
local-deep-research(or IP) - Forward Port:
5000 - Scheme:
http
- Domain Names:
- Enable SSL if desired
External LLM and Search Configuration
For configuring external LLM providers or custom search engines, see the main configuration documentation:
All WebUI settings work identically on Unraid as on other platforms.
📚 Additional Resources
- Main Documentation: https://github.com/LearningCircuit/local-deep-research
- Configuration Reference: CONFIGURATION.md
- API Documentation: docs/api-quickstart.md
- FAQ: docs/faq.md
- Discord Support: https://discord.gg/ttcqQeFcJ3
- Unraid Forums: Support Thread (to be created)
❓ Getting Help
-
Check logs first:
docker logs local-deep-research docker logs ollama_service docker logs searxng -
Search existing issues: GitHub Issues
-
Ask for help:
- Discord Server
- GitHub Discussions
- Unraid Forums (support thread coming soon)
-
When reporting issues, include:
- Unraid version
- Container version (from Docker tab)
- Relevant logs
- Configuration (without API keys!)