forked from fabian/nix
		
	
		
			
				
	
	
		
			100 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{
 | 
						|
  config,
 | 
						|
  lib,
 | 
						|
  pkgs,
 | 
						|
  ...
 | 
						|
}:
 | 
						|
with lib; let
 | 
						|
  inherit (config.local.sys) nets;
 | 
						|
in {
 | 
						|
  # adds "/var/lib/acme/acme-challenge" as a webroot fallback
 | 
						|
  options = {
 | 
						|
    security.acme = {
 | 
						|
      certs = mkOption {
 | 
						|
        type = with types;
 | 
						|
          attrsOf (submodule ({config, ...}: {
 | 
						|
            config = {
 | 
						|
              webroot =
 | 
						|
                if config.dnsProvider == null
 | 
						|
                then "/var/lib/acme/acme-challenge"
 | 
						|
                else null;
 | 
						|
            };
 | 
						|
          }));
 | 
						|
      };
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  config = {
 | 
						|
    networking = {
 | 
						|
      nftables.enable = false; # learn how to use this later
 | 
						|
      firewall = {
 | 
						|
        enable = true;
 | 
						|
        allowedTCPPorts = [80 443];
 | 
						|
      };
 | 
						|
      domain = "posixlycorrect.com";
 | 
						|
    };
 | 
						|
 | 
						|
    # ver https://nixos.org/manual/nixos/stable/index.html#module-security-acme-nginx
 | 
						|
    security.acme = {
 | 
						|
      acceptTerms = true;
 | 
						|
      defaults = {
 | 
						|
        email = "fabian@posixlycorrect.com";
 | 
						|
      };
 | 
						|
    };
 | 
						|
 | 
						|
    services = {
 | 
						|
      nginx = {
 | 
						|
        enable = true;
 | 
						|
        recommendedGzipSettings = true;
 | 
						|
        recommendedOptimisation = true;
 | 
						|
        recommendedProxySettings = true;
 | 
						|
        recommendedTlsSettings = true;
 | 
						|
        logError = "/var/log/nginx/error.log";
 | 
						|
        clientMaxBodySize = "99M";
 | 
						|
        virtualHosts = {
 | 
						|
          "posixlycorrect.com" = {
 | 
						|
            forceSSL = true;
 | 
						|
            enableACME = true;
 | 
						|
            locations = {
 | 
						|
              "/".root = "${pkgs.trivium.homepage}";
 | 
						|
              "/.well-known/openpgpkey/hu/".alias = "/var/public/wkd/";
 | 
						|
            };
 | 
						|
          };
 | 
						|
        };
 | 
						|
      };
 | 
						|
 | 
						|
      fail2ban = {
 | 
						|
        enable = true;
 | 
						|
        bantime = "10m";
 | 
						|
        ignoreIP = [
 | 
						|
          nets.default.hosts.vps.v6.cidr
 | 
						|
          nets.default.hosts.vps.v4.address
 | 
						|
          nets.vpn.v6.cidr
 | 
						|
        ];
 | 
						|
        bantime-increment = {
 | 
						|
          enable = true;
 | 
						|
          formula = "ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)";
 | 
						|
          maxtime = "48h"; # Do not ban for more than 48h
 | 
						|
          rndtime = "10m";
 | 
						|
          overalljails = true; # Calculate the bantime based on all the violations
 | 
						|
        };
 | 
						|
        jails = {
 | 
						|
          # https://discourse.nixos.org/t/fail2ban-with-nginx-and-authelia/31419
 | 
						|
          nginx-botsearch.settings = {
 | 
						|
            # Usar log en vez de journalctl
 | 
						|
            # TODO: Pasar todo a systemd?
 | 
						|
            backend = "pyinotify";
 | 
						|
            logpath = "/var/log/nginx/*.log";
 | 
						|
            journalmatch = "";
 | 
						|
          };
 | 
						|
          nginx-bad-request.settings = {
 | 
						|
            backend = "pyinotify";
 | 
						|
            logpath = "/var/log/nginx/*.log";
 | 
						|
            journalmatch = "";
 | 
						|
            maxretry = 10;
 | 
						|
          };
 | 
						|
        };
 | 
						|
      };
 | 
						|
    };
 | 
						|
  };
 | 
						|
}
 |