feat: initial commit
This commit is contained in:
parent
83635bc30b
commit
bbfe9d4a2a
27 changed files with 907 additions and 0 deletions
0
.gitignore
vendored
Normal file
0
.gitignore
vendored
Normal file
65
README.md
Normal file
65
README.md
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
# Truxnell's homelab
|
||||||
|
|
||||||
|
[![NixOS](https://img.shields.io/badge/NixOS-23.11-blue?style=flat&logo=nixos&logoColor=white)](https://nixos.org)
|
||||||
|
Leveraging nix, nix-os to apply machine and home configurations
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
Having used a variety of infracture as code solutions - and having found them lacking in some areas, it is time to give nix a go.
|
||||||
|
Frustrations with other methods tend to be bitrot and config drift - very annoying to want to do a quick disaster recovery and find your have different versions of modules/utilities, breaking changes in code you didnt catch, etc.
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
|
||||||
|
TBC
|
||||||
|
|
||||||
|
## Goals
|
||||||
|
|
||||||
|
- [ ] Learn nix
|
||||||
|
- [ ] Mostly reproduce features from my existing homelab
|
||||||
|
- [ ] Replace existing ubuntu-based 'NAS'
|
||||||
|
- [ ] Expand usage to other shell environments such as WSL, etc
|
||||||
|
- [ ] handle secrets - decide between sweet and simple SOPS or re-use my doppler setup.
|
||||||
|
|
||||||
|
## TODO
|
||||||
|
|
||||||
|
- [ ] Github Actions update fly.io instances (Bitwarden)
|
||||||
|
- [ ] Bring over hosts
|
||||||
|
- [ ] DNS01 Raspi4
|
||||||
|
- [ ] DNS02 Raspi4
|
||||||
|
- [ ] NAS
|
||||||
|
- [ ] Latop
|
||||||
|
- [ ] WSL
|
||||||
|
- [ ] JJY emulator Raspi4
|
||||||
|
- [ ] Documentation!
|
||||||
|
- [ ] Add license
|
||||||
|
- [ ] Add taskfiles
|
||||||
|
|
||||||
|
## Network map
|
||||||
|
|
||||||
|
TBC
|
||||||
|
|
||||||
|
## Hardware
|
||||||
|
|
||||||
|
TBC
|
||||||
|
|
||||||
|
## Applying configuration changes on a local machine can be done as follows:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd ~/dotfiles
|
||||||
|
sudo nixos-rebuild switch --flake .
|
||||||
|
# This will automatically pick the configuration name based on the hostname
|
||||||
|
```
|
||||||
|
|
||||||
|
Applying configuration changes to a remote machine can be done as follows:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd ~/dotfiles
|
||||||
|
nixos-rebuild switch --flake .#nameOfMachine --target-host machineToSshInto --use-remote-sudo
|
||||||
|
```
|
||||||
|
|
||||||
|
## Links & References
|
||||||
|
|
||||||
|
- [Misterio77/nix-starter-config](https://github.com/Misterio77/nix-starter-configs)
|
||||||
|
- [billimek/dotfiles](https://github.com/billimek/dotfiles/)
|
||||||
|
- [Erase your Darlings](https://grahamc.com/blog/erase-your-darlings/)
|
||||||
|
- [NixOS Flakes](https://www.tweag.io/blog/2020-07-31-nixos-flakes/)
|
83
docs/vm/installing.md
Normal file
83
docs/vm/installing.md
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
## Installing a playground VM
|
||||||
|
|
||||||
|
I've used gnome-boxes from my current Fedora laptop for running playground vm's.
|
||||||
|
|
||||||
|
Settings:
|
||||||
|
ISO: nixos-minimal
|
||||||
|
Hard drive: 32GB
|
||||||
|
RAM: 2GB
|
||||||
|
EFI: Enable
|
||||||
|
|
||||||
|
Expose port 22 to allow ssh into vm (host port 3022, guest 22)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# set temp root passwd
|
||||||
|
sudo su
|
||||||
|
passwd
|
||||||
|
```
|
||||||
|
|
||||||
|
`sshd` is already running, so you can now ssh into the vm remotely for the rest of the setup.
|
||||||
|
`ssh root@127.0.0.1 -p 3022`
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Partitioning
|
||||||
|
parted /dev/sda -- mklabel gpt
|
||||||
|
parted /dev/sda -- mkpart root ext4 512MB -8GB
|
||||||
|
parted /dev/sda -- mkpart swap linux-swap -8GB 100%
|
||||||
|
parted /dev/sda -- mkpart ESP fat32 1MB 512MB
|
||||||
|
parted /dev/sda -- set 3 esp on
|
||||||
|
|
||||||
|
# Formatting
|
||||||
|
mkfs.ext4 -L nixos /dev/sda1
|
||||||
|
mkswap -L swap /dev/sda2
|
||||||
|
mkfs.fat -F 32 -n boot /dev/sda3
|
||||||
|
|
||||||
|
# Mounting disks for installation
|
||||||
|
mount /dev/disk/by-label/nixos /mnt
|
||||||
|
mkdir -p /mnt/boot
|
||||||
|
mount /dev/disk/by-label/boot /mnt/boot
|
||||||
|
swapon /dev/sda2
|
||||||
|
|
||||||
|
# Generating default configuration
|
||||||
|
nixos-generate-config --root /mnt
|
||||||
|
```
|
||||||
|
|
||||||
|
From this config copy the bootstrap configuration and fetch the hardware configuration.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
scp -P 3022 nixos/hosts/bootstrap/configuration.nix root@127.0.0.1:/mnt/etc/nixos/configuration.nix
|
||||||
|
scp -P 3022 root@127.0.0.1:/mnt/etc/nixos/hardware-configuration.nix nixos/hosts/nixosvm/hardware-configuration.nix
|
||||||
|
```
|
||||||
|
|
||||||
|
Then back to the VM
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nixos-install
|
||||||
|
reboot
|
||||||
|
nixos-rebuild switch
|
||||||
|
```
|
||||||
|
|
||||||
|
Set the password for the user that was created.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
passwd truxnell
|
||||||
|
```
|
||||||
|
|
||||||
|
Login as user, copy nix git
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir .local
|
||||||
|
cd .local
|
||||||
|
git clone https://github.com/szinn/nix-config.git
|
||||||
|
cd nix-config
|
||||||
|
```
|
||||||
|
|
||||||
|
Apply config to bootstrapped device
|
||||||
|
First time around, MUST APPLY <machinename> with name of host in ./hosts/
|
||||||
|
This is because `.. --flake .` looks for a `nixosConfigurations` key with the machines hostname
|
||||||
|
The bootstrap machine will be called 'nixos-bootstrap' so the flake by default would resolve `nixosConfigurations.nixos-bootstrap`
|
||||||
|
Subsequent rebuilds can be called with the default command as after first build the machines hostname will be changed to the desired machine
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nixos-rebuild switch --flake .#<machinename>
|
||||||
|
```
|
53
flake.nix
Normal file
53
flake.nix
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
{
|
||||||
|
description = "My machines";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
# Nixpkgs and unstable
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-23.11";
|
||||||
|
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
|
||||||
|
# sops-nix
|
||||||
|
sops-nix = {
|
||||||
|
url = "github:Mic92/sops-nix";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
# VSCode community extensions
|
||||||
|
nix-vscode-extensions = {
|
||||||
|
url = "github:nix-community/nix-vscode-extensions";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
outputs = { self, nixpkgs, ... }@inputs:
|
||||||
|
with inputs;
|
||||||
|
{
|
||||||
|
|
||||||
|
# Use nixpkgs-fmt for 'nix fmt'
|
||||||
|
formatter.x86_64-linux = nixpkgs.legacyPackages.x86_64-linux.nixpkgs-fmt;
|
||||||
|
|
||||||
|
# Each subdirectory in ./machines is a host. Add them all to
|
||||||
|
# nixosConfigurations. Host configurations need a file called
|
||||||
|
# configuration.nix that will be read first
|
||||||
|
nixosConfigurations = builtins.listToAttrs (map
|
||||||
|
(x: {
|
||||||
|
name = x;
|
||||||
|
value = nixpkgs.lib.nixosSystem {
|
||||||
|
|
||||||
|
# Make inputs and the flake itself accessible as module parameters.
|
||||||
|
# Technically, adding the inputs is redundant as they can be also
|
||||||
|
# accessed with flake-self.inputs.X, but adding them individually
|
||||||
|
# allows to only pass what is needed to each module.
|
||||||
|
specialArgs = { flake-self = self; } // inputs;
|
||||||
|
|
||||||
|
system = "x86_64-linux";
|
||||||
|
|
||||||
|
modules = [
|
||||||
|
(./nixos/hosts + "/${x}/default.nix")
|
||||||
|
];
|
||||||
|
};
|
||||||
|
})
|
||||||
|
(builtins.attrNames (builtins.readDir ./nixos/hosts)));
|
||||||
|
};
|
||||||
|
}
|
59
nixos/home-manager/.gitkeep
Normal file
59
nixos/home-manager/.gitkeep
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
My home infrastructure,
|
||||||
|
|
||||||
|
![](https://imgur.com/ISNnzgN.png)
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
- [flake.nix](flake.nix) (Entrypoint for rebuilding via nixos-rebuild or home-manager)
|
||||||
|
- [flake.lock](flake.lock) (lockfile for current nix flake state, updated daily via [github action](.github/workflows/main.yml))
|
||||||
|
- [home-manager](home-manager) (User level configuration per machine via home-manager)
|
||||||
|
- [hosts](hosts/README.md) - (Definition of physical/virutal hosts)
|
||||||
|
- [common](hosts/common) (Role definitions [Desktop, Laptop, Server])
|
||||||
|
- [darwin](hosts/common/darwin) (global host configuration used across all darwin hosts)
|
||||||
|
- [nixos](hosts/common/nixos) (global host configuration used across all NixOS hosts)
|
||||||
|
- [optional](hosts/common/optional) (optional host configuration used as-needed per host)
|
||||||
|
- [nas](hosts/nas/README.md) (NixOS NAS server)
|
||||||
|
- [home](hosts/home/README.md) (NixOS VM running in NAS)
|
||||||
|
- [cloud](hosts/cloud/README.md) (NixOS VM running in Oracle Cloud)
|
||||||
|
- [k3s-f](hosts/k3s-f/README.md) (NixOS running on an N100 tiny PC as a k3s node)
|
||||||
|
- [k3s-g](hosts/k3s-g/README.md) (NixOS running on an N100 tiny PC as a k3s node)
|
||||||
|
- [k3s-h](hosts/k3s-h/README.md) (NixOS running on an N100 tiny PC as a k3s node)
|
||||||
|
- [jeffs_laptop](hosts/jeffs_laptop/README.md) (nix-darwin running on a MacBook Pro)
|
||||||
|
- [jens_laptop](hosts/jens_laptop/README.md) (nix-darwin running on a MacBook Air)
|
||||||
|
- [work_laptop](hosts/work_laptop/README.md) (nix-darwin running on a MacBook Pro)
|
||||||
|
- [modules](modules) (Custom NixOS and home-manager modules)
|
||||||
|
- [overlays](overlays) (Custom overlays, primarily used for packages currently)
|
||||||
|
- [pkgs](pkgs) (Custom Packages, mainly items not yet in official nixpkgs)
|
||||||
|
- [shell.nix](shell.nix) (Shell for bootstrapping flake-enabled nix and home-manager)
|
||||||
|
- [nixpkgs.nix](nixpkgs.nix) (Used by shell.nix - useful to avoid using channels when using legacy nix commands)
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
Everyone keeps gushing about how amazing Nix is and I want to get in on the hype cycle
|
||||||
|
|
||||||
|
## Goals
|
||||||
|
|
||||||
|
- [x] Learn nix
|
||||||
|
- [x] Mostly reproduce features from my existing [dotfiles](https://github.com/billimek/dotfiles)
|
||||||
|
- [x] Replace existing ubunut-based 'home VM'
|
||||||
|
- [x] Expand usage to other shell environments such as WSL, Macbook, etc
|
||||||
|
- [x] handle secrets - ideally using 1Password and not SOPS - using git-crypt for now
|
||||||
|
- [x] try agenix for secrets handling
|
||||||
|
- [ ] introduce the concept of [impermanence](https://github.com/nix-community/impermanence) where appropriate
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
- [Misterio77/nix-starter-config](https://github.com/Misterio77/nix-starter-configs)
|
||||||
|
- [How to learn Nix](https://ianthehenry.com/posts/how-to-learn-nix/)
|
||||||
|
- [home-manager](https://github.com/nix-community/home-manager)
|
||||||
|
- [Zero to Nix: Everything I Know About Nix & NixOS](https://chetanbhasin.com/articles/zero-to-nix-everything-i-know-about-nix-nixos)
|
||||||
|
- [Walkthrough of Nix Install and Setup on MacOS (YouTube)](https://www.youtube.com/watch?v=LE5JR4JcvMg)
|
||||||
|
- [NixOS as a server, part 1: Impermanence](https://guekka.github.io/nixos-server-1/)
|
||||||
|
- [budimanjojo/dotfiles](https://github.com/budimanjojo/dotfiles/tree/master/nixos)
|
||||||
|
- [wrmilling/nixos-configuration](https://github.com/wrmilling/nixos-configuration)
|
||||||
|
- [gshpychka/dotfiles-nix](https://github.com/gshpychka/dotfiles-nix)
|
||||||
|
- [wimpysworld/nix-config](https://github.com/wimpysworld/nix-config)
|
||||||
|
|
||||||
|
## Old Dotfiles
|
||||||
|
|
||||||
|
Old dotfiles are still accessible in [archive branch](https://github.com/billimek/dotfiles/tree/archive)
|
144
nixos/hosts/bootstrap/configuration.nix
Normal file
144
nixos/hosts/bootstrap/configuration.nix
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
# Edit this configuration file to define what should be installed on
|
||||||
|
# your system. Help is available in the configuration.nix(5) man page, on
|
||||||
|
# https://search.nixos.org/options and in the NixOS manual (`nixos-help`).
|
||||||
|
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[
|
||||||
|
# Host-specific
|
||||||
|
./hardware-configuration.nix
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.loader.systemd-boot.enable = true;
|
||||||
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
hostName = "nixos-bootstrap";
|
||||||
|
dhcpcd.enable = true;
|
||||||
|
};
|
||||||
|
# Pick only one of the below networking options.
|
||||||
|
# networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
|
||||||
|
# networking.networkmanager.enable = true; # Easiest to use and most distros use this by default.
|
||||||
|
|
||||||
|
# Set your time zone.
|
||||||
|
time.timeZone = "Australia/Melbourne";
|
||||||
|
|
||||||
|
# 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_US.UTF-8";
|
||||||
|
# console = {
|
||||||
|
# font = "Lat2-Terminus16";
|
||||||
|
# keyMap = "us";
|
||||||
|
# useXkbConfig = true; # use xkb.options in tty.
|
||||||
|
# };
|
||||||
|
|
||||||
|
# Enable the X11 windowing system.
|
||||||
|
# services.xserver.enable = true;
|
||||||
|
|
||||||
|
# Configure keymap in X11
|
||||||
|
# services.xserver.xkb.layout = "us";
|
||||||
|
# services.xserver.xkb.options = "eurosign:e,caps:escape";
|
||||||
|
|
||||||
|
# Enable CUPS to print documents.
|
||||||
|
# services.printing.enable = true;
|
||||||
|
|
||||||
|
# Enable sound.
|
||||||
|
# sound.enable = true;
|
||||||
|
# hardware.pulseaudio.enable = true;
|
||||||
|
|
||||||
|
# Enable touchpad support (enabled default in most desktopManager).
|
||||||
|
# services.xserver.libinput.enable = true;
|
||||||
|
|
||||||
|
# Define a user account. Don't forget to set a password with ‘passwd’.
|
||||||
|
users.users.truxnell = {
|
||||||
|
isNormalUser = true;
|
||||||
|
extraGroups = ["wheel"]; # Enable ‘sudo’ for the user.
|
||||||
|
packages = with pkgs; [
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
# List packages installed in system profile. To search, run:
|
||||||
|
# $ nix search wget
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
neovim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
|
||||||
|
btop
|
||||||
|
git
|
||||||
|
curl
|
||||||
|
wget
|
||||||
|
];
|
||||||
|
|
||||||
|
nix = {
|
||||||
|
settings = {
|
||||||
|
experimental-features = ["nix-command" "flakes"];
|
||||||
|
warn-dirty = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
nixpkgs = {
|
||||||
|
# overlays = builtins.attrValues outputs.overlays;
|
||||||
|
config = {
|
||||||
|
allowUnfree = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
# Some programs need SUID wrappers, can be configured further or are
|
||||||
|
# started in user sessions.
|
||||||
|
# programs.mtr.enable = true;
|
||||||
|
# programs.gnupg.agent = {
|
||||||
|
# enable = true;
|
||||||
|
# enableSSHSupport = true;
|
||||||
|
# };
|
||||||
|
|
||||||
|
# List services that you want to enable:
|
||||||
|
|
||||||
|
# Enable the OpenSSH daemon.
|
||||||
|
# TODO Harden SSH
|
||||||
|
services.openssh.enable = true;
|
||||||
|
|
||||||
|
users.users.root.openssh.authorizedKeys.keys = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMZS9J1ydflZ4iJdJgO8+vnN8nNSlEwyn9tbWU9OcysW truxnell@home"
|
||||||
|
];
|
||||||
|
|
||||||
|
# may fix issues with network service failing during a nixos-rebuild
|
||||||
|
systemd.services.NetworkManager-wait-online.enable = lib.mkForce false;
|
||||||
|
systemd.services.systemd-networkd-wait-online.enable = lib.mkForce false;
|
||||||
|
|
||||||
|
# Open ports in the firewall.
|
||||||
|
# networking.firewall.allowedTCPPorts = [ ... ];
|
||||||
|
# networking.firewall.allowedUDPPorts = [ ... ];
|
||||||
|
# Or disable the firewall altogether.
|
||||||
|
# networking.firewall.enable = false;
|
||||||
|
|
||||||
|
# Copy the NixOS configuration file and link it from the resulting system
|
||||||
|
# (/run/current-system/configuration.nix). This is useful in case you
|
||||||
|
# accidentally delete configuration.nix.
|
||||||
|
# system.copySystemConfiguration = true;
|
||||||
|
|
||||||
|
# This option defines the first version of NixOS you have installed on this particular machine,
|
||||||
|
# and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions.
|
||||||
|
#
|
||||||
|
# Most users should NEVER change this value after the initial install, for any reason,
|
||||||
|
# even if you've upgraded your system to a new NixOS release.
|
||||||
|
#
|
||||||
|
# This value does NOT affect the Nixpkgs version your packages and OS are pulled from,
|
||||||
|
# so changing it will NOT upgrade your system.
|
||||||
|
#
|
||||||
|
# This value being lower than the current NixOS release does NOT mean your system is
|
||||||
|
# out of date, out of support, or vulnerable.
|
||||||
|
#
|
||||||
|
# Do NOT change this value unless you have manually inspected all the changes it would make to your configuration,
|
||||||
|
# and migrated your data accordingly.
|
||||||
|
#
|
||||||
|
# For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion .
|
||||||
|
system.stateVersion = "23.11"; # Did you read the comment?
|
||||||
|
|
||||||
|
}
|
||||||
|
|
19
nixos/hosts/common/nixos/auto-upgrade.nix
Normal file
19
nixos/hosts/common/nixos/auto-upgrade.nix
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
inputs,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (config.networking) hostName;
|
||||||
|
# Only enable auto upgrade if current config came from a clean tree
|
||||||
|
# This avoids accidental auto-upgrades when working locally.
|
||||||
|
isClean = inputs.self ? rev;
|
||||||
|
in {
|
||||||
|
system.autoUpgrade = {
|
||||||
|
enable = isClean;
|
||||||
|
dates = "hourly";
|
||||||
|
flags = [
|
||||||
|
"--refresh"
|
||||||
|
];
|
||||||
|
flake = "github:truxnell/nix-config";
|
||||||
|
};
|
||||||
|
}
|
64
nixos/hosts/common/nixos/default.nix
Normal file
64
nixos/hosts/common/nixos/default.nix
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
{ inputs, outputs, config, sops-nix, ... }: {
|
||||||
|
imports = [
|
||||||
|
# inputs.home-manager.nixosModules.home-manager
|
||||||
|
#inputs.sops-nix.nixosModules.sops
|
||||||
|
./locale.nix
|
||||||
|
./nix.nix
|
||||||
|
./openssh.nix
|
||||||
|
./packages.nix
|
||||||
|
] ++ (builtins.attrValues {});
|
||||||
|
|
||||||
|
# home-manager.extraSpecialArgs = { inherit inputs outputs; }; TODO Home-manager
|
||||||
|
|
||||||
|
nixpkgs = {
|
||||||
|
# Configure your nixpkgs instance
|
||||||
|
config = {
|
||||||
|
# Disable if you don't want unfree packages
|
||||||
|
allowUnfree = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# TODO Shared sops location
|
||||||
|
# sops.age.keyFile = "/var/lib/sops-nix/key.txt";
|
||||||
|
|
||||||
|
# Increase open file limit for sudoers
|
||||||
|
security.pam.loginLimits = [
|
||||||
|
{
|
||||||
|
domain = "@wheel";
|
||||||
|
item = "nofile";
|
||||||
|
type = "soft";
|
||||||
|
value = "524288";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
domain = "@wheel";
|
||||||
|
item = "nofile";
|
||||||
|
type = "hard";
|
||||||
|
value = "1048576";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
# sops.secrets.msmtp = {
|
||||||
|
# sopsFile = ./secret.sops.yaml;
|
||||||
|
# }
|
||||||
|
|
||||||
|
# # TODO Email settings
|
||||||
|
# programs.msmtp = {
|
||||||
|
# enable = true;
|
||||||
|
# accounts.default = {
|
||||||
|
# host = "smtp-relay.mcbadass.local";
|
||||||
|
# from = "${config.networking.hostName}@trux.dev";
|
||||||
|
# };
|
||||||
|
# defaults = {
|
||||||
|
# aliases = "/etc/aliases";
|
||||||
|
# };
|
||||||
|
# };
|
||||||
|
|
||||||
|
environment.etc = {
|
||||||
|
"aliases" = {
|
||||||
|
text = ''
|
||||||
|
root: ${config.networking.hostName}@trux.dev
|
||||||
|
'';
|
||||||
|
mode = "0644";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
6
nixos/hosts/common/nixos/locale.nix
Normal file
6
nixos/hosts/common/nixos/locale.nix
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{ lib, ... }: {
|
||||||
|
i18n = {
|
||||||
|
defaultLocale = lib.mkDefault "en_US.UTF-8";
|
||||||
|
};
|
||||||
|
time.timeZone = lib.mkDefault "Australia/Melbourne";
|
||||||
|
}
|
14
nixos/hosts/common/nixos/nix.nix
Normal file
14
nixos/hosts/common/nixos/nix.nix
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{ inputs, lib, ... }:
|
||||||
|
{
|
||||||
|
nix = {
|
||||||
|
settings = {
|
||||||
|
experimental-features = [ "nix-command" "flakes" ];
|
||||||
|
};
|
||||||
|
gc = {
|
||||||
|
automatic = true;
|
||||||
|
dates = "weekly";
|
||||||
|
# Delete older generations too
|
||||||
|
options = "--delete-older-than 5d";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
24
nixos/hosts/common/nixos/openssh.nix
Normal file
24
nixos/hosts/common/nixos/openssh.nix
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{ outputs, lib, config, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (config.networking) hostName;
|
||||||
|
hosts = outputs.nixosConfigurations;
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
services.openssh = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
# Harden
|
||||||
|
PasswordAuthentication = false;
|
||||||
|
PermitRootLogin = "no";
|
||||||
|
# Automatically remove stale sockets
|
||||||
|
StreamLocalBindUnlink = "yes";
|
||||||
|
# Allow forwarding ports to everywhere
|
||||||
|
GatewayPorts = "clientspecified";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Passwordless sudo when SSH'ing with keys
|
||||||
|
security.pam.enableSSHAgentAuth = true;
|
||||||
|
}
|
15
nixos/hosts/common/nixos/packages.nix
Normal file
15
nixos/hosts/common/nixos/packages.nix
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{ config, pkgs, lib, ... }:
|
||||||
|
{
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
bat
|
||||||
|
jq
|
||||||
|
yq
|
||||||
|
btop
|
||||||
|
neovim
|
||||||
|
vim
|
||||||
|
git
|
||||||
|
dnsutils
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.mtr.enable = true;
|
||||||
|
}
|
25
nixos/hosts/common/nixos/users/truxnell/default.nix
Normal file
25
nixos/hosts/common/nixos/users/truxnell/default.nix
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{ pkgs, config, ... }:
|
||||||
|
let ifTheyExist = groups: builtins.filter (group: builtins.hasAttr group config.users.groups) groups;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
users.users.truxnell = {
|
||||||
|
isNormalUser = true;
|
||||||
|
shell = pkgs.fish;
|
||||||
|
# passwordFile = config.sops.secrets.taylor-password.path;
|
||||||
|
# initialHashedPassword = ""; # TODO add key
|
||||||
|
extraGroups = [
|
||||||
|
"wheel"
|
||||||
|
] ++ ifTheyExist [
|
||||||
|
"network"
|
||||||
|
"samba-users"
|
||||||
|
];
|
||||||
|
|
||||||
|
openssh.authorizedKeys.keys = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMZS9J1ydflZ4iJdJgO8+vnN8nNSlEwyn9tbWU9OcysW truxnell@home"
|
||||||
|
];
|
||||||
|
|
||||||
|
packages = [ pkgs.home-manager ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# home-manager.users.taylor = import ../../../../../home-manager/taylor_${config.networking.hostName}.nix; TODO home-manager?
|
||||||
|
}
|
7
nixos/hosts/common/optional/chrony.nix
Normal file
7
nixos/hosts/common/optional/chrony.nix
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{ inputs, outputs, config, ... }: {
|
||||||
|
# Time
|
||||||
|
networking.timeServers = ["10.8.10.1"];
|
||||||
|
services.chrony = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
}
|
44
nixos/hosts/common/optional/dnscrypt-proxy2.nix
Normal file
44
nixos/hosts/common/optional/dnscrypt-proxy2.nix
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
# Ref: https://nixos.wiki/wiki/Encrypted_DNS#dnscrypt-proxy2
|
||||||
|
|
||||||
|
{ inputs, outputs, pkgs, config, ... }: {
|
||||||
|
|
||||||
|
# Disable resolvd to ensure it doesnt re-write /etc/resolv.conf
|
||||||
|
services.resolved.enable = false;
|
||||||
|
|
||||||
|
# Fix this devices DNS resolv.conf
|
||||||
|
networking = {
|
||||||
|
nameservers = [ "10.8.10.1" ];
|
||||||
|
|
||||||
|
dhcpcd.extraConfig = "nohook resolv.conf";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.dnscrypt-proxy2 = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
require_dnssec = true;
|
||||||
|
|
||||||
|
forwarding_rules = pkgs.writeText "forwarding-rules.txt" ''
|
||||||
|
natallan.com 10.8.10.1
|
||||||
|
sonarr.trux.dev 10.8.20.11
|
||||||
|
radarr.trux.dev 10.8.20.11
|
||||||
|
lidarr.trux.dev 10.8.20.11
|
||||||
|
qbittorrent.trux.dev 10.8.20.11
|
||||||
|
qbittorrent-lidarr.trux.dev 10.8.20.11
|
||||||
|
syncthing.trux.dev 10.8.20.11
|
||||||
|
qbittorrent-readarr.trux.dev 10.8.20.11
|
||||||
|
filebrowser.trux.dev 10.8.20.11
|
||||||
|
minio.trux.dev 10.8.20.11
|
||||||
|
sabnzbd.trux.dev 10.8.20.11
|
||||||
|
trux.dev 10.8.20.203
|
||||||
|
'';
|
||||||
|
|
||||||
|
server_names = ["NextDNS-f6fe35"];
|
||||||
|
|
||||||
|
static = {
|
||||||
|
"NextDNS-f6fe35" = {
|
||||||
|
stamp = "sdns://AgEAAAAAAAAAAAAOZG5zLm5leHRkbnMuaW8HL2Y2ZmUzNQ";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
10
nixos/hosts/common/optional/fish.nix
Normal file
10
nixos/hosts/common/optional/fish.nix
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
programs.fish = {
|
||||||
|
enable = true;
|
||||||
|
vendor = {
|
||||||
|
completions.enable = true;
|
||||||
|
config.enable = true;
|
||||||
|
functions.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
29
nixos/hosts/common/optional/monitoring.nix
Normal file
29
nixos/hosts/common/optional/monitoring.nix
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{ config, pkgs, lib, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
services.prometheus.exporters = {
|
||||||
|
node = {
|
||||||
|
enable = true;
|
||||||
|
enabledCollectors = [
|
||||||
|
"diskstats"
|
||||||
|
"filesystem"
|
||||||
|
"loadavg"
|
||||||
|
"meminfo"
|
||||||
|
"netdev"
|
||||||
|
"stat"
|
||||||
|
"time"
|
||||||
|
"uname"
|
||||||
|
"systemd"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
smartctl = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
config.services.prometheus.exporters.node.port
|
||||||
|
config.services.prometheus.exporters.smartctl.port
|
||||||
|
];
|
||||||
|
|
||||||
|
}
|
37
nixos/hosts/common/optional/reboot-required.nix
Normal file
37
nixos/hosts/common/optional/reboot-required.nix
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
systemd.timers."reboot-required-check" = {
|
||||||
|
wantedBy = ["timers.target"];
|
||||||
|
timerConfig = {
|
||||||
|
# start at boot
|
||||||
|
OnBootSec = "0m";
|
||||||
|
# check every hour
|
||||||
|
OnUnitActiveSec = "1h";
|
||||||
|
Unit = "reboot-required-check.service";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services."reboot-required-check" = {
|
||||||
|
script = ''
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# compare current system with booted sysetm to determine if a reboot is required
|
||||||
|
if [[ "$(readlink /run/booted-system/{initrd,kernel,kernel-modules})" == "$(readlink /run/current-system/{initrd,kernel,kernel-modules})" ]]; then
|
||||||
|
# check if the '/var/run/reboot-required' file exists and if it does, remove it
|
||||||
|
if [[ -f /var/run/reboot-required ]]; then
|
||||||
|
rm /var/run/reboot-required || { echo "Failed to remove /var/run/reboot-required"; exit 1; }
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "reboot required"
|
||||||
|
touch /var/run/reboot-required || { echo "Failed to create /var/run/reboot-required"; exit 1; }
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
User = "root";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
105
nixos/hosts/nixosvm/default.nix
Normal file
105
nixos/hosts/nixosvm/default.nix
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
# Edit this configuration file to define what should be installed on
|
||||||
|
# your system. Help is available in the configuration.nix(5) man page, on
|
||||||
|
# https://search.nixos.org/options and in the NixOS manual (`nixos-help`).
|
||||||
|
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[
|
||||||
|
# Host-specific
|
||||||
|
./hardware-configuration.nix
|
||||||
|
|
||||||
|
# Common imports
|
||||||
|
../common/nixos
|
||||||
|
../common/nixos/users/truxnell
|
||||||
|
../common/optional/fish.nix
|
||||||
|
../common/optional/monitoring.nix
|
||||||
|
../common/optional/reboot-required.nix
|
||||||
|
../common/optional/dnscrypt-proxy2.nix
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.loader.systemd-boot.enable = true;
|
||||||
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
|
|
||||||
|
networking.hostName = "nixosvm"; # Define your hostname.
|
||||||
|
|
||||||
|
# Pick only one of the below networking options.
|
||||||
|
# networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
|
||||||
|
# networking.networkmanager.enable = true; # Easiest to use and most distros use this by default.
|
||||||
|
|
||||||
|
# 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_US.UTF-8";
|
||||||
|
# console = {
|
||||||
|
# font = "Lat2-Terminus16";
|
||||||
|
# keyMap = "us";
|
||||||
|
# useXkbConfig = true; # use xkb.options in tty.
|
||||||
|
# };
|
||||||
|
|
||||||
|
# Enable the X11 windowing system.
|
||||||
|
# services.xserver.enable = true;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Configure keymap in X11
|
||||||
|
# services.xserver.xkb.layout = "us";
|
||||||
|
# services.xserver.xkb.options = "eurosign:e,caps:escape";
|
||||||
|
|
||||||
|
# Enable CUPS to print documents.
|
||||||
|
# services.printing.enable = true;
|
||||||
|
|
||||||
|
# Enable sound.
|
||||||
|
# sound.enable = true;
|
||||||
|
# hardware.pulseaudio.enable = true;
|
||||||
|
|
||||||
|
# Enable touchpad support (enabled default in most desktopManager).
|
||||||
|
# services.xserver.libinput.enable = true;
|
||||||
|
|
||||||
|
|
||||||
|
# Some programs need SUID wrappers, can be configured further or are
|
||||||
|
# started in user sessions.
|
||||||
|
# programs.mtr.enable = true;
|
||||||
|
# programs.gnupg.agent = {
|
||||||
|
# enable = true;
|
||||||
|
# enableSSHSupport = true;
|
||||||
|
# };
|
||||||
|
|
||||||
|
# List services that you want to enable:
|
||||||
|
|
||||||
|
# Open ports in the firewall.
|
||||||
|
# networking.firewall.allowedTCPPorts = [ ... ];
|
||||||
|
# networking.firewall.allowedUDPPorts = [ ... ];
|
||||||
|
# Or disable the firewall altogether.
|
||||||
|
# networking.firewall.enable = false;
|
||||||
|
|
||||||
|
# Copy the NixOS configuration file and link it from the resulting system
|
||||||
|
# (/run/current-system/configuration.nix). This is useful in case you
|
||||||
|
# accidentally delete configuration.nix.
|
||||||
|
# system.copySystemConfiguration = true;
|
||||||
|
|
||||||
|
# This option defines the first version of NixOS you have installed on this particular machine,
|
||||||
|
# and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions.
|
||||||
|
#
|
||||||
|
# Most users should NEVER change this value after the initial install, for any reason,
|
||||||
|
# even if you've upgraded your system to a new NixOS release.
|
||||||
|
#
|
||||||
|
# This value does NOT affect the Nixpkgs version your packages and OS are pulled from,
|
||||||
|
# so changing it will NOT upgrade your system.
|
||||||
|
#
|
||||||
|
# This value being lower than the current NixOS release does NOT mean your system is
|
||||||
|
# out of date, out of support, or vulnerable.
|
||||||
|
#
|
||||||
|
# Do NOT change this value unless you have manually inspected all the changes it would make to your configuration,
|
||||||
|
# and migrated your data accordingly.
|
||||||
|
#
|
||||||
|
# For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion .
|
||||||
|
system.stateVersion = "23.11"; # Did you read the comment?
|
||||||
|
|
||||||
|
}
|
||||||
|
|
37
nixos/hosts/nixosvm/hardware-configuration.nix
Normal file
37
nixos/hosts/nixosvm/hardware-configuration.nix
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
# 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, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ ];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [ "ata_piix" "ohci_pci" "ehci_pci" "ahci" "sd_mod" "sr_mod" ];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [ ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
|
fileSystems."/" =
|
||||||
|
{ device = "/dev/disk/by-uuid/e9c21872-a682-4418-9fae-a5ff2a16362d";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/boot" =
|
||||||
|
{ device = "/dev/disk/by-uuid/5572-019E";
|
||||||
|
fsType = "vfat";
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices =
|
||||||
|
[ { device = "/dev/disk/by-uuid/34d04571-5752-426a-b4bc-48c88a1a4def"; }
|
||||||
|
];
|
||||||
|
|
||||||
|
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||||
|
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||||
|
# still possible to use this option, but it's recommended to use it in conjunction
|
||||||
|
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||||
|
networking.useDHCP = lib.mkDefault true;
|
||||||
|
# networking.interfaces.enp0s3.useDHCP = lib.mkDefault true;
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
|
virtualisation.virtualbox.guest.enable = true;
|
||||||
|
}
|
26
nixos/hosts/playground/README.md
Normal file
26
nixos/hosts/playground/README.md
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# Playground NixOS container
|
||||||
|
|
||||||
|
Spin up a TTY only container using systemd nspawn to experiment with configuration.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create container from configuration flake
|
||||||
|
sudo nixos-container create playground \
|
||||||
|
--local-address 10.235.1.2 \
|
||||||
|
--host-address 10.235.1.1 \
|
||||||
|
--flake .#playground
|
||||||
|
|
||||||
|
# Update container
|
||||||
|
sudo nixos-container update playground --flake .#playground
|
||||||
|
|
||||||
|
# Start container
|
||||||
|
sudo nixos-container start playground
|
||||||
|
|
||||||
|
# Attach to container TTY
|
||||||
|
sudo nixos-container login playground
|
||||||
|
|
||||||
|
# Stop when done testing
|
||||||
|
sudo nixos-container stop playground
|
||||||
|
|
||||||
|
# Destroy container
|
||||||
|
sudo nixos-container destroy playground
|
||||||
|
```
|
29
nixos/hosts/playground/default.nix
Normal file
29
nixos/hosts/playground/default.nix
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ ./playground.nix ];
|
||||||
|
boot.isContainer = true;
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
|
networking = {
|
||||||
|
hostName = "playground";
|
||||||
|
useDHCP = false;
|
||||||
|
useHostResolvConf = false;
|
||||||
|
resolvconf.enable = true;
|
||||||
|
resolvconf.extraConfig = ''
|
||||||
|
resolv_conf_local_only=NO
|
||||||
|
name_server_blacklist=127.0.0.1
|
||||||
|
name_servers=1.1.1.1
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
security.sudo.wheelNeedsPassword = false;
|
||||||
|
system.stateVersion = "22.05";
|
||||||
|
nix.gc.automatic = false;
|
||||||
|
|
||||||
|
mySystem.home-manager.enable = false;
|
||||||
|
|
||||||
|
# Workaround for broken home-manager
|
||||||
|
systemd.tmpfiles.rules = [
|
||||||
|
"d /nix/var/nix/gcroots/per-user/${config.mySystem.user} - ${config.mySystem.user} - - -"
|
||||||
|
"d /nix/var/nix/profiles/per-user/${config.mySystem.user} - ${config.mySystem.user} - - -"
|
||||||
|
];
|
||||||
|
}
|
3
nixos/hosts/playground/playground.nix
Normal file
3
nixos/hosts/playground/playground.nix
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{ config, pkgs, lib, inputs, outputs, ... }:
|
||||||
|
|
||||||
|
{ }
|
0
nixos/modules/.gitkeep
Normal file
0
nixos/modules/.gitkeep
Normal file
0
nixos/overlays/.gitkeep
Normal file
0
nixos/overlays/.gitkeep
Normal file
9
nixos/overlays/default.nix
Normal file
9
nixos/overlays/default.nix
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{ inputs, ... }:
|
||||||
|
{
|
||||||
|
unstable-packages = final: _prev: {
|
||||||
|
unstable = import inputs.nixpkgs-unstable {
|
||||||
|
system = final.system;
|
||||||
|
config.allowUnfree = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
0
nixos/pkgs/.gitkeep
Normal file
0
nixos/pkgs/.gitkeep
Normal file
Reference in a new issue