summary refs log tree commit diff
path: root/modules/www/default.nix
blob: ecc9b6618e57630b49ca7366868571eeaca097d3 (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
{
  me,
  config,
  pkgs,
  lib,
  util,
  ...
}:

let
  inherit (lib) mergeAttrsList;
  inherit (config.age) secrets;

  rnrdUrl = if me.is.renard then "rnrd.eu" else "${me.name}.rnrd.eu";

  base-index = pkgs.substituteAll {
    src = ../../assets/base.html;
    env.me = util.titleCase me.name;
  };

  base = pkgs.linkFarm "www-base" {
    "index.html" = base-index;
    "favicon.png" = ../../assets/favicon.png;
  };

  certificate = domain: {
    ${domain} = {
      domain = "*.${domain}";
      extraDomainNames = [ domain ];

      dnsProvider = "cloudflare";
      credentialFiles = {
        CLOUDFLARE_DNS_API_TOKEN_FILE = secrets.cloudflare-dns.path;
      };
    };
  };
in
{
  imports = [ ./tailnet.nix ];

  age.secrets = {
    cloudflare-dns.file = ../../secrets/cloudflare-dns.age;
  };

  security.acme = {
    acceptTerms = true;
    # causes issues with tailscale certificates
    preliminarySelfsigned = false;
    defaults = {
      email = "mel@rnrd.eu";
      # our certificates are really only used with Nginx
      group = config.services.nginx.group;
      reloadServices = [ "nginx.service" ];
    };

    certs = mergeAttrsList [
      (certificate "rnrd.eu")
      (certificate "rnrd.fyi")
    ];
  };

  services.nginx = {
    enable = true;
    recommendedGzipSettings = true;
    recommendedOptimisation = true;
    recommendedProxySettings = true;
    recommendedTlsSettings = true;

    statusPage = true;

    commonHttpConfig = ''
      log_format json_combined escape=json '{'
      	'"time_local":"$time_local",'
      	'"remote_addr":"$remote_addr",'
      	'"remote_user":"$remote_user",'
      	'"request":"$request",'
      	'"status": "$status",'
      	'"body_bytes_sent":"$body_bytes_sent",'
      	'"request_length":"$request_length",'
      	'"request_time":"$request_time",'
      	'"http_referrer":"$http_referer",'
      	'"http_user_agent":"$http_user_agent",'
      	'"upstream_response_time":"$upstream_response_time",'
      	'"upstream_addr":"$upstream_addr",'
      	'"upstream_status":"$upstream_status"'
      '}';
      access_log /var/log/nginx/access.log json_combined;
      error_log /var/log/nginx/error.log warn;
    '';

    virtualHosts = {
      base = {
        default = true;
        serverName = rnrdUrl;
        forceSSL = true;
        useACMEHost = "rnrd.eu";

        root = base;
        extraConfig = ''
          access_log /var/log/nginx/base.access.log json_combined;
        '';
      };
    };
  };
}