Compare commits

..

17 commits

Author SHA1 Message Date
2981721727
Add db migrations! 2026-02-07 18:58:52 +01:00
3804745fd1
Fix the volume issue. 2026-02-07 18:53:57 +01:00
e7722f83fd
Fix the Part-DB pathing issues. 2026-02-07 18:46:43 +01:00
9db947284f
Add partdb service configuration to Traefik 2026-02-07 18:30:59 +01:00
5696ca0f7c
TIL The SSH based AGE stuff is not as reliable... oeh. 2026-02-07 18:25:42 +01:00
9db0f66727
Fixed the formatting. 2026-02-07 18:20:54 +01:00
fc1ab7ce9c
Oeh, will this work...? 2026-02-07 18:16:35 +01:00
a110fa37bc
sops-nix and compose2nix my beloveloathed 2026-02-07 17:58:25 +01:00
04e069542b
Remove unused example key from sops secrets specification 2026-02-07 17:53:59 +01:00
ae8632b3dc
Ok... fine... full-path it is... Nix... :sulk: 2026-02-07 17:50:25 +01:00
2443b09af1
Am impressed that JetBrains wasn't overly sensitive and instead blind - fixed a typo after having fixed the homonyms. 2026-02-07 17:49:15 +01:00
35c7b7e56c
Fixed pathing and hard to comprehend file names due to homonyms. 2026-02-07 17:47:53 +01:00
4148c4bd07
Fixed the hanging block 2026-02-07 17:44:17 +01:00
a3274fd901
Derp. I frogot to check assumption. Sync secrets directory to target location 2026-02-07 17:42:51 +01:00
2ce94b0e7a
Fix pathing issues 2026-02-07 17:39:33 +01:00
2536831d4a
Added sha and almost forgor to open port :3 2026-02-07 17:36:54 +01:00
5e68e6ee96
- Services: Added Part-DB
- Implementation: Added nix-sops based secret version controlling.
2026-02-07 17:31:23 +01:00
21 changed files with 336 additions and 87 deletions

3
.gitignore vendored
View file

@ -1,5 +1,4 @@
/target
# Secrets and local env
/nix-system-configs/modules/secrets/secrets.nix
/.env
.env

15
.sops.yaml Normal file
View file

@ -0,0 +1,15 @@
keys:
- &admin_christine age1746rvsvsc3snxfl7cndm222wd5kck4aqj3x7nednlegq0gdjhfcqx0qv7m
- &server_songsheet age1la8yjuc2ws9pyx70rc83jd2084v5e08v8fvh6muvfzrl2ulp8fms6frs86
- &server_traefik age1rdcs8y4fjfyagwt2q9599ax329thceersh6dg2f0p6nsghm5xufq00qu0p
creation_rules:
- path_regex: nix-system-configs/secrets/songsheet/[^/]+\.(yaml|json|env|ini)$
key_groups:
- age:
- *admin_christine
- *server_songsheet
- path_regex: nix-system-configs/secrets/traefik/[^/]+\.(yaml|json|env|ini)$
key_groups:
- age:
- *admin_christine
- *server_traefik

View file

