infrastructure

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit df8795157de65eeccd9fa9242f3ddc06aa0dfbeb
parent 7894b41b296c1e5f3f9fa7aa7f38a454d11168ef
Author: Silas Brack <silasbrack@gmail.com>
Date:   Sat, 27 Sep 2025 11:36:48 +0200

Add hetzner server

Diffstat:
M.sops.yaml | 2++
MMakefile | 4+++-
Mflake.nix | 10+++++++++-
Anixos/configuration-debian-2gb-hel1-1.nix | 163+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rnixos/configuration.nix -> nixos/configuration-nixos-s-1vcpu-512mb-10gb-ams3-01.nix | 0
Mnixos/vpn.nix | 5+++++
Msecrets.yaml | 39++++++++++++++++++++-------------------
7 files changed, 202 insertions(+), 21 deletions(-)

diff --git a/.sops.yaml b/.sops.yaml @@ -3,9 +3,11 @@ keys: - &desktop age1s29qgfupgx7mqn9dk2rndp6xh63f5qan8vqa77ve603wd5m9a9rqkpq7re - &hosts: - &server age1e52v0cr69sycuh59hksx9nk5327vgkemkxqwngd25gtztxhkpups87yd5g + - &hetzner age1damatvmepexkts3ayg2rfac0nal24tghxnrrvvmpu76wa4gvd58qyn2nwc creation_rules: - path_regex: secrets.yaml key_groups: - age: - *desktop - *server + - *hetzner diff --git a/Makefile b/Makefile @@ -1,6 +1,8 @@ .PHONY: deploy ## Deploy configuration to production server -deploy: +deploy-digitalocean: nixos-rebuild test --show-trace --fast --flake .#nixos-s-1vcpu-512mb-10gb-ams3-01 --target-host root@188.166.127.72 +deploy-hetzner: + nixos-rebuild test --show-trace --fast --flake .#debian-2gb-hel1-1 --target-host root@46.62.150.48 diff --git a/flake.nix b/flake.nix @@ -18,7 +18,14 @@ inherit system; modules = [ sops-nix.nixosModules.sops - (import ./nixos/configuration.nix) + (import ./nixos/configuration-nixos-s-1vcpu-512mb-10gb-ams3-01.nix) + ]; + }; + nixosConfigurations.debian-2gb-hel1-1 = nixpkgs.lib.nixosSystem { + inherit system; + modules = [ + sops-nix.nixosModules.sops + (import ./nixos/configuration-debian-2gb-hel1-1.nix) ]; }; # development environment (nix develop) @@ -30,6 +37,7 @@ in pkgs.mkShell { buildInputs = with pkgs; [ + age curl sops wireguard-tools diff --git a/nixos/configuration-debian-2gb-hel1-1.nix b/nixos/configuration-debian-2gb-hel1-1.nix @@ -0,0 +1,163 @@ +{ + pkgs, + modulesPath, + ... +}: +{ + # Generic + system.stateVersion = "25.05"; # Do not change lightly! + environment.systemPackages = with pkgs; [ + vim + wget + curl + rsync + rclone + zip + unzip + ]; + nix.settings.experimental-features = [ + "nix-command" + "flakes" + ]; + services.openssh.enable = true; + networking.firewall = { + allowedTCPPorts = [ + 80 + 443 + ]; + # allowedUDPPorts = [ + # 10232 + # ]; + }; + + boot.loader.grub = { + enable = false; + }; + fileSystems."/" = { + device = "/dev/sda1"; + fsType = "ext4"; + }; + nix.gc = { + automatic = true; + dates = "weekly"; + options = "--delete-older-than 30d"; + }; + nix.settings.auto-optimise-store = true; + + # Specific + networking.hostName = "debian-2gb-hel1-1"; + time.timeZone = "Europe/Helsinki"; + + imports = [ + # (modulesPath + "/virtualisation/digital-ocean-image.nix") + # ./vpn.nix + ]; + + sops.defaultSopsFile = ../secrets.yaml; + sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ]; + sops.secrets.hetzner_wireguard_key = { + restartUnits = [ "wg-quick-wg0.service" ]; + }; + + # networking.wg-quick.interfaces = { + # wg0 = { + # address = [ "10.100.0.7/24" ]; + # dns = [ "10.100.0.1" ]; + # listenPort = 10232; + # privateKeyFile = "/run/secrets/hetzner_wireguard_key"; + # peers = [ + # { + # publicKey = "2jWfr5UmACvuS+0HOfSNgEUYqoqVNnfVDoaatmgEykw="; + # allowedIPs = [ "0.0.0.0/0" ]; + # endpoint = "188.166.127.72:51820"; + # persistentKeepalive = 25; + # } + # ]; + # }; + # }; + + users.users = { + root.openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGqHJMc2SCzL50SO9Flfnhn012p1dmp4Iph8lPQ2aoe/ silasbrack@gmail.com" # Desktop + ]; + silas = { + isNormalUser = true; + description = "Silas Brack"; + home = "/home/silas"; + extraGroups = [ + "networkmanager" + "wheel" + ]; # "keys" + openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGqHJMc2SCzL50SO9Flfnhn012p1dmp4Iph8lPQ2aoe/ silasbrack@gmail.com" # Desktop + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMZ0gNM0od3EE/LL27kYQ/s5MOU7LBNc0pWRWROeINij silas@Lorenzas-MacBook-Pro.local" # Lolo's Macbook Pro + ]; + }; + }; + + security.acme = { + acceptTerms = true; + defaults.email = "silasbrack@gmail.com"; + }; + services.nginx = { + enable = true; + # virtualHosts."freshrss.fnarglebeast.com" = { + # forceSSL = true; + # enableACME = true; + # }; + # virtualHosts."livebook.fnarglebeast.com" = { + # forceSSL = true; + # enableACME = true; + # locations."/" = { + # proxyPass = "http://127.0.0.1:20123"; + # proxyWebsockets = true; # needed if you need to use WebSocket + # extraConfig = + # # required when the target is also TLS server with multiple hosts + # "proxy_ssl_server_name on;" + # + + # # required when the server wants to use HTTP Authentication + # "proxy_pass_header Authorization;"; + # }; + # }; + virtualHosts."karakeep.fnarglebeast.com" = { + forceSSL = true; + enableACME = true; + locations."/" = { + proxyPass = "http://127.0.0.1:8360"; + }; + }; + }; + + # sops.secrets.livebook_password_env_file = { }; + # services.livebook = { + # enableUserService = true; + # environment = { + # LIVEBOOK_PORT = 20123; + # LIVEBOOK_IFRAME_PORT = 20124; + # }; + # environmentFile = "/run/secrets/livebook_password_env_file"; + # extraPackages = with pkgs; [ + # gcc + # gnumake + # ]; + # }; + + # sops.secrets.freshrss_password = { + # owner = "freshrss"; + # }; + # services.freshrss = { + # enable = true; + # defaultUser = "silas"; + # passwordFile = "/run/secrets/freshrss_password"; + # baseUrl = "http://localhost:8080"; + # virtualHost = "freshrss.fnarglebeast.com"; + # }; + + services.karakeep = { + enable = true; + extraEnvironment = { + PORT = "8360"; + DISABLE_SIGNUPS = "true"; + }; + }; +} diff --git a/nixos/configuration.nix b/nixos/configuration-nixos-s-1vcpu-512mb-10gb-ams3-01.nix diff --git a/nixos/vpn.nix b/nixos/vpn.nix @@ -63,6 +63,11 @@ publicKey = "qmch+NjlcVOxBcOsfwk2SJIcpN58i54131OS9J2yvmM="; allowedIPs = [ "10.100.0.6/32" ]; } + { + # Hetzner server + publicKey = "QE4UoW2vSQMX8o1liA4MSwe4fE5sUB0+Ari5a/CqkSc="; + allowedIPs = [ "10.100.0.7/32" ]; + } ]; }; }; diff --git a/secrets.yaml b/secrets.yaml @@ -1,4 +1,5 @@ server_wireguard_key: ENC[AES256_GCM,data:21uPlSLnedqeXxIjS+HhJ0lAD6T/diIkjAAhbrB/a6jSVST9u8YTXWNgZ8w=,iv:pOGONrRuUNS8obDdw6GvEkCO7a+Ym5kOgLH6u+P9QQ0=,tag:cAcDTQ5pU8fV5hDzx+d+5A==,type:str] +hetzner_wireguard_key: ENC[AES256_GCM,data:mHPlUfbysQdmdxy107G1/Xhi0JB/c3Fz3QYKj6j6VXMVy0d7Lma7nr/G3bE=,iv:UGMm8uDUHUJGeLZ8dVsAiFj+43sHoxZSWF+hPcv8QVs=,tag:YSdMv8xj7cTdT05BVXkKPA==,type:str] freshrss_password: ENC[AES256_GCM,data:oK/KbYmiux2YdXtNiTVJQUWO5+2K2eDx,iv:v3+cOq6oQGXcp22jDmncoJJFbqF/KZCh9CjcsDTrA50=,tag:aIFGAcfcfkT0QrIsO6lIrQ==,type:str] livebook_password_env_file: ENC[AES256_GCM,data:aic46wuBFngu24R3U6sGXNuB8zQSj6YWIum8szgt6UDJ3PZpYlCT6yNEEZ/NlQ87C4NUELWPE402qZ/hPqjW0X0HcEpXIBnQ4ZcO8uoI0zbMeLFMgGw3+27Uq3dyfMxfCWfBe/VHGBK1i8hKEZ0xzIdPktyTF/bZUnsXXgKvoJtJToWXMbX0/g==,iv:zhZvELSPfIcjAu/ZDastRCJJXg7z5Q0qdPA+N3UqBjg=,tag:QfdwD/hpb/6zc6SiNWj/8A==,type:str] sops: @@ -6,31 +7,31 @@ sops: - recipient: age1s29qgfupgx7mqn9dk2rndp6xh63f5qan8vqa77ve603wd5m9a9rqkpq7re enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyTXRaUkNqVWpVY2NEdGo4 - QUNxbW41VWN3Mkx3NDRqbld0NlMyME5SRjJzCmEyZnVrWnRCcnoxbWE2bXFPQ1pk - ME81VTIxMlluTW0rYmlHS0tlK1NONk0KLS0tIEhZN1BIdnk4dHRkY3JyTmthZjR6 - aDFtMXJPbzhxYU1RaGVyUjYvc3Z2YUUKHh8Y5iuPB8D0VOxZvXQX61Uoae525ajZ - vc21qI0li9fBTmKNy0VYHDLvboP83jLNsAMd2To+xHmJimkhiivkew== + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2K3F3K1RUSWs5MktaejF6 + dDdLQTYrYnpEM3gxWTNHWWd6bFFFUnhObHpZCkNCU3BPT29UM0JFSWZDZ0RGSXkw + U2YxYzZaZFRvNElyaFBzeW9nTkg0cWMKLS0tIElhdGtOdFNhUW5Sb1pSY1J2L2cr + dzUybWZ2NStHQ0doL0xHYWJrZDNlUGcKQdgVBiwsLzTNkRs4F7SNoBk2f0cb7weE + 0eD240fbOmC6sghreXT2/QNJFqSt7RETHS21kbKpIcs0PNzVbre03g== -----END AGE ENCRYPTED FILE----- - - recipient: age10h669gfc0yfdrfj4gtnsrpdfvrsh55tn0cj8kuk5t3x5e079dpgs30cuxw + - recipient: age1e52v0cr69sycuh59hksx9nk5327vgkemkxqwngd25gtztxhkpups87yd5g enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBBNzNQMkorTkdISUJScUdr - SW9qUjJNU2hvbmhJRTQ3MG1sY1QxUWNVZ0YwCnpTS0FRKzZpbWpyOEpPMlFCQlhw - NmVVazNhZHBYdEFnMS9JT0Y2WUo1OTgKLS0tIEJ0Y3huYXJzY3poRkhTeXlOTXRv - MTFtYnh5Y0ZXMzdhV3ZqUjVLQjAzN0UKEFfu1TlRUHkyGDg2PLWQdm0VfXUiGZDZ - u5UsCR6bmvAMblGg4bXLmXhH61H97n6aJMS92j+G8uE4BDE1q/y4Tw== + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA1Q2NqRER0dDQ0RjZyVHhW + Ujh0Q09jaW10ZVV0ZEdwMXk4dW5PK2RMNG5VCjIyeGhxcTZLQnJlV1JrOWZYaFBn + bzJkc3pIM3ZzSjJpQ0dRNDgyS0JMU2cKLS0tIERhMU5yaGZiK3p0SDh3NGlydmNS + dmJ0c215TzhsT0graW8yK1ZZRU84bnMKA4aujo+KfrzDJWxsXtCTP7A2NI6Tgqr5 + +ZqVubHe9deC4zkuTv0jPs2YxiFP3/D/QI1+B07b+fFBHdLaj/VQ3A== -----END AGE ENCRYPTED FILE----- - - recipient: age1e52v0cr69sycuh59hksx9nk5327vgkemkxqwngd25gtztxhkpups87yd5g + - recipient: age1damatvmepexkts3ayg2rfac0nal24tghxnrrvvmpu76wa4gvd58qyn2nwc enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA5Um1lQ0tVcGh0ZUQ2TGUv - OG1Qck9iZ0JodkVPNGUwNCt5ZzI2NGxhQ1VvCmF1SmpNL2o5WlQrdTRYSTV0WUY2 - Um5hVUp4ODFLUWx4ckl4WlMxUEhYWEkKLS0tIFBBRWlDWlEvR3g3alY5emNaRVI4 - VTVIMjJSaGVRY3hYbmhzUmFiaCtxVUEKmGFgyEVxF0s8UqrbV9vpVonzEqMdx/9z - yeAc9I9fdMiakISPvkh9Jkexc4duFS1noGTIAXPfCEriIupol2MVvw== + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBNRkM3VUhabTdxTDRIYU1W + V2g5SlN1MUxta3lLRXc0dGRpMG9Mc0xOUWpnCldVdkVVUG80bmdtV3hJNVVrbHdF + aDR0UlpWcFZSaXgxWndvTS8xeERjeDAKLS0tIFJUaVdLelR6WURQQkFCdW9WVXFE + dXNXQkF5SXZjWHRPNjZaR29YZ1pRQ3MKJvGVAm8M9oIQBHJH1o0NG8x0c4qvgvHr + 1T/ghKHZWIpbXzct1LNy+5T10OgRxm5++NKuuuiAXW2XmnkJu1Bc3Q== -----END AGE ENCRYPTED FILE----- - lastmodified: "2025-05-26T15:57:13Z" - mac: ENC[AES256_GCM,data:eNWuQvY/0SNoX57EzSm47Og12oQl5eD5KPUH5rSKn5qXhr+8FYEOVwgN5/8wsODT3yZUGBSd/dCwdB6NeY48PfX5gVSC0gfBL6RwdzQhgGXhQ57nAWOGJ2x+J6vHXnEddlmv5yWbNhM2YQzS1slF4LAL/c7pv6S2n51yo4DUuO4=,iv:SZZ7SleiCD0f+9IZ5K6YDiaWcIZ9QfAzQj6tDQo/NEo=,tag:Q7Q/gPOyYZfyi8rZASPLNA==,type:str] + lastmodified: "2025-07-20T16:06:58Z" + mac: ENC[AES256_GCM,data:yX2QNz2QFXP9jHAiJ++hpxXeI253fFmF/93WPybxpHSzwHPsgMMby+jgPQkQ16xR+9OXN5qUAOk/EsCaV6nWBXPPM41nL843Paz3vabddJwhvxQoGsS47KbrnFJGZDluT5GA6cU6H+yEGelvmeKeyOyXx9jVn75sFXRNK8elUzU=,iv:OQnoRLmKVVlo1/bakPB3MciZM8gB2xtjvYYKxMdYBpA=,tag:+bVG8ZI5rVXI0ORRda1ThA==,type:str] unencrypted_suffix: _unencrypted version: 3.10.2