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