@ -136,13 +136,14 @@
services.postgresql = {
enable = true;
enableTCPIP = true;
ensureDatabases = ["forgejo"];
ensureDatabases = ["forgejo" "part_db_database"];
settings = {
listen_addresses = "*";
};
authentication = pkgs.lib.mkOverride 10 ''
local all all trust
host all all 10.1.1.4/32 scram-sha-256
host all all 10.1.1.249/32 scram-sha-256
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
'';
@ -158,7 +159,7 @@
services.openssh.enable = true;
# Open ports in the firewall.
networking.firewall.allowedTCPPorts = [5432 3306]; # PostgreSQL default port
networking.firewall.allowedTCPPorts = [5432 3306]; # PostgreSQL and MariaDB default port
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.
# networking.firewall.enable = false;

View file

@ -1,61 +0,0 @@
version: '3.3'
services:
partdb:
container_name: partdb
# By default Part-DB will be running under Port 8080, you can change it here
ports:
- '633:80'
volumes:
# By default
- ./uploads:/var/www/html/uploads
- ./public_media:/var/www/html/public/media
- ./db:/var/www/html/var/db
restart: unless-stopped
image: jbtronics/part-db1:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.myservice.rule=Host(`myservice.YOUR.DOMAIN`)"
- "traefik.http.routers.myservice.entrypoints=websecure"
- "traefik.http.services.myservice.loadbalancer. server.port=80"
depends_on:
- database
environment:
# Replace 4321112sss with the value of MYSQL_PASSWORD from below
- DATABASE_URL=mysql://partdb:4321112sss@database:3306/partdb
# In docker env logs will be redirected to stderr
- APP_ENV=docker
# Uncomment this, if you want to use the automatic database migration feature. With this you do not have to
# run the doctrine:migrations:migrate commands on installation or upgrade. A database backup is written to the uploads/
# folder (under .automigration-backup), so you can restore it, if the migration fails.
# This feature is currently experimental, so use it at your own risk!
- DB_AUTOMIGRATE=true
# You can configure Part-DB using the webUI or environment variables
# However you can add any other environment configuration you want here
# See .env file for all available options or https://docs.part-db.de/configuration.html
# Override value if you want to show a given text on homepage.
# When this is commented out the webUI can be used to configure the banner
#- BANNER=This is a test banner<br>with a line break
# If you need to install additional composer packages (e.g., for specific mailer transports), you can specify them here:
# - COMPOSER_EXTRA_PACKAGES=symfony/mailgun-mailer symfony/sendgrid-mailer
database:
container_name: partdb_database
image: mysql:8.0
restart: unless-stopped
command: --default-authentication-plugin=mysql_native_password --log-bin-trust-function-creators=1
environment:
# Change this Password
MYSQL_ROOT_PASSWORD: jijoioajdiojasdas1123
MYSQL_DATABASE: partdb
MYSQL_USER: partdb
MYSQL_PASSWORD: 4321112sss
# Uncomment the following line if you need to access, your MySQL database from outside of docker (e.g. for debugging), normally you should leave that disabled
#ports:
# - '4306:3306'
volumes:
- ./mysql:/var/lib/mysql

View file

@ -0,0 +1,3 @@
## Todo, make a proper script for this
EDITOR=micro nix-shell -p sops --run "SOPS_AGE_KEY_FILE=$HOME/.config/sops/age/keys.txt sops nix-system-configs/secrets/songsheet/secrets.yaml"
compose2nix --inputs nix-system-configs/modules/songsheet/wavelog/docker-compose.yml --sops_file nix-system-configs/secrets/songsheet/secrets.yaml --project=wavelog --output nix-system-configs/modules/songsheet/wavelog/docker-compose.nix --root_path nix-system-configs/modules/songsheet/wavelog

View file

@ -117,6 +117,25 @@ else
exit 1
fi
# Step 2.1: Sync secrets directory
# nix-system-configs/modules/scripts /pull.zsh
# nix-system-configs/secrets/songsheet/secrets.yaml
SECRETS_DIR="${SCRIPT_DIR}/../../secrets"
SECRETS_TARGET="/etc/nixos/secrets"
if [[ -d "$SECRETS_DIR" ]]; then
print_info "Syncing secrets to ${BOLD}${SECRETS_TARGET}${RESET}..."
if sudo rsync -av --delete "${SECRETS_DIR}/" "${SECRETS_TARGET}/"; then
print_success "Secrets synced"
else
print_error "Failed to sync secrets"
exit 1
fi
else
print_warn "Secrets directory not found: ${SECRETS_DIR}"
fi
# Step 3: Copy configuration
source_file="${SYSTEM_DIR}/${selected_system}.nix"
print_info "Copying ${BOLD}${source_file}${RESET} to ${BOLD}${CONFIG_TARGET}${RESET}..."

View file

@ -0,0 +1,30 @@
{
config,
pkgs,
lib,
...
}: {
imports = let
# replace this with an actual commit id or tag
commit = "17eea6f3816ba6568b8c81db8a4e6ca438b30b7c";
in [
"${builtins.fetchTarball {
url = "https://github.com/Mic92/sops-nix/archive/${commit}.tar.gz";
# replace this with an actual hash
sha256 = "ktjWTq+D5MTXQcL9N6cDZXUf9kX8JBLLBLT0ZyOTSYY=";
}}/modules/sops"
];
# This will add secrets.yml to the nix store
# You can avoid this by adding a string to the full path instead, i.e.
# sops.defaultSopsFile = "/root/.sops/secrets/example.yaml";
sops.defaultSopsFile = ../../secrets/songsheet/secrets.yaml;
# This will automatically import SSH keys as age keys
sops.age.sshKeyPaths = ["/home/songsheetprg/.ssh/id_ed25519.pub"];
# This is using an age key that is expected to already be in the filesystem
sops.age.keyFile = "/var/lib/sops-nix/key.txt";
# This will generate a new key if the key specified above does not exist
sops.age.generateKey = true;
# Use the flat key name with quotes
sops.secrets."songsheet/database/DATABASE_URL" = {};
}

