From 21f6f379112f5d5e8ddee2ffe6f5bd6f04456586 Mon Sep 17 00:00:00 2001 From: Chris Kruining Date: Wed, 23 Jul 2025 16:12:13 +0200 Subject: [PATCH] made some progress --- flake.lock | 95 ++++++++++- flake.nix | 59 ++----- homes/user-configurations/chris.nix | 6 + homes/x86_64-linux/chris@manwe/default.nix | 11 ++ modules/home/desktop/plasma/default.nix | 73 +++++++++ modules/home/desktop/plasma/panels.nix | 122 ++++++++++++++ modules/home/desktop/plasma/power.nix | 50 ++++++ modules/nixos/boot/default.nix | 81 ++++++++++ modules/nixos/default.nix | 42 +++++ modules/nixos/desktop/default.nix | 37 +++++ modules/nixos/desktop/gamescope/default.nix | 27 ++++ modules/nixos/desktop/gnome/default.nix | 14 ++ modules/nixos/desktop/plasma/default.nix | 30 ++++ modules/nixos/hardware/audio/default.nix | 30 ++++ modules/nixos/hardware/bluetooth/default.nix | 25 +++ modules/nixos/hardware/gpu/amd.nix | 29 ++++ modules/nixos/hardware/gpu/nvidia.nix | 31 ++++ modules/nixos/nix/default.nix | 42 +++++ modules/nixos/services/media/default.nix | 153 ++++++++++++++++++ .../x86_64-linux}/aule/README.md | 0 .../x86_64-linux}/manwe/README.md | 0 systems/x86_64-linux/manwe/default.nix | 20 +++ systems/x86_64-linux/manwe/disks.nix | 42 +++++ systems/x86_64-linux/manwe/hardware.nix | 18 +++ .../x86_64-linux}/orome/README.md | 0 systems/x86_64-linux/orome/default.nix | 17 ++ systems/x86_64-linux/orome/disks.nix | 23 +++ systems/x86_64-linux/orome/hardware.nix | 18 +++ .../x86_64-linux}/tulkas/README.md | 0 systems/x86_64-linux/tulkas/default.nix | 16 ++ systems/x86_64-linux/tulkas/disks.nix | 23 +++ systems/x86_64-linux/tulkas/hardware.nix | 18 +++ systems/x86_64-linux/ulmo/default.nix | 19 +++ systems/x86_64-linux/ulmo/disks.nix | 31 ++++ systems/x86_64-linux/ulmo/hardware.nix | 18 +++ 35 files changed, 1176 insertions(+), 44 deletions(-) create mode 100644 homes/user-configurations/chris.nix create mode 100644 homes/x86_64-linux/chris@manwe/default.nix create mode 100644 modules/home/desktop/plasma/default.nix create mode 100644 modules/home/desktop/plasma/panels.nix create mode 100644 modules/home/desktop/plasma/power.nix create mode 100644 modules/nixos/boot/default.nix create mode 100644 modules/nixos/default.nix create mode 100644 modules/nixos/desktop/default.nix create mode 100644 modules/nixos/desktop/gamescope/default.nix create mode 100644 modules/nixos/desktop/gnome/default.nix create mode 100644 modules/nixos/desktop/plasma/default.nix create mode 100644 modules/nixos/hardware/audio/default.nix create mode 100644 modules/nixos/hardware/bluetooth/default.nix create mode 100644 modules/nixos/hardware/gpu/amd.nix create mode 100644 modules/nixos/hardware/gpu/nvidia.nix create mode 100644 modules/nixos/nix/default.nix create mode 100644 modules/nixos/services/media/default.nix rename {_hosts => systems/x86_64-linux}/aule/README.md (100%) rename {_hosts => systems/x86_64-linux}/manwe/README.md (100%) create mode 100644 systems/x86_64-linux/manwe/default.nix create mode 100644 systems/x86_64-linux/manwe/disks.nix create mode 100644 systems/x86_64-linux/manwe/hardware.nix rename {_hosts => systems/x86_64-linux}/orome/README.md (100%) create mode 100644 systems/x86_64-linux/orome/default.nix create mode 100644 systems/x86_64-linux/orome/disks.nix create mode 100644 systems/x86_64-linux/orome/hardware.nix rename {_hosts => systems/x86_64-linux}/tulkas/README.md (100%) create mode 100644 systems/x86_64-linux/tulkas/default.nix create mode 100644 systems/x86_64-linux/tulkas/disks.nix create mode 100644 systems/x86_64-linux/tulkas/hardware.nix create mode 100644 systems/x86_64-linux/ulmo/default.nix create mode 100644 systems/x86_64-linux/ulmo/disks.nix create mode 100644 systems/x86_64-linux/ulmo/hardware.nix diff --git a/flake.lock b/flake.lock index 87de250..1c8b5cb 100644 --- a/flake.lock +++ b/flake.lock @@ -191,6 +191,22 @@ } }, "flake-compat_4": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_5": { "locked": { "lastModified": 1747046372, "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", @@ -262,6 +278,25 @@ "type": "github" } }, + "flake-utils-plus": { + "inputs": { + "flake-utils": "flake-utils_5" + }, + "locked": { + "lastModified": 1715533576, + "narHash": "sha256-fT4ppWeCJ0uR300EH3i7kmgRZnAVxrH+XtK09jQWihk=", + "owner": "gytis-ivaskevicius", + "repo": "flake-utils-plus", + "rev": "3542fe9126dc492e53ddd252bb0260fe035f2c0f", + "type": "github" + }, + "original": { + "owner": "gytis-ivaskevicius", + "repo": "flake-utils-plus", + "rev": "3542fe9126dc492e53ddd252bb0260fe035f2c0f", + "type": "github" + } + }, "flake-utils_2": { "inputs": { "systems": "systems_2" @@ -316,6 +351,24 @@ "type": "github" } }, + "flake-utils_5": { + "inputs": { + "systems": "systems_6" + }, + "locked": { + "lastModified": 1694529238, + "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "ff7b65b44d01cf9ba6a71320833626af21126384", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, "flux": { "inputs": { "nixpkgs": "nixpkgs_3" @@ -871,6 +924,7 @@ "nixpkgs": "nixpkgs_5", "nvf": "nvf", "plasma-manager": "plasma-manager", + "snowfall-lib": "snowfall-lib", "sops-nix": "sops-nix", "stylix": "stylix", "zen-browser": "zen-browser" @@ -893,6 +947,28 @@ "type": "github" } }, + "snowfall-lib": { + "inputs": { + "flake-compat": "flake-compat_4", + "flake-utils-plus": "flake-utils-plus", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1736130495, + "narHash": "sha256-4i9nAJEZFv7vZMmrE0YG55I3Ggrtfo5/T07JEpEZ/RM=", + "owner": "snowfallorg", + "repo": "lib", + "rev": "02d941739f98a09e81f3d2d9b3ab08918958beac", + "type": "github" + }, + "original": { + "owner": "snowfallorg", + "repo": "lib", + "type": "github" + } + }, "sops-nix": { "inputs": { "nixpkgs": "nixpkgs_7" @@ -918,14 +994,14 @@ "base16-helix": "base16-helix", "base16-vim": "base16-vim", "firefox-gnome-theme": "firefox-gnome-theme", - "flake-compat": "flake-compat_4", + "flake-compat": "flake-compat_5", "flake-parts": "flake-parts_2", "git-hooks": "git-hooks", "gnome-shell": "gnome-shell", "home-manager": "home-manager_2", "nixpkgs": "nixpkgs_8", "nur": "nur", - "systems": "systems_6", + "systems": "systems_7", "tinted-foot": "tinted-foot", "tinted-kitty": "tinted-kitty", "tinted-schemes": "tinted-schemes", @@ -1036,6 +1112,21 @@ "type": "github" } }, + "systems_7": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, "tinted-foot": { "flake": false, "locked": { diff --git a/flake.nix b/flake.nix index 872bf61..5abe818 100644 --- a/flake.nix +++ b/flake.nix @@ -58,48 +58,23 @@ inherit inputs; src = ./.; - namespace = "sneeuwvlok"; - - meta = { - name = "sneeuwvlok"; - title = "Sneeuwvlok"; + channels-config = { + allowUnfree = true; }; + + snowfall = { + namespace = "sneeuwvlok"; + + meta = { + name = "sneeuwvlok"; + title = "Sneeuwvlok"; + }; + }; + + overlays = with inputs; [ + fenix.overlays.default + nix-minecraft.overlay + flux.overlays.default + ]; }; - - # outputs = inputs @ { self, nixpkgs, nix-minecraft, flux, ... }: - # let - # inherit (lib.my) readNixosModules mapHosts; - - # system = "x86_64-linux"; - - # mkPkgs = pkgs: extraOverlays: - # import pkgs { - # inherit system; - # config.allowUnfree = true; - # overlays = extraOverlays ++ (lib.attrValues self.overlays); - # }; - # pkgs = mkPkgs nixpkgs [self.overlays.default nix-minecraft.overlay flux.overlays.default]; - - # lib = nixpkgs.lib.extend (final: prev: { - # my = import ./lib { - # inherit pkgs inputs; - - # lib = final; - # }; - # }); - # in - # { - # lib = lib.my; - - # overlays = { - # default = final: prev: { - # my = self.packages.${system}; - # }; - # }; - - # packages."${system}" = lib.my.mapModules ./packages (p: pkgs.callPackage p { inherit inputs; }); - - # nixosModules = readNixosModules ./modules import; - # nixosConfigurations = mapHosts ./hosts {}; - # }; } diff --git a/homes/user-configurations/chris.nix b/homes/user-configurations/chris.nix new file mode 100644 index 0000000..bd48767 --- /dev/null +++ b/homes/user-configurations/chris.nix @@ -0,0 +1,6 @@ +{ + programs.git = { + userName = "Chris Kruining"; + userEmail = "chris@kruining.eu"; + }; +} \ No newline at end of file diff --git a/homes/x86_64-linux/chris@manwe/default.nix b/homes/x86_64-linux/chris@manwe/default.nix new file mode 100644 index 0000000..5acdd92 --- /dev/null +++ b/homes/x86_64-linux/chris@manwe/default.nix @@ -0,0 +1,11 @@ +{ lib, ... }: +let + inherit (lib); +in +{ + sneeuwvlok = { + series = { + media.enable = true; + }; + }; +} \ No newline at end of file diff --git a/modules/home/desktop/plasma/default.nix b/modules/home/desktop/plasma/default.nix new file mode 100644 index 0000000..7a03fe9 --- /dev/null +++ b/modules/home/desktop/plasma/default.nix @@ -0,0 +1,73 @@ +{ config, lib, namespace, osConfig ? {}, ... }: +let + cfg = config.${namespace}.desktop.plasma; + osCfg = osConfig.${namespace}.desktop.plasma or { enable = false; }; +in +{ + options.${namespace}.desktop.plasma = { + + }; + + config = mkIf osCfg.enable { + programs.plasma = { + enable = true; + + immutableByDefault = true; + windows.allowWindowsToRememberPositions = true; + + session = { + general.askForConfirmationOnLogout = false; + sessionRestore.restoreOpenApplicationsOnLogin = "onLastLogout"; + }; + + workspace = { + clickItemTo = "select"; + colorScheme = "EverforestDark"; + wallpaper = config.stylix.image; + }; + + spectacle.shortcuts = { + captureRectangularRegion = "Meta+Shift+S"; + }; + + kscreenlocker = { + autoLock = false; + lockOnResume = false; + lockOnStartup = false; + + appearance = { + alwaysShowClock = true; + showMediaControls = true; + }; + }; + + configFile = { + baloofilerc."Basic Settings"."Indexing-Enabled" = false; + + kdeglobals = { + General = { + # enable font antialiasing + XftAntialias = true; + XftHintStyle = "hintslight"; + XftSubPixel = "rgb"; + }; + }; + + kwalletrc = { + Wallet.Enabled = false; + }; + + plasmarc = { + General = { + RaiseMaximumVolume = true; + VolumeStep = 2; + }; + }; + + kcminputrc = { + Keyboard.NumLock.value = 0; + }; + }; + }; + }; +} \ No newline at end of file diff --git a/modules/home/desktop/plasma/panels.nix b/modules/home/desktop/plasma/panels.nix new file mode 100644 index 0000000..fa4de70 --- /dev/null +++ b/modules/home/desktop/plasma/panels.nix @@ -0,0 +1,122 @@ +{ config, lib, namespace, osConfig ? {}, ... }: +let + cfg = config.${namespace}.desktop.plasma; + osCfg = osConfig.${namespace}.desktop.plasma or { enable = false; }; +in +{ + options.${namespace}.desktop.plasma = { + + }; + + config = mkIf osCfg.enable { + programs.plasma.panels = [ + { + location = "bottom"; + floating = true; + lengthMode = "fill"; + height = 42; + hiding = "none"; + screen = "all"; + widgets = [ + { + panelSpacer = { + expanding = true; + }; + } + { + kickoff = { + applicationsDisplayMode = "list"; + compactDisplayStyle = false; + favoritesDisplayMode = "grid"; + sortAlphabetically = true; + showButtonsFor = { + custom = [ + "shutdown" + "reboot" + "logout" + "lock-screen" + ]; + }; + showActionButtonCaptions = true; + }; + } + { + iconTasks = { + appearance = { + fill = false; + highlightWindows = true; + iconSpacing = "medium"; + indicateAudioStreams = true; + rows = { + multirowView = "never"; + maximum = null; + }; + showTooltips = true; + }; + behavior = { + grouping = { + clickAction = "showPresentWindowsEffect"; + method = "byProgramName"; + }; + minimizeActiveTaskOnClick = true; + newTasksAppearOn = "right"; + showTasks = { + onlyInCurrentActivity = true; + onlyInCurrentDesktop = true; + onlyMinimized = false; + onlyInCurrentScreen = false; + }; + sortingMethod = "manually"; + unhideOnAttentionNeeded = true; + wheel = { + ignoreMinimizedTasks = true; + switchBetweenTasks = true; + }; + }; + launchers = [ + "preferred://filemanager" + "preferred://browser" + "preferred://terminalemulator" + "preferred://email" + "applications:vesktop.desktop" + "applications:steam.desktop" + ]; + }; + } + { + panelSpacer = { + expanding = true; + }; + } + { + systemTray = { + icons = { + scaleToFit = true; + spacing = "small"; + }; + items = { + hidden = [ + "org.kde.plasma.brightness" + ]; + }; + pin = false; + }; + } + { + digitalClock = { + date = { + enable = true; + format = "shortDate"; + position = "belowTime"; + }; + time = { + format = "24h"; + showSeconds = "onlyInTooltip"; + }; + }; + } + ]; + } + ]; + }; +} \ No newline at end of file diff --git a/modules/home/desktop/plasma/power.nix b/modules/home/desktop/plasma/power.nix new file mode 100644 index 0000000..9d05dad --- /dev/null +++ b/modules/home/desktop/plasma/power.nix @@ -0,0 +1,50 @@ +{ config, lib, namespace, osConfig ? {}, ... }: +let + cfg = config.${namespace}.desktop.plasma; + osCfg = osConfig.${namespace}.desktop.plasma or { enable = false; }; +in +{ + options.${namespace}.desktop.plasma = { + + }; + + config = mkIf osCfg.enable { + programs.plasma.powerdevil = { + AC = { + powerButtonAction = "shutDown"; + whenLaptopLidClosed = "doNothing"; + + autoSuspend.action = "nothing"; + dimDisplay.enable = false; + + turnOffDisplay = { + idleTimeout = "never"; + }; + }; + + battery = { + powerButtonAction = "shutDown"; + whenLaptopLidClosed = "doNothing"; + + autoSuspend.action = "nothing"; + dimDisplay.enable = false; + + turnOffDisplay = { + idleTimeout = "never"; + }; + }; + + lowBattery = { + powerButtonAction = "shutDown"; + whenLaptopLidClosed = "doNothing"; + + autoSuspend.action = "nothing"; + dimDisplay.enable = false; + + turnOffDisplay = { + idleTimeout = "never"; + }; + }; + }; + }; +} \ No newline at end of file diff --git a/modules/nixos/boot/default.nix b/modules/nixos/boot/default.nix new file mode 100644 index 0000000..8037621 --- /dev/null +++ b/modules/nixos/boot/default.nix @@ -0,0 +1,81 @@ +{ lib, namespace, config, ... }: +let + inherit (lib) mkIf mkMerge mkDefault mkEnableOption; + inherit (lib.types) enum; + + cfg = config.${namespace}.boot; +in +{ + config.${namespace}.boot = { + type = mkOption { + type = enum [ "bios" "uefi" ]; + default = "uefi"; + }; + + quiet = mkOption { + type = bool; + default = false; + }; + + animated = mkOption { + type = bool; + default = false; + }; + }; + + config = mkMerge [ + ({ + boot.loader.grub.enable = mkDefault true; + }) + + (mkIf cfg.type == "bios" { + boot.loader.grub.efiSupport = false; + }) + + (mkIf cfg.type == "uefi" { + boot.loader = { + efi.canTouchEfiVariables = true; + grub = { + efiSupport = true; + efiInstallAsRemovable = mkDefault false; + device = "nodev"; # INFO: https://discourse.nixos.org/t/question-about-grub-and-nodev + }; + }; + }) + + (mkIf cfg.quiet { + boot = { + consoleLogLevel = 0; + + initrd = { + systemd.enable = true; + verbose = false; + }; + + kernelParams = [ + "quiet" + "loglevel=3" + "systemd.show_status=auto" + "udev.log_level=3" + "rd.udev.log_level=3" + "vt.global_cursor_default=0" + ]; + + loader.timeout = mkDefault 0; + }; + }) + + (mkIf cfg.animated { + boot.plymouth = { + enable = true; + + theme = mkDefault "pixels"; + themePackages = with pkgs; [ + (adi1090x-plymouth-themes.override { + selected_themes = [ "pixels" ]; + }) + ]; + }; + }) + ]; +} \ No newline at end of file diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix new file mode 100644 index 0000000..34c0298 --- /dev/null +++ b/modules/nixos/default.nix @@ -0,0 +1,42 @@ +{ config, lib, pkgs, ... }: +let + inherit (lib) mkOption mkMerge attrNames filterAttrs; + inherit (lib.types) nullOr enum; + + cfg = config.${namespace}; +in +{ + options.${namespace} = { + preset = mkOption { + type = nullOr enum [ "server" "desktop" ]; + default = null; + example = "desktop"; + description = "Which defaults profile to start with"; + }; + }; + + config = mkMerge [ + (mkIf cfg.preset == "desktop" { + "${namespace}" = mkDefault { + hardware.has = { + audio = true; + }; + + boot = { + quiet = true; + animated = true; + }; + + desktop.use = "kde"; + }; + }) + + (mkIf cfg.preset == "desktop" { + "${namespace}" = mkDefault { + services = { + ssh.enable = true; + }; + }; + }) + ]; +} \ No newline at end of file diff --git a/modules/nixos/desktop/default.nix b/modules/nixos/desktop/default.nix new file mode 100644 index 0000000..1c053c4 --- /dev/null +++ b/modules/nixos/desktop/default.nix @@ -0,0 +1,37 @@ +{ lib, config, namespace, ... }:let + inherit (lib) mkOption mkMerge attrNames filterAttrs; + inherit (lib.types) nullOr enum bool; + + cfg = config.${namespace}.desktop; +in +{ + options.${namespace}.desktop = { + use = mkOption { + type = nullOr enum (attrNames (filterAttrs (n: type == "directory") (readDir ./.))); + default = null; + example = "plasma"; + description = "Which desktop to enable"; + }; + + autoLogin = mkOption { + type = bool; + default = false; + example = true; + description = "Enable plasma's auto login feature."; + }; + }; + + config = mkMerge [ + (mkIf cfg.desktop != null { + "${namespace}".desktop.${cfg.use}.enable = true; + + services.displayManager = { + enable = true; + + autoLogin = mkIf cfg.autoLogin { + enable = true; + }; + }; + }) + ]; +} diff --git a/modules/nixos/desktop/gamescope/default.nix b/modules/nixos/desktop/gamescope/default.nix new file mode 100644 index 0000000..1d3d427 --- /dev/null +++ b/modules/nixos/desktop/gamescope/default.nix @@ -0,0 +1,27 @@ +{ lib, config, namespace, inputs, ... }:let + inherit (lib) mkEnableOption; + + cfg = config.${namespace}.desktop.gamescope; +in +{ + imports = [ inputs.jovian.nixosModules.default ]; + + options.${namespace}.desktop.gamescope = { + enable = mkEnableOption "Enable Steamdeck ui"; + }; + + config = mkIf cfg.enable { + "${namespace}".desktop.kde.enable = true; + + jovian = { + steam = { + enable = true; + autoStart = true; + user = "chris"; + updater.splash = "steamos"; + desktopSession = "plasma"; + }; + steamos.useSteamOSConfig = true; + }; + }; +} diff --git a/modules/nixos/desktop/gnome/default.nix b/modules/nixos/desktop/gnome/default.nix new file mode 100644 index 0000000..add3f2c --- /dev/null +++ b/modules/nixos/desktop/gnome/default.nix @@ -0,0 +1,14 @@ +{ lib, config, namespace, ... }:let + inherit (lib) mkEnableOption mkOption; + inherit (lib.types) bool; + + cfg = config.${namespace}.desktop.gnome; +in +{ + options.${namespace}.desktop.gnome = { + enable = mkEnableOption "Enable Gnome"; + }; + + config = mkIf cfg.enable { + }; +} diff --git a/modules/nixos/desktop/plasma/default.nix b/modules/nixos/desktop/plasma/default.nix new file mode 100644 index 0000000..3a30daf --- /dev/null +++ b/modules/nixos/desktop/plasma/default.nix @@ -0,0 +1,30 @@ +{ lib, config, namespace, ... }:let + inherit (lib) mkEnableOption mkOption; + inherit (lib.types) bool; + + cfg = config.${namespace}.desktop.plasma; +in +{ + options.${namespace}.desktop.plasma = { + enable = mkEnableOption "Enable KDE Plasma"; + }; + + config = mkIf cfg.enable { + environment.plasma6.excludePackages = with pkgs.kdePackages; [ konsole kate ghostwriter oxygen ]; + environment.sessionVariables.NIXOS_OZONE_WL = "1"; + + services = { + xserver.enable = false; + + desktopManager.plasma6.enable = true; + + displayManager = { + defaultSession = "plasma"; + sddm = { + enable = true; + wayland.enable = true; + }; + }; + }; + }; +} diff --git a/modules/nixos/hardware/audio/default.nix b/modules/nixos/hardware/audio/default.nix new file mode 100644 index 0000000..bf9760f --- /dev/null +++ b/modules/nixos/hardware/audio/default.nix @@ -0,0 +1,30 @@ +{ pkgs, lib, namespace, config, ... }: +let + inherit (lib) mkIf mkEnableOption; + + cfg = config.${namespace}.hardware.has.audio; +in +{ + config.${namespace}.hardware.has.audio = mkEnableOption "Enable bluetooth"; + + config = mkIf cfg { + environment.systemPackages = with pkgs; [ + sof-firmware + ]; + + # https://wiki.nixos.org/wiki/PipeWire + security.rtkit.enable = true; + + services.pulseaudio.enable = false; + services.pipewire = { + enable = true; + wireplumber.enable = true; + pulse.enable = true; + + alsa = { + enable = true; + support32Bit = true; + }; + }; + }; +} \ No newline at end of file diff --git a/modules/nixos/hardware/bluetooth/default.nix b/modules/nixos/hardware/bluetooth/default.nix new file mode 100644 index 0000000..31dcdbc --- /dev/null +++ b/modules/nixos/hardware/bluetooth/default.nix @@ -0,0 +1,25 @@ +{ lib, namespace, config, ... }: +let + inherit (lib) mkIf mkEnableOption; + + cfg = config.${namespace}.hardware.has.bluetooth; +in +{ + config.${namespace}.hardware.has.bluetooth = mkEnableOption "Enable bluetooth"; + + config = mkIf cfg { + hardware.bluetooth = { + enable = true; + powerOnBoot = true; + }; + + services.pipewire.wireplumber.extraConfig.bluetoothEnhancements = { + "monitor.bluez.properties" = { + "bluez5.enable-sbc-xq" = true; + "bluez5.enable-msbc" = true; + "bluez5.enable-hw-volume" = true; + "bluez5.roles" = [ "hsp_hs" "hsp_ag" "hfp_hf" "hfp_ag" ]; + }; + }; + }; +} \ No newline at end of file diff --git a/modules/nixos/hardware/gpu/amd.nix b/modules/nixos/hardware/gpu/amd.nix new file mode 100644 index 0000000..9bd0961 --- /dev/null +++ b/modules/nixos/hardware/gpu/amd.nix @@ -0,0 +1,29 @@ +{ pkgs, lib, namespace, config, ... }: +let + inherit (lib) mkIf mkEnableOption; + + cfg = config.${namespace}.hardware.has.gpu.amd; +in +{ + config.${namespace}.hardware.has.gpu.amd = mkEnableOption "Enable AMD gpu configuration"; + + config = mkIf cfg { + services.xserver.videoDrivers = [ "amd" ]; + + hardware = { + graphics = { + enable = true; + enable32Bit = true; + }; + + amdgpu = { + amdvlk = { + enable = true; + support32Bit.enable = true; + }; + + initrd.enable = true; + }; + }; + }; +} \ No newline at end of file diff --git a/modules/nixos/hardware/gpu/nvidia.nix b/modules/nixos/hardware/gpu/nvidia.nix new file mode 100644 index 0000000..0e0ea4e --- /dev/null +++ b/modules/nixos/hardware/gpu/nvidia.nix @@ -0,0 +1,31 @@ +{ pkgs, lib, namespace, config, ... }: +let + inherit (lib) mkIf mkEnableOption; + + cfg = config.${namespace}.hardware.has.gpu.nvidia; +in +{ + config.${namespace}.hardware.has.gpu.nvidia = mkEnableOption "Enable NVidia gpu configuration"; + + config = mkIf cfg { + services.xserver.videoDrivers = [ "nvidia" ]; + + hardware = { + graphics = { + enable = true; + enable32Bit = true; + }; + + nvidia = { + modesetting.enable = true; + open = false; + nvidiaSettings = true; + + powerManagement = { + enable = true; + finegrained = false; + }; + }; + }; + }; +} \ No newline at end of file diff --git a/modules/nixos/nix/default.nix b/modules/nixos/nix/default.nix new file mode 100644 index 0000000..1177a14 --- /dev/null +++ b/modules/nixos/nix/default.nix @@ -0,0 +1,42 @@ +{ pkgs, lib, namespace, config, ... }: +let + inherit (lib) mkIf mkEnableOption; + + cfg = config.${namespace}.nix; +in +{ + config.${namespace}.nix = { + enable = mkEnableOption "Enable nix command"; + }; + + config = mkIf cfg.enable { + programs.git.enable = true; + + nix = { + package = pkgs.nixVersions.latest; + + settings = { + experimental-features = [ "nix-command" "flakes" ]; + allowed-users = [ "@wheel" ]; + trusted-users = [ "@wheel" ]; + + auto-optimise-store = true; + connect-timeout = 5; + http-connections = 50; + log-lines = 50; # more log lines in case of error + min-free = 1 * (1024 * 1024 * 1024); # GiB # start garbage collector + max-free = 50 * (1024 * 1024 * 1024); # GiB # until + warn-dirty = false; + }; + + gc = { + automatic = true; + dates = "monthly"; + options = "--delete-older-than 45d"; + }; + + # disable nix-channel, we use flakes instead. + channel.enable = false; + }; + }; +} \ No newline at end of file diff --git a/modules/nixos/services/media/default.nix b/modules/nixos/services/media/default.nix new file mode 100644 index 0000000..76c6309 --- /dev/null +++ b/modules/nixos/services/media/default.nix @@ -0,0 +1,153 @@ +{ lib, namespace, config, ... }: +let + inherit (lib) mkIf mkEnableOption; + + cfg = config.${namespace}.services.media; +in +{ + config.${namespace}.services.media = { + enable = mkEnableOption "Enable media services"; + }; + + config = mkIf cfg.enable { + #========================================================================= + # Dependencies + #========================================================================= + environment.systemPackages = with pkgs; [ + podman-tui + jellyfin + jellyfin-web + jellyfin-ffmpeg + jellyseerr + mediainfo + id3v2 + yt-dlp + ]; + + # need to permit these outdated packages until servarr finally upgrades at some point... + permittedInsecurePackages = [ + "dotnet-sdk-6.0.428" + "aspnetcore-runtime-6.0.36" + ]; + + #========================================================================= + # Prepare system + #========================================================================= + users = { + users.${user} = { + isSystemUser = true; + group = group; + }; + groups.${group} = {}; + }; + + systemd.tmpfiles.rules = [ + "d '${directory}/series' 0700 ${user} ${group} - -" + "d '${directory}/movies' 0700 ${user} ${group} - -" + "d '${directory}/music' 0700 ${user} ${group} - -" + "d '${directory}/qbittorrent' 0700 ${user} ${group} - -" + "d '${directory}/sabnzbd' 0700 ${user} ${group} - -" + "d '${directory}/reiverr/config' 0700 ${user} ${group} - -" + "d '${directory}/downloads/incomplete' 0700 ${user} ${group} - -" + "d '${directory}/downloads/done' 0700 ${user} ${group} - -" + ]; + + #========================================================================= + # Services + #========================================================================= + services = let + serviceConf = { + enable = true; + openFirewall = true; + user = user; + group = group; + }; + in { + jellyfin = serviceConf; + radarr = serviceConf; + sonarr = serviceConf; + bazarr = serviceConf; + lidarr = serviceConf; + + lanraragi = { + enable = true; + port = 6969; + }; + + jellyseerr = { + enable = true; + openFirewall = true; + }; + + prowlarr = { + enable = true; + openFirewall = true; + }; + + qbittorrent = { + enable = true; + openFirewall = true; + dataDir = "${directory}/qbittorrent"; + port = 5000; + + user = user; + group = group; + }; + + sabnzbd = { + enable = true; + openFirewall = true; + configFile = "${directory}/sabnzbd/config.ini"; + + user = user; + group = group; + }; + }; + + systemd.services.jellyfin.serviceConfig.killSignal = lib.mkForce "SIGKILL"; + + modules.virtualisation.podman.enable = true; + + virtualisation = { + oci-containers = { + backend = "podman"; + + containers = { + flaresolverr = { + image = "flaresolverr/flaresolverr"; + autoStart = true; + ports = [ "127.0.0.1:8191:8191" ]; + }; + + reiverr = { + image = "ghcr.io/aleksilassila/reiverr:v2.2.0"; + autoStart = true; + ports = [ "127.0.0.1:9494:9494" ]; + volumes = [ "${directory}/reiverr/config:/config" ]; + }; + }; + }; + }; + + #========================================================================= + # Hosting + #========================================================================= + services = { + caddy = { + enable = true; + virtualHosts = { + "media.kruining.eu".extraConfig = '' + import auth + + reverse_proxy http://127.0.0.1:9494 + ''; + "jellyfin.kruining.eu".extraConfig = '' + reverse_proxy http://127.0.0.1:8096 + ''; + }; + }; + }; + + networking.firewall.allowedTCPPorts = [ 80 443 6969 ]; + }; +} \ No newline at end of file diff --git a/_hosts/aule/README.md b/systems/x86_64-linux/aule/README.md similarity index 100% rename from _hosts/aule/README.md rename to systems/x86_64-linux/aule/README.md diff --git a/_hosts/manwe/README.md b/systems/x86_64-linux/manwe/README.md similarity index 100% rename from _hosts/manwe/README.md rename to systems/x86_64-linux/manwe/README.md diff --git a/systems/x86_64-linux/manwe/default.nix b/systems/x86_64-linux/manwe/default.nix new file mode 100644 index 0000000..f10ca22 --- /dev/null +++ b/systems/x86_64-linux/manwe/default.nix @@ -0,0 +1,20 @@ +{ ... }: +let +in +{ + imports = [ + ./disks.nix + ./hardware.nix + ]; + + sneeuwvlok = { + preset = "desktop"; + + hardware.has = { + gpu.amd = true; + bluetooth = true; + }; + }; + + system.stateVersion = "23.11"; +} \ No newline at end of file diff --git a/systems/x86_64-linux/manwe/disks.nix b/systems/x86_64-linux/manwe/disks.nix new file mode 100644 index 0000000..3a3375e --- /dev/null +++ b/systems/x86_64-linux/manwe/disks.nix @@ -0,0 +1,42 @@ +{ config, lib, pkgs, modulesPath, ... }: +let + inherit (lib.modules) mkDefault; +in +{ + # TODO :: Implement disko at some point + + swapDevices = [ + { device = "/dev/disk/by-uuid/0ddf001a-5679-482e-b254-04a1b9094794"; } + ]; + + boot.supportedFilesystems = [ "nfs" ]; + + fileSystems = { + "/" = { device = "/dev/disk/by-uuid/8c4eaf57-fdb2-4c4c-bcc0-74e85a1c7985"; + fsType = "ext4"; + }; + + "/boot" = { + device = "/dev/disk/by-uuid/C842-316A"; + fsType = "vfat"; + options = [ "fmask=0022" "dmask=0022" ]; + }; + + "/home/chris/games" = { + device = "/dev/disk/by-label/games"; + fsType = "ext4"; + }; + + # TODO :: Reformat the disk to ext4 + "/home/chris/data" = { + device = "/dev/disk/by-label/Data"; + fsType = "ntfs-3g"; + options = [ "rw" "uid=chris" ]; + }; + + "/home/chris/media" = { + device = "ulmo:/"; + fsType = "nfs"; + }; + }; +} diff --git a/systems/x86_64-linux/manwe/hardware.nix b/systems/x86_64-linux/manwe/hardware.nix new file mode 100644 index 0000000..60759bd --- /dev/null +++ b/systems/x86_64-linux/manwe/hardware.nix @@ -0,0 +1,18 @@ +{ config, lib, pkgs, modulesPath, system, ... }: +let + inherit (lib.modules) mkDefault; +in +{ + imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; + + boot = { + initrd.availableKernelModules = [ "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" ]; + initrd.kernelModules = [ ]; + kernelModules = [ "kvm-intel" ]; + kernelParams = []; + extraModulePackages = [ ]; + }; + + nixpkgs.hostPlatform = mkDefault system; + hardware.cpu.intel.updateMicrocode = mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/_hosts/orome/README.md b/systems/x86_64-linux/orome/README.md similarity index 100% rename from _hosts/orome/README.md rename to systems/x86_64-linux/orome/README.md diff --git a/systems/x86_64-linux/orome/default.nix b/systems/x86_64-linux/orome/default.nix new file mode 100644 index 0000000..5d5bf2f --- /dev/null +++ b/systems/x86_64-linux/orome/default.nix @@ -0,0 +1,17 @@ +{ ... }: +let +in +{ + imports = [ + ./disks.nix + ./hardware.nix + ]; + + sneeuwvlok = { + preset = "desktop"; + + bluetooth.enable = true; + }; + + system.stateVersion = "23.11"; +} \ No newline at end of file diff --git a/systems/x86_64-linux/orome/disks.nix b/systems/x86_64-linux/orome/disks.nix new file mode 100644 index 0000000..5a11407 --- /dev/null +++ b/systems/x86_64-linux/orome/disks.nix @@ -0,0 +1,23 @@ +{ config, lib, pkgs, modulesPath, ... }: +let + inherit (lib.modules) mkDefault; +in +{ + # TODO :: Implement disko at some point + + swapDevices = []; + + boot.supportedFilesystems = [ "nfs" ]; + + fileSystems = { + "/" = { device = "/dev/disk/by-uuid/e60745c9-b3ea-4aeb-9c5c-b67ef1730826"; + fsType = "ext4"; + }; + + "/boot" = { + device = "/dev/disk/by-uuid/42B3-C767"; + fsType = "vfat"; + options = [ "fmask=0077" "dmask=0077" ]; + }; + }; +} diff --git a/systems/x86_64-linux/orome/hardware.nix b/systems/x86_64-linux/orome/hardware.nix new file mode 100644 index 0000000..ee52810 --- /dev/null +++ b/systems/x86_64-linux/orome/hardware.nix @@ -0,0 +1,18 @@ +{ config, lib, pkgs, modulesPath, system, ... }: +let + inherit (lib.modules) mkDefault; +in +{ + imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; + + boot = { + initrd.availableKernelModules = [ "xhci_pci" "thunderbolt" "nvme" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ]; + initrd.kernelModules = [ ]; + kernelModules = [ "kvm-intel" ]; + kernelParams = []; + extraModulePackages = [ ]; + }; + + nixpkgs.hostPlatform = mkDefault system; + hardware.cpu.intel.updateMicrocode = mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/_hosts/tulkas/README.md b/systems/x86_64-linux/tulkas/README.md similarity index 100% rename from _hosts/tulkas/README.md rename to systems/x86_64-linux/tulkas/README.md diff --git a/systems/x86_64-linux/tulkas/default.nix b/systems/x86_64-linux/tulkas/default.nix new file mode 100644 index 0000000..792956e --- /dev/null +++ b/systems/x86_64-linux/tulkas/default.nix @@ -0,0 +1,16 @@ +{ ... }: +let +in +{ + imports = [ + ./disks.nix + ./hardware.nix + ]; + + sneeuwvlok = { + preset = "desktop"; + desktop.use = "gamescope"; + }; + + system.stateVersion = "23.11"; +} \ No newline at end of file diff --git a/systems/x86_64-linux/tulkas/disks.nix b/systems/x86_64-linux/tulkas/disks.nix new file mode 100644 index 0000000..43b8825 --- /dev/null +++ b/systems/x86_64-linux/tulkas/disks.nix @@ -0,0 +1,23 @@ +{ config, lib, pkgs, modulesPath, ... }: +let + inherit (lib.modules) mkDefault; +in +{ + # TODO :: Implement disko at some point + + swapDevices = [ + { device = "/dev/disk/by-uuid/beddca5c-1ecc-4a46-9fc5-fd918eed8f2a"; } + ]; + + fileSystems = { + "/" = { + device = "/dev/disk/by-uuid/aa438c4c-d193-436b-91ca-c386c0688265"; + fsType = "ext4"; + }; + + "/boot" = { + device = "/dev/disk/by-uuid/89B8-0702"; + fsType = "vfat"; + }; + }; +} diff --git a/systems/x86_64-linux/tulkas/hardware.nix b/systems/x86_64-linux/tulkas/hardware.nix new file mode 100644 index 0000000..950d7cc --- /dev/null +++ b/systems/x86_64-linux/tulkas/hardware.nix @@ -0,0 +1,18 @@ +{ config, lib, pkgs, modulesPath, system, ... }: +let + inherit (lib.modules) mkDefault; +in +{ + imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; + + boot = { + initrd.availableKernelModules = [ "nvme" "xhci_pci" "usbhid" "usb_storage" "sd_mod" "sdhci_pci" ]; + initrd.kernelModules = [ ]; + kernelModules = [ "kvm-amd" ]; + kernelParams = []; + extraModulePackages = [ ]; + }; + + nixpkgs.hostPlatform = mkDefault system; + hardware.cpu.intel.updateMicrocode = mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/systems/x86_64-linux/ulmo/default.nix b/systems/x86_64-linux/ulmo/default.nix new file mode 100644 index 0000000..d28c19f --- /dev/null +++ b/systems/x86_64-linux/ulmo/default.nix @@ -0,0 +1,19 @@ +{ ... }: +let +in +{ + imports = [ + ./disks.nix + ./hardware.nix + ]; + + sneeuwvlok = { + preset = "server"; + + services = { + media.enable = true; + }; + }; + + system.stateVersion = "23.11"; +} \ No newline at end of file diff --git a/systems/x86_64-linux/ulmo/disks.nix b/systems/x86_64-linux/ulmo/disks.nix new file mode 100644 index 0000000..a4033f7 --- /dev/null +++ b/systems/x86_64-linux/ulmo/disks.nix @@ -0,0 +1,31 @@ +{ config, lib, pkgs, modulesPath, ... }: +let + inherit (lib.modules) mkDefault; +in +{ + # TODO :: Implement disko at some point + + swapDevices = [ + { device = "/dev/disk/by-uuid/0ddf001a-5679-482e-b254-04a1b9094794"; } + ]; + + boot.supportedFilesystems = [ "nfs" ]; + + fileSystems = { + "/" = { + device = "/dev/disk/by-uuid/dd518f17-61c9-4831-b1bd-e1cc2af292aa"; + fsType = "ext4"; + }; + + "/boot" = { + device = "/dev/disk/by-uuid/0A56-EBFE"; + fsType = "vfat"; + options = [ "fmask=0022" "dmask=0022" ]; + }; + + "/var/media" = { + device = "/dev/disk/by-label/data"; + fsType = "ext4"; + }; + }; +} diff --git a/systems/x86_64-linux/ulmo/hardware.nix b/systems/x86_64-linux/ulmo/hardware.nix new file mode 100644 index 0000000..4479a12 --- /dev/null +++ b/systems/x86_64-linux/ulmo/hardware.nix @@ -0,0 +1,18 @@ +{ config, lib, pkgs, modulesPath, system, ... }: +let + inherit (lib.modules) mkDefault; +in +{ + imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; + + boot = { + initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ]; + initrd.kernelModules = [ ]; + kernelModules = [ "kvm-intel" ]; + kernelParams = []; + extraModulePackages = [ ]; + }; + + nixpkgs.hostPlatform = mkDefault system; + hardware.cpu.intel.updateMicrocode = mkDefault config.hardware.enableRedistributableFirmware; +}