Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
af69c27fe2
|
|||
|
fcc06d47c2
|
|||
|
d13df223bf
|
|||
|
1c4e8e7662
|
|||
|
207bd1975e
|
|||
|
28794691bf
|
|||
|
1ff34d7aab
|
|||
|
3d551fab52
|
|||
|
a99a83c0d8
|
|||
|
9a837d210d
|
|||
|
d3c9fabbc2
|
|||
|
950b163869
|
+2
-1
@@ -22,6 +22,7 @@
|
|||||||
./vm.nix
|
./vm.nix
|
||||||
|
|
||||||
./services/acme.nix
|
./services/acme.nix
|
||||||
|
./services/auditd.nix
|
||||||
./services/auto-upgrade.nix
|
./services/auto-upgrade.nix
|
||||||
./services/dbus.nix
|
./services/dbus.nix
|
||||||
./services/fluentbit.nix
|
./services/fluentbit.nix
|
||||||
@@ -30,9 +31,9 @@
|
|||||||
./services/journald-upload.nix
|
./services/journald-upload.nix
|
||||||
./services/logrotate.nix
|
./services/logrotate.nix
|
||||||
./services/nginx.nix
|
./services/nginx.nix
|
||||||
|
./services/nullmailer.nix
|
||||||
./services/openssh.nix
|
./services/openssh.nix
|
||||||
./services/polkit.nix
|
./services/polkit.nix
|
||||||
./services/postfix.nix
|
|
||||||
./services/prometheus-flake-input-exporter.nix
|
./services/prometheus-flake-input-exporter.nix
|
||||||
./services/prometheus-node-exporter.nix
|
./services/prometheus-node-exporter.nix
|
||||||
./services/prometheus-systemd-exporter.nix
|
./services/prometheus-systemd-exporter.nix
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
{
|
||||||
|
security.audit = {
|
||||||
|
enable = lib.mkDefault true;
|
||||||
|
|
||||||
|
# NOTE: see auditctl(8) for the meaning of the different rule flags.
|
||||||
|
rules = [
|
||||||
|
# Kernel module loading/unloading
|
||||||
|
"-a always,exit -F arch=b64 -S init_module,finit_module,delete_module -k kernel-modules"
|
||||||
|
|
||||||
|
# Mount/unmount by real (non-service) users
|
||||||
|
"-a always,exit -F arch=b64 -S mount,umount2 -F auid>=1000 -F auid!=-1 -k mounts"
|
||||||
|
|
||||||
|
# DAC permission/ownership changes by real users
|
||||||
|
"-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F auid>=1000 -F auid!=-1 -k perm-mod"
|
||||||
|
"-a always,exit -F arch=b64 -S chown,fchown,fchownat,lchown -F auid>=1000 -F auid!=-1 -k perm-mod"
|
||||||
|
"-a always,exit -F arch=b64 -S setxattr,lsetxattr,fsetxattr,removexattr,lremovexattr,fremovexattr -F auid>=1000 -F auid!=-1 -k perm-mod"
|
||||||
|
|
||||||
|
# Failed access attempts (permission denied) by real users
|
||||||
|
"-a always,exit -F arch=b64 -S open,openat,creat,truncate,ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=-1 -k access"
|
||||||
|
"-a always,exit -F arch=b64 -S open,openat,creat,truncate,ftruncate -F exit=-EPERM -F auid>=1000 -F auid!=-1 -k access"
|
||||||
|
|
||||||
|
# File deletion/rename by real users
|
||||||
|
"-a always,exit -F arch=b64 -S unlink,unlinkat,rename,renameat -F auid>=1000 -F auid!=-1 -k delete"
|
||||||
|
|
||||||
|
# Execution of privileged commands
|
||||||
|
"-w ${config.security.wrapperDir}/sudo -p x -k privileged-sudo"
|
||||||
|
"-w ${config.security.wrapperDir}/su -p x -k privileged-su"
|
||||||
|
|
||||||
|
# Read of files containing secrets.
|
||||||
|
"-w /var/lib/sops-nix/key.txt -p r -k secrets"
|
||||||
|
"-w /run/secrets -p r -k secrets"
|
||||||
|
"-w /etc/ssh/ssh_host_ed25519_key -p r -k secrets"
|
||||||
|
"-w /etc/ssh/ssh_host_rsa_key -p r -k secrets"
|
||||||
|
|
||||||
|
# NixOS generation switching
|
||||||
|
"-w /nix/var/nix/profiles -p wa -k nixos-generation-switch"
|
||||||
|
|
||||||
|
# Switching bootloader content
|
||||||
|
"-w /boot -p wa -k boot-tampering"
|
||||||
|
|
||||||
|
# Login records
|
||||||
|
"-w /var/lib/lastlog2 -p wa -k logins"
|
||||||
|
|
||||||
|
# Write or append to the audit trail
|
||||||
|
"-w /var/log/audit -p wa -k audit-log-tampering"
|
||||||
|
"-w ${lib.getExe' pkgs.audit "auditctl"} -p x -k audit-tools"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
security.auditd = {
|
||||||
|
enable = lib.mkDefault true;
|
||||||
|
plugins.syslog.active = true;
|
||||||
|
plugins.af_unix.active = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,4 +1,22 @@
|
|||||||
{ ... }:
|
{ config, pkgs, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.services.irqbalance;
|
||||||
|
in
|
||||||
{
|
{
|
||||||
services.irqbalance.enable = true;
|
services.irqbalance.enable = true;
|
||||||
}
|
|
||||||
|
# irqbalance only has meaningful work to do on multi-socket machines, so
|
||||||
|
# skip starting it pointlessly everywhere else.
|
||||||
|
systemd.services.irqbalance.serviceConfig.ExecCondition = let
|
||||||
|
isMultiSocket = pkgs.writeShellApplication {
|
||||||
|
name = "irqbalance-is-multi-socket";
|
||||||
|
runtimeInputs = [ pkgs.coreutils ];
|
||||||
|
text = ''
|
||||||
|
sockets=$(cat /sys/devices/system/cpu/cpu*/topology/physical_package_id | sort -u | wc -l)
|
||||||
|
[ "$sockets" -gt 1 ]
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in lib.mkIf cfg.enable [
|
||||||
|
(lib.getExe isMultiSocket)
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{ config, lib, ... }:
|
||||||
|
{
|
||||||
|
services.nullmailer = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
config = {
|
||||||
|
adminaddr = "root@pvv.ntnu.no";
|
||||||
|
defaultdomain = "pvv.ntnu.no";
|
||||||
|
defaulthost = "pvv.ntnu.no";
|
||||||
|
|
||||||
|
me = lib.mkDefault config.networking.fqdn;
|
||||||
|
remotes = lib.mkDefault "smtp.pvv.ntnu.no smtp port=465 tls";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -10,12 +10,18 @@
|
|||||||
Match All
|
Match All
|
||||||
'';
|
'';
|
||||||
settings.PermitRootLogin = "yes";
|
settings.PermitRootLogin = "yes";
|
||||||
|
settings.AcceptEnv = [
|
||||||
};
|
"LANG"
|
||||||
users.users."root".openssh.authorizedKeys.keys = [
|
"LC_*"
|
||||||
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqVt4LCe0YIttr9swFxjkjn37ZDY9JxwVC+2gvfSINDJorOCtqPjDOTD2fTS1Gz08QCwpnLWq2kyvRchu6WgriAbSACpbZZBgxRaF/FVh3oiMVFGnNKGnv6/fdo/vZtu8mUVuqtmTrgLYpZdbR4oD3XiBlDKs7Cv5hPqt95lnP6MNFvE8mICCfd1PwhsABd2IQ5laz3u77/RXhNFJL0Kf2/+6gk9awcLuwHrPdvq7c3BxRHbc9UMRQENyjyQPa7aLe+uJBFLKP51I8VBuDpDacuibQx7nMt6N2UJ2KWI0JxRMHuJNq4S5jidR82aOw9gzGbTv30SKNLMqsZ0xj4LtdqCXDiZF6Lr09PsJYsvnBUFWa14HGcThKDtgwQwBryNViYmfv//0h9+RLZiU0ab+NEwSs7Zh5iAD+vhx64QqNX3tR7Le4SWXh8W0eShU9N78qYdSkiC3Ui7htxeqOocXM/P4AwbnHsLELIvkHdvgchCPvl8ygZa4WJTEWv16+ICskJcAKWGuqjvXAFuwjJJmPp9xLW9O0DFfQhMELiGamQR9wK07yYQVr34iah6qZO7cwhSKyEPFrVPIaNtfDhsjED639F7vmktf26SWNJHWfW0wOHILjI6TgqUvy0JDd8W8w0CHlAfz6Fs2l99NNgNF8dB3vBASbxS0hu/y0PVu/xQ== openstack-sleipner"
|
"COLORTERM"
|
||||||
|
"GIT_PROTOCOL"
|
||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICCbgJ0Uwh9VSVhfId7l9i5/jk4CvAK5rbkiab8R+moF root@sleipner"
|
|
||||||
];
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
users.users."root".openssh.authorizedKeys.keys = [
|
||||||
|
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqVt4LCe0YIttr9swFxjkjn37ZDY9JxwVC+2gvfSINDJorOCtqPjDOTD2fTS1Gz08QCwpnLWq2kyvRchu6WgriAbSACpbZZBgxRaF/FVh3oiMVFGnNKGnv6/fdo/vZtu8mUVuqtmTrgLYpZdbR4oD3XiBlDKs7Cv5hPqt95lnP6MNFvE8mICCfd1PwhsABd2IQ5laz3u77/RXhNFJL0Kf2/+6gk9awcLuwHrPdvq7c3BxRHbc9UMRQENyjyQPa7aLe+uJBFLKP51I8VBuDpDacuibQx7nMt6N2UJ2KWI0JxRMHuJNq4S5jidR82aOw9gzGbTv30SKNLMqsZ0xj4LtdqCXDiZF6Lr09PsJYsvnBUFWa14HGcThKDtgwQwBryNViYmfv//0h9+RLZiU0ab+NEwSs7Zh5iAD+vhx64QqNX3tR7Le4SWXh8W0eShU9N78qYdSkiC3Ui7htxeqOocXM/P4AwbnHsLELIvkHdvgchCPvl8ygZa4WJTEWv16+ICskJcAKWGuqjvXAFuwjJJmPp9xLW9O0DFfQhMELiGamQR9wK07yYQVr34iah6qZO7cwhSKyEPFrVPIaNtfDhsjED639F7vmktf26SWNJHWfW0wOHILjI6TgqUvy0JDd8W8w0CHlAfz6Fs2l99NNgNF8dB3vBASbxS0hu/y0PVu/xQ== openstack-sleipner"
|
||||||
|
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICCbgJ0Uwh9VSVhfId7l9i5/jk4CvAK5rbkiab8R+moF root@sleipner"
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
{ config, pkgs, lib, ... }:
|
|
||||||
let
|
|
||||||
cfg = config.services.postfix;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
services.postfix = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
settings.main = {
|
|
||||||
myhostname = "${config.networking.hostName}.pvv.ntnu.no";
|
|
||||||
mydomain = "pvv.ntnu.no";
|
|
||||||
|
|
||||||
# Nothing should be delivered to this machine
|
|
||||||
mydestination = [ ];
|
|
||||||
|
|
||||||
relayhost = [ "smtp.pvv.ntnu.no:465" ];
|
|
||||||
|
|
||||||
smtp_tls_wrappermode = "yes";
|
|
||||||
smtp_tls_security_level = "encrypt";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -268,6 +268,7 @@
|
|||||||
modules = [
|
modules = [
|
||||||
inputs.nix-gitea-themes.nixosModules.default
|
inputs.nix-gitea-themes.nixosModules.default
|
||||||
inputs.disko.nixosModules.disko
|
inputs.disko.nixosModules.disko
|
||||||
|
self.nixosModules.robots-txt
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,10 @@ let
|
|||||||
dataDir = "/data/mysql";
|
dataDir = "/data/mysql";
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./backup.nix ];
|
imports = [
|
||||||
|
./backup.nix
|
||||||
|
./timed-jobs.nix
|
||||||
|
];
|
||||||
|
|
||||||
sops.secrets."mysql/password" = {
|
sops.secrets."mysql/password" = {
|
||||||
owner = "mysql";
|
owner = "mysql";
|
||||||
@@ -54,6 +57,18 @@ in
|
|||||||
mode = "0700";
|
mode = "0700";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fileSystems.${dataDir} = lib.mkIf cfg.enable {
|
||||||
|
device = dataDir;
|
||||||
|
fsType = "none";
|
||||||
|
options = [
|
||||||
|
"bind"
|
||||||
|
"noatime"
|
||||||
|
"noauto"
|
||||||
|
"x-systemd.requires=systemd-tmpfiles-setup.service"
|
||||||
|
"x-systemd.requires=systemd-tmpfiles-resetup.service"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
systemd.services.mysql = lib.mkIf cfg.enable {
|
systemd.services.mysql = lib.mkIf cfg.enable {
|
||||||
after = [
|
after = [
|
||||||
"systemd-tmpfiles-setup.service"
|
"systemd-tmpfiles-setup.service"
|
||||||
@@ -61,6 +76,7 @@ in
|
|||||||
];
|
];
|
||||||
|
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
|
RequiresMountsFor = [ dataDir ];
|
||||||
BindPaths = [ "${dataDir}:${cfg.dataDir}" ];
|
BindPaths = [ "${dataDir}:${cfg.dataDir}" ];
|
||||||
|
|
||||||
LogsDirectory = "mysql";
|
LogsDirectory = "mysql";
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.services.mysql;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
systemd.services = {
|
||||||
|
mysql-analyze = {
|
||||||
|
requires = [ "mysql.service" ];
|
||||||
|
after = [ "mysql.service" ];
|
||||||
|
description = "Refresh MariaDB optimizer statistics for all databases";
|
||||||
|
startAt = "Mon 05:00:00";
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
User = cfg.user;
|
||||||
|
Group = cfg.group;
|
||||||
|
|
||||||
|
Nice = 19;
|
||||||
|
IOSchedulingClass = "best-effort";
|
||||||
|
IOSchedulingPriority = 7;
|
||||||
|
|
||||||
|
ExecStart = "${lib.getExe' cfg.package "mariadb-check"} --all-databases --analyze";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
mysql-optimize = {
|
||||||
|
requires = [ "mysql.service" ];
|
||||||
|
after = [ "mysql.service" ];
|
||||||
|
description = "Check, repair and optimize all MariaDB databases";
|
||||||
|
startAt = "*-*-01 04:00:00";
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
User = cfg.user;
|
||||||
|
Group = cfg.group;
|
||||||
|
|
||||||
|
Nice = 19;
|
||||||
|
IOSchedulingClass = "best-effort";
|
||||||
|
IOSchedulingPriority = 7;
|
||||||
|
|
||||||
|
ExecStart = [
|
||||||
|
"${lib.getExe' cfg.package "mariadb-check"} --all-databases --auto-repair"
|
||||||
|
"${lib.getExe' cfg.package "mariadb-check"} --all-databases --optimize"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -14,6 +14,7 @@ in
|
|||||||
extensions = ps: with ps; [ pg_repack ];
|
extensions = ps: with ps; [ pg_repack ];
|
||||||
enableTCPIP = true;
|
enableTCPIP = true;
|
||||||
|
|
||||||
|
# NOTE: md5 accepts both md5 and scram-sha-256
|
||||||
authentication = ''
|
authentication = ''
|
||||||
host all all ${values.ipv4-space} md5
|
host all all ${values.ipv4-space} md5
|
||||||
host all all ${values.ipv6-space} md5
|
host all all ${values.ipv6-space} md5
|
||||||
@@ -76,6 +77,15 @@ in
|
|||||||
maintenance_io_concurrency = 100;
|
maintenance_io_concurrency = 100;
|
||||||
wal_recycle = true;
|
wal_recycle = true;
|
||||||
|
|
||||||
|
# -------------------------------- #
|
||||||
|
|
||||||
|
# Authentication
|
||||||
|
password_encryption = "scram-sha-256";
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
log_connections = "authorization";
|
||||||
|
log_disconnections = true;
|
||||||
|
|
||||||
# SSL
|
# SSL
|
||||||
ssl = true;
|
ssl = true;
|
||||||
ssl_cert_file = "/run/credentials/postgresql.service/cert";
|
ssl_cert_file = "/run/credentials/postgresql.service/cert";
|
||||||
@@ -89,6 +99,18 @@ in
|
|||||||
mode = "0700";
|
mode = "0700";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fileSystems."/data/postgresql" = lib.mkIf cfg.enable {
|
||||||
|
device = "/data/postgresql";
|
||||||
|
fsType = "none";
|
||||||
|
options = [
|
||||||
|
"bind"
|
||||||
|
"noatime"
|
||||||
|
"noauto"
|
||||||
|
"x-systemd.requires=systemd-tmpfiles-setup.service"
|
||||||
|
"x-systemd.requires=systemd-tmpfiles-resetup.service"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
systemd.services.postgresql-setup = lib.mkIf cfg.enable {
|
systemd.services.postgresql-setup = lib.mkIf cfg.enable {
|
||||||
after = [
|
after = [
|
||||||
"systemd-tmpfiles-setup.service"
|
"systemd-tmpfiles-setup.service"
|
||||||
@@ -100,6 +122,7 @@ in
|
|||||||
"key:/etc/certs/postgres.key"
|
"key:/etc/certs/postgres.key"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
RequiresMountsFor = [ "/data/postgresql" ];
|
||||||
BindPaths = [ "/data/postgresql:/var/lib/postgresql" ];
|
BindPaths = [ "/data/postgresql:/var/lib/postgresql" ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -115,6 +138,7 @@ in
|
|||||||
"key:/etc/certs/postgres.key"
|
"key:/etc/certs/postgres.key"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
RequiresMountsFor = [ "/data/postgresql" ];
|
||||||
BindPaths = [ "/data/postgresql:/var/lib/postgresql" ];
|
BindPaths = [ "/data/postgresql:/var/lib/postgresql" ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ in
|
|||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./minecraft-checker.nix
|
./minecraft-checker.nix
|
||||||
|
./postgres-checker.nix
|
||||||
|
./mariadb-checker.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
services.gatus = {
|
services.gatus = {
|
||||||
@@ -133,6 +135,18 @@ in
|
|||||||
"[BODY].ok == true"
|
"[BODY].ok == true"
|
||||||
];
|
];
|
||||||
})
|
})
|
||||||
|
(mkService "PostgreSQL" "http://localhost:1338" // {
|
||||||
|
conditions = [
|
||||||
|
"[STATUS] == 200"
|
||||||
|
"[BODY].ok == true"
|
||||||
|
];
|
||||||
|
})
|
||||||
|
(mkService "MariaDB" "http://localhost:1339" // {
|
||||||
|
conditions = [
|
||||||
|
"[STATUS] == 200"
|
||||||
|
"[BODY].ok == true"
|
||||||
|
];
|
||||||
|
})
|
||||||
(mkService "Email (SMTP)" "starttls://mail.pvv.ntnu.no:587")
|
(mkService "Email (SMTP)" "starttls://mail.pvv.ntnu.no:587")
|
||||||
(mkService "Email (POP3)" "tls://mail.pvv.ntnu.no:995")
|
(mkService "Email (POP3)" "tls://mail.pvv.ntnu.no:995")
|
||||||
(mkService "Email (IMAP)" "tls://mail.pvv.ntnu.no:993")
|
(mkService "Email (IMAP)" "tls://mail.pvv.ntnu.no:993")
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
sops.secrets."keys/gatus/mariadb" = {
|
||||||
|
restartUnits = [ "phh-gatus-mariadb-checker.service" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
sops.templates."gatus-mariadb-checker.env" = {
|
||||||
|
restartUnits = [ "phh-gatus-mariadb-checker.service" ];
|
||||||
|
content = ''
|
||||||
|
MYSQL_HOST=mysql.pvv.ntnu.no
|
||||||
|
MYSQL_PORT=3306
|
||||||
|
MYSQL_DATABASE=mysql
|
||||||
|
MYSQL_USER=gatus_healthcheck
|
||||||
|
MYSQL_PASSWORD=${config.sops.placeholder."keys/gatus/mariadb"}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.python-http-handlers."gatus-mariadb-checker" = {
|
||||||
|
listenStreams = [ "127.0.0.1:1339" ];
|
||||||
|
libraries = with pkgs.python3Packages; [
|
||||||
|
pymysql
|
||||||
|
];
|
||||||
|
serviceConfig = {
|
||||||
|
EnvironmentFile = config.sops.templates."gatus-mariadb-checker.env".path;
|
||||||
|
};
|
||||||
|
handler = ''
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pymysql
|
||||||
|
|
||||||
|
class Handler(BaseHTTPRequestHandler):
|
||||||
|
def do_GET(self):
|
||||||
|
try:
|
||||||
|
conn = pymysql.connect(
|
||||||
|
host=os.environ["MYSQL_HOST"],
|
||||||
|
port=int(os.environ.get("MYSQL_PORT", "3306")),
|
||||||
|
user=os.environ["MYSQL_USER"],
|
||||||
|
password=os.environ["MYSQL_PASSWORD"],
|
||||||
|
database=os.environ.get("MYSQL_DATABASE", "mysql"),
|
||||||
|
connect_timeout=5,
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
with conn.cursor() as cur:
|
||||||
|
cur.execute("SELECT VERSION();")
|
||||||
|
(version,) = cur.fetchone()
|
||||||
|
|
||||||
|
cur.execute("SHOW STATUS LIKE 'Threads_connected';")
|
||||||
|
(_, connections) = cur.fetchone()
|
||||||
|
|
||||||
|
cur.execute("SHOW DATABASES;")
|
||||||
|
databases = cur.fetchall()
|
||||||
|
finally:
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
body = {
|
||||||
|
"ok": True,
|
||||||
|
"version": version,
|
||||||
|
"connections": int(connections),
|
||||||
|
"databases": len(databases),
|
||||||
|
}
|
||||||
|
data = json.dumps(body).encode()
|
||||||
|
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header("Content-Type", "application/json")
|
||||||
|
self.send_header("Content-Length", str(len(data)))
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(data)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
data = json.dumps({"ok": False, "error": str(e)}).encode()
|
||||||
|
self.send_response(500)
|
||||||
|
self.send_header("Content-Type", "application/json")
|
||||||
|
self.send_header("Content-Length", str(len(data)))
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(data)
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
sops.secrets."keys/gatus/postgres" = {
|
||||||
|
restartUnits = [ "phh-gatus-postgres-checker.service" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
sops.templates."gatus-postgres-checker.env" = {
|
||||||
|
restartUnits = [ "phh-gatus-postgres-checker.service" ];
|
||||||
|
content = ''
|
||||||
|
PGHOST=postgres.pvv.ntnu.no
|
||||||
|
PGPORT=5432
|
||||||
|
PGDATABASE=postgres
|
||||||
|
PGUSER=gatus_healthcheck
|
||||||
|
PGPASSWORD=${config.sops.placeholder."keys/gatus/postgres"}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.python-http-handlers."gatus-postgres-checker" = {
|
||||||
|
listenStreams = [ "127.0.0.1:1338" ];
|
||||||
|
libraries = with pkgs.python3Packages; [
|
||||||
|
psycopg2
|
||||||
|
];
|
||||||
|
serviceConfig = {
|
||||||
|
EnvironmentFile = config.sops.templates."gatus-postgres-checker.env".path;
|
||||||
|
};
|
||||||
|
handler = ''
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import psycopg2
|
||||||
|
|
||||||
|
class Handler(BaseHTTPRequestHandler):
|
||||||
|
def do_GET(self):
|
||||||
|
try:
|
||||||
|
conn = psycopg2.connect(
|
||||||
|
host=os.environ["PGHOST"],
|
||||||
|
port=os.environ.get("PGPORT", "5432"),
|
||||||
|
dbname=os.environ.get("PGDATABASE", "postgres"),
|
||||||
|
user=os.environ["PGUSER"],
|
||||||
|
password=os.environ["PGPASSWORD"],
|
||||||
|
connect_timeout=5,
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
with conn.cursor() as cur:
|
||||||
|
cur.execute("SELECT version();")
|
||||||
|
(version,) = cur.fetchone()
|
||||||
|
|
||||||
|
cur.execute("SELECT count(*) FROM pg_stat_activity;")
|
||||||
|
(connections,) = cur.fetchone()
|
||||||
|
|
||||||
|
cur.execute("SELECT count(*) FROM pg_database WHERE NOT datistemplate;")
|
||||||
|
(databases,) = cur.fetchone()
|
||||||
|
finally:
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
body = {
|
||||||
|
"ok": True,
|
||||||
|
"version": version,
|
||||||
|
"connections": connections,
|
||||||
|
"databases": databases,
|
||||||
|
}
|
||||||
|
data = json.dumps(body).encode()
|
||||||
|
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header("Content-Type", "application/json")
|
||||||
|
self.send_header("Content-Length", str(len(data)))
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(data)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
data = json.dumps({"ok": False, "error": str(e)}).encode()
|
||||||
|
self.send_response(500)
|
||||||
|
self.send_header("Content-Type", "application/json")
|
||||||
|
self.send_header("Content-Length", str(len(data)))
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(data)
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -196,6 +196,108 @@ in {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
environment.robots-txt."gitea" = {
|
||||||
|
virtualHost = domain;
|
||||||
|
rules = [
|
||||||
|
{
|
||||||
|
pre_comment = ''
|
||||||
|
Gitea internals
|
||||||
|
|
||||||
|
See these for more information:
|
||||||
|
- https://gitea.com/robots.txt
|
||||||
|
- https://codeberg.org/robots.txt
|
||||||
|
'';
|
||||||
|
User-agent = "*";
|
||||||
|
Disallow = [
|
||||||
|
"/api/*"
|
||||||
|
"/avatars"
|
||||||
|
"/*/*/src/commit/*"
|
||||||
|
"/*/*/commit/*"
|
||||||
|
"/*/*/*/refs/*"
|
||||||
|
"/*/*/*/star"
|
||||||
|
"/*/*/*/watch"
|
||||||
|
"/*/*/labels"
|
||||||
|
"/*/*/activity/*"
|
||||||
|
"/vendor/*"
|
||||||
|
"/swagger.*.json"
|
||||||
|
"/repo/create"
|
||||||
|
"/repo/migrate"
|
||||||
|
"/org/create"
|
||||||
|
"/*/*/fork"
|
||||||
|
"/*/*/watchers"
|
||||||
|
"/*/*/stargazers"
|
||||||
|
"/*/*/forks"
|
||||||
|
"*/.git/"
|
||||||
|
"/*.git"
|
||||||
|
"/*.atom"
|
||||||
|
"/*.rss"
|
||||||
|
];
|
||||||
|
Crawl-delay = "2";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
pre_comment = "Language Spam";
|
||||||
|
Disallow = "/*?lang=";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
pre_comment = ''
|
||||||
|
AI bots
|
||||||
|
|
||||||
|
Sourced from:
|
||||||
|
- https://www.vg.no/robots.txt
|
||||||
|
- https://codeberg.org/robots.txt
|
||||||
|
'';
|
||||||
|
User-agent = [
|
||||||
|
"AI2Bot"
|
||||||
|
"Ai2Bot-Dolma"
|
||||||
|
"Amazonbot"
|
||||||
|
"Applebot-Extended"
|
||||||
|
"Bytespider"
|
||||||
|
"CCBot"
|
||||||
|
"ChatGPT-User"
|
||||||
|
"Claude-Web"
|
||||||
|
"ClaudeBot"
|
||||||
|
"Crawlspace"
|
||||||
|
"Diffbot"
|
||||||
|
"FacebookBot"
|
||||||
|
"FriendlyCrawler"
|
||||||
|
"GPTBot"
|
||||||
|
"Google-Extended"
|
||||||
|
"ICC-Crawler"
|
||||||
|
"ImagesiftBot"
|
||||||
|
"Kangaroo Bot"
|
||||||
|
"Meta-ExternalAgent"
|
||||||
|
"OAI-SearchBot"
|
||||||
|
"Omgili"
|
||||||
|
"Omgilibot"
|
||||||
|
"PanguBot"
|
||||||
|
"PerplexityBot"
|
||||||
|
"PetalBot"
|
||||||
|
"Scrapy"
|
||||||
|
"SemrushBot-OCOB"
|
||||||
|
"Sidetrade indexer bot"
|
||||||
|
"Timpibot"
|
||||||
|
"VelenPublicWebCrawler"
|
||||||
|
"Webzio-Extended"
|
||||||
|
"YouBot"
|
||||||
|
"anthropic-ai"
|
||||||
|
"cohere-ai"
|
||||||
|
"cohere-training-data-crawler"
|
||||||
|
"facebookexternalhit"
|
||||||
|
"iaskspider/2.0"
|
||||||
|
"img2dataset"
|
||||||
|
"meta-externalagent"
|
||||||
|
"omgili"
|
||||||
|
"omgilibot"
|
||||||
|
];
|
||||||
|
Disallow = "/";
|
||||||
|
Crawl-delay = "2";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
Sitemap = "https://${domain}/sitemap.xml";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
networking.firewall.allowedTCPPorts = [ sshPort ];
|
networking.firewall.allowedTCPPorts = [ sshPort ];
|
||||||
|
|
||||||
services.rsync-pull-targets = {
|
services.rsync-pull-targets = {
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{ config, lib, pkgs, ... }:
|
||||||
{
|
{
|
||||||
services.postfix.enable = lib.mkForce false;
|
assertions = [{
|
||||||
|
assertion = config.services.nullmailer.enable;
|
||||||
|
message = ''
|
||||||
|
Expected nullmailer to be enabled for temmie userweb.
|
||||||
|
|
||||||
services.nullmailer = {
|
If you change the default sendmail implementation, please make sure that temmie userweb works correctly!
|
||||||
enable = true;
|
'';
|
||||||
config = {
|
}];
|
||||||
me = config.networking.fqdn;
|
|
||||||
remotes = "mail.pvv.ntnu.no smtp --port=25";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services.bro = {
|
services.bro = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
config:
|
config:
|
||||||
mysqld_exporter_password: ENC[AES256_GCM,data:I9K+QMqaN3FOOVKzeOR9Q6UERStXX0P8WEHyN1jzzbM=,iv:UxvIdlfAyJvNuxPkU4+guKPa0fiD0vVLzHOTYktcmso=,tag:ltnIqEwESYx9HBu8UN0ZLw==,type:str]
|
mysqld_exporter_password: ENC[AES256_GCM,data:I9K+QMqaN3FOOVKzeOR9Q6UERStXX0P8WEHyN1jzzbM=,iv:UxvIdlfAyJvNuxPkU4+guKPa0fiD0vVLzHOTYktcmso=,tag:ltnIqEwESYx9HBu8UN0ZLw==,type:str]
|
||||||
keys:
|
keys:
|
||||||
|
gatus:
|
||||||
|
mariadb: ENC[AES256_GCM,data:U7CGtjHacJlKcReEw3JO86okCVgLAkP92iX1bHGNw8qeImpvk5mNw77Ox7tbsChvozrJWa/Npu2pTBsNnVYYYA==,iv:hWa+KPiBc3AnH1tHCGJa8LhPXZ1o8sxufpGe7nUjV0E=,tag:mso5HEfmWAOGw350408X7g==,type:str]
|
||||||
|
postgres: ENC[AES256_GCM,data:7fI0JeZDK1MX5poXWaMo67PXbjdjvM+xPKioHSHmGdS8iNDGe5Ym6LlS/hOnPvvDuNFyHjKKizqDst0227U2gg==,iv:D3bz/xyFrnQsUCiMEFq8JOjSudyiw+idEMWQ1e6Uk3k=,tag:8XqadKVHK9NMWehK7V5J0Q==,type:str]
|
||||||
grafana:
|
grafana:
|
||||||
secret_key: ENC[AES256_GCM,data:+WoAJbDBEgKs0RoHT+7oEELAVQ+/2Xt+5RTMSXg23moCqVRx+Gzll9P5Drw=,iv:AkRn/Y20iEe5i1T+84wAgLCTFtAox2G3giyawAkltAw=,tag:BZbt5Wb5lYLIJBm/pfP4GQ==,type:str]
|
secret_key: ENC[AES256_GCM,data:+WoAJbDBEgKs0RoHT+7oEELAVQ+/2Xt+5RTMSXg23moCqVRx+Gzll9P5Drw=,iv:AkRn/Y20iEe5i1T+84wAgLCTFtAox2G3giyawAkltAw=,tag:BZbt5Wb5lYLIJBm/pfP4GQ==,type:str]
|
||||||
admin_password: ENC[AES256_GCM,data:ttKwfC4WuXeL/6x4,iv:x1X+e3z08CR992GzC62YnFIN7SGrE81/nDNrgcgVzx0=,tag:YajUoy61kYbpeGeC7yNrXQ==,type:str]
|
admin_password: ENC[AES256_GCM,data:ttKwfC4WuXeL/6x4,iv:x1X+e3z08CR992GzC62YnFIN7SGrE81/nDNrgcgVzx0=,tag:YajUoy61kYbpeGeC7yNrXQ==,type:str]
|
||||||
@@ -9,8 +12,7 @@ keys:
|
|||||||
postgres_exporter_knakelibrak_env: ENC[AES256_GCM,data:xjC7DGXrW2GIJq8XioIZb+jSe/Hzcz0tv9cUHmX/n1nhI+D64lYt+EKnq1+RX/vJzU4sTaKjveKBh88Qqnv6RQm+MZC//dIxcvnnAdl50qnHZyBCaFFEzSNI8I8vGyArMk8Ja72clBq3kMpUz/pLBP0qDrjblKDoWkU=,iv:ZW98hJy8A5t4Oxtu17R3tM7gou183VLbgBsHA8LFuJY=,tag:VMOvQz3X/XDylV1YFg2Jsg==,type:str]
|
postgres_exporter_knakelibrak_env: ENC[AES256_GCM,data:xjC7DGXrW2GIJq8XioIZb+jSe/Hzcz0tv9cUHmX/n1nhI+D64lYt+EKnq1+RX/vJzU4sTaKjveKBh88Qqnv6RQm+MZC//dIxcvnnAdl50qnHZyBCaFFEzSNI8I8vGyArMk8Ja72clBq3kMpUz/pLBP0qDrjblKDoWkU=,iv:ZW98hJy8A5t4Oxtu17R3tM7gou183VLbgBsHA8LFuJY=,tag:VMOvQz3X/XDylV1YFg2Jsg==,type:str]
|
||||||
sops:
|
sops:
|
||||||
age:
|
age:
|
||||||
- recipient: age102e6y8gah0ntr6fxqnkpepc8ar29p6ls7ks9ka7v8w87q8scm9yqmc2u8d
|
- enc: |
|
||||||
enc: |
|
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyTWRSM3IwMmxtTmZVcCsw
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyTWRSM3IwMmxtTmZVcCsw
|
||||||
OUhlakxHZzgrSEhEdUZFTXE1anNjQ2wvdkZFCnB6S1l3TXQ3ZGFYWmtYM1cwMFZT
|
OUhlakxHZzgrSEhEdUZFTXE1anNjQ2wvdkZFCnB6S1l3TXQ3ZGFYWmtYM1cwMFZT
|
||||||
@@ -18,8 +20,8 @@ sops:
|
|||||||
YlltQ3FBU3RBYUx4TnNPRk1SUWNqZG8KAJjc09x553ncaWduGLsnIHdroaOmMasP
|
YlltQ3FBU3RBYUx4TnNPRk1SUWNqZG8KAJjc09x553ncaWduGLsnIHdroaOmMasP
|
||||||
/fq0GzW6UNfmE2rQ6qrQti21B37/sN0WMLCSPLUPG45kBgx20GG4hQ==
|
/fq0GzW6UNfmE2rQ6qrQti21B37/sN0WMLCSPLUPG45kBgx20GG4hQ==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
- recipient: age1ug30gg4y7ftuya0wdv7q0vh4egn00wlv2th7mt7cgc2ze46wmvyq9lq6ge
|
recipient: age102e6y8gah0ntr6fxqnkpepc8ar29p6ls7ks9ka7v8w87q8scm9yqmc2u8d
|
||||||
enc: |
|
- enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTOWFvcFFzc1lmNVdmV3lX
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTOWFvcFFzc1lmNVdmV3lX
|
||||||
cVVLNHowcGdENzI5UUJLZTNSMHhjNlI2c0FnCmdwOS9oL1kwTnhwbXRodWxxWVE3
|
cVVLNHowcGdENzI5UUJLZTNSMHhjNlI2c0FnCmdwOS9oL1kwTnhwbXRodWxxWVE3
|
||||||
@@ -27,8 +29,8 @@ sops:
|
|||||||
eDVwd2dKMG9FRW1OY1pyUkhLeWw3b0EKtJpsQ/Ss39ZLiRNqUhn8sdB3hpQy7Syv
|
eDVwd2dKMG9FRW1OY1pyUkhLeWw3b0EKtJpsQ/Ss39ZLiRNqUhn8sdB3hpQy7Syv
|
||||||
ererqhMkqmDugGEHPk6KpZuj7DVSK1di7JgA2qZOUPzI7UpxjaC0Kg==
|
ererqhMkqmDugGEHPk6KpZuj7DVSK1di7JgA2qZOUPzI7UpxjaC0Kg==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
- recipient: age1mrnldl334l2nszuta6ywvewng0fswv2dz9l5g4qcwe3nj4yxf92qjskdx6
|
recipient: age1ug30gg4y7ftuya0wdv7q0vh4egn00wlv2th7mt7cgc2ze46wmvyq9lq6ge
|
||||||
enc: |
|
- enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOQU1iVXRkQmo4b3F1Vngz
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOQU1iVXRkQmo4b3F1Vngz
|
||||||
S0pkNkVFR1FUb1djdmI0eHh3V3BBTDJTSTJZClA0S0Z0cTdFRmRaOEZQdHQzdGZ3
|
S0pkNkVFR1FUb1djdmI0eHh3V3BBTDJTSTJZClA0S0Z0cTdFRmRaOEZQdHQzdGZ3
|
||||||
@@ -36,8 +38,8 @@ sops:
|
|||||||
REdjRFZyY2pNdEd6cmgvQisyVDhLUEkKRItJ0CGbzlEB5RNAyem4feMVhTfcLef3
|
REdjRFZyY2pNdEd6cmgvQisyVDhLUEkKRItJ0CGbzlEB5RNAyem4feMVhTfcLef3
|
||||||
QIqltZ2l4LLexnkECi3FCJZHxrbUa+/RF6p1DsueUw7LLUnOcphB9A==
|
QIqltZ2l4LLexnkECi3FCJZHxrbUa+/RF6p1DsueUw7LLUnOcphB9A==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
- recipient: age1hmpdk4h69wxpwqk9tkud39f66hprhehxtzhgw97r6dvr7v0mx5jscsuhkn
|
recipient: age1mrnldl334l2nszuta6ywvewng0fswv2dz9l5g4qcwe3nj4yxf92qjskdx6
|
||||||
enc: |
|
- enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAvZTBpaWM0c1hmODBaK0Iw
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAvZTBpaWM0c1hmODBaK0Iw
|
||||||
bmp1NzRacklXMHU0K2J2d0g5ajBiNlRNWGhRCm1DOWI0cm5BdTdlNmFzM2JVekNk
|
bmp1NzRacklXMHU0K2J2d0g5ajBiNlRNWGhRCm1DOWI0cm5BdTdlNmFzM2JVekNk
|
||||||
@@ -45,8 +47,8 @@ sops:
|
|||||||
U0ZCT2toZ1ZMZ3E0bXRhSTQvNGFWNVkKhxfQDIDe2LQW7OMBJv0J267AW1wI32df
|
U0ZCT2toZ1ZMZ3E0bXRhSTQvNGFWNVkKhxfQDIDe2LQW7OMBJv0J267AW1wI32df
|
||||||
ZQxd657TEqzm7i19azrCS0jyRbfj2MYzEJAtTGiGZaNC9uKDFzBhKw==
|
ZQxd657TEqzm7i19azrCS0jyRbfj2MYzEJAtTGiGZaNC9uKDFzBhKw==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
- recipient: age1wrssr4z4g6vl3fd3qme5cewchmmhm0j2xe6wf2meu4r6ycn37anse98mfs
|
recipient: age1hmpdk4h69wxpwqk9tkud39f66hprhehxtzhgw97r6dvr7v0mx5jscsuhkn
|
||||||
enc: |
|
- enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBmRlJROHRKb21YUnlicmc1
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBmRlJROHRKb21YUnlicmc1
|
||||||
MlptQllEcXFhajNKS1krMDdUMWk5QWo4eVJBCndGSlhXS1Vaa2RSTllIcmF1ZVpl
|
MlptQllEcXFhajNKS1krMDdUMWk5QWo4eVJBCndGSlhXS1Vaa2RSTllIcmF1ZVpl
|
||||||
@@ -54,8 +56,8 @@ sops:
|
|||||||
TE41aFdjU0h0ekQ2Zjg4Z3VQVjFWcnMK6zjSalqeYjyc4NH6nOeghlhYJydrz4pM
|
TE41aFdjU0h0ekQ2Zjg4Z3VQVjFWcnMK6zjSalqeYjyc4NH6nOeghlhYJydrz4pM
|
||||||
N5ZcXjRbrIVFdhbYnvQGKvGKZm0kK6vjzBjdT7BM6ctr8cq/qrz1xQ==
|
N5ZcXjRbrIVFdhbYnvQGKvGKZm0kK6vjzBjdT7BM6ctr8cq/qrz1xQ==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
- recipient: age1zhxul786an743u0fascv4wtc5xduu7qfy803lfs539yzhgmlq5ds2lznt5
|
recipient: age1wrssr4z4g6vl3fd3qme5cewchmmhm0j2xe6wf2meu4r6ycn37anse98mfs
|
||||||
enc: |
|
- enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIRXpBa2tYc2xEeldub0VK
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIRXpBa2tYc2xEeldub0VK
|
||||||
bkFwOFdlUGRZM0FVT0tyUW1RWnl0TjRUTUh3CnZlMC92MU1hRW1yZU1NSUdoUEZh
|
bkFwOFdlUGRZM0FVT0tyUW1RWnl0TjRUTUh3CnZlMC92MU1hRW1yZU1NSUdoUEZh
|
||||||
@@ -63,8 +65,8 @@ sops:
|
|||||||
aXFQWlNVQ2laVm1ETStRemNZRXc3TUEKlPYSU3gp67dsPfbEJkru4ieMvspC7+pu
|
aXFQWlNVQ2laVm1ETStRemNZRXc3TUEKlPYSU3gp67dsPfbEJkru4ieMvspC7+pu
|
||||||
rfp315HLyj1FGhrA8f2qOxE/PYI2rn0yKm80KffWBV7ylX/uonm4Fg==
|
rfp315HLyj1FGhrA8f2qOxE/PYI2rn0yKm80KffWBV7ylX/uonm4Fg==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
- recipient: age1sqs7urnzsdy64efmd0zukzv3gs5pnjksuxd7nqmdwdy5l0nqnunq6hyune
|
recipient: age1zhxul786an743u0fascv4wtc5xduu7qfy803lfs539yzhgmlq5ds2lznt5
|
||||||
enc: |
|
- enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsaTEzOFBEeG9LVThSVmQ5
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsaTEzOFBEeG9LVThSVmQ5
|
||||||
VXBoaFpueFRCbFJ1akE4RWc1aE1HUmVGcXdZCjFnbU0wd2drazNsTmNBMHNuOFhO
|
VXBoaFpueFRCbFJ1akE4RWc1aE1HUmVGcXdZCjFnbU0wd2drazNsTmNBMHNuOFhO
|
||||||
@@ -72,8 +74,9 @@ sops:
|
|||||||
dC9meDZlc3d3aUJEVjc4REF0Y1BLcGcK79LbJzc5KVgEgyJR11crGuX8YcVoJBbT
|
dC9meDZlc3d3aUJEVjc4REF0Y1BLcGcK79LbJzc5KVgEgyJR11crGuX8YcVoJBbT
|
||||||
Fin7Zoon06L7qx0Zw5u27wV7RKMnYT7hOMiWs6660ZTLcYJ5M1aEZQ==
|
Fin7Zoon06L7qx0Zw5u27wV7RKMnYT7hOMiWs6660ZTLcYJ5M1aEZQ==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
lastmodified: "2025-03-16T20:08:18Z"
|
recipient: age1sqs7urnzsdy64efmd0zukzv3gs5pnjksuxd7nqmdwdy5l0nqnunq6hyune
|
||||||
mac: ENC[AES256_GCM,data:C2tpWppc13jKJq5d4nmAKQOaNWHm27TKwxAxm1fi2lejN1lqUaoz5bHfTBA7MfaWvuP5uZnfbtG32eeu48mnlWpo58XRUFFecAhb9JUpW9s5IR3/nbzLNkGU7H5C0oWPrxI4thd+bAVduIgBjjFyGj1pe6J9db3c0yUWRwNlwGU=,iv:YpoQ4psiFYOWLGipxv1QvRvr034XFsyn2Bhyy39HmOo=,tag:ByiCWygFC/VokVTbdLoLgg==,type:str]
|
lastmodified: "2026-07-21T09:40:54Z"
|
||||||
|
mac: ENC[AES256_GCM,data:FLpmsW9I21qNMFs6Tn/1AzFo+RcmCwtVdAaaGIrGlUi2l3gzb//ZK6ruI/VYx1R5DoX1OhD3EIg6aLMSOT6jiHf+8GwfhdijpayG1nrgeZW3SuFbjVlCYNMPH3DOJJB82U3T+ozSbpnZEtdUwmNWcZJt5F2hOEnoaNa+jLEKDao=,iv:qyQuyWuu+w2ynRvhIx0QVtw+tieO3dbQsUxEB5Brzp0=,tag:qYAj4h6foWm16YqIdZ6xbQ==,type:str]
|
||||||
pgp:
|
pgp:
|
||||||
- created_at: "2026-05-20T17:35:58Z"
|
- created_at: "2026-05-20T17:35:58Z"
|
||||||
enc: |-
|
enc: |-
|
||||||
@@ -96,4 +99,4 @@ sops:
|
|||||||
-----END PGP MESSAGE-----
|
-----END PGP MESSAGE-----
|
||||||
fp: F7D37890228A907440E1FD4846B9228E814A2AAC
|
fp: F7D37890228A907440E1FD4846B9228E814A2AAC
|
||||||
unencrypted_suffix: _unencrypted
|
unencrypted_suffix: _unencrypted
|
||||||
version: 3.9.4
|
version: 3.13.2
|
||||||
|
|||||||
Reference in New Issue
Block a user