3 Commits

Author SHA1 Message Date
ahtlon
edddfc5e3f [nextcloud module] add wrapper example
Some checks failed
Check flake syntax / flake-check (push) Failing after 2m45s
2025-01-29 11:20:12 +01:00
ahtlon
e94410ca54 Fix #67
All checks were successful
Check flake syntax / flake-check (push) Successful in 4m21s
2025-01-28 12:19:53 +01:00
ahtlon
f7943d981b [nextcloud] add some attributes 2025-01-25 01:21:05 +01:00
8 changed files with 221 additions and 216 deletions

View File

@@ -26,7 +26,6 @@ in
malobeo.disks = { malobeo.disks = {
enable = true; enable = true;
legacy = true;
hostId = "a3c3102f"; hostId = "a3c3102f";
root = { root = {
disk0 = "disk/by-id/ata-HITACHI_HTS725016A9A364_110308PCKB04VNHX9XTJ"; disk0 = "disk/by-id/ata-HITACHI_HTS725016A9A364_110308PCKB04VNHX9XTJ";
@@ -34,7 +33,9 @@ in
}; };
malobeo.initssh = { malobeo.initssh = {
enable = false; enable = true;
authorizedKeys = sshKeys.admins;
ethernetDrivers = ["r8169"];
}; };
hardware.sane.enable = true; #scanner support hardware.sane.enable = true; #scanner support

View File

@@ -51,7 +51,6 @@ in
disk0 = "disk/by-id/ata-SAMSUNG_MZ7LN256HCHP-000L7_S20HNAAH200381"; disk0 = "disk/by-id/ata-SAMSUNG_MZ7LN256HCHP-000L7_S20HNAAH200381";
}; };
storage = { storage = {
enable = true;
disks = ["disk/by-id/wwn-0x50014ee265b53b60" "disk/by-id/wwn-0x50014ee2bb0a194a"]; disks = ["disk/by-id/wwn-0x50014ee265b53b60" "disk/by-id/wwn-0x50014ee2bb0a194a"];
mirror = true; mirror = true;
}; };
@@ -70,7 +69,8 @@ in
}; };
services.malobeo.microvm.enableHostBridge = true; services.malobeo.microvm.enableHostBridge = true;
services.malobeo.microvm.deployHosts = [ "overwatch" "infradocs" "nextcloud" "durruti" ]; services.malobeo.microvm.deployHosts = [ "overwatch" "infradocs" "durruti" ];
services.malobeo.microvm.client.nextcloud.enable = true;
networking = { networking = {
nat = { nat = {

View File

@@ -20,11 +20,6 @@ in
default = true; default = true;
description = "Allows encryption to be disabled for testing"; description = "Allows encryption to be disabled for testing";
}; };
legacy = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Enable legacy boot (bios)";
};
devNodes = lib.mkOption { devNodes = lib.mkOption {
type = lib.types.str; type = lib.types.str;
default = "/dev/disk/by-id/"; default = "/dev/disk/by-id/";
@@ -86,220 +81,198 @@ in
}; };
}; };
config = lib.mkMerge [ config = lib.mkIf cfg.enable {
(lib.mkIf (cfg.enable && !cfg.legacy) { networking.hostId = cfg.hostId;
boot = { disko.devices = {
loader.systemd-boot.enable = true; disk = lib.mkMerge [
loader.efi.canTouchEfiVariables = true; {
supportedFilesystems = [ "vfat" "zfs" ]; ssd0 = lib.mkIf (cfg.root.disk0 != "") {
}; type = "disk";
fileSystems."/boot".neededForBoot = true; device = "/dev/${cfg.root.disk0}";
}) content = {
(lib.mkIf (cfg.enable && cfg.legacy) { type = "gpt";
boot.loader.grub = { partitions = {
enable = lib.mkForce true; ESP = {
device = "/dev/${cfg.root.disk0}-part1"; size = "1024M";
efiSupport = false; type = "EF00";
enableCryptodisk = cfg.encryption;
zfsSupport = true;
};
})
(lib.mkIf cfg.enable {
networking.hostId = cfg.hostId;
disko.devices = {
disk = lib.mkMerge [
{
ssd0 = lib.mkIf (cfg.root.disk0 != "") {
type = "disk";
device = "/dev/${cfg.root.disk0}";
content = {
type = "gpt";
partitions = {
ESP = lib.mkIf (!cfg.legacy) {
size = "1024M";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
mountOptions = [ "umask=0077" ];
};
};
boot = lib.mkIf cfg.legacy {
size = "1024M";
type = "EF02";
};
encryptedSwap = {
size = cfg.root.swap;
content = {
type = "swap";
randomEncryption = true;
};
};
zfs = {
size = "100%";
content = {
type = "zfs";
pool = "zroot";
};
};
};
};
};
ssd1 = lib.mkIf (cfg.root.disk1 != "") {
type = "disk";
device = "/dev/${cfg.root.disk1}";
content = {
type = "gpt";
partitions = {
zfs = {
size = "100%";
content = {
type = "zfs";
pool = "zroot";
};
};
};
};
};
}
(lib.mkIf cfg.storage.enable (
lib.mkMerge (
map (diskname: {
"${diskname}" = {
type = "disk";
device = "/dev/${diskname}";
content = { content = {
type = "gpt"; type = "filesystem";
partitions = { format = "vfat";
zfs = { mountpoint = "/boot";
size = "100%"; mountOptions = [ "umask=0077" ];
content = { };
type = "zfs"; };
pool = "storage"; encryptedSwap = {
}; size = cfg.root.swap;
content = {
type = "swap";
randomEncryption = true;
};
};
zfs = {
size = "100%";
content = {
type = "zfs";
pool = "zroot";
};
};
};
};
};
ssd1 = lib.mkIf (cfg.root.disk1 != "") {
type = "disk";
device = "/dev/${cfg.root.disk1}";
content = {
type = "gpt";
partitions = {
zfs = {
size = "100%";
content = {
type = "zfs";
pool = "zroot";
};
};
};
};
};
}
(lib.mkIf cfg.storage.enable (
lib.mkMerge (
map (diskname: {
"${diskname}" = {
type = "disk";
device = "/dev/${diskname}";
content = {
type = "gpt";
partitions = {
zfs = {
size = "100%";
content = {
type = "zfs";
pool = "storage";
}; };
}; };
}; };
}; };
}) cfg.storage.disks };
) }) cfg.storage.disks
)) )
]; ))
];
zpool = { zpool = {
zroot = { zroot = {
type = "zpool"; type = "zpool";
mode = lib.mkIf cfg.root.mirror "mirror"; mode = lib.mkIf cfg.root.mirror "mirror";
# Workaround: cannot import 'zroot': I/O error in disko tests # Workaround: cannot import 'zroot': I/O error in disko tests
options.cachefile = "none"; options.cachefile = "none";
rootFsOptions = { rootFsOptions = {
mountpoint = "none"; mountpoint = "none";
xattr = "sa"; # für microvm virtiofs mount xattr = "sa"; # für microvm virtiofs mount
acltype = "posixacl"; # für microvm virtiofs mount acltype = "posixacl"; # für microvm virtiofs mount
compression = "zstd"; compression = "zstd";
"com.sun:auto-snapshot" = "false"; "com.sun:auto-snapshot" = "false";
};
datasets = {
encrypted = {
type = "zfs_fs";
options = {
mountpoint = "none";
encryption = lib.mkIf cfg.encryption "aes-256-gcm";
keyformat = lib.mkIf cfg.encryption "passphrase";
keylocation = lib.mkIf cfg.encryption "file:///tmp/secret.key";
};
# use this to read the key during boot
postCreateHook = lib.mkIf cfg.encryption ''
zfs set keylocation="prompt" zroot/encrypted;
'';
};
"encrypted/root" = {
type = "zfs_fs";
mountpoint = "/";
options.mountpoint = "legacy";
};
"encrypted/var" = {
type = "zfs_fs";
mountpoint = "/var";
options.mountpoint = "legacy";
};
"encrypted/etc" = {
type = "zfs_fs";
mountpoint = "/etc";
options.mountpoint = "legacy";
};
"encrypted/home" = {
type = "zfs_fs";
mountpoint = "/home";
options.mountpoint = "legacy";
};
"encrypted/nix" = {
type = "zfs_fs";
mountpoint = "/nix";
options.mountpoint = "legacy";
};
reserved = {
# for cow delete if pool is full
options = {
canmount = "off";
mountpoint = "none";
reservation = "${cfg.root.reservation}";
};
type = "zfs_fs";
};
};
}; };
storage = lib.mkIf cfg.storage.enable { datasets = {
type = "zpool"; encrypted = {
mode = lib.mkIf (cfg.storage.mirror) "mirror"; type = "zfs_fs";
rootFsOptions = { options = {
mountpoint = "none"; mountpoint = "none";
xattr = "sa"; # für microvm virtiofs mount encryption = lib.mkIf cfg.encryption "aes-256-gcm";
acltype = "posixacl"; # für microvm virtiofs mount keyformat = lib.mkIf cfg.encryption "passphrase";
keylocation = lib.mkIf cfg.encryption "file:///tmp/secret.key";
};
# use this to read the key during boot
postCreateHook = lib.mkIf cfg.encryption ''
zfs set keylocation="prompt" zroot/encrypted;
'';
}; };
datasets = { "encrypted/root" = {
encrypted = { type = "zfs_fs";
type = "zfs_fs"; mountpoint = "/";
options = { options.mountpoint = "legacy";
mountpoint = "none"; };
encryption = lib.mkIf cfg.encryption "aes-256-gcm"; "encrypted/var" = {
keyformat = lib.mkIf cfg.encryption "passphrase"; type = "zfs_fs";
keylocation = lib.mkIf cfg.encryption "file:///tmp/secret.key"; mountpoint = "/var";
}; options.mountpoint = "legacy";
# use this to read the key during boot };
postCreateHook = lib.mkIf cfg.encryption '' "encrypted/etc" = {
zfs set keylocation="file:///root/secret.key" storage/encrypted; type = "zfs_fs";
''; mountpoint = "/etc";
options.mountpoint = "legacy";
};
"encrypted/home" = {
type = "zfs_fs";
mountpoint = "/home";
options.mountpoint = "legacy";
};
"encrypted/nix" = {
type = "zfs_fs";
mountpoint = "/nix";
options.mountpoint = "legacy";
};
reserved = {
# for cow delete if pool is full
options = {
canmount = "off";
mountpoint = "none";
reservation = "${cfg.root.reservation}";
}; };
"encrypted/data" = { type = "zfs_fs";
type = "zfs_fs"; };
mountpoint = "/data"; };
};
storage = lib.mkIf cfg.storage.enable {
type = "zpool";
mode = lib.mkIf (cfg.storage.mirror) "mirror";
rootFsOptions = {
mountpoint = "none";
xattr = "sa"; # für microvm virtiofs mount
acltype = "posixacl"; # für microvm virtiofs mount
};
datasets = {
encrypted = {
type = "zfs_fs";
options = {
mountpoint = "none";
encryption = lib.mkIf cfg.encryption "aes-256-gcm";
keyformat = lib.mkIf cfg.encryption "passphrase";
keylocation = lib.mkIf cfg.encryption "file:///tmp/secret.key";
}; };
reserved = { # use this to read the key during boot
# for cow delete if pool is full postCreateHook = lib.mkIf cfg.encryption ''
options = { zfs set keylocation="file:///root/secret.key" storage/encrypted;
canmount = "off"; '';
mountpoint = "none"; };
reservation = "${cfg.storage.reservation}"; "encrypted/data" = {
}; type = "zfs_fs";
type = "zfs_fs"; mountpoint = "/data";
};
reserved = {
# for cow delete if pool is full
options = {
canmount = "off";
mountpoint = "none";
reservation = "${cfg.storage.reservation}";
}; };
type = "zfs_fs";
}; };
}; };
}; };
}; };
};
boot.zfs.devNodes = lib.mkDefault cfg.devNodes; boot.zfs.devNodes = lib.mkDefault cfg.devNodes;
boot.zfs.extraPools = lib.mkIf cfg.storage.enable [ "storage" ]; boot.zfs.extraPools = lib.mkIf cfg.storage.enable [ "storage" ];
fileSystems."/".neededForBoot = true;
fileSystems."/".neededForBoot = true; fileSystems."/etc".neededForBoot = true;
fileSystems."/etc".neededForBoot = true; fileSystems."/boot".neededForBoot = true;
fileSystems."/var".neededForBoot = true; fileSystems."/var".neededForBoot = true;
fileSystems."/home".neededForBoot = true; fileSystems."/home".neededForBoot = true;
fileSystems."/nix".neededForBoot = true; fileSystems."/nix".neededForBoot = true;
}) };
];
} }

