infra/nix/nas/configuration.nix

446 lines
11 KiB
Nix
Raw Normal View History

2023-06-26 15:25:26 +01:00
{ config, pkgs, ... }:
{
imports =
[ # Include the results of the hardware scan.
./hardware.nix
];
2023-07-14 16:32:54 +01:00
2023-09-07 19:10:23 +01:00
age.secrets.action-token.file = ../../secrets/vancouver-action-runner.age;
2023-09-10 12:04:39 +01:00
age.secrets.restic-b2-credentials = {
file = ../../secrets/vancouver-restic-b2.age;
group = "users";
mode = "770";
};
age.secrets.restic-password = {
file = ../../secrets/vancouver-restic-password.age;
group = "users";
mode = "770";
};
2023-06-26 15:25:26 +01:00
nix = {
settings = {
auto-optimise-store = true;
experimental-features = ["nix-command" "flakes"];
};
};
boot = {
tmp.cleanOnBoot = true;
loader = {
systemd-boot.enable = true;
efi.canTouchEfiVariables = true;
};
supportedFilesystems = ["zfs"];
kernelModules = [ "coretemp" "kvm-amd" "it87" ];
zfs.extraPools = ["Primary"];
};
services = {
2023-09-10 12:04:39 +01:00
restic = {
backups = {
"gsimmer" = {
user = "gsimmer";
environmentFile = config.age.secrets.restic-b2-credentials.path;
repository = "s3:s3.us-west-000.backblazeb2.com/gsimmer-backup";
paths = [
"/Primary/gabriel/projects"
];
passwordFile = config.age.secrets.restic-password.path;
initialize = true;
};
};
};
2023-09-05 17:08:43 +01:00
prometheus.exporters = {
blackbox = {
enable = true;
configFile = "/var/lib/blackbox/config.yml";
};
node = {
enable = true;
listenAddress = "100.116.48.47";
enabledCollectors = [
"systemd" "zfs" "processes"
];
};
};
coredns = {
enable = true;
config =
''
.:53 {
2023-08-05 13:15:42 +01:00
health
2023-09-05 17:08:43 +01:00
file /var/src/dns.db git.gmem.ca food.gmem.ca
2023-08-05 13:15:42 +01:00
forward . 45.90.28.116 45.90.30.116
bind tailscale0
}
'';
};
pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
jack.enable = true;
};
2023-06-26 15:25:26 +01:00
zfs.autoScrub.enable = true;
tailscale.enable = true;
openssh.enable = true;
xserver.videoDrivers = [ "nvidia" ];
nfs.server.enable = true;
samba-wsdd.enable = true;
samba = {
enable = true;
securityType = "user";
2023-08-15 09:13:41 +01:00
openFirewall = true;
2023-06-26 15:25:26 +01:00
extraConfig = ''
workgroup = WORKGROUP
server string = smbnix
netbios name = smbnix
security = user
#use sendfile = yes
#max protocol = smb2
# note: localhost is the ipv6 localhost ::1
hosts allow = 100. 192.168.50. 127.0.0.1 localhost
hosts deny = 0.0.0.0/0
guest account = nobody
map to guest = bad user
'';
shares = {
media = {
path = "/Primary/media";
browseable = "yes";
"read only" = "no";
"guest ok" = "yes";
"create mask" = "0644";
"directory mask" = "0755";
};
becki = {
path = "/Primary/becki";
browseable = "yes";
"read only" = "no";
"guest ok" = "no";
"create mask" = "0644";
"directory mask" = "0755";
"admin users" = "becki";
};
shared = {
path = "/Primary/shared";
browseable = "yes";
"read only" = "no";
"guest ok" = "no";
"create mask" = "0644";
"directory mask" = "0755";
};
gabriel = {
path = "/Primary/gabriel";
browseable = "yes";
"read only" = "no";
"guest ok" = "no";
"create mask" = "0644";
"directory mask" = "0755";
"admin users" = "gsimmer";
};
};
};
plex = {
enable = true;
openFirewall = true;
};
nginx = {
enable = true;
recommendedGzipSettings = true;
recommendedBrotliSettings = true;
recommendedZstdSettings = true;
recommendedOptimisation = true;
recommendedTlsSettings = true;
2023-07-14 16:32:54 +01:00
# We can only proxy one port with Tailscale Funnel so we abuse locations instead.
virtualHosts."vancouver.gmem.ca" = {
default = true;
enableACME = true;
addSSL = true;
acmeRoot = null;
locations."/" = {
root = "/var/www/";
extraConfig = ''
error_page 404 /404.html;
'';
};
2023-07-14 16:32:54 +01:00
};
virtualHosts."git.gmem.ca" = {
enableACME = true;
addSSL = true;
acmeRoot = null;
locations."/" = {
extraConfig =
''
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 100M;
'';
proxyPass = "http://127.0.0.1:8973/";
};
};
virtualHosts."request-media.gmem.ca" = {
enableACME = true;
addSSL = true;
acmeRoot = null;
locations."/" = {
extraConfig =
''
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 100M;
'';
proxyPass = "http://127.0.0.1:5055/";
};
};
virtualHosts."flood.gmem.ca" = {
enableACME = true;
addSSL = true;
acmeRoot = null;
locations."/" = {
extraConfig =
''
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 100M;
'';
proxyPass = "http://192.168.50.187:3000/";
};
};
2023-07-14 16:32:54 +01:00
};
gitea = {
enable = true;
stateDir = "/Primary/gitea";
package = pkgs.forgejo;
settings = {
DEFAULT = {
APP_NAME = "Arch's Git Forge";
};
2023-07-14 16:32:54 +01:00
server = {
ROOT_URL = "https://git.gmem.ca/";
2023-07-14 16:32:54 +01:00
HTTP_PORT = 8973;
};
service = {
DISABLE_REGISTRATION = true;
COOKIE_SECURE = true;
};
actions = {
ENABLED = true;
};
2023-07-19 11:59:28 +01:00
federation = {
ENABLED = true;
};
2023-09-05 17:08:43 +01:00
metrics = {
ENABLED = true;
};
};
};
2023-07-15 18:30:28 +01:00
gitea-actions-runner = {
package = pkgs.forgejo-actions-runner;
2023-07-15 18:30:28 +01:00
instances = {
vancouver = {
name = "vancouver";
enable = true;
labels = [
"debian-latest:docker://node:18-bullseye"
"docker:docker://gitea/act_runner:nightly-dind-rootless"
2023-07-19 11:59:28 +01:00
"nix:docker://nixos/nix"
2023-07-15 18:30:28 +01:00
];
url = "https://git.gmem.ca/";
2023-09-07 19:10:23 +01:00
tokenFile = config.age.secrets.action-token.path;
settings = {
cache.port = 4328;
};
2023-07-15 18:30:28 +01:00
};
};
};
2023-08-25 21:15:33 +01:00
sanoid = {
enable = true;
datasets = {
"Primary/becki" = {
autoprune = true;
autosnap = true;
daily = 4;
monthly = 3;
yearly = 1;
};
"Primary/gabriel" = {
autoprune = true;
autosnap = true;
daily = 4;
monthly = 3;
yearly = 1;
};
"Primary/shared" = {
autoprune = true;
autosnap = true;
daily = 2;
monthly = 2;
};
"Primary/k3scluster" = {
autoprune = true;
autosnap = true;
daily = 2;
monthly = 2;
};
"Primary/gitea" = {
autoprune = true;
autosnap = true;
daily = 2;
monthly = 2;
};
};
};
};
2023-06-26 15:25:26 +01:00
networking = {
hostId = "e1e29bf4";
hostName = "vancouver";
domain = "gmem.ca";
firewall = {
trustedInterfaces = ["tailscale0" "virbr0"];
2023-06-26 15:25:26 +01:00
checkReversePath = "loose";
enable = true;
2023-09-05 17:08:43 +01:00
allowedTCPPorts = [ 22 53 80 443 2049 4328 5432 9100 ];
2023-08-06 00:04:21 +01:00
allowedUDPPorts = [ 53 41641 ];
2023-06-26 15:25:26 +01:00
};
useDHCP = false;
bridges = {
"br0" = {
interfaces = [ "eno1" ];
};
};
interfaces.br0.ipv4.addresses = [
{
address = "192.168.50.229";
prefixLength = 24;
}
];
defaultGateway = "192.168.50.1";
nameservers = ["45.90.28.116" "45.90.30.116"];
2023-06-26 15:25:26 +01:00
nftables.enable = true;
};
environment.systemPackages = with pkgs; [
vim
wget
git
htop
tailscale
home-manager
lm_sensors
screen
nix-output-monitor
2023-07-14 16:32:54 +01:00
cifs-utils
cloudflared
bat
virtiofsd
2023-06-26 15:25:26 +01:00
];
time.timeZone = "Europe/London";
nixpkgs.config.allowUnfree = true;
hardware = {
opengl.enable = true;
nvidia.modesetting.enable = true;
pulseaudio.enable = false;
};
programs = {
zsh.enable = true;
fish.enable = true;
};
environment.shells = with pkgs; [ zsh fish ];
users.users = {
gsimmer = {
shell = pkgs.fish;
isNormalUser = true;
home = "/Primary/gabriel";
extraGroups = [ "wheel" "libvirtd" "qemu-libvirtd" ];
2023-07-30 22:40:43 +01:00
openssh.authorizedKeys.keys = let
authorizedKeys = pkgs.fetchurl {
url = "https://gmem.ca/ssh";
2023-08-25 21:15:57 +01:00
sha256 = "0vm0q5fzx55mmgw7md430c20rvywmknmpvnkffx9szlm0l74bypc";
2023-07-30 22:40:43 +01:00
};
in pkgs.lib.splitString "\n" (builtins.readFile
authorizedKeys);
2023-06-26 15:25:26 +01:00
};
becki = {
shell = pkgs.fish;
isNormalUser = true;
home = "/Primary/becki";
};
root.openssh.authorizedKeys.keys = let
authorizedKeys = pkgs.fetchurl {
url = "https://gmem.ca/ssh";
sha256 = "0iwrm80hsadr0midy0h3da4x0sbci76a92g8f9wnz5pj38gimdi9";
};
in pkgs.lib.splitString "\n" (builtins.readFile
authorizedKeys);
2023-06-26 15:25:26 +01:00
};
home-manager.users.gsimmer = { pkgs, ... }: {
programs.git = {
userName = "Gabriel Simmer";
userEmail = "git@gmem.ca";
};
programs.bash.enable = false;
home.stateVersion = "23.05";
};
virtualisation = {
docker = {
enable = true;
2023-08-05 13:16:29 +01:00
rootless = {
enable = true;
setSocketVariable = true;
};
2023-06-26 15:25:26 +01:00
};
libvirtd.enable = true;
};
2023-09-05 17:08:43 +01:00
virtualisation.oci-containers.containers = {
speedtest = {
image = "ghcr.io/miguelndecarvalho/speedtest-exporter";
ports = [ "9798:9798" ];
};
};
2023-06-26 15:25:26 +01:00
sound.enable = true;
security.rtkit.enable = true;
security.acme.acceptTerms = true;
security.acme.defaults.email = "acme@gmem.ca";
security.acme.certs."git.gmem.ca" = {
2023-08-05 13:15:42 +01:00
domain = "*.gmem.ca";
dnsProvider = "route53";
credentialsFile = "/var/lib/secrets/credentials";
2023-06-26 15:25:26 +01:00
};
security.acme.certs."vancouver.gmem.ca" = {
domain = "vancouver.gmem.ca";
dnsProvider = "route53";
credentialsFile = "/var/lib/secrets/credentials";
};
security.acme.certs."request-media.gmem.ca" = {
domain = "request-media.gmem.ca";
dnsProvider = "route53";
credentialsFile = "/var/lib/secrets/credentials";
};
security.acme.certs."flood.gmem.ca" = {
domain = "flood.gmem.ca";
dnsProvider = "route53";
credentialsFile = "/var/lib/secrets/credentials";
};
2023-06-26 15:25:26 +01:00
system.stateVersion = "23.05";
}