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/
#
%if 0%{?sle_version} && 0%{?sle_version} < 160000
%{?sle15_python_module_pythons}
%elif %{defined primary_python}
%define pythons %{primary_python}
%else
%define pythons python3
%endif
%global mypython %pythons
%global mypython_sitelib %{expand:%%{%{mypython}_sitelib}}
%define plainpython python
# Python dependency versions
%global babel_min_version 2.17.0
%global bleach_min_version 6.3.0
%global celery_min_version 5.5.1
%global channels_min_version 4.2
%global channels_redis_min_version 4.2
%global concurrent_log_handler_min_version 0.9.25
%global dateparser_min_version 1.2
%global django_min_version 5.2.7
%global django_allauth_min_version 65.12.1
%global django_auditlog_min_version 3.3.0
%global django_cachalot_min_version 2.8.0
%global django_celery_results_min_version 2.6.0
%global django_compression_middleware_min_version 0.5.0
%global django_cors_headers_min_version 4.9.0
%global django_extensions_min_version 4.1
%global django_filter_min_version 25.1
%global django_guardian_min_version 3.2.0
%global django_multiselectfield_min_version 1.0.1
%global django_soft_delete_min_version 1.0.18
%global django_treenode_min_version 0.23.2
%global djangorestframework_min_version 3.16.1
%global djangorestframework_guardian_min_version 0.4.0
%global drf_spectacular_min_version 0.28
%global drf_spectacular_sidecar_min_version 2025.10.1
%global drf_writable_nested_min_version 0.7.1
%global filelock_min_version 3.20.0
%global flower_min_version 2.0.1
%global gotenberg_client_min_version 0.12.0
%global httpx_oauth_min_version 0.16
%global imap_tools_min_version 1.11.0
%global inotifyrecursive_min_version 0.3
%global jinja2_min_version 3.1.5
%global langdetect_min_version 1.0.9
%global nltk_min_version 3.9.1
%global ocrmypdf_min_version 16.12.0
%global pathvalidate_min_version 3.3.1
%global pdf2image_min_version 1.17.0
%global dateutil_min_version 2.9.0
%global python_dotenv_min_version 1.2.1
%global gnupg_min_version 0.5.4
%global python_ipware_min_version 3.0.0
%global python_magic_min_version 0.4.27
%global pyzbar_min_version 0.1.9
%global rapidfuzz_min_version 3.14.0
%global redis_min_version 5.2.1
%global hiredis_min_version 3.2.1
%global scikit_learn_min_version 1.7.0
%global setproctitle_min_version 1.3.4
%global tika_client_min_version 0.10.0
%global tqdm_min_version 4.67.1
%global watchdog_min_version 6.0
%global whitenoise_min_version 6.9
%global whoosh_reloaded_min_version 2.7.5
%global zxing_cpp_min_version 2.3.0
%global mysqlclient_min_version 2.2.7
%global psycopg_min_version 3.2.12
%global granian_min_version 2.5.1
%global humanize_min_version 4.12
Name: paperless-ngx
Version: 2.20.0
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.py
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
Source21: %{name}.target
# PATCH-FIX-UPSTREAM: https://github.com/paperless-ngx/paperless-ngx/pull/12239
Patch0: paperless-ngx-fix-redis-passwords.patch
BuildRequires: python-rpm-macros
BuildRequires: %{mypython}
BuildRequires: sysuser-tools
BuildRequires: fdupes
BuildRequires: %{python_module Babel >= %{babel_min_version}}
BuildRequires: %{python_module bleach >= %{bleach_min_version}}
BuildRequires: %{python_module celery >= %{celery_min_version}}
BuildRequires: %{python_module channels >= %{channels_min_version}}
BuildRequires: %{python_module channels-redis >= %{channels_redis_min_version}}
BuildRequires: %{python_module concurrent-log-handler >= %{concurrent_log_handler_min_version}}
BuildRequires: %{python_module dateparser >= %{dateparser_min_version}}
BuildRequires: %{python_module Django >= %{django_min_version}}
BuildRequires: %{python_module django-allauth >= %{django_allauth_min_version}}
BuildRequires: %{python_module django-allauth-socialaccount >= %{django_allauth_min_version}}
BuildRequires: %{python_module django-allauth-mfa >= %{django_allauth_min_version}}
BuildRequires: %{python_module django-auditlog >= %{django_auditlog_min_version}}
BuildRequires: %{python_module django-cachalot >= %{django_cachalot_min_version}}
BuildRequires: %{python_module django-celery-results >= %{django_celery_results_min_version}}
BuildRequires: %{python_module django-compression-middleware >= %{django_compression_middleware_min_version}}
BuildRequires: %{python_module django-cors-headers >= %{django_cors_headers_min_version}}
BuildRequires: %{python_module django-extensions >= %{django_extensions_min_version}}
BuildRequires: %{python_module django-filter >= %{django_filter_min_version}}
BuildRequires: %{python_module django-guardian >= %{django_guardian_min_version}}
BuildRequires: %{python_module django-multiselectfield >= %{django_multiselectfield_min_version}}
BuildRequires: %{python_module django-soft-delete >= %{django_soft_delete_min_version}}
BuildRequires: %{python_module django-treenode >= %{django_treenode_min_version}}
BuildRequires: %{python_module djangorestframework >= %{djangorestframework_min_version}}
BuildRequires: %{python_module djangorestframework-guardian >= %{djangorestframework_guardian_min_version}}
BuildRequires: %{python_module drf-spectacular >= %{drf_spectacular_min_version}}
BuildRequires: %{python_module drf-spectacular-sidecar >= %{drf_spectacular_sidecar_min_version}}
BuildRequires: %{python_module drf-writable-nested >= %{drf_writable_nested_min_version}}
BuildRequires: %{python_module filelock >= %{filelock_min_version}}
BuildRequires: %{python_module flower >= %{flower_min_version}}
BuildRequires: %{python_module gotenberg-client >= %{gotenberg_client_min_version}}
BuildRequires: %{python_module httpx-oauth >= %{httpx_oauth_min_version}}
BuildRequires: %{python_module humanize >= %{humanize_min_version}}
BuildRequires: %{python_module imap-tools >= %{imap_tools_min_version}}
BuildRequires: %{python_module inotifyrecursive >= %{inotifyrecursive_min_version}}
BuildRequires: %{python_module jinja2 >= %{jinja2_min_version}}
BuildRequires: %{python_module langdetect >= %{langdetect_min_version}}
BuildRequires: %{python_module mysqlclient >= %{mysqlclient_min_version}}
BuildRequires: %{python_module nltk >= %{nltk_min_version}}
BuildRequires: %{python_module ocrmypdf >= %{ocrmypdf_min_version}}
BuildRequires: %{python_module pathvalidate >= %{pathvalidate_min_version}}
BuildRequires: %{python_module pdf2image >= %{pdf2image_min_version}}
BuildRequires: %{python_module dateutil >= %{dateutil_min_version}}
BuildRequires: %{python_module python-dotenv >= %{python_dotenv_min_version}}
BuildRequires: %{python_module gnupg >= %{gnupg_min_version}}
BuildRequires: %{python_module python-ipware >= %{python_ipware_min_version}}
BuildRequires: %{python_module python-magic >= %{python_magic_min_version}}
BuildRequires: %{python_module psycopg >= %{psycopg_min_version}}
BuildRequires: %{python_module psycopg-c >= %{psycopg_min_version}}
BuildRequires: %{python_module psycopg-pool}
BuildRequires: %{python_module pyzbar >= %{pyzbar_min_version}}
BuildRequires: %{python_module rapidfuzz >= %{rapidfuzz_min_version}}
BuildRequires: %{python_module redis >= %{redis_min_version}}
BuildRequires: %{python_module hiredis >= %{hiredis_min_version}}
BuildRequires: %{python_module scikit-learn >= %{scikit_learn_min_version}}
BuildRequires: %{python_module setproctitle >= %{setproctitle_min_version}}
BuildRequires: %{python_module tika-client >= %{tika_client_min_version}}
BuildRequires: %{python_module tqdm >= %{tqdm_min_version}}
BuildRequires: %{python_module watchdog >= %{watchdog_min_version}}
BuildRequires: %{python_module whitenoise >= %{whitenoise_min_version}}
BuildRequires: %{python_module Whoosh-Reloaded >= %{whoosh_reloaded_min_version}}
BuildRequires: %{python_module zxing-cpp >= %{zxing_cpp_min_version}}
BuildRequires: %{python_module granian >= %{granian_min_version}}
BuildRequires: %{python_module granian-uvloop >= %{granian_min_version}}
Requires: %{mypython}-Babel >= %{babel_min_version}
Requires: %{mypython}-bleach >= %{bleach_min_version}
Requires: %{mypython}-celery >= %{celery_min_version}
Requires: %{mypython}-channels >= %{channels_min_version}
Requires: %{mypython}-channels-redis >= %{channels_redis_min_version}
Requires: %{mypython}-concurrent-log-handler >= %{concurrent_log_handler_min_version}
Requires: %{mypython}-dateparser >= %{dateparser_min_version}
Requires: %{mypython}-Django >= %{django_min_version}
Requires: %{mypython}-django-allauth >= %{django_allauth_min_version}
Requires: %{mypython}-django-allauth-socialaccount >= %{django_allauth_min_version}
Requires: %{mypython}-django-allauth-mfa >= %{django_allauth_min_version}
Requires: %{mypython}-django-auditlog >= %{django_auditlog_min_version}
Requires: %{mypython}-django-cachalot >= %{django_cachalot_min_version}
Requires: %{mypython}-django-celery-results >= %{django_celery_results_min_version}
Requires: %{mypython}-django-compression-middleware >= %{django_compression_middleware_min_version}
Requires: %{mypython}-django-cors-headers >= %{django_cors_headers_min_version}
Requires: %{mypython}-django-extensions >= %{django_extensions_min_version}
Requires: %{mypython}-django-filter >= %{django_filter_min_version}
Requires: %{mypython}-django-guardian >= %{django_guardian_min_version}
Requires: %{mypython}-django-multiselectfield >= %{django_multiselectfield_min_version}
Requires: %{mypython}-django-soft-delete >= %{django_soft_delete_min_version}
Requires: %{mypython}-django-treenode >= %{django_treenode_min_version}
Requires: %{mypython}-djangorestframework >= %{djangorestframework_min_version}
Requires: %{mypython}-djangorestframework-guardian >= %{djangorestframework_guardian_min_version}
Requires: %{mypython}-drf-spectacular >= %{drf_spectacular_min_version}
Requires: %{mypython}-drf-spectacular-sidecar >= %{drf_spectacular_sidecar_min_version}
Requires: %{mypython}-drf-writable-nested >= %{drf_writable_nested_min_version}
Requires: %{mypython}-filelock >= %{filelock_min_version}
Requires: %{mypython}-gotenberg-client >= %{gotenberg_client_min_version}
Requires: %{mypython}-httpx-oauth >= %{httpx_oauth_min_version}
Requires: %{mypython}-humanize >= %{humanize_min_version}
Requires: %{mypython}-imap-tools >= %{imap_tools_min_version}
Requires: %{mypython}-inotifyrecursive >= %{inotifyrecursive_min_version}
Requires: %{mypython}-jinja2 >= %{jinja2_min_version}
Requires: %{mypython}-langdetect >= %{langdetect_min_version}
Requires: %{mypython}-nltk >= %{nltk_min_version}
Requires: %{mypython}-ocrmypdf >= %{ocrmypdf_min_version}
Requires: %{mypython}-pathvalidate >= %{pathvalidate_min_version}
Requires: %{mypython}-pdf2image >= %{pdf2image_min_version}
Requires: %{mypython}-dateutil >= %{dateutil_min_version}
Requires: %{mypython}-python-dotenv >= %{python_dotenv_min_version}
Requires: %{mypython}-gnupg >= %{gnupg_min_version}
Requires: %{mypython}-python-ipware >= %{python_ipware_min_version}
Requires: %{mypython}-python-magic >= %{python_magic_min_version}
Requires: %{mypython}-pyzbar >= %{pyzbar_min_version}
Requires: %{mypython}-rapidfuzz >= %{rapidfuzz_min_version}
Requires: %{mypython}-redis >= %{redis_min_version}
Requires: %{mypython}-hiredis >= %{hiredis_min_version}
Requires: %{mypython}-scikit-learn >= %{scikit_learn_min_version}
Requires: %{mypython}-setproctitle >= %{setproctitle_min_version}
Requires: %{mypython}-tika-client >= %{tika_client_min_version}
Requires: %{mypython}-tqdm >= %{tqdm_min_version}
Requires: %{mypython}-watchdog >= %{watchdog_min_version}
Requires: %{mypython}-whitenoise >= %{whitenoise_min_version}
Requires: %{mypython}-Whoosh-Reloaded >= %{whoosh_reloaded_min_version}
Requires: %{mypython}-zxing-cpp >= %{zxing_cpp_min_version}
Requires: %{mypython}-granian >= %{granian_min_version}
Requires: %{mypython}-granian-uvloop >= %{granian_min_version}
Requires: qpdf
Requires: ImageMagick
Requires: poppler-tools
Requires: redis
Requires: nginx
Provides: %{name} = %{version}-%{release}
Obsoletes: %{name} < %{version}-%{release}
Requires(pre): system-user-paperless
BuildArch: noarch
%{?systemd_ordering}
%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: %{mypython}-flower >= %{flower_min_version}
%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: %{mypython}-psycopg >= %{psycopg_min_version}
Requires: %{mypython}-psycopg-c >= %{psycopg_min_version}
Requires: %{mypython}-psycopg-pool
%description postgresql
Run paperless-ngx with postgresql
%package mariadb
Summary: Paperless-ngx with mariadb
Requires: %{name} = %{version}-%{release}
Requires: mariadb
Requires: %{mypython}-mysqlclient >= %{mysqlclient_min_version}
%description mariadb
Run paperless-ngx with mariadb
%package -n system-user-paperless
Summary: System user and group paperless
BuildArch: noarch
%{?sysusers_requires}
%description -n system-user-paperless
System user and group used for paperless-ngx.
%prep
%autosetup -p1 -n %{name}
%sysusers_generate_pre %{SOURCE1} %{name}
%build
sed -i '1s|^#!/usr/bin/env python3|#!/usr/bin/python3|' src/manage.py
%install
# Users
install -Dpm0644 %{SOURCE1} %{buildroot}%{_sysusersdir}/system-user-paperless.conf
# Scripts
install -Dpm0755 %{SOURCE11} %{buildroot}%{_libexecdir}/paperless/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 -Dpm0644 %{SOURCE21} %{buildroot}%{_unitdir}/paperless.target
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
ln -s service %{buildroot}%{_sbindir}/rcpaperless
# 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 -n system-user-paperless -f %{name}.pre
%pre
%service_add_pre paperless.target
%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 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 flower
%service_add_pre paperless-flower.service
%post
%service_add_post paperless.target
%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.target
%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.target
%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 -n system-user-paperless
%{_sysusersdir}/system-user-paperless.conf
%files
%license LICENSE
%doc README.md
%dir %{_libexecdir}/paperless
%{_libexecdir}/paperless/download-nltk-corpus
%dir %{_sysconfdir}/paperless
%config(noreplace) %attr(660,root,paperless) %{_sysconfdir}/paperless/paperless.conf
%config(noreplace) %attr(640,root,root) %{_sysconfdir}/default/paperless
%{_unitdir}/paperless.target
%{_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-users) %{_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-users) %{_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
%{_sbindir}/rcpaperless
%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