View File

@@ -26,6 +26,9 @@ in
config = lib.mkIf (cfg.enable && config.malobeo.disks.encryption) { config = lib.mkIf (cfg.enable && config.malobeo.disks.encryption) {
boot = { boot = {
loader.systemd-boot.enable = true;
loader.efi.canTouchEfiVariables = true;
supportedFilesystems = [ "vfat" "zfs" ];
zfs = { zfs = {
requestEncryptionCredentials = true; requestEncryptionCredentials = true;
}; };

View File

@@ -0,0 +1,28 @@
{config, lib, pkgs, ...}:
let
cfg = config.services.malobeo.microvm.client;
in
{
options.services.malobeo.microvm.client = {
nextcloud = {
enable = lib.mkEnableOption "enable the nextcloud microvm wrapper";
datadir = lib.mkOption {
type = lib.types.string;
default = "/data/services/nextcloud/";
description = "set a custom datadir";
};
};
};
config = lib.mkMerge [
(lib.mkIf cfg.nextcloud.enable { #add check for run-vm?
services.malobeo.microvm.deployHosts = ["nextcloud"];
microvm.vms.nextcloud.config.microvm.shares = lib.mkAfter [{
source = cfg.datadir;
mountPoint = "/datadir";
tag = "nc-datadir";
proto = "virtiofs";
}];
})
];
}

View File

@@ -30,13 +30,6 @@
publicKey = "TrJ4UAF//zXdaLwZudI78L+rTC36zEDodTDOWNS4Y1Y="; publicKey = "TrJ4UAF//zXdaLwZudI78L+rTC36zEDodTDOWNS4Y1Y=";
}; };
"hetzner" = {
role = "client";
address = [ "10.100.0.6/24" ];
allowedIPs = [ "10.100.0.6/32" ];
publicKey = "csRzgwtnzmSLeLkSwTwEOrdKq55UOxZacR5D3GopCTQ=";
};
"fanny" = { "fanny" = {
role = "client"; role = "client";
address = [ "10.100.0.101/24" ]; address = [ "10.100.0.101/24" ];

View File

@@ -37,6 +37,7 @@ with lib;
hostName = "cloud.malobeo.org"; hostName = "cloud.malobeo.org";
config.adminpassFile = config.sops.secrets.nextcloudAdminPass.path; config.adminpassFile = config.sops.secrets.nextcloudAdminPass.path;
#https = true; #disable for testing #https = true; #disable for testing
datadir = "/datadir";
database.createLocally = true; database.createLocally = true;
config.dbtype = "pgsql"; config.dbtype = "pgsql";
configureRedis = true; configureRedis = true;
@@ -55,6 +56,12 @@ with lib;
}; };
settings = { settings = {
trusted_domains = ["10.0.0.13"]; trusted_domains = ["10.0.0.13"];
"maintenance_window_start" = "1";
"default_phone_region" = "DE";
};
phpOptions = {
"realpath_cache_size" = "0";
"opcache.interned_strings_buffer" = "23";
}; };
}; };

View File

@@ -108,7 +108,7 @@ in (utils.lib.eachSystem (builtins.filter filter_system utils.lib.defaultSystems
nixosModules.malobeo = { nixosModules.malobeo = {
host.imports = [ ./machines/durruti/host_config.nix ]; host.imports = [ ./machines/durruti/host_config.nix ];
microvm.imports = [ ./machines/modules/malobeo/microvm_host.nix ]; microvm.imports = [ ./machines/modules/malobeo/microvm_host.nix ./machines/modules/malobeo/microvm_client.nix];
vpn.imports = [ ./machines/modules/malobeo/wireguard.nix ]; vpn.imports = [ ./machines/modules/malobeo/wireguard.nix ];
initssh.imports = [ ./machines/modules/malobeo/initssh.nix ]; initssh.imports = [ ./machines/modules/malobeo/initssh.nix ];
metrics.imports = [ ./machines/modules/malobeo/metrics.nix ]; metrics.imports = [ ./machines/modules/malobeo/metrics.nix ];