i fixed the docker

This commit is contained in:
Jonas Winkler 2020-10-29 00:46:57 +01:00
parent 03bd2b7328
commit e4a13156b9
6 changed files with 173 additions and 196 deletions

3
.dockerignore Normal file
View File

@ -0,0 +1,3 @@
src-ui/node_modules
src-ui/dist
.git

1
.env Normal file
View File

@ -0,0 +1 @@
COMPOSE_PROJECT_NAME=paperless

View File

@ -1,74 +1,71 @@
FROM alpine:3.11
###############################################################################
### Front end ###
###############################################################################
LABEL maintainer="The Paperless Project https://github.com/the-paperless-project/paperless" \
contributors="Guy Addadi <addadi@gmail.com>, Pit Kleyersburg <pitkley@googlemail.com>, \
Sven Fischer <git-dev@linux4tw.de>"
FROM node:current AS frontend
WORKDIR /usr/src/paperless/src-ui/
COPY src-ui/package* ./
RUN npm install
COPY src-ui .
RUN node_modules/.bin/ng build --prod --output-hashing none
###############################################################################
### Back end ###
###############################################################################
FROM python:3.8-slim
WORKDIR /usr/src/paperless/
COPY Pipfile* ./
#Dependencies
RUN apt-get update \
&& apt-get -y --no-install-recommends install \
build-essential \
curl \
ghostscript \
gnupg \
imagemagick \
libmagic-dev \
libpoppler-cpp-dev \
libpq-dev \
optipng \
sudo \
tesseract-ocr \
tesseract-ocr-eng \
tesseract-ocr-deu \
tesseract-ocr-fra \
tesseract-ocr-ita \
tesseract-ocr-spa \
tzdata \
unpaper \
&& pip install --upgrade pipenv \
&& pipenv install --system --deploy \
&& apt-get -y purge build-essential \
&& apt-get -y autoremove --purge \
&& rm -rf /var/lib/apt/lists/*
# # Copy application
COPY scripts/gunicorn.conf.py ./
COPY src/ ./src/
COPY --from=frontend /usr/src/paperless/src-ui/dist/paperless-ui/ ./src/documents/static/
RUN addgroup --gid 1000 paperless && \
useradd --uid 1000 --gid paperless --home-dir /usr/src/paperless paperless && \
chown -R paperless:paperless .
WORKDIR /usr/src/paperless/src/
RUN sudo -HEu paperless python3 manage.py collectstatic --clear --no-input
VOLUME ["/usr/src/paperless/data", "/usr/src/paperless/consume", "/usr/src/paperless/export"]
# Copy Pipfiles file, init script and gunicorn.conf
COPY Pipfile* /usr/src/paperless/
COPY scripts/docker-entrypoint.sh /sbin/docker-entrypoint.sh
COPY scripts/gunicorn.conf /usr/src/paperless/
# Set export and consumption directories
ENV PAPERLESS_EXPORT_DIR=/export \
PAPERLESS_CONSUMPTION_DIR=/consume
RUN apk add --no-cache \
bash \
curl \
ghostscript \
gnupg \
imagemagick \
libmagic \
libpq \
optipng \
poppler \
python3 \
shadow \
sudo \
tesseract-ocr \
tzdata \
unpaper && \
apk add --no-cache --virtual .build-dependencies \
g++ \
gcc \
jpeg-dev \
musl-dev \
poppler-dev \
postgresql-dev \
python3-dev \
zlib-dev && \
# Install python dependencies
python3 -m ensurepip && \
rm -r /usr/lib/python*/ensurepip && \
cd /usr/src/paperless && \
pip3 install --upgrade pip pipenv && \
pipenv install --system --deploy && \
# Remove build dependencies
apk del .build-dependencies && \
# Create the consumption directory
mkdir -p $PAPERLESS_CONSUMPTION_DIR && \
# Create user
addgroup -g 1000 paperless && \
adduser -D -u 1000 -G paperless -h /usr/src/paperless paperless && \
chown -Rh paperless:paperless /usr/src/paperless && \
mkdir -p $PAPERLESS_EXPORT_DIR && \
# Avoid setrlimit warnings
# See: https://gitlab.alpinelinux.org/alpine/aports/issues/11122
echo 'Set disable_coredump false' >> /etc/sudo.conf && \
# Setup entrypoint
chmod 755 /sbin/docker-entrypoint.sh
WORKDIR /usr/src/paperless/src
# Mount volumes and set Entrypoint
VOLUME ["/usr/src/paperless/data", "/usr/src/paperless/media", "/consume", "/export"]
RUN chmod 755 /sbin/docker-entrypoint.sh
ENTRYPOINT ["/sbin/docker-entrypoint.sh"]
CMD ["--help"]
# Copy application
COPY src/ /usr/src/paperless/src/
COPY data/ /usr/src/paperless/data/
COPY media/ /usr/src/paperless/media/
# Collect static files
RUN sudo -HEu paperless /usr/src/paperless/src/manage.py collectstatic --clear --no-input

