Compare commits

..

10 commits

28 changed files with 154 additions and 147 deletions

26
flake.lock generated
View file

@ -52,11 +52,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1762276996, "lastModified": 1764627417,
"narHash": "sha256-TtcPgPmp2f0FAnc+DMEw4ardEgv1SGNR3/WFGH0N19M=", "narHash": "sha256-D6xc3Rl8Ab6wucJWdvjNsGYGSxNjQHzRc2EZ6eeQ6l4=",
"owner": "nix-community", "owner": "nix-community",
"repo": "disko", "repo": "disko",
"rev": "af087d076d3860760b3323f6b583f4d828c1ac17", "rev": "5a88a6eceb8fd732b983e72b732f6f4b8269bef3",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -88,11 +88,11 @@
}, },
"nixos-hardware": { "nixos-hardware": {
"locked": { "locked": {
"lastModified": 1762847253, "lastModified": 1764440730,
"narHash": "sha256-BWWnUUT01lPwCWUvS0p6Px5UOBFeXJ8jR+ZdLX8IbrU=", "narHash": "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixos-hardware", "repo": "nixos-hardware",
"rev": "899dc449bc6428b9ee6b3b8f771ca2b0ef945ab9", "rev": "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -104,27 +104,27 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1763334038, "lastModified": 1764677808,
"narHash": "sha256-LBVOyaH6NFzQ3X/c6vfMZ9k4SV2ofhpxeL9YnhHNJQQ=", "narHash": "sha256-H3lC7knbXOBrHI9hITQ7modLuX20mYJVhZORL5ioms0=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "4c8cdd5b1a630e8f72c9dd9bf582b1afb3127d2c", "rev": "1aab89277eb2d87823d5b69bae631a2496cff57a",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "nixos",
"ref": "nixos-25.05", "ref": "nixos-25.11",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
}, },
"nixpkgs-unstable": { "nixpkgs-unstable": {
"locked": { "locked": {
"lastModified": 1763421233, "lastModified": 1764667669,
"narHash": "sha256-Stk9ZYRkGrnnpyJ4eqt9eQtdFWRRIvMxpNRf4sIegnw=", "narHash": "sha256-7WUCZfmqLAssbDqwg9cUDAXrSoXN79eEEq17qhTNM/Y=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "89c2b2330e733d6cdb5eae7b899326930c2c0648", "rev": "418468ac9527e799809c900eda37cbff999199b6",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -1,7 +1,7 @@
{ {
description = "nix los hier"; description = "nix los hier";
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable"; nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
nixos-hardware.url = "github:NixOS/nixos-hardware/master"; nixos-hardware.url = "github:NixOS/nixos-hardware/master";
agenix = { agenix = {
@ -31,7 +31,10 @@
{ system.stateVersion = state; } { system.stateVersion = state; }
agenix.nixosModules.default agenix.nixosModules.default
disko.nixosModules.disko disko.nixosModules.disko
{ environment.systemPackages = [ agenix.packages.${sys}.default ]; } {
nixpkgs.hostPlatform = nixpkgs.lib.mkDefault sys;
environment.systemPackages = [ agenix.packages.${sys}.default ];
}
]; ];
}; };
}; };
@ -40,7 +43,7 @@
nixosConfigurations = nixpkgs.lib.mergeAttrsList ( nixosConfigurations = nixpkgs.lib.mergeAttrsList (
nixpkgs.lib.forEach [ nixpkgs.lib.forEach [
[ "APPA" "x86_64-linux" "23.05" ] [ "APPA" "x86_64-linux" "23.05" ]
[ "MOMO" "x86_64-linux" "23.05" ] [ "MOMO" "aarch64-linux" "25.11" ]
[ "PABU" "x86_64-linux" "24.05" ] [ "PABU" "x86_64-linux" "24.05" ]
] (uncurry mkSystem) ] (uncurry mkSystem)
); );

View file

@ -21,58 +21,92 @@
{ {
domain = "dryb.org"; domain = "dryb.org";
answer = "192.168.2.40"; answer = "192.168.2.40";
enabled = true;
} }
{ {
domain = "speedport.ip"; domain = "speedport.ip";
answer = "192.168.2.1"; answer = "192.168.2.1";
enabled = true;
} }
{ {
domain = "speedport.dryb.org"; domain = "speedport.dryb.org";
answer = "192.168.2.1"; answer = "192.168.2.1";
enabled = true;
} }
{ {
domain = "tplink.dryb.org"; domain = "tplink.dryb.org";
answer = "192.168.2.30"; answer = "192.168.2.30";
enabled = true;
}
{
domain = "shell-server";
answer = "192.168.2.50";
enabled = true;
}
{
domain = "shell-infra";
answer = "192.168.2.51";
enabled = true;
}
{
domain = "shell-lamp";
answer = "192.168.2.52";
enabled = true;
} }
{ {
domain = "adguard.dryb.org"; domain = "adguard.dryb.org";
answer = "192.168.2.40"; answer = "192.168.2.40";
} enabled = true;
{
domain = config.services.gitea.settings.server.DOMAIN;
answer = "192.168.2.40";
} }
{ {
domain = config.services.nextcloud.hostName; domain = config.services.nextcloud.hostName;
answer = "192.168.2.40"; answer = "192.168.2.40";
enabled = true;
} }
{ {
domain = "anki.dryb.org"; domain = "anki.dryb.org";
answer = "192.168.2.40"; answer = "192.168.2.40";
enabled = true;
} }
{ {
domain = "paperless.dryb.org"; domain = "paperless.dryb.org";
answer = "192.168.2.40"; answer = "192.168.2.40";
enabled = true;
} }
{ {
domain = "jellyfin.dryb.org"; domain = "jellyfin.dryb.org";
answer = "192.168.2.40"; answer = "192.168.2.40";
enabled = true;
} }
{ {
domain = "momo.dryb.org"; domain = "momo.dryb.org";
answer = "188.245.216.128"; answer = "144.24.175.22";
enabled = true;
} }
{ {
domain = "momo.dryb.org"; domain = "git.dryb.org";
answer = "2a01:4f8:1c1e:8abc::1"; answer = "momo.dryb.org";
enabled = true;
} }
{ {
domain = "syncthing.dryb.org"; domain = "syncthing.dryb.org";
answer = "momo.dryb.org"; answer = "momo.dryb.org";
enabled = true;
} }
{ {
domain = "vaultwarden.dryb.org"; domain = "vaultwarden.dryb.org";
answer = "momo.dryb.org"; answer = "momo.dryb.org";
enabled = true;
}
{
domain = "miniflux.dryb.org";
answer = "momo.dryb.org";
enabled = true;
}
{
domain = "hedgedoc.dryb.org";
answer = "momo.dryb.org";
enabled = true;
} }
]; ];
}; };
@ -99,11 +133,7 @@
}; };
networking.firewall = { networking.firewall = {
allowedTCPPorts = [ 53 8080 ]; allowedTCPPorts = [ 53 ];
allowedUDPPorts = [ allowedUDPPorts = [ 53 67 547 ];
53
67
547
];
}; };
} }

