mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-04-02 13:45:10 -05:00
195 lines
4.8 KiB
Bash
Executable File
195 lines
4.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -e
|
|
|
|
# Adapted from:
|
|
# https://github.com/docker-library/postgres/blob/master/docker-entrypoint.sh
|
|
# usage: file_env VAR
|
|
# ie: file_env 'XYZ_DB_PASSWORD' will allow for "$XYZ_DB_PASSWORD_FILE" to
|
|
# fill in the value of "$XYZ_DB_PASSWORD" from a file, especially for Docker's
|
|
# secrets feature
|
|
file_env() {
|
|
local var="$1"
|
|
local fileVar="${var}_FILE"
|
|
|
|
# Basic validation
|
|
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
|
echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
|
|
exit 1
|
|
fi
|
|
|
|
# Only export var if the _FILE exists
|
|
if [ "${!fileVar:-}" ]; then
|
|
# And the file exists
|
|
if [[ -f ${!fileVar} ]]; then
|
|
echo "Setting ${var} from file"
|
|
val="$(< "${!fileVar}")"
|
|
export "$var"="$val"
|
|
else
|
|
echo "File ${!fileVar} doesn't exist"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
}
|
|
|
|
# Source: https://github.com/sameersbn/docker-gitlab/
|
|
map_uidgid() {
|
|
USERMAP_ORIG_UID=$(id -u paperless)
|
|
USERMAP_ORIG_GID=$(id -g paperless)
|
|
USERMAP_NEW_UID=${USERMAP_UID:-$USERMAP_ORIG_UID}
|
|
USERMAP_NEW_GID=${USERMAP_GID:-${USERMAP_ORIG_GID:-$USERMAP_NEW_UID}}
|
|
if [[ ${USERMAP_NEW_UID} != "${USERMAP_ORIG_UID}" || ${USERMAP_NEW_GID} != "${USERMAP_ORIG_GID}" ]]; then
|
|
echo "Mapping UID and GID for paperless:paperless to $USERMAP_NEW_UID:$USERMAP_NEW_GID"
|
|
usermod -o -u "${USERMAP_NEW_UID}" paperless
|
|
groupmod -o -g "${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}"
|
|
}
|
|
|
|
nltk_data () {
|
|
# Store the NLTK data outside the Docker container
|
|
local nltk_data_dir="${DATA_DIR}/nltk"
|
|
readonly truthy_things=("yes y 1 t true")
|
|
|
|
# If not set, or it looks truthy
|
|
if [[ -z "${PAPERLESS_ENABLE_NLTK}" ]] || [[ "${truthy_things[*]}" =~ ${PAPERLESS_ENABLE_NLTK,} ]]; then
|
|
|
|
# Download or update the snowball stemmer data
|
|
python3 -W ignore::RuntimeWarning -m nltk.downloader -d "${nltk_data_dir}" snowball_data
|
|
|
|
# Download or update the stopwords corpus
|
|
python3 -W ignore::RuntimeWarning -m nltk.downloader -d "${nltk_data_dir}" stopwords
|
|
|
|
# Download or update the punkt tokenizer data
|
|
python3 -W ignore::RuntimeWarning -m nltk.downloader -d "${nltk_data_dir}" punkt
|
|
|
|
else
|
|
echo "Skipping NLTK data download"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
initialize() {
|
|
|
|
# Setup environment from secrets before anything else
|
|
for env_var in \
|
|
PAPERLESS_DBUSER \
|
|
PAPERLESS_DBPASS \
|
|
PAPERLESS_SECRET_KEY \
|
|
PAPERLESS_AUTO_LOGIN_USERNAME \
|
|
PAPERLESS_ADMIN_USER \
|
|
PAPERLESS_ADMIN_MAIL \
|
|
PAPERLESS_ADMIN_PASSWORD \
|
|
PAPERLESS_REDIS; do
|
|
# Check for a version of this var with _FILE appended
|
|
# and convert the contents to the env var value
|
|
file_env ${env_var}
|
|
done
|
|
|
|
# Change the user and group IDs if needed
|
|
map_uidgid
|
|
|
|
# Check for overrides of certain folders
|
|
map_folders
|
|
|
|
local 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 "${dir}"
|
|
fi
|
|
done
|
|
|
|
local tmp_dir="/tmp/paperless"
|
|
echo "Creating directory ${tmp_dir}"
|
|
mkdir -p "${tmp_dir}"
|
|
|
|
nltk_data
|
|
|
|
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 paperless:paperless {} +
|
|
done
|
|
set -e
|
|
|
|
"${gosu_cmd[@]}" /sbin/docker-prepare.sh
|
|
}
|
|
|
|
install_languages() {
|
|
echo "Installing languages..."
|
|
|
|
local langs="$1"
|
|
read -ra langs <<<"$langs"
|
|
|
|
# Check that it is not empty
|
|
if [ ${#langs[@]} -eq 0 ]; then
|
|
return
|
|
fi
|
|
apt-get update
|
|
|
|
for lang in "${langs[@]}"; do
|
|
pkg="tesseract-ocr-$lang"
|
|
# English is installed by default
|
|
#if [[ "$lang" == "eng" ]]; then
|
|
# continue
|
|
#fi
|
|
|
|
if dpkg -s "$pkg" &>/dev/null; then
|
|
echo "Package $pkg already installed!"
|
|
continue
|
|
fi
|
|
|
|
if ! apt-cache show "$pkg" &>/dev/null; then
|
|
echo "Package $pkg not found! :("
|
|
continue
|
|
fi
|
|
|
|
echo "Installing package $pkg..."
|
|
if ! apt-get -y install "$pkg" &>/dev/null; then
|
|
echo "Could not install $pkg"
|
|
exit 1
|
|
fi
|
|
done
|
|
}
|
|
|
|
echo "Paperless-ngx docker container starting..."
|
|
|
|
gosu_cmd=(gosu paperless)
|
|
if [ "$(id -u)" == "$(id -u 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
|