add readme

This commit is contained in:
2025-01-07 19:57:42 -05:00
parent b8668f6272
commit c2d3a99af3

299
README.md
View File

@@ -1,3 +1,298 @@
# nix-darwin-config
# Nix Darwin Configuration
guide followed: https://davi.sh/blog/2024/01/nix-darwin/
This repository contains a multi-host, multi-user Darwin system configuration using Nix flakes. It leverages `nix-darwin` and `home-manager` to manage macOS configurations declaratively.
## Description
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
- **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.
## Usage
1. **Clone the repository**:
```sh
git clone https://github.com/your-username/nix-darwin-config.git
cd nix-darwin-config
```
2. **Install Nix**:
Follow the instructions on the [Nix website](https://nixos.org/download.html) to install Nix.
3. **Enable Flakes**:
Ensure that flakes are enabled in your Nix configuration:
```sh
mkdir -p ~/.config/nix
echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf
```
4. **Apply Configuration**:
To apply the configuration for a specific host, run:
```sh
nix build .#darwinConfigurations.<hostname>.system
./result/sw/bin/darwin-rebuild switch --flake .
```
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.
## 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).
2. Install nix-darwin if you havent already.
3. From the root of this repository (where `flake.nix` resides), run:
```sh
darwin-rebuild switch --flake .#<hostname>
```
Replace `<hostname>` with the actual name of your system defined in `flake.nix` (e.g., `swaphb-mba`).
Alternatively, if you have a script `rebuild.sh`, run:
```sh
./rebuild.sh
```
which should do the same command under the hood.
## Common Commands
- **Build without switching**:
```sh
darwin-rebuild build --flake .#<hostname>
```
This only builds the configuration but doesnt apply it.
- **Show changes**:
```sh
darwin-rebuild dry-activate --flake .#<hostname>
```
See what changes will be made without applying them.
- **List available flake outputs**:
```sh
nix flake show
```
## Troubleshooting
### Dirty Git Tree
If you see warnings like:
```
warning: Git tree '/path/to/your/repo' is dirty
```
It means you have uncommitted changes.
**Solution**: Either commit the changes or pass `--impure` (not recommended), or stage/commit the changes to keep the flake happy:
```sh
git add -A
git commit -m "Commit message"
```
### Path Does Not Exist
If you get an error similar to:
```
error: path '/nix/store/...-source/modules/darwin/homebrew.nix' does not exist
```
It usually means:
- You havent actually created or committed the file.
- Theres a typo or case mismatch in the file name.
- The file is in a different directory than you think.
**Solution**: Make sure the file exists, check for correct spelling/capitalization, and commit it to Git.
## References
- [NixOS Wiki: Flakes](https://nixos.wiki/wiki/Flakes)
- [nix-darwin](https://github.com/LnL7/nix-darwin)
- [Home Manager](https://github.com/nix-community/home-manager)
- [nix-homebrew (zhaofengli-wip)](https://github.com/zhaofengli/nix-homebrew)
With this multi-file approach, you can easily add, remove, or tweak individual modules without having a giant monolithic `flake.nix`.