|
|
||
|---|---|---|
| docs | ||
| hosts | ||
| lib | ||
| modules | ||
| .zshrc | ||
| AGENTS.md | ||
| flake.lock | ||
| flake.nix | ||
| keys.nix | ||
| rebuild.nu | ||
| secrets.nix | ||
thegeneralist's Nix Configuration
A comprehensive Nix flake configuration supporting both NixOS (Linux) and nix-darwin (macOS) systems with home-manager integration.
Overview
This configuration provides a unified way to manage multiple machines across different platforms:
- NixOS hosts:
thegeneralist,thegeneralist-central - Darwin hosts:
thegeneralist-mbp,thegeneralist-central-mbp
Quick Start
Prerequisites
- Nix package manager with flakes enabled
- Git for cloning the repository
Installation
-
Clone the repository:
git clone https://github.com/thegeneralist01/config.git ~/config cd ~/config -
For NixOS systems:
sudo nixos-rebuild switch --flake .#<hostname> -
For Darwin systems:
darwin-rebuild switch --flake .#<hostname>
Development Environment
Enter the development shell for configuration management:
nix develop
This provides:
nil- Nix language servernixpkgs-fmt- Nix formatteragenix- Secret management
Architecture
Directory Structure
├── docs/ # Documentation
├── flake.nix # Main flake configuration
├── flake.lock # Locked dependency versions
├── hosts/ # Host-specific configurations
│ ├── default.nix # Host discovery and categorization
│ └── <hostname>/ # Individual host configurations
├── lib/ # Custom library functions
│ ├── default.nix # Library entry point
│ ├── option.nix # Option utilities
│ └── system.nix # System building functions
├── modules/ # Reusable system modules
│ ├── common/ # Cross-platform modules
│ ├── darwin/ # macOS-specific modules
│ └── linux/ # Linux-specific modules
├── keys.nix # Age public keys for secrets
└── secrets.nix # Encrypted secrets
Key Components
Flake Inputs
- nixpkgs: Main package repository (nixos-unstable)
- home-manager: Dotfiles and user environment management
- nix-darwin: macOS system configuration
- agenix: Age-based secret management
- ghostty: Modern terminal emulator
- fenix: Rust toolchain provider
Library Functions
mkSystem: Core system builder for both Linux and DarwinmkOption: Custom option utilities- Host auto-discovery and categorization
Host Configuration
Adding a New Host
-
Create a new directory under
hosts/:mkdir hosts/new-hostname -
Create the host's
default.nix:lib: inputs: self: lib.mkSystem "linux" ./configuration.nix # or for macOS: lib: inputs: self: lib.mkSystem "darwin" ./configuration.nix -
Create
configuration.nixwith your host-specific settings:{ config, pkgs, ... }: { # Host-specific configuration here } -
Rebuild your flake:
nix flake lock # Update lock file if needed nixos-rebuild switch --flake .#new-hostname
Host Categorization
Hosts are automatically categorized based on naming conventions:
- Names ending with
mbpor containingcentral-mbp→ Darwin - All others → NixOS
Module System
Common Modules
Located in modules/common/, these are loaded on all systems:
nix.nix- Nix configuration, caches, and distributed buildshome-manager.nix- User environment managementpackages.nix- Common packagesgit.nix,neovim.nix,zsh.nix- Development toolsagenix.nix- Secret management
Platform-Specific Modules
modules/darwin/- macOS-specific (SSH, Karabiner, packages)modules/linux/- Linux-specific (boot, networking, X11, NVIDIA)
Creating Custom Modules
-
Add your module to the appropriate directory:
# modules/common/mymodule.nix { config, pkgs, ... }: { # Module configuration } -
The module is automatically discovered and loaded
Secret Management
Uses agenix for encrypted secrets management:
- Add recipient public keys to
keys.nix - Define secrets in
secrets.nix - Edit secrets:
agenix -e secret-name.age - Reference in configuration:
config.age.secrets.secret-name.path
Distributed Builds
The configuration includes distributed build support:
thegeneralist-centralserves as the build machine- Other hosts can offload builds via SSH
- Shared binary caches for faster builds
Binary Caches
Configured caches for improved build performance:
cache.thegeneralist01.com- Personal cachecache.garnix.io- Community cachecache.nixos.org- Official cache
Development Workflow
Updating Dependencies
nix flake update
Formatting Code
nixpkgs-fmt **/*.nix
Checking Configuration
nix flake check
Cleaning Up
# Via nh (configured in home-manager)
nh clean all --keep 3 --keep-since 4d
# Manual cleanup
nix-collect-garbage -d
Common Tasks
Installing Packages System-wide
Add to the appropriate modules/*/packages.nix file.
Installing User Packages
Modify the home-manager configuration in your host's configuration.nix.
Updating a Single Host
nixos-rebuild switch --flake .#hostname
# or
darwin-rebuild switch --flake .#hostname
Rolling Back Changes
nixos-rebuild switch --rollback
# or
darwin-rebuild switch --rollback
Troubleshooting
Build Failures
- Check flake lock compatibility:
nix flake update - Clear build cache:
nix-collect-garbage -d - Verify module syntax:
nix flake check
Secret Access Issues
- Verify keys are properly configured in
keys.nix - Re-encrypt secrets:
agenix -r - Check file permissions on age keys
Performance Issues
- Enable distributed builds to
thegeneralist-central - Verify binary cache access
- Use
nhfor optimized rebuilds
Contributing
- Follow existing code style and organization
- Test changes on a single host before applying broadly
- Update documentation for significant changes
- Use meaningful commit messages