From eae070cc6c463f0460e58fa3ea02fa5bb1c7f280 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 17 Nov 2025 17:07:03 +0100 Subject: [PATCH] Refactor: paperless-ngx (Breaking Change Inside) (#9223) --- ct/paperless-ngx.sh | 47 ++++++++++++------------ install/paperless-ngx-install.sh | 61 ++++++++++++-------------------- 2 files changed, 46 insertions(+), 62 deletions(-) diff --git a/ct/paperless-ngx.sh b/ct/paperless-ngx.sh index 36e67aad1..980364f54 100644 --- a/ct/paperless-ngx.sh +++ b/ct/paperless-ngx.sh @@ -27,6 +27,27 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + + # Check for old data structure and prompt migration + if [[ -f /opt/paperless/paperless.conf ]]; then + local OLD_DIRS=() + [[ -d /opt/paperless/consume ]] && OLD_DIRS+=("consume") + [[ -d /opt/paperless/data ]] && OLD_DIRS+=("data") + [[ -d /opt/paperless/media ]] && OLD_DIRS+=("media") + + 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:" + echo -e "${TAB}${GATEWAY}${BGN}https://github.com/community-scripts/ProxmoxVE/discussions/9223${CL}" + echo -e "" + msg_custom "⚠️" "Update aborted. Please migrate your data first." + exit 1 + fi + fi + if check_for_gh_release "paperless" "paperless-ngx/paperless-ngx"; then msg_info "Stopping all Paperless-ngx Services" systemctl stop paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue @@ -34,15 +55,9 @@ function update_script() { if grep -q "uv run" /etc/systemd/system/paperless-webserver.service; then - msg_info "Backing up user data and configuration" + msg_info "Backing up configuration" local BACKUP_DIR="/opt/paperless_backup_$$" mkdir -p "$BACKUP_DIR" - for dir in /opt/paperless/*/; do - dir_name=$(basename "$dir") - if [[ ! "$dir_name" =~ ^(docker|docs|scripts|src|static)$ ]]; then - cp -r "/opt/paperless/$dir_name" "$BACKUP_DIR/" 2>/dev/null || true - fi - done [[ -f /opt/paperless/paperless.conf ]] && cp /opt/paperless/paperless.conf "$BACKUP_DIR/" msg_ok "Backup completed to $BACKUP_DIR" @@ -83,16 +98,9 @@ function update_script() { rm -rf /opt/paperless/venv find /opt/paperless -name "__pycache__" -type d -exec rm -rf {} + - msg_info "Backing up user data and configuration" + msg_info "Backing up configuration" local BACKUP_DIR="/opt/paperless_backup_$$" mkdir -p "$BACKUP_DIR" - - for dir in /opt/paperless/*/; do - dir_name=$(basename "$dir") - if [[ ! "$dir_name" =~ ^(docker|docs|scripts|src|static)$ ]]; then - cp -r "/opt/paperless/$dir_name" "$BACKUP_DIR/" 2>/dev/null || true - fi - done [[ -f /opt/paperless/paperless.conf ]] && cp /opt/paperless/paperless.conf "$BACKUP_DIR/" msg_ok "Backup completed to $BACKUP_DIR" @@ -121,16 +129,9 @@ function update_script() { done $STD systemctl daemon-reload - msg_info "Backing up user data and configuration" + msg_info "Backing up configuration" BACKUP_DIR="/opt/paperless_backup_$$" mkdir -p "$BACKUP_DIR" - - for dir in /opt/paperless/*/; do - dir_name=$(basename "$dir") - if [[ ! "$dir_name" =~ ^(docker|docs|scripts|src|static)$ ]]; then - cp -r "/opt/paperless/$dir_name" "$BACKUP_DIR/" 2>/dev/null || true - fi - done [[ -f /opt/paperless/paperless.conf ]] && cp /opt/paperless/paperless.conf "$BACKUP_DIR/" msg_ok "Backup completed to $BACKUP_DIR" diff --git a/install/paperless-ngx-install.sh b/install/paperless-ngx-install.sh index 8b47aaa04..e937a13a6 100644 --- a/install/paperless-ngx-install.sh +++ b/install/paperless-ngx-install.sh @@ -44,46 +44,36 @@ $STD apt install -y \ msg_ok "Installed Dependencies" PG_VERSION="16" setup_postgresql +PG_DB_NAME="paperlessdb" PG_DB_USER="paperless" setup_postgresql_db PYTHON_VERSION="3.13" setup_uv fetch_and_deploy_gh_release "paperless" "paperless-ngx/paperless-ngx" "prebuild" "latest" "/opt/paperless" "paperless*tar.xz" -msg_info "Setting up PostgreSQL database" -DB_NAME=paperlessdb -DB_USER=paperless -DB_PASS="$(openssl rand -base64 18 | cut -c1-13)" -SECRET_KEY="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)" -$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';" -$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCODING 'UTF8' TEMPLATE template0;" -$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8';" -$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';" -$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC'" -{ - echo "Paperless-ngx-Credentials" - echo "Paperless-ngx Database Name: $DB_NAME" - echo "Paperless-ngx Database User: $DB_USER" - echo "Paperless-ngx Database Password: $DB_PASS" - echo "Paperless-ngx Secret Key: $SECRET_KEY\n" - echo "Paperless-ngx WebUI User: admin" - echo "Paperless-ngx WebUI Password: $DB_PASS" -} >>~/paperless-ngx.creds -msg_ok "Setup PostgreSQL database" - msg_info "Setup Paperless-ngx" cd /opt/paperless +rm -rf /opt/paperless/docker $STD uv sync --all-extras curl -fsSL "https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/paperless.conf.example" -o /opt/paperless/paperless.conf -mkdir -p {consume,data,media,static} +mkdir -p /opt/paperless_data/{consume,data,media,trash} +mkdir -p /opt/paperless/static +SECRET_KEY="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)" +{ + echo "" + echo "Paperless-ngx Secret Key: $SECRET_KEY" + echo "Paperless-ngx WebUI User: admin" + echo "Paperless-ngx WebUI Password: $PG_DB_PASS" +} >>~/paperless-ngx.creds sed -i \ -e 's|#PAPERLESS_REDIS=redis://localhost:6379|PAPERLESS_REDIS=redis://localhost:6379|' \ - -e "s|#PAPERLESS_CONSUMPTION_DIR=../consume|PAPERLESS_CONSUMPTION_DIR=/opt/paperless/consume|" \ - -e "s|#PAPERLESS_DATA_DIR=../data|PAPERLESS_DATA_DIR=/opt/paperless/data|" \ - -e "s|#PAPERLESS_MEDIA_ROOT=../media|PAPERLESS_MEDIA_ROOT=/opt/paperless/media|" \ + -e "s|#PAPERLESS_CONSUMPTION_DIR=../consume|PAPERLESS_CONSUMPTION_DIR=/opt/paperless_data/consume|" \ + -e "s|#PAPERLESS_DATA_DIR=../data|PAPERLESS_DATA_DIR=/opt/paperless_data/data|" \ + -e "s|#PAPERLESS_MEDIA_ROOT=../media|PAPERLESS_MEDIA_ROOT=/opt/paperless_data/media|" \ + -e "s|#PAPERLESS_EMPTY_TRASH_DIR=|PAPERLESS_EMPTY_TRASH_DIR=/opt/paperless_data/trash|" \ -e "s|#PAPERLESS_STATICDIR=../static|PAPERLESS_STATICDIR=/opt/paperless/static|" \ -e 's|#PAPERLESS_DBHOST=localhost|PAPERLESS_DBHOST=localhost|' \ -e 's|#PAPERLESS_DBPORT=5432|PAPERLESS_DBPORT=5432|' \ - -e "s|#PAPERLESS_DBNAME=paperless|PAPERLESS_DBNAME=$DB_NAME|" \ - -e "s|#PAPERLESS_DBUSER=paperless|PAPERLESS_DBUSER=$DB_USER|" \ - -e "s|#PAPERLESS_DBPASS=paperless|PAPERLESS_DBPASS=$DB_PASS|" \ + -e "s|#PAPERLESS_DBNAME=paperless|PAPERLESS_DBNAME=$PG_DB_NAME|" \ + -e "s|#PAPERLESS_DBUSER=paperless|PAPERLESS_DBUSER=$PG_DB_USER|" \ + -e "s|#PAPERLESS_DBPASS=paperless|PAPERLESS_DBPASS=$PG_DB_PASS|" \ -e "s|#PAPERLESS_SECRET_KEY=change-me|PAPERLESS_SECRET_KEY=$SECRET_KEY|" \ /opt/paperless/paperless.conf cd /opt/paperless/src @@ -97,7 +87,7 @@ msg_info "Setting up admin Paperless-ngx User & Password" cat <