From 3b88def8b9cc0bb76277c9690bc6cc548e8a20c7 Mon Sep 17 00:00:00 2001 From: Roy Dumblauskas Date: Sun, 1 Jun 2025 21:56:13 -0500 Subject: [PATCH] revised flake.nix, gpt sucks --- nixos/.sops.yaml | 3 +- nixos/error | 18 +++ nixos/flake.lock | 277 +--------------------------------- nixos/flake.nix | 180 +++++++++++++++------- nixos/out | 0 nixos/secrets/build.json | 6 +- nixos/secrets/cloudflare.json | 6 +- 7 files changed, 152 insertions(+), 338 deletions(-) create mode 100644 nixos/error create mode 100644 nixos/out diff --git a/nixos/.sops.yaml b/nixos/.sops.yaml index cfbbb31..0ddf821 100644 --- a/nixos/.sops.yaml +++ b/nixos/.sops.yaml @@ -1,7 +1,7 @@ keys: hosts: - &laptop age1ldgnl53dmvl4fjz6hgdj0cvensagddn3ltpmxfm72m8q273w75fsk42p8v - - &nixos-homelab-00 age1p840m2676v7svktt3ljf25j6su7vgrrdpghfxk2a0l9lv2y0hsfqyswlfc + - &nixos-homelab-00 age1nxqlqldr5pmcxjpdl99ntzx42aclflmesx73qvs9czewzh9k8elsj3skt9 creation_rules: - path_regex: secrets/[^/]+\.(yaml|json|env|ini)$ key_groups: @@ -12,3 +12,4 @@ creation_rules: - *nixos-homelab-00 - *nixos-homelab-00 - *nixos-homelab-00 + - *nixos-homelab-00 diff --git a/nixos/error b/nixos/error new file mode 100644 index 0000000..413a0bf --- /dev/null +++ b/nixos/error @@ -0,0 +1,18 @@ +warning: Git tree '/home/roy/homelab-config' is dirty +error: + … while calling the 'seq' builtin + at /nix/store/1678p8vrnc4d1x65ahq6zwrhah102cgf-source/lib/modules.nix:360:18: + 359| options = checked options; + 360| config = checked (removeAttrs config [ "_module" ]); + | ^ + 361| _module = checked (config._module); + + … while calling the 'throw' builtin + at /nix/store/1678p8vrnc4d1x65ahq6zwrhah102cgf-source/lib/modules.nix:331:13: + 330| else + 331| throw baseMsg + | ^ + 332| else + + error: The option `default' does not exist. Definition values: + - In `/nix/store/1678p8vrnc4d1x65ahq6zwrhah102cgf-source/flake.nix': diff --git a/nixos/flake.lock b/nixos/flake.lock index 376d7dc..9ae40cc 100644 --- a/nixos/flake.lock +++ b/nixos/flake.lock @@ -1,46 +1,5 @@ { "nodes": { - "disko": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1748225455, - "narHash": "sha256-AzlJCKaM4wbEyEpV3I/PUq5mHnib2ryEy32c+qfj6xk=", - "owner": "nix-community", - "repo": "disko", - "rev": "a894f2811e1ee8d10c50560551e50d6ab3c392ba", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "disko", - "type": "github" - } - }, - "flake-parts": { - "inputs": { - "nixpkgs-lib": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1743550720, - "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "c621e8422220273271f52058f618c94e405bb0f5", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, "flake-utils": { "inputs": { "systems": "systems" @@ -59,106 +18,7 @@ "type": "github" } }, - "flake-utils_2": { - "inputs": { - "systems": "systems_3" - }, - "locked": { - "lastModified": 1731533236, - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "home-manager": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1747688870, - "narHash": "sha256-ypL9WAZfmJr5V70jEVzqGjjQzF0uCkz+AFQF7n9NmNc=", - "owner": "nix-community", - "repo": "home-manager", - "rev": "d5f1f641b289553927b3801580598d200a501863", - "type": "github" - }, - "original": { - "owner": "nix-community", - "ref": "release-24.11", - "repo": "home-manager", - "type": "github" - } - }, - "ixx": { - "inputs": { - "flake-utils": [ - "nixvim", - "nuschtosSearch", - "flake-utils" - ], - "nixpkgs": [ - "nixvim", - "nuschtosSearch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1748294338, - "narHash": "sha256-FVO01jdmUNArzBS7NmaktLdGA5qA3lUMJ4B7a05Iynw=", - "owner": "NuschtOS", - "repo": "ixx", - "rev": "cc5f390f7caf265461d4aab37e98d2292ebbdb85", - "type": "github" - }, - "original": { - "owner": "NuschtOS", - "ref": "v0.0.8", - "repo": "ixx", - "type": "github" - } - }, "nixpkgs": { - "locked": { - "lastModified": 1748421225, - "narHash": "sha256-XXILOc80tvlvEQgYpYFnze8MkQQmp3eQxFbTzb3m/R0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "78add7b7abb61689e34fc23070a8f55e1d26185b", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-24.11", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_2": { - "locked": { - "lastModified": 1748406211, - "narHash": "sha256-B3BsCRbc+x/d0WiG1f+qfSLUy+oiIfih54kalWBi+/M=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "3d1f29646e4b57ed468d60f9d286cde23a8d1707", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_3": { "locked": { "lastModified": 1748421225, "narHash": "sha256-XXILOc80tvlvEQgYpYFnze8MkQQmp3eQxFbTzb3m/R0=", @@ -174,94 +34,10 @@ "type": "github" } }, - "nixvim": { - "inputs": { - "flake-parts": "flake-parts", - "nixpkgs": "nixpkgs_2", - "nuschtosSearch": "nuschtosSearch", - "systems": "systems_2" - }, - "locked": { - "lastModified": 1748564405, - "narHash": "sha256-uCmQLJmdg0gKWBs+vhNmS9RIPJW8/ddo6TvQ/a4gupc=", - "owner": "nix-community", - "repo": "nixvim", - "rev": "8b3a69cfea5ba2fa008c6c57ab79c99c513a349b", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "nixvim", - "type": "github" - } - }, - "nuschtosSearch": { - "inputs": { - "flake-utils": "flake-utils", - "ixx": "ixx", - "nixpkgs": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1748298102, - "narHash": "sha256-PP11GVwUt7F4ZZi5A5+99isuq39C59CKc5u5yVisU/U=", - "owner": "NuschtOS", - "repo": "search", - "rev": "f8a1c221afb8b4c642ed11ac5ee6746b0fe1d32f", - "type": "github" - }, - "original": { - "owner": "NuschtOS", - "repo": "search", - "type": "github" - } - }, - "quasiSecrets": { - "locked": { - "lastModified": 1748827872, - "narHash": "sha256-l5vEHHoG0X49ZaAi/dlyVidrgRl+uY2sTHSXiPStoUA=", - "ref": "refs/heads/main", - "rev": "f6dad37607b8044097d2f8700aee755e4268a6ce", - "revCount": 14, - "type": "git", - "url": "ssh://git@github.com/RoyDumblauskas/server-semi-secrets" - }, - "original": { - "type": "git", - "url": "ssh://git@github.com/RoyDumblauskas/server-semi-secrets" - } - }, "root": { "inputs": { - "disko": "disko", - "home-manager": "home-manager", - "nixpkgs": "nixpkgs", - "nixvim": "nixvim", - "quasiSecrets": "quasiSecrets", - "sops-nix": "sops-nix", - "tests-service": "tests-service" - } - }, - "sops-nix": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1747603214, - "narHash": "sha256-lAblXm0VwifYCJ/ILPXJwlz0qNY07DDYdLD+9H+Wc8o=", - "owner": "Mic92", - "repo": "sops-nix", - "rev": "8d215e1c981be3aa37e47aeabd4e61bb069548fd", - "type": "github" - }, - "original": { - "owner": "Mic92", - "repo": "sops-nix", - "type": "github" + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" } }, "systems": { @@ -278,55 +54,6 @@ "repo": "default", "type": "github" } - }, - "systems_2": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_3": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "tests-service": { - "inputs": { - "flake-utils": "flake-utils_2", - "nixpkgs": "nixpkgs_3" - }, - "locked": { - "lastModified": 1748825739, - "narHash": "sha256-pLMRDpZYpkpQRRBJ3pnHf9OjwW5WEnpHL1sZ11SHXYw=", - "owner": "RoyDumblauskas", - "repo": "tests-service", - "rev": "9a324e39c3d0d9b1b679da5909e6b7eb98fe4ecb", - "type": "github" - }, - "original": { - "owner": "RoyDumblauskas", - "repo": "tests-service", - "type": "github" - } } }, "root": "root", diff --git a/nixos/flake.nix b/nixos/flake.nix index 2a36f17..73b096b 100644 --- a/nixos/flake.nix +++ b/nixos/flake.nix @@ -1,65 +1,133 @@ { - description = "Server Config Controller"; + description = "tests-service for Roy's Homelab"; inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11"; - nixvim.url = "github:nix-community/nixvim"; - quasiSecrets.url = "git+ssh://git@github.com/RoyDumblauskas/server-semi-secrets"; - home-manager = { - url = "github:nix-community/home-manager/release-24.11"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - disko = { - url = "github:nix-community/disko"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - sops-nix = { - url = "github:Mic92/sops-nix"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - # This is a path to the services I've declared. - # It just happens to be stored in the same repository (relative), - # but could well be a separate repository - tests-service = { - url = "github:RoyDumblauskas/tests-service"; - }; + nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; + flake-utils.url = "github:numtide/flake-utils"; }; - outputs = { self, nixpkgs, nixvim, home-manager, disko, sops-nix, quasiSecrets, tests-service }@inputs: - let - nodes = [ - { - name = "nixos-homelab-00"; - hostId = "3884D2F1"; - } - ]; - in { - nixosConfigurations = builtins.listToAttrs (map (node: { - name = node.name; - value = nixpkgs.lib.nixosSystem { - specialArgs = { - meta = { - hostname = node.name; - hostId = node.hostId; + outputs = { + self, + nixpkgs, + flake-utils, + }: let + nixosModule = { + config, + lib, + pkgs, + ... + }: { + options.services.tests-service = { + enable = lib.mkEnableOption "Status reports for all homelab services"; + + port = lib.mkOption { + type = lib.types.port; + default = 8080; + description = "Port to listen on"; + }; + + default-nginx = { + enable = lib.mkEnableOption "Enable nginx reverse proxy to direct to service"; + hostname = { + type = lib.types.str; + default = "localhost"; + description = "Hostname to attach to service"; }; }; - system = "x86_64-linux"; - modules = [ - ./configuration.nix - ./hardware-configuration.nix - ./disk-config.nix - disko.nixosModules.disko - sops-nix.nixosModules.sops - quasiSecrets.nixosModules.ipAddrs - quasiSecrets.nixosModules.services - tests-service.nixosModules."x86_64-linux" - home-manager.nixosModules.home-manager { - home-manager.useGlobalPkgs = true; - home-manager.useUserPackages = true; - home-manager.users.sysAdmin = ./home.nix; - } + }; + + config = lib.mkIf config.services.tests-service.enable { + systemd.services.tests-service = { + description = "Status page for homelab services"; + wantedBy = ["multi-user.target"]; + after = ["network.target"]; + serviceConfig = { + ExecStart = "${pkgs.simple-http-server}/bin/tests-service --port ${ toString config.services.tests-service.port }"; + Restart = "always"; + Type = "simple"; + DynamicUser = "yes"; + WorkingDirectory = "${self.packages.${pkgs.system}.default}"; + }; + }; + + services.nginx = lib.mkIf config.services.tests-service.default-nginx.enable { + enable = true; + virtualHosts."${config.services.tests-service.default-nginx.hostname}" = { + forceSSL = true; + enableACME = true; + acmeRoot = null; + locations."/" = { + proxyPass = "http://localhost:${toString config.services.tests-service.port}"; + extraConfig = '' + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + ''; + }; + }; + }; + + networking.firewall.allowedTCPPorts = lib.mkMerge [ + (lib.mkIf config.services.tests-service.enable [ config.services.tests-service.port ]) + (lib.mkIf config.services.tests-service.default-nginx.enable [ 80 443 ]) ]; - }; - }) nodes); - }; + }; + }; + in + (flake-utils.lib.eachDefaultSystem (system: let + pkgs = nixpkgs.legacyPackages.${system}; + + dioxusApp = pkgs.stdenv.mkDerivation { + pname = "tests-service"; + version = "0.1.0"; + src = ./.; + + buildInputs = with pkgs; [ + dioxus-cli + rustc + cargo + + # tauri deps? + pkg-config + gobject-introspection + cargo-tauri + nodejs + at-spi2-atk + atkmm + cairo + gdk-pixbuf + glib + gtk3 + harfbuzz + librsvg + libsoup_3 + pango + webkitgtk_4_1 + openssl + wasm-pack + wasm-bindgen-cli + lld + ]; + + buildPhase = '' + dx build --release + ''; + + installPhase = '' + mkdir -p $out + cp -r dist/* $out/ + ''; + }; + in { + packages.default = dioxusApp; + + apps.default = { + type = "app"; + program = "${dioxusApp}/index.html"; + }; + })) + // { + nixosModules.default = nixosModule; + }; } diff --git a/nixos/out b/nixos/out new file mode 100644 index 0000000..e69de29 diff --git a/nixos/secrets/build.json b/nixos/secrets/build.json index 04de92a..0501a2b 100644 --- a/nixos/secrets/build.json +++ b/nixos/secrets/build.json @@ -8,11 +8,11 @@ "age": [ { "recipient": "age1ldgnl53dmvl4fjz6hgdj0cvensagddn3ltpmxfm72m8q273w75fsk42p8v", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBrZzE0WkJBNk91bTMxWkQv\nRFdYNnBuSmY3d1lJQnQ4S09QOFY3QjNRRlRFCjNRSHBZYjdlZW81RXZOaXRZTURG\nZ2duRjY4TFl3U2ZkZGxsaW5hUi9QY2cKLS0tIGZxUTRzck1oaE5LZnpBeG11aDJG\nd0Jiem9xdjZRaGw1NVY4U2FwTk5EVmMKjuUaozKLj74Nr3uXuDu6LvJTCCDRDNRT\n3WvJt6DuFatsZ5zjvt0R7+0C0+YvZhBKuvfkfHPNj82UrFNCeRzpqA==\n-----END AGE ENCRYPTED FILE-----\n" + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzWUxvOEtwNkhodDdsWFoz\ndytudERqT3hKaWJITmExOGZleU4yc1U5RTJzClh5UHdhMDhIbXB6WEFKNC9IZWx6\nbXE0YVZzMUdCSDc1OUI3ZGNmbDFBTGcKLS0tIDRySGc3YkVVckJVZmtUbUduSUtQ\nSFUvUTJ0MU9sVXJ5Mnh1WWp3TTdZV1EKZ8qea9sub3I0vxIzMYVCqalYE9XdBOV7\ng/ITnSr4uKraz0X5xFMno5pR0ab43NWeyPfABwzoh+zBnlQMUgusQA==\n-----END AGE ENCRYPTED FILE-----\n" }, { - "recipient": "age1p840m2676v7svktt3ljf25j6su7vgrrdpghfxk2a0l9lv2y0hsfqyswlfc", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBUWnVXeEhYUjREUjM2azFZ\nS1dHemdsZnVKOUhyb0tHWmJUckRVbkdQRHpjCjNsWmpUMmJwai9ncmNXdmY5Zlpz\ncUwzSFg0MzhJYkxJNC9JS3FHWDl1dzQKLS0tIG5vS1hiRVBxTy9vQlpselhqRm5v\nVUlxMFJrZDlVempWYzR6NHNqUk14c0kKwnxxpRpiOmikqWOq7NPwYKX8kzEbC8XC\nxJy4xBLocURa9rTZOHpzDG91XUeQzFQE2N16dWSJz6yOMz7okunPOQ==\n-----END AGE ENCRYPTED FILE-----\n" + "recipient": "age1nxqlqldr5pmcxjpdl99ntzx42aclflmesx73qvs9czewzh9k8elsj3skt9", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB4SnlWTGJ0WnZNYjlLUDZk\nZWo3ajlGNFhacm11bmJRSzNzU0lkNk4xTzBNCk1GUlBNZWNCWnhFVHc1aUhDTjFL\nUU5FUTU5TkZOVFRpRlp6ZHhXeitIWVkKLS0tIEovQjRPMVZKVDNvU2tQUlZwTjFD\nWXdBOXNNQm91N0tZdTc2QVBXTXhIZHMK6uxSjyenaObLyLNDXjn2IwCid1Gh48+m\nofB2b9a/nOj4fq8Gz0qvdpfjX/uv1YLFe/8qEW3Vwk9uuuQouL7HVw==\n-----END AGE ENCRYPTED FILE-----\n" } ], "lastmodified": "2025-04-17T15:26:55Z", diff --git a/nixos/secrets/cloudflare.json b/nixos/secrets/cloudflare.json index ea03a91..148a5f0 100644 --- a/nixos/secrets/cloudflare.json +++ b/nixos/secrets/cloudflare.json @@ -9,11 +9,11 @@ "age": [ { "recipient": "age1ldgnl53dmvl4fjz6hgdj0cvensagddn3ltpmxfm72m8q273w75fsk42p8v", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGSFVKUGo5L21hbDIyZ1kz\nUGdvQ0VQWk1FdFJSbUQ4Z29RVUZDaW5JU2tvCnI3WHdieUhUSjZqQm44Y1Z5RG5z\nbW5haC8wQVB3a0xvUnphbnllSWgwZU0KLS0tIDBFaFYzTlpDRVY0TnZPM0FYZkZQ\nMXRpZzF2Q05kcFJTVXhXVWVCYSsxL3cKn7U48cNBjhtTjSVAIPfFC8Y6gPCUvQJy\nvWLAmyDXAuugLhmpY+xMfDgZwg0KqzZr8mfckfRAJNcMNM2AnvMmig==\n-----END AGE ENCRYPTED FILE-----\n" + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBFMHFVc2dHRzRuOGhJWGJF\nZTUrWFFzeDFudDV4OHJQQUlFV1pnWTU1dmdnCnp0OFBGbWk0Yy9MREZ0TWRwMWRx\nNGlWUmdaN2k2S0FjUWk1MjdTdXFIa1EKLS0tICtFb2VTaE5GN3I3ZkhRR0t5R09a\nR3paVzUrNm5odnBrT1REM2V2ckF4WXMKuWoAfnIi5WoGSSDvKdl9fP9IYDp+wCeY\ntM9gUl2/1QcA3HG7mReaX8OqXnPF+wAIjPwvjxW4wLsM3oysxsgPIA==\n-----END AGE ENCRYPTED FILE-----\n" }, { - "recipient": "age1p840m2676v7svktt3ljf25j6su7vgrrdpghfxk2a0l9lv2y0hsfqyswlfc", - "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAwK1lMWkxLOHFxeUNCV3FN\ncFZYY1MraXlDbjZnNDB1U1BEa0xyejVkSzJnCkg0Sy9kMGVqZUN6YTdoWkxzRS9h\nSEpHeWJNL2R2SUdiaUIvek41QVdvdE0KLS0tIFhKczZoZTYrV01VWUZ6V3ZqbzF2\nb21tZWpOQzNPNnZWRlUvWlBXb2NXTlUKF9zcWFu5wLzkBWdFHnwZdKkC/WMjcWJ3\nxRTamCIqEUZUgFJBH2IQebGzC7BAISlrbIPeHwxpzoRpaSYJc9GXuQ==\n-----END AGE ENCRYPTED FILE-----\n" + "recipient": "age1nxqlqldr5pmcxjpdl99ntzx42aclflmesx73qvs9czewzh9k8elsj3skt9", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBFRjU5a3VCTUt5dW9yWE9j\ncnM2cDNnRVNycG0va2VidzAwOFlmcE5uNnpRCi9MeWIvS3V4NDd4T1Z5ZGlFVGlH\nM2w0bVFGYXMxQUh1bktETXI5VW1IZ00KLS0tIFpBb2pFUzBiRHFpVDR1V3JBY09R\nRDVhTFBXT0pBYkpxOE9EUTNBd012TEkKW+eCIeM6+PthWtqiYgRr6pL1qMk6nnPq\nU/k6xFWOEMw4hhW3WETePbN8Qlochw3XjjkawyDqi3Sl/nmJJR3MBw==\n-----END AGE ENCRYPTED FILE-----\n" } ], "lastmodified": "2025-04-28T04:15:19Z",