This commit is contained in:
commit
fef2377502
174 changed files with 7423 additions and 0 deletions
1
.envrc
Normal file
1
.envrc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
use flake
|
53
.github/workflows/ci.yml
vendored
Normal file
53
.github/workflows/ci.yml
vendored
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
env:
|
||||||
|
ATTIC_AUTH_TOKEN: ${{ secrets.ATTIC_AUTH_TOKEN }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
container: nixpkgs/nix-flakes:nixos-24.05
|
||||||
|
steps:
|
||||||
|
- name: Initialize CI
|
||||||
|
uses: https://git.qo.is/qo.is/actions-nix-init@main
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.CI_TOKEN }}
|
||||||
|
lfs: false
|
||||||
|
|
||||||
|
- name: Add submodules to nix store to circumvent another nix bug
|
||||||
|
run: |
|
||||||
|
git clone https://git.qo.is/qo.is/infrastructure-private.git /tmp/private
|
||||||
|
cd /tmp/private
|
||||||
|
nix flake prefetch
|
||||||
|
|
||||||
|
- name: Use attic cache
|
||||||
|
run: nix run .#cache use
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
nix run .#cache watch &
|
||||||
|
nix build --max-jobs 12 --cores 12
|
||||||
|
kill %1
|
||||||
|
nix run .#cache push
|
||||||
|
|
||||||
|
- name: Run Checks
|
||||||
|
run: |
|
||||||
|
nix run .#cache watch &
|
||||||
|
nix flake check
|
||||||
|
kill %1
|
||||||
|
|
||||||
|
- name: Deploy Docs
|
||||||
|
if: success() && github.ref == 'refs/heads/main'
|
||||||
|
run: |
|
||||||
|
nix run .#cache watch &
|
||||||
|
mkdir ~/.ssh/
|
||||||
|
echo -e "Host lindberg-webapps.backplane.net.qo.is\n StrictHostKeyChecking no" >> ~/.ssh/config
|
||||||
|
(umask 0077 && printf "%s\n" "${{ secrets.SSH_DEPLOY_KEY }}" > ~/.ssh/id_ed25519)
|
||||||
|
# Remote build might be neccessary due to non-wheel nix users signing restrictions.
|
||||||
|
# However, the build should come from the cache anyway.
|
||||||
|
nix develop --command deploy --skip-checks --remote-build .#lindberg-webapps.\"docs-ops.qo.is\"
|
||||||
|
kill %1
|
||||||
|
|
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/configuration.nix
|
||||||
|
/result*
|
||||||
|
/host/*/result*
|
||||||
|
*.qcow2
|
||||||
|
/.direnv
|
||||||
|
/book
|
||||||
|
/.sops.yaml
|
4
.gitmodules
vendored
Normal file
4
.gitmodules
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
[submodule "private"]
|
||||||
|
path = private
|
||||||
|
url = https://git.qo.is/qo.is/infrastructure-private.git
|
||||||
|
branch = main
|
18
.nixd.json
Normal file
18
.nixd.json
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"eval": {
|
||||||
|
"target": {
|
||||||
|
"args": ["-f", "default.nix"],
|
||||||
|
"installable": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"formatting": {
|
||||||
|
"command": "nixfmt"
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"enable": true,
|
||||||
|
"target": {
|
||||||
|
"args": [],
|
||||||
|
"installable": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
5
.vscode/extensions.json
vendored
Normal file
5
.vscode/extensions.json
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"jnoortheen.nix-ide"
|
||||||
|
]
|
||||||
|
}
|
5
.vscode/settings.json
vendored
Normal file
5
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"nix.enableLanguageServer": true,
|
||||||
|
"nix.formatterPath": "nixfmt",
|
||||||
|
"nix.serverPath": "nixd",
|
||||||
|
}
|
61
README.md
Normal file
61
README.md
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
# qo.is Infrastructure
|
||||||
|
|
||||||
|
[This repository](https://gitlab.com/qo.is/infrastructure) contains the infrastructure configuration and documentation sources.
|
||||||
|
|
||||||
|
Check out the current [rendered documentation on the deployed gitlab page](https://docs-ops.qo.is).
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
`nixos-configurations`: Main nixos configuration for every host.
|
||||||
|
`defaults`: Configuration defaults
|
||||||
|
`modules`: Custom modules (e.g. for vpn and routers)
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
This repository requires [nix flakes](https://nixos.wiki/wiki/Flakes)
|
||||||
|
|
||||||
|
- `nix build`
|
||||||
|
Build all host configurations and docs
|
||||||
|
- `nix build .#nixosConfigurations.<hostname>.config.system.build.toplevel`
|
||||||
|
Build a single host configuration with
|
||||||
|
- `nix build .#docs`
|
||||||
|
Build the documentation website
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
- `nix develop`
|
||||||
|
Development environment
|
||||||
|
- `nix flake check`
|
||||||
|
Execute the project's checks
|
||||||
|
- `nix fmt`
|
||||||
|
Autofix formatting
|
||||||
|
|
||||||
|
### Working with the private submodule
|
||||||
|
|
||||||
|
On changes:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add private
|
||||||
|
nix flake lock --update-input private
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
`nix run .#deploy`
|
||||||
|
|
||||||
|
See [Deployment](deployment.md) for details.
|
||||||
|
|
||||||
|
## Secrets
|
||||||
|
|
||||||
|
Secret management is done with [nix-sops](https://github.com/Mic92/sops-nix).
|
||||||
|
|
||||||
|
Secrets are stored in `private/passwords.sops.yaml` (sysadmin passwords),
|
||||||
|
`private/nixos-configurations/secrets.sops.yaml` (shared secrets for all hosts) and
|
||||||
|
`private/nixos-configurations/<hostname>/secrets.sops.yaml` (host specific secrets).
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sops
|
||||||
|
sops-rekey
|
||||||
|
```
|
33
SUMMARY.md
Normal file
33
SUMMARY.md
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
# Summary
|
||||||
|
|
||||||
|
- [Repository README](README.md)
|
||||||
|
- [Deployment](deploy/README.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
- [Network Topology](defaults/meta/network.md)
|
||||||
|
- [Hardware (generic)](defaults/hardware/README.md)
|
||||||
|
- [Backups](backups.md)
|
||||||
|
- [Updates](updates.md)
|
||||||
|
- [New Host Setup](nixos-configurations/setup.md)
|
||||||
|
|
||||||
|
|
||||||
|
# Services
|
||||||
|
|
||||||
|
- [E-mail](email.md)
|
||||||
|
- [Git](nixos-modules/qois/git/README.md)
|
||||||
|
- [Nextcloud](defaults/nextcloud/README.md)
|
||||||
|
- [Nix Caches](nixos-configurations/lindberg-build/applications/README.md)
|
||||||
|
- [Static Pages](nixos-modules/qois/static-page/README.md)
|
||||||
|
- [VPN](defaults/vpn/README.md)
|
||||||
|
- [Vaultwarden](nixos-modules/vault/README.md)
|
||||||
|
|
||||||
|
# Nixos Configurations
|
||||||
|
|
||||||
|
- [calanda](nixos-configurations/calanda/README.md)
|
||||||
|
- [cyprianspitz](nixos-configurations/cyprianspitz/README.md)
|
||||||
|
- [fulberg](nixos-configurations/fulberg/README.md)
|
||||||
|
- [lindberg](nixos-configurations/lindberg/README.md)
|
||||||
|
- [stompert](nixos-configurations/stompert/README.md)
|
||||||
|
- [tierberg](nixos-configurations/tierberg/README.md)
|
||||||
|
|
19
backups.md
Normal file
19
backups.md
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# Backups
|
||||||
|
|
||||||
|
We use [borg](https://www.borgbackup.org/) to create encrypted and deduplicated backups.
|
||||||
|
|
||||||
|
The backups are encrypted with a (key unlocked by a) secure passphrase that is deployed to the respective node and stored in the [pass repository](https://gitlab.com/qo.is/pass) resp. the sops files in this repository.
|
||||||
|
|
||||||
|
Service specific restore instructions are given in the respective services' documentation.
|
||||||
|
|
||||||
|
## Host Backups
|
||||||
|
|
||||||
|
All hosts make automated backups. See Modules `qois.backup-client` and `qois.backup-server` for details.
|
||||||
|
|
||||||
|
## Verify Backups Manually
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh root@lindberg-nextcloud.backplane.net.qo.is -- systemctl status borgbackup-job-system-cyprianspitz.service
|
||||||
|
ssh root@lindberg-webapps.backplane.net.qo.is -- systemctl status borgbackup-job-system-cyprianspitz.service
|
||||||
|
ssh root@lindberg.backplane.net.qo.is -- systemctl status borgbackup-job-system-cyprianspitz.service
|
||||||
|
```
|
11
book.toml
Normal file
11
book.toml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
[book]
|
||||||
|
authors = ["qo.is contributers"]
|
||||||
|
language = "en"
|
||||||
|
multilingual = false
|
||||||
|
src = "."
|
||||||
|
title = "qo.is infrastructure docs"
|
||||||
|
|
||||||
|
[preprocessor.cmdrun]
|
||||||
|
|
||||||
|
[preprocessor.plantuml]
|
||||||
|
plantuml-cmd="plantuml"
|
23
checks/default.nix
Normal file
23
checks/default.nix
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
self,
|
||||||
|
system,
|
||||||
|
pkgs,
|
||||||
|
deployPkgs,
|
||||||
|
...
|
||||||
|
}@inputs:
|
||||||
|
{
|
||||||
|
${system} = {
|
||||||
|
|
||||||
|
# Check project formatting
|
||||||
|
format = pkgs.runCommand "nixfmt-check" { } ''
|
||||||
|
set -euo pipefail
|
||||||
|
cd ${self}
|
||||||
|
${self.formatter.${system}}/bin/formatter . --check
|
||||||
|
mkdir $out
|
||||||
|
'';
|
||||||
|
|
||||||
|
#TODO(#29): Integration/System tests
|
||||||
|
|
||||||
|
# Import deploy-rs tests
|
||||||
|
} // (deployPkgs.deploy-rs.lib.deployChecks self.deploy);
|
||||||
|
}
|
5
defaults/backplane-net/README.md
Normal file
5
defaults/backplane-net/README.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
## Backplane Overlay Network
|
||||||
|
|
||||||
|
The `backplane.net.qo.is` overlay network connects all the hosts in a peer-to-peer fashion using [wgautomesh](https://git.deuxfleurs.fr/Deuxfleurs/wgautomesh).
|
||||||
|
|
||||||
|
The definition of the connected hosts are in [defaults/meta/network-virtual.nix](../meta/network-virtual.nix).
|
58
defaults/backplane-net/default.nix
Normal file
58
defaults/backplane-net/default.nix
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
hostName = config.networking.hostName;
|
||||||
|
netName = "backplane";
|
||||||
|
netConfig = config.qois.meta.network.virtual.${netName};
|
||||||
|
hostNetConfig = netConfig.hosts.${hostName};
|
||||||
|
wgDefaultPort = 51825;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
sops.secrets."wgautomesh/gossip-secret".restartUnits = [ "wgautomesh.service" ];
|
||||||
|
|
||||||
|
networking.wireguard.enable = true;
|
||||||
|
networking.wireguard.interfaces."wg-${netName}" = {
|
||||||
|
ips = [ "${hostNetConfig.v4.ip}/${builtins.toString netConfig.v4.prefixLength}" ];
|
||||||
|
listenPort = if hostNetConfig.endpoint != null then hostNetConfig.endpoint.port else wgDefaultPort;
|
||||||
|
privateKeyFile = "/secrets/wireguard/private/${netName}";
|
||||||
|
generatePrivateKeyFile = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.network.wait-online.ignoredInterfaces = [ "wg-${netName}" ];
|
||||||
|
|
||||||
|
networking.firewall.allowedUDPPorts =
|
||||||
|
if hostNetConfig.endpoint != null then [ hostNetConfig.endpoint.port ] else [ wgDefaultPort ];
|
||||||
|
|
||||||
|
# Configure wgautomesh to setup peers. Make sure that the name is not used in the VPN module
|
||||||
|
services.wgautomesh = {
|
||||||
|
enable = true;
|
||||||
|
gossipSecretFile = builtins.toString config.sops.secrets."wgautomesh/gossip-secret".path;
|
||||||
|
openFirewall = true;
|
||||||
|
logLevel = "info";
|
||||||
|
settings = {
|
||||||
|
interface = "wg-${netName}";
|
||||||
|
|
||||||
|
# Map meta network configuration to the format of wgautomesh and filter out peers with endpoints
|
||||||
|
peers =
|
||||||
|
let
|
||||||
|
reachableHosts = lib.filterAttrs (
|
||||||
|
peerHostName: peerConfig: peerHostName != hostName # Not this host
|
||||||
|
) netConfig.hosts;
|
||||||
|
in
|
||||||
|
lib.mapAttrsToList (_: peerConfig: {
|
||||||
|
address = peerConfig.v4.ip;
|
||||||
|
endpoint =
|
||||||
|
if peerConfig.endpoint != null then
|
||||||
|
with peerConfig.endpoint; "${fqdn}:${builtins.toString port}"
|
||||||
|
else
|
||||||
|
null;
|
||||||
|
pubkey = peerConfig.publicKey;
|
||||||
|
}) reachableHosts;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
systemd.services.wgautomesh.requires = [ "wireguard-wg-backplane.service" ];
|
||||||
|
}
|
55
defaults/base-minimal/applications.nix
Normal file
55
defaults/base-minimal/applications.nix
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
environment.systemPackages =
|
||||||
|
with pkgs;
|
||||||
|
[
|
||||||
|
vim
|
||||||
|
tmux
|
||||||
|
killall
|
||||||
|
bc
|
||||||
|
rename
|
||||||
|
wipe
|
||||||
|
gnupg
|
||||||
|
ripgrep
|
||||||
|
]
|
||||||
|
++ [
|
||||||
|
nix-index
|
||||||
|
nix-diff
|
||||||
|
]
|
||||||
|
++ [
|
||||||
|
autojump
|
||||||
|
powerline-go
|
||||||
|
]
|
||||||
|
++ [
|
||||||
|
# File Utilities
|
||||||
|
ack
|
||||||
|
unzip
|
||||||
|
iotop
|
||||||
|
tree
|
||||||
|
vim
|
||||||
|
vimPlugins.pathogen
|
||||||
|
vimPlugins.airline
|
||||||
|
git
|
||||||
|
git-lfs
|
||||||
|
]
|
||||||
|
++ [
|
||||||
|
# Filesystem & Disk Utilities
|
||||||
|
parted
|
||||||
|
]
|
||||||
|
++ [
|
||||||
|
# Networking Utilities
|
||||||
|
nmap
|
||||||
|
bind
|
||||||
|
curl
|
||||||
|
wget
|
||||||
|
rsync
|
||||||
|
iftop
|
||||||
|
mailutils
|
||||||
|
];
|
||||||
|
}
|
132
defaults/base-minimal/default.nix
Normal file
132
defaults/base-minimal/default.nix
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
inputs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./unfree.nix
|
||||||
|
./applications.nix
|
||||||
|
./overlays.nix
|
||||||
|
./security.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.loader.timeout = 2;
|
||||||
|
boot.tmp.useTmpfs = true;
|
||||||
|
boot.loader.grub.splashImage = null;
|
||||||
|
|
||||||
|
console.keyMap = "de_CH-latin1";
|
||||||
|
i18n.defaultLocale = "en_US.UTF-8";
|
||||||
|
|
||||||
|
boot.kernel.sysctl = {
|
||||||
|
"kernel.panic" = 20; # Reboot kernel on panic after this much seconds
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.initrd.network.udhcpc.extraArgs = [
|
||||||
|
"-A"
|
||||||
|
"900" # Wait for a DHCP lease on boot for 15mins
|
||||||
|
];
|
||||||
|
|
||||||
|
systemd.watchdog = {
|
||||||
|
runtimeTime = "5m";
|
||||||
|
rebootTime = "10m";
|
||||||
|
};
|
||||||
|
|
||||||
|
users.mutableUsers = false;
|
||||||
|
users.users = {
|
||||||
|
root.openssh.authorizedKeys.keys =
|
||||||
|
with lib;
|
||||||
|
concatLists (
|
||||||
|
mapAttrsToList (
|
||||||
|
name: user:
|
||||||
|
if elem "wheel" user.extraGroups && name != "root" then user.openssh.authorizedKeys.keys else [ ]
|
||||||
|
) config.users.users
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
# Disable dependency on xorg
|
||||||
|
# TODO: Set environment.noXlibs on hosts that don't need any x libraries.
|
||||||
|
security.pam.services.su.forwardXAuth = lib.mkForce false;
|
||||||
|
|
||||||
|
# Package management
|
||||||
|
nix = {
|
||||||
|
settings = {
|
||||||
|
trusted-users = [
|
||||||
|
"root"
|
||||||
|
"@wheel"
|
||||||
|
];
|
||||||
|
substituters = [
|
||||||
|
"https://${inputs.self.nixosConfigurations.lindberg-build.config.qois.nixpkgs-cache.hostname}?priority=39"
|
||||||
|
"https://cache.nixos.org?priority=40"
|
||||||
|
"https://attic.qo.is/qois-infrastructure"
|
||||||
|
];
|
||||||
|
trusted-public-keys = [
|
||||||
|
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
|
||||||
|
"qois-infrastructure:lh35ymN7Aoxm5Hz0S6JusxE+cYzMU+x9OMKjDVIpfuE="
|
||||||
|
];
|
||||||
|
};
|
||||||
|
gc = {
|
||||||
|
automatic = true;
|
||||||
|
dates = "weekly";
|
||||||
|
options = "--delete-older-than 90d";
|
||||||
|
};
|
||||||
|
package = pkgs.nixFlakes;
|
||||||
|
extraOptions = ''
|
||||||
|
experimental-features = nix-command flakes
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
system.autoUpgrade = {
|
||||||
|
enable = true;
|
||||||
|
randomizedDelaySec = "30m";
|
||||||
|
flags = [
|
||||||
|
"--update-input"
|
||||||
|
"nixpkgs-nixos-2211"
|
||||||
|
"--commit-lock-file"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Network services
|
||||||
|
networking.firewall = {
|
||||||
|
allowPing = true;
|
||||||
|
allowedTCPPorts = [ 22 ];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.openssh = {
|
||||||
|
enable = true;
|
||||||
|
settings.PasswordAuthentication = false;
|
||||||
|
|
||||||
|
# temporary mitigation agains CVE-2024-6387 «regreSSHion» RCE
|
||||||
|
# See https://github.com/NixOS/nixpkgs/pull/323753#issuecomment-2199762128
|
||||||
|
settings.LoginGraceTime = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
security.acme = {
|
||||||
|
acceptTerms = true;
|
||||||
|
defaults.email = "sysadmin@qo.is";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Default Settings
|
||||||
|
environment.etc = {
|
||||||
|
gitconfig.source = ./etc/gitconfig;
|
||||||
|
vimrc.source = ./etc/vimrc;
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.autojump.enable = true;
|
||||||
|
programs.vim.defaultEditor = true;
|
||||||
|
|
||||||
|
sops.defaultSopsFile =
|
||||||
|
let
|
||||||
|
defaultSopsPath = "${inputs.private}/nixos-configurations/${config.networking.hostName}/secrets.sops.yaml";
|
||||||
|
in
|
||||||
|
lib.mkIf (builtins.pathExists defaultSopsPath) defaultSopsPath;
|
||||||
|
|
||||||
|
services.fstrim.enable = true;
|
||||||
|
|
||||||
|
qois.outgoing-server-mail.enable = true;
|
||||||
|
qois.backup-client.enable = true;
|
||||||
|
|
||||||
|
systemd.extraConfig = "DefaultLimitNOFILE=4096";
|
||||||
|
}
|
31
defaults/base-minimal/etc/gitconfig
Normal file
31
defaults/base-minimal/etc/gitconfig
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
[core]
|
||||||
|
packedGitWindowSize = 16m
|
||||||
|
packedGitLimit = 64m
|
||||||
|
[pack]
|
||||||
|
windowMemory = 64m
|
||||||
|
packSizeLimit = 64m
|
||||||
|
thread = 1
|
||||||
|
deltaCacheSize = 1m
|
||||||
|
[color]
|
||||||
|
branch = auto
|
||||||
|
diff = auto
|
||||||
|
status = auto
|
||||||
|
[push]
|
||||||
|
default = simple
|
||||||
|
[pull]
|
||||||
|
rebase = true
|
||||||
|
[branch]
|
||||||
|
autosetuprebase = always
|
||||||
|
[commit]
|
||||||
|
# gpgsign = true
|
||||||
|
[tag]
|
||||||
|
# gpgsign = true
|
||||||
|
|
||||||
|
[alias]
|
||||||
|
s = status --short --branch
|
||||||
|
a = add --patch
|
||||||
|
c = commit --message
|
||||||
|
l = log --color --graph --pretty=format:'%Cred%h%Creset - %C(bold)%s%Creset%C(yellow)%d%Creset %C(green)%an%Creset %C(cyan)%cr%Creset' --abbrev-commit
|
||||||
|
d = diff
|
||||||
|
[diff]
|
||||||
|
# noprefix = true
|
54
defaults/base-minimal/etc/vimrc
Normal file
54
defaults/base-minimal/etc/vimrc
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
|
||||||
|
" Use Vim settings, rather than Vi settings (much better!).
|
||||||
|
" This must be first, because it changes other options as a side effect.
|
||||||
|
" Avoid side effects when it was already reset.
|
||||||
|
if &compatible
|
||||||
|
set nocompatible
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Convenient command to see the difference between the current buffer and the
|
||||||
|
" file it was loaded from, thus the changes you made.
|
||||||
|
" Only define it when not defined already.
|
||||||
|
" Revert with: ":delcommand DiffOrig".
|
||||||
|
if !exists(":DiffOrig")
|
||||||
|
command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ | diffthis
|
||||||
|
\ | wincmd p | diffthis
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Don't wake up system with blinking cursor:
|
||||||
|
" http://www.linuxpowertop.org/known.php
|
||||||
|
let &guicursor = &guicursor . ",a:blinkon0"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
""""""""""""""""""""""""""
|
||||||
|
" Design Settings
|
||||||
|
""""""""""""""""""""""""""
|
||||||
|
set background=dark
|
||||||
|
colorscheme elflord
|
||||||
|
|
||||||
|
""""""""""""""""""""""""""
|
||||||
|
" Other Settings
|
||||||
|
""""""""""""""""""""""""""
|
||||||
|
set ignorecase " Ignore search case
|
||||||
|
set autoindent " Newline with automatic text indent
|
||||||
|
set ruler " Show current position
|
||||||
|
set pastetoggle=<F2>
|
||||||
|
set ignorecase
|
||||||
|
set hidden
|
||||||
|
|
||||||
|
set splitbelow
|
||||||
|
set splitright
|
||||||
|
|
||||||
|
set tabstop=2
|
||||||
|
set shiftwidth=2
|
||||||
|
set softtabstop=2
|
||||||
|
set expandtab
|
||||||
|
|
||||||
|
set listchars="eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣"
|
||||||
|
set grepprg=ack\ -k
|
||||||
|
|
||||||
|
filetype plugin indent on
|
||||||
|
syntax on
|
||||||
|
|
12
defaults/base-minimal/overlays.nix
Normal file
12
defaults/base-minimal/overlays.nix
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
options,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
nixpkgs.overlays = [ (import ../../overlays) ];
|
||||||
|
nix.nixPath = options.nix.nixPath.default;
|
||||||
|
}
|
37
defaults/base-minimal/security.nix
Normal file
37
defaults/base-minimal/security.nix
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
|
||||||
|
# ###########################################################################
|
||||||
|
# Options taken from hardened kernel profile, see
|
||||||
|
# https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/profiles/hardened.nix
|
||||||
|
# ###########################################################################
|
||||||
|
# Enable strict reverse path filtering (that is, do not attempt to route
|
||||||
|
# packets that "obviously" do not belong to the iface's network; dropped
|
||||||
|
# packets are logged as martians).
|
||||||
|
boot.kernel.sysctl."net.ipv4.conf.all.log_martians" = mkDefault true;
|
||||||
|
boot.kernel.sysctl."net.ipv4.conf.all.rp_filter" = mkDefault "1";
|
||||||
|
boot.kernel.sysctl."net.ipv4.conf.default.log_martians" = mkDefault true;
|
||||||
|
boot.kernel.sysctl."net.ipv4.conf.default.rp_filter" = mkDefault "1";
|
||||||
|
|
||||||
|
# Ignore broadcast ICMP (mitigate SMURF)
|
||||||
|
boot.kernel.sysctl."net.ipv4.icmp_echo_ignore_broadcasts" = mkDefault true;
|
||||||
|
|
||||||
|
# Ignore incoming ICMP redirects (note: default is needed to ensure that the
|
||||||
|
# setting is applied to interfaces added after the sysctls are set)
|
||||||
|
boot.kernel.sysctl."net.ipv4.conf.all.accept_redirects" = mkDefault false;
|
||||||
|
boot.kernel.sysctl."net.ipv4.conf.all.secure_redirects" = mkDefault false;
|
||||||
|
boot.kernel.sysctl."net.ipv4.conf.default.accept_redirects" = mkDefault false;
|
||||||
|
boot.kernel.sysctl."net.ipv4.conf.default.secure_redirects" = mkDefault false;
|
||||||
|
boot.kernel.sysctl."net.ipv6.conf.all.accept_redirects" = mkDefault false;
|
||||||
|
boot.kernel.sysctl."net.ipv6.conf.default.accept_redirects" = mkDefault false;
|
||||||
|
|
||||||
|
# Ignore outgoing ICMP redirects (this is ipv4 only)
|
||||||
|
boot.kernel.sysctl."net.ipv4.conf.all.send_redirects" = mkDefault false;
|
||||||
|
boot.kernel.sysctl."net.ipv4.conf.default.send_redirects" = mkDefault false;
|
||||||
|
}
|
22
defaults/base-minimal/unfree.nix
Normal file
22
defaults/base-minimal/unfree.nix
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
nixpkgs.config.allowUnfreePredicate =
|
||||||
|
pkg:
|
||||||
|
builtins.elem (lib.getName pkg) [
|
||||||
|
"corefonts"
|
||||||
|
"camingo-code"
|
||||||
|
"helvetica-neue-lt-std"
|
||||||
|
#"kochi-substitute-naga10"
|
||||||
|
"ttf-envy-code-r"
|
||||||
|
"vista-fonts"
|
||||||
|
"vista-fonts-chs"
|
||||||
|
"xkcd-font-unstable"
|
||||||
|
"ricty"
|
||||||
|
];
|
||||||
|
}
|
39
defaults/base-vm/default.nix
Normal file
39
defaults/base-vm/default.nix
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
modulesPath,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
../base-minimal
|
||||||
|
(modulesPath + "/profiles/qemu-guest.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.loader.grub.enable = true;
|
||||||
|
|
||||||
|
system.autoUpgrade.allowReboot = true;
|
||||||
|
|
||||||
|
services.qemuGuest.enable = true;
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [
|
||||||
|
"ahci"
|
||||||
|
"xhci_pci"
|
||||||
|
"sr_mod"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Taken from https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/profiles/minimal.nix
|
||||||
|
documentation.enable = lib.mkDefault false;
|
||||||
|
|
||||||
|
documentation.doc.enable = lib.mkDefault false;
|
||||||
|
|
||||||
|
documentation.info.enable = lib.mkDefault false;
|
||||||
|
|
||||||
|
documentation.man.enable = lib.mkDefault false;
|
||||||
|
|
||||||
|
documentation.nixos.enable = lib.mkDefault false;
|
||||||
|
|
||||||
|
}
|
32
defaults/base/applications.nix
Normal file
32
defaults/base/applications.nix
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
environment.systemPackages =
|
||||||
|
with pkgs;
|
||||||
|
[
|
||||||
|
pciutils
|
||||||
|
dmidecode
|
||||||
|
smartmontools
|
||||||
|
iw
|
||||||
|
efibootmgr
|
||||||
|
efitools
|
||||||
|
efivar
|
||||||
|
pwgen
|
||||||
|
powertop
|
||||||
|
lm_sensors
|
||||||
|
]
|
||||||
|
++ [
|
||||||
|
# Filesystem & Disk Utilities
|
||||||
|
hdparm
|
||||||
|
smartmontools
|
||||||
|
]
|
||||||
|
++ [
|
||||||
|
# Networking Utilities
|
||||||
|
tcpdump
|
||||||
|
];
|
||||||
|
}
|
25
defaults/base/default.nix
Normal file
25
defaults/base/default.nix
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../base-minimal
|
||||||
|
./applications.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
# System Services
|
||||||
|
services.fwupd.enable = true;
|
||||||
|
|
||||||
|
services.smartd = {
|
||||||
|
enable = true;
|
||||||
|
notifications.mail = {
|
||||||
|
enable = true;
|
||||||
|
mailer = "${pkgs.msmtp}/bin/sendmail";
|
||||||
|
sender = "system@qo.is";
|
||||||
|
recipient = "sysadmin@qo.is";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
15
defaults/hardware/README.md
Normal file
15
defaults/hardware/README.md
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
|
||||||
|
# APU
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
To boot the nixos installer with the console port, add `console=ttyS0,115200n8` to the kernel command line in grub.
|
||||||
|
|
||||||
|
# ASROCK Mainboards
|
||||||
|
|
||||||
|
`F2`: Boot into BIOS
|
||||||
|
`F11`: Select boot device
|
||||||
|
|
||||||
|
# NUC
|
||||||
|
|
||||||
|
- [Boot Keybindings](https://www.intel.com/content/www/us/en/support/articles/000005672/boards-and-kits/desktop-boards.html)
|
38
defaults/hardware/apu.nix
Normal file
38
defaults/hardware/apu.nix
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
# 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 = [ (modulesPath + "/installer/scan/not-detected.nix") ];
|
||||||
|
|
||||||
|
boot.loader.grub.extraConfig = "\n serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1\n terminal_input serial\n terminal_output serial\n ";
|
||||||
|
boot.initrd.availableKernelModules = [
|
||||||
|
"xhci_pci"
|
||||||
|
"ahci"
|
||||||
|
"ehci_pci"
|
||||||
|
"usbhid"
|
||||||
|
"usb_storage"
|
||||||
|
"sd_mod"
|
||||||
|
"sdhci_pci"
|
||||||
|
"igb"
|
||||||
|
];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [
|
||||||
|
"kvm-amd"
|
||||||
|
"virtio"
|
||||||
|
"tun"
|
||||||
|
];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
boot.kernelParams = [ "console=ttyS0,115200n8" ];
|
||||||
|
|
||||||
|
# CPU Configuration
|
||||||
|
hardware.cpu.amd.updateMicrocode = true;
|
||||||
|
nix.settings.max-jobs = lib.mkDefault 4;
|
||||||
|
}
|
40
defaults/hardware/apu1.nix
Normal file
40
defaults/hardware/apu1.nix
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
# 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 = [ (modulesPath + "/installer/scan/not-detected.nix") ];
|
||||||
|
|
||||||
|
boot.loader.grub.extraConfig = "\n serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1\n terminal_input serial\n terminal_output serial\n ";
|
||||||
|
boot.initrd.availableKernelModules = [
|
||||||
|
"ahci"
|
||||||
|
"ohci_pci"
|
||||||
|
"xhci_pci"
|
||||||
|
"ahci"
|
||||||
|
"ehci_pci"
|
||||||
|
"usbhid"
|
||||||
|
"usb_storage"
|
||||||
|
"sd_mod"
|
||||||
|
"sdhci_pci"
|
||||||
|
"r8169"
|
||||||
|
];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [
|
||||||
|
"kvm-amd"
|
||||||
|
"virtio"
|
||||||
|
"tun"
|
||||||
|
];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
boot.kernelParams = [ "console=ttyS0,115200n8" ];
|
||||||
|
|
||||||
|
hardware.cpu.amd.updateMicrocode = true;
|
||||||
|
|
||||||
|
nix.settings.max-jobs = lib.mkDefault 2;
|
||||||
|
}
|
33
defaults/hardware/asrock-z790m.nix
Normal file
33
defaults/hardware/asrock-z790m.nix
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
# 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 = [ (modulesPath + "/installer/scan/not-detected.nix") ];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [
|
||||||
|
"xhci_pci"
|
||||||
|
"ahci"
|
||||||
|
"usbhid"
|
||||||
|
"usb_storage"
|
||||||
|
"sd_mod"
|
||||||
|
"e1000e"
|
||||||
|
"virtio-pci"
|
||||||
|
];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
# boot.kernelModules = [ "kvm-intel" "virtio" "tun" ];
|
||||||
|
boot.kernelModules = [ "kvm-intel" ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
# boot.kernelParams = [ "console=ttyS0,115200n8" ];
|
||||||
|
|
||||||
|
hardware.cpu.intel.updateMicrocode = true;
|
||||||
|
powerManagement.cpuFreqGovernor = "ondemand";
|
||||||
|
nix.settings.max-jobs = lib.mkDefault 8;
|
||||||
|
}
|
27
defaults/hardware/asrock.nix
Normal file
27
defaults/hardware/asrock.nix
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
modulesPath,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [
|
||||||
|
"nvme"
|
||||||
|
"usbhid"
|
||||||
|
"usb_storage"
|
||||||
|
"sd_mod"
|
||||||
|
"xhci_pci"
|
||||||
|
"ahci"
|
||||||
|
"virtio-pci"
|
||||||
|
"igb"
|
||||||
|
];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [ "kvm-amd" ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
|
hardware.cpu.amd.updateMicrocode = true;
|
||||||
|
nix.settings.max-jobs = lib.mkDefault 24;
|
||||||
|
}
|
33
defaults/hardware/nuc.nix
Normal file
33
defaults/hardware/nuc.nix
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
# 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 = [ (modulesPath + "/installer/scan/not-detected.nix") ];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [
|
||||||
|
"xhci_pci"
|
||||||
|
"ahci"
|
||||||
|
"usbhid"
|
||||||
|
"usb_storage"
|
||||||
|
"sd_mod"
|
||||||
|
"e1000e"
|
||||||
|
"virtio-pci"
|
||||||
|
];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
# boot.kernelModules = [ "kvm-intel" "virtio" "tun" ];
|
||||||
|
boot.kernelModules = [ "kvm-intel" ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
# boot.kernelParams = [ "console=ttyS0,115200n8" ];
|
||||||
|
|
||||||
|
hardware.cpu.intel.updateMicrocode = true;
|
||||||
|
powerManagement.cpuFreqGovernor = "ondemand";
|
||||||
|
nix.settings.max-jobs = lib.mkDefault 8;
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
diff --unified --recursive --text archlinux-linux/drivers/net/wireless/ath/regd.c archlinux-linux-patched/drivers/net/wireless/ath/regd.c
|
||||||
|
--- a/drivers/net/wireless/ath/regd.c 2019-08-29 18:31:52.749909030 +0200
|
||||||
|
+++ b/drivers/net/wireless/ath/regd.c 2019-08-29 18:33:33.318773763 +0200
|
||||||
|
@@ -345,6 +345,8 @@
|
||||||
|
struct ieee80211_channel *ch;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
for (band = 0; band < NUM_NL80211_BANDS; band++) {
|
||||||
|
if (!wiphy->bands[band])
|
||||||
|
continue;
|
||||||
|
@@ -378,6 +380,8 @@
|
||||||
|
{
|
||||||
|
struct ieee80211_supported_band *sband;
|
||||||
|
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
sband = wiphy->bands[NL80211_BAND_2GHZ];
|
||||||
|
if (!sband)
|
||||||
|
return;
|
||||||
|
@@ -407,6 +411,8 @@
|
||||||
|
struct ieee80211_channel *ch;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
if (!wiphy->bands[NL80211_BAND_5GHZ])
|
||||||
|
return;
|
||||||
|
|
||||||
|
@@ -639,6 +645,9 @@
|
||||||
|
const struct ieee80211_regdomain *regd;
|
||||||
|
|
||||||
|
wiphy->reg_notifier = reg_notifier;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
wiphy->regulatory_flags |= REGULATORY_STRICT_REG |
|
||||||
|
REGULATORY_CUSTOM_REG;
|
||||||
|
|
23
defaults/hardware/wle-regulatory-domain/default.nix
Normal file
23
defaults/hardware/wle-regulatory-domain/default.nix
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
boot.kernelPatches = [
|
||||||
|
{
|
||||||
|
name = "ath10k-override-eeprom-regulatory-domain";
|
||||||
|
patch = ./ath10k-override-eeprom-regulatory-domain.patch;
|
||||||
|
extraConfig = ''
|
||||||
|
EXPERT y
|
||||||
|
CFG80211_CERTIFICATION_ONUS y
|
||||||
|
ATH_REG_DYNAMIC_USER_REG_HINTS y
|
||||||
|
ATH_REG_DYNAMIC_USER_CERT_TESTING y
|
||||||
|
ATH_REG_DYNAMIC_USER_CERT_TESTING y
|
||||||
|
ATH9K_DFS_CERTIFIED y
|
||||||
|
ATH10K_DFS_CERTIFIED y
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
11
defaults/hardware/wle200nx.nix
Normal file
11
defaults/hardware/wle200nx.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
services.hostapd.extraConfig = ''
|
||||||
|
ht_capab=[HT40-][HT40+][SHORT-GI-40][TX-STBC][RX-STBC1][DSSS_CCK-40]
|
||||||
|
'';
|
||||||
|
}
|
13
defaults/meta/default.nix
Normal file
13
defaults/meta/default.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./hosts.nix
|
||||||
|
./network-physical.nix
|
||||||
|
./network-virtual.nix
|
||||||
|
];
|
||||||
|
}
|
44
defaults/meta/hosts.json
Normal file
44
defaults/meta/hosts.json
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
{
|
||||||
|
"fulberg": {
|
||||||
|
"hostName": "fulberg",
|
||||||
|
"sshKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDCG9qqpUOJ2RsohIqhMuw3YZZSrnPqhf5ayh5y0Cq/I"
|
||||||
|
},
|
||||||
|
"calanda": {
|
||||||
|
"hostName": "calanda",
|
||||||
|
"sshKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKdoOZcFFRXIqEWqUnwCk/kqP8DZw6/4omDefCT6aNN4"
|
||||||
|
},
|
||||||
|
"lindberg": {
|
||||||
|
"hostName": "lindberg",
|
||||||
|
"sshKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDksfXKLgPJVuWHAl/pxWRhghun8U6asTZNHa34u+gJw"
|
||||||
|
},
|
||||||
|
"lindberg-nextcloud": {
|
||||||
|
"hostName": "lindberg-nextcloud",
|
||||||
|
"sshKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFR5U4yhZ2x/WN9dO+hVVSTCPMyv/1TB8mbuCXxexZOo"
|
||||||
|
},
|
||||||
|
"lindberg-build": {
|
||||||
|
"hostName": "lindberg-build",
|
||||||
|
"sshKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMnDwwGiucyTI2U8o2rC53weJwp6dO8zcF7BZjkvVq7e"
|
||||||
|
},
|
||||||
|
"lindberg-webapps": {
|
||||||
|
"hostName": "lindberg-webapps",
|
||||||
|
"sshKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJT99lj5OI+V1PlZl/T2ikBORwMiXjDfWpHYfq/GvUM5"
|
||||||
|
},
|
||||||
|
"batzberg": {
|
||||||
|
"hostName": "batzberg"
|
||||||
|
},
|
||||||
|
"tierberg": {
|
||||||
|
"hostName": "tierberg",
|
||||||
|
"sshKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJS2v0mUDJsNr1DHdgjxEQRnoVaEmExFfvHqpvagYLi6"
|
||||||
|
},
|
||||||
|
"stompert": {
|
||||||
|
"hostName": "stompert",
|
||||||
|
"sshKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEKuqMPLbREFIrYcmReaRoHdz1TatpvlrZN14L6cikia"
|
||||||
|
},
|
||||||
|
"router-coredump": {
|
||||||
|
"hostName": "router"
|
||||||
|
},
|
||||||
|
"cyprianspitz": {
|
||||||
|
"hostName": "cyprianspitz",
|
||||||
|
"sshKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE4udYgCfxHEAkM9r8yaerk7l+BgW7039imM0moKpTbB"
|
||||||
|
}
|
||||||
|
}
|
4
defaults/meta/hosts.nix
Normal file
4
defaults/meta/hosts.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
qois.meta.hosts = builtins.fromJSON (builtins.readFile ./hosts.json);
|
||||||
|
}
|
114
defaults/meta/network-physical.nix
Normal file
114
defaults/meta/network-physical.nix
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
qois.meta.network.physical = {
|
||||||
|
plessur-ext = {
|
||||||
|
v4 = {
|
||||||
|
id = "85.195.200.253";
|
||||||
|
prefixLength = 24;
|
||||||
|
};
|
||||||
|
v6 = {
|
||||||
|
id = "2a02:169:1e02::";
|
||||||
|
prefixLength = 48;
|
||||||
|
};
|
||||||
|
domain = "plessur-ext.net.qo.is";
|
||||||
|
hosts = {
|
||||||
|
calanda = {
|
||||||
|
v4.ip = "85.195.200.253";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
plessur-dmz = {
|
||||||
|
v4 = {
|
||||||
|
id = "10.1.2.0";
|
||||||
|
prefixLength = 24;
|
||||||
|
gateway = "10.1.2.1";
|
||||||
|
nameservers = [ "10.1.2.1" ];
|
||||||
|
};
|
||||||
|
domain = "plessur-dmz.net.qo.is";
|
||||||
|
|
||||||
|
hosts = {
|
||||||
|
calanda = {
|
||||||
|
v4.ip = "10.1.2.1";
|
||||||
|
};
|
||||||
|
fulberg = {
|
||||||
|
v4.ip = "10.1.2.2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
plessur-lan = {
|
||||||
|
v4 = {
|
||||||
|
id = "10.1.1.0";
|
||||||
|
prefixLength = 24;
|
||||||
|
};
|
||||||
|
domain = "plessur-lan.net.qo.is";
|
||||||
|
|
||||||
|
hosts = {
|
||||||
|
calanda = {
|
||||||
|
v4.ip = "10.1.1.1";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
eem-lan = {
|
||||||
|
domain = "eem-lan.net.qo.is";
|
||||||
|
hosts = {
|
||||||
|
stompert.v4.ip = ""; # TODO
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
riedbach-ext = {
|
||||||
|
# IP: Dynamic
|
||||||
|
domain = "riedbach-ext.net.qo.is";
|
||||||
|
|
||||||
|
hosts = {
|
||||||
|
lindberg = {
|
||||||
|
# TODO: This is the router, not really lindberg.
|
||||||
|
v4.ip = "145.40.194.243";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
lattenbach-ext = {
|
||||||
|
# Forwarded ports:
|
||||||
|
# udp:51820 -> 10.0.0.60:51820
|
||||||
|
# tcp:51022 -> 10.0.0.60:22
|
||||||
|
# tcp:51023 -> 10.0.0.60:2222
|
||||||
|
domain = "lattenbach-ext.net.qo.is";
|
||||||
|
hosts.router-coredump.v4.ip = "5.226.148.126";
|
||||||
|
};
|
||||||
|
|
||||||
|
lattenbach-lan = {
|
||||||
|
# Coredump LAN
|
||||||
|
v4 = {
|
||||||
|
id = "10.0.0.0";
|
||||||
|
prefixLength = 16;
|
||||||
|
};
|
||||||
|
domain = "lattenbach-lan.net.qo.is";
|
||||||
|
hosts = {
|
||||||
|
tierberg = {
|
||||||
|
v4.ip = "10.0.0.60";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
lattenbach-nas = {
|
||||||
|
# Coredump net between apu and nas
|
||||||
|
v4 = {
|
||||||
|
id = "192.168.254.0";
|
||||||
|
prefixLength = 24;
|
||||||
|
};
|
||||||
|
domain = "lattenbach-nas.net.qo.is";
|
||||||
|
hosts = {
|
||||||
|
tierberg.v4.ip = "192.168.254.2";
|
||||||
|
batzberg.v4.ip = "192.168.254.1";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
114
defaults/meta/network-virtual.nix
Normal file
114
defaults/meta/network-virtual.nix
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
qois.meta.network.virtual =
|
||||||
|
let
|
||||||
|
physical-network = config.qois.meta.network.physical;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
vpn = {
|
||||||
|
v4 = {
|
||||||
|
id = "100.64.0.0";
|
||||||
|
prefixLength = 10;
|
||||||
|
};
|
||||||
|
domain = "vpn.qo.is";
|
||||||
|
hosts = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
backplane = {
|
||||||
|
v4 = {
|
||||||
|
id = "10.250.0.0";
|
||||||
|
prefixLength = 24;
|
||||||
|
};
|
||||||
|
domain = "backplane.net.qo.is";
|
||||||
|
|
||||||
|
hosts = {
|
||||||
|
fulberg = {
|
||||||
|
v4.ip = "10.250.0.1";
|
||||||
|
endpoint = {
|
||||||
|
fqdn = physical-network.plessur-ext.hosts.calanda.fqdn;
|
||||||
|
port = 51821;
|
||||||
|
};
|
||||||
|
publicKey = "xcQOu+pp4ckNygcsLmJL1NmUzbbC+k3I7y+hJ9Ul4nk=";
|
||||||
|
persistentKeepalive = 25;
|
||||||
|
};
|
||||||
|
lindberg = {
|
||||||
|
v4.ip = "10.250.0.2";
|
||||||
|
#endpoint = { # TODO: Port forwarding
|
||||||
|
# fqdn = physical-network.riedbach-ext.hosts.lindberg.fqdn;
|
||||||
|
# port = 51821;
|
||||||
|
#};
|
||||||
|
publicKey = "uxxdpFXSTnfTvzSEzrUq4DuWSILJD5tNj6ks2jhWF10=";
|
||||||
|
persistentKeepalive = 25; # TODO: Remove when port forwarding enabled
|
||||||
|
};
|
||||||
|
lindberg-nextcloud = {
|
||||||
|
v4.ip = "10.250.0.3";
|
||||||
|
publicKey = "6XGL4QKB8AMpm/VGcTgWqk9RiSws7DmY5TpIDkXbwlg=";
|
||||||
|
persistentKeepalive = 25;
|
||||||
|
};
|
||||||
|
tierberg = {
|
||||||
|
v4.ip = "10.250.0.4";
|
||||||
|
publicKey = "51j1l+pT9W61wx4y2KyUb1seLdCHs3FUKAjmrHBFz1w=";
|
||||||
|
persistentKeepalive = 25;
|
||||||
|
};
|
||||||
|
stompert = {
|
||||||
|
v4.ip = "10.250.0.5";
|
||||||
|
publicKey = "CHTjQbmN9WhbRCxKgowxpMx4c5Zu0NDk0rRXEvuB3XA=";
|
||||||
|
persistentKeepalive = 25;
|
||||||
|
};
|
||||||
|
calanda = {
|
||||||
|
v4.ip = "10.250.0.6";
|
||||||
|
publicKey = "WMuMCzo8e/aNeGP7256mhK0Fe+x06Ws7a9hOZDPCr0M=";
|
||||||
|
endpoint = {
|
||||||
|
fqdn = physical-network.plessur-ext.hosts.calanda.fqdn;
|
||||||
|
port = 51823;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
lindberg-build = {
|
||||||
|
v4.ip = "10.250.0.7";
|
||||||
|
publicKey = "eWuvGpNVl601VDIgshOm287dlZa/5gF9lL4SjYEbIG8=";
|
||||||
|
persistentKeepalive = 25;
|
||||||
|
};
|
||||||
|
lindberg-webapps = {
|
||||||
|
v4.ip = "10.250.0.8";
|
||||||
|
publicKey = "LOA3Kumg8FV4DJxONwv+/8l/jOQLJ6SD2k/RegerR04=";
|
||||||
|
persistentKeepalive = 25;
|
||||||
|
};
|
||||||
|
cyprianspitz = {
|
||||||
|
v4.ip = "10.250.0.9";
|
||||||
|
endpoint = {
|
||||||
|
fqdn = physical-network.plessur-ext.hosts.calanda.fqdn;
|
||||||
|
port = 51824;
|
||||||
|
};
|
||||||
|
publicKey = "iLzHSgIwZz44AF7961mwEbK9AnSwcr+aKpd7XAAVTHo=";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
lindberg-vms-nat = {
|
||||||
|
v4 = {
|
||||||
|
id = "10.247.0.0";
|
||||||
|
prefixLength = 24;
|
||||||
|
};
|
||||||
|
domain = "lindberg-vms-nat.net.qo.is";
|
||||||
|
hosts = {
|
||||||
|
lindberg.v4.ip = "10.247.0.1";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
cyprianspitz-vms-nat = {
|
||||||
|
v4 = {
|
||||||
|
id = "10.247.0.0";
|
||||||
|
prefixLength = 24;
|
||||||
|
};
|
||||||
|
domain = "cyprianspitz-vms-nat.net.qo.is";
|
||||||
|
hosts = {
|
||||||
|
cyprianspitz.v4.ip = "10.248.0.1";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
83
defaults/meta/network.md
Normal file
83
defaults/meta/network.md
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
# Network
|
||||||
|
|
||||||
|
This document provides an overview over the qo.is network structure.
|
||||||
|
|
||||||
|
## Physical View
|
||||||
|
|
||||||
|
```plantuml
|
||||||
|
@startuml
|
||||||
|
skinparam style strictuml
|
||||||
|
left to right direction
|
||||||
|
|
||||||
|
package "plessur.net.qo.is" {
|
||||||
|
|
||||||
|
entity mediaconvchur [
|
||||||
|
Media
|
||||||
|
Converter
|
||||||
|
(Passive)
|
||||||
|
]
|
||||||
|
|
||||||
|
node calanda
|
||||||
|
node fulberg
|
||||||
|
|
||||||
|
cloud plessurnet [
|
||||||
|
<i>LAN Plessur
|
||||||
|
]
|
||||||
|
|
||||||
|
mediaconvchur - "enp4" calanda
|
||||||
|
calanda "br0 (enp2, wlp1, wlp5)" --- plessurnet
|
||||||
|
calanda "enp4" -- "eno1" fulberg
|
||||||
|
}
|
||||||
|
|
||||||
|
package "riedbach.net.qo.is" {
|
||||||
|
node riedbachrouter
|
||||||
|
|
||||||
|
node lindberg
|
||||||
|
|
||||||
|
riedbachrouter -- "enp5s0" lindberg
|
||||||
|
}
|
||||||
|
|
||||||
|
package "eem.net.qo.is" {
|
||||||
|
node eemrouter
|
||||||
|
|
||||||
|
node stompert
|
||||||
|
|
||||||
|
eemrouter -- "enp2s0" stompert
|
||||||
|
}
|
||||||
|
|
||||||
|
cloud internet[
|
||||||
|
<b>@
|
||||||
|
]
|
||||||
|
|
||||||
|
package "coredump.net.qo.is" {
|
||||||
|
node coredumprouter
|
||||||
|
|
||||||
|
node tierberg
|
||||||
|
|
||||||
|
coredumprouter -- "enpXs0" tierberg
|
||||||
|
}
|
||||||
|
|
||||||
|
internet .. mediaconvchur: INIT7 Fiber (1G/1G)
|
||||||
|
internet .. riedbachrouter: iway Fiber (1G/1G)
|
||||||
|
internet .. eemrouter: KPN NL Fiber
|
||||||
|
internet .. coredumprouter: Openfactory DSL
|
||||||
|
@enduml
|
||||||
|
```
|
||||||
|
|
||||||
|
## DNS
|
||||||
|
|
||||||
|
All Services are published under the *qo.is* domain name. Following services are available:
|
||||||
|
|
||||||
|
`qo.is` Primery Domain - Redirect to docs.qo.is and some .well-known ressources
|
||||||
|
|
||||||
|
{{#include ../backplane-net/README.md}}
|
||||||
|
|
||||||
|
## Contacts
|
||||||
|
|
||||||
|
|
||||||
|
### Init7
|
||||||
|
|
||||||
|
- [Status Netzwerkdienste](https://www.init7.net/status/)
|
||||||
|
- [NOC E-Mail](mailto:noc@init7.net)
|
||||||
|
- +41 44 315 44 00
|
||||||
|
- Init7 (Schweiz) AG, Technoparkstrasse 5, CH-8406 Winterthur
|
17
defaults/nextcloud/README.md
Normal file
17
defaults/nextcloud/README.md
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# Nextcloud
|
||||||
|
|
||||||
|
Running on [cloud.qo.is](https://cloud.qo.is), contact someone from the board for administrative tasks.
|
||||||
|
|
||||||
|
At this time, we do not enforce any size limits or alike.
|
||||||
|
|
||||||
|
We have some globally configured shared folders for our family members.
|
||||||
|
|
||||||
|
For user documentation, refer to the [upstream Nextcloud docs](https://docs.nextcloud.com/server/stable/user_manual/en/). Clients can be downloaded from [nextcloud.com/install](https://nextcloud.com/install/).
|
||||||
|
|
||||||
|
## Backup / Restore
|
||||||
|
|
||||||
|
1. Stop all related services: nextcloud, php-fpm, redis etc.
|
||||||
|
2. (mabe dump redis data?)
|
||||||
|
3. Import Database Backup
|
||||||
|
4. Restore `/var/lib/nextcloud`, which is currently a bind mount on `lindberg`'s `/mnt/data` volume
|
||||||
|
5. Resync nextcloud files and database, see [nextcloud docs](https://docs.nextcloud.com/server/latest/admin_manual/maintenance/restore.html)
|
81
defaults/nextcloud/default.nix
Normal file
81
defaults/nextcloud/default.nix
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
# Default configuration for hosts
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
sops.secrets."nextcloud/admin" = with config.users.users.nextcloud; {
|
||||||
|
inherit group;
|
||||||
|
owner = name;
|
||||||
|
};
|
||||||
|
|
||||||
|
qois.postgresql.enable = true;
|
||||||
|
qois.backup-client.includePaths = [ config.services.nextcloud.home ];
|
||||||
|
|
||||||
|
services.nextcloud = {
|
||||||
|
enable = true;
|
||||||
|
https = true;
|
||||||
|
webfinger = true;
|
||||||
|
maxUploadSize = "10G";
|
||||||
|
|
||||||
|
database.createLocally = true;
|
||||||
|
|
||||||
|
config = {
|
||||||
|
adminpassFile = config.sops.secrets."nextcloud/admin".path;
|
||||||
|
adminuser = "root";
|
||||||
|
dbtype = "pgsql";
|
||||||
|
};
|
||||||
|
|
||||||
|
phpOptions = {
|
||||||
|
"opcache.interned_strings_buffer" = "23";
|
||||||
|
};
|
||||||
|
|
||||||
|
poolSettings = {
|
||||||
|
"pm" = "dynamic";
|
||||||
|
"pm.max_children" = "256";
|
||||||
|
"pm.max_requests" = "500";
|
||||||
|
"pm.max_spare_servers" = "16";
|
||||||
|
"pm.min_spare_servers" = "2";
|
||||||
|
"pm.start_servers" = "8";
|
||||||
|
};
|
||||||
|
|
||||||
|
configureRedis = true;
|
||||||
|
caching.redis = true;
|
||||||
|
|
||||||
|
notify_push = {
|
||||||
|
enable = true;
|
||||||
|
bendDomainToLocalhost = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
log_type = "syslog";
|
||||||
|
syslog_tag = "nextcloud";
|
||||||
|
"memories.exiftool" = "${lib.getExe pkgs.exiftool}";
|
||||||
|
"memories.vod.ffmpeg" = "${lib.getExe pkgs.ffmpeg-headless}";
|
||||||
|
"memories.vod.ffprobe" = "${pkgs.ffmpeg-headless}/bin/ffprobe";
|
||||||
|
preview_ffmpeg_path = "${lib.getExe pkgs.ffmpeg-headless}";
|
||||||
|
mail_smtpmode = "sendmail";
|
||||||
|
mail_domain = "qo.is";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.phpfpm.pools.nextcloud.settings = {
|
||||||
|
"pm.max_children" = lib.mkForce "256";
|
||||||
|
"pm.max_spare_servers" = lib.mkForce "16";
|
||||||
|
"pm.start_servers" = lib.mkForce "8";
|
||||||
|
};
|
||||||
|
|
||||||
|
users.users.nextcloud.extraGroups = [ "postdrop" ];
|
||||||
|
|
||||||
|
systemd.services.nextcloud-cron = {
|
||||||
|
path = [ pkgs.perl ];
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
nodejs # required for Recognize
|
||||||
|
];
|
||||||
|
}
|
122
defaults/vpn/README.md
Normal file
122
defaults/vpn/README.md
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
# VPN
|
||||||
|
|
||||||
|
On [vpn.qo.is](https://vpn.qo.is) we run a [Tailscale](https://tailscale.com) compatible VPN service. To use the service, you can use a normal Tailscale client with following additional configuration:
|
||||||
|
|
||||||
|
| Option | Recommended value | Description |
|
||||||
|
|--------|-------------------|-------------|
|
||||||
|
| `accept-routes` | enabled (flag) | Accept direct routes to internal services |
|
||||||
|
| `exit-node` | `100.64.0.5` (lindberg) or `100.64.0.6` (cypriaspitz) | Use host as [exit node](#exit-nodes) |
|
||||||
|
| `login-server` | `https://vpn.qo.is` | Use our own VPN service and not tailscale's upstream one |
|
||||||
|
|
||||||
|
|
||||||
|
⚠️ Currently, if the client is in an IPv6 network, the transport is broken. See [#51](https://gitlab.com/qo.is/infrastructure/-/issues/51) for progress on this.
|
||||||
|
|
||||||
|
## Exit nodes
|
||||||
|
|
||||||
|
- `100.64.0.5`: lindberg (riedbach-net)
|
||||||
|
- `100.64.0.6`: cyprianspitz (plessur-net)
|
||||||
|
|
||||||
|
Currently, name resolution for these do not work reliably on first starts, hence the IP must be used. This hould be fixed in the future.
|
||||||
|
|
||||||
|
## User and Client Management
|
||||||
|
|
||||||
|
To register a new client, you can generate a pre-auth key and insert it in the client:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
headscale preauthkeys create --user marlene.mayer
|
||||||
|
```
|
||||||
|
|
||||||
|
Or alternatively use the register command shown when configuring the VPN client.
|
||||||
|
|
||||||
|
## ACL
|
||||||
|
|
||||||
|
At this time, there are a few ACL rules to isolate a users host but do not expect them to be expected to be enforced - expect your client to be accessible by the whole network.
|
||||||
|
|
||||||
|
## Exit Nodes
|
||||||
|
|
||||||
|
To add an exit node, create a preauth secret on the `vpn.qo.is` host:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
headscale preauthkeys create --user srv --reusable
|
||||||
|
```
|
||||||
|
|
||||||
|
and configure the host as follows:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
# TODO: This should not be a snipped but a module
|
||||||
|
|
||||||
|
{config, ...}: {
|
||||||
|
# Use this node as vpn exit node
|
||||||
|
services.tailscale = let meta = config.qois.meta; in {
|
||||||
|
enable = true;
|
||||||
|
openFirewall = true;
|
||||||
|
useRoutingFeatures = "server";
|
||||||
|
authKeyFile = "/secrets/wireguard/tailscale-key"; # The preauth secret. TODO: Should be in sops.
|
||||||
|
extraUpFlags = [
|
||||||
|
"--login-server=https://vpn.qo.is"
|
||||||
|
"--advertise-exit-node"
|
||||||
|
(
|
||||||
|
with meta.network.virtual.backplane.v4; "--advertise-routes=${id}/${builtins.toString prefixLength}"
|
||||||
|
)
|
||||||
|
"--advertise-tags=tag:srv"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
and register it in Headscale with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
headscale nodes register -u srv -k nodekey:xyzxyzxyzxyzxyzxyzxyzxyz
|
||||||
|
```
|
||||||
|
|
||||||
|
With using the `srv` user, exit nodes and routes get automatically accepted as trusted.
|
||||||
|
|
||||||
|
## Clients
|
||||||
|
|
||||||
|
### NixOS
|
||||||
|
|
||||||
|
Sample config:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{ config, pkgs, ... }: {
|
||||||
|
services.tailscale = {
|
||||||
|
enable = true;
|
||||||
|
openFirewall = true;
|
||||||
|
useRoutingFeatures = "client";
|
||||||
|
authKeyFile = "/secrets/wireguard/tailscale-key"; # This is the pre-auth secret. Make sure it's only accessible by root.
|
||||||
|
extraUpFlags = [
|
||||||
|
"--operator"
|
||||||
|
"yourUserNameChangePlease"
|
||||||
|
"--accept-routes"
|
||||||
|
"--exit-node=100.64.0.5"
|
||||||
|
"--login-server=https://vpn.qo.is"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Mobile App
|
||||||
|
|
||||||
|
> Android App: Tip 5 times on the tooltip dots to reveal server config option
|
||||||
|
|
||||||
|
See [this Headscale documentation for more](https://headscale.net/android-client/#configuring-the-headscale-url) on how to configure the mobile app. Note that on restarts, sometimes you have to reopen/save the config dialog. If the Tailscale login site is shown, just close the browser with the ❌.
|
||||||
|
|
||||||
|
|
||||||
|
## Backup and Restore
|
||||||
|
|
||||||
|
### Server
|
||||||
|
|
||||||
|
1. `systemctl stop headscale`
|
||||||
|
2. Replace `/var/lib/headscale`
|
||||||
|
3. `systemctl start headscale`
|
||||||
|
4. Monitor logs for errors
|
||||||
|
|
||||||
|
Note: `/var/lib/headscale` contains a sqlite database.
|
||||||
|
|
||||||
|
### Clients
|
||||||
|
|
||||||
|
1. `systemctl stop tailscaled`
|
||||||
|
2. Replace `/var/lib/tailscale`
|
||||||
|
3. `systemctl start tailscaled`
|
||||||
|
4. Monitor logs for errors
|
18
defaults/webserver/default.nix
Normal file
18
defaults/webserver/default.nix
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
services.nginx = {
|
||||||
|
recommendedTlsSettings = true;
|
||||||
|
recommendedOptimisation = true;
|
||||||
|
recommendedProxySettings = true;
|
||||||
|
recommendedGzipSettings = true;
|
||||||
|
recommendedBrotliSettings = true;
|
||||||
|
logError = "stderr warn";
|
||||||
|
proxyResolveWhileRunning = true;
|
||||||
|
};
|
||||||
|
}
|
29
deploy/README.md
Normal file
29
deploy/README.md
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
# Deployment
|
||||||
|
|
||||||
|
Note that you have to be connected to the `vpn.qo.is`
|
||||||
|
(or execute the deployment from a host that is in the `backplane.net.qo.is` overlay network)
|
||||||
|
and that you need to have SSH root access to the target machines.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### Deploy to all hosts
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix run .#deploy-qois
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
#### Deploy to selected target hosts
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix run .#deploy-qois .#<hostname> .#<hostname2>
|
||||||
|
|
||||||
|
# e.g.
|
||||||
|
nix run .#deploy-qois .#fulberg
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Deploy with extended timeouts (sometimes required for slow APU devices)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix run .#deploy-qois .#calanda -- --confirm-timeout 600 --activation-timeout 600
|
||||||
|
```
|
12
deploy/default.nix
Normal file
12
deploy/default.nix
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
deployPkgs,
|
||||||
|
pkgs,
|
||||||
|
self,
|
||||||
|
...
|
||||||
|
}@params:
|
||||||
|
with pkgs.lib;
|
||||||
|
pipe ./. [
|
||||||
|
self.lib.loadSubmodulesFrom
|
||||||
|
(map (f: (import f params)))
|
||||||
|
(foldl recursiveUpdate { })
|
||||||
|
]
|
17
deploy/docs-ops/default.nix
Normal file
17
deploy/docs-ops/default.nix
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
deployPkgs,
|
||||||
|
pkgs,
|
||||||
|
self,
|
||||||
|
system,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
domain = "docs-ops.qo.is";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
nodes.lindberg-webapps.profiles."${domain}" = {
|
||||||
|
sshUser = "nginx-${domain}";
|
||||||
|
path = deployPkgs.deploy-rs.lib.activate.noop self.packages.${system}.docs;
|
||||||
|
profilePath = "/var/lib/nginx-${domain}/root";
|
||||||
|
};
|
||||||
|
}
|
20
deploy/system/default.nix
Normal file
20
deploy/system/default.nix
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
deployPkgs,
|
||||||
|
pkgs,
|
||||||
|
self,
|
||||||
|
system,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
nodes = pkgs.lib.mapAttrs (host: config: {
|
||||||
|
hostname = "${host}.backplane.net.qo.is";
|
||||||
|
profiles.system = {
|
||||||
|
sshUser = "root";
|
||||||
|
user = "root";
|
||||||
|
activationTimeout = 420;
|
||||||
|
confirmTimeout = 120;
|
||||||
|
|
||||||
|
path = deployPkgs.deploy-rs.lib.activate.nixos config;
|
||||||
|
};
|
||||||
|
}) self.nixosConfigurations;
|
||||||
|
}
|
56
dev-shells/default.nix
Normal file
56
dev-shells/default.nix
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
system,
|
||||||
|
self,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
${system}.default = pkgs.mkShell {
|
||||||
|
name = "qois-infrastructure-shell";
|
||||||
|
buildInputs =
|
||||||
|
let
|
||||||
|
vscode-with-extensions = pkgs.vscode-with-extensions.override {
|
||||||
|
vscodeExtensions = with pkgs.vscode-extensions; [ jnoortheen.nix-ide ];
|
||||||
|
vscode = pkgs.vscodium;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
[ vscode-with-extensions ]
|
||||||
|
++ (with self.packages.${system}; [
|
||||||
|
cache
|
||||||
|
deploy-qois
|
||||||
|
sops
|
||||||
|
sops-rekey
|
||||||
|
])
|
||||||
|
++ (with pkgs; [
|
||||||
|
attic-client
|
||||||
|
deploy-rs
|
||||||
|
nixd
|
||||||
|
nixfmt-rfc-style
|
||||||
|
nixos-anywhere
|
||||||
|
ssh-to-age
|
||||||
|
pssh
|
||||||
|
yq
|
||||||
|
jq
|
||||||
|
]);
|
||||||
|
LANG = "C.UTF-8";
|
||||||
|
LC_ALL = "C.UTF-8";
|
||||||
|
shellHook = ''
|
||||||
|
# Bring xdg data dirs of dependencies and current program into the
|
||||||
|
# environment. This will allow us to get shell completion if any
|
||||||
|
# and there might be other benefits as well.
|
||||||
|
xdg_inputs=( "''${buildInputs[@]}" )
|
||||||
|
for p in "''${xdg_inputs[@]}"; do
|
||||||
|
if [[ -d "$p/share" ]]; then
|
||||||
|
XDG_DATA_DIRS="''${XDG_DATA_DIRS}''${XDG_DATA_DIRS+:}$p/share"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
export XDG_DATA_DIRS
|
||||||
|
|
||||||
|
# Make sure we support the pure case as well as non nixos cases
|
||||||
|
# where dynamic bash completions were not sourced.
|
||||||
|
#if ! type _completion_loader > /dev/null; then
|
||||||
|
# . ${pkgs.bash-completion}/etc/profile.d/bash_completion.sh
|
||||||
|
#fi
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
20
email.md
Normal file
20
email.md
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# E-mail
|
||||||
|
|
||||||
|
Currently, we don't host our own e-mail services, but we with a [cyon](https://www.cyon.ch) webhosting.
|
||||||
|
|
||||||
|
The login for the [cyon admin panel](https://my.cyon.ch/) may be found in pass.
|
||||||
|
|
||||||
|
E-Mail accounts should be created in a `first.lastname@qo.is` fashion.
|
||||||
|
|
||||||
|
Alias/forwarding Domains may be added on an best effort basis.
|
||||||
|
Bills for these domains should go directly to the respective owner (i.e. should be registered with own accounts).
|
||||||
|
|
||||||
|
|
||||||
|
## System E-mails
|
||||||
|
|
||||||
|
For groups, systems, services that require e-mail access, other accounts may be created.
|
||||||
|
|
||||||
|
- Engineering receives mails on `sysadmin@qo.is`
|
||||||
|
- Servers send from `system@qo.is`
|
||||||
|
- `no-reply@qo.is` is blackholed and may be used by services that don't handle replies.
|
||||||
|
- Services include e.g. `vault@qo.is` for vaultwarden.
|
309
flake.lock
Normal file
309
flake.lock
Normal file
|
@ -0,0 +1,309 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"attic": {
|
||||||
|
"inputs": {
|
||||||
|
"crane": "crane",
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
|
"flake-parts": "flake-parts",
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"nixpkgs-stable": "nixpkgs-stable"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1726069220,
|
||||||
|
"narHash": "sha256-dAUWlC8uMJX9iovycfvJcg5nm3PzqJIRAOwN4z322zM=",
|
||||||
|
"owner": "zhaofengli",
|
||||||
|
"repo": "attic",
|
||||||
|
"rev": "416687e59c4f0b32742423458cab2c5ff8fe748a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "zhaofengli",
|
||||||
|
"repo": "attic",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"crane": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"attic",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1722960479,
|
||||||
|
"narHash": "sha256-NhCkJJQhD5GUib8zN9JrmYGMwt4lCRp6ZVNzIiYCl0Y=",
|
||||||
|
"owner": "ipetkov",
|
||||||
|
"repo": "crane",
|
||||||
|
"rev": "4c6c77920b8d44cd6660c1621dea6b3fc4b4c4f4",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "ipetkov",
|
||||||
|
"repo": "crane",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"deploy-rs": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": "flake-compat_2",
|
||||||
|
"nixpkgs": "nixpkgs_2",
|
||||||
|
"utils": "utils"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1718194053,
|
||||||
|
"narHash": "sha256-FaGrf7qwZ99ehPJCAwgvNY5sLCqQ3GDiE/6uLhxxwSY=",
|
||||||
|
"owner": "serokell",
|
||||||
|
"repo": "deploy-rs",
|
||||||
|
"rev": "3867348fa92bc892eba5d9ddb2d7a97b9e127a8a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "serokell",
|
||||||
|
"repo": "deploy-rs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"disko": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs-nixos-stable"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1726396892,
|
||||||
|
"narHash": "sha256-KRGuT5nGRAOT3heigRWg41tbYpTpapGhsWc+XjnIx0w=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "disko",
|
||||||
|
"rev": "51e3a7e51279fedfb6669a00d21dc5936c78a6ce",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "disko",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696426674,
|
||||||
|
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat_2": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696426674,
|
||||||
|
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-parts": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs-lib": [
|
||||||
|
"attic",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1722555600,
|
||||||
|
"narHash": "sha256-XOQkdLafnb/p9ij77byFQjDf5m5QYl9b2REiVClC+x4=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"rev": "8471fe90ad337a8074e957b69ca4d0089218391d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1726042813,
|
||||||
|
"narHash": "sha256-LnNKCCxnwgF+575y0pxUdlGZBO/ru1CtGHIqQVfvjlA=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "159be5db480d1df880a0135ca0bfed84c2f88353",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-nixos-stable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1726320982,
|
||||||
|
"narHash": "sha256-RuVXUwcYwaUeks6h3OLrEmg14z9aFXdWppTWPMTwdQw=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "8f7492cce28977fbf8bd12c72af08b1f6c7c3e49",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-24.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-nixos-unstable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1726243404,
|
||||||
|
"narHash": "sha256-sjiGsMh+1cWXb53Tecsm4skyFNag33GPbVgCdfj3n9I=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "345c263f2f53a3710abe117f28a5cb86d0ba4059",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-stable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1724316499,
|
||||||
|
"narHash": "sha256-Qb9MhKBUTCfWg/wqqaxt89Xfi6qTD3XpTzQ9eXi3JmE=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "797f7dc49e0bc7fab4b57c021cdf68f595e47841",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-24.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1702272962,
|
||||||
|
"narHash": "sha256-D+zHwkwPc6oYQ4G3A1HuadopqRwUY/JkMwHz1YF7j4Q=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "e97b3e4186bcadf0ef1b6be22b8558eab1cdeb5d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"private": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs-nixos-unstable": [
|
||||||
|
"nixpkgs-nixos-unstable"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1727557927,
|
||||||
|
"narHash": "sha256-+dTv85ZXAatKiCu5VKTQkFE/RmWdlXwkuPvjOmfcPBI=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "9a646336c5ad419ec79ae81a47d68213bdcbff92",
|
||||||
|
"revCount": 5,
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:./private"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "file:./private"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"attic": "attic",
|
||||||
|
"deploy-rs": "deploy-rs",
|
||||||
|
"disko": "disko",
|
||||||
|
"nixpkgs-nixos-stable": "nixpkgs-nixos-stable",
|
||||||
|
"nixpkgs-nixos-unstable": "nixpkgs-nixos-unstable",
|
||||||
|
"private": "private",
|
||||||
|
"sops-nix": "sops-nix"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sops-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs-nixos-unstable"
|
||||||
|
],
|
||||||
|
"nixpkgs-stable": [
|
||||||
|
"nixpkgs-nixos-stable"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1726218807,
|
||||||
|
"narHash": "sha256-z7CoWbSOtsOz8TmRKDnobURkKfv6nPZCo3ayolNuQGc=",
|
||||||
|
"owner": "Mic92",
|
||||||
|
"repo": "sops-nix",
|
||||||
|
"rev": "f30b1bac192e2dc252107ac8a59a03ad25e1b96e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "Mic92",
|
||||||
|
"repo": "sops-nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1701680307,
|
||||||
|
"narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
63
flake.nix
Normal file
63
flake.nix
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
{
|
||||||
|
description = "qo.is infrastructure: Host and Network Configuration";
|
||||||
|
nixConfig = {
|
||||||
|
extra-substituters = "https://attic.qo.is/qois-infrastructure";
|
||||||
|
extra-trusted-public-keys = "qois-infrastructure:lh35ymN7Aoxm5Hz0S6JusxE+cYzMU+x9OMKjDVIpfuE=";
|
||||||
|
};
|
||||||
|
inputs = {
|
||||||
|
attic.url = "github:zhaofengli/attic";
|
||||||
|
deploy-rs.url = "github:serokell/deploy-rs";
|
||||||
|
disko = {
|
||||||
|
url = "github:nix-community/disko";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs-nixos-stable";
|
||||||
|
};
|
||||||
|
nixpkgs-nixos-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
nixpkgs-nixos-stable.url = "github:NixOS/nixpkgs/nixos-24.05";
|
||||||
|
sops-nix = {
|
||||||
|
url = "github:Mic92/sops-nix";
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.follows = "nixpkgs-nixos-unstable";
|
||||||
|
nixpkgs-stable.follows = "nixpkgs-nixos-stable";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
private.url = "git+file:./private";
|
||||||
|
private.inputs.nixpkgs-nixos-unstable.follows = "nixpkgs-nixos-unstable";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{ nixpkgs-nixos-unstable, deploy-rs, ... }@inputs:
|
||||||
|
let
|
||||||
|
system = "x86_64-linux";
|
||||||
|
# Packages for development and build process
|
||||||
|
pkgs = import nixpkgs-nixos-unstable { inherit system; };
|
||||||
|
deployPkgs = import nixpkgs-nixos-unstable {
|
||||||
|
inherit system;
|
||||||
|
overlays = [
|
||||||
|
deploy-rs.overlay
|
||||||
|
(self: super: {
|
||||||
|
deploy-rs = {
|
||||||
|
inherit (pkgs) deploy-rs;
|
||||||
|
lib = super.deploy-rs.lib;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
];
|
||||||
|
};
|
||||||
|
importParams = inputs // {
|
||||||
|
inherit pkgs;
|
||||||
|
inherit deployPkgs;
|
||||||
|
inherit system;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
checks = import ./checks/default.nix importParams;
|
||||||
|
deploy = import ./deploy/default.nix importParams;
|
||||||
|
devShells = import ./dev-shells/default.nix importParams;
|
||||||
|
formatter.${system} = pkgs.writeShellScriptBin "formatter" ''
|
||||||
|
${pkgs.findutils}/bin/find $1 -type f -name '*.nix' -exec ${pkgs.nixfmt-rfc-style}/bin/nixfmt ''${@:2} {} +
|
||||||
|
'';
|
||||||
|
nixosConfigurations = import ./nixos-configurations/default.nix importParams;
|
||||||
|
nixosModules = import ./nixos-modules/default.nix importParams;
|
||||||
|
packages = import ./packages/default.nix importParams;
|
||||||
|
lib = import ./lib/default.nix importParams;
|
||||||
|
};
|
||||||
|
}
|
18
lib/default.nix
Normal file
18
lib/default.nix
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{ pkgs, ... }:
|
||||||
|
let
|
||||||
|
lib = pkgs.lib;
|
||||||
|
foldersWithNix =
|
||||||
|
path:
|
||||||
|
let
|
||||||
|
folders = lib.attrNames (lib.filterAttrs (n: t: t == "directory") (builtins.readDir path));
|
||||||
|
isFolderWithDefaultNix = folder: lib.pathExists (lib.path.append path "./${folder}/default.nix");
|
||||||
|
in
|
||||||
|
lib.filter isFolderWithDefaultNix folders;
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
inherit foldersWithNix;
|
||||||
|
|
||||||
|
loadSubmodulesFrom =
|
||||||
|
path: map (folder: lib.path.append path "./${folder}/default.nix") (foldersWithNix path);
|
||||||
|
}
|
1
nixos-configurations/calanda/README.md
Normal file
1
nixos-configurations/calanda/README.md
Normal file
|
@ -0,0 +1 @@
|
||||||
|
# calanda
|
21
nixos-configurations/calanda/default.nix
Normal file
21
nixos-configurations/calanda/default.nix
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./networking.nix
|
||||||
|
./filesystems.nix
|
||||||
|
|
||||||
|
../../defaults/hardware/apu.nix
|
||||||
|
|
||||||
|
../../defaults/base
|
||||||
|
../../defaults/meta
|
||||||
|
];
|
||||||
|
|
||||||
|
# This value determines the NixOS release from which the default
|
||||||
|
# settings for stateful data, like fi:le locations and database versions
|
||||||
|
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||||
|
# this value at the release version of the first install of this system.
|
||||||
|
# Before changing this value read the documentation for this option
|
||||||
|
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||||
|
system.stateVersion = "23.05"; # Did you read the comment?
|
||||||
|
}
|
20
nixos-configurations/calanda/filesystems.nix
Normal file
20
nixos-configurations/calanda/filesystems.nix
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
|
||||||
|
fileSystems."/" = {
|
||||||
|
device = "/dev/disk/by-uuid/16efc5db-0697-4f39-b64b-fc18ac318625";
|
||||||
|
fsType = "btrfs";
|
||||||
|
options = [
|
||||||
|
"defaults"
|
||||||
|
"subvol=nixos"
|
||||||
|
"noatime"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [ { device = "/dev/disk/by-uuid/b5104a7c-4a4a-4048-a9f8-44ddb0082632"; } ];
|
||||||
|
|
||||||
|
boot.loader.grub = {
|
||||||
|
enable = true;
|
||||||
|
device = "/dev/sda";
|
||||||
|
};
|
||||||
|
}
|
118
nixos-configurations/calanda/networking.nix
Normal file
118
nixos-configurations/calanda/networking.nix
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
meta = config.qois.meta;
|
||||||
|
plessur-dmz-net = meta.network.physical.plessur-dmz;
|
||||||
|
plessur-lan-net = meta.network.physical.plessur-lan;
|
||||||
|
getCalandaIp4 = net: net.hosts.calanda.v4.ip;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [ ../../defaults/backplane-net ];
|
||||||
|
|
||||||
|
networking.hostName = meta.hosts.calanda.hostName;
|
||||||
|
networking.domain = "ilanz.fh2.ch";
|
||||||
|
networking.enableIPv6 = false; # TODO
|
||||||
|
|
||||||
|
networking.useDHCP = false;
|
||||||
|
networking.interfaces.enp4s0.useDHCP = true;
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
80
|
||||||
|
443
|
||||||
|
];
|
||||||
|
|
||||||
|
networking.interfaces.enp3s0 = {
|
||||||
|
ipv4.addresses = [
|
||||||
|
{
|
||||||
|
inherit (plessur-dmz-net.v4) prefixLength;
|
||||||
|
address = getCalandaIp4 plessur-dmz-net;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# TODO: Metaize ips
|
||||||
|
services.qois.router = {
|
||||||
|
enable = true;
|
||||||
|
wanInterface = "enp4s0";
|
||||||
|
wirelessInterfaces = [ "wlp5s0" ];
|
||||||
|
lanInterfaces = [ "enp2s0" ];
|
||||||
|
internalRouterIP = getCalandaIp4 plessur-lan-net;
|
||||||
|
dhcp = {
|
||||||
|
enable = true;
|
||||||
|
localDomain = "ilanz.fh2.ch"; # TODO: Legacy hostname
|
||||||
|
dhcpRange = "10.1.1.2,10.1.1.249";
|
||||||
|
};
|
||||||
|
recursiveDns = {
|
||||||
|
enable = true;
|
||||||
|
networkIdIp = plessur-lan-net.v4.id;
|
||||||
|
};
|
||||||
|
wireless = {
|
||||||
|
enable = true;
|
||||||
|
wleInterface24Ghz = "wlp5s0";
|
||||||
|
ssid = "hauser";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# DMZ
|
||||||
|
services.unbound.settings.server = {
|
||||||
|
interface = [ plessur-dmz-net.hosts.calanda.v4.ip ];
|
||||||
|
access-control = [
|
||||||
|
''"${plessur-dmz-net.v4.id}/${toString plessur-dmz-net.v4.prefixLength}" allow''
|
||||||
|
];
|
||||||
|
};
|
||||||
|
networking.firewall.interfaces.enp3s0.allowedUDPPorts = [ 53 ];
|
||||||
|
networking.nat.internalInterfaces = [ "enp3s0" ];
|
||||||
|
|
||||||
|
# DMZ Portforwarding
|
||||||
|
networking.nat.forwardPorts =
|
||||||
|
let
|
||||||
|
fulbergPort = (
|
||||||
|
proto: port: {
|
||||||
|
destination = "10.1.2.2:${toString port}";
|
||||||
|
proto = proto;
|
||||||
|
sourcePort = port;
|
||||||
|
loopbackIPs = [ "85.195.200.253" ];
|
||||||
|
}
|
||||||
|
);
|
||||||
|
cyprianspitzPort = (
|
||||||
|
proto: port: {
|
||||||
|
destination = "10.1.1.11:${toString port}";
|
||||||
|
proto = proto;
|
||||||
|
sourcePort = port;
|
||||||
|
loopbackIPs = [ "85.195.200.253" ];
|
||||||
|
}
|
||||||
|
);
|
||||||
|
in
|
||||||
|
[
|
||||||
|
{
|
||||||
|
destination = "10.1.2.2:22";
|
||||||
|
proto = "tcp";
|
||||||
|
sourcePort = 8022;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
destination = "10.1.2.2:2222";
|
||||||
|
proto = "tcp";
|
||||||
|
sourcePort = 8222;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
destination = "10.1.1.11:2222";
|
||||||
|
proto = "tcp";
|
||||||
|
sourcePort = 8223;
|
||||||
|
}
|
||||||
|
]
|
||||||
|
++ map (fulbergPort "udp") [
|
||||||
|
51820
|
||||||
|
51821
|
||||||
|
]
|
||||||
|
++ map (cyprianspitzPort "tcp") [
|
||||||
|
80
|
||||||
|
443
|
||||||
|
]
|
||||||
|
++ map (cyprianspitzPort "udp") [
|
||||||
|
51824
|
||||||
|
1666
|
||||||
|
41641
|
||||||
|
3478
|
||||||
|
3479
|
||||||
|
];
|
||||||
|
}
|
32
nixos-configurations/cyprianspitz/README.md
Normal file
32
nixos-configurations/cyprianspitz/README.md
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
# Host: Cyprianspitz
|
||||||
|
|
||||||
|
## Operations {#_operations}
|
||||||
|
|
||||||
|
Reboot requires passphrase.
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
# Get HDD Password:
|
||||||
|
sops decrypt --extract '["system"]["hdd"]' private/nixos-configurations/cyprianspitz/secrets.sops.yaml
|
||||||
|
|
||||||
|
ssh -p 8223 -J root@calanda.plessur-ext.net.qo.is
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hardware
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
- [Mainboard Manual](docs/z790m-itx-wifi.pdf)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Top Overview
|
||||||
|
|
||||||
|
![](docs/top-view.jpg)
|
||||||
|
|
||||||
|
### PCIE Side
|
||||||
|
|
||||||
|
![](docs/pcie-side.jpg)
|
||||||
|
|
||||||
|
### HDD Bay
|
||||||
|
|
||||||
|
Note that slot 5 (the leftmost) SATA bay is not connected due to the mainboard only having 4 SATA plugs.
|
12
nixos-configurations/cyprianspitz/applications/backup.nix
Normal file
12
nixos-configurations/cyprianspitz/applications/backup.nix
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{ pkgs, config, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
qois.backup-server = {
|
||||||
|
enable = true;
|
||||||
|
backupStorageRoot =
|
||||||
|
let
|
||||||
|
dataDrive = config.disko.devices.lvm_vg.vg_data.lvs.lv_data.content.mountpoint;
|
||||||
|
in
|
||||||
|
dataDrive + "/backup";
|
||||||
|
};
|
||||||
|
}
|
10
nixos-configurations/cyprianspitz/applications/default.nix
Normal file
10
nixos-configurations/cyprianspitz/applications/default.nix
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
./backup.nix
|
||||||
|
./vpn.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
qois.loadbalancer.enable = true;
|
||||||
|
}
|
4
nixos-configurations/cyprianspitz/applications/vpn.nix
Normal file
4
nixos-configurations/cyprianspitz/applications/vpn.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
qois.vpn-server.enable = true;
|
||||||
|
}
|
28
nixos-configurations/cyprianspitz/default.nix
Normal file
28
nixos-configurations/cyprianspitz/default.nix
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./applications
|
||||||
|
./disko-config.nix
|
||||||
|
./filesystems.nix
|
||||||
|
./networking.nix
|
||||||
|
./secrets.nix
|
||||||
|
./virtualisation.nix
|
||||||
|
|
||||||
|
../../defaults/hardware/asrock-z790m.nix
|
||||||
|
|
||||||
|
../../defaults/base
|
||||||
|
../../defaults/meta
|
||||||
|
];
|
||||||
|
|
||||||
|
# Set your time zone.
|
||||||
|
time.timeZone = "Europe/Amsterdam";
|
||||||
|
|
||||||
|
# This value determines the NixOS release from which the default
|
||||||
|
# settings for stateful data, like file locations and database versions
|
||||||
|
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||||
|
# this value at the release version of the first install of this system.
|
||||||
|
# Before changing this value read the documentation for this option
|
||||||
|
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||||
|
system.stateVersion = "24.05"; # Did you read the comment?
|
||||||
|
}
|
132
nixos-configurations/cyprianspitz/disko-config.nix
Normal file
132
nixos-configurations/cyprianspitz/disko-config.nix
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
disko.devices = {
|
||||||
|
disk = rec {
|
||||||
|
data-1 = {
|
||||||
|
type = "disk";
|
||||||
|
device = "/dev/disk/by-id/ata-ST16000NM000J-2TW103_ZRS110XA";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
raid_data = {
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "mdraid";
|
||||||
|
name = "raid_data";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
#data-2 = { # TODO
|
||||||
|
# type = "disk";
|
||||||
|
# device = "/dev/disk/by-id/ata-TODO";
|
||||||
|
# content = data-1.content;
|
||||||
|
#};
|
||||||
|
system-1 = {
|
||||||
|
type = "disk";
|
||||||
|
device = "/dev/disk/by-id/nvme-Lexar_SSD_NM790_1TB_NL8052R000144P2202";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
boot = {
|
||||||
|
size = "1G";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot-primary";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
raid_system = {
|
||||||
|
start = "5G";
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "mdraid";
|
||||||
|
name = "raid_system";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
system-2 = {
|
||||||
|
type = "disk";
|
||||||
|
device = "/dev/disk/by-id/nvme-Lexar_SSD_NM790_1TB_NL8052R002402P2202";
|
||||||
|
content = pkgs.lib.recursiveUpdate system-1.content {
|
||||||
|
partitions.boot.content.mountpoint = "/boot-secondary";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
mdadm = {
|
||||||
|
"raid_system" = {
|
||||||
|
type = "mdadm";
|
||||||
|
level = 1;
|
||||||
|
content = {
|
||||||
|
type = "luks";
|
||||||
|
name = "crypted_system";
|
||||||
|
passwordFile = "/run/secrets/system/hdd.key";
|
||||||
|
settings = {
|
||||||
|
allowDiscards = true;
|
||||||
|
bypassWorkqueues = true;
|
||||||
|
};
|
||||||
|
content = {
|
||||||
|
type = "lvm_pv";
|
||||||
|
vg = "vg_system";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"raid_data" = {
|
||||||
|
type = "mdadm";
|
||||||
|
level = 1;
|
||||||
|
content = {
|
||||||
|
type = "luks";
|
||||||
|
name = "crypted_data";
|
||||||
|
passwordFile = "/run/secrets/system/hdd.key";
|
||||||
|
settings.allowDiscards = true;
|
||||||
|
content = {
|
||||||
|
type = "lvm_pv";
|
||||||
|
vg = "vg_data";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
lvm_vg = {
|
||||||
|
vg_data = {
|
||||||
|
type = "lvm_vg";
|
||||||
|
lvs = {
|
||||||
|
lv_data = {
|
||||||
|
size = "14TB";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "btrfs";
|
||||||
|
mountpoint = "/mnt/data";
|
||||||
|
mountOptions = [
|
||||||
|
"defaults"
|
||||||
|
"noatime"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
vg_system = {
|
||||||
|
type = "lvm_vg";
|
||||||
|
lvs = {
|
||||||
|
hv_cyprianspitz = {
|
||||||
|
size = "100GiB";
|
||||||
|
content = {
|
||||||
|
type = "btrfs";
|
||||||
|
mountOptions = [
|
||||||
|
"defaults"
|
||||||
|
"noatime"
|
||||||
|
];
|
||||||
|
subvolumes = {
|
||||||
|
"/root".mountpoint = "/";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
BIN
nixos-configurations/cyprianspitz/docs/pcie-side.jpg
Normal file
BIN
nixos-configurations/cyprianspitz/docs/pcie-side.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 118 KiB |
BIN
nixos-configurations/cyprianspitz/docs/top-view.jpg
Normal file
BIN
nixos-configurations/cyprianspitz/docs/top-view.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 203 KiB |
BIN
nixos-configurations/cyprianspitz/docs/z790m-itx-wifi.pdf
Normal file
BIN
nixos-configurations/cyprianspitz/docs/z790m-itx-wifi.pdf
Normal file
Binary file not shown.
36
nixos-configurations/cyprianspitz/filesystems.nix
Normal file
36
nixos-configurations/cyprianspitz/filesystems.nix
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
|
||||||
|
# Configurations are set in disko-config.nix!
|
||||||
|
|
||||||
|
# mdadm.conf generated by `mdadm --detail --scan`
|
||||||
|
# TODO
|
||||||
|
boot.swraid.enable = true;
|
||||||
|
boot.swraid.mdadmConf = ''
|
||||||
|
MAILADDR root
|
||||||
|
'';
|
||||||
|
|
||||||
|
# TODO: RAID Monitoring
|
||||||
|
# TODO: Set spin-down time of physical disks
|
||||||
|
|
||||||
|
services.fwupd.daemonSettings.EspLocation = pkgs.lib.mkForce config.disko.devices.disk.system-1.content.partitions.boot.content.mountpoint;
|
||||||
|
|
||||||
|
# Use the systemd-boot EFI boot loader.
|
||||||
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
|
boot.loader.grub = {
|
||||||
|
enable = true;
|
||||||
|
efiSupport = true;
|
||||||
|
mirroredBoots = [
|
||||||
|
{
|
||||||
|
devices = [ "nodev" ];
|
||||||
|
path = "/boot-primary";
|
||||||
|
efiBootloaderId = "NixOS primary";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
devices = [ "nodev" ];
|
||||||
|
path = "/boot-secondary";
|
||||||
|
efiBootloaderId = "NixOS secondary";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
97
nixos-configurations/cyprianspitz/networking.nix
Normal file
97
nixos-configurations/cyprianspitz/networking.nix
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
meta = config.qois.meta;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
networking.hostName = meta.hosts.cyprianspitz.hostName;
|
||||||
|
|
||||||
|
imports = [ ../../defaults/backplane-net ];
|
||||||
|
|
||||||
|
networking.useDHCP = false;
|
||||||
|
networking.interfaces.enp0s31f6.useDHCP = true;
|
||||||
|
networking.interfaces.enp2s0.useDHCP = true;
|
||||||
|
|
||||||
|
# Virtualization
|
||||||
|
networking.interfaces.vms-nat.useDHCP = false;
|
||||||
|
networking.interfaces.vms-nat.ipv4.addresses = [
|
||||||
|
(
|
||||||
|
let
|
||||||
|
netConfig = meta.network.virtual.cyprianspitz-vms-nat;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
address = netConfig.hosts.cyprianspitz.v4.ip;
|
||||||
|
prefixLength = netConfig.v4.prefixLength;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
];
|
||||||
|
|
||||||
|
networking.bridges.vms-nat.interfaces = [ ];
|
||||||
|
networking.nat = {
|
||||||
|
enable = true;
|
||||||
|
internalInterfaces = [ "vms-nat" ];
|
||||||
|
internalIPs = with meta.network.virtual.cyprianspitz-vms-nat.v4; [
|
||||||
|
"${id}/${builtins.toString prefixLength}"
|
||||||
|
];
|
||||||
|
externalInterface = "enp0s31f6";
|
||||||
|
};
|
||||||
|
services.dnsmasq =
|
||||||
|
let
|
||||||
|
netConfig = meta.network.virtual.cyprianspitz-vms-nat;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
enable = true;
|
||||||
|
resolveLocalQueries = false;
|
||||||
|
settings = {
|
||||||
|
interface = "vms-nat";
|
||||||
|
bind-interfaces = true;
|
||||||
|
|
||||||
|
domain-needed = true;
|
||||||
|
|
||||||
|
domain = netConfig.domain;
|
||||||
|
dhcp-range = [ "10.248.0.2,10.248.0.253" ];
|
||||||
|
dhcp-option = [
|
||||||
|
"option:router,${netConfig.hosts.cyprianspitz.v4.ip}"
|
||||||
|
"option:domain-search,${netConfig.domain}"
|
||||||
|
];
|
||||||
|
dhcp-authoritative = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
systemd.services.dnsmasq.bindsTo = [ "network-addresses-vms-nat.service" ];
|
||||||
|
networking.firewall.interfaces.vms-nat = {
|
||||||
|
allowedUDPPorts = [
|
||||||
|
53
|
||||||
|
67
|
||||||
|
];
|
||||||
|
allowedTCPPorts = [ 53 ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Boot
|
||||||
|
boot.initrd.network.udhcpc.enable = true;
|
||||||
|
|
||||||
|
services.qois.luks-ssh = {
|
||||||
|
enable = true;
|
||||||
|
interface = "eth0";
|
||||||
|
sshPort = 2222;
|
||||||
|
sshHostKey = "/secrets/system/initrd-ssh-key";
|
||||||
|
# TODO Solve sops dependency porblem: config.sops.secrets."system/initrd-ssh-key".path;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Configure this node to be used as an vpn exit node
|
||||||
|
qois.backup-client.includePaths = [ "/var/lib/tailscale" ];
|
||||||
|
services.tailscale = {
|
||||||
|
enable = true;
|
||||||
|
openFirewall = true;
|
||||||
|
useRoutingFeatures = "server";
|
||||||
|
authKeyFile = config.sops.secrets."tailscale/key".path;
|
||||||
|
extraUpFlags = [
|
||||||
|
"--login-server=https://vpn.qo.is"
|
||||||
|
"--advertise-exit-node"
|
||||||
|
(
|
||||||
|
with meta.network.virtual.backplane.v4; "--advertise-routes=${id}/${builtins.toString prefixLength}"
|
||||||
|
)
|
||||||
|
"--advertise-tags=tag:srv"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
10
nixos-configurations/cyprianspitz/secrets.nix
Normal file
10
nixos-configurations/cyprianspitz/secrets.nix
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
sops.secrets = {
|
||||||
|
"system/hdd" = { };
|
||||||
|
"system/initrd-ssh-key" = { };
|
||||||
|
"tailscale/key" = {
|
||||||
|
restartUnits = [ "tailscaled.service" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
8
nixos-configurations/cyprianspitz/virtualisation.nix
Normal file
8
nixos-configurations/cyprianspitz/virtualisation.nix
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
virtualisation.libvirtd = {
|
||||||
|
enable = true;
|
||||||
|
onShutdown = "shutdown";
|
||||||
|
};
|
||||||
|
environment.systemPackages = [ pkgs.virtiofsd ];
|
||||||
|
}
|
41
nixos-configurations/default.nix
Normal file
41
nixos-configurations/default.nix
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
{
|
||||||
|
self,
|
||||||
|
pkgs,
|
||||||
|
nixpkgs-nixos-stable,
|
||||||
|
disko,
|
||||||
|
attic,
|
||||||
|
sops-nix,
|
||||||
|
...
|
||||||
|
}@inputs:
|
||||||
|
let
|
||||||
|
configs = self.lib.foldersWithNix ./.;
|
||||||
|
in
|
||||||
|
pkgs.lib.genAttrs configs (
|
||||||
|
config:
|
||||||
|
nixpkgs-nixos-stable.lib.nixosSystem {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
specialArgs = {
|
||||||
|
inherit inputs;
|
||||||
|
};
|
||||||
|
modules = [
|
||||||
|
self.nixosModules.default
|
||||||
|
./${config}/default.nix
|
||||||
|
(
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
imports = [ "${attic}/nixos/atticd.nix" ];
|
||||||
|
services.atticd.useFlakeCompatOverlay = false;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
disko.nixosModules.disko
|
||||||
|
sops-nix.nixosModules.sops
|
||||||
|
(
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
system.extraSystemBuilderCmds = "ln -s ${self} $out/nixos-configuration";
|
||||||
|
imports = [ ./secrets.nix ];
|
||||||
|
}
|
||||||
|
)
|
||||||
|
];
|
||||||
|
}
|
||||||
|
)
|
1
nixos-configurations/fulberg/README.md
Normal file
1
nixos-configurations/fulberg/README.md
Normal file
|
@ -0,0 +1 @@
|
||||||
|
# fulberg
|
1
nixos-configurations/fulberg/applications/default.nix
Normal file
1
nixos-configurations/fulberg/applications/default.nix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{ ... }: { }
|
35
nixos-configurations/fulberg/backup.nix
Normal file
35
nixos-configurations/fulberg/backup.nix
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
|
||||||
|
qois.backup-server = {
|
||||||
|
enable = true;
|
||||||
|
backupStorageRoot = "/mnt/nas/backup";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.borgbackup.repos =
|
||||||
|
let
|
||||||
|
backupRoot = "/mnt/nas/backup";
|
||||||
|
hostBackupRoot = "${backupRoot}/hosts";
|
||||||
|
dataBackupRoot = "${backupRoot}/data";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
"lindberg-nextcloud" = {
|
||||||
|
authorizedKeys = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIpzfp9VqclbPJ42ZrkRpvjMSTeyq0qce03zCRXqIHMw backup@lindberg-nextcloud"
|
||||||
|
];
|
||||||
|
path = "${hostBackupRoot}/lindberg-nextcloud";
|
||||||
|
};
|
||||||
|
"lindberg-data" = {
|
||||||
|
authorizedKeys = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGTmyoVONC12MgOodvzdPpZzLSVwpkC6zkf+Rg0W36gy backup-data@lindberg"
|
||||||
|
];
|
||||||
|
path = "${dataBackupRoot}/lindberg";
|
||||||
|
};
|
||||||
|
"lindberg-build-system" = {
|
||||||
|
authorizedKeys = [
|
||||||
|
"ssh-ed25519 AAAATODOTODOTODONTE5AAAAIGTmyoVONC12MgOodvzdPpZzLSVwpkC6zkf+Rg0W36gy backup-system@lindberg-build"
|
||||||
|
];
|
||||||
|
path = "${dataBackupRoot}/lindberg-build-system";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
22
nixos-configurations/fulberg/default.nix
Normal file
22
nixos-configurations/fulberg/default.nix
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
../../defaults/base
|
||||||
|
../../defaults/hardware/apu.nix
|
||||||
|
../../defaults/meta
|
||||||
|
./applications
|
||||||
|
./backup.nix
|
||||||
|
./filesystems.nix
|
||||||
|
./networking.nix
|
||||||
|
./secrets.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
# This value determines the NixOS release from which the default
|
||||||
|
# settings for stateful data, like fi:le locations and database versions
|
||||||
|
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||||
|
# this value at the release version of the first install of this system.
|
||||||
|
# Before changing this value read the documentation for this option
|
||||||
|
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||||
|
system.stateVersion = "23.05"; # Did you read the comment?
|
||||||
|
}
|
31
nixos-configurations/fulberg/filesystems.nix
Normal file
31
nixos-configurations/fulberg/filesystems.nix
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
|
||||||
|
fileSystems = {
|
||||||
|
"/" = {
|
||||||
|
device = "/dev/disk/by-uuid/360a6bc9-fc4e-4803-bd53-69320ac32ac5";
|
||||||
|
fsType = "btrfs";
|
||||||
|
options = [
|
||||||
|
"defaults"
|
||||||
|
"subvol=nixos"
|
||||||
|
"noatime"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
"/mnt/nas" = {
|
||||||
|
device = "10.1.1.39:/qois";
|
||||||
|
fsType = "nfs";
|
||||||
|
options = [
|
||||||
|
"defaults"
|
||||||
|
"noatime"
|
||||||
|
"soft"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [ { device = "/dev/disk/by-uuid/73f91e99-d856-4504-b6b2-d60f855d6d95"; } ];
|
||||||
|
|
||||||
|
boot.loader.grub = {
|
||||||
|
enable = true;
|
||||||
|
device = "/dev/sda";
|
||||||
|
};
|
||||||
|
}
|
48
nixos-configurations/fulberg/networking.nix
Normal file
48
nixos-configurations/fulberg/networking.nix
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
let
|
||||||
|
meta = config.qois.meta;
|
||||||
|
plessur-dmz-net = meta.network.physical.plessur-dmz;
|
||||||
|
getCalandaIp4 = net: net.hosts.calanda.v4.ip;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
networking.hostName = meta.hosts.fulberg.hostName;
|
||||||
|
|
||||||
|
imports = [ ../../defaults/backplane-net ];
|
||||||
|
|
||||||
|
# WWAN is currently not available due to a broken SIM-card.
|
||||||
|
#services.qois.wwan = {
|
||||||
|
# enable = true;
|
||||||
|
# apn = "gprs.swisscom.ch";
|
||||||
|
# networkInterface = "wwp0s19u1u3i12";
|
||||||
|
#};
|
||||||
|
|
||||||
|
networking.interfaces.enp1s0 = {
|
||||||
|
useDHCP = false;
|
||||||
|
ipv4.addresses = [
|
||||||
|
{
|
||||||
|
inherit (plessur-dmz-net.v4) prefixLength;
|
||||||
|
address = plessur-dmz-net.hosts.fulberg.v4.ip;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.defaultGateway = plessur-dmz-net.v4.gateway;
|
||||||
|
networking.nameservers = plessur-dmz-net.v4.nameservers;
|
||||||
|
|
||||||
|
# Configure this node to be used as an vpn exit node
|
||||||
|
qois.backup-client.includePaths = [ "/var/lib/tailscale" ];
|
||||||
|
services.tailscale = {
|
||||||
|
enable = true;
|
||||||
|
openFirewall = true;
|
||||||
|
useRoutingFeatures = "server";
|
||||||
|
authKeyFile = config.sops.secrets."tailscale/key".path;
|
||||||
|
extraUpFlags = [
|
||||||
|
"--login-server=https://vpn.qo.is"
|
||||||
|
"--advertise-exit-node"
|
||||||
|
(
|
||||||
|
with meta.network.virtual.backplane.v4; "--advertise-routes=${id}/${builtins.toString prefixLength}"
|
||||||
|
)
|
||||||
|
"--advertise-tags=tag:srv"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
8
nixos-configurations/fulberg/secrets.nix
Normal file
8
nixos-configurations/fulberg/secrets.nix
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
sops.secrets = {
|
||||||
|
"tailscale/key" = {
|
||||||
|
restartUnits = [ "tailscale.service" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
39
nixos-configurations/lindberg-build/applications/README.md
Normal file
39
nixos-configurations/lindberg-build/applications/README.md
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# Nix Caches
|
||||||
|
|
||||||
|
## Nixpkgs Cache
|
||||||
|
|
||||||
|
To put less load on the upstream nixpkgs CDN and speed up builds, we run a (public) nixpkgs cache on [nixpkgs-cache.qo.is](https://nixpkgs-cache.qo.is). To use it, configure nix like follows in your `nix.conf`:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
substituters = https://nixpkgs-cache.qo.is?priority=39
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that the [cache.nixos.org](https://cache.nixos.org) public key must also be trusted:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=
|
||||||
|
```
|
||||||
|
|
||||||
|
See the [nix documentation](https://nixos.org/manual/nix/stable/command-ref/conf-file.html#conf-substituters) for details about substitutors.
|
||||||
|
|
||||||
|
## Attic
|
||||||
|
|
||||||
|
We use [attic](https://docs.attic.rs/) as a self hosted nix build cache.
|
||||||
|
|
||||||
|
See [upstream documentation](https://docs.attic.rs/reference/attic-cli.html) for details on how to use it.
|
||||||
|
|
||||||
|
### Server Administration
|
||||||
|
|
||||||
|
Add users:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# For example, to generate a token for Alice with read-write access to any cache starting with `dev-` and read-only access to `prod`, expiring in 2 years:
|
||||||
|
|
||||||
|
atticadm make-token --sub "alice" --validity "2y" --pull "dev-*" --push "dev-*" --pull "prod"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Client Usage
|
||||||
|
|
||||||
|
`attic login qois https://attic.qo.is <TOKEN_HERE>`
|
||||||
|
|
||||||
|
`attic use qois:cachename`
|
77
nixos-configurations/lindberg-build/applications/attic.nix
Normal file
77
nixos-configurations/lindberg-build/applications/attic.nix
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
atticPort = 8080;
|
||||||
|
atticHostname = "attic.qo.is";
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
services.atticd = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
# Replace with absolute path to your credentials file
|
||||||
|
# generate secret with
|
||||||
|
# nix run system#openssl rand 64 | base64 -w0
|
||||||
|
# ATTIC_SERVER_TOKEN_HS256_SECRET_BASE64="output from openssl"
|
||||||
|
credentialsFile = config.sops.secrets."attic/server_token".path;
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
listen = "127.0.0.1:${builtins.toString atticPort}";
|
||||||
|
allowed-hosts = [ "attic.qo.is" ];
|
||||||
|
api-endpoint = "https://attic.qo.is/";
|
||||||
|
|
||||||
|
# Data chunking
|
||||||
|
#
|
||||||
|
# Warning: If you change any of the values here, it will be
|
||||||
|
# difficult to reuse existing chunks for newly-uploaded NARs
|
||||||
|
# since the cutpoints will be different. As a result, the
|
||||||
|
# deduplication ratio will suffer for a while after the change.
|
||||||
|
chunking = {
|
||||||
|
# The minimum NAR size to trigger chunking
|
||||||
|
#
|
||||||
|
# If 0, chunking is disabled entirely for newly-uploaded NARs.
|
||||||
|
# If 1, all NARs are chunked.
|
||||||
|
nar-size-threshold = 64 * 1024; # 64 KiB
|
||||||
|
|
||||||
|
# The preferred minimum size of a chunk, in bytes
|
||||||
|
min-size = 16 * 1024; # 16 KiB
|
||||||
|
|
||||||
|
# The preferred average size of a chunk, in bytes
|
||||||
|
avg-size = 64 * 1024; # 64 KiB
|
||||||
|
|
||||||
|
# The preferred maximum size of a chunk, in bytes
|
||||||
|
max-size = 256 * 1024; # 256 KiB
|
||||||
|
};
|
||||||
|
|
||||||
|
database.url = "postgresql:///atticd?host=/run/postgresql";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
imports = [ ../../../defaults/webserver ];
|
||||||
|
|
||||||
|
qois.postgresql.enable = true;
|
||||||
|
# Note: Attic cache availability is "best effort", so no artifacts are backed up.
|
||||||
|
|
||||||
|
services.postgresql = {
|
||||||
|
ensureDatabases = [ "atticd" ];
|
||||||
|
ensureUsers = [
|
||||||
|
{
|
||||||
|
name = "atticd";
|
||||||
|
ensureDBOwnership = true;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nginx = {
|
||||||
|
enable = true;
|
||||||
|
clientMaxBodySize = "1g";
|
||||||
|
virtualHosts.${atticHostname} = {
|
||||||
|
kTLS = true;
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
|
||||||
|
locations."/".proxyPass = "http://127.0.0.1:${builtins.toString atticPort}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
11
nixos-configurations/lindberg-build/applications/default.nix
Normal file
11
nixos-configurations/lindberg-build/applications/default.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
./gitlab-runner.nix
|
||||||
|
./attic.nix
|
||||||
|
./nixpkgs-cache.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
qois.git-ci-runner.enable = true;
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
|
||||||
|
services.gitlab-runner = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
gracefulTimeout = "20min";
|
||||||
|
|
||||||
|
clear-docker-cache = {
|
||||||
|
enable = true;
|
||||||
|
dates = "monthly";
|
||||||
|
};
|
||||||
|
|
||||||
|
services = {
|
||||||
|
default = {
|
||||||
|
runUntagged = true;
|
||||||
|
# File should contain at least these two variables:
|
||||||
|
# `CI_SERVER_URL`
|
||||||
|
# `REGISTRATION_TOKEN`
|
||||||
|
registrationConfigFile = config.sops.secrets."gitlab-runner/default-registration".path;
|
||||||
|
dockerImage = "debian:stable";
|
||||||
|
limit = 42; # The magic value
|
||||||
|
maximumTimeout = 7200; # 2h oughta be enough for everyone
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
qois.nixpkgs-cache = {
|
||||||
|
enable = true;
|
||||||
|
hostname = "nixpkgs-cache.qo.is";
|
||||||
|
dnsResolvers = [ config.qois.meta.network.virtual.lindberg-vms-nat.hosts.lindberg.v4.ip ];
|
||||||
|
};
|
||||||
|
}
|
43
nixos-configurations/lindberg-build/backup.nix
Normal file
43
nixos-configurations/lindberg-build/backup.nix
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
vnet = config.qois.meta.network.virtual.backplane.hosts;
|
||||||
|
systemTargets = [
|
||||||
|
"fulberg"
|
||||||
|
"tierberg"
|
||||||
|
];
|
||||||
|
systemJobs = builtins.listToAttrs (
|
||||||
|
map (backupHost: {
|
||||||
|
name = "system-${backupHost}";
|
||||||
|
value = {
|
||||||
|
repo = "borg@${vnet.${backupHost}.v4.ip}:.";
|
||||||
|
environment.BORG_RSH = "ssh -i /secrets/backup/system/ssh-key";
|
||||||
|
|
||||||
|
paths = [
|
||||||
|
"/etc"
|
||||||
|
"/home"
|
||||||
|
"/var"
|
||||||
|
"/secrets"
|
||||||
|
];
|
||||||
|
exclude = [
|
||||||
|
"/var/tmp"
|
||||||
|
"/var/cache"
|
||||||
|
"/var/lib/atticd"
|
||||||
|
"/var/cache/nginx/nixpkgs-cache"
|
||||||
|
];
|
||||||
|
|
||||||
|
doInit = false;
|
||||||
|
encryption = {
|
||||||
|
mode = "repokey";
|
||||||
|
passCommand = "cat /secrets/backup/system/password";
|
||||||
|
};
|
||||||
|
|
||||||
|
startAt = "07:06";
|
||||||
|
persistentTimer = true;
|
||||||
|
};
|
||||||
|
}) systemTargets
|
||||||
|
);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
services.borgbackup.jobs = systemJobs;
|
||||||
|
}
|
26
nixos-configurations/lindberg-build/default.nix
Normal file
26
nixos-configurations/lindberg-build/default.nix
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../../defaults/base-vm
|
||||||
|
../../defaults/meta
|
||||||
|
../../defaults/backplane-net
|
||||||
|
|
||||||
|
./applications
|
||||||
|
./backup.nix
|
||||||
|
./disko-config.nix
|
||||||
|
./networking.nix
|
||||||
|
./secrets.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
# Set your time zone.
|
||||||
|
time.timeZone = "Europe/Amsterdam";
|
||||||
|
|
||||||
|
# This value determines the NixOS release from which the default
|
||||||
|
# settings for stateful data, like file locations and database versions
|
||||||
|
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||||
|
# this value at the release version of the first install of this system.
|
||||||
|
# Before changing this value read the documentation for this option
|
||||||
|
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||||
|
system.stateVersion = "23.11"; # Did you read the comment?
|
||||||
|
}
|
64
nixos-configurations/lindberg-build/disko-config.nix
Normal file
64
nixos-configurations/lindberg-build/disko-config.nix
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
disko.devices.disk = {
|
||||||
|
system = {
|
||||||
|
type = "disk";
|
||||||
|
device = "/dev/vda";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
boot = {
|
||||||
|
# for grub MBR
|
||||||
|
size = "1M";
|
||||||
|
type = "EF02";
|
||||||
|
};
|
||||||
|
system = {
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "btrfs";
|
||||||
|
subvolumes = {
|
||||||
|
"/nix" = {
|
||||||
|
mountpoint = "/nix";
|
||||||
|
mountOptions = [
|
||||||
|
"compress=zstd"
|
||||||
|
"noatime"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
"/root" = {
|
||||||
|
mountpoint = "/";
|
||||||
|
mountOptions = [ "noatime" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
nixpkgs_cache = {
|
||||||
|
type = "disk";
|
||||||
|
device = "/dev/vdb";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions.nixpkgs_cache = {
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "ext4";
|
||||||
|
mountpoint = "/var/cache/nginx/nixpkgs-cache";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
swap = {
|
||||||
|
type = "disk";
|
||||||
|
device = "/dev/vdc";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions.swap = {
|
||||||
|
size = "100%";
|
||||||
|
content.type = "swap";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
13
nixos-configurations/lindberg-build/networking.nix
Normal file
13
nixos-configurations/lindberg-build/networking.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
networking.hostName = config.qois.meta.hosts.lindberg-build.hostName;
|
||||||
|
networking.useDHCP = false;
|
||||||
|
networking.interfaces.enp11s0.useDHCP = true;
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
80
|
||||||
|
443
|
||||||
|
];
|
||||||
|
}
|
11
nixos-configurations/lindberg-build/secrets.nix
Normal file
11
nixos-configurations/lindberg-build/secrets.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
sops.secrets = {
|
||||||
|
"attic/server_token" = {
|
||||||
|
restartUnits = [ "atticd.service" ];
|
||||||
|
};
|
||||||
|
"gitlab-runner/default-registration" = {
|
||||||
|
restartUnits = [ "gitlab-runner.service" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
let
|
||||||
|
host = "cloud.qo.is";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
imports = [ ../../../defaults/nextcloud ];
|
||||||
|
|
||||||
|
qois.postgresql.enable = true;
|
||||||
|
|
||||||
|
services.nextcloud = {
|
||||||
|
hostName = host;
|
||||||
|
package = pkgs.nextcloud29;
|
||||||
|
settings.default_phone_region = "CH";
|
||||||
|
};
|
||||||
|
services.nginx.virtualHosts."${host}" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
kTLS = true;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
|
||||||
|
imports = [ ./cloud.nix ];
|
||||||
|
}
|
8
nixos-configurations/lindberg-nextcloud/backup.nix
Normal file
8
nixos-configurations/lindberg-nextcloud/backup.nix
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
qois.backup-client.excludePaths = [
|
||||||
|
"/var/lib/nextcloud/data" # Data is backed up on lindberg
|
||||||
|
];
|
||||||
|
}
|
50
nixos-configurations/lindberg-nextcloud/default.nix
Normal file
50
nixos-configurations/lindberg-nextcloud/default.nix
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../../defaults/backplane-net
|
||||||
|
../../defaults/base-vm
|
||||||
|
../../defaults/meta
|
||||||
|
../../defaults/webserver
|
||||||
|
./applications
|
||||||
|
./backup.nix
|
||||||
|
./secrets.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.loader.grub.device = "/dev/vda";
|
||||||
|
fileSystems."/" = {
|
||||||
|
device = "/dev/disk/by-uuid/5b6823ec-921f-400a-a7c0-3fe34d56ae12";
|
||||||
|
fsType = "btrfs";
|
||||||
|
options = [ "subvol=root" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.mounts = [
|
||||||
|
{
|
||||||
|
what = "data/nextcloud";
|
||||||
|
where = "/var/lib/nextcloud";
|
||||||
|
type = "virtiofs";
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
enable = true;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
networking.hostName = config.qois.meta.hosts.lindberg-nextcloud.hostName;
|
||||||
|
networking.useDHCP = false;
|
||||||
|
networking.interfaces.enp2s0.useDHCP = true;
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
80
|
||||||
|
443
|
||||||
|
];
|
||||||
|
|
||||||
|
# Set your time zone.
|
||||||
|
time.timeZone = "Europe/Amsterdam";
|
||||||
|
|
||||||
|
# This value determines the NixOS release from which the default
|
||||||
|
# settings for stateful data, like file locations and database versions
|
||||||
|
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||||
|
# this value at the release version of the first install of this system.
|
||||||
|
# Before changing this value read the documentation for this option
|
||||||
|
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||||
|
system.stateVersion = "22.05"; # Did you read the comment?
|
||||||
|
}
|
17
nixos-configurations/lindberg-nextcloud/secrets.nix
Normal file
17
nixos-configurations/lindberg-nextcloud/secrets.nix
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{ ... }:
|
||||||
|
let
|
||||||
|
backupConfiguration = {
|
||||||
|
restartUnits = [
|
||||||
|
"borgbackup-job-system-fulberg.service"
|
||||||
|
"borgbackup-job-system-tierberg.service"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
sops.secrets = {
|
||||||
|
"backup/system/password" = backupConfiguration;
|
||||||
|
"backup/system/ssh-key" = backupConfiguration;
|
||||||
|
"nextcloud/admin" = { };
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
# Web Apps
|
||||||
|
|
||||||
|
## fabianhauser.ch
|
|
@ -0,0 +1,9 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
|
||||||
|
imports = [ ];
|
||||||
|
|
||||||
|
qois.vault.enable = true;
|
||||||
|
qois.git.enable = true;
|
||||||
|
qois.static-page.enable = true;
|
||||||
|
}
|
25
nixos-configurations/lindberg-webapps/default.nix
Normal file
25
nixos-configurations/lindberg-webapps/default.nix
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
../../defaults/base-vm
|
||||||
|
../../defaults/meta
|
||||||
|
../../defaults/backplane-net
|
||||||
|
|
||||||
|
./applications
|
||||||
|
./disko-config.nix
|
||||||
|
./networking.nix
|
||||||
|
./secrets.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
# Set your time zone.
|
||||||
|
time.timeZone = "Europe/Amsterdam";
|
||||||
|
|
||||||
|
# This value determines the NixOS release from which the default
|
||||||
|
# settings for stateful data, like file locations and database versions
|
||||||
|
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||||
|
# this value at the release version of the first install of this system.
|
||||||
|
# Before changing this value read the documentation for this option
|
||||||
|
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||||
|
system.stateVersion = "23.11"; # Did you read the comment?
|
||||||
|
}
|
38
nixos-configurations/lindberg-webapps/disko-config.nix
Normal file
38
nixos-configurations/lindberg-webapps/disko-config.nix
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
disko.devices.disk = {
|
||||||
|
system = {
|
||||||
|
type = "disk";
|
||||||
|
device = "/dev/vda";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
boot = {
|
||||||
|
# for grub MBR
|
||||||
|
size = "1M";
|
||||||
|
type = "EF02";
|
||||||
|
};
|
||||||
|
system = {
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "btrfs";
|
||||||
|
subvolumes = {
|
||||||
|
"/nix" = {
|
||||||
|
mountpoint = "/nix";
|
||||||
|
mountOptions = [
|
||||||
|
"compress=zstd"
|
||||||
|
"noatime"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
"/root" = {
|
||||||
|
mountpoint = "/";
|
||||||
|
mountOptions = [ "noatime" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
13
nixos-configurations/lindberg-webapps/networking.nix
Normal file
13
nixos-configurations/lindberg-webapps/networking.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
networking.hostName = config.qois.meta.hosts.lindberg-webapps.hostName;
|
||||||
|
networking.useDHCP = false;
|
||||||
|
networking.interfaces.enp1s0.useDHCP = true;
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
80
|
||||||
|
443
|
||||||
|
];
|
||||||
|
}
|
4
nixos-configurations/lindberg-webapps/secrets.nix
Normal file
4
nixos-configurations/lindberg-webapps/secrets.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
sops.secrets = { };
|
||||||
|
}
|
61
nixos-configurations/lindberg/README.md
Normal file
61
nixos-configurations/lindberg/README.md
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
# Host: Lindberg
|
||||||
|
|
||||||
|
## Operations {#_operations}
|
||||||
|
|
||||||
|
Reboot requires passphrase (see pass `host/lindberg/hdd_luks`)
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
ssh -p 2222 root@lindberg.riedbach-ext.net.qo.is
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hardware
|
||||||
|
|
||||||
|
- [Mainboard Manual](docs/X570Pro4-mainboard-manual.pdf)
|
||||||
|
|
||||||
|
|
||||||
|
### Front / Back
|
||||||
|
|
||||||
|
#### Front Overview
|
||||||
|
|
||||||
|
![](docs/front_full.jpg)
|
||||||
|
|
||||||
|
#### Front PCIE
|
||||||
|
|
||||||
|
![](docs/front_pcie_overview.jpg)
|
||||||
|
![](docs/front_pcie_ssd.jpg)
|
||||||
|
|
||||||
|
#### Front Cables
|
||||||
|
|
||||||
|
![](docs/front_cables.jpg)
|
||||||
|
|
||||||
|
#### Back
|
||||||
|
|
||||||
|
![](docs/back_overview.jpg)
|
||||||
|
|
||||||
|
### HDDs
|
||||||
|
|
||||||
|
![](docs/back_hdds.jpg)
|
||||||
|
|
||||||
|
#### HDD (0)
|
||||||
|
|
||||||
|
![](docs/hdd_0.jpg)
|
||||||
|
|
||||||
|
#### HDD (1)
|
||||||
|
|
||||||
|
![](docs/hdd_1.jpg)
|
||||||
|
|
||||||
|
#### HDD (3)
|
||||||
|
|
||||||
|
![](docs/hdd_3.jpg)
|
||||||
|
|
||||||
|
#### zvtaa02h
|
||||||
|
|
||||||
|
![](docs/hdd_zvtaa02h.jpg)
|
||||||
|
|
||||||
|
#### zvtaeypl
|
||||||
|
|
||||||
|
![](docs/hdd_zvtaeypl.jpg)
|
||||||
|
|
||||||
|
### SSD left
|
||||||
|
|
||||||
|
![](docs/ssd_1_left.jpg)
|
5
nixos-configurations/lindberg/applications/default.nix
Normal file
5
nixos-configurations/lindberg/applications/default.nix
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
|
||||||
|
imports = [ ./loadbalancer.nix ];
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue