1{ config, lib, pkgs, ... }:
2
3with lib;
4let
5 cfg = config.services.miniflux;
6
7 dbUser = "miniflux";
8 dbPassword = "miniflux";
9 dbHost = "localhost";
10 dbName = "miniflux";
11
12 defaultCredentials = pkgs.writeText "miniflux-admin-credentials" ''
13 ADMIN_USERNAME=admin
14 ADMIN_PASSWORD=password
15 '';
16
17 pgbin = "${config.services.postgresql.package}/bin";
18 preStart = pkgs.writeScript "miniflux-pre-start" ''
19 #!${pkgs.runtimeShell}
20 db_exists() {
21 [ "$(${pgbin}/psql -Atc "select 1 from pg_database where datname='$1'")" == "1" ]
22 }
23 if ! db_exists "${dbName}"; then
24 ${pgbin}/psql postgres -c "CREATE ROLE ${dbUser} WITH LOGIN NOCREATEDB NOCREATEROLE ENCRYPTED PASSWORD '${dbPassword}'"
25 ${pgbin}/createdb --owner "${dbUser}" "${dbName}"
26 ${pgbin}/psql "${dbName}" -c "CREATE EXTENSION IF NOT EXISTS hstore"
27 fi
28 '';
29in
30
31{
32 options = {
33 services.miniflux = {
34 enable = mkEnableOption "miniflux";
35
36 config = mkOption {
37 type = types.attrsOf types.str;
38 example = literalExample ''
39 {
40 CLEANUP_FREQUENCY = "48";
41 LISTEN_ADDR = "localhost:8080";
42 }
43 '';
44 description = ''
45 Configuration for Miniflux, refer to
46 <link xlink:href="https://miniflux.app/docs/configuration.html"/>
47 for documentation on the supported values.
48 '';
49 };
50
51 adminCredentialsFile = mkOption {
52 type = types.nullOr types.path;
53 default = null;
54 description = ''
55 File containing the ADMIN_USERNAME, default is "admin", and
56 ADMIN_PASSWORD (length >= 6), default is "password"; in the format of
57 an EnvironmentFile=, as described by systemd.exec(5).
58 '';
59 example = "/etc/nixos/miniflux-admin-credentials";
60 };
61 };
62 };
63
64 config = mkIf cfg.enable {
65
66 services.miniflux.config = {
67 LISTEN_ADDR = mkDefault "localhost:8080";
68 DATABASE_URL = "postgresql://${dbUser}:${dbPassword}@${dbHost}/${dbName}?sslmode=disable";
69 RUN_MIGRATIONS = "1";
70 CREATE_ADMIN = "1";
71 };
72
73 services.postgresql.enable = true;
74
75 systemd.services.miniflux-dbsetup = {
76 description = "Miniflux database setup";
77 wantedBy = [ "multi-user.target" ];
78 requires = [ "postgresql.service" ];
79 after = [ "network.target" "postgresql.service" ];
80 serviceConfig = {
81 Type = "oneshot";
82 User = config.services.postgresql.superUser;
83 ExecStart = preStart;
84 };
85 };
86
87 systemd.services.miniflux = {
88 description = "Miniflux service";
89 wantedBy = [ "multi-user.target" ];
90 requires = [ "postgresql.service" ];
91 after = [ "network.target" "postgresql.service" "miniflux-dbsetup.service" ];
92
93 serviceConfig = {
94 ExecStart = "${pkgs.miniflux}/bin/miniflux";
95 DynamicUser = true;
96 RuntimeDirectory = "miniflux";
97 RuntimeDirectoryMode = "0700";
98 EnvironmentFile = if cfg.adminCredentialsFile == null
99 then defaultCredentials
100 else cfg.adminCredentialsFile;
101 };
102
103 environment = cfg.config;
104 };
105 environment.systemPackages = [ pkgs.miniflux ];
106 };
107}