This commit is contained in:
Nickolaj Jepsen 2025-02-20 22:50:06 +01:00
parent 2b7b63a18c
commit 638ef7093e
140 changed files with 307 additions and 121 deletions

20
devshell.nix Normal file
View file

@ -0,0 +1,20 @@
{inputs, ...}: {
imports = [inputs.agenix-rekey.flakeModule];
perSystem = {
system,
pkgs,
...
}: {
devShells.default = pkgs.mkShell {
inherit system;
packages = [
pkgs.nix
pkgs.nixos-rebuild
pkgs.nixos-rebuild
pkgs.nh
];
};
};
}

View file

@ -66,10 +66,10 @@
flake-parts.lib.mkFlake {inherit inputs;} { flake-parts.lib.mkFlake {inherit inputs;} {
imports = [ imports = [
inputs.agenix-rekey.flakeModule inputs.agenix-rekey.flakeModule
./parts/devshell.nix ./devshell.nix
./parts/vm.nix ./vm.nix
./parts/formatter.nix ./formatter.nix
./parts/hosts ./hosts
]; ];
systems = [ systems = [
"x86_64-linux" "x86_64-linux"

View file

@ -0,0 +1,5 @@
{username, ...}: {
networking.wireless.enable = false;
networking.networkmanager.enable = true;
users.users.${username}.extraGroups = [ "networkmanager" ];
}

View file

@ -55,6 +55,15 @@ with lib; let
); );
in { in {
config.flake.nixosConfigurations = { config.flake.nixosConfigurations = {
bootstrap = mkSystem {
hostname = "bootstrap";
username = "nixos";
modules = [
../modules/required.nix
../modules/shell.nix
];
};
laptop = mkSystem { laptop = mkSystem {
hostname = "laptop"; hostname = "laptop";
username = "nickolaj"; username = "nickolaj";

View file

@ -9,4 +9,7 @@ _: {
powerManagement.enable = true; powerManagement.enable = true;
nvidiaSettings = true; nvidiaSettings = true;
}; };
# Avoid nvidia driver from crashing the system
boot.kernelParams = ["pcie_aspm=off"];
} }

View file

@ -2,7 +2,7 @@ _: {
disko.devices = { disko.devices = {
disk = { disk = {
main = { main = {
device = "/dev/disk/by-id/ata-SanDisk_SDSSDXPS240G_153251401377"; device = "/dev/sda";
type = "disk"; type = "disk";
content = { content = {
type = "gpt"; type = "gpt";

146
justfile
View file

@ -1,10 +1,15 @@
# export NIXPKGS_ALLOW_UNFREE := "1" # export NIXPKGS_ALLOW_UNFREE := "1"
nixcmd := "nix --experimental-features 'nix-command flakes'"
@_default:
just --list
[group('vm')] [group('vm')]
vm-build: vm-build:
git add . git add .
echo "Building VM..." echo "Building VM..."
nix build .#vm {{ nixcmd }} build .#vm
echo "VM built." echo "VM built."
sudo chmod 777 result/nixos.qcow2 sudo chmod 777 result/nixos.qcow2
echo "VM permissions set." echo "VM permissions set."
@ -42,96 +47,119 @@ vm-destroy:
virsh pool-destroy nixos virsh pool-destroy nixos
virsh pool-undefine nixos virsh pool-undefine nixos
[group('nix')] [doc('Wrapper for nixos-facter')]
repl:
nix repl --show-trace ".#" nixpkgs
[group('deploy')] [group('deploy')]
deploy-factor hostname target='': factor hostname target='':
#!/usr/bin/env -S bash -e #!/usr/bin/env -S bash -e
target="{{ target }}" target="{{ target }}"
if [ -z "$target" ]; then if [ -z "$target" ]; then
sudo nix run nixpkgs#nixos-facter -- -o parts/hosts/{{ hostname }}/facter.json {{ nixcmd }} run nixpkgs#nixos-facter -- -o hosts/{{ hostname }}/facter.json
else else
nix run github:nix-community/nixos-anywhere -- \ {{ nixcmd }} run github:nix-community/nixos-anywhere -- \
--flake .#{{ hostname }} \ --flake .#{{ hostname }} \
--target-host {{ target }} \ --target-host {{ target }} \
--generate-hardware-config nixos-facter \ --generate-hardware-config nixos-facter \
./parts/hosts/{{ hostname }}/facter.json ./hosts/{{ hostname }}/facter.json
fi fi
tmp_dir := "/tmp/secrets/" + uuid() [doc('Wrapper for nixos-rebuild switch')]
[group("deploy")] [group("deploy")]
deploy hostname *ARGS: switch hostname target='':
nix run nixpkgs#nixos-rebuild -- \ #!/usr/bin/env -S bash -e
--flake .#{{ hostname }} \ target="{{ target }}"
{{ ARGS }} switch if [ -z "$target" ]; then
{{ nixcmd }} run nixpkgs#nixos-rebuild -- switch --flake .#{{ hostname }}
else
{{ nixcmd }} run nixpkgs#nixos-rebuild -- switch \
--flake .#{{ hostname }} \
--target-host {{ target }} \
--use-remote-sudo
fi
[doc('Use nixos-anywhere to deploy to a remote host')]
[group('deploy')] [group('deploy')]
deploy-remote hostname target: deploy-remote hostname target:
#!/usr/bin/env -S bash -e #!/usr/bin/env -S bash -e
git add . git add .
trap "rm -rf {{ tmp_dir }}" EXIT temp=$(mktemp -d)
trap "rm -rf $temp" EXIT
install -d -m755 "$temp/etc/ssh"
# Copy ssh key to decrypt agenix secrets # Copy ssh key to decrypt agenix secrets
install -d -m755 {{ tmp_dir }}/etc/ssh just age -d "./secrets/hosts/{{ hostname }}/id_ed25519.age" > "$temp/etc/ssh/ssh_host_ed25519_key"
just secret-echo ./secrets/hosts/{{ hostname }}/id_ed25519 > {{ tmp_dir }}/etc/ssh/ssh_host_ed25519_key chmod 600 "$temp/etc/ssh/ssh_host_ed25519_key"
chmod 600 {{ tmp_dir }}/etc/ssh/ssh_host_ed25519_key
cp ./secrets/hosts/{{ hostname }}/id_ed25519.pub {{ tmp_dir }}/etc/ssh/ssh_host_ed25519_key.pub cp "./secrets/hosts/{{ hostname }}/id_ed25519.pub" "$temp/etc/ssh/ssh_host_ed25519_key.pub"
# Deploy # Deploy
nix run github:nix-community/nixos-anywhere -- \ {{ nixcmd }} run github:nix-community/nixos-anywhere -- \
--flake .#{{ hostname }} \ --flake .#{{ hostname }} \
--disk-encryption-keys /luks-password <(just secret-echo ./secrets/luks-password) \ --disk-encryption-keys /luks-password <(just age -d ./secrets/luks-password.age) \
--extra-files {{ tmp_dir }} \ --extra-files "$temp" \
--target-host {{ target }} --target-host "{{ target }}"
[doc('A wrapper disko-install')]
[group('deploy')] [group('deploy')]
deploy-switch hostname target *ARGS: disko-install hostname disk="/dev/sda":
nix run nixpkgs#nixos-rebuild -- \ sudo {{ nixcmd }} run 'github:nix-community/disko/latest#disko-install' -- --flake .#{{ hostname }} --disk main {{ disk }}
--flake .#{{ hostname }} \
--target-host {{ target }} \
--use-remote-sudo \
{{ ARGS }} switch
[doc('Build an install ISO for a host')]
[group('deploy')] [group('deploy')]
deploy-iso hostname: iso hostname:
nix build .#nixosConfigurations.{{ hostname }}.config.formats.install-iso {{ nixcmd }} build .#nixosConfigurations.{{ hostname }}.config.formats.install-iso
identifier := "./secrets/yubikey-identity.pub"
[group("secret")]
secret-import path:
#!/usr/bin/env bash
# load the file from the root system
cat {{ path }} | nix develop --quiet --command bash -c \
"rage -e -r -o secrets/{{ path }}.age -i {{ identifier }}"
[doc('Runs (r)age with yubikey identity')]
[group('secret')] [group('secret')]
secret-echo file: age *ARGS="--help":
nix develop --quiet --command bash -c \ @{{ nixcmd }} shell nixpkgs#rage nixpkgs#age-plugin-yubikey --command rage {{ ARGS }} -i ./secrets/yubikey-identity.pub
"rage -d {{ file }}.age -i {{ identifier }}"
default := ""
[doc('Decrypt a file to stdout')]
[group('secret')] [group('secret')]
secret-edit name=default: decrypt file:
nix run .#agenix-rekey.x86_64-linux.edit {{ name }} just age -d {{ file }}
[doc('Edit an encrypted file in $EDITOR')]
[group('secret')]
secret-edit name:
{{ nixcmd }} run .#agenix-rekey.x86_64-linux.edit {{ name }}
[doc('Rekey all secrets - needed when adding secrets/hosts')]
[group('secret')] [group('secret')]
secret-rekey: secret-rekey:
nix develop --quiet --command bash -c \ {{ nixcmd }} run .#agenix-rekey.x86_64-linux.rekey
"agenix rekey"
git add .
[group('secret')] [doc("Sets up configuration + SSH keys for a new host")]
secret-new-ssh-key hostname $USER: new-host hostname username:
#!/usr/bin/env -S nix develop --quiet --command bash #!/usr/bin/env -S bash -e
temp=$(mktemp -d)
trap "rm -rf $temp" EXIT
mkdir -p secrets/hosts/{{ hostname }} echo "Setting up folders"
ssh-keygen -t ed25519 -f secrets/hosts/{{ hostname }}/id_ed25519 -C "${USER}@{{ hostname }}" mkdir -p "secrets/hosts/{{ hostname }}"
age-plugin-yubikey -e secrets/hosts/{{ hostname }}/id_ed25519 \ mkdir -p "hosts/{{ hostname }}"
-o secrets/hosts/{{ hostname }}/id_ed25519.age
rm secrets/hosts/{{ hostname }}/id_ed25519 echo "Generating SSH key for {{ username }}@{{ hostname }}"
ssh-keygen -q -t ed25519 -f "$temp/id_ed25519" -C "{{ username }}@{{ hostname }}" -N ""
cp "$temp/id_ed25519.pub" "secrets/hosts/{{ hostname }}/id_ed25519.pub"
echo "Encrypting SSH key"
just age -e "$temp/id_ed25519" -o "secrets/hosts/{{ hostname }}/id_ed25519.age"
echo "Remember to update ./hosts/default.nix eg:"
# Bold with no newline
cat <<EOF
{{ BOLD }}{{ hostname }} = mkSystem {
hostname = "{{ hostname }}";
username = "{{ username }}";
modules = [
../modules/required.nix
../modules/shell.nix
../modules/graphical.nix
../modules/devenv.nix
];
};
EOF

22
modules/apps/spotify.nix Normal file
View file

@ -0,0 +1,22 @@
{
username,
pkgs,
...
}: {
environment.systemPackages = with pkgs; [
spotify
];
age.secrets.spotify-player = {
rekeyFile = ../../secrets/spotify-player.age;
path = "/home/${username}/.cache/spotify-player/credentials.json";
mode = "0600";
owner = username;
};
fireproof.home-manager = {
programs.spotify-player = {
enable = true;
};
};
}

View file

@ -0,0 +1,5 @@
{pkgsUnstable, ...}: {
environment.systemPackages = [
pkgsUnstable.sublime-merge
];
}

View file

@ -0,0 +1,9 @@
{
username,
pkgsUnstable,
...
}: {
virtualisation.virtualbox.host.enable = true;
virtualisation.virtualbox.host.package = pkgsUnstable.virtualbox;
users.extraGroups.vboxusers.members = [username];
}

View file

@ -39,6 +39,7 @@ in {
# Theme # Theme
"workbench.colorTheme" = "Darcula Theme from IntelliJ"; "workbench.colorTheme" = "Darcula Theme from IntelliJ";
"window.titleBarStyle" = "custom";
# Keybindings # Keybindings
"workbench.commandPalette.experimental.suggestCommands" = true; # Emulates IntelliJ's "Search Everywhere" "workbench.commandPalette.experimental.suggestCommands" = true; # Emulates IntelliJ's "Search Everywhere"

View file

@ -5,7 +5,7 @@
}: { }: {
age.secrets.hosts-private = { age.secrets.hosts-private = {
# Contains IP addresses that i have no business sharing # Contains IP addresses that i have no business sharing
rekeyFile = ../../../secrets/hosts-private.age; rekeyFile = ../../secrets/hosts-private.age;
}; };
# Inject the private hosts file, because setting networking.hostFiles doesn't work # Inject the private hosts file, because setting networking.hostFiles doesn't work

View file

@ -1,5 +1,5 @@
{hostname, ...}: let {hostname, ...}: let
hostSecrets = ../../../secrets/hosts + ("/" + hostname); hostSecrets = ../../secrets/hosts + ("/" + hostname);
publicKey = builtins.readFile (hostSecrets + "/id_ed25519.pub"); publicKey = builtins.readFile (hostSecrets + "/id_ed25519.pub");
in { in {
age.identityPaths = ["/etc/ssh/ssh_host_ed25519_key"]; age.identityPaths = ["/etc/ssh/ssh_host_ed25519_key"];
@ -8,7 +8,7 @@ in {
hostPubkey = publicKey; hostPubkey = publicKey;
masterIdentities = [ masterIdentities = [
{ {
identity = ../../../secrets/yubikey-identity.pub; identity = ../../secrets/yubikey-identity.pub;
} }
]; ];
extraEncryptionPubkeys = [ extraEncryptionPubkeys = [

View file

@ -5,21 +5,23 @@
lib, lib,
... ...
}: let }: let
# Load all public keys from ../../../secrets/hosts/*/id_ed25519.pub # Load all public keys from ../../secrets/hosts/*/id_ed25519.pub
allHosts = lib.attrNames (lib.filterAttrs (_: type: type == "directory") (builtins.readDir ../../../secrets/hosts)); allHosts = lib.attrNames (lib.filterAttrs (_: type: type == "directory") (builtins.readDir ../../secrets/hosts));
publicKeys = map (x: builtins.readFile (../../../secrets/hosts + ("/" + x) + "/id_ed25519.pub")) allHosts; publicKeys = map (x: builtins.readFile (../../secrets/hosts + ("/" + x) + "/id_ed25519.pub")) allHosts;
in { in {
age.secrets.ssh-key = { age.secrets.ssh-key = {
rekeyFile = ../../../secrets/hosts + ("/" + hostname) + /id_ed25519.age; rekeyFile = ../../secrets/hosts + ("/" + hostname) + /id_ed25519.age;
path = "/home/" + username + "/.ssh/id_ed25519";
mode = "0600"; mode = "0600";
owner = username; owner = username;
}; };
age.secrets.ssh-key-ao = { age.secrets.ssh-key-ao = {
rekeyFile = ../../../secrets/ssh-key-ao.age; rekeyFile = ../../secrets/ssh-key-ao.age;
mode = "0600"; mode = "0600";
owner = username; owner = username;
}; };
fireproof.home-manager = { fireproof.home-manager = {
home.file.".ssh/id_ed25519.pub".source = ../../secrets/hosts + ("/" + hostname) + "/id_ed25519.pub";
programs.ssh = { programs.ssh = {
enable = true; enable = true;
forwardAgent = true; forwardAgent = true;

View file

@ -14,7 +14,7 @@ in {
}; };
}; };
config = { config = {
age.secrets.hashed-user-password.rekeyFile = ../../../secrets/hashed-user-password.age; age.secrets.hashed-user-password.rekeyFile = ../../secrets/hashed-user-password.age;
users.users.${username} = { users.users.${username} = {
isNormalUser = true; isNormalUser = true;

View file

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 316 B

After

Width:  |  Height:  |  Size: 316 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 311 B

After

Width:  |  Height:  |  Size: 311 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 340 B

After

Width:  |  Height:  |  Size: 340 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 784 B

After

Width:  |  Height:  |  Size: 784 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 382 B

After

Width:  |  Height:  |  Size: 382 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 999 B

After

Width:  |  Height:  |  Size: 999 B

Before After
Before After

View file

@ -1,10 +1,13 @@
{ {pkgs, ...}: {
pkgs,
...
}: {
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
nautilus nautilus
gnome-photos
evince
nautilus-open-any-terminal
sushi
]; ];
services.gvfs.enable = true;
programs.dconf.enable = true;
fireproof.home-manager = { fireproof.home-manager = {
home.pointerCursor = { home.pointerCursor = {
@ -21,8 +24,15 @@
package = pkgs.adw-gtk3; package = pkgs.adw-gtk3;
}; };
gtk4.extraCss = builtins.readFile ./theme.css; gtk3.extraConfig = {gtk-application-prefer-dark-theme = true;};
gtk3.extraCss = builtins.readFile ./theme.css; gtk3.extraCss = builtins.readFile ./theme.css;
gtk4.extraConfig = {gtk-application-prefer-dark-theme = true;};
gtk4.extraCss = builtins.readFile ./theme.css;
};
dconf = {
enable = true;
settings."org/gnome/desktop/interface".color-scheme = "prefer-dark";
}; };
}; };
} }

View file

@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="900">
<g>
<path fill="#1C1B1A" d="M0 0h1600v900H0z"/>
<path fill="#cf6a4c" d="M400,350 L200,550 L1200,550 L1400,350"/>
<path fill="#b14d2f" d="M350,400 L200,550 L1200,550 L1350,400"/>
<path fill="#a1462b" d="M300,450 L200,550 L1200,550 L1300,450"/>
<path fill="#71311e" d="M250,500 L200,550 L1200,550 L1250,500"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 410 B

View file

@ -11,8 +11,6 @@ with lib; let
then (builtins.elemAt config.monitors 0).name then (builtins.elemAt config.monitors 0).name
else ""; else "";
mkKeyboard = name: { mkKeyboard = name: {
inherit name; inherit name;
kb_layout = "eu"; kb_layout = "eu";
@ -20,6 +18,7 @@ with lib; let
in { in {
imports = [ imports = [
./hyprpolkitagent.nix ./hyprpolkitagent.nix
./hyprpaper.nix
]; ];
config = { config = {
@ -79,6 +78,8 @@ in {
) )
config.monitors; config.monitors;
exec = ["systemctl --user start hyprpaper"];
input = { input = {
# Most unknown keyboards will be of the DK layout, we set known keyboards to eu in `devices` # Most unknown keyboards will be of the DK layout, we set known keyboards to eu in `devices`
kb_layout = "dk"; kb_layout = "dk";

Some files were not shown because too many files have changed in this diff Show more