#!/usr/bin/env bash set -e # Source: https://github.com/sameersbn/docker-gitlab/ map_uidgid() { local -r usermap_original_uid=$(id -u paperless) local -r usermap_original_gid=$(id -g paperless) local -r usermap_new_uid=${USERMAP_UID:-$usermap_original_uid} local -r usermap_new_gid=${USERMAP_GID:-${usermap_original_gid:-$usermap_new_uid}} if [[ ${usermap_new_uid} != "${usermap_original_uid}" || ${usermap_new_gid} != "${usermap_original_gid}" ]]; then echo "Mapping UID and GID for paperless:paperless to $usermap_new_uid:$usermap_new_gid" usermod --non-unique --uid "${usermap_new_uid}" paperless groupmod --non-unique --gid "${usermap_new_gid}" paperless fi } map_folders() { # Export these so they can be used in docker-prepare.sh export DATA_DIR="${PAPERLESS_DATA_DIR:-/usr/src/paperless/data}" export MEDIA_ROOT_DIR="${PAPERLESS_MEDIA_ROOT:-/usr/src/paperless/media}" export CONSUME_DIR="${PAPERLESS_CONSUMPTION_DIR:-/usr/src/paperless/consume}" } custom_container_init() { # Mostly borrowed from the LinuxServer.io base image # https://github.com/linuxserver/docker-baseimage-ubuntu/tree/bionic/root/etc/cont-init.d local -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 "**** Potential tampering with custom scripts detected ****" echo "**** The folder '${custom_script_dir}' must be owned by root ****" return 0 fi if [ -n "$(/usr/bin/find "${custom_script_dir}" -maxdepth 1 -perm -o+w)" ]; then echo "**** The folder '${custom_script_dir}' or some of contents have write permissions for others, which is a security risk. ****" echo "**** Please review the permissions and their contents to make sure they are owned by root, and can only be modified by root. ****" return 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 "[custom-init] 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 "[custom-init] ${NAME}: executing..." /bin/bash "${SCRIPT}" echo "[custom-init] ${NAME}: exited $?" elif [ ! -f "${SCRIPT}" ]; then echo "[custom-init] ${NAME}: is not a file" fi done else echo "[custom-init] no custom files found exiting..." fi fi } initialize() { # Setup environment from secrets before anything else # Check for a version of this var with _FILE appended # and convert the contents to the env var value # Source it so export is persistent # shellcheck disable=SC1091 source /sbin/env-from-file.sh # Change the user and group IDs if needed map_uidgid # Check for overrides of certain folders map_folders local -r export_dir="/usr/src/paperless/export" 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}"; do if [[ ! -d "${dir}" ]]; then echo "Creating directory ${dir}" mkdir --parents --verbose "${dir}" fi done local -r tmp_dir="${PAPERLESS_SCRATCH_DIR:=/tmp/paperless}" echo "Creating directory scratch directory ${tmp_dir}" mkdir --parents --verbose "${tmp_dir}" set +e echo "Adjusting permissions of paperless files. This may take a while." chown -R paperless:paperless "${tmp_dir}" for dir in \ "${export_dir}" \ "${DATA_DIR}" \ "${MEDIA_ROOT_DIR}" \ "${CONSUME_DIR}"; do find "${dir}" -not \( -user paperless -and -group paperless \) -exec chown --changes paperless:paperless {} + done set -e "${gosu_cmd[@]}" /sbin/docker-prepare.sh # Leave this last thing custom_container_init } 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 "Package $pkg already installed!" continue else to_install+=("$pkg") fi done # Use apt only when we install packages if [ ${#to_install[@]} -gt 0 ]; then apt-get update for pkg in "${to_install[@]}"; do if ! apt-cache show "$pkg" &>/dev/null; then echo "Skipped $pkg: Package not found! :(" continue fi echo "Installing package $pkg..." if ! apt-get --assume-yes install "$pkg" &>/dev/null; then echo "Could not install $pkg" exit 1 fi done fi } echo "Paperless-ngx docker container starting..." gosu_cmd=(gosu paperless) if [ "$(id --user)" == "$(id --user paperless)" ]; then gosu_cmd=() fi # Install additional languages if specified if [[ -n "$PAPERLESS_OCR_LANGUAGES" ]]; then install_languages "$PAPERLESS_OCR_LANGUAGES" fi initialize if [[ "$1" != "/"* ]]; then echo Executing management command "$@" exec "${gosu_cmd[@]}" python3 manage.py "$@" else echo Executing "$@" exec "$@" fi