Readme updates

This commit is contained in:
2025-01-08 00:38:00 -05:00
parent 5280c4a21a
commit 000e285d28

303
README.md
View File

@@ -6,14 +6,70 @@ This repository contains a multi-host, multi-user Darwin system configuration us
The flake configuration is designed to support multiple hosts and users with specific configurations for each. It uses let-bindings and strict commas for better readability and maintainability.
## Structure
These variables can then be used throughout the flake configuration to customize settings for each host and user.
- **Host Variables**: Define host-specific settings such as hostname, architecture, and home directory.
- **User Variables**: Define user-specific settings such as username, home directory, and shell.
- **Base Darwin Config Function**: A reusable function to set up base configurations for each host.
- **Host Configurations**: Specific configurations for each host, including `nix-darwin` and `home-manager` modules.
## License
## Usage
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
## Table of Contents
- [Overview](#overview)
- [Requirements](#requirements)
- [Modules](#modules)
- [How to Use](#how-to-use)
- [Building and Switching](#building-and-switching)
- [Common Commands](#common-commands)
- [Troubleshooting](#troubleshooting)
- [Dirty Git Tree](#dirty-git-tree)
- [Path Does Not Exist](#path-does-not-exist)
- [References](#references)
## Overview
- **nix-darwin**: Brings the power of Nix on macOS for system-wide configurations.
- **Home Manager**: Manages user-level configuration (dotfiles, shells, packages) using Nix.
- **nix-homebrew**: Allows declarative management of Homebrew (including taps, casks, etc.) via Nix.
By splitting the configuration into multiple files under `./modules/`, each file focuses on a specific area (e.g., system packages, services, dotfiles, etc.).
## Requirements
- **Nix**: You need Nix installed.
- **nix-darwin**: The Darwin modules rely on nix-darwin.
- **Git**: This is a Flake-based workflow, so your configuration should be in a Git repository.
After installing Nix, you can install nix-darwin (one recommended approach is from the official Nix-Darwin docs).
## Modules
- **flake.nix**: The top-level file defining all inputs (nixpkgs, nix-darwin, home-manager, nix-homebrew) and outputs (your nix-darwin configuration). Imports each module (e.g., `./modules/darwin/homebrew.nix`) into `darwinConfigurations.<hostname>.modules`.
- **modules/darwin/apps/**:
- `homebrew.nix`: Holds Homebrew-related configurations (brew packages, casks, etc.).
- `nixpackages.nix`: Holds your `environment.systemPackages`.
- `services.nix`: Configures system services (e.g., Tailscale, nix-daemon, security/pam).
- `default.nix`: Aggregates all .nix files in the directory for easier reference by the flake.
- **modules/darwin/security/**:
- `default.nix`: Consolidated configurations for security related settings.
- **modules/darwin/system/**:
- `appearance.nix`: Appearance related settings (e.g., dock, interface, login window settings, etc ).
- `finder.nix`: Finder related customizations.
- `system.nix`: System configuration (e.g., trackpad, keyboard mapping, screenshot default location, etc...).
- `default.nix`: Aggregates all .nix files in directory for easier reference by the flake
- **modules/home/**:
- `<username>/dotfiles.nix`: Holds user-level dotfiles managed by Home Manager (e.g., `~/.gitconfig`, `~/.ssh/config`).
- **rebuild.sh**: A convenience script that typically runs something like:
```sh
#!/usr/bin/env bash
darwin-rebuild switch --flake .#<hostname>
```
## How to Use
In the `flake.nix` file, you can define host-specific and user-specific variables using let-bindings. Examples shown in the `flake.nix` file.
To add a new host or user, update the `hostVars` and `userVars` sections in the `flake.nix` file with the new configurations. Follow the existing structure to ensure consistency.
Execution:
1. **Clone the repository**:
```sh
@@ -40,233 +96,6 @@ The flake configuration is designed to support multiple hosts and users with spe
Replace `<hostname>` with the actual hostname defined in the `flake.nix` file (e.g., `swaphb-mba`).
## Adding New Hosts or Users
To add a new host or user, update the `hostVars` and `userVars` sections in the `flake.nix` file with the new configurations. Follow the existing structure to ensure consistency.
## Example: Setting Variables in the Flake File
In the `flake.nix` file, you can define host-specific and user-specific variables using let-bindings. Here is an example:
```nix
let
###################################
# 1. Host variables
###################################
hostVars = {
host1 = {
hostname = "swaphb-mba";
arch = "aarch64-darwin";
homeDirectory = "/Users/stephen";
};
host2 = {
hostname = "example";
arch = "aarch64-darwin";
homeDirectory = "/Users/example";
};
};
###################################
# 2. User variables
###################################
userVars = {
userA = {
username = "stephen";
homeDirectory = "/Users/stephen";
shell = "zsh";
};
userB = {
username = "example";
homeDirectory = "/Users/example";
shell = "fish";
};
};
in
{
// ...existing code...
}
```
These variables can then be used throughout the flake configuration to customize settings for each host and user.
## License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
## Table of Contents
- [Overview](#overview)
- [Requirements](#requirements)
- [Repository Layout](#repository-layout)
- [Key Modules](#key-modules)
- [How to Use](#how-to-use)
- [Building and Switching](#building-and-switching)
- [Common Commands](#common-commands)
- [Troubleshooting](#troubleshooting)
- [Dirty Git Tree](#dirty-git-tree)
- [Path Does Not Exist](#path-does-not-exist)
- [References](#references)
## Overview
- **nix-darwin**: Brings the power of Nix on macOS for system-wide configurations.
- **Home Manager**: Manages user-level configuration (dotfiles, shells, packages) using Nix.
- **nix-homebrew**: Allows declarative management of Homebrew (including taps, casks, etc.) via Nix.
By splitting the configuration into multiple files under `./modules/`, each file focuses on a specific area (e.g., system packages, services, dotfiles, etc.).
## Requirements
- **Nix**: You need Nix installed.
- **nix-darwin**: The Darwin modules rely on nix-darwin.
- **Git**: This is a Flake-based workflow, so your configuration should be in a Git repository.
After installing Nix, you can install nix-darwin (one recommended approach is from the official Nix-Darwin docs).
## Repository Layout
A typical directory structure might look like this:
```
.
├── flake.nix
├── modules
│ ├── darwin
│ │ ├── homebrew.nix
│ │ ├── nixpackages.nix
│ │ └── services.nix
│ └── home
│ └── <username>
│ └── dotfiles.nix
├── rebuild.sh
└── README.md
```
- **flake.nix**: The top-level file defining all inputs (nixpkgs, nix-darwin, home-manager, nix-homebrew) and outputs (your nix-darwin configuration). Imports each module (e.g., `./modules/darwin/homebrew.nix`) into `darwinConfigurations.<hostname>.modules`.
- **modules/darwin/**:
- `homebrew.nix`: Holds Homebrew-related configurations (brew packages, casks, etc.).
- `nixpackages.nix`: Holds your `environment.systemPackages`.
- `services.nix`: Configures system services (e.g., Tailscale, nix-daemon, security/pam).
- **modules/home/**:
- `<username>/dotfiles.nix`: Holds user-level dotfiles managed by Home Manager (e.g., `~/.gitconfig`, `~/.ssh/config`).
- **rebuild.sh**: A convenience script that typically runs something like:
```sh
#!/usr/bin/env bash
darwin-rebuild switch --flake .#<hostname>
```
Replace `<hostname>` with your actual hostname if needed.
## Key Modules
1. **modules/darwin/homebrew.nix**
```nix
{ config, pkgs, lib, ... }:
{
homebrew = {
enable = true;
onActivation.cleanup = "uninstall";
taps = [];
brews = [
"cowsay" # install brews
"git"
"k9s"
"helm"
"podman"
"podman-compose"
];
casks = [
"1password" # install casks
"podman-desktop"
"teleport-connect"
"utm"
"localsend"
];
masApps = {
"1Password for Safari" = 1569813296; # install Mac Appstore apps!
"wireguard" = 1451685025;
"wipr" = 1320666476;
};
};
}
```
2. **modules/darwin/nixpackages.nix**
```nix
{ config, pkgs, ... }:
{
environment.systemPackages = with pkgs; [
vim # Install packages from nix package store
lens
vscode
spotify
slack
kubectl
discord
_1password-cli
brave
teleport
tenv
google-cloud-sdk
awscli
azure-cli
go
starship
];
}
```
3. **modules/darwin/services.nix**
```nix
{ config, pkgs, ... }:
{
services = {
nix-daemon.enable = true;
tailscale.enable = true; # Install and enable tailscale
};
security.pam.enableSudoTouchIdAuth = true;
}
```
4. **modules/home/dotfiles.nix**
```nix
{ config, pkgs, lib, ... }:
{
home.file = {
".ssh/config".text = ''
Host *
IdentityAgent "~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock" # enables 1password ssh agent integration
'';
".gitconfig".text = ''
[user]
name = <name>
email = <your_email>
signingkey = <Your_Github_Auth_Public_Key>
[gpg]
format = ssh
[gpg "ssh"]
program = "/Applications/1Password.app/Contents/MacOS/op-ssh-sign" # Specify gpg sign key location, This uses 1password's provider.
[commit]
gpgSign = true
'';
};
}
```
## How to Use
## Building and Switching
1. Clone this repo (or ensure you have your local copy).
@@ -302,6 +131,14 @@ which should do the same command under the hood.
```sh
nix flake show
```
- **Build with switching**
```sh
darwin-rebuild switch --flake .#<hostname>
```
- **Update upstream flakes**
```sh
nix flake update
```
## Troubleshooting