nixos/paperless: set PAPERLESS_SECRET_KEY

If the PAPERLESS_SECRET_KEY environment variable is left unset
paperless-ngx defaults to a well-known value, which is insecure.

Co-authored-by: Erik Arvstedt <erik.arvstedt@gmail.com>

Changed files
+20 -5
nixos
modules
services
+20 -5
nixos/modules/services/misc/paperless.nix
···
# during migrations
bindsTo = [ "paperless-scheduler.service" ];
after = [ "paperless-scheduler.service" ];
+
# Setup PAPERLESS_SECRET_KEY.
+
# If this environment variable is left unset, paperless-ngx defaults
+
# to a well-known value, which is insecure.
+
script = let
+
secretKeyFile = "${cfg.dataDir}/nixos-paperless-secret-key";
+
in ''
+
if [[ ! -f '${secretKeyFile}' ]]; then
+
(
+
umask 0377
+
tr -dc A-Za-z0-9 < /dev/urandom | head -c64 | ${pkgs.moreutils}/bin/sponge '${secretKeyFile}'
+
)
+
fi
+
export PAPERLESS_SECRET_KEY=$(cat '${secretKeyFile}')
+
if [[ ! $PAPERLESS_SECRET_KEY ]]; then
+
echo "PAPERLESS_SECRET_KEY is empty, refusing to start."
+
exit 1
+
fi
+
exec ${pkg.python.pkgs.gunicorn}/bin/gunicorn \
+
-c ${pkg}/lib/paperless-ngx/gunicorn.conf.py paperless.asgi:application
+
'';
serviceConfig = defaultServiceConfig // {
User = cfg.user;
-
ExecStart = ''
-
${pkg.python.pkgs.gunicorn}/bin/gunicorn \
-
-c ${pkg}/lib/paperless-ngx/gunicorn.conf.py paperless.asgi:application
-
'';
Restart = "on-failure";
# gunicorn needs setuid, liblapack needs mbind
···
CapabilityBoundingSet = [ "CAP_NET_BIND_SERVICE" ];
};
environment = env // {
-
PATH = mkForce pkg.path;
PYTHONPATH = "${pkg.python.pkgs.makePythonPath pkg.propagatedBuildInputs}:${pkg}/lib/paperless-ngx/src";
};
# Allow the web interface to access the private /tmp directory of the server.