summaryrefslogtreecommitdiff
path: root/services/wakapi.nix
blob: 69251d3818f5d51bf7e5568077dfc1ae2639b629 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
{ config, lib, ... }:
let
  cfg = config.wilkuu.services.wakapi;
  hostname = config.networking.hostName;
  service_user = config.systemd.services.wakapi.serviceConfig.User;
in
{
  options.wilkuu.services.wakapi = with lib; {
    domain = mkOption {
      type = types.str;
      default = "wakapi.${hostname}.local";
      example = "wakapi.wilkuu.xyz";
      description = "Domain for http connections.";
    };
    email = mkOption {
      type = types.str;
      default = "wakapi@${hostname}.local";
      example = "noreply@wilkuu.xyz";
      description = "Mailer address";
    };
    doACME = mkEnableOption "Enable ACME for wakapi here";
    enable = mkEnableOption "Enable the wakapi service";
    dataDir = mkOption {
      type = types.path;
      description = "Storage localtion for wakapi data";
      default = "/srv/data/wakapi";
      example = "/srv/data/wakapi";
    };
  };

  config = lib.mkIf cfg.enable (
    let
      sopsPath = ../secrets/${hostname}/wakapi.yaml;
      secrets = [ "password_salt" ];
      toSops = (sname: "wakapi/${sname}");
    in
    {
      networking.hosts = {
        "127.0.0.1" = [ cfg.domain ];
      };

      sops.secrets = (
        lib.genAttrs (map toSops secrets) (_name: {
          sopsFile = sopsPath;
          mode = "0440";
          owner = service_user;
        })
      );

      services.nginx.virtualHosts."${cfg.domain}" = {
        enableACME = cfg.doACME;
        addSSL = cfg.doACME;
        locations."/" = {
          proxyPass = "http://localhost:3111";
          recommendedProxySettings = true;
        };
      };

      wilkuu.services.mysql = {
        unix_users = [ service_user ];
        databases.wakapi = {
          enable = true;
          allowedUsers = [ service_user ];
        };
      };

      systemd.services.wakapi.after = ["mysql.service"];
      services.wakapi = {
        enable = true;
        stateDir = cfg.dataDir;
        passwordSaltFile = config.sops.secrets."wakapi/password_salt".path;
        settings = {
          server = {
            port = 3111;
            public_url = cfg.domain;
          };
          app = {
            leaderboard_enabled = false;
            leaderboard_require_auth = true;
            inactive_days = 7; # time of previous days within a user must have logged in to be considered active
            # go time format strings to format human-readable dates
            # for details, check https://pkg.go.dev/time#Time.Format
            date_format = "Mon, 02 Jan 2006";
            datetime_format = "Mon, 02 Jan 2006 15:04";
          };
          db = {
            socket = "/run/mysqld/mysqld.sock";
            name = "wakapi";
            dialect = "mysql";
          };
          security = {
            insecure_cookies = false;
            trust_reverse_proxy_ips = "127.0.0.1";
          };
          mail = {
            # FIXME: Add email
            enabled = false;
            provider = "smtp";
            sender = "<Wakapi ${cfg.email}>";
            smtp = {
            };
          };
        };
        database = {
          dialect = "mysql";
          createLocally = false;
        };

      };
    }
  );
}