Compare commits
11
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
202eca2d03 | ||
|
|
2ff3042cd9 | ||
|
|
d219f2b61c | ||
|
|
5a2a649244 | ||
|
|
4691eb1aa4 | ||
|
|
9dbd6ff71d | ||
|
|
807eea7e4f | ||
|
|
b96d30edd7 | ||
|
|
a7ffcc4648 | ||
|
|
652630cfe4 | ||
|
|
abe2431dbb |
+7
-5
@@ -1,7 +1,7 @@
|
||||
keys:
|
||||
- &admin_finn age1a0v442ct2qfjcdhyktn25spw02yq4fl08plrrvuradwwxzsle4mq8thln4
|
||||
- &host_mibook age1n3uqtee5ymykrls6k04dznq50cwmj99hw7ny83yxjndt4y2ncf5qhjwa2p
|
||||
# - &host_jupiter age1... # TODO: Phase 9, see docs/secrets.md
|
||||
- &host_jupiter age15uxuaxhn2hr4ypmgll36fwnkdkvv6gynvlxuc2p8ek0enmxmr5rsvlq0r2
|
||||
|
||||
creation_rules:
|
||||
- path_regex: ^secrets/mibook\.yaml$
|
||||
@@ -9,9 +9,11 @@ creation_rules:
|
||||
- age:
|
||||
- *admin_finn
|
||||
- *host_mibook
|
||||
# - path_regex: ^secrets/jupiter\.yaml$ # TODO: Phase 9
|
||||
# key_groups:
|
||||
# - age: [ *admin_finn, *host_jupiter ]
|
||||
# - path_regex: ^secrets/common\.yaml$ # TODO: Phase 9
|
||||
- path_regex: ^secrets/jupiter\.yaml$
|
||||
key_groups:
|
||||
- age:
|
||||
- *admin_finn
|
||||
- *host_jupiter
|
||||
# - path_regex: ^secrets/common\.yaml$ # TODO: only if/when a secret needs to be shared across both hosts
|
||||
# key_groups:
|
||||
# - age: [ *admin_finn, *host_mibook, *host_jupiter ]
|
||||
|
||||
Generated
+36
-36
@@ -21,11 +21,11 @@
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1785627969,
|
||||
"narHash": "sha256-4dtXQk/NMePegK/nWp5NSeuZKLATItOq61lpEvmXqGw=",
|
||||
"lastModified": 1788450739,
|
||||
"narHash": "sha256-glZLQlzIn1fXH6PazR2iUmTo7kzzyYSshrWhLS9TqCU=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "427bf4bd9435fdf21321c8cc628c24efc14c0f7a",
|
||||
"rev": "31729ca8cbdb4fa927b34e5f4353e6a83f39e993",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -63,11 +63,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1782949081,
|
||||
"narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=",
|
||||
"lastModified": 1785627969,
|
||||
"narHash": "sha256-4dtXQk/NMePegK/nWp5NSeuZKLATItOq61lpEvmXqGw=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e",
|
||||
"rev": "427bf4bd9435fdf21321c8cc628c24efc14c0f7a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -87,11 +87,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1783008725,
|
||||
"narHash": "sha256-jGiy6+sxjNWXSjp25uoJuNfyH9zBK1PEDY0lVoL4ibQ=",
|
||||
"lastModified": 1784288435,
|
||||
"narHash": "sha256-ReRHaLgr/uVqdD8afFSn+myXIfpHeOhP0yYe0TJqAA8=",
|
||||
"owner": "cachix",
|
||||
"repo": "git-hooks.nix",
|
||||
"rev": "bca82caa46d5ec0f5d422c61fb1e30bc51313cbe",
|
||||
"rev": "43b3c1ab9d40fb1dbb008f451988a91e375825e9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -113,11 +113,11 @@
|
||||
"uv2nix": "uv2nix"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1788877844,
|
||||
"narHash": "sha256-9Ik9egIxYhW/IDw1mz/dYN0IqLTP3bEe+LdEFtP9FWM=",
|
||||
"lastModified": 1789361774,
|
||||
"narHash": "sha256-ashkMxyQelHq7T4AcJ0Zwuzm9/jMR3hTCWW+2FPwlDg=",
|
||||
"owner": "NousResearch",
|
||||
"repo": "hermes-agent",
|
||||
"rev": "c8aa5608c24e3636e77c267650c0f1f52e44adb0",
|
||||
"rev": "5eb99eb2844b22ebb723711b8e6a0bbb80bb5f04",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -157,11 +157,11 @@
|
||||
"nixpkgs-regression": "nixpkgs-regression"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1787274306,
|
||||
"narHash": "sha256-Qg9f9td5iphUWSQS6zmvyZWO1F+D7j8Z3U6dGyUTg08=",
|
||||
"lastModified": 1789352761,
|
||||
"narHash": "sha256-jAcDj4iXkbxa5AlooMRZj7H3E81Cz/q7yN/bX7GPFSU=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nix",
|
||||
"rev": "649e823fb24ed118d72e613be35fa8ea1b64afe7",
|
||||
"rev": "920f6956361496578b8a97ae04ec5f400d729ab4",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -211,11 +211,11 @@
|
||||
"nixpkgs": "nixpkgs_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1787144466,
|
||||
"narHash": "sha256-HHfv2/HkNSKbbSyU9iD/g8lbP6r4tl33sSw1W4rXCk0=",
|
||||
"lastModified": 1789127271,
|
||||
"narHash": "sha256-vL/Fpo7Zxa7wvO8V5FAToUBvP+K3XsMB1wUglTtd/J0=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixos-hardware",
|
||||
"rev": "0471accf8d0a8210b31d947497d179ecc99e0021",
|
||||
"rev": "24cfdc1f9344b90a1eee329a3906e2f39f4d0f1e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -226,11 +226,11 @@
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1783148766,
|
||||
"narHash": "sha256-H9+N+GFtsbVC8ZniHliChM7ndizxtqVZs6bnGOLM3WQ=",
|
||||
"rev": "a50de1b7d8a586adc18d2395c19de7d6058e6030",
|
||||
"lastModified": 1788921488,
|
||||
"narHash": "sha256-JLopN/XSodSsJIZ7v7tEjpPZ+QXc883s3HoUIxHD8Io=",
|
||||
"rev": "6aefcda9401be8acc2b74244fb3b37520ea1f0a8",
|
||||
"type": "tarball",
|
||||
"url": "https://releases.nixos.org/nixos/26.05/nixos-26.05.4193.a50de1b7d8a5/nixexprs.tar.xz"
|
||||
"url": "https://releases.nixos.org/nixos/26.05/nixos-26.05.9440.6aefcda9401b/nixexprs.tar.xz"
|
||||
},
|
||||
"original": {
|
||||
"type": "tarball",
|
||||
@@ -255,11 +255,11 @@
|
||||
},
|
||||
"nixpkgs-lib": {
|
||||
"locked": {
|
||||
"lastModified": 1785031560,
|
||||
"narHash": "sha256-OmshNvn2vupOFpYinLUu+1Dnpu4n7Q5N3ggGVNHpkUI=",
|
||||
"lastModified": 1788057806,
|
||||
"narHash": "sha256-DTQSMxzDWmT0zhguthvegnVkn7CFqGCv4IHCzk5ZUpM=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"rev": "0e79af5e3d4dcfcd676ab5ba3f95d2e3352e078c",
|
||||
"rev": "596e2e3940e09b2abbeb03f75fa1828c57fcd72c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -286,11 +286,11 @@
|
||||
},
|
||||
"nixpkgs-unstable": {
|
||||
"locked": {
|
||||
"lastModified": 1787135253,
|
||||
"narHash": "sha256-M5/r2v++FjVhdsxXYMb4BDJ5YLAdCWFt3aZotcshocA=",
|
||||
"rev": "ffb3c9b700e759be2ef13237c9d8f953b32a1e46",
|
||||
"lastModified": 1789286504,
|
||||
"narHash": "sha256-3i80JnZ9pZ7tWReb/Sqpc32cfzffCu8TWLnbnH0hN9c=",
|
||||
"rev": "ef34387ddd751e1ab8857adf4676492d32eb24ec",
|
||||
"type": "tarball",
|
||||
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.11pre1058091.ffb3c9b700e7/nixexprs.tar.xz"
|
||||
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.11pre1073009.ef34387ddd75/nixexprs.tar.xz"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
@@ -313,11 +313,11 @@
|
||||
},
|
||||
"nixpkgs_3": {
|
||||
"locked": {
|
||||
"lastModified": 1787101114,
|
||||
"narHash": "sha256-BA7sSNjLDuPGSOYBGpr6WQjke1MQ8AZpJ8GlYZM/mOc=",
|
||||
"rev": "b18a4b905f8d028dc4476412e6d6891728695379",
|
||||
"lastModified": 1789114715,
|
||||
"narHash": "sha256-eeH+/1GxEjw8NCObjaHVIy3YvCQ4Qckrx4LZj5xBaU4=",
|
||||
"rev": "21a67dc470149f337cecafbe965d8d252a390518",
|
||||
"type": "tarball",
|
||||
"url": "https://releases.nixos.org/nixos/26.05/nixos-26.05.8045.b18a4b905f8d/nixexprs.tar.xz"
|
||||
"url": "https://releases.nixos.org/nixos/26.05/nixos-26.05.9592.21a67dc47014/nixexprs.tar.xz"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
@@ -415,11 +415,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1788337237,
|
||||
"narHash": "sha256-gkSH8VUtCo6hnysNmb9DbTuDepH2t5pv+QWjP75xKAk=",
|
||||
"lastModified": 1788914643,
|
||||
"narHash": "sha256-4GuMPW90JSxXWDPUB9M+1m7fYbe3H0apOd86/zBQ2Kw=",
|
||||
"owner": "Mic92",
|
||||
"repo": "sops-nix",
|
||||
"rev": "fbf759290e0cb0a98dfc813a4eb7d53ad1dacb57",
|
||||
"rev": "13616fff713a9f94055c66f15687ebdc17a335df",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
||||
@@ -49,11 +49,22 @@
|
||||
# Try fix wifi disconnect
|
||||
networking.networkmanager.wifi.powersave = false;
|
||||
|
||||
# Disable hibernate completely
|
||||
# Disable hibernate and suspend completely - this is a headless server.
|
||||
# The board exposes a phantom ACPI lid switch (PNP0C0D) that fires a
|
||||
# "closed" event when the HDMI cable is unplugged, which used to trigger
|
||||
# a real suspend via logind's default HandleLidSwitch=suspend.
|
||||
powerManagement.enable = true;
|
||||
systemd.targets."hibernate".enable = false;
|
||||
systemd.targets."hybrid-sleep".enable = false;
|
||||
systemd.targets."suspend-then-hibernate".enable = false;
|
||||
systemd.targets."suspend".enable = false;
|
||||
systemd.targets."sleep".enable = false;
|
||||
|
||||
services.logind.settings.Login = {
|
||||
HandleLidSwitch = "ignore";
|
||||
HandleLidSwitchExternalPower = "ignore";
|
||||
HandleLidSwitchDocked = "ignore";
|
||||
};
|
||||
|
||||
# Optional: kernel parameter to fully disable hibernation
|
||||
boot.kernelParams = [ "nohibernate" ];
|
||||
|
||||
@@ -10,6 +10,7 @@ _: {
|
||||
};
|
||||
actual.enable = false;
|
||||
audiobookshelf.enable = true;
|
||||
claude-code.enable = true;
|
||||
kde-desktop.enable = false;
|
||||
radarr.enable = true;
|
||||
docker.enable = true;
|
||||
|
||||
@@ -4,7 +4,7 @@ _: {
|
||||
];
|
||||
|
||||
networking = {
|
||||
domain = "jupiter.solar.internal";
|
||||
domain = "jupiter";
|
||||
search = [ "jupiter.solar.internal" ];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -16,6 +16,13 @@
|
||||
];
|
||||
|
||||
networking.hostName = "mibook";
|
||||
|
||||
swapDevices = [
|
||||
{
|
||||
device = "/var/lib/swapfile";
|
||||
size = 8 * 1024; # 8G, headroom for nix builds (7.7G RAM, no prior swap)
|
||||
}
|
||||
];
|
||||
boot.loader.grub = {
|
||||
enable = true;
|
||||
device = "/dev/nvme0n1";
|
||||
|
||||
@@ -21,6 +21,7 @@ in
|
||||
neovim
|
||||
# jetbrains.idea-ultimate
|
||||
go
|
||||
nodejs # bundles npm
|
||||
(python3.withPackages (
|
||||
ps: with ps; [
|
||||
jupyter # notebooks
|
||||
|
||||
@@ -12,21 +12,15 @@ let
|
||||
manualServices = import ./manual-services.nix;
|
||||
manualWidgets = import ./manual-widgets.nix;
|
||||
|
||||
groupedServices =
|
||||
lib.foldl'
|
||||
(
|
||||
groupedServices = lib.foldl' (
|
||||
acc: entry:
|
||||
acc
|
||||
// {
|
||||
${entry.group} = (acc.${entry.group} or [ ]) ++ [ entry ];
|
||||
}
|
||||
)
|
||||
{ }
|
||||
config.my.homepage.services;
|
||||
) { } config.my.homepage.services;
|
||||
|
||||
homepageServices = lib.mapAttrsToList (
|
||||
group: entries:
|
||||
{
|
||||
homepageServices = lib.mapAttrsToList (group: entries: {
|
||||
${group} = map (
|
||||
entry:
|
||||
let
|
||||
@@ -39,12 +33,30 @@ let
|
||||
${entry.name} = lib.filterAttrs (_: value: value != null) service;
|
||||
}
|
||||
) entries;
|
||||
}
|
||||
) groupedServices;
|
||||
}) groupedServices;
|
||||
|
||||
# homepage-dashboard keeps only the first services.yaml list entry with a
|
||||
# given group name (first match wins), so module-contributed and manual
|
||||
# groups sharing a name (e.g. "Services") must be merged here rather than
|
||||
# simply concatenated, or the later ones are silently dropped.
|
||||
mergeGroups =
|
||||
lists:
|
||||
let
|
||||
merged = lib.foldl' (
|
||||
acc: groupAttrs:
|
||||
let
|
||||
groupName = builtins.head (builtins.attrNames groupAttrs);
|
||||
in
|
||||
acc // { ${groupName} = (acc.${groupName} or [ ]) ++ groupAttrs.${groupName}; }
|
||||
) { } lists;
|
||||
in
|
||||
lib.mapAttrsToList (name: entries: { ${name} = entries; }) merged;
|
||||
in
|
||||
{
|
||||
|
||||
options.my.homepage.services = with lib; mkOption {
|
||||
options.my.homepage.services =
|
||||
with lib;
|
||||
mkOption {
|
||||
type = types.listOf (
|
||||
types.submodule {
|
||||
options = {
|
||||
@@ -80,7 +92,9 @@ in
|
||||
description = "Merged homepage service metadata contributed by repo modules.";
|
||||
};
|
||||
|
||||
options.my.homepage.widgets = with lib; mkOption {
|
||||
options.my.homepage.widgets =
|
||||
with lib;
|
||||
mkOption {
|
||||
type = types.listOf types.attrs;
|
||||
default = [ ];
|
||||
description = "Widget definitions passed directly to services.homepage-dashboard.widgets. Each entry is an attrset like { resources = { cpu = true; memory = true; }; }.";
|
||||
@@ -91,12 +105,14 @@ in
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
networking.firewall.allowedTCPPorts = [ dashboardPort ];
|
||||
|
||||
services.homepage-dashboard = {
|
||||
enable = true;
|
||||
listenPort = dashboardPort;
|
||||
allowedHosts = "${dashboardHost}:${toString dashboardPort},localhost:${toString dashboardPort},127.0.0.1:${toString dashboardPort},jupiter.solar.internal:${toString dashboardPort}";
|
||||
allowedHosts = "${dashboardHost}:${toString dashboardPort},192.168.178.65:${toString dashboardPort},localhost:${toString dashboardPort},127.0.0.1:${toString dashboardPort},jupiter:${toString dashboardPort},jupiter.solar.internal:${toString dashboardPort}";
|
||||
bookmarks = import ./bookmarks.nix;
|
||||
services = homepageServices ++ manualServices;
|
||||
services = mergeGroups (homepageServices ++ manualServices);
|
||||
widgets = config.my.homepage.widgets ++ manualWidgets;
|
||||
};
|
||||
|
||||
|
||||
@@ -2,6 +2,13 @@
|
||||
# Example:
|
||||
{
|
||||
"Services" = [
|
||||
{
|
||||
"Athena Dashboard" = {
|
||||
href = "http://mibook:9119";
|
||||
description = "Hermes Agent messaging gateway";
|
||||
icon = "mdi-robot-outline";
|
||||
};
|
||||
}
|
||||
{
|
||||
"Tesla - Dashboard" = {
|
||||
href = "https://grafana.smoothcloud.de";
|
||||
|
||||
Reference in New Issue
Block a user