Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 24 additions & 22 deletions build.profile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
BUILD_TAG=2.18.4
BUILD_TAG=2.19.4

BUILD_paperless=paperless-ngx-2.18.4
BUILD_paperless=paperless-ngx-2.19.4

BUILD_DIR=build
BUILD_SRC="${PWD}"
Expand All @@ -16,22 +16,22 @@ TMPDIR=${TMPDIR:-/tmp/${USER}/${BUILD_TAG}}
LOGDIR=${PROJECT}/log

# https://sqlite.org
# wget "https://sqlite.org/2025/sqlite-autoconf-3500400.tar.gz"
BUILD_sqlite=sqlite-3.50.4
BUILD_sqlite_SRCURL="https://beehive.molgen.mpg.de/d74bbdca4ab1b2bd46d3b3f8dbb0f3db/sqlite-autoconf-3500400.tar.gz"
# wget "https://sqlite.org/2025/sqlite-autoconf-3510000.tar.gz"
BUILD_sqlite=sqlite-3.51.0
BUILD_sqlite_SRCURL="https://beehive.molgen.mpg.de/cfcf0004cb6893d2555b33d89ff39cb6/sqlite-autoconf-3510000.tar.gz"

# https://download.redis.io/releases # community edition !
# wget https://download.redis.io/releases/redis-7.4.1.tar.gz
BUILD_redis=redis-7.4.1
BUILD_redis_SRCURL="https://beehive.molgen.mpg.de/360809807c15da120affb356e55c6388/${BUILD_redis}.tar.gz"

# wget "https://www.python.org/ftp/python/3.12.11/Python-3.12.11.tgz"
BUILD_python=Python-3.12.11
BUILD_python_SRCURL="https://beehive.molgen.mpg.de/45bda920329568dd6650b0ac556d17db/${BUILD_python}.tgz"
# wget "https://www.python.org/ftp/python/3.12.12/Python-3.12.12.tgz"
BUILD_python=Python-3.12.12
BUILD_python_SRCURL="https://beehive.molgen.mpg.de/4fcf63eed7dd8dd3f0d00cfd5921a681/${BUILD_python}.tgz"

# wget "https://nodejs.org/download/release/v22.19.0/node-v22.19.0.tar.gz"
BUILD_node=node-22.19.0
BUILD_node_SRCURL="https://beehive.molgen.mpg.de/6ac4e94a698f90ae2b2fb99ee1672387/${BUILD_node/-/-v}.tar.gz"
# wget "https://nodejs.org/download/release/v24.11.0/node-v24.11.0.tar.gz"
BUILD_node=node-24.11.0
BUILD_node_SRCURL="https://beehive.molgen.mpg.de/afcf29e7e5a89a7e3776fcf4ed7cb97a/${BUILD_node/-/-v}.tar.gz"

# SRCURL="https://ffmpeg.org//releases/${BUILD_ffmpeg}.tar.gz"
BUILD_ffmpeg=ffmpeg-8.0
Expand All @@ -41,9 +41,9 @@ BUILD_ffmpeg_SRCURL="https://beehive.molgen.mpg.de/74bb5dbf6c2b35ab50aad7a939ef3
BUILD_zbar=zbar-0.23.93
BUILD_zbar_SRCURL="https://beehive.molgen.mpg.de/3f69d17f6495de023b59b3539ce5e605/${BUILD_zbar}.tar.gz"

# SRCURL="https://github.com/DanBloomberg/leptonica/releases/download/1.85.0/leptonica-1.85.0.tar.gz"
BUILD_leptonica=leptonica-1.85.0
BUILD_leptonica_SRCURL="https://beehive.molgen.mpg.de/1732e999e2fef8721348edc2b7283224/${BUILD_leptonica}.tar.gz"
# wget "https://github.com/DanBloomberg/leptonica/releases/download/1.86.0/leptonica-1.86.0.tar.gz"
BUILD_leptonica=leptonica-1.86.0
BUILD_leptonica_SRCURL="https://beehive.molgen.mpg.de/28f7510d2990f281c75a095d3284f2a9/${BUILD_leptonica}.tar.gz"

# SRCURL="https://nginx.org/download/nginx-1.27.3.tar.gz"
BUILD_nginx=nginx-1.27.3
Expand All @@ -53,9 +53,9 @@ BUILD_nginx_SRCURL="https://beehive.molgen.mpg.de/89773c781ff0c2cd876b03bbc094c2
BUILD_libfontttf=liberation-fonts-ttf-2.1.5
BUILD_libfontttf_SRCURL="https://beehive.molgen.mpg.de/31b453e0b77bacde410a34a725b34f8a/${BUILD_libfontttf}.tar.gz"

