diff --git a/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml b/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml index 8504593e768..5da5bb6e603 100644 --- a/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml +++ b/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml @@ -176,6 +176,90 @@
Backward Incompatibilities + + + The paperless module and package have been + removed. All users should migrate to the successor + paperless-ng instead. The Paperless project + has + been archived and advises all users to use + paperless-ng instead. + + + Users can use the services.paperless-ng + module as a replacement while noting the following + incompatibilities: + + + + + services.paperless.ocrLanguages has no + replacement. Users should migrate to + services.paperless-ng.extraConfig + instead: + + + + +{ + services.paperless-ng.extraConfig = { + # Provide languages as ISO 639-2 codes + # separated by a plus (+) sign. + # https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes + PAPERLESS_OCR_LANGUAGE = "deu+eng+jpn"; # German & English & Japanse + }; +} + + + + + If you previously specified + PAPERLESS_CONSUME_MAIL_* settings in + services.paperless.extraConfig you + should remove those options now. You now + must define those settings in the + admin interface of paperless-ng. + + + + + Option services.paperless.manage no + longer exists. Use the script at + ${services.paperless-ng.dataDir}/paperless-ng-manage + instead. Note that this script only exists after the + paperless-ng service has been started + at least once. + + + + + After switching to the new system configuration you should + run the Django management command to reindex your + documents and optionally create a user, if you don’t have + one already. + + + To do so, enter the data directory (the value of + services.paperless-ng.dataDir, + /var/lib/paperless by default), switch + to the paperless user and execute the management command + like below: + + +$ cd /var/lib/paperless +$ su paperless -s /bin/sh +$ ./paperless-ng-manage document_index reindex +# if not already done create a user account, paperless-ng requires a login +$ ./paperless-ng-manage createsuperuser +Username (leave blank to use 'paperless'): my-user-name +Email address: me@example.com +Password: ********** +Password (again): ********** +Superuser created successfully. + + + + The staticjinja package has been upgraded diff --git a/nixos/doc/manual/release-notes/rl-2111.section.md b/nixos/doc/manual/release-notes/rl-2111.section.md index 024ed9c7399..19ba8739675 100644 --- a/nixos/doc/manual/release-notes/rl-2111.section.md +++ b/nixos/doc/manual/release-notes/rl-2111.section.md @@ -55,6 +55,53 @@ pt-services.clipcat.enable). ## Backward Incompatibilities {#sec-release-21.11-incompatibilities} +- The `paperless` module and package have been removed. All users should migrate to the + successor `paperless-ng` instead. The Paperless project [has been + archived](https://github.com/the-paperless-project/paperless/commit/9b0063c9731f7c5f65b1852cb8caff97f5e40ba4) + and advises all users to use `paperless-ng` instead. + + Users can use the `services.paperless-ng` module as a replacement while noting the following incompatibilities: + - `services.paperless.ocrLanguages` has no replacement. Users should migrate to [`services.paperless-ng.extraConfig`](options.html#opt-services.paperless-ng.extraConfig) instead: + ```nix + { + services.paperless-ng.extraConfig = { + # Provide languages as ISO 639-2 codes + # separated by a plus (+) sign. + # https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes + PAPERLESS_OCR_LANGUAGE = "deu+eng+jpn"; # German & English & Japanse + }; + } + ``` + + - If you previously specified `PAPERLESS_CONSUME_MAIL_*` settings in + `services.paperless.extraConfig` you should remove those options now. You + now *must* define those settings in the admin interface of paperless-ng. + + - Option `services.paperless.manage` no longer exists. + Use the script at `${services.paperless-ng.dataDir}/paperless-ng-manage` instead. + Note that this script only exists after the `paperless-ng` service has been + started at least once. + + - After switching to the new system configuration you should run the Django + management command to reindex your documents and optionally create a user, + if you don't have one already. + + To do so, enter the data directory (the value of + `services.paperless-ng.dataDir`, `/var/lib/paperless` by default), switch + to the paperless user and execute the management command like below: + ``` + $ cd /var/lib/paperless + $ su paperless -s /bin/sh + $ ./paperless-ng-manage document_index reindex + # if not already done create a user account, paperless-ng requires a login + $ ./paperless-ng-manage createsuperuser + Username (leave blank to use 'paperless'): my-user-name + Email address: me@example.com + Password: ********** + Password (again): ********** + Superuser created successfully. + ``` + - The `staticjinja` package has been upgraded from 1.0.4 to 3.0.1 - The `erigon` ethereum node has moved to a new database format in `2021-05-04`, and requires a full resync diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 97d76e4984e..f4bd2d157a4 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -550,7 +550,6 @@ ./services/misc/ombi.nix ./services/misc/osrm.nix ./services/misc/packagekit.nix - ./services/misc/paperless.nix ./services/misc/paperless-ng.nix ./services/misc/parsoid.nix ./services/misc/plex.nix diff --git a/nixos/modules/services/misc/paperless-ng.nix b/nixos/modules/services/misc/paperless-ng.nix index 12d9a45d3a1..9eaf8fa8859 100644 --- a/nixos/modules/services/misc/paperless-ng.nix +++ b/nixos/modules/services/misc/paperless-ng.nix @@ -73,6 +73,14 @@ in { meta.maintainers = with maintainers; [ earvstedt Flakebi ]; + imports = [ + (mkRemovedOptionModule [ "services" "paperless"] '' + The paperless module has been removed as the upstream project died. + Users should migrate to the paperless-ng module (services.paperless-ng). + More information can be found in the NixOS 21.11 release notes. + '') + ]; + options.services.paperless-ng = { enable = mkOption { type = lib.types.bool; @@ -180,14 +188,6 @@ in }; config = mkIf cfg.enable { - assertions = [ - { - assertion = config.services.paperless.enable -> - (config.services.paperless.dataDir != cfg.dataDir && config.services.paperless.port != cfg.port); - message = "Paperless-ng replaces Paperless, either disable Paperless or assign a new dataDir and port to one of them"; - } - ]; - # Enable redis if no special url is set services.redis.enable = mkIf (!hasAttr "PAPERLESS_REDIS" env) true; diff --git a/nixos/modules/services/misc/paperless.nix b/nixos/modules/services/misc/paperless.nix deleted file mode 100644 index 43730b80eb2..00000000000 --- a/nixos/modules/services/misc/paperless.nix +++ /dev/null @@ -1,183 +0,0 @@ -{ config, pkgs, lib, ... }: - -with lib; -let - cfg = config.services.paperless; - - defaultUser = "paperless"; - - manage = cfg.package.withConfig { - config = { - PAPERLESS_CONSUMPTION_DIR = cfg.consumptionDir; - PAPERLESS_INLINE_DOC = "true"; - PAPERLESS_DISABLE_LOGIN = "true"; - } // cfg.extraConfig; - inherit (cfg) dataDir ocrLanguages; - paperlessPkg = cfg.package; - }; -in -{ - options.services.paperless = { - enable = mkOption { - type = lib.types.bool; - default = false; - description = '' - Enable Paperless. - - When started, the Paperless database is automatically created if it doesn't - exist and updated if the Paperless package has changed. - Both tasks are achieved by running a Django migration. - ''; - }; - - dataDir = mkOption { - type = types.str; - default = "/var/lib/paperless"; - description = "Directory to store the Paperless data."; - }; - - consumptionDir = mkOption { - type = types.str; - default = "${cfg.dataDir}/consume"; - defaultText = "\${dataDir}/consume"; - description = "Directory from which new documents are imported."; - }; - - consumptionDirIsPublic = mkOption { - type = types.bool; - default = false; - description = "Whether all users can write to the consumption dir."; - }; - - ocrLanguages = mkOption { - type = with types; nullOr (listOf str); - default = null; - description = '' - Languages available for OCR via Tesseract, specified as - ISO 639-2/T language codes. - If unset, defaults to all available languages. - ''; - example = [ "eng" "spa" "jpn" ]; - }; - - address = mkOption { - type = types.str; - default = "localhost"; - description = "Server listening address."; - }; - - port = mkOption { - type = types.port; - default = 28981; - description = "Server port to listen on."; - }; - - extraConfig = mkOption { - type = types.attrs; - default = {}; - description = '' - Extra paperless config options. - - The config values are evaluated as double-quoted Bash string literals. - - See paperless-src/paperless.conf.example for available options. - - To enable user authentication, set PAPERLESS_DISABLE_LOGIN = "false" - and run the shell command $dataDir/paperless-manage createsuperuser. - - To define secret options without storing them in /nix/store, use the following pattern: - PAPERLESS_PASSPHRASE = "$(< /etc/my_passphrase_file)" - ''; - example = literalExample '' - { - PAPERLESS_OCR_LANGUAGE = "deu"; - } - ''; - }; - - user = mkOption { - type = types.str; - default = defaultUser; - description = "User under which Paperless runs."; - }; - - package = mkOption { - type = types.package; - default = pkgs.paperless; - defaultText = "pkgs.paperless"; - description = "The Paperless package to use."; - }; - - manage = mkOption { - type = types.package; - readOnly = true; - default = manage; - description = '' - A script to manage the Paperless instance. - It wraps Django's manage.py and is also available at - $dataDir/manage-paperless - ''; - }; - }; - - config = mkIf cfg.enable { - - systemd.tmpfiles.rules = [ - "d '${cfg.dataDir}' - ${cfg.user} ${config.users.users.${cfg.user}.group} - -" - ] ++ (optional cfg.consumptionDirIsPublic - "d '${cfg.consumptionDir}' 777 - - - -" - # If the consumption dir is not created here, it's automatically created by - # 'manage' with the default permissions. - ); - - systemd.services.paperless-consumer = { - description = "Paperless document consumer"; - serviceConfig = { - User = cfg.user; - ExecStart = "${manage} document_consumer"; - Restart = "always"; - }; - after = [ "systemd-tmpfiles-setup.service" ]; - wantedBy = [ "multi-user.target" ]; - preStart = '' - if [[ $(readlink ${cfg.dataDir}/paperless-manage) != ${manage} ]]; then - ln -sf ${manage} ${cfg.dataDir}/paperless-manage - fi - - ${manage.setupEnv} - # Auto-migrate on first run or if the package has changed - versionFile="$PAPERLESS_DBDIR/src-version" - if [[ $(cat "$versionFile" 2>/dev/null) != ${cfg.package} ]]; then - python $paperlessSrc/manage.py migrate - echo ${cfg.package} > "$versionFile" - fi - ''; - }; - - systemd.services.paperless-server = { - description = "Paperless document server"; - serviceConfig = { - User = cfg.user; - ExecStart = "${manage} runserver --noreload ${cfg.address}:${toString cfg.port}"; - Restart = "always"; - }; - # Bind to `paperless-consumer` so that the server never runs - # during migrations - bindsTo = [ "paperless-consumer.service" ]; - after = [ "paperless-consumer.service" ]; - wantedBy = [ "multi-user.target" ]; - }; - - users = optionalAttrs (cfg.user == defaultUser) { - users.${defaultUser} = { - group = defaultUser; - uid = config.ids.uids.paperless; - home = cfg.dataDir; - }; - - groups.${defaultUser} = { - gid = config.ids.gids.paperless; - }; - }; - }; -} diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index b41fc7a498d..33bb1306eb5 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -334,7 +334,6 @@ in pam-oath-login = handleTest ./pam-oath-login.nix {}; pam-u2f = handleTest ./pam-u2f.nix {}; pantheon = handleTest ./pantheon.nix {}; - paperless = handleTest ./paperless.nix {}; paperless-ng = handleTest ./paperless-ng.nix {}; pdns-recursor = handleTest ./pdns-recursor.nix {}; peerflix = handleTest ./peerflix.nix {}; diff --git a/nixos/tests/paperless.nix b/nixos/tests/paperless.nix deleted file mode 100644 index fb83e6f976d..00000000000 --- a/nixos/tests/paperless.nix +++ /dev/null @@ -1,36 +0,0 @@ -import ./make-test-python.nix ({ lib, ... } : { - name = "paperless"; - meta = with lib.maintainers; { - maintainers = [ earvstedt ]; - }; - - machine = { pkgs, ... }: { - environment.systemPackages = with pkgs; [ imagemagick jq ]; - services.paperless = { - enable = true; - ocrLanguages = [ "eng" ]; - }; - }; - - testScript = '' - machine.wait_for_unit("paperless-consumer.service") - - # Create test doc - machine.succeed( - "convert -size 400x40 xc:white -font 'DejaVu-Sans' -pointsize 20 -fill black -annotate +5+20 'hello world 16-10-2005' /var/lib/paperless/consume/doc.png" - ) - - with subtest("Service gets ready"): - machine.wait_for_unit("paperless-server.service") - # Wait until server accepts connections - machine.wait_until_succeeds("curl -fs localhost:28981") - - with subtest("Test document is consumed"): - machine.wait_until_succeeds( - "(($(curl -fs localhost:28981/api/documents/ | jq .count) == 1))" - ) - assert "2005-10-16" in machine.succeed( - "curl -fs localhost:28981/api/documents/ | jq '.results | .[0] | .created'" - ) - ''; -}) diff --git a/pkgs/applications/office/paperless/default.nix b/pkgs/applications/office/paperless/default.nix deleted file mode 100644 index 74bdacd9584..00000000000 --- a/pkgs/applications/office/paperless/default.nix +++ /dev/null @@ -1,168 +0,0 @@ -{ stdenv -, lib -, fetchFromGitHub -, makeWrapper -, callPackage - -, python3 -, imagemagick -, ghostscript -, optipng -, tesseract -, unpaper -}: - -## Usage - -# ${paperless}/bin/paperless wraps manage.py - -# ${paperless}/share/paperless/setup-env.sh can be sourced from a -# shell script to setup a Paperless environment - -# paperless.withConfig is a convenience function to setup a -# configured Paperless instance. (See ./withConfig.nix) - -# For WSGI with gunicorn, use a shell script like this: -# let -# pythonEnv = paperless.python.withPackages (ps: paperless.runtimePackages ++ [ ps.gunicorn ]); -# in -# writers.writeBash "run-gunicorn" '' -# source ${paperless}/share/paperless/setup-env.sh -# PYTHONPATH=$paperlessSrc ${pythonEnv}/bin/gunicorn paperless.wsgi -# '' - -let - paperless = stdenv.mkDerivation rec { - pname = "paperless"; - version = "2.7.0"; - - src = fetchFromGitHub { - owner = "the-paperless-project"; - repo = "paperless"; - rev = version; - sha256 = "0pkmyky1crjnsg7r0gfk0fadisfsgzlsq6afpz16wx4hp6yvkkf7"; - }; - - nativeBuildInputs = [ makeWrapper ]; - - doCheck = true; - dontInstall = true; - - pythonEnv = python.withPackages (_: runtimePackages); - pythonCheckEnv = python.withPackages (_: (runtimePackages ++ checkPackages)); - - unpackPhase = '' - srcDir=$out/share/paperless - mkdir -p $srcDir - cp -r --no-preserve=mode $src/src/* $src/LICENSE $srcDir - ''; - - postPatch = '' - # django-cors-headers 3.x requires a scheme for allowed hosts - substituteInPlace $out/share/paperless/paperless/settings.py \ - --replace "localhost:8080" "http://localhost:8080" - ''; - - buildPhase = let - # Paperless has explicit runtime checks that expect these binaries to be in PATH - extraBin = lib.makeBinPath [ imagemagick ghostscript optipng tesseract unpaper ]; - in '' - ${python.interpreter} -m compileall $srcDir - - makeWrapper $pythonEnv/bin/python $out/bin/paperless \ - --set PATH ${extraBin} --add-flags $out/share/paperless/manage.py - - # A shell snippet that can be sourced to setup a paperless env - cat > $out/share/paperless/setup-env.sh <= 3 - factory_boy = customPkgs.factory_boy_2_12_0; - - # These are pre-release versions, hence they are private to this pkg - django-filter = self.callPackage ./python-modules/django-filter.nix {}; - django-crispy-forms = self.callPackage ./python-modules/django-crispy-forms.nix {}; - }; - }; - - runtimePackages = with python.pkgs; [ - dateparser - python-dateutil - django - django-cors-headers - django-crispy-forms - django-filter - django_extensions - djangoql - djangorestframework - factory_boy - filemagic - fuzzywuzzy - langdetect - pdftotext - pillow - psycopg2 - pyocr - python-dotenv - python-gnupg - pytz - termcolor - ] ++ (lib.optional stdenv.isLinux inotify-simple); - - checkPackages = with python.pkgs; [ - pytest - pytest-django - pytest-env - pytest-xdist - ]; - - pyocrWithUserTesseract = pyPkgs: - let - pyocr = pyPkgs.pyocr.override { inherit tesseract; }; - in - if pyocr.outPath == pyPkgs.pyocr.outPath then - pyocr - else - # The user has provided a custom tesseract derivation that might be - # missing some languages that are required for PyOCR's tests. Disable them to - # avoid build errors. - pyocr.overridePythonAttrs (attrs: { - doCheck = false; - }); -in - paperless diff --git a/pkgs/applications/office/paperless/python-modules/default.nix b/pkgs/applications/office/paperless/python-modules/default.nix deleted file mode 100644 index e1fb227614f..00000000000 --- a/pkgs/applications/office/paperless/python-modules/default.nix +++ /dev/null @@ -1,11 +0,0 @@ -pyPkgs: fetchFromGitHub: -{ - factory_boy_2_12_0 = pyPkgs.factory_boy.overridePythonAttrs (old: rec { - version = "2.12.0"; - src = pyPkgs.fetchPypi { - inherit (old) pname; - inherit version; - sha256 = "0w53hjgag6ad5i2vmrys8ysk54agsqvgbjy9lg8g0d8pi9h8vx7s"; - }; - }); -} diff --git a/pkgs/applications/office/paperless/python-modules/django-crispy-forms.nix b/pkgs/applications/office/paperless/python-modules/django-crispy-forms.nix deleted file mode 100644 index f8b91a94ccc..00000000000 --- a/pkgs/applications/office/paperless/python-modules/django-crispy-forms.nix +++ /dev/null @@ -1,39 +0,0 @@ -{ lib -, buildPythonPackage -, fetchFromGitHub -, pytestCheckHook -, pytest-django -, django -}: - -buildPythonPackage rec { - pname = "django-crispy-forms"; - version = "1.10.0"; - - src = fetchFromGitHub { - owner = "django-crispy-forms"; - repo = "django-crispy-forms"; - rev = version; - sha256 = "0y6kskfxgckb9npcgwx4zrs5n9px159zh9zhinhxi3i7wlriqpf5"; - }; - - # For reasons unknown, the source dir must contain a dash - # for the tests to run successfully - postUnpack = '' - mv $sourceRoot source- - export sourceRoot=source- - ''; - - checkInputs = [ django pytest-django pytestCheckHook ]; - - preCheck = '' - export DJANGO_SETTINGS_MODULE=crispy_forms.tests.test_settings - ''; - - meta = with lib; { - description = "The best way to have DRY Django forms"; - homepage = "https://github.com/maraujop/django-crispy-forms"; - license = licenses.mit; - maintainers = with maintainers; [ earvstedt ]; - }; -} diff --git a/pkgs/applications/office/paperless/python-modules/django-filter.nix b/pkgs/applications/office/paperless/python-modules/django-filter.nix deleted file mode 100644 index d7f20bd9d37..00000000000 --- a/pkgs/applications/office/paperless/python-modules/django-filter.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ lib, buildPythonPackage, python, pythonOlder, fetchFromGitHub -, django, django-crispy-forms, djangorestframework, mock, pytz }: - -buildPythonPackage rec { - pname = "django-filter"; - version = "2.1.0-pre"; - disabled = pythonOlder "3.4"; - - src = fetchFromGitHub { - owner = "carltongibson"; - repo = pname; - rev = "24adad8c48bc9e7c7539b6510ffde4ce4effdc29"; - sha256 = "0hv4w95jnlzp9vdximl6bb27fyi75001jhvsbs0ikkd8amq8iaj7"; - }; - - checkInputs = [ django django-crispy-forms djangorestframework mock pytz ]; - - checkPhase = "${python.interpreter} runtests.py"; - - meta = with lib; { - description = "A reusable Django application for allowing users to filter querysets dynamically."; - homepage = "https://github.com/carltongibson/django-filter"; - license = licenses.bsd3; - maintainers = with maintainers; [ earvstedt ]; - }; -} diff --git a/pkgs/applications/office/paperless/withConfig.nix b/pkgs/applications/office/paperless/withConfig.nix deleted file mode 100644 index 652d1478c0c..00000000000 --- a/pkgs/applications/office/paperless/withConfig.nix +++ /dev/null @@ -1,68 +0,0 @@ -{ paperless, lib, writers }: - -## Usage -# -# nix-build --out-link ./paperless -E ' -# (import {}).paperless.withConfig { -# dataDir = /tmp/paperless-data; -# config = { -# PAPERLESS_DISABLE_LOGIN = "true"; -# }; -# }' -# -# Setup DB -# ./paperless migrate -# -# Consume documents in ${dataDir}/consume -# ./paperless document_consumer --oneshot -# -# Start web interface -# ./paperless runserver --noreload localhost:8000 - -{ config ? {}, dataDir ? null, ocrLanguages ? null -, paperlessPkg ? paperless, extraCmds ? "" }: -with lib; -let - paperless = if ocrLanguages == null then - paperlessPkg - else - (paperlessPkg.override { - tesseract = paperlessPkg.tesseract.override { - enableLanguages = ocrLanguages; - }; - }).overrideDerivation (_: { - # `ocrLanguages` might be missing some languages required by the tests. - doCheck = false; - }); - - envVars = (optionalAttrs (dataDir != null) { - PAPERLESS_CONSUMPTION_DIR = "${dataDir}/consume"; - PAPERLESS_MEDIADIR = "${dataDir}/media"; - PAPERLESS_STATICDIR = "${dataDir}/static"; - PAPERLESS_DBDIR = dataDir; - }) // config; - - envVarDefs = mapAttrsToList (n: v: ''export ${n}="${toString v}"'') envVars; - setupEnvVars = builtins.concatStringsSep "\n" envVarDefs; - - setupEnv = '' - source ${paperless}/share/paperless/setup-env.sh - ${setupEnvVars} - ${optionalString (dataDir != null) '' - mkdir -p "$PAPERLESS_CONSUMPTION_DIR" \ - "$PAPERLESS_MEDIADIR" \ - "$PAPERLESS_STATICDIR" \ - "$PAPERLESS_DBDIR" - ''} - ''; - - runPaperless = writers.writeBash "paperless" '' - set -e - ${setupEnv} - ${extraCmds} - exec python $paperlessSrc/manage.py "$@" - ''; -in - runPaperless // { - inherit paperless setupEnv; - } diff --git a/pkgs/top-level/aliases.nix b/pkgs/top-level/aliases.nix index 5a16b3c9e55..09e7b284f9b 100644 --- a/pkgs/top-level/aliases.nix +++ b/pkgs/top-level/aliases.nix @@ -553,6 +553,7 @@ mapAliases ({ owncloudclient = owncloud-client; # added 2016-08 ocz-ssd-guru = throw "ocz-ssd-guru has been removed due to there being no source available"; # added 2021-07-12 p11_kit = p11-kit; # added 2018-02-25 + paperless = paperless-ng; # added 2021-06-06 parity = openethereum; # added 2020-08-01 parquet-cpp = arrow-cpp; # added 2018-09-08 pass-otp = pass.withExtensions (ext: [ext.pass-otp]); # added 2018-05-04 diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index af68bc489dc..fa4cc9c862d 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -7889,8 +7889,6 @@ with pkgs; pamtester = callPackage ../tools/security/pamtester { }; - paperless = callPackage ../applications/office/paperless { }; - paperless-ng = callPackage ../applications/office/paperless-ng { }; paperwork = callPackage ../applications/office/paperwork/paperwork-gtk.nix { };