# Web services configuration { config, pkgs, lib, ... }: { environment.systemPackages = with pkgs; [ libressl ]; # Reverse proxy configuration services.nginx = { enable = true; recommendedTlsSettings = true; recommendedGzipSettings = true; recommendedProxySettings = true; recommendedOptimisation = true; clientMaxBodySize = "0"; sslCiphers = "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK:!AES128"; sslProtocols = "TLSv1.2 TLSv1.3"; sslDhparam = "/var/lib/dhparams/nginx.pem"; commonHttpConfig = '' # Add HSTS header with preloading to HTTPS requests. # Adding this header to HTTP requests is discouraged map $scheme $hsts_header { https "max-age=31536000; includeSubdomains; preload"; } add_header Strict-Transport-Security $hsts_header; # Enable CSP for your services. #add_header Content-Security-Policy "script-src 'self'; object-src 'none'; base-uri 'none';" always; # Minimize information leaked to other domains add_header 'Referrer-Policy' 'origin-when-cross-origin'; # Disable embedding as a frame add_header X-Frame-Options DENY; # Prevent injection of code in other mime types (XSS Attacks) add_header X-Content-Type-Options nosniff; # Enable XSS protection of the browser. # May be unnecessary when CSP is configured properly (see above) add_header X-XSS-Protection "1; mode=block"; # This might create errors proxy_cookie_path / "/; secure; HttpOnly; SameSite=strict"; ''; virtualHosts = { "coolneng.duckdns.org" = { enableACME = true; forceSSL = true; locations."/radicale/" = { return = "301 https://radicale.coolneng.duckdns.org"; }; locations."/syncthing/" = { return = "301 https://sync.coolneng.duckdns.org"; }; locations."/gitea/" = { extraConfig = "rewrite ^/gitea/(.*)$ https://git.coolneng.duckdns.org/$1 last;"; }; locations."/miniflux/" = { extraConfig = "rewrite ^/miniflux/(.*)$ https://rss.coolneng.duckdns.org/$1 last;"; }; locations."/.well-known/".alias = "${../well-known}" + "/"; }; "radicale.coolneng.duckdns.org" = { enableACME = true; forceSSL = true; locations."/" = { proxyPass = "http://localhost:5232/"; extraConfig = '' proxy_set_header X-Script-Name /; proxy_pass_header Authorization; ''; }; }; "sync.coolneng.duckdns.org" = { enableACME = true; forceSSL = true; locations."/" = { proxyPass = "http://localhost:8384/"; }; }; "git.coolneng.duckdns.org" = { enableACME = true; forceSSL = true; locations."/" = { proxyPass = "http://localhost:3000/"; }; }; "rss.coolneng.duckdns.org" = { enableACME = true; forceSSL = true; locations."/" = { proxyPass = "http://localhost:8080/"; }; }; "matrix.coolneng.duckdns.org" = { enableACME = true; forceSSL = true; listen = [ { addr = "0.0.0.0"; port = 8448; ssl = true; } { addr = "0.0.0.0"; port = 443; ssl = true; } ]; locations."/" = { proxyPass = "http://localhost:8008/"; }; }; "element.coolneng.duckdns.org" = { enableACME = true; forceSSL = true; locations."/" = { root = pkgs.element-web.override { conf = { default_server_config."m.homeserver" = { "base_url" = "https://matrix.coolneng.duckdns.org"; "server_name" = "coolneng.duckdns.org"; }; }; }; }; }; "wallabag.coolneng.duckdns.org" = { root = "${pkgs.wallabag}/web"; locations."/" = { tryFiles = "$uri /app.php$is_args$args"; }; locations."~ ^/app.php(/|$)" = { extraConfig = '' include ${pkgs.nginx}/conf/fastcgi.conf; fastcgi_pass unix:/run/phpfpm/wallabag.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param WALLABAG_DATA /var/lib/wallabag/app; fastcgi_param DOCUMENT_ROOT $realpath_root; internal; ''; }; }; }; }; # ACME certs configuration security.acme = { acceptTerms = true; email = "akasroua@gmail.com"; certs = { "coolneng.duckdns.org" = { extraDomainNames = [ "radicale.coolneng.duckdns.org" "sync.coolneng.duckdns.org" "git.coolneng.duckdns.org" "rss.coolneng.duckdns.org" "matrix.coolneng.duckdns.org" "element.coolneng.duckdns.org" "wallabag.coolneng.duckdns.org" ]; }; }; }; # Generate dhparams security.dhparams = { enable = true; params = { nginx.bits = 2048; }; }; # PostgreSQL databases configuration services.postgresql = { enable = true; package = pkgs.postgresql_11; authentication = lib.mkForce '' # Generated file; do not edit! # TYPE DATABASE USER ADDRESS METHOD local all all trust host all all 127.0.0.1/32 trust host all all ::1/128 trust ''; }; # Restart reverse proxy after services startup systemd.services.nginx.after = [ "gitea.service" "syncthing.service" "miniflux.service" "radicale.service" "matrix-synapse.service" "element.service" "phpfpm-wallabag.service" ]; }