Compare commits

..

No commits in common. "e785b697a5874944f733b259c185a5a581bd6d5f" and "4891753215555b30d88f170539adabc7a9ece806" have entirely different histories.

10 changed files with 384 additions and 324 deletions

6
flake.lock generated
View file

@ -885,11 +885,11 @@
}, },
"nixpkgs_6": { "nixpkgs_6": {
"locked": { "locked": {
"lastModified": 1755186698, "lastModified": 1754725699,
"narHash": "sha256-wNO3+Ks2jZJ4nTHMuks+cxAiVBGNuEBXsT29Bz6HASo=", "narHash": "sha256-iAcj9T/Y+3DBy2J0N+yF9XQQQ8IEb5swLFzs23CdP88=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "fbcf476f790d8a217c3eab4e12033dc4a0f6d23c", "rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -1,17 +1,9 @@
{ pkgs, host, ... }: { pkgs, ... }:
{ {
virtualisation = { virtualisation = {
# vmware.host.enable = true; # Causes issues for now :p # vmware.host.enable = true; # Causes issues for now :p
waydroid.enable = if (host == "sakura") then true else false; waydroid.enable = true;
libvirtd.enable = libvirtd.enable = true;
if (host == "violet") then
true
else if (host == "sakura") then
true
else if (host == "yoshino") then
true
else
false;
spiceUSBRedirection.enable = true; spiceUSBRedirection.enable = true;
}; };

View file

@ -1,9 +1,4 @@
{ { pkgs, host, ... }:
pkgs,
host,
username,
...
}:
{ {
fonts.fontconfig.enable = true; fonts.fontconfig.enable = true;
home.packages = [ home.packages = [
@ -64,6 +59,7 @@
source = "~/nixos-config/modules/home/hyprland/displays.conf"; source = "~/nixos-config/modules/home/hyprland/displays.conf";
"debug:disable_scale_checks" = true; "debug:disable_scale_checks" = true;
# monitor = "eDP-1, 2256x1504@60, 0x0, 1.5";
monitor = monitor =
if (host == "sakura") then if (host == "sakura") then
"eDP-1, 2256x1504@60, 0x0, 1.5" "eDP-1, 2256x1504@60, 0x0, 1.5"
@ -219,7 +215,7 @@
"$mainMod, F, fullscreen, 0" # set 1 to 0 to set full screen without waybar "$mainMod, F, fullscreen, 0" # set 1 to 0 to set full screen without waybar
"$mainMod, Space, togglefloating," "$mainMod, Space, togglefloating,"
"$mainMod, D, exec, bemenu-run -l 5 --ignorecase" "$mainMod, D, exec, bemenu-run -l 5 --ignorecase"
"SUPER SHIFT, L, exec, swaylock --image /home/${username}/.local/share/bg.png" "SUPER SHIFT, L, exec, hyprlock"
"$mainMod, E, exec, thunar" "$mainMod, E, exec, thunar"
"$mainMod SHIFT, B, exec, pkill -SIGUSR1 .waybar-wrapped" "$mainMod SHIFT, B, exec, pkill -SIGUSR1 .waybar-wrapped"
"$mainMod, C,exec, hyprpicker -a" "$mainMod, C,exec, hyprpicker -a"

View file

@ -1,233 +1,381 @@
{ pkgs, username, ... }: { pkgs, username, ... }:
{ {
home = { home = {
packages = with pkgs; [ packages = with pkgs; [ swaynotificationcenter ];
swaynotificationcenter
wlogout
];
file."/home/${username}/.config/swaync/config.json".text = '' file."/home/${username}/.config/swaync/config.json".text = ''
{ {
"$schema": "/etc/xdg/swaync/configSchema.json", "positionX": "right",
"positionX": "right", "positionY": "top",
"positionY": "top", "layer": "overlay",
"layer": "overlay", "layer-shell": "true",
"layer-shell": true, "cssPriority": "application",
"cssPriority": "user", "control-center-margin-top": 10,
"control-center-margin-bottom": 10,
"control-center-width": 380, "control-center-margin-right": 10,
"control-center-height": 860, "control-center-margin-left": 10,
"control-center-margin-top": 8, "notification-icon-size": 64,
"control-center-margin-bottom": 8, "notification-body-image-height": 128,
"control-center-margin-right": 8, "notification-body-image-width": 200,
"control-center-margin-left": 8, "timeout": 10,
"timeout-low": 5,
"notification-window-width": 400, "timeout-critical": 0,
"notification-icon-size": 48, "fit-to-screen": true,
"notification-body-image-height": 160, "control-center-width": 400,
"notification-body-image-width": 200, "control-center-height": 650,
"notification-window-width": 350,
"widgets": ["buttons-grid", "title", "dnd", "notifications", "mpris"], "keyboard-shortcuts": true,
"widget-config": { "image-visibility": "when-available",
"title": { "transition-time": 200,
"text": "Notifications", "hide-on-clear": false,
"clear-all-button": true, "hide-on-action": true,
"button-text": "Clear All" "script-fail-notify": true,
}, "widgets": [
"dnd": { "title",
"text": "Do Not Disturb" "dnd",
}, "notifications"
"label": { ],
"max-lines": 1, "widget-config": {
"text": " " "title": {
}, "text": "Notifications",
"mpris": { "clear-all-button": true,
"image-size": 60, "button-text": " Clear all "
"image-radius": 12 },
}, "dnd": {
"buttons-grid": { "text": " Do not disturb"
"actions": [ },
{ }
"label": " ",
"command": "kitty -e nmtui-connect"
},
{
"label": "󰂯",
"command": "waybar-bluetooth toggle"
},
{
"label": "󰏘",
"command": "kitty -e walp"
},
{
"label": "",
"command": "wlogout"
}
]
}
}
} }
''; '';
file."/home/${username}/.config/swaync/style.css".text = '' file = {
@import "../../.cache/wal/colors-waybar.css"; "/home/${username}/.config/swaync/style.css".text = ''
* {
all: unset;
font-size: 14px;
font-family: "GohuFont 14 Nerd Font Mono";
transition: 200ms;
}
@define-color text @foreground; trough highlight {
@define-color bg @color1; background: #cdd6f4;
@define-color selected @color6; }
@define-color hover alpha(@selected, .4);
* { scale trough {
outline: none; margin: 0rem 1rem;
transition: 200ms; background-color: #313244;
padding: 1px; min-height: 8px;
background: transparent; min-width: 70px;
} }
.notification-row { slider {
outline: none; background-color: #89b4fa;
margin: 0; }
padding: 0px;
}
.notification-row .notification-background .close-button { .floating-notifications.background .notification-row .notification-background {
/* The notification Close Button */ box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.8), inset 0 0 0 1px #313244;
background: transparent; margin: 18px;
color: @text; background-color: #000000;
text-shadow: none; color: #cdd6f4;
box-shadow: none; padding: 0;
margin-top: 2px; }
margin-right: 2px;
padding: 0;
border: none;
border-radius: 100%;
min-width: 24px;
min-height: 24px;
}
.notification-row .notification-background .close-button:hover { .floating-notifications.background .notification-row .notification-background .notification {
box-shadow: none; padding: 7px;
background: transparent; }
transition: background 0.15s ease-in-out;
border: 0px;
}
.notification-row .notification-background .notification { .floating-notifications.background .notification-row .notification-background .notification.critical {
/* The actual notification */ box-shadow: inset 0 0 7px 0 #f38ba8;
background: transparent; }
}
.notification-group .notification-group-headers { .floating-notifications.background .notification-row .notification-background .notification .notification-content {
/* Notficiation Group Headers */ margin: 7px;
margin-top: 10px; }
margin-bottom: 10px;
}
.notification-group .notification-group-headers .notification-group-header { .floating-notifications.background .notification-row .notification-background .notification .notification-content .summary {
font-size: 20px; color: #cdd6f4;
margin-left: 3px; }
}
.notification-group.collapsed .notification-row .notification { .floating-notifications.background .notification-row .notification-background .notification .notification-content .time {
background: alpha(@background, 0.55); color: #a6adc8;
} }
.control-center { .floating-notifications.background .notification-row .notification-background .notification .notification-content .body {
/* The Control Center which contains the old notifications + widgets */ color: #cdd6f4;
margin: 18px; }
padding: 14px;
box-shadow: 0px 2px 5px black;
background: alpha(@background, 0.55);
border: 2px solid @selected;
}
.control-center-clear-all { .floating-notifications.background .notification-row .notification-background .notification > *:last-child > * {
/* Clear All button */ min-height: 3.4em;
background: transparent; }
padding: 5px;
}
.control-center-clear-all:hover { .floating-notifications.background .notification-row .notification-background .notification > *:last-child > * .notification-action {
background: @hover; color: #cdd6f4;
} background-color: #000000;
box-shadow: inset 0 0 0 1px #45475a;
margin: 7px;
}
.control-center-clear-all:active { .floating-notifications.background .notification-row .notification-background .notification > *:last-child > * .notification-action:hover {
background: @selected; box-shadow: inset 0 0 0 1px #45475a;
} background-color: #000000;
color: #cdd6f4;
}
/*** Widgets ***/ .floating-notifications.background .notification-row .notification-background .notification > *:last-child > * .notification-action:active {
/* Title widget */ box-shadow: inset 0 0 0 1px #45475a;
.widget-title { background-color: #000000;
background: transparent; color: #cdd6f4;
margin-top: 15px; }
margin-left: 15px;
margin-right: 15px;
}
/* Do Not Disturb widget */ .floating-notifications.background .notification-row .notification-background .close-button {
.widget-dnd { margin: 7px;
background: transparent; padding: 2px;
margin-left: 15px; color: #1e1e2e;
margin-right: 15px; background-color: #000000;
} }
.widget-dnd > switch { .floating-notifications.background .notification-row .notification-background .close-button:hover {
background: @bg; background-color: #000000;
font-size: initial; color: #1e1e2e;
border-radius: 12px; }
box-shadow: none;
padding: 2px;
}
/* Media Player widget */ .floating-notifications.background .notification-row .notification-background .close-button:active {
@define-color mpris-album-art-overlay rgba(0, 0, 0, 0.55); background-color: #000000;
@define-color mpris-button-hover rgba(0, 0, 0, 0.50); color: #1e1e2e;
}
.widget-mpris { .control-center {
} box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.8), inset 0 0 0 1px #313244;
margin: 18px;
background-color: #000000;
color: #cdd6f4;
padding: 14px;
}
.widget-mpris .widget-mpris-player { .control-center .widget-title > label {
padding: 10px; color: #cdd6f4;
margin: 8px 15px; font-size: 1.3em;
/* background-color: @mpris-album-art-overlay; */ }
box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.75);
border: 2px;
}
.widget-mpris .widget-mpris-player .widget-mpris-title { .control-center .widget-title button {
font-size: 16px; color: #cdd6f4;
} background-color: #313244;
box-shadow: inset 0 0 0 1px #45475a;
padding: 8px;
}
.widget-mpris .widget-mpris-player .widget-mpris-subtitle { .control-center .widget-title button:hover {
font-size: 14px; box-shadow: inset 0 0 0 1px #45475a;
} background-color: #585b70;
color: #cdd6f4;
}
/* Buttons widget */ .control-center .widget-title button:active {
.widget-buttons-grid { box-shadow: inset 0 0 0 1px #45475a;
/* background-color: alpha(@color2, 0.5); */ background-color: #74c7ec;
} color: #1e1e2e;
}
.widget-buttons-grid > flowbox > flowboxchild > button { .control-center .notification-row .notification-background {
/* background: alpha(@color2, 0.5); */ color: #cdd6f4;
/* border-radius: 12px; */ background-color: #313244;
min-width: 45px; box-shadow: inset 0 0 0 1px #45475a;
} margin-top: 14px;
}
.control-center .notification-row .notification-background .notification { .control-center .notification-row .notification-background .notification {
padding: 10px; padding: 7px;
} }
.floating-notifications.background .notification-row .notification-background .close-button { .control-center .notification-row .notification-background .notification.critical {
margin: 10px; box-shadow: inset 0 0 7px 0 #f38ba8;
padding: 2px; }
}
.floating-notifications.background .notification-row .notification-background { .control-center .notification-row .notification-background .notification .notification-content {
margin: 18px; margin: 7px;
padding: 0; }
}
.floating-notifications.background .notification-row .notification-background .notification { .control-center .notification-row .notification-background .notification .notification-content .summary {
padding: 7px; color: #cdd6f4;
} }
'';
.control-center .notification-row .notification-background .notification .notification-content .time {
color: #a6adc8;
}
.control-center .notification-row .notification-background .notification .notification-content .body {
color: #cdd6f4;
}
.control-center .notification-row .notification-background .notification > *:last-child > * {
min-height: 3.4em;
}
.control-center .notification-row .notification-background .notification > *:last-child > * .notification-action {
color: #cdd6f4;
background-color: #11111b;
box-shadow: inset 0 0 0 1px #45475a;
margin: 7px;
}
.control-center .notification-row .notification-background .notification > *:last-child > * .notification-action:hover {
box-shadow: inset 0 0 0 1px #45475a;
background-color: #313244;
color: #cdd6f4;
}
.control-center .notification-row .notification-background .notification > *:last-child > * .notification-action:active {
box-shadow: inset 0 0 0 1px #45475a;
background-color: #74c7ec;
color: #cdd6f4;
}
.control-center .notification-row .notification-background .close-button {
margin: 7px;
padding: 2px;
color: #1e1e2e;
background-color: #eba0ac;
}
.close-button {
}
.control-center .notification-row .notification-background .close-button:hover {
background-color: #f38ba8;
color: #1e1e2e;
}
.control-center .notification-row .notification-background .close-button:active {
background-color: #f38ba8;
color: #1e1e2e;
}
.control-center .notification-row .notification-background:hover {
box-shadow: inset 0 0 0 1px #45475a;
background-color: #7f849c;
color: #cdd6f4;
}
.control-center .notification-row .notification-background:active {
box-shadow: inset 0 0 0 1px #45475a;
background-color: #74c7ec;
color: #cdd6f4;
}
.notification.critical progress {
background-color: #f38ba8;
}
.notification.low progress,
.notification.normal progress {
background-color: #89b4fa;
}
.control-center-dnd {
margin-top: 5px;
background: #313244;
border: 1px solid #45475a;
box-shadow: none;
}
.control-center-dnd:checked {
background: #313244;
}
.control-center-dnd slider {
background: #45475a;
}
.widget-dnd {
margin: 0px;
font-size: 1.1rem;
}
.widget-dnd > switch {
font-size: initial;
background: #313244;
border: 1px solid #45475a;
box-shadow: none;
}
.widget-dnd > switch:checked {
background: #313244;
}
.widget-dnd > switch slider {
background: #45475a;
border: 1px solid #6c7086;
}
.widget-mpris .widget-mpris-player {
background: #313244;
padding: 7px;
}
.widget-mpris .widget-mpris-title {
font-size: 1.2rem;
}
.widget-mpris .widget-mpris-subtitle {
font-size: 0.8rem;
}
.widget-menubar > box > .menu-button-bar > button > label {
font-size: 3rem;
padding: 0.5rem 2rem;
}
.widget-menubar > box > .menu-button-bar > :last-child {
color: #f38ba8;
}
.power-buttons button:hover,
.powermode-buttons button:hover,
.screenshot-buttons button:hover {
background: #313244;
}
.control-center .widget-label > label {
color: #cdd6f4;
font-size: 2rem;
}
.widget-buttons-grid {
padding-top: 1rem;
}
.widget-buttons-grid > flowbox > flowboxchild > button label {
font-size: 2.5rem;
}
.widget-volume {
padding-top: 1rem;
}
.widget-volume label {
font-size: 1.5rem;
color: #74c7ec;
}
.widget-volume trough highlight {
background: #74c7ec;
}
.widget-backlight trough highlight {
background: #f9e2af;
}
.widget-backlight scale {
margin-right: 1rem;
}
.widget-backlight label {
font-size: 1.5rem;
color: #f9e2af;
}
.widget-backlight .KB {
padding-bottom: 1rem;
}
'';
};
}; };
} }

View file

@ -37,12 +37,6 @@ in
paths = [ paths = [
"/var/lib" "/var/lib"
]; ];
exclude = [
"/var/lib/matrix-synapse"
"/var/lib/mautrix-signal"
"/var/lib/mautrix-whatsapp"
"/var/lib/bitwarden_rs"
];
repo = "${baseRepo}/var-lib"; repo = "${baseRepo}/var-lib";
encryption.mode = "none"; encryption.mode = "none";
compression = "auto,zstd"; compression = "auto,zstd";

View file

@ -1,29 +0,0 @@
{
services = {
paperless = {
enable = true;
consumptionDirIsPublic = true;
settings = {
PAPERLESS_CONSUMER_IGNORE_PATTERN = [
".DS_STORE/*"
"desktop.ini"
];
PAPERLESS_OCR_LANGUAGE = "deu+eng+nld";
PAPERLESS_OCR_USER_ARGS = {
optimize = 1;
pdfa_image_compression = "lossless";
};
PAPERLESS_URL = "https://documents.liv.town";
};
};
nginx.virtualHosts."documents.liv.town" = {
forceSSL = true;
sslCertificate = "/var/lib/acme/liv.town/cert.pem";
sslCertificateKey = "/var/lib/acme/liv.town/key.pem";
locations."/" = {
proxyPass = "http://127.0.0.1:28981";
proxyWebsockets = true;
};
};
};
}

View file

@ -1,70 +1,34 @@
{ config, ... }:
{ {
config, services.vaultwarden = {
host, enable = true;
pkgs, dbBackend = "sqlite";
username, config = {
... SIGNUPS_ALLOWED = false;
}: ENABLE_WEBSOCKET = true;
let SENDS_ALLOWED = true;
baseRepo = "ssh://liv@dandelion:9123/spinners/rootvol/backups/${host}"; INVITATIONS_ENABLED = true;
in EMERGENCY_ACCESS_ALLOWED = true;
{ EMAIL_ACCESS_ALLOWED = true;
services = { DOMAIN = "https://passwords.liv.town";
vaultwarden = { ROCKET_ADDRESS = "0.0.0.0";
enable = true; ROCKET_PORT = 8003;
dbBackend = "sqlite";
config = {
SIGNUPS_ALLOWED = false;
ENABLE_WEBSOCKET = true;
SENDS_ALLOWED = true;
INVITATIONS_ENABLED = true;
EMERGENCY_ACCESS_ALLOWED = true;
EMAIL_ACCESS_ALLOWED = true;
DOMAIN = "https://passwords.liv.town";
ROCKET_ADDRESS = "0.0.0.0";
ROCKET_PORT = 8003;
};
}; };
nginx = { };
enable = true; services.nginx = {
recommendedProxySettings = true; enable = true;
recommendedTlsSettings = true; recommendedProxySettings = true;
virtualHosts = { recommendedTlsSettings = true;
"passwords.liv.town" = { virtualHosts = {
forceSSL = true; "passwords.liv.town" = {
sslCertificate = "/var/lib/acme/liv.town/cert.pem"; forceSSL = true;
sslCertificateKey = "/var/lib/acme/liv.town/key.pem"; sslCertificate = "/var/lib/acme/liv.town/cert.pem";
locations."/" = { sslCertificateKey = "/var/lib/acme/liv.town/key.pem";
proxyPass = "http://127.0.0.1:${toString config.services.vaultwarden.config.ROCKET_PORT}/"; locations."/" = {
proxyWebsockets = true; proxyPass = "http://127.0.0.1:${toString config.services.vaultwarden.config.ROCKET_PORT}/";
}; proxyWebsockets = true;
}; };
}; };
}; };
borgbackup.jobs."violet-vaultwarden" = {
paths = [ "/var/lib/bitwarden_rs" ];
repo = "${baseRepo}/var-vaultwarden";
encryption.mode = "none";
compression = "auto,zstd";
startAt = "daily";
preHook = ''
systemctl stop vaultwarden
'';
postHook = ''
systemctl start vaultwarden
if [ $exitStatus -eq 2 ]; then
${pkgs.ntfy-sh}/bin/ntfy send https://notify.liv.town/${host} "borgbackup: ${host} backup (vaultwarden) failed with errors"
else
${pkgs.ntfy-sh}/bin/ntfy send https://notify.liv.town/${host} "borgbackup: ${host} backup (vaultwarden) completed succesfully with exit status $exitStatus"
fi
'';
user = "root";
extraCreateArgs = [
"--stats"
];
environment = {
BORG_RSH = "ssh -p 9123 -i /home/${username}/.ssh/id_ed25519";
};
};
}; };
} }

View file

@ -7,7 +7,6 @@
++ [ (import ./binternet-proxy.nix) ] ++ [ (import ./binternet-proxy.nix) ]
++ [ (import ./bluemap-proxy.nix) ] ++ [ (import ./bluemap-proxy.nix) ]
++ [ (import ./docker.nix) ] ++ [ (import ./docker.nix) ]
++ [ (import ./email.nix) ]
++ [ (import ./forgejo.nix) ] ++ [ (import ./forgejo.nix) ]
++ [ (import ./grafana.nix) ] ++ [ (import ./grafana.nix) ]
++ [ (import ./guacamole.nix) ] ++ [ (import ./guacamole.nix) ]
@ -18,12 +17,9 @@
++ [ (import ./matrix/default.nix) ] ++ [ (import ./matrix/default.nix) ]
++ [ (import ./mumble.nix) ] ++ [ (import ./mumble.nix) ]
++ [ (import ./monitoring.nix) ] ++ [ (import ./monitoring.nix) ]
# ++ [ (import ./minio.nix) ]
# ++ [ (import ./nextcloud.nix) ]
++ [ (import ./ntfy.nix) ] ++ [ (import ./ntfy.nix) ]
++ [ (import ./nginx.nix) ] ++ [ (import ./nginx.nix) ]
++ [ (import ./nix-serve.nix) ] ++ [ (import ./nix-serve.nix) ]
++ [ (import ./paperless-ngx.nix) ]
++ [ (import ./radicale.nix) ] ++ [ (import ./radicale.nix) ]
++ [ (import ./remote-build.nix) ] ++ [ (import ./remote-build.nix) ]
++ [ (import ./readarr.nix) ] ++ [ (import ./readarr.nix) ]

View file

@ -26,7 +26,6 @@ in
element-desktop element-desktop
gajim gajim
signal-desktop signal-desktop
mumble
anki-bin anki-bin
obs-studio obs-studio
wdisplays wdisplays

View file

@ -22,7 +22,7 @@ sops:
S3pjSjlhZjZiSDBNakhLVzNKMjd3bWsKC2geLVXFp190lkjxtmZKq8aLN0XMNeAI S3pjSjlhZjZiSDBNakhLVzNKMjd3bWsKC2geLVXFp190lkjxtmZKq8aLN0XMNeAI
VqbwIY3a30iuWAaxqf8h1ZuCGJvbAZZBevFZraj9yktRHc54JV3Aww== VqbwIY3a30iuWAaxqf8h1ZuCGJvbAZZBevFZraj9yktRHc54JV3Aww==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
lastmodified: "2025-08-17T12:59:12Z" lastmodified: "2025-08-06T12:33:06Z"
mac: ENC[AES256_GCM,data:d0fls75JYsDd4QyF1lUi6CGinPJBRNOwgHg4fbnp40P/5rhGZsH8dL9+n2qQjCqEWPtBDbAGz0LYQ8T/VxaNHQwuvCX1Q1LCjlwbrZHEMLXNhd3VOa4b7e9k8+mgccLKDj52PlXSNxW+ATplZSTCMFnrBuDkfiW09gz8He8s8jo=,iv:v8XNLDFu1VhQ7A+CpimWJb95YvzRCWpgqRj6Uhx5wLU=,tag:kAg/NDen7VkMrOfV92SEkA==,type:str] mac: ENC[AES256_GCM,data:9U5QLQrk+61pIgfWSC468m7url0GGztamVlu0D74hSOf8iyLHiL1RHIKuB9t8Dk5bIGruVQE2zN8TZIHzktMofc1arSP69Zxl41EGNCyrm2uAyEguQelxZzRb/7bNe/Kkm6oLN1fQ8TJ1t7nyiTQCdbhl/wFZwSZxGemv7t8hKI=,iv:AEvP5cdOl0dX3o/0Zoy8112rqhE0cKNX8B5lyFEe6f4=,tag:LRqM5L3DB4Tyhe++4Hcqcw==,type:str]
unencrypted_suffix: _unencrypted unencrypted_suffix: _unencrypted
version: 3.10.2 version: 3.10.2