feat: Add templates for external configs
This commit is contained in:
committed by
Hunter Halloran
parent
f658a4a5cc
commit
11edaada84
288
USER_CONFIGURATION.md
Normal file
288
USER_CONFIGURATION.md
Normal file
@@ -0,0 +1,288 @@
|
||||
# External User Configuration
|
||||
|
||||
This document explains how to use external modules for user configuration in nixos-systems.
|
||||
|
||||
## Overview
|
||||
|
||||
Users can now maintain their home-manager configurations in separate Git repositories and reference them from `users.nix` using `builtins.fetchGit`, similar to how external system configurations work.
|
||||
|
||||
## Changes from Previous System
|
||||
|
||||
### Before (Flakes)
|
||||
```nix
|
||||
hdh20267 = {
|
||||
description = "Hunter Halloran";
|
||||
flakeUrl = "github:hdh20267/dotfiles";
|
||||
};
|
||||
```
|
||||
|
||||
### After (Modules with fetchGit)
|
||||
```nix
|
||||
hdh20267 = {
|
||||
description = "Hunter Halloran";
|
||||
home = builtins.fetchGit {
|
||||
url = "https://github.com/hdh20267/dotfiles";
|
||||
rev = "abc123...";
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
## Configuration Methods
|
||||
|
||||
### 1. External Repository (fetchGit)
|
||||
|
||||
```nix
|
||||
myuser = {
|
||||
description = "My Name";
|
||||
extraGroups = [ "wheel" "networkmanager" ];
|
||||
home = builtins.fetchGit {
|
||||
url = "https://github.com/username/dotfiles";
|
||||
rev = "commit-hash"; # For reproducibility
|
||||
ref = "main"; # Optional branch
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
### 2. Local Path (for testing)
|
||||
|
||||
```nix
|
||||
myuser = {
|
||||
description = "My Name";
|
||||
home = /home/username/dev/dotfiles;
|
||||
};
|
||||
```
|
||||
|
||||
### 3. Inline Configuration
|
||||
|
||||
```nix
|
||||
myuser = {
|
||||
description = "My Name";
|
||||
home = {
|
||||
home.packages = with pkgs; [ vim git ];
|
||||
programs.git = {
|
||||
enable = true;
|
||||
userName = "My Name";
|
||||
};
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
### 4. No External Config (legacy)
|
||||
|
||||
```nix
|
||||
myuser = {
|
||||
description = "My Name";
|
||||
homePackages = [ pkgs.vim ];
|
||||
# home = null; # Default
|
||||
};
|
||||
```
|
||||
|
||||
## External Repository Structure
|
||||
|
||||
When using `fetchGit` or a path, the repository must contain:
|
||||
|
||||
### Required: home.nix
|
||||
|
||||
```nix
|
||||
{ inputs, ... }:
|
||||
|
||||
{ config, lib, pkgs, osConfig, ... }:
|
||||
|
||||
{
|
||||
# Home-manager configuration
|
||||
home.packages = with pkgs; [ ... ];
|
||||
programs.git = { ... };
|
||||
}
|
||||
```
|
||||
|
||||
### Optional: nixos.nix
|
||||
|
||||
```nix
|
||||
{ inputs, ... }:
|
||||
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
# System-level configuration (if needed)
|
||||
users.users.myuser.extraGroups = [ "docker" ];
|
||||
}
|
||||
```
|
||||
|
||||
## Integration with System
|
||||
|
||||
External user modules:
|
||||
|
||||
1. **Receive inputs**: Same flake inputs as nixos-systems (nixpkgs, home-manager, etc.)
|
||||
2. **Access osConfig**: Can read system configuration via `osConfig` parameter
|
||||
3. **Merged with system settings**: Combined with inventory.nix user settings
|
||||
4. **System themes applied**: Zsh/nvim themes from system if enabled
|
||||
|
||||
### Module Loading Order
|
||||
|
||||
For home-manager configuration:
|
||||
1. External module (`home.nix`)
|
||||
2. System theme module (if `useZshTheme = true`)
|
||||
3. System nvim config (if `useNvimPlugins = true`)
|
||||
|
||||
For NixOS configuration:
|
||||
1. User's NixOS module (`nixos.nix`, if exists)
|
||||
2. All other system modules
|
||||
|
||||
## Available Parameters
|
||||
|
||||
In `home.nix`, you receive:
|
||||
- `inputs` - Flake inputs (nixpkgs, home-manager, etc.)
|
||||
- `config` - Home-manager configuration
|
||||
- `lib` - Nixpkgs library functions
|
||||
- `pkgs` - Package set
|
||||
- `osConfig` - OS-level configuration (readonly)
|
||||
|
||||
In `nixos.nix`, you receive:
|
||||
- `inputs` - Flake inputs
|
||||
- `config` - NixOS configuration
|
||||
- `lib` - Nixpkgs library functions
|
||||
- `pkgs` - Package set
|
||||
|
||||
## User Options in users.nix
|
||||
|
||||
When defining a user with external config:
|
||||
|
||||
```nix
|
||||
username = {
|
||||
# Required
|
||||
description = "Full Name";
|
||||
|
||||
# External configuration
|
||||
home = builtins.fetchGit { ... };
|
||||
|
||||
# System settings (still configured here)
|
||||
extraGroups = [ "wheel" ];
|
||||
hashedPassword = "$6$...";
|
||||
opensshKeys = [ "ssh-ed25519 ..." ];
|
||||
shell = pkgs.zsh;
|
||||
|
||||
# Control system integration
|
||||
useZshTheme = true; # Apply system zsh theme
|
||||
useNvimPlugins = true; # Apply system nvim config
|
||||
|
||||
# Legacy options (ignored if home is set)
|
||||
homePackages = [ ]; # Use home.packages in home.nix instead
|
||||
extraImports = [ ]; # Use imports in home.nix instead
|
||||
};
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
### Minimal Dotfiles Repository
|
||||
|
||||
```
|
||||
my-dotfiles/
|
||||
├── home.nix
|
||||
└── README.md
|
||||
```
|
||||
|
||||
**home.nix:**
|
||||
```nix
|
||||
{ inputs, ... }:
|
||||
{ config, lib, pkgs, ... }:
|
||||
{
|
||||
home.packages = with pkgs; [ vim git htop ];
|
||||
|
||||
programs.git = {
|
||||
enable = true;
|
||||
userName = "My Name";
|
||||
userEmail = "me@example.com";
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### With Dotfiles
|
||||
|
||||
```
|
||||
my-dotfiles/
|
||||
├── home.nix
|
||||
├── nixos.nix
|
||||
├── dotfiles/
|
||||
│ ├── bashrc
|
||||
│ └── vimrc
|
||||
└── README.md
|
||||
```
|
||||
|
||||
**home.nix:**
|
||||
```nix
|
||||
{ inputs, ... }:
|
||||
{ config, lib, pkgs, ... }:
|
||||
{
|
||||
home.file.".bashrc".source = ./dotfiles/bashrc;
|
||||
home.file.".vimrc".source = ./dotfiles/vimrc;
|
||||
|
||||
programs.git = {
|
||||
enable = true;
|
||||
userName = "My Name";
|
||||
userEmail = "me@example.com";
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### With System Configuration
|
||||
|
||||
**nixos.nix:**
|
||||
```nix
|
||||
{ inputs, ... }:
|
||||
{ config, lib, pkgs, ... }:
|
||||
{
|
||||
# Add user to docker group
|
||||
users.users.myusername.extraGroups = [ "docker" ];
|
||||
|
||||
# Install system-level packages
|
||||
environment.systemPackages = [ pkgs.docker ];
|
||||
}
|
||||
```
|
||||
|
||||
## Migration Guide
|
||||
|
||||
### From flakeUrl to home
|
||||
|
||||
1. **Update users.nix:**
|
||||
```diff
|
||||
- flakeUrl = "github:user/dotfiles";
|
||||
+ home = builtins.fetchGit {
|
||||
+ url = "https://github.com/user/dotfiles";
|
||||
+ rev = "latest-commit-hash";
|
||||
+ };
|
||||
```
|
||||
|
||||
2. **Update your dotfiles repository:**
|
||||
- Rename or ensure you have `home.nix` (not `flake.nix`)
|
||||
- Change module signature from flake to simple module:
|
||||
```diff
|
||||
- { inputs, outputs, ... }:
|
||||
+ { inputs, ... }:
|
||||
{ config, lib, pkgs, ... }:
|
||||
```
|
||||
|
||||
3. **Optional: Add nixos.nix** for system-level config
|
||||
|
||||
4. **Test locally first:**
|
||||
```nix
|
||||
home = /path/to/local/dotfiles;
|
||||
```
|
||||
|
||||
5. **Deploy:**
|
||||
```bash
|
||||
nix flake check
|
||||
./deploy hostname
|
||||
```
|
||||
|
||||
## Benefits
|
||||
|
||||
- **No Flakes Required**: Simpler for users unfamiliar with flakes
|
||||
- **Explicit Versioning**: Pin to specific commits with `rev`
|
||||
- **Faster Evaluation**: No flake evaluation overhead
|
||||
- **Local Testing**: Easy to test with local paths
|
||||
- **Flexibility**: Supports Git, paths, or inline configs
|
||||
- **Reproducibility**: Commit hashes ensure exact versions
|
||||
|
||||
## Templates
|
||||
|
||||
See `/home/engr-ugaif/user-config-template/` for templates and detailed examples.
|
||||
Reference in New Issue
Block a user