mirror of
https://github.com/Jokiller230/puzzlevision.git
synced 2025-09-09 12:20:04 +00:00
✨ Run nixfmt-rfc-style on repository and add it to Zed config
This commit is contained in:
parent
f5e5adb2fd
commit
45494079c5
41 changed files with 441 additions and 240 deletions
24
flake.lock
generated
24
flake.lock
generated
|
@ -7,11 +7,11 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1747519437,
|
"lastModified": 1748080874,
|
||||||
"narHash": "sha256-uv9Wv59d+mckS2CkorOF484wp2G5TNGijdoBZ5RkAk0=",
|
"narHash": "sha256-sUebEzAkrY8Aq5G0GHFyRddmRNGP/a2iTtV7ISNvi/c=",
|
||||||
"owner": "catppuccin",
|
"owner": "catppuccin",
|
||||||
"repo": "nix",
|
"repo": "nix",
|
||||||
"rev": "3ba714046ee32373e88166e6e9474d6ae6a5b734",
|
"rev": "0ba11b12be81f0849a89ed17ab635164ea8f0112",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -76,11 +76,11 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1747955385,
|
"lastModified": 1748182899,
|
||||||
"narHash": "sha256-AKoBFaEGN02tGvBlkwVIDOGXouHvrTTfOUcvBDGxkxQ=",
|
"narHash": "sha256-r6MHSalDFydlUmjorVTSsyhLjIt8VWNtGc5+mffXvFQ=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "a868570581f0dbdef7e33c8c9bb34b735dfcbacf",
|
"rev": "901f8fef7f349cf8a8e97b3230b22fd592df9160",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -118,11 +118,11 @@
|
||||||
"treefmt-nix": "treefmt-nix"
|
"treefmt-nix": "treefmt-nix"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1747878048,
|
"lastModified": 1748137719,
|
||||||
"narHash": "sha256-kAR4Ox+vShPzsUar/1rHarRgUBPpm7hxwi7sIffNYa4=",
|
"narHash": "sha256-yBiIy+eb0QxYoIOzOY7QyjqXY5PiLgIoNbFtg4SbUH8=",
|
||||||
"owner": "kaylorben",
|
"owner": "kaylorben",
|
||||||
"repo": "nixcord",
|
"repo": "nixcord",
|
||||||
"rev": "5f737debf65b8409392604098a7489d997746450",
|
"rev": "c4d7ccc9ae9fc1c46820bdc5b800b4f66e972ccc",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -149,11 +149,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs_2": {
|
"nixpkgs_2": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1747744144,
|
"lastModified": 1748026106,
|
||||||
"narHash": "sha256-W7lqHp0qZiENCDwUZ5EX/lNhxjMdNapFnbErcbnP11Q=",
|
"narHash": "sha256-6m1Y3/4pVw1RWTsrkAK2VMYSzG4MMIj7sqUy7o8th1o=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "2795c506fe8fb7b03c36ccb51f75b6df0ab2553f",
|
"rev": "063f43f2dbdef86376cc29ad646c45c46e93234c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
|
@ -48,13 +48,14 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = {flake-parts, ...} @ inputs:
|
outputs =
|
||||||
flake-parts.lib.mkFlake {inherit inputs;} {
|
{ flake-parts, ... }@inputs:
|
||||||
|
flake-parts.lib.mkFlake { inherit inputs; } {
|
||||||
imports = [
|
imports = [
|
||||||
./modules/flake
|
./modules/flake
|
||||||
];
|
];
|
||||||
|
|
||||||
systems = ["x86_64-linux"];
|
systems = [ "x86_64-linux" ];
|
||||||
flake = {
|
flake = {
|
||||||
# Exposing the flake namespace
|
# Exposing the flake namespace
|
||||||
namespace = "puzzlevision";
|
namespace = "puzzlevision";
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
{pkgs, ...}: {
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
### Tools
|
### Tools
|
||||||
git
|
git
|
||||||
|
|
|
@ -2,9 +2,11 @@
|
||||||
lib,
|
lib,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkIf;
|
inherit (lib) mkIf;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
# Enable arRPC for discord Rich Presence stuffs
|
# Enable arRPC for discord Rich Presence stuffs
|
||||||
services.arrpc.enable = true;
|
services.arrpc.enable = true;
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,11 @@
|
||||||
osConfig,
|
osConfig,
|
||||||
namespace,
|
namespace,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkIf;
|
inherit (lib) mkIf;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
programs.youtube-music = {
|
programs.youtube-music = {
|
||||||
enable = true;
|
enable = true;
|
||||||
options = {
|
options = {
|
||||||
|
|
|
@ -2,7 +2,8 @@
|
||||||
pkgs,
|
pkgs,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: {
|
}:
|
||||||
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./apps/discord
|
./apps/discord
|
||||||
./apps/youtube-music
|
./apps/youtube-music
|
||||||
|
|
|
@ -2,24 +2,29 @@
|
||||||
lib,
|
lib,
|
||||||
self,
|
self,
|
||||||
...
|
...
|
||||||
}: {
|
}:
|
||||||
|
{
|
||||||
# Create a NixOS module option on a single line.
|
# Create a NixOS module option on a single line.
|
||||||
mkOpt = type: default: description:
|
mkOpt =
|
||||||
lib.mkOption {inherit type default description;};
|
type: default: description:
|
||||||
|
lib.mkOption { inherit type default description; };
|
||||||
|
|
||||||
# Create a simple bool options
|
# Create a simple bool options
|
||||||
mkBool = default: description:
|
mkBool =
|
||||||
|
default: description:
|
||||||
lib.mkOption {
|
lib.mkOption {
|
||||||
inherit default description;
|
inherit default description;
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Create a module compliant with the NixOS module system.
|
# Create a module compliant with the NixOS module system.
|
||||||
mkModule = {
|
mkModule =
|
||||||
|
{
|
||||||
name ? "puzzlevision",
|
name ? "puzzlevision",
|
||||||
class,
|
class,
|
||||||
modules,
|
modules,
|
||||||
}: {
|
}:
|
||||||
|
{
|
||||||
_class = class;
|
_class = class;
|
||||||
# Template: "[path-to-flake]/flake.nix#[class-name]Modules.[module-name]"
|
# Template: "[path-to-flake]/flake.nix#[class-name]Modules.[module-name]"
|
||||||
# Example: "[path-to-flake]/flake.nix#nixosModules.system.audio"
|
# Example: "[path-to-flake]/flake.nix#nixosModules.system.audio"
|
||||||
|
|
|
@ -2,35 +2,43 @@
|
||||||
lib,
|
lib,
|
||||||
self,
|
self,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
# Utility function to read a directory and return its contents.
|
# Utility function to read a directory and return its contents.
|
||||||
readDirectory = directory: builtins.readDir directory;
|
readDirectory = directory: builtins.readDir directory;
|
||||||
|
|
||||||
# Utility function to handle each filesystem entity (file or directory).
|
# Utility function to handle each filesystem entity (file or directory).
|
||||||
filesystemEntityToAttrSet = directory: importArgs: name: type:
|
filesystemEntityToAttrSet =
|
||||||
if type == "directory"
|
directory: importArgs: name: type:
|
||||||
then dirToAttrSet "${directory}/${name}" importArgs
|
if type == "directory" then
|
||||||
else if name == "default.nix"
|
dirToAttrSet "${directory}/${name}" importArgs
|
||||||
then import "${directory}/${name}" importArgs
|
else if name == "default.nix" then
|
||||||
else {};
|
import "${directory}/${name}" importArgs
|
||||||
|
else
|
||||||
|
{ };
|
||||||
|
|
||||||
filesystemEntityToList = directory: name: type:
|
filesystemEntityToList =
|
||||||
if type == "directory"
|
directory: name: type:
|
||||||
then dirToModuleList "${directory}/${name}"
|
if type == "directory" then
|
||||||
else if name == "default.nix"
|
dirToModuleList "${directory}/${name}"
|
||||||
then ["${directory}/${name}"]
|
else if name == "default.nix" then
|
||||||
else [];
|
[ "${directory}/${name}" ]
|
||||||
|
else
|
||||||
|
[ ];
|
||||||
|
|
||||||
dirToModuleList = directory: let
|
dirToModuleList =
|
||||||
|
directory:
|
||||||
|
let
|
||||||
readDir = readDirectory directory;
|
readDir = readDirectory directory;
|
||||||
in
|
in
|
||||||
builtins.foldl' (
|
builtins.foldl' (
|
||||||
acc: name:
|
acc: name: acc ++ (filesystemEntityToList directory name (builtins.getAttr name readDir))
|
||||||
acc ++ (filesystemEntityToList directory name (builtins.getAttr name readDir))
|
) [ ] (builtins.attrNames readDir);
|
||||||
) [] (builtins.attrNames readDir);
|
|
||||||
|
|
||||||
# Utility function to recursively load modules from a directory.
|
# Utility function to recursively load modules from a directory.
|
||||||
dirToAttrSet = directory: importArgs: let
|
dirToAttrSet =
|
||||||
|
directory: importArgs:
|
||||||
|
let
|
||||||
# Read provided directory only once at the very start and save the result.
|
# Read provided directory only once at the very start and save the result.
|
||||||
readDir = readDirectory directory;
|
readDir = readDirectory directory;
|
||||||
in
|
in
|
||||||
|
@ -40,10 +48,18 @@
|
||||||
# Merge outputs of handling a filesystem entity (file or directory) into accumulator.
|
# Merge outputs of handling a filesystem entity (file or directory) into accumulator.
|
||||||
# Files return attribute sets with their resulting expressions, directories return the result of multiple file handling operations.
|
# Files return attribute sets with their resulting expressions, directories return the result of multiple file handling operations.
|
||||||
acc // (filesystemEntityToAttrSet directory importArgs name (builtins.getAttr name readDir))
|
acc // (filesystemEntityToAttrSet directory importArgs name (builtins.getAttr name readDir))
|
||||||
) {} (builtins.attrNames readDir);
|
) { } (builtins.attrNames readDir);
|
||||||
|
|
||||||
puzzlelib = dirToAttrSet ../../lib {inherit lib self;} // {inherit dirToAttrSet dirToModuleList filesystemEntityToList filesystemEntityToAttrSet;};
|
puzzlelib = dirToAttrSet ../../lib { inherit lib self; } // {
|
||||||
in {
|
inherit
|
||||||
|
dirToAttrSet
|
||||||
|
dirToModuleList
|
||||||
|
filesystemEntityToList
|
||||||
|
filesystemEntityToAttrSet
|
||||||
|
;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
# Expose custom library on flake "lib" output
|
# Expose custom library on flake "lib" output
|
||||||
flake.lib = puzzlelib;
|
flake.lib = puzzlelib;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
{self, ...}: {
|
{ self, ... }:
|
||||||
|
{
|
||||||
flake = {
|
flake = {
|
||||||
# TODO: figure out why this isn't working correctly
|
# TODO: figure out why this isn't working correctly
|
||||||
nixosModules.puzzlevision = self.lib.mkModule {
|
nixosModules.puzzlevision = self.lib.mkModule {
|
||||||
|
|
|
@ -3,7 +3,8 @@
|
||||||
self,
|
self,
|
||||||
inputs,
|
inputs,
|
||||||
...
|
...
|
||||||
}: {
|
}:
|
||||||
|
{
|
||||||
imports = [
|
imports = [
|
||||||
inputs.easy-hosts.flakeModule
|
inputs.easy-hosts.flakeModule
|
||||||
];
|
];
|
||||||
|
|
|
@ -4,12 +4,14 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf mkForce;
|
inherit (lib) mkEnableOption mkIf mkForce;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
|
|
||||||
cfg = config.${namespace}.apps.zed;
|
cfg = config.${namespace}.apps.zed;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.apps.zed = {
|
options.${namespace}.apps.zed = {
|
||||||
enable = mkEnableOption "zed, the graphical editor from the future";
|
enable = mkEnableOption "zed, the graphical editor from the future";
|
||||||
};
|
};
|
||||||
|
@ -67,11 +69,14 @@ in {
|
||||||
### Language specific configurations
|
### Language specific configurations
|
||||||
languages = {
|
languages = {
|
||||||
Nix = {
|
Nix = {
|
||||||
language_servers = ["nixd" "!nil"];
|
language_servers = [
|
||||||
|
"nixd"
|
||||||
|
"!nil"
|
||||||
|
];
|
||||||
formatter = {
|
formatter = {
|
||||||
external = {
|
external = {
|
||||||
command = "alejandra";
|
command = "nixfmt";
|
||||||
arguments = ["--quiet"];
|
arguments = [ "--quiet" ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -123,6 +128,7 @@ in {
|
||||||
### Nix
|
### Nix
|
||||||
nixd
|
nixd
|
||||||
alejandra
|
alejandra
|
||||||
|
nixfmt-rfc-style
|
||||||
|
|
||||||
### Python
|
### Python
|
||||||
python3Packages.python-lsp-server
|
python3Packages.python-lsp-server
|
||||||
|
|
|
@ -5,24 +5,44 @@
|
||||||
config,
|
config,
|
||||||
osConfig,
|
osConfig,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkIf mkOption;
|
inherit (lib) mkIf mkOption;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
inherit (self.lib) mkOpt;
|
inherit (self.lib) mkOpt;
|
||||||
|
|
||||||
cfg = config.${namespace}.desktop.gnome;
|
cfg = config.${namespace}.desktop.gnome;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.desktop.gnome = with lib.types; {
|
options.${namespace}.desktop.gnome = with lib.types; {
|
||||||
enabled-extensions = mkOption {
|
enabled-extensions = mkOption {
|
||||||
type = listOf package;
|
type = listOf package;
|
||||||
default = with pkgs.gnomeExtensions; [user-themes blur-my-shell appindicator unite color-picker clipboard-history];
|
default = with pkgs.gnomeExtensions; [
|
||||||
example = [dash-to-dock blur-my-shell];
|
user-themes
|
||||||
|
blur-my-shell
|
||||||
|
appindicator
|
||||||
|
unite
|
||||||
|
color-picker
|
||||||
|
clipboard-history
|
||||||
|
];
|
||||||
|
example = [
|
||||||
|
dash-to-dock
|
||||||
|
blur-my-shell
|
||||||
|
];
|
||||||
description = "Specify gnome extensions to install.";
|
description = "Specify gnome extensions to install.";
|
||||||
};
|
};
|
||||||
favorite-apps = mkOption {
|
favorite-apps = mkOption {
|
||||||
type = listOf str;
|
type = listOf str;
|
||||||
default = ["org.gnome.Nautilus.desktop" "obsidian.desktop" "firefox.desktop" "dev.zed.Zed.desktop"];
|
default = [
|
||||||
example = ["org.gnome.Nautilus.desktop" "obsidian.desktop"];
|
"org.gnome.Nautilus.desktop"
|
||||||
|
"obsidian.desktop"
|
||||||
|
"firefox.desktop"
|
||||||
|
"dev.zed.Zed.desktop"
|
||||||
|
];
|
||||||
|
example = [
|
||||||
|
"org.gnome.Nautilus.desktop"
|
||||||
|
"obsidian.desktop"
|
||||||
|
];
|
||||||
description = "Specify your favorite apps (sorted left to right).";
|
description = "Specify your favorite apps (sorted left to right).";
|
||||||
};
|
};
|
||||||
extensions = {
|
extensions = {
|
||||||
|
@ -44,7 +64,9 @@ in {
|
||||||
enable-blur = mkOpt bool false "Whether to enable blur-my-shell application blur.";
|
enable-blur = mkOpt bool false "Whether to enable blur-my-shell application blur.";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
wallpaper = mkOpt str (builtins.toString ../wallpapers/catppuccin/howard-chen-mao-mao-forest-campsite.jpg) "Specify the path of your prefered Gnome wallpaper.";
|
wallpaper =
|
||||||
|
mkOpt str (builtins.toString ../wallpapers/catppuccin/howard-chen-mao-mao-forest-campsite.jpg)
|
||||||
|
"Specify the path of your prefered Gnome wallpaper.";
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf osConfig.${namespace}.desktop.gnome.enable {
|
config = mkIf osConfig.${namespace}.desktop.gnome.enable {
|
||||||
|
@ -54,9 +76,11 @@ in {
|
||||||
"org/gnome/shell" = {
|
"org/gnome/shell" = {
|
||||||
favorite-apps = cfg.favorite-apps;
|
favorite-apps = cfg.favorite-apps;
|
||||||
enabled-extensions = lib.forEach cfg.enabled-extensions (x: x.extensionUuid);
|
enabled-extensions = lib.forEach cfg.enabled-extensions (x: x.extensionUuid);
|
||||||
disabled-extensions = []; # Make sure none of our extensions are disabled on system rebuild
|
disabled-extensions = [ ]; # Make sure none of our extensions are disabled on system rebuild
|
||||||
};
|
};
|
||||||
"org/gnome/shell/extensions/unite" = mkIf (builtins.elem pkgs.gnomeExtensions.unite cfg.enabled-extensions) {
|
"org/gnome/shell/extensions/unite" =
|
||||||
|
mkIf (builtins.elem pkgs.gnomeExtensions.unite cfg.enabled-extensions)
|
||||||
|
{
|
||||||
show-window-buttons = cfg.extensions.unite.show-window-buttons;
|
show-window-buttons = cfg.extensions.unite.show-window-buttons;
|
||||||
hide-window-titlebars = cfg.extensions.unite.hide-window-titlebars;
|
hide-window-titlebars = cfg.extensions.unite.hide-window-titlebars;
|
||||||
|
|
||||||
|
@ -72,7 +96,9 @@ in {
|
||||||
autofocus-windows = true;
|
autofocus-windows = true;
|
||||||
notifications-position = "right";
|
notifications-position = "right";
|
||||||
};
|
};
|
||||||
"org/gnome/shell/extensions/blur-my-shell/applications" = mkIf cfg.extensions.blur-my-shell.enable-blur {
|
"org/gnome/shell/extensions/blur-my-shell/applications" =
|
||||||
|
mkIf cfg.extensions.blur-my-shell.enable-blur
|
||||||
|
{
|
||||||
blur = true;
|
blur = true;
|
||||||
sigma = 30;
|
sigma = 30;
|
||||||
opacity = 230;
|
opacity = 230;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
{config, ...}: {
|
{ config, ... }:
|
||||||
|
{
|
||||||
sops = {
|
sops = {
|
||||||
age.keyFile = "/home/${config.home.username}/sops-nix/key.txt";
|
age.keyFile = "/home/${config.home.username}/sops-nix/key.txt";
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,19 +6,25 @@
|
||||||
osConfig,
|
osConfig,
|
||||||
namespace,
|
namespace,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption types mkIf;
|
inherit (lib) mkEnableOption types mkIf;
|
||||||
inherit (self.lib) mkOpt;
|
inherit (self.lib) mkOpt;
|
||||||
|
|
||||||
palette = (pkgs.lib.importJSON (config.catppuccin.sources.palette + "/palette.json")).${config.catppuccin.flavor}.colors;
|
palette =
|
||||||
|
(pkgs.lib.importJSON (config.catppuccin.sources.palette + "/palette.json"))
|
||||||
|
.${config.catppuccin.flavor}.colors;
|
||||||
|
|
||||||
cfg = config.${namespace}.themes.catppuccin;
|
cfg = config.${namespace}.themes.catppuccin;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.themes.catppuccin = {
|
options.${namespace}.themes.catppuccin = {
|
||||||
enable = mkEnableOption "the Catppuccin theme, globally.";
|
enable = mkEnableOption "the Catppuccin theme, globally.";
|
||||||
accent = mkOpt types.str "blue" "The accent colour to use.";
|
accent = mkOpt types.str "blue" "The accent colour to use.";
|
||||||
flavor = mkOpt types.str "macchiato" "The flavor to use.";
|
flavor = mkOpt types.str "macchiato" "The flavor to use.";
|
||||||
palette = mkOpt (lib.types.attrsOf lib.types.raw) palette "a reference to the current active Catppuccin palette.";
|
palette =
|
||||||
|
mkOpt (lib.types.attrsOf lib.types.raw) palette
|
||||||
|
"a reference to the current active Catppuccin palette.";
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
config,
|
config,
|
||||||
namespace,
|
namespace,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf;
|
inherit (lib) mkEnableOption mkIf;
|
||||||
|
|
||||||
catppuccinCfg = config.${namespace}.themes.catppuccin;
|
catppuccinCfg = config.${namespace}.themes.catppuccin;
|
||||||
|
@ -104,16 +105,19 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
cfg = config.${namespace}.themes.catppuccin.gtk;
|
cfg = config.${namespace}.themes.catppuccin.gtk;
|
||||||
in {
|
in
|
||||||
options.${namespace}.themes.catppuccin.gtk = {enable = mkEnableOption "Enable the Catppuccin theme for GTK";};
|
{
|
||||||
|
options.${namespace}.themes.catppuccin.gtk = {
|
||||||
|
enable = mkEnableOption "Enable the Catppuccin theme for GTK";
|
||||||
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
(colloid-gtk-theme.override {
|
(colloid-gtk-theme.override {
|
||||||
themeVariants = ["default"];
|
themeVariants = [ "default" ];
|
||||||
colorVariants = ["dark"];
|
colorVariants = [ "dark" ];
|
||||||
sizeVariants = ["standard"];
|
sizeVariants = [ "standard" ];
|
||||||
tweaks = ["catppuccin"];
|
tweaks = [ "catppuccin" ];
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -3,12 +3,14 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf;
|
inherit (lib) mkEnableOption mkIf;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
|
|
||||||
cfg = config.${namespace}.archetypes.laptop;
|
cfg = config.${namespace}.archetypes.laptop;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.archetypes.laptop = {
|
options.${namespace}.archetypes.laptop = {
|
||||||
enable = mkEnableOption "the laptop archetype.";
|
enable = mkEnableOption "the laptop archetype.";
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,12 +3,14 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf;
|
inherit (lib) mkEnableOption mkIf;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
|
|
||||||
cfg = config.${namespace}.archetypes.server;
|
cfg = config.${namespace}.archetypes.server;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.archetypes.server = {
|
options.${namespace}.archetypes.server = {
|
||||||
enable = mkEnableOption "the server archetype for your current system";
|
enable = mkEnableOption "the server archetype for your current system";
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,12 +4,14 @@
|
||||||
pkgs,
|
pkgs,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf mkDefault;
|
inherit (lib) mkEnableOption mkIf mkDefault;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
|
|
||||||
cfg = config.${namespace}.archetypes.workstation;
|
cfg = config.${namespace}.archetypes.workstation;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.archetypes.workstation = {
|
options.${namespace}.archetypes.workstation = {
|
||||||
enable = mkEnableOption "the workstation archetype.";
|
enable = mkEnableOption "the workstation archetype.";
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,12 +4,14 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf;
|
inherit (lib) mkEnableOption mkIf;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
|
|
||||||
cfg = config.${namespace}.desktop.gnome;
|
cfg = config.${namespace}.desktop.gnome;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.desktop.gnome = {
|
options.${namespace}.desktop.gnome = {
|
||||||
enable = mkEnableOption "the gnome desktop environment";
|
enable = mkEnableOption "the gnome desktop environment";
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,18 +3,22 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf types;
|
inherit (lib) mkEnableOption mkIf types;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
inherit (self.lib) mkOpt;
|
inherit (self.lib) mkOpt;
|
||||||
|
|
||||||
cfg = config.${namespace}.services.atticd;
|
cfg = config.${namespace}.services.atticd;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.services.atticd = {
|
options.${namespace}.services.atticd = {
|
||||||
enable = mkEnableOption "the attic service, a multi-tenant nix binary cache.";
|
enable = mkEnableOption "the attic service, a multi-tenant nix binary cache.";
|
||||||
sopsFile = mkOpt types.path null "The location of the sops secret file for the Atticd service.";
|
sopsFile = mkOpt types.path null "The location of the sops secret file for the Atticd service.";
|
||||||
sopsFormat = mkOpt types.str null "The format of the sops secret file for the Atticd service.";
|
sopsFormat = mkOpt types.str null "The format of the sops secret file for the Atticd service.";
|
||||||
subdomain = mkOpt types.str "cache" "The subdomain, of the system domain, the service should be exposed on.";
|
subdomain =
|
||||||
|
mkOpt types.str "cache"
|
||||||
|
"The subdomain, of the system domain, the service should be exposed on.";
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
|
@ -30,7 +34,7 @@ in {
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
listen = "[::]:3900";
|
listen = "[::]:3900";
|
||||||
jwt = {};
|
jwt = { };
|
||||||
|
|
||||||
chunking = {
|
chunking = {
|
||||||
nar-size-threshold = 64 * 1024; # 64 KiB
|
nar-size-threshold = 64 * 1024; # 64 KiB
|
||||||
|
@ -50,9 +54,9 @@ in {
|
||||||
|
|
||||||
services.traefik.dynamicConfigOptions = {
|
services.traefik.dynamicConfigOptions = {
|
||||||
http = {
|
http = {
|
||||||
services.atticd.loadBalancer.servers = [{url = "http://localhost:3900";}];
|
services.atticd.loadBalancer.servers = [ { url = "http://localhost:3900"; } ];
|
||||||
routers.atticd = {
|
routers.atticd = {
|
||||||
entryPoints = ["websecure"];
|
entryPoints = [ "websecure" ];
|
||||||
service = "atticd";
|
service = "atticd";
|
||||||
rule = "Host(`${cfg.subdomain}.${config.${namespace}.services.domain}`)";
|
rule = "Host(`${cfg.subdomain}.${config.${namespace}.services.domain}`)";
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,13 +2,17 @@
|
||||||
lib,
|
lib,
|
||||||
self,
|
self,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) types;
|
inherit (lib) types;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
inherit (self.lib) mkOpt;
|
inherit (self.lib) mkOpt;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.services = {
|
options.${namespace}.services = {
|
||||||
domain = mkOpt types.str "thevoid.cafe" "The main system domain, used for exposing services.";
|
domain = mkOpt types.str "thevoid.cafe" "The main system domain, used for exposing services.";
|
||||||
mail = mkOpt types.str "system@thevoid.cafe" "The main system administration E-Mail, used for logs and services.";
|
mail =
|
||||||
|
mkOpt types.str "system@thevoid.cafe"
|
||||||
|
"The main system administration E-Mail, used for logs and services.";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,12 +3,14 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkIf mkEnableOption;
|
inherit (lib) mkIf mkEnableOption;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
|
|
||||||
cfg = config.${namespace}.services.docker;
|
cfg = config.${namespace}.services.docker;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.services.docker = {
|
options.${namespace}.services.docker = {
|
||||||
enable = mkEnableOption "the docker service.";
|
enable = mkEnableOption "the docker service.";
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,13 +3,15 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf types;
|
inherit (lib) mkEnableOption mkIf types;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
inherit (self.lib) mkOpt;
|
inherit (self.lib) mkOpt;
|
||||||
|
|
||||||
cfg = config.${namespace}.services.duckdns;
|
cfg = config.${namespace}.services.duckdns;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.services.duckdns = {
|
options.${namespace}.services.duckdns = {
|
||||||
enable = mkEnableOption "DuckDNS, the dynamic dns service. Will periodically refresh your IP.";
|
enable = mkEnableOption "DuckDNS, the dynamic dns service. Will periodically refresh your IP.";
|
||||||
sopsFile = mkOpt types.path null "The location of the sops secret file for the DuckDNS service.";
|
sopsFile = mkOpt types.path null "The location of the sops secret file for the DuckDNS service.";
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
{...}: {
|
{ ... }:
|
||||||
|
{
|
||||||
# Todo: rewrite as recursive operation, based on ${namespace}.users
|
# Todo: rewrite as recursive operation, based on ${namespace}.users
|
||||||
system.userActivationScripts = {
|
system.userActivationScripts = {
|
||||||
removeConflictingHomeManagerBackups = {
|
removeConflictingHomeManagerBackups = {
|
||||||
|
|
|
@ -3,17 +3,23 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf types;
|
inherit (lib) mkEnableOption mkIf types;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
inherit (self.lib) mkOpt;
|
inherit (self.lib) mkOpt;
|
||||||
|
|
||||||
cfg = config.${namespace}.services.homepage;
|
cfg = config.${namespace}.services.homepage;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.services.homepage = {
|
options.${namespace}.services.homepage = {
|
||||||
enable = mkEnableOption "Homepage, an intuitive dashboard for your services.";
|
enable = mkEnableOption "Homepage, an intuitive dashboard for your services.";
|
||||||
subdomain = mkOpt types.str "home" "The subdomain, of the system domain, the service should be exposed on.";
|
subdomain =
|
||||||
configDir = mkOpt types.path null "The config directory, which will be copied to the Homepage directory during compilation.";
|
mkOpt types.str "home"
|
||||||
|
"The subdomain, of the system domain, the service should be exposed on.";
|
||||||
|
configDir =
|
||||||
|
mkOpt types.path null
|
||||||
|
"The config directory, which will be copied to the Homepage directory during compilation.";
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
|
@ -35,7 +41,9 @@ in {
|
||||||
labels = {
|
labels = {
|
||||||
"traefik.enable" = "true";
|
"traefik.enable" = "true";
|
||||||
"traefik.http.routers.homepage.entrypoints" = "websecure";
|
"traefik.http.routers.homepage.entrypoints" = "websecure";
|
||||||
"traefik.http.routers.homepage.rule" = "Host(`${cfg.subdomain}.${config.${namespace}.services.domain}`)";
|
"traefik.http.routers.homepage.rule" = "Host(`${cfg.subdomain}.${
|
||||||
|
config.${namespace}.services.domain
|
||||||
|
}`)";
|
||||||
"traefik.http.services.homepage.loadbalancer.server.port" = "3000";
|
"traefik.http.services.homepage.loadbalancer.server.port" = "3000";
|
||||||
};
|
};
|
||||||
volumes = [
|
volumes = [
|
||||||
|
@ -48,7 +56,7 @@ in {
|
||||||
environment = {
|
environment = {
|
||||||
"HOMEPAGE_ALLOWED_HOSTS" = "${cfg.subdomain}.${config.${namespace}.services.domain}";
|
"HOMEPAGE_ALLOWED_HOSTS" = "${cfg.subdomain}.${config.${namespace}.services.domain}";
|
||||||
};
|
};
|
||||||
extraOptions = ["--network=proxy"];
|
extraOptions = [ "--network=proxy" ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,13 +3,15 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf types;
|
inherit (lib) mkEnableOption mkIf types;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
inherit (self.lib) mkOpt;
|
inherit (self.lib) mkOpt;
|
||||||
|
|
||||||
cfg = config.${namespace}.services.traefik;
|
cfg = config.${namespace}.services.traefik;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.services.traefik = {
|
options.${namespace}.services.traefik = {
|
||||||
enable = mkEnableOption "the Traefik service.";
|
enable = mkEnableOption "the Traefik service.";
|
||||||
sopsFile = mkOpt types.path null "The location of the sops secret file for the Traefik service.";
|
sopsFile = mkOpt types.path null "The location of the sops secret file for the Traefik service.";
|
||||||
|
@ -17,7 +19,11 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
networking.firewall.allowedTCPPorts = [80 8080 443]; # http, dashboard, https
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
80
|
||||||
|
8080
|
||||||
|
443
|
||||||
|
]; # http, dashboard, https
|
||||||
|
|
||||||
sops.secrets."services/traefik" = {
|
sops.secrets."services/traefik" = {
|
||||||
sopsFile = cfg.sopsFile;
|
sopsFile = cfg.sopsFile;
|
||||||
|
@ -26,7 +32,7 @@ in {
|
||||||
|
|
||||||
systemd.services.traefik = {
|
systemd.services.traefik = {
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
EnvironmentFile = [config.sops.secrets."services/traefik".path];
|
EnvironmentFile = [ config.sops.secrets."services/traefik".path ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -84,11 +90,11 @@ in {
|
||||||
domains = [
|
domains = [
|
||||||
{
|
{
|
||||||
main = "thevoid.cafe";
|
main = "thevoid.cafe";
|
||||||
sans = ["*.thevoid.cafe"];
|
sans = [ "*.thevoid.cafe" ];
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
main = "rhysbot.co.uk";
|
main = "rhysbot.co.uk";
|
||||||
sans = ["*.rhysbot.co.uk"];
|
sans = [ "*.rhysbot.co.uk" ];
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,18 +3,24 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf types;
|
inherit (lib) mkEnableOption mkIf types;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
inherit (self.lib) mkOpt;
|
inherit (self.lib) mkOpt;
|
||||||
|
|
||||||
cfg = config.${namespace}.services.vaultwarden;
|
cfg = config.${namespace}.services.vaultwarden;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.services.vaultwarden = {
|
options.${namespace}.services.vaultwarden = {
|
||||||
enable = mkEnableOption "Vaultwarden, a self-hostable password manager.";
|
enable = mkEnableOption "Vaultwarden, a self-hostable password manager.";
|
||||||
sopsFile = mkOpt types.path null "The location of the sops secret file for the Vaultwarden service.";
|
sopsFile =
|
||||||
|
mkOpt types.path null
|
||||||
|
"The location of the sops secret file for the Vaultwarden service.";
|
||||||
sopsFormat = mkOpt types.str null "The format of the sops secret file for the Vaultwarden service.";
|
sopsFormat = mkOpt types.str null "The format of the sops secret file for the Vaultwarden service.";
|
||||||
subdomain = mkOpt types.str "vault" "The subdomain, of the system domain, the service should be exposed on.";
|
subdomain =
|
||||||
|
mkOpt types.str "vault"
|
||||||
|
"The subdomain, of the system domain, the service should be exposed on.";
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
|
@ -35,7 +41,9 @@ in {
|
||||||
labels = {
|
labels = {
|
||||||
"traefik.enable" = "true";
|
"traefik.enable" = "true";
|
||||||
"traefik.http.routers.vaultwarden.entrypoints" = "websecure";
|
"traefik.http.routers.vaultwarden.entrypoints" = "websecure";
|
||||||
"traefik.http.routers.vaultwarden.rule" = "Host(`${cfg.subdomain}.${config.${namespace}.services.domain}`)";
|
"traefik.http.routers.vaultwarden.rule" = "Host(`${cfg.subdomain}.${
|
||||||
|
config.${namespace}.services.domain
|
||||||
|
}`)";
|
||||||
};
|
};
|
||||||
volumes = [
|
volumes = [
|
||||||
"/var/lib/containers/vaultwarden/data:/data:rw"
|
"/var/lib/containers/vaultwarden/data:/data:rw"
|
||||||
|
@ -43,7 +51,7 @@ in {
|
||||||
environmentFiles = [
|
environmentFiles = [
|
||||||
config.sops.secrets."services/vaultwarden".path
|
config.sops.secrets."services/vaultwarden".path
|
||||||
];
|
];
|
||||||
extraOptions = ["--network=proxy"];
|
extraOptions = [ "--network=proxy" ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,12 +3,14 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf;
|
inherit (lib) mkEnableOption mkIf;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
|
|
||||||
cfg = config.${namespace}.system.audio;
|
cfg = config.${namespace}.system.audio;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.system.audio = {
|
options.${namespace}.system.audio = {
|
||||||
enable = mkEnableOption "system audio support.";
|
enable = mkEnableOption "system audio support.";
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,18 +4,20 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf;
|
inherit (lib) mkEnableOption mkIf;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
|
|
||||||
cfg = config.${namespace}.system.bluetooth;
|
cfg = config.${namespace}.system.bluetooth;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.system.bluetooth = {
|
options.${namespace}.system.bluetooth = {
|
||||||
enable = mkEnableOption "bluetooth support.";
|
enable = mkEnableOption "bluetooth support.";
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
environment.systemPackages = with pkgs; [bluez];
|
environment.systemPackages = with pkgs; [ bluez ];
|
||||||
|
|
||||||
hardware.bluetooth = {
|
hardware.bluetooth = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|
|
@ -4,12 +4,14 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf mkOption;
|
inherit (lib) mkEnableOption mkIf mkOption;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
|
|
||||||
cfg = config.${namespace}.system.fonts;
|
cfg = config.${namespace}.system.fonts;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.system.fonts = with lib.types; {
|
options.${namespace}.system.fonts = with lib.types; {
|
||||||
enable = mkEnableOption "system font management";
|
enable = mkEnableOption "system font management";
|
||||||
fonts = mkOption {
|
fonts = mkOption {
|
||||||
|
@ -30,13 +32,16 @@ in {
|
||||||
material-icons
|
material-icons
|
||||||
material-design-icons
|
material-design-icons
|
||||||
];
|
];
|
||||||
example = [noto-fonts noto-fonts-emoji];
|
example = [
|
||||||
|
noto-fonts
|
||||||
|
noto-fonts-emoji
|
||||||
|
];
|
||||||
description = "Install additional font packages";
|
description = "Install additional font packages";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
environment.systemPackages = with pkgs; [font-manager];
|
environment.systemPackages = with pkgs; [ font-manager ];
|
||||||
|
|
||||||
fonts.packages = cfg.fonts;
|
fonts.packages = cfg.fonts;
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,12 +3,14 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf;
|
inherit (lib) mkEnableOption mkIf;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
|
|
||||||
cfg = config.${namespace}.system.grub;
|
cfg = config.${namespace}.system.grub;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.system.grub = {
|
options.${namespace}.system.grub = {
|
||||||
enable = mkEnableOption "the grub bootloader.";
|
enable = mkEnableOption "the grub bootloader.";
|
||||||
};
|
};
|
||||||
|
@ -18,7 +20,7 @@ in {
|
||||||
|
|
||||||
boot.loader.grub = {
|
boot.loader.grub = {
|
||||||
enable = true;
|
enable = true;
|
||||||
devices = ["nodev"];
|
devices = [ "nodev" ];
|
||||||
efiInstallAsRemovable = true;
|
efiInstallAsRemovable = true;
|
||||||
efiSupport = true;
|
efiSupport = true;
|
||||||
|
|
||||||
|
|
|
@ -4,16 +4,20 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf;
|
inherit (lib) mkEnableOption mkIf;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
inherit (self.lib) mkOpt;
|
inherit (self.lib) mkOpt;
|
||||||
|
|
||||||
cfg = config.${namespace}.system.kernel;
|
cfg = config.${namespace}.system.kernel;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.system.kernel = {
|
options.${namespace}.system.kernel = {
|
||||||
enable = mkEnableOption "Modify the standard kernel settings";
|
enable = mkEnableOption "Modify the standard kernel settings";
|
||||||
version = mkOpt lib.types.str "linuxPackages_latest" "Set the kernel version to be used by your system";
|
version =
|
||||||
|
mkOpt lib.types.str "linuxPackages_latest"
|
||||||
|
"Set the kernel version to be used by your system";
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
|
|
|
@ -3,12 +3,14 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf mkOption;
|
inherit (lib) mkEnableOption mkIf mkOption;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
|
|
||||||
cfg = config.${namespace}.system.locale;
|
cfg = config.${namespace}.system.locale;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.system.locale = {
|
options.${namespace}.system.locale = {
|
||||||
enable = mkEnableOption "system locale tweaks.";
|
enable = mkEnableOption "system locale tweaks.";
|
||||||
|
|
||||||
|
|
|
@ -3,12 +3,14 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf;
|
inherit (lib) mkEnableOption mkIf;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
|
|
||||||
cfg = config.${namespace}.system.networking;
|
cfg = config.${namespace}.system.networking;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.system.networking = {
|
options.${namespace}.system.networking = {
|
||||||
enable = mkEnableOption "networking.";
|
enable = mkEnableOption "networking.";
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,18 +4,22 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf types;
|
inherit (lib) mkEnableOption mkIf types;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
inherit (self.lib) mkOpt;
|
inherit (self.lib) mkOpt;
|
||||||
|
|
||||||
cfg = config.${namespace}.system.nix;
|
cfg = config.${namespace}.system.nix;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.system.nix = {
|
options.${namespace}.system.nix = {
|
||||||
enable = mkEnableOption "Nix configuration overrides.";
|
enable = mkEnableOption "Nix configuration overrides.";
|
||||||
use-lix = mkEnableOption "Lix as an alternative to CppNix.";
|
use-lix = mkEnableOption "Lix as an alternative to CppNix.";
|
||||||
use-nixld = mkEnableOption "the use of dynamically linked executables on nix based systems.";
|
use-nixld = mkEnableOption "the use of dynamically linked executables on nix based systems.";
|
||||||
trusted-users = mkOpt (types.listOf types.str) ["@wheel"] "List of trusted users for this NixOS system.";
|
trusted-users = mkOpt (types.listOf types.str) [
|
||||||
|
"@wheel"
|
||||||
|
] "List of trusted users for this NixOS system.";
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
|
@ -23,7 +27,10 @@ in {
|
||||||
settings = {
|
settings = {
|
||||||
auto-optimise-store = true;
|
auto-optimise-store = true;
|
||||||
builders-use-substitutes = true;
|
builders-use-substitutes = true;
|
||||||
experimental-features = ["nix-command" "flakes"];
|
experimental-features = [
|
||||||
|
"nix-command"
|
||||||
|
"flakes"
|
||||||
|
];
|
||||||
keep-derivations = true;
|
keep-derivations = true;
|
||||||
keep-outputs = true;
|
keep-outputs = true;
|
||||||
max-jobs = "auto";
|
max-jobs = "auto";
|
||||||
|
|
|
@ -4,16 +4,18 @@
|
||||||
self,
|
self,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
|
let
|
||||||
inherit (lib) mkEnableOption mkIf types;
|
inherit (lib) mkEnableOption mkIf types;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
inherit (self.lib) mkOpt;
|
inherit (self.lib) mkOpt;
|
||||||
|
|
||||||
cfg = config.${namespace}.system.shell;
|
cfg = config.${namespace}.system.shell;
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.system.shell = {
|
options.${namespace}.system.shell = {
|
||||||
enable = mkEnableOption "custom user shells.";
|
enable = mkEnableOption "custom user shells.";
|
||||||
installed = mkOpt (types.listOf types.package) [pkgs.fish] "List of shell packages to install";
|
installed = mkOpt (types.listOf types.package) [ pkgs.fish ] "List of shell packages to install";
|
||||||
default = mkOpt types.str "fish" "Set a custom shell as the default for all users.";
|
default = mkOpt types.str "fish" "Set a custom shell as the default for all users.";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,14 @@
|
||||||
config,
|
config,
|
||||||
inputs,
|
inputs,
|
||||||
...
|
...
|
||||||
}: let
|
}:
|
||||||
inherit (lib) types mkEnableOption mkOption mkIf;
|
let
|
||||||
|
inherit (lib)
|
||||||
|
types
|
||||||
|
mkEnableOption
|
||||||
|
mkOption
|
||||||
|
mkIf
|
||||||
|
;
|
||||||
inherit (self) namespace;
|
inherit (self) namespace;
|
||||||
inherit (self.lib) dirToModuleList;
|
inherit (self.lib) dirToModuleList;
|
||||||
|
|
||||||
|
@ -19,25 +25,38 @@
|
||||||
enable = mkEnableOption "this user.";
|
enable = mkEnableOption "this user.";
|
||||||
isNormalUser = self.lib.mkBool true "Whether this user is considered a normal user.";
|
isNormalUser = self.lib.mkBool true "Whether this user is considered a normal user.";
|
||||||
isSystemUser = self.lib.mkBool false "Whether this user is considered a system user.";
|
isSystemUser = self.lib.mkBool false "Whether this user is considered a system user.";
|
||||||
initialPassword = self.lib.mkOpt (types.nullOr types.str) null "Plaintext insecure initial user password, only recommended for testing.";
|
initialPassword =
|
||||||
password = self.lib.mkOpt (types.nullOr types.str) null "Plaintext insecure user password, only recommended for testing.";
|
self.lib.mkOpt (types.nullOr types.str) null
|
||||||
hashedPasswordFile = self.lib.mkOpt (types.nullOr types.str) null "Secure, hashed user password stored in a separate file, recommended for production.";
|
"Plaintext insecure initial user password, only recommended for testing.";
|
||||||
hashedPassword = self.lib.mkOpt (types.nullOr types.str) null "Secure, hashed password, stored in plaintext, fine to use.";
|
password =
|
||||||
extraGroups = self.lib.mkOpt (types.listOf types.str) [] "List of additional groups this user belongs to.";
|
self.lib.mkOpt (types.nullOr types.str) null
|
||||||
|
"Plaintext insecure user password, only recommended for testing.";
|
||||||
|
hashedPasswordFile =
|
||||||
|
self.lib.mkOpt (types.nullOr types.str) null
|
||||||
|
"Secure, hashed user password stored in a separate file, recommended for production.";
|
||||||
|
hashedPassword =
|
||||||
|
self.lib.mkOpt (types.nullOr types.str) null
|
||||||
|
"Secure, hashed password, stored in plaintext, fine to use.";
|
||||||
|
extraGroups =
|
||||||
|
self.lib.mkOpt (types.listOf types.str) [ ]
|
||||||
|
"List of additional groups this user belongs to.";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
getHomeConfigPath = username: "${self.outPath}/homes/${system}/${username}";
|
getHomeConfigPath = username: "${self.outPath}/homes/${system}/${username}";
|
||||||
homeConfigExists = username: let
|
homeConfigExists =
|
||||||
|
username:
|
||||||
|
let
|
||||||
path = getHomeConfigPath username;
|
path = getHomeConfigPath username;
|
||||||
in
|
in
|
||||||
builtins.pathExists "${path}/default.nix";
|
builtins.pathExists "${path}/default.nix";
|
||||||
|
|
||||||
homeModules = dirToModuleList "${self.outPath}/modules/home";
|
homeModules = dirToModuleList "${self.outPath}/modules/home";
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
options.${namespace}.users = mkOption {
|
options.${namespace}.users = mkOption {
|
||||||
type = types.attrsOf userSubmodule;
|
type = types.attrsOf userSubmodule;
|
||||||
default = {};
|
default = { };
|
||||||
description = "List of users to create. Also handles home configurations, placed in self.outPath/homes/[x86_64-linux, aarch64-linux, etc...], through home-manager.";
|
description = "List of users to create. Also handles home configurations, placed in self.outPath/homes/[x86_64-linux, aarch64-linux, etc...], through home-manager.";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -47,12 +66,21 @@ in {
|
||||||
|
|
||||||
# Manage users declaratively and map userConfig to users.users by name;
|
# Manage users declaratively and map userConfig to users.users by name;
|
||||||
users.mutableUsers = false;
|
users.mutableUsers = false;
|
||||||
users.users = lib.mapAttrs (username: userConfig:
|
users.users = lib.mapAttrs (
|
||||||
|
username: userConfig:
|
||||||
mkIf userConfig.enable {
|
mkIf userConfig.enable {
|
||||||
name = username;
|
name = username;
|
||||||
inherit (userConfig) isNormalUser isSystemUser initialPassword hashedPasswordFile hashedPassword password extraGroups;
|
inherit (userConfig)
|
||||||
})
|
isNormalUser
|
||||||
cfg;
|
isSystemUser
|
||||||
|
initialPassword
|
||||||
|
hashedPasswordFile
|
||||||
|
hashedPassword
|
||||||
|
password
|
||||||
|
extraGroups
|
||||||
|
;
|
||||||
|
}
|
||||||
|
) cfg;
|
||||||
|
|
||||||
home-manager = {
|
home-manager = {
|
||||||
useGlobalPkgs = true;
|
useGlobalPkgs = true;
|
||||||
|
@ -63,11 +91,11 @@ in {
|
||||||
namespace = self.namespace;
|
namespace = self.namespace;
|
||||||
};
|
};
|
||||||
|
|
||||||
users =
|
users = lib.mapAttrs (
|
||||||
lib.mapAttrs (
|
|
||||||
username: userConfig:
|
username: userConfig:
|
||||||
mkIf (userConfig.enable && homeConfigExists username) (
|
mkIf (userConfig.enable && homeConfigExists username) (
|
||||||
{osConfig, ...}: {
|
{ osConfig, ... }:
|
||||||
|
{
|
||||||
# Import user home configuration and general home modules
|
# Import user home configuration and general home modules
|
||||||
imports = [
|
imports = [
|
||||||
(getHomeConfigPath username)
|
(getHomeConfigPath username)
|
||||||
|
@ -80,8 +108,7 @@ in {
|
||||||
home.stateVersion = lib.mkDefault osConfig.system.stateVersion;
|
home.stateVersion = lib.mkDefault osConfig.system.stateVersion;
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
)
|
) cfg;
|
||||||
cfg;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{pkgs, ...}: {
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./hardware.nix
|
./hardware.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
# Setup Sops
|
# Setup Sops
|
||||||
sops.age.sshKeyPaths = ["/etc/ssh/ssh_host_ed25519_key"];
|
sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
|
||||||
sops.age.keyFile = "/var/lib/sops-nix/key.txt";
|
sops.age.keyFile = "/var/lib/sops-nix/key.txt";
|
||||||
sops.age.generateKey = true;
|
sops.age.generateKey = true;
|
||||||
|
|
||||||
|
@ -12,7 +13,10 @@
|
||||||
users.cyn = {
|
users.cyn = {
|
||||||
enable = true;
|
enable = true;
|
||||||
hashedPassword = "$6$mvK9bT756Aok54Vt$vBRnT66Vb3HL0Y5rEMJlHvKkvzVQ.KUciInTmW3FCBFT00IuFMpz3q9RhXPLTLMRPho65bTg9hMnFPb84I774.";
|
hashedPassword = "$6$mvK9bT756Aok54Vt$vBRnT66Vb3HL0Y5rEMJlHvKkvzVQ.KUciInTmW3FCBFT00IuFMpz3q9RhXPLTLMRPho65bTg9hMnFPb84I774.";
|
||||||
extraGroups = ["wheel" "docker"];
|
extraGroups = [
|
||||||
|
"wheel"
|
||||||
|
"docker"
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
archetypes.server.enable = true;
|
archetypes.server.enable = true;
|
||||||
|
|
|
@ -6,26 +6,36 @@
|
||||||
lib,
|
lib,
|
||||||
modulesPath,
|
modulesPath,
|
||||||
...
|
...
|
||||||
}: {
|
}:
|
||||||
|
{
|
||||||
imports = [
|
imports = [
|
||||||
(modulesPath + "/installer/scan/not-detected.nix")
|
(modulesPath + "/installer/scan/not-detected.nix")
|
||||||
];
|
];
|
||||||
|
|
||||||
boot.initrd.availableKernelModules = ["xhci_pci" "ahci" "usbhid" "uas" "sd_mod"];
|
boot.initrd.availableKernelModules = [
|
||||||
boot.initrd.kernelModules = [];
|
"xhci_pci"
|
||||||
boot.kernelModules = ["kvm-intel"];
|
"ahci"
|
||||||
boot.extraModulePackages = [];
|
"usbhid"
|
||||||
|
"uas"
|
||||||
|
"sd_mod"
|
||||||
|
];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [ "kvm-intel" ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
fileSystems."/" = {
|
fileSystems."/" = {
|
||||||
device = "/dev/disk/by-uuid/5d4f9f57-085f-44a0-b987-bad24ff58769";
|
device = "/dev/disk/by-uuid/5d4f9f57-085f-44a0-b987-bad24ff58769";
|
||||||
fsType = "btrfs";
|
fsType = "btrfs";
|
||||||
options = ["subvol=@"];
|
options = [ "subvol=@" ];
|
||||||
};
|
};
|
||||||
|
|
||||||
fileSystems."/boot" = {
|
fileSystems."/boot" = {
|
||||||
device = "/dev/disk/by-uuid/8D0F-2821";
|
device = "/dev/disk/by-uuid/8D0F-2821";
|
||||||
fsType = "vfat";
|
fsType = "vfat";
|
||||||
options = ["fmask=0077" "dmask=0077"];
|
options = [
|
||||||
|
"fmask=0077"
|
||||||
|
"dmask=0077"
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
fileSystems."/mnt/storage" = {
|
fileSystems."/mnt/storage" = {
|
||||||
|
@ -34,7 +44,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
swapDevices = [
|
swapDevices = [
|
||||||
{device = "/dev/disk/by-uuid/42fc926f-f066-48e8-8c07-3627b2ba3cd4";}
|
{ device = "/dev/disk/by-uuid/42fc926f-f066-48e8-8c07-3627b2ba3cd4"; }
|
||||||
];
|
];
|
||||||
|
|
||||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
{pkgs, ...}: {
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./hardware.nix
|
./hardware.nix
|
||||||
];
|
];
|
||||||
|
@ -12,7 +13,7 @@
|
||||||
users.jo = {
|
users.jo = {
|
||||||
enable = true;
|
enable = true;
|
||||||
hashedPassword = "$6$mvK9bT756Aok54Vt$vBRnT66Vb3HL0Y5rEMJlHvKkvzVQ.KUciInTmW3FCBFT00IuFMpz3q9RhXPLTLMRPho65bTg9hMnFPb84I774.";
|
hashedPassword = "$6$mvK9bT756Aok54Vt$vBRnT66Vb3HL0Y5rEMJlHvKkvzVQ.KUciInTmW3FCBFT00IuFMpz3q9RhXPLTLMRPho65bTg9hMnFPb84I774.";
|
||||||
extraGroups = ["wheel"];
|
extraGroups = [ "wheel" ];
|
||||||
};
|
};
|
||||||
|
|
||||||
archetypes.laptop.enable = true;
|
archetypes.laptop.enable = true;
|
||||||
|
|
|
@ -1,30 +1,45 @@
|
||||||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
# and may be overwritten by future invocations. Please make changes
|
# and may be overwritten by future invocations. Please make changes
|
||||||
# to /etc/nixos/configuration.nix instead.
|
# to /etc/nixos/configuration.nix instead.
|
||||||
{ config, lib, modulesPath, ... }:
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
modulesPath,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
{
|
{
|
||||||
imports =
|
imports = [
|
||||||
[ (modulesPath + "/installer/scan/not-detected.nix")
|
(modulesPath + "/installer/scan/not-detected.nix")
|
||||||
];
|
];
|
||||||
|
|
||||||
boot.initrd.availableKernelModules = [ "xhci_pci" "vmd" "nvme" "usbhid" "rtsx_pci_sdmmc" ];
|
boot.initrd.availableKernelModules = [
|
||||||
|
"xhci_pci"
|
||||||
|
"vmd"
|
||||||
|
"nvme"
|
||||||
|
"usbhid"
|
||||||
|
"rtsx_pci_sdmmc"
|
||||||
|
];
|
||||||
boot.initrd.kernelModules = [ ];
|
boot.initrd.kernelModules = [ ];
|
||||||
boot.kernelModules = [ "kvm-intel" ];
|
boot.kernelModules = [ "kvm-intel" ];
|
||||||
boot.extraModulePackages = [ ];
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
fileSystems."/" =
|
fileSystems."/" = {
|
||||||
{ device = "/dev/disk/by-uuid/864b1287-89fd-4cc0-98a5-40a3caf804c6";
|
device = "/dev/disk/by-uuid/864b1287-89fd-4cc0-98a5-40a3caf804c6";
|
||||||
fsType = "btrfs";
|
fsType = "btrfs";
|
||||||
options = [ "subvol=@" ];
|
options = [ "subvol=@" ];
|
||||||
};
|
};
|
||||||
|
|
||||||
boot.initrd.luks.devices."luks-5fd4fc76-d5c5-46c3-b952-1a7a7ff3a1fc".device = "/dev/disk/by-uuid/5fd4fc76-d5c5-46c3-b952-1a7a7ff3a1fc";
|
boot.initrd.luks.devices."luks-5fd4fc76-d5c5-46c3-b952-1a7a7ff3a1fc".device =
|
||||||
|
"/dev/disk/by-uuid/5fd4fc76-d5c5-46c3-b952-1a7a7ff3a1fc";
|
||||||
|
|
||||||
fileSystems."/boot" =
|
fileSystems."/boot" = {
|
||||||
{ device = "/dev/disk/by-uuid/2429-4141";
|
device = "/dev/disk/by-uuid/2429-4141";
|
||||||
fsType = "vfat";
|
fsType = "vfat";
|
||||||
options = [ "fmask=0022" "dmask=0022" ];
|
options = [
|
||||||
|
"fmask=0022"
|
||||||
|
"dmask=0022"
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
swapDevices = [ ];
|
swapDevices = [ ];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue