summaryrefslogtreecommitdiff
path: root/hosts/surtr/etebase/default.nix
blob: 3b0bd9d33bce367af29dae878e3310c0b4977f4d (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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
{ config, pkgs, ... }:

{
  config = {
    services.etebase-server = {
      enable = true;
      port = null;
      unixSocket = "/run/etebase-server/etebase-server.sock";
      user = "etebase";
      settings = {
        allowed_hosts.allowed_host1 = "etesync.yggdrasil.li";
        global.secret_file = config.sops.secrets."etebase-server-secret.txt".path;
        database = {
          engine = "django.db.backends.postgresql";
          name = "etebase";
          user = "etebase";
        };
      };
    };

    systemd.services.etebase-server = {
      serviceConfig = {
        RuntimeDirectory = "etebase-server";
      };
    };

    sops.secrets."etebase-server-secret.txt" = {
      format = "binary";
      sopsFile = ./secret.txt;
      owner = config.services.etebase-server.user;
      group = config.services.etebase-server.user;
      restartUnits = ["etebase-server.service"];
    };

    security.acme.rfc2136Domains = {
      "etesync.yggdrasil.li" = {
        restartUnits = ["nginx.service"];
      };
      "app.etesync.yggdrasil.li" = {
        restartUnits = ["nginx.service"];
      };
    };

    services.nginx = {
      upstreams."etebase" = {
        servers = {
          "unix://${config.services.etebase-server.unixSocket}" = {};
        };
      };

      virtualHosts = {
        "etesync.yggdrasil.li" = {
          kTLS = true;
          http3 = true;
          forceSSL = true;
          sslCertificate = "/run/credentials/nginx.service/etesync.yggdrasil.li.pem";
          sslCertificateKey = "/run/credentials/nginx.service/etesync.yggdrasil.li.key.pem";
          sslTrustedCertificate = "/run/credentials/nginx.service/etesync.yggdrasil.li.chain.pem";
          extraConfig = ''
            client_max_body_size 100M;
            charset utf-8;
          '';

          locations = {
            "/static/" = {
              alias = "${config.services.etebase-server.settings.global.static_root}/";
            };
            "= /".return = "301 https://app.etesync.yggdrasil.li";
            "/".extraConfig = ''
              proxy_pass http://etebase;

              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";

              proxy_redirect off;
              proxy_set_header Host $host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-Host $server_name;
            '';
          };
        };

        "app.etesync.yggdrasil.li" = {
          kTLS = true;
          http3 = true;
          forceSSL = true;
          sslCertificate = "/run/credentials/nginx.service/app.etesync.yggdrasil.li.pem";
          sslCertificateKey = "/run/credentials/nginx.service/app.etesync.yggdrasil.li.key.pem";
          sslTrustedCertificate = "/run/credentials/nginx.service/app.etesync.yggdrasil.li.chain.pem";

          locations."/".alias = "${pkgs.etesync-web}/";
        };
      };
    };

    systemd.services.nginx = {
      serviceConfig = {
        ReadPaths = [
          config.services.etebase-server.settings.global.static_root
          pkgs.etesync-web
        ];
        LoadCredential = [
          "etesync.yggdrasil.li.key.pem:${config.security.acme.certs."etesync.yggdrasil.li".directory}/key.pem"
          "etesync.yggdrasil.li.pem:${config.security.acme.certs."etesync.yggdrasil.li".directory}/fullchain.pem"
          "etesync.yggdrasil.li.chain.pem:${config.security.acme.certs."etesync.yggdrasil.li".directory}/chain.pem"

          "app.etesync.yggdrasil.li.key.pem:${config.security.acme.certs."app.etesync.yggdrasil.li".directory}/key.pem"
          "app.etesync.yggdrasil.li.pem:${config.security.acme.certs."app.etesync.yggdrasil.li".directory}/fullchain.pem"
          "app.etesync.yggdrasil.li.chain.pem:${config.security.acme.certs."app.etesync.yggdrasil.li".directory}/chain.pem"
        ];
      };
    };

    users = {
      users.${config.services.etebase-server.user} = {
        isSystemUser = true;
        group = config.services.etebase-server.user;
        home = config.services.etebase-server.dataDir;
      };

      groups.${config.services.etebase-server.user} = {
        members = [ "nginx" ];
      };
    };
  };
}