nix machine / user configurations

style: format

Changed files
+285 -211
hosts
users
dusk@devel.mobi
modules
-1
hosts/dzwonek/default.nix
···
]
++ (tlib.importFolder (toString ./modules));
-
environment.systemPackages = [
pkgs.curl
pkgs.gitMinimal
+1 -1
hosts/dzwonek/disk-config.nix
···
};
};
};
-
}
+
}
+17 -5
hosts/dzwonek/modules/hardware-configuration.nix
···
# Do not modify this file! It was generated by ‘nixos-generate-config’
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
-
{ config, lib, pkgs, modulesPath, ... }:
+
{
+
config,
+
lib,
+
pkgs,
+
modulesPath,
+
...
+
}:
{
-
imports =
-
[ (modulesPath + "/profiles/qemu-guest.nix")
-
];
+
imports = [
+
(modulesPath + "/profiles/qemu-guest.nix")
+
];
-
boot.initrd.availableKernelModules = [ "ata_piix" "uhci_hcd" "virtio_pci" "sr_mod" "virtio_blk" ];
+
boot.initrd.availableKernelModules = [
+
"ata_piix"
+
"uhci_hcd"
+
"virtio_pci"
+
"sr_mod"
+
"virtio_blk"
+
];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ ];
boot.extraModulePackages = [ ];
+30 -25
hosts/dzwonek/modules/headscale.nix/acl.nix
···
-
{config, lib, ...}: let
+
{ config, lib, ... }:
+
let
l = lib // builtins;
t = l.types;
···
default = "accept";
};
proto = l.mkOption {
-
type = t.nullOr (t.enum ["tcp" "udp"]);
+
type = t.nullOr (
+
t.enum [
+
"tcp"
+
"udp"
+
]
+
);
default = null;
};
src = l.mkOption {
···
};
};
};
-
in {
+
in
+
{
options = {
services.headscale.acl = {
groups = l.mkOption {
type = t.attrsOf (t.listOf t.str);
-
default = [];
+
default = [ ];
};
tagOwners = l.mkOption {
type = t.attrsOf (t.listOf t.str);
-
default = [];
+
default = [ ];
};
hosts = l.mkOption {
type = t.attrsOf t.str;
-
default = [];
+
default = [ ];
};
rules = l.mkOption {
type = t.listOf ruleType;
-
default = [];
+
default = [ ];
};
};
};
-
config = let
-
generated = l.toFile "policy.hujson" (l.toJSON {
-
groups = l.mapAttrs' (k: v: l.nameValuePair "group:${k}" v) cfg.groups;
-
tagOwners = l.mapAttrs' (k: v: l.nameValuePair "tag:${k}" v) cfg.tagOwners;
-
hosts = cfg.hosts;
-
acls = l.map
-
(rule:
-
if rule.proto == null
-
then l.removeAttrs rule ["proto"]
-
else rule
-
)
-
cfg.rules;
-
});
-
in {
-
services.headscale.settings.policy = {
-
mode = "file";
-
path = generated;
+
config =
+
let
+
generated = l.toFile "policy.hujson" (
+
l.toJSON {
+
groups = l.mapAttrs' (k: v: l.nameValuePair "group:${k}" v) cfg.groups;
+
tagOwners = l.mapAttrs' (k: v: l.nameValuePair "tag:${k}" v) cfg.tagOwners;
+
hosts = cfg.hosts;
+
acls = l.map (rule: if rule.proto == null then l.removeAttrs rule [ "proto" ] else rule) cfg.rules;
+
}
+
);
+
in
+
{
+
services.headscale.settings.policy = {
+
mode = "file";
+
path = generated;
+
};
};
-
};
}
+22 -17
hosts/dzwonek/modules/headscale.nix/default.nix
···
domain = "vpn.${rootDomain}";
in
{
-
imports = [./acl.nix];
+
imports = [ ./acl.nix ];
age.secrets.headscaleOidcSecret = {
file = ../../../../secrets/headscaleOidcSecret.age;
···
address = "0.0.0.0";
port = 1111;
acl = {
-
groups.admin = ["90008@gaze.systems"];
+
groups.admin = [ "90008@gaze.systems" ];
tagOwners = {
-
private-infra = ["group:admin"];
-
other-infra = ["group:admin"];
+
private-infra = [ "group:admin" ];
+
other-infra = [ "group:admin" ];
};
hosts = {
chernobog = "100.64.0.9";
···
};
rules = lib.mkBefore [
{
-
src = ["group:admin"];
-
dst = ["tag:private-infra:*" "tag:other-infra:*"];
+
src = [ "group:admin" ];
+
dst = [
+
"tag:private-infra:*"
+
"tag:other-infra:*"
+
];
}
{
-
src = ["tag:private-infra"];
-
dst = ["tag:other-infra:*"];
+
src = [ "tag:private-infra" ];
+
dst = [ "tag:other-infra:*" ];
}
{
-
src = ["wolumonde"];
-
dst = ["chernobog:*"];
+
src = [ "wolumonde" ];
+
dst = [ "chernobog:*" ];
}
{
-
src = ["90008@gaze.systems"];
-
dst = ["90008@gaze.systems:*"];
+
src = [ "90008@gaze.systems" ];
+
dst = [ "90008@gaze.systems:*" ];
}
{
-
src = ["90008@gaze.systems" "tag:private-infra"];
-
dst = ["autogroup:internet:*"];
+
src = [
+
"90008@gaze.systems"
+
"tag:private-infra"
+
];
+
dst = [ "autogroup:internet:*" ];
}
{
-
src = ["ellite@ellite.dev"];
-
dst = ["chernobog:8463"];
+
src = [ "ellite@ellite.dev" ];
+
dst = [ "chernobog:8463" ];
}
];
};
···
};
};
-
# security.acme.certs.${rootDomain}.extraDomainNames = [domain];
services.nginx.virtualHosts.${domain} = {
useACMEHost = domain;
+4 -1
hosts/dzwonek/modules/nginx.nix
···
statusPage = true;
};
-
networking.firewall.allowedTCPPorts = [ 80 443 ];
+
networking.firewall.allowedTCPPorts = [
+
80
+
443
+
];
# output json logs so we can consume them more easily
services.nginx.appendHttpConfig = ''
+4 -3
hosts/dzwonek/modules/tailscale.nix
···
-
{config, ...}: {
-
imports = [../../../modules/network/tailscale.nix];
-
+
{ config, ... }:
+
{
+
imports = [ ../../../modules/network/tailscale.nix ];
+
# age.secrets.tailscaleAuthKey.file = ../../../secrets/tailscaleAuthKey.age;
# services.tailscale.authKeyFile = config.age.secrets.tailscaleAuthKey.path;
}
+1 -1
hosts/volsinii/disk-config.nix
···
};
};
};
-
}
+
}
+17 -6
hosts/volsinii/modules/hardware-configuration.nix
···
# Do not modify this file! It was generated by ‘nixos-generate-config’
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
-
{ config, lib, pkgs, modulesPath, ... }:
+
{
+
config,
+
lib,
+
pkgs,
+
modulesPath,
+
...
+
}:
{
imports = [ ];
-
boot.initrd.availableKernelModules = [ "ata_piix" "sr_mod" "xen_blkfront" ];
+
boot.initrd.availableKernelModules = [
+
"ata_piix"
+
"sr_mod"
+
"xen_blkfront"
+
];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ ];
boot.extraModulePackages = [ ];
···
systemd.network.enable = true;
systemd.network.wait-online.enable = false;
systemd.network.networks."enX0" = {
-
matchConfig = { Name = "enX0"; };
-
address = ["199.71.188.53/29"];
-
gateway = ["199.71.188.49"];
+
matchConfig = {
+
Name = "enX0";
+
};
+
address = [ "199.71.188.53/29" ];
+
gateway = [ "199.71.188.49" ];
};
-
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
}
+4 -3
hosts/volsinii/modules/tailscale.nix
···
-
{config, ...}: {
-
imports = [../../../modules/network/tailscale.nix];
-
+
{ config, ... }:
+
{
+
imports = [ ../../../modules/network/tailscale.nix ];
+
# age.secrets.tailscaleAuthKey.file = ../../../secrets/tailscaleAuthKey.age;
# services.tailscale.authKeyFile = config.age.secrets.tailscaleAuthKey.path;
}
+15 -10
hosts/wolumonde/modules/atproto.nix
···
}) files
);
};
-
mkHandleCfg = rootDomain: did: (mkWellKnownCfg {
-
"atproto-did" = pkgs.writeText "server" did;
-
})
-
// {
-
useACMEHost = rootDomain;
-
forceSSL = true;
-
quic = true;
-
kTLS = true;
-
};
+
mkHandleCfg =
+
rootDomain: did:
+
(mkWellKnownCfg {
+
"atproto-did" = pkgs.writeText "server" did;
+
})
+
// {
+
useACMEHost = rootDomain;
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
};
mkDidWebCfg = domain: {
"${domain}" =
(mkWellKnownCfg {
···
in
{
security.acme.certs."gaze.systems".extraDomainNames = [
-
dawnDid guestbookDid "drew.gaze.systems" "test.gaze.systems"
+
dawnDid
+
guestbookDid
+
"drew.gaze.systems"
+
"test.gaze.systems"
];
services.nginx.virtualHosts = {
"test.gaze.systems" = mkHandleCfg "gaze.systems" "did:web:dawn.gaze.systems";
+4 -2
hosts/wolumonde/modules/clickee-proxy.nix
···
-
{config, terra, ...}: let
+
{ config, terra, ... }:
+
let
port = 7145;
-
in {
+
in
+
{
age.secrets.clickeeProxyConfig = {
file = ../../../secrets/clickeeProxyConfig.age;
};
+59 -56
hosts/wolumonde/modules/email.nix
···
-
{pkgs, ...}: {
-
security.acme.certs."ptr.pet".extraDomainNames = [
-
"mta-sts.ptr.pet"
-
"autoconfig.ptr.pet"
-
"autodiscover.ptr.pet"
-
"test.ptr.pet"
-
];
-
services.nginx.virtualHosts."test.ptr.pet" = {
-
useACMEHost = "ptr.pet";
-
quic = true;
-
kTLS = true;
-
forceSSL = true;
+
{ pkgs, ... }:
+
{
+
security.acme.certs."ptr.pet".extraDomainNames = [
+
"mta-sts.ptr.pet"
+
"autoconfig.ptr.pet"
+
"autodiscover.ptr.pet"
+
"test.ptr.pet"
+
];
+
services.nginx.virtualHosts."test.ptr.pet" = {
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
};
+
services.nginx.virtualHosts."ptr.pet" = {
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/mail/config-v1.1.xml" = {
+
return = "301 https://autoconfig.migadu.com/mail/config-v1.1.xml";
};
-
services.nginx.virtualHosts."ptr.pet" = {
-
useACMEHost = "ptr.pet";
-
quic = true;
-
kTLS = true;
-
forceSSL = true;
-
locations."/mail/config-v1.1.xml" = {
-
return = "301 https://autoconfig.migadu.com/mail/config-v1.1.xml";
-
};
-
locations."/Autodiscover/Autodiscover.xml" = {
-
return = "301 https://autodiscover.migadu.com/Autodiscover/Autodiscover.xml";
-
};
+
locations."/Autodiscover/Autodiscover.xml" = {
+
return = "301 https://autodiscover.migadu.com/Autodiscover/Autodiscover.xml";
};
-
services.nginx.virtualHosts."mta-sts.ptr.pet" = let
-
file = pkgs.writeText "mta-sts.txt" ''
-
version: STSv1
-
mode: enforce
-
mx: aspmx1.migadu.com
-
mx: aspmx2.migadu.com
-
max_age: 31557600
-
'';
-
in {
-
useACMEHost = "ptr.pet";
-
quic = true;
-
kTLS = true;
-
forceSSL = true;
-
locations."=/.well-known/mta-sts.txt".extraConfig = ''
-
alias ${file};
-
default_type text/plain;
-
'';
+
};
+
services.nginx.virtualHosts."mta-sts.ptr.pet" =
+
let
+
file = pkgs.writeText "mta-sts.txt" ''
+
version: STSv1
+
mode: enforce
+
mx: aspmx1.migadu.com
+
mx: aspmx2.migadu.com
+
max_age: 31557600
+
'';
+
in
+
{
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."=/.well-known/mta-sts.txt".extraConfig = ''
+
alias ${file};
+
default_type text/plain;
+
'';
};
-
services.nginx.virtualHosts."autoconfig.ptr.pet" = {
-
useACMEHost = "ptr.pet";
-
quic = true;
-
kTLS = true;
-
forceSSL = true;
-
locations."/" = {
-
return = "301 https://autoconfig.migadu.com$request_uri";
-
};
+
services.nginx.virtualHosts."autoconfig.ptr.pet" = {
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/" = {
+
return = "301 https://autoconfig.migadu.com$request_uri";
};
-
services.nginx.virtualHosts."autodiscover.ptr.pet" = {
-
useACMEHost = "ptr.pet";
-
quic = true;
-
kTLS = true;
-
forceSSL = true;
-
locations."/" = {
-
return = "301 https://autodiscover.migadu.com$request_uri";
-
};
+
};
+
services.nginx.virtualHosts."autodiscover.ptr.pet" = {
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/" = {
+
return = "301 https://autodiscover.migadu.com$request_uri";
};
+
};
}
+1 -1
hosts/wolumonde/modules/forgejo.nix/default.nix
···
"public"
];
-
security.acme.certs."gaze.systems".extraDomainNames = [forgejoCfg.server.DOMAIN];
+
security.acme.certs."gaze.systems".extraDomainNames = [ forgejoCfg.server.DOMAIN ];
services.nginx.virtualHosts.${forgejoCfg.server.DOMAIN} = {
useACMEHost = "gaze.systems";
forceSSL = true;
+4 -4
hosts/wolumonde/modules/hedgedoc.nix
···
-
{ config, ... }: let
+
{ config, ... }:
+
let
cfg = config.services.hedgedoc.settings;
in
{
···
};
};
-
security.acme.certs."gaze.systems".extraDomainNames = [cfg.domain];
+
security.acme.certs."gaze.systems".extraDomainNames = [ cfg.domain ];
services.nginx.virtualHosts.${cfg.domain} = {
useACMEHost = "gaze.systems";
forceSSL = true;
quic = true;
kTLS = true;
-
locations."/".proxyPass =
-
"http://${cfg.host}:${toString cfg.port}";
+
locations."/".proxyPass = "http://${cfg.host}:${toString cfg.port}";
};
}
+5 -3
hosts/wolumonde/modules/openbao.disabled/default.nix
···
-
{lib, config, ...}: let
+
{ lib, config, ... }:
+
let
port = 5394;
domain = "bao.${config.services.headscale.settings.dns.base_domain}";
cfg = config.services.openbao.settings;
apiAddress = "127.0.0.1:${toString port}";
-
in {
-
imports = [./spindle-proxy];
+
in
+
{
+
imports = [ ./spindle-proxy ];
services.openbao = {
enable = true;
+48 -35
hosts/wolumonde/modules/openbao.disabled/spindle-proxy/default.nix
···
-
{ config, lib, pkgs, ... }:
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}:
let
port = 8945;
secrets = config.age.secrets;
cfgFile = pkgs.writeText "openbao-proxy-spindle-config.hcl" (
lib.replaceStrings
-
[
-
"%role_id%"
-
"%secret_id%"
-
"%vault_address%"
-
"%listener_port%"
-
"%name%"
-
]
-
[
-
secrets.spindleOpenbaoRoleId.path
-
secrets.spindleOpenbaoSecretId.path
-
config.services.openbao.settings.api_addr
-
(toString port)
-
name
-
]
-
(lib.fileContents ./config.hcl)
+
[
+
"%role_id%"
+
"%secret_id%"
+
"%vault_address%"
+
"%listener_port%"
+
"%name%"
+
]
+
[
+
secrets.spindleOpenbaoRoleId.path
+
secrets.spindleOpenbaoSecretId.path
+
config.services.openbao.settings.api_addr
+
(toString port)
+
name
+
]
+
(lib.fileContents ./config.hcl)
);
domain = "spindle.bao.lan.gaze.systems";
name = "openbao-proxy-spindle";
···
group = name;
};
users.groups.${name} = {
-
members = [name];
+
members = [ name ];
};
systemd.services.${name} = {
···
LimitNOFILE = "65536";
User = name;
Group = name;
-
RuntimeDirectory=name;
-
RuntimeDirectoryMode=0700;
-
StateDirectory=name;
-
StateDirectoryMode=0700;
-
ProcSubset="pid";
-
ProtectClock=true;
-
ProtectControlGroups=true;
-
ProtectHome=true;
-
ProtectHostname=true;
-
ProtectKernelLogs=true;
-
ProtectKernelModules=true;
-
ProtectKernelTunables=true;
-
ProtectProc="invisible";
-
RestrictNamespaces=true;
-
RestrictRealtime=true;
-
RestrictAddressFamilies=["AF_INET" "AF_INET6" "AF_UNIX"];
-
SystemCallArchitectures="native";
-
SystemCallFilter=["@system-service" "@resources" "~@privileged"];
+
RuntimeDirectory = name;
+
RuntimeDirectoryMode = 0700;
+
StateDirectory = name;
+
StateDirectoryMode = 0700;
+
ProcSubset = "pid";
+
ProtectClock = true;
+
ProtectControlGroups = true;
+
ProtectHome = true;
+
ProtectHostname = true;
+
ProtectKernelLogs = true;
+
ProtectKernelModules = true;
+
ProtectKernelTunables = true;
+
ProtectProc = "invisible";
+
RestrictNamespaces = true;
+
RestrictRealtime = true;
+
RestrictAddressFamilies = [
+
"AF_INET"
+
"AF_INET6"
+
"AF_UNIX"
+
];
+
SystemCallArchitectures = "native";
+
SystemCallFilter = [
+
"@system-service"
+
"@resources"
+
"~@privileged"
+
];
};
};
+6 -3
hosts/wolumonde/modules/perses.nix/default.nix
···
systemd.services.perses = {
description = "perses";
-
after = ["network.target" "pocket-id.service"];
-
requires = ["pocket-id.service"];
+
after = [
+
"network.target"
+
"pocket-id.service"
+
];
+
requires = [ "pocket-id.service" ];
serviceConfig = {
ExecStart = "${pkgs.perses}/bin/perses --config=${persesConfigYaml} --web.listen-address=:${toString port} --log.level=info";
EnvironmentFile = secrets.persesSecret.path;
···
cp -f ${./provision}/* ${provisioningFolder}
'';
-
security.acme.certs."gaze.systems".extraDomainNames = [domain];
+
security.acme.certs."gaze.systems".extraDomainNames = [ domain ];
services.nginx.virtualHosts.${domain} = {
useACMEHost = "gaze.systems"; # TODO: write a module to define vhosts for subdomains
quic = true;
+1 -1
hosts/wolumonde/modules/pocket-id.nix
···
};
};
-
security.acme.certs."gaze.systems".extraDomainNames = [domain];
+
security.acme.certs."gaze.systems".extraDomainNames = [ domain ];
services.nginx.virtualHosts.${domain} = {
useACMEHost = "gaze.systems";
+2 -2
hosts/wolumonde/modules/tailscale.nix
···
{ config, ... }:
{
-
imports = [../../../modules/network/tailscale.nix];
-
+
imports = [ ../../../modules/network/tailscale.nix ];
+
# age.secrets.tailscaleAuthKey.file = ../../../secrets/tailscaleAuthKey.age;
# services.tailscale.authKeyFile = config.age.secrets.tailscaleAuthKey.path;
+4 -1
hosts/wolumonde/modules/tangled.nix/default.nix
···
{
-
imports = [./knot.nix ./spindle.nix];
+
imports = [
+
./knot.nix
+
./spindle.nix
+
];
}
+1 -1
hosts/wolumonde/modules/tangled.nix/knot.nix
···
};
};
-
security.acme.certs."gaze.systems".extraDomainNames = [knotCfg.server.hostname];
+
security.acme.certs."gaze.systems".extraDomainNames = [ knotCfg.server.hostname ];
services.nginx.virtualHosts.${knotCfg.server.hostname} = {
useACMEHost = "gaze.systems";
+1 -1
hosts/wolumonde/modules/tangled.nix/spindle.nix
···
};
};
-
security.acme.certs."gaze.systems".extraDomainNames = [spindleCfg.server.hostname];
+
security.acme.certs."gaze.systems".extraDomainNames = [ spindleCfg.server.hostname ];
services.nginx.virtualHosts.${spindleCfg.server.hostname} = {
useACMEHost = "gaze.systems";
+5 -3
hosts/wolumonde/modules/webhook.disabled/default.nix
···
-
{ config, tlib, ... }: let
+
{ config, tlib, ... }:
+
let
domain = "webhook.gaze.systems";
-
in {
+
in
+
{
imports = tlib.importFolder ./.;
services.webhook = {
···
group = "nginx";
};
-
security.acme.certs."gaze.systems".extraDomainNames = [domain];
+
security.acme.certs."gaze.systems".extraDomainNames = [ domain ];
services.nginx.virtualHosts.${domain} = {
useACMEHost = "gaze.systems";
forceSSL = true;
+15 -14
hosts/wolumonde/modules/webhook.disabled/deploy-wolumonde.nix
···
-
{ pkgs, ... }: let
+
{ pkgs, ... }:
+
let
port = toString 9000;
-
in {
+
in
+
{
services.webhook.hooks."deploy-wolumonde" = {
execute-command = "${pkgs.curl}/bin/curl";
-
pass-arguments-to-command =
-
builtins.map
-
(n: {
-
source = "string";
-
name = n;
-
})
-
[ "http://higashi:${port}/hooks/deploy-wolumonde" ];
+
pass-arguments-to-command = builtins.map (n: {
+
source = "string";
+
name = n;
+
}) [ "http://higashi:${port}/hooks/deploy-wolumonde" ];
};
-
services.headscale.acl.rules = [{
-
proto = "tcp";
-
src = ["wolumonde"];
-
dst = ["higashi:${port}"];
-
}];
+
services.headscale.acl.rules = [
+
{
+
proto = "tcp";
+
src = [ "wolumonde" ];
+
dst = [ "higashi:${port}" ];
+
}
+
];
}
+4 -1
users/dusk@devel.mobi/default.nix
···
enable = true;
controlServer = "https://vpn.gaze.systems";
authKeyFile = config.age.secrets.tailscaleAuthKey.path;
-
extraUpFlags = [ "--advertise-exit-node=true" "--hostname=dusk-devel-mobi" ];
+
extraUpFlags = [
+
"--advertise-exit-node=true"
+
"--hostname=dusk-devel-mobi"
+
];
};
programs = {
+10 -10
users/modules/ssh/default.nix
···
enable = true;
enableDefaultConfig = false;
matchBlocks."*" = {
-
forwardAgent = false;
-
serverAliveInterval = 0;
-
serverAliveCountMax = 3;
-
compression = true;
-
hashKnownHosts = true;
-
addKeysToAgent = "yes";
-
userKnownHostsFile = "~/.ssh/known_hosts";
-
controlMaster = "no";
-
controlPath = "~/.ssh/master-%r@%n:%p";
-
controlPersist = "no";
+
forwardAgent = false;
+
serverAliveInterval = 0;
+
serverAliveCountMax = 3;
+
compression = true;
+
hashKnownHosts = true;
+
addKeysToAgent = "yes";
+
userKnownHostsFile = "~/.ssh/known_hosts";
+
controlMaster = "no";
+
controlPath = "~/.ssh/master-%r@%n:%p";
+
controlPersist = "no";
};
# Only needed for darcs hub
# extraConfig = ''