| 
									
										
										
										
											2024-03-24 14:21:28 -04:00
										 |  |  | #!/usr/bin/env nix
 | 
					
						
							|  |  |  | #! nix shell nixpkgs#bash nixpkgs#git --command bash
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-13 17:50:03 -04:00
										 |  |  | set -o errexit  # abort on nonzero exitstatus | 
					
						
							|  |  |  | set -o nounset  # abort on unbound variable | 
					
						
							|  |  |  | set -o pipefail # don't hide errors within pipes | 
					
						
							| 
									
										
										
										
											2024-03-24 14:21:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | PROCEED="N" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ################################################################################ | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This script is a sample install script for using this repository | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This makes several assumptions, listed below | 
					
						
							|  |  |  | #    the system will use LVM for managing drives and snapshots | 
					
						
							|  |  |  | #    SOPS should be set up (set SOPS=N to disable) | 
					
						
							|  |  |  | #    this is a server (change GITBASE to reflect path to machine config) | 
					
						
							|  |  |  | #    this machine is called "machine" | 
					
						
							|  |  |  | #    this machine will have all partitions on /dev/sda | 
					
						
							|  |  |  | #    there will be no swap partition (set SWAPSIZE to non-zero) | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Please check the below variables and make changes as appropriate | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | ################################################################################ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Need to validate the below before running the script | 
					
						
							|  |  |  | # Set SWAPSIZE to something larger than 0 to enable it | 
					
						
							|  |  |  | # (even if CREATEPARTS is disabled) | 
					
						
							|  |  |  | VOLGROUP="nixos-vg" | 
					
						
							|  |  |  | DRIVE="nvme0n1" | 
					
						
							|  |  |  | MACHINENAME="artemision" | 
					
						
							|  |  |  | SWAPSIZE="35G" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Feature toggles (must be Y to be enabled) | 
					
						
							|  |  |  | CREATEPARTS="Y" | 
					
						
							|  |  |  | SOPS="Y" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # SOPS owner | 
					
						
							|  |  |  | OWNERORADMINS="alice" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Partition planning | 
					
						
							|  |  |  | ROOTPATH="/dev/$VOLGROUP/root" | 
					
						
							|  |  |  | SWAPPATH="/dev/$VOLGROUP/swap" | 
					
						
							|  |  |  | HOMEPATH="/dev/$VOLGROUP/home" | 
					
						
							|  |  |  | NIXSTOREPATH="/dev/$VOLGROUP/nix" | 
					
						
							|  |  |  | BOOTPART="/dev/${DRIVE}p1" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # git vars | 
					
						
							| 
									
										
										
										
											2024-05-28 18:57:19 -04:00
										 |  |  | GITBASE="systems" | 
					
						
							|  |  |  | FEATUREBRANCH="feature/adding-$MACHINENAME" | 
					
						
							| 
									
										
										
										
											2024-03-24 14:21:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | if [ $PROCEED != "Y" ]; then | 
					
						
							| 
									
										
										
										
											2025-03-13 17:50:03 -04:00
										 |  |  |   echo "PROCEED is not set correctly, please validate the below partitions and update the script accordingly" | 
					
						
							|  |  |  |   lsblk -ao NAME,FSTYPE,FSSIZE,FSUSED,SIZE,MOUNTPOINT | 
					
						
							| 
									
										
										
										
											2024-03-24 14:21:28 -04:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-13 17:50:03 -04:00
										 |  |  | if [ $CREATEPARTS = "Y" ]; then | 
					
						
							|  |  |  |   # Create partition table | 
					
						
							|  |  |  |   sudo parted "/dev/$DRIVE" -- mklabel gpt | 
					
						
							| 
									
										
										
										
											2024-03-24 14:21:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-13 17:50:03 -04:00
										 |  |  |   # Create boot part | 
					
						
							|  |  |  |   sudo parted "/dev/$DRIVE" -- mkpart ESP fat32 1MB 1024MB | 
					
						
							|  |  |  |   sudo parted "/dev/$DRIVE" -- set 1 esp on | 
					
						
							|  |  |  |   sudo mkfs.fat -F 32 -n NIXBOOT "/dev/${DRIVE}1" | 
					
						
							| 
									
										
										
										
											2024-03-24 14:21:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-13 17:50:03 -04:00
										 |  |  |   # Create luks part | 
					
						
							|  |  |  |   sudo parted "/dev/$DRIVE" -- mkpart primary ext4 1024MB 100% | 
					
						
							|  |  |  |   sudo parted "/dev/$DRIVE" -- set 2 lvm on | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   LUKSPART="nixos-pv" | 
					
						
							|  |  |  |   sudo cryptsetup luksFormat "/dev/${DRIVE}p2" | 
					
						
							|  |  |  |   sudo cryptsetup luksOpen "/dev/${DRIVE}p2" "$LUKSPART" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Create lvm part | 
					
						
							|  |  |  |   sudo pvcreate "/dev/mapper/$LUKSPART" | 
					
						
							|  |  |  |   sudo pvresize "/dev/mapper/$LUKSPART" | 
					
						
							|  |  |  |   sudo pvdisplay | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Create volume group | 
					
						
							|  |  |  |   sudo vgcreate "$VOLGROUP" "/dev/mapper/$LUKSPART" | 
					
						
							|  |  |  |   sudo vgchange -a y "$VOLGROUP" | 
					
						
							|  |  |  |   sudo vgdisplay | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Create swap part on LVM | 
					
						
							|  |  |  |   if [ $SWAPSIZE != 0 ]; then | 
					
						
							|  |  |  |     sudo lvcreate -L "$SWAPSIZE" "$VOLGROUP" -n swap | 
					
						
							|  |  |  |     sudo mkswap -L NIXSWAP -c "$SWAPPATH" | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Create home part on LVM, leaving plenty of room for snapshots | 
					
						
							|  |  |  |   sudo lvcreate -l 50%FREE "$VOLGROUP" -n home | 
					
						
							|  |  |  |   sudo mkfs.ext4 -L NIXHOME -c "$HOMEPATH" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Create root part on LVM, keeping in mind most data will be on /home or /nix | 
					
						
							|  |  |  |   sudo lvcreate -L 5G "$VOLGROUP" -n root | 
					
						
							|  |  |  |   sudo mkfs.ext4 -L NIXROOT -c "$ROOTPATH" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Create nix part on LVM | 
					
						
							|  |  |  |   sudo lvcreate -L 100G "$VOLGROUP" -n nix-store | 
					
						
							|  |  |  |   sudo mkfs.ext4 -L NIXSTORE -c "$NIXSTOREPATH" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sudo lvdisplay | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   lsblk -ao NAME,FSTYPE,FSSIZE,FSUSED,SIZE,MOUNTPOINT | 
					
						
							| 
									
										
										
										
											2024-03-24 14:21:28 -04:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Mount partitions | 
					
						
							|  |  |  | sudo mount $ROOTPATH /mnt | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | sudo mkdir /mnt/{home,nix,boot} || echo "directories already exist (/mnt/{home,nix,boot})" | 
					
						
							|  |  |  | sudo mount $HOMEPATH /mnt/home | 
					
						
							|  |  |  | sudo mount $NIXSTOREPATH /mnt/nix | 
					
						
							|  |  |  | sudo mount $BOOTPART /mnt/boot | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Enable swap if SWAPSIZE is non-zero | 
					
						
							|  |  |  | if [ $SWAPSIZE != 0 ]; then | 
					
						
							| 
									
										
										
										
											2025-03-13 17:50:03 -04:00
										 |  |  |   sudo swapon "/dev/$VOLGROUP/swap" | 
					
						
							| 
									
										
										
										
											2024-03-24 14:21:28 -04:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Clone the repo | 
					
						
							|  |  |  | DOTS="/mnt/root/dotfiles" | 
					
						
							|  |  |  | GC="git -C $DOTS" | 
					
						
							|  |  |  | sudo mkdir -p "$DOTS" || echo "directory $DOTS already exists" | 
					
						
							| 
									
										
										
										
											2025-04-01 21:58:08 -04:00
										 |  |  | sudo $GC clone https://nayeonie.com/ahuston-0/nix-dotfiles.git . | 
					
						
							| 
									
										
										
										
											2024-03-24 14:21:28 -04:00
										 |  |  | sudo $GC checkout "$FEATUREBRANCH" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Create ssh keys | 
					
						
							|  |  |  | sudo mkdir /root/.ssh | 
					
						
							|  |  |  | sudo chmod 700 /root/.ssh | 
					
						
							|  |  |  | sudo ssh-keygen -t ed25519 -o -a 100 -f "/root/.ssh/id_ed25519_ghdeploy" -q -N "" -C "$MACHINENAME" || echo "key already exists" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | read -r -p "get this into github so you can check everything in, then hit enter :)" | 
					
						
							|  |  |  | cat "$DOTS/id_ed25519_ghdeploy.pub" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [ $SOPS == "Y" ]; then | 
					
						
							| 
									
										
										
										
											2025-03-13 17:50:03 -04:00
										 |  |  |   # Create ssh host-keys | 
					
						
							|  |  |  |   sudo ssh-keygen -A | 
					
						
							|  |  |  |   sudo mkdir -p /mnt/etc/ssh | 
					
						
							|  |  |  |   sudo cp "/etc/ssh/ssh_host_*" /mnt/etc/ssh | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Get line where AGE comment is and insert new AGE key two lines down | 
					
						
							|  |  |  |   AGELINE=$(grep "Generate AGE keys from SSH keys with" "$DOTS/.sops.yaml" -n | awk -F ':' '{print ($1+2)}') | 
					
						
							|  |  |  |   AGEKEY=$(nix-shell -p ssh-to-age --run 'cat /etc/ssh/ssh_host_ed25519_key.pub | ssh-to-age') | 
					
						
							|  |  |  |   sudo sed -i "${AGELINE}i\\  - &${MACHINENAME} $AGEKEY\\" "$DOTS/.sops.yaml" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Add server name | 
					
						
							|  |  |  |   SERVERLINE=$(grep 'servers: &servers' "$DOTS/.sops.yaml" -n | awk -F ':' '{print ($1+1)}') | 
					
						
							|  |  |  |   sudo sed -i "${SERVERLINE}i\\  - *${MACHINENAME}\\" "$DOTS/.sops.yaml" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Add creation rules | 
					
						
							|  |  |  |   CREATIONLINE=$(grep 'creation_rules' "$DOTS/.sops.yaml" -n | awk -F ':' '{print ($1+1)}') | 
					
						
							|  |  |  |   # TODO: below was not working when last attempted | 
					
						
							|  |  |  |   read -r -d '' PATHRULE <<-EOF | 
					
						
							| 
									
										
										
										
											2024-03-24 14:21:28 -04:00
										 |  |  |   - path_regex: $GITBASE/$MACHINENAME/secrets\.yaml$ | 
					
						
							|  |  |  |     key_groups: | 
					
						
							|  |  |  |       - pgp: *$OWNERORADMINS | 
					
						
							|  |  |  |         age: | 
					
						
							|  |  |  |           - *$MACHINENAME | 
					
						
							|  |  |  | EOF | 
					
						
							| 
									
										
										
										
											2025-03-13 17:50:03 -04:00
										 |  |  |   sudo sed -i "${CREATIONLINE}i\\${PATHRULE}\\" "$DOTS/.sops.yaml" | 
					
						
							| 
									
										
										
										
											2024-03-24 14:21:28 -04:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | read -r -p "press enter to continue" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # generate hardware.nix | 
					
						
							|  |  |  | sudo nixos-generate-config --root /mnt --dir "$DOTS" | 
					
						
							|  |  |  | sudo mv "$DOTS/$GITBASE/$MACHINENAME/hardware{-configuration,}.nix" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # from https://nixos.org/manual/nixos/unstable | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | sudo nixos-install --flake "$DOTS#$MACHINENAME" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # add ssh config for root and reset git repo url | 
					
						
							|  |  |  | read -r -d '' SSHCONFIG <<-EOF | 
					
						
							|  |  |  | Host github.com | 
					
						
							|  |  |  |         User git | 
					
						
							|  |  |  |         Hostname github.com | 
					
						
							|  |  |  |         PreferredAuthentications publickey | 
					
						
							|  |  |  |         IdentityFile /root/.ssh/id_ed25519_ghdeploy | 
					
						
							|  |  |  | EOF | 
					
						
							|  |  |  | printf "%s" "$SSHCONFIG" | sudo tee /root/.ssh/config | 
					
						
							| 
									
										
										
										
											2025-04-01 21:58:08 -04:00
										 |  |  | sudo "$GC" remote set-url origin 'ssh://gitea@nayeonie.com:2222/ahuston-0/nix-dotfiles.git' |