View File

@ -1,3 +1,11 @@
PAPERLESS_DBENGINE="django.db.backends.postgresql_psycopg2"
PAPERLESS_DBHOST="db"
PAPERLESS_DBNAME="paperless"
PAPERLESS_DBUSER="paperless"
PAPERLESS_DBPASS="paperless"
PAPERLESS_CONSUMPTION_DIR="../consume"
# Environment variables to set for Paperless
# Commented out variables will be replaced with a default within Paperless.
#
@ -5,24 +13,23 @@
# paperless.conf.example here. Values like:
#
# * PAPERLESS_PASSPHRASE
# * PAPERLESS_CONSUMPTION_DIR
# * PAPERLESS_CONSUME_MAIL_HOST
#
# ...are all explained in that file but can be defined here, since the Docker
# installation doesn't make use of paperless.conf.
# Use this variable to set a timezone for the Paperless Docker containers. If not specified, defaults to UTC.
# TZ=America/Los_Angeles
#TZ=America/Los_Angeles
# Additional languages to install for text recognition. Note that this is
# different from PAPERLESS_OCR_LANGUAGE (default=eng), which defines the
# default language used when guessing the language from the OCR output.
# PAPERLESS_OCR_LANGUAGES=deu ita
# The container installs English, German, Italian, Spanish and French by
# default.
#PAPERLESS_OCR_LANGUAGES=deu ita spa fra
# Set Paperless to use SSL for the web interface.
# Enabling this will require ssl.key and ssl.cert files in paperless' data directory.
# PAPERLESS_USE_SSL=false
# You can change the default user and group id to a custom one
# USERMAP_UID=1000
# USERMAP_GID=1000
# The UID and GID of the user used to run paperless in the container. Set this
# to your UID and GID on the host so that you have write access to the
# consumption directory.
#USERMAP_UID=1000
#USERMAP_GID=1000

View File

@ -1,56 +1,44 @@
version: '2.1'
version: "3.8"
services:
webserver:
build: ./
# uncomment the following line to start automatically on system boot
# restart: always
ports:
# You can adapt the port you want Paperless to listen on by
# modifying the part before the `:`.
- "8000:8000"
healthcheck:
test: ["CMD", "curl" , "-f", "http://localhost:8000"]
interval: 30s
timeout: 10s
retries: 5
volumes:
- data:/usr/src/paperless/data
- media:/usr/src/paperless/media
# You have to adapt the local path you want the consumption
# directory to mount to by modifying the part before the ':'.
- ./consume:/consume
env_file: docker-compose.env
# The reason the line is here is so that the webserver that doesn't do
# any text recognition and doesn't have to install unnecessary
# languages the user might have set in the env-file by overwriting the
# value with nothing.
environment:
- PAPERLESS_OCR_LANGUAGES=
command: ["gunicorn", "-b", "0.0.0.0:8000"]
db:
image: postgres:13
#restart: always
environment:
POSTGRES_DB: paperless
POSTGRES_USER: paperless
POSTGRES_PASSWORD: paperless
consumer:
build: ./
# uncomment the following line to start automatically on system boot
# restart: always
depends_on:
webserver:
condition: service_healthy
volumes:
- data:/usr/src/paperless/data
- media:/usr/src/paperless/media
# This should be set to the same value as the consume directory
# in the webserver service above.
- ./consume:/consume
# Likewise, you can add a local path to mount a directory for
# exporting. This is not strictly needed for paperless to
# function, only if you're exporting your files: uncomment
# it and fill in a local path if you know you're going to
# want to export your documents.
# - /path/to/another/arbitrary/place:/export
env_file: docker-compose.env
command: ["document_consumer"]
webserver:
build: .
image: paperless_app
#restart: always
depends_on:
- db
ports:
- "8000:8000"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000"]
interval: 30s
timeout: 10s
retries: 5
volumes:
- data:/usr/src/paperless/data
env_file: docker-compose.env
environment:
- PAPERLESS_OCR_LANGUAGES=
command: ["gunicorn", "-b", "0.0.0.0:8000"]
consumer:
image: paperless_app
depends_on:
- webserver
- db
restart: on-failure:5
volumes:
- data:/usr/src/paperless/data
- ./consume:/usr/src/paperless/consume
env_file: docker-compose.env
command: ["document_consumer"]
volumes:
data:
media:
data:

View File

