Robert Schütz 2024-11-06 12:46:08 -08:00
parent 90fcec9bc9
commit ee1cffa25c
4 changed files with 37 additions and 15 deletions

View File

@ -116,7 +116,7 @@ in
description = '' description = ''
Configuration for Immich. Configuration for Immich.
See <https://immich.app/docs/install/config-file/> or navigate to See <https://immich.app/docs/install/config-file/> or navigate to
<https://your-immich-domain/admin/system-settings> for <https://my.immich.app/admin/system-settings> for
options and defaults. options and defaults.
Setting it to `null` allows configuring Immich in the web interface. Setting it to `null` allows configuring Immich in the web interface.
''; '';
@ -270,7 +270,7 @@ in
let let
postgresEnv = postgresEnv =
if isPostgresUnixSocket then if isPostgresUnixSocket then
{ DB_URL = "socket://${cfg.database.host}?dbname=${cfg.database.name}"; } { DB_URL = "postgresql:///${cfg.database.name}?host=${cfg.database.host}"; }
else else
{ {
DB_HOSTNAME = cfg.database.host; DB_HOSTNAME = cfg.database.host;
@ -317,6 +317,11 @@ in
after = [ "network.target" ]; after = [ "network.target" ];
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
inherit (cfg) environment; inherit (cfg) environment;
path = [
# gzip and pg_dumpall are used by the backup service
pkgs.gzip
config.services.postgresql.package
];
serviceConfig = commonServiceConfig // { serviceConfig = commonServiceConfig // {
ExecStart = lib.getExe cfg.package; ExecStart = lib.getExe cfg.package;

View File

@ -31,21 +31,30 @@ import ../make-test-python.nix (
machine.succeed("curl --fail http://localhost:2283/") machine.succeed("curl --fail http://localhost:2283/")
machine.succeed(""" machine.succeed("""
curl -H 'Content-Type: application/json' --data '{ "email": "test@example.com", "name": "Admin", "password": "admin" }' -X POST http://localhost:2283/api/auth/admin-sign-up curl -f --json '{ "email": "test@example.com", "name": "Admin", "password": "admin" }' http://localhost:2283/api/auth/admin-sign-up
""") """)
res = machine.succeed(""" res = machine.succeed("""
curl -H 'Content-Type: application/json' --data '{ "email": "test@example.com", "password": "admin" }' -X POST http://localhost:2283/api/auth/login curl -f --json '{ "email": "test@example.com", "password": "admin" }' http://localhost:2283/api/auth/login
""") """)
token = json.loads(res)['accessToken'] token = json.loads(res)['accessToken']
res = machine.succeed(""" res = machine.succeed("""
curl -H 'Content-Type: application/json' -H 'Cookie: immich_access_token=%s' --data '{ "name": "API Key", "permissions": ["all"] }' -X POST http://localhost:2283/api/api-keys curl -f -H 'Cookie: immich_access_token=%s' --json '{ "name": "API Key", "permissions": ["all"] }' http://localhost:2283/api/api-keys
""" % token) """ % token)
key = json.loads(res)['secret'] key = json.loads(res)['secret']
machine.succeed(f"immich login http://localhost:2283/api {key}") machine.succeed(f"immich login http://localhost:2283/api {key}")
res = machine.succeed("immich server-info") res = machine.succeed("immich server-info")
print(res) print(res)
machine.succeed("""
curl -f -X PUT -H 'Cookie: immich_access_token=%s' --json '{ "command": "start" }' http://localhost:2283/api/jobs/backupDatabase
""" % token)
res = machine.succeed("""
curl -f -H 'Cookie: immich_access_token=%s' http://localhost:2283/api/jobs
""" % token)
assert json.loads(res)["backupDatabase"]["jobCounts"]["active"] == 1
machine.wait_until_succeeds("ls /var/lib/immich/backups/*.sql.gz")
''; '';
} }
) )

View File

@ -3,6 +3,7 @@
stdenvNoCC, stdenvNoCC,
buildNpmPackage, buildNpmPackage,
fetchFromGitHub, fetchFromGitHub,
fetchpatch2,
python3, python3,
nodejs, nodejs,
node-gyp, node-gyp,
@ -146,6 +147,13 @@ buildNpmPackage' {
src = "${src}/server"; src = "${src}/server";
inherit (sources.components.server) npmDepsHash; inherit (sources.components.server) npmDepsHash;
postPatch = ''
# pg_dumpall fails without database root access
# see https://github.com/immich-app/immich/issues/13971
substituteInPlace src/services/backup.service.ts \
--replace-fail '`pg_dumpall`' '`pg_dump`'
'';
nativeBuildInputs = [ nativeBuildInputs = [
pkg-config pkg-config
python3 python3

View File

@ -1,22 +1,22 @@
{ {
"version": "1.119.1", "version": "1.120.1",
"hash": "sha256-T+bIL2LaVNgFT3xBUxiEzhyDiLpw/WU7mxttuJD39SQ=", "hash": "sha256-FKPs6BHOXmqnHh2yH+PPBFQoK5ykP716dNvES/45t4g=",
"components": { "components": {
"cli": { "cli": {
"npmDepsHash": "sha256-kTBlo6eIPswZC0GQG7IoqQZ5b7wPEXFaD/SuuaEQMEg=", "npmDepsHash": "sha256-5JmcDjLAVXhF3TH0M88dKLYPDsSctcOGPz9nV1n3k9c=",
"version": "2.2.28" "version": "2.2.30"
}, },
"server": { "server": {
"npmDepsHash": "sha256-zgzqh3TyafPKuk5RZ2I/haYFzMVlI4jGnwD5XLqTBdg=", "npmDepsHash": "sha256-u2ZQv+z8uyn7z52V+7hNRWgnHVm4xMdhjspPqsLHYek=",
"version": "1.119.1" "version": "1.120.1"
}, },
"web": { "web": {
"npmDepsHash": "sha256-LPtsMzF7yYGrrpDoYoba6OQphKY7AvGbJpPc5pS4eFU=", "npmDepsHash": "sha256-EAFUOhcmE1TfUBN0uxzuNkHibdaDRn8Lxvma70UJqDE=",
"version": "1.119.1" "version": "1.120.1"
}, },
"open-api/typescript-sdk": { "open-api/typescript-sdk": {
"npmDepsHash": "sha256-dyKmDez8jO6p+cmSa2KMe9zzhXn4on3aFUMdep+gjzU=", "npmDepsHash": "sha256-AJcK5NE+ZNAK2FJblY32jtYxY0Z9npH92A3htcPes4A=",
"version": "1.119.1" "version": "1.120.1"
} }
} }
} }