#!/bin/bash toolName="Mayan EDMS" toolRoot="/opt/mayan-edms" toolMediaFolder="/opt/mayan-edms/media" # Needed for different steps postgresDb="" postgresUser="" postgresPass="" step_1_info() { echo "Install libreoffice without gui"; } step_1() { exe apt update exe apt --no-install-recommends install libreoffice -y } step_2_info() { echo "Get $toolName binary dependencies"; } step_2() { exe apt install g++ gcc ghostscript gnupg1 graphviz libfuse2 \ libjpeg-dev libmagic1 libpq-dev libpng-dev libtiff-dev \ poppler-utils postgresql python-dev python-virtualenv redis-server \ sane-utils supervisor tesseract-ocr tesseract-ocr-deu zlib1g-dev -y } step_3_info() { echo "Create virtual environment"; } step_3() { exe adduser mayan --disabled-password --disabled-login --no-create-home --gecos -G users"" exe mkdir -p ${toolRoot} exe virtualenv ${toolRoot} saveReturn $? endReturn exe chown -R mayan:mayan ${toolRoot} } step_4_info() { echo "Create postgres database for $toolName"; } step_4_alias() { ALIAS="createdb"; } step_4() { readDatabaseInfos exe sudo -u postgres psql -c "CREATE USER ${postgresUser} WITH password '${postgresPass}';" # -O owner : Specifies the database user who will own the new database. exe sudo -u postgres createdb -O ${postgresUser} ${postgresDb} } step_5_info() { echo "Install $toolName"; } step_5() { exe sudo -u mayan ${toolRoot}/bin/pip install --no-cache-dir --no-use-pep517 mayan-edms saveReturn $? endReturn exe sudo -u mayan ${toolRoot}/bin/pip install --no-cache-dir --no-use-pep517 psycopg2==2.7.3.2 redis==2.10.6 saveReturn $? endReturn readDatabaseInfos exe sudo -u mayan MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=${postgresDb} \ MAYAN_DATABASE_PASSWORD="${postgresPass}" MAYAN_DATABASE_USER=${postgresUser} \ MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=${toolMediaFolder} \ ${toolRoot}/bin/mayan-edms.py initialsetup exe sudo -u mayan MAYAN_MEDIA_ROOT=${toolMediaFolder} \ ${toolRoot}/bin/mayan-edms.py collectstatic --noinput } step_6_info() { echo "$toolName configuration file"; } step_6() { readDatabaseInfos addConf -c "$supervisorFile" "$supervisorFileLoc" addConf -a "$redisConf" "$redisConfLoc" exe systemctl restart redis exe systemctl enable supervisor exe systemctl restart supervisor } redisConfLoc="/etc/redis/redis.conf" redisConf="\ maxmemory-policy allkeys-lru save \"\" databases 1" supervisorFileLoc="/etc/supervisor/conf.d/mayan.conf" supervisorFile="\ [supervisord] environment= MAYAN_ALLOWED_HOSTS='[\"*\"]', # Allow access to other network hosts other than localhost MAYAN_CELERY_RESULT_BACKEND=\"redis://127.0.0.1:6379/0\", MAYAN_BROKER_URL=\"redis://127.0.0.1:6379/0\", PYTHONPATH=${toolRoot}/lib/python2.7/site-packages:${toolRoot}/data, MAYAN_MEDIA_ROOT=${toolMediaFolder}, MAYAN_DATABASE_ENGINE=django.db.backends.postgresql, MAYAN_DATABASE_HOST=127.0.0.1, MAYAN_DATABASE_NAME=${postgresDb}, MAYAN_DATABASE_PASSWORD=\"${postgresPass}\", MAYAN_DATABASE_USER=${postgresUser}, MAYAN_DATABASE_CONN_MAX_AGE=60, DJANGO_SETTINGS_MODULE=mayan.settings.production [program:mayan-gunicorn] autorestart = true autostart = true command = ${toolRoot}/bin/gunicorn -w 2 mayan.wsgi --max-requests 500 --max-requests-jitter 50 --worker-class gevent --bind 0.0.0.0:8000 --timeout 120 user = mayan [program:mayan-worker-fast] autorestart = true autostart = true command = nice -n 1 ${toolRoot}/bin/mayan-edms.py celery worker -Ofair -l ERROR -Q converter,sources_fast -n mayan-worker-fast.%%h --concurrency=1 killasgroup = true numprocs = 1 priority = 998 startsecs = 10 stopwaitsecs = 1 user = mayan [program:mayan-worker-medium] autorestart = true autostart = true command = nice -n 18 ${toolRoot}/bin/mayan-edms.py celery worker -Ofair -l ERROR -Q checkouts_periodic,documents_periodic,indexing,metadata,sources,sources_periodic,uploads,documents -n mayan-worker-medium.%%h --concurrency=1 killasgroup = true numprocs = 1 priority = 998 startsecs = 10 stopwaitsecs = 1 user = mayan [program:mayan-worker-slow] autorestart = true autostart = true command = nice -n 19 ${toolRoot}/bin/mayan-edms.py celery worker -Ofair -l ERROR -Q mailing,tools,statistics,parsing,ocr -n mayan-worker-slow.%%h --concurrency=1 killasgroup = true numprocs = 1 priority = 998 startsecs = 10 stopwaitsecs = 1 user = mayan [program:mayan-celery-beat] autorestart = true autostart = true command = nice -n 1 ${toolRoot}/bin/mayan-edms.py celery beat --pidfile= -l ERROR killasgroup = true numprocs = 1 priority = 998 startsecs = 10 stopwaitsecs = 1 user = mayan" step_20_info() { echo "Backup postgres database to media folder"; } step_20_alias() { ALIAS=backupdb; } step_20() { local LASTYEAR=$(($(date +%Y)-1)) if [ ! -s ~/.pgpass ] ; then echo "[INFO] For unattended backup please define ~/.pgpass containing credentials for user mayan" fi echo "Backup custom pg format with standard user / database: mayan / mayan" exep "pg_dump -h 127.0.0.1 -U mayan -Fc mayan | bzip2 -c > ${toolDbBackupFolder}/`date +%Y-%m-%d\"_\"%H-%M-%S`.backup.bz2" exe rm -f ${toolDbBackupFolder}/${LASTYEAR}* } toolDbBackupFolder=${toolMediaFolder}/backupdb step_22_info() { echo "Postgres database restore"; } step_22() { echo "1. Create a empty postgres database first (step 4)" echo "2. psql -h -U -d -W -f " echo " e.g. psql -h 127.0.0.1 -U mayan -d mayan -W -f 2018-06-07_18-10-56.sql" echo "or" echo "3. Custom postgres format dump restore:" echo " pg_restore -h localhost -p 5432 -U mayan -d new_db -v \"10.70.0.61.backup\"" } # Read postgres database information dbname/user/pass if empty readDatabaseInfos() { if [ "$postgresDb" == "" ] ; then read -p "Enter postgres database name: " postgresDb endCheckEmpty postgresDb "database" fi if [ "$postgresUser" == "" ] ; then read -p "Enter postgres user name: " postgresUser endCheckEmpty postgresUser "user name" fi if [ "$postgresPass" == "" ] ; then read -p "Enter postgres password: " postgresPass endCheckEmpty postgresPass "password" fi } VERSION_SEQREV=3 . sequencer.sh