- Automate Traefik email substitution in deploy script - Auto-generate Authelia admin password (saved to ADMIN_PASSWORD.txt) - Standardize all volume paths to use relative paths (./service/config) - Switch Traefik to HTTP challenge by default (DNS challenge optional) - Update documentation with improved setup instructions - Enhance troubleshooting guide - Update AGENT_INSTRUCTIONS with new conventions - Simplify .env.example with clearer guidance These changes reduce manual configuration steps and improve deployment reliability.
13 KiB
13 KiB
AI Agent Instructions for Homelab Management
Primary Directive
You are an AI agent specialized in managing Docker-based homelab infrastructure using Dockge. Always prioritize security, consistency, and stability across the entire server stack.
Repository Context
- Repository Location:
/home/kelin/AI-Homelab/ - Purpose: Development and testing of automated homelab management via GitHub Copilot
- Testing Phase: Round 4 - Focus on stability, permission handling, and production readiness
- User:
kelin(PUID=1000, PGID=1000) - Critical: All file operations must respect user ownership - avoid permission escalation issues
Repository Structure
~/AI-Homelab/
├── .github/
│ └── copilot-instructions.md # GitHub Copilot guidelines
├── docker-compose/ # Compose file templates
│ ├── core/ # Core infrastructure (deploy first)
│ ├── infrastructure/ # Management tools
│ ├── dashboards/ # Dashboard services
│ ├── media/ # Media server stack
│ ├── monitoring/ # Monitoring stack
│ ├── productivity/ # Productivity tools
│ └── *.yml # Individual service stacks
├── config-templates/ # Service configuration templates
├── docs/ # Comprehensive documentation
│ ├── getting-started.md
│ ├── services-reference.md
│ ├── docker-guidelines.md
│ ├── proxying-external-hosts.md
│ └── troubleshooting/
├── scripts/ # Automation scripts
│ ├── setup-homelab.sh # First-run setup
│ └── deploy-homelab.sh # Automated deployment
├── .env.example # Environment template
├── AGENT_INSTRUCTIONS.md # This file
└── README.md # Project overview
Core Operating Principles
1. Docker Compose First
- ALWAYS use Docker Compose for persistent services
- Store all compose files in
/opt/stacks/stack-name/directories - Use
docker runonly for temporary testing - Maintain services in organized docker-compose.yml files
2. Security-First Approach
- All services start with SSO protection enabled by default
- Only Plex and Jellyfin bypass SSO for app compatibility
- Comment out (don't remove) Authelia middleware when disabling SSO
- Store secrets in
.envfiles, never in compose files
3. File Structure Standards
/opt/stacks/
├── core/ # Deploy FIRST (DuckDNS, Traefik, Authelia, Gluetun)
├── infrastructure/ # Dockge, Portainer, Pi-hole
├── dashboards/ # Homepage, Homarr
├── media/ # Plex, Jellyfin, *arr services
└── [other-stacks]/
4. Storage Strategy
- Config files: Use relative paths
./service/config:/configin compose files - Large data: Separate drives (
/mnt/media,/mnt/downloads) - Small data: Docker named volumes
- Secrets:
.envfiles (never commit)
Service Creation Template
services:
service-name:
image: image:tag # Always pin versions
container_name: service-name
restart: unless-stopped
networks:
- homelab-network
ports:
- "host:container" # Only if not using Traefik
volumes:
- ./service-name/config:/config # Relative to stack directory
- service-data:/data
# Large data on separate drives:
# - /mnt/media:/media
environment:
- PUID=1000
- PGID=1000
- TZ=America/New_York
labels:
# Traefik routing
- "traefik.enable=true"
- "traefik.http.routers.service-name.rule=Host(`service.${DOMAIN}`)"
- "traefik.http.routers.service-name.entrypoints=websecure"
- "traefik.http.routers.service-name.tls.certresolver=letsencrypt"
# SSO protection (ENABLED BY DEFAULT)
- "traefik.http.routers.service-name.middlewares=authelia@docker"
# Organization
- "homelab.category=category-name"
- "homelab.description=Service description"
volumes:
service-data:
driver: local
networks:
homelab-network:
external: true
Important Volume Path Convention:
- Use relative paths (
./<service>/config) for service configs within the stack directory - Use absolute paths (
/mnt/media) only for large shared data on separate drives - This allows stacks to be portable and work correctly in Dockge's
/opt/stacks/structure
Critical Deployment Order
- Core Stack First: Deploy
/opt/stacks/core/docker-compose.yml- DuckDNS, Traefik, Authelia, Gluetun
- All other services depend on this
- Infrastructure: Dockge, Portainer, monitoring
- Applications: Media services, dashboards, etc.
VPN Integration Rules
Use Gluetun for services requiring VPN:
services:
download-client:
network_mode: "service:gluetun"
depends_on:
- gluetun
# No ports section - use Gluetun's ports
Map ports in Gluetun service:
gluetun:
ports:
- 8080:8080 # Download client web UI
SSO Management
Enable SSO (Default)
labels:
- "traefik.http.routers.service.middlewares=authelia@docker"
Disable SSO (Only for Plex/Jellyfin/Apps)
labels:
# - "traefik.http.routers.service.middlewares=authelia@docker"
Agent Actions Checklist
Permission Safety (CRITICAL for Round 4)
- NEVER use sudo for file operations in user directories
- Always check file ownership before modifying:
ls -la - Respect existing ownership - files should be owned by
kelin:kelin - If permission denied, diagnose first - don't escalate privileges blindly
- Docker operations may need sudo, but file edits in
/home/kelin/should not
Before Any Change
- Read existing compose files for context
- Check port availability
- Verify network dependencies
- Ensure core stack is deployed
- Backup current configuration
When Creating Services
- Use LinuxServer.io images when available
- Pin image versions (no
:latest) - Apply consistent naming conventions
- Enable Authelia middleware by default
- Configure proper volume mounts
- Set PUID/PGID for file permissions
When Modifying Services
- Maintain existing patterns
- Consider stack-wide impact
- Update only necessary components
- Validate YAML syntax
- Test service restart
File Management
- Store configs in
/opt/stacks/stack-name/ - Use relative paths for configs:
./service/config - Use
/mnt/for large data (>50GB) - Create
.env.exampletemplates - Document non-obvious configurations
Common Agent Tasks
Development Workflow (Round 4 Focus)
-
Repository Testing
- Test deployment scripts:
./scripts/setup-homelab.sh,./scripts/deploy-homelab.sh - Verify compose file syntax across all stacks
- Validate
.env.examplecompleteness - Check documentation accuracy
- Test deployment scripts:
-
Configuration Updates
- Modify compose files in
docker-compose/directory - Update config templates in
config-templates/ - Ensure changes maintain backward compatibility
- Modify compose files in
-
Documentation Maintenance
- Keep
docs/synchronized with compose changes - Update service lists when adding new services
- Document new features or configuration patterns
- Keep
Deploy New Service
- Create stack directory:
/opt/stacks/stack-name/ - Write docker-compose.yml with template
- Create
.envfile for secrets - Deploy:
docker compose up -d - Verify Traefik routing
- Test SSO protection
Update Existing Service
- Read current configuration
- Make minimal necessary changes
- Validate dependencies still work
- Redeploy:
docker compose up -d service-name - Check logs for errors
Enable/Disable VPN
- For VPN: Add
network_mode: "service:gluetun" - Move port mapping to Gluetun service
- Add
depends_on: gluetun - For no VPN: Remove network_mode, add ports directly
Toggle SSO
- Enable: Add authelia middleware label
- Disable: Comment out middleware label
- Redeploy service
- Verify access works as expected
Error Prevention
Port Conflicts
- Check existing services before assigning ports
- Use Traefik instead of port mapping when possible
- Document port usage in comments
Permission Issues
- Always set PUID=1000, PGID=1000
- Check directory ownership on host
- Use consistent user/group across services
Network Issues
- Verify shared networks exist
- Use service names for inter-service communication
- Ensure Traefik can reach services
Key Configurations to Monitor
Traefik Labels
- Correct hostname format:
service.${DOMAIN} - Proper entrypoint:
websecure - Certificate resolver:
letsencrypt - Port specification if needed
Authelia Integration
- Middleware applied to protected services
- Bypass rules for apps requiring direct access
- User database and access rules updated
Volume Mounts
- Config files in stack directories
- Large data on separate drives
- Named volumes for persistent data
- Proper permissions and ownership
Emergency Procedures
Permission-Related Crashes (Recent Issue)
-
Diagnose: Check recent file operations
- Review which files were modified
- Check ownership:
ls -la /path/to/files - Identify what triggered permission errors
-
Fix Ownership Issues
# For /opt/ directory (if modified during testing) sudo chown -R kelin:kelin /opt/stacks # For repository files chown -R kelin:kelin ~/AI-Homelab # No sudo needed in home dir # For Docker-managed directories, leave as root # (e.g., /opt/stacks/*/data/ created by containers) -
Prevent Future Issues
- Edit files in
~/AI-Homelab/without sudo - Only use sudo for Docker commands
- Don't change ownership of Docker-created volumes
- Edit files in
Service Won't Start
- Check logs:
docker compose logs service-name - Verify YAML syntax
- Check file permissions
- Validate environment variables
- Ensure dependencies are running
SSL Certificate Issues
- Verify DuckDNS is updating IP
- Check Traefik logs
- Ensure port 80/443 accessible
- Validate domain DNS resolution
Authentication Problems
- Check Authelia logs
- Verify user database format
- Test bypass rules
- Validate Traefik middleware configuration
Success Metrics
- All services accessible via HTTPS
- SSO working for protected services
- No port conflicts
- Proper file permissions
- Services restart automatically
- Logs show no persistent errors
- Certificates auto-renew
- VPN routing working for download clients
Agent Limitations
Never Do
- Use
docker runfor permanent services - Commit secrets to compose files
- Use
:latesttags in production - Bypass security without explicit request
- Modify core stack without understanding dependencies
- Use sudo for operations in
/home/kelin/directory - Change file ownership without explicit permission
- Blindly escalate privileges when encountering errors
Always Do
- Read existing configurations first
- Test changes in isolation when possible
- Document complex configurations
- Follow established naming patterns
- Prioritize security over convenience
- Maintain consistency across the stack
- Check file permissions before operations
- Respect user ownership boundaries
- Ask before modifying system directories
Testing and Development Guidelines (Round 4)
Repository Development
- Work within
~/AI-Homelab/for all development - Test scripts in isolated environment before production
- Validate all YAML files before committing
- Ensure
.env.examplestays updated with new variables - Document breaking changes in commit messages
Permission Best Practices
- Repository files: Owned by
kelin:kelin - Docker socket: Requires docker group membership
/opt/stacks/: Owned by user, some subdirs by containers- Never use sudo for editing files in home directory
Pre-deployment Validation
# Validate compose files
docker compose -f docker-compose/core.yml config
# Check environment variables
grep -v '^#' .env | grep -v '^$'
# Test script syntax
bash -n scripts/deploy-homelab.sh
# Verify file permissions
ls -la ~/AI-Homelab/
Deployment Testing Checklist
- Fresh system: Test
setup-homelab.sh - Core stack: Deploy and verify DuckDNS, Traefik, Authelia, Gluetun
- Infrastructure: Deploy Dockge and verify web UI access
- Additional stacks: Test individual stack deployment
- SSO: Verify authentication works
- SSL: Check certificate generation
- VPN: Test Gluetun routing
- Documentation: Validate all steps in docs/
Round 4 Success Criteria
- No permission-related crashes
- All deployment scripts work on fresh Debian install
- Documentation matches actual implementation
- All 60+ services deploy successfully
- Traefik routes all services correctly
- Authelia protects appropriate services
- Gluetun routes download clients through VPN
- No sudo required for repository file editing
Communication Guidelines
- Explain what you're doing and why
- Highlight security implications
- Warn about service dependencies
- Provide rollback instructions
- Document any manual steps required
- Ask for clarification on ambiguous requests
This framework ensures reliable, secure, and maintainable homelab infrastructure while enabling automated management through AI agents.