paperless-ngx-install.sh 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #!/usr/bin/env bash
  2. # Copyright (c) 2021-2023 tteck
  3. # Author: tteck (tteckster)
  4. # License: MIT
  5. # https://github.com/tteck/Proxmox/raw/main/LICENSE
  6. source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
  7. color
  8. verb_ip6
  9. catch_errors
  10. setting_up_container
  11. network_check
  12. update_os
  13. msg_info "Installing Python3"
  14. $STD apt-get install -y --no-install-recommends \
  15. python3 \
  16. python3-pip \
  17. python3-dev \
  18. python3-setuptools \
  19. python3-wheel
  20. msg_ok "Installed Python3"
  21. msg_info "Installing Dependencies (Patience)"
  22. $STD apt-get install -y --no-install-recommends \
  23. redis \
  24. postgresql \
  25. build-essential \
  26. imagemagick \
  27. fonts-liberation \
  28. optipng \
  29. gnupg \
  30. libpq-dev \
  31. libmagic-dev \
  32. mime-support \
  33. libzbar0 \
  34. poppler-utils \
  35. default-libmysqlclient-dev \
  36. automake \
  37. libtool \
  38. pkg-config \
  39. git \
  40. curl \
  41. libtiff-dev \
  42. libpng-dev \
  43. libleptonica-dev \
  44. sudo \
  45. mc
  46. msg_ok "Installed Dependencies"
  47. msg_info "Installing OCR Dependencies (Patience)"
  48. $STD apt-get install -y --no-install-recommends \
  49. unpaper \
  50. ghostscript \
  51. icc-profiles-free \
  52. qpdf \
  53. liblept5 \
  54. libxml2 \
  55. pngquant \
  56. zlib1g \
  57. tesseract-ocr \
  58. tesseract-ocr-eng
  59. msg_ok "Installed OCR Dependencies"
  60. msg_info "Installing JBIG2"
  61. $STD git clone https://github.com/agl/jbig2enc /opt/jbig2enc
  62. cd /opt/jbig2enc
  63. $STD bash ./autogen.sh
  64. $STD bash ./configure
  65. $STD make
  66. $STD make install
  67. rm -rf /opt/jbig2enc
  68. msg_ok "Installed JBIG2"
  69. msg_info "Installing Paperless-ngx (Patience)"
  70. Paperlessngx=$(wget -q https://github.com/paperless-ngx/paperless-ngx/releases/latest -O - | grep "title>Release" | cut -d " " -f 5)
  71. cd /opt
  72. $STD wget https://github.com/paperless-ngx/paperless-ngx/releases/download/$Paperlessngx/paperless-ngx-$Paperlessngx.tar.xz
  73. $STD tar -xf paperless-ngx-$Paperlessngx.tar.xz -C /opt/
  74. mv paperless-ngx paperless
  75. rm paperless-ngx-$Paperlessngx.tar.xz
  76. cd /opt/paperless
  77. sed -i 's/scipy==1.8.1/scipy==1.10.1/g' requirements.txt
  78. ## python 3.10+ doesn't like the '-e', so we remove it from this the requirements file
  79. sed -i -e 's|-e git+https://github.com/paperless-ngx/django-q.git|git+https://github.com/paperless-ngx/django-q.git|' /opt/paperless/requirements.txt
  80. $STD pip install --upgrade pip
  81. $STD pip install -r requirements.txt
  82. curl -s -o /opt/paperless/paperless.conf https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/paperless.conf.example
  83. mkdir -p {consume,data,media,static}
  84. sed -i -e 's|#PAPERLESS_REDIS=redis://localhost:6379|PAPERLESS_REDIS=redis://localhost:6379|' /opt/paperless/paperless.conf
  85. sed -i -e "s|#PAPERLESS_CONSUMPTION_DIR=../consume|PAPERLESS_CONSUMPTION_DIR=/opt/paperless/consume|" /opt/paperless/paperless.conf
  86. sed -i -e "s|#PAPERLESS_DATA_DIR=../data|PAPERLESS_DATA_DIR=/opt/paperless/data|" /opt/paperless/paperless.conf
  87. sed -i -e "s|#PAPERLESS_MEDIA_ROOT=../media|PAPERLESS_MEDIA_ROOT=/opt/paperless/media|" /opt/paperless/paperless.conf
  88. sed -i -e "s|#PAPERLESS_STATICDIR=../static|PAPERLESS_STATICDIR=/opt/paperless/static|" /opt/paperless/paperless.conf
  89. msg_ok "Installed Paperless-ngx"
  90. msg_info "Installing Natural Language Toolkit (Patience)"
  91. $STD python3 -m nltk.downloader -d /usr/share/nltk_data all
  92. msg_ok "Installed Natural Language Toolkit"
  93. msg_info "Setting up PostgreSQL database"
  94. DB_NAME=paperlessdb
  95. DB_USER=paperless
  96. DB_PASS="$(openssl rand -base64 18 | cut -c1-13)"
  97. SECRET_KEY="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)"
  98. $STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';"
  99. $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMPLATE template0;"
  100. echo "" >>~/paperless.creds
  101. echo -e "Paperless-ngx Database User: \e[32m$DB_USER\e[0m" >>~/paperless.creds
  102. echo -e "Paperless-ngx Database Password: \e[32m$DB_PASS\e[0m" >>~/paperless.creds
  103. echo -e "Paperless-ngx Database Name: \e[32m$DB_NAME\e[0m" >>~/paperless.creds
  104. sed -i -e 's|#PAPERLESS_DBHOST=localhost|PAPERLESS_DBHOST=localhost|' /opt/paperless/paperless.conf
  105. sed -i -e 's|#PAPERLESS_DBPORT=5432|PAPERLESS_DBPORT=5432|' /opt/paperless/paperless.conf
  106. sed -i -e "s|#PAPERLESS_DBNAME=paperless|PAPERLESS_DBNAME=$DB_NAME|" /opt/paperless/paperless.conf
  107. sed -i -e "s|#PAPERLESS_DBUSER=paperless|PAPERLESS_DBUSER=$DB_USER|" /opt/paperless/paperless.conf
  108. sed -i -e "s|#PAPERLESS_DBPASS=paperless|PAPERLESS_DBPASS=$DB_PASS|" /opt/paperless/paperless.conf
  109. sed -i -e "s|#PAPERLESS_SECRET_KEY=change-me|PAPERLESS_SECRET_KEY=$SECRET_KEY|" /opt/paperless/paperless.conf
  110. cd /opt/paperless/src
  111. $STD python3 manage.py migrate
  112. msg_ok "Set up PostgreSQL database"
  113. read -r -p "Would you like to add Adminer? <y/N> " prompt
  114. if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
  115. msg_info "Installing Adminer"
  116. $STD apt install -y adminer
  117. $STD a2enconf adminer
  118. systemctl reload apache2
  119. IP=$(hostname -I | awk '{print $1}')
  120. echo "" >>~/paperless.creds
  121. echo -e "Adminer Interface: \e[32m$IP/adminer/\e[0m" >>~/paperless.creds
  122. echo -e "Adminer System: \e[32mPostgreSQL\e[0m" >>~/paperless.creds
  123. echo -e "Adminer Server: \e[32mlocalhost:5432\e[0m" >>~/paperless.creds
  124. echo -e "Adminer Username: \e[32m$DB_USER\e[0m" >>~/paperless.creds
  125. echo -e "Adminer Password: \e[32m$DB_PASS\e[0m" >>~/paperless.creds
  126. echo -e "Adminer Database: \e[32m$DB_NAME\e[0m" >>~/paperless.creds
  127. msg_ok "Installed Adminer"
  128. fi
  129. msg_info "Setting up admin Paperless-ngx User & Password"
  130. ## From https://github.com/linuxserver/docker-paperless-ngx/blob/main/root/etc/cont-init.d/99-migrations
  131. cat <<EOF | python3 /opt/paperless/src/manage.py shell
  132. from django.contrib.auth import get_user_model
  133. UserModel = get_user_model()
  134. user = UserModel.objects.create_user('admin', password='$DB_PASS')
  135. user.is_superuser = True
  136. user.is_staff = True
  137. user.save()
  138. EOF
  139. echo "" >>~/paperless.creds
  140. echo -e "Paperless-ngx WebUI User: \e[32madmin\e[0m" >>~/paperless.creds
  141. echo -e "Paperless-ngx WebUI Password: \e[32m$DB_PASS\e[0m" >>~/paperless.creds
  142. echo "" >>~/paperless.creds
  143. msg_ok "Set up admin Paperless-ngx User & Password"
  144. msg_info "Creating Services"
  145. cat <<EOF >/etc/systemd/system/paperless-scheduler.service
  146. [Unit]
  147. Description=Paperless Celery beat
  148. Requires=redis.service
  149. [Service]
  150. WorkingDirectory=/opt/paperless/src
  151. ExecStart=celery --app paperless beat --loglevel INFO
  152. [Install]
  153. WantedBy=multi-user.target
  154. EOF
  155. cat <<EOF >/etc/systemd/system/paperless-task-queue.service
  156. [Unit]
  157. Description=Paperless Celery Workers
  158. Requires=redis.service
  159. [Service]
  160. WorkingDirectory=/opt/paperless/src
  161. ExecStart=celery --app paperless worker --loglevel INFO
  162. [Install]
  163. WantedBy=multi-user.target
  164. EOF
  165. cat <<EOF >/etc/systemd/system/paperless-consumer.service
  166. [Unit]
  167. Description=Paperless consumer
  168. Requires=redis.service
  169. [Service]
  170. WorkingDirectory=/opt/paperless/src
  171. ExecStart=python3 manage.py document_consumer
  172. [Install]
  173. WantedBy=multi-user.target
  174. EOF
  175. cat <<EOF >/etc/systemd/system/paperless-webserver.service
  176. [Unit]
  177. Description=Paperless webserver
  178. After=network.target
  179. Wants=network.target
  180. Requires=redis.service
  181. [Service]
  182. WorkingDirectory=/opt/paperless/src
  183. ExecStart=/usr/local/bin/gunicorn -c /opt/paperless/gunicorn.conf.py paperless.asgi:application
  184. [Install]
  185. WantedBy=multi-user.target
  186. EOF
  187. sed -i -e 's/rights="none" pattern="PDF"/rights="read|write" pattern="PDF"/' /etc/ImageMagick-6/policy.xml
  188. systemctl daemon-reload
  189. $STD systemctl enable --now paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue.service
  190. msg_ok "Created Services"
  191. motd_ssh
  192. customize
  193. msg_info "Cleaning up"
  194. rm -rf /opt/paperless/docker
  195. $STD apt-get autoremove
  196. $STD apt-get autoclean
  197. msg_ok "Cleaned"