nix/lib/modules/nixos/default.nix

722 lines
17 KiB
Nix
Raw Normal View History

2025-02-14 13:31:18 -06:00
{ self, ... }:
let
2025-02-14 13:04:04 -06:00
inherit (self) outputs;
2025-02-14 13:31:18 -06:00
inherit (outputs)
nixosModules
2025-02-14 15:40:53 -06:00
# overlays
pubkey
2025-02-14 13:31:18 -06:00
;
in
{
2025-02-14 15:40:53 -06:00
common = {
imports = with nixosModules; [
deno-netlify-ddns-client
shell-defaults-and-applications
desktop
wifi
printing
podman
virtual-machines
postgres
gaming
gnome
daniel
root
];
};
nix-config = (import ../../../flake.nix).nixConfig;
2025-02-14 13:04:04 -06:00
shell-defaults-and-applications = import ./shell-config.nix;
deno-netlify-ddns-client = import ./deno-netlify-ddns-client.nix;
# boot.tmp.useTmpfs = true;
# boot.uki.tries = 3;
# services.irqbalance.enable = true;
2025-02-14 13:31:18 -06:00
remote-disk-key-entry-on-boot =
{
lib,
pkgs,
...
}:
{
/*
https://nixos.wiki/wiki/Remote_disk_unlocking
"When using DHCP, make sure your computer is always attached to the network and is able to get an IP adress, or the boot process will hang."
^ seems less than ideal
*/
boot.kernelParams = [ "ip=dhcp" ];
boot.initrd = {
# availableKernelModules = ["r8169"]; # ethernet drivers
systemd.users.root.shell = "/bin/cryptsetup-askpass";
network = {
2024-07-29 10:43:11 -05:00
enable = true;
2025-02-14 13:31:18 -06:00
ssh = {
enable = true;
port = 22;
authorizedKeys = [ pubkey ];
hostKeys = [ "/etc/secrets/initrd/ssh_host_rsa_key" ];
};
2024-07-29 10:43:11 -05:00
};
};
};
2025-02-14 13:31:18 -06:00
laptop =
2025-02-14 15:40:53 -06:00
# TODO: modularize
2025-02-14 13:31:18 -06:00
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [
acpi
];
2025-01-05 01:08:38 -06:00
2025-02-14 13:31:18 -06:00
services.udev.extraRules = ''
ACTION=="add", SUBSYSTEM=="backlight", RUN+="${pkgs.coreutils}/bin/chgrp video /sys/class/backlight/%k/brightness"
ACTION=="add", SUBSYSTEM=="backlight", RUN+="${pkgs.coreutils}/bin/chmod g+w /sys/class/backlight/%k/brightness"
2024-09-22 20:20:15 -05:00
'';
2025-02-14 13:31:18 -06:00
services.upower.enable = true;
# NOTE: I previously let plasma settings handle this
services.logind = {
lidSwitch = "suspend-then-hibernate";
extraConfig = ''
KillUserProcesses=no
HandlePowerKey=suspend
HandlePowerKeyLongPress=poweroff
HandleRebootKey=reboot
HandleRebootKeyLongPress=poweroff
HandleSuspendKey=suspend
HandleSuspendKeyLongPress=hibernate
HandleHibernateKey=hibernate
HandleHibernateKeyLongPress=ignore
HandleLidSwitch=suspend
HandleLidSwitchExternalPower=suspend
HandleLidSwitchDocked=suspend
HandleLidSwitchDocked=suspend
IdleActionSec=11m
IdleAction=ignore
'';
};
};
2025-01-05 01:08:38 -06:00
2025-02-14 15:40:53 -06:00
gnome =
2025-02-14 13:31:18 -06:00
{
pkgs,
lib,
config,
...
}:
{
2025-02-14 15:40:53 -06:00
config = lib.mkIf config.services.xserver.desktopManager.gnome.enable {
2025-02-14 15:40:53 -06:00
services = {
xserver = {
enable = true;
displayManager.gdm.enable = true;
# desktopManager.gnome.enable = true;
2025-02-14 13:31:18 -06:00
};
2025-02-14 15:40:53 -06:00
udev.packages = [ pkgs.gnome-settings-daemon ];
};
2025-02-14 13:31:18 -06:00
2025-02-14 15:40:53 -06:00
environment = {
variables.GSK_RENDERER = "gl";
systemPackages = with pkgs; [
bitwarden
# adwaita-gtk-theme
papirus-icon-theme
adwaita-icon-theme
adwaita-icon-theme-legacy
hydrapaper
];
};
2025-02-14 13:31:18 -06:00
2025-02-14 15:40:53 -06:00
programs.kdeconnect = {
enable = true;
2025-02-14 15:40:53 -06:00
package = pkgs.gnomeExtensions.gsconnect;
};
2025-02-14 15:40:53 -06:00
networking.firewall = rec {
allowedTCPPortRanges = [
{
from = 1714;
to = 1764;
}
];
allowedUDPPortRanges = allowedTCPPortRanges;
2025-02-10 11:14:39 -06:00
};
};
};
2025-02-14 13:31:18 -06:00
radio-tools =
{ pkgs, ... }:
{
environment = {
systemPackages = with pkgs; [
chirp
];
};
2024-10-09 13:44:02 -05:00
};
kde-connect = {
programs.kdeconnect.enable = true;
2024-09-12 12:05:22 -05:00
/*
2025-02-14 13:31:18 -06:00
# handled by enabling
networking.firewall = {
allowedTCPPortRanges = [ { from = 1714; to = 1764; } ];
allowedUDPPortRanges = [ { from = 1714; to = 1764; } ];
};
2024-09-12 12:05:22 -05:00
*/
};
2025-02-14 13:31:18 -06:00
fonts =
{ pkgs, ... }:
{
fonts.packages = [
(
# allow nixpkgs 24.11 and unstable to both work
if builtins.hasAttr "nerd-fonts" pkgs then
(pkgs.nerd-fonts.symbols-only)
else
(pkgs.nerdfonts.override { fonts = [ "NerdFontsSymbolsOnly" ]; })
)
pkgs.iosevkaLyteTerm
];
};
2025-02-14 13:31:18 -06:00
plasma6 =
{
pkgs,
lib,
...
}:
{
imports = with nixosModules; [
kde-connect
pipewire
];
2025-02-14 13:31:18 -06:00
services.xserver.enable = true;
2025-02-10 11:14:39 -06:00
2025-02-14 13:31:18 -06:00
services.displayManager.sddm = {
2025-02-10 11:14:39 -06:00
enable = true;
2025-02-14 13:31:18 -06:00
# package = lib.mkForce pkgs.kdePackages.sddm;
settings = { };
# theme = "";
enableHidpi = true;
wayland = {
enable = true;
compositor = "weston";
};
2025-02-10 11:14:39 -06:00
};
2025-02-14 13:31:18 -06:00
services.desktopManager.plasma6.enable = true;
programs.dconf.enable = true;
2024-09-12 12:05:22 -05:00
2025-02-14 13:31:18 -06:00
services.xrdp.enable = false;
services.xrdp.defaultWindowManager = "plasma";
services.xrdp.openFirewall = false;
2025-02-14 13:31:18 -06:00
environment.systemPackages = with pkgs; [
wl-clipboard
inkscape
krita
noto-fonts
vlc
wl-clipboard
kdePackages.qtvirtualkeyboard
maliit-keyboard
maliit-framework
2025-02-14 13:31:18 -06:00
kdePackages.kate
kdePackages.kcalc
kdePackages.filelight
kdePackages.krdc
kdePackages.krfb
kdePackages.kclock
kdePackages.kweather
kdePackages.ktorrent
kdePackages.kdeplasma-addons
unstable-packages.kdePackages.krdp
/*
kdePackages.kdenlive
kdePackages.merkuro
kdePackages.neochat
kdePackages.kdevelop
kdePackages.kdialog
*/
];
2025-02-14 13:31:18 -06:00
programs.gnupg.agent.pinentryPackage = lib.mkForce pkgs.pinentry-qt;
};
2025-02-14 13:31:18 -06:00
lutris =
{ pkgs, ... }:
{
environment = {
systemPackages = with pkgs; [
wineWowPackages.waylandFull
lutris
winetricks
];
};
};
2024-08-23 14:23:49 -05:00
2025-02-14 13:31:18 -06:00
gaming =
{ pkgs, ... }:
{
imports = with nixosModules; [
2025-02-16 09:12:42 -06:00
lutris # TODO: use the flatpak?
2025-02-14 13:31:18 -06:00
steam # TODO: use the flatpak?
2024-08-23 14:23:49 -05:00
];
2025-02-14 13:31:18 -06:00
environment = {
systemPackages = with pkgs; [
ludusavi
# ludusavi uses rclone
rclone
];
};
2024-08-23 14:23:49 -05:00
};
pipewire = {
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
jack.enable = true;
# wireplumber.enable = true; # this is default now
wireplumber.extraConfig = {
"monitor.bluez.properties" = {
"bluez5.enable-sbc-xq" = true;
"bluez5.enable-msbc" = true;
"bluez5.enable-hw-volume" = true;
2025-02-14 13:31:18 -06:00
"bluez5.roles" = [
"hsp_hs"
"hsp_ag"
"hfp_hf"
"hfp_ag"
];
};
};
extraConfig.pipewire."91-null-sinks" = {
"context.objects" = [
{
# A default dummy driver. This handles nodes marked with the "node.always-driver"
# properyty when no other driver is currently active. JACK clients need this.
factory = "spa-node-factory";
args = {
"factory.name" = "support.node.driver";
"node.name" = "Dummy-Driver";
"priority.driver" = 8000;
};
}
{
factory = "adapter";
args = {
"factory.name" = "support.null-audio-sink";
"node.name" = "Microphone-Proxy";
"node.description" = "Microphone";
"media.class" = "Audio/Source/Virtual";
"audio.position" = "MONO";
};
}
{
factory = "adapter";
args = {
"factory.name" = "support.null-audio-sink";
"node.name" = "Main-Output-Proxy";
"node.description" = "Main Output";
"media.class" = "Audio/Sink";
"audio.position" = "FL,FR";
};
}
];
};
2024-09-12 12:05:22 -05:00
/*
2025-02-14 13:31:18 -06:00
extraConfig.pipewire."92-low-latency" = {
context.properties = {
default.clock.rate = 48000;
default.clock.quantum = 32;
default.clock.min-quantum = 32;
default.clock.max-quantum = 32;
};
};
2024-09-12 12:05:22 -05:00
*/
};
# recommended by https://nixos.wiki/wiki/PipeWire
security.rtkit.enable = true;
2024-09-12 12:05:22 -05:00
/*
2025-02-14 13:31:18 -06:00
services.pipewire = {
enable = true;
2025-02-14 13:31:18 -06:00
wireplumber.enable = true;
pulse.enable = true;
jack.enable = true;
2025-02-14 13:31:18 -06:00
alsa = {
enable = true;
support32Bit = true;
};
2024-09-12 12:05:22 -05:00
};
2025-02-14 13:31:18 -06:00
hardware = {
pulseaudio = {
enable = false;
support32Bit = true;
};
2024-09-12 12:05:22 -05:00
};
2025-02-14 13:31:18 -06:00
security = {
# I forget why I need these exactly...
polkit.enable = true;
2025-02-14 13:31:18 -06:00
rtkit.enable = true;
};
2024-09-12 12:05:22 -05:00
*/
};
2025-02-14 13:31:18 -06:00
podman =
{
pkgs,
config,
lib,
...
}:
{
config = lib.mkIf config.virtualisation.podman.enable {
environment = {
systemPackages = with pkgs; [
podman-compose
];
};
virtualisation = {
podman = {
dockerCompat = config.virtualisation.podman.enable;
dockerSocket.enable = true;
defaultNetwork.settings.dns_enabled = true;
};
2025-02-14 13:31:18 -06:00
oci-containers = {
backend = "podman";
};
2025-02-14 13:04:04 -06:00
};
2025-02-14 13:31:18 -06:00
networking = {
extraHosts = ''
127.0.0.1 host.docker.internal
::1 host.docker.internal
127.0.0.1 host.containers.internal
::1 host.containers.internal
'';
2025-02-14 13:04:04 -06:00
};
};
2025-02-14 13:31:18 -06:00
};
2025-02-14 13:31:18 -06:00
virtual-machines =
{
lib,
config,
...
}:
{
config = lib.mkIf config.virtualisation.libvirtd.enable {
users.users.daniel.extraGroups = [ "libvirtd" ];
};
};
2025-02-14 13:31:18 -06:00
postgres =
{
pkgs,
lib,
config,
...
}:
{
config = lib.mkIf config.services.postgresql.enable {
# this is really just for development usage
services.postgresql = {
ensureDatabases = [ "daniel" ];
ensureUsers = [
{
name = "daniel";
ensureDBOwnership = true;
}
];
# enableTCPIP = true;
# package = pkgs.postgresql_15;
authentication = pkgs.lib.mkOverride 10 ''
#type database DBuser auth-method
local all postgres peer map=superuser_map
local all daniel peer map=superuser_map
local sameuser all peer map=superuser_map
# lan ipv4
host all all 10.0.0.0/24 trust
host all all 127.0.0.1/32 trust
# tailnet ipv4
host all all 100.64.0.0/10 trust
'';
identMap = ''
# ArbitraryMapName systemUser DBUser
superuser_map root postgres
superuser_map postgres postgres
superuser_map daniel postgres
superuser_map /^(.*)$ \1 # Let other names login as themselves
'';
};
2024-10-03 09:23:44 -05:00
2025-02-14 13:31:18 -06:00
environment.systemPackages = with pkgs; [
pgcli
2025-02-14 13:04:04 -06:00
];
};
};
2025-02-14 13:31:18 -06:00
desktop =
{
pkgs,
lib,
config,
2025-02-14 15:40:53 -06:00
options,
2025-02-14 13:31:18 -06:00
...
}:
let
cfg = config.lyte.desktop;
in
{
options = {
lyte = {
desktop = {
enable = lib.mkEnableOption "Enable my default desktop configuration and applications";
};
2025-02-14 13:04:04 -06:00
};
};
2025-02-14 13:31:18 -06:00
config = lib.mkIf cfg.enable {
2025-02-16 09:12:42 -06:00
# services.xserver.desktopManager.gnome.enable = true;
2025-02-14 15:40:53 -06:00
xdg.portal.enable = true;
hardware =
if builtins.hasAttr "graphics" options.hardware then
{
graphics = {
enable = true;
# enable32Bit = true;
/*
driSupport32Bit = true;
driSupport = true;
*/
};
}
else
{
opengl = {
enable = true;
# driSupport32Bit = true;
driSupport = true;
};
};
fonts.packages = [
(
# allow nixpkgs 24.11 and unstable to both work
if builtins.hasAttr "nerd-fonts" pkgs then
(pkgs.nerd-fonts.symbols-only)
else
(pkgs.nerdfonts.override { fonts = [ "NerdFontsSymbolsOnly" ]; })
)
pkgs.iosevkaLyteTerm
];
2025-02-14 13:31:18 -06:00
services.flatpak.enable = true;
programs.appimage.binfmt = true;
services.printing.enable = true;
2025-02-14 15:40:53 -06:00
programs.virt-manager.enable = config.virtualisation.libvirtd.enable;
2025-02-14 13:04:04 -06:00
};
};
2025-02-14 13:31:18 -06:00
printing =
{
pkgs,
lib,
config,
...
}:
{
config = lib.mkIf config.services.printing.enable {
services.printing.browsing = true;
services.printing.browsedConf = ''
BrowseDNSSDSubTypes _cups,_print
BrowseLocalProtocols all
BrowseRemoteProtocols all
CreateIPPPrinterQueues All
BrowseProtocols all
'';
services.printing.drivers = [ pkgs.gutenprint ];
};
2025-02-14 13:04:04 -06:00
};
2025-02-14 13:31:18 -06:00
wifi =
{
lib,
config,
...
}:
let
inherit (lib) mkDefault;
cfg = config.networking.wifi;
in
{
options = {
networking.wifi.enable = lib.mkEnableOption "Enable wifi via NetworkManager";
2025-02-14 13:04:04 -06:00
};
2025-02-14 13:31:18 -06:00
config = lib.mkIf cfg.enable {
networking.networkmanager = {
enable = true;
# ensureProfiles = {
# profiles = {
# home-wifi = {
# id="home-wifi";
# permissions = "";
# type = "wifi";
# };
# wifi = {
# ssid = "";
# };
# wifi-security = {
# # auth-alg = "";
# # key-mgmt = "";
# psk = "";
# };
# };
# };
};
systemd.services.NetworkManager-wait-online.enable = mkDefault false;
2025-02-14 13:31:18 -06:00
/*
TODO: networking.networkmanager.wifi.backend = "iwd"; ?
TODO: powersave?
TODO: can I pre-configure my usual wifi networks with SSIDs and PSKs loaded from secrets?
*/
hardware.wirelessRegulatoryDatabase = true;
boot.extraModprobeConfig = ''
options cfg80211 ieee80211_regdom="US"
'';
};
2025-02-14 13:04:04 -06:00
};
2025-02-14 13:31:18 -06:00
steam =
2025-02-14 15:40:53 -06:00
{ pkgs, options, ... }:
2025-02-14 13:31:18 -06:00
{
programs.gamescope.enable = true;
2025-02-14 15:40:53 -06:00
services.pipewire = {
alsa.support32Bit = true;
};
2025-02-14 13:31:18 -06:00
programs.steam = {
enable = true;
2024-09-12 12:05:22 -05:00
2025-02-14 13:31:18 -06:00
extest.enable = true;
gamescopeSession.enable = true;
2025-02-14 13:31:18 -06:00
extraPackages = with pkgs; [
gamescope
];
2025-02-14 13:31:18 -06:00
extraCompatPackages = with pkgs; [
proton-ge-bin
];
2025-02-14 13:31:18 -06:00
localNetworkGameTransfers.openFirewall = true;
remotePlay.openFirewall = true;
};
2025-02-14 15:40:53 -06:00
hardware =
(
if builtins.hasAttr "graphics" options.hardware then
{
graphics = {
enable = true;
enable32Bit = true;
};
}
else
{
opengl = {
enable = true;
driSupport32Bit = true;
};
}
)
// {
steam-hardware.enable = true;
};
2025-02-14 13:31:18 -06:00
services.udev.packages = with pkgs; [ steam ];
2025-02-14 13:31:18 -06:00
environment.systemPackages = with pkgs; [
dualsensectl # for interfacing with dualsense controllers programmatically
];
2025-02-14 13:31:18 -06:00
# remote play ports - should be unnecessary due to programs.steam.remotePlay.openFirewall = true;
/*
networking.firewall.allowedUDPPortRanges = [ { from = 27031; to = 27036; } ];
networking.firewall.allowedTCPPortRanges = [ { from = 27036; to = 27037; } ];
*/
2024-07-30 17:02:42 -05:00
};
2025-02-14 13:31:18 -06:00
root =
{
pkgs,
lib,
...
}:
{
users.users.root = {
home = "/root";
createHome = true;
openssh.authorizedKeys.keys = [ pubkey ];
shell = lib.mkForce pkgs.fish;
2024-07-30 17:02:42 -05:00
};
};
2025-02-14 13:31:18 -06:00
daniel =
{
pkgs,
lib,
config,
...
}:
{
2025-02-14 15:40:53 -06:00
users.groups.daniel = { };
users.users.daniel = {
2025-02-14 13:31:18 -06:00
isNormalUser = true;
2025-02-14 15:40:53 -06:00
home = "/home/daniel/.home";
description = "Daniel Flanagan";
2025-02-14 13:31:18 -06:00
createHome = true;
openssh.authorizedKeys.keys = [ pubkey ];
2025-02-14 15:40:53 -06:00
group = "daniel";
2025-02-14 13:31:18 -06:00
extraGroups = [
"users"
"wheel"
"video"
"dialout"
"uucp"
"kvm"
];
packages = [ ];
};
};
}