infrastructure

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

commit 0feb75306944f3c61cf5cc6a6d1e80a1d97b36ca
parent 08519b3777c3f9d5263c1c32b27a0f68032941c5
Author: Silas Brack <silasbrack@gmail.com>
Date:   Mon,  7 Oct 2024 15:30:59 +0200

Refactoring

Diffstat:
Mapps/my-app/default.nix | 118++++++++++++++++++++++++++++++++++++-------------------------------------------
Mapps/my-app/server/gleam.toml | 22++++++----------------
Mapps/my-app/server/manifest.toml | 9++-------
Mapps/my-app/server/src/server.gleam | 5+++--
Mapps/my-app/server/src/server/env.gleam | 2++
Mapps/my-app/server/src/server/router.gleam | 2+-
Mapps/my-app/server/src/server/web.gleam | 3++-
Minfrastructure/hive.nix | 18+++++++++++-------
Minfrastructure/secrets.yaml | 15+++------------
9 files changed, 84 insertions(+), 110 deletions(-)

diff --git a/apps/my-app/default.nix b/apps/my-app/default.nix @@ -21,7 +21,7 @@ in { user = mkOption { type = types.str; - default = "myapp"; + default = "myapp_user"; description = "User account under which my app runs."; }; @@ -38,11 +38,15 @@ in { config = mkIf cfg.enable { networking.firewall.allowedTCPPorts = [ cfg.port ]; + + users.groups.${cfg.user} = {}; users.users.${cfg.user} = { name = cfg.user; + group = cfg.user; description = "My app service user"; isSystemUser = true; - createHome = false; + # createHome = false; + createHome = true; packages = with pkgs; [ gleam erlang_27 @@ -50,82 +54,68 @@ in { ]; }; - # systemd.services.pokemon-app = { - # wantedBy = [ "multi-user.target" ]; - # description = "Start my app server."; - # after = [ "network.target" ]; - # serviceConfig = { - # Type = "simple"; - # User = "silas"; - # # WorkingDirectory = "/home/silas/dev/044-lustre-ssr/"; - # # ExecStart = "/home/silas/dev/044-lustre-ssr/prod.sh"; - # # Restart = "always"; - # # KillMode = "process"; - # }; - # path = [ pkgs.gleam pkgs.erlang_27 pkgs.rebar3 ]; - # script = '' - # cd /home/silas/dev/044-lustre-ssr/ - # cd ./client - # gleam clean - # cd ../server - # gleam clean - # cd ../shared - # gleam clean - # cd ../client - # gleam run -m lustre/dev build --outdir=../server/priv/static --minify - # cd ../server - # gleam run - # ''; - # }; - systemd.services = { - # postgres-migration = { - # description = "Postgres migrations"; + # clone-pokemon-app = { # wantedBy = [ "multi-user.target" ]; - # after = [ "postgresql.service" ]; - # requires = [ "postgresql.service" ]; + # description = "Clone Pokemon app."; + # after = [ "network.target" ]; + # serviceConfig = { + # Type = "simple"; + # User = "root"; + # ExecStart = ""; + # }; + # script = '' + # TMP_DIR=$(mktemp) + # curl --output-dir $TMP_DIR "" + # unzip + # ''; + # # script = '' + # # rsync + # # ''; # }; - myapp = { + pokemon-app = { wantedBy = [ "multi-user.target" ]; - description = "Start my app server."; + description = "Run Pokemon app."; after = [ "network.target" ]; - # requires = [ "db-migration.service" ]; - - # environment = { - # DB_URI = ""; - # }; - + # after = [ "clone-pokemon-app" ]; + # requires = [ "clone-pokemon-app" ]; serviceConfig = { Type = "simple"; User = cfg.user; - ExecStart = "/root/apps/myapp/test_pgo_app"; - Restart = "always"; - KillMode = "process"; + ExecStart = "/home/${cfg.user}/pokemon-app/erlang-shipment/entrypoint.sh run"; }; + path = with pkgs; [ gleam erlang_27 rebar3 ]; }; - }; - services = mkIf cfg.environment == "dev" { - postgresql = { - enable = true; - enableTCPIP = true; - ensureDatabases = [ cfg.user ]; - ensureUsers = [ - { - name = cfg.user; - ensurePermissions = { - "DATABASE ${cfg.user}" = "ALL PRIVILEGES"; - }; - } - ]; - authentication = pkgs.lib.mkOverride 10 '' - local sameuser all peer - host sameuser all ::1/32 trust - ''; - }; + # postgres-migration = { + # description = "Postgres migrations"; + # wantedBy = [ "multi-user.target" ]; + # after = [ "postgresql.service" ]; + # requires = [ "postgresql.service" ]; + # }; }; + # services = mkIf cfg.environment == "dev" { + # postgresql = { + # enable = true; + # enableTCPIP = true; + # ensureDatabases = [ cfg.user ]; + # ensureUsers = [ + # { + # name = cfg.user; + # ensurePermissions = { + # "DATABASE ${cfg.user}" = "ALL PRIVILEGES"; + # }; + # } + # ]; + # authentication = pkgs.lib.mkOverride 10 '' + # local sameuser all peer + # host sameuser all ::1/32 trust + # ''; + # }; + # }; + # systemd.services = { # # # db-migration = { diff --git a/apps/my-app/server/gleam.toml b/apps/my-app/server/gleam.toml @@ -14,32 +14,22 @@ target = "erlang" # https://gleam.run/writing-gleam/gleam-toml/. [dependencies] -mist = ">= 2.0.0 and < 3.0.0" -lustre = ">= 4.3.6 and < 5.0.0" -gleam_pgo = ">= 0.14.0 and < 1.0.0" -wisp = ">= 1.1.0 and < 2.0.0" gleam_stdlib = ">= 0.40.0 and < 1.0.0" gleam_erlang = ">= 0.25.0 and < 1.0.0" -glenv = ">= 0.4.0 and < 1.0.0" -birl = ">= 1.7.1 and < 2.0.0" gleam_json = ">= 1.0.1 and < 2.0.0" gleam_http = ">= 3.6.0 and < 4.0.0" +gleam_otp = ">= 0.12.0 and < 1.0.0" +gleam_pgo = ">= 0.14.0 and < 1.0.0" +mist = ">= 2.0.0 and < 3.0.0" +lustre = ">= 4.3.6 and < 5.0.0" +glenv = ">= 0.4.0 and < 1.0.0" +birl = ">= 1.7.1 and < 2.0.0" decode = ">= 0.2.0 and < 1.0.0" shared = { path = "../shared" } -# gleam_json = ">= 1.0.1 and < 2.0.0" -# cors_builder = ">= 1.0.0 and < 2.0.0" -# decode = ">= 0.2.0 and < 1.0.0" -# gleam_http = ">= 3.6.0 and < 4.0.0" -# # client = { path = "../client" } -# lustre = ">= 4.3.1 and < 5.0.0" -# birl = ">= 1.7.1 and < 2.0.0" -# gleam_pgo = ">= 0.14.0 and < 1.0.0" -# glisten = ">= 3.0.0 and < 4.0.0" [dev-dependencies] gleeunit = ">= 1.2.0 and < 2.0.0" gleescript = ">= 1.4.0 and < 2.0.0" -# lustre_dev_tools = ">= 1.5.3 and < 2.0.0" [erlang] # Starting an SSL connection relies on ssl application to be started. diff --git a/apps/my-app/server/manifest.toml b/apps/my-app/server/manifest.toml @@ -6,15 +6,13 @@ packages = [ { name = "backoff", version = "1.1.6", build_tools = ["rebar3"], requirements = [], otp_app = "backoff", source = "hex", outer_checksum = "CF0CFFF8995FB20562F822E5CC47D8CCF664C5ECDC26A684CBE85C225F9D7C39" }, { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, { name = "decode", version = "0.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "decode", source = "hex", outer_checksum = "965F517F67B8C172CA27A5C8E34C73733139E8C9E64736181B8C3179281F9793" }, - { name = "directories", version = "1.1.0", build_tools = ["gleam"], requirements = ["envoy", "gleam_stdlib", "platform", "simplifile"], otp_app = "directories", source = "hex", outer_checksum = "BDA521A4EB9EE3A7894F0DC863797878E91FF5C7826F7084B2E731E208BDB076" }, { name = "envoy", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "CFAACCCFC47654F7E8B75E614746ED924C65BD08B1DE21101548AC314A8B6A41" }, - { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.11.2", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "517FFB679E44AD71D059F3EF6A17BA6EFC8CB94FA174D52E22FB6768CF684D78" }, + { name = "gleam_otp", version = "0.12.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "BFACC1513410DF5A1617169A9CD7EA334973AC71D860A17574BA7B2EADD89A6F" }, { name = "gleam_pgo", version = "0.14.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "pgo"], otp_app = "gleam_pgo", source = "hex", outer_checksum = "12256A7F351E994A6E43AB67276DD8AACE752991C013F48A288C4A848F3A9758" }, { name = "gleam_stdlib", version = "0.40.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "86606B75A600BBD05E539EB59FABC6E307EEEA7B1E5865AFB6D980A93BCB2181" }, { name = "gleescript", version = "1.4.0", build_tools = ["gleam"], requirements = ["argv", "filepath", "gleam_erlang", "gleam_stdlib", "simplifile", "snag", "tom"], otp_app = "gleescript", source = "hex", outer_checksum = "8CDDD29F91064E69950A91A40061785F10275ADB70A0520075591F61A724C455" }, @@ -25,13 +23,11 @@ packages = [ { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, { name = "logging", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "1098FBF10B54B44C2C7FDF0B01C1253CAFACDACABEFB4B0D027803246753E06D" }, { name = "lustre", version = "4.3.6", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "A122A11C761E2366EEA4649CBBE5C162BCA8EF5D78C0B1C7AACBA6E824AE9F5D" }, - { name = "marceau", version = "1.2.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "5188D643C181EE350D8A20A3BDBD63AF7B6C505DE333CFBE05EF642ADD88A59B" }, { name = "mist", version = "2.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "981F12FC8BA0656B40099EC876D6F2BEE7B95593610F342E9AB0DC4E663A932F" }, { name = "opentelemetry_api", version = "1.3.0", build_tools = ["rebar3", "mix"], requirements = ["opentelemetry_semantic_conventions"], otp_app = "opentelemetry_api", source = "hex", outer_checksum = "B9E5FF775FD064FA098DBA3C398490B77649A352B40B0B730A6B7DC0BDD68858" }, { name = "opentelemetry_semantic_conventions", version = "0.2.0", build_tools = ["rebar3", "mix"], requirements = [], otp_app = "opentelemetry_semantic_conventions", source = "hex", outer_checksum = "D61FA1F5639EE8668D74B527E6806E0503EFC55A42DB7B5F39939D84C07D6895" }, { name = "pg_types", version = "0.4.0", build_tools = ["rebar3"], requirements = [], otp_app = "pg_types", source = "hex", outer_checksum = "B02EFA785CAECECF9702C681C80A9CA12A39F9161A846CE17B01FB20AEEED7EB" }, { name = "pgo", version = "0.14.0", build_tools = ["rebar3"], requirements = ["backoff", "opentelemetry_api", "pg_types"], otp_app = "pgo", source = "hex", outer_checksum = "71016C22599936E042DC0012EE4589D24C71427D266292F775EBF201D97DF9C9" }, - { name = "platform", version = "1.0.0", build_tools = ["gleam"], requirements = [], otp_app = "platform", source = "hex", outer_checksum = "8339420A95AD89AAC0F82F4C3DB8DD401041742D6C3F46132A8739F6AEB75391" }, { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, { name = "shared", version = "1.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_stdlib"], source = "local", path = "../shared" }, { name = "simplifile", version = "2.1.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "BDD04F5D31D6D34E2EDFAEF0B68A6297AEC939888C3BFCE61133DE13857F6DA2" }, @@ -39,7 +35,6 @@ packages = [ { name = "telemetry", version = "1.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "telemetry", source = "hex", outer_checksum = "7015FC8919DBE63764F4B4B87A95B7C0996BD539E0D499BE6EC9D7F3875B79E6" }, { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, { name = "tom", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "9EECB60150E834A07238BD5C7DF1FF07F7D4C5862BB8A773923D1981C7875FB0" }, - { name = "wisp", version = "1.1.0", build_tools = ["gleam"], requirements = ["directories", "exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "5B25E37E08A94039668D2ACF7B2D2A665BEAF4B48EFA8613010B4E3164137664" }, ] [requirements] @@ -48,6 +43,7 @@ decode = { version = ">= 0.2.0 and < 1.0.0" } gleam_erlang = { version = ">= 0.25.0 and < 1.0.0" } gleam_http = { version = ">= 3.6.0 and < 4.0.0" } gleam_json = { version = ">= 1.0.1 and < 2.0.0" } +gleam_otp = { version = ">= 0.12.0 and < 1.0.0" } gleam_pgo = { version = ">= 0.14.0 and < 1.0.0" } gleam_stdlib = { version = ">= 0.40.0 and < 1.0.0" } gleescript = { version = ">= 1.4.0 and < 2.0.0" } @@ -56,4 +52,3 @@ glenv = { version = ">= 0.4.0 and < 1.0.0" } lustre = { version = ">= 4.3.6 and < 5.0.0" } mist = { version = ">= 2.0.0 and < 3.0.0" } shared = { path = "../shared" } -wisp = { version = ">= 1.1.0 and < 2.0.0" } diff --git a/apps/my-app/server/src/server.gleam b/apps/my-app/server/src/server.gleam @@ -1,6 +1,7 @@ import gleam/erlang/process import mist import server/db +import server/env import server/router import server/web import wisp @@ -14,14 +15,14 @@ pub fn main() { // // load this from somewhere so that it is not regenerated on every restart. // let secret_key_base = wisp.random_string(64) - let ctx = web.Context(connection: db.get_connection()) + let ctx = web.Context(connection: db.get_connection(), env: env.get_env()) // Start the Mist web server. let assert Ok(_) = router.handle_request(_, ctx) // wisp.mist_handler(router.handle_request(_, ctx), secret_key_base) |> mist.new - |> mist.port(8001) + |> mist.port(ctx.env.port) |> mist.start_http // The web server runs in new Erlang process, so put this one to sleep while diff --git a/apps/my-app/server/src/server/env.gleam b/apps/my-app/server/src/server/env.gleam @@ -3,6 +3,7 @@ import glenv pub type Env { Env( + port: Int, db_host: String, db_password: String, db_port: Int, @@ -13,6 +14,7 @@ pub type Env { pub fn get_env() { let definitions = [ + #("PORT", glenv.Int), #("PGHOST", glenv.String), #("PGPASSWORD", glenv.String), #("PGPORT", glenv.Int), diff --git a/apps/my-app/server/src/server/router.gleam b/apps/my-app/server/src/server/router.gleam @@ -32,7 +32,7 @@ pub fn handle_request( ) -> Response(ResponseData) { // use req <- web.middleware(req) - // note assets under /static are caught by web.middleware before this + // NOTE: assets under /static are caught by web.middleware before this let segments = request.path_segments(req) case segments { [] | ["posts"] -> { diff --git a/apps/my-app/server/src/server/web.gleam b/apps/my-app/server/src/server/web.gleam @@ -1,7 +1,8 @@ import gleam/pgo +import server/env.{Env} pub type Context { - Context(connection: pgo.Connection) + Context(connection: pgo.Connection, env: Env) } // /// The middleware stack that the request handler uses. The stack is itself a // /// middleware function! diff --git a/infrastructure/hive.nix b/infrastructure/hive.nix @@ -17,7 +17,7 @@ in { defaults = { pkgs, ... }: { system.stateVersion = "24.05"; # Do not change lightly! environment.systemPackages = with pkgs; [ - vim wget curl + vim wget curl rsync rclone zip unzip ]; services.openssh.enable = true; networking.firewall.allowedTCPPorts = [ 80 ]; @@ -42,15 +42,16 @@ in { imports = [ ./vpn.nix sops_nix - # ../apps/my-app + ../apps/my-app ]; - security.pki.certificateFiles = [ ./secrets/ca-certificate.crt ]; + # security.pki.certificates = [ (builtins.readFile "/run/secrets/ca_certificate") ]; sops.defaultSopsFile = ./secrets.yaml; sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ]; sops.secrets.server_wireguard_key = { restartUnits = [ "wg-quick-wg0.service" ]; }; + sops.secrets.ca_certificate = {}; users.users.silas = { isNormalUser = true; @@ -63,13 +64,16 @@ in { ]; packages = with pkgs; [ neovim + gleam + erlang_27 + rebar3 ]; }; - # services.myapp = { - # enable = true; - # greeter = "Bob"; - # }; + services.myapp = { + enable = true; + port = 8000; + }; # services.postgres = { # enable = true; diff --git a/infrastructure/secrets.yaml b/infrastructure/secrets.yaml @@ -1,14 +1,5 @@ -hello: ENC[AES256_GCM,data:p3TGNPrk8jD3Zp7Isz+hcTeJfhO9Y8yqbMfkjCKNM2+AqSxEHp5fFN+5F6h/Mg==,iv:nxHP8dSBd3WbgMAUtgkKrJ2cnua3tBIItxEPsN66gEE=,tag:9L1TILuxnRlLecC2dG04Jw==,type:str] -example_key: ENC[AES256_GCM,data:Wb4ExC7CINl2Rah1Ow==,iv:5X2nkERMxxcut6v+9kUI5WqhdSY1gmKAHJcKAe3RTd8=,tag:tiNFZUD6sbS7yEqNWEmgNA==,type:str] -#ENC[AES256_GCM,data:jTbqOMZ1/Ft4IoJMTnSqUg==,iv:jnh6qd+y5iALVWJddqWTTDolizAsf1QXH554qC0iG2w=,tag:dM4VaxkQsabvCBJZVoq76Q==,type:comment] server_wireguard_key: ENC[AES256_GCM,data:21uPlSLnedqeXxIjS+HhJ0lAD6T/diIkjAAhbrB/a6jSVST9u8YTXWNgZ8w=,iv:pOGONrRuUNS8obDdw6GvEkCO7a+Ym5kOgLH6u+P9QQ0=,tag:cAcDTQ5pU8fV5hDzx+d+5A==,type:str] -example_array: - - ENC[AES256_GCM,data:emBtNM4Z+eKUc4fgoy4=,iv:QZGLgegm37t2rJz7cadXuhysv2x4KUZ/Vz41WVk49g0=,tag:0GoDPZIuOJKo+ilvplxPpQ==,type:str] - - ENC[AES256_GCM,data:d13nqbhM7eiZHrgHCEg=,iv:MeM5zOcGiaXB6kuctZ8uOkei3aH5RusoWDhj8hp9a6E=,tag:y0S4sDbM18OC9rPylE64Cg==,type:str] -example_number: ENC[AES256_GCM,data:XthxMNyNsYcvBA==,iv:wP9J1RLbHqr/s6fCKn08pCkkazte7YbiM8i/lRLpCBI=,tag:Lw3Z4pw3GI7OHaTYYiaXPw==,type:float] -example_booleans: - - ENC[AES256_GCM,data:voC8aQ==,iv:GJo2uL2/QgfaXEgX5jaoeRL3MGDYVsfR4R4g24Bj+L4=,tag:9bSOFsLQ+s2RGBCT8mR+hg==,type:bool] - - ENC[AES256_GCM,data:TjfdAX8=,iv:n7a0ygblw4nl0fonIWR9bUevTvCBz51Aib8iaiP/YMo=,tag:fXxyhQiAbwLxP+bzRFhCxA==,type:bool] +ca_certificate: ENC[AES256_GCM,data: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,iv:VQYKe9GilKIRqDEVWKZtls1k+CfaEi8YhdXVKb9nh78=,tag:d4OYBzgyKA5KDkj9gz9CXg==,type:str] sops: kms: [] gcp_kms: [] @@ -42,8 +33,8 @@ sops: VTVIMjJSaGVRY3hYbmhzUmFiaCtxVUEKmGFgyEVxF0s8UqrbV9vpVonzEqMdx/9z yeAc9I9fdMiakISPvkh9Jkexc4duFS1noGTIAXPfCEriIupol2MVvw== -----END AGE ENCRYPTED FILE----- - lastmodified: "2024-10-02T18:09:09Z" - mac: ENC[AES256_GCM,data:AP3fnmoVRzNC/fmzrsn4triUB12/09VUzVO2hVtLsmBo6U1BaE86PMj49o9GvaGZ11zHAo9RC/f9egZYtgrXSfVHlMy8dVndONRF3UvAXaEyIyWqGpy98+iaSRavYRHCyYGKg1t1Z24Kjj9Yh3Dk4V5eNSnhobcPR5wlEkjCXGQ=,iv:iD2bg9e0yhyxdFaeL4nZK0mJjaAFGkyOmxT8/VsEPUI=,tag:DYB5E1Tfp9w6NP6I6DAt0Q==,type:str] + lastmodified: "2024-10-04T13:22:15Z" + mac: ENC[AES256_GCM,data:8iW4SK8nAwaqfSr/FMebDZlF+8oUzu1YdK7sMoLCUEtYsuXCkjtHos9PAbayxmy5Mn3HipeJoqnkgPF9e0KDcvG2iwhIGTilheFx0qHvWz67cY5WdH0ykKVTbo1Kzcn3fhy/jzEzEYW1/hIPmrxZ82fA2jDMl9voSrVBgF6Rwg8=,iv:X7u4QwwXf54sK3bOtxQ6wgiswZF12zhNwhfsc0z2758=,tag:kS0SNx7YqUjWODoURDSpIg==,type:str] pgp: [] unencrypted_suffix: _unencrypted version: 3.9.0