mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Transitions the Docker image to use s6 and s6-overlay for process supervision instead of supervisord (#8886)
This commit is contained in:
		
							
								
								
									
										8
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-complete/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										8
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-complete/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
| declare -r log_prefix="[init-complete]" | ||||
| declare -r end_time=$(date +%s) | ||||
| declare -r start_time=${PAPERLESS_START_TIME_S} | ||||
|  | ||||
| echo "${log_prefix} paperless-ngx docker container init completed in $(($end_time-$start_time)) seconds" | ||||
| echo "${log_prefix} Starting services" | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-complete/type
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-complete/type
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| oneshot | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-complete/up
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-complete/up
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| /etc/s6-overlay/s6-rc.d/init-complete/run | ||||
							
								
								
									
										44
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-custom-init/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										44
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-custom-init/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| declare -r log_prefix="[custom-init]" | ||||
|  | ||||
| # Mostly borrowed from the LinuxServer.io base image | ||||
| # https://github.com/linuxserver/docker-baseimage-ubuntu/tree/bionic/root/etc/cont-init.d | ||||
| declare -r custom_script_dir="/custom-cont-init.d" | ||||
|  | ||||
| # Tamper checking. | ||||
| # Don't run files which are owned by anyone except root | ||||
| # Don't run files which are writeable by others | ||||
| if [ -d "${custom_script_dir}" ]; then | ||||
| 	if [ -n "$(/usr/bin/find "${custom_script_dir}" -maxdepth 1 ! -user root)" ]; then | ||||
| 		echo "${log_prefix} **** Potential tampering with custom scripts detected ****" | ||||
| 		echo "${log_prefix} **** The folder '${custom_script_dir}' must be owned by root ****" | ||||
| 		exit 0 | ||||
| 	fi | ||||
| 	if [ -n "$(/usr/bin/find "${custom_script_dir}" -maxdepth 1 -perm -o+w)" ]; then | ||||
| 		echo "${log_prefix} **** The folder '${custom_script_dir}' or some of contents have write permissions for others, which is a security risk. ****" | ||||
| 		echo "${log_prefix} **** Please review the permissions and their contents to make sure they are owned by root, and can only be modified by root. ****" | ||||
| 		exit 0 | ||||
| 	fi | ||||
|  | ||||
| 	# Make sure custom init directory has files in it | ||||
| 	if [ -n "$(/bin/ls --almost-all "${custom_script_dir}" 2>/dev/null)" ]; then | ||||
| 		echo "${log_prefix} files found in ${custom_script_dir} executing" | ||||
| 		# Loop over files in the directory | ||||
| 		for SCRIPT in "${custom_script_dir}"/*; do | ||||
| 			NAME="$(basename "${SCRIPT}")" | ||||
| 			if [ -f "${SCRIPT}" ]; then | ||||
| 				echo "${log_prefix} ${NAME}: executing..." | ||||
| 				/command/with-contenv /bin/bash "${SCRIPT}" | ||||
| 				echo "${log_prefix} ${NAME}: exited $?" | ||||
| 			elif [ ! -f "${SCRIPT}" ]; then | ||||
| 				echo "${log_prefix} ${NAME}: is not a file" | ||||
| 			fi | ||||
| 		done | ||||
| 	else | ||||
| 		echo "${log_prefix} no custom files found exiting..." | ||||
| 	fi | ||||
| else | ||||
| 	echo "${log_prefix} ${custom_script_dir} doesn't exist, nothing to do" | ||||
| fi | ||||
| @@ -0,0 +1 @@ | ||||
| oneshot | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-custom-init/up
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-custom-init/up
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| /etc/s6-overlay/s6-rc.d/init-custom-init/run | ||||
							
								
								
									
										30
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-env-file/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										30
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-env-file/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| declare -r log_prefix="[env-init]" | ||||
|  | ||||
| echo "${log_prefix} Checking for environment from files" | ||||
|  | ||||
| if find /run/s6/container_environment/*"_FILE" -maxdepth 1 > /dev/null 2>&1; then | ||||
| 	for FILENAME in /run/s6/container_environment/*; do | ||||
| 		if [[ "${FILENAME##*/}" == PAPERLESS_*_FILE ]]; then | ||||
| 			# This should have been named different.. | ||||
| 			if [[ ${FILENAME} == "PAPERLESS_OCR_SKIP_ARCHIVE_FILE" || ${FILENAME} == "PAPERLESS_MODEL_FILE" ]]; then | ||||
| 				continue | ||||
| 			fi | ||||
| 			SECRETFILE=$(cat "${FILENAME}") | ||||
| 			# Check the file exists | ||||
| 			if [[ -f ${SECRETFILE} ]]; then | ||||
| 				# Trim off trailing _FILE | ||||
| 				FILESTRIP=${FILENAME//_FILE/} | ||||
| 				# Set environment variable | ||||
| 				cat "${SECRETFILE}" > "${FILESTRIP}" | ||||
| 				echo "${log_prefix} ${FILESTRIP##*/} set from ${FILENAME##*/}" | ||||
| 			else | ||||
| 				echo "${log_prefix} cannot find secret in ${FILENAME##*/}" | ||||
| 			fi | ||||
| 		fi | ||||
| 	done | ||||
| else | ||||
| 		echo "${log_prefix} No *_FILE environment found" | ||||
| fi | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-env-file/type
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-env-file/type
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| oneshot | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-env-file/up
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-env-file/up
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| /etc/s6-overlay/s6-rc.d/init-env-file/run | ||||
							
								
								
									
										33
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-folders/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										33
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-folders/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| declare -r log_prefix="[init-folders]" | ||||
|  | ||||
| declare -r export_dir="/usr/src/paperless/export" | ||||
| declare -r data_dir="${PAPERLESS_DATA_DIR:-/usr/src/paperless/data}" | ||||
| declare -r media_root_dir="${PAPERLESS_MEDIA_ROOT:-/usr/src/paperless/media}" | ||||
| declare -r consume_dir="${PAPERLESS_CONSUMPTION_DIR:-/usr/src/paperless/consume}" | ||||
| declare -r tmp_dir="${PAPERLESS_SCRATCH_DIR:=/tmp/paperless}" | ||||
|  | ||||
| echo "${log_prefix} Checking for folder existence" | ||||
|  | ||||
| for dir in \ | ||||
| 	"${export_dir}" \ | ||||
| 	"${data_dir}" "${data_dir}/index" \ | ||||
| 	"${media_root_dir}" "${media_root_dir}/documents" "${media_root_dir}/documents/originals" "${media_root_dir}/documents/thumbnails" \ | ||||
| 	"${consume_dir}" \ | ||||
| 	"${tmp_dir}"; do | ||||
| 	if [[ ! -d "${dir}" ]]; then | ||||
| 		mkdir --parents --verbose "${dir}" | ||||
| 	fi | ||||
| done | ||||
|  | ||||
| echo "${log_prefix} Adjusting file and folder permissions" | ||||
| for dir in \ | ||||
| 	"${export_dir}" \ | ||||
| 	"${data_dir}" \ | ||||
| 	"${media_root_dir}" \ | ||||
| 	"${consume_dir}" \ | ||||
| 	"${tmp_dir}"; do | ||||
| 	find "${dir}" -not \( -user paperless -and -group paperless \) -exec chown --changes paperless:paperless {} + | ||||
| done | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-folders/type
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-folders/type
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| oneshot | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-folders/up
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-folders/up
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| /etc/s6-overlay/s6-rc.d/init-folders/run | ||||
							
								
								
									
										20
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-migrations/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										20
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-migrations/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
| declare -r log_prefix="[init-migrations]" | ||||
| declare -r data_dir="${PAPERLESS_DATA_DIR:-/usr/src/paperless/data}" | ||||
|  | ||||
| ( | ||||
| 	# flock is in place to prevent multiple containers from doing migrations | ||||
| 	# simultaneously. This also ensures that the db is ready when the command | ||||
| 	# of the current container starts. | ||||
| 	flock 200 | ||||
| 	echo "${log_prefix} Apply database migrations..." | ||||
| 	cd "${PAPERLESS_SRC_DIR}" | ||||
|  | ||||
| 	if [[ -n "${USER_IS_NON_ROOT}" ]]; then | ||||
| 		exec python3 manage.py migrate --skip-checks --no-input | ||||
| 	else | ||||
| 		exec s6-setuidgid paperless python3 manage.py migrate --skip-checks --no-input | ||||
| 	fi | ||||
|  | ||||
| ) 200>"${data_dir}/migration_lock" | ||||
| @@ -0,0 +1 @@ | ||||
| oneshot | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-migrations/up
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-migrations/up
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| /etc/s6-overlay/s6-rc.d/init-migrations/run | ||||
							
								
								
									
										22
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										22
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
| declare -r log_prefix="[init-user]" | ||||
|  | ||||
| declare -r usermap_original_uid=$(id -u paperless) | ||||
| declare -r usermap_original_gid=$(id -g paperless) | ||||
| declare -r usermap_new_uid=${USERMAP_UID:-$usermap_original_uid} | ||||
| declare -r usermap_new_gid=${USERMAP_GID:-${usermap_original_gid:-$usermap_new_uid}} | ||||
|  | ||||
| if [[ ${usermap_new_uid} != "${usermap_original_uid}" ]]; then | ||||
| 	echo "${log_prefix} Mapping UID for paperless to $usermap_new_uid" | ||||
| 	usermod --non-unique --uid "${usermap_new_uid}" paperless | ||||
| else | ||||
| 	echo "${log_prefix} No UID changes for paperless" | ||||
| fi | ||||
|  | ||||
| if [[ ${usermap_new_gid} != "${usermap_original_gid}" ]]; then | ||||
| 	echo "${log_prefix} Mapping GID for paperless to $usermap_new_gid" | ||||
| 	groupmod --non-unique --gid "${usermap_new_gid}" paperless | ||||
| else | ||||
| 	echo "${log_prefix} No GID changes for paperless" | ||||
| fi | ||||
| @@ -0,0 +1 @@ | ||||
| oneshot | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/up
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-modify-user/up
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| /etc/s6-overlay/s6-rc.d/init-modify-user/run | ||||
							
								
								
									
										28
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-search-index/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										28
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-search-index/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| declare -r log_prefix="[init-index]" | ||||
|  | ||||
| declare -r index_version=9 | ||||
| declare -r data_dir="${PAPERLESS_DATA_DIR:-/usr/src/paperless/data}" | ||||
| declare -r index_version_file="${data_dir}/.index_version" | ||||
|  | ||||
| update_index () { | ||||
| 	echo "${log_prefix} Search index out of date. Updating..." | ||||
| 	cd "${PAPERLESS_SRC_DIR}" | ||||
| 	if [[ -n "${USER_IS_NON_ROOT}" ]]; then | ||||
| 		python3 manage.py document_index reindex --no-progress-bar | ||||
| 		echo ${index_version} | tee "${index_version_file}" > /dev/null | ||||
| 	else | ||||
| 		s6-setuidgid paperless python3 manage.py document_index reindex --no-progress-bar | ||||
| 		echo ${index_version} | s6-setuidgid paperless tee "${index_version_file}" > /dev/null | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| if [[ (! -f "${index_version_file}") ]]; then | ||||
| 	echo "${log_prefix} No index version file found" | ||||
| 	update_index | ||||
| elif [[ $(<"${index_version_file}") != "$index_version" ]]; then | ||||
| 	echo "${log_prefix} index version updated" | ||||
| 	update_index | ||||
| fi | ||||
| @@ -0,0 +1 @@ | ||||
| oneshot | ||||
| @@ -0,0 +1 @@ | ||||
| /etc/s6-overlay/s6-rc.d/init-search-index/run | ||||
							
								
								
									
										19
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-start/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										19
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-start/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| declare -r log_prefix="[init-start]" | ||||
|  | ||||
| echo "${log_prefix} paperless-ngx docker container starting..." | ||||
|  | ||||
| # Set some directories into environment for other steps to access via environment | ||||
| # Sort of like variables for later | ||||
| printf "/usr/src/paperless/src" > /var/run/s6/container_environment/PAPERLESS_SRC_DIR | ||||
| echo $(date +%s) > /var/run/s6/container_environment/PAPERLESS_START_TIME_S | ||||
|  | ||||
| # Check if we're starting as a non-root user | ||||
| if [ $(id -u) == $(id -u paperless) ]; then | ||||
| 	printf "true" > /var/run/s6/container_environment/USER_IS_NON_ROOT | ||||
| 	echo "${log_prefix}  paperless-ngx docker container running under a user" | ||||
| else | ||||
| 	echo "${log_prefix}  paperless-ngx docker container starting init as root" | ||||
| fi | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-start/type
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-start/type
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| oneshot | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-start/up
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-start/up
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| /etc/s6-overlay/s6-rc.d/init-start/run | ||||
							
								
								
									
										20
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-superuser/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										20
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-superuser/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| declare -r log_prefix="[init-superuser]" | ||||
|  | ||||
| if [[ -n "${PAPERLESS_ADMIN_USER}" ]]; then | ||||
| 	echo "${log_prefix} Creating superuser..." | ||||
| 	cd "${PAPERLESS_SRC_DIR}" | ||||
|  | ||||
| 	if [[ -n "${USER_IS_NON_ROOT}" ]]; then | ||||
| 		python3 manage.py manage_superuser | ||||
| 	else | ||||
| 		s6-setuidgid paperless python3 manage.py manage_superuser | ||||
| 	fi | ||||
|  | ||||
| 	echo "${log_prefix} Superuser creation done" | ||||
|  | ||||
| else | ||||
| 	echo "${log_prefix} Not creating superuser" | ||||
| fi | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-superuser/type
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-superuser/type
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| oneshot | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-superuser/up
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-superuser/up
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| /etc/s6-overlay/s6-rc.d/init-superuser/run | ||||
							
								
								
									
										15
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-system-checks/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										15
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-system-checks/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| declare -r log_prefix="[init-checks]" | ||||
|  | ||||
| # Explicitly run the Django system checks | ||||
| echo "${log_prefix} Running Django checks" | ||||
|  | ||||
| cd "${PAPERLESS_SRC_DIR}" | ||||
|  | ||||
| if [[ -n "${USER_IS_NON_ROOT}" ]]; then | ||||
| 	python3 manage.py check | ||||
| else | ||||
| 	s6-setuidgid paperless python3 manage.py check | ||||
| fi | ||||
| @@ -0,0 +1 @@ | ||||
| oneshot | ||||
| @@ -0,0 +1 @@ | ||||
| /etc/s6-overlay/s6-rc.d/init-system-checks/run | ||||
							
								
								
									
										65
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-tesseract-langs/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										65
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-tesseract-langs/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| declare -r log_prefix="[init-tesseract-langs]" | ||||
|  | ||||
| install_languages() { | ||||
| 	echo "Installing languages..." | ||||
|  | ||||
| 	read -ra langs <<<"$1" | ||||
|  | ||||
| 	# Check that it is not empty | ||||
| 	if [ ${#langs[@]} -eq 0 ]; then | ||||
| 		return | ||||
| 	fi | ||||
|  | ||||
| 	# Build list of packages to install | ||||
| 	to_install=() | ||||
| 	for lang in "${langs[@]}"; do | ||||
| 		pkg="tesseract-ocr-$lang" | ||||
|  | ||||
| 		if dpkg --status "$pkg" &>/dev/null; then | ||||
| 			echo "${log_prefix} Package $pkg already installed!" | ||||
| 			continue | ||||
| 		else | ||||
| 			to_install+=("$pkg") | ||||
| 		fi | ||||
| 	done | ||||
|  | ||||
| 	# Use apt only when we install packages | ||||
| 	if [ ${#to_install[@]} -gt 0 ]; then | ||||
|  | ||||
| 		# Warn the user if they're not root, but try anyway | ||||
| 		if [[ -n "${USER_IS_NON_ROOT}" ]]; then | ||||
| 			echo "${log_prefix} ERROR: Unable to install language ${pkg} as non-root, startup may fail" | ||||
| 		fi | ||||
|  | ||||
| 		apt-get --quiet update &>/dev/null | ||||
|  | ||||
| 		for pkg in "${to_install[@]}"; do | ||||
| 			if ! apt-cache --quiet show "$pkg" &>/dev/null; then | ||||
| 				echo "${log_prefix} Skipped $pkg: Package not found! :(" | ||||
| 				continue | ||||
| 			fi | ||||
| 			echo "${log_prefix} Installing package $pkg..." | ||||
| 			if ! apt-get --quiet --assume-yes install "$pkg" &>/dev/null; then | ||||
| 				echo "${log_prefix} Could not install $pkg" | ||||
| 				exit 1 | ||||
| 			else | ||||
| 				echo "${log_prefix} Installed $pkg" | ||||
| 			fi | ||||
| 		done | ||||
|  | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| echo "${log_prefix} Checking if additional teseract languages needed" | ||||
|  | ||||
| # Install additional languages if specified | ||||
| if [[ -n "$PAPERLESS_OCR_LANGUAGES" ]]; then | ||||
|  | ||||
| 	install_languages "$PAPERLESS_OCR_LANGUAGES" | ||||
| 	echo "${log_prefix} Additional packages installed" | ||||
| else | ||||
| 	echo "${log_prefix} No additional installs requested" | ||||
| fi | ||||
| @@ -0,0 +1 @@ | ||||
| oneshot | ||||
| @@ -0,0 +1 @@ | ||||
| /etc/s6-overlay/s6-rc.d/init-tesseract-langs/run | ||||
							
								
								
									
										70
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-wait-for-db/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										70
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-wait-for-db/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| declare -r log_prefix="[init-db-wait]" | ||||
|  | ||||
| wait_for_postgres() { | ||||
| 	local attempt_num=1 | ||||
| 	local -r max_attempts=5 | ||||
|  | ||||
| 	echo "${log_prefix} Waiting for PostgreSQL to start..." | ||||
|  | ||||
| 	local -r host="${PAPERLESS_DBHOST:-localhost}" | ||||
| 	local -r port="${PAPERLESS_DBPORT:-5432}" | ||||
| 	local -r user="${PAPERLESS_DBUSER:-paperless}" | ||||
|  | ||||
| 	# Disable warning, host and port can't have spaces | ||||
| 	# shellcheck disable=SC2086 | ||||
| 	while [ ! "$(pg_isready -h ${host} -p ${port} --username ${user})" ]; do | ||||
|  | ||||
| 		if [ $attempt_num -eq $max_attempts ]; then | ||||
| 			echo "${log_prefix} Unable to connect to database." | ||||
| 			exit 1 | ||||
| 		else | ||||
| 			echo "${log_prefix} Attempt $attempt_num failed! Trying again in 5 seconds..." | ||||
| 		fi | ||||
|  | ||||
| 		attempt_num=$(("$attempt_num" + 1)) | ||||
| 		sleep 5 | ||||
| 	done | ||||
| 	# Extra in case this is a first start | ||||
| 	sleep 5 | ||||
| 	echo "Connected to PostgreSQL" | ||||
| } | ||||
|  | ||||
| wait_for_mariadb() { | ||||
| 	echo "${log_prefix} Waiting for MariaDB to start..." | ||||
|  | ||||
| 	local -r host="${PAPERLESS_DBHOST:=localhost}" | ||||
| 	local -r port="${PAPERLESS_DBPORT:=3306}" | ||||
|  | ||||
| 	local attempt_num=1 | ||||
| 	local -r max_attempts=5 | ||||
|  | ||||
| 	# Disable warning, host and port can't have spaces | ||||
| 	# shellcheck disable=SC2086 | ||||
| 	while ! true > /dev/tcp/$host/$port; do | ||||
|  | ||||
| 		if [ $attempt_num -eq $max_attempts ]; then | ||||
| 			echo "${log_prefix} Unable to connect to database." | ||||
| 			exit 1 | ||||
| 		else | ||||
| 			echo "${log_prefix} Attempt $attempt_num failed! Trying again in 5 seconds..." | ||||
|  | ||||
| 		fi | ||||
|  | ||||
| 		attempt_num=$(("$attempt_num" + 1)) | ||||
| 		sleep 5 | ||||
| 	done | ||||
| 	echo "Connected to MariaDB" | ||||
| } | ||||
|  | ||||
| if [[ "${PAPERLESS_DBENGINE}" == "mariadb" ]]; then | ||||
| 	echo "${log_prefix} Waiting for MariaDB to report ready" | ||||
| 	wait_for_mariadb | ||||
| elif [[ -n "${PAPERLESS_DBHOST}" ]]; then | ||||
| 	echo "${log_prefix} Waiting for postgresql to report ready" | ||||
| 	wait_for_postgres | ||||
| fi | ||||
|  | ||||
| 	echo "${log_prefix} Database is ready" | ||||
| @@ -0,0 +1 @@ | ||||
| oneshot | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-wait-for-db/up
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-wait-for-db/up
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| /etc/s6-overlay/s6-rc.d/init-wait-for-db/run | ||||
							
								
								
									
										14
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-wait-for-redis/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										14
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/init-wait-for-redis/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| declare -r log_prefix="[init-redis-wait]" | ||||
|  | ||||
| echo "${log_prefix} Waiting for Redis to report ready" | ||||
|  | ||||
| # We use a Python script to send the Redis ping | ||||
| # instead of installing redis-tools just for 1 thing | ||||
| if ! python3 /usr/local/bin/wait-for-redis.py; then | ||||
| 	exit 1 | ||||
| else | ||||
| 	echo "${log_prefix} Redis ready" | ||||
| fi | ||||
| @@ -0,0 +1 @@ | ||||
| oneshot | ||||
| @@ -0,0 +1 @@ | ||||
| /etc/s6-overlay/s6-rc.d/init-wait-for-redis/run | ||||
							
								
								
									
										10
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										10
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| cd ${PAPERLESS_SRC_DIR} | ||||
|  | ||||
| if [[ -n "${USER_IS_NON_ROOT}" ]]; then | ||||
| 	exec python3 manage.py document_consumer | ||||
| else | ||||
| 	exec s6-setuidgid paperless python3 manage.py document_consumer | ||||
| fi | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/type
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/type
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| longrun | ||||
							
								
								
									
										24
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										24
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| declare -r log_prefix="[svc-flower]" | ||||
|  | ||||
| echo "${log_prefix} Checking if we should start flower..." | ||||
|  | ||||
| if [[ -n "${PAPERLESS_ENABLE_FLOWER}" ]]; then | ||||
| 	# Small delay to allow celery to be up first | ||||
| 	echo "${log_prefix} Starting flower in 5s" | ||||
| 	sleep 5 | ||||
| 	cd ${PAPERLESS_SRC_DIR} | ||||
|  | ||||
| 	if [[ -n "${USER_IS_NON_ROOT}" ]]; then | ||||
| 		exec /usr/local/bin/celery --app paperless flower --conf=${PAPERLESS_SRC_DIR}/paperless/flowerconfig.py | ||||
| 	else | ||||
| 		exec s6-setuidgid paperless /usr/local/bin/celery --app paperless flower --conf=${PAPERLESS_SRC_DIR}/paperless/flowerconfig.py | ||||
| 	fi | ||||
|  | ||||
| else | ||||
| 	echo "${log_prefix} Not starting flower" | ||||
| 	# https://skarnet.org/software/s6/s6-svc.html | ||||
| 	s6-svc -Od . | ||||
| fi | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/type
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/type
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| longrun | ||||
							
								
								
									
										10
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-scheduler/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										10
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-scheduler/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| cd ${PAPERLESS_SRC_DIR} | ||||
|  | ||||
| if [[ -n "${USER_IS_NON_ROOT}" ]]; then | ||||
| 	exec /usr/local/bin/celery --app paperless beat --loglevel INFO | ||||
| else | ||||
| 	exec s6-setuidgid paperless /usr/local/bin/celery --app paperless beat --loglevel INFO | ||||
| fi | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-scheduler/type
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-scheduler/type
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| longrun | ||||
							
								
								
									
										10
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										10
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| cd ${PAPERLESS_SRC_DIR} | ||||
|  | ||||
| if [[ -n "${USER_IS_NON_ROOT}" ]]; then | ||||
| 	exec /usr/local/bin/gunicorn -c /usr/src/paperless/gunicorn.conf.py paperless.asgi:application | ||||
| else | ||||
| 	exec s6-setuidgid paperless /usr/local/bin/gunicorn -c /usr/src/paperless/gunicorn.conf.py paperless.asgi:application | ||||
| fi | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/type
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/type
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| longrun | ||||
							
								
								
									
										10
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/run
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										10
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/run
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| #!/command/with-contenv /usr/bin/bash | ||||
| # shellcheck shell=bash | ||||
|  | ||||
| cd ${PAPERLESS_SRC_DIR} | ||||
|  | ||||
| if [[ -n "${USER_IS_NON_ROOT}" ]]; then | ||||
| 	exec /usr/local/bin/celery --app paperless worker --loglevel INFO --without-mingle --without-gossip | ||||
| else | ||||
| 	exec s6-setuidgid paperless /usr/local/bin/celery --app paperless worker --loglevel INFO --without-mingle --without-gossip | ||||
| fi | ||||
							
								
								
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/type
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/type
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| longrun | ||||
		Reference in New Issue
	
	Block a user
	 Trenton H
					Trenton H