Compare commits
14 commits
1873bb7170
...
f390d41955
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f390d41955 | ||
|
|
4f0d0f7f0e | ||
| 47df6b544a | |||
| 34fd079fb7 | |||
| 5f0f986c59 | |||
| fe628075d9 | |||
| dd9e79b889 | |||
|
|
352c057652 | ||
|
|
e3ae7220d3 | ||
|
|
e9fef516ec | ||
| 40da937ee0 | |||
| e17b144c9f | |||
| a8dbf792e3 | |||
| b11a33de6e |
10 changed files with 180 additions and 88 deletions
9
.just/machine.just
Normal file
9
.just/machine.just
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
@_default: list
|
||||||
|
|
||||||
|
[doc('List machines')]
|
||||||
|
@list:
|
||||||
|
ls -1 ../systems/x86_64-linux/
|
||||||
|
|
||||||
|
[doc('Update the target machine')]
|
||||||
|
update machine:
|
||||||
|
nixos-rebuild switch --use-remote-sudo --target-host {{ machine }} --flake .#{{ machine }}
|
||||||
28
.just/vars.just
Normal file
28
.just/vars.just
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
base_path := invocation_directory() / "systems/x86_64-linux"
|
||||||
|
sops := "nix shell nixpkgs#sops --command sops"
|
||||||
|
|
||||||
|
@_default:
|
||||||
|
just --list
|
||||||
|
|
||||||
|
[doc('list all vars of the target machine')]
|
||||||
|
list machine:
|
||||||
|
{{ sops }} decrypt {{ base_path }}/{{ machine }}/secrets.yml
|
||||||
|
|
||||||
|
@edit machine:
|
||||||
|
{{ sops }} edit {{ base_path }}/{{ machine }}/secrets.yml
|
||||||
|
|
||||||
|
@set machine key value:
|
||||||
|
{{ sops }} set {{ base_path }}/{{ machine }}/secrets.yml "$(printf '%s\n' '["{{ key }}"]' | sed -E 's#/#"]["#g; s/\["([0-9]+)"\]/[\1]/g')" '"{{ value }}"'
|
||||||
|
|
||||||
|
git add {{ base_path }}/{{ machine }}/secrets.yml
|
||||||
|
git commit -m 'ops(secrets): set secret "{{ key }}" for machine "{{ machine}}"' -- {{ base_path }}/{{ machine }}/secrets.yml > /dev/null
|
||||||
|
|
||||||
|
echo "Done"
|
||||||
|
|
||||||
|
@remove machine key:
|
||||||
|
{{ sops }} unset {{ base_path }}/{{ machine }}/secrets.yml "$(printf '%s\n' '["{{ key }}"]' | sed -E 's#/#"]["#g; s/\["([0-9]+)"\]/[\1]/g')"
|
||||||
|
|
||||||
|
git add {{ base_path }}/{{ machine }}/secrets.yml
|
||||||
|
git commit -m 'ops(secrets): removed secret "{{ key }}" from machine "{{ machine}}"' -- {{ base_path }}/{{ machine }}/secrets.yml > /dev/null
|
||||||
|
|
||||||
|
echo "Done"
|
||||||
21
.justfile
21
.justfile
|
|
@ -1,7 +1,18 @@
|
||||||
|
@_default:
|
||||||
|
just --list --list-submodules
|
||||||
|
|
||||||
try-again:
|
[doc('Manage vars')]
|
||||||
nix flake update amarth-customer-portal
|
mod vars '.just/vars.just'
|
||||||
nix flake check --all-systems --show-trace
|
|
||||||
|
|
||||||
update machine:
|
[doc('Manage machines')]
|
||||||
nixos-rebuild switch --use-remote-sudo --target-host {{ machine }} --flake .#{{ machine }}
|
mod machine '.just/machine.just'
|
||||||
|
|
||||||
|
[doc('Show information about project')]
|
||||||
|
@show:
|
||||||
|
echo "show"
|
||||||
|
|
||||||
|
[doc('update the flake dependencies')]
|
||||||
|
@update:
|
||||||
|
nix flake update
|
||||||
|
git commit -m 'chore: update dependencies' -- ./flake.lock > /dev/null
|
||||||
|
echo "Done"
|
||||||
11
.sops.yaml
Normal file
11
.sops.yaml
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
keys:
|
||||||
|
- &ulmo_1 age19qfpf980tadguqq44zf6xwvjvl428dyrj46ha3n6aeqddwhtnuqqml7etq
|
||||||
|
- &ulmo_2 age1ewes0f5snqx3sh5ul6fa6qtxzhd25829v6mf5rx2wnheat6fefps5rme2x
|
||||||
|
|
||||||
|
creation_rules:
|
||||||
|
# All Machine secrets
|
||||||
|
- path_regex: systems/[^/]+/[^/]+/[^/]+\.(yml|yaml)$
|
||||||
|
key_groups:
|
||||||
|
- age:
|
||||||
|
- *ulmo_1
|
||||||
|
- *ulmo_2
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
keys:
|
|
||||||
- &primary age10c5hmykkduvy75yvqfnchm5lcesr5puarhkwp4l7xdwpykdm397q6xdxuy
|
|
||||||
|
|
||||||
creation_rules:
|
|
||||||
- path_regex: secrets/secrets.yml$
|
|
||||||
key_groups:
|
|
||||||
- age:
|
|
||||||
- *primary
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
#ENC[AES256_GCM,data:jozDiJTPaF427kVL4MDV8VOVhft52sOS9YIfj0n8WUJmQzVoiNY=,iv:8kyaDw0l82KZfYKkfKDj0wvcIkY6zas5e8puubEr1mA=,tag:LvuVGvU195BihU8TbPN1xg==,type:comment]
|
|
||||||
example_key: ENC[AES256_GCM,data:9jefDfjJLP8Ha135Lg==,iv:9SUpjO1t65gA3LiwYN6nMj7icwInxTCQz7JsNEfQ2XA=,tag:Y8BBSLwUQem8wSXAlvnEXg==,type:str]
|
|
||||||
#ENC[AES256_GCM,data:IU1T4k/+44s8qFnjnreDMihjQRmMd5qSTtfA/ung5/1f1JmBXGP7EwYJBFF9BSBkBqBfv24A9Ok=,iv:tHzL3pW/qsNdWGT3c+ni0uTlkBMWOu/SsraymCuAkqs=,tag:nWZgWdPNiKQ0j/t9Z/5l5g==,type:comment]
|
|
||||||
#ENC[AES256_GCM,data:BhUTbsJB5voz4m1w8u1Y/MI8kR5lpRW8RpZO65IyGg232uNSoBLXB2QSl1GseyTC8bZHPiCF2gnttPD+76kqVlfzhhDu4EKU,iv:Ic8ZpR2QBBGhF2++S/TR/DRutkTghpMiby+yvNy0CSE=,tag:Z1JEtowycGDNWuznlkId8A==,type:comment]
|
|
||||||
example:
|
|
||||||
my_subdir:
|
|
||||||
my_secret: ENC[AES256_GCM,data:hccfc6uU4tGT,iv:HYjmo9kAVCcXSpDKWGku3vaJVvZHzYB3l079xXw5OEQ=,tag:c2b8BSqlL1LTcDf1nSPfVA==,type:str]
|
|
||||||
sops:
|
|
||||||
kms: []
|
|
||||||
gcp_kms: []
|
|
||||||
azure_kv: []
|
|
||||||
hc_vault: []
|
|
||||||
age:
|
|
||||||
- recipient: age10c5hmykkduvy75yvqfnchm5lcesr5puarhkwp4l7xdwpykdm397q6xdxuy
|
|
||||||
enc: |
|
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBpeHZXWkZ2andYSytmYWpR
|
|
||||||
ckttNVJZaWxDK2ZwME1iY2wrWFNwR0hzWUNFCjVSaWpmTHkzdHpPNjhueTQ5ZUEz
|
|
||||||
YW1BcnIwU1hsb2lodk1QcHJvTUdrVVUKLS0tIFNpWlBqb2pOWDVLV0FvU1FUODJB
|
|
||||||
dTg0QXZuSkJXV3ZRSUlKcktDNElia28KKZ62gTVpeiz1CfK7awURrPZ7zAYx9vfR
|
|
||||||
Ajxk0cw1gleE6EU2iIlLOWtmyZbcNk1X32a+otXijlH8fDGtoxA97Q==
|
|
||||||
-----END AGE ENCRYPTED FILE-----
|
|
||||||
lastmodified: "2025-03-09T11:37:49Z"
|
|
||||||
mac: ENC[AES256_GCM,data:ZEqJc6slPb3YMR9kn/jFImjkQQIT3KyUK3qE3JMty+IAAr9GT8r+rHOwku4TOwL6YzON6L5vkUQFFKnOz9GiJuGkStc6AbML4SfOlRDsaFU4kwO+27UvDBYRqi6iHtJ2pu/uD4wELVhdbElxHvFlCjtgqBWaWmlXw3ATjkiZnik=,iv:zJNM/TqNfBO/mr8ZK/I/FfXwknyn9YpJ0eo4EpHSJvQ=,tag:G4FLx/Hwknq5hYEb8SWQLg==,type:str]
|
|
||||||
pgp: []
|
|
||||||
unencrypted_suffix: _unencrypted
|
|
||||||
version: 3.9.4
|
|
||||||
|
|
||||||
zitadel:
|
|
||||||
masterKey: thisWillBeAnEncryptedValueInTheFuture
|
|
||||||
|
|
@ -31,7 +31,9 @@ in {
|
||||||
base16Scheme = "${pkgs.base16-schemes}/share/themes/${cfg.theme}.yaml";
|
base16Scheme = "${pkgs.base16-schemes}/share/themes/${cfg.theme}.yaml";
|
||||||
image = ./${cfg.theme}.jpg;
|
image = ./${cfg.theme}.jpg;
|
||||||
polarity = cfg.polarity;
|
polarity = cfg.polarity;
|
||||||
|
|
||||||
# targets.qt.platform = mkDefault "kde";
|
# targets.qt.platform = mkDefault "kde";
|
||||||
|
targets.zen-browser.profileNames = [ "Chris" ];
|
||||||
|
|
||||||
fonts = {
|
fonts = {
|
||||||
serif = {
|
serif = {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{ config, lib, pkgs, namespace, system, inputs, ... }:
|
{ config, lib, pkgs, namespace, system, inputs, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib) mkIf mkEnableOption mkOption types toUpper nameValuePair;
|
inherit (lib) mkIf mkEnableOption mkOption types toUpper nameValuePair mapAttrs' concatMapAttrs getAttrs getAttr hasAttr typeOf head drop length;
|
||||||
inherit (lib.${namespace}.strings) toSnakeCase;
|
inherit (lib.${namespace}.strings) toSnakeCase;
|
||||||
|
|
||||||
cfg = config.${namespace}.services.authentication.zitadel;
|
cfg = config.${namespace}.services.authentication.zitadel;
|
||||||
|
|
@ -129,21 +129,19 @@ in
|
||||||
withName = name: attrs: attrs // { inherit name; };
|
withName = name: attrs: attrs // { inherit name; };
|
||||||
withRef = type: name: attrs: attrs // (mapRef type name);
|
withRef = type: name: attrs: attrs // (mapRef type name);
|
||||||
|
|
||||||
# this is a nix package, the generated json file to be exact
|
|
||||||
terraformConfiguration = inputs.terranix.lib.terranixConfiguration {
|
|
||||||
inherit system;
|
|
||||||
|
|
||||||
modules =
|
|
||||||
let
|
|
||||||
inherit (lib) mapAttrs' concatMapAttrs nameValuePair getAttrs getAttr hasAttr typeOf head drop length;
|
|
||||||
|
|
||||||
select = keys: callback: set:
|
select = keys: callback: set:
|
||||||
if (length keys) == 0 then
|
if (length keys) == 0 then
|
||||||
mapAttrs' callback set
|
mapAttrs' callback set
|
||||||
else let key = head keys; in
|
else let key = head keys; in
|
||||||
concatMapAttrs (k: v: select (drop 1 keys) (callback k) (v.${key} or {})) set;
|
concatMapAttrs (k: v: select (drop 1 keys) (callback k) (v.${key} or {})) set;
|
||||||
in
|
|
||||||
[
|
config' = config;
|
||||||
|
|
||||||
|
# this is a nix package, the generated json file to be exact
|
||||||
|
terraformConfiguration = inputs.terranix.lib.terranixConfiguration {
|
||||||
|
inherit system;
|
||||||
|
|
||||||
|
modules = [
|
||||||
({ config, lib, ... }: {
|
({ config, lib, ... }: {
|
||||||
config = {
|
config = {
|
||||||
terraform.required_providers.zitadel = {
|
terraform.required_providers.zitadel = {
|
||||||
|
|
@ -181,6 +179,15 @@ in
|
||||||
|> withRef "project" project
|
|> withRef "project" project
|
||||||
|> toResource name
|
|> toResource name
|
||||||
);
|
);
|
||||||
|
|
||||||
|
zitadel_smtp_config.default = {
|
||||||
|
sender_address = "chris@kruining.eu";
|
||||||
|
sender_name = "no-reply (Zitadel)";
|
||||||
|
tls = true;
|
||||||
|
host = "black-mail.nl";
|
||||||
|
user = "chris@kruining.eu";
|
||||||
|
password = "\${file(\"${config'.sops.templates."kaas".path}\")}";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
|
|
@ -214,7 +221,6 @@ in
|
||||||
${lib.getExe pkgs.opentofu} init
|
${lib.getExe pkgs.opentofu} init
|
||||||
|
|
||||||
# Run the infrastructure code
|
# Run the infrastructure code
|
||||||
# ${lib.getExe pkgs.opentofu} plan
|
|
||||||
${lib.getExe pkgs.opentofu} apply -auto-approve
|
${lib.getExe pkgs.opentofu} apply -auto-approve
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
|
@ -250,14 +256,14 @@ in
|
||||||
SecretHasher.Hasher.Algorithm = "argon2id";
|
SecretHasher.Hasher.Algorithm = "argon2id";
|
||||||
};
|
};
|
||||||
|
|
||||||
# DefaultInstance = {
|
DefaultInstance = {
|
||||||
# # PasswordComplexityPolicy = {
|
# PasswordComplexityPolicy = {
|
||||||
# # MinLength = 0;
|
# MinLength = 0;
|
||||||
# # HasLowercase = false;
|
# HasLowercase = false;
|
||||||
# # HasUppercase = false;
|
# HasUppercase = false;
|
||||||
# # HasNumber = false;
|
# HasNumber = false;
|
||||||
# # HasSymbol = false;
|
# HasSymbol = false;
|
||||||
# # };
|
# };
|
||||||
# LoginPolicy = {
|
# LoginPolicy = {
|
||||||
# AllowRegister = false;
|
# AllowRegister = false;
|
||||||
# ForceMFA = true;
|
# ForceMFA = true;
|
||||||
|
|
@ -266,15 +272,14 @@ in
|
||||||
# MaxPasswordAttempts = 5;
|
# MaxPasswordAttempts = 5;
|
||||||
# MaxOTPAttempts = 10;
|
# MaxOTPAttempts = 10;
|
||||||
# };
|
# };
|
||||||
# # SMTPConfiguration = {
|
SMTPConfiguration = {
|
||||||
# # SMTP = {
|
SMTP = {
|
||||||
# # Host = "black-mail.nl:587";
|
Host = "black-mail.nl:587";
|
||||||
# # User = "chris@kruining.eu";
|
User = "chris@kruining.eu";
|
||||||
# # Password = "__TODO_USE_SOPS__";
|
};
|
||||||
# # };
|
FromName = "Amarth Zitadel";
|
||||||
# # FromName = "Amarth Zitadel";
|
};
|
||||||
# # };
|
};
|
||||||
# };
|
|
||||||
|
|
||||||
Database.postgres = {
|
Database.postgres = {
|
||||||
Host = "localhost";
|
Host = "localhost";
|
||||||
|
|
@ -330,6 +335,9 @@ in
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
extraStepsPaths = [
|
||||||
|
config.sops.templates."secrets.yaml".path
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
postgresql = {
|
postgresql = {
|
||||||
|
|
@ -364,10 +372,37 @@ in
|
||||||
networking.firewall.allowedTCPPorts = [ 80 443 ];
|
networking.firewall.allowedTCPPorts = [ 80 443 ];
|
||||||
|
|
||||||
# Secrets
|
# Secrets
|
||||||
sops.secrets."zitadel/masterKey" = {
|
sops = {
|
||||||
|
secrets = {
|
||||||
|
"zitadel/masterKey" = {
|
||||||
|
owner = "zitadel";
|
||||||
|
group = "zitadel";
|
||||||
|
restartUnits = [ "zitadel.service" ]; #EMGDB#6O$8qpGoLI1XjhUhnng1san@0
|
||||||
|
};
|
||||||
|
|
||||||
|
"email/chris_kruining_eu" = {
|
||||||
owner = "zitadel";
|
owner = "zitadel";
|
||||||
group = "zitadel";
|
group = "zitadel";
|
||||||
restartUnits = [ "zitadel.service" ];
|
restartUnits = [ "zitadel.service" ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
templates."secrets.yaml" = {
|
||||||
|
owner = "zitadel";
|
||||||
|
group = "zitadel";
|
||||||
|
content = ''
|
||||||
|
DefaultInstance:
|
||||||
|
SMTPConfiguration:
|
||||||
|
SMTP:
|
||||||
|
Password: ${config.sops.placeholder."email/chris_kruining_eu"}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
templates."kaas" = {
|
||||||
|
owner = "zitadel";
|
||||||
|
group = "zitadel";
|
||||||
|
content = config.sops.placeholder."email/chris_kruining_eu";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
{ pkgs, config, namespace, inputs, ... }:
|
{ pkgs, config, namespace, inputs, system, ... }:
|
||||||
let
|
let
|
||||||
cfg = config.${namespace}.system.security.sops;
|
cfg = config.${namespace}.system.security.sops;
|
||||||
in
|
in
|
||||||
|
|
@ -13,10 +13,14 @@ in
|
||||||
environment.systemPackages = with pkgs; [ sops ];
|
environment.systemPackages = with pkgs; [ sops ];
|
||||||
|
|
||||||
sops = {
|
sops = {
|
||||||
defaultSopsFile = ../../../../../_secrets/secrets.yaml;
|
|
||||||
defaultSopsFormat = "yaml";
|
defaultSopsFormat = "yaml";
|
||||||
|
defaultSopsFile = inputs.self + "/systems/${system}/${config.networking.hostName}/secrets.yml";
|
||||||
|
|
||||||
age.keyFile = "/home/";
|
age = {
|
||||||
|
# keyFile = "~/.config/sops/age/keys.txt";
|
||||||
|
# sshKeyPaths = [ "~/.ssh/id_ed25519" ];
|
||||||
|
# generateKey = true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
30
systems/x86_64-linux/ulmo/secrets.yml
Normal file
30
systems/x86_64-linux/ulmo/secrets.yml
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
email:
|
||||||
|
info@amarth.cloud: ENC[AES256_GCM,data:xwR3XS/zxr85e8wQLqIJfc8b3CaRlMqts3kWQpQTy6c=,iv:6N48IIRhFvgPtzP7/w6ZQM80mHCZ7ZHAsvv2tHFP9mE=,tag:FK2OboYbnmgq6eJp5Oyjng==,type:str]
|
||||||
|
chris_kruining_eu: ENC[AES256_GCM,data:/JS+dQ6ABlkdjRZP+sGeUY3js30swS4=,iv:d5CcoY6DD3DJ/e3t0OU/KUULccJpTN0uBQPQzl/3R0s=,tag:aTN7RdzXkIpci9tEBjevSA==,type:str]
|
||||||
|
info_amarth_cloud: ENC[AES256_GCM,data:/x7aAFAxXYYf79tB08VQmmuTIy2TvdSTFfAzIWdIr+I=,iv:plNxS6oOin+oEql+1xsePOsUfLJkf+ZPBviPRTbIghE=,tag:hjtK3rysd2NNBA2mWdv8cw==,type:str]
|
||||||
|
zitadel:
|
||||||
|
masterKey: ENC[AES256_GCM,data:DyBNWV+4HmPa1mA4I3TERWmrIEn/c4/XYlgfmel7Ag==,iv:CjS5kAHH8j0ExCNFZf3dnyBsDPnAShRt55onPcUfkwU=,tag:CeINNaH5hOprAxm/DZFDPA==,type:str]
|
||||||
|
sops:
|
||||||
|
age:
|
||||||
|
- recipient: age19qfpf980tadguqq44zf6xwvjvl428dyrj46ha3n6aeqddwhtnuqqml7etq
|
||||||
|
enc: |
|
||||||
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBwdDZyZkxvNU4zM3NHb2gx
|
||||||
|
ZlhLZk5JWUFGMWZGeUVHNkFFU1NtZlBQVVhjCmZGai9NdmdUeU5VcW9ROVZKTW5q
|
||||||
|
cmZaQ2JlaldaTWduQklocUZLT2FUcGcKLS0tIHlqVU0wdXJ0dTE4dlZSVEczd2Yv
|
||||||
|
RVFxVHFxbkVNbEZsaVcwYXZCdUc5R1kKQdAN6LEKmGLCSkKhNuEr0YK2zl9Aw1kK
|
||||||
|
6C25lN532mG55zIRectZda1Fmi1GMZ/2v3b5qz7x+TDMA9m/47OjmA==
|
||||||
|
-----END AGE ENCRYPTED FILE-----
|
||||||
|
- recipient: age1ewes0f5snqx3sh5ul6fa6qtxzhd25829v6mf5rx2wnheat6fefps5rme2x
|
||||||
|
enc: |
|
||||||
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBoK3lqRDhEMXEvaUp3OWdV
|
||||||
|
eFlZSGpJcGs0RTdRbllWdmdZTzl3RTlDNlIwCm92R290NjNyK2NNbWpINTBhazNS
|
||||||
|
NTJYWEw0SGc1TUtrd0NZSmowakMvSlEKLS0tIG5uUEIrZGVORkRNVnBVOHgyMXZG
|
||||||
|
TTRWaHhpNWlkVDFmMFN4ZTNHMUxyNVkKV693pzTKRkZboQCMPr9IyMGSgxfuHXcb
|
||||||
|
Y6BNcp6Qg6PWtX5QI7wRkPNINAK1TEbRBba+b8h6gMmVU4DliQyFiQ==
|
||||||
|
-----END AGE ENCRYPTED FILE-----
|
||||||
|
lastmodified: "2025-10-23T14:25:59Z"
|
||||||
|
mac: ENC[AES256_GCM,data:p3A1ZSr6S21SUjEZbL4V0uh3HVqcRhFi1N93IeUKs2yVbBYAXzWJ+2ejSxfM+W9MSCAYxx27i0ZoBPjQJu/xQzwmW8HWn4rRfCsa2TGqOw25PLvkHgnBUc70X759cKxvR0Pm7ha22JCnzJVrzvUMlBVs61wxHT57x0El9Gan8eY=,iv:SKN+R4wsN/L2pZW/s5ocEtCXXZB5wK4tgFIYWGWtRPA=,tag:CNLl4lVO06gAcsSCfU2KjA==,type:str]
|
||||||
|
unencrypted_suffix: _unencrypted
|
||||||
|
version: 3.11.0
|
||||||
Loading…
Add table
Add a link
Reference in a new issue