@ -1,4 +1,5 @@
#!/bin/bash
set -e
# Source: https://github.com/sameersbn/docker-gitlab/
@ -14,83 +15,72 @@ map_uidgid() {
fi
}
set_permissions() {
# Set permissions for consumption and export directory
for dir in PAPERLESS_CONSUMPTION_DIR PAPERLESS_EXPORT_DIR; do
# Extract the name of the current directory from $dir for the error message
cur_dir_name=$(echo "$dir" | awk -F'_' '{ print tolower($2); }')
chgrp paperless "${!dir}" || {
echo "Changing group of ${cur_dir_name} directory:"
echo " ${!dir}"
echo "failed."
echo ""
echo "Either try to set it on your host-mounted directory"
echo "directly, or make sure that the directory has \`g+wx\`"
echo "permissions and the files in it at least \`o+r\`."
} >&2
chmod g+wx "${!dir}" || {
echo "Changing group permissions of ${cur_dir_name} directory:"
echo " ${!dir}"
echo "failed."
echo ""
echo "Either try to set it on your host-mounted directory"
echo "directly, or make sure that the directory has \`g+wx\`"
echo "permissions and the files in it at least \`o+r\`."
} >&2
done
# Set permissions for application directory
chown -Rh paperless:paperless /usr/src/paperless
}
migrations() {
# A simple lock file in case other containers use this startup
LOCKFILE="/usr/src/paperless/data/db.sqlite3.migration"
# check for and create lock file in one command
# check for and create lock file in one command
if (set -o noclobber; echo "$$" > "${LOCKFILE}") 2> /dev/null
then
trap 'rm -f "${LOCKFILE}"; exit $?' INT TERM EXIT
sudo -HEu paperless "/usr/src/paperless/src/manage.py" "migrate"
sudo -HEu paperless python3 manage.py migrate
rm ${LOCKFILE}
fi
}
initialize() {
map_uidgid
set_permissions
migrations
map_uidgid
for data_dir in index media media/documents media/thumbnails; do
if [[ ! -d "../data/$data_dir" ]]
then
echo "creating directory ../data/$data_dir"
mkdir ../data/$data_dir
fi
done
chown -R paperless:paperless ../
migrations
}
install_languages() {
local langs="$1"
read -ra langs <<<"$langs"
echo "TEST"
local langs="$1"
read -ra langs <<<"$langs"
# Check that it is not empty
if [ ${#langs[@]} -eq 0 ]; then
return
fi
# Loop over languages to be installed
for lang in "${langs[@]}"; do
pkg="tesseract-ocr-data-$lang"
# 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
#if [[ "$lang" == "eng" ]]; then
# continue
#fi
if dpkg -s $pkg &> /dev/null; then
echo "package $pkg already installed!"
continue
fi
if apk info -e "$pkg" > /dev/null 2>&1; then
continue
fi
if ! apk --no-cache info "$pkg" > /dev/null 2>&1; then
continue
if ! apt-cache show $pkg &> /dev/null; then
echo "package $pkg not found! :("
continue
fi
apk --no-cache --update add "$pkg"
echo "Installing package $pkg..."
if ! apt-get -y install "$pkg" &> /dev/null; then
echo "Could not install $pkg"
exit 1
fi
done
}
if [[ "$1" != "/"* ]]; then
initialize
@ -101,21 +91,12 @@ if [[ "$1" != "/"* ]]; then
if [[ "$1" = "gunicorn" ]]; then
shift
EXTRA_PARAMS=""
SSL_KEY_PATH="/usr/src/paperless/data/ssl.key"
SSL_CERT_PATH="/usr/src/paperless/data/ssl.cert"
if [ "${PAPERLESS_USE_SSL}" = "true" ]; then
if [ -f "${SSL_KEY_PATH}" ] && [ -f "${SSL_CERT_PATH}" ]; then
EXTRA_PARAMS="--certfile=${SSL_CERT_PATH} --keyfile=${SSL_KEY_PATH}"
else
echo "Error: Could not find certfile in ${SSL_CERT_PATH} or keyfile in ${SSL_KEY_PATH}, but \$PAPERLESS_USE_SSL is true. Starting without SSL enabled."
fi
fi
cd /usr/src/paperless/src/ && \
exec sudo -HEu paperless /usr/bin/gunicorn -c /usr/src/paperless/gunicorn.conf ${EXTRA_PARAMS} "$@" paperless.wsgi
else
exec sudo -HEu paperless "/usr/src/paperless/src/manage.py" "$@"
exec sudo -HEu paperless gunicorn -c /usr/src/paperless/gunicorn.conf.py "$@" paperless.wsgi
fi
exec sudo -HEu paperless python3 manage.py "$@"
fi
exec "$@"