172 lines
3.7 KiB
Markdown
172 lines
3.7 KiB
Markdown
# Getting Started
|
|
|
|
This guide will help you get started with this NixOS configuration repository.
|
|
|
|
## Prerequisites
|
|
|
|
- Basic knowledge of NixOS and the Nix language
|
|
- Git installed on your system
|
|
- Physical access to the machine you want to configure
|
|
|
|
## Initial Setup
|
|
|
|
### 1. Cloning the Repository
|
|
|
|
Clone this repository to your local machine:
|
|
|
|
```bash
|
|
git clone ssh://nix-apps@localhost:2222/mjallen/nix-config.git
|
|
cd nix-config
|
|
```
|
|
|
|
### 2. Setting Up a New System
|
|
|
|
#### Option 1: Using an Existing Configuration
|
|
|
|
If you're setting up a new machine that should be identical to an existing configuration:
|
|
|
|
1. Boot from a NixOS installation media
|
|
2. Mount your target partitions to `/mnt`
|
|
3. Clone this repository:
|
|
```bash
|
|
nixos-enter
|
|
cd /mnt
|
|
mkdir -p /mnt/etc/nixos
|
|
git clone ssh://nix-apps@localhost:2222/mjallen/nix-config.git /mnt/etc/nixos
|
|
```
|
|
4. Install NixOS with the desired system profile:
|
|
```bash
|
|
nixos-install --flake /mnt/etc/nixos#hostname
|
|
```
|
|
Replace `hostname` with the target system name (e.g., `matt-nixos`, `jallen-nas`, etc.)
|
|
|
|
#### Option 2: Creating a New System Configuration
|
|
|
|
If you're adding a completely new system:
|
|
|
|
1. Create a new directory for your system configuration:
|
|
```bash
|
|
mkdir -p systems/$(uname -m)-linux/new-hostname
|
|
```
|
|
|
|
2. Create the basic configuration files:
|
|
```bash
|
|
cat > systems/$(uname -m)-linux/new-hostname/default.nix << EOF
|
|
{ lib, pkgs, ... }:
|
|
{
|
|
imports = [
|
|
./hardware-configuration.nix
|
|
# Add other needed module imports here
|
|
];
|
|
|
|
networking.hostName = "new-hostname";
|
|
|
|
# Add your system-specific configuration here
|
|
}
|
|
EOF
|
|
```
|
|
|
|
3. Generate the hardware configuration:
|
|
```bash
|
|
nixos-generate-config --no-filesystems --dir systems/$(uname -m)-linux/new-hostname/
|
|
```
|
|
|
|
4. Add your new system to the flake by adding it to the `hosts` section in `flake.nix`
|
|
|
|
5. Build and install the configuration:
|
|
```bash
|
|
sudo nixos-rebuild switch --flake .#new-hostname
|
|
```
|
|
|
|
## Secret Management
|
|
|
|
### Setting Up Sops-Nix
|
|
|
|
1. Create a GPG key if you don't already have one:
|
|
```bash
|
|
gpg --full-generate-key
|
|
```
|
|
|
|
2. Add your key to `.sops.yaml`:
|
|
```bash
|
|
# Get your key fingerprint
|
|
gpg --list-secret-keys --keyid-format=long
|
|
|
|
# Edit the .sops.yaml file to add your key
|
|
```
|
|
|
|
3. Create a new encrypted secret:
|
|
```bash
|
|
sops secrets/newsecret.yaml
|
|
```
|
|
|
|
## Common Tasks
|
|
|
|
### Updating the Repository
|
|
|
|
```bash
|
|
git pull
|
|
sudo nixos-rebuild switch --flake .#hostname
|
|
```
|
|
|
|
### Adding a New Package
|
|
|
|
1. For standard packages, add them to your system or home configuration:
|
|
```nix
|
|
environment.systemPackages = with pkgs; [
|
|
new-package
|
|
];
|
|
```
|
|
|
|
2. For custom packages, add them to the `packages` directory:
|
|
```bash
|
|
mkdir -p packages/new-package
|
|
# Create the necessary Nix files
|
|
```
|
|
|
|
### Adding a New Module
|
|
|
|
1. Create a new module directory:
|
|
```bash
|
|
mkdir -p modules/nixos/new-module
|
|
```
|
|
|
|
2. Create the module files:
|
|
```bash
|
|
# Create options.nix
|
|
cat > modules/nixos/new-module/options.nix << EOF
|
|
{ lib, namespace, ... }:
|
|
with lib;
|
|
{
|
|
options.${namespace}.new-module = {
|
|
enable = mkEnableOption "Enable new module";
|
|
# Add other options here
|
|
};
|
|
}
|
|
EOF
|
|
|
|
# Create default.nix
|
|
cat > modules/nixos/new-module/default.nix << EOF
|
|
{ config, lib, namespace, ... }:
|
|
let
|
|
cfg = config.${namespace}.new-module;
|
|
in
|
|
{
|
|
imports = [ ./options.nix ];
|
|
|
|
config = lib.mkIf cfg.enable {
|
|
# Add your configuration here
|
|
};
|
|
}
|
|
EOF
|
|
```
|
|
|
|
3. Import your module in your system configuration:
|
|
```nix
|
|
imports = [
|
|
# ...
|
|
../../../modules/nixos/new-module
|
|
];
|
|
|
|
${namespace}.new-module.enable = true;
|
|
``` |