refactor(youko): run homepage from the native NixOS module

services.homepage-dashboard runs the nixpkgs package with DynamicUser,
replacing the :latest container, its system user and the activation
script that rsynced the YAML into place. The YAML stays as is and is
linked into /etc/homepage-dashboard.

Assisted-by: Claude Code (claude-opus-5-5)
This commit is contained in:
Ryan Yin authored and ryan4yin | 二花 committed 2026-11-01 11:42:57 -06:00
1 parent c8d8b17a27
commit 6fa6e6626e
13 files changed
+20 -57

No files matched your search

@@ -32,7 +32,7 @@ retired `aquamarine` VM — the name now belongs to the inference server, not th
1. caddy: Reverse proxy / TLS front end and the `file.writefor.fun` file server (`caddy.nix`).
1. victoriametrics + vmalert + alertmanager + grafana: Monitor the metrics of my homelab
(`monitoring/`).
1. homepage + uptime-kuma: Service dashboard and uptime checks (`oci-containers/`).
1. homepage (`homepage/`) + uptime-kuma (`oci-containers/`): Service dashboard and uptime checks.
All the services assume a reverse proxy in front: they listen on localhost, and a caddy service
listens on the local network interface and proxies requests to them. The exception is transmission,
@@ -0,0 +1,18 @@
{ lib, ... }:
{
services.homepage-dashboard = {
enable = true;
listenPort = 54401;
allowedHosts = "home.writefor.fun";
};
# Keep the config as plain YAML instead of the module's Nix options.
environment.etc = lib.listToAttrs (
map (f: lib.nameValuePair "homepage-dashboard/${f}" { source = lib.mkForce ./${f}; }) [
"bookmarks.yaml"
"services.yaml"
"settings.yaml"
"widgets.yaml"
]
);
}
@@ -101,7 +101,7 @@ Applied — immich runs on youko. The steps below are the procedure as deployed:
2. `./default.nix`: the `services.immich` configuration (server, database, machine-learning,
tmpfiles).
3. `../caddy.nix`: the `immich.writefor.fun` vhost.
4. `../oci-containers/homepage/config/services.yaml`: dashboard entry.
4. `../homepage/services.yaml`: dashboard entry.
5. Preview and deploy: `just youko dry-activate`, then `just youko`.
6. Register the first user (becomes admin), disable open signup, add the external library, trigger a
scan.
@@ -1,3 +0,0 @@
# kana-docker:
# socket: /var/run/docker.sock
#
@@ -1,6 +0,0 @@
# https://gethomepage.dev/latest/configs/kubernetes/
# uses the default kubeconfig to access the cluster
# read kubbecofig from $KUBECONFIG or $HOME/.kube/config
# mode: default
mode: disabled
@@ -1,44 +0,0 @@
{
config,
pkgs,
...
}:
let
user = "homepage";
configDir = "/var/lib/homepage-dashboard";
in
{
users.groups.${user} = { };
users.users.${user} = {
group = user;
home = configDir;
isSystemUser = true;
};
# Install the homepage-dashboard configuration files
system.activationScripts.installHomepageDashboardConfig = ''
mkdir -p ${configDir}
${pkgs.rsync}/bin/rsync -avz --chmod=D2755,F644 ${./config}/ ${configDir}/
chown -R ${user}:${user} ${configDir}
'';
# https://github.com/NixOS/nixpkgs/blob/nixos-26.05/nixos/modules/virtualisation/oci-containers.nix
virtualisation.oci-containers.containers = {
# check its logs via `journalctl -u podman-homepage`
homepage = {
hostname = "homepage";
image = "ghcr.io/gethomepage/homepage:latest";
ports = [ "127.0.0.1:54401:3000" ];
# https://github.com/gethomepage/homepage#environment-variables
environment = {
# homepage rejects requests whose Host header it does not know about.
# caddy proxies with the original Host (`home.writefor.fun`).
HOMEPAGE_ALLOWED_HOSTS = "home.writefor.fun";
};
volumes = [
"${configDir}:/app/config"
];
autoStart = true;
};
};
}
@@ -22,7 +22,6 @@
node-exporter.uid = 992;
microvm.uid = 993;
immich.uid = 994;
homepage.uid = 995;
gitea.uid = 996;
btrbk.uid = 997;
avahi.uid = 998;
@@ -43,7 +42,6 @@
plugdev.gid = 987;
node-exporter.gid = 989;
immich.gid = 990;
homepage.gid = 991;
grafana.gid = 992;
gitea.gid = 993;
fileshare.gid = 994;