From 8cfc0001b9adfa66f70f3788b343242ad6c856a2 Mon Sep 17 00:00:00 2001 From: soyouzpanda Date: Thu, 9 Jan 2025 23:05:17 +0100 Subject: [PATCH] feat(build01): Init --- .forgejo/workflows/eval-nodes.yaml | 11 ++ keys/default.nix | 1 + machines/nixos/build01/_configuration.nix | 26 +++++ .../nixos/build01/_hardware-configuration.nix | 59 ++++++++++ machines/nixos/build01/nix-builder.nix | 70 ++++++++++++ .../secrets/forgejo_runners-token_file | 31 +++++ machines/nixos/build01/secrets/secrets.nix | 7 ++ machines/nixos/storage01/_configuration.nix | 1 + machines/nixos/storage01/forgejo-runners.nix | 39 +------ meta/network.nix | 19 +++ meta/nodes/nixos.nix | 22 ++++ meta/organization.nix | 8 ++ modules/nixos/default.nix | 2 + modules/nixos/dgn-forgejo-runners.nix | 91 +++++++++++++++ modules/nixos/dgn-notify/mail | 107 ++++++++--------- .../nixos/dgn-records/__arkheon-token_file | 108 +++++++++--------- npins/default.nix | 1 + npins/sources.json | 4 +- 18 files changed, 464 insertions(+), 143 deletions(-) create mode 100644 machines/nixos/build01/_configuration.nix create mode 100644 machines/nixos/build01/_hardware-configuration.nix create mode 100644 machines/nixos/build01/nix-builder.nix create mode 100644 machines/nixos/build01/secrets/forgejo_runners-token_file create mode 100644 machines/nixos/build01/secrets/secrets.nix create mode 100644 modules/nixos/dgn-forgejo-runners.nix diff --git a/.forgejo/workflows/eval-nodes.yaml b/.forgejo/workflows/eval-nodes.yaml index 452517e..b39bb0f 100644 --- a/.forgejo/workflows/eval-nodes.yaml +++ b/.forgejo/workflows/eval-nodes.yaml @@ -21,6 +21,17 @@ jobs: STORE_USER: admin name: Build and cache bridge01 run: nix-shell -A eval-nodes --run cache-node + build01: + runs-on: nix + steps: + - uses: actions/checkout@v3 + - env: + BUILD_NODE: build01 + STORE_ENDPOINT: https://tvix-store.dgnum.eu/infra-signing/ + STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }} + STORE_USER: admin + name: Build and cache build01 + run: nix-shell -A eval-nodes --run cache-node compute01: runs-on: nix steps: diff --git a/keys/default.nix b/keys/default.nix index 1a38900..5a1b797 100644 --- a/keys/default.nix +++ b/keys/default.nix @@ -20,6 +20,7 @@ rec { _keys = { # SSH keys of the nodes bridge01 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP5bS3iBXz8wycBnTvI5Qi79WLu0h4IVv/EOdKYbP5y7" ]; + build01 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIYJcEMQpOyKInqtd2/brnSQuzwgv6fNPlTSQx9tcvPu" ]; compute01 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE/YluSVS+4h3oV8CIUj0OmquyJXju8aEQy0Jz210vTu" ]; geo01 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEl6Pubbau+usQkemymoSKrTBbrX8JU5m5qpZbhNx8p4" ]; geo02 = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFNXaCS0/Nsu5npqQk1TP6wMHCVIOaj4pblp2tIg6Ket" ]; diff --git a/machines/nixos/build01/_configuration.nix b/machines/nixos/build01/_configuration.nix new file mode 100644 index 0000000..2911f57 --- /dev/null +++ b/machines/nixos/build01/_configuration.nix @@ -0,0 +1,26 @@ +# SPDX-FileCopyrightText: 2025 Elias Coppens +# +# SPDX-License-Identifier: EUPL-1.2 + +{ lib, ... }: + +lib.extra.mkConfig { + enabledModules = [ + "dgn-forgejo-runners" + ]; + + enabledServices = [ + "nix-builder" + ]; + + extraConfig = { + dgn-forgejo-runners = { + nbRunners = 16; + dataDirectory = "/data"; + }; + + services.netbird.enable = true; + }; + + root = ./.; +} diff --git a/machines/nixos/build01/_hardware-configuration.nix b/machines/nixos/build01/_hardware-configuration.nix new file mode 100644 index 0000000..8a7c867 --- /dev/null +++ b/machines/nixos/build01/_hardware-configuration.nix @@ -0,0 +1,59 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ + config, + lib, + modulesPath, + ... +}: + +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot = { + initrd = { + availableKernelModules = [ + "xhci_pci" + "nvme" + "megaraid_sas" + "ehci_pci" + "ahci" + "usbhid" + "sd_mod" + ]; + kernelModules = [ "dm-snapshot" ]; + }; + kernelModules = [ "kvm-amd" ]; + extraModulePackages = [ ]; + }; + + fileSystems = { + "/" = { + device = "/dev/disk/by-uuid/fed99278-0916-4d9c-b974-c7125d3557b3"; + fsType = "xfs"; + }; + + "/data" = { + device = "/dev/disk/by-uuid/69b62f16-7db1-4720-a115-fd3b8dafe123"; + fsType = "xfs"; + }; + + "/boot" = { + device = "/dev/disk/by-uuid/1372-46EA"; + fsType = "vfat"; + options = [ + "fmask=0022" + "dmask=0022" + ]; + }; + }; + + swapDevices = [ + { device = "/dev/disk/by-uuid/34b9e0ab-c579-4293-849c-78f5093cf35a"; } + ]; + + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/machines/nixos/build01/nix-builder.nix b/machines/nixos/build01/nix-builder.nix new file mode 100644 index 0000000..d21fec4 --- /dev/null +++ b/machines/nixos/build01/nix-builder.nix @@ -0,0 +1,70 @@ +# SPDX-FileCopyrightText: 2025 Elias Coppens +# +# SPDX-License-Identifier: EUPL-1.2 + +{ + pkgs, + lib, + meta, + ... +}: +let + keys = (import ../../../keys)._keys; +in +{ + config = { + users.users = lib.genAttrs meta.organization.groups.nix-builder (u: { + isNormalUser = true; + openssh.authorizedKeys.keys = keys.${u}; + }); + + security.pam.loginLimits = [ + { + domain = "*"; + item = "nofile"; + type = "-"; + value = "20480"; + } + ]; + + systemd.services.nix-daemon.serviceConfig = { + MemoryAccounting = true; + MemoryMax = "450G"; + MemoryHigh = "440G"; + MemorySwapMax = "2G"; + ManagedOOMSwap = "kill"; + ManagedOOMMemoryPressure = "kill"; + MemoryPressureWatch = "on"; + }; + + nix = { + gc = { + automatic = true; + dates = lib.mkForce "*:45"; + options = lib.mkForce ''--max-freed "$((128 * 1024**3 - 1024 * $(df -P -k /nix/store | tail -n 1 | ${pkgs.gawk}/bin/awk '{ print $4 }')))"''; + + randomizedDelaySec = "1800"; + }; + + nrBuildUsers = 128; + + settings = { + keep-outputs = false; + keep-derivations = false; + use-cgroups = true; + http-connections = 0; + auto-allocate-uids = true; + cores = 0; + max-jobs = 8; + fsync-metadata = true; + experimental-features = [ + "auto-allocate-uids" + # "ca-derivations" this feature is really extremely broken. + "cgroups" + "fetch-closure" + "impure-derivations" + ]; + }; + }; + }; +} diff --git a/machines/nixos/build01/secrets/forgejo_runners-token_file b/machines/nixos/build01/secrets/forgejo_runners-token_file new file mode 100644 index 0000000..5c475d3 --- /dev/null +++ b/machines/nixos/build01/secrets/forgejo_runners-token_file @@ -0,0 +1,31 @@ +age-encryption.org/v1 +-> ssh-ed25519 jIXfPA plGvUUrRbdkfNyD4UGIjjkv3Ktu4iqL4dImFZzWnqWA +asE0N7d6lqnOFJWoU+V1bCLhlD5oFAkjs9HSM+ps6Ak +-> ssh-ed25519 QlRB9Q hagbD6do4gKBuRBN8m8cDL6K0RFmiJwpvJOtAaPKXnA +9727tWz+PhGm/bycXUUQHV3YqeXc0AD/mM1DvTrBLC4 +-> ssh-ed25519 r+nK/Q bnu+1g77I2LLnXNHZWMkIrgJpxpwJ1ZYgdAL4HE6hCo +cDLyOiULyjO9s6PACs6Ou6m5h0XcDzbdc7o2P7OAizQ +-> ssh-rsa krWCLQ +X8SpFIBmd7LOnJqI+V3MWlaYB8f4Mron5IKYZGrqRPWzLrrkAkJsr1QdV4K9vepe +zQsHecw8VvCKQesAKFrKTZxF8oXvoJU3GP5q9IVISLuEv8nLxgyhhLqQQqPVWLbC +0nGGtbke2Xw2QXgUpoe6GdZ53Neg2BShUmV6SYoGeTwdxGmuL6nFH7UMzwsKWLW5 +95CoXfRyp4oxV7FQscuewPL+tNHXh6DoeW8Qlr3rxxgJkCSNMp+EchZJZOroGmtd +SQb2SgFs712x9han1vNR7Dn3o270xa/AVldmjRBNvDGyNefItb20OP4n3bWSK3b1 +ejR3mZyP5SU2+Pr6navc0w +-> ssh-ed25519 /vwQcQ NQSD4lKvM7uWm0deYyc22DC7/IGYve0XB9Zg8yOY5GE +hpDWSKnlW6BtyKlXXS1anB78CvK+mnsm3BOxht7mL4Y +-> ssh-ed25519 0R97PA i4DSi49b4vQpt3hjiHPn0/H9MzyvHz0OEPJXcvn+G1M +C9uEKNTPRK8f4d2AYnPqDwTqDOV0SHmG/x/529l3YLA +-> ssh-ed25519 JGx7Ng 5WgVespkMD/X/67sBoF2RbG+YXu06UuSozHrLJSn2xE +pISCxxw/Hg9GBxh33gW6JO2mLKrdvSUVb6+AHMHwTtE +-> ssh-ed25519 bUjjig 14Ocpj1tCsZ5lZQ32wDHsO9iFkrNi8wZS8NUhQ5HEh0 +ZbX31ejXuqmgKD1EcmH/B0zo1CeORzJn+QjrRuWNxh0 +-> ssh-ed25519 oRtTqQ dSGSGECezsXdDeyFcOSLIvKT0jdOs2d73/dRAeBuJjc +2O/CXEu0rV5EdAewyvdA5XfLXMQvzEEtl8lPsBqICqk +-> ssh-ed25519 IxxZqA BbHNkDUiEoWcwGjjrkFbOHCXvq2gEd8Rv7tt3p8fXHA +yJsvxku/Kz26jTTEtuoHDLGO/gUotw/QZc+UwxCIwKE +-> Tqc#'yq%-grease b +X3iOhNF2FNp0ImC6uLsqjT1pAbNPBIxUCXLivDKbVIZYoBhtrLpQRJXoWK7GEakA +8TkORCQQUYZIlNqu2Psfbi0 +--- 19Nolty0dET6QnYlxtieiluPP9R3HbrhEn5EDuFu/s4 +?l6r]fBo<9lj5M+7NϹ% .ELĘwsnnN -̯pˊ \ No newline at end of file diff --git a/machines/nixos/build01/secrets/secrets.nix b/machines/nixos/build01/secrets/secrets.nix new file mode 100644 index 0000000..5974c55 --- /dev/null +++ b/machines/nixos/build01/secrets/secrets.nix @@ -0,0 +1,7 @@ +# SPDX-FileCopyrightText: 2025 La Délégation Générale Numérique +# +# SPDX-License-Identifier: EUPL-1.2 + +(import ../../../../keys).mkSecrets [ "build01" ] [ + "forgejo_runners-token_file" +] diff --git a/machines/nixos/storage01/_configuration.nix b/machines/nixos/storage01/_configuration.nix index 3c7cb32..05a080e 100644 --- a/machines/nixos/storage01/_configuration.nix +++ b/machines/nixos/storage01/_configuration.nix @@ -9,6 +9,7 @@ lib.extra.mkConfig { # List of modules to enable "dgn-backups" "dgn-web" + "dgn-forgejo-runners" ]; enabledServices = [ diff --git a/machines/nixos/storage01/forgejo-runners.nix b/machines/nixos/storage01/forgejo-runners.nix index fef5e6a..cf13fbe 100644 --- a/machines/nixos/storage01/forgejo-runners.nix +++ b/machines/nixos/storage01/forgejo-runners.nix @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: EUPL-1.2 -{ config, pkgs, ... }: +_: let url = "https://git.dgnum.eu"; @@ -30,22 +30,10 @@ let }; in { - services.forgejo-nix-runners = { - enable = true; - - inherit url; - - storePath = "/data/slow"; - tokenFile = config.age.secrets."forgejo_runners-token_file".path; - - dependencies = [ - pkgs.npins - pkgs.tea - ]; - - containerOptions = [ "--cpus=4" ]; - + dgn-forgejo-runners = { nbRunners = 6; + nbCpus = 4; + dataDirectory = "/data/slow"; }; services.gitea-actions-runner.instances = builtins.mapAttrs (_: mkRunner) { @@ -63,23 +51,4 @@ in labels = [ "debian-latest:docker://node:20-bookworm" ]; }; }; - - virtualisation = { - podman = { - enable = true; - - defaultNetwork.settings = { - dns_enable = true; - ipv6_enabled = true; - }; - }; - - containers.storage.settings = { - storage = { - driver = "overlay"; - graphroot = "/data/slow/containers/storage"; - runroot = "/run/containers/storage"; - }; - }; - }; } diff --git a/meta/network.nix b/meta/network.nix index 6980e44..69cf8b5 100644 --- a/meta/network.nix +++ b/meta/network.nix @@ -13,6 +13,25 @@ netbirdIp = null; }; + build01 = { + interfaces = { + enp35s0f0np0 = { + ipv4 = [ + { + address = "10.0.254.21"; + prefixLength = 24; + } + ]; + + gateways = [ "10.0.254.1" ]; + enableDefaultDNS = true; + }; + }; + + hostId = "adb676ce"; + netbirdIp = "100.80.31.249"; + }; + compute01 = { interfaces = { eno1 = { diff --git a/meta/nodes/nixos.nix b/meta/nodes/nixos.nix index dea4288..c1da5ee 100644 --- a/meta/nodes/nixos.nix +++ b/meta/nodes/nixos.nix @@ -49,6 +49,28 @@ }; }; + build01 = { + site = "pot01"; + + hashedPassword = "$y$j9T$n83qOn1OkQhFwQe50tPM11$jZ1tvgqMTcp4HLGEfJmTMsf0NnRUYQkzco9vibWTpU2"; + + stateVersion = "24.11"; + nix-modules = [ + "services/forgejo-nix-runners" + ]; + + nixpkgs = { + version = "24.11"; + system = "nixos"; + }; + + admins = [ "ecoppens" ]; + + deployment = { + targetHost = "build01.dgnum"; + }; + }; + compute01 = { site = "pav01"; diff --git a/meta/organization.nix b/meta/organization.nix index af2247b..0671b81 100644 --- a/meta/organization.nix +++ b/meta/organization.nix @@ -95,6 +95,14 @@ "catvayor" "ecoppens" ]; + + nix-builder = [ + "catvayor" + "ecoppens" + "mdebray" + "raito" + "thubrecht" + ]; }; external = { diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix index cc1e316..3951b22 100644 --- a/modules/nixos/default.nix +++ b/modules/nixos/default.nix @@ -21,6 +21,7 @@ "dgn-console" "dgn-chatops" "dgn-firewall" + "dgn-forgejo-runners" "dgn-hardware" "dgn-netbox-agent" "dgn-network" @@ -43,6 +44,7 @@ [ "age-secrets" "services/bupstash" + "services/forgejo-nix-runners" "services/reaction" "services/systemd-notify" ] diff --git a/modules/nixos/dgn-forgejo-runners.nix b/modules/nixos/dgn-forgejo-runners.nix new file mode 100644 index 0000000..23166db --- /dev/null +++ b/modules/nixos/dgn-forgejo-runners.nix @@ -0,0 +1,91 @@ +# SPDX-FileCopyrightText: 2024 Tom Hubrecht +# SPDX-FileContributor: Elias Coppens +# +# SPDX-License-Identifier: EUPL-1.2 + +{ + config, + lib, + pkgs, + name, + ... +}: + +let + inherit (lib) mkEnableOption mkIf mkOption; + + inherit (lib.types) int nullOr str; + + cfg = config.dgn-forgejo-runners; +in +{ + options.dgn-forgejo-runners = { + enable = mkEnableOption "forgejo-nix-runners for the DGNum forge"; + + nbRunners = mkOption { + type = int; + description = '' + Number of runners to spawn. + ''; + }; + + nbCpus = mkOption { + type = nullOr int; + default = null; + description = '' + Maximum number of cores available for each runner. + When set to null, there will be no restriction. + ''; + }; + + dataDirectory = mkOption { + type = str; + description = '' + Base directory to store data for runners. + ''; + }; + }; + + config = mkIf cfg.enable { + + services.forgejo-nix-runners = { + enable = true; + + url = "https://git.dgnum.eu"; + + storePath = cfg.dataDirectory; + tokenFile = config.age.secrets."forgejo_runners-token_file".path; + names = [ + "on-${name}" + ]; + + dependencies = [ + pkgs.npins + pkgs.tea + ]; + + containerOptions = lib.optional (cfg.nbCpus != null) "--cpus=${builtins.toString cfg.nbCpus}"; + + inherit (cfg) nbRunners; + }; + + virtualisation = { + podman = { + enable = true; + + defaultNetwork.settings = { + dns_enable = true; + ipv6_enabled = true; + }; + }; + + containers.storage.settings = { + storage = { + driver = "overlay"; + graphroot = "${cfg.dataDirectory}/containers/storage"; + runroot = "/run/containers/storage"; + }; + }; + }; + }; +} diff --git a/modules/nixos/dgn-notify/mail b/modules/nixos/dgn-notify/mail index 4bd5782..e5cf0bc 100644 --- a/modules/nixos/dgn-notify/mail +++ b/modules/nixos/dgn-notify/mail @@ -1,55 +1,56 @@ age-encryption.org/v1 --> ssh-ed25519 jIXfPA tqrbtRQ1sOAfNdcydUswVCvTPlMOyxJk7KIWuVo0zTo -8NlgzrKyFh4K5NreS0CmBNQ2ZmiLZYpD+fhbqNX/aAQ --> ssh-ed25519 QlRB9Q 9so2ZMz5fmmbqRpwEtJ0/u7iV+MLLLkDgODMfu6rdyo -mYpFyrEI3p5uIvogAeTTgC+bHNHBx+eR6VGKMx8hIQk --> ssh-ed25519 r+nK/Q ldIiggaMYAi9twBQpG5w6EA1stvDYgznDytN/zN0IDM -bOqzUc4m/pecyG+6jv8HilAJKJS5ywiagv1IN3DMtEM +-> ssh-ed25519 jIXfPA uwfDbp6deCl1ZuO/9HWEghRdmx6C48WYfrUSprsUhGw +/ram5+hhFm4otCrfe8ikxazml7GlXydSLnV6Gx88eeA +-> ssh-ed25519 QlRB9Q k5ASPvydXiyyIhcviZWBMrKBT5UQeY68Lvs7OSYVH0U +VQD2FHyF76l+OI87JUvgz+4ZIpYZbTmojWr6w+0Ce4M +-> ssh-ed25519 r+nK/Q PKv1jnfLjPoevbENLT+BDrkzhngXmtDiepSDKZPPvXg +Egz1qIKAoYwM9WnRIsxaVcMVnZQ4ejBZB2tWvuqPZto -> ssh-rsa krWCLQ -OypBhkIZl8NGjojPR0Lg0A3SG9BhkA9oocO1zQqGh+gJdO1X8O3m5cIdxu7Ggw8s -RE+B41TWwEfOV0KfRdOBoVxTLYg027f5/EnlU0G5igGUCDt6vDgyScLsYkdiPUYs -7otyfXpCwM5eKpHV6q1qne91BjGXOiUpIPnlaOKXFvNkvNlihz9D1uw+n9vnsKGS -fb9jYX3fACcInbdnNOKeDSUE6+e6wj/ijOwGT8pL5X4cYmGslhfqk4WLubJIUoGx -6TTD0Qh0tiaWlbHJU6jB/Iv0zQgXDBvOCasN6Nlln+PYQnQ8N0gDRkQ8Eq+eKA2d -19komclluvh6zNZQHXod/g --> ssh-ed25519 /vwQcQ l8YLbHxqW4Ynk9ElKIws+Z/cVvdYa9E/ELOt1gIkXww -nENmHEF5A73imF1H0m+Zn7Fzf2EFTyRPX8HTkgfWvLk --> ssh-ed25519 0R97PA FVqDeagt+Q8qXxLNaSU5AttATiVmHyQlZT2mv7ETshs -XG9/OKfvS/Q1yHHHexCeJ3/5HTu/oe8O5lIZJouANv0 --> ssh-ed25519 JGx7Ng xuF0PD3YtE8kqWBH+OnxI+Qw6AQZ9Ib53xpSm9NMrGs -wLVrBPL4KKWf5AKIN7MZfIAzOoaeqnf7XswaSt8UHKQ --> ssh-ed25519 bUjjig 1Ekic+sPi08+xo5Lx38SsIN78ODOaJJpuMPorgelIn4 -icUH+He/zxMhoDsakE8lJ1BCkeuwm3izXVnugQrxoCk --> ssh-ed25519 DqHxWQ oQ1K9/CaOXBCqckeGC2M8rXtPiOSFFetK51+LU5NLGw -zX2MVGKe7jdoPfJhWHd3M0cJ9uczWyyUqzFOZhP8DCM --> ssh-ed25519 tDqJRg btCKh9SJuHDiGIQu3FNf3a04p6Qm9EYoTOMaxBFFbCs -xsGNb+7jXb5MJbnNAJBZRwBvd7a0uFk8cZWWz0xPLKE --> ssh-ed25519 9pVK7Q bjH8hNGrjV1euwfetjy+P7FmmVEqg+D2VsyIbPN6dBM -Ut+81wp4IaHYgR7mjAHiPi3uC5K5l/wLrtUEwxxhVs0 --> ssh-ed25519 /BRpBQ nYOgDzHkeh2T3vcC0c3X+/5GPmn4AOavPaLtluG9/X8 -yLeebplBqT7cbo7mgZJvbqVOf1SPFFAs/P8lwVUBjnE --> ssh-ed25519 t0vvHQ R14ScgZyALLYI9VQXC9ulRiIT6pKeNjsUETqmf39Ajk -8sATMxF2qt2ZquQkL8lUjtYYCE/c6HAV7CzVBXgAlzY --> ssh-ed25519 E6cGqw 0kdE7TYnCGGB6laGnB67OFIdI5pKo9k/4M2hSZB8dVg -6ZbKr6REXl2e589LDQjTdXAOSxKo+Crzb/qU3UiT7Fo --> ssh-ed25519 EEPmeQ iKAT49L0Ps0DPUc/jHZ1eYPQvkouTbEaMMT1WgGgNGU -5tO5/612OXfDVgPkC+pObQJP/EqIljq1Sb5/sEQpKOo --> ssh-ed25519 +MNHsw +XV+vFgYZBjgS+MKcIx1YaZgV34konYI5r2okZWcpE0 -xBVIa8Zep/eRgD2gjPooTS5oQuzgjRxw3cvUrVhbFLM --> ssh-ed25519 rHotTw kpkPh9yUnPayJBCiUihPbSMIGiCMNV3Q9EX/GqrDuEY -9U+MZrgXh8wWMr+YA+OFHzVtVoiNXusQIAKHSIv5dy4 --> ssh-ed25519 NaIdrw P7GGMkwEt5ueKMBok+EpEmuomOQtWMGjqShy2zMcziY -D38Akh4B2IIhiMHm9L4BAlXkqtmRHBFNYnq7MBxuLEw --> ssh-ed25519 +mFdtQ q0Ry7jtJzq6UfKDbzfovl5KBjdJtOKxlzMBKOBt/wl4 -5LE2G25RaXJSNC88AUKZVsec9f6kRMTrRJH0f+rHjiw --> ssh-ed25519 0IVRbA E9wi9oRwNigFI5Gx6rOzdQRmLsaG7bADK0JwevQnHHk -R3ssmspGUasfQCiak6mbelWszIEfgBhoUSwTmVAZVHo --> ssh-ed25519 IY5FSQ XecGNqCa7W77aVxHu2PMyGP3kjJaIuMkPu/uxxmcTWM -XBswdNeVgQzf1dHC7epw/R4aR+aPM/D6Ojfemv6h3Zw --> ssh-ed25519 VQSaNw W9s97+9Zp9HHHLujy3AfY6AmhXG06zubbKmzuHfI32E -6sBZ/SCxyOAYxusVng5xTp2FIWP46svn9jHrGdDoITY --> QywF>>&-grease -an4MLFRuHd5YzvAuctEATrgtHX6ptlOPxRnGyFsIZEx4CVadG8bEn4+aPF64Bvxy -RXa8 ---- fF16JxCEn1JKV0R0onxLmfe1SJViPsfwcW/aNzakOlI -d\Yj\:lsZV "] wOp4e9ϱB9 \ No newline at end of file +JxjsWDFX9cqlYYj8XfEz6WlO9xHM6Kjz/Bdkl0E9vRjP8RohPGvGjMwWTv5rAmYf +n4yMTfau5BNq04WOUoHEz+TJBLwgdGs0yLVrqauLVSSquNxNFaTDN7wIoq3YJ1sP +66bqP7KqKfgYM+wPg07pnhEVm4T6io9IiH5D4utupSQGBGtXBNWeoORW2Q4XgqBg +n5pPM+EIqCAGIH+iotKzQLAtn3JaxXBliY69JYXZ9m6eKonTGOnltLgAnkslEIm9 +qwArShZ5YKcEfO9QMioUnbiZU9MV+61ybq16ilWn2MfSUTXS4OBAtJxz6uu093D8 +jmGuhxzXKhB48P/frH/hRQ +-> ssh-ed25519 /vwQcQ riG1XuW1BCD0xyVeRSgBNrnVmnzL13eor65GEr6AxgM +N08UbQEOhWsAZyazEN59ztZ7XcXpxSVS2i5m2on1R5k +-> ssh-ed25519 0R97PA abXQZeB5lRIGNdR/a0uh0o6nU62ZgJgP/Ifo2Sa8VkQ +dP2djzaPrNoXAs7Wf9hPQ7cAi2lABLfm/XNW7x3G4XM +-> ssh-ed25519 JGx7Ng bgExR1n+lL4Nth44hAlaPwJyTOJnX0HzzTV13UCvEBg +rEjfzKhpwMUQCAxX8u7duZeZURdwtEwtE9rngMYMA5M +-> ssh-ed25519 bUjjig bAhLFnqdVKEzST6m7NWGeqInuNQyclLYFNzjBJOEmmE +rVRcUfyfMG2EpIucz65bOuC1PVuNjKU285czNjKwJ2k +-> ssh-ed25519 DqHxWQ j0yUDi5WL76b9ywKcBA0TAX6ilQMXApiPWMgDFucxHc +8NynFQxLhhvyMLeHY7jBxvEGkbDeItSN9GxyMvpCmJo +-> ssh-ed25519 IxxZqA 7fkr+YUngEszyOXKf5ba26X08LALDEZh1YdP2lmBD1s +qQhTzEV7K0AIRcNQHrBmGjViBfxMhfTc74ez4oRYz88 +-> ssh-ed25519 tDqJRg 3lNl0f4EI5iGfkOEwgsdbuqFH/Ii7aSLC/ZTPXVPejc +0NiYrCEhLaQF2zycyNT358CKVnhPLU5bibKZONWiISs +-> ssh-ed25519 9pVK7Q r7ug0wHYoccWduiMCC8nbPB0zKTUOJHJGuL6Cex0r38 +SJZ2al16eRaKR02RIAJeRtlwjqIsGO5kpyaKRq9BsRg +-> ssh-ed25519 /BRpBQ 98rwPrpOBbpjz38FEArCgEv1MqXWsak65tRrfQykrHA +nfzNG899bAb8dltFR9QrJ4Zb/xX5BL+vSQDD5vC/a2A +-> ssh-ed25519 t0vvHQ +XZLiLJdJqMxRf6CZwJoS75uQ5b9BxToBUsscsvjCgs +0IsEB8Q7ZVMzbQMUXVbHdBIC3bcAlhtKHrsjENMvNss +-> ssh-ed25519 E6cGqw wYdLb3oelo2KDUrh9oDfxN26d/zLPZysKHTp8rxMnEY +yJ5I2PL32is3cgrh06XRpITykFL282pmhEvCTLRAhQA +-> ssh-ed25519 EEPmeQ CQLZuD21cKyZOWJZxrEl2N4GnT/3nfkyv5GjK+aveCQ +XMUaUgHw6mnFh9AEHTn/sRRe1VFGcKRjK4Ib1cNyFns +-> ssh-ed25519 +MNHsw Ir6Ev8iz1/jyOJJF6boc5T+yjzCtx+L7VtuPFua8WGA +1sjWSysDuMJ9/hxaYRWF8so6TsdC/ZpLuK1r2AC/st0 +-> ssh-ed25519 rHotTw 33l1xN6i1ST04iKhrtEdMNyGZyrEdJKjNma+Qat9p34 +FgdTjE9NpeR41h49lEbxNAuMTZyvZSVaYyT9PJEn+mU +-> ssh-ed25519 NaIdrw OO+OV7X39UdIhust47t7/JOpWmRtxS5MeOFGkKoaKmw +gaFE7kl9BQWMMolgkc3Q8HtaD2YlV+vRNyO2Q8FM6fI +-> ssh-ed25519 +mFdtQ YahBCDKX2N+mkYLQAlKPpd2ZypIDSMOqzO0+UcCH6wU +IH0q2uTCo8OtF6IQGynKLe7rh4T12kSROuLr2dteoVM +-> ssh-ed25519 0IVRbA Cvpi2cd3tVS3DL18C1OZsA0wHBxCCV2vWEhAu4L3CiE +kIu/v9xU+0xfZ1ntnDY73GvPM6DfdXOK/nWoYp0d9o4 +-> ssh-ed25519 IY5FSQ SAp5chelp2ahomzr9SIkaKLHQUA5BnHSwUzWrqJdpUc +CfEu14yiOq1KvU52zqYme6CTjhdykRNuhQIi2dgqKh0 +-> ssh-ed25519 VQSaNw ApDOYnJwe1LC5EKjBmSrsXvr73D1bG/MlTzJXEBQWGA +1DtCyWFGlmrRdv01bqOPfL/jufaYLzrtNF2GGHpGuuY +-> ~s)%%W-grease ssh-ed25519 jIXfPA Fg3/a46Mon39gTFeQkn0wtxbwsTzeBUNyEAaNHd27hQ -A78ImPc4lST6bAeBmWiWxoICV4JVCJVAmKuQJySerHs --> ssh-ed25519 QlRB9Q P1C+ZzsB4oAWkwIq2zcaqoukMMo+yFwk9g6Al32fCWM -G+M9cYya5pX64/oEbvpvha2qbQg4y8frl1i18ZIG6fY --> ssh-ed25519 r+nK/Q r4kctDRssAYznMRxHJqu7/GoBHyibP4xWdua6KYnpU0 -l5KS9reXjT2P5iUCe0swZmK/m9Vg7VvtrK4L/TaEuAI +-> ssh-ed25519 jIXfPA sb7nmDkbVrutjmrkaUKnEfWlU4lWm7qQmD6OWcb/qHo +GdZ/AyZS75kXiG7XbS2x+sz2LCzrEZYL7PpOPZ8g8qc +-> ssh-ed25519 QlRB9Q yZkNZ2UOSM7LJbBU9qWcloWPceARFVFIQoEIAfEUsUw +F6x/QjToEmfLka6LAZxsuOTrKG93EHmFEiiCBiPBdvk +-> ssh-ed25519 r+nK/Q TSh3AgdlSZP4FOVka4/KTa9Z/nuwRRZl3mGw1uKTUhs +fvtdpPW+zsgBHAQrvkWc7heHE56gPZwMEPOpz+fxbh0 -> ssh-rsa krWCLQ -g+zPwOWXgd06McsOCwo2QjAQF7B7t8oCf5eA5K79Om/X63VAqakts3ilwOt9SgZk -yQYa72TP67nyljLO4tPG7u/aKIBIwitGXIIYs+ZNLq9Q0ciWvzVAhsLsfi9yE7AF -I3tnL03fES2v5sbKes/JulBQl+87065YZr67TNWRY9f7a0XQZtfewP0vOxxfJsSy -RYBpztlzAGkaWXtqk2291x7yGhKsQWXmUhxx4KqyPs+KvFm1d4GglalFjhySzCkG -Rc7Flg1ukru3Bd1/fieOWpr3DyDBQ8pZyS4gIUYLB7xcy2t1JI/U3egTQTPBCSgy -PwoWgyQ7lGLRIarTMRa1JQ --> ssh-ed25519 /vwQcQ FOpyMB3qDu3HpjqsH2VVpInqlvJlZD35y/XNf8RkSXU -ZUxuGbwH1XtE9Da+L7SjfoYinjq0cAwsHsDaz2u5Lrg --> ssh-ed25519 0R97PA kphmpWyiMaxGmUAH4rvFUjtf0mvseVkPPBlMqKNE3lA -F1cgXiz2UjCHU0MeS5DryvOBtxW/1DIsjw28uQ1nd3A --> ssh-ed25519 JGx7Ng ejW0Pf2cwsitmVLY8jJUaHZ/6Qhfxa7fnYWoaWYISWk -awOvJwkkFdXuc/ikZTX6512zG91FCi+0n7KaYrULO3E --> ssh-ed25519 bUjjig 2Gw2h1bx0TRc6CmRjY8GPgtSHRs5rl/lg394JKiWBlA -yvltWHak7XMXBmBmlelE4pF5y1saRaQJmV5IUxzaPyo --> ssh-ed25519 DqHxWQ gh/5iRZQbmbvwWGtah4b9MK3DNe4+UNiHoXPYnw0sEQ -z/nbwMWAjsBRAzTMSS/9dPzXe1st8mQWiUlZnVmtcCw --> ssh-ed25519 tDqJRg 0GBbdUBhJxdCICdp6WtgXW2GXfQskuxanzucrKRoBns -AW0jVC8Y8lbhycDgLzPu40kQtgb7OI7fyycLldXknwc --> ssh-ed25519 9pVK7Q +aOx8mN/HX4F7SdNdJZjMRWiy6SIhqFkWYIo+I24cTI -IQCd6tA+bUDlnW9JsxVE02EBKj38yYDybBe24PxXr68 --> ssh-ed25519 /BRpBQ 8UN2aIKUhi3JLhnOoOs38+a9qx+UhDnV5tYlWVF8d24 -FkScXVvXdhFbDGs2Ks0BYfj9nJpAUVPz6OhX7vkOTmI --> ssh-ed25519 t0vvHQ wDCpgqimo5goEB9Gj5/QGQ98nTEkKy/qHyxPg3NA6Ss -sielO8aAj9ke+nZL+F/zyMUzUPn1LjtKrSkAoMW6YYE --> ssh-ed25519 E6cGqw zbwhYf2zKgjdymEjG0sVuqQQ/CgCDnSlT72OrAUFSiw -B70dyGna1SRXvf5SLJCiZGeBiXwS9nf3LPTBkG/3fGs --> ssh-ed25519 EEPmeQ 06lIugc0LbiXVFwbV/6GKbSnlac0ROIVNmgS2Q9MM2A -KTUmdmSXZT2D4oQQpO1qNsdOn5sH70ameln6i7Itb+A --> ssh-ed25519 +MNHsw OMAS3ud2K1+JGVytqHp9P/i+r4apcb91Dyc+tTudpQ8 -V6T+VPSvRZ21nVtDeRkOsuP62bECSGcIm8vO3JADxVQ --> ssh-ed25519 rHotTw JAc7ZlrFGL+DXq07YrmqY4lS5Pib31RoRTT6o7zJH04 -Y1qLn6nWk7FfkrWIiBBd7BHHp5WXHTZfq734DMUlB74 --> ssh-ed25519 NaIdrw ZWfEZfhiXxkq6P6H2kbiVZiiPxH13Cehk+2ti9fYx08 -gMlI5Da2cgP7m2pZnHpwJiA7BVVtZgNyZnPkYqhBYHQ --> ssh-ed25519 +mFdtQ GZQpMTZySkDwDvzpWou8nfvAtYco/v4xF+YU7LYjAAI -deNceVs+tUxiQy2JHcoOd/w6KLYnxuDwrIPoVWJ66Vo --> ssh-ed25519 0IVRbA S917NcJZ75oqjwGMMwknUFcHYJ2TCkEt331mpOZ5DxI -khoDidhLjy1wIs+qGAfx/qH+t4ROB71QeiiUmnpZ1s8 --> ssh-ed25519 IY5FSQ 2HjLcN2RK/dtAeHXUTu/Du4LiBH4SxpG0d6f7QCa61Y -ql6B8ZZzEaz+Czb0TRT8pF1KD7dhEv0XE9k9IJ9AgBo --> ssh-ed25519 VQSaNw aAcXlRKzMgw847XeDTqnh+4XvApVIE183gJ2O42eohE -wndgsI85eDc+i+CBPmo2ym5koIvTMS9mOuWdLvLM3Qs --> lm-grease -KjCZ 46y2wU x1 -1iP6 ---- MthoOm+rboJhFyo+SKFlPfwT9V3VeaKl5xQ2gs0W2ns -;ց"b/*}eg}Lq -zG~Q._X{A  \ No newline at end of file +J3PRXa0ojIn7T4bsFYnhERqGH4bLSSRyMm4X85iuGkhjldW/qVIs3EsGUeyLKWwY +prvS1uwGY4qGbNgEaj0MhoZobhn9V3oiTAmlepl2tHgwMFqDi0Dagym4DBKhYaym +ezG4GvOSEQOFAhroGK7FscUeziQilfXMAGX88JrJQVM/wz5c2e4ZJmAc5sBzo1mj +D/ko6/KazOokbCO89wjjUYLzwM82aJKHgGZElNKOx2fcpi23ZIlIERbqcTUgxnVS +ifgfSHcggEP47UldzfuH09Lfz8YTDqpebhufWkVhnvdJRYahrkNC+vPqBFXwqK8F +xCVq7a8AkHK1LfDSfm041g +-> ssh-ed25519 /vwQcQ Lclbvme60sst7vG3OT+SK/BWPBJlMPBuijzX5a41xQY +iqI9+kIOEja/uAHP3YxCXOAH94IbVbArTD/zzpEWATI +-> ssh-ed25519 0R97PA tvNEZpxUdaDrLOhuTnp/tuta75aInxweI6u55lts9Fw +hd0OB8wSMhqyLPyy3dshVLjwXk/iqRhW/CK0v9EkMKs +-> ssh-ed25519 JGx7Ng 11MGDeZVC6uXrb6x7xH1DDaUS9hEkY4cgFd6UqwuVWI +HsLCmr749be0M6o8od+cxqEF6fcsqjZttczwNxzU8ZU +-> ssh-ed25519 bUjjig stqKeXyQYQ4rrPUoFAJ07hfIyNp32BbITxUavwsvFR4 +oeDwDiSyXD803qDruxzJhgQ9ckfQoisJjVzq/S1CvUg +-> ssh-ed25519 DqHxWQ zGJoJNznwsrVy1hELu5Zd08xPpnCRPms5JUjnuEFB0A +DS1GEfaNSSz8BD0VqYEpEU5retLzy6EAF0ZEMbcZzys +-> ssh-ed25519 IxxZqA qPdVGKGRIErFLQsV8LH8UFElhV32XdTw8PmT2HdQVTE +rZzFPIx7iO1RT6cHu8AeO6FYLMsZn8UMjpqf2K3R9Ds +-> ssh-ed25519 tDqJRg BfjsSuGW3EteYrTAtpVJNrdoNdpGKuYOxHU0ZNBUYUM +wlMXOu/IVNFyghhyd/HnBud8b+VwgqZ3vG8Ceqx2DV8 +-> ssh-ed25519 9pVK7Q pPA/PzPfmC4VNLqcqgb1LwfJ68q7LffBAqaRP3YJGmw +RJBpLt3WzJoNxsbAby/XVB0bWlHqw5ZwSHT47PQeJ2M +-> ssh-ed25519 /BRpBQ 9irIejQQmwv9p1n/N82JPcQlRkMgCPsoeqvrEH24QUs +WV1CGQiitxqJOj+2V/AA3R9NevcNKCohiEV4ssDEKwA +-> ssh-ed25519 t0vvHQ vEuLV5mD3BkRQc0h2wg1l4UVj/ORVC5sz1SSqt6gD2Q +voKXQa3QwUt9yN4OD2Kq58iI/pjNJxRZCHYOWr3mojM +-> ssh-ed25519 E6cGqw wqCRvdwHzeZNFG73mnCxP6dY8HFLnUd0q3QMHxC9lTk +D0bqFDUQSgHgwrfluCnJ0FQ8+Bwtho0jGXdF7Mdepj8 +-> ssh-ed25519 EEPmeQ cgyB/xXkZYjS9rqDE5saVVWaZCqWA1KieSwupV8sJ3U +6NSDsrPTVP0AfLf2R7SYCu175u3AvSl6/9KyI5ZZr4Y +-> ssh-ed25519 +MNHsw yQYlre+4ZPx0sfdC6iObUu4AyUT/QFCR9nVMDe93PVw +0fqncmEgXK8UFoWr+S45imxC4zi1rYTmzp5aiPWqcJM +-> ssh-ed25519 rHotTw 4P96tfTWGWu6sNpnhQS2pOncXTJDBY/0LIMJH6MZ9ws +HJ9yHwUv613F3Xj0s1l2e1CY2ca9jqrwKvjjrfr+BRE +-> ssh-ed25519 NaIdrw e+Mk++x9jtnYuH76OXRohKUKELiLRW7DBPmD4Kw0uhE +P84wmJvkSnM68JmMS24xrilAsqJ0PzsqgmvWIDh2TYA +-> ssh-ed25519 +mFdtQ YE1hcu3vCq1QHr38JEhU+pLZy+NuxzjSk8O64CYqakI +SNsqng6gjqR8m+KO+RQqt0gbXeGdfHNjvfVncmKD3DQ +-> ssh-ed25519 0IVRbA Zw0Sq8NnSluum9p9RPO906gKnXLPlOAWwjIDuYt5oSQ +6jUZKI7yu6ThE1behgXMqO5beNj2Gap2rGhlSn8vrA8 +-> ssh-ed25519 IY5FSQ qo7pkpJsNQ3vdedlPJIfXpmjHwcEyiuu90TEoay0Xz8 +zbqt1vojiiYfLnh3ChxHwG9mn3d5D2HrQlUJTlGRB+M +-> ssh-ed25519 VQSaNw nsL5mErC5CJgd4EZKs4ZPb4BINCZMGAhkFr3Z/5vSk0 +vk3vhlydKtsWDCUmO6+fj231tEzNp+5vovLO0Wr7Aqs +-> @=-grease bI=Z 'IEY&[|q $&(!B z'y\s855 +yNfimzcHFAcfpv7UmfYWh/CAXuUP8mSMxI9w29AI+W7ykCKwWXv9ixLensYRinoo +vmoBfW/f9aQr +--- M790Aym/OBexvX+HZK7Hom3HRpLr8ACf4LzYJdSsR8c +h8y`;攺Tؓ