# SRCURL="https://download.osgeo.org/libtiff/tiff-4.7.0.tar.gz"/${BUILD_ffmpeg}.tar.gz"
BUILD_libtiff=tiff-4.7.0
BUILD_libtiff_SRCURL="https://beehive.molgen.mpg.de/3a0fa4a270a4a192b08913f88d0cfbdd/${BUILD_libtiff}.tar.gz"
# wget "https://download.osgeo.org/libtiff/tiff-4.7.1.tar.gz"
BUILD_libtiff=tiff-4.7.1
BUILD_libtiff_SRCURL="https://beehive.molgen.mpg.de/f1044dd3b4466cc53464210148e08146/${BUILD_libtiff}.tar.gz"

# SRCURL="https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/3.1.2/libjpeg-turbo-3.1.2.tar.gz"
BUILD_libjpegturbo=libjpegturbo-3.1.2
Expand All @@ -65,14 +65,15 @@ BUILD_libjpegturbo_SRCURL="https://beehive.molgen.mpg.de/6f4780b95edde615c34de51
BUILD_libwebp=libwebp-1.6.0
BUILD_libwebp_SRCURL="https://beehive.molgen.mpg.de/cceb6447180f961473b181c9ef38b630/${BUILD_libwebp}.tar.gz"

# wget "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs100501/ghostscript-${PKGVERSION}.tar.gz"
BUILD_ghostscript=ghostscript-10.05.1
BUILD_ghostscript_SRCURL="https://beehive.molgen.mpg.de/40d4284b50b5d6ecc61533e3fdf2ee13/${BUILD_ghostscript}.tar.gz"
# wget "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10060/ghostscript-10.06.0.tar.gz"
BUILD_ghostscript=ghostscript-10.06.0
BUILD_ghostscript_SRCURL="https://beehive.molgen.mpg.de/d472f289582b209731954642bd34ca86/${BUILD_ghostscript}.tar.gz"

# gits
BUILD_imagemagick=imagemagick-7.1.2-3
BUILD_imagemagick=imagemagick-7.1.2-8
BUILD_imagemagick_SRCURL="https://github.com/ImageMagick/ImageMagick.git"

# git clone / git describe
BUILD_pngquant=pngquant-3.0.3-8-ge3bdc7c
BUILD_pngquant_SRCURL="https://github.com/kornelski/pngquant.git"

Expand All @@ -86,7 +87,8 @@ BUILD_tessdata=tessdata_best-4.1.0
BUILD_tessdata_SRCURL="https://github.com/tesseract-ocr/tessdata_best.git"
BUILD_tessconfigs_SRCURL="https://github.com/tesseract-ocr/tessconfigs.git"

BUILD_jbig2enc=jbig2enc-0.30-14-g6019f5f
# git clone / git describe
BUILD_jbig2enc=jbig2enc-0.30-16
BUILD_jbig2enc_SRCURL="https://github.com/agl/jbig2enc.git"

BUILD_jbig2dec=jbig2dec-0.20
Expand Down
3 changes: 2 additions & 1 deletion paperless-ngx.build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ uv pip install --system --no-python-downloads --python-preference system --requi

./manage.py compilemessages

./manage.py migrate
# migration done by startstop.sh
# ./manage.py migrate

PAPERLESS_ADMIN_USER=${PAPERLESS_ADMIN_USER:-admin}
PAPERLESS_ADMIN_PASSWORD=${PAPERLESS_ADMIN_PASSWORD:-$(</dev/urandom tr -dc '[:lower:][:upper:][:digit:]' | head -c64)}
Expand Down
23 changes: 23 additions & 0 deletions runifchanged.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#!/usr/bin/bash
#set -x
set -e
set -u

# cmd=${1:-$0}
declare -a cmd
cmd=("${@}")
declare -p cmd

# inotifywait --monitor $cmd --event CLOSE_WRITE
echo "# run on CLOSE_WRITE: ${cmd[@]}"
_opts=(
--event CLOSE_WRITE
# --quiet
# --quiet
)

set -x
inotifywait -m "${_opts[@]}" "${cmd[@]}" |
while read file event; do
"${file}"
done
87 changes: 64 additions & 23 deletions startstop.build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ set -u

TO=${PROJECT}/startstop.sh

echo "# updating ${TO} ..."