View file

@ -1,19 +0,0 @@
{
config,
pkgs,
lib,
...
}: {
# TODO Figure out a better way to manage secrets.
# CHECK OUT https://github.com/ryantm/agenix
local.secrets = {
gitUserName = "Your Name";
gitUserEmail = "you@example.com";
codeberg = {
username = "your-codeberg-user";
password = "your-codeberg-password-or-token";
};
sshRootPassword = "changeme";
tailscaleAuthKey = "";
};
}

View file

@ -25,11 +25,67 @@
virtualisation.oci-containers.backend = "podman";
# Containers
virtualisation.oci-containers.containers."partdb" = {
image = "jbtronics/part-db1:latest";
environment = {
"ALLOW_ATTACHMENT_DOWNLOADS" = "0";
"APP_ENV" = "docker";
"BASE_CURRENCY" = "DKK";
"DB_AUTOMIGRATE" = "true";
"DEFAULT_LANG" = "en";
"DEFAULT_TIMEZONE" = "Europe/Copenhagen";
"INSTANCE_NAME" = "Part-DB";
"TRUSTED_PROXIES" = "10.1.1.250";
"USE_GRAVATAR" = "1";
};
environmentFiles = [
config.sops.secrets."songsheet/database/DATABASE_URL".path
];
volumes = [
"wavelog_partdb_db_f:/var/www/html/var/db:rw"
"wavelog_partdb_media_f:/var/www/html/public/media:rw"
"wavelog_partdb_uploads_f:/var/www/html/uploads:rw"
];
ports = [
"8087:80/tcp"
];
labels = {
"compose2nix.settings.sops.secrets" = "songsheet/database/DATABASE_URL";
};
log-driver = "journald";
extraOptions = [
"--network-alias=partdb"
"--network=wavelog_default"
];
};
systemd.services."podman-partdb" = {
serviceConfig = {
Restart = lib.mkOverride 90 "always";
};
after = [
"podman-network-wavelog_default.service"
"podman-volume-wavelog_partdb_db_f.service"
"podman-volume-wavelog_partdb_media_f.service"
"podman-volume-wavelog_partdb_uploads_f.service"
];
requires = [
"podman-network-wavelog_default.service"
"podman-volume-wavelog_partdb_db_f.service"
"podman-volume-wavelog_partdb_media_f.service"
"podman-volume-wavelog_partdb_uploads_f.service"
];
partOf = [
"podman-compose-wavelog-root.target"
];
wantedBy = [
"podman-compose-wavelog-root.target"
];
};
virtualisation.oci-containers.containers."wavelog-db" = {
image = "mariadb:11.3";
environment = {
"MARIADB_DATABASE" = "wavelog";
"MARIADB_PASSWORD" = "oijawfjiojoijoiawf";
"MARIADB_PASSWORD" = "THIS_IS_NOT_IN_USE_yes";
"MARIADB_RANDOM_ROOT_PASSWORD" = "yes";
"MARIADB_USER" = "wavelog";
};
@ -123,6 +179,42 @@
};
# Volumes
systemd.services."podman-volume-wavelog_partdb_db_f" = {
path = [pkgs.podman];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = ''
podman volume inspect wavelog_partdb_db_f || podman volume create wavelog_partdb_db_f
'';
partOf = ["podman-compose-wavelog-root.target"];
wantedBy = ["podman-compose-wavelog-root.target"];
};
systemd.services."podman-volume-wavelog_partdb_media_f" = {
path = [pkgs.podman];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = ''
podman volume inspect wavelog_partdb_media_f || podman volume create wavelog_partdb_media_f
'';
partOf = ["podman-compose-wavelog-root.target"];
wantedBy = ["podman-compose-wavelog-root.target"];
};
systemd.services."podman-volume-wavelog_partdb_uploads_f" = {
path = [pkgs.podman];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
script = ''
podman volume inspect wavelog_partdb_uploads_f || podman volume create wavelog_partdb_uploads_f
'';
partOf = ["podman-compose-wavelog-root.target"];
wantedBy = ["podman-compose-wavelog-root.target"];
};
systemd.services."podman-volume-wavelog_wavelog-config" = {
path = [pkgs.podman];
serviceConfig = {

View file

@ -1,4 +1,62 @@
services:
partdb:
container_name: partdb
# By default Part-DB will be running under Port 8080, you can change it here
ports:
- '8087:80'
restart: unless-stopped
labels:
- "compose2nix.settings.sops.secrets=songsheet/database/DATABASE_URL"
image: jbtronics/part-db1:latest
environment:
# In docker env logs will be redirected to stderr
- APP_ENV=docker
# Uncomment this, if you want to use the automatic database migration feature. With this you have you do not have to
# run the doctrine:migrations:migrate commands on installation or upgrade. A database backup is written to the uploads/
# folder (under .automigration-backup), so you can restore it, if the migration fails.
# This feature is currently experimental, so use it at your own risk!
- DB_AUTOMIGRATE=true
# You can configure Part-DB using environment variables
# Below you can find the most essential ones predefined
# However you can add any other environment configuration you want here
# See .env file for all available options or https://docs.part-db.de/configuration.html
# !!! Do not use quotes around the values, as they will be interpreted as part of the value and this will lead to errors !!!
# The language to use serverwide as default (en, de, ru, etc.)
- DEFAULT_LANG=en
# The default timezone to use serverwide (e.g. Europe/Berlin)
- DEFAULT_TIMEZONE=Europe/Copenhagen
# The currency that is used inside the DB (and is assumed when no currency is set). This can not be changed later, so be sure to set it the currency used in your country
- BASE_CURRENCY=DKK
# The name of this installation. This will be shown as title in the browser and in the header of the website
- INSTANCE_NAME=Part-DB
# Allow users to download attachments to the server by providing an URL
# This could be a potential security issue, as the user can retrieve any file the server has access to (via internet)
- ALLOW_ATTACHMENT_DOWNLOADS=0
# Use gravatars for user avatars, when user has no own avatar defined
- USE_GRAVATAR=1
# Override value if you want to show a given text on homepage.
# When this is empty the content of config/banner.md is used as banner
#- BANNER=This is a test banner<br>with a line break
# If you use a reverse proxy in front of Part-DB, you must configure the trusted proxies IP addresses here (see reverse proxy documentation for more information):
# - TRUSTED_PROXIES=127.0.0.0/8,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
- TRUSTED_PROXIES=10.1.1.250
# If you need to install additional composer packages (e.g., for specific mailer transports), you can specify them here:
# The packages will be installed automatically when the container starts
# - COMPOSER_EXTRA_PACKAGES=symfony/mailgun-mailer symfony/sendgrid-mailer
volumes:
# By default
# Devnote: # use named volumes instead of relative paths ./uploads, etc.
- partdb_uploads_f:/var/www/html/uploads
- partdb_media_f:/var/www/html/public/media
- partdb_db_f:/var/www/html/var/db
wavelog-db: # THIS IS NOW DANGLING BUT WILL BE THERE TO PREVENT BREAKAGE OF THE MAIN COMPOSE FILE
image: mariadb:11.3
container_name: wavelog-db
@ -6,7 +64,7 @@ services:
MARIADB_RANDOM_ROOT_PASSWORD: yes
MARIADB_DATABASE: wavelog
MARIADB_USER: wavelog
MARIADB_PASSWORD: oijawfjiojoijoiawfoij191229888dajkvhiuviuaiuhvaihuauis1123312 # THIS DATABASE IS NOW MIGRATED PROPERLY
MARIADB_PASSWORD: THIS_IS_NOT_IN_USE_yes # THIS DATABASE IS NOW MIGRATED PROPERLY
volumes:
- wavelog-dbdata:/var/lib/mysql
restart: unless-stopped
@ -30,4 +88,7 @@ volumes:
wavelog-dbdata:
wavelog-uploads:
wavelog-userdata:
wavelog-config:
wavelog-config:
partdb_uploads_f:
partdb_media_f:
partdb_db_f:

View file

@ -38,6 +38,7 @@
#
## Compose modules for Portainer service
./modules/songsheet/wavelog/docker-compose.nix
./modules/secrets-config/sops-nix.nix
];
config = {
@ -50,11 +51,13 @@
80
443
8086 # Wavelog
8087 # PartDB
];
networking.firewall.allowedUDPPorts = [
80
443
8086 # Wavelog
8087 # PartDB
];
system.stateVersion = "25.11";

View file

@ -97,6 +97,13 @@
entryPoints = ["websecure"];
tls = {};
};
partdb = {
rule = "Host(`partdb.prg-radio.org`)";
service = "partdb";
entryPoints = ["websecure"];
tls = {};
};
};
http.services = {
forgejo.loadBalancer = {
@ -104,11 +111,18 @@
{url = "http://10.1.1.4:3000";}
];
};
wavelog.loadBalancer = {
servers = [
{url = "http://10.1.1.249:8086";}
];
};
partdb.loadBalancer = {
servers = [
{url = "http://10.1.1.249:8087";}
];
};
};
};
};

