@@ -1,183 +0,0 @@
1−{ config, pkgs, lib, ... }:
2−
3−with lib;
4−let
5− cfg = config.services.paperless;
6−
7− defaultUser = "paperless";
8−
9− manage = cfg.package.withConfig {
10− config = {
11− PAPERLESS_CONSUMPTION_DIR = cfg.consumptionDir;
12− PAPERLESS_INLINE_DOC = "true";
13− PAPERLESS_DISABLE_LOGIN = "true";
14− } // cfg.extraConfig;
15− inherit (cfg) dataDir ocrLanguages;
16− paperlessPkg = cfg.package;
17− };
18−in
19−{
20− options.services.paperless = {
21− enable = mkOption {
22− type = lib.types.bool;
23− default = false;
24− description = ''
25− Enable Paperless.
26−
27− When started, the Paperless database is automatically created if it doesn't
28− exist and updated if the Paperless package has changed.
29− Both tasks are achieved by running a Django migration.
30− '';
31− };
32−
33− dataDir = mkOption {
34− type = types.str;
35− default = "/var/lib/paperless";
36− description = "Directory to store the Paperless data.";
37− };
38−
39− consumptionDir = mkOption {
40− type = types.str;
41− default = "${cfg.dataDir}/consume";
42− defaultText = "\${dataDir}/consume";
43− description = "Directory from which new documents are imported.";
44− };
45−
46− consumptionDirIsPublic = mkOption {
47− type = types.bool;
48− default = false;
49− description = "Whether all users can write to the consumption dir.";
50− };
51−
52− ocrLanguages = mkOption {
53− type = with types; nullOr (listOf str);
54− default = null;
55− description = ''
56− Languages available for OCR via Tesseract, specified as
57− <literal>ISO 639-2/T</literal> language codes.
58− If unset, defaults to all available languages.
59− '';
60− example = [ "eng" "spa" "jpn" ];
61− };
62−
63− address = mkOption {
64− type = types.str;
65− default = "localhost";
66− description = "Server listening address.";
67− };
68−
69− port = mkOption {
70− type = types.port;
71− default = 28981;
72− description = "Server port to listen on.";
73− };
74−
75− extraConfig = mkOption {
76− type = types.attrs;
77− default = {};
78− description = ''
79− Extra paperless config options.
80−
81− The config values are evaluated as double-quoted Bash string literals.
82−
83− See <literal>paperless-src/paperless.conf.example</literal> for available options.
84−
85− To enable user authentication, set <literal>PAPERLESS_DISABLE_LOGIN = "false"</literal>
86− and run the shell command <literal>$dataDir/paperless-manage createsuperuser</literal>.
87−
88− To define secret options without storing them in /nix/store, use the following pattern:
89− <literal>PAPERLESS_PASSPHRASE = "$(< /etc/my_passphrase_file)"</literal>
90− '';
91− example = literalExample ''
92− {
93− PAPERLESS_OCR_LANGUAGE = "deu";
94− }
95− '';
96− };
97−
98− user = mkOption {
99− type = types.str;
100− default = defaultUser;
101− description = "User under which Paperless runs.";
102− };
103−
104− package = mkOption {
105− type = types.package;
106− default = pkgs.paperless;
107− defaultText = "pkgs.paperless";
108− description = "The Paperless package to use.";
109− };
110−
111− manage = mkOption {
112− type = types.package;
113− readOnly = true;
114− default = manage;
115− description = ''
116− A script to manage the Paperless instance.
117− It wraps Django's manage.py and is also available at
118− <literal>$dataDir/manage-paperless</literal>
119− '';
120− };
121− };
122−
123− config = mkIf cfg.enable {
124−
125− systemd.tmpfiles.rules = [
126− "d '${cfg.dataDir}' - ${cfg.user} ${config.users.users.${cfg.user}.group} - -"
127− ] ++ (optional cfg.consumptionDirIsPublic
128− "d '${cfg.consumptionDir}' 777 - - - -"
129− # If the consumption dir is not created here, it's automatically created by
130− # 'manage' with the default permissions.
131− );
132−
133− systemd.services.paperless-consumer = {
134− description = "Paperless document consumer";
135− serviceConfig = {
136− User = cfg.user;
137− ExecStart = "${manage} document_consumer";
138− Restart = "always";
139− };
140− after = [ "systemd-tmpfiles-setup.service" ];
141− wantedBy = [ "multi-user.target" ];
142− preStart = ''
143− if [[ $(readlink ${cfg.dataDir}/paperless-manage) != ${manage} ]]; then
144− ln -sf ${manage} ${cfg.dataDir}/paperless-manage
145− fi
146−
147− ${manage.setupEnv}
148− # Auto-migrate on first run or if the package has changed
149− versionFile="$PAPERLESS_DBDIR/src-version"
150− if [[ $(cat "$versionFile" 2>/dev/null) != ${cfg.package} ]]; then
151− python $paperlessSrc/manage.py migrate
152− echo ${cfg.package} > "$versionFile"
153− fi
154− '';
155− };
156−
157− systemd.services.paperless-server = {
158− description = "Paperless document server";
159− serviceConfig = {
160− User = cfg.user;
161− ExecStart = "${manage} runserver --noreload ${cfg.address}:${toString cfg.port}";
162− Restart = "always";
163− };
164− # Bind to `paperless-consumer` so that the server never runs
165− # during migrations
166− bindsTo = [ "paperless-consumer.service" ];
167− after = [ "paperless-consumer.service" ];
168− wantedBy = [ "multi-user.target" ];
169− };
170−
171− users = optionalAttrs (cfg.user == defaultUser) {
172− users.${defaultUser} = {
173− group = defaultUser;
174− uid = config.ids.uids.paperless;
175− home = cfg.dataDir;
176− };
177−
178− groups.${defaultUser} = {
179− gid = config.ids.gids.paperless;
180− };
181− };
182− };
183−}