Tons of changes, I guess?
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
hostname = config.instance.hostname;
|
||||
admins = config.instance.local-admins;
|
||||
domain = config.instance.local-domain;
|
||||
|
||||
gen-addrs = names: domain:
|
||||
map (name: "${name}@${domain}") names;
|
||||
|
||||
admin-addrs = gen-addrs admins domain;
|
||||
|
||||
in {
|
||||
config.fudo.mail-server.alias-users = {
|
||||
root = admin-addrs;
|
||||
postmaster = admin-addrs;
|
||||
www-data = admin-addrs;
|
||||
hostmaster = admin-addrs;
|
||||
webmaster = admin-addrs;
|
||||
ftp = admin-addrs;
|
||||
irc = admin-addrs;
|
||||
admin = admin-addrs;
|
||||
system = admin-addrs;
|
||||
|
||||
asdf = [ "mswaffer@gmail.com" "bouncetest@fudo.org" ];
|
||||
|
||||
network-info = [ "niten@fudo.org" ];
|
||||
};
|
||||
}
|
||||
+12
-12
@@ -1,16 +1,16 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
./bash.nix
|
||||
./common.nix
|
||||
./domains.nix
|
||||
./groups.nix
|
||||
./hosts.nix
|
||||
./networks.nix
|
||||
./profiles.nix
|
||||
./sites.nix
|
||||
./users.nix
|
||||
./wireless-networks.nix
|
||||
];
|
||||
imports = [
|
||||
./aliases.nix
|
||||
./bash.nix
|
||||
./common.nix
|
||||
./domains.nix
|
||||
./groups.nix
|
||||
./hosts.nix
|
||||
./networks.nix
|
||||
./sites.nix
|
||||
./users.nix
|
||||
./wireless-networks.nix
|
||||
];
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
|
||||
}
|
||||
+28
-3
@@ -3,7 +3,11 @@
|
||||
{
|
||||
config.fudo.domains = {
|
||||
"fudo.org" = {
|
||||
local-networks = [ "208.81.1.128/28" "208.81.3.112/28" ];
|
||||
local-networks = [
|
||||
"208.81.1.128/28"
|
||||
"208.81.3.112/28"
|
||||
"91.229.23.204/31"
|
||||
];
|
||||
|
||||
local-users = [ "niten" "reaper" ];
|
||||
local-groups = [ "fudo" "selby" "admin" ];
|
||||
@@ -13,7 +17,12 @@
|
||||
};
|
||||
|
||||
"sea.fudo.org" = {
|
||||
local-networks = [ "10.0.0.0/16" ];
|
||||
local-networks = [
|
||||
"10.0.0.0/16"
|
||||
"208.81.1.128/28"
|
||||
"208.81.3.112/28"
|
||||
|
||||
];
|
||||
|
||||
local-users = [ "niten" "reaper" "xiaoxuan" "ken" ];
|
||||
local-groups = [ "fudo" "selby" "admin" ];
|
||||
@@ -44,7 +53,9 @@
|
||||
};
|
||||
|
||||
"informis.land" = {
|
||||
local-networks = [ ];
|
||||
local-networks = [
|
||||
"172.86.179.17/29"
|
||||
];
|
||||
|
||||
local-users = [ "niten" "viator" ];
|
||||
local-groups = [ "admin" "informis" ];
|
||||
@@ -52,5 +63,19 @@
|
||||
admin-email = "viator@informis.land";
|
||||
gssapi-realm = "INFORMIS.LAND";
|
||||
};
|
||||
|
||||
eur.fudo.org = {
|
||||
local-networks = [
|
||||
"208.81.1.128/28"
|
||||
"208.81.3.112/28"
|
||||
"91.229.23.204/31"
|
||||
];
|
||||
|
||||
local-users = [ "niten"];
|
||||
local-groups = [ "admin" ];
|
||||
local-admins = [ "niten" ];
|
||||
admin-email = "nitenn@fudo.org";
|
||||
gssapi-realm = "FUDO.ORG";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -3,8 +3,15 @@
|
||||
{
|
||||
boot = {
|
||||
initrd = {
|
||||
availableKernelModules =
|
||||
[ "uhci_hcd" "ehci_pci" "ata_piix" "ahci" "floppy" "sd_mod" "sr_mod" ];
|
||||
availableKernelModules = [
|
||||
"uhci_hcd"
|
||||
"ehci_pci"
|
||||
"ata_piix"
|
||||
"ahci"
|
||||
"floppy"
|
||||
"sd_mod"
|
||||
"sr_mod"
|
||||
];
|
||||
kernelModules = [ "dm-snapshot" ];
|
||||
};
|
||||
|
||||
@@ -23,23 +30,27 @@
|
||||
"/boot" = {
|
||||
device = "/dev/disk/by-label/france-boot";
|
||||
fsType = "ext4";
|
||||
options = [ "noatime" "nodiratime" ];
|
||||
};
|
||||
|
||||
"/" = {
|
||||
device = "/dev/disk/by-label/france-root";
|
||||
fsType = "ext4";
|
||||
options = [ "noatime" "nodiratime" ];
|
||||
};
|
||||
|
||||
"/var/lib/lxd/storage-pools/pool0" = {
|
||||
device = "/dev/disk/by-label/pool0";
|
||||
fsType = "btrfs";
|
||||
label = "pool0";
|
||||
options = [ "noatime" "nodiratime" "noexec" ];
|
||||
};
|
||||
|
||||
"/var/lib/lxd/storage-pools/pool1" = {
|
||||
device = "/dev/france-user/fudo-user";
|
||||
fsType = "btrfs";
|
||||
label = "pool1";
|
||||
options = [ "noatime" "nodiratime" "noexec" ];
|
||||
};
|
||||
};
|
||||
|
||||
@@ -50,6 +61,8 @@
|
||||
hardware.bluetooth.enable = false;
|
||||
|
||||
networking = {
|
||||
useDHCP = false;
|
||||
|
||||
macvlans = {
|
||||
intif0 = {
|
||||
interface = "enp4s0f1";
|
||||
@@ -60,6 +73,11 @@
|
||||
interface = "enp4s0f0";
|
||||
mode = "bridge";
|
||||
};
|
||||
|
||||
# extif1 = {
|
||||
# interface = "enp4s0f0";
|
||||
# mode = "bridge";
|
||||
# };
|
||||
};
|
||||
|
||||
interfaces = {
|
||||
@@ -72,6 +90,11 @@
|
||||
# output of: echo france-extif0|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/'
|
||||
macAddress = "02:5e:ff:e4:83:e4";
|
||||
};
|
||||
|
||||
# extif1 = {
|
||||
# # output of: echo france-extif1|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/'
|
||||
# macAddress = "02:30:91:97:40:1f";
|
||||
# };
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib; {
|
||||
boot = {
|
||||
initrd = {
|
||||
availableKernelModules = [
|
||||
"ahci"
|
||||
"usbhid"
|
||||
];
|
||||
kernelModules = [ "dm-snapshot" ];
|
||||
};
|
||||
kernelModules = [ ];
|
||||
extraModulePackages = [ ];
|
||||
loader.grub = {
|
||||
enable = true;
|
||||
version = 2;
|
||||
device = "/dev/sda";
|
||||
};
|
||||
|
||||
supportedFilesystems = [ "btrfs" ];
|
||||
};
|
||||
|
||||
fileSystems = {
|
||||
"/" = {
|
||||
device = "root-tmpfs";
|
||||
fsType = "tmpfs";
|
||||
options = [ "mode=755" "noexec" ];
|
||||
};
|
||||
|
||||
"/boot" = {
|
||||
device = "/dev/disk/by-label/boot";
|
||||
fsType = "ext4";
|
||||
options = [ "noexec" "noatime" "nodiratime" ];
|
||||
};
|
||||
|
||||
"/nix" = {
|
||||
device = "/dev/disk/by-label/system";
|
||||
fsType = "btrfs";
|
||||
options = [ "subvol=@nix" "compress=zstd" "noatime" "nodiratime" ];
|
||||
};
|
||||
|
||||
"/var/log" = {
|
||||
device = "/dev/disk/by-label/system";
|
||||
fsType = "btrfs";
|
||||
options = [ "subvol=@logs" "compress=zstd" "noatime" "nodiratime" "noexec" ];
|
||||
neededForBoot = true;
|
||||
};
|
||||
|
||||
"/state" = {
|
||||
device = "/dev/disk/by-label/system";
|
||||
fsType = "btrfs";
|
||||
options = [ "subvol=@state" "compress=zstd" "noatime" "nodiratime" "noexec" ];
|
||||
};
|
||||
};
|
||||
|
||||
swapDevices = [{ device = "/dev/disk/by-label/swap"; }];
|
||||
|
||||
networking = {
|
||||
macvlans = {
|
||||
extif0 = {
|
||||
interface = "eno2";
|
||||
mode = "bridge";
|
||||
};
|
||||
};
|
||||
|
||||
useDHCP = false;
|
||||
|
||||
interfaces = {
|
||||
extif0 = {
|
||||
# output of: echo legatus-extif0|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/'
|
||||
macAddress = pkgs.lib.fudo.network.generate-mac-address "legatus" "extif0";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
|
||||
}
|
||||
@@ -71,6 +71,7 @@
|
||||
device = "/dev/disk/by-label/socrates-data";
|
||||
fsType = "btrfs";
|
||||
options = [ "subvol=@log" "compress=zstd" "noatime" "nodiratime" "noexec" ];
|
||||
neededForBoot = true;
|
||||
};
|
||||
|
||||
"/state" = {
|
||||
|
||||
+112
-44
@@ -9,6 +9,7 @@ let
|
||||
domain = config.fudo.domains.${domain-name};
|
||||
host-fqdn = "${hostname}.${domain-name}";
|
||||
mail-hostname = "mail.fudo.org";
|
||||
mail-directory = "/srv/mail";
|
||||
|
||||
secrets = config.fudo.secrets.host-secrets.france;
|
||||
secret-files = config.fudo.secrets.files;
|
||||
@@ -37,14 +38,73 @@ in {
|
||||
config = {
|
||||
security.acme.email = "admin@fudo.org";
|
||||
|
||||
fudo = {
|
||||
fileSystems = {
|
||||
"/srv/archiva" = {
|
||||
fsType = "btrfs";
|
||||
label = "pool0";
|
||||
options = [ "noatime" "nodiratime" "noexec" "subvol=archiva" ];
|
||||
};
|
||||
|
||||
"/srv/grafana" = {
|
||||
fsType = "btrfs";
|
||||
label = "pool0";
|
||||
options = [ "noatime" "nodiratime" "noexec" "subvol=grafana" ];
|
||||
};
|
||||
|
||||
"/srv/gitlab" = {
|
||||
fsType = "btrfs";
|
||||
label = "pool0";
|
||||
options = [ "noatime" "nodiratime" "noexec" "subvol=grafana" ];
|
||||
};
|
||||
|
||||
${mail-directory} = {
|
||||
fsType = "btrfs";
|
||||
label = "pool0";
|
||||
options = [ "noatime" "nodiratime" "noexec" "subvol=mail" ];
|
||||
};
|
||||
};
|
||||
|
||||
users.users.archiva = {
|
||||
isSystemUser = true;
|
||||
group = "nogroup";
|
||||
};
|
||||
|
||||
virtualisation = {
|
||||
lxd.enable = true;
|
||||
|
||||
oci-containers = {
|
||||
backend = "docker";
|
||||
|
||||
containers = {
|
||||
archiva = {
|
||||
image = "xetusoss/archiva";
|
||||
autoStart = true;
|
||||
ports = [ "8001:8080/tcp" ];
|
||||
# Ugly: name-to-uid lookup fails.
|
||||
user = toString config.users.users.archiva.uid;
|
||||
volumes = [ "/srv/archiva:/archiva-data" ];
|
||||
environment = {
|
||||
# Not directly connected to the world anyway
|
||||
SSL_ENABLED = "false";
|
||||
PROXY_BASE_URL = "https://archiva.fudo.org/";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
fudo = let
|
||||
backplane-dns-password-file = pkgs.lib.fudo.passwd.stablerandom-passwd-file
|
||||
"dns-service-backplane-passwd"
|
||||
"dns-service-backplane-passwd-${config.instance.build-seed}";
|
||||
in {
|
||||
hosts.france.external-interfaces = [ "extif0" ];
|
||||
|
||||
acme.host-domains.france."france.fudo.org" = {
|
||||
email = "admin@fudo.org";
|
||||
local-copies = {
|
||||
postgres = {
|
||||
user = config.services.postgresql.user;
|
||||
user = "postgres";
|
||||
};
|
||||
openldap = {
|
||||
user = config.services.openldap.user;
|
||||
@@ -56,26 +116,6 @@ in {
|
||||
ldap-user = config.services.openldap.user;
|
||||
ldap-group = config.services.openldap.group;
|
||||
in {
|
||||
ldap-ssl-certificate = {
|
||||
source-file = cfg.ssl-certificate;
|
||||
target-file = "/run/openldap/ssl-certificate.pem";
|
||||
user = ldap-user;
|
||||
group = ldap-group;
|
||||
permissions = "0444";
|
||||
};
|
||||
ldap-ssl-private-key = {
|
||||
source-file = cfg.ssl-private-key;
|
||||
target-file = "/run/openldap/ssl-private-key.pem";
|
||||
user = ldap-user;
|
||||
group = ldap-group;
|
||||
};
|
||||
ldap-ssl-ca-certificate = {
|
||||
source-file = cfg.ssl-ca-certificate;
|
||||
target-file = "/run/openldap/ssl-ca-certificate.pem";
|
||||
user = ldap-user;
|
||||
group = ldap-group;
|
||||
permissions = "0444";
|
||||
};
|
||||
ldap-keytab = {
|
||||
source-file = secret-files.service-keytabs.france.ldap;
|
||||
target-file = "/run/openldap/ldap.keytab";
|
||||
@@ -83,7 +123,8 @@ in {
|
||||
group = ldap-group;
|
||||
};
|
||||
ldap-root-passwd = {
|
||||
source-file = passwd.random-passwd-file;
|
||||
source-file =
|
||||
pkgs.lib.fudo.passwd.random-passwd-file "ldap-root-passwd" 20;
|
||||
target-file = "/run/openldap/root.passwd";
|
||||
user = ldap-user;
|
||||
group = ldap-group;
|
||||
@@ -91,7 +132,12 @@ in {
|
||||
postgres-keytab = {
|
||||
source-file = secret-files.service-keytabs.france.postgres;
|
||||
target-file = "/run/postgres/postgres.keytab";
|
||||
user = config.services.postgresql.user;
|
||||
user = "postgres"; # This is just plain hard-coded...
|
||||
};
|
||||
backplane-dns-password = {
|
||||
source-file = backplane-dns-password-file;
|
||||
target-file = "/run/backplane/dns/xmpp.passwd";
|
||||
user = config.fudo.backplane.dns.user;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -117,34 +163,34 @@ in {
|
||||
|
||||
kdc = {
|
||||
state-directory = "/state/kerberos";
|
||||
master-key-file = "";
|
||||
master-key-file = secret-files.realm-master-keys."FUDO.ORG";
|
||||
listen-ips = [ primary-ip "127.0.0.1" "127.0.1.1" "::1" ];
|
||||
};
|
||||
|
||||
jabber = {
|
||||
ldap-servers = [ "france.fudo.org" ];
|
||||
listen-ips = [ primary-ip ];
|
||||
};
|
||||
|
||||
backplane = {
|
||||
host-passwd-files = let
|
||||
hosts = attrNames config.fudo.hosts;
|
||||
in mapAttrs (hostname: hostOpts: hostOpts.backplane-password-file)
|
||||
config.fudo.hosts;
|
||||
service-passwd-files = genAttrs [ "dns" ]
|
||||
(service-name:
|
||||
lib.fudo.passwd.stablerandom-passwd-file
|
||||
"${service-name}-service-backplane-passwd"
|
||||
"${service-name}-service-backplane-passwd-${config.instance.build-seed}");
|
||||
backplane = {
|
||||
host-passwd-files = let
|
||||
hosts = attrNames config.fudo.hosts;
|
||||
in mapAttrs (hostname: hostOpts: hostOpts.backplane-password-file)
|
||||
config.fudo.hosts;
|
||||
service-passwd-files = {
|
||||
dns = backplane-dns-password-file;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
backplane-server = {
|
||||
listen-ips = [ primary-ip ];
|
||||
backplane-dns-password-file =
|
||||
secrets.backplane-dns-password.target-file;
|
||||
};
|
||||
|
||||
mail = {
|
||||
mail-directory = "/srv/mail/mailboxes";
|
||||
state-directory = "/srv/mail/var";
|
||||
mail-directory = "${mail-directory}/mailboxes";
|
||||
state-directory = "${mail-directory}/var";
|
||||
ldap-server-urls = [
|
||||
"ldap://france.fudo.org"
|
||||
];
|
||||
@@ -169,6 +215,18 @@ in {
|
||||
ssl-certificate = cert-copy.certificate;
|
||||
ssl-private-key = cert-copy.private-key;
|
||||
};
|
||||
|
||||
dns = {
|
||||
default-host = primary-ip;
|
||||
listen-ip = primary-ip;
|
||||
mail-hosts = [ "mail.fudo.org" ];
|
||||
};
|
||||
|
||||
chat = {
|
||||
chat-hostname = "chat.fudo.org";
|
||||
mail-server = "mail.fudo.org";
|
||||
database-host = "localhost";
|
||||
};
|
||||
};
|
||||
|
||||
minecraft-server = {
|
||||
@@ -181,8 +239,6 @@ in {
|
||||
};
|
||||
|
||||
networking = {
|
||||
useDHCP = false;
|
||||
|
||||
interfaces = {
|
||||
intif0 = {
|
||||
ipv4.addresses = [{
|
||||
@@ -196,10 +252,6 @@ in {
|
||||
address = primary-ip;
|
||||
prefixLength = 28;
|
||||
}
|
||||
{
|
||||
address = git-server-ip;
|
||||
prefixLength = 32;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
@@ -218,6 +270,22 @@ in {
|
||||
enableACME = true;
|
||||
locations."/".return = "301 https://webmail.fudo.org$request_uri";
|
||||
};
|
||||
|
||||
"archiva.fudo.org" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
|
||||
locations."/" = {
|
||||
proxyPass = "http://127.0.0.1:8001";
|
||||
extraConfig = ''
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-By $server_addr:$server_port;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -11,8 +11,6 @@ let
|
||||
concatGenAttrs = lst: f:
|
||||
foldr (a0: a1: a0 // a1) {} (map f lst);
|
||||
|
||||
passwd = import ../../../lib/passwd.nix { inherit lib; };
|
||||
|
||||
secrets = config.fudo.secrets.host-secrets.${hostname};
|
||||
|
||||
cfg = config.fudo.france;
|
||||
@@ -69,45 +67,47 @@ in {
|
||||
user = config.fudo.auth.kdc.user;
|
||||
};
|
||||
|
||||
auth = {
|
||||
ldap-server = {
|
||||
enable = true;
|
||||
base = "dc=fudo,dc=org";
|
||||
organization = "Fudo";
|
||||
rootpw-file = cfg.ldap.root-password-file;
|
||||
kerberos-host = fqdn;
|
||||
kerberos-keytab = cfg.ldap.keytab;
|
||||
ssl-certificate = cfg.ldap.ssl-certificate;
|
||||
ssl-private-key = cfg.ldap.ssl-private-key;
|
||||
ssl-ca-certificate = cfg.ldap.ssl-ca-certificate;
|
||||
# auth = {
|
||||
# ldap-server = {
|
||||
# enable = true;
|
||||
# base = "dc=fudo,dc=org";
|
||||
# organization = "Fudo";
|
||||
# rootpw-file = cfg.ldap.root-password-file;
|
||||
# kerberos-host = fqdn;
|
||||
# kerberos-keytab = cfg.ldap.keytab;
|
||||
# ssl-certificate = cfg.ldap.ssl-certificate;
|
||||
# ssl-private-key = cfg.ldap.ssl-private-key;
|
||||
# ssl-ca-certificate = cfg.ldap.ssl-ca-certificate;
|
||||
|
||||
listen-uris = [ "ldap:///" "ldaps:///" "ldapi:///" ];
|
||||
# listen-uris = [ "ldap:///" "ldaps:///" "ldapi:///" ];
|
||||
|
||||
users = config.fudo.users;
|
||||
groups = config.fudo.groups;
|
||||
system-users = config.fudo.system-users;
|
||||
};
|
||||
# users = config.fudo.users;
|
||||
# groups = config.fudo.groups;
|
||||
# system-users = config.fudo.system-users;
|
||||
|
||||
# TODO: let build hosts create keys?
|
||||
kdc = {
|
||||
enable = true;
|
||||
realm = config.fudo.domains.${domain-name}.gssapi-realm;
|
||||
state-directory = cfg.kdc.state-directory;
|
||||
master-key-file = secrets.kdc-master-key.target-file;
|
||||
acl = let
|
||||
admin-entries = concatGenAttrs
|
||||
config.instance.local-admins
|
||||
(admin: {
|
||||
"${admin}" = { perms = [ "add" "list" "change-password" ]; };
|
||||
"${admin}/root" = { perms = [ "all" ]; };
|
||||
});
|
||||
in {
|
||||
"host/*.fudo.org" = { perms = [ "add" ]; };
|
||||
"pam_migrate/*.fudo.org" = { perms = [ "add" "change-password" ]; };
|
||||
} // admin-entries;
|
||||
bind-addresses = cfg.kdc.listen-ips;
|
||||
};
|
||||
};
|
||||
# database-directory = "/state/openldap";
|
||||
# };
|
||||
|
||||
# # TODO: let build hosts create keys?
|
||||
# kdc = {
|
||||
# enable = true;
|
||||
# realm = config.fudo.domains.${domain-name}.gssapi-realm;
|
||||
# state-directory = cfg.kdc.state-directory;
|
||||
# master-key-file = secrets.kdc-master-key.target-file;
|
||||
# acl = let
|
||||
# admin-entries = concatGenAttrs
|
||||
# config.instance.local-admins
|
||||
# (admin: {
|
||||
# "${admin}" = { perms = [ "add" "list" "change-password" ]; };
|
||||
# "${admin}/root" = { perms = [ "all" ]; };
|
||||
# });
|
||||
# in {
|
||||
# "host/*.fudo.org" = { perms = [ "add" ]; };
|
||||
# "pam_migrate/*.fudo.org" = { perms = [ "add" "change-password" ]; };
|
||||
# } // admin-entries;
|
||||
# bind-addresses = cfg.kdc.listen-ips;
|
||||
# };
|
||||
# };o
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -10,14 +10,12 @@ let
|
||||
backplane-dns-user = "backplane-dns";
|
||||
|
||||
generate-role-passwd = role:
|
||||
lib.fudo.passwd.stablerandom-password-file
|
||||
pkgs.lib.fudo.passwd.stablerandom-passwd-file
|
||||
"backplane-${role}-password"
|
||||
"${hostname}-${domain}-${role}-password-${config.instance.build-timestamp}";
|
||||
"${hostname}-${domain}-${role}-password-${config.instance.build-seed}";
|
||||
|
||||
powerdns-password = generate-role-passwd "powerdns-db";
|
||||
|
||||
backplane-dns-xmpp-password = generate-role-passwd "backplane-dns-xmpp";
|
||||
|
||||
backplane-dns-db-password = generate-role-passwd "backplane-dns-db";
|
||||
|
||||
secrets = config.fudo.secrets.host-secrets.france;
|
||||
@@ -36,6 +34,11 @@ in {
|
||||
description = "List of IPv6s on which to listen for incoming backplane connections.";
|
||||
default = [];
|
||||
};
|
||||
|
||||
backplane-dns-password-file = mkOption {
|
||||
type = str;
|
||||
description = "Path to file containing the password for connecting to the XMPP backplane.";
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
@@ -64,19 +67,13 @@ in {
|
||||
powerdns-password = {
|
||||
source-file = powerdns-password;
|
||||
target-file = "/run/backplane/dns/powerdns/db.passwd";
|
||||
user = config.fudo.backplane.dns.database.user;
|
||||
user = config.fudo.backplane.dns.powerdns.user;
|
||||
};
|
||||
|
||||
backplane-dns-db-password = {
|
||||
source-file = backplane-dns-db-password;
|
||||
target-file = "/run/backplane/dns/db.passwd";
|
||||
user = config.fudo.backplane.dns.backplane.user;
|
||||
};
|
||||
|
||||
backplane-dns-xmpp-password = {
|
||||
source-file = backplane-dns-db-password;
|
||||
target-file = "/run/backplane/dns/xmpp.passwd";
|
||||
user = config.fudo.backplane.dns.backplane.user;
|
||||
user = config.fudo.backplane.dns.user;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -98,7 +95,7 @@ in {
|
||||
};
|
||||
};
|
||||
${backplane-dns-user} = {
|
||||
password-file = secrets.backplane-dns-db-password;
|
||||
password-file = secrets.backplane-dns-db-password.target-file;
|
||||
databases = {
|
||||
backplane_dns = {
|
||||
access = "CONNECT";
|
||||
@@ -134,7 +131,7 @@ in {
|
||||
backplane = {
|
||||
host = "backplane.fudo.org";
|
||||
role = "service-dns";
|
||||
password-file = secrets.backplane-dns-xmpp-password.target-file;
|
||||
password-file = cfg.backplane-dns-password-file;
|
||||
database = {
|
||||
username = backplane-dns-user;
|
||||
database = backplane-dns-user;
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
{
|
||||
options.fudo.france.chat = with types; {
|
||||
chat-hostname = mkOption {
|
||||
type = str;
|
||||
description = "Hostname of the chat server.";
|
||||
};
|
||||
|
||||
mail-server = mkOption {
|
||||
type = str;
|
||||
description = "Email server to use for communication.";
|
||||
};
|
||||
|
||||
database-host = mkOption {
|
||||
type = str;
|
||||
description = "Hostname of the database server.";
|
||||
};
|
||||
};
|
||||
|
||||
config = let
|
||||
hostname = config.instance.hostname;
|
||||
|
||||
cfg = config.fudo.france.chat;
|
||||
|
||||
secrets = config.fudo.secrets.host-secrets.${hostname};
|
||||
|
||||
in {
|
||||
fudo = {
|
||||
secrets.host-secrets.${hostname} = {
|
||||
mattermost-mail-password = {
|
||||
source-file = pkgs.lib.fudo.passwd.stablerandom-passwd-file
|
||||
"mattermost-mail-password"
|
||||
"${hostname}-mattermost-mail-password-${config.instance.build-seed}";
|
||||
target-file = "/run/chat/mattermost/mail.passwd";
|
||||
user = config.services.mattermost.user;
|
||||
};
|
||||
|
||||
mattermost-db-password = {
|
||||
source-file = pkgs.lib.fudo.passwd.stablerandom-passwd-file
|
||||
"mattermost-db-password"
|
||||
"${hostname}-mattermost-db-password-${config.instance.build-seed}";
|
||||
target-file = "/run/chat/mattermost/database.passwd";
|
||||
user = config.services.mattermost.user;
|
||||
};
|
||||
};
|
||||
|
||||
users.fudo-chat = {
|
||||
uid = 20001;
|
||||
primary-group = "fudo";
|
||||
common-name = "Fudo Chat";
|
||||
ldap-hashed-passwd =
|
||||
pkgs.lib.fudo.passwd.hash-ldap-passwd "mattermost-chat"
|
||||
secrets.mattermost-mail-password.source-file;
|
||||
};
|
||||
|
||||
postgresql = {
|
||||
databases.mattermost.users =
|
||||
config.instance.local-admins;
|
||||
|
||||
users.mattermost = {
|
||||
password-file =
|
||||
secrets.mattermost-db-password.target-file;
|
||||
databases = {
|
||||
mattermost = {
|
||||
access = "CONNECT";
|
||||
entity-access = {
|
||||
"ALL TABLES IN SCHEMA public" =
|
||||
"SELECT,INSERT,UPDATE,DELETE";
|
||||
"ALL SEQUENCES IN SCHEMA public" =
|
||||
"SELECT,UPDATE";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
chat = {
|
||||
enable = true;
|
||||
|
||||
hostname = cfg.chat-hostname;
|
||||
site-name = "Fudo Chat";
|
||||
smtp = {
|
||||
server = cfg.mail-server;
|
||||
user = "fudo-chat";
|
||||
password-file = secrets.mattermost-mail-password.target-file;
|
||||
};
|
||||
database = {
|
||||
name = "mattermost";
|
||||
hostname = cfg.database-host;
|
||||
user = "mattermost";
|
||||
password-file = secrets.mattermost-db-password.target-file;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
let
|
||||
hostname = config.instance.hostname;
|
||||
|
||||
cfg = config.fudo.france.dns;
|
||||
|
||||
in {
|
||||
options.fudo.france.dns = with types; {
|
||||
default-host = mkOption {
|
||||
type = str;
|
||||
description = "IP address to which the domain will map.";
|
||||
};
|
||||
|
||||
listen-ip = mkOption {
|
||||
type = str;
|
||||
description = "IP addresses on which to listen";
|
||||
};
|
||||
|
||||
listen-ipv6 = mkOption {
|
||||
type = nullOr str;
|
||||
description = "IPv6 addresses on which to listen";
|
||||
default = null;
|
||||
};
|
||||
|
||||
mail-hosts = mkOption {
|
||||
type = listOf str;
|
||||
description = "List of mail hosts for the MX records.";
|
||||
};
|
||||
};
|
||||
|
||||
config = let
|
||||
dom = config.instance.local-domain;
|
||||
dom-cfg = config.fudo.domains.${dom};
|
||||
in {
|
||||
fudo = {
|
||||
mail-server.alias-users.dmarc-report =
|
||||
map (admin: "${admin}@${dom}") dom-cfg.local-admins;
|
||||
|
||||
dns = {
|
||||
enable = true;
|
||||
|
||||
identity = "${hostname}.fudo.org";
|
||||
|
||||
listen-ips =
|
||||
[ cfg.listen-ip ] ++
|
||||
(optional (cfg.listen-ipv6 != null) cfg.listen-ipv6);
|
||||
|
||||
nameservers = {
|
||||
ns1 = {
|
||||
ipv4-address = cfg.listen-ip;
|
||||
ipv6-address = mkIf (cfg.listen-ipv6 != null) cfg.listen-ipv6;
|
||||
description = "Nameserver 1, france, in Winnipeg, MB, CA";
|
||||
};
|
||||
ns2 = {
|
||||
ipv4-address = "209.117.102.102";
|
||||
ipv6-address = "2001:470:1f16:40::2";
|
||||
description = "Nameserver 2, musashi, in Winnipeg, MB, CA";
|
||||
};
|
||||
ns3 = {
|
||||
ipv4-address = "104.131.53.95";
|
||||
ipv6-address = "2604:a880:800:10::8:7001";
|
||||
description =
|
||||
"Nameserver 3, ns2.henchmman21.net, in New York City, NY, US";
|
||||
};
|
||||
ns4 = {
|
||||
ipv4-address = "204.42.254.5";
|
||||
ipv6-address = "2001:418:3f4::5";
|
||||
description = "Nameserver 4, puck.nether.net, in Chicago, IL, US";
|
||||
};
|
||||
};
|
||||
|
||||
domains = let
|
||||
in {
|
||||
${dom} = {
|
||||
dnssec = true;
|
||||
default-host = cfg.default-host;
|
||||
gssapi-realm = dom-cfg.gssapi-realm;
|
||||
mx = cfg.mail-hosts;
|
||||
dmarc-report-address = "dmarc-report@${dom}";
|
||||
network-definition = import ../../networks/fudo.org.nix;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -46,7 +46,7 @@ in {
|
||||
|
||||
config.fudo = {
|
||||
secrets.host-secrets.${hostname}.git-database-password = {
|
||||
source-file = lib.fudo.passwd.stablerandom-passwd-file
|
||||
source-file = pkgs.lib.fudo.passwd.stablerandom-passwd-file
|
||||
"gitea-database-passwd"
|
||||
"${hostname}-gitea-database-passwd-${config.instance.build-seed}";
|
||||
target-file = "/var/gitea/database.passwd";
|
||||
@@ -55,7 +55,7 @@ in {
|
||||
|
||||
postgresql = {
|
||||
databases.fudo_git.users =
|
||||
config.instance.local_admins;
|
||||
config.instance.local-admins;
|
||||
|
||||
users.fudo_git = {
|
||||
password-file =
|
||||
|
||||
@@ -5,23 +5,23 @@ let
|
||||
hostname = config.instance.hostname;
|
||||
secrets = config.fudo.secrets.host-secrets.${hostname};
|
||||
|
||||
cfg = config.fudo.france;
|
||||
cfg = config.fudo.france.jabber;
|
||||
|
||||
generate-auth-file = name: files: let
|
||||
make-entry = name: passwd-file:
|
||||
''("${name}" . "${readFile passwd-file}")'';
|
||||
entries = mapAttrsToList make-entry files;
|
||||
content = concatStringsSep "\n" entries;
|
||||
in writeText "${name}-backplane-auth.scm" "'(${content})'";
|
||||
in pkgs.writeText "${name}-backplane-auth.scm" "'(${content})";
|
||||
|
||||
host-auth-file = generate-auth-file "host" cfg.host-passwd-files;
|
||||
service-auth-file = generate-auth-filre "service" cfg.service-passwd-files;
|
||||
host-auth-file = generate-auth-file "host" cfg.backplane.host-passwd-files;
|
||||
service-auth-file = generate-auth-file "service" cfg.backplane.service-passwd-files;
|
||||
|
||||
ldap-password-file =
|
||||
lib.fudo.passwd.random-passwd-file "ejabberd-ldap-auth-user";
|
||||
pkgs.lib.fudo.passwd.random-passwd-file "ejabberd-ldap-auth-user" 30;
|
||||
|
||||
ldap-hashed-password =
|
||||
hash-ldap-passwd "ejabberd-ldap-hashed-passwd" ldap-password-file;
|
||||
pkgs.lib.fudo.passwd.hash-ldap-passwd "ejabberd-ldap-hashed-passwd" ldap-password-file;
|
||||
|
||||
in {
|
||||
options.fudo.france = with types; {
|
||||
@@ -41,28 +41,28 @@ in {
|
||||
type = listOf str;
|
||||
description = "IPs on which to listen for incoming connections.";
|
||||
};
|
||||
};
|
||||
|
||||
backplane = {
|
||||
host-passwd-files = mkOption {
|
||||
type = attrsOf str;
|
||||
description = "Map of hostname to password file, for backplane host authentication.";
|
||||
default = {};
|
||||
};
|
||||
backplane = {
|
||||
host-passwd-files = mkOption {
|
||||
type = attrsOf str;
|
||||
description = "Map of hostname to password file, for backplane host authentication.";
|
||||
default = {};
|
||||
};
|
||||
|
||||
service-passwd-files = mkOption {
|
||||
type = attrsOf str;
|
||||
description = "Map of service to password file, for backplane service authentication.";
|
||||
default = {};
|
||||
service-passwd-files = mkOption {
|
||||
type = attrsOf str;
|
||||
description = "Map of service to password file, for backplane service authentication.";
|
||||
default = {};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
fudo = {
|
||||
system-users.${cfg.jabber.ldap-user} = {
|
||||
system-users.${cfg.ldap-user} = {
|
||||
description = "ejabberd authentication user.";
|
||||
hashed-password = ldap-hashed-password;
|
||||
ldap-hashed-password = ldap-hashed-password;
|
||||
};
|
||||
|
||||
secrets.host-secrets.${hostname} = let
|
||||
@@ -88,7 +88,7 @@ in {
|
||||
jabber = {
|
||||
enable = true;
|
||||
|
||||
listen-ips = cfg.jabber.listen-ips;
|
||||
listen-ips = cfg.listen-ips;
|
||||
|
||||
environment = {
|
||||
FUDO_HOST_PASSWD_FILE = secrets.host-auth.target-file;
|
||||
@@ -103,9 +103,9 @@ in {
|
||||
"fudo.im" = {
|
||||
site-config = {
|
||||
auth_method = "ldap";
|
||||
ldap_servers = cfg.jabber.ldap-servers;
|
||||
ldap_servers = cfg.ldap-servers;
|
||||
ldap_port = 389;
|
||||
ldap_rootdn = "cn=${cfg.jabber.ldap-user},dc=fudo,dc=org";
|
||||
ldap_rootdn = "cn=${cfg.ldap-user},dc=fudo,dc=org";
|
||||
ldap_password = ''"LDAP_PASSWD"'';
|
||||
ldap_base = "ou=members,dc=fudo,dc=org";
|
||||
ldap_filter = "(objectClass=posixAccount)";
|
||||
|
||||
@@ -5,6 +5,8 @@ let
|
||||
hostname = config.instance.hostname;
|
||||
domain-name = config.instance.local-domain;
|
||||
|
||||
cfg = config.fudo.france.mail;
|
||||
|
||||
secrets = config.fudo.secrets.host-secrets.${hostname};
|
||||
|
||||
mail-reader-dn = "mail-auth-reader";
|
||||
@@ -26,35 +28,63 @@ in {
|
||||
};
|
||||
};
|
||||
|
||||
config.fudo = {
|
||||
system-users = {
|
||||
username = mail-reader-dn;
|
||||
config.fudo = let
|
||||
mail-reader-password =
|
||||
pkgs.lib.fudo.passwd.random-passwd-file "${mail-reader-dn}-ldap-password" 30;
|
||||
in {
|
||||
# This is used at build time...
|
||||
# secrets.host-secrets.${hostname}.mail-reader-passwd = {
|
||||
# source-file = ldap-password;
|
||||
# target-file = "/run/mail/${mail-reader-dn}-ldap.passwd";
|
||||
# user = config.services.dovecot2.user;
|
||||
# };
|
||||
|
||||
system-users.${mail-reader-dn} = {
|
||||
description = "Used by the mail server to connect to LDAP for auth.";
|
||||
ldap-hashed-password =
|
||||
pkgs.lib.fudo.passwd.hash-ldap-passwd
|
||||
secrets.mail-reader-passwd.target-file;
|
||||
"${mail-reader-dn}-hashed"
|
||||
mail-reader-password;
|
||||
};
|
||||
|
||||
mail-server = {
|
||||
mail-server = let
|
||||
mail-hostname = "mail.${domain-name}";
|
||||
mail-ssl-dir = config.security.acme.certs.${mail-hostname}.directory;
|
||||
ssl-certificate = "${mail-ssl-dir}/cert.pem";
|
||||
ssl-private-key = "${mail-ssl-dir}/key.pem";
|
||||
in {
|
||||
enableContainer = true;
|
||||
monitoring = true;
|
||||
|
||||
domain = domain-name;
|
||||
mail-hostname = "mail.${domain-name}";
|
||||
|
||||
trusted-networks = config.instance.local-networks;
|
||||
|
||||
dovecot = {
|
||||
ldap = {
|
||||
reader-dn = "cn=${mail-reader-dn},${config.fudo.auth.ldap.base}";
|
||||
reader-password-file = secrets.mail-reader-passwd.target-file;
|
||||
reader-dn = "cn=${mail-reader-dn},${config.fudo.authentication.base}";
|
||||
reader-password-file = mail-reader-password;
|
||||
server-urls = cfg.ldap-server-urls;
|
||||
};
|
||||
};
|
||||
|
||||
user-aliases = let
|
||||
aliased-users = filterAttrs
|
||||
(username: userOpts: length userOpts.email-aliases > 0)
|
||||
config.fudo.users;
|
||||
in mapAttrs (username: userOpts: userOpts.email-aliases) aliased-users;
|
||||
|
||||
state-directory = cfg.state-directory;
|
||||
mail-directory = cfg.mail-directory;
|
||||
|
||||
clamav.enable = true;
|
||||
dkim.signing = true;
|
||||
|
||||
ssl = {
|
||||
certificate = ssl-certificate;
|
||||
private-key = ssl-private-key;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ with lib;
|
||||
let
|
||||
hostname = config.instance.hostname;
|
||||
secrets = config.fudo.secrets.host-secrets.${hostname};
|
||||
cfg = config.fudo.france.postgresql;
|
||||
in {
|
||||
options.fudo.france.postgresql = with types; {
|
||||
ssl-certificate = mkOption {
|
||||
|
||||
@@ -8,11 +8,10 @@ let
|
||||
|
||||
secrets = config.fudo.secrets.host-secrets.${hostname};
|
||||
|
||||
static = config.fudo.static;
|
||||
# TODO: what should go here?
|
||||
static = ../../../static;
|
||||
|
||||
mail-hostname = config.france.webmail.mail-server;
|
||||
|
||||
db-host = config.france.webmail.database.hostname;
|
||||
cfg = config.fudo.france.webmail;
|
||||
|
||||
db-passwd = pkgs.lib.fudo.passwd.random-passwd-file "webmail" 40;
|
||||
|
||||
@@ -39,12 +38,12 @@ in {
|
||||
"webmail.fudo.link" = {
|
||||
title = "Fudo Link Webmail";
|
||||
favicon = "${static}/fudo.link/favicon.ico";
|
||||
mail-server = mail-hostname;
|
||||
mail-server = cfg.mail-server;
|
||||
domain = "fudo.link";
|
||||
edit-mode = "Plain";
|
||||
layout-mode = "bottom";
|
||||
database = {
|
||||
hostname = db-host;
|
||||
hostname = cfg.database.hostname;
|
||||
password-file = db-passwd;
|
||||
};
|
||||
};
|
||||
@@ -52,11 +51,11 @@ in {
|
||||
"webmail.test.fudo.org" = {
|
||||
title = "Fudo Webmail";
|
||||
favicon = "${static}/fudo.org/favicon.ico";
|
||||
mail-server = mail-hostname;
|
||||
mail-server = cfg.mail-server;
|
||||
domain = "fudo.org";
|
||||
edit-mode = "Plain";
|
||||
database = {
|
||||
hostname = db-host;
|
||||
hostname = cfg.database.hostname;
|
||||
password-file = db-passwd;
|
||||
};
|
||||
};
|
||||
@@ -64,11 +63,11 @@ in {
|
||||
"webmail.fudo.org" = {
|
||||
title = "Fudo Webmail";
|
||||
favicon = "${static}/fudo.org/favicon.ico";
|
||||
mail-server = mail-hostname;
|
||||
mail-server = cfg.mail-server;
|
||||
domain = "fudo.org";
|
||||
edit-mode = "Plain";
|
||||
database = {
|
||||
hostname = db-host;
|
||||
hostname = cfg.database.hostname;
|
||||
password-file = db-passwd;
|
||||
};
|
||||
};
|
||||
@@ -76,10 +75,10 @@ in {
|
||||
"webmail.test.selby.ca" = {
|
||||
title = "Selby Webmail";
|
||||
favicon = "${static}/selby.ca/favicon.ico";
|
||||
mail-server = mail-hostname;
|
||||
mail-server = cfg.mail-server;
|
||||
domain = "selby.ca";
|
||||
database = {
|
||||
hostname = db-host;
|
||||
hostname = cfg.database.hostname;
|
||||
password-file = db-passwd;
|
||||
};
|
||||
};
|
||||
@@ -87,10 +86,10 @@ in {
|
||||
"webmail.selby.ca" = {
|
||||
title = "Selby Webmail";
|
||||
favicon = "${static}/selby.ca/favicon.ico";
|
||||
mail-server = mail-hostname;
|
||||
mail-server = cfg.mail-server;
|
||||
domain = "selby.ca";
|
||||
database = {
|
||||
hostname = db-host;
|
||||
hostname = cfg.database.hostname;
|
||||
password-file = db-passwd;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,233 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
let
|
||||
hostname = "legatus";
|
||||
host-ipv4 = "91.229.23.204";
|
||||
domain-name = config.fudo.hosts.${hostname}.domain;
|
||||
domain = config.fudo.domains.${domain-name};
|
||||
site-name = config.fudo.hosts.${hostname}.site;
|
||||
site = config.fudo.sites.${site-name};
|
||||
host-fqdn = "${hostname}.${domain-name}";
|
||||
|
||||
local-packages = with pkgs; [ ldns.examples ];
|
||||
|
||||
secrets = config.fudo.secrets.host-secrets.${hostname};
|
||||
|
||||
in {
|
||||
networking = {
|
||||
enableIPv6 = true;
|
||||
|
||||
nameservers = [ "1.1.1.1" ];
|
||||
defaultGateway = {
|
||||
address = site.gateway-v4;
|
||||
interface = "extif0";
|
||||
};
|
||||
|
||||
interfaces.extif0.ipv4.addresses = [{
|
||||
address = host-ipv4;
|
||||
prefixLength = 24;
|
||||
}];
|
||||
};
|
||||
|
||||
systemd.tmpfiles.rules = [
|
||||
"L /etc/adjtime - - - - /state/etc/adjtime"
|
||||
];
|
||||
|
||||
environment.systemPackages = local-packages;
|
||||
|
||||
# networking.firewall.allowedTCPPorts = [ 80 443 ];
|
||||
|
||||
# informis.cl-gemini = {
|
||||
# enable = true;
|
||||
|
||||
# hostname = "gemini.informis.land";
|
||||
# server-ip = host-ipv4;
|
||||
# document-root = "/srv/gemini/root";
|
||||
# textfiles-archive = "${pkgs.textfiles}";
|
||||
# slynk-port = 4005;
|
||||
|
||||
# feeds = {
|
||||
# viator = {
|
||||
# title = "viator's phlog";
|
||||
# path = "/home/viator/gemini-public/feed/";
|
||||
# url = "gemini://informis.land/user/viator/feed/";
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
|
||||
fudo = {
|
||||
hosts.legatus.external-interfaces = [ "extif0" ];
|
||||
|
||||
# secrets.host-secrets.procul = let
|
||||
# files = config.fudo.secrets.files;
|
||||
# in {
|
||||
# postgres-keytab = {
|
||||
# source-file = files.service-keytabs.procul.postgres;
|
||||
# target-file = "/srv/postgres/secure/postgres.keytab";
|
||||
# user = "root";
|
||||
# };
|
||||
|
||||
# gitea-database-password = {
|
||||
# source-file = files.service-passwords.procul.gitea-database;
|
||||
# target-file = "/srv/gitea/secure/database.passwd";
|
||||
# user = config.fudo.git.user;
|
||||
# };
|
||||
# };
|
||||
|
||||
# client.dns = {
|
||||
# enable = true;
|
||||
# ipv4 = true;
|
||||
# ipv6 = true;
|
||||
# user = "fudo-client";
|
||||
# external-interface = "extif0";
|
||||
# };
|
||||
|
||||
# auth.kdc = {
|
||||
# enable = true;
|
||||
# realm = "INFORMIS.LAND";
|
||||
# bind-addresses = [ host-ipv4 "127.0.0.1" ];
|
||||
# acl = {
|
||||
# "niten" = { perms = [ "add" "change-password" "list" ]; };
|
||||
# "*/root" = { perms = [ "all" ]; };
|
||||
# };
|
||||
# };
|
||||
|
||||
# secure-dns-proxy = {
|
||||
# enable = true;
|
||||
# upstream-dns =
|
||||
# [ "https://1.1.1.1/dns-query" "https://1.0.0.1/dns-query" ];
|
||||
# bootstrap-dns = "1.1.1.1";
|
||||
# listen-ips = [ "127.0.0.1" ];
|
||||
# listen-port = 53;
|
||||
# allowed-networks = [ "1.1.1.1/32" "1.0.0.1/32" "localhost" "link-local" ];
|
||||
# };
|
||||
|
||||
# dns = {
|
||||
# enable = true;
|
||||
# identity = "procul.informis.land";
|
||||
# nameservers = {
|
||||
# ns1 = {
|
||||
# ipv4-address = host-ipv4;
|
||||
# description = "Primary Informis Nameserver";
|
||||
# };
|
||||
# ns2 = {
|
||||
# ipv4-address = host-ipv4;
|
||||
# description = "Secondary Informis Nameserver";
|
||||
# };
|
||||
# };
|
||||
|
||||
# listen-ips = [ host-ipv4 ];
|
||||
|
||||
# domains = {
|
||||
# "informis.land" = {
|
||||
# dnssec = true;
|
||||
# default-host = host-ipv4;
|
||||
# gssapi-realm = "INFORMIS.LAND";
|
||||
# mx = [ "smtp.informis.land" ];
|
||||
# network-definition = config.fudo.networks."informis.land";
|
||||
# dmarc-report-address = "dmarc-report@informis.land";
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
|
||||
# mail-server = {
|
||||
# enable = true;
|
||||
# debug = true;
|
||||
|
||||
# domain = domain-name;
|
||||
# mail-hostname = "${host-fqdn}";
|
||||
# monitoring = false;
|
||||
# mail-user = "mailuser";
|
||||
# mail-user-id = 525;
|
||||
# mail-group = "mailgroup";
|
||||
# clamav.enable = true;
|
||||
# dkim.signing = true;
|
||||
|
||||
# dovecot = {
|
||||
# ssl-certificate = acme-certificate "imap.${domain-name}";
|
||||
# ssl-private-key = acme-private-key "imap.${domain-name}";
|
||||
# };
|
||||
|
||||
# postfix = {
|
||||
# ssl-certificate = acme-certificate "smtp.${domain-name}";
|
||||
# ssl-private-key = acme-private-key "smtp.${domain-name}";
|
||||
# };
|
||||
|
||||
# # This should NOT include the primary domain
|
||||
# local-domains = [ host-fqdn "smtp.${domain-name}" ];
|
||||
|
||||
# mail-directory = "/srv/mailserver/mail";
|
||||
# state-directory = "/srv/mailserver/state";
|
||||
|
||||
# trusted-networks = [ "172.86.179.16/29" "127.0.0.0/16" ];
|
||||
|
||||
# alias-users = {
|
||||
# root = [ "niten" ];
|
||||
# postmaster = [ "niten" ];
|
||||
# hostmaster = [ "niten" ];
|
||||
# webmaster = [ "niten" ];
|
||||
# system = [ "niten" ];
|
||||
# admin = [ "niten" ];
|
||||
# dmarc-report = [ "niten" ];
|
||||
# };
|
||||
# };
|
||||
|
||||
# postgresql = {
|
||||
# enable = true;
|
||||
# ssl-certificate = (acme-certificate host-fqdn);
|
||||
# ssl-private-key = (acme-private-key host-fqdn);
|
||||
# keytab = secrets.postgres-keytab.target-file;
|
||||
# local-networks = local-networks;
|
||||
|
||||
# users = {
|
||||
# gituser = {
|
||||
# password-file =
|
||||
# secrets.gitea-database-password.target-file;
|
||||
# databases = {
|
||||
# git = {
|
||||
# access = "CONNECT";
|
||||
# entity-access = {
|
||||
# "ALL TABLES IN SCHEMA public" = "SELECT,INSERT,UPDATE,DELETE";
|
||||
# "ALL SEQUENCES IN SCHEMA public" = "SELECT, UPDATE";
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
|
||||
# databases = { git = { users = [ "niten" ]; }; };
|
||||
# };
|
||||
|
||||
# git = {
|
||||
# enable = true;
|
||||
# hostname = "git.informis.land";
|
||||
# site-name = "informis git";
|
||||
# user = "gituser";
|
||||
# repository-dir = /srv/git/repo;
|
||||
# state-dir = /srv/git/state;
|
||||
# database = {
|
||||
# user = "gituser";
|
||||
# password-file =
|
||||
# secrets.gitea-database-password.target-file;
|
||||
# hostname = "127.0.0.1";
|
||||
# name = "git";
|
||||
# };
|
||||
# ssh = {
|
||||
# listen-ip = host-ipv4;
|
||||
# listen-port = 2222;
|
||||
# };
|
||||
# };
|
||||
|
||||
# acme = {
|
||||
# enable = true;
|
||||
# admin-address = "admin@${domain-name}";
|
||||
# hostnames = [
|
||||
# "informis.land"
|
||||
# "imap.informis.land"
|
||||
# "smtp.informis.land"
|
||||
# "gemini.informis.land"
|
||||
# ];
|
||||
# };
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
|
||||
}
|
||||
@@ -50,11 +50,12 @@ in {
|
||||
];
|
||||
};
|
||||
|
||||
fudo.ipfs = {
|
||||
enable = true;
|
||||
users = [ "niten" ];
|
||||
api-address = "/ip4/0.0.0.0/tcp/5001";
|
||||
};
|
||||
## Until I can figure out how to use one common host API, forget this
|
||||
# fudo.ipfs = {
|
||||
# enable = true;
|
||||
# users = [ "niten" ];
|
||||
# api-address = "/ip4/0.0.0.0/tcp/5001";
|
||||
# };
|
||||
|
||||
virtualisation = {
|
||||
libvirtd = {
|
||||
|
||||
@@ -164,7 +164,7 @@ in {
|
||||
debug = true;
|
||||
|
||||
domain = domain-name;
|
||||
hostname = "${host-fqdn}";
|
||||
mail-hostname = "${host-fqdn}";
|
||||
monitoring = false;
|
||||
mail-user = "mailuser";
|
||||
mail-user-id = 525;
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
description = "informis.land server.";
|
||||
rp = "niten";
|
||||
admin-email = "niten@fudo.org";
|
||||
domain = "eur.fudo.org";
|
||||
site = "worldstream";
|
||||
profile = "server";
|
||||
tmp-on-tmpfs = false;
|
||||
enable-gui = false;
|
||||
arch = "x86_64-linux";
|
||||
nixos-system = true;
|
||||
machine-id = "749bbf411088411b8784b76bb44bd617";
|
||||
master-key = {
|
||||
public-key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIqUnzf8bfPyoJX6XjFqD6v5MZQnV8STP0152VS3uwM7";
|
||||
key-path = "/state/master-key/ed25519_key";
|
||||
};
|
||||
# initrd-network = {
|
||||
# ip = "172.86.179.18";
|
||||
# interface = "enp0s25";
|
||||
# keypair = {
|
||||
# public-key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIgvl/pxPGN5XuUFsEywHV/PJMI+wPHA6NKTtE8SZC04";
|
||||
# private-key-file = "/state/ssh/initrd/ssh_ed25519_key";
|
||||
# };
|
||||
# };
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
description = "Fudo mailserver container";
|
||||
rp = "admin";
|
||||
admin-email = "admin@fudo.org";
|
||||
domain = "fudo.org";
|
||||
site = "portage";
|
||||
profile = "container";
|
||||
arch = "x86_64-linux";
|
||||
machine-id = "5a907f8cf2644b0ba5a786fd45b758b3";
|
||||
nixos-system = false;
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
description = "informis.land server.";
|
||||
docker-server = true;
|
||||
rp = "niten";
|
||||
admin-email = "niten@fudo.org";
|
||||
rp = "viator";
|
||||
admin-email = "viator@fudo.org";
|
||||
domain = "informis.land";
|
||||
site = "joes-datacenter-0";
|
||||
profile = "server";
|
||||
|
||||
@@ -2,8 +2,10 @@
|
||||
|
||||
{
|
||||
config.fudo.networks = {
|
||||
"fudo.org" = import ./networks/fudo.org.nix;
|
||||
"rus.selby.ca" = import ./networks/rus.selby.ca.nix;
|
||||
"sea.fudo.org" = import ./networks/sea.fudo.org.nix;
|
||||
"informis.land" = import ./networks/informis.land.nix;
|
||||
"eur.fudo.org" = import ./networks/eur.fudo.org.nix;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
mx = [ "mail.fudo.org" ];
|
||||
|
||||
hosts = {
|
||||
legatus.ipv4-address = "91.229.23.204";
|
||||
};
|
||||
}
|
||||
@@ -1,8 +1,4 @@
|
||||
{
|
||||
mx = [ "mail.fudo.org" ];
|
||||
|
||||
default-host = "208.81.3.117";
|
||||
|
||||
aliases = {
|
||||
pop = "mail.fudo.org.";
|
||||
smtp = "mail.fudo.org.";
|
||||
@@ -27,13 +23,11 @@
|
||||
wiki = "hanover.fudo.org.";
|
||||
};
|
||||
|
||||
extra-dns-records = [
|
||||
verbatim-dns-records = [
|
||||
''@ IN TXT "v=spf1 mx ip4:208.81.3.112/28 ip6:2605:e200:d200::1/48 -all"''
|
||||
''@ IN SPF "v=spf1 mx ip4:208.81.3.112/28 ip6:2605:e200:d200::1/48 -all"''
|
||||
];
|
||||
|
||||
dmarc-report-address = "dmarc-report@fudo.org";
|
||||
|
||||
srv-records = {
|
||||
tcp = {
|
||||
domain = [
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
let
|
||||
has-secret-files = hasAttr "files" config.fudo.secrets;
|
||||
in {
|
||||
config.instance = mkIf has-secret-files {
|
||||
build-seed = builtins.readFile config.fudo.secrets.files.build-seed;
|
||||
};
|
||||
}
|
||||
@@ -14,131 +14,154 @@ let
|
||||
wget
|
||||
];
|
||||
|
||||
import-paths = [
|
||||
./build
|
||||
./host
|
||||
./user
|
||||
];
|
||||
|
||||
in {
|
||||
environment = {
|
||||
etc.nixos-live.source = ../../.;
|
||||
|
||||
systemPackages = global-packages;
|
||||
imports = let
|
||||
is-regular-file = filename: type: type == "regular" || type == "link";
|
||||
regular-files = path:
|
||||
attrNames (filterAttrs is-regular-file (builtins.readDir path));
|
||||
is-nix-file = filename: (builtins.match "^(.+)\.nix$" filename) != null;
|
||||
nix-files = path:
|
||||
map
|
||||
(file: path + "/${file}")
|
||||
(filter is-nix-file (regular-files path));
|
||||
in concatMap nix-files import-paths;
|
||||
|
||||
# shellInit = ''
|
||||
# ${pkgs.gnupg}/bin/gpg-connect-agent /bye
|
||||
# export SSH_AUTH_SOCK=$(${pkgs.gnupg}/bin/gpgconf --list-dirs agent-ssh-socket)
|
||||
# '';
|
||||
};
|
||||
config = {
|
||||
environment = {
|
||||
etc.nixos-live.source = ../../.;
|
||||
|
||||
system.autoUpgrade.enable = false;
|
||||
systemPackages = global-packages;
|
||||
|
||||
nix = {
|
||||
package = pkgs.nixFlakes;
|
||||
extraOptions = ''
|
||||
# shellInit = ''
|
||||
# ${pkgs.gnupg}/bin/gpg-connect-agent /bye
|
||||
# export SSH_AUTH_SOCK=$(${pkgs.gnupg}/bin/gpgconf --list-dirs agent-ssh-socket)
|
||||
# '';
|
||||
};
|
||||
|
||||
system.autoUpgrade.enable = false;
|
||||
|
||||
nix = {
|
||||
package = pkgs.nixFlakes;
|
||||
extraOptions = ''
|
||||
experimental-features = nix-command flakes
|
||||
'';
|
||||
};
|
||||
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
security.acme.acceptTerms = true;
|
||||
hardware.enableRedistributableFirmware = true;
|
||||
|
||||
krb5 = {
|
||||
enable = true;
|
||||
|
||||
appdefaults = {
|
||||
forwardable = true;
|
||||
proxiable = true;
|
||||
encrypt = true;
|
||||
forward = true;
|
||||
};
|
||||
|
||||
libdefaults = {
|
||||
allow_weak_crypto = true;
|
||||
dns_lookup_kdc = true;
|
||||
dns_lookup_realm = true;
|
||||
forwardable = true;
|
||||
proxiable = true;
|
||||
};
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
security.acme.acceptTerms = true;
|
||||
hardware.enableRedistributableFirmware = true;
|
||||
|
||||
kerberos = pkgs.heimdalFull;
|
||||
};
|
||||
|
||||
services = {
|
||||
openssh = {
|
||||
krb5 = {
|
||||
enable = true;
|
||||
startWhenNeeded = true;
|
||||
useDns = true;
|
||||
permitRootLogin = "prohibit-password";
|
||||
extraConfig = ''
|
||||
|
||||
appdefaults = {
|
||||
forwardable = true;
|
||||
proxiable = true;
|
||||
encrypt = true;
|
||||
forward = true;
|
||||
};
|
||||
|
||||
libdefaults = {
|
||||
allow_weak_crypto = true;
|
||||
dns_lookup_kdc = true;
|
||||
dns_lookup_realm = true;
|
||||
forwardable = true;
|
||||
proxiable = true;
|
||||
};
|
||||
|
||||
kerberos = pkgs.heimdalFull;
|
||||
};
|
||||
|
||||
services = {
|
||||
openssh = {
|
||||
enable = true;
|
||||
startWhenNeeded = true;
|
||||
useDns = true;
|
||||
permitRootLogin = "prohibit-password";
|
||||
extraConfig = ''
|
||||
GSSAPIAuthentication yes
|
||||
GSSAPICleanupCredentials yes
|
||||
GSSAPIKeyExchange yes
|
||||
GSSAPIStoreCredentialsOnRekey yes
|
||||
'';
|
||||
};
|
||||
|
||||
fail2ban = let
|
||||
domain-name = config.fudo.hosts.${config.instance.hostname}.domain;
|
||||
in {
|
||||
enable = config.networking.firewall.enable;
|
||||
bantime-increment.enable = true;
|
||||
};
|
||||
|
||||
xserver = {
|
||||
layout = "us";
|
||||
xkbVariant = "dvp";
|
||||
xkbOptions = "ctrl:nocaps";
|
||||
};
|
||||
|
||||
# pcscd.enable = true;
|
||||
# udev.packages = with pkgs; [ yubikey-personalization ];
|
||||
};
|
||||
|
||||
fail2ban = let
|
||||
domain-name = config.fudo.hosts.${config.instance.hostname}.domain;
|
||||
in {
|
||||
enable = config.networking.firewall.enable;
|
||||
bantime-increment.enable = true;
|
||||
ignoreIP = config.instance.local-networks;
|
||||
networking.firewall = {
|
||||
# Allow mosh connections if the firewall is enabled
|
||||
allowedUDPPortRanges = [{
|
||||
from = 60000;
|
||||
to = 60100;
|
||||
}];
|
||||
};
|
||||
|
||||
xserver = {
|
||||
layout = "us";
|
||||
xkbVariant = "dvp";
|
||||
xkbOptions = "ctrl:nocaps";
|
||||
};
|
||||
console.useXkbConfig = true;
|
||||
|
||||
# pcscd.enable = true;
|
||||
# udev.packages = with pkgs; [ yubikey-personalization ];
|
||||
};
|
||||
i18n.defaultLocale = "en_US.UTF-8";
|
||||
|
||||
networking.firewall = {
|
||||
# Allow mosh connections if the firewall is enabled
|
||||
allowedUDPPortRanges = [{
|
||||
from = 60000;
|
||||
to = 60100;
|
||||
}];
|
||||
};
|
||||
programs = {
|
||||
mosh.enable = true;
|
||||
|
||||
console.useXkbConfig = true;
|
||||
bash.enableCompletion = true;
|
||||
|
||||
i18n.defaultLocale = "en_US.UTF-8";
|
||||
fish.enable = true;
|
||||
|
||||
programs = {
|
||||
mosh.enable = true;
|
||||
gnupg.agent = {
|
||||
enable = true;
|
||||
# enableSSHSupport = true;
|
||||
# pinentryFlavor = if cfg.enable-gui then "gnome3" else "curses";
|
||||
};
|
||||
|
||||
bash.enableCompletion = true;
|
||||
ssh = {
|
||||
startAgent = true;
|
||||
|
||||
fish.enable = true;
|
||||
package = pkgs.openssh_gssapi;
|
||||
|
||||
gnupg.agent = {
|
||||
enable = true;
|
||||
# enableSSHSupport = true;
|
||||
# pinentryFlavor = if cfg.enable-gui then "gnome3" else "curses";
|
||||
};
|
||||
|
||||
ssh = {
|
||||
startAgent = true;
|
||||
|
||||
package = pkgs.openssh_gssapi;
|
||||
|
||||
extraConfig = ''
|
||||
extraConfig = ''
|
||||
GSSAPIAuthentication yes
|
||||
GSSAPIDelegateCredentials yes
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
security.pam = {
|
||||
enableSSHAgentAuth = true;
|
||||
|
||||
services = {
|
||||
sshd = {
|
||||
makeHomeDir = true;
|
||||
sshAgentAuth = true;
|
||||
# This isn't supposed to ask for a code unless ~/.google_authenticator exists...but it does
|
||||
# googleAuthenticator.enable = true;
|
||||
};
|
||||
};
|
||||
|
||||
security.pam = {
|
||||
enableSSHAgentAuth = true;
|
||||
|
||||
services = {
|
||||
sshd = {
|
||||
makeHomeDir = true;
|
||||
sshAgentAuth = true;
|
||||
# This isn't supposed to ask for a code unless ~/.google_authenticator exists...but it does
|
||||
# googleAuthenticator.enable = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
home-manager = {
|
||||
useGlobalPkgs = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
config = {
|
||||
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
hostname = config.instance.hostname;
|
||||
host-cfg = config.fudo.hosts.${hostname};
|
||||
secrets = config.fudo.secrets.host-secrets.${hostname};
|
||||
|
||||
in {
|
||||
config.fudo = {
|
||||
secrets.host-secrets.${hostname} = {
|
||||
backplane-passwd = {
|
||||
source-file = host-cfg.backplane-password-file;
|
||||
target-file = "/run/backplane/client/passwd";
|
||||
user = config.fudo.client.dns.user;
|
||||
};
|
||||
};
|
||||
|
||||
client.dns.password-file =
|
||||
secrets.backplane-passwd.target-file;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
let
|
||||
hostname = config.instance.hostname;
|
||||
has-secret-files = hasAttr "files" config.fudo.secrets;
|
||||
try-attr = attr: set: if (hasAttr attr set) then set.${attr} else null;
|
||||
|
||||
in {
|
||||
config = mkIf has-secret-files {
|
||||
fudo.secrets.host-secrets.${hostname} = let
|
||||
keytab-file = try-attr hostname config.fudo.secrets.files.host-keytabs;
|
||||
in mkIf (keytab-file != null) {
|
||||
host-keytab = {
|
||||
source-file = keytab-file;
|
||||
target-file = "/etc/krb5.keytab";
|
||||
user = "root";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
let
|
||||
hostname = config.instance.hostname;
|
||||
has-attrs = set: length (attrNames set) > 0;
|
||||
read-lines = filename: splitString "\n" (fileContents filename);
|
||||
has-secret-files = hasAttr "files" config.fudo.secrets;
|
||||
|
||||
in {
|
||||
config = mkIf has-secret-files
|
||||
(let
|
||||
host-keypairs =
|
||||
if (hasAttr hostname config.fudo.secrets.files.host-ssh-keypairs) then
|
||||
config.fudo.secrets.files.host-ssh-keypairs.${hostname}
|
||||
else [];
|
||||
|
||||
in {
|
||||
fudo = let
|
||||
sshfp-filename = host: keypair: "ssh-${host}-${keypair.key-type}.sshfp-record";
|
||||
|
||||
dns-sshfp-records = host: keypair:
|
||||
pkgs.stdenv.mkDerivation {
|
||||
name = "${host}-sshfp-records";
|
||||
|
||||
phases = [ "installPhase" ];
|
||||
|
||||
buildInputs = with pkgs; [ openssh ];
|
||||
|
||||
installPhase =
|
||||
"ssh-keygen -r REMOVEME -f \"${keypair.public-key}\" | sed 's/^REMOVEME IN SSHFP //' > $out";
|
||||
};
|
||||
|
||||
host-cfg = config.fudo.hosts.${hostname};
|
||||
in {
|
||||
secrets.host-secrets.${hostname} = listToAttrs
|
||||
(map
|
||||
(keypair: nameValuePair "host-${keypair.key-type}-private-key" {
|
||||
source-file = keypair.private-key;
|
||||
target-file = "/var/run/ssh/private/host-${keypair.key-type}-private-key";
|
||||
user = "root";
|
||||
})
|
||||
host-keypairs);
|
||||
|
||||
hosts = mkIf (hasAttr "files" config.fudo.secrets)
|
||||
(mapAttrs (hostname: keypairs: {
|
||||
ssh-pubkeys = map (keypair: keypair.public-key) keypairs;
|
||||
ssh-fingerprints = concatMap (keypair:
|
||||
let
|
||||
fingerprint-derivation = dns-sshfp-records hostname keypair;
|
||||
in read-lines "${fingerprint-derivation}") keypairs;
|
||||
}) config.fudo.secrets.files.host-ssh-keypairs);
|
||||
};
|
||||
|
||||
services.openssh.hostKeys = map (keypair: {
|
||||
path = "/var/run/ssh/private/host-${keypair.key-type}-private-key";
|
||||
type = keypair.key-type;
|
||||
}) host-keypairs;
|
||||
});
|
||||
}
|
||||
@@ -45,7 +45,7 @@ in {
|
||||
|
||||
config = {
|
||||
environment = {
|
||||
serverPackages = with pkgs;
|
||||
systemPackages = with pkgs;
|
||||
[ emacs-nox reboot-if-necessary test-config ];
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
let
|
||||
ipfs-cfg = config.fudo.ipfs;
|
||||
site-name = config.instance.site;
|
||||
site = config.site.${site-name};
|
||||
|
||||
in {
|
||||
config = {
|
||||
home-manager.users = mapAttrs
|
||||
(user: userOpts: {
|
||||
home.sessionVariables.IPFS_PATH = ipfs-cfg.data-dir;
|
||||
}) config.instance.local-users;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
let
|
||||
list-contains = lst: item: any (i: i == item) lst;
|
||||
|
||||
domain-realm = domain: domainOpts: domainOpts.gssapi-realm;
|
||||
|
||||
user-realms = username:
|
||||
mapAttrsToList domain-realm
|
||||
(filterAttrs
|
||||
(domain: domainOpts:
|
||||
list-contains domainOpts.local-users username)
|
||||
config.fudo.domains);
|
||||
|
||||
admin-realms = username:
|
||||
mapAttrsToList domain-realm
|
||||
(filterAttrs
|
||||
(domain: domainOpts:
|
||||
list-contains domainOpts.local-admins username)
|
||||
config.fudo.domains);
|
||||
|
||||
user-principals = username: let
|
||||
user-princs = map (realm: "${username}@${realm}") (user-realms username);
|
||||
admin-princs = map (realm: "${username}/root@${realm}") (admin-realms username);
|
||||
in user-princs ++ admin-princs;
|
||||
|
||||
user-k5login = principals: concatStringsSep "\n" principals;
|
||||
|
||||
user-config = username: userOpts: {
|
||||
home.file.".k5login".text =
|
||||
user-k5login (user-principals username);
|
||||
};
|
||||
in {
|
||||
config = {
|
||||
home-manager.users = let
|
||||
user-configs =
|
||||
mapAttrs user-config config.instance.local-users;
|
||||
root-config = {
|
||||
root = let
|
||||
domain-name = config.instance.local-domain;
|
||||
realm = config.fudo.domains.${domain-name}.gssapi-realm;
|
||||
principals = map (admin: "${admin}/root@${realm}")
|
||||
config.instance.local-admins;
|
||||
in {
|
||||
home.file.".k5login".text =
|
||||
user-k5login principals;
|
||||
};
|
||||
};
|
||||
in user-configs // root-config;
|
||||
};
|
||||
}
|
||||
@@ -3,16 +3,16 @@
|
||||
let local-domain = "sea.fudo.org";
|
||||
in {
|
||||
fileSystems = {
|
||||
"/mnt/documents" = {
|
||||
device = "whitedwarf.${local-domain}:/volume1/Documents";
|
||||
fsType = "nfs4";
|
||||
options = [ "comment=systemd.automount" ];
|
||||
};
|
||||
"/mnt/downloads" = {
|
||||
device = "whitedwarf.${local-domain}:/volume1/Downloads";
|
||||
fsType = "nfs4";
|
||||
options = [ "comment=systemd.automount" ];
|
||||
};
|
||||
# "/mnt/documents" = {
|
||||
# device = "whitedwarf.${local-domain}:/volume1/Documents";
|
||||
# fsType = "nfs4";
|
||||
# options = [ "comment=systemd.automount" ];
|
||||
# };
|
||||
# "/mnt/downloads" = {
|
||||
# device = "whitedwarf.${local-domain}:/volume1/Downloads";
|
||||
# fsType = "nfs4";
|
||||
# options = [ "comment=systemd.automount" ];
|
||||
# };
|
||||
"/mnt/music" = {
|
||||
device = "doraemon.${local-domain}:/volume1/Music";
|
||||
fsType = "nfs4";
|
||||
|
||||
@@ -59,5 +59,17 @@
|
||||
];
|
||||
mail-server = "mail.informis.land";
|
||||
};
|
||||
|
||||
worldstream = {
|
||||
gateway-v4 = "91.229.23.204";
|
||||
network = "91.229.23.0/24";
|
||||
nameservers = [ "1.1.1.1" "2606:4700:4700::1111" ];
|
||||
timezone = "Europe/Amsterdam";
|
||||
deploy-pubkeys = [
|
||||
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDPwh522lvafTJYA0X2uFdP7Ws+Um1f8gZsARK1Y5nMzf6ZcWBF1jplTOKUVSOl4isMWni0Tu0TnX4zqCcgocWUVbwIwXSIRYqdiCPvVOH+/Ibc97n1/dYxk5JPMtbrsEw6/gWZxVg0qwe0J3dQWldEMiDY7iWhlrmIr7YL+Y3PUd7DOwp3PbfWfNyzTfE1kXcz5YvTeN+txFhbbXT0oS2R2wtc1vYXFZ/KbNstjqd+i8jszAq3ZkbbwL3aNR0RO4n8+GoIILGw8Ya4eP7D6+mYk608IhAoxpGyMrUch2TC2uvOK3rd/rw1hsTxf4AKjAZbrfd/FJaYru9ZeoLjD4bRGMdVp56F1m7pLvRiWRK62pV2Q/fjx+4KjHUrgyPd601eUIP0ayS/Rfuq8ijLpBJgO5/Y/6mFus/kjZIfRR9dXfLM67IMpyEzEITYrc/R2sedWf+YHxSh6eguAZ/kLzioar1nHLR7Wzgeu0tgWkD78WQGjpXGoefAz3xHeBg3Et0="
|
||||
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDGVez4of30f+j0cWKj5kYCKeFjyNsYvG9UbOMxF5hImD2lP5MSbFBv31gFgHjx3yCG4zQRZlpuyU5uWo0qIwe9N84/LcZcB9WrWKZXDmuof7zPFy0J+Hj+LVLDQI/mVXHNwkMhBMHpPrdwA05EYDAYCYklWT4cSByu10pHtST+olF8i+A+UQgUzgNZzdJVeiYZv6MBDTYsJWptGeDUkl2B0Es3gtbGYcCCfnyS3RC7DIXlDo3NBbAr7WaHY2MBbT+R/+jicn9E3IY3NCM5jENxqmvHy9MDsxEEYgFNm7IDwq4V1VRUWy277YsvRbmEaHb+osOA5u1VNN4z3UftOZcSZgR5C/vR71cENXoPt1YQpCzu7i38ojtvL+tDVEKT7sIovrQw8q1sszNlW2nXh8RSPiIq5TMnrV73MP0egKcr9n3tfxwi1BIkLjvfom/02BkTK9R9v+VMNhYU1YwROhORCiMIgoxUGiUvtH8u38JGr7E0hhMoAjCE5k80WPUivl0="
|
||||
];
|
||||
mail-server = "mail.fudo.org";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -27,6 +27,20 @@ in {
|
||||
"niten/root@RUS.SELBY.CA"
|
||||
];
|
||||
email = "niten@fudo.org";
|
||||
email-aliases = [
|
||||
"ertian@fudo.org"
|
||||
"peter@fudo.org"
|
||||
"peter@fudo.link"
|
||||
"pselby@fudo.org"
|
||||
"yiliu@fudo.org"
|
||||
"forum@selby.ca"
|
||||
|
||||
"peter@selby.ca"
|
||||
|
||||
# Used to create spotify accounts for Google Home & Tesla
|
||||
"tesla@fudo.org"
|
||||
"seattle-home@fudo.org"
|
||||
];
|
||||
};
|
||||
|
||||
andrew = {
|
||||
@@ -99,6 +113,7 @@ in {
|
||||
ldap-hashed-passwd = "{SSHA}YvtkEpqsReXcMdrzlui/ZmhIUKN42YO1";
|
||||
login-hashed-passwd =
|
||||
"$6$EwK9fpbH8$gYVzYY1IYw2/G0wCeUxXrZZqvjWCkCZbBqCOhxowbMuYtC5G0vp.AoYhVKWOJcHJM2c7TdPmAdnhLIe2KYStf.";
|
||||
email-aliases = [ "kselby@selby.ca" ];
|
||||
};
|
||||
|
||||
reaper = {
|
||||
@@ -112,6 +127,12 @@ in {
|
||||
k5login =
|
||||
[ "reaper@FUDO.ORG" "reaper/root@FUDO.ORG" "reaper/admin@FUDO.ORG" ];
|
||||
email = "reaper@fudo.org";
|
||||
email-aliases = [
|
||||
"cricket@fudo.org"
|
||||
"jstewart@fudo.org"
|
||||
"jonathan@fudo.org"
|
||||
"reaper@fudo.link"
|
||||
];
|
||||
};
|
||||
|
||||
slickoil = {
|
||||
@@ -133,6 +154,7 @@ in {
|
||||
primary-group = "fudo";
|
||||
common-name = "Mark Swaffer";
|
||||
ldap-hashed-passwd = "{MD5}C5gIsLsaKSvIPydu4uzhNg==";
|
||||
email-aliases = [ "mark@fudo.org" ];
|
||||
};
|
||||
|
||||
brian = {
|
||||
@@ -192,6 +214,13 @@ in {
|
||||
login-hashed-passwd =
|
||||
"$6$C8lYHrK7KvdKm/RE$cHZ2hg5gEOEjTV8Zoayik8sz5h.Vh0.ClCgOlQn8l/2Qx/qdxqZ7xCsAZ1GZ.IEyESfhJeJbjLpykXDwPpfVF0";
|
||||
email = "xiaoxuan@fudo.org";
|
||||
email-aliases = [
|
||||
"xixi@fudo.org"
|
||||
"claire@fudo.org"
|
||||
|
||||
"xixi@selby.ca"
|
||||
"claire@selby.ca"
|
||||
];
|
||||
};
|
||||
|
||||
thibor = {
|
||||
@@ -311,6 +340,9 @@ in {
|
||||
primary-group = "selby";
|
||||
common-name = "Vee Selby";
|
||||
ldap-hashed-passwd = "snoinuer";
|
||||
email-aliases = [
|
||||
"virginia@selby.ca"
|
||||
];
|
||||
};
|
||||
|
||||
dabar = {
|
||||
|
||||
Reference in New Issue
Block a user