View file

@ -0,0 +1,31 @@
#ENC[AES256_GCM,data:WivH9NVGw2eQUc+4xk3IXc355x7dddo3f/C0f8Pl0JJJCBhvmGI=,iv:5g32fF7BGOUO5/5GkelUBeTP7d0oyIPhAajZHpXIKiY=,tag:fNlYIPKPH8CiZsPvQmgODg==,type:comment]
example-key: ENC[AES256_GCM,data:aoCe/3ALWztLUQ9wyQ==,iv:BFDhmeK5LqqVvh5lBoPIaAXkV0Qi0K2maEwSFuOLO2Q=,tag:PIKqisBResQh7nhv8kxXAg==,type:str]
#ENC[AES256_GCM,data:QMlHRBS1gtTdUMs/gzvekyAAnDHqE9KA+deYvxP18aIln5vX/aFoi/heQp/9W33hiqv5Oc4nepg=,iv:ceJjaqud+qbMWmfJHDmKJeGtO/2BsWQEzeMtQL1WZI0=,tag:QlR7GZ3Om3mT0Ycq3UdJCA==,type:comment]
#ENC[AES256_GCM,data:E1y/QQ1q5u1nC0gjutZuiA1TN6zLWD3EI9qdu8phRZ34GNIytQ5FJpTv+P9JGUN19wpj8S/ZFX3SxqGLIxq5eCr8Zl4gL5bc,iv:3mdIV8+2BEX9NX2PfWtjqKZmR45CpEKvGrd5FqvgMhM=,tag:x5aAWNR/M3OqLRmCAx8frg==,type:comment]
myservice:
my_subdir:
my_secret: ENC[AES256_GCM,data:mTlHHpNvgJGz,iv:Nb3HWXKMI8DopwB020lYBJc/wsLAxl+6ZpYtrtDc4Ic=,tag:sV/2xqwdWzAdcKo6Z1aS+A==,type:str]
sops:
age:
- recipient: age1746rvsvsc3snxfl7cndm222wd5kck4aqj3x7nednlegq0gdjhfcqx0qv7m
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArMmt5dzBaOHV2ZXJNVjUx
Smdxc2w0QXBuQlVZZzYwK0h6Ry9ydnEyWFFNCkdZLzk5RkV0U0I0dmROdUZNUHND
YWRlQnRadWh4YWVHRFF4N0JsanJjc00KLS0tIFlNWG9nSUVRRnJJY0xVZDNzNVE1
MU5xUGlNcWxYZUR5bnI4NXlzZ1F1ejAK+jaAVZ1ePZNWzyIRNZQwLn1YIbQ6czTw
jOO6XHvDJAFzJotjPRqjstiB6aWzGoNXsE2DzWu0MXSIpeGpn9d3tQ==
-----END AGE ENCRYPTED FILE-----
- recipient: age1es0va2hjshgsv8tfyfjw6sfu6dm7q9u6wza3t9nevlakxzmxr4lqn2q7r6
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBCSGFBTktSaHorcE9iOEhh
NDhFbGpySXRYeGhkb1BqTjU3M0V4M0srL1ZFCk81OVRnUzhZMVNnMzlkbTc0ZDh0
akJqMHRXV0xvY3JqczNsV0lQeVRGNEUKLS0tIDgwYk9vOTB2aUVxWnpzRTZMQUZx
UzdHOG0yUGFLZnVGeExwMEp3LzJ6QncKDGGZ1LvafbZ52GOIk8SyhvPIU9hayd+G
FGOgC5n0pbBhk7/OM6JQrc+I5df5Kg4mAaTZ+ANgPBDUrfwFA0EyqA==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2026-02-07T15:38:34Z"
mac: ENC[AES256_GCM,data:xZg0gY7K1scWgZ4ITRLVPqx3igffvcQTf0/UyUPO7y0AEmxWpPt5sAdHJujjTjXAuSiLV8+XlEAH9ePh6gx8NZDXfscMsjyyOXGcDpYzwSfoWpFsSB4oeDkOw/vy0YTmEbs9R9pXU6Kc3TRnXbZNYzwZqgoI20GXxBesDxDrp4k=,iv:KCKtqUfdi8alD7wxVgF/wTjUoHfYC48r7Ar8NKy4TFM=,tag:U0RU11e/I4C361dDe5jH8Q==,type:str]
unencrypted_suffix: _unencrypted
version: 3.11.0

