Compare commits

...
18 Commits
Author SHA1 Message Date
finn.markwitz 3f48c0400b Merge pull request 'fix(nix): stop automatic rebuilds and nightly GC from tripping GitHub's rate limit' (#19) from fix/nix-gc-github-rate-limit into main
Reviewed-on: #19
2026-10-05 14:37:46 +02:00
finn.markwitzandClaude Sonnet 5 4de92dcbe8 fix(nix): stop automatic rebuilds and nightly GC from tripping GitHub's rate limit
autoUpgrade was silently failing daily on both hosts (legacy channel path,
no --flake set) without reaching the network — disabled outright since
rebuilds should only happen manually. Separately, nix-gc.timer's nightly
sweep was deleting eval-time-only flake input sources (not part of the
runtime closure), forcing the next evaluation to cold-refetch hermes-agent's
entire dependency tree from GitHub in one burst, which alone was enough to
hit the unauthenticated codeload rate limit. keep-outputs/keep-derivations
stop GC from evicting those sources.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TJS8qsYPXSUm5mdWGdaHjF
2026-10-05 14:35:19 +02:00
finn.markwitz f7196c0c86 chore: Flake Update 2026-10-04 18:39:52 +02:00
finn.markwitz 20c2b43ae5 Merge pull request 'Feat/hermes webpage port' (#17) from feat/hermes-webpage-port into main
Reviewed-on: #17
2026-10-04 18:37:36 +02:00
finn.markwitz eecb7fa2b2 Merge pull request 'Feat/jupiter seerr rename' (#16) from feat/jupiter-seerr-rename into feat/hermes-webpage-port
Reviewed-on: #16
2026-10-04 18:36:35 +02:00
finn.markwitzandClaude Sonnet 5 84ada68069 fix(mibook): disable hermes-agent's built-in self-update GitHub polling
Its self-updater was independently polling GitHub for the same repo the
flake input tracks, and stacked with a runaway crash-restart loop this
exhausted the GitHub rate limit, causing unrelated flake fetches to 429.
The Nix flake input is already the source of truth for hermes's version.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F9ge2kVMD55sLJExx3v2G3
2026-09-29 17:36:18 +02:00
finn.markwitz 07a1d8ee62 feat(mibook): open port 47823 for hermes ad-hoc webpage hosting
Distinct from the existing 9119 dashboard port — this lets the agent
serve one-off pages to devices on the local network.
2026-09-26 08:15:58 +02:00
finn.markwitzandClaude Sonnet 5 565ec2bf39 feat(jupiter): rename jellyseerr profile to seerr
Jellyseerr was rebranded upstream to Seerr (seerr-team/seerr), and
nixpkgs now aliases services.jellyseerr to services.seerr with an
identical state directory, so this is a same-data rename. Also fixes
systemd.services.jellyseerr.after, which was a silent no-op since the
underlying unit has always been named seerr.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019MLWL7mWHCV6UGfzmhnfqN
2026-09-22 11:51:02 +02:00
finn.markwitz 34a55841eb chore: Flake Update 2026-09-21 16:12:45 +02:00
finn.markwitzandClaude Sonnet 5 e110cb6b87 fix(homepage): replace GitLab links with self-hosted Gitea
Migrated from gitlab.smoothcloud.de to git.rechberg.online; drop the
now-obsolete bookmark and repoint the Services tile.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QD5x9KR8cM7EPPsxKATHfQ
2026-09-21 16:01:50 +02:00
finn.markwitzandClaude Sonnet 5 33ac72aaed fix(home-assistant): disable otbr-agent, ZBT-2 antenna not connected
otbr-agent can't reach the Thread radio without the antenna attached
and crash-loops on every switch, failing the rebuild.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QD5x9KR8cM7EPPsxKATHfQ
2026-09-21 15:55:20 +02:00
finn.markwitzandClaude Sonnet 5 30b7f177c5 feat(immich): upgrade to 3.x via unstable overlay
nixos-26.05 pins immich at 2.7.5; pull 3.2.0 from pkgs.unstable
instead. The machine-learning service picks up the matching version
automatically via the package's passthru. Verified jupiter's toplevel
still builds; pgvecto.rs->vectorchord migration was already in place
so no DB migration is needed for the bump itself.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDyhS2N9XEeMq4GisBrqyf
2026-09-21 15:42:31 +02:00
finn.markwitz c1fc8e2a05 Merge pull request 'fix(homepage): merge service groups by name to stop manual entries being dropped' (#14) from fix/homepage-duplicate-service-groups into main
Reviewed-on: #14
2026-09-21 15:29:59 +02:00
finn.markwitzandClaude Sonnet 5 202eca2d03 fix(homepage): merge service groups by name to stop manual entries being dropped
homepage-dashboard resolves services.yaml groups by name using first-match
lookup, so the module-contributed "Services" group and manual-services.nix's
"Services" group (two separate top-level YAML list entries) caused the
second one to be silently discarded. Merge by group name before handing the
list to services.homepage-dashboard.services.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JbLevsLozTCcCWe1SoUGe1
2026-09-21 15:27:07 +02:00
finn.markwitz 2ff3042cd9 Merge pull request 'feat(mibook): add swapfile and nodejs dev tooling' (#13) from feat/mibook-swapfile into main
Reviewed-on: #13
2026-09-21 15:21:22 +02:00
finn.markwitzandClaude Sonnet 5 d219f2b61c feat(mibook): add swapfile and nodejs dev tooling
Add an 8G swapfile for headroom during nix builds (7.7G RAM, no prior
swap) and bring nodejs (bundles npm) into the development profile.
Also picks up latest flake.lock input updates.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C5fRUDLRzDhoKhEqa69cyR
2026-09-21 15:13:03 +02:00
finn.markwitz 5a2a649244 feat: Sops for Jupiter Setup 2026-09-19 18:48:53 +02:00
finn.markwitz 4691eb1aa4 Merge pull request 'Feat/sops nix' (#12) from feat/sops-nix into main
Reviewed-on: #12
2026-09-14 13:06:45 +02:00
16 changed files with 176 additions and 143 deletions
+7 -5
View File
@@ -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
+40 -40
View File
@@ -21,11 +21,11 @@
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1785627969,
"narHash": "sha256-4dtXQk/NMePegK/nWp5NSeuZKLATItOq61lpEvmXqGw=",
"lastModified": 1790898470,
"narHash": "sha256-zTwuwezD0w3hpga6a6P8emidzAZFyWqlNeRBlpWOOl8=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "427bf4bd9435fdf21321c8cc628c24efc14c0f7a",
"rev": "024633cd702b10285db5cb19b40ad48d2399ba60",
"type": "github"
},
"original": {
@@ -63,11 +63,11 @@
]
},
"locked": {
"lastModified": 1782949081,
"narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=",
"lastModified": 1788450739,
"narHash": "sha256-glZLQlzIn1fXH6PazR2iUmTo7kzzyYSshrWhLS9TqCU=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e",
"rev": "31729ca8cbdb4fa927b34e5f4353e6a83f39e993",
"type": "github"
},
"original": {
@@ -87,11 +87,11 @@
]
},
"locked": {
"lastModified": 1783008725,
"narHash": "sha256-jGiy6+sxjNWXSjp25uoJuNfyH9zBK1PEDY0lVoL4ibQ=",
"lastModified": 1788267358,
"narHash": "sha256-nt+lUqYVpc9Y6JeMd2WmXzCDojasdadKo0mWcluvY2Y=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "bca82caa46d5ec0f5d422c61fb1e30bc51313cbe",
"rev": "27555e2624241fb116b49095df4caaee85a25691",
"type": "github"
},
"original": {
@@ -113,11 +113,11 @@
"uv2nix": "uv2nix"
},
"locked": {
"lastModified": 1788877844,
"narHash": "sha256-9Ik9egIxYhW/IDw1mz/dYN0IqLTP3bEe+LdEFtP9FWM=",
"lastModified": 1791121781,
"narHash": "sha256-39vzOiYTAwECDMfJAv/b+OxpHPXHfJle0Gx5x+WjPW0=",
"owner": "NousResearch",
"repo": "hermes-agent",
"rev": "c8aa5608c24e3636e77c267650c0f1f52e44adb0",
"rev": "af90026aa09949579bd423d24def3d38f743cde0",
"type": "github"
},
"original": {
@@ -157,11 +157,11 @@
"nixpkgs-regression": "nixpkgs-regression"
},
"locked": {
"lastModified": 1787274306,
"narHash": "sha256-Qg9f9td5iphUWSQS6zmvyZWO1F+D7j8Z3U6dGyUTg08=",
"lastModified": 1791067591,
"narHash": "sha256-SGcfVVSS3DLO+ES4J+SrLxKGP11yvTWXgiAqku1L+Sk=",
"owner": "NixOS",
"repo": "nix",
"rev": "649e823fb24ed118d72e613be35fa8ea1b64afe7",
"rev": "e8280775f307a94ca82cea193cfcc14c0d56232a",
"type": "github"
},
"original": {
@@ -211,11 +211,11 @@
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1787144466,
"narHash": "sha256-HHfv2/HkNSKbbSyU9iD/g8lbP6r4tl33sSw1W4rXCk0=",
"lastModified": 1791128201,
"narHash": "sha256-rlsYY/Dg/LhbIj51Aa6TLvRpZeb3KZgUTd7llQ5XcJE=",
"owner": "NixOS",
"repo": "nixos-hardware",
"rev": "0471accf8d0a8210b31d947497d179ecc99e0021",
"rev": "31cc5f4d9b9ba601071e8b8504601b9b176e2756",
"type": "github"
},
"original": {
@@ -226,11 +226,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1783148766,
"narHash": "sha256-H9+N+GFtsbVC8ZniHliChM7ndizxtqVZs6bnGOLM3WQ=",
"rev": "a50de1b7d8a586adc18d2395c19de7d6058e6030",
"lastModified": 1789344334,
"narHash": "sha256-it+7kNGnOOHBCEnl4SfZ7QtfGziH3EryzHqwvJpjAfg=",
"rev": "c3eea5b2156db11c7eeeada3dc737711255b253e",
"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.9729.c3eea5b2156d/nixexprs.tar.xz"
},
"original": {
"type": "tarball",
@@ -255,11 +255,11 @@
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1785031560,
"narHash": "sha256-OmshNvn2vupOFpYinLUu+1Dnpu4n7Q5N3ggGVNHpkUI=",
"lastModified": 1790477367,
"narHash": "sha256-oujbxmVKDhci2E4EM3KyAbRUgp5/IsCoiA/LfEF7OOk=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "0e79af5e3d4dcfcd676ab5ba3f95d2e3352e078c",
"rev": "f7cd230690d9fc982d06129f9189b101fddcfa3b",
"type": "github"
},
"original": {
@@ -286,11 +286,11 @@
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1787135253,
"narHash": "sha256-M5/r2v++FjVhdsxXYMb4BDJ5YLAdCWFt3aZotcshocA=",
"rev": "ffb3c9b700e759be2ef13237c9d8f953b32a1e46",
"lastModified": 1791048980,
"narHash": "sha256-u3KCLxsnf1622GdFccg8hmkEIutOZ1h4pvia5ERjIuI=",
"rev": "a7868a727837f3c09cee2ce0ca671c76b1589fed",
"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.11pre1084968.a7868a727837/nixexprs.tar.zst"
},
"original": {
"id": "nixpkgs",
@@ -300,11 +300,11 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1767892417,
"narHash": "sha256-8bW3q88CEg2u4hSP66Vf4lpbLonHz7hqDNBMcCY7E9U=",
"rev": "3497aa5c9457a9d88d71fa93a4a8368816fbeeba",
"lastModified": 1789546076,
"narHash": "sha256-vWkSk5bbfTqdtMoSgD9FshACO8JCvXTFi+3cqEp0mH0=",
"rev": "b1b875982b17dabde9b4a37f3e229e74913e6db3",
"type": "tarball",
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre924538.3497aa5c9457/nixexprs.tar.xz"
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.11pre1074753.b1b875982b17/nixexprs.tar.xz"
},
"original": {
"type": "tarball",
@@ -313,11 +313,11 @@
},
"nixpkgs_3": {
"locked": {
"lastModified": 1787101114,
"narHash": "sha256-BA7sSNjLDuPGSOYBGpr6WQjke1MQ8AZpJ8GlYZM/mOc=",
"rev": "b18a4b905f8d028dc4476412e6d6891728695379",
"lastModified": 1791031588,
"narHash": "sha256-4XF6NXFWmQPM0xHuxTw+iQEA6mUtmDQNJoVd4u9GkLw=",
"rev": "825e2028c29b702a4a5f085f08095d12099784f2",
"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.11150.825e2028c29b/nixexprs.tar.zst"
},
"original": {
"id": "nixpkgs",
@@ -415,11 +415,11 @@
]
},
"locked": {
"lastModified": 1788337237,
"narHash": "sha256-gkSH8VUtCo6hnysNmb9DbTuDepH2t5pv+QWjP75xKAk=",
"lastModified": 1791103873,
"narHash": "sha256-nFxM+pKoZ8LJAEnUXARyCaOAloWgaW9kZQOSjWzKcTE=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "fbf759290e0cb0a98dfc813a4eb7d53ad1dacb57",
"rev": "dcd241ba97088c22569d1573286e1b9daad340c0",
"type": "github"
},
"original": {
+7
View File
@@ -12,6 +12,13 @@
settings = {
auto-optimise-store = true;
# Without these, gc sweeps away eval-time-only sources (flake inputs,
# their build deps) since they're not part of the runtime closure.
# The next evaluation then cold-refetches everything from GitHub,
# which is enough on its own to trip GitHub's unauthenticated rate
# limit for large dependency trees (e.g. hermes-agent's).
keep-outputs = true;
keep-derivations = true;
};
gc = {
+4 -1
View File
@@ -72,6 +72,9 @@
system = {
stateVersion = "23.05";
autoUpgrade.enable = true;
# Was silently failing daily (legacy channel path, no --flake set) without
# ever reaching the network. Disabled rather than fixed: rebuilds should
# only happen when triggered manually.
autoUpgrade.enable = false;
};
}
+1 -1
View File
@@ -17,7 +17,7 @@ _: {
readarr.enable = true;
sonarr.enable = true;
jellyfin.enable = true;
jellyseerr.enable = true;
seerr.enable = true;
immich.enable = true;
development.enable = true;
home-assistant.enable = true;
+11 -1
View File
@@ -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";
@@ -54,6 +61,9 @@
system = {
stateVersion = "23.05";
autoUpgrade.enable = true;
# Was silently failing daily (legacy channel path, no --flake set) without
# ever reaching the network. Disabled rather than fixed: rebuilds should
# only happen when triggered manually.
autoUpgrade.enable = false;
};
}
+1
View File
@@ -4,5 +4,6 @@ _: {
# firewall otherwise blocks inbound connections from other devices.
networking.firewall.allowedTCPPorts = [
9119 # athena hermes dashboard
47823 # hermes agent ad-hoc webpage server
];
}
+1 -1
View File
@@ -18,7 +18,7 @@
./readarr
./sonarr
./jellyfin
./jellyseerr
./seerr
./immich
./hermes-agent
];
@@ -21,6 +21,7 @@ in
neovim
# jetbrains.idea-ultimate
go
nodejs # bundles npm
(python3.withPackages (
ps: with ps; [
jupyter # notebooks
@@ -20,6 +20,9 @@ in
enable = true;
# Deliberate pin, matches the approved design — bump on purpose, not by drift.
settings.model.default = "anthropic/claude-sonnet-4-5";
# The Nix flake input is the source of truth for hermes's version here; its
# built-in self-updater polling GitHub independently just burns API quota.
settings.updates.check = false;
environmentFiles = [ config.sops.secrets."hermes-env".path ];
addToSystemPackages = true;
@@ -54,14 +54,16 @@ in
"f /var/lib/hass/scenes.yaml 0644 hass hass - []"
];
services.openthread-border-router = {
enable = true;
package = pkgs.unstable.openthread-border-router;
openFirewall = true;
backboneInterfaces = [ "enp3s0" ];
radio.device = "/dev/serial/by-id/usb-Nabu_Casa_ZBT-2_DCB4D9149C7C-if00";
radio.baudRate = 460800;
};
# Disabled: ZBT-2 antenna isn't connected, so otbr-agent can't reach the
# radio and just crash-loops on every switch.
# services.openthread-border-router = {
# enable = true;
# package = pkgs.unstable.openthread-border-router;
# openFirewall = true;
# backboneInterfaces = [ "enp3s0" ];
# radio.device = "/dev/serial/by-id/usb-Nabu_Casa_ZBT-2_DCB4D9149C7C-if00";
# radio.baudRate = 460800;
# };
my.homepage.services = [
{
@@ -1,16 +1,4 @@
[
{
Developer = [
{
Github = [
{
abbr = "GitLab - Smoothcloud";
href = "https://gitlab.smoothcloud.de/";
}
];
}
];
}
{
Social = [
{
+78 -64
View File
@@ -12,79 +12,93 @@ let
manualServices = import ./manual-services.nix;
manualWidgets = import ./manual-widgets.nix;
groupedServices =
lib.foldl'
(
acc: entry:
acc
// {
${entry.group} = (acc.${entry.group} or [ ]) ++ [ entry ];
}
)
{ }
config.my.homepage.services;
homepageServices = lib.mapAttrsToList (
group: entries:
{
${group} = map (
entry:
let
service = builtins.removeAttrs entry [
"group"
"name"
];
in
{
${entry.name} = lib.filterAttrs (_: value: value != null) service;
}
) entries;
groupedServices = lib.foldl' (
acc: entry:
acc
// {
${entry.group} = (acc.${entry.group} or [ ]) ++ [ entry ];
}
) groupedServices;
) { } config.my.homepage.services;
homepageServices = lib.mapAttrsToList (group: entries: {
${group} = map (
entry:
let
service = builtins.removeAttrs entry [
"group"
"name"
];
in
{
${entry.name} = lib.filterAttrs (_: value: value != null) service;
}
) entries;
}) 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 {
type = types.listOf (
types.submodule {
options = {
group = mkOption {
type = types.str;
description = "Homepage service group";
};
options.my.homepage.services =
with lib;
mkOption {
type = types.listOf (
types.submodule {
options = {
group = mkOption {
type = types.str;
description = "Homepage service group";
};
name = mkOption {
type = types.str;
description = "Homepage service name";
};
name = mkOption {
type = types.str;
description = "Homepage service name";
};
description = mkOption {
type = types.str;
description = "Homepage service description";
};
description = mkOption {
type = types.str;
description = "Homepage service description";
};
href = mkOption {
type = types.str;
description = "Homepage service URL";
};
href = mkOption {
type = types.str;
description = "Homepage service URL";
};
icon = mkOption {
type = types.nullOr types.str;
default = null;
description = "Optional Homepage service icon";
icon = mkOption {
type = types.nullOr types.str;
default = null;
description = "Optional Homepage service icon";
};
};
};
}
);
default = [ ];
description = "Merged homepage service metadata contributed by repo modules.";
};
}
);
default = [ ];
description = "Merged homepage service metadata contributed by repo modules.";
};
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; }; }.";
};
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; }; }.";
};
options.my.profiles.homepage = with lib; {
enable = mkEnableOption "getHomepage.dev Dashboard";
@@ -98,7 +112,7 @@ in
listenPort = 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;
};
@@ -17,10 +17,10 @@
};
}
{
"GitLab" = {
href = "https://gitlab.smoothcloud.de";
description = "Selfhosted GitLab";
icon = "gitlab.png";
"Gitea" = {
href = "https://git.rechberg.online";
description = "Selfhosted Gitea";
icon = "gitea.png";
};
}
{
+2
View File
@@ -18,6 +18,8 @@ in
config = lib.mkIf cfg.enable {
services.immich = {
enable = true;
# nixos-26.05 pins immich 2.7.5; pull 3.x from the unstable overlay instead.
package = pkgs.unstable.immich;
host = "0.0.0.0";
inherit port;
openFirewall = true;
@@ -1,17 +1,17 @@
# manages and downloads films
{ config, lib, ... }:
let
cfg = config.my.profiles.jellyseerr;
cfg = config.my.profiles.seerr;
hostName = config.networking.hostName;
port = 5055;
in
{
options.my.profiles.jellyseerr = with lib; {
enable = mkEnableOption "JellySeerr Media Service";
options.my.profiles.seerr = with lib; {
enable = mkEnableOption "Seerr Media Service";
};
config = lib.mkIf cfg.enable {
services.jellyseerr = {
services.seerr = {
enable = true;
openFirewall = true;
};
@@ -19,14 +19,14 @@ in
my.homepage.services = [
{
group = "Media";
name = "Jellyseerr";
name = "Seerr";
description = "Media requests";
href = "http://${hostName}:${toString port}";
icon = "mdi-television-guide";
}
];
systemd.services.jellyseerr = {
systemd.services.seerr = {
after = [ "network-online.target" ];
};
};