# Immich self-hosted photo & video server { config, lib, pkgs, ... }: let cfg = config.my.profiles.immich; hostName = config.networking.hostName; port = 2283; in { options.my.profiles.immich = with lib; { enable = mkEnableOption "Immich photo server"; }; config = lib.mkIf cfg.enable { services.immich = { enable = true; host = "0.0.0.0"; inherit port; openFirewall = true; mediaLocation = "/var/lib/immich"; machine-learning.enable = true; accelerationDevices = [ "/dev/dri/renderD128" ]; # Setting `settings` puts Immich in config-file mode: the admin settings # UI becomes read-only and system config is managed declaratively here. settings = { server.externalDomain = "http://${hostName}:${toString port}"; # Intel Quick Sync hardware transcoding (jupiter's iGPU). ffmpeg.accel = "qsv"; }; }; # The native module does not add GPU groups; required for VAAPI/QSV transcoding. users.users.immich.extraGroups = [ "video" "render" ]; my.homepage.services = [ { group = "Media"; name = "Immich"; description = "Photo & video server"; href = "http://${hostName}:${toString port}"; icon = "immich.png"; } ]; }; }