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}