@@ -9,7 +9,7 @@ APP="Paperless-ngx"
99var_tags=" ${var_tags:- document;management} "
1010var_cpu=" ${var_cpu:- 2} "
1111var_ram=" ${var_ram:- 2048} "
12- var_disk=" ${var_disk:- 10 } "
12+ var_disk=" ${var_disk:- 12 } "
1313var_os=" ${var_os:- debian} "
1414var_version=" ${var_version:- 12} "
1515var_unprivileged=" ${var_unprivileged:- 1} "
@@ -20,70 +20,115 @@ color
2020catch_errors
2121
2222function update_script() {
23+ header_info
24+ check_container_storage
25+ check_container_resources
2326 if [[ ! -d /opt/paperless ]]; then
2427 msg_error " No ${APP} Installation Found!"
2528 exit
2629 fi
27- RELEASE=$( curl -fsSL https://api.github.com/repos/paperless-ngx/paperless-ngx/releases/latest | grep " tag_name" | awk ' {print substr($2, 2, length($2)-3) }' )
30+ if ! command -v jq & > /dev/null; then
31+ $STD apt-get install -y jq
32+ fi
33+ RELEASE=$( curl -fsSL https://api.github.com/repos/paperless-ngx/paperless-ngx/releases/latest | jq -r .tag_name | sed ' s/^v//' )
34+ if [[ " ${RELEASE} " != " $( cat ~ /.paperless 2> /dev/null) " ]] || [[ ! -f ~ /.paperless ]]; then
35+ msg_info " Stopping all Paperless-ngx Services"
36+ systemctl stop paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue
37+ msg_ok " Stopped all Paperless-ngx Services"
2838
29- UPD=$( whiptail --backtitle " Proxmox VE Helper Scripts" --title " SUPPORT" --radiolist --cancel-button Exit-Script " Spacebar = Select" 11 58 2 \
30- " 1" " Update Paperless-ngx to $RELEASE " ON \
31- " 2" " Paperless-ngx Credentials" OFF \
32- 3>&1 1>&2 2>&3 )
33- header_info
34- check_container_storage
35- check_container_resources
36- if [ " $UPD " == " 1" ]; then
37- if [[ " ${RELEASE} " != " $( cat /opt/${APP} _version.txt) " ]] || [[ ! -f /opt/${APP} _version.txt ]]; then
38- if [[ " $( gs --version 2> /dev/null) " != " 10.04.0" ]]; then
39- msg_info " Updating Ghostscript (Patience)"
40- cd /tmp
41- curl -fsSL " https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10040/ghostscript-10.04.0.tar.gz" -o $( basename " https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10040/ghostscript-10.04.0.tar.gz" )
42- tar -xzf ghostscript-10.04.0.tar.gz
43- cd ghostscript-10.04.0
44- $STD ./configure
45- $STD make
46- $STD sudo make install
47- rm -rf /tmp/ghostscript*
48- msg_ok " Ghostscript updated to 10.04.0"
49- fi
50- msg_info " Stopping all Paperless-ngx Services"
51- systemctl stop paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue.service
52- msg_ok " Stopped all Paperless-ngx Services"
39+ if grep -q " uv run" /etc/systemd/system/paperless-webserver.service; then
40+
41+ msg_info " Backing up data"
42+ mkdir -p /opt/paperless/backup
43+ cp -r /opt/paperless/data /opt/paperless/backup/
44+ cp -r /opt/paperless/media /opt/paperless/backup/
45+ cp -r /opt/paperless/paperless.conf /opt/paperless/backup/
46+ msg_ok " Backup completed"
47+
48+ PYTHON_VERSION=" 3.13" setup_uv
49+ fetch_and_deploy_gh_release " paperless" " paperless-ngx/paperless-ngx" " prebuild" " latest" " /opt/paperless" " paperless*tar.xz"
50+ fetch_and_deploy_gh_release " jbig2enc" " ie13/jbig2enc" " tarball" " latest" " /opt/jbig2enc"
51+ setup_gs
5352
5453 msg_info " Updating to ${RELEASE} "
55- cd ~
56- curl -fsSL " https://github.com/paperless-ngx/paperless-ngx/releases/download/$RELEASE /paperless-ngx-$RELEASE .tar.xz" -o $( basename " https://github.com/paperless-ngx/paperless-ngx/releases/download/$RELEASE /paperless-ngx-$RELEASE .tar.xz" )
57- tar -xf paperless-ngx-$RELEASE .tar.xz
58- cp -r /opt/paperless/paperless.conf paperless-ngx/
59- cp -r paperless-ngx/* /opt/paperless/
54+ cp -r /opt/paperless/backup/* /opt/paperless/
6055 cd /opt/paperless
61- $STD pip install -r requirements.txt
56+ $STD uv sync --all-extras
6257 cd /opt/paperless/src
63- $STD /usr/bin/python3 manage.py migrate
64- echo " ${RELEASE} " > /opt/${APP} _version.txt
58+ $STD uv run -- python manage.py migrate
6559 msg_ok " Updated to ${RELEASE} "
66-
67- msg_info " Cleaning up"
68- cd ~
69- rm paperless-ngx-$RELEASE .tar.xz
70- rm -rf paperless-ngx
71- msg_ok " Cleaned"
72-
73- msg_info " Starting all Paperless-ngx Services"
74- systemctl start paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue.service
75- sleep 1
76- msg_ok " Started all Paperless-ngx Services"
77- msg_ok " Updated Successfully!\n"
7860 else
79- msg_ok " No update required. ${APP} is already at ${RELEASE} "
61+ msg_warn " You are about to migrate your Paperless-ngx installation to uv!"
62+ msg_custom " 🔒" " It is strongly recommended to take a Proxmox snapshot first:"
63+ echo -e " 1. Stop the container: pct stop <CTID>"
64+ echo -e " 2. Create a snapshot: pct snapshot <CTID> pre-paperless-uv-migration"
65+ echo -e " 3. Start the container again\n"
66+
67+ read -rp " Have you created a snapshot? [y/N]: " confirm
68+ if [[ ! " $confirm " =~ ^([yY]| [yY][eE][sS])$ ]]; then
69+ msg_error " Migration aborted. Please create a snapshot first."
70+ exit 1
71+ fi
72+ msg_info " Migrating old Paperless-ngx installation to uv"
73+ rm -rf /opt/paperless/venv
74+ find /opt/paperless -name " __pycache__" -type d -exec rm -rf {} +
75+
76+ declare -A PATCHES=(
77+ [" paperless-consumer.service" ]=" ExecStart=uv run -- python manage.py document_consumer"
78+ [" paperless-scheduler.service" ]=" ExecStart=uv run -- celery --app paperless beat --loglevel INFO"
79+ [" paperless-task-queue.service" ]=" ExecStart=uv run -- celery --app paperless worker --loglevel INFO"
80+ [" paperless-webserver.service" ]=" ExecStart=uv run -- granian --interface asgi --ws \" paperless.asgi:application\" "
81+ )
82+
83+ for svc in " ${! PATCHES[@]} " ; do
84+ path=$( systemctl show -p FragmentPath " $svc " | cut -d= -f2)
85+ if [[ -n " $path " && -f " $path " ]]; then
86+ sed -i " s|^ExecStart=.*|${PATCHES[$svc]} |" " $path "
87+ if [[ " $svc " == " paperless-webserver.service" ]]; then
88+ grep -q " ^Environment=GRANIAN_HOST=" " $path " ||
89+ sed -i ' /^\[Service\]/a Environment=GRANIAN_HOST=::' " $path "
90+ grep -q " ^Environment=GRANIAN_PORT=" " $path " ||
91+ sed -i ' /^\[Service\]/a Environment=GRANIAN_PORT=8000' " $path "
92+ grep -q " ^Environment=GRANIAN_WORKERS=" " $path " ||
93+ sed -i ' /^\[Service\]/a Environment=GRANIAN_WORKERS=1' " $path "
94+ fi
95+ msg_ok " Patched $svc "
96+ else
97+ msg_error " Service file for $svc not found!"
98+ fi
99+ done
100+
101+ $STD systemctl daemon-reload
102+ msg_info " Backing up data"
103+ mkdir -p /opt/paperless/backup
104+ cp -r /opt/paperless/data /opt/paperless/backup/
105+ cp -r /opt/paperless/media /opt/paperless/backup/
106+ cp -r /opt/paperless/paperless.conf /opt/paperless/backup/
107+ msg_ok " Backup completed"
108+
109+ PYTHON_VERSION=" 3.13" setup_uv
110+ fetch_and_deploy_gh_release " paperless" " paperless-ngx/paperless-ngx" " prebuild" " latest" " /opt/paperless" " paperless*tar.xz"
111+ fetch_and_deploy_gh_release " jbig2enc" " ie13/jbig2enc" " tarball" " latest" " /opt/jbig2enc"
112+ setup_gs
113+
114+ msg_info " Updating Paperless-ngx"
115+ cp -r /opt/paperless/backup/* /opt/paperless/
116+ cd /opt/paperless
117+ $STD uv sync --all-extras
118+ cd /opt/paperless/src
119+ $STD uv run -- python manage.py migrate
120+ msg_ok " Paperless-ngx migration and update to ${RELEASE} completed"
80121 fi
81- exit
82- fi
83- if [ " $UPD " == " 2" ]; then
84- cat paperless.creds
85- exit
122+
123+ msg_info " Starting all Paperless-ngx Services"
124+ systemctl start paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue
125+ sleep 1
126+ msg_ok " Started all Paperless-ngx Services"
127+ msg_ok " Updated Successfully!\n"
128+ else
129+ msg_ok " No update required. ${APP} is already at v${RELEASE} "
86130 fi
131+ exit
87132}
88133
89134start
@@ -94,3 +139,4 @@ msg_ok "Completed Successfully!\n"
94139echo -e " ${CREATING}${GN}${APP} setup has been successfully initialized!${CL} "
95140echo -e " ${INFO}${YW} Access it using the following URL:${CL} "
96141echo -e " ${TAB}${GATEWAY}${BGN} http://${IP} :8000${CL} "
142+
0 commit comments