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
+ 965src/app/components/document-detail/document-detail.component.ts
- 1328
+ 1325src/app/components/document-detail/document-detail.component.ts
- 1367
+ 1364src/app/components/document-detail/document-detail.component.ts
- 1408
+ 1405src/app/components/document-list/bulk-editor/bulk-editor.component.ts
@@ -3157,7 +3157,7 @@
src/app/components/document-detail/document-detail.component.ts
- 921
+ 918src/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
+ 129src/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
+ 138src/app/components/manage/custom-fields/custom-fields.component.ts
@@ -3406,7 +3406,7 @@
src/app/components/document-detail/document-detail.component.ts
- 1385
+ 1382src/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
+ 836Error saving document ""src/app/components/document-detail/document-detail.component.ts
- 845
+ 842Error saving documentsrc/app/components/document-detail/document-detail.component.ts
- 890
+ 887Do you really want to move the document "" to the trash?src/app/components/document-detail/document-detail.component.ts
- 922
+ 919Documents can be restored prior to permanent deletion.src/app/components/document-detail/document-detail.component.ts
- 923
+ 920src/app/components/document-list/bulk-editor/bulk-editor.component.ts
@@ -6947,7 +6951,7 @@
Move to trashsrc/app/components/document-detail/document-detail.component.ts
- 925
+ 922src/app/components/document-list/bulk-editor/bulk-editor.component.ts
@@ -6958,14 +6962,14 @@
Error deleting documentsrc/app/components/document-detail/document-detail.component.ts
- 944
+ 941Reprocess confirmsrc/app/components/document-detail/document-detail.component.ts
- 964
+ 961src/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
+ 962The archive file will be re-generated with the current settings.src/app/components/document-detail/document-detail.component.ts
- 966
+ 963Reprocess 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
+ 973Error executing operationsrc/app/components/document-detail/document-detail.component.ts
- 987
+ 984Error downloading documentsrc/app/components/document-detail/document-detail.component.ts
- 1034
+ 1031Page Fitsrc/app/components/document-detail/document-detail.component.ts
- 1113
+ 1110Split confirmsrc/app/components/document-detail/document-detail.component.ts
- 1326
+ 1323This operation will split the selected document(s) into new documents.src/app/components/document-detail/document-detail.component.ts
- 1327
+ 1324Split operation for "" will begin in the background.src/app/components/document-detail/document-detail.component.ts
- 1343
+ 1340Error executing split operationsrc/app/components/document-detail/document-detail.component.ts
- 1352
+ 1349Rotate confirmsrc/app/components/document-detail/document-detail.component.ts
- 1365
+ 1362src/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
+ 1363Rotation 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
+ 1379Error executing rotate operationsrc/app/components/document-detail/document-detail.component.ts
- 1394
+ 1391Delete pages confirmsrc/app/components/document-detail/document-detail.component.ts
- 1406
+ 1403This operation will permanently delete the selected pages from the original document.src/app/components/document-detail/document-detail.component.ts
- 1407
+ 1404Delete 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
+ 1419Error executing delete pages operationsrc/app/components/document-detail/document-detail.component.ts
- 1431
+ 1428An error occurred loading tiff: src/app/components/document-detail/document-detail.component.ts
- 1491
+ 1488src/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 @@
-