This commit adds extensive documentation covering all aspects of homelab setup,
configuration, and troubleshooting.
## Documentation Structure
### Main Documentation
- **docs/README.md**: Documentation hub with table of contents
- **docs/getting-started.md**: Complete setup guide from scratch
- **docs/quick-reference.md**: Fast reference for common tasks and commands
### Configuration Guides (docs/guides/)
- **secrets-management.md**: Environment variables and secrets configuration
- How to generate secure secrets
- Service-specific configuration
- Automated secret generation scripts
- Security best practices
- Common mistakes to avoid
- **gpu-setup.md**: NVIDIA GTX 1070 GPU acceleration setup
- Specific to Proxmox 9 on Debian 13
- Complete passthrough configuration
- Jellyfin hardware transcoding setup
- Immich ML inference acceleration
- Performance tuning and benchmarks
- Troubleshooting GPU issues
### Troubleshooting (docs/troubleshooting/)
- **faq.md**: Frequently asked questions (60+ Q&A)
- General questions about the homelab
- Setup and configuration questions
- SSL/TLS and SSO questions
- Service-specific questions
- Security and backup questions
- Performance optimization
- **common-issues.md**: Common problems and solutions
- Service startup failures
- SSL certificate errors
- SSO authentication issues
- Access problems
- Performance issues
- Database errors
- Network issues
- GPU problems
### Services (docs/services/)
- **README.md**: Complete service overview
- All 20 services with descriptions
- Use cases for each service
- Resource requirements
- Deployment checklists
- Service dependencies
- Minimum viable setups
## Key Features
### Environment-Specific
All GPU documentation is specific to:
- **Platform**: Proxmox 9 (PVE)
- **OS**: Debian 13
- **GPU**: NVIDIA GTX 1070 (Pascal)
- Includes Proxmox-specific GPU passthrough
- VM guest setup on Debian 13
- NVIDIA Container Toolkit configuration
### Comprehensive Coverage
- 60+ FAQs answered
- 50+ common issues documented
- 100+ command examples
- Step-by-step procedures
- Troubleshooting decision trees
- Quick reference tables
### Practical Examples
- Actual command outputs
- Real-world scenarios
- Copy-paste ready commands
- Configuration file examples
- Debugging procedures
## Documentation Highlights
### Getting Started Guide
- Prerequisites checklist
- Docker installation
- Media directory setup
- DNS configuration
- Environment variable setup
- Service deployment order
- Initial service configuration
- Verification procedures
### Secrets Management
- Secret type identification
- Generation commands for each type
- Service-specific requirements
- Automated generation script
- Password manager integration
- Backup procedures
- Security best practices
- Common mistakes
### GPU Setup (Proxmox/Debian/GTX 1070)
- IOMMU enablement
- VFIO configuration
- PCI passthrough to VM
- NVIDIA driver installation on Debian 13
- Container toolkit setup
- Jellyfin NVENC configuration
- Immich CUDA acceleration
- Performance benchmarks
- NVENC stream limit unlock
- Monitoring and tuning
### Quick Reference
- All service URLs
- Common Docker Compose commands
- System check commands
- Secret generation commands
- Troubleshooting steps
- File locations
- Port reference
- Emergency procedures
### FAQ
Covers questions about:
- Hardware requirements
- Domain requirements
- Cost estimates
- Setup procedures
- Configuration details
- SSL certificates
- SSO authentication
- Service-specific issues
- Backup strategies
- Performance optimization
- Security considerations
### Common Issues
Solutions for:
- Container startup failures
- Environment variable errors
- Port conflicts
- Permission issues
- SSL certificate problems
- DNS issues
- SSO login failures
- Database connections
- Network connectivity
- GPU detection
- Resource constraints
### Services Overview
- Detailed description of all 20 services
- Use cases and features
- Required vs optional services
- Resource requirements by tier
- Service dependencies diagram
- Deployment checklists
- "When to use" guidance
## File Structure
```
docs/
├── README.md # Documentation hub
├── getting-started.md # Setup walkthrough
├── quick-reference.md # Command reference
├── guides/
│ ├── secrets-management.md # Secrets configuration
│ └── gpu-setup.md # GPU acceleration (GTX 1070)
├── troubleshooting/
│ ├── faq.md # 60+ FAQs
│ └── common-issues.md # Problem solving
└── services/
└── README.md # Service overview
```
## Benefits
### For New Users
- Clear setup path from zero to running services
- Explains "why" not just "how"
- Common pitfalls documented and avoided
- Example configurations provided
### For Experienced Users
- Quick reference for commands
- Troubleshooting decision trees
- Performance tuning guides
- Advanced configurations
### For Maintenance
- Update procedures
- Backup and restore
- Monitoring guidelines
- Security hardening
## Documentation Standards
- Clear, concise writing
- Code blocks with syntax highlighting
- Examples with expected output
- Warning and tip callouts
- Cross-references between docs
- Tested commands and procedures
## Next Steps
Users should:
1. Start with getting-started.md
2. Configure secrets using secrets-management.md
3. Enable GPU if available (gpu-setup.md)
4. Use quick-reference.md for daily operations
5. Refer to faq.md and common-issues.md when stuck
---
**This documentation makes the homelab accessible to users of all skill levels!**
14 KiB
Frequently Asked Questions (FAQ)
Common questions and answers about the homelab setup.
General Questions
Q: What is this homelab setup?
A: This is a GitOps-based infrastructure for self-hosting services using Docker Compose. It includes:
- 20+ pre-configured services (media, productivity, utilities)
- Automatic SSL/TLS with Let's Encrypt via Traefik
- Single Sign-On (SSO) with LLDAP and Tinyauth
- Automated backups with Backrest
- Service discovery dashboard with Homarr
Q: What are the minimum hardware requirements?
A:
- CPU: 2+ cores (4+ recommended)
- RAM: 8GB minimum (16GB+ recommended)
- Storage: 100GB for containers, additional space for media
- Network: Static IP recommended, ports 80 and 443 accessible
- GPU (Optional): NVIDIA GPU for hardware transcoding
Q: Do I need my own domain name?
A: Yes, you need at least one domain (two configured by default: fig.systems and edfig.dev). You can:
- Register a domain from any registrar
- Update all compose files to use your domain
- Configure wildcard DNS (
*.yourdomain.com)
Q: Can I run this on a Raspberry Pi?
A: Partially. ARM64 architecture is supported by most services, but:
- Performance will be limited
- No GPU acceleration available
- Some services may not have ARM images
- 8GB RAM minimum recommended (Pi 4 or Pi 5)
Q: How much does this cost to run?
A:
- Server: $0 (if using existing hardware) or $5-20/month (VPS)
- Domain: $10-15/year
- Backblaze B2: ~$0.60/month for 100GB photos
- Electricity: Varies by hardware and location
- Total: $15-30/year minimum
Setup Questions
Q: Why won't my services start?
A: Common causes:
- Environment variables not set: Check for
changeme_*in.envfiles - Ports already in use: Check if 80/443 are available
- Network not created: Run
docker network create homelab - DNS not configured: Services need valid DNS records
- Insufficient resources: Check RAM and disk space
Debug:
cd compose/path/to/service
docker compose logs
docker compose ps
Q: How do I know if everything is working?
A: Check these indicators:
- All containers running:
docker psshows all services - SSL certificates valid: Visit https://home.fig.systems (no cert errors)
- Dashboard accessible: Homarr shows all services
- SSO working: Can login to protected services
- No errors in logs:
docker compose logsshows no critical errors
Q: What order should I deploy services?
A: Follow this order:
- Core: Traefik → LLDAP → Tinyauth
- Configure: Create LLDAP users
- Media: Jellyfin → Immich → Jellyseerr → Sonarr → Radarr → Downloaders
- Utility: Homarr → Backrest → Everything else
Q: Do I need to configure all 20 services?
A: No! Deploy only what you need:
- Core (required): Traefik, LLDAP, Tinyauth
- Media (optional): Jellyfin, Immich, Sonarr, Radarr
- Utility (pick what you want): Homarr, Backrest, Linkwarden, Vikunja, etc.
Configuration Questions
Q: What secrets do I need to change?
A: Search for changeme_* in all .env files:
grep -r "changeme_" compose/
Critical secrets:
- LLDAP_LDAP_USER_PASS: Admin password for LLDAP
- LLDAP_JWT_SECRET: 64-character hex string
- SESSION_SECRET: 64-character hex string for Tinyauth
- DB_PASSWORD: Database passwords (Immich, Vikunja, Linkwarden)
- NEXTAUTH_SECRET: NextAuth secret for Linkwarden
- VIKUNJA_SERVICE_JWTSECRET: JWT secret for Vikunja
Q: How do I generate secure secrets?
A: Use these commands:
# 64-character hex (for JWT secrets, session secrets)
openssl rand -hex 32
# 32-character password (for databases)
openssl rand -base64 32 | tr -d /=+ | cut -c1-32
# 32-character hex (for API keys)
openssl rand -hex 16
See Secrets Management Guide for details.
Q: Can I change the domains from fig.systems to my own?
A: Yes! You need to:
- Find and replace in all
compose.yamlfiles:find compose -name "compose.yaml" -exec sed -i 's/fig\.systems/yourdomain.com/g' {} \; find compose -name "compose.yaml" -exec sed -i 's/edfig\.dev/yourotherdomain.com/g' {} \; - Update DNS records to point to your server
- Update
.envfiles with new URLs (e.g.,NEXTAUTH_URL,VIKUNJA_SERVICE_PUBLICURL)
Q: Do all passwords need to match?
A: No, but some must match:
- LLDAP_LDAP_USER_PASS must equal LDAP_BIND_PASSWORD (in tinyauth)
- VIKUNJA_DATABASE_PASSWORD must equal POSTGRES_PASSWORD (in vikunja)
- Linkwarden POSTGRES_PASSWORD is used in DATABASE_URL
All other passwords should be unique!
SSL/TLS Questions
Q: Why am I getting SSL certificate errors?
A: Common causes:
- DNS not configured: Ensure domains point to your server
- Ports not accessible: Let's Encrypt needs port 80 for HTTP challenge
- Rate limiting: Let's Encrypt has rate limits (5 certs per domain/week)
- First startup: Certs take a few minutes to generate
Debug:
docker logs traefik | grep -i error
docker logs traefik | grep -i certificate
Q: How long do SSL certificates last?
A: Let's Encrypt certificates:
- Valid for 90 days
- Traefik auto-renews at 30 days before expiration
- Renewals happen automatically in the background
Q: Can I use my own SSL certificates?
A: Yes, but it requires modifying Traefik configuration. The default Let's Encrypt setup is recommended.
SSO Questions
Q: What is SSO and do I need it?
A: SSO (Single Sign-On) lets you log in once and access all services:
- LLDAP: Stores users and passwords
- Tinyauth: Authenticates users before allowing service access
- Benefits: One login for all services, centralized user management
- Optional: Some services can work without SSO (have their own auth)
Q: Why can't I log into SSO-protected services?
A: Check:
- LLDAP is running:
docker ps | grep lldap - Tinyauth is running:
docker ps | grep tinyauth - User exists in LLDAP: Go to https://lldap.fig.systems and verify
- Passwords match: LDAP_BIND_PASSWORD = LLDAP_LDAP_USER_PASS
- User in correct group: Check user is in
lldap_admingroup
Debug:
cd compose/core/tinyauth
docker compose logs -f
Q: Can I disable SSO for a service?
A: Yes! Comment out the middleware line in compose.yaml:
# traefik.http.routers.servicename.middlewares: tinyauth
Then restart the service:
docker compose up -d
Q: How do I reset my LLDAP admin password?
A:
- Stop LLDAP:
cd compose/core/lldap && docker compose down - Update
LLDAP_LDAP_USER_PASSin.env - Remove the database:
rm -rf data/ - Restart:
docker compose up -d - Recreate users in LLDAP UI
⚠️ Warning: This deletes all users!
Service-Specific Questions
Q: Jellyfin shows "Playback Error" - what's wrong?
A: Common causes:
- Media file corrupt: Test file with VLC
- Permissions: Check file ownership (
ls -la /media/movies) - Codec not supported: Enable transcoding or use different file
- GPU not configured: If using GPU, verify NVIDIA Container Toolkit
Q: Immich won't upload photos - why?
A: Check:
- Database connected:
docker logs immich_postgres - Upload directory writable: Check permissions on
./upload - Disk space:
df -h - File size limits: Check browser console for errors
Q: Why isn't Homarr showing my services?
A: Homarr needs:
- Docker socket access: Volume mount
/var/run/docker.sock - Labels on services: Each service needs
homarr.namelabel - Same network: Homarr must be on
homelabnetwork - Time to detect: Refresh page or wait 30 seconds
Q: Backrest shows "Repository not initialized" - what do I do?
A:
- Go to https://backup.fig.systems
- Click "Add Repository"
- Configure Backblaze B2 settings
- Click "Initialize Repository"
See Backup Guide for detailed setup.
Q: Sonarr/Radarr can't find anything - help!
A:
- Add indexers: Settings → Indexers → Add indexer
- Configure download client: Settings → Download Clients → Add
- Set root folder: Series/Movies → Add Root Folder →
/media/tvor/media/movies - Test indexers: Settings → Indexers → Test
Q: qBittorrent shows "Unauthorized" - what's the password?
A: Default credentials:
- Username:
admin - Password:
adminadmin
⚠️ Change this immediately in qBittorrent settings!
Media Questions
Q: Where should I put my media files?
A: Use the /media directory structure:
- Movies:
/media/movies/Movie Name (Year)/movie.mkv - TV:
/media/tv/Show Name/Season 01/episode.mkv - Music:
/media/music/Artist/Album/song.flac - Photos:
/media/photos/(any structure) - Books:
/media/books/(any structure)
Q: How do I add more media storage?
A:
- Mount additional drive to
/media2(or any path) - Update compose files to include new volume:
volumes: - /media:/media:ro - /media2:/media2:ro # Add this - Restart service:
docker compose up -d - Add new library in service UI
Q: Can Sonarr/Radarr automatically download shows/movies?
A: Yes! That's their purpose:
- Add indexers (for searching)
- Add download client (SABnzbd or qBittorrent)
- Add a series/movie
- Enable monitoring
- Sonarr/Radarr will search, download, and organize automatically
Q: How do I enable hardware transcoding in Jellyfin?
A: See GPU Setup Guide for full instructions.
Quick steps:
- Install NVIDIA Container Toolkit on host
- Uncomment GPU sections in
jellyfin/compose.yaml - Restart Jellyfin
- Enable in Jellyfin: Dashboard → Playback → Hardware Acceleration → NVIDIA NVENC
Network Questions
Q: Can I access services only from my local network?
A: Yes, don't expose ports 80/443 to internet:
- Use firewall to block external access
- Use local DNS (Pi-hole, AdGuard Home)
- Point domains to local IP (192.168.x.x)
- Use self-signed certs or no HTTPS
Or use Traefik's IP allowlist middleware.
Q: Can I use a VPN with these services?
A: Yes, options:
- VPN on download clients: Add VPN container for qBittorrent/SABnzbd
- VPN to access homelab: Use WireGuard/Tailscale to access from anywhere
- VPN for entire server: All traffic goes through VPN (not recommended)
Q: Why can't I access services from outside my network?
A: Check:
- Port forwarding: Ports 80 and 443 forwarded to homelab server
- Firewall: Allow ports 80/443 through firewall
- DNS: Domains point to your public IP
- ISP: Some ISPs block ports 80/443 (use CloudFlare Tunnel)
Backup Questions
Q: What should I backup?
A: Priority order:
- High: Immich photos (
compose/media/frontend/immich/upload) - High: Configuration files (all
.envfiles, compose files) - Medium: Service data directories (
./config,./datain each service) - Low: Media files (usually have source elsewhere)
Q: How do I restore from backup?
A: See Backup Operations Guide.
Quick steps:
- Install fresh homelab setup
- Restore
.envfiles and configs - Use Backrest to restore data
- Restart services
Q: Does Backrest backup everything automatically?
A: Only what you configure:
- Default: Immich photos and homelab configs
- Add more paths in
backrest/compose.yamlvolumes - Create backup plans in Backrest UI for each path
Performance Questions
Q: Services are running slow - how do I optimize?
A:
- Check resources:
docker stats- are you out of RAM/CPU? - Reduce services: Stop unused services
- Use SSD: Move Docker to SSD storage
- Add RAM: Minimum 8GB, 16GB+ recommended
- Enable GPU: For Jellyfin and Immich
Q: Docker is using too much disk space - what do I do?
A:
# Check Docker disk usage
docker system df
# Clean up
docker system prune -a --volumes
# WARNING: This removes all stopped containers and unused volumes!
Better approach - clean specific services:
cd compose/path/to/service
docker compose down
docker volume rm $(docker volume ls -q | grep servicename)
docker compose up -d
Q: How do I limit RAM/CPU for a service?
A: Add resource limits to compose.yaml:
services:
servicename:
deploy:
resources:
limits:
cpus: '2.0'
memory: 4G
reservations:
memory: 2G
Update Questions
Q: How do I update a service?
A:
cd compose/path/to/service
docker compose pull
docker compose up -d
See Updates Guide for details.
Q: How often should I update?
A:
- Security updates: Weekly
- Feature updates: Monthly
- Major versions: When stable
Use Watchtower for automatic updates (optional).
Q: Will updating break my configuration?
A: Usually no, but:
- Always backup before major updates
- Check release notes for breaking changes
- Test in staging environment if critical
Security Questions
Q: Is this setup secure?
A: Reasonably secure with best practices:
- ✅ SSL/TLS encryption
- ✅ SSO authentication
- ✅ Secrets in environment files
- ⚠️ Some services exposed to internet
- ⚠️ Depends on keeping services updated
See Security Guide for hardening.
Q: Should I expose my homelab to the internet?
A: Depends on your risk tolerance:
- Yes: Convenient access from anywhere, Let's Encrypt works
- No: More secure, requires VPN for external access
- Hybrid: Expose only essential services, use VPN for sensitive ones
Q: What if someone gets my LLDAP password?
A: They can access all SSO-protected services. Mitigations:
- Use strong, unique passwords
- Enable 2FA where supported
- Review LLDAP access logs
- Use fail2ban to block brute force
- Consider VPN-only access
Troubleshooting
For specific error messages and debugging, see:
Still stuck? Check:
- Service logs:
docker compose logs - Traefik logs:
docker logs traefik - Container status:
docker ps -a - Network connectivity:
docker network inspect homelab