View file

@ -0,0 +1,27 @@
songsheet:
database:
DATABASE_URL: ENC[AES256_GCM,data:eKJ1u+2n59lpvue1Orysn9QEvfICSLncR1txXW3Smp9LhrADMOaEROCP/Cd+qH2p3635XSFhoPpN7E2L6l5GZSk1eNyPYdi41zycJUBzvy5rVMnBjYoBd8e+QFxrgDjZ2U7NunCwejqm5i0/5AwQ/0joJsGVwUiNcoYO,iv:ch4BF6C0qYvkCruysqBTwjZ+9mVx2AORJ2TzGM4BTqw=,tag:HqEmcIEq/Q60CSlwef6vLA==,type:str]
sops:
age:
- recipient: age1746rvsvsc3snxfl7cndm222wd5kck4aqj3x7nednlegq0gdjhfcqx0qv7m
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGTXVNVG93MHA4ODk2cDVM
U0ZHOUwxWHJURnBENVA0amFjSGc0ekRrQXdnCllsVldocGFmYXdRRFRkdDRFK3hG
b3V5VE8zQy9NQ0RHWldVNTJjVXdNS28KLS0tIFp4TGxwT3cyWW11WWVEK0RaeFp6
Qk0ralRxZWxMd2h3RHlUZmFCaUpJOEkKNUEQwieXDgLQa3zQIeY3gZIWb2XWYBHD
MDSXzUpccNuNKV8I1w2VOEXy57pof89ZC9/zd2a8Msg+BjacKYlOzg==
-----END AGE ENCRYPTED FILE-----
- recipient: age1la8yjuc2ws9pyx70rc83jd2084v5e08v8fvh6muvfzrl2ulp8fms6frs86
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA5WGpEdDNJSnJWUGpUeGdD
Y2xWT2x5N0p3cXZ3WHFJelhVMGYwa2taQ3hjCjhWRzJNQ1VyMk5QSDBTT0RSMktF
SVQxaHRDaThCYzhybzBib1djckNxZ2MKLS0tIG83MVIwSnVTeTVURFJNZkVKbVZB
V1F4TVEwaGgvUHcySnVQcXBHNzFuTU0KVNh7si39NVWZH9O52L9+gh1evvjotqK9
Zjmb97QR1C2LzEqOrfPuj6Lr86SS4RYSzSq2Oknn9o9SIs/5thR0YQ==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2026-02-07T17:44:51Z"
mac: ENC[AES256_GCM,data:lCQNNBpkCkzdTX+08eY4sMNFQbXSiNvBqBPro2U+OSaPvxjJRlG79K++mAnkCtFiIElSTACxOe8dTRz9frckVJQc5fL3o4PlDjeX3mzHj8V2F4DwEnQtJleLe63smtMb9ZJD3I0ivlfdcqV6GAIBtg65lQIEjgZ8tLvHSrsSpzs=,iv:PntgUV77KXsc6RLyLUBG0761GSQd/NjMA8XLyx4OBow=,tag:mI3B4aIsSTOQCOgKC6GCCg==,type:str]
unencrypted_suffix: _unencrypted
version: 3.11.0

