diff --git a/hosts/by-name/desko/default.nix b/hosts/by-name/desko/default.nix index 592cc5e53..11fa3019e 100644 --- a/hosts/by-name/desko/default.nix +++ b/hosts/by-name/desko/default.nix @@ -29,6 +29,7 @@ sane.ovpn.addrV4 = "172.26.55.21"; # sane.ovpn.addrV6 = "fd00:0000:1337:cafe:1111:1111:20c1:a73c"; sane.services.duplicity.enable = true; + sane.services.rsync-net.enable = true; sane.nixcache.remote-builders.desko = false; diff --git a/hosts/common/secrets.nix b/hosts/common/secrets.nix index 379aed1e2..974de93cb 100644 --- a/hosts/common/secrets.nix +++ b/hosts/common/secrets.nix @@ -71,6 +71,8 @@ in { "jackett_apikey".owner = config.users.users.colin.name; "mx-sanebot-env".owner = config.users.users.colin.name; + "rsync-net-env".owner = config.users.users.colin.name; + "rsync-net-id_ed25519".owner = config.users.users.colin.name; "transmission_passwd".owner = config.users.users.colin.name; } ]; diff --git a/hosts/common/ssh.nix b/hosts/common/ssh.nix index 0e3edefc2..3524894c5 100644 --- a/hosts/common/ssh.nix +++ b/hosts/common/ssh.nix @@ -22,6 +22,11 @@ in # documented here: # Github actually uses multiple keys -- one per format "root@github.com" = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl"; + + # documented: + # extract keys with `ssh-keyscan sd1.rsync.net` + # validate fingerprint with `ssh-keyscan sd1.rsync.net | ssh-keygen -l -f -` + "root@*.rsync.net" = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINdUkGe6kKn5ssz4WRZKjcws0InbQqZayenzk9obmP1z"; } ]); diff --git a/hosts/modules/services/default.nix b/hosts/modules/services/default.nix index 69736468a..acf614d86 100644 --- a/hosts/modules/services/default.nix +++ b/hosts/modules/services/default.nix @@ -2,5 +2,6 @@ { imports = [ ./duplicity.nix + ./rsync-net ]; } diff --git a/hosts/modules/services/rsync-net/default.nix b/hosts/modules/services/rsync-net/default.nix new file mode 100644 index 000000000..f775ec2f0 --- /dev/null +++ b/hosts/modules/services/rsync-net/default.nix @@ -0,0 +1,51 @@ +{ config, lib, pkgs, ... }: +let + cfg = config.sane.services.rsync-net; + sane-backup-rsync-net = pkgs.static-nix-shell.mkBash { + pname = "sane-backup-rsync-net"; + pkgs = [ + "nettools" + "openssh" + "rsync" + "sane-scripts.vpn" + "sanebox" + ]; + srcRoot = ./.; + }; +in +{ + options = with lib; { + sane.services.rsync-net.enable = mkOption { + default = false; + type = types.bool; + }; + sane.services.rsync-net.dirs = mkOption { + type = types.listOf types.str; + description = '' + list of directories to upload to rsync.net. + note that this module does NOT add any encryption to the files (layer that yourself). + ''; + default = [ + "/nix/persist/private" + ]; + }; + }; + + config = lib.mkIf cfg.enable { + systemd.services.rsync-net = { + description = "backup files to rsync.net"; + serviceConfig.ExecStart = "${lib.getExe sane-backup-rsync-net} ${lib.escapeShellArgs cfg.dirs}"; + serviceConfig.Type = "simple"; + serviceConfig.Restart = "no"; + serviceConfig.User = "colin"; + serviceConfig.Group = "users"; + }; + systemd.timers.rsync-net = { + wantedBy = [ "multi-user.target" ]; + timerConfig = { + # run 2x daily; at 11:00:00, 23:00:00 + OnCalendar = "11,23:00:00"; + }; + }; + }; +} diff --git a/hosts/modules/services/rsync-net/sane-backup-rsync-net b/hosts/modules/services/rsync-net/sane-backup-rsync-net new file mode 100755 index 000000000..27c043d93 --- /dev/null +++ b/hosts/modules/services/rsync-net/sane-backup-rsync-net @@ -0,0 +1,27 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i bash -p bash -p nettools -p openssh -p rsync -p sane-scripts.vpn -p sanebox + +# rsync password auth doesn't work with rsync.net. +# ssh keyfile auth *does* work, so i use that. +# for setup, see: +# - requires my pubkey to be copied to .ssh/authorized_keys on the remote. + +set -x + +# secret should include RN_USER +source /run/secrets/rsync-net-env +RN_ID=/run/secrets/rsync-net-id_ed25519 +PREFIX=$(hostname) + +test -n "$PREFIX" && test -n "$RN_USER" && test -f "$RN_ID" + +for dir in "$@"; do + if [[ "$dir" != */ ]]; then + dir="$dir/" + fi + remote_dir="$RN_USER@$RN_USER.rsync.net:$PREFIX$dir" + + echo "syncing '$dir' to '$remote_dir'" + # N.B.: the `--exclude=$RN_ID` flag is a noop to get the ID file to be included in the sandbox... + sane-vpn do unmetered rsync --exclude="$RN_ID" -e "ssh -i $RN_ID" --mkpath -arv --delete "$dir" "$remote_dir" +done diff --git a/secrets/common/rsync-net-env.bin b/secrets/common/rsync-net-env.bin new file mode 100644 index 000000000..825a09096 --- /dev/null +++ b/secrets/common/rsync-net-env.bin @@ -0,0 +1,52 @@ +{ + "data": "ENC[AES256_GCM,data:SEzx6Cez/QqMEfY548GQ,iv:Shduy7pMXV+vC/eyvWAFoAeD+jklAozw7hhW7e9bDXg=,tag:Dmi4+qdxql7vzogHo+On2Q==,type:str]", + "sops": { + "kms": null, + "gcp_kms": null, + "azure_kv": null, + "hc_vault": null, + "age": [ + { + "recipient": "age1tnl4jfgacwkargzeqnhzernw29xx8mkv73xh6ufdyde6q7859slsnzf24x", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB1Z3dicktUK1FUb3NBTWFy\nL29KUjFMZE0zZzhmT3NqR2xKOXZ4WUYvK1RJCmdLSDVEczVxRWZnK1ZELytpSmhM\nVmJSdTNYNkpuL1o2UU91eXpZUzUxUVkKLS0tIDdpNGtXVUk3V1N2azBRYjFVVGVQ\nbGZ3T1ZQTDJIWVFyNFZwejJUZUMrVDAKRCv/PsKCHvft0senu9ZirdQ8esYcB+7e\npJy076iPJgH+qXLZaiLXweet0ErER2G/T7pfUJpie/KmO8q8YYHVvg==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1j2pqnl8j0krdzk6npe93s4nnqrzwx978qrc0u570gzlamqpnje9sc8le2g", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB1cEJOckdxTFpOekZxNUZv\ncmY4Mk1OR2Y3R0pYRmorOW85NEFFaWc0NEhJCnpoZi9kODl1Z25oQ1dnTGhPZ2NV\ncGN2YVFESUoyR3FOWHZYVVF2bDBKUTgKLS0tIE94Tjg1WU4xQXNFa0lQYVhYdFBB\nR3lwWjgza1M1ZDVoU3d3NC8yck9pQ00KBXCxdAq8ZsEFoEHY8FsOwOcd0KTQM4ZU\nESKhMQEtuC7WVf2p6PQTVwGcqU+0hgpbov0XZjoSLhzXnKQMfYli6w==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1z8fauff34cdecr6sjkre260luzxcca05kpcwvhx988d306tpcejsp63znu", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOR3pkZjdsNVllT3Fqbk1W\nSmFWNGxnVTBCZ08xcm5XWXd0ZVlxTTJiMVZVCjJza0M3Mnh5Q0UySE5yUC83b1Qw\nU08zbmZ0QWllRzNCUURYTkJqd1o0WjQKLS0tIGJZSlZ4RjZJMk1seER6MjM3VElW\ndUpDV2hOT1dIMHhKQ1ZQdXpyb2RuT3MKAipgB5NHYeP7/e/rCQevmqmcjCC6LAe2\nZiPoKn75cnT1sdPscoMRE1E246cN11OejFPyBgpfIL+HTJcNmsFFmA==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1zsrsvd7j6l62fjxpfd2qnhqlk8wk4p8r0dtxpe4sdgnh2474095qdu7xj9", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTOUp5dW1ZbkphVHhmZWhY\nY3FDTEIvNk9HcithMm9vZnEyM1R0dk9Ec21jCmhPOTdyMVE3aTdDQVJuamFGUzhF\nT0dlVytyZFRzdE55cHB0eUhzR2JBdWsKLS0tIFZTcHIxMFI2Zjc2MnpVeFlCTTlM\nMDlBOHYrV0pTYzZvallINkx6Z0pZd0kK/lZHufkRh/Bm4q5fCPBPdf1aT+9hzA2y\nom0slNf7DNr5ACrjPzxeBu/Sl/0eaImJAU7PyLQUaJ9FtUTUK7vnZg==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1hl50ufuxnqy0jnk8fqeu4tclh4vte2xn2d59pxff0gun20vsmv5sp78chj", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiWVNkK3BPeWZYUUFSYjc2\nKzRTS0VVcXlKek5uais2ODgwMm52Y1NnN0V3CjZlUHhQRUZ2eWJ2ZFBEdmEyNjNW\nd2RDaVpPMUw5YXpzWFdxeDYwN0pwSFkKLS0tIEZZRUF5bHd0cjFRUWptZUxYMHhk\nWU5VRVF4djIrV25HRG0rZW5VVVBkKzQKzCQnjY1deI/WIlcgTuZ7/2+N2+EJs2G7\nROOCfx606n0WvDsO/pCUCViPEzCiAuDWatZ413aRs62D9P9W9qUSyQ==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1vnw7lnfpdpjn62l3u5nyv5xt2c965k96p98kc43mcnyzpetrts9q54mc9v", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQcU9kMzl3VWh3SEt1Ynly\nZS9RbFd2ZnJHQ3grOCtuT3YxcjFRcVlRenhnCno2ZVk1VzFhcHovc3BjM0xxaUlN\nc2ZsUWhzME9DVDVmWG9hdU13VXZtaVkKLS0tIElmTEcrdEdFME1vZXNmMWNsUzhk\naHMxODVIL2Ixa1NCZDBXK24vdUVkSXcKipAwk1/rvLy46Y9MKK/5RTpt6bS0d3eL\nebKI3FXQ4wFejgkAB9+zfxvkpAH57CtBmEklYAZmEUf8gWvs6IPSCQ==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1w7mectcjku6x3sd8plm8wkn2qfrhv9n6zhzlf329e2r2uycgke8qkf9dyn", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBScTN4NDg4c3gxOVZVakt5\naUszUld4TmpBWStqTEtWQ0o2eGtsMGpZS2hJClVTVE1qaEU4Wk1JSHB5Rmw5ZXRh\nQkNIcUFaUVZLYnVsS2Y5RjNBYWFYQ1UKLS0tIE9VV0psYlcrcU5oTTk4ZHppbHVZ\nZG5XYXJqTG9aM2pyYkJSR284dElTaTgKw7aZ9GOPO01JajPPta5L3cmV5MDMtl8d\n3ucbhj9+8VnKzwQFCNQO9WqQfj3NorU6B2QUulfX3SwIjbYfhQhqYw==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1tzlyex2z6t88tg9h82943e39shxhmqeyr7ywhlwpdjmyqsndv3qq27x0rf", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB5bmlNTHNKRVE1MXJvYXpq\nYjZPYjd2dDdNSGRONE5IZlZVZEVlM05BdGswCit2NzRpa2xXaGp5eVg1Ykw0UWVV\nTXYxVXNzMHVzVmV6VTBlZmkvYi82TmcKLS0tIE53NDhPN3V0cmtSUms1Z0d5aWRQ\nSlhPZStvMmNJYU90REQ4anlNU0NGMDAKbNpXmymQdKC53GxjM21bzrgdh3JfhZIv\nIZSR1GrfV7TS5rwVDQz8iEdtFUy6TRplGmzSUJ4yeBtc4q10AJsESg==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age18vq5ktwgeaysucvw9t67drqmg5zd5c5k3le34yqxckkfj7wqdqgsd4ejmt", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBPRStIWEIwNGl5cmI2ZVBS\nc0RLRTVlelZ1M3FTMU1RclYybG1ZQ1pXc1VrCjh0N0w1Tld6MC9TRjdyQjBjZjBu\nOUpPZytSR3k2RjRLN3ZGS1BGNjNmb1UKLS0tIFI5dllGVzJ6UFNsUlRDdVA5VmxF\nN2VpM1BzdEhBTzdmeC9CdXlNMjlyeDAKPx/fYwo93WT2Yi0+9MFqAnMYSwKoetoT\n6T0bTtUggkIGE3I19/+JCr0JAXQd/HdJwN2NQ3Wllcd5oWl0IbQicw==\n-----END AGE ENCRYPTED FILE-----\n" + } + ], + "lastmodified": "2024-07-19T11:22:47Z", + "mac": "ENC[AES256_GCM,data:Tx97QGPG0ApUmzKIIYPiXGLTTPDHuLiuf7g09MI27UWL8j5R1MXpzem+TSrfAMr14iwN/HM0IWgCrZ17zyVlFDKB0MJkNp16WwJT8YTzi8RnKgb5j02EEiG2+kXiwwhy/4eZw1Qk0IvgOraS2Sb/VcofHajpG0+PmLWx/EhJ/pE=,iv:5Ka+usZ0lqS54MNTUmxXoi5teiLBjXQISfG3aaQknOc=,tag:ueesV8M5PFsPpojDpTQEdA==,type:str]", + "pgp": null, + "unencrypted_suffix": "_unencrypted", + "version": "3.9.0" + } +} \ No newline at end of file diff --git a/secrets/common/rsync-net-id_ed25519.bin b/secrets/common/rsync-net-id_ed25519.bin new file mode 100644 index 000000000..31dc7d412 --- /dev/null +++ b/secrets/common/rsync-net-id_ed25519.bin @@ -0,0 +1,52 @@ +{ + "data": "ENC[AES256_GCM,data:cWHlbm93oLeDQQVESjrQE+ibnu+yVzcT5kT+dqthLNJmRZ5Uwtc+s6yLoFB2PuM+XwY/hBX/RXrAKJqNQir9NyWbLaS2FbJ2gu4xr0lbbBp+qFipgD8J3aEloTfLqWr9LyTxhYkqOPOsbPPMowKkRADPwsQSm6+fvy02Ip1dK4DtTBxGy1f9sdfoWa8GcrzqkkbxAHq8EBVvsPVlPHLavFeH/N08e8rZjl8Uf29Ldq5RUYjflfc5D8+oo4R8SksEL3jyIZQcZUMOXxy7etHQ5Cf4FozI2jVP/2Arf9jdmpZ2nRzSGcgyxtR0mBZUh0jm8J0KCWuHej97gpIEiDZDGh13zDH3iir/FoTpQjY1RaPCoKLwu4bzgp7VuQmu0NQ7ObaXZANEyCHD8mhNB/vaLtkLbsxajVauIUu8E9Y8i2aC7pIL02lfrUssZ++sXiTd18U7+BDKPH9nS2ufboEv9PhVL7Tl7r8EpBiKWS73M9ILrLZkff0q37S+j57JaENRs97ibx8p3Z1PQwQ2mexz,iv:gQsd8odpt3ItChdYKNWwIbooH5w+tFQjOOkZFO9ZA0A=,tag:Z7hPtsWuHl/wllb5NTqmMw==,type:str]", + "sops": { + "kms": null, + "gcp_kms": null, + "azure_kv": null, + "hc_vault": null, + "age": [ + { + "recipient": "age1tnl4jfgacwkargzeqnhzernw29xx8mkv73xh6ufdyde6q7859slsnzf24x", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBVdTF1R0tSU3hsM1BVNjk0\nemVqZGI2bm4yUENFRGZmeHUvdkhGYVJkZTJjCnlBUG9HMHJIN1k2b2VzbWhuMTRP\nN3FQT3NMbXFCWkhTOUxFZGNoSlJhVkkKLS0tIHlJZVJkTDdCVHRwWDkyN0ovRHRx\nVmRoN0EySEh4UElRazF6U3o1SDhmTHcKD+s+PhZ0pfioxKR0HR8w1M/xE+/NWMiI\nbjrzVhIRC6sizdn8wJnDWwgo2/Q3+Zu3dCql467QPk7c+eSDuJo4IA==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1j2pqnl8j0krdzk6npe93s4nnqrzwx978qrc0u570gzlamqpnje9sc8le2g", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0VUtuUk5WK2JKOCttU3Uv\nM2EzZG12NGRmbXBkcWJFQWZMMG4vNm5OL3k0Cnp3U29CekxMV2JvSE53ZmEyc2FB\ncWE1SFJHWGh0cjJwR2dJQnR2dWh4MHMKLS0tIFZwUmhPeHl1U0QwNzNZaCs5Mnlo\nOStLQktFWDlJMExONzZQQ0lCSlRwTEkKvgXikkawmB0dLLuKm1LfICNPILVTzDTI\nxbfBD+HruFjatwxjKz/T3av5UYunBXw4pybFQI8dBZHa+oa5p17w0g==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1z8fauff34cdecr6sjkre260luzxcca05kpcwvhx988d306tpcejsp63znu", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOT0FPZkxiQm93UkwwakFz\nQy9Rc1g3eEVRVllEZGx2T3VERC94Q1JGVVRjCnMwS1R0ZGF1TjlwY0xJQkNCRXV5\nTDRyOVltbGhFTGVGUHY5czR2VzhpVzAKLS0tIGluQklYb2U0RTdFSXd6NURReDJY\nWGgvUUNlaHVwdHFSQlRURzg3SktDb0kKr7gYMCqLt4+vCJadP1spbwZ2WdDzYTf9\nSF+5l1szZQywB7J+aUDTgs8TCntCLmWp1z7FK7RPYBv0XdgTROvv2A==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1zsrsvd7j6l62fjxpfd2qnhqlk8wk4p8r0dtxpe4sdgnh2474095qdu7xj9", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2ei9naE9sd1FaZHZlenNT\naWp3aWhMZzRRSjhuM3VxWVF6Z2wyUE5qNkZFCjlhdzlpOHNGSFAxem1NNFljdEpo\nTGVpTTkrclU0Wk9oZFZTY1Z4WFlCOHMKLS0tIHYzU3htOTB2bmxNelB4cjNsS1gw\nV0FmV1FNL28vV2t1NWltdTZwcXJRbjQKq5X7YsmvIDUTTvOrjwjjLt/DzXig6wsV\nW7/PTxCimGOQf0wgB5u4D8LJf39cbgpZ8PUQzDwtzeXBeLYFtRO4fw==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1hl50ufuxnqy0jnk8fqeu4tclh4vte2xn2d59pxff0gun20vsmv5sp78chj", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBubys3YllGMEVlaXp0a0E4\nM21rcldMelNJWGxWRzgyOWprM3ZQU0JNeVg4Ck0xalpWKzhpckxiSmtQamV0dDBV\ncTFBbkxmVlFMMjZ6QVFkeDRJZ3MrUjgKLS0tIDcySzBaTzNiZmFHSmNudVFBTzFF\nSmUwa211MnowS3p2a2QrWGV4SzlQd28KO8Uj6nQKFu7HcUtExtu2yyaTXBKgf0u3\nuSlegey+R5LYsngqZMAWjETkgDbMPerReFmRAbNZhiGcTYB2azgY8Q==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1vnw7lnfpdpjn62l3u5nyv5xt2c965k96p98kc43mcnyzpetrts9q54mc9v", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAzTmZWZ3Z5UUtOZG0wbTVH\nSU1CbGVJR2ExTGs1RlNXd1dkOUJWWlRNWjNjCmZaTFc4N1pkSEtXTm1peDZuUUc5\ndmVjZVExWFFMQ3N0eEllVDJnck05SEkKLS0tIGQvdTcxcmNsTDZ0R1U0b2R6WGYz\nRXhTR09yc29kRmpGRElhNlZrYS83SWsK1n+mE+iq6LaY4HNUy4nJj+Iw8q8SW/vr\nRKj3GTUBfUpt3P0NpMQbCv2eB347Yp76MnYJ+gUxqthxiH6+oU8gTA==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1w7mectcjku6x3sd8plm8wkn2qfrhv9n6zhzlf329e2r2uycgke8qkf9dyn", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBKMTJKK0J0YmdLQmpURWNK\nNTJGdkhXbmhFeDRvMklxYW5NYmJjZGZQY1VFClhKME1iYis3TjV2ajRqdEpJWVgr\nUS9iZWpOdmNJTW1jZUNDNEkzbWtKM3cKLS0tIFF5RkZUNXVJMXJaTUNCOVNOems1\nUUZyOGZwbkc2bFBDbTZiWUMyZFc3RWcK3AEhsFRxY6bkSRrWIHYVNcSJSi/kCt/A\nU4unOXjzLZD23pVWSZOxcjm18C3skOn81MrSjzmgVeCVgxmO4Iw5dA==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age1tzlyex2z6t88tg9h82943e39shxhmqeyr7ywhlwpdjmyqsndv3qq27x0rf", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2ajRuUnozVUxpS2FIZDRY\nOGJLYTJPWDQ3MlZtSkkxbWhJcnU3YnFVU3o0Cm9JcmQ1bElEZ2JEbktWUjJITnh2\nVEpiU1VLeStqUXU0V1J6N1BOY0hZQVkKLS0tIHdKQVRsOXBmL2FCQ3NCUzM3MEhr\nYkgyQUVLRVdGYnoxUC9Nc0QrbXMrTVUKUzOqFxtan8lKKbW2F6H902frbDBqdo5M\nZrH0dbfmQmohJlcJJvMOLdo5Q0rFTRrO51gdDXVc7PO4mBJnfNQmJA==\n-----END AGE ENCRYPTED FILE-----\n" + }, + { + "recipient": "age18vq5ktwgeaysucvw9t67drqmg5zd5c5k3le34yqxckkfj7wqdqgsd4ejmt", + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtMGpsd1NZeUIwS014YU9j\nWXpaRGxVNHRFL1phYWZERWUyOVpyYm5SYm1vCmVRb2cwMGFHT2p5b09zQTRsZE0w\nUnZzdWFTcnAxSVV2TGRQR29xcmlySWMKLS0tIEtUMGdJSk91VVl4Ry9sYmFmbktT\ncVRuVVVlSjJFcEt2VVZCZFd5YmRGSjQKt5kRSuRCZe1U9N/1d3PU4BESzo+Vx8Is\ntRX52zldEcqfbWv2NGccLoIw6VURbiNImhDPI/xrUWuXBn8ftv4soQ==\n-----END AGE ENCRYPTED FILE-----\n" + } + ], + "lastmodified": "2024-07-19T11:02:29Z", + "mac": "ENC[AES256_GCM,data:SHxJvum6uFN9sDTZ5i7Z4Qke0yMVLj9zVBai5ZbsbBjsiwiWMDlRjcFFLjgCt28Ip6Inz8QNVvDVWZrgo9nGEYGwA7xYsmqcCvHsXRlNOzI9T2dM+DmS05FaC5dQP4EVMWrp5zHNQDHXMDBoobP8Owo64WPHM6aWkzBzDMJz/rY=,iv:TPbYA8Ahb7dhE1F3NZO9LR7jv8/gUnidw/tDo5mYJRg=,tag:4J1YgGPaX7yvIe+Nkn33Hg==,type:str]", + "pgp": null, + "unencrypted_suffix": "_unencrypted", + "version": "3.9.0" + } +} \ No newline at end of file