View file

@ -4,7 +4,6 @@
./adguard-home.nix ./adguard-home.nix
./anki.nix ./anki.nix
./ddclient.nix ./ddclient.nix
./gitea.nix
./homepage-dashboard.nix ./homepage-dashboard.nix
./jellyfin.nix ./jellyfin.nix
./nextcloud.nix ./nextcloud.nix

View file

@ -1,28 +0,0 @@
{ config, ... }:
{
age.secrets.passwords-gitea-db = {
file = ../../../secrets/passwords/gitea/db.age;
mode = "640";
owner = config.services.gitea.user;
group = config.services.gitea.group;
};
services.gitea = {
enable = true;
appName = "dryb.org: Gitea Service";
database = {
type = "postgres";
passwordFile = config.age.secrets.passwords-gitea-db.path;
};
settings = {
server = rec {
HTTP_PORT = 8003;
DOMAIN = "git.dryb.org";
ROOT_URL = "http://${DOMAIN}/";
};
service = {
DISABLE_REGISTRATION = true;
};
};
};
}

View file

@ -2,6 +2,7 @@
services.homepage-dashboard = { services.homepage-dashboard = {
enable = true; enable = true;
listenPort = 8002; listenPort = 8002;
allowedHosts = "localhost:8002,127.0.0.1:8002,dryb.org";
settings = { settings = {
title = "dryb.org"; title = "dryb.org";
theme = "light"; theme = "light";
@ -79,11 +80,11 @@
}; };
} }
{ {
"Shelly Test" = { "Shelly Lamp" = {
description = "http://shelly-test.dryb.org (192.168.2.52)"; description = "http://shelly-lamp.dryb.org (192.168.2.52)";
href = "http://shelly-test.dryb.org"; href = "http://shelly-lamp.dryb.org";
icon = "shelly"; icon = "shelly";
ping = "shelly-test.dryb.org"; ping = "shelly-lamp.dryb.org";
}; };
} }
]; ];
@ -97,13 +98,6 @@
icon = "nextcloud"; icon = "nextcloud";
}; };
} }
{
"Gitea" = {
description = "https://git.dryb.org";
href = "https://git.dryb.org";
icon = "gitea";
};
}
{ {
"Anki" = { "Anki" = {
description = "https://anki.dryb.org"; description = "https://anki.dryb.org";

View file

@ -11,7 +11,7 @@
services.nextcloud = { services.nextcloud = {
enable = true; enable = true;
package = pkgs.nextcloud31; package = pkgs.nextcloud32;
https = true; https = true;
hostName = "nextcloud.dryb.org"; hostName = "nextcloud.dryb.org";
database.createLocally = true; database.createLocally = true;

View file

@ -28,13 +28,6 @@
useACMEHost = "dryb.org"; useACMEHost = "dryb.org";
forceSSL = true; forceSSL = true;
}; };
virtualHosts."${config.services.gitea.settings.server.DOMAIN}" = {
useACMEHost = "dryb.org";
forceSSL = true;
locations."/" = {
proxyPass = "http://127.0.0.1:8003";
};
};
virtualHosts."anki.dryb.org" = { virtualHosts."anki.dryb.org" = {
useACMEHost = "dryb.org"; useACMEHost = "dryb.org";
forceSSL = true; forceSSL = true;

View file

@ -4,7 +4,6 @@
services.postgresql = { services.postgresql = {
enable = true; enable = true;
ensureDatabases = [ ensureDatabases = [
config.services.gitea.user
config.services.paperless.user config.services.paperless.user
]; ];
@ -18,13 +17,11 @@
# type database DBuser auth-method mapping # type database DBuser auth-method mapping
authentication = '' authentication = ''
local all postgres peer local all postgres peer
local gitea all ident map=gitea-users
local paperless all ident map=paperless-users local paperless all ident map=paperless-users
''; '';
# name sysuser dbuser # name sysuser dbuser
identMap = '' identMap = ''
gitea-users gitea gitea
paperless-users paperless paperless paperless-users paperless paperless
''; '';
}; };

View file

@ -22,7 +22,9 @@
}; };
}; };
services.logind.lidSwitch = "ignore"; services.logind.settings.Login.HandleLidSwitch = "ignore";
boot.binfmt.emulatedSystems = [ "aarch64-linux" ];
users.groups.media = { }; users.groups.media = { };
systemd.tmpfiles.rules = [ "d /var/lib/media 2770 root media" ]; systemd.tmpfiles.rules = [ "d /var/lib/media 2770 root media" ];

View file

@ -7,13 +7,6 @@
../../modules ../../modules
]; ];
bchmnn = {
network = {
resolved.enable = true;
networkd.enable = true;
};
};
services.openssh = { services.openssh = {
settings = { settings = {
PasswordAuthentication = false; PasswordAuthentication = false;

View file

@ -44,25 +44,15 @@
}; };
root = { root = {
name = "ROOT"; name = "ROOT";
end = "-8G"; size = "100%";
content = { content = {
type = "filesystem"; type = "filesystem";
format = "ext4"; format = "ext4";
mountpoint = "/"; mountpoint = "/";
}; };
}; };
plainSwap = {
size = "100%";
content = {
type = "swap";
discardPolicy = "both";
}; };
}; };
}; };
}; };
};
};
networking.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
} }