View file

@ -0,0 +1,34 @@
hello: ENC[AES256_GCM,data:Ht0+7vR6M8YQn3AiMd8VRXX8r5LIjIy/lA8wDytdZwJI8aj8NmJxgC5a5llBSA==,iv:7nmFM2BZYX//LVEdCOCtMSOJL15an/A3UOGtTjma57c=,tag:1GxNe1Kh5v4KNJAoi8TKmA==,type:str]
example_key: ENC[AES256_GCM,data:DPLNFkv40KHgypLLWg==,iv:c3LfkDlckJbSiWBmfD6O6MXvIPM8ps8Rv1h2W9DDyOs=,tag:d+e23wPKvwFySmevmULMdQ==,type:str]
#ENC[AES256_GCM,data:arG8CBMdLjfBCjmdyTP/lw==,iv:9PcE6aokqhUp/+j3QaJSPJ6H+YjnFOkztinI9sSTZ+k=,tag:+KNsGsKIf8XRNf2V3FRRUg==,type:comment]
example_array:
- ENC[AES256_GCM,data:/nVGqCjXBoYAkdCHOrRO93/jJg==,iv:rdONhvd1j8AvWi9M19pR1p00QwuB3bz/Q/S4U8ZfjBQ=,tag:iWDJ7o4ChllJJcNDvhGthQ==,type:str]
- ENC[AES256_GCM,data:/Kgmo6PFheSZbNlKnUVG4rEAwA==,iv:WSEH0q234nDkiGcM3gs/vztWiV6UlkLSSy57kJWKt9c=,tag:d+hu8tM2LOSNn2orVxQZhA==,type:str]
example_number: ENC[AES256_GCM,data:qfxirRhQiqU5XN9iRg==,iv:dTiPBUs5RCEYD04DQZxoXB8lPDrAu+Ra4NvLBmx3X9E=,tag:w43whPCNQmUumBdZ2sD5pw==,type:float]
example_booleans:
- ENC[AES256_GCM,data:+1KdwA==,iv:8JXmEdeukxQIDfy4eacQ48Ayl3cCRfPNcSjzQYC/Yuw=,tag:erCKahtbNDD1S8MilF09Jg==,type:bool]
- ENC[AES256_GCM,data:Y0eWzvE=,iv:MjhUjfHcE+WPkxnwK7m1RMujVcauo6Ftx496R+wdJ7c=,tag:FqiTsd4UinkJ1hnST20Ekw==,type:bool]
sops:
age:
- recipient: age1746rvsvsc3snxfl7cndm222wd5kck4aqj3x7nednlegq0gdjhfcqx0qv7m
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBoaHlPc3ZZWVZJQXhXaG1u
OHFDVGxmcWVZbHpmRUlqYlZMRkp0WlU4L25ZCkRGbzJvRDRKOE82bUVlTFVJcTQy
R20rRklCZnMwbVEwQ3FtZGpYNlI3VEkKLS0tIFVLdkp1SEM1Mm1xRi9ZV0o5RlA1
cWtGaTJkdU12NkI4WVREOEt1VHVYYVkKs4lPeAhAazGAo5MZp7gKVYlrYBoNKBid
91ayxAbJKVrUnapd+QNDFG2+apDuirbWhKSxCPnLUEed+YMKNzQVgQ==
-----END AGE ENCRYPTED FILE-----
- recipient: age1rdcs8y4fjfyagwt2q9599ax329thceersh6dg2f0p6nsghm5xufq00qu0p
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBUWmpCTGtoS3NpdDVrMS9V
ZG9mZHgzeUpTWVRLVDVMbzFybmF3Q09KekJrCjlBdEZzcmxWcFUxdnNNZ2FuK3Nn
d1RZLytJK0RNVjdTVzFRWHpwMUMzRnMKLS0tIHFMdjErdzNDc2I1czVCRzBlR3o0
NkMrTEtzK3BSVWN0bk1ITHlORVd0bWcKSN/WwEZ2KJwYr3WLShF2gAG/ECKYk8ut
Ay3lMgsQJERQ5xQnauEqinELaN/FQHJgBFYkRgIAb/JU14a6viwDoA==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2026-02-07T16:28:39Z"
mac: ENC[AES256_GCM,data:CK6lT9nrLAE6r+6C5vadtYr6/uP9WcbpRM1QZnNjOblaDvgfGQvQMc3u3Ddu93d9sg5M6bVIh8gUDz+f5KkqMEAnLD+thy1Zl05lDUQFm0TCy1X1uHks3V/XvMl3m5kZYFf6sq4fpN3dwdP2NdofbffyTeD8mqA9j6YHTID4yxk=,iv:GhgePFxI0L83aOaoW5LB/5Q8h730GTcmvQdktrDmRls=,tag:AzOPttDhfJmw2JfnquoAjQ==,type:str]
unencrypted_suffix: _unencrypted
version: 3.11.0