Migrate Immich from Docker to the NixOS module
All checks were successful
/ test (push) Successful in -19s

This commit is contained in:
Andrea Ciceri 2025-04-30 23:00:40 +02:00
parent 11618adc76
commit 65299f9f1f
No known key found for this signature in database
2 changed files with 21 additions and 95 deletions

View file

@ -1,99 +1,25 @@
{ ... }: { config, ... }:
let
vars = {
serviceConfigRoot = "/mnt/hd/immich/state";
mainArray = "/mnt/hd/immich/";
domainName = "photos.aciceri.dev";
};
directories = [
"${vars.serviceConfigRoot}/immich"
"${vars.serviceConfigRoot}/immich/postgresql"
"${vars.serviceConfigRoot}/immich/postgresql/data"
"${vars.serviceConfigRoot}/immich/config"
"${vars.serviceConfigRoot}/immich/machine-learning"
"${vars.mainArray}/Photos"
"${vars.mainArray}/Photos/Immich"
"${vars.mainArray}/Photos/S10m"
];
in
{ {
systemd.tmpfiles.rules = map (x: "d ${x} 0775 root root - -") directories; environment.persistence."/persist".directories = [
systemd.services = { config.services.immich.machine-learning.environment.MACHINE_LEARNING_CACHE_FOLDER
podman-immich = { ];
requires = [
"podman-immich-redis.service" services.immich = {
"podman-immich-postgres.service" enable = true;
]; mediaLocation = "/mnt/hd/immich";
after = [
"podman-immich-redis.service"
"podman-immich-postgres.service"
];
};
podman-immich-postgres = {
requires = [ "podman-immich-redis.service" ];
after = [ "podman-immich-redis.service" ];
};
}; };
virtualisation.oci-containers.containers = { # The reason for this hack is quite bad
immich = { # Before using the NixOS module Immich was installed using Docker, for this
autoStart = true; # reason the paths of the images in the database looks like `/photos/...`
image = "ghcr.io/imagegenius/immich:latest"; # and after migrating to the NixOS module I kept getting 404s for all the
volumes = [ # old pictures.
"${vars.serviceConfigRoot}/immich/config:/config" # Frankly it seems weird that it saved the absolute paths in the DB, perhaps
"${vars.mainArray}/Photos/Immich:/photos" # it saves somewhere else the media location root and then merge the paths,
"${vars.mainArray}/Photos/S10m:/import:ro" # however, nevertheless I set `mediaLocation` it didn't work
"${vars.serviceConfigRoot}/immich/machine-learning:/config/machine-learning" fileSystems."/photos" = {
]; device = "/mnt/hd/immich/";
# environmentFiles = [ config.age.secrets.ariaImmichDatabase.path ]; fsType = "ext4";
environment = { options = [ "bind" ];
PUID = "994";
PGID = "993";
TZ = "Europe/Rome";
DB_HOSTNAME = "immich-postgres";
DB_USERNAME = "immich";
DB_DATABASE_NAME = "immich";
REDIS_HOSTNAME = "immich-redis";
DB_PASSWORD = "password";
};
extraOptions = [
"--pull=newer"
"--network=container:immich-redis"
];
};
immich-redis = {
autoStart = true;
image = "redis";
extraOptions = [
"--pull=newer"
"-l=traefik.enable=true"
"-l=traefik.http.routers.immich.rule=Host(`photos.${vars.domainName}`)"
"-l=traefik.http.routers.immich.service=immich"
"-l=traefik.http.services.immich.loadbalancer.server.port=8080"
];
ports = [
"8080:8080"
];
};
immich-postgres = {
autoStart = true;
image = "tensorchord/pgvecto-rs:pg14-v0.2.1";
volumes = [
"${vars.serviceConfigRoot}/immich/postgresql/data:/var/lib/postgresql/data"
];
# environmentFiles = [ config.age.secrets.ariaImmichDatabase.path ];
environment = {
POSTGRES_USER = "immich";
POSTGRES_DB = "immich";
POSTGRES_HOST_AUTH_METHOD = "trust";
POSTGRES_PASSWORD = "password";
};
extraOptions = [
"--pull=newer"
"--network=container:immich-redis"
];
};
}; };
} }

View file

@ -34,7 +34,7 @@
forceSSL = true; forceSSL = true;
enableACME = true; enableACME = true;
locations."/" = { locations."/" = {
proxyPass = "http://localhost:8080"; proxyPass = "http://localhost:${builtins.toString config.services.immich.port}";
proxyWebsockets = true; proxyWebsockets = true;
}; };
}; };