This document outlines suggested improvements and cleanup tasks for the nix-pihole repository to make it more maintainable, secure, and reusable.
-
Separate Personal Configuration from System Configuration
- Issue:
users.nixcontains personal user account and SSH keys - Solution: Create a generic
users.nixtemplate and move personal config topersonal/directory - Files to create:
modules/users.nix(generic user management)personal/users.nix(personal configuration)personal/secrets.nix(personal secrets - gitignored)
- Issue:
-
Create a Configuration Template System
- Create
template/directory with:template/users.nix.exampletemplate/secrets.nix.example
- Add instructions for copying and customizing templates
- Create
-
Split
configuration.nixinto Logical Modulesmodules/pihole.nix- Pi-hole specific configurationmodules/networking.nix- Network and firewall settingsmodules/base-system.nix- Basic system configurationmodules/hardware.nix- Hardware-specific settings
-
Make Network Interface Name Configurable
- Currently:
interface = "end0";in DNS settings (hardcoded for Orange Pi Zero 3) - Solution: Make interface name configurable to support different hardware platforms
- Impact: Better hardware compatibility and flexibility
- Currently:
-
Make Network Configuration Flexible
- Add options for ethernet vs WiFi-only setups
- Make WiFi network selection configurable
- Add option to disable WiFi if using ethernet only
-
Clean Up Commented Code Blocks
- Large commented DHCP configuration block (lines 67-86 in
configuration.nix) - Commented nginx configuration (lines 122-124)
- Commented DNS anchor configuration (lines 84-86)
- Decision: Either remove or move to examples/documentation
- Large commented DHCP configuration block (lines 67-86 in
-
Use Variables in systemd Service Paths
systemd.services.pihole-ftl-log-deleteris working but uses hardcoded paths- Solution: Replace hardcoded database directory path with variables
- Impact: Better maintainability and configuration flexibility
-
Fix Duplicate Nix Settings
- Lines 114-117 in
configuration.nixduplicate experimental-features - Consolidate into single configuration block
- Lines 114-117 in
-
Improve Package Management
- Many packages in
environment.systemPackagesmay not be necessary for a Pi-hole server - Separate into categories: essential, development, optional
- Consider making some packages optional via configuration flags
- Many packages in
-
Add Configuration Validation
- Add assertions to validate network interface exists
- Validate WiFi configuration completeness
- Check for required secrets before building
-
Add Inline Documentation
- Document why specific packages are needed
- Explain custom systemd services
- Add comments for non-obvious configuration choices
-
Create Configuration Examples
examples/ethernet-only.nixexamples/dhcp-enabled.nixexamples/custom-blocklists.nix
-
Add Build and Deployment Scripts
scripts/build-image.sh- Automate SD card image creationscripts/deploy.sh- Deploy configuration updates to running systemscripts/setup-secrets.sh- Help users set up secret management
-
Implement Proper Secrets Management
- Use
agenixorsops-nixfor encrypting secrets - Add secret rotation capabilities
- Document secret management workflow
- Use
-
Add Configuration Options
- Create a
options.nixfile defining configurable parameters - Allow enabling/disabling features via options
- Make the configuration more declarative and less hardcoded
- Create a
-
Add Monitoring and Alerting
- Integrate Prometheus metrics
- Add Grafana dashboard configuration
- Set up log aggregation
nix-pihole/
├── flake.nix
├── README.md
├── TODO.md
├── modules/
│ ├── pihole.nix
│ ├── networking.nix
│ ├── base-system.nix
│ ├── hardware/
│ │ ├── raspberry-pi-4.nix
│ │ └── filesystems.nix
│ └── users.nix
├── examples/
│ ├── ethernet-only.nix
│ └── custom-blocklists.nix
├── templates/
│ ├── personal-config.nix.example
│ └── secrets.nix.example
├── scripts/
│ ├── build-image.sh
│ ├── deploy.sh
│ └── setup-secrets.sh
└── personal/ # gitignored directory
├── users.nix
└── secrets.nix
- Phase 1: Security - Address hardcoded credentials
- Phase 2: Modularization - Split configuration into logical modules
- Phase 3: Documentation - Add examples and improve docs
- Phase 4: Enhancement - Add advanced features and monitoring
- 🔴 High Priority (Security/Critical)
- 🟡 Medium Priority (Maintenance/Quality)
- 🟢 Low Priority (Enhancement/Nice-to-have)