View file

@ -1,22 +1,27 @@
{ ... }: { lib, ... }:
{ {
networking = { networking = {
hostName = "MOMO"; hostName = "MOMO";
interfaces.enp1s0 = { defaultGateway = "10.0.0.1";
ipv6.addresses = [ nameservers = [
"9.9.9.9"
"149.112.112.112"
"2620:fe::fe"
"2620:fe::9"
];
interfaces.enp0s6 = {
ipv4.addresses = [
{ {
address = "2a01:4f8:1c1e:8abc::1"; address = "10.0.0.183";
prefixLength = 64; prefixLength = 24;
} }
]; ];
}; };
defaultGateway6 = { defaultGateway6 = {
address = "fe80::1"; address = "fe80::1";
interface = "enp1s0"; interface = "enp0s6";
}; };
nameservers = [
"2a01:4ff:ff00::add:1"
"2a01:4ff:ff00::add:2"
];
}; };
networking.useDHCP = lib.mkDefault true;
} }

View file

@ -1,6 +1,7 @@
{ {
imports = [ imports = [
./acme.nix ./acme.nix
./forgejo.nix
./hedgedoc.nix ./hedgedoc.nix
./miniflux.nix ./miniflux.nix
./nginx.nix ./nginx.nix

View file

@ -0,0 +1,20 @@
{ config, ... }: {
services.forgejo = {
enable = true;
database = {
type = "postgres";
createDatabase = true;
};
settings = {
server = rec {
HTTP_PORT = 8003;
HTTP_ADDR = "127.0.0.1";
DOMAIN = "git.dryb.org";
ROOT_URL = "https://${DOMAIN}/";
};
service = {
DISABLE_REGISTRATION = true;
};
};
};
}

View file

@ -1,4 +1,4 @@
{ ... }: { config, ... }:
{ {
services.nginx = { services.nginx = {
enable = true; enable = true;
@ -8,11 +8,18 @@
recommendedProxySettings = true; recommendedProxySettings = true;
recommendedTlsSettings = true; recommendedTlsSettings = true;
virtualHosts."hedgedoc.dryb.org" = { virtualHosts."${config.services.forgejo.settings.server.DOMAIN}" = {
addSSL = true; addSSL = true;
enableACME = true; enableACME = true;
locations."/" = { locations."/" = {
proxyPass = "http://127.0.0.1:8009"; proxyPass = "http://127.0.0.1:8003";
};
};
virtualHosts."vaultwarden.dryb.org" = {
addSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://127.0.0.1:8005";
}; };
}; };
virtualHosts."miniflux.dryb.org" = { virtualHosts."miniflux.dryb.org" = {
@ -22,6 +29,13 @@
proxyPass = "http://127.0.0.1:8008"; proxyPass = "http://127.0.0.1:8008";
}; };
}; };
virtualHosts."hedgedoc.dryb.org" = {
addSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://127.0.0.1:8009";
};
};
virtualHosts."syncthing.dryb.org" = { virtualHosts."syncthing.dryb.org" = {
addSSL = true; addSSL = true;
enableACME = true; enableACME = true;
@ -29,13 +43,6 @@
proxyPass = "http://127.0.0.1:8384"; proxyPass = "http://127.0.0.1:8384";
}; };
}; };
virtualHosts."vaultwarden.dryb.org" = {
addSSL = true;
enableACME = true;
locations."/" = {
proxyPass = "http://127.0.0.1:8005";
};
};
}; };
networking.firewall = { networking.firewall = {

View file

@ -1,8 +1,11 @@
{ ... }: { { config, ... }: {
services.postgresql = { services.postgresql = {
enable = true; enable = true;
ensureDatabases = [ "vaultwarden" "hedgedoc" ]; ensureDatabases = [
"vaultwarden"
"hedgedoc"
];
ensureUsers = [ ensureUsers = [
{ {
@ -18,12 +21,14 @@
# type database DBuser auth-method mapping # type database DBuser auth-method mapping
authentication = '' authentication = ''
local all postgres peer local all postgres peer
local forgejo all ident map=forgejo-users
local vaultwarden all ident map=vaultwarden-users local vaultwarden all ident map=vaultwarden-users
local hedgedoc all ident map=hedgedoc-users local hedgedoc all ident map=hedgedoc-users
''; '';
# name sysuser dbuser # name sysuser dbuser
identMap = '' identMap = ''
forgejo-users forgejo forgejo
vaultwarden-users vaultwarden vaultwarden vaultwarden-users vaultwarden vaultwarden
hedgedoc-users hedgedoc hedgedoc hedgedoc-users hedgedoc hedgedoc
''; '';

View file

@ -30,7 +30,6 @@
# stuff # stuff
nixd nixd
nixfmt-rfc-style nixfmt-rfc-style
inputs.agenix.packages.x86_64-linux.default
nix-output-monitor nix-output-monitor
nvd nvd
]; ];

View file

@ -10,12 +10,6 @@
nm = { nm = {
enable = lib.mkEnableOption "nm"; enable = lib.mkEnableOption "nm";
}; };
resolved = {
enable = lib.mkEnableOption "resolved";
};
networkd = {
enable = lib.mkEnableOption "networkd";
};
}; };
}; };
config = { config = {

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,11 +1,11 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 lfMVeg ejjgNEnMOnPNlvp6kHNN4+FTaURnw/khEyk71q4pmX4 -> ssh-ed25519 lfMVeg sKw7P77Yj9ihIeOHoc02ZBEWJf79TK6DnrgB/486J0E
GO80ST5fOV2OggwXXnRxahancZJnSOE6XhKIzanf6xM YtZ7tkjnWH23rHN1XoWVvXIkCh9X5fTNXZq2sveiWCI
-> ssh-ed25519 ueRyzQ 4Wl+WB42XSsp6vplm22uAEeWP9TqxMcdmjlFGr7dCAo -> ssh-ed25519 ueRyzQ dVvsSHh6jrphQUAu3Rz74JoW0+I/ta4lEy1c4kxYywo
/IO0WGVrMQOaFq61E+xp9Lxdv2qRhvrabNV0UUqZ5QI 5bJw1bOwbxtdC63g74ey+4WDEXr55itKBhGF3jqxEyM
-> ssh-ed25519 IYnDOQ UM+pMKLlneDup00dYXRz3vIWY5LTbFRhpKE2KkT5RFM -> ssh-ed25519 IYnDOQ R4qlE6Tr56MrRz8LJlmsUyyMtOGnWK2n+UNpdiHr9Ac
2/c1gonJkrk5Cwngks/Ib+IVNOWSuJmX4YymwvYv4x8 kgCdfY+LRb7SGnx6trr7bE9oxku3XJoeVKnXpNMK5JY
--- fUKSKeqg8Y9qCdKg0lZpL1OPZDkRgnmsHo16owGX1nM -> ssh-ed25519 HDF3Lg s+ztnMwn83F4Fj4sTT7ejYxfKnjg5dPTMgoKLFOMHh8
ïÍn bPbOkHMseBCzExS7FURgVzQEp2iTT/is/FL9V2bw8nE
š3dì„k²G4ÿóÊÉ@QñHá6?,4Td"P ˆÿ ß`º| ;`ÖRŸgt¯ --- tDGtEh6zW4CoInvkAd5YPzGnv+erMiSyZcpkA9/H+6Q
]?‰M7Ó·úàÐþ<C390>Æ@•¢KäPÑt¶ ·T ÔŒ+üGZ@Ö“äx¾>5jjÊ•s?·šRè•ÙD¯µRVhx‰áIò 9‰Í¸ûøüTOE:Å/©xÕËÄXcJT Ž1c

View file

@ -1,9 +1,12 @@
age-encryption.org/v1 age-encryption.org/v1
-> ssh-ed25519 lfMVeg cuYTx24l4NmkI6j3/LXlK/7AoSmGn91bVwsALwyEeg8 -> ssh-ed25519 lfMVeg THPNrpb41SFy4x4+D3ZrMf8AuoRL8MQpn6DbCcEGgH4
u8kIquf9+b1D3pL2MWKk/uInbI+0IcNK7Cpe2fzmtFk Qbo7PCCPwGhaMyEa2gRjmaN6t3us6NfG78r5h98rpZo
-> ssh-ed25519 ueRyzQ Ee63Opci8c5srBzPKRLK3AF5SGwC6MqGcKbHS1hlwX4 -> ssh-ed25519 ueRyzQ jnoSbBMvEZAH/oHNqVr3T6ytyQ7/UQ/YCGzNy7a2YHI
2Sg/l9fADn6uFV2eRtV9cwluCGtateXR/fDF1n8+BLs 9wBXCDaemGH0qUnNYqoqU6BCsBLBzqEEFsICvrIqYLk
-> ssh-ed25519 IYnDOQ Fg5g+CIqJu08ApVV5zdPqXPvQ4PaC1MiYG2ANNEVMnE -> ssh-ed25519 IYnDOQ TQN80BmcNxz6vD6adPftf4oGkB1oQXU7HuWkKfGFpgs
8DjMqxmcutUDD455tQDtcA76dedfqicO0CoBpjaWssI P9FUyS+0muH8LUUDe2wqGY8gcIKyom6iuO9EqCGT1YM
--- H/6V7b1UEtCW0BbLpEwSm3T2M9kvYC/83wIKsDwZve8 -> ssh-ed25519 HDF3Lg V47k+SMUvuCCnsLXbhgicyFZERGXhRfJPFw0bHqZFHk
ù¶VÔxÌnËüfL´!÷ÁÛ€:àb¡Ã`ö罋,Ky“¡¼-hI¨O6<0F>êVD2XŒÍ&Vq@“? MkrS7g7R5NhoWvdXbJ4mx6ZgCq2ABUgsyq+KMLnLRd4
--- N3GpbRoA+uqRkbnLAIaihurobQRgiEWGAQSPCHH3V8M
Ü…º Èi
˜ùïÑœií¹®ŸkÃâé>‡o$ïƒñcÕ$mò~¼Ù¨z€Rø69³ÈkèþPoŒH8ßSf

View file

@ -1,6 +1,6 @@
let let
APPA = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGvQbYHiB17BfsvHBgPYJN50Th+da+rtbsTIjOSaT+1Y root@APPA"; APPA = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGvQbYHiB17BfsvHBgPYJN50Th+da+rtbsTIjOSaT+1Y root@APPA";
MOMO = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOQ8YOOaQj3NnMlTjlFX9iWDIpPMrO2W4EkL65GJP+y4 root@MOMO"; MOMO = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMHuXl/Llex0+xBmDJmJkwp4kT3mWRTfRPeyJDHgAJzM root@MOMO";
gandalf = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAOG8Sja2i6nepkEkuxYdu86XbT9vS5uniBmZifSMZ0t jacob.bachmann@posteo.de"; gandalf = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAOG8Sja2i6nepkEkuxYdu86XbT9vS5uniBmZifSMZ0t jacob.bachmann@posteo.de";