New Deployment checklist
NixOS System
My nix configuration has gotten complex. Passwords and Secrets are embedded in the repository and are necessary to be accessed in order to allow logins from the console. This is a summary of getting a system or a home configuration up and running.
First steps
Edit Repository
This needs to be done on a system that has access to update secrets before installation!
- Clone NixOS Configuration Repository
git clone https://git.repo/nixos-config /<whereever>
- Edit Flake.nix with NixOS Configuration of new hostname
- Create folder under
hosts
with hostname - Edit
default.nix
with any features, and any users required - Create
secrets
folder- Put
ssh_host_ed25519_key.pub
insidesecrets
- Put
- Generate SSH Host Key
ssh-keygen -t ed25519 "Hostname" -f /tmp/ssh_host_ed25519_key
- Create
secrets
folder- Put
ssh_host_ed25519_key.pub
insidehosts/<hostname>/secrets
- Put
- Get AGE Key of Host public key
cat hosts/<hostname>/secrets/ssh_host_ed25519_key.pub | ssh-to-age
- Update
/.sops.yaml
- Add the AGE Key of the Host Public key under
keys
- Add a new creation_rule group for
and add *host_<hostname>
and*user_dave
to the key_groups - Add
*host_<hostname> to both
hosts/common/secrets.*and
hosts/common/users/secrets.yaml`
- Add the AGE Key of the Host Public key under
- Create example secret to ensure secrets can be decoded
sops hosts/<hostname>/secrets/secrets.yaml
- Call the secret
<hostname>: Example Secret for <Hostname>
- This secret must exist
- Call the secret
- Commit to Git
Installation
Option 1: Boot from Install Media
-
Download NixOS install media
wget https://channels.nixos.org/nixos-23.05/latest-nixos-minimal-x86_64-linux.iso
-
Copy to Flash drive or mount remotely
dd if=latest-nixos-minimal-x86_64-linux.iso of=<YOUR_DEVICE> bs=4M
-
Boot NixOS Install media
Partition Disks
- If impermanence, make sure that
/persist
(active + snapshots) is created
Mount Disks and Subvolumes
- Make sure all are mounted including any swap partitions
Copy additional files from Host
- Copy SSH private and public key from
/tmp/ssh_host_ed25519*
to{/persist}/etc/ssh/
- Get Host AGE Private Key
ssh-to-age -private-key -i /tmp/ssh_host_ed25519_key
Create SOPS configuration on host
- Copy output of above ssh-to-age command to /root/.config/sops/age/keys.txt
- Make sure file is owned by
root:root
and can only be read (chmod 400
)
Clone NixOS Configuration Repository
- Make sure that you have Git and Flakes enabled
nix-shell -p git nixFlakes git clone https://git.repo/nixos-config /persist
Generate Hardware Configuration
- Make sure that all of your disks and the correct hardware modules have been detected. Swap has a tendency to not appear here automatically!
nixos-generate-config --show-hardware-config --root /mnt > /persist/nixos-config/hosts/<hostname>/hardware-configuration.nix
Install
- If all goes well you will have a working system upon reboot:
nixos-install --root /mnt --flake /persist/nixos-config/#<hostname>
Option 2: Remote Installation (NixOS Anywhere)
echo -n "password" > /tmp/secret.key
nix run github:numtide/nixos-anywhere -- --flake .#<hostname> --disk-encryption-keys /tmp/secret.key /tmp/secret.key root@192.168.122.111
Another time...
Home Setup
Non or NixOS System
- If non, make sure that Nix is installed either from your package manager or via
- Standlone | Single User
sh <(curl -L https://nixos.org/nix/install) --nodaemon
- MultiUser
sh <(curl -L https://nixos.org/nix/install) --daemon
- Standlone | Single User
Install Channel
- Login as user and add Home-Manager channel
nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager #or a tagged release #nix-channel --add https://github.com/nix-community/home-manager/archive/release-23.05.tar.gz home-manager nix-channel --update
- Logout and log back in
nix-shell '<home-manager>' -A install
Clone Repo
```
mkdir -p ~/src/
git clone https://git.repo/home-manager-config ~/src/home-manager
```
Edit Repository
- Edit
flake.nix
and add a new HomeConfiguration making sure you add at minimum:-
org
this profile belongs to. usegeneric
if you don't know -
role
of system -
windowmanager
if this is a graphical system
-
- Add any custom configuration under `home/
/ , or don't.
Update SOPS
- As above, edit
sops.yaml
with your users AGE public key and make any adjustments to where secrets should be decoded. - Copy any private/public SSH keys required for decoding into your
~/.ssh
folder - Make sure that you have copied your AGE Private Key or regenerated
ssh-to-age -private-key -i ~/.ssh/id_ed25519 | install -D -m 400 /dev/stdin ~/.config/sops/age/keys.txt
Deploy Configuration
- Make sure you commit back to git!
home-manager switch --flake ~/src/home-manager#<config-name> --extra-experimental-features "nix-command flakes"