main
 1{lib, ...}: {
 2  den.aspects.services.wakapi = {
 3    settings.host = {
 4      domain = lib.mkOption {
 5        type = lib.types.str;
 6      };
 7      address = {
 8        ipv4 = lib.mkOption {
 9          type = lib.types.str;
10          default = "127.0.0.1";
11        };
12        ipv6 = lib.mkOption {
13          type = lib.types.str;
14          default = "::1";
15        };
16      };
17      port = lib.mkOption {
18        type = lib.types.port;
19        default = 5423;
20      };
21      passwordSaltFileAged = lib.mkOption {
22        type = lib.types.path;
23      };
24    };
25
26    persist = {
27      directories = [
28        {
29          directory = "/var/lib/private/wakapi";
30          user = "nobody";
31          group = "nogroup";
32          mode = "0700";
33        }
34      ];
35    };
36
37    reverseProxy = {host, ...}: let
38      cfg = host.settings.services.wakapi;
39    in {
40      ${cfg.domain} = {
41        port = cfg.port;
42      };
43    };
44
45    nixos = {
46      host,
47      config,
48      ...
49    }: let
50      cfg = host.settings.services.wakapi;
51    in {
52      services.wakapi = {
53        enable = true;
54        settings = {
55          server = {
56            listen_ipv4 = cfg.address.ipv4;
57            listen_ipv6 = cfg.address.ipv6;
58            port = cfg.port;
59            public_url = "https://${cfg.domain}";
60          };
61          app = {
62            leaderboard_enabled = false;
63            avatar_url_template = "https://0.gravatar.com/avatar/{email_hash}";
64            date_format = "2006-01-02"; # Go
65            datetime_format = "2006-01-02 15:04";
66          };
67        };
68        environmentFiles = [
69          config.vaultix.templates.wakapi-env.path
70        ];
71      };
72
73      vaultix.secrets.wakapi-password-salt.file = cfg.passwordSaltFileAged;
74      vaultix.templates.wakapi-env.content = ''
75        WAKAPI_PASSWORD_SALT=${config.vaultix.placeholder.wakapi-password-salt}
76      '';
77    };
78  };
79}