2025-11-02 23:49:54 -08:00
|
|
|
|
#!/usr/bin/env bash
|
2026-08-25 11:04:15 +02:00
|
|
|
|
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
|
|
|
|
|
|
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
|
2026-01-06 13:28:12 +01:00
|
|
|
|
# Copyright (c) 2021-2026 tteck
|
2023-03-22 20:48:20 -04:00
|
|
|
|
# Author: tteck (tteckster)
|
2024-12-16 12:42:51 +01:00
|
|
|
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
2026-02-24 15:11:53 +01:00
|
|
|
|
# Source: https://docs.paperless-ngx.com/ | Github: https://github.com/paperless-ngx/paperless-ngx
|
2023-03-22 20:48:20 -04:00
|
|
|
|
|
|
|
|
|
|
APP="Paperless-ngx"
|
2025-04-10 11:56:52 +02:00
|
|
|
|
var_tags="${var_tags:-document;management}"
|
|
|
|
|
|
var_cpu="${var_cpu:-2}"
|
2026-03-18 08:32:58 +01:00
|
|
|
|
var_ram="${var_ram:-3072}"
|
2025-08-20 15:18:05 +02:00
|
|
|
|
var_disk="${var_disk:-12}"
|
2025-04-10 11:56:52 +02:00
|
|
|
|
var_os="${var_os:-debian}"
|
2025-10-15 22:39:16 +02:00
|
|
|
|
var_version="${var_version:-13}"
|
2026-06-12 00:16:15 +10:00
|
|
|
|
var_arm64="${var_arm64:-yes}"
|
2025-04-10 11:56:52 +02:00
|
|
|
|
var_unprivileged="${var_unprivileged:-1}"
|
2024-12-16 12:42:51 +01:00
|
|
|
|
|
|
|
|
|
|
header_info "$APP"
|
2023-03-22 20:48:20 -04:00
|
|
|
|
variables
|
|
|
|
|
|
color
|
|
|
|
|
|
catch_errors
|
|
|
|
|
|
|
|
|
|
|
|
function update_script() {
|
2025-08-20 15:18:05 +02:00
|
|
|
|
header_info
|
|
|
|
|
|
check_container_storage
|
|
|
|
|
|
check_container_resources
|
2023-03-22 20:48:20 -04:00
|
|
|
|
if [[ ! -d /opt/paperless ]]; then
|
|
|
|
|
|
msg_error "No ${APP} Installation Found!"
|
|
|
|
|
|
exit
|
|
|
|
|
|
fi
|
2025-11-17 17:07:03 +01:00
|
|
|
|
|
2025-12-05 11:14:02 +01:00
|
|
|
|
# Check for old data structure and prompt migration (exclude symlinks)
|
2025-11-17 17:07:03 +01:00
|
|
|
|
if [[ -f /opt/paperless/paperless.conf ]]; then
|
|
|
|
|
|
local OLD_DIRS=()
|
2025-12-05 11:14:02 +01:00
|
|
|
|
[[ -d /opt/paperless/consume && ! -L /opt/paperless/consume ]] && OLD_DIRS+=("consume")
|
|
|
|
|
|
[[ -d /opt/paperless/data && ! -L /opt/paperless/data ]] && OLD_DIRS+=("data")
|
|
|
|
|
|
[[ -d /opt/paperless/media && ! -L /opt/paperless/media ]] && OLD_DIRS+=("media")
|
2025-11-17 17:07:03 +01:00
|
|
|
|
|
|
|
|
|
|
if [[ ${#OLD_DIRS[@]} -gt 0 ]]; then
|
|
|
|
|
|
msg_error "Old data structure detected in /opt/paperless/"
|
|
|
|
|
|
msg_custom "📂" "Found directories: ${OLD_DIRS[*]}"
|
|
|
|
|
|
echo -e ""
|
|
|
|
|
|
msg_custom "🔄" "Migration required to new data structure (/opt/paperless_data/)"
|
|
|
|
|
|
msg_custom "📖" "Please follow the migration guide:"
|
2026-08-03 21:23:59 +00:00
|
|
|
|
echo -e "${GATEWAY}${BGN}https://github.com/community-scripts/ProxmoxVE/pull/9223${CL}"
|
2025-11-17 17:07:03 +01:00
|
|
|
|
echo -e ""
|
|
|
|
|
|
msg_custom "⚠️" "Update aborted. Please migrate your data first."
|
2026-03-02 13:57:42 +01:00
|
|
|
|
exit 253
|
2025-11-17 17:07:03 +01:00
|
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
2026-07-23 23:17:55 +02:00
|
|
|
|
local PAPERLESS_INSTALLED_VERSION="" BRIDGE_UPDATE=0
|
|
|
|
|
|
[[ -f ~/.paperless ]] && PAPERLESS_INSTALLED_VERSION="$(<~/.paperless)"
|
|
|
|
|
|
PAPERLESS_INSTALLED_VERSION="${PAPERLESS_INSTALLED_VERSION#v}"
|
|
|
|
|
|
if [[ "$PAPERLESS_INSTALLED_VERSION" == 2.* && "$PAPERLESS_INSTALLED_VERSION" != "2.20.15" ]]; then
|
|
|
|
|
|
BRIDGE_UPDATE=1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if check_for_gh_release "paperless" "paperless-ngx/paperless-ngx"; then
|
|
|
|
|
|
if [[ "$PAPERLESS_INSTALLED_VERSION" == "2.20.15" ]]; then
|
|
|
|
|
|
msg_warn "Paperless-ngx v3 does not support encrypted documents anymore."
|
|
|
|
|
|
echo -e "${GATEWAY}${BGN}https://docs.paperless-ngx.com/migration-v3/#encryption-support${CL}"
|
|
|
|
|
|
msg_warn "Before continuing make sure that you do not use encryption or have decrypted all documents."
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
read -rp "Do you want to continue with the update? (y/N): " MIGRATE
|
|
|
|
|
|
echo
|
|
|
|
|
|
if [[ ! "$MIGRATE" =~ ^[Yy]$ ]]; then
|
2026-08-06 14:28:58 +02:00
|
|
|
|
msg_custom "⚠️" "Update aborted. Decrypt all documents before upgrading to v3."
|
2026-07-23 23:17:55 +02:00
|
|
|
|
exit 0
|
|
|
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
2025-08-20 15:18:05 +02:00
|
|
|
|
msg_info "Stopping all Paperless-ngx Services"
|
|
|
|
|
|
systemctl stop paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue
|
|
|
|
|
|
msg_ok "Stopped all Paperless-ngx Services"
|
2023-03-22 20:48:20 -04:00
|
|
|
|
|
2025-08-20 15:18:05 +02:00
|
|
|
|
if grep -q "uv run" /etc/systemd/system/paperless-webserver.service; then
|
2025-11-17 17:07:03 +01:00
|
|
|
|
msg_info "Backing up configuration"
|
2025-11-16 18:55:46 +01:00
|
|
|
|
local BACKUP_DIR="/opt/paperless_backup_$$"
|
2025-11-13 10:57:15 +01:00
|
|
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
|
|
[[ -f /opt/paperless/paperless.conf ]] && cp /opt/paperless/paperless.conf "$BACKUP_DIR/"
|
|
|
|
|
|
msg_ok "Backup completed to $BACKUP_DIR"
|
2025-08-20 15:18:05 +02:00
|
|
|
|
|
2026-07-23 23:17:55 +02:00
|
|
|
|
if ((BRIDGE_UPDATE)); then
|
|
|
|
|
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "paperless" "paperless-ngx/paperless-ngx" "prebuild" "v2.20.15" "/opt/paperless" "paperless*tar.xz"
|
|
|
|
|
|
else
|
|
|
|
|
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "paperless" "paperless-ngx/paperless-ngx" "prebuild" "latest" "/opt/paperless" "paperless*tar.xz"
|
|
|
|
|
|
fi
|
2025-11-08 12:55:13 -08:00
|
|
|
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "jbig2enc" "ie13/jbig2enc" "tarball" "latest" "/opt/jbig2enc"
|
2026-09-22 16:06:15 +02:00
|
|
|
|
PYTHON_VERSION="3.13" UV_PROJECT_DIR="/opt/paperless" setup_uv
|
2025-11-09 02:33:51 -05:00
|
|
|
|
|
2025-11-08 12:55:13 -08:00
|
|
|
|
. /etc/os-release
|
|
|
|
|
|
if [ "$VERSION_CODENAME" = "bookworm" ]; then
|
|
|
|
|
|
setup_gs
|
|
|
|
|
|
else
|
2026-02-02 13:01:17 +01:00
|
|
|
|
ensure_dependencies ghostscript
|
2025-11-08 12:55:13 -08:00
|
|
|
|
fi
|
2026-07-23 23:17:55 +02:00
|
|
|
|
ensure_dependencies gnupg
|
2023-03-22 20:48:20 -04:00
|
|
|
|
|
2025-11-13 10:57:15 +01:00
|
|
|
|
cp -r "$BACKUP_DIR"/* /opt/paperless/
|
2026-07-23 23:17:55 +02:00
|
|
|
|
if ((BRIDGE_UPDATE == 0)) && [[ "$PAPERLESS_INSTALLED_VERSION" == 2.* ]]; then
|
|
|
|
|
|
msg_info "Migrating Paperless-ngx v2 configuration to v3"
|
|
|
|
|
|
PAPERLESS_CONF="/opt/paperless/paperless.conf"
|
|
|
|
|
|
|
|
|
|
|
|
SECRET_KEY_CURRENT="$(sed -n 's|^PAPERLESS_SECRET_KEY=||p' "$PAPERLESS_CONF" | tail -n1)"
|
|
|
|
|
|
DBENGINE="$(sed -n 's|^PAPERLESS_DBENGINE=||p' "$PAPERLESS_CONF" | tail -n1)"
|
|
|
|
|
|
DB_OPTIONS_DEPRECATED="$(sed -n '/^PAPERLESS_DBSSLMODE=/p;/^PAPERLESS_DBSSLROOTCERT=/p;/^PAPERLESS_DBSSLCERT=/p;/^PAPERLESS_DBSSLKEY=/p;/^PAPERLESS_DB_POOLSIZE=/p;/^PAPERLESS_DB_TIMEOUT=/p' "$PAPERLESS_CONF")"
|
|
|
|
|
|
CONSUMER_POLLING="$(sed -n 's|^PAPERLESS_CONSUMER_POLLING=||p' "$PAPERLESS_CONF" | tail -n1)"
|
|
|
|
|
|
CONSUMER_POLLING_INTERVAL="$(sed -n 's|^PAPERLESS_CONSUMER_POLLING_INTERVAL=||p' "$PAPERLESS_CONF" | tail -n1)"
|
|
|
|
|
|
CONSUMER_INOTIFY_DELAY="$(sed -n 's|^PAPERLESS_CONSUMER_INOTIFY_DELAY=||p' "$PAPERLESS_CONF" | tail -n1)"
|
|
|
|
|
|
CONSUMER_STABILITY_DELAY="$(sed -n 's|^PAPERLESS_CONSUMER_STABILITY_DELAY=||p' "$PAPERLESS_CONF" | tail -n1)"
|
|
|
|
|
|
OCR_MODE="$(sed -n 's|^PAPERLESS_OCR_MODE=||p' "$PAPERLESS_CONF" | tail -n1)"
|
|
|
|
|
|
OCR_SKIP_ARCHIVE="$(sed -n 's|^PAPERLESS_OCR_SKIP_ARCHIVE_FILE=||p' "$PAPERLESS_CONF" | tail -n1)"
|
|
|
|
|
|
ARCHIVE_FILE_GENERATION="$(sed -n 's|^PAPERLESS_ARCHIVE_FILE_GENERATION=||p' "$PAPERLESS_CONF" | tail -n1)"
|
|
|
|
|
|
CONSUMER_DELETE_DUPLICATES="$(sed -n 's|^PAPERLESS_CONSUMER_DELETE_DUPLICATES=||p' "$PAPERLESS_CONF" | tail -n1)"
|
|
|
|
|
|
|
|
|
|
|
|
sed -i \
|
|
|
|
|
|
-e '/^PAPERLESS_CONSUMER_POLLING=/d' \
|
|
|
|
|
|
-e '/^PAPERLESS_CONSUMER_INOTIFY_DELAY=/d' \
|
|
|
|
|
|
-e '/^PAPERLESS_CONSUMER_POLLING_DELAY=/d' \
|
|
|
|
|
|
-e '/^PAPERLESS_CONSUMER_POLLING_RETRY_COUNT=/d' \
|
|
|
|
|
|
-e '/^PAPERLESS_CONSUMER_BARCODE_SCANNER=/d' \
|
|
|
|
|
|
-e '/^PAPERLESS_PASSPHRASE=/d' \
|
|
|
|
|
|
-e '/^PAPERLESS_OCR_SKIP_ARCHIVE_FILE=/d' \
|
|
|
|
|
|
-e 's|^PAPERLESS_OCR_MODE="\?skip"\?$|PAPERLESS_OCR_MODE=auto|' \
|
|
|
|
|
|
-e 's|^PAPERLESS_OCR_MODE="\?skip_noarchive"\?$|PAPERLESS_OCR_MODE=auto|' \
|
|
|
|
|
|
"$PAPERLESS_CONF"
|
|
|
|
|
|
|
|
|
|
|
|
if [[ -n "$DB_OPTIONS_DEPRECATED" ]]; then
|
|
|
|
|
|
msg_warn "Deprecated Paperless DB options detected; migrate them manually to PAPERLESS_DB_OPTIONS."
|
|
|
|
|
|
echo -e "${GATEWAY}${BGN}https://docs.paperless-ngx.com/migration-v3/#database-advanced-options${CL}"
|
|
|
|
|
|
fi
|
|
|
|
|
|
if [[ -z "$SECRET_KEY_CURRENT" || "$SECRET_KEY_CURRENT" == "change-me" ]]; then
|
|
|
|
|
|
SECRET_KEY="$(dd if=/dev/urandom bs=32 count=1 2>/dev/null | od -An -tx1 | tr -d ' \n')"
|
|
|
|
|
|
sed -i \
|
|
|
|
|
|
-e '/^#\?PAPERLESS_SECRET_KEY=/d' \
|
|
|
|
|
|
-e "\$a\\PAPERLESS_SECRET_KEY=$SECRET_KEY" \
|
|
|
|
|
|
"$PAPERLESS_CONF"
|
|
|
|
|
|
printf "Paperless-ngx Secret Key: %s\n" "$SECRET_KEY" >>~/paperless-ngx.creds
|
|
|
|
|
|
fi
|
|
|
|
|
|
[[ -z "$DBENGINE" ]] && sed -i '$a\PAPERLESS_DBENGINE=postgresql' "$PAPERLESS_CONF"
|
|
|
|
|
|
[[ -n "$CONSUMER_POLLING" && -z "$CONSUMER_POLLING_INTERVAL" ]] &&
|
|
|
|
|
|
sed -i "\$a\\PAPERLESS_CONSUMER_POLLING_INTERVAL=$CONSUMER_POLLING" "$PAPERLESS_CONF"
|
|
|
|
|
|
[[ -n "$CONSUMER_INOTIFY_DELAY" && -z "$CONSUMER_STABILITY_DELAY" ]] &&
|
|
|
|
|
|
sed -i "\$a\\PAPERLESS_CONSUMER_STABILITY_DELAY=$CONSUMER_INOTIFY_DELAY" "$PAPERLESS_CONF"
|
|
|
|
|
|
[[ -z "$CONSUMER_DELETE_DUPLICATES" ]] &&
|
|
|
|
|
|
sed -i '$a\PAPERLESS_CONSUMER_DELETE_DUPLICATES=true' "$PAPERLESS_CONF"
|
|
|
|
|
|
if [[ -z "$ARCHIVE_FILE_GENERATION" ]]; then
|
|
|
|
|
|
if [[ "$OCR_MODE" == "skip_noarchive" || "$OCR_MODE" == "\"skip_noarchive\"" ]]; then
|
|
|
|
|
|
sed -i '$a\PAPERLESS_ARCHIVE_FILE_GENERATION=never' "$PAPERLESS_CONF"
|
|
|
|
|
|
elif [[ "$OCR_SKIP_ARCHIVE" == "never" || "$OCR_SKIP_ARCHIVE" == "\"never\"" ]]; then
|
|
|
|
|
|
sed -i '$a\PAPERLESS_ARCHIVE_FILE_GENERATION=always' "$PAPERLESS_CONF"
|
|
|
|
|
|
elif [[ "$OCR_SKIP_ARCHIVE" == "with_text" || "$OCR_SKIP_ARCHIVE" == "\"with_text\"" ]]; then
|
|
|
|
|
|
sed -i '$a\PAPERLESS_ARCHIVE_FILE_GENERATION=auto' "$PAPERLESS_CONF"
|
|
|
|
|
|
elif [[ "$OCR_SKIP_ARCHIVE" == "always" || "$OCR_SKIP_ARCHIVE" == "\"always\"" ]]; then
|
|
|
|
|
|
sed -i '$a\PAPERLESS_ARCHIVE_FILE_GENERATION=never' "$PAPERLESS_CONF"
|
|
|
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
[[ -n "$(sed -n '/^PAPERLESS_CONSUMER_IGNORE_PATTERNS=/p' "$PAPERLESS_CONF")" ]] &&
|
|
|
|
|
|
msg_warn "PAPERLESS_CONSUMER_IGNORE_PATTERNS now uses regex patterns; please verify custom values."
|
|
|
|
|
|
[[ -n "$(sed -n '/^PAPERLESS_PRE_CONSUME_SCRIPT=/p;/^PAPERLESS_POST_CONSUME_SCRIPT=/p' "$PAPERLESS_CONF")" ]] &&
|
|
|
|
|
|
msg_warn "Pre/post consume scripts no longer receive positional arguments in v3; please verify custom scripts."
|
|
|
|
|
|
msg_ok "Migrated Paperless-ngx configuration"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
msg_info "Updating Paperless-ngx"
|
|
|
|
|
|
if ((BRIDGE_UPDATE == 0)); then
|
2026-08-14 22:10:54 +02:00
|
|
|
|
sed -i 's|^ExecStart=.*|ExecStart=uv run --no-sync -- granian --interface asginl --ws --loop uvloop "paperless.asgi:application"|' /etc/systemd/system/paperless-webserver.service
|
2026-08-11 21:37:59 +02:00
|
|
|
|
grep -q "document_index reindex" /etc/systemd/system/paperless-webserver.service ||
|
2026-09-12 22:10:47 +02:00
|
|
|
|
sed -i '/^ExecStart=/i ExecStartPre=uv run --no-sync -- python manage.py document_index reindex --if-needed --no-progress-bar' /etc/systemd/system/paperless-webserver.service
|
2026-07-23 23:17:55 +02:00
|
|
|
|
fi
|
2026-09-12 22:10:47 +02:00
|
|
|
|
for svc in consumer scheduler task-queue webserver; do
|
|
|
|
|
|
unit="/etc/systemd/system/paperless-${svc}.service"
|
|
|
|
|
|
[[ -f "$unit" ]] && sed -i 's|uv run -- |uv run --no-sync -- |g' "$unit"
|
|
|
|
|
|
done
|
|
|
|
|
|
$STD systemctl daemon-reload
|
2024-05-08 13:34:01 -04:00
|
|
|
|
cd /opt/paperless
|
2025-08-20 15:18:05 +02:00
|
|
|
|
$STD uv sync --all-extras
|
2024-05-08 13:34:01 -04:00
|
|
|
|
cd /opt/paperless/src
|
2025-08-20 15:18:05 +02:00
|
|
|
|
$STD uv run -- python manage.py migrate
|
2025-08-29 12:27:24 +02:00
|
|
|
|
msg_ok "Updated Paperless-ngx"
|
2025-11-08 12:55:13 -08:00
|
|
|
|
|
2026-07-23 23:17:55 +02:00
|
|
|
|
if ((BRIDGE_UPDATE == 0)) && [[ "$PAPERLESS_INSTALLED_VERSION" == "2.20.15" ]]; then
|
|
|
|
|
|
$STD apt -y purge libzbar0t64 libzbar0 2>/dev/null || true
|
|
|
|
|
|
$STD apt -y autoremove 2>/dev/null || true
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
2025-11-13 10:57:15 +01:00
|
|
|
|
rm -rf "$BACKUP_DIR"
|
2025-11-09 02:33:51 -05:00
|
|
|
|
|
2024-05-08 13:34:01 -04:00
|
|
|
|
else
|
2026-07-23 23:17:55 +02:00
|
|
|
|
BRIDGE_UPDATE=1
|
2025-08-20 15:18:05 +02:00
|
|
|
|
msg_warn "You are about to migrate your Paperless-ngx installation to uv!"
|
|
|
|
|
|
msg_custom "🔒" "It is strongly recommended to take a Proxmox snapshot first:"
|
|
|
|
|
|
echo -e " 1. Stop the container: pct stop <CTID>"
|
|
|
|
|
|
echo -e " 2. Create a snapshot: pct snapshot <CTID> pre-paperless-uv-migration"
|
|
|
|
|
|
echo -e " 3. Start the container again\n"
|
|
|
|
|
|
|
|
|
|
|
|
read -rp "Have you created a snapshot? [y/N]: " confirm
|
|
|
|
|
|
if [[ ! "$confirm" =~ ^([yY]|[yY][eE][sS])$ ]]; then
|
|
|
|
|
|
msg_error "Migration aborted. Please create a snapshot first."
|
2025-10-30 09:24:16 -07:00
|
|
|
|
exit
|
2025-08-20 15:18:05 +02:00
|
|
|
|
fi
|
|
|
|
|
|
msg_info "Migrating old Paperless-ngx installation to uv"
|
|
|
|
|
|
rm -rf /opt/paperless/venv
|
|
|
|
|
|
find /opt/paperless -name "__pycache__" -type d -exec rm -rf {} +
|
|
|
|
|
|
|
2025-11-17 17:07:03 +01:00
|
|
|
|
msg_info "Backing up configuration"
|
2025-11-16 18:55:46 +01:00
|
|
|
|
local BACKUP_DIR="/opt/paperless_backup_$$"
|
2025-11-13 10:57:15 +01:00
|
|
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
|
|
[[ -f /opt/paperless/paperless.conf ]] && cp /opt/paperless/paperless.conf "$BACKUP_DIR/"
|
|
|
|
|
|
msg_ok "Backup completed to $BACKUP_DIR"
|
|
|
|
|
|
|
2025-08-20 15:18:05 +02:00
|
|
|
|
declare -A PATCHES=(
|
2026-08-14 22:10:54 +02:00
|
|
|
|
["paperless-consumer.service"]="ExecStart=uv run --no-sync -- python manage.py document_consumer"
|
|
|
|
|
|
["paperless-scheduler.service"]="ExecStart=uv run --no-sync -- celery --app paperless beat --loglevel INFO"
|
|
|
|
|
|
["paperless-task-queue.service"]="ExecStart=uv run --no-sync -- celery --app paperless worker --loglevel INFO"
|
|
|
|
|
|
["paperless-webserver.service"]="ExecStart=uv run --no-sync -- granian --interface asgi --ws \"paperless.asgi:application\""
|
2025-08-20 15:18:05 +02:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
for svc in "${!PATCHES[@]}"; do
|
|
|
|
|
|
path=$(systemctl show -p FragmentPath "$svc" | cut -d= -f2)
|
|
|
|
|
|
if [[ -n "$path" && -f "$path" ]]; then
|
|
|
|
|
|
sed -i "s|^ExecStart=.*|${PATCHES[$svc]}|" "$path"
|
|
|
|
|
|
if [[ "$svc" == "paperless-webserver.service" ]]; then
|
|
|
|
|
|
grep -q "^Environment=GRANIAN_HOST=" "$path" ||
|
|
|
|
|
|
sed -i '/^\[Service\]/a Environment=GRANIAN_HOST=::' "$path"
|
|
|
|
|
|
grep -q "^Environment=GRANIAN_PORT=" "$path" ||
|
|
|
|
|
|
sed -i '/^\[Service\]/a Environment=GRANIAN_PORT=8000' "$path"
|
|
|
|
|
|
grep -q "^Environment=GRANIAN_WORKERS=" "$path" ||
|
|
|
|
|
|
sed -i '/^\[Service\]/a Environment=GRANIAN_WORKERS=1' "$path"
|
|
|
|
|
|
fi
|
|
|
|
|
|
msg_ok "Patched $svc"
|
|
|
|
|
|
else
|
|
|
|
|
|
msg_error "Service file for $svc not found!"
|
|
|
|
|
|
fi
|
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
$STD systemctl daemon-reload
|
2025-11-17 17:07:03 +01:00
|
|
|
|
msg_info "Backing up configuration"
|
2025-11-16 18:55:46 +01:00
|
|
|
|
BACKUP_DIR="/opt/paperless_backup_$$"
|
2025-11-13 10:57:15 +01:00
|
|
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
|
|
[[ -f /opt/paperless/paperless.conf ]] && cp /opt/paperless/paperless.conf "$BACKUP_DIR/"
|
|
|
|
|
|
msg_ok "Backup completed to $BACKUP_DIR"
|
2025-08-20 15:18:05 +02:00
|
|
|
|
|
|
|
|
|
|
PYTHON_VERSION="3.13" setup_uv
|
2026-07-23 23:17:55 +02:00
|
|
|
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "paperless" "paperless-ngx/paperless-ngx" "prebuild" "v2.20.15" "/opt/paperless" "paperless*tar.xz"
|
2025-11-08 12:55:13 -08:00
|
|
|
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "jbig2enc" "ie13/jbig2enc" "tarball" "latest" "/opt/jbig2enc"
|
2025-11-09 02:33:51 -05:00
|
|
|
|
|
2025-11-08 12:55:13 -08:00
|
|
|
|
. /etc/os-release
|
|
|
|
|
|
if [ "$VERSION_CODENAME" = "bookworm" ]; then
|
|
|
|
|
|
setup_gs
|
|
|
|
|
|
else
|
|
|
|
|
|
msg_info "Installing Ghostscript"
|
2026-02-02 13:01:17 +01:00
|
|
|
|
ensure_dependencies ghostscript
|
2025-11-08 12:55:13 -08:00
|
|
|
|
msg_ok "Installed Ghostscript"
|
|
|
|
|
|
fi
|
2026-07-23 23:17:55 +02:00
|
|
|
|
ensure_dependencies gnupg
|
2025-08-20 15:18:05 +02:00
|
|
|
|
|
2026-07-23 23:17:55 +02:00
|
|
|
|
msg_info "Updating Paperless-ngx to v2.20.15"
|
2025-11-13 10:57:15 +01:00
|
|
|
|
cp -r "$BACKUP_DIR"/* /opt/paperless/
|
2025-08-20 15:18:05 +02:00
|
|
|
|
cd /opt/paperless
|
|
|
|
|
|
$STD uv sync --all-extras
|
|
|
|
|
|
cd /opt/paperless/src
|
|
|
|
|
|
$STD uv run -- python manage.py migrate
|
2026-07-23 23:17:55 +02:00
|
|
|
|
msg_ok "Migrated to uv and updated to v2.20.15 (required before v3)"
|
2025-11-08 12:55:13 -08:00
|
|
|
|
|
2025-11-13 10:57:15 +01:00
|
|
|
|
rm -rf "$BACKUP_DIR"
|
2025-11-08 12:55:13 -08:00
|
|
|
|
if [[ -d /opt/paperless/backup ]]; then
|
2025-11-09 02:33:51 -05:00
|
|
|
|
rm -rf /opt/paperless/backup
|
|
|
|
|
|
msg_ok "Removed old backup directory"
|
2025-11-08 12:55:13 -08:00
|
|
|
|
fi
|
2024-05-08 13:34:01 -04:00
|
|
|
|
fi
|
2025-08-20 15:18:05 +02:00
|
|
|
|
|
2026-05-08 15:39:20 +02:00
|
|
|
|
setup_nltk "snowball_data stopwords punkt_tab" "/usr/share/nltk_data"
|
2026-05-01 15:00:05 -04:00
|
|
|
|
|
2025-08-20 15:18:05 +02:00
|
|
|
|
msg_info "Starting all Paperless-ngx Services"
|
|
|
|
|
|
systemctl start paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue
|
|
|
|
|
|
sleep 1
|
|
|
|
|
|
msg_ok "Started all Paperless-ngx Services"
|
2026-07-23 23:17:55 +02:00
|
|
|
|
if ((BRIDGE_UPDATE)); then
|
|
|
|
|
|
msg_custom "ℹ️" "${YW}" "Paperless-ngx is now on v2.20.15. Run the update again to upgrade to v3."
|
|
|
|
|
|
exit
|
|
|
|
|
|
fi
|
2025-10-30 09:24:16 -07:00
|
|
|
|
msg_ok "Updated successfully!"
|
2023-03-22 20:48:20 -04:00
|
|
|
|
fi
|
2025-08-20 15:18:05 +02:00
|
|
|
|
exit
|
2023-03-22 20:48:20 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
start
|
|
|
|
|
|
build_container
|
|
|
|
|
|
description
|
|
|
|
|
|
|
2026-01-06 22:57:40 +01:00
|
|
|
|
msg_ok "Completed successfully!\n"
|
2024-12-16 12:42:51 +01:00
|
|
|
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
2026-06-03 11:03:13 +02:00
|
|
|
|
echo -e "${INFO}${YW}Access it using the following URL:${CL}"
|
|
|
|
|
|
echo -e "${GATEWAY}${BGN}http://${IP}:8000${CL}"
|