This commit is contained in:
2026-08-11 22:13:53 +03:00
parent 056e5895fe
commit 411c118500
29 changed files with 543 additions and 517 deletions
+4 -11
View File
@@ -25,17 +25,10 @@
}; };
}; };
fileSystems."${xlib.dirs.lamet-drive}" = { fileSystems = xlib.helpers.mkNtfsMount {
device = "/dev/disk/by-uuid/DC76BD3576BD116E"; path = xlib.dirs.lamet-drive;
fsType = "ntfs3"; uuid = "DC76BD3576BD116E";
options = [ mask = "0000";
"defaults"
"uid=1000"
"gid=1000"
"fmask=0000"
"dmask=0000"
"nofail"
];
}; };
xlib.ssh.enable = true; xlib.ssh.enable = true;
+16 -38
View File
@@ -18,47 +18,25 @@
self.nixosModules.default self.nixosModules.default
]; ];
fileSystems = { fileSystems = lib.listToAttrs (
"${xlib.dirs.therima-drive}" = { map (xlib.helpers.mkNtfsMount) [
{
path = xlib.dirs.therima-drive;
uuid = "C0A2DDEFA2DDEA44";
enable = false; enable = false;
device = "/dev/disk/by-uuid/C0A2DDEFA2DDEA44"; }
fsType = "ntfs3"; {
options = [ path = xlib.dirs.vetymae-drive;
"defaults" uuid = "6408433908430A0E";
"uid=1000"
"gid=1000"
"fmask=0007"
"dmask=0007"
"nofail"
];
};
"${xlib.dirs.vetymae-drive}" = {
enable = false; enable = false;
device = "/dev/disk/by-uuid/6408433908430A0E"; }
fsType = "ntfs3"; {
options = [ path = xlib.dirs.soptur-drive;
"defaults" uuid = "C00C56E40C56D54E";
"uid=1000"
"gid=1000"
"fmask=0007"
"dmask=0007"
"nofail"
];
};
"${xlib.dirs.soptur-drive}" = {
enable = false; enable = false;
device = "/dev/disk/by-uuid/C00C56E40C56D54E"; }
fsType = "ntfs3"; ]
options = [ );
"defaults"
"uid=1000"
"gid=1000"
"fmask=0007"
"dmask=0007"
"nofail"
];
};
};
boot = { boot = {
kernelPackages = lib.mkDefault pkgs.linuxPackages_xanmod_stable; kernelPackages = lib.mkDefault pkgs.linuxPackages_xanmod_stable;
+14 -30
View File
@@ -38,41 +38,25 @@
intel-gpu-tools.enable = true; intel-gpu-tools.enable = true;
}; };
fileSystems = { fileSystems =
(xlib.helpers.mkExfatMount {
path = xlib.dirs.archive-drive;
label = "archive";
})
// (xlib.helpers.mkExfatMount {
path = xlib.dirs.mobile-drive;
uuid = "7EB1-DC99";
})
// (xlib.helpers.mkBindMount {
what = xlib.dirs.services-folder;
where = xlib.dirs.services-mnt-folder;
})
// {
# External drive # External drive
"${xlib.dirs.server-home}" = { "${xlib.dirs.server-home}" = {
device = "/dev/disk/by-uuid/37e53ebc-5343-a94d-9fe2-0ca39e13a8de"; device = "/dev/disk/by-uuid/37e53ebc-5343-a94d-9fe2-0ca39e13a8de";
fsType = "ext4"; fsType = "ext4";
}; };
# Archive drive
"${xlib.dirs.archive-drive}" = {
device = "/dev/disk/by-label/archive";
fsType = "exfat";
options = [
"nofail"
"uid=1000"
"gid=1000"
];
};
# Mobile SD-Card
"${xlib.dirs.mobile-drive}" = {
device = "/dev/disk/by-uuid/7EB1-DC99";
fsType = "exfat";
options = [
"nofail"
"uid=1000"
"gid=1000"
];
};
# Services in /mnt folder
"${xlib.dirs.services-mnt-folder}" = {
device = "${xlib.dirs.services-folder}";
fsType = "none";
options = [
"bind"
"nofail"
];
};
}; };
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
Generated
+43
View File
@@ -127,6 +127,32 @@
"type": "github" "type": "github"
} }
}, },
"nix-minecraft": {
"inputs": {
"flake-compat": [
"flake-compat"
],
"nixpkgs": [
"nixpkgs"
],
"systems": [
"nix-systems"
]
},
"locked": {
"lastModified": 1786414302,
"narHash": "sha256-FNGnUYud1D3BqE1JU2Uef+puLB2Rml7gKSdIGQOb550=",
"owner": "Infinidoge",
"repo": "nix-minecraft",
"rev": "cacc8cd89550f0cbec7103f3db5e96d1a66c58e7",
"type": "github"
},
"original": {
"owner": "Infinidoge",
"repo": "nix-minecraft",
"type": "github"
}
},
"nix-on-droid": { "nix-on-droid": {
"inputs": { "inputs": {
"home-manager": [ "home-manager": [
@@ -155,6 +181,21 @@
"type": "github" "type": "github"
} }
}, },
"nix-systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"nixos-hardware": { "nixos-hardware": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs" "nixpkgs": "nixpkgs"
@@ -348,7 +389,9 @@
"flake-compat": "flake-compat", "flake-compat": "flake-compat",
"grub2-themes": "grub2-themes", "grub2-themes": "grub2-themes",
"home-manager": "home-manager", "home-manager": "home-manager",
"nix-minecraft": "nix-minecraft",
"nix-on-droid": "nix-on-droid", "nix-on-droid": "nix-on-droid",
"nix-systems": "nix-systems",
"nixos-hardware": "nixos-hardware", "nixos-hardware": "nixos-hardware",
"nixos-wsl": "nixos-wsl", "nixos-wsl": "nixos-wsl",
"nixpkgs": "nixpkgs_2", "nixpkgs": "nixpkgs_2",
+9
View File
@@ -36,6 +36,7 @@
utils.url = "github:numtide/flake-utils"; utils.url = "github:numtide/flake-utils";
flake-compat.url = "github:edolstra/flake-compat"; flake-compat.url = "github:edolstra/flake-compat";
nixos-hardware.url = "github:NixOS/nixos-hardware/master"; nixos-hardware.url = "github:NixOS/nixos-hardware/master";
nix-systems.url = "github:nix-systems/default";
# nixos-facter-modules.url = "github:numtide/nixos-facter-modules"; # nixos-facter-modules.url = "github:numtide/nixos-facter-modules";
# flake-utils.url = "github:numtide/flake-utils"; # flake-utils.url = "github:numtide/flake-utils";
# flake-parts.url = "github:hercules-ci/flake-parts"; # flake-parts.url = "github:hercules-ci/flake-parts";
@@ -71,6 +72,14 @@
url = "github:vinceliuice/grub2-themes"; url = "github:vinceliuice/grub2-themes";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
nix-minecraft = {
url = "github:Infinidoge/nix-minecraft";
inputs = {
flake-compat.follows = "flake-compat";
nixpkgs.follows = "nixpkgs";
systems.follows = "nix-systems";
};
};
# nix-index-database = { # nix-index-database = {
# url = "github:nix-community/nix-index-database"; # url = "github:nix-community/nix-index-database";
# inputs.nixpkgs.follows = "nixpkgs"; # inputs.nixpkgs.follows = "nixpkgs";
+20 -23
View File
@@ -9,10 +9,14 @@ let
... ...
}: }:
let let
mkHomeModule = username: { mkUser =
imports = [ username:
(./. + "/${xlib.device.type}.nix") {
]; imports ? [ ],
headless ? false,
}:
{
inherit imports;
home = { home = {
username = username; username = username;
stateVersion = lib.mkDefault "26.05"; stateVersion = lib.mkDefault "26.05";
@@ -21,14 +25,7 @@ let
enableNixpkgsReleaseCheck = false; enableNixpkgsReleaseCheck = false;
}; };
# Headless hosts: no GUI user dirs # Headless hosts: no GUI user dirs
xdg = xdg = lib.mkIf headless {
lib.mkIf
(builtins.elem xlib.device.type [
"server"
"vds"
"wsl"
])
{
enable = true; enable = true;
autostart.enable = true; autostart.enable = true;
userDirs = { userDirs = {
@@ -45,23 +42,23 @@ let
}; };
}; };
}; };
mkRootModule = username: {
home = {
username = username;
stateVersion = lib.mkDefault "26.05";
homeDirectory =
if username == "root" then lib.mkDefault "/${username}" else lib.mkDefault "/home/${username}";
enableNixpkgsReleaseCheck = false;
};
};
in in
{ {
home-manager = { home-manager = {
useGlobalPkgs = true; useGlobalPkgs = true;
useUserPackages = true; useUserPackages = true;
users = { users = {
root = mkRootModule "root"; root = mkUser "root" { };
"${xlib.device.username}" = mkHomeModule xlib.device.username; "${xlib.device.username}" = mkUser xlib.device.username {
imports = [
(./. + "/${xlib.device.type}.nix")
];
headless = builtins.elem xlib.device.type [
"server"
"vds"
"wsl"
];
};
}; };
sharedModules = [ sharedModules = [
inputs.plasma-manager.homeModules.plasma-manager inputs.plasma-manager.homeModules.plasma-manager
+3 -10
View File
@@ -5,20 +5,13 @@
xlib, xlib,
... ...
}: }:
let
symlinksPaths = {
"${config.home.homeDirectory}/External/Music" = "Music";
};
mkLinks = lib.mapAttrs' (sourcePath: targetPath: {
name = targetPath;
value.source = config.lib.file.mkOutOfStoreSymlink "${sourcePath}";
}) symlinksPaths;
in
{ {
imports = [ imports = [
./minimal.nix ./minimal.nix
]; ];
home.file = mkLinks; home.file = xlib.helpers.mkSymlinks config {
"${config.home.homeDirectory}/External/Music" = "Music";
};
home.activation = { home.activation = {
yaziSync = '' yaziSync = ''
${pkgs.rsync}/bin/rsync -Lrv --no-A --no-X "${config.home.homeDirectory}/.config/yazi/" "${xlib.dirs.storage}/yazi/" ${pkgs.rsync}/bin/rsync -Lrv --no-A --no-X "${config.home.homeDirectory}/.config/yazi/" "${xlib.dirs.storage}/yazi/"
+5 -12
View File
@@ -5,23 +5,16 @@
xlib, xlib,
... ...
}: }:
let
symlinksPaths = {
"${config.home.homeDirectory}/External/Music" = "Music";
"${xlib.dirs.wsl-home}" = "External";
"${xlib.dirs.wsl-storage}" = "Storage";
};
mkLinks = lib.mapAttrs' (sourcePath: targetPath: {
name = targetPath;
value.source = config.lib.file.mkOutOfStoreSymlink "${sourcePath}";
}) symlinksPaths;
in
{ {
imports = [ imports = [
./apps ./apps
./minimal.nix ./minimal.nix
]; ];
home.file = mkLinks; home.file = xlib.helpers.mkSymlinks config {
"${config.home.homeDirectory}/External/Music" = "Music";
"${xlib.dirs.wsl-home}" = "External";
"${xlib.dirs.wsl-storage}" = "Storage";
};
home.activation = { home.activation = {
yaziSync = '' yaziSync = ''
${pkgs.rsync}/bin/rsync -Lrv "${config.home.homeDirectory}/.config/yazi/" "${xlib.dirs.wsl-storage}/yazi/" ${pkgs.rsync}/bin/rsync -Lrv "${config.home.homeDirectory}/.config/yazi/" "${xlib.dirs.wsl-storage}/yazi/"
+153
View File
@@ -0,0 +1,153 @@
{
lib,
...
}:
# Shared pure helper functions for module definitions.
# Injected into every module via `xlib.helpers` (see options.nix).
let
# tmpfiles rule: "type dir mode user group -"
mkTmpfile =
type: dir: mode: user: group:
"${type} ${dir} ${mode} ${user} ${group} -";
# several tmpfiles types for the same dir, e.g. ["d" "z"] or ["d" "Z"]
mkTmpDirs =
{
dir,
mode,
user,
group,
types ? [
"d"
"z"
],
}:
map (type: mkTmpfile type dir mode user group) types;
# fileSystems bind mount
mkBindMount =
{
what,
where,
}:
{
"${where}" = {
device = what;
fsType = "none";
options = [
"bind"
"nofail"
];
};
};
# systemd.mounts bind mount (automount variant)
mkSystemdBind =
{
what,
where,
}:
{
enable = true;
options = "bind,x-systemd.automount,nofail";
requires = [ "local-fs.target" ];
type = "none";
wantedBy = [ "multi-user.target" ];
inherit what where;
};
# Full "service storage" block: services-mnt source dir + /var/lib target,
# tmpfiles d/z + automount bind. Used as:
# storage = xlib.helpers.mkServiceStorage { name = "x"; user = "x"; group = "x"; };
# systemd = storage.systemd;
mkServiceStorage =
{
name,
user,
group,
mode ? "0755",
target ? "/var/lib/${name}",
base ? "/mnt/services",
}:
let
sourceDir = "${base}/${name}";
in
{
inherit sourceDir target;
systemd = {
tmpfiles.rules = mkTmpDirs {
dir = sourceDir;
inherit mode user group;
};
mounts = [
(mkSystemdBind {
what = sourceDir;
where = target;
})
];
};
};
# ntfs3 mount, e.g. fileSystems = mkNtfsMount { path = ...; uuid = ...; }
mkNtfsMount =
{
path,
uuid,
mask ? "0007",
enable ? null,
}:
{
"${path}" = {
device = "/dev/disk/by-uuid/${uuid}";
fsType = "ntfs3";
options = [
"defaults"
"uid=1000"
"gid=1000"
"fmask=${mask}"
"dmask=${mask}"
"nofail"
];
}
// lib.optionalAttrs (enable != null) { inherit enable; };
};
# exfat mount, e.g. fileSystems = mkExfatMount { path = ...; uuid = ...; }
mkExfatMount =
{
path,
uuid ? null,
label ? null,
}:
{
"${path}" = {
device = if uuid != null then "/dev/disk/by-uuid/${uuid}" else "/dev/disk/by-label/${label}";
fsType = "exfat";
options = [
"nofail"
"uid=1000"
"gid=1000"
];
};
};
# home-manager out-of-store symlinks: path = source (target name = attr name)
mkSymlinks =
config: paths:
lib.mapAttrs' (sourcePath: targetPath: {
name = targetPath;
value.source = config.lib.file.mkOutOfStoreSymlink "${sourcePath}";
}) paths;
in
{
inherit
mkTmpfile
mkTmpDirs
mkBindMount
mkSystemdBind
mkServiceStorage
mkNtfsMount
mkExfatMount
mkSymlinks
;
}
+34 -94
View File
@@ -3,6 +3,17 @@
lib, lib,
... ...
}: }:
let
# Option factory for the xlib.dirs namespace
mkDir =
default: description:
lib.mkOption {
type = lib.types.str;
inherit default description;
};
helpers = import ../lib/xlib.nix { inherit lib; };
in
{ {
options = { options = {
xlib = { xlib = {
@@ -39,101 +50,30 @@
}; };
}; };
dirs = { dirs = {
user-home = lib.mkOption { user-home = mkDir "/home/${config.xlib.device.username}" "User home directory.";
type = lib.types.str; user-storage = mkDir "${config.xlib.dirs.user-home}/Storage" "User storage directory.";
default = "/home/${config.xlib.device.username}"; archive-drive = mkDir "/mnt/archive" "Archive drive mount point.";
description = "User home directory."; lamet-drive = mkDir "/mnt/lamet" "Lamet drive mount point.";
}; mobile-drive = mkDir "/mnt/mobile" "Mobile drive mount point.";
user-storage = lib.mkOption { therima-drive = mkDir "/mnt/therima" "Therima drive mount point.";
type = lib.types.str; vetymae-drive = mkDir "/mnt/vetymae" "Vetymae drive mount point.";
default = "${config.xlib.dirs.user-home}/Storage"; soptur-drive = mkDir "/mnt/soptur" "Soptur drive mount point.";
description = "User storage directory."; wsl-home = mkDir "/mnt/c/Users/${config.xlib.device.username}" "WSL home directory.";
}; wsl-storage = mkDir "${config.xlib.dirs.wsl-home}/Storage" "WSL storage directory.";
archive-drive = lib.mkOption { server-home = mkDir "/home/${config.xlib.device.username}/External" "Server home directory.";
type = lib.types.str; server-credentials = mkDir "${config.xlib.dirs.server-home}/Credentials/server" "Server credentials directory.";
default = "/mnt/archive"; storage = mkDir "${config.xlib.dirs.server-home}/Storage" "General storage directory.";
description = "Archive drive mount point."; calibre-library = mkDir "${config.xlib.dirs.server-home}/Books-Library" "Calibre library directory.";
}; music-library = mkDir "${config.xlib.dirs.user-home}/Music" "Music library directory.";
lamet-drive = lib.mkOption { services-folder = mkDir "${config.xlib.dirs.server-home}/Services" "All services folder.";
type = lib.types.str; services-mnt-folder = mkDir "/mnt/services" "All services folder.";
default = "/mnt/lamet"; services-nodes-folder = mkDir "${config.xlib.dirs.services-mnt-folder}/nodes" "All nodes folder.";
description = "Lamet drive mount point."; postgresql-folder = mkDir "${config.xlib.dirs.services-mnt-folder}/postgresql" "PostgreSQL service folder.";
};
mobile-drive = lib.mkOption {
type = lib.types.str;
default = "/mnt/mobile";
description = "Mobile drive mount point.";
};
therima-drive = lib.mkOption {
type = lib.types.str;
default = "/mnt/therima";
description = "Therima drive mount point.";
};
vetymae-drive = lib.mkOption {
type = lib.types.str;
default = "/mnt/vetymae";
description = "Vetymae drive mount point.";
};
soptur-drive = lib.mkOption {
type = lib.types.str;
default = "/mnt/soptur";
description = "Soptur drive mount point.";
};
wsl-home = lib.mkOption {
type = lib.types.str;
default = "/mnt/c/Users/${config.xlib.device.username}";
description = "WSL home directory.";
};
wsl-storage = lib.mkOption {
type = lib.types.str;
default = "${config.xlib.dirs.wsl-home}/Storage";
description = "WSL storage directory.";
};
server-home = lib.mkOption {
type = lib.types.str;
default = "/home/${config.xlib.device.username}/External";
description = "Server home directory.";
};
server-credentials = lib.mkOption {
type = lib.types.str;
default = "${config.xlib.dirs.server-home}/Credentials/server";
description = "Server credentials directory.";
};
storage = lib.mkOption {
type = lib.types.str;
default = "${config.xlib.dirs.server-home}/Storage";
description = "General storage directory.";
};
calibre-library = lib.mkOption {
type = lib.types.str;
default = "${config.xlib.dirs.server-home}/Books-Library";
description = "Calibre library directory.";
};
music-library = lib.mkOption {
type = lib.types.str;
default = "${config.xlib.dirs.user-home}/Music";
description = "Music library directory.";
};
services-folder = lib.mkOption {
type = lib.types.str;
default = "${config.xlib.dirs.server-home}/Services";
description = "All services folder.";
};
services-mnt-folder = lib.mkOption {
type = lib.types.str;
default = "/mnt/services";
description = "All services folder.";
};
services-nodes-folder = lib.mkOption {
type = lib.types.str;
default = "${config.xlib.dirs.services-mnt-folder}/nodes";
description = "All nodes folder.";
};
postgresql-folder = lib.mkOption {
type = lib.types.str;
default = "${config.xlib.dirs.services-mnt-folder}/postgresql";
description = "PostgreSQL service folder.";
}; };
helpers = lib.mkOption {
type = lib.types.anything;
default = helpers;
description = "Shared helper functions (see lib/xlib.nix).";
}; };
}; };
}; };
+2 -7
View File
@@ -68,14 +68,9 @@ in
}; };
}; };
systemd.mounts = [ systemd.mounts = [
{ (xlib.helpers.mkSystemdBind {
enable = true;
options = "bind,x-systemd.automount,nofail";
requires = [ "local-fs.target" ];
type = "none";
wantedBy = [ "multi-user.target" ];
what = "/home/${xlib.device.username}/Music"; what = "/home/${xlib.device.username}/Music";
where = "/home/${xlib.device.username}/.config/beets"; where = "/home/${xlib.device.username}/.config/beets";
} })
]; ];
} }
+22 -13
View File
@@ -42,21 +42,30 @@ in
# }; # };
}; };
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules =
"d ${libraryDir} 0755 calibre-web calibre-web -" xlib.helpers.mkTmpDirs {
"d ${sourceDir} 0755 calibre-web calibre-web -" dir = libraryDir;
"Z ${libraryDir} 0755 calibre-web calibre-web -" mode = "0755";
"Z ${sourceDir} 0755 calibre-web calibre-web -" user = "calibre-web";
group = "calibre-web";
types = [
"d"
"Z"
]; ];
}
fileSystems = { ++ xlib.helpers.mkTmpDirs {
"${targetDir}" = { dir = sourceDir;
device = "${sourceDir}"; mode = "0755";
fsType = "none"; user = "calibre-web";
options = [ group = "calibre-web";
"bind" types = [
"nofail" "d"
"Z"
]; ];
}; };
fileSystems = xlib.helpers.mkBindMount {
what = sourceDir;
where = targetDir;
}; };
} }
+2 -2
View File
@@ -44,7 +44,7 @@
# ./zerotier.nix # ./zerotier.nix
]; ];
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
"d /mnt 0755 root root -" (xlib.helpers.mkTmpfile "d" "/mnt" "0755" "root" "root")
"d ${xlib.dirs.services-mnt-folder} 0755 root root -" (xlib.helpers.mkTmpfile "d" xlib.dirs.services-mnt-folder "0755" "root" "root")
]; ];
} }
+6 -4
View File
@@ -22,8 +22,10 @@
}; };
}; };
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = xlib.helpers.mkTmpDirs {
"d ${config.services.gitea.stateDir} 0755 gitea gitea -" dir = config.services.gitea.stateDir;
"z ${config.services.gitea.stateDir} 0755 gitea gitea -" mode = "0755";
]; user = "gitea";
group = "gitea";
};
} }
+10 -23
View File
@@ -5,8 +5,11 @@
... ...
}: }:
let let
sourceDir = "${xlib.dirs.services-mnt-folder}/homebox"; storage = xlib.helpers.mkServiceStorage {
targetDir = "/var/lib/homebox"; name = "homebox";
user = "homebox";
group = "homebox";
};
in in
{ {
services.homebox = { services.homebox = {
@@ -14,33 +17,17 @@ in
settings = { settings = {
HBOX_WEB_HOST = "0.0.0.0"; HBOX_WEB_HOST = "0.0.0.0";
HBOX_WEB_PORT = "7745"; HBOX_WEB_PORT = "7745";
HBOX_STORAGE_CONN_STRING = "file://${targetDir}"; HBOX_STORAGE_CONN_STRING = "file://${storage.target}";
HBOX_STORAGE_PREFIX_PATH = "data"; HBOX_STORAGE_PREFIX_PATH = "data";
HBOX_DATABASE_DRIVER = "sqlite3"; HBOX_DATABASE_DRIVER = "sqlite3";
HBOX_DATABASE_SQLITE_PATH = "${targetDir}/data/homebox.db?_pragma=busy_timeout=999&_pragma=journal_mode=WAL&_fk=1"; HBOX_DATABASE_SQLITE_PATH = "${storage.target}/data/homebox.db?_pragma=busy_timeout=999&_pragma=journal_mode=WAL&_fk=1";
HBOX_OPTIONS_ALLOW_REGISTRATION = "true"; HBOX_OPTIONS_ALLOW_REGISTRATION = "true";
HBOX_OPTIONS_GITHUB_RELEASE_CHECK = "false"; HBOX_OPTIONS_GITHUB_RELEASE_CHECK = "false";
HBOX_MODE = "production"; HBOX_MODE = "production";
HOME = "${targetDir}"; HOME = "${storage.target}";
TMPDIR = "${targetDir}/tmp"; TMPDIR = "${storage.target}/tmp";
}; };
}; };
systemd = { systemd = storage.systemd;
tmpfiles.rules = [
"d ${sourceDir} 0755 homebox homebox -"
"z ${sourceDir} 0755 homebox homebox -"
];
mounts = [
{
enable = true;
options = "bind,x-systemd.automount,nofail";
requires = [ "local-fs.target" ];
type = "none";
wantedBy = [ "multi-user.target" ];
what = "${sourceDir}";
where = "${targetDir}";
}
];
};
} }
+1 -1
View File
@@ -20,7 +20,7 @@
}; };
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
"z ${config.services.immich.mediaLocation} 0755 immich immich -" (xlib.helpers.mkTmpfile "z" config.services.immich.mediaLocation "0755" "immich" "immich")
]; ];
users.users.immich.extraGroups = [ users.users.immich.extraGroups = [
+1 -1
View File
@@ -21,6 +21,6 @@
}; };
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
"z /mnt/services/memos 0750 memos memos -" (xlib.helpers.mkTmpfile "z" "${xlib.dirs.services-mnt-folder}/memos" "0750" "memos" "memos")
]; ];
} }
+6 -19
View File
@@ -7,8 +7,11 @@
... ...
}: }:
let let
sourceDir = "${xlib.dirs.services-mnt-folder}/n8n"; storage = xlib.helpers.mkServiceStorage {
targetDir = "/var/lib/n8n"; name = "n8n";
user = "nobody";
group = "nogroup";
};
in in
{ {
services.n8n = { services.n8n = {
@@ -21,21 +24,5 @@ in
openFirewall = true; openFirewall = true;
}; };
systemd = { systemd = storage.systemd;
tmpfiles.rules = [
"d ${sourceDir} 0755 nobody nogroup -"
"z ${sourceDir} 0755 nobody nogroup -"
];
mounts = [
{
enable = true;
options = "bind,x-systemd.automount,nofail";
requires = [ "local-fs.target" ];
type = "none";
wantedBy = [ "multi-user.target" ];
what = "${sourceDir}";
where = "${targetDir}";
}
];
};
} }
+4 -9
View File
@@ -24,14 +24,9 @@ in
}; };
}; };
systemd.mounts = [ systemd.mounts = [
{ (xlib.helpers.mkSystemdBind {
enable = true; what = libraryDir;
options = "bind,x-systemd.automount,nofail"; where = pointDir;
requires = [ "local-fs.target" ]; })
type = "none";
wantedBy = [ "multi-user.target" ];
what = "${libraryDir}";
where = "${pointDir}";
}
]; ];
} }
+1 -1
View File
@@ -201,7 +201,7 @@
# }; # };
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
"z ${config.services.nextcloud.home} 0750 nextcloud nextcloud -" (xlib.helpers.mkTmpfile "z" config.services.nextcloud.home "0750" "nextcloud" "nextcloud")
]; ];
environment.systemPackages = [ environment.systemPackages = [
+1 -1
View File
@@ -6,7 +6,7 @@
}: }:
{ {
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
"z /export 0755 nobody nogroup -" (xlib.helpers.mkTmpfile "z" "/export" "0755" "nobody" "nogroup")
]; ];
services.nfs = { services.nfs = {
server = { server = {
+78 -93
View File
@@ -7,6 +7,83 @@
}: }:
let let
server = "192.168.1.20"; server = "192.168.1.20";
# Standard TLS proxy vhost: "/" -> http://server:port
# Returns { name = domain; value = vhost; } for builtins.listToAttrs
mkProxy =
{
domain,
port,
addSSL ? false,
body ? false,
}:
{
name = domain;
value = {
enableACME = true;
locations."/" = {
proxyPass = "http://${server}:${toString port}";
proxyWebsockets = true;
};
}
// lib.optionalAttrs (!addSSL) { forceSSL = true; }
// lib.optionalAttrs addSSL { addSSL = true; }
// lib.optionalAttrs body {
extraConfig = ''
client_max_body_size 5G;
'';
};
};
# Simple proxy sites
sites = [
{
domain = "immich.zeroq.su";
port = 2283;
addSSL = true;
body = true;
}
{
domain = "kuma.zeroq.su";
port = 4001;
}
{
domain = "health.zeroq.su";
port = 19999;
}
{
domain = "git.zeroq.su";
port = 3000;
}
{
domain = "homebox.zeroq.su";
port = 7745;
}
{
domain = "flux.zeroq.su";
port = 6061;
}
{
domain = "navidrome.zeroq.su";
port = 4533;
addSSL = true;
}
{
domain = "calibre.zeroq.su";
port = 8083;
body = true;
}
{
domain = "nix-cache.zeroq.su";
port = 5000;
body = true;
}
{
domain = "pdf.zeroq.su";
port = 8446;
body = true;
}
];
in in
{ {
services = { services = {
@@ -16,7 +93,7 @@ in
recommendedOptimisation = true; recommendedOptimisation = true;
recommendedProxySettings = true; recommendedProxySettings = true;
recommendedTlsSettings = true; recommendedTlsSettings = true;
virtualHosts = { virtualHosts = (builtins.listToAttrs (map mkProxy sites)) // {
"nextcloud.private" = { "nextcloud.private" = {
forceSSL = false; forceSSL = false;
enableACME = false; enableACME = false;
@@ -169,49 +246,6 @@ in
# client_max_body_size 5G; # client_max_body_size 5G;
# ''; # '';
# }; # };
"immich.zeroq.su" = {
addSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://${server}:2283";
proxyWebsockets = true;
};
extraConfig = ''
client_max_body_size 5G;
'';
};
"kuma.zeroq.su" = {
forceSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://${server}:4001";
proxyWebsockets = true;
};
};
"health.zeroq.su" = {
forceSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://${server}:19999";
proxyWebsockets = true;
};
};
"git.zeroq.su" = {
forceSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://${server}:3000";
proxyWebsockets = true;
};
};
"homebox.zeroq.su" = {
forceSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://${server}:7745";
proxyWebsockets = true;
};
};
# "agent.zeroq.su" = { # "agent.zeroq.su" = {
# forceSSL = true; # forceSSL = true;
# enableACME = true; # enableACME = true;
@@ -256,22 +290,6 @@ in
# }; # };
}; };
}; };
"flux.zeroq.su" = {
forceSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://${server}:6061";
proxyWebsockets = true;
};
};
"navidrome.zeroq.su" = {
addSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://${server}:4533";
proxyWebsockets = true;
};
};
"vetymae.opencodes.zeroq.su" = { "vetymae.opencodes.zeroq.su" = {
forceSSL = true; forceSSL = true;
enableACME = true; enableACME = true;
@@ -323,39 +341,6 @@ in
client_max_body_size 5G; client_max_body_size 5G;
''; '';
}; };
"calibre.zeroq.su" = {
forceSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://${server}:8083";
proxyWebsockets = true;
};
extraConfig = ''
client_max_body_size 5G;
'';
};
"nix-cache.zeroq.su" = {
forceSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://${server}:5000";
proxyWebsockets = true;
};
extraConfig = ''
client_max_body_size 5G;
'';
};
"pdf.zeroq.su" = {
forceSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://${server}:8446";
proxyWebsockets = true;
};
extraConfig = ''
client_max_body_size 5G;
'';
};
# "calibre.home.arpa" = { # "calibre.home.arpa" = {
# forceSSL = true; # forceSSL = true;
# enableACME = true; # enableACME = true;
+7 -19
View File
@@ -7,8 +7,12 @@
... ...
}: }:
let let
sourceDir = "${xlib.dirs.services-mnt-folder}/postgresql"; storage = xlib.helpers.mkServiceStorage {
targetDir = "/var/lib/postgresql"; name = "postgresql";
user = "postgres";
group = "postgres";
mode = "0760";
};
in in
{ {
services = { services = {
@@ -19,21 +23,5 @@ in
# postgresqlBackup.enable = true; # postgresqlBackup.enable = true;
}; };
systemd = { systemd = storage.systemd;
tmpfiles.rules = [
"d ${sourceDir} 0760 postgres postgres -"
"z ${sourceDir} 0760 postgres postgres -"
];
mounts = [
{
enable = true;
options = "bind,x-systemd.automount,nofail";
requires = [ "local-fs.target" ];
type = "none";
wantedBy = [ "multi-user.target" ];
what = "${sourceDir}";
where = "${targetDir}";
}
];
};
} }
+6 -19
View File
@@ -6,8 +6,11 @@
... ...
}: }:
let let
sourceDir = "${xlib.dirs.services-mnt-folder}/samba"; storage = xlib.helpers.mkServiceStorage {
targetDir = "/var/lib/samba"; name = "samba";
user = "root";
group = "root";
};
in in
{ {
services = { services = {
@@ -69,21 +72,5 @@ in
}; };
}; };
systemd = { systemd = storage.systemd;
tmpfiles.rules = [
"d ${sourceDir} 0755 root root -"
"z ${sourceDir} 0755 root root -"
];
mounts = [
{
enable = true;
options = "bind,x-systemd.automount,nofail";
requires = [ "local-fs.target" ];
type = "none";
wantedBy = [ "multi-user.target" ];
what = "${sourceDir}";
where = "${targetDir}";
}
];
};
} }
+11 -12
View File
@@ -69,13 +69,9 @@ in
}; };
}; };
fileSystems."${targetDir}" = { fileSystems = xlib.helpers.mkBindMount {
device = "${sourceDir}"; what = sourceDir;
fsType = "none"; where = targetDir;
options = [
"bind"
"nofail"
];
}; };
environment = { environment = {
@@ -84,11 +80,14 @@ in
]; ];
}; };
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules =
"d ${sourceDir} 0755 nobody nogroup -" xlib.helpers.mkTmpDirs {
"z ${sourceDir} 0755 nobody nogroup -" dir = sourceDir;
"Z ${sourceDir}/ 0700 nobody nogroup -" mode = "0755";
]; user = "nobody";
group = "nogroup";
}
++ [ (xlib.helpers.mkTmpfile "Z" "${sourceDir}/" "0700" "nobody" "nogroup") ];
sops.secrets = { sops.secrets = {
intermediate-password = { intermediate-password = {
+1 -1
View File
@@ -18,6 +18,6 @@ in
}; };
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
"z ${sourceDir} 0750 trilium trilium -" (xlib.helpers.mkTmpfile "z" sourceDir "0750" "trilium" "trilium")
]; ];
} }
+4 -8
View File
@@ -20,15 +20,11 @@ in
}; };
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
"z ${xlib.dirs.services-mnt-folder}/uptime-kuma 0755 nobody nogroup -" (xlib.helpers.mkTmpfile "z" sourceDir "0755" "nobody" "nogroup")
]; ];
fileSystems."${targetDir}" = { fileSystems = xlib.helpers.mkBindMount {
device = "${xlib.dirs.services-mnt-folder}/uptime-kuma"; what = sourceDir;
fsType = "none"; where = targetDir;
options = [
"bind"
"nofail"
];
}; };
} }
+45 -33
View File
@@ -2,23 +2,54 @@
config, config,
xlib, xlib,
lib, lib,
pkgs,
... ...
}: }:
let
user = "${xlib.device.username}";
userGroup = config.users.users."${user}".group;
# sops secret factory: name == key by default, owner/group default to root
mkSecret =
{
path,
mode,
key ? null,
owner ? null,
group ? null,
}:
{
format = "yaml";
inherit path mode;
}
// lib.optionalAttrs (key != null) { inherit key; }
// lib.optionalAttrs (owner != null) { inherit owner; }
// lib.optionalAttrs (group != null) { inherit group; };
# default owner = device user
mkUserSecret =
args:
mkSecret (
args
// {
owner = user;
group = userGroup;
}
);
in
{ {
xlib.device.username = "oqyude"; xlib.device.username = "oqyude";
users = { users = {
mutableUsers = false; mutableUsers = false;
users = { users = {
"${xlib.device.username}" = { "${user}" = {
name = "${xlib.device.username}"; name = "${user}";
isNormalUser = true; isNormalUser = true;
group = "users"; group = "users";
description = "Jor Oqyude"; description = "Jor Oqyude";
hashedPasswordFile = config.sops.secrets.hashed_password.path; # hashed_password hashedPasswordFile = config.sops.secrets.hashed_password.path; # hashed_password
homeMode = "700"; homeMode = "700";
home = "/home/${xlib.device.username}"; home = "/home/${user}";
extraGroups = [ extraGroups = [
"audio" "audio"
"disk" "disk"
@@ -46,51 +77,32 @@
secrets = { secrets = {
hashed_password = { hashed_password = {
neededForUsers = true; neededForUsers = true;
format = "yaml";
key = "hashed_password"; key = "hashed_password";
format = "yaml";
}; };
age_key_private = { age_key_private = mkUserSecret {
format = "yaml"; path = "${xlib.dirs.user-home}/.config/sops/age/keys.txt";
key = "age_key_private";
path = "/home/${xlib.device.username}/.config/sops/age/keys.txt";
owner = config.users.users."${xlib.device.username}".name;
group = config.users.users."${xlib.device.username}".group;
mode = "0600"; mode = "0600";
}; };
ssh_key_private = { ssh_key_private = mkUserSecret {
format = "yaml"; path = "${xlib.dirs.user-home}/.ssh/id_ed25519";
key = "ssh_key_private";
path = "/home/${xlib.device.username}/.ssh/id_ed25519";
owner = config.users.users."${xlib.device.username}".name;
group = config.users.users."${xlib.device.username}".group;
mode = "0600"; mode = "0600";
}; };
ssh_key_public = { ssh_key_public = mkUserSecret {
format = "yaml"; path = "${xlib.dirs.user-home}/.ssh/id_ed25519.pub";
key = "ssh_key_public";
path = "/home/${xlib.device.username}/.ssh/id_ed25519.pub";
owner = config.users.users."${xlib.device.username}".name;
group = config.users.users."${xlib.device.username}".group;
mode = "0655"; mode = "0655";
}; };
ssh_key_private_root = { ssh_key_private_root = mkSecret {
format = "yaml";
key = "ssh_key_private"; key = "ssh_key_private";
path = "/root/.ssh/id_ed25519"; path = "/root/.ssh/id_ed25519";
owner = "root";
group = "root";
mode = "0600"; mode = "0600";
}; };
ssh_key_public_root = { ssh_key_public_root = mkSecret {
format = "yaml";
key = "ssh_key_public"; key = "ssh_key_public";
path = "/root/.ssh/id_ed25519.pub"; path = "/root/.ssh/id_ed25519.pub";
owner = "root";
group = "root";
mode = "0655"; mode = "0655";
}; };
ssh_key_public_host = { ssh_key_public_host = mkSecret {
format = "yaml";
key = "ssh_key_public"; key = "ssh_key_public";
path = "/etc/ssh/id_ed25519.pub"; path = "/etc/ssh/id_ed25519.pub";
mode = "0655"; mode = "0655";
+3 -2
View File
@@ -1,5 +1,6 @@
{ {
lib, lib,
xlib,
... ...
}: }:
{ {
@@ -13,7 +14,7 @@
# ./xray.nix # ./xray.nix
]; ];
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
"d /mnt 0755 root root -" (xlib.helpers.mkTmpfile "d" "/mnt" "0755" "root" "root")
"d ${xlib.dirs.services-mnt-folder} 0755 root root -" (xlib.helpers.mkTmpfile "d" xlib.dirs.services-mnt-folder "0755" "root" "root")
]; ];
} }