ops/nixos: rework everything to factor common things out
This commit is contained in:
parent
f99775ddf2
commit
1e7fcadc97
9 changed files with 386 additions and 179 deletions
|
@ -1,8 +1,12 @@
|
||||||
{ depot, lib, pkgs, rebuilder, ... }:
|
{ depot, lib, pkgs, rebuilder, config, ... }:
|
||||||
{ config, ... }:
|
|
||||||
let
|
let
|
||||||
inherit (depot.ops) secrets;
|
inherit (depot.ops) secrets;
|
||||||
in {
|
in {
|
||||||
|
imports = [
|
||||||
|
../lib/zfs.nix
|
||||||
|
../lib/bgp.nix
|
||||||
|
];
|
||||||
|
|
||||||
boot.initrd.availableKernelModules = [
|
boot.initrd.availableKernelModules = [
|
||||||
"xhci_pci"
|
"xhci_pci"
|
||||||
"ahci"
|
"ahci"
|
||||||
|
@ -12,24 +16,7 @@ in {
|
||||||
"sd_mod"
|
"sd_mod"
|
||||||
"sr_mod"
|
"sr_mod"
|
||||||
];
|
];
|
||||||
boot.kernelModules = [ "kvm-intel" "tcp_bbr" ];
|
boot.kernelModules = [ "kvm-intel" ];
|
||||||
boot.kernel.sysctl = {
|
|
||||||
"net.ipv6.conf.default.accept_ra" = 0;
|
|
||||||
"net.ipv6.conf.all.accept_ra" = 0;
|
|
||||||
"net.ipv6.conf.default.autoconf" = 0;
|
|
||||||
"net.ipv6.conf.all.autoconf" = 0;
|
|
||||||
};
|
|
||||||
boot.supportedFilesystems = [ "zfs" ];
|
|
||||||
boot.zfs.devNodes = "/dev/disk/by-partuuid";
|
|
||||||
services.zfs.autoScrub.enable = true;
|
|
||||||
services.zfs.autoSnapshot = {
|
|
||||||
enable = true;
|
|
||||||
monthly = 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
boot.initrd.postDeviceCommands = lib.mkAfter ''
|
|
||||||
zfs rollback -r zfast/local/root@blank
|
|
||||||
'';
|
|
||||||
|
|
||||||
powerManagement.cpuFreqGovernor = lib.mkDefault "performance";
|
powerManagement.cpuFreqGovernor = lib.mkDefault "performance";
|
||||||
|
|
||||||
|
@ -52,11 +39,6 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
nix.maxJobs = lib.mkDefault 12;
|
nix.maxJobs = lib.mkDefault 12;
|
||||||
hardware.enableRedistributableFirmware = true;
|
|
||||||
|
|
||||||
nixpkgs.config = { allowUnfree = true; };
|
|
||||||
|
|
||||||
nix.nixPath = [ "depot=/home/lukegb/depot/" "nixpkgs=/home/lukegb/depot/third_party/nixpkgs/" ];
|
|
||||||
|
|
||||||
# Use systemd-boot.
|
# Use systemd-boot.
|
||||||
boot.loader.systemd-boot.enable = true;
|
boot.loader.systemd-boot.enable = true;
|
||||||
|
@ -91,19 +73,10 @@ in {
|
||||||
firewall.allowPing = true;
|
firewall.allowPing = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Select internationalisation properties.
|
|
||||||
i18n.defaultLocale = "en_GB.UTF-8";
|
|
||||||
console.keyMap = "us";
|
|
||||||
|
|
||||||
# Set your time zone.
|
|
||||||
time.timeZone = "Etc/UTC";
|
|
||||||
|
|
||||||
# List packages installed in system profile. To search, run:
|
# List packages installed in system profile. To search, run:
|
||||||
# $ nix search wget
|
# $ nix search wget
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
vim
|
|
||||||
mercurial
|
mercurial
|
||||||
rxvt_unicode.terminfo
|
|
||||||
rebuilder
|
rebuilder
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -113,13 +86,7 @@ in {
|
||||||
# Define a user account.
|
# Define a user account.
|
||||||
users.mutableUsers = false;
|
users.mutableUsers = false;
|
||||||
users.users = {
|
users.users = {
|
||||||
root.hashedPassword = secrets.passwordHashes.root;
|
lukegb.extraGroups = [ "wheel" "content" ];
|
||||||
lukegb = {
|
|
||||||
isNormalUser = true;
|
|
||||||
uid = 1000;
|
|
||||||
extraGroups = [ "wheel" "content" ];
|
|
||||||
hashedPassword = secrets.passwordHashes.root;
|
|
||||||
};
|
|
||||||
content = {
|
content = {
|
||||||
isSystemUser = true;
|
isSystemUser = true;
|
||||||
extraGroups = [ "content" ];
|
extraGroups = [ "content" ];
|
||||||
|
@ -129,9 +96,6 @@ in {
|
||||||
content = {};
|
content = {};
|
||||||
};
|
};
|
||||||
|
|
||||||
boot.kernel.sysctl."net.ipv4.tcp_congestion_control" = "bbr";
|
|
||||||
boot.kernel.sysctl."net.core.default_qdisc" = "fq_codel";
|
|
||||||
|
|
||||||
services.openssh.hostKeys = [
|
services.openssh.hostKeys = [
|
||||||
{
|
{
|
||||||
path = "/persist/etc/ssh/ssh_host_ed25519_key";
|
path = "/persist/etc/ssh/ssh_host_ed25519_key";
|
||||||
|
|
|
@ -1,10 +1,16 @@
|
||||||
{ depot, lib, pkgs, ... }@args:
|
{ depot, lib, pkgs, ... }@args:
|
||||||
let
|
let
|
||||||
inherit (builtins) foldl' mapAttrs;
|
inherit (builtins) foldl' mapAttrs;
|
||||||
systemFor = config:
|
baseModule = name: { ... }: {
|
||||||
(depot.third_party.nixos {
|
_module.args = args // {
|
||||||
configuration = config;
|
rebuilder = rebuilder name;
|
||||||
}).system;
|
};
|
||||||
|
};
|
||||||
|
systemFor = systemName: config:
|
||||||
|
(depot.third_party.nixeval {
|
||||||
|
system = builtins.currentSystem;
|
||||||
|
modules = [ (baseModule systemName) (args: { imports = [ lib/common.nix config ]; }) ];
|
||||||
|
}).config.system.build.toplevel;
|
||||||
systems = [ "porcorosso" "ixvm-fra01" "marukuru" "clouvider-fra01" ];
|
systems = [ "porcorosso" "ixvm-fra01" "marukuru" "clouvider-fra01" ];
|
||||||
rebuilder = system:
|
rebuilder = system:
|
||||||
pkgs.writeShellScriptBin "rebuilder" ''
|
pkgs.writeShellScriptBin "rebuilder" ''
|
||||||
|
@ -18,7 +24,6 @@ let
|
||||||
"$system/bin/switch-to-configuration" switch
|
"$system/bin/switch-to-configuration" switch
|
||||||
'';
|
'';
|
||||||
systemCfgs = lib.genAttrs systems
|
systemCfgs = lib.genAttrs systems
|
||||||
(name: import (./. + "/${name}") (args // { rebuilder = rebuilder name; }));
|
(name: import (./. + "/${name}"));
|
||||||
mapAttrValues = (f: set: mapAttrs (name: f) set);
|
systemDrvs = mapAttrs systemFor systemCfgs;
|
||||||
systemDrvs = mapAttrValues (systemCfg: systemFor systemCfg) systemCfgs;
|
|
||||||
in systemDrvs
|
in systemDrvs
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
{ depot, lib, pkgs, rebuilder, ... }:
|
{ depot, lib, pkgs, rebuilder, config, ... }:
|
||||||
{ config, ... }:
|
|
||||||
let
|
let
|
||||||
inherit (depot.ops) secrets;
|
inherit (depot.ops) secrets;
|
||||||
in {
|
in {
|
||||||
imports = [ ./bird.nix ];
|
imports = [ ../lib/bgp.nix ];
|
||||||
|
|
||||||
boot.initrd.availableKernelModules = [
|
boot.initrd.availableKernelModules = [
|
||||||
"ata_piix"
|
"ata_piix"
|
||||||
|
@ -11,13 +10,6 @@ in {
|
||||||
"sd_mod"
|
"sd_mod"
|
||||||
"sr_mod"
|
"sr_mod"
|
||||||
];
|
];
|
||||||
boot.kernelModules = [ "tcp_bbr" ];
|
|
||||||
boot.kernel.sysctl = {
|
|
||||||
"net.ipv6.conf.default.accept_ra" = 0;
|
|
||||||
"net.ipv6.conf.all.accept_ra" = 0;
|
|
||||||
"net.ipv6.conf.default.autoconf" = 0;
|
|
||||||
"net.ipv6.conf.all.autoconf" = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
fileSystems = {
|
fileSystems = {
|
||||||
"/" = {
|
"/" = {
|
||||||
|
@ -30,11 +22,6 @@ in {
|
||||||
];
|
];
|
||||||
|
|
||||||
nix.maxJobs = lib.mkDefault 2;
|
nix.maxJobs = lib.mkDefault 2;
|
||||||
hardware.enableRedistributableFirmware = true;
|
|
||||||
|
|
||||||
nixpkgs.config = { allowUnfree = true; };
|
|
||||||
|
|
||||||
nix.nixPath = [ "depot=/home/lukegb/depot/" "nixpkgs=/home/lukegb/depot/third_party/nixpkgs/" ];
|
|
||||||
|
|
||||||
# Use GRUB2.
|
# Use GRUB2.
|
||||||
boot.loader.grub.enable = true;
|
boot.loader.grub.enable = true;
|
||||||
|
@ -95,43 +82,100 @@ in {
|
||||||
ATTR{address}=="00:50:56:a3:6e:0f", NAME="ens-nlix"
|
ATTR{address}=="00:50:56:a3:6e:0f", NAME="ens-nlix"
|
||||||
'';
|
'';
|
||||||
|
|
||||||
# Select internationalisation properties.
|
environment.systemPackages = with pkgs; [];
|
||||||
i18n.defaultLocale = "en_GB.UTF-8";
|
|
||||||
console.keyMap = "us";
|
|
||||||
|
|
||||||
# Set your time zone.
|
|
||||||
time.timeZone = "Etc/UTC";
|
|
||||||
|
|
||||||
# List packages installed in system profile. To search, run:
|
|
||||||
# $ nix search wget
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
vim
|
|
||||||
mercurial
|
|
||||||
rxvt_unicode.terminfo
|
|
||||||
rebuilder
|
|
||||||
];
|
|
||||||
|
|
||||||
programs.mtr.enable = true;
|
|
||||||
services.openssh.enable = true;
|
|
||||||
|
|
||||||
networking.firewall = {
|
|
||||||
allowPing = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Define a user account.
|
# Define a user account.
|
||||||
users.mutableUsers = false;
|
|
||||||
users.users = {
|
users.users = {
|
||||||
root.hashedPassword = secrets.passwordHashes.root;
|
lukegb.extraGroups = [ "networkmanager" "bird2" ];
|
||||||
lukegb = {
|
|
||||||
isNormalUser = true;
|
|
||||||
uid = 1000;
|
|
||||||
extraGroups = [ "wheel" "networkmanager" "bird2" ];
|
|
||||||
hashedPassword = secrets.passwordHashes.root;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
boot.kernel.sysctl."net.ipv4.tcp_congestion_control" = "bbr";
|
services.lukegbgp = let local = {
|
||||||
boot.kernel.sysctl."net.core.default_qdisc" = "fq_codel";
|
asn = 205479;
|
||||||
|
}; in {
|
||||||
|
enable = true;
|
||||||
|
config = {
|
||||||
|
local = {
|
||||||
|
routerID = "141.98.136.124";
|
||||||
|
};
|
||||||
|
peering = {
|
||||||
|
ixvm = {
|
||||||
|
local = local // {
|
||||||
|
v4 = "141.98.136.124";
|
||||||
|
v6 = "2a09:11c0:f1:bc0b::2";
|
||||||
|
};
|
||||||
|
remote = {
|
||||||
|
asn = 209844;
|
||||||
|
export_community = 2000;
|
||||||
|
routers = [{
|
||||||
|
v4 = "141.98.136.97";
|
||||||
|
v6 = "2a09:11c0:f1:bc0b::1";
|
||||||
|
} {
|
||||||
|
v4 = "141.98.136.126";
|
||||||
|
v6 = "2a09:11c0:f1:bc0b::3";
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
kleyrex = {
|
||||||
|
local = local // {
|
||||||
|
v4 = "193.189.83.41";
|
||||||
|
v6 = "2001:7f8:33::a120:5479:1";
|
||||||
|
};
|
||||||
|
remote = {
|
||||||
|
asn = 31142;
|
||||||
|
export_community = 2001;
|
||||||
|
routers = [{
|
||||||
|
v4 = "193.189.82.251";
|
||||||
|
v6 = "2001:7f8:33::a103:1142:1";
|
||||||
|
} {
|
||||||
|
v4 = "193.189.82.252";
|
||||||
|
v6 = "2001:7f8:33::a103:1142:2";
|
||||||
|
} {
|
||||||
|
v4 = "193.189.82.253";
|
||||||
|
v6 = "2001:7f8:33::a103:1142:3";
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
locix = {
|
||||||
|
local = local // {
|
||||||
|
v4 = "185.1.166.219";
|
||||||
|
v6 = "2001:7f8:f2:e1::a20:5479:1";
|
||||||
|
};
|
||||||
|
remote = {
|
||||||
|
asn = 202409;
|
||||||
|
export_community = 2002;
|
||||||
|
routers = [{
|
||||||
|
v4 = "185.1.166.100";
|
||||||
|
v6 = "2001:7f8:f2:e1::babe:1";
|
||||||
|
} {
|
||||||
|
v4 = "185.1.166.200";
|
||||||
|
v6 = "2001:7f8:f2:e1::dead:1";
|
||||||
|
} {
|
||||||
|
v4 = "185.1.166.254";
|
||||||
|
v6 = "2001:7f8:f2:e1::be5a";
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
nlix = {
|
||||||
|
local = local // {
|
||||||
|
v4 = "193.239.118.225";
|
||||||
|
v6 = "2001:7f8:13::a520:5479:1";
|
||||||
|
};
|
||||||
|
remote = {
|
||||||
|
asn = 34307;
|
||||||
|
export_community = 2003;
|
||||||
|
routers = [{
|
||||||
|
v4 = "193.239.116.255";
|
||||||
|
v6 = "2001:7f8:13::a503:4307:1";
|
||||||
|
} {
|
||||||
|
enabled = false;
|
||||||
|
v4 = "193.239.117.0";
|
||||||
|
v6 = "2001:7f8:13::a503:4307:2";
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
system.stateVersion = "20.03";
|
system.stateVersion = "20.03";
|
||||||
}
|
}
|
||||||
|
|
180
ops/nixos/lib/bgp.nix
Normal file
180
ops/nixos/lib/bgp.nix
Normal file
|
@ -0,0 +1,180 @@
|
||||||
|
{ lib, config, ... }:
|
||||||
|
let
|
||||||
|
generateSnippet = base: args: lib.concatStringsSep "\n" (lib.mapAttrsToList ( ixName: ix: generateSnippetForIX (args // { ixName = ixName; ix = ix; }) ) base );
|
||||||
|
generateSnippetForIX = { ixName, ix, ... }@args: ''
|
||||||
|
ipv4 table ${ixName}4;
|
||||||
|
ipv6 table ${ixName}6;
|
||||||
|
protocol pipe ${ixName}pipe_4 {
|
||||||
|
table ${ixName}4;
|
||||||
|
peer table master4;
|
||||||
|
import where ((ro, ${toString ix.local.asn}, ${toString ix.remote.export_community}) ~ bgp_ext_community);
|
||||||
|
export all;
|
||||||
|
};
|
||||||
|
protocol pipe ${ixName}pipe_6 {
|
||||||
|
table ${ixName}6;
|
||||||
|
peer table master6;
|
||||||
|
import where ((ro, ${toString ix.local.asn}, ${toString ix.remote.export_community}) ~ bgp_ext_community);
|
||||||
|
export all;
|
||||||
|
};
|
||||||
|
'' + lib.concatImapStringsSep "\n" ( i: v: generateSnippetForRouter (args // { routerNum = i; router = v; }) ) ix.remote.routers;
|
||||||
|
enabledSnippet = { enabled ? true, ... }: "disabled ${if enabled then "off" else "on"}";
|
||||||
|
generateSnippetForRouter = { ixName, ix, routerNum, router, ... }: ''
|
||||||
|
protocol bgp ${ixName}${toString routerNum}_4 {
|
||||||
|
${enabledSnippet router};
|
||||||
|
local ${ix.local.v4} as ${toString ix.local.asn};
|
||||||
|
neighbor ${router.v4} as ${toString ix.remote.asn};
|
||||||
|
ipv4 {
|
||||||
|
table ${ixName}4;
|
||||||
|
import all;
|
||||||
|
export where ((ro, ${toString ix.local.asn}, 1000) ~ bgp_ext_community);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
protocol bgp ${ixName}${toString routerNum}_6 {
|
||||||
|
${enabledSnippet router};
|
||||||
|
local ${ix.local.v6} as ${toString ix.local.asn};
|
||||||
|
neighbor ${router.v6} as ${toString ix.remote.asn};
|
||||||
|
ipv6 {
|
||||||
|
table ${ixName}6;
|
||||||
|
import all;
|
||||||
|
export where ((ro, ${toString ix.local.asn}, 1000) ~ bgp_ext_community);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
'';
|
||||||
|
|
||||||
|
inherit (lib) mkOption mkAfter types;
|
||||||
|
in {
|
||||||
|
options.services.lukegbgp = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
};
|
||||||
|
config = mkOption { # lukegbgp.config
|
||||||
|
type = with types; submodule {
|
||||||
|
options = {
|
||||||
|
local = mkOption { # lukegbgp.config.local
|
||||||
|
type = submodule {
|
||||||
|
options = {
|
||||||
|
routerID = mkOption { # lukegbgp.config.local.routerID
|
||||||
|
type = str;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
peering = mkOption { # lukegbgp.config.peering
|
||||||
|
type = attrsOf (submodule {
|
||||||
|
options = {
|
||||||
|
local = mkOption { # lukegbgp.config.peering.<foo>.local
|
||||||
|
type = submodule {
|
||||||
|
options = {
|
||||||
|
asn = mkOption { # lukegbgp.config.peering.<foo>.local.asn
|
||||||
|
type = int;
|
||||||
|
};
|
||||||
|
v4 = mkOption { # lukegbgp.config.peering.<foo>.local.v4
|
||||||
|
type = str;
|
||||||
|
};
|
||||||
|
v6 = mkOption { # lukegbgp.config.peering.<foo>.local.v6
|
||||||
|
type = str;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
remote = mkOption { # lukegbgp.config.peering.<foo>.remote
|
||||||
|
type = submodule {
|
||||||
|
options = {
|
||||||
|
asn = mkOption { # lukegbgp.config.peering.<foo>.remote.asn
|
||||||
|
type = int;
|
||||||
|
};
|
||||||
|
export_community = mkOption { # lukegbgp.config.peering.<foo>.remote.export_community
|
||||||
|
type = int;
|
||||||
|
};
|
||||||
|
routers = mkOption { # lukegbgp.config.peering.<foo>.remote.routers
|
||||||
|
type = listOf (submodule {
|
||||||
|
options = {
|
||||||
|
enabled = mkOption { # lukegbgp.config.peering.<foo>.remote.routers.<n>.enabled
|
||||||
|
type = bool;
|
||||||
|
default = true;
|
||||||
|
};
|
||||||
|
v4 = mkOption { # lukegbgp.config.peering.<foo>.remote.routers.<n>.v4
|
||||||
|
type = str;
|
||||||
|
};
|
||||||
|
v6 = mkOption { # lukegbgp.config.peering.<foo>.remote.routers.<n>.v6
|
||||||
|
type = str;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
services.bird2 = lib.mkIf config.services.lukegbgp.enable {
|
||||||
|
enable = true;
|
||||||
|
config = ''
|
||||||
|
router id ${config.services.lukegbgp.config.local.routerID};
|
||||||
|
|
||||||
|
${generateSnippet config.services.lukegbgp.config.peering {}}
|
||||||
|
|
||||||
|
protocol kernel {
|
||||||
|
persist;
|
||||||
|
ipv4 {
|
||||||
|
import none;
|
||||||
|
export all;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
protocol kernel {
|
||||||
|
persist;
|
||||||
|
ipv6 {
|
||||||
|
import none;
|
||||||
|
export all;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
protocol device {
|
||||||
|
};
|
||||||
|
|
||||||
|
protocol static export4 {
|
||||||
|
ipv4 {
|
||||||
|
import filter {
|
||||||
|
bgp_ext_community.add((ro, 205479, 1000));
|
||||||
|
bgp_ext_community.add((ro, 205479, 2000));
|
||||||
|
bgp_ext_community.add((ro, 205479, 2001));
|
||||||
|
bgp_ext_community.add((ro, 205479, 2002));
|
||||||
|
bgp_ext_community.add((ro, 205479, 2003));
|
||||||
|
accept;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
route 92.118.31.0/24 blackhole;
|
||||||
|
};
|
||||||
|
protocol static export6 {
|
||||||
|
ipv6 {
|
||||||
|
import filter {
|
||||||
|
bgp_ext_community.add((ro, 205479, 1000));
|
||||||
|
bgp_ext_community.add((ro, 205479, 2000));
|
||||||
|
bgp_ext_community.add((ro, 205479, 2001));
|
||||||
|
bgp_ext_community.add((ro, 205479, 2002));
|
||||||
|
bgp_ext_community.add((ro, 205479, 2003));
|
||||||
|
accept;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
route 2a09:a440::/48 blackhole;
|
||||||
|
};
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = lib.mkIf config.services.lukegbgp.enable (lib.mkAfter [ 179 ]);
|
||||||
|
|
||||||
|
boot.kernel.sysctl = {
|
||||||
|
"net.ipv6.conf.default.accept_ra" = 0;
|
||||||
|
"net.ipv6.conf.all.accept_ra" = 0;
|
||||||
|
"net.ipv6.conf.default.autoconf" = 0;
|
||||||
|
"net.ipv6.conf.all.autoconf" = 0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
44
ops/nixos/lib/common.nix
Normal file
44
ops/nixos/lib/common.nix
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
{ pkgs, depot, lib, rebuilder, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib) mkDefault;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
hardware.enableRedistributableFirmware = true;
|
||||||
|
|
||||||
|
nix.nixPath = [ "depot=/home/lukegb/depot/" "nixpkgs=/home/lukegb/depot/third_party/nixpkgs/" ];
|
||||||
|
|
||||||
|
i18n.defaultLocale = "en_GB.UTF-8";
|
||||||
|
console.keyMap = "us";
|
||||||
|
|
||||||
|
time.timeZone = mkDefault "Etc/UTC";
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
vim mercurial rxvt_unicode.terminfo rebuilder
|
||||||
|
];
|
||||||
|
|
||||||
|
networking.firewall = {
|
||||||
|
allowPing = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
nixpkgs.config = { allowUnfree = true; };
|
||||||
|
|
||||||
|
users.mutableUsers = false;
|
||||||
|
users.users = let secrets = depot.ops.secrets; in {
|
||||||
|
root.hashedPassword = secrets.passwordHashes.root;
|
||||||
|
lukegb = {
|
||||||
|
isNormalUser = true;
|
||||||
|
uid = 1000;
|
||||||
|
extraGroups = [ "wheel" ];
|
||||||
|
hashedPassword = secrets.passwordHashes.lukegb;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.mtr.enable = true;
|
||||||
|
services.openssh.enable = true;
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
kernelModules = [ "tcp_bbr" ];
|
||||||
|
kernel.sysctl."net.ipv4.tcp_congestion_control" = "bbr";
|
||||||
|
kernel.sysctl."net.core.default_qdisc" = "fq_codel";
|
||||||
|
};
|
||||||
|
}
|
32
ops/nixos/lib/zfs.nix
Normal file
32
ops/nixos/lib/zfs.nix
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
{ lib, config, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib) mkOption types mkAfter mkIf;
|
||||||
|
robCfg = config.services.zfs.rollbackOnBoot;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.services.zfs.rollbackOnBoot = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
};
|
||||||
|
snapshot = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "zpool/local/root@blank";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
boot.supportedFilesystems = [ "zfs" ];
|
||||||
|
boot.zfs.devNodes = "/dev/disk/by-partuuid";
|
||||||
|
services.zfs.autoScrub.enable = true;
|
||||||
|
services.zfs.autoSnapshot = {
|
||||||
|
enable = true;
|
||||||
|
monthly = 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.initrd.postDeviceCommands = mkIf robCfg.enable
|
||||||
|
mkAfter ''
|
||||||
|
zfs rollback -r ${robCfg.snapshot}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,5 +1,4 @@
|
||||||
{ depot, lib, pkgs, rebuilder, ... }:
|
{ depot, lib, pkgs, rebuilder, config, ... }:
|
||||||
{ config, ... }:
|
|
||||||
let
|
let
|
||||||
inherit (depot.ops) secrets;
|
inherit (depot.ops) secrets;
|
||||||
myPhp = pkgs.php.withExtensions ({ enabled, all }: enabled ++ [ all.apcu all.mailparse ]);
|
myPhp = pkgs.php.withExtensions ({ enabled, all }: enabled ++ [ all.apcu all.mailparse ]);
|
||||||
|
@ -54,23 +53,12 @@ in {
|
||||||
ATTR{address}=="52:54:00:84:e2:2a", NAME="eth0"
|
ATTR{address}=="52:54:00:84:e2:2a", NAME="eth0"
|
||||||
'';
|
'';
|
||||||
|
|
||||||
# Select internationalisation properties.
|
|
||||||
i18n.defaultLocale = "en_GB.UTF-8";
|
|
||||||
console.keyMap = "us";
|
|
||||||
|
|
||||||
# Set your time zone.
|
|
||||||
time.timeZone = "Etc/UTC";
|
|
||||||
|
|
||||||
# List packages installed in system profile. To search, run:
|
# List packages installed in system profile. To search, run:
|
||||||
# $ nix search wget
|
# $ nix search wget
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
vim
|
|
||||||
mercurial
|
|
||||||
gitAndTools.gitFull
|
gitAndTools.gitFull
|
||||||
nodejs
|
nodejs
|
||||||
rxvt_unicode.terminfo
|
|
||||||
python37Packages.pygments
|
python37Packages.pygments
|
||||||
rebuilder
|
|
||||||
myPhp
|
myPhp
|
||||||
];
|
];
|
||||||
environment.etc."php.d/cache.ini".text = ''
|
environment.etc."php.d/cache.ini".text = ''
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{ depot, lib, pkgs, rebuilder, ... }:
|
{ depot, lib, pkgs, rebuilder, config, ... }:
|
||||||
{ config, ... }:
|
|
||||||
let
|
let
|
||||||
inherit (depot.ops) secrets;
|
inherit (depot.ops) secrets;
|
||||||
nvidia-offload-profile = ''
|
nvidia-offload-profile = ''
|
||||||
|
@ -13,6 +12,10 @@ let
|
||||||
exec -a "$0" "$@"
|
exec -a "$0" "$@"
|
||||||
'');
|
'');
|
||||||
in {
|
in {
|
||||||
|
imports = [
|
||||||
|
../lib/zfs.nix
|
||||||
|
];
|
||||||
|
|
||||||
boot.initrd.availableKernelModules = [
|
boot.initrd.availableKernelModules = [
|
||||||
"xhci_pci"
|
"xhci_pci"
|
||||||
"ahci"
|
"ahci"
|
||||||
|
@ -22,7 +25,7 @@ in {
|
||||||
"sd_mod"
|
"sd_mod"
|
||||||
"rtsx_pci_sdmmc"
|
"rtsx_pci_sdmmc"
|
||||||
];
|
];
|
||||||
boot.kernelModules = [ "kvm-intel" "tcp_bbr" ];
|
boot.kernelModules = [ "kvm-intel" ];
|
||||||
|
|
||||||
fileSystems = let
|
fileSystems = let
|
||||||
zfs = device: {
|
zfs = device: {
|
||||||
|
@ -48,27 +51,12 @@ in {
|
||||||
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
|
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
|
||||||
hardware.enableRedistributableFirmware = true;
|
hardware.enableRedistributableFirmware = true;
|
||||||
|
|
||||||
nixpkgs.config = { allowUnfree = true; };
|
|
||||||
|
|
||||||
nix.nixPath = [ "depot=/home/lukegb/depot/" "nixpkgs=/home/lukegb/depot/third_party/nixpkgs/" ];
|
|
||||||
|
|
||||||
# Use the systemd-boot EFI boot loader.
|
# Use the systemd-boot EFI boot loader.
|
||||||
boot.loader.systemd-boot.enable = true;
|
boot.loader.systemd-boot.enable = true;
|
||||||
boot.loader.efi.canTouchEfiVariables = true;
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
|
|
||||||
# Nuke everything on boot.
|
# ZFS!
|
||||||
boot.initrd.postDeviceCommands = lib.mkAfter ''
|
services.zfs.rollbackOnBoot.enable = true;
|
||||||
zfs rollback -r zpool/local/root@blank
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Enable ZFS.
|
|
||||||
boot.supportedFilesystems = [ "zfs" ];
|
|
||||||
boot.zfs.devNodes = "/dev/disk/by-partuuid";
|
|
||||||
services.zfs.autoScrub.enable = true;
|
|
||||||
services.zfs.autoSnapshot = {
|
|
||||||
enable = true;
|
|
||||||
monthly = 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Enable HyperV guesting
|
# Enable HyperV guesting
|
||||||
virtualisation.hypervGuest.enable = true;
|
virtualisation.hypervGuest.enable = true;
|
||||||
|
@ -88,21 +76,12 @@ in {
|
||||||
networking.interfaces.eno1.useDHCP = false;
|
networking.interfaces.eno1.useDHCP = false;
|
||||||
networking.networkmanager.enable = true;
|
networking.networkmanager.enable = true;
|
||||||
|
|
||||||
# Configure network proxy if necessary
|
|
||||||
# networking.proxy.default = "http://user:password@proxy:port/";
|
|
||||||
# networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
|
|
||||||
|
|
||||||
# Select internationalisation properties.
|
|
||||||
i18n.defaultLocale = "en_GB.UTF-8";
|
|
||||||
console.keyMap = "us";
|
|
||||||
|
|
||||||
# Set your time zone.
|
# Set your time zone.
|
||||||
time.timeZone = "Europe/London";
|
time.timeZone = "Europe/London";
|
||||||
|
|
||||||
# List packages installed in system profile. To search, run:
|
# List packages installed in system profile. To search, run:
|
||||||
# $ nix search wget
|
# $ nix search wget
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
vim
|
|
||||||
pciutils
|
pciutils
|
||||||
nvidia-offload
|
nvidia-offload
|
||||||
(steam.override { extraProfile = nvidia-offload-profile; })
|
(steam.override { extraProfile = nvidia-offload-profile; })
|
||||||
|
@ -135,14 +114,8 @@ in {
|
||||||
# Enable the OpenSSH daemon.
|
# Enable the OpenSSH daemon.
|
||||||
services.openssh.enable = true;
|
services.openssh.enable = true;
|
||||||
|
|
||||||
# Open ports in the firewall.
|
|
||||||
# networking.firewall.allowedTCPPorts = [ ... ];
|
|
||||||
# networking.firewall.allowedUDPPorts = [ ... ];
|
|
||||||
# Or disable the firewall altogether.
|
|
||||||
# networking.firewall.enable = false;
|
|
||||||
|
|
||||||
# Enable CUPS to print documents.
|
# Enable CUPS to print documents.
|
||||||
# services.printing.enable = true;
|
services.printing.enable = true;
|
||||||
|
|
||||||
# Enable sound.
|
# Enable sound.
|
||||||
sound.enable = true;
|
sound.enable = true;
|
||||||
|
@ -156,35 +129,15 @@ in {
|
||||||
services.xserver.videoDrivers = [ "nvidia" ];
|
services.xserver.videoDrivers = [ "nvidia" ];
|
||||||
services.xserver.displayManager.gdm = {
|
services.xserver.displayManager.gdm = {
|
||||||
enable = true;
|
enable = true;
|
||||||
wayland = true;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
programs.sway = {
|
|
||||||
enable = true;
|
|
||||||
extraPackages = with pkgs; [
|
|
||||||
swaylock # lockscreen
|
|
||||||
swayidle
|
|
||||||
xwayland # for legacy apps
|
|
||||||
waybar # status bar
|
|
||||||
mako # notification daemon
|
|
||||||
kanshi # autorandr
|
|
||||||
];
|
|
||||||
};
|
|
||||||
programs.waybar.enable = true;
|
|
||||||
|
|
||||||
hardware.opengl.driSupport32Bit = true;
|
hardware.opengl.driSupport32Bit = true;
|
||||||
hardware.opengl.extraPackages32 = with pkgs.pkgsi686Linux; [ libva ];
|
hardware.opengl.extraPackages32 = with pkgs.pkgsi686Linux; [ libva ];
|
||||||
hardware.pulseaudio.support32Bit = true;
|
hardware.pulseaudio.support32Bit = true;
|
||||||
|
|
||||||
# Define a user account.
|
# Define a user account.
|
||||||
users.mutableUsers = false;
|
users.users.lukegb = {
|
||||||
users.users = {
|
|
||||||
root.hashedPassword = secrets.passwordHashes.root;
|
|
||||||
lukegb = {
|
|
||||||
isNormalUser = true;
|
|
||||||
uid = 1000;
|
|
||||||
extraGroups = [ "wheel" "networkmanager" ];
|
extraGroups = [ "wheel" "networkmanager" ];
|
||||||
hashedPassword = secrets.passwordHashes.root;
|
|
||||||
packages = [
|
packages = [
|
||||||
(pkgs.writeScriptBin "javaws" ''
|
(pkgs.writeScriptBin "javaws" ''
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
@ -192,10 +145,6 @@ in {
|
||||||
'')
|
'')
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
|
||||||
|
|
||||||
boot.kernel.sysctl."net.ipv4.tcp_congestion_control" = "bbr";
|
|
||||||
boot.kernel.sysctl."net.core.default_qdisc" = "fq_codel";
|
|
||||||
|
|
||||||
# Things to persist.
|
# Things to persist.
|
||||||
services.openssh.hostKeys = [
|
services.openssh.hostKeys = [
|
||||||
|
|
1
third_party/default.nix
vendored
1
third_party/default.nix
vendored
|
@ -3,4 +3,5 @@
|
||||||
{
|
{
|
||||||
nixpkgs = import ./nixpkgs { config.allowUnfree = true; };
|
nixpkgs = import ./nixpkgs { config.allowUnfree = true; };
|
||||||
nixos = import ./nixpkgs/nixos;
|
nixos = import ./nixpkgs/nixos;
|
||||||
|
nixeval = import ./nixpkgs/nixos/lib/eval-config.nix;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue