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