summaryrefslogtreecommitdiff
path: root/services/wakapi.nix
blob: 1b1e312538431c6635456e32cb1b8694391ab882 (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
{config, lib, pkgs, ...}: 
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 = let 
    in  {
      unix_users = [service_user]; 
      databases.wakapi = {
        enable = true; 
        allowedUsers = [service_user];
      };
    };

    services.wakapi = {
      enable = true;
      stateDir = cfg.dataDir;
      passwordSaltFile = config.sops.secrets.wakapi/password_salt;
      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= "/var/lib/mysql/mysql.sock";
          name = "wakapi"; 
          dialect = "mysql"; 
          charset = "utf8mb4";
        };
        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;
      };
      
    };
  }); 
}