Tangled infrastructure definitions in Nix

Compare changes

Choose any two refs to compare.

Changed files
+45 -24
hosts
appview
+7 -17
flake.nix
··· 22 22 system = "x86_64-linux"; 23 23 commonArgs = import ./common/ssh.nix; 24 24 25 - colmenaHive = colmena.lib.makeHive { 26 - meta = { 27 - nixpkgs = nixpkgs.legacyPackages.x86_64-linux; 28 - specialArgs = { 29 - nixery-pkgs = import nixery-flake.outPath { 30 - pkgs = import nixpkgs { system = "x86_64-linux"; }; 31 - }; 32 - tangled-pkgs = tangled.packages.x86_64-linux; 33 - commonArgs = import ./common/ssh.nix; 34 - }; 35 25 # Helper function to create nixosConfiguration 36 26 mkHost = hostname: extraModules: 37 27 nixpkgs.lib.nixosSystem { ··· 44 34 }; 45 35 46 36 # Helper function to create colmena host 47 - mkColmenaHost = hostname: targetHost: extraModules: 37 + mkColmenaHost = hostname: targetHost: targetPort: extraModules: 48 38 { 49 39 deployment = { 50 40 inherit targetHost; 51 - targetPort = 22; 41 + inherit targetPort; 52 42 targetUser = "tangler"; 53 43 buildOnTarget = true; 54 44 }; ··· 137 127 environment.systemPackages = [ pkgs.curl ]; 138 128 }; 139 129 140 - appview = mkColmenaHost "appview" hosts.appview.target hosts.appview.modules; 141 - pds = mkColmenaHost "pds" hosts.pds.target hosts.pds.modules; 142 - nixery = mkColmenaHost "nixery" hosts.nixery.target hosts.nixery.modules; 143 - spindle = mkColmenaHost "spindle" hosts.spindle.target hosts.spindle.modules; 144 - knot1 = mkColmenaHost "knot1" hosts.knot1.target hosts.knot1.modules; 130 + appview = mkColmenaHost "appview" hosts.appview.target 2222 hosts.appview.modules; 131 + pds = mkColmenaHost "pds" hosts.pds.target 22 hosts.pds.modules; 132 + nixery = mkColmenaHost "nixery" hosts.nixery.target 22 hosts.nixery.modules; 133 + spindle = mkColmenaHost "spindle" hosts.spindle.target 22 hosts.spindle.modules; 134 + knot1 = mkColmenaHost "knot1" hosts.knot1.target 22 hosts.knot1.modules; 145 135 }; 146 136 }; 147 137 }
+1
hosts/appview/configuration.nix
··· 19 19 networking.hostName = "appview-arn"; 20 20 services = { 21 21 openssh.enable = true; 22 + openssh.ports = [2222]; 22 23 }; 23 24 24 25 # networking.extraHosts = ''
+37 -7
hosts/appview/services/nginx.nix
··· 7 7 recommendedOptimisation = true; 8 8 recommendedGzipSettings = true; 9 9 10 + # bot blocking 11 + appendHttpConfig = '' 12 + map $http_user_agent $block_bot { 13 + default 0; 14 + ~*PerplexityBot 1; 15 + ~*GPTBot 1; 16 + ~*ChatGPT-User 1; 17 + ~*CCBot 1; 18 + ~*anthropic-ai 1; 19 + ~*Claude-Web 1; 20 + } 21 + ''; 22 + 23 + streamConfig = '' 24 + upstream knot-sailor { 25 + server 94.237.110.185:22; 26 + } 27 + 28 + server { 29 + listen 22; 30 + listen [::]:22; 31 + proxy_pass knot-sailor; 32 + } 33 + ''; 34 + 10 35 virtualHosts = { 11 36 # Redirect tangled.sh โ†’ tangled.org 12 37 "tangled.sh" = { ··· 44 69 enableACME = true; 45 70 46 71 extraConfig = '' 72 + if ($block_bot) { 73 + return 403; 74 + } 75 + 47 76 # Redirect www โ†’ bare domain 48 77 if ($host = www.tangled.org) { 49 78 return 301 https://tangled.org$request_uri; ··· 53 82 ''; 54 83 55 84 locations."~ ^/@tangled\\.sh(/.*)?$" = { 56 - return = "301 https://tangled.org/@tangled.org$1$is_args$args"; 85 + extraConfig = '' 86 + rewrite ^/@tangled\.sh(.*)$ https://tangled.org/@tangled.org$1 permanent; 87 + ''; 57 88 }; 58 89 59 90 locations."~ ^/tangled\\.sh(/.*)?$" = { 60 - return = "301 https://tangled.org/tangled.org$1$is_args$args"; 91 + extraConfig = '' 92 + rewrite ^/tangled\.sh(.*)$ https://tangled.org/tangled.org$1 permanent; 93 + ''; 61 94 }; 95 + 62 96 63 97 locations."~ /logs$" = { 64 98 proxyPass = "http://127.0.0.1:3000"; ··· 71 105 locations."/" = { 72 106 proxyPass = "http://127.0.0.1:3000"; 73 107 extraConfig = '' 74 - proxy_set_header Host $host; 75 - proxy_set_header X-Real-IP $remote_addr; 76 - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 77 - proxy_set_header X-Forwarded-Proto $scheme; 78 108 client_max_body_size 100M; 79 109 ''; 80 110 }; ··· 83 113 }; 84 114 85 115 # Open firewall ports 86 - networking.firewall.allowedTCPPorts = [ 80 443 ]; 116 + networking.firewall.allowedTCPPorts = [ 80 443 2222 22 ]; 87 117 88 118 # ACME configuration for Let's Encrypt 89 119 security.acme = {