{config, ...}: let
  inherit (config.sops) secrets;
  inherit (config.arion) rwDataDir;

  rwPath = rwDataDir + "/immich";

  UPLOAD_LOCATION = "${rwPath}/data";
in {
  arion.projects."immich" = {
    "immich_server" = {
      image = ./images/server.nix;
      command = ["start.sh" "immich"];
      env_file = [
        "${./env}"
        secrets.immich.path
      ];

      volumes = [
        "${UPLOAD_LOCATION}:/usr/src/app/upload:rw"
      ];
      ports = [
        "2283:3001"
      ];

      depends_on = ["immich_redis" "immich_postgres"];
      restart = "always";

      environment.NODE_ENV = "production";
    };

    "immich_microservices" = {
      image = ./images/server.nix;
      command = ["start.sh" "microservices"];
      env_file = [
        "${./env}"
        secrets.immich.path
      ];

      volumes = [
        "${UPLOAD_LOCATION}:/usr/src/app/upload:rw"
      ];

      depends_on = ["immich_redis" "immich_postgres"];
      restart = "always";
    };

    "immich_machine_learning" = {
      image = ./images/machine-learning.nix;
      restart = "always";
      env_file = [
        "${./env}"
        secrets.immich.path
      ];

      volumes = [
        "${rwPath}/cache:/cache"
      ];
    };

    "immich_redis" = {
      image = ./images/redis.nix;
      restart = "always";
      tmpfs = ["/data"];
      env_file = [
        "${./env}"
        secrets.immich.path
      ];
    };

    "immich_postgres" = {
      image = ./images/postgres.nix;
      restart = "always";
      env_file = [
        "${./env}"
        secrets.immich.path
      ];

      volumes = [
        "${rwPath}/db:/var/lib/postgresql/data"
      ];

      environment = {
        POSTGRES_PASSWORD = "\${DB_PASSWORD}";
        POSTGRES_USER = "\${DB_USERNAME}";
        POSTGRES_DB = "\${DB_DATABASE_NAME}";
      };
    };
  };
}