diff options
| author | vin <vin@vineetk.net> | 2025-10-03 21:55:19 -0400 |
|---|---|---|
| committer | vin <vin@vineetk.net> | 2025-10-03 21:59:16 -0400 |
| commit | b978d3406df70995fbbbedad5101450f5a5c4fdb (patch) | |
| tree | c57fd954455ce771e714c3aaaa71bb58c957df12 | |
| parent | d52dba106ba98dc9bd8e04d289050122e3e3b690 (diff) | |
modularize more
| -rw-r--r-- | flake.lock | 16 | ||||
| -rw-r--r-- | hosts/demiurge/default.nix | 335 | ||||
| -rw-r--r-- | modules/common.nix | 199 | ||||
| -rw-r--r-- | modules/desktop.nix | 129 |
4 files changed, 358 insertions, 321 deletions
| @@ -163,11 +163,11 @@ | |||
| 163 | ] | 163 | ] |
| 164 | }, | 164 | }, |
| 165 | "locked": { | 165 | "locked": { |
| 166 | "lastModified": 1759043321, | 166 | "lastModified": 1759536080, |
| 167 | "narHash": "sha256-Efi3THvsIS6Qd97s52/PSSHWybDlSbtUZXP8l3AR9Ps=", | 167 | "narHash": "sha256-0aXlKPxm2M+F5oywX2TTbY0e6h+tQ+6OYyx7UZn3A4A=", |
| 168 | "owner": "nix-community", | 168 | "owner": "nix-community", |
| 169 | "repo": "home-manager", | 169 | "repo": "home-manager", |
| 170 | "rev": "c75fd8e300b79502b8eecdacd8a426b12fadb460", | 170 | "rev": "edafd6da1936426708f1be0b1a4288007f16639a", |
| 171 | "type": "github" | 171 | "type": "github" |
| 172 | }, | 172 | }, |
| 173 | "original": { | 173 | "original": { |
| @@ -184,8 +184,8 @@ | |||
| 184 | ] | 184 | ] |
| 185 | }, | 185 | }, |
| 186 | "locked": { | 186 | "locked": { |
| 187 | "lastModified": 1759087372, | 187 | "lastModified": 1759197167, |
| 188 | "narHash": "sha256-AKIAHHbLn4Jrz0qeeKtO1cP/+e31Uok1NBPQMgh4lU0=", | 188 | "narHash": "sha256-AwyoFll5dXyxLtipAdfthKSPKaL0nifDEhAKQ8baV1c=", |
| 189 | "path": "/data/src/clones/llm/llama.cpp", | 189 | "path": "/data/src/clones/llm/llama.cpp", |
| 190 | "type": "path" | 190 | "type": "path" |
| 191 | }, | 191 | }, |
| @@ -211,11 +211,11 @@ | |||
| 211 | }, | 211 | }, |
| 212 | "nixpkgs": { | 212 | "nixpkgs": { |
| 213 | "locked": { | 213 | "locked": { |
| 214 | "lastModified": 1758690382, | 214 | "lastModified": 1759381078, |
| 215 | "narHash": "sha256-NY3kSorgqE5LMm1LqNwGne3ZLMF2/ILgLpFr1fS4X3o=", | 215 | "narHash": "sha256-gTrEEp5gEspIcCOx9PD8kMaF1iEmfBcTbO0Jag2QhQs=", |
| 216 | "owner": "nixos", | 216 | "owner": "nixos", |
| 217 | "repo": "nixpkgs", | 217 | "repo": "nixpkgs", |
| 218 | "rev": "e643668fd71b949c53f8626614b21ff71a07379d", | 218 | "rev": "7df7ff7d8e00218376575f0acdcc5d66741351ee", |
| 219 | "type": "github" | 219 | "type": "github" |
| 220 | }, | 220 | }, |
| 221 | "original": { | 221 | "original": { |
diff --git a/hosts/demiurge/default.nix b/hosts/demiurge/default.nix index 749191a..75885e3 100644 --- a/hosts/demiurge/default.nix +++ b/hosts/demiurge/default.nix | |||
| @@ -11,6 +11,8 @@ | |||
| 11 | { | 11 | { |
| 12 | imports = [ | 12 | imports = [ |
| 13 | ./hardware.nix | 13 | ./hardware.nix |
| 14 | ../../modules/common.nix | ||
| 15 | ../../modules/desktop.nix | ||
| 14 | home-manager.nixosModules.default | 16 | home-manager.nixosModules.default |
| 15 | ]; | 17 | ]; |
| 16 | 18 | ||
| @@ -63,39 +65,16 @@ | |||
| 63 | }; | 65 | }; |
| 64 | 66 | ||
| 65 | # boot options | 67 | # boot options |
| 66 | boot = { | 68 | boot.zfs.extraPools = [ |
| 67 | kernel.sysctl = { | 69 | "data_nvme" |
| 68 | "net.ipv4.ip_forward" = true; | 70 | "data_wd" |
| 69 | "net.ipv6.conf.all.forwarding" = true; | 71 | ]; |
| 70 | }; | ||
| 71 | |||
| 72 | kernelPackages = pkgs.linuxPackages_6_12; | ||
| 73 | |||
| 74 | loader = { | ||
| 75 | systemd-boot.enable = true; | ||
| 76 | efi.canTouchEfiVariables = true; | ||
| 77 | }; | ||
| 78 | |||
| 79 | supportedFilesystems = [ "zfs" ]; | ||
| 80 | |||
| 81 | zfs = { | ||
| 82 | devNodes = "/dev/disk/by-partuuid"; | ||
| 83 | extraPools = [ | ||
| 84 | "data_nvme" | ||
| 85 | "data_wd" | ||
| 86 | ]; | ||
| 87 | forceImportRoot = false; | ||
| 88 | }; | ||
| 89 | }; | ||
| 90 | 72 | ||
| 91 | # disable wifi and open some ports | 73 | # disable wifi and open some ports |
| 92 | networking = { | 74 | networking = { |
| 93 | hostName = "demiurge"; | 75 | hostName = "demiurge"; |
| 94 | hostId = "cafebabe"; | 76 | hostId = "cafebabe"; |
| 95 | 77 | ||
| 96 | # I like my ethX/wlanX names | ||
| 97 | usePredictableInterfaceNames = false; | ||
| 98 | |||
| 99 | wireless.enable = false; | 78 | wireless.enable = false; |
| 100 | 79 | ||
| 101 | firewall = { | 80 | firewall = { |
| @@ -151,216 +130,29 @@ | |||
| 151 | }; | 130 | }; |
| 152 | }; | 131 | }; |
| 153 | 132 | ||
| 154 | # Set your time zone. | ||
| 155 | time.timeZone = "America/Toronto"; | ||
| 156 | |||
| 157 | # Select internationalisation properties. | ||
| 158 | i18n.defaultLocale = "en_US.UTF-8"; | ||
| 159 | console = { | ||
| 160 | font = "Lat2-Terminus16"; | ||
| 161 | }; | ||
| 162 | |||
| 163 | # enable flakes and nix cli | ||
| 164 | nix.settings.experimental-features = [ | ||
| 165 | "nix-command" | ||
| 166 | "flakes" | ||
| 167 | ]; | ||
| 168 | |||
| 169 | # Define a user account. | ||
| 170 | users.users = { | 133 | users.users = { |
| 171 | vin = { | 134 | vin.packages = with pkgs; [ |
| 172 | isNormalUser = true; | 135 | alvr |
| 173 | 136 | bs-manager | |
| 174 | extraGroups = [ | 137 | (llama-cpp.packages.x86_64-linux.rocm.override { |
| 175 | "transmission" | 138 | useMetalKit = false; |
| 176 | "wheel" | 139 | useVulkan = true; |
| 177 | ]; | 140 | }) |
| 178 | 141 | #(vllm.override { cudaSupport = false; rocmSupport = true; gpuTargets = [ "gfx906" "gfx1100" ]; }) | |
| 179 | shell = pkgs.zsh; | 142 | ]; |
| 180 | |||
| 181 | openssh.authorizedKeys.keys = [ | ||
| 182 | "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEvM0xCLziR+ZT/SYE1aZM6dklbw4fEC17TWqbADIZRH vin@demiurge" | ||
| 183 | ]; | ||
| 184 | |||
| 185 | packages = with pkgs; [ | ||
| 186 | alvr | ||
| 187 | bs-manager | ||
| 188 | (llama-cpp.packages.x86_64-linux.rocm.override { | ||
| 189 | useMetalKit = false; | ||
| 190 | useVulkan = true; | ||
| 191 | }) | ||
| 192 | #(vllm.override { cudaSupport = false; rocmSupport = true; gpuTargets = [ "gfx906" "gfx1100" ]; }) | ||
| 193 | ]; | ||
| 194 | }; | ||
| 195 | 143 | ||
| 196 | radarr.extraGroups = [ "transmission" ]; | 144 | radarr.extraGroups = [ "transmission" ]; |
| 197 | sonarr.extraGroups = [ "transmission" ]; | 145 | sonarr.extraGroups = [ "transmission" ]; |
| 198 | }; | 146 | }; |
| 199 | 147 | ||
| 200 | # default packages for both me and root | ||
| 201 | environment = { | ||
| 202 | systemPackages = with pkgs; [ | ||
| 203 | doas-sudo-shim | ||
| 204 | git | ||
| 205 | wget | ||
| 206 | ]; | ||
| 207 | |||
| 208 | pathsToLink = [ "/share/zsh" ]; | ||
| 209 | }; | ||
| 210 | |||
| 211 | # enable bluetooth and add some udev rules | ||
| 212 | hardware = { | ||
| 213 | bluetooth.enable = true; | ||
| 214 | flipperzero.enable = true; | ||
| 215 | keyboard.qmk.enable = true; | ||
| 216 | }; | ||
| 217 | |||
| 218 | programs = { | ||
| 219 | # for gtk in home-manager | ||
| 220 | dconf.enable = true; | ||
| 221 | |||
| 222 | # gpg | ||
| 223 | gnupg.agent = { | ||
| 224 | enable = true; | ||
| 225 | enableSSHSupport = false; | ||
| 226 | pinentryPackage = pkgs.pinentry-rofi; | ||
| 227 | settings.default-cache-ttl = 600; | ||
| 228 | }; | ||
| 229 | |||
| 230 | # disable nano. I don't like nano. | ||
| 231 | nano.enable = false; | ||
| 232 | |||
| 233 | # steam, proprietary. I sometimes like playing nonfree games too. | ||
| 234 | steam.enable = true; | ||
| 235 | |||
| 236 | # configuration in home-manager | ||
| 237 | zsh.enable = true; | ||
| 238 | zsh.promptInit = "PS1='$ '"; | ||
| 239 | }; | ||
| 240 | |||
| 241 | security = { | ||
| 242 | # I prefer doas over sudo for simplicity | ||
| 243 | doas = { | ||
| 244 | enable = true; | ||
| 245 | extraRules = [ | ||
| 246 | { | ||
| 247 | users = [ "vin" ]; | ||
| 248 | keepEnv = true; | ||
| 249 | persist = true; | ||
| 250 | } | ||
| 251 | ]; | ||
| 252 | }; | ||
| 253 | sudo.enable = false; | ||
| 254 | |||
| 255 | # needed to give realtime privileges to pipewire | ||
| 256 | rtkit.enable = true; | ||
| 257 | |||
| 258 | # trust certificate for *.demiurge.epistemia | ||
| 259 | pki.certificates = [ | ||
| 260 | '' | ||
| 261 | -----BEGIN CERTIFICATE----- | ||
| 262 | MIIELzCCApegAwIBAgIRANnOZgETCYAX7+HrLIGpk5AwDQYJKoZIhvcNAQELBQAw | ||
| 263 | ezEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMSgwJgYDVQQLDB92aW5A | ||
| 264 | ZGVtaXVyZ2UuZXBpc3RlbWlhIChWaW5lZXQpMS8wLQYDVQQDDCZta2NlcnQgdmlu | ||
| 265 | QGRlbWl1cmdlLmVwaXN0ZW1pYSAoVmluZWV0KTAeFw0yNTA5MjEyMzE4MDFaFw0y | ||
| 266 | NzEyMjIwMDE4MDFaMEAxJzAlBgNVBAoTHm1rY2VydCBkZXZlbG9wbWVudCBjZXJ0 | ||
| 267 | aWZpY2F0ZTEVMBMGA1UECwwMdmluQGRlbWl1cmdlMIIBIjANBgkqhkiG9w0BAQEF | ||
| 268 | AAOCAQ8AMIIBCgKCAQEA7RhsOzlGqpgKVV02WFoT0bIeqUNQ5d6MFl+w9TsKSy7G | ||
| 269 | yhWMOjUMchm5oco33QMwmzUpejqFuRtGIm9Gj1IoPKgK4hb+UVzJb1ZwevhWyQzr | ||
| 270 | al7rg2beb9dBYNXlZhpYjzLrom6FS/QrEEudjsrVwR5DdvYb+NeirXqWfL0NCiF8 | ||
| 271 | GtDDAQdbdmLWJBrjfEO0YbLplgEvwJphxEdDuJsjqLOEGj+Q1ZONjQMTVxZOgIRl | ||
| 272 | u5DYItMESV/Rc0elBlapOeBatp01rvcdm2hGz3TaFusR4SeIcYOMoX+P4wK6sQZM | ||
| 273 | X9fR95cHv/Vx02S90I9LMpleti8tXwBNLgoho2fsmwIDAQABo2kwZzAOBgNVHQ8B | ||
| 274 | Af8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAUwZNUYxIJ | ||
| 275 | idGGuM7Kz8ysS+8Zc4cwHwYDVR0RBBgwFoIUKi5kZW1pdXJnZS5lcGlzdGVtaWEw | ||
| 276 | DQYJKoZIhvcNAQELBQADggGBAFdUThVUJpatQtnAxB6kV2mh0vdKzwhf4Mk+Su4d | ||
| 277 | /jAwNcM3m2xjSbjU+U5QyTI99qe+zvQF5WhVik+hWqcRPBF8NkeF47pZuAmiB+Vr | ||
| 278 | jL8iWyD8x7BER0PpCAGTCusNXXg3+Ttb2gygOOk+JJqvXpMXbbhCTgc1qJD3EziL | ||
| 279 | 1hXZovZFTmdcPFV6iu+oyyMmzLQl0SIIgqIICs1F21HMNdwAWKX25NMK3YCJVuTf | ||
| 280 | ZxUfmLaqwnr5liS7aa7xZRzaee58VouUL9RtLT+JxLsg9EYV31dHJ57fNTBqzGsw | ||
| 281 | 2X03iE9+p87UHwd/7SnO5K+y7FpUu96LsAyeNnRuO2ys+3XwCVS7xjA7MwyAnfJt | ||
| 282 | i8WMWzlQbxhppK/QO/R8/rt0RcNHY9fp8ZK7qVZWF/rnTVUbw1ZmFLBDbuY9ehq9 | ||
| 283 | vgQF6lZFCIKkf7am2vqwZHVtx1R+Cgl9/+4YlLPOeMmRyI3SFaIERRiHT0SuvqzF | ||
| 284 | SivxomFBHWe4CLwWy/mDaC18/g== | ||
| 285 | -----END CERTIFICATE----- | ||
| 286 | '' | ||
| 287 | ]; | ||
| 288 | }; | ||
| 289 | |||
| 290 | services = { | 148 | services = { |
| 291 | # dns | ||
| 292 | unbound = { | ||
| 293 | enable = true; | ||
| 294 | settings = { | ||
| 295 | server = { | ||
| 296 | interface = [ | ||
| 297 | "127.0.0.1" | ||
| 298 | "100.64.0.2" | ||
| 299 | #"fd00:b0ba:cafe:babe::2" | ||
| 300 | "::1" | ||
| 301 | ]; | ||
| 302 | access-control = [ | ||
| 303 | "0.0.0.0/0 allow" | ||
| 304 | "::0/0 allow" | ||
| 305 | ]; | ||
| 306 | |||
| 307 | hide-identity = true; | ||
| 308 | hide-version = true; | ||
| 309 | |||
| 310 | # Synthesize NXDOMAINs from DNSSEC NSEC chains. | ||
| 311 | # https://tools.ietf.org/html/rfc8198 | ||
| 312 | aggressive-nsec = false; | ||
| 313 | |||
| 314 | module-config = "\"respip validator iterator\""; | ||
| 315 | |||
| 316 | local-data = [ | ||
| 317 | "\"saklas.epistemia. 86400 IN A 100.64.0.1\"" | ||
| 318 | "\"demiurge.epistemia. 86400 IN A 100.64.0.2\"" | ||
| 319 | "\"hastur.epistemia. 86400 IN A 100.64.0.3\"" | ||
| 320 | "\"iphonebob.epistemia. 86400 IN A 100.64.0.4\"" | ||
| 321 | "\"lab.epistemia. 86400 IN A 100.64.0.5\"" | ||
| 322 | ]; | ||
| 323 | |||
| 324 | local-zone = [ | ||
| 325 | "\"saklas.epistemia.\" redirect" | ||
| 326 | "\"demiurge.epistemia.\" redirect" | ||
| 327 | "\"hastur.epistemia.\" redirect" | ||
| 328 | "\"iphonebob.epistemia.\" redirect" | ||
| 329 | "\"lab.epistemia.\" redirect" | ||
| 330 | ]; | ||
| 331 | }; | ||
| 332 | |||
| 333 | # hagezi for dns-based adblocking (in addition to others) | ||
| 334 | rpz = { | ||
| 335 | name = "hagezi.ultimate"; | ||
| 336 | zonefile = "hagezi.ultimate"; | ||
| 337 | url = "https://raw.githubusercontent.com/hagezi/dns-blocklists/main/rpz/ultimate.txt"; | ||
| 338 | }; | ||
| 339 | |||
| 340 | # go through mullvad for regular dns queries | ||
| 341 | forward-zone = { | ||
| 342 | name = "."; | ||
| 343 | forward-addr = [ "194.242.2.2" ]; | ||
| 344 | }; | ||
| 345 | }; | ||
| 346 | }; | ||
| 347 | |||
| 348 | # vpn | 149 | # vpn |
| 150 | # TODO replace with wireguard again | ||
| 349 | tailscale = { | 151 | tailscale = { |
| 350 | enable = true; | ||
| 351 | authKeyFile = config.age.secrets.tailscale_demiurge.path; | 152 | authKeyFile = config.age.secrets.tailscale_demiurge.path; |
| 352 | disableTaildrop = true; | ||
| 353 | disableUpstreamLogging = true; | ||
| 354 | extraSetFlags = [ "--advertise-exit-node" ]; | 153 | extraSetFlags = [ "--advertise-exit-node" ]; |
| 355 | #extraUpFlags = [ "--login-server=https://headscale.13f0.net" ]; | ||
| 356 | extraUpFlags = [ "--login-server=https://controlplane.tailscale.com" ]; | ||
| 357 | openFirewall = true; | ||
| 358 | useRoutingFeatures = "both"; | ||
| 359 | }; | 154 | }; |
| 360 | 155 | ||
| 361 | # automatically scrub zfs pools (every week by default) | ||
| 362 | zfs.autoScrub.enable = true; | ||
| 363 | |||
| 364 | # media server | 156 | # media server |
| 365 | jellyfin = { | 157 | jellyfin = { |
| 366 | enable = true; | 158 | enable = true; |
| @@ -402,19 +194,6 @@ | |||
| 402 | }; | 194 | }; |
| 403 | }; | 195 | }; |
| 404 | 196 | ||
| 405 | # graphical input | ||
| 406 | libinput = { | ||
| 407 | enable = true; | ||
| 408 | |||
| 409 | mouse.accelProfile = "flat"; | ||
| 410 | |||
| 411 | touchpad = { | ||
| 412 | accelProfile = "flat"; | ||
| 413 | tapping = true; | ||
| 414 | tappingButtonMap = "lrm"; | ||
| 415 | }; | ||
| 416 | }; | ||
| 417 | |||
| 418 | # music streaming to phone | 197 | # music streaming to phone |
| 419 | navidrome = { | 198 | navidrome = { |
| 420 | enable = true; | 199 | enable = true; |
| @@ -484,22 +263,11 @@ | |||
| 484 | }; | 263 | }; |
| 485 | 264 | ||
| 486 | # ssh | 265 | # ssh |
| 487 | openssh = { | 266 | openssh.listenAddresses = [ |
| 488 | enable = true; | 267 | { addr = "127.0.0.1"; port = 22; } |
| 489 | 268 | { addr = "192.168.1.2"; port = 22; } | |
| 490 | listenAddresses = [ | 269 | { addr = "100.64.0.2"; port = 22; } |
| 491 | { addr = "127.0.0.1"; port = 22; } | 270 | ]; |
| 492 | { addr = "192.168.1.2"; port = 22; } | ||
| 493 | { addr = "100.64.0.2"; port = 22; } | ||
| 494 | ]; | ||
| 495 | |||
| 496 | settings = { | ||
| 497 | KbdInteractiveAuthentication = false; | ||
| 498 | PasswordAuthentication = true; | ||
| 499 | PermitRootLogin = "no"; | ||
| 500 | X11Forwarding = true; | ||
| 501 | }; | ||
| 502 | }; | ||
| 503 | 271 | ||
| 504 | # llm | 272 | # llm |
| 505 | open-webui = { | 273 | open-webui = { |
| @@ -511,44 +279,6 @@ | |||
| 511 | port = 8083; | 279 | port = 8083; |
| 512 | }; | 280 | }; |
| 513 | 281 | ||
| 514 | # for yubikey | ||
| 515 | pcscd.enable = true; | ||
| 516 | |||
| 517 | # sound. for some reason, pipewire enabled itself when I tried | ||
| 518 | # using pulseaudio and home-manager, so had to disable pulseaudio. | ||
| 519 | pipewire = { | ||
| 520 | enable = true; | ||
| 521 | alsa.enable = true; | ||
| 522 | audio.enable = true; | ||
| 523 | pulse.enable = true; | ||
| 524 | wireplumber = { | ||
| 525 | enable = true; | ||
| 526 | extraConfig = { | ||
| 527 | "51-set-default-eq.conf" = { | ||
| 528 | text = '' | ||
| 529 | monitor.rules = [ | ||
| 530 | { | ||
| 531 | matches = [ | ||
| 532 | { | ||
| 533 | # This rule matches the node with the name of your sink (node 35) | ||
| 534 | "node.name" = "effect_input.eq6" | ||
| 535 | } | ||
| 536 | ] | ||
| 537 | actions = { | ||
| 538 | update-props = { | ||
| 539 | # This sets a very high priority, making it the default. | ||
| 540 | # Standard hardware is usually around 1000. | ||
| 541 | "priority.session" = 2001 | ||
| 542 | } | ||
| 543 | } | ||
| 544 | } | ||
| 545 | ] | ||
| 546 | ''; | ||
| 547 | }; | ||
| 548 | }; | ||
| 549 | }; | ||
| 550 | }; | ||
| 551 | |||
| 552 | 282 | ||
| 553 | redlib = { | 283 | redlib = { |
| 554 | enable = true; | 284 | enable = true; |
| @@ -1023,31 +753,10 @@ | |||
| 1023 | GROUP="input", SYMLINK+="ocuquest%n" | 753 | GROUP="input", SYMLINK+="ocuquest%n" |
| 1024 | ''; | 754 | ''; |
| 1025 | }; | 755 | }; |
| 1026 | |||
| 1027 | # to get startx and use amdgpu driver | ||
| 1028 | # WM in home-manager | ||
| 1029 | xserver = { | ||
| 1030 | enable = true; | ||
| 1031 | autorun = false; | ||
| 1032 | displayManager.startx.enable = true; | ||
| 1033 | modules = [ pkgs.xf86_input_wacom ]; | ||
| 1034 | videoDrivers = [ "amdgpu" ]; | ||
| 1035 | wacom.enable = true; | ||
| 1036 | }; | ||
| 1037 | }; | 756 | }; |
| 1038 | 757 | ||
| 1039 | # extra systemd stuff | 758 | # extra systemd stuff |
| 1040 | systemd.services = { | 759 | systemd.services.nginx.after = [ "tailscaled-autoconnect.service" ]; |
| 1041 | nginx.after = [ "tailscaled-autoconnect.service" ]; | ||
| 1042 | }; | ||
| 1043 | |||
| 1044 | # create caches and use mandoc | ||
| 1045 | documentation.man = { | ||
| 1046 | enable = true; | ||
| 1047 | generateCaches = true; | ||
| 1048 | man-db.enable = false; | ||
| 1049 | mandoc.enable = true; | ||
| 1050 | }; | ||
| 1051 | 760 | ||
| 1052 | system.stateVersion = "24.05"; | 761 | system.stateVersion = "24.05"; |
| 1053 | } | 762 | } |
diff --git a/modules/common.nix b/modules/common.nix new file mode 100644 index 0000000..d613bf8 --- /dev/null +++ b/modules/common.nix | |||
| @@ -0,0 +1,199 @@ | |||
| 1 | { pkgs, ... }: { | ||
| 2 | # Set your time zone. | ||
| 3 | time.timeZone = "America/Toronto"; | ||
| 4 | |||
| 5 | # Select internationalisation properties. | ||
| 6 | i18n.defaultLocale = "en_US.UTF-8"; | ||
| 7 | console = { | ||
| 8 | font = "Lat2-Terminus16"; | ||
| 9 | }; | ||
| 10 | |||
| 11 | # enable flakes and nix cli | ||
| 12 | nix.settings.experimental-features = [ | ||
| 13 | "nix-command" | ||
| 14 | "flakes" | ||
| 15 | ]; | ||
| 16 | |||
| 17 | # I like my ethX/wlanX names | ||
| 18 | networking.usePredictableInterfaceNames = false; | ||
| 19 | |||
| 20 | |||
| 21 | # use local dns on each host | ||
| 22 | services.unbound = { | ||
| 23 | enable = true; | ||
| 24 | settings = { | ||
| 25 | server = { | ||
| 26 | interface = [ | ||
| 27 | "127.0.0.1" | ||
| 28 | "100.64.0.2" | ||
| 29 | #"fd00:b0ba:cafe:babe::2" | ||
| 30 | "::1" | ||
| 31 | ]; | ||
| 32 | access-control = [ | ||
| 33 | "0.0.0.0/0 allow" | ||
| 34 | "::0/0 allow" | ||
| 35 | ]; | ||
| 36 | |||
| 37 | hide-identity = true; | ||
| 38 | hide-version = true; | ||
| 39 | |||
| 40 | # Synthesize NXDOMAINs from DNSSEC NSEC chains. | ||
| 41 | # https://tools.ietf.org/html/rfc8198 | ||
| 42 | aggressive-nsec = false; | ||
| 43 | |||
| 44 | module-config = "\"respip validator iterator\""; | ||
| 45 | |||
| 46 | local-data = [ | ||
| 47 | "\"saklas.epistemia. 86400 IN A 100.64.0.1\"" | ||
| 48 | "\"demiurge.epistemia. 86400 IN A 100.64.0.2\"" | ||
| 49 | "\"hastur.epistemia. 86400 IN A 100.64.0.3\"" | ||
| 50 | "\"iphonebob.epistemia. 86400 IN A 100.64.0.4\"" | ||
| 51 | "\"lab.epistemia. 86400 IN A 100.64.0.5\"" | ||
| 52 | ]; | ||
| 53 | |||
| 54 | local-zone = [ | ||
| 55 | "\"saklas.epistemia.\" redirect" | ||
| 56 | "\"demiurge.epistemia.\" redirect" | ||
| 57 | "\"hastur.epistemia.\" redirect" | ||
| 58 | "\"iphonebob.epistemia.\" redirect" | ||
| 59 | "\"lab.epistemia.\" redirect" | ||
| 60 | ]; | ||
| 61 | }; | ||
| 62 | |||
| 63 | # hagezi for dns-based adblocking (in addition to others) | ||
| 64 | rpz = { | ||
| 65 | name = "hagezi.ultimate"; | ||
| 66 | zonefile = "hagezi.ultimate"; | ||
| 67 | url = "https://raw.githubusercontent.com/hagezi/dns-blocklists/main/rpz/ultimate.txt"; | ||
| 68 | }; | ||
| 69 | |||
| 70 | # go through mullvad for regular dns queries | ||
| 71 | forward-zone = { | ||
| 72 | name = "."; | ||
| 73 | forward-addr = [ "194.242.2.2" ]; | ||
| 74 | }; | ||
| 75 | }; | ||
| 76 | }; | ||
| 77 | environment.etc."resolv.conf".text = '' | ||
| 78 | nameserver 127.0.0.1 | ||
| 79 | search epistemia | ||
| 80 | ''; | ||
| 81 | |||
| 82 | # Define a user account. | ||
| 83 | users = { | ||
| 84 | groups.vin = {}; | ||
| 85 | users.vin = { | ||
| 86 | isNormalUser = true; | ||
| 87 | |||
| 88 | group = "vin"; | ||
| 89 | extraGroups = [ | ||
| 90 | "transmission" | ||
| 91 | "wheel" | ||
| 92 | ]; | ||
| 93 | |||
| 94 | shell = pkgs.zsh; | ||
| 95 | |||
| 96 | openssh.authorizedKeys.keys = [ | ||
| 97 | "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEvM0xCLziR+ZT/SYE1aZM6dklbw4fEC17TWqbADIZRH vin@demiurge" | ||
| 98 | ]; | ||
| 99 | }; | ||
| 100 | }; | ||
| 101 | |||
| 102 | # default packages for both me and root | ||
| 103 | environment = { | ||
| 104 | systemPackages = with pkgs; [ | ||
| 105 | doas-sudo-shim | ||
| 106 | git | ||
| 107 | wget | ||
| 108 | ]; | ||
| 109 | |||
| 110 | pathsToLink = [ "/share/zsh" ]; | ||
| 111 | }; | ||
| 112 | |||
| 113 | # enable bluetooth and add some udev rules | ||
| 114 | hardware = { | ||
| 115 | bluetooth.enable = true; | ||
| 116 | flipperzero.enable = true; | ||
| 117 | keyboard.qmk.enable = true; | ||
| 118 | }; | ||
| 119 | |||
| 120 | programs = { | ||
| 121 | # for gtk in home-manager | ||
| 122 | dconf.enable = true; | ||
| 123 | |||
| 124 | # gpg | ||
| 125 | gnupg.agent = { | ||
| 126 | enable = true; | ||
| 127 | enableSSHSupport = false; | ||
| 128 | pinentryPackage = pkgs.pinentry-rofi; | ||
| 129 | settings.default-cache-ttl = 600; | ||
| 130 | }; | ||
| 131 | |||
| 132 | # disable nano. I don't like nano. | ||
| 133 | nano.enable = false; | ||
| 134 | |||
| 135 | # steam, proprietary. I sometimes like playing nonfree games too. | ||
| 136 | steam.enable = true; | ||
| 137 | |||
| 138 | # configuration in home-manager | ||
| 139 | zsh.enable = true; | ||
| 140 | zsh.promptInit = "PS1='$ '"; | ||
| 141 | }; | ||
| 142 | |||
| 143 | security = { | ||
| 144 | # I prefer doas over sudo for simplicity | ||
| 145 | doas = { | ||
| 146 | enable = true; | ||
| 147 | extraRules = [ | ||
| 148 | { | ||
| 149 | users = [ "vin" ]; | ||
| 150 | keepEnv = true; | ||
| 151 | persist = true; | ||
| 152 | } | ||
| 153 | ]; | ||
| 154 | }; | ||
| 155 | sudo.enable = false; | ||
| 156 | |||
| 157 | # needed to give realtime privileges to pipewire | ||
| 158 | rtkit.enable = true; | ||
| 159 | |||
| 160 | # trust certificate for *.demiurge.epistemia | ||
| 161 | pki.certificates = [ | ||
| 162 | '' | ||
| 163 | -----BEGIN CERTIFICATE----- | ||
| 164 | MIIELzCCApegAwIBAgIRANnOZgETCYAX7+HrLIGpk5AwDQYJKoZIhvcNAQELBQAw | ||
| 165 | ezEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMSgwJgYDVQQLDB92aW5A | ||
| 166 | ZGVtaXVyZ2UuZXBpc3RlbWlhIChWaW5lZXQpMS8wLQYDVQQDDCZta2NlcnQgdmlu | ||
| 167 | QGRlbWl1cmdlLmVwaXN0ZW1pYSAoVmluZWV0KTAeFw0yNTA5MjEyMzE4MDFaFw0y | ||
| 168 | NzEyMjIwMDE4MDFaMEAxJzAlBgNVBAoTHm1rY2VydCBkZXZlbG9wbWVudCBjZXJ0 | ||
| 169 | aWZpY2F0ZTEVMBMGA1UECwwMdmluQGRlbWl1cmdlMIIBIjANBgkqhkiG9w0BAQEF | ||
| 170 | AAOCAQ8AMIIBCgKCAQEA7RhsOzlGqpgKVV02WFoT0bIeqUNQ5d6MFl+w9TsKSy7G | ||
| 171 | yhWMOjUMchm5oco33QMwmzUpejqFuRtGIm9Gj1IoPKgK4hb+UVzJb1ZwevhWyQzr | ||
| 172 | al7rg2beb9dBYNXlZhpYjzLrom6FS/QrEEudjsrVwR5DdvYb+NeirXqWfL0NCiF8 | ||
| 173 | GtDDAQdbdmLWJBrjfEO0YbLplgEvwJphxEdDuJsjqLOEGj+Q1ZONjQMTVxZOgIRl | ||
| 174 | u5DYItMESV/Rc0elBlapOeBatp01rvcdm2hGz3TaFusR4SeIcYOMoX+P4wK6sQZM | ||
| 175 | X9fR95cHv/Vx02S90I9LMpleti8tXwBNLgoho2fsmwIDAQABo2kwZzAOBgNVHQ8B | ||
| 176 | Af8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAUwZNUYxIJ | ||
| 177 | idGGuM7Kz8ysS+8Zc4cwHwYDVR0RBBgwFoIUKi5kZW1pdXJnZS5lcGlzdGVtaWEw | ||
| 178 | DQYJKoZIhvcNAQELBQADggGBAFdUThVUJpatQtnAxB6kV2mh0vdKzwhf4Mk+Su4d | ||
| 179 | /jAwNcM3m2xjSbjU+U5QyTI99qe+zvQF5WhVik+hWqcRPBF8NkeF47pZuAmiB+Vr | ||
| 180 | jL8iWyD8x7BER0PpCAGTCusNXXg3+Ttb2gygOOk+JJqvXpMXbbhCTgc1qJD3EziL | ||
| 181 | 1hXZovZFTmdcPFV6iu+oyyMmzLQl0SIIgqIICs1F21HMNdwAWKX25NMK3YCJVuTf | ||
| 182 | ZxUfmLaqwnr5liS7aa7xZRzaee58VouUL9RtLT+JxLsg9EYV31dHJ57fNTBqzGsw | ||
| 183 | 2X03iE9+p87UHwd/7SnO5K+y7FpUu96LsAyeNnRuO2ys+3XwCVS7xjA7MwyAnfJt | ||
| 184 | i8WMWzlQbxhppK/QO/R8/rt0RcNHY9fp8ZK7qVZWF/rnTVUbw1ZmFLBDbuY9ehq9 | ||
| 185 | vgQF6lZFCIKkf7am2vqwZHVtx1R+Cgl9/+4YlLPOeMmRyI3SFaIERRiHT0SuvqzF | ||
| 186 | SivxomFBHWe4CLwWy/mDaC18/g== | ||
| 187 | -----END CERTIFICATE----- | ||
| 188 | '' | ||
| 189 | ]; | ||
| 190 | }; | ||
| 191 | |||
| 192 | # create caches and use mandoc | ||
| 193 | documentation.man = { | ||
| 194 | enable = true; | ||
| 195 | generateCaches = true; | ||
| 196 | man-db.enable = false; | ||
| 197 | mandoc.enable = true; | ||
| 198 | }; | ||
| 199 | } | ||
diff --git a/modules/desktop.nix b/modules/desktop.nix new file mode 100644 index 0000000..fb153e7 --- /dev/null +++ b/modules/desktop.nix | |||
| @@ -0,0 +1,129 @@ | |||
| 1 | { | ||
| 2 | config, | ||
| 3 | home-manager, | ||
| 4 | lib, | ||
| 5 | pkgs, | ||
| 6 | inputs, | ||
| 7 | llama-cpp, | ||
| 8 | ... | ||
| 9 | }: | ||
| 10 | |||
| 11 | { | ||
| 12 | imports = [ | ||
| 13 | home-manager.nixosModules.default | ||
| 14 | ]; | ||
| 15 | |||
| 16 | # boot options | ||
| 17 | boot = { | ||
| 18 | kernel.sysctl = { | ||
| 19 | "net.ipv4.ip_forward" = true; | ||
| 20 | "net.ipv6.conf.all.forwarding" = true; | ||
| 21 | }; | ||
| 22 | |||
| 23 | kernelPackages = pkgs.linuxPackages_6_16; | ||
| 24 | |||
| 25 | loader = { | ||
| 26 | systemd-boot.enable = true; | ||
| 27 | efi.canTouchEfiVariables = true; | ||
| 28 | }; | ||
| 29 | |||
| 30 | supportedFilesystems = [ "zfs" ]; | ||
| 31 | |||
| 32 | zfs = { | ||
| 33 | devNodes = "/dev/disk/by-partuuid"; | ||
| 34 | forceImportRoot = false; | ||
| 35 | }; | ||
| 36 | }; | ||
| 37 | |||
| 38 | services = { | ||
| 39 | # vpn | ||
| 40 | # TODO replace with wireguard again | ||
| 41 | tailscale = { | ||
| 42 | enable = true; | ||
| 43 | disableTaildrop = true; | ||
| 44 | disableUpstreamLogging = true; | ||
| 45 | extraUpFlags = [ "--login-server=https://controlplane.tailscale.com" ]; | ||
| 46 | openFirewall = true; | ||
| 47 | useRoutingFeatures = "both"; | ||
| 48 | }; | ||
| 49 | |||
| 50 | # automatically scrub zfs pools (every week by default) | ||
| 51 | zfs.autoScrub.enable = true; | ||
| 52 | |||
| 53 | # graphical input | ||
| 54 | libinput = { | ||
| 55 | enable = true; | ||
| 56 | |||
| 57 | mouse.accelProfile = "flat"; | ||
| 58 | |||
| 59 | touchpad = { | ||
| 60 | accelProfile = "flat"; | ||
| 61 | tapping = true; | ||
| 62 | tappingButtonMap = "lrm"; | ||
| 63 | }; | ||
| 64 | }; | ||
| 65 | |||
| 66 | # ssh | ||
| 67 | openssh = { | ||
| 68 | enable = true; | ||
| 69 | |||
| 70 | settings = { | ||
| 71 | KbdInteractiveAuthentication = false; | ||
| 72 | PasswordAuthentication = true; | ||
| 73 | PermitRootLogin = "no"; | ||
| 74 | X11Forwarding = true; | ||
| 75 | }; | ||
| 76 | }; | ||
| 77 | |||
| 78 | # for yubikey | ||
| 79 | pcscd.enable = true; | ||
| 80 | |||
| 81 | # sound. for some reason, pipewire enabled itself when I tried | ||
| 82 | # using pulseaudio and home-manager, so had to disable pulseaudio. | ||
| 83 | pipewire = { | ||
| 84 | enable = true; | ||
| 85 | alsa.enable = true; | ||
| 86 | audio.enable = true; | ||
| 87 | pulse.enable = true; | ||
| 88 | wireplumber = { | ||
| 89 | enable = true; | ||
| 90 | extraConfig = { | ||
| 91 | "51-set-default-eq.conf" = { | ||
| 92 | text = '' | ||
| 93 | monitor.rules = [ | ||
| 94 | { | ||
| 95 | matches = [ | ||
| 96 | { | ||
| 97 | # This rule matches the node with the name of your sink (node 35) | ||
| 98 | "node.name" = "effect_input.eq6" | ||
| 99 | } | ||
| 100 | ] | ||
| 101 | actions = { | ||
| 102 | update-props = { | ||
| 103 | # This sets a very high priority, making it the default. | ||
| 104 | # Standard hardware is usually around 1000. | ||
| 105 | "priority.session" = 2001 | ||
| 106 | } | ||
| 107 | } | ||
| 108 | } | ||
| 109 | ] | ||
| 110 | ''; | ||
| 111 | }; | ||
| 112 | }; | ||
| 113 | }; | ||
| 114 | }; | ||
| 115 | |||
| 116 | # to get startx and use amdgpu driver | ||
| 117 | # WM in home-manager | ||
| 118 | xserver = { | ||
| 119 | enable = true; | ||
| 120 | autorun = false; | ||
| 121 | displayManager.startx.enable = true; | ||
| 122 | modules = [ pkgs.xf86_input_wacom ]; | ||
| 123 | wacom.enable = true; | ||
| 124 | }; | ||
| 125 | }; | ||
| 126 | |||
| 127 | # extra systemd stuff | ||
| 128 | systemd.services.sshd.after = [ "tailscaled-autoconnect.service" ]; | ||
| 129 | } | ||
