File paperless-ngx.spec of Package paperless-ngx
#
# spec file for package paperless-ngx
#
# Copyright (c) 2025 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
Name: paperless-ngx
Version: 2.18.4
Release: 0
Summary: A community-supported supercharged version of paperless
License: GPL-3.0
URL: https://docs.paperless-ngx.com/
Source0: https://github.com/%{name}/%{name}/releases/download/v%{version}/%{name}-v%{version}.tar.xz
Source1: %{name}-user.conf
Source3: %{name}.conf
Source4: %{name}-defaults.conf
Source5: %{name}-webserver.service
Source6: %{name}-worker.service
Source7: %{name}-scheduler.service
Source8: %{name}-consumer.service
Source9: %{name}-nltk.timer
Source10: %{name}-nltk.service
Source11: nltk-download.sh
Source12: %{name}-backup.service
Source13: %{name}-backup.timer
Source14: %{name}-backup-clean.service
Source15: %{name}-backup-clean.timer
Source16: %{name}-backup.sh
Source17: %{name}-backup-clean.sh
Source18: restic.pw
Source19: %{name}-flower.service
Source20: %{name}-flower.conf
BuildRequires: python-rpm-macros
BuildRequires: python313
BuildRequires: sysuser-tools
BuildRequires: fdupes
Requires: python313-Babel >= 2.17.0
Requires: python313-bleach >= 6.2.0
Requires: python313-celery >= 5.5.1
Requires: python313-channels >= 4.3.1
Requires: python313-channels-redis >= 4.3.0
Requires: python313-concurrent-log-handler >= 0.9.28
Requires: python313-dateparser >= 1.2.2
Requires: python313-Django >= 5.2.5
Requires: python313-django-allauth >= 65.4.0
Requires: python313-django-allauth-socialaccount >= 65.4.0
Requires: python313-django-allauth-mfa >= 65.4.0
Requires: python313-django-auditlog >= 3.2.1
Requires: python313-django-cachalot >= 2.8.0
Requires: python313-django-celery-results >= 2.6.0
Requires: python313-django-compression-middleware >= 0.5.0
Requires: python313-django-cors-headers >= 4.7.0
Requires: python313-django-extensions >= 4.1
Requires: python313-django-filter >= 25.1
Requires: python313-django-guardian >= 3.0.3
Requires: python313-django-multiselectfield >= 1.0.1
Requires: python313-django-soft-delete >= 1.0.19
Requires: python313-djangorestframework >= 3.16.1
Requires: python313-djangorestframework-guardian >= 0.4.0
Requires: python313-drf-spectacular >= 0.28
Requires: python313-drf-spectacular-sidecar >= 2025.8.1
Requires: python313-drf-writable-nested >= 0.7.1
Requires: python313-filelock >= 3.19.1
Requires: python313-gotenberg-client >= 0.11.0
Requires: python313-httpx-oauth >= 0.16
Requires: python313-imap-tools >= 1.11.0
Requires: python313-inotifyrecursive >= 0.3
Requires: python313-jinja2 >= 3.1.5
Requires: python313-langdetect >= 1.0.9
Requires: python313-nltk >= 3.9.1
Requires: python313-ocrmypdf >= 16.10.4
Requires: python313-pathvalidate >= 3.3.1
Requires: python313-pdf2image >= 1.17.0
Requires: python313-dateutil >= 2.9.0
Requires: python313-python-dotenv >= 1.1.1
Requires: python313-gnupg >= 0.5.5
Requires: python313-python-ipware >= 3.0.0
Requires: python313-python-magic >= 0.4.27
Requires: python313-pyzbar >= 0.1.9
Requires: python313-rapidfuzz >= 3.14.0
Requires: python313-redis >= 5.2.1
Requires: python313-hiredis >= 3.2.0
Requires: python313-scikit-learn >= 1.7.1
Requires: python313-setproctitle >= 1.3.6
Requires: python313-tika-client >= 0.10.0
Requires: python313-tqdm >= 4.67.1
Requires: python313-watchdog >= 6.0
Requires: python313-whitenoise >= 6.9
Requires: python313-Whoosh-Reloaded >= 2.7.5
Requires: python313-zxing-cpp >= 2.3.0
Requires: python313-granian >= 2.5.0
Requires: python313-granian-uvloop >= 2.5.0
Requires: qpdf
Requires: ImageMagick
Requires: redis
Requires: nginx
Provides: user(paperless)
Provides: group(paperless)
Provides: %{name} = %{version}-%{release}
Obsoletes: %{name} < %{version}-%{release}
BuildArch: noarch
%{?systemd_ordering}
%sysusers_requires
%description
Paperless-ngx is a document management system that transforms your
physical documents into a searchable online archive so you can keep,
well, less paper.
%package flower
Summary: Paperless-ngx flower frontend for celery
Requires: %{name} = %{version}-%{release}
Requires: python313-flower >= 2.0.1
%description flower
Paperless-ngx flower provides a frontend for the celery tasks and
workers.
%package backup
Summary: Paperless-ngx backup
Requires: %{name} = %{version}-%{release}
Requires: restic
%description backup
Paperless-ngx backup uses the document_exporter command and restic to
create backups.
%package postgresql
Summary: Paperless-ngx with PosgreSQL
Requires: %{name} = %{version}-%{release}
Requires: postgresql-server
Requires: python313-psycopg >= 3.2.5
Requires: python313-psycopg-c >= 3.2.5
Requires: python313-psycopg-pool
%description postgresql
Run paperless-ngx with postgresql
%package mariadb
Summary: Paperless-ngx with mariadb
Requires: %{name} = %{version}-%{release}
Requires: mariadb
Requires: python313-mysqlclient >= 2.2.7
%description mariadb
Run paperless-ngx with mariadb
%prep
%autosetup -p1 -n %{name}
%build
%sysusers_generate_pre %{SOURCE1} %{name} %{name}-user.conf
sed -i '1s|^#!/usr/bin/env python3|#!/usr/bin/python3|' src/manage.py
%install
# Users
install -Dpm0644 %{SOURCE1} %{buildroot}%{_sysusersdir}/%{name}-user.conf
# Scripts
install -Dpm0755 %{SOURCE11} %{buildroot}%{_libexecdir}/download-nltk-corpus
# Configuration
install -Dpm0644 %{SOURCE3} %{buildroot}%{_sysconfdir}/paperless/paperless.conf
install -Dpm0644 %{SOURCE4} %{buildroot}%{_sysconfdir}/default/paperless
install -Dpm0644 %{SOURCE20} %{buildroot}%{_sysconfdir}/paperless/flowerconfig.py
# Services
install -Dpm0644 %{SOURCE5} %{buildroot}%{_unitdir}/paperless-webserver.service
install -Dpm0644 %{SOURCE6} %{buildroot}%{_unitdir}/paperless-worker.service
install -Dpm0644 %{SOURCE7} %{buildroot}%{_unitdir}/paperless-scheduler.service
install -Dpm0644 %{SOURCE8} %{buildroot}%{_unitdir}/paperless-consumer.service
install -Dpm0644 %{SOURCE9} %{buildroot}%{_unitdir}/paperless-nltk.timer
install -Dpm0644 %{SOURCE10} %{buildroot}%{_unitdir}/paperless-nltk.service
install -Dpm0644 %{SOURCE19} %{buildroot}%{_unitdir}/paperless-flower.service
install -d %{buildroot}%{_sbindir}
ln -s service %{buildroot}%{_sbindir}/rcpaperless-webserver
ln -s service %{buildroot}%{_sbindir}/rcpaperless-worker
ln -s service %{buildroot}%{_sbindir}/rcpaperless-scheduler
ln -s service %{buildroot}%{_sbindir}/rcpaperless-consumer
ln -s service %{buildroot}%{_sbindir}/rcpaperless-nltk
ln -s service %{buildroot}%{_sbindir}/rcpaperless-flower
# Data
mkdir -p %{buildroot}%{_sharedstatedir}/paperless/{data,flower,media,nltk,trash,.gnupg,tmp,consume}
# Code
mkdir -p %{buildroot}%{_usrsrc}/paperless
cp -rf src/* %{buildroot}%{_usrsrc}/paperless/
# Static files
mkdir -p %{buildroot}%{_datadir}/paperless
cp -rf static/* %{buildroot}%{_datadir}/paperless/
# Logs
mkdir -p %{buildroot}%{_var}/log/paperless
# Backup
install -Dpm0644 %{SOURCE12} %{buildroot}%{_unitdir}/paperless-backup.service
install -Dpm0644 %{SOURCE13} %{buildroot}%{_unitdir}/paperless-backup.timer
install -Dpm0644 %{SOURCE14} %{buildroot}%{_unitdir}/paperless-backup-clean.service
install -Dpm0644 %{SOURCE15} %{buildroot}%{_unitdir}/paperless-backup-clean.timer
install -Dpm0755 %{SOURCE16} %{buildroot}%{_sbindir}/paperless-backup
install -Dpm0755 %{SOURCE17} %{buildroot}%{_sbindir}/paperless-backup-clean
install -Dpm0600 %{SOURCE18} %{buildroot}%{_sysconfdir}/paperless/.restic
ln -s service %{buildroot}%{_sbindir}/rcpaperless-backup
ln -s service %{buildroot}%{_sbindir}/rcpaperless-backup-clean
mkdir -p %{buildroot}%{_sharedstatedir}/paperless/{export,backup}
pushd %{buildroot}%{_usrsrc}/paperless
find . -name '*.pyc' -exec rm -f '{}' ';'
python%python_bin_suffix -m compileall *.py ';'
popd
# Reduce dupes
%fdupes %{buildroot}%{_usrsrc}/paperless/
%fdupes %{buildroot}%{_datadir}/paperless/
%pre -f %{name}.pre
%service_add_pre paperless-webserver.service
%service_add_pre paperless-worker.service
%service_add_pre paperless-scheduler.service
%service_add_pre paperless-consumer.service
%service_add_pre paperless-nltk.timer
%service_add_pre paperless-nltk.service
%pre -f %{name}.pre backup
%service_add_pre paperless-backup.service
%service_add_pre paperless-backup.timer
%service_add_pre paperless-backup-clean.service
%service_add_pre paperless-backup-clean.timer
%pre -f %{name}.pre flower
%service_add_pre paperless-flower.service
%post
%service_add_post paperless-webserver.service
%service_add_post paperless-worker.service
%service_add_post paperless-scheduler.service
%service_add_post paperless-consumer.service
%service_add_post paperless-nltk.timer
%service_add_post paperless-nltk.service
%post backup
%service_add_post paperless-backup.service
%service_add_post paperless-backup.timer
%service_add_post paperless-backup-clean.service
%service_add_post paperless-backup-clean.timer
%post flower
%service_add_post paperless-flower.service
%preun
%service_del_preun paperless-webserver.service
%service_del_preun paperless-worker.service
%service_del_preun paperless-scheduler.service
%service_del_preun paperless-consumer.service
%service_del_preun paperless-nltk.timer
%service_del_preun paperless-nltk.service
%preun backup
%service_del_preun paperless-backup.service
%service_del_preun paperless-backup.timer
%service_del_preun paperless-backup-clean.service
%service_del_preun paperless-backup-clean.timer
%preun flower
%service_del_preun paperless-flower.service
%postun
%service_del_postun paperless-webserver.service
%service_del_postun paperless-worker.service
%service_del_postun paperless-scheduler.service
%service_del_postun paperless-consumer.service
%service_del_postun paperless-nltk.timer
%service_del_postun paperless-nltk.service
%postun backup
%service_del_postun paperless-backup.service
%service_del_postun paperless-backup.timer
%service_del_postun paperless-backup-clean.service
%service_del_postun paperless-backup-clean.timer
%postun flower
%service_del_postun paperless-flower.service
%files
%license LICENSE
%doc README.md
%{_libexecdir}/download-nltk-corpus
%{_sysusersdir}/%{name}-user.conf
%dir %{_sysconfdir}/paperless
%config(noreplace) %attr(660,root,paperless) %{_sysconfdir}/paperless/paperless.conf
%config(noreplace) %{_sysconfdir}/default/paperless
%{_unitdir}/paperless-webserver.service
%{_unitdir}/paperless-worker.service
%{_unitdir}/paperless-scheduler.service
%{_unitdir}/paperless-consumer.service
%{_unitdir}/paperless-nltk.service
%{_unitdir}/paperless-nltk.timer
%dir %attr(750,paperless,paperless) %{_sharedstatedir}/paperless/
%dir %attr(750,paperless,paperless) %{_sharedstatedir}/paperless/data
%dir %attr(750,paperless,paperless) %{_sharedstatedir}/paperless/media
%dir %attr(750,paperless,paperless) %{_sharedstatedir}/paperless/nltk
%dir %attr(750,paperless,paperless) %{_sharedstatedir}/paperless/trash
%dir %attr(750,paperless,paperless) %{_sharedstatedir}/paperless/tmp
%dir %attr(750,paperless,paperless) %{_sharedstatedir}/paperless/consume
%dir %attr(750,paperless,paperless) %{_var}/log/paperless
%dir %{_usrsrc}/paperless
%dir %{_datadir}/paperless
%{_usrsrc}/paperless/*
%{_datadir}/paperless/*
%{_sbindir}/rcpaperless-webserver
%{_sbindir}/rcpaperless-worker
%{_sbindir}/rcpaperless-scheduler
%{_sbindir}/rcpaperless-consumer
%{_sbindir}/rcpaperless-nltk
%files backup
%{_sbindir}/paperless-backup
%{_sbindir}/paperless-backup-clean
%{_unitdir}/paperless-backup*.service
%{_unitdir}/paperless-backup*.timer
%dir %attr(750,paperless,paperless) %{_sharedstatedir}/paperless/export
%dir %attr(750,paperless,paperless) %{_sharedstatedir}/paperless/backup
%config(noreplace) %attr(640,root,paperless) %{_sysconfdir}/paperless/.restic
%{_sbindir}/rcpaperless-backup
%{_sbindir}/rcpaperless-backup-clean
%files flower
%config(noreplace) %attr(660,root,paperless) %{_sysconfdir}/paperless/flowerconfig.py
%{_unitdir}/paperless-flower.service
%{_sbindir}/rcpaperless-flower
%dir %attr(750,paperless,paperless) %{_sharedstatedir}/paperless/flower
%files postgresql
%files mariadb
%changelog