install -m 755 <( cat <<_EOP_
#!/bin/bash
set -e
Expand All @@ -19,12 +21,14 @@ function rm_pidfiles() {
rm -fv "\${PIDFILE}" "\${PGIDFILE}" "\${@}"
}

function pwait() {
if [[ -x /usr/bin/pwait ]]; then
/usr/bin/pwait "\${@}"
else
pidwait "\${@}"
fi
pspids() {
local pids=("\$@")
cmd="ps -o user,tty,pid,ppid,pgrp,pcpu,pmem,etime,args"
for pid in "\${pids[@]}"; do
cmd+=" --pid \$pid --ppid \$pid -ww"
done
# echo \$cmd
\$cmd
}

#### nginx ####
Expand Down Expand Up @@ -65,6 +69,20 @@ srv_redis_start() {
redis-server "\${_opts[@]}"
}

srv_redis_waitup() {
local _opts=(
-s "${DEVSHM}/redis.sock"
)
local WT=\${SECONDS}
until ( redis-cli "\${_opts[@]}" ping 2>>/dev/null ); do
echo "(\$\$) waiting for redis to be ready..."
sleep 1
done
local WT=\$((\${SECONDS}-\${WT}))
[[ \${WT} > 1 ]] && echo "\${FUNCNAME[0]} took \${WT} seconds"
: # essential due to -e
}

#### granian ####

srv_granian_start() {
Expand Down Expand Up @@ -95,46 +113,61 @@ srv_granian_waitup() {
done
}

#### consumer ####
#### worker ####

srv_consumer_start() {
srv_worker_start() {

trap rm_pidfiles EXIT

cd "${PROJECT}/paperless-ngx/src"

srv_migrate

srv_nginx_waitup

./manage.py document_consumer
celery --app paperless worker --loglevel WARNING
}

#### scheduler ####
srv_worker_waitup() {
cd "${PROJECT}/paperless-ngx/src"
until ( celery --app paperless status ); do
echo "waiting for worker to be ready..."
sleep 1
done
}

srv_scheduler_start() {
#### consumer ####

srv_consumer_start() {

trap rm_pidfiles EXIT
srv_worker_waitup

cd "${PROJECT}/paperless-ngx/src"
srv_nginx_waitup

celery --app paperless beat --loglevel INFO
./manage.py document_consumer
}

#### worker ####
#### scheduler ####

srv_worker_start() {
srv_scheduler_start() {

trap rm_pidfiles EXIT
srv_worker_waitup

cd "${PROJECT}/paperless-ngx/src"
srv_nginx_waitup

celery --app paperless worker --loglevel WARNING
celery --app paperless beat --loglevel INFO
}

#### migrate ####

srv_migrate() {

srv_redis_waitup

pushd "${PROJECT}/paperless-ngx/src"

_opts=(
Expand All @@ -152,21 +185,28 @@ srv_migrate() {
#### generic ####

srv_generic_status() {
echo "### \${srv}"
local logf="${LOGDIR}/srv-\${srv}.log"
if [[ -e \${logf} ]]; then
echo "# \${logf}"
else
echo
fi
if [[ -s "\${PGIDFILE}" ]]; then
local pgid
read -a pgid < "\${PGIDFILE}"
local pids
pids=\$(pgrep -g \${pgid})
pids=\$(pgrep --pgroup \${pgid})
if [[ \$? = 0 ]]; then
ps -f --pid \${pids}
pspids \${pids}
else
echo "processs group \${pgid} has no running processes for \${PGIDFILE}"
fi
else
if [[ -s "\${PIDFILE}" ]]; then
local pid
read -a pid < "\${PIDFILE}"
ps -f --pid \${pid} --ppid \${pid}
pspids \${pid}
else
echo "# no pgid or pid file found: \${PGIDFILE} \${PIDFILE}"
fi
Expand Down Expand Up @@ -213,11 +253,10 @@ srv_generic_stop() {
if [[ -s "\${PGIDFILE}" ]]; then
local pgid
read -a pgid < "\${PGIDFILE}"||:
echo "killing process group \${pgid}"
# echo "killing process group \${pgid}"
KT=\${SECONDS}
kill -- -\${pgid}||:
printf "waiting for pgid %5d (%s) to die\n" \${pgid} \${srv}
pwait --pgroup \${pgid}||:
while kill -0 -"\${pgid}" > /dev/null 2>&1; do
sleep 1
done
Expand Down Expand Up @@ -254,9 +293,9 @@ srv="\${2:-all}"
if [[ \${srv} = 'all' ]]; then
_srv=(redis granian nginx consumer scheduler worker)

if [[ \${cmd} = 'start' ]]; then
srv_migrate
fi
# if [[ \${cmd} = 'start' ]]; then
# srv_migrate
# fi

# poor mans reverse
if [[ \${cmd} = 'stop' ]]; then
Expand Down Expand Up @@ -309,3 +348,5 @@ echo "#### oh no... ####"

_EOP_
) "${TO}"

echo "# done."