diff --git a/Dockerfile b/Dockerfile index f56422a8e..4a49a9ff2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -32,7 +32,7 @@ RUN set -eux \ # Purpose: Installs s6-overlay and rootfs # Comments: # - Don't leave anything extra in here either -FROM ghcr.io/astral-sh/uv:0.6.5-python3.12-bookworm-slim AS s6-overlay-base +FROM ghcr.io/astral-sh/uv:0.6.9-python3.12-bookworm-slim AS s6-overlay-base WORKDIR /usr/src/s6 @@ -239,6 +239,7 @@ COPY --from=compile-frontend --chown=1000:1000 /src/src/documents/static/fronten # add users, setup scripts # Mount the compiled frontend to expected location RUN set -eux \ + && sed -i '1s|^#!/usr/bin/env python3|#!/command/with-contenv python3|' manage.py \ && echo "Setting up user/group" \ && addgroup --gid 1000 paperless \ && useradd --uid 1000 --gid paperless --home-dir /usr/src/paperless paperless \ diff --git a/docker/compose/docker-compose.mariadb-tika.yml b/docker/compose/docker-compose.mariadb-tika.yml index c158797a5..845681cc8 100644 --- a/docker/compose/docker-compose.mariadb-tika.yml +++ b/docker/compose/docker-compose.mariadb-tika.yml @@ -24,8 +24,10 @@ # - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env' # and '.env' into a folder. # - Run 'docker compose pull'. -# - Run 'docker compose run --rm webserver createsuperuser' to create a user. # - Run 'docker compose up -d'. +# - Wait until the webserver has completed startup +# - Run 'docker compose exec webserver createsuperuser' to create a user. + # # For more extensive installation and update instructions, refer to the # documentation. diff --git a/docker/compose/docker-compose.mariadb.yml b/docker/compose/docker-compose.mariadb.yml index 0b7a0fd3e..9b8d57f4a 100644 --- a/docker/compose/docker-compose.mariadb.yml +++ b/docker/compose/docker-compose.mariadb.yml @@ -20,8 +20,9 @@ # - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env' # and '.env' into a folder. # - Run 'docker compose pull'. -# - Run 'docker compose run --rm webserver createsuperuser' to create a user. # - Run 'docker compose up -d'. +# - Wait until the webserver has completed startup +# - Run 'docker compose exec webserver createsuperuser' to create a user. # # For more extensive installation and update instructions, refer to the # documentation. diff --git a/docker/compose/docker-compose.portainer.yml b/docker/compose/docker-compose.portainer.yml index 2132c67a6..455b2004e 100644 --- a/docker/compose/docker-compose.portainer.yml +++ b/docker/compose/docker-compose.portainer.yml @@ -24,7 +24,7 @@ # - Click 'Deploy the stack' and wait for it to be deployed # - Open the list of containers, select paperless_webserver_1 # - Click 'Console' and then 'Connect' to open the command line inside the container -# - Run 'python3 manage.py createsuperuser' to create a user +# - Run 'createsuperuser' to create a user # - Exit the console # # For more extensive installation and update instructions, refer to the diff --git a/docker/compose/docker-compose.postgres-tika.yml b/docker/compose/docker-compose.postgres-tika.yml index 60bfada5f..dd81bd5b9 100644 --- a/docker/compose/docker-compose.postgres-tika.yml +++ b/docker/compose/docker-compose.postgres-tika.yml @@ -24,8 +24,9 @@ # - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env' # and '.env' into a folder. # - Run 'docker compose pull'. -# - Run 'docker compose run --rm webserver createsuperuser' to create a user. # - Run 'docker compose up -d'. +# - Wait until the webserver has completed startup +# - Run 'docker compose exec webserver createsuperuser' to create a user. # # For more extensive installation and update instructions, refer to the # documentation. diff --git a/docker/compose/docker-compose.postgres.yml b/docker/compose/docker-compose.postgres.yml index da2953b7b..8212f8514 100644 --- a/docker/compose/docker-compose.postgres.yml +++ b/docker/compose/docker-compose.postgres.yml @@ -20,8 +20,9 @@ # - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env' # and '.env' into a folder. # - Run 'docker compose pull'. -# - Run 'docker compose run --rm webserver createsuperuser' to create a user. # - Run 'docker compose up -d'. +# - Wait until the webserver has completed startup +# - Run 'docker compose exec webserver createsuperuser' to create a user. # # For more extensive installation and update instructions, refer to the # documentation. diff --git a/docker/compose/docker-compose.sqlite-tika.yml b/docker/compose/docker-compose.sqlite-tika.yml index 54292a845..d2a74b696 100644 --- a/docker/compose/docker-compose.sqlite-tika.yml +++ b/docker/compose/docker-compose.sqlite-tika.yml @@ -24,8 +24,9 @@ # - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env' # and '.env' into a folder. # - Run 'docker compose pull'. -# - Run 'docker compose run --rm webserver createsuperuser' to create a user. # - Run 'docker compose up -d'. +# - Wait until the webserver has completed startup +# - Run 'docker compose exec webserver createsuperuser' to create a user. # # For more extensive installation and update instructions, refer to the # documentation. diff --git a/docker/compose/docker-compose.sqlite.yml b/docker/compose/docker-compose.sqlite.yml index 1ca5fe86b..db63633fe 100644 --- a/docker/compose/docker-compose.sqlite.yml +++ b/docker/compose/docker-compose.sqlite.yml @@ -17,8 +17,9 @@ # - Copy this file as 'docker-compose.yml' and the files 'docker-compose.env' # and '.env' into a folder. # - Run 'docker compose pull'. -# - Run 'docker compose run --rm webserver createsuperuser' to create a user. # - Run 'docker compose up -d'. +# - Wait until the webserver has completed startup +# - Run 'docker compose exec webserver createsuperuser' to create a user. # # For more extensive installation and update instructions, refer to the # documentation. diff --git a/docker/install_management_commands.sh b/docker/install_management_commands.sh index c7c65bfbb..17dae68a2 100755 --- a/docker/install_management_commands.sh +++ b/docker/install_management_commands.sh @@ -18,9 +18,10 @@ for command in decrypt_documents \ document_fuzzy_match \ manage_superuser \ convert_mariadb_uuid \ - prune_audit_logs; + prune_audit_logs \ + createsuperuser; do echo "installing $command..." sed "s/management_command/$command/g" management_script.sh >"$PWD/rootfs/usr/local/bin/$command" - chmod +x "$PWD/rootfs/usr/local/bin/$command" + chmod u=rwx,g=rwx,o=rx "$PWD/rootfs/usr/local/bin/$command" done diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run index 51d14d27e..841dad204 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run @@ -14,7 +14,7 @@ if [[ -n "${PAPERLESS_FORCE_SCRIPT_NAME}" ]]; then fi if [[ -n "${USER_IS_NON_ROOT}" ]]; then - exec granian --interface asginl --ws "paperless.asgi:application" + exec granian --interface asginl --ws --loop uvloop "paperless.asgi:application" else - exec s6-setuidgid paperless granian --interface asginl --ws "paperless.asgi:application" + exec s6-setuidgid paperless granian --interface asginl --ws --loop uvloop "paperless.asgi:application" fi diff --git a/docker/rootfs/usr/local/bin/createsuperuser b/docker/rootfs/usr/local/bin/createsuperuser new file mode 100755 index 000000000..f931952ba --- /dev/null +++ b/docker/rootfs/usr/local/bin/createsuperuser @@ -0,0 +1,14 @@ +#!/command/with-contenv /usr/bin/bash +# shellcheck shell=bash + +set -e + +cd "${PAPERLESS_SRC_DIR}" + +if [[ $(id -u) == 0 ]]; then + s6-setuidgid paperless python3 manage.py createsuperuser "$@" +elif [[ $(id -un) == "paperless" ]]; then + python3 manage.py createsuperuser "$@" +else + echo "Unknown user." +fi diff --git a/docs/administration.md b/docs/administration.md index 8e646b326..54d918783 100644 --- a/docs/administration.md +++ b/docs/administration.md @@ -565,19 +565,15 @@ document. ### Managing encryption {#encryption} -Documents can be stored in Paperless using GnuPG encryption. - !!! warning - Encryption is deprecated since [paperless-ng 0.9](changelog.md#paperless-ng-090) and doesn't really - provide any additional security, since you have to store the passphrase - in a configuration file on the same system as the encrypted documents - for paperless to work. Furthermore, the entire text content of the - documents is stored plain in the database, even if your documents are - encrypted. Filenames are not encrypted as well. - - Also, the web server provides transparent access to your encrypted - documents. + Encryption was removed in [paperless-ng 0.9](changelog.md#paperless-ng-090) + because it did not really provide any additional security, the passphrase + was stored in a configuration file on the same system as the documents. + Furthermore, the entire text content of the documents is stored plain in + the database, even if your documents are encrypted. Filenames are not + encrypted as well. Finally, the web server provides transparent access to + your encrypted documents. Consider running paperless on an encrypted filesystem instead, which will then at least provide security against physical hardware theft. diff --git a/docs/api.md b/docs/api.md index 9c28476c4..9d43145b4 100644 --- a/docs/api.md +++ b/docs/api.md @@ -270,7 +270,7 @@ The following methods are supported: - `remove_tag` - Requires `parameters`: `{ "tag": TAG_ID }` - `modify_tags` - - Requires `parameters`: `{ "add_tags": [LIST_OF_TAG_IDS] }` and / or `{ "remove_tags": [LIST_OF_TAG_IDS] }` + - Requires `parameters`: `{ "add_tags": [LIST_OF_TAG_IDS] }` and `{ "remove_tags": [LIST_OF_TAG_IDS] }` - `delete` - No `parameters` required - `reprocess` diff --git a/docs/setup.md b/docs/setup.md index 75754766e..d132d9033 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -131,24 +131,30 @@ account. The script essentially automatically performs the steps described in [D by default but you can change the image to pull from Docker Hub by changing the `image` line to `image: paperlessngx/paperless-ngx:latest`. -6. To be able to login, you will need a "superuser". To create it, +6. Run `docker compose up -d`. This will create and start the necessary containers. + +7. Wait for the containers to complete their startup. You can monitor the logs using Docker, such as: + + ```shell-session + docker logs --follow webserver + ``` + +8. To be able to login, you will need a "superuser". To create it, execute the following command: ```shell-session - docker compose run --rm webserver createsuperuser + docker compose exec webserver createsuperuser ``` or using docker exec from within the container: ```shell-session - python3 manage.py createsuperuser + createsuperuser ``` This will guide you through the superuser setup. -7. Run `docker compose up -d`. This will create and start the necessary containers. - -8. Congratulations! Your Paperless-ngx instance should now be accessible at `http://127.0.0.1:8000` +9. Congratulations! Your Paperless-ngx instance should now be accessible at `http://127.0.0.1:8000` (or similar, depending on your configuration). Use the superuser credentials you have created in the previous step to login. @@ -708,7 +714,8 @@ Paperless runs on Raspberry Pi. However, some things are rather slow on the Pi and configuring some options in paperless can help improve performance immensely: -- Stick with SQLite to save some resources. +- Stick with SQLite to save some resources. See [troubleshooting](troubleshooting.md#log-reports-creating-paperlesstask-failed) + if you encounter issues with SQLite locking. - If you do not need the filesystem-based consumer, consider disabling it entirely by setting [`PAPERLESS_CONSUMER_DISABLE`](configuration.md#PAPERLESS_CONSUMER_DISABLE) to `true`. - Consider setting [`PAPERLESS_OCR_PAGES`](configuration.md#PAPERLESS_OCR_PAGES) to 1, so that paperless will diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index bed861987..e9eaa5692 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -292,7 +292,9 @@ many workers attempting to access the database simultaneously. Consider changing to the PostgreSQL database if you will be processing many documents at once often. Otherwise, try tweaking the [`PAPERLESS_DB_TIMEOUT`](configuration.md#PAPERLESS_DB_TIMEOUT) setting to allow more time for the database to -unlock. This may have minor performance implications. +unlock. Additionally, you can change your SQLite database to use ["Write-Ahead Logging"](https://sqlite.org/wal.html). +These changes may have minor performance implications but can help +prevent database locking issues. ## granian fails to start with "is not a valid port number" diff --git a/pyproject.toml b/pyproject.toml index 8a2cb194f..b1e0285d0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "paperless-ngx" -version = "2.14.7" +version = "2.15.0" description = "A community-supported supercharged version of paperless: scan, index and archive all your physical documents" readme = "README.md" requires-python = ">=3.10" @@ -23,7 +23,7 @@ dependencies = [ "dateparser~=1.2", # WARNING: django does not use semver. # Only patch versions are guaranteed to not introduce breaking changes. - "django~=5.1.6", + "django~=5.1.7", "django-allauth[socialaccount,mfa]~=65.4.0", "django-auditlog~=3.0.0", "django-celery-results~=2.5.1", @@ -78,7 +78,7 @@ optional-dependencies.postgres = [ "psycopg-c==3.2.5", ] optional-dependencies.webserver = [ - "granian~=2.0.1", + "granian[uvloop]~=2.2.0", ] [dependency-groups] diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 040419c57..683d6db5b 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -2537,19 +2537,19 @@ src/app/components/document-detail/document-detail.component.ts - 968 + 965 src/app/components/document-detail/document-detail.component.ts - 1328 + 1325 src/app/components/document-detail/document-detail.component.ts - 1367 + 1364 src/app/components/document-detail/document-detail.component.ts - 1408 + 1405 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3157,7 +3157,7 @@ src/app/components/document-detail/document-detail.component.ts - 921 + 918 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3325,7 +3325,7 @@ Saved field "". src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts - 126 + 129 src/app/components/manage/custom-fields/custom-fields.component.ts @@ -3336,7 +3336,7 @@ Error saving field. src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts - 135 + 138 src/app/components/manage/custom-fields/custom-fields.component.ts @@ -3406,7 +3406,7 @@ src/app/components/document-detail/document-detail.component.ts - 1385 + 1382 src/app/guards/dirty-saved-view.guard.ts @@ -5461,7 +5461,11 @@ src/app/pipes/object-name.pipe.ts - 43 + 40 + + + src/app/pipes/object-name.pipe.ts + 46 @@ -6908,35 +6912,35 @@ src/app/components/document-detail/document-detail.component.ts - 839 + 836 Error saving document "" src/app/components/document-detail/document-detail.component.ts - 845 + 842 Error saving document src/app/components/document-detail/document-detail.component.ts - 890 + 887 Do you really want to move the document "" to the trash? src/app/components/document-detail/document-detail.component.ts - 922 + 919 Documents can be restored prior to permanent deletion. src/app/components/document-detail/document-detail.component.ts - 923 + 920 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -6947,7 +6951,7 @@ Move to trash src/app/components/document-detail/document-detail.component.ts - 925 + 922 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -6958,14 +6962,14 @@ Error deleting document src/app/components/document-detail/document-detail.component.ts - 944 + 941 Reprocess confirm src/app/components/document-detail/document-detail.component.ts - 964 + 961 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -6976,77 +6980,77 @@ This operation will permanently recreate the archive file for this document. src/app/components/document-detail/document-detail.component.ts - 965 + 962 The archive file will be re-generated with the current settings. src/app/components/document-detail/document-detail.component.ts - 966 + 963 Reprocess operation for "" will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 976 + 973 Error executing operation src/app/components/document-detail/document-detail.component.ts - 987 + 984 Error downloading document src/app/components/document-detail/document-detail.component.ts - 1034 + 1031 Page Fit src/app/components/document-detail/document-detail.component.ts - 1113 + 1110 Split confirm src/app/components/document-detail/document-detail.component.ts - 1326 + 1323 This operation will split the selected document(s) into new documents. src/app/components/document-detail/document-detail.component.ts - 1327 + 1324 Split operation for "" will begin in the background. src/app/components/document-detail/document-detail.component.ts - 1343 + 1340 Error executing split operation src/app/components/document-detail/document-detail.component.ts - 1352 + 1349 Rotate confirm src/app/components/document-detail/document-detail.component.ts - 1365 + 1362 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -7057,60 +7061,60 @@ This operation will permanently rotate the original version of the current document. src/app/components/document-detail/document-detail.component.ts - 1366 + 1363 Rotation of "" will begin in the background. Close and re-open the document after the operation has completed to see the changes. src/app/components/document-detail/document-detail.component.ts - 1382 + 1379 Error executing rotate operation src/app/components/document-detail/document-detail.component.ts - 1394 + 1391 Delete pages confirm src/app/components/document-detail/document-detail.component.ts - 1406 + 1403 This operation will permanently delete the selected pages from the original document. src/app/components/document-detail/document-detail.component.ts - 1407 + 1404 Delete pages operation for "" will begin in the background. Close and re-open or reload this document after the operation has completed to see the changes. src/app/components/document-detail/document-detail.component.ts - 1422 + 1419 Error executing delete pages operation src/app/components/document-detail/document-detail.component.ts - 1431 + 1428 An error occurred loading tiff: src/app/components/document-detail/document-detail.component.ts - 1491 + 1488 src/app/components/document-detail/document-detail.component.ts - 1495 + 1492 @@ -9815,7 +9819,7 @@ You can restart the tour from the settings page. src/app/services/settings.service.ts - 667 + 664 diff --git a/src-ui/src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html b/src-ui/src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html index 9111a4b29..f58cfeeb9 100644 --- a/src-ui/src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html +++ b/src-ui/src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html @@ -1,4 +1,4 @@ -
+