mirror of
https://git.pvv.ntnu.no/Drift/pvv-nixos-config.git
synced 2025-12-30 04:08:24 +01:00
Compare commits
5 Commits
gitea-robo
...
1c2a949102
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c2a949102 | ||
|
|
0ade509686 | ||
|
|
761385fe8b | ||
|
|
aa165f8348 | ||
|
|
8aed47aea9 |
@@ -4,10 +4,10 @@ on:
|
|||||||
push:
|
push:
|
||||||
jobs:
|
jobs:
|
||||||
evals:
|
evals:
|
||||||
runs-on: debian-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v3
|
||||||
- run: apt-get update && apt-get -y install sudo
|
- run: apt-get update && apt-get -y install sudo
|
||||||
- uses: https://github.com/cachix/install-nix-action@v31
|
- uses: https://github.com/cachix/install-nix-action@v23
|
||||||
- run: echo -e "show-trace = true\nmax-jobs = auto\ntrusted-users = root\nexperimental-features = nix-command flakes\nbuild-users-group =" > /etc/nix/nix.conf
|
- run: echo -e "show-trace = true\nmax-jobs = auto\ntrusted-users = root\nexperimental-features = nix-command flakes\nbuild-users-group =" > /etc/nix/nix.conf
|
||||||
- run: nix flake check
|
- run: nix flake check
|
||||||
|
|||||||
25
.mailmap
25
.mailmap
@@ -1,25 +0,0 @@
|
|||||||
Daniel Løvbrøtte Olsen <danio@pvv.ntnu.no> <daniel.olsen99@gmail.com>
|
|
||||||
Daniel Løvbrøtte Olsen <danio@pvv.ntnu.no> Daniel <danio@pvv.ntnu.no>
|
|
||||||
Daniel Løvbrøtte Olsen <danio@pvv.ntnu.no> Daniel Lovbrotte Olsen <danio@pvv.ntnu.no>
|
|
||||||
Daniel Løvbrøtte Olsen <danio@pvv.ntnu.no> Daniel Olsen <danio@pvv.ntnu.no>
|
|
||||||
Daniel Løvbrøtte Olsen <danio@pvv.ntnu.no> danio <danio@pvv.ntnu.no>
|
|
||||||
Daniel Løvbrøtte Olsen <danio@pvv.ntnu.no> Daniel Olsen <danio@bicep.pvv.ntnu.no>
|
|
||||||
|
|
||||||
|
|
||||||
Øystein Kristoffer Tveit <oysteikt@pvv.ntnu.no> h7x4 <h7x4@nani.wtf>
|
|
||||||
Øystein Kristoffer Tveit <oysteikt@pvv.ntnu.no> Øystein Tveit <oysteikt@pvv.ntnu.no>
|
|
||||||
Øystein Kristoffer Tveit <oysteikt@pvv.ntnu.no> oysteikt <oysteikt@pvv.ntnu.no>
|
|
||||||
Øystein Kristoffer Tveit <oysteikt@pvv.ntnu.no> Øystein <oysteikt@pvv.org>
|
|
||||||
Øystein Kristoffer Tveit <oysteikt@pvv.ntnu.no> Oystein Kristoffer Tveit <oysteikt@pvv.ntnu.no>
|
|
||||||
|
|
||||||
Felix Albrigtsen <felixalb@pvv.ntnu.no> <felix@albrigtsen.it>
|
|
||||||
Felix Albrigtsen <felixalb@pvv.ntnu.no> <felixalbrigtsen@gmail.com>
|
|
||||||
Felix Albrigtsen <felixalb@pvv.ntnu.no> felixalb <felixalb@pvv.ntnu.no>
|
|
||||||
|
|
||||||
Peder Bergebakken Sundt <pederbs@pvv.ntnu.no> <pbsds@hotmail.com>
|
|
||||||
|
|
||||||
Adrian Gunnar Lauterer <adriangl@pvv.ntnu.no> Adrian G L <adrian@lauterer.it>
|
|
||||||
Adrian Gunnar Lauterer <adriangl@pvv.ntnu.no> Adrian Gunnar Lauterer <adrian@lauterer.it>
|
|
||||||
|
|
||||||
Fredrik Robertsen <frero@pvv.ntnu.no> frero <frero@pvv.ntnu.no>
|
|
||||||
Fredrik Robertsen <frero@pvv.ntnu.no> fredrikr79 <fredrikrobertsen7@gmail.com>
|
|
||||||
71
.sops.yaml
71
.sops.yaml
@@ -1,31 +1,26 @@
|
|||||||
keys:
|
keys:
|
||||||
# Users
|
# Users
|
||||||
- &user_danio age1ug30gg4y7ftuya0wdv7q0vh4egn00wlv2th7mt7cgc2ze46wmvyq9lq6ge
|
- &user_danio age17tagmpwqjk3mdy45rfesrfey6h863x8wfq38wh33tkrlrywxducs0k6tpq
|
||||||
- &user_eirikwit age1ju7rd26llahz3g8tz7cy5ld52swj8gsmg0flrmrxngc0nj0avq3ssh0sn5
|
|
||||||
- &user_felixalb age1mrnldl334l2nszuta6ywvewng0fswv2dz9l5g4qcwe3nj4yxf92qjskdx6
|
- &user_felixalb age1mrnldl334l2nszuta6ywvewng0fswv2dz9l5g4qcwe3nj4yxf92qjskdx6
|
||||||
- &user_oysteikt F7D37890228A907440E1FD4846B9228E814A2AAC
|
- &user_oysteikt F7D37890228A907440E1FD4846B9228E814A2AAC
|
||||||
- &user_pederbs_bjarte age1zhxul786an743u0fascv4wtc5xduu7qfy803lfs539yzhgmlq5ds2lznt5
|
- &user_eirikwit age1ju7rd26llahz3g8tz7cy5ld52swj8gsmg0flrmrxngc0nj0avq3ssh0sn5
|
||||||
- &user_pederbs_nord age1wrssr4z4g6vl3fd3qme5cewchmmhm0j2xe6wf2meu4r6ycn37anse98mfs
|
|
||||||
- &user_pederbs_sopp age1hmpdk4h69wxpwqk9tkud39f66hprhehxtzhgw97r6dvr7v0mx5jscsuhkn
|
- &user_pederbs_sopp age1hmpdk4h69wxpwqk9tkud39f66hprhehxtzhgw97r6dvr7v0mx5jscsuhkn
|
||||||
|
- &user_pederbs_nord age1wrssr4z4g6vl3fd3qme5cewchmmhm0j2xe6wf2meu4r6ycn37anse98mfs
|
||||||
|
- &user_pederbs_bjarte age1zhxul786an743u0fascv4wtc5xduu7qfy803lfs539yzhgmlq5ds2lznt5
|
||||||
|
|
||||||
# Hosts
|
# Hosts
|
||||||
- &host_bakke age1syted6kt48sumjjucggh6r3uca4x2ppp4mfungf3lamkt2le05csc99633
|
- &host_jokum age1gp8ye4g2mmw3may5xg0zsy7mm04glfz3788mmdx9cvcsdxs9hg0s0cc9kt
|
||||||
- &host_bekkalokk age12nj59tguy9wg882updc2vjdusx5srnxmjyfaqve4zx6jnnsaw3qsyjq6zd
|
|
||||||
- &host_bicep age19nk55kcs7s0358jpkn75xnr57dfq6fq3p43nartvsprx0su22v7qcgcjdx
|
|
||||||
- &host_ildkule age1x28hmzvuv6f2n66c0jtqcca3h9rput8d7j5uek6jcpx8n9egd52sqpejq0
|
- &host_ildkule age1x28hmzvuv6f2n66c0jtqcca3h9rput8d7j5uek6jcpx8n9egd52sqpejq0
|
||||||
- &host_kommode age1mt4d0hg5g76qp7j0884llemy0k2ymr5up8vfudz6vzvsflk5nptqqd32ly
|
- &host_bekkalokk age12nj59tguy9wg882updc2vjdusx5srnxmjyfaqve4zx6jnnsaw3qsyjq6zd
|
||||||
- &host_lupine-1 age1fkrypl6fu4ldsa7te4g3v4qsegnk7sd6qhkquuwzh04vguy96qus08902e
|
- &host_bicep age1sl43gc9cw939z5tgha2lpwf0xxxgcnlw7w4xem4sqgmt2pt264vq0dmwx2
|
||||||
- &host_lupine-2 age1mu0ej57n4s30ghealhyju3enls83qyjua69986la35t2yh0q2s0seruz5n
|
- &host_kvernberg age19rlntxt0m27waa0n288g9wgpksa6ndlzz8eneeqya7w3zd7may0sqzhcvz
|
||||||
- &host_lupine-3 age1j2u876z8hu87q5npfxzzpfgllyw8ypj66d7cgelmzmnrf3xud34qzkntp9
|
|
||||||
- &host_lupine-4 age1t8zlawqkmhye737pn8yx0z3p9cl947d9ktv2cajdc6hnvn52d3fsc59s2k
|
|
||||||
- &host_lupine-5 age199zkqq4jp4yc3d0hx2q0ksxdtp42xhmjsqwyngh8tswuck34ke3smrfyqu
|
|
||||||
- &host_ustetind age1hffjafs4slznksefmtqrlj7rdaqgzqncn4un938rhr053237ry8s3rs0v8
|
|
||||||
|
|
||||||
creation_rules:
|
creation_rules:
|
||||||
# Global secrets
|
# Global secrets
|
||||||
- path_regex: secrets/[^/]+\.yaml$
|
- path_regex: secrets/[^/]+\.yaml$
|
||||||
key_groups:
|
key_groups:
|
||||||
- age:
|
- age:
|
||||||
|
- *host_jokum
|
||||||
- *user_danio
|
- *user_danio
|
||||||
- *user_felixalb
|
- *user_felixalb
|
||||||
- *user_eirikwit
|
- *user_eirikwit
|
||||||
@@ -49,10 +44,10 @@ creation_rules:
|
|||||||
pgp:
|
pgp:
|
||||||
- *user_oysteikt
|
- *user_oysteikt
|
||||||
|
|
||||||
- path_regex: secrets/kommode/[^/]+\.yaml$
|
- path_regex: secrets/jokum/[^/]+\.yaml$
|
||||||
key_groups:
|
key_groups:
|
||||||
- age:
|
- age:
|
||||||
- *host_kommode
|
- *host_jokum
|
||||||
- *user_danio
|
- *user_danio
|
||||||
- *user_felixalb
|
- *user_felixalb
|
||||||
- *user_pederbs_sopp
|
- *user_pederbs_sopp
|
||||||
@@ -84,43 +79,9 @@ creation_rules:
|
|||||||
- *user_pederbs_bjarte
|
- *user_pederbs_bjarte
|
||||||
pgp:
|
pgp:
|
||||||
- *user_oysteikt
|
- *user_oysteikt
|
||||||
|
|
||||||
- path_regex: secrets/ustetind/[^/]+\.yaml$
|
- path_regex: secrets/kvernberg/[^/]+$
|
||||||
key_groups:
|
key_groups:
|
||||||
- age:
|
- age:
|
||||||
- *host_ustetind
|
- *host_kvernberg
|
||||||
- *user_danio
|
- *user_danio
|
||||||
- *user_felixalb
|
|
||||||
- *user_pederbs_sopp
|
|
||||||
- *user_pederbs_nord
|
|
||||||
- *user_pederbs_bjarte
|
|
||||||
pgp:
|
|
||||||
- *user_oysteikt
|
|
||||||
|
|
||||||
- path_regex: secrets/lupine/[^/]+\.yaml$
|
|
||||||
key_groups:
|
|
||||||
- age:
|
|
||||||
- *host_lupine-1
|
|
||||||
- *host_lupine-2
|
|
||||||
- *host_lupine-3
|
|
||||||
- *host_lupine-4
|
|
||||||
- *host_lupine-5
|
|
||||||
- *user_danio
|
|
||||||
- *user_felixalb
|
|
||||||
- *user_pederbs_sopp
|
|
||||||
- *user_pederbs_nord
|
|
||||||
- *user_pederbs_bjarte
|
|
||||||
pgp:
|
|
||||||
- *user_oysteikt
|
|
||||||
|
|
||||||
- path_regex: secrets/bakke/[^/]+\.yaml$
|
|
||||||
key_groups:
|
|
||||||
- age:
|
|
||||||
- *host_bakke
|
|
||||||
- *user_danio
|
|
||||||
- *user_felixalb
|
|
||||||
- *user_pederbs_sopp
|
|
||||||
- *user_pederbs_nord
|
|
||||||
- *user_pederbs_bjarte
|
|
||||||
pgp:
|
|
||||||
- *user_oysteikt
|
|
||||||
|
|||||||
61
README.MD
Normal file
61
README.MD
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# PVV NixOS configs
|
||||||
|
|
||||||
|
## Hvordan endre på ting
|
||||||
|
|
||||||
|
Før du endrer på ting husk å ikke putte ting som skal være hemmelig uten å først lese seksjonen for hemmeligheter!
|
||||||
|
|
||||||
|
Etter å ha klonet prosjektet ned og gjort endringer kan du evaluere configene med:
|
||||||
|
|
||||||
|
`nix flake check --keep-going`
|
||||||
|
|
||||||
|
før du bygger en maskin med:
|
||||||
|
|
||||||
|
`nix build .#<maskinnavn>`
|
||||||
|
|
||||||
|
hvis du vil være ekstra sikker på at alt bygger så kan du kjøre:
|
||||||
|
|
||||||
|
`nix build .` for å bygge alle de viktige maskinene.
|
||||||
|
|
||||||
|
NB: Dette kan ta opp til 30 minutter avhengig av hva som ligger i caches
|
||||||
|
|
||||||
|
Husk å hvertfall stage nye filer om du har laget dem!
|
||||||
|
|
||||||
|
Om alt bygger fint commit det og push til git repoet.
|
||||||
|
Det er sikkert lurt å lage en PR først om du ikke er vandt til nix enda.
|
||||||
|
|
||||||
|
Innen 24h skal alle systemene hente ned den nye konfigurasjonen og deploye den.
|
||||||
|
|
||||||
|
Du kan tvinge en maskin til å oppdatere seg før dette ved å kjøre:
|
||||||
|
`nixos-rebuild switch --update-input nixpkgs --update-input nixpkgs-unstable --no-write-lock-file --refresh --upgrade --flake git+https://git.pvv.ntnu.no/Drift/pvv-nixos-config.git`
|
||||||
|
|
||||||
|
som root på maskinen.
|
||||||
|
|
||||||
|
Hvis du ikke har lyst til å oppdatere alle pakkene (og kanskje måtte vente en stund!) kan du kjøre
|
||||||
|
|
||||||
|
`nixos-rebuild switch --override-input nixpkgs nixpkgs --override-input nixpkgs-unstable nixpkgs-unstable --flake git+https://git.pvv.ntnu.no/Drift/pvv-nixos-config.git`
|
||||||
|
|
||||||
|
## Seksjonen for hemmeligheter
|
||||||
|
|
||||||
|
For at hemmeligheter ikke skal deles med hele verden i git - eller å være world
|
||||||
|
readable i nix-storen, bruker vi [sops-nix](https://github.com/Mic92/sops-nix)
|
||||||
|
|
||||||
|
For å legge til secrets kan du kjøre f.eks. `sops secrets/jokum/jokum.yaml`
|
||||||
|
Dette vil dekryptere filen og gi deg en text-editor du kan bruke for endre hemmelighetene.
|
||||||
|
|
||||||
|
Et nix shell med dette verktøyet inkludert ligger i flaket og shell.nix og kan aktiveres med:
|
||||||
|
|
||||||
|
`nix-shell` eller `nix develop`. Vi anbefaler det siste.
|
||||||
|
I tilegg kan du sette opp [direnv](https://direnv.net/) slik at dette skjer automatisk
|
||||||
|
|
||||||
|
for å få tilgang til å lese/skrive hemmeligheter må du spørre noen/noe som har tilgang til hemmelighetene
|
||||||
|
om å legge til age eller pgp nøkkelen din i [`.sops.yaml`](https://git.pvv.ntnu.no/Drift/pvv-nixos-config/src/main/.sops.yaml)
|
||||||
|
|
||||||
|
Denne kan du generere fra ssh-nøkkelene dine eller lage en egen nøkkel.
|
||||||
|
|
||||||
|
### Legge til flere keys
|
||||||
|
|
||||||
|
Gjør det som gir mening i .sops.yml
|
||||||
|
|
||||||
|
Etter det kjør `sops updatekeys secrets/host/file.yml`
|
||||||
|
|
||||||
|
MERK at det ikke er `sops -r` som BARE roterer nøkklene for de som allerede er i secretfila
|
||||||
36
README.md
36
README.md
@@ -1,36 +0,0 @@
|
|||||||
# PVV NixOS config
|
|
||||||
|
|
||||||
This repository contains the NixOS configurations for Programvareverkstedet's server closet.
|
|
||||||
In addition to machine configurations, it also contains a bunch of shared modules, packages, and
|
|
||||||
more.
|
|
||||||
|
|
||||||
## Machines
|
|
||||||
|
|
||||||
| Name | Type | Description |
|
|
||||||
|----------------------------|----------|-----------------------------------------------------------|
|
|
||||||
| [bekkalokk][bek] | Physical | Our main web host, webmail, wiki, idp, minecraft map, ... |
|
|
||||||
| [bicep][bic] | Virtual | Database host, matrix, git mirrors, ... |
|
|
||||||
| bikkje | Virtual | Experimental login box |
|
|
||||||
| [brzeczyszczykiewicz][brz] | Physical | Shared music player |
|
|
||||||
| [georg][geo] | Physical | Shared music player |
|
|
||||||
| [ildkule][ild] | Virtual | Logging and monitoring host, prometheus, grafana, ... |
|
|
||||||
| [kommode][kom] | Virtual | Gitea + Gitea pages |
|
|
||||||
| [lupine][lup] | Physical | Gitea CI/CD runners |
|
|
||||||
| shark | Virtual | Test host for authentication, absolutely horrendous |
|
|
||||||
| [wenche][wen] | Virtual | Nix-builders, general purpose compute |
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
- [Development - working on the PVV machines](./docs/development.md)
|
|
||||||
- [Miscellaneous development notes](./docs/development-misc.md)
|
|
||||||
- [User management](./docs/users.md)
|
|
||||||
- [Secret management and `sops-nix`](./docs/secret-management.md)
|
|
||||||
|
|
||||||
[bek]: https://wiki.pvv.ntnu.no/wiki/Maskiner/bekkalokk
|
|
||||||
[bic]: https://wiki.pvv.ntnu.no/wiki/Maskiner/bicep
|
|
||||||
[brz]: https://wiki.pvv.ntnu.no/wiki/Maskiner/brzęczyszczykiewicz
|
|
||||||
[geo]: https://wiki.pvv.ntnu.no/wiki/Maskiner/georg
|
|
||||||
[ild]: https://wiki.pvv.ntnu.no/wiki/Maskiner/ildkule
|
|
||||||
[kom]: https://wiki.pvv.ntnu.no/wiki/Maskiner/kommode
|
|
||||||
[lup]: https://wiki.pvv.ntnu.no/wiki/Maskiner/lupine
|
|
||||||
[wen]: https://wiki.pvv.ntnu.no/wiki/Maskiner/wenche
|
|
||||||
@@ -1,9 +1,4 @@
|
|||||||
{
|
{ pkgs, lib, fp, ... }:
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
fp,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
@@ -12,30 +7,19 @@
|
|||||||
|
|
||||||
./networking.nix
|
./networking.nix
|
||||||
./nix.nix
|
./nix.nix
|
||||||
./vm.nix
|
|
||||||
./flake-input-exporter.nix
|
|
||||||
|
|
||||||
./services/acme.nix
|
./services/acme.nix
|
||||||
./services/uptimed.nix
|
|
||||||
./services/auto-upgrade.nix
|
./services/auto-upgrade.nix
|
||||||
./services/dbus.nix
|
|
||||||
./services/fwupd.nix
|
|
||||||
./services/irqbalance.nix
|
./services/irqbalance.nix
|
||||||
./services/logrotate.nix
|
./services/logrotate.nix
|
||||||
./services/nginx.nix
|
./services/nginx.nix
|
||||||
./services/openssh.nix
|
./services/openssh.nix
|
||||||
./services/postfix.nix
|
./services/postfix.nix
|
||||||
./services/prometheus-node-exporter.nix
|
|
||||||
./services/prometheus-systemd-exporter.nix
|
|
||||||
./services/promtail.nix
|
|
||||||
./services/smartd.nix
|
./services/smartd.nix
|
||||||
./services/thermald.nix
|
./services/thermald.nix
|
||||||
./services/userborn.nix
|
|
||||||
./services/userdbd.nix
|
|
||||||
];
|
];
|
||||||
|
|
||||||
boot.tmp.cleanOnBoot = lib.mkDefault true;
|
boot.tmp.cleanOnBoot = lib.mkDefault true;
|
||||||
boot.kernelPackages = lib.mkDefault pkgs.linuxPackages_latest;
|
|
||||||
|
|
||||||
time.timeZone = "Europe/Oslo";
|
time.timeZone = "Europe/Oslo";
|
||||||
|
|
||||||
@@ -61,22 +45,8 @@
|
|||||||
kitty.terminfo
|
kitty.terminfo
|
||||||
];
|
];
|
||||||
|
|
||||||
# .bash_profile already works, but lets also use .bashrc like literally every other distro
|
|
||||||
# https://man.archlinux.org/man/core/bash/bash.1.en#INVOCATION
|
|
||||||
# home-manager usually handles this for you: https://github.com/nix-community/home-manager/blob/22a36aa709de7dd42b562a433b9cefecf104a6ee/modules/programs/bash.nix#L203-L209
|
|
||||||
# btw, programs.bash.shellInit just goes into environment.shellInit which in turn goes into /etc/profile, spooky shit
|
|
||||||
programs.bash.shellInit = ''
|
|
||||||
if [ -n "''${BASH_VERSION:-}" ]; then
|
|
||||||
if [[ ! -f ~/.bash_profile && ! -f ~/.bash_login ]]; then
|
|
||||||
[[ -f ~/.bashrc ]] && . ~/.bashrc
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
|
|
||||||
programs.zsh.enable = true;
|
programs.zsh.enable = true;
|
||||||
|
|
||||||
# security.lockKernelModules = true;
|
|
||||||
security.protectKernelImage = true;
|
|
||||||
security.sudo.execWheelOnly = true;
|
security.sudo.execWheelOnly = true;
|
||||||
security.sudo.extraConfig = ''
|
security.sudo.extraConfig = ''
|
||||||
Defaults lecture = never
|
Defaults lecture = never
|
||||||
@@ -87,3 +57,4 @@
|
|||||||
# Trusted users on the nix builder machines
|
# Trusted users on the nix builder machines
|
||||||
users.groups."nix-builder-users".name = "nix-builder-users";
|
users.groups."nix-builder-users".name = "nix-builder-users";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
inputs,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
values,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
let
|
|
||||||
data = lib.flip lib.mapAttrs inputs (
|
|
||||||
name: input: {
|
|
||||||
inherit (input)
|
|
||||||
lastModified
|
|
||||||
;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
folder = pkgs.writeTextDir "share/flake-inputs" (
|
|
||||||
lib.concatMapStringsSep "\n" (
|
|
||||||
{ name, value }: ''nixos_last_modified_input{flake="${name}"} ${toString value.lastModified}''
|
|
||||||
) (lib.attrsToList data)
|
|
||||||
);
|
|
||||||
port = 9102;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
services.nginx.virtualHosts."${config.networking.fqdn}-nixos-metrics" = {
|
|
||||||
serverName = config.networking.fqdn;
|
|
||||||
serverAliases = [
|
|
||||||
"${config.networking.hostName}.pvv.org"
|
|
||||||
];
|
|
||||||
locations."/metrics" = {
|
|
||||||
root = "${folder}/share";
|
|
||||||
tryFiles = "/flake-inputs =404";
|
|
||||||
extraConfig = ''
|
|
||||||
default_type text/plain;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
listen = [
|
|
||||||
{
|
|
||||||
inherit port;
|
|
||||||
addr = "0.0.0.0";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
extraConfig = ''
|
|
||||||
allow ${values.hosts.ildkule.ipv4}/32;
|
|
||||||
allow ${values.hosts.ildkule.ipv6}/128;
|
|
||||||
allow 127.0.0.1/32;
|
|
||||||
allow ::1/128;
|
|
||||||
allow ${values.ipv4-space};
|
|
||||||
allow ${values.ipv6-space};
|
|
||||||
deny all;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
networking.firewall.allowedTCPPorts = [ port ];
|
|
||||||
}
|
|
||||||
22
base/nix.nix
22
base/nix.nix
@@ -1,17 +1,16 @@
|
|||||||
{ lib, config, inputs, ... }:
|
{ inputs, ... }:
|
||||||
{
|
{
|
||||||
nix = {
|
nix = {
|
||||||
gc = {
|
gc = {
|
||||||
automatic = true;
|
automatic = true;
|
||||||
options = "--delete-older-than 2d";
|
options = "--delete-older-than 2d";
|
||||||
};
|
};
|
||||||
optimise.automatic = true;
|
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
allow-dirty = true;
|
allow-dirty = true;
|
||||||
auto-allocate-uids = true;
|
auto-optimise-store = true;
|
||||||
builders-use-substitutes = true;
|
builders-use-substitutes = true;
|
||||||
experimental-features = [ "nix-command" "flakes" "auto-allocate-uids" ];
|
experimental-features = [ "nix-command" "flakes" ];
|
||||||
log-lines = 50;
|
log-lines = 50;
|
||||||
use-xdg-base-directories = true;
|
use-xdg-base-directories = true;
|
||||||
};
|
};
|
||||||
@@ -22,16 +21,11 @@
|
|||||||
** use the same channel the system
|
** use the same channel the system
|
||||||
** was built with
|
** was built with
|
||||||
*/
|
*/
|
||||||
registry = lib.mkMerge [
|
registry = {
|
||||||
{
|
"nixpkgs".flake = inputs.nixpkgs;
|
||||||
"nixpkgs".flake = inputs.nixpkgs;
|
"nixpkgs-unstable".flake = inputs.nixpkgs-unstable;
|
||||||
"nixpkgs-unstable".flake = inputs.nixpkgs-unstable;
|
"pvv-nix".flake = inputs.self;
|
||||||
}
|
};
|
||||||
# We avoid the reference to self in vmVariant to get a stable system .outPath for equivalence testing
|
|
||||||
(lib.mkIf (!config.virtualisation.isVmVariant) {
|
|
||||||
"pvv-nix".flake = inputs.self;
|
|
||||||
})
|
|
||||||
];
|
|
||||||
nixPath = [
|
nixPath = [
|
||||||
"nixpkgs=${inputs.nixpkgs}"
|
"nixpkgs=${inputs.nixpkgs}"
|
||||||
"unstable=${inputs.nixpkgs-unstable}"
|
"unstable=${inputs.nixpkgs-unstable}"
|
||||||
|
|||||||
@@ -1,39 +1,26 @@
|
|||||||
{ config, inputs, pkgs, lib, ... }:
|
{ inputs, pkgs, lib, ... }:
|
||||||
|
|
||||||
let
|
|
||||||
inputUrls = lib.mapAttrs (input: value: value.url) (import "${inputs.self}/flake.nix").inputs;
|
|
||||||
in
|
|
||||||
|
|
||||||
{
|
{
|
||||||
system.autoUpgrade = {
|
system.autoUpgrade = {
|
||||||
enable = true;
|
enable = true;
|
||||||
flake = "git+https://git.pvv.ntnu.no/Drift/pvv-nixos-config.git";
|
flake = "git+https://git.pvv.ntnu.no/Drift/pvv-nixos-config.git?ref=pvvvvv";
|
||||||
flags = [
|
flags = [
|
||||||
"--refresh"
|
|
||||||
"--no-write-lock-file"
|
|
||||||
# --update-input is deprecated since nix 2.22, and removed in lix 2.90
|
# --update-input is deprecated since nix 2.22, and removed in lix 2.90
|
||||||
# as such we instead use --override-input combined with --refresh
|
|
||||||
# https://git.lix.systems/lix-project/lix/issues/400
|
# https://git.lix.systems/lix-project/lix/issues/400
|
||||||
] ++ (lib.pipe inputUrls [
|
"--refresh"
|
||||||
(lib.intersectAttrs {
|
"--override-input" "nixpkgs" "github:NixOS/nixpkgs/refs/pull/332699/merge"
|
||||||
nixpkgs = { };
|
"--override-input" "nixpkgs-unstable" "github:nixos/nixpkgs/nixos-unstable-small"
|
||||||
nixpkgs-unstable = { };
|
"--no-write-lock-file"
|
||||||
})
|
];
|
||||||
(lib.mapAttrsToList (input: url: ["--override-input" input url]))
|
|
||||||
lib.concatLists
|
|
||||||
]);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
# workaround for https://github.com/NixOS/nix/issues/6895
|
# workaround for https://github.com/NixOS/nix/issues/6895
|
||||||
# via https://git.lix.systems/lix-project/lix/issues/400
|
# via https://git.lix.systems/lix-project/lix/issues/400
|
||||||
environment.etc = lib.mkIf (!config.virtualisation.isVmVariant) {
|
environment.etc."current-system-flake-inputs.json".source
|
||||||
"current-system-flake-inputs.json".source
|
= pkgs.writers.writeJSON "flake-inputs.json" (
|
||||||
= pkgs.writers.writeJSON "flake-inputs.json" (
|
lib.flip lib.mapAttrs inputs (name: input:
|
||||||
lib.flip lib.mapAttrs inputs (name: input:
|
# inputs.*.sourceInfo sans outPath, since writeJSON will otherwise serialize sourceInfo like a derivation
|
||||||
# inputs.*.sourceInfo sans outPath, since writeJSON will otherwise serialize sourceInfo like a derivation
|
lib.removeAttrs (input.sourceInfo or {}) [ "outPath" ]
|
||||||
lib.removeAttrs (input.sourceInfo or {}) [ "outPath" ]
|
// { store-path = input.outPath; } # comment this line if you don't want to retain a store reference to the flake inputs
|
||||||
// { store-path = input.outPath; } # comment this line if you don't want to retain a store reference to the flake inputs
|
)
|
||||||
)
|
);
|
||||||
);
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
{ ... }:
|
|
||||||
{
|
|
||||||
services.dbus = {
|
|
||||||
enable = true;
|
|
||||||
implementation = "broker";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{ ... }:
|
|
||||||
{
|
|
||||||
services.fwupd.enable = true;
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,41 @@
|
|||||||
{ ... }:
|
{ ... }:
|
||||||
{
|
{
|
||||||
|
# source: https://github.com/logrotate/logrotate/blob/main/examples/logrotate.service
|
||||||
systemd.services.logrotate = {
|
systemd.services.logrotate = {
|
||||||
documentation = [ "man:logrotate(8)" "man:logrotate.conf(5)" ];
|
documentation = [ "man:logrotate(8)" "man:logrotate.conf(5)" ];
|
||||||
unitConfig.RequiresMountsFor = "/var/log";
|
unitConfig.RequiresMountsFor = "/var/log";
|
||||||
serviceConfig.ReadWritePaths = [ "/var/log" ];
|
serviceConfig = {
|
||||||
|
Nice = 19;
|
||||||
|
IOSchedulingClass = "best-effort";
|
||||||
|
IOSchedulingPriority = 7;
|
||||||
|
|
||||||
|
ReadWritePaths = [ "/var/log" ];
|
||||||
|
|
||||||
|
AmbientCapabilities = [ "" ];
|
||||||
|
CapabilityBoundingSet = [ "" ];
|
||||||
|
DeviceAllow = [ "" ];
|
||||||
|
LockPersonality = true;
|
||||||
|
MemoryDenyWriteExecute = true;
|
||||||
|
NoNewPrivileges = true; # disable for third party rotate scripts
|
||||||
|
PrivateDevices = true;
|
||||||
|
PrivateNetwork = true; # disable for mail delivery
|
||||||
|
PrivateTmp = true;
|
||||||
|
ProtectClock = true;
|
||||||
|
ProtectControlGroups = true;
|
||||||
|
ProtectHome = true; # disable for userdir logs
|
||||||
|
ProtectHostname = true;
|
||||||
|
ProtectKernelLogs = true;
|
||||||
|
ProtectKernelModules = true;
|
||||||
|
ProtectKernelTunables = true;
|
||||||
|
ProtectProc = "invisible";
|
||||||
|
ProtectSystem = "full";
|
||||||
|
RestrictNamespaces = true;
|
||||||
|
RestrictRealtime = true;
|
||||||
|
SocketBindDeny = [ "any" ];
|
||||||
|
SystemCallArchitectures = "native";
|
||||||
|
SystemCallFilter = [
|
||||||
|
"@system-service"
|
||||||
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,48 +20,25 @@
|
|||||||
recommendedGzipSettings = true;
|
recommendedGzipSettings = true;
|
||||||
|
|
||||||
appendConfig = ''
|
appendConfig = ''
|
||||||
# pcre_jit on;
|
pcre_jit on;
|
||||||
worker_processes auto;
|
worker_processes auto;
|
||||||
worker_rlimit_nofile 100000;
|
worker_rlimit_nofile 100000;
|
||||||
'';
|
'';
|
||||||
eventsConfig = ''
|
eventsConfig = ''
|
||||||
worker_connections 2048;
|
worker_connections 2048;
|
||||||
use epoll;
|
use epoll;
|
||||||
# multi_accept on;
|
multi_accept on;
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
systemd.services.nginx.serviceConfig = lib.mkIf config.services.nginx.enable {
|
systemd.services.nginx.serviceConfig = lib.mkIf config.services.nginx.enable {
|
||||||
LimitNOFILE = 65536;
|
LimitNOFILE = 65536;
|
||||||
# We use jit my dudes
|
|
||||||
MemoryDenyWriteExecute = lib.mkForce false;
|
|
||||||
# What the fuck do we use that where the defaults are not enough???
|
|
||||||
SystemCallFilter = lib.mkForce null;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
services.nginx.virtualHosts."_" = lib.mkIf config.services.nginx.enable {
|
services.nginx.virtualHosts."_" = lib.mkIf config.services.nginx.enable {
|
||||||
listen = [
|
|
||||||
{
|
|
||||||
addr = "0.0.0.0";
|
|
||||||
extraParameters = [
|
|
||||||
"default_server"
|
|
||||||
# Seemingly the default value of net.core.somaxconn
|
|
||||||
"backlog=4096"
|
|
||||||
"deferred"
|
|
||||||
];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
addr = "[::0]";
|
|
||||||
extraParameters = [
|
|
||||||
"default_server"
|
|
||||||
"backlog=4096"
|
|
||||||
"deferred"
|
|
||||||
];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
sslCertificate = "/etc/certs/nginx.crt";
|
sslCertificate = "/etc/certs/nginx.crt";
|
||||||
sslCertificateKey = "/etc/certs/nginx.key";
|
sslCertificateKey = "/etc/certs/nginx.key";
|
||||||
addSSL = true;
|
addSSL = true;
|
||||||
extraConfig = "return 444;";
|
extraConfig = "return 444;";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -6,17 +6,18 @@ in
|
|||||||
services.postfix = {
|
services.postfix = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|
||||||
settings.main = {
|
hostname = "${config.networking.hostName}.pvv.ntnu.no";
|
||||||
myhostname = "${config.networking.hostName}.pvv.ntnu.no";
|
domain = "pvv.ntnu.no";
|
||||||
mydomain = "pvv.ntnu.no";
|
|
||||||
|
|
||||||
# Nothing should be delivered to this machine
|
relayHost = "smtp.pvv.ntnu.no";
|
||||||
mydestination = [ ];
|
relayPort = 465;
|
||||||
|
|
||||||
relayhost = [ "smtp.pvv.ntnu.no:465" ];
|
|
||||||
|
|
||||||
|
config = {
|
||||||
smtp_tls_wrappermode = "yes";
|
smtp_tls_wrappermode = "yes";
|
||||||
smtp_tls_security_level = "encrypt";
|
smtp_tls_security_level = "encrypt";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Nothing should be delivered to this machine
|
||||||
|
destination = [ ];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
{ config, lib, values, ... }:
|
|
||||||
let
|
|
||||||
cfg = config.services.prometheus.exporters.node;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
services.prometheus.exporters.node = {
|
|
||||||
enable = lib.mkDefault true;
|
|
||||||
port = 9100;
|
|
||||||
enabledCollectors = [ "systemd" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.prometheus-node-exporter.serviceConfig = lib.mkIf cfg.enable {
|
|
||||||
IPAddressDeny = "any";
|
|
||||||
IPAddressAllow = [
|
|
||||||
"127.0.0.1"
|
|
||||||
"::1"
|
|
||||||
values.hosts.ildkule.ipv4
|
|
||||||
values.hosts.ildkule.ipv6
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
networking.firewall.allowedTCPPorts = lib.mkIf cfg.enable [ cfg.port ];
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
{ config, lib, values, ... }:
|
|
||||||
let
|
|
||||||
cfg = config.services.prometheus.exporters.systemd;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
services.prometheus.exporters.systemd = {
|
|
||||||
enable = lib.mkDefault true;
|
|
||||||
port = 9101;
|
|
||||||
extraFlags = [
|
|
||||||
"--systemd.collector.enable-restart-count"
|
|
||||||
"--systemd.collector.enable-ip-accounting"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.prometheus-systemd-exporter.serviceConfig = {
|
|
||||||
IPAddressDeny = "any";
|
|
||||||
IPAddressAllow = [
|
|
||||||
"127.0.0.1"
|
|
||||||
"::1"
|
|
||||||
values.hosts.ildkule.ipv4
|
|
||||||
values.hosts.ildkule.ipv6
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
networking.firewall.allowedTCPPorts = lib.mkIf cfg.enable [ cfg.port ];
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
{ config, lib, values, ... }:
|
|
||||||
let
|
|
||||||
cfg = config.services.prometheus.exporters.node;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
services.promtail = {
|
|
||||||
enable = lib.mkDefault true;
|
|
||||||
configuration = {
|
|
||||||
server = {
|
|
||||||
http_listen_port = 28183;
|
|
||||||
grpc_listen_port = 0;
|
|
||||||
};
|
|
||||||
clients = [{
|
|
||||||
url = "http://ildkule.pvv.ntnu.no:3100/loki/api/v1/push";
|
|
||||||
}];
|
|
||||||
scrape_configs = [{
|
|
||||||
job_name = "systemd-journal";
|
|
||||||
journal = {
|
|
||||||
max_age = "12h";
|
|
||||||
labels = {
|
|
||||||
job = "systemd-journal";
|
|
||||||
host = config.networking.hostName;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
relabel_configs = [
|
|
||||||
{
|
|
||||||
source_labels = [ "__journal__systemd_unit" ];
|
|
||||||
target_label = "unit";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
source_labels = [ "__journal_priority_keyword" ];
|
|
||||||
target_label = "level";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,20 +1,8 @@
|
|||||||
{ config, pkgs, lib, ... }:
|
{ config, pkgs, lib, ... }:
|
||||||
{
|
{
|
||||||
services.smartd = {
|
services.smartd.enable = lib.mkDefault true;
|
||||||
enable = lib.mkDefault true;
|
|
||||||
notifications = {
|
|
||||||
mail = {
|
|
||||||
enable = true;
|
|
||||||
sender = "root@pvv.ntnu.no";
|
|
||||||
recipient = "root@pvv.ntnu.no";
|
|
||||||
};
|
|
||||||
wall.enable = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
environment.systemPackages = lib.optionals config.services.smartd.enable (with pkgs; [
|
environment.systemPackages = lib.optionals config.services.smartd.enable (with pkgs; [
|
||||||
smartmontools
|
smartmontools
|
||||||
]);
|
]);
|
||||||
|
}
|
||||||
systemd.services.smartd.unitConfig.ConditionVirtualization = "no";
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
{ config, pkgs, lib, ... }:
|
|
||||||
let
|
|
||||||
cfg = config.services.uptimed;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
options.services.uptimed.settings = lib.mkOption {
|
|
||||||
description = "";
|
|
||||||
default = { };
|
|
||||||
type = lib.types.submodule {
|
|
||||||
freeformType = with lib.types; attrsOf (either str (listOf str));
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = {
|
|
||||||
services.uptimed = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
settings = let
|
|
||||||
stateDir = "/var/lib/uptimed";
|
|
||||||
in {
|
|
||||||
PIDFILE = "${stateDir}/pid";
|
|
||||||
SENDMAIL = lib.mkDefault "${pkgs.system-sendmail}/bin/sendmail -t";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.uptimed = lib.mkIf (cfg.enable) {
|
|
||||||
serviceConfig = let
|
|
||||||
uptimed = pkgs.uptimed.overrideAttrs (prev: {
|
|
||||||
postPatch = ''
|
|
||||||
substituteInPlace Makefile.am \
|
|
||||||
--replace-fail '$(sysconfdir)/uptimed.conf' '/var/lib/uptimed/uptimed.conf'
|
|
||||||
substituteInPlace src/Makefile.am \
|
|
||||||
--replace-fail '$(sysconfdir)/uptimed.conf' '/var/lib/uptimed/uptimed.conf'
|
|
||||||
'';
|
|
||||||
});
|
|
||||||
|
|
||||||
in {
|
|
||||||
Type = "notify";
|
|
||||||
|
|
||||||
ExecStart = lib.mkForce "${uptimed}/sbin/uptimed -f";
|
|
||||||
|
|
||||||
BindReadOnlyPaths = let
|
|
||||||
configFile = lib.pipe cfg.settings [
|
|
||||||
(lib.mapAttrsToList
|
|
||||||
(k: v:
|
|
||||||
if builtins.isList v
|
|
||||||
then lib.mapConcatStringsSep "\n" (v': "${k}=${v'}") v
|
|
||||||
else "${k}=${v}")
|
|
||||||
)
|
|
||||||
(lib.concatStringsSep "\n")
|
|
||||||
(pkgs.writeText "uptimed.conf")
|
|
||||||
];
|
|
||||||
in [
|
|
||||||
"${configFile}:/var/lib/uptimed/uptimed.conf"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{ ... }:
|
|
||||||
{
|
|
||||||
services.userborn.enable = true;
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{ ... }:
|
|
||||||
{
|
|
||||||
services.userdbd.enable = true;
|
|
||||||
}
|
|
||||||
15
base/vm.nix
15
base/vm.nix
@@ -1,15 +0,0 @@
|
|||||||
{ lib, ... }:
|
|
||||||
|
|
||||||
# This enables
|
|
||||||
# lib.mkIf (!config.virtualisation.isVmVariant) { ... }
|
|
||||||
|
|
||||||
{
|
|
||||||
options.virtualisation.isVmVariant = lib.mkOption {
|
|
||||||
description = "`true` if system is build with 'nixos-rebuild build-vm'";
|
|
||||||
type = lib.types.bool;
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
config.virtualisation.vmVariant = {
|
|
||||||
virtualisation.isVmVariant = true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
# Miscellaneous development notes
|
|
||||||
|
|
||||||
This document contains a bunch of information that is not particularly specific to the pvv nixos config,
|
|
||||||
but concerns technologies we use often or gotchas to be aware of when working with NixOS. A lot of the information
|
|
||||||
here is already public information spread around the internet, but we've collected some of the items we use often
|
|
||||||
here.
|
|
||||||
|
|
||||||
## The firewall
|
|
||||||
|
|
||||||
`networking.firewall` is a NixOS module that configures `iptables` rules on the machine. It is enabled by default on
|
|
||||||
all of our machines, and it can be easy to forget about it when setting up new services, especially when we are the
|
|
||||||
ones creating the NixOS module.
|
|
||||||
|
|
||||||
When setting up a new service that listens on a TCP or UDP port, make sure to add the appropriate ports to either
|
|
||||||
`networking.firewall.allowedTCPPorts` or `networking.firewall.allowedUDPPorts`.
|
|
||||||
|
|
||||||
You can list out the current firewall rules by running `sudo iptables -L -n -v` on the machine.
|
|
||||||
|
|
||||||
## Finding stuff
|
|
||||||
|
|
||||||
Finding stuff, both underlying implementation and usage is absolutely crucial when working on nix.
|
|
||||||
Oftentimes, the documentation will be outdated, lacking or just plain out wrong. These are some of
|
|
||||||
the techniques we have found to be quite good when working with nix.
|
|
||||||
|
|
||||||
### [ripgrep](https://github.com/BurntSushi/ripgrep)
|
|
||||||
|
|
||||||
ripgrep (or `rg` for short) is a tool that lets you recursively grep for regex patters in a directory.
|
|
||||||
|
|
||||||
It is great for finding references to configuration, and where and how certain things are used. It is
|
|
||||||
especially great when working with [nixpkgs](https://github.com/NixOS/nixpkgs), which is quite large.
|
|
||||||
|
|
||||||
### GitHub Search
|
|
||||||
|
|
||||||
When trying to set up a new service or reconfigure something, it is very common that someone has done it
|
|
||||||
before you, but it has never been documented anywhere. A lot of Nix code exists on GitHub, and you can
|
|
||||||
easily query it by using the `lang:nix` filter in the search bar.
|
|
||||||
|
|
||||||
For example: https://github.com/search?q=lang%3Anix+dibbler&type=code
|
|
||||||
|
|
||||||
## rsync
|
|
||||||
|
|
||||||
`rsync` is a tool for synchronizing files between machines. It is very useful when transferring large
|
|
||||||
amounts of data from a to b. We use it for multiple things, often when data is produced or stored on
|
|
||||||
one machine, and we want to process or convert it on another. For example, we use it to transfer gitea
|
|
||||||
artifacts, to transfer gallery pictures, to transfer minecraft world data for map rendering, and more.
|
|
||||||
|
|
||||||
Along with `rsync`, we often use a lesser known tool called `rrsync`, which you can use inside an ssh
|
|
||||||
configuration (`authorized_keys` file) to restrict what paths a user can access when connecting over ssh.
|
|
||||||
This is useful both as a security measure, but also to avoid accidental overwrites of files outside the intended
|
|
||||||
path. `rrsync` will use chroot to restrict what paths the user can access, as well as refuse to run arbitrary commands.
|
|
||||||
|
|
||||||
## `nix repl`
|
|
||||||
|
|
||||||
`nix repl` is an interactive REPL for the Nix language. It is very useful for experimenting with Nix code,
|
|
||||||
and testing out small snippets of code to make sure it behaves as expected. You can also use it to explore
|
|
||||||
NixOS machine configurations, to interactively see that the configuration evaluates to what you expect.
|
|
||||||
|
|
||||||
```
|
|
||||||
# While in the pvv-nixos-config directory
|
|
||||||
nix repl .
|
|
||||||
|
|
||||||
# Upon writing out the config path and clickin [Tab], you will get autocompletion suggestions:
|
|
||||||
nix-repl> nixosConfigurations.bekkalokk.config.services.nginx.virtualHosts.
|
|
||||||
nixosConfigurations.bekkalokk.config.services.nginx.virtualHosts._
|
|
||||||
nixosConfigurations.bekkalokk.config.services.nginx.virtualHosts.bekkalokk.pvv.ntnu.no-nixos-metrics
|
|
||||||
nixosConfigurations.bekkalokk.config.services.nginx.virtualHosts.idp.pvv.ntnu.no
|
|
||||||
nixosConfigurations.bekkalokk.config.services.nginx.virtualHosts.minecraft.pvv.ntnu.no
|
|
||||||
nixosConfigurations.bekkalokk.config.services.nginx.virtualHosts.pvv.ntnu.no
|
|
||||||
nixosConfigurations.bekkalokk.config.services.nginx.virtualHosts.pvv.org
|
|
||||||
nixosConfigurations.bekkalokk.config.services.nginx.virtualHosts.pw.pvv.ntnu.no
|
|
||||||
nixosConfigurations.bekkalokk.config.services.nginx.virtualHosts.roundcubeplaceholder.example.com
|
|
||||||
nixosConfigurations.bekkalokk.config.services.nginx.virtualHosts.snappymail.pvv.ntnu.no
|
|
||||||
nixosConfigurations.bekkalokk.config.services.nginx.virtualHosts.webmail.pvv.ntnu.no
|
|
||||||
nixosConfigurations.bekkalokk.config.services.nginx.virtualHosts.wiki.pvv.ntnu.no
|
|
||||||
nixosConfigurations.bekkalokk.config.services.nginx.virtualHosts.www.pvv.ntnu.no
|
|
||||||
nixosConfigurations.bekkalokk.config.services.nginx.virtualHosts.www.pvv.org
|
|
||||||
```
|
|
||||||
|
|
||||||
## `nix why-depends`
|
|
||||||
|
|
||||||
If you ever wonder why a certain package is being used as a dependency of another package,
|
|
||||||
or another machine, you can use `nix why-depends` to find the dependency path from one package to another.
|
|
||||||
This is often useful after updating nixpkgs and finding an error saying that a certain package is insecure,
|
|
||||||
broken or whatnot. You can do something like the following
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Why does bekkalokk depend on openssl?
|
|
||||||
nix why-depends .#nixosConfigurations.bekkalokk.config.system.build.toplevel .#nixosConfigurations.bekkalokk.pkgs.openssl
|
|
||||||
|
|
||||||
# Why does bekkalokk's minecraft-server depend on zlib? (this is not real)
|
|
||||||
nix why-depends .#nixosConfigurations.bekkalokk.pkgs.minecraft-server .#nixosConfigurations.bekkalokk.pkgs.zlib
|
|
||||||
```
|
|
||||||
|
|
||||||
## php-fpm
|
|
||||||
|
|
||||||
php-fpm (FastCGI Process Manager) is a PHP implementation that is designed for speed and production use. We host a bunch
|
|
||||||
of different PHP applications (including our own website), and so we use php-fpm quite a bit. php-fpm typically exposes a
|
|
||||||
unix socket that nginx will connect to, and php-fpm will then render php upon web requests forwarded from nginx and return
|
|
||||||
it.
|
|
||||||
|
|
||||||
php-fpm has a tendency to be a bit hard to debug. It is not always very willing to spit out error messages and logs, and so
|
|
||||||
it can be a bit hard to figure out what's up when something goes wrong. You should see some of the commented stuff laying around
|
|
||||||
in the website code on bekkalokk for examples of how to configure php-fpm for better logging and error reporting.
|
|
||||||
@@ -1,190 +0,0 @@
|
|||||||
# Development - working on the PVV machines
|
|
||||||
|
|
||||||
This document outlines the process of editing our NixOS configurations, and testing and deploying said changes
|
|
||||||
to the machines. Most of the information written here is specific to the PVV NixOS configuration, and the topics
|
|
||||||
will not really cover the nix code itself in detail. You can find some more resources for that by either following
|
|
||||||
the links from the *Upstream documentation* section below, or in [Miscellaneous development notes](./development-misc.md).
|
|
||||||
|
|
||||||
## Editing nix files
|
|
||||||
|
|
||||||
> [!WARN]
|
|
||||||
> Before editing any nix files, make sure to read [Secret management and `sops-nix`](./secret-management.md)!
|
|
||||||
> We do not want to add any secrets in plaintext to the nix files, and certainly not commit and publish
|
|
||||||
> them into the common public.
|
|
||||||
|
|
||||||
The files are plaintext code, written in the [`Nix` language](https://nix.dev/manual/nix/stable/language/).
|
|
||||||
|
|
||||||
Below is a list of important files and directories, and a description of what they contain.
|
|
||||||
|
|
||||||
### `flake.nix`
|
|
||||||
|
|
||||||
The `flake.nix` file is a [nix flake](https://wiki.nixos.org/wiki/Flakes) and makes up the entrypoint of the
|
|
||||||
entire configuration. It declares what inputs are used (similar to dependencies), as well as what outputs the
|
|
||||||
flake exposes. In our case, the most important outputs are the `nixosConfigurations` (our machine configs), but
|
|
||||||
we also expose custom modules, packages, devshells, and more. You can run `nix flake show` to get an overview of
|
|
||||||
the outputs (however you will need to [enable the `nix-flakes` experimental option](https://wiki.nixos.org/wiki/Flakes#Setup)).
|
|
||||||
|
|
||||||
You will find that a lot of the flake inputs are the different PVV projects that we develop, imported to be hosted
|
|
||||||
on the NixOS machines. This makes it easy to deploy changes to these projects, as we can just update the flake input
|
|
||||||
to point to a new commit or version, and then rebuild the machines.
|
|
||||||
|
|
||||||
A NixOS configuration is usually made with the `nixpkgs.lib.nixosSystem` function, however we have a few custom wrapper
|
|
||||||
functions named `nixosConfig` and `stableNixosConfig` that abstracts away some common configuration we want on all our machines.
|
|
||||||
|
|
||||||
### `values.nix`
|
|
||||||
|
|
||||||
`values.nix` is a somewhat rare pattern in NixOS configurations around the internet. It contains a bunch of constant values
|
|
||||||
that we use throughout the configuration, such as IP addresses, DNS names, paths and more. This not only makes it easier to
|
|
||||||
change the values should we need to, but it also makes the configuration more readable. Instead of caring what exact IP any
|
|
||||||
machine has, you can write `values.machines.name.ipv4` and abstract the details away.
|
|
||||||
|
|
||||||
### `base`
|
|
||||||
|
|
||||||
The `base` directory contains a bunch of NixOS configuration that is common for all or most machines. Some of the config
|
|
||||||
you will find here sets defaults for certain services without enabling them, so that when they are enabled in a machine config,
|
|
||||||
we don't need to repeat the same defaults over again. Other parts actually enable certain services that we want on all machines,
|
|
||||||
such as `openssh` or the auto upgrade timer.
|
|
||||||
|
|
||||||
### Vendoring `modules` and `packages`
|
|
||||||
|
|
||||||
Sometimes, we either find that the packages or modules provided by `nixpkgs` is not sufficient for us,
|
|
||||||
or that they are bugged in some way that can not be easily overrided. There are also cases where the
|
|
||||||
modules or packages does not exist. In these cases, we tend to either copy and modify the modules and
|
|
||||||
packages from nixpkgs, or create our own. These modules and packages end up in the top-level `modules`
|
|
||||||
and `packages` directories. They are usually exposed in `flake.nix` as flake outputs `nixosModules.<name>`
|
|
||||||
and `packages.<platform>.<name>`, and they are usually also added to the machines that need them in the flake.
|
|
||||||
|
|
||||||
In order to override or add an extra package, the easiest way is to use an [`overlay`](https://wiki.nixos.org/wiki/Overlays).
|
|
||||||
This makes it so that the package from `pkgs.<name>` now refers to the modified variant of the package.
|
|
||||||
|
|
||||||
In order to add a module, you can just register it in the modules of the nixos machine.
|
|
||||||
In order to override a module, you also have to use `disabledModules = [ "<path-relative-to-nixpkgs/modules>" ];`.
|
|
||||||
Use `rg` to find examples of the latter.
|
|
||||||
|
|
||||||
Do note that if you believe a new module to be of high enough quality, or the change you are making to be
|
|
||||||
relevant for every nix user, you should strongly consider also creating a PR towards nixpkgs. However,
|
|
||||||
getting changes made there has a bit higher threshold and takes more time than making changes in the PVV config,
|
|
||||||
so feel free to make the changes here first. We can always remove the changes again once the upstreaming is finished.
|
|
||||||
|
|
||||||
### `users`, `secrets` and `keys`
|
|
||||||
|
|
||||||
For `users`, see [User management](./users.md)
|
|
||||||
|
|
||||||
For `secrets` and `keys`, see [Secret management and `sops-nix`](./secret-management.md)
|
|
||||||
|
|
||||||
### Collaboration
|
|
||||||
|
|
||||||
We use our gitea to collaborate on changes to the nix configuration. Every PVV maintenance member should have
|
|
||||||
access to the repository. The usual workflow is that we create a branch for the change we want to make, do a bunch
|
|
||||||
of commits and changes, and then open a merge request for review (or just rebase on master if you know what you are doing).
|
|
||||||
|
|
||||||
### Upstream documentation
|
|
||||||
|
|
||||||
Here are different sources of documentation and stuff that you might find useful while
|
|
||||||
writing, editing and debugging nix code.
|
|
||||||
|
|
||||||
- [nixpkgs repository](https://github.com/NixOS/nixpkgs)
|
|
||||||
|
|
||||||
This is particularly useful to read the source code, as well as upstreaming pieces of code that we think
|
|
||||||
everyone would want
|
|
||||||
|
|
||||||
- [NixOS search](https://search.nixos.org/)
|
|
||||||
|
|
||||||
This is useful for searching for both packages and NixOS options.
|
|
||||||
|
|
||||||
- [nixpkgs documentation](https://nixos.org/manual/nixpkgs/stable/)
|
|
||||||
- [NixOS documentation](https://nixos.org/manual/nixos/stable/)
|
|
||||||
- [nix (the tool) documentation](https://nix.dev/manual/nix/stable/)
|
|
||||||
|
|
||||||
All of the three above make up the official documentation with all technical
|
|
||||||
details about the different pieces that makes up NixOS.
|
|
||||||
|
|
||||||
- [The official NixOS wiki](https://wiki.nixos.org)
|
|
||||||
|
|
||||||
User-contributed guides, tips and tricks, and whatever else.
|
|
||||||
|
|
||||||
- [nix.dev](https://nix.dev)
|
|
||||||
|
|
||||||
Additional stuff
|
|
||||||
|
|
||||||
- [Noogle](https://noogle.dev)
|
|
||||||
|
|
||||||
This is useful when looking for nix functions and packaging helpers.
|
|
||||||
|
|
||||||
## Testing and deploying changes
|
|
||||||
|
|
||||||
After editing the nix files on a certain branch, you will want to test and deploy the changes to the machines.
|
|
||||||
Unfortunately, we don't really have a good setup for testing for runtime correctness locally, but we can at least
|
|
||||||
make sure that the code evaluates and builds correctly before deploying.
|
|
||||||
|
|
||||||
To just check that the code evaluates without errors, you can run:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
nix flake check
|
|
||||||
# Or if you want to keep getting all errors before it quits:
|
|
||||||
nix flake check --keep-going
|
|
||||||
```
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> If you are making changes that involves creating new nix files, remember to `git add` those files before running
|
|
||||||
> any nix commands. Nix refuses to acknowledge files that are not either commited or at least staged. It will spit
|
|
||||||
> out an error message about not finding the file in question.
|
|
||||||
|
|
||||||
### Building machine configurations
|
|
||||||
|
|
||||||
To build any specific machine configuration and look at the output, you can run:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
nix build .#nixosConfigurations.<machine-name>.config.system.build.toplevel
|
|
||||||
# or just
|
|
||||||
nix build .#<machine-name>
|
|
||||||
```
|
|
||||||
|
|
||||||
This will create a symlink name `./result` to a directory containing the built NixOS system. It is oftentimes
|
|
||||||
the case that config files for certain services only end up in the nix store without being put into `/etc`. If you wish
|
|
||||||
to read those files, you can often find them by looking at the systemd unit files in `./result/etc/systemd/system/`.
|
|
||||||
(if you are using vim, `gf` or go-to-file while the cursor is over a file path is a useful trick while doing this).
|
|
||||||
|
|
||||||
If you have edited something that affects multiple machines, you can also build all important machines at once by running:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
nix build .#
|
|
||||||
```
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> Building all machines at once can take a long time, depending on what has changed and whether you have already
|
|
||||||
> built some of the machines recently. Be prepared to wait for up to an hour to build all machines from scratch
|
|
||||||
> if this is the first time.
|
|
||||||
|
|
||||||
### Deploying to machines
|
|
||||||
|
|
||||||
> [!WARN]
|
|
||||||
> Be careful to think about state when testing changes against the machines. Sometimes, a certain change
|
|
||||||
> can lead to irreversible changes to the data stored on the machine. An example would be a set of database
|
|
||||||
> migrations applied when testing a newer version of a service. Unless that service also comes with downwards
|
|
||||||
> migrations, you can not go back to the previous version without losing data.
|
|
||||||
|
|
||||||
To deploy the changes to a machine, you should first SSH into the machine, and clone the pvv-nixos-config
|
|
||||||
repository unless you have already done so. After that, checkout the branch you want to deploy from, and rebuild:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Run this while in the pvv-nixos-config directory
|
|
||||||
sudo nixos-rebuild switch --update-input nixpkgs --update-input nixpkgs-unstable --no-write-lock-file --refresh --flake .# --upgrade
|
|
||||||
```
|
|
||||||
|
|
||||||
This will rebuild the NixOS system on the current branch and switch the system configuration to reflect the new changes.
|
|
||||||
|
|
||||||
Note that unless you eventually merge the current changes into `main`, the machine will rebuild itself automatically and
|
|
||||||
revert the changes on the next nightly rebuild (tends to happen when everybody is asleep).
|
|
||||||
|
|
||||||
### Forcefully reset to `main`
|
|
||||||
|
|
||||||
If you ever want to reset a machine to the `main` branch, you can do so by running:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
nixos-rebuild switch --update-input nixpkgs --update-input nixpkgs-unstable --no-write-lock-file --refresh --upgrade --flake git+https://git.pvv.ntnu.no/Drift/pvv-nixos-config.git
|
|
||||||
```
|
|
||||||
|
|
||||||
This will ignore the current branch and just pull the latest `main` from the git repository directly from gitea.
|
|
||||||
You can also use this command if there are updates on the `main` branch that you want to deploy to the machine without
|
|
||||||
waiting for the nightly rebuild.
|
|
||||||
@@ -1,160 +0,0 @@
|
|||||||
# Secret management and `sops-nix`
|
|
||||||
|
|
||||||
Nix config is love, nix config is life, and publishing said config to the
|
|
||||||
internet is not only a good deed and kinda cool, but also encourages properly
|
|
||||||
secured configuration as opposed to [security through obscurity](https://en.wikipedia.org/wiki/Security_through_obscurity).
|
|
||||||
That being said, there are some details of the config that we really shouldn't
|
|
||||||
share with the general public. In particular, there are so-called *secrets*, that is
|
|
||||||
API keys, passwords, tokens, cookie secrets, salts, peppers and jalapenos that we'd
|
|
||||||
rather keep to ourselves. However, it is not entirely trivial to do so in the NixOS config.
|
|
||||||
For one, we'd have to keep these secrets out of the public git repo somehow, and secondly
|
|
||||||
everything that is configured via nix ends up as world readable files (i.e. any user on the
|
|
||||||
system can read the file) in `/nix/store`.
|
|
||||||
|
|
||||||
In order to solve this, we use a NixOS module called [`sops-nix`](https://github.com/Mic92/sops-nix)
|
|
||||||
which uses a technology called [`sops`](https://github.com/getsops/sops) behind the scenes.
|
|
||||||
The idea is simple: we encrypt these secrets with a bunch of different keys and store the
|
|
||||||
encrypted files in the git repo. First of all, we encrypt the secrets a bunch of time with
|
|
||||||
PVV maintenance member's keys, so that we can decrypt and edit the contents. Secondly, we
|
|
||||||
encrypt the secrets with the [host keys]() of the NixOS machines, so that they can decrypt
|
|
||||||
the secrets. The secrets will be decrypted and stored in a well-known location (usually `/run/secrets`)
|
|
||||||
so that they do not end up in the nix store, and are not world readable.
|
|
||||||
|
|
||||||
This way, we can both keep the secrets in the git repository and let multiple people edit them,
|
|
||||||
but also ensure that they don't end up in the wrong hands.
|
|
||||||
|
|
||||||
## Adding a new machine
|
|
||||||
|
|
||||||
In order to add a new machine to the nix-sops setup, you should do the following:
|
|
||||||
|
|
||||||
```console
|
|
||||||
# Create host keys (if they don't already exist)
|
|
||||||
ssh-keygen -A -b 4096
|
|
||||||
|
|
||||||
# Derive an age-key from the public host key
|
|
||||||
nix-shell -p ssh-to-age --run 'cat /etc/ssh/ssh_host_ed25519_key.pub | ssh-to-age'
|
|
||||||
|
|
||||||
# Register the age key in .sops.yaml
|
|
||||||
vim .sops.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
The contents of `.sops.yaml` should look like this:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
keys:
|
|
||||||
# Users
|
|
||||||
...
|
|
||||||
|
|
||||||
# Hosts
|
|
||||||
...
|
|
||||||
- &host_<machine_name> <public_age_key>
|
|
||||||
|
|
||||||
creation_rules:
|
|
||||||
...
|
|
||||||
|
|
||||||
- path_regex: secrets/<machine_name>/[^/]+\.yaml$
|
|
||||||
key_groups:
|
|
||||||
- age:
|
|
||||||
- *host_<machine_name>
|
|
||||||
- ... user keys
|
|
||||||
- pgp:
|
|
||||||
- ... user keys
|
|
||||||
```
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> Take care that all the keys in the `age` and `pgp` sections are prefixed
|
|
||||||
> with a `-`, or else sops might try to encrypt the secrets in a way where
|
|
||||||
> you need both keys present to decrypt the content. Also, it tends to throw
|
|
||||||
> interesting errors when it fails to do so.
|
|
||||||
|
|
||||||
```console
|
|
||||||
# While cd-ed into the repository, run this to get a shell with the `sops` tool present
|
|
||||||
nix-shell
|
|
||||||
```
|
|
||||||
|
|
||||||
Now you should also be able to edit secrets for this machine by running:
|
|
||||||
|
|
||||||
```
|
|
||||||
sops secrets/<machine_name>/<machine_name>.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
## Adding a user
|
|
||||||
|
|
||||||
Adding a user is quite similar to adding a new machine.
|
|
||||||
This guide assumes you have already set up SSH keys.
|
|
||||||
|
|
||||||
```
|
|
||||||
# Derive an age-key from your key
|
|
||||||
# (edit the path to the key if it is named something else)
|
|
||||||
nix-shell -p ssh-to-age --run 'cat ~/.ssh/id_ed25519.pub | ssh-to-age'
|
|
||||||
|
|
||||||
# Register the age key in .sops.yaml
|
|
||||||
vim .sops.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
The contents of `.sops.yaml` should look like this:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
keys:
|
|
||||||
# Users
|
|
||||||
...
|
|
||||||
- &user_<user_name> <public_age_key>
|
|
||||||
|
|
||||||
# Hosts
|
|
||||||
...
|
|
||||||
|
|
||||||
creation_rules:
|
|
||||||
...
|
|
||||||
|
|
||||||
# Do this for all the machines you are planning to edit
|
|
||||||
# (or just do it for all machines)
|
|
||||||
- path_regex: secrets/<machine_name>/[^/]+\.yaml$
|
|
||||||
key_groups:
|
|
||||||
- age:
|
|
||||||
- *host_<machine_name>
|
|
||||||
- ... user keys
|
|
||||||
- *host_<user_name>
|
|
||||||
- pgp:
|
|
||||||
- ... user keys
|
|
||||||
```
|
|
||||||
|
|
||||||
Now that sops is properly configured to recognize the key, you need someone
|
|
||||||
who already has access to decrypt all the secrets and re-encrypt them with your
|
|
||||||
key. At this point, you should probably [open a PR](https://docs.gitea.com/usage/issues-prs/pull-request)
|
|
||||||
and ask someone in PVV maintenance if they can checkout the PR branch, run the following
|
|
||||||
command and push the diff back into the PR (and maybe even ask them to merge if you're feeling
|
|
||||||
particularly needy).
|
|
||||||
|
|
||||||
```console
|
|
||||||
sops updatekeys secrets/*/*.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
## Updating keys
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> At some point, we found this flag called `sops -r` that seemed to be described to do what
|
|
||||||
> `sops updatekeys` does, do not be fooled. This only rotates the "inner key" for those who
|
|
||||||
> already have the secrets encrypted with their key.
|
|
||||||
|
|
||||||
Updating keys is done with this command:
|
|
||||||
|
|
||||||
```console
|
|
||||||
sops updatekeys secrets/*/*.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
However, there is a small catch. [oysteikt](https://git.pvv.ntnu.no/oysteikt) has kinda been
|
|
||||||
getting gray hairs lately, and refuses to use modern technology - he is still stuck using GPG.
|
|
||||||
This means that to be able to re-encrypt the sops secrets, you will need to have a gpg keychain
|
|
||||||
with his latest public key available. The key has an expiry date, so if he forgets to update it,
|
|
||||||
you should send him and angry email and tag him a bunch of times in a gitea issue. If the key
|
|
||||||
is up to date, you can do the following:
|
|
||||||
|
|
||||||
```console
|
|
||||||
# Fetch gpg (unless you have it already)
|
|
||||||
nix-shell -p gpg
|
|
||||||
|
|
||||||
# Import oysteikts key to the gpg keychain
|
|
||||||
gpg --import ./keys/oysteikt.pub
|
|
||||||
```
|
|
||||||
|
|
||||||
Now you should be able to run the `sops updatekeys` command again.
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
# User management
|
|
||||||
|
|
||||||
Due to some complications with how NixOS creates users compared to how we used to
|
|
||||||
create users with the salt-based setup, the NixOS machine users are created and
|
|
||||||
managed separately. We tend to create users on-demand, whenever someone in PVV
|
|
||||||
maintenance want to work on the NixOS machines.
|
|
||||||
|
|
||||||
## Setting up a new user
|
|
||||||
|
|
||||||
You can find the files for the existing users, and thereby examples of user files
|
|
||||||
in the [`users`](../users) directory. When creating a new file here, you should name it
|
|
||||||
`your-username.nix`, and add *at least* the following contents:
|
|
||||||
|
|
||||||
```nix
|
|
||||||
{ pkgs, ... }:
|
|
||||||
{
|
|
||||||
users.users."<username>" = {
|
|
||||||
isNormalUser = true;
|
|
||||||
extraGroups = [
|
|
||||||
"wheel" # In case you wanna use sudo (you probably do)
|
|
||||||
"nix-builder-users" # Arbitrary access to write to the nix store
|
|
||||||
];
|
|
||||||
|
|
||||||
# Any packages you frequently use to manage servers go here.
|
|
||||||
# Please don't pull gigantonormous packages here unless you
|
|
||||||
# absolutely need them, and remember that any package can be
|
|
||||||
# pulled via nix-shell if you only use it once in a blue moon.
|
|
||||||
packages = with pkgs; [
|
|
||||||
bottom
|
|
||||||
eza
|
|
||||||
];
|
|
||||||
|
|
||||||
# Not strictly needed, but we recommend adding your public SSH
|
|
||||||
# key here. If it is not present, you will have to log into the
|
|
||||||
# machine as 'root' before setting your password for every NixOS
|
|
||||||
# machine you have not logged into yet.
|
|
||||||
openssh.authorizedKeys.keys = [
|
|
||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIjiQ0wg4lpC7YBMAAHoGmgwqHOBi+EUz5mmCymGlIyT my-key"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
The file will be picked up automatically, so creating the file and adding the
|
|
||||||
contents should be enough to get you registered. You should
|
|
||||||
[open a PR](https://docs.gitea.com/usage/issues-prs/pull-request) with the new
|
|
||||||
code so the machines will be rebuilt with your user present.
|
|
||||||
|
|
||||||
See also [Secret Management](./secret-management.md) for how to add your keys to the
|
|
||||||
system that lets us add secrets (API keys, password, etc.) to the NixOS config.
|
|
||||||
238
flake.lock
generated
238
flake.lock
generated
@@ -7,41 +7,19 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1736864502,
|
"lastModified": 1731746438,
|
||||||
"narHash": "sha256-ItkIZyebGvNH2dK9jVGzJHGPtb6BSWLN8Gmef16NeY0=",
|
"narHash": "sha256-f3SSp1axoOk0NAI7oFdRzbxG2XPBSIXC+/DaAXnvS1A=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "disko",
|
"repo": "disko",
|
||||||
"rev": "0141aabed359f063de7413f80d906e1d98c0c123",
|
"rev": "cb64993826fa7a477490be6ccb38ba1fa1e18fa8",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"ref": "v1.11.0",
|
|
||||||
"repo": "disko",
|
"repo": "disko",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gergle": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1764868579,
|
|
||||||
"narHash": "sha256-rfTUOIc0wnC4+19gLVfPbHfXx/ilfuUix6bWY+yaM2U=",
|
|
||||||
"ref": "main",
|
|
||||||
"rev": "9c923d1d50daa6a3b28c3214ad2300bfaf6c8fcd",
|
|
||||||
"revCount": 22,
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://git.pvv.ntnu.no/Grzegorz/gergle.git"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"ref": "main",
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://git.pvv.ntnu.no/Grzegorz/gergle.git"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"greg-ng": {
|
"greg-ng": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
@@ -50,18 +28,17 @@
|
|||||||
"rust-overlay": "rust-overlay"
|
"rust-overlay": "rust-overlay"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765760377,
|
"lastModified": 1730249639,
|
||||||
"narHash": "sha256-2+lgzUjVas9hPSeWn52MwuX+iidMN4RkzkHo4vrGmR8=",
|
"narHash": "sha256-G3URSlqCcb+GIvGyki+HHrDM5ZanX/dP9BtppD/SdfI=",
|
||||||
"ref": "main",
|
"ref": "refs/heads/main",
|
||||||
"rev": "f340dc5b9c9f3b75b7aca41f56f8869b9e28cf8c",
|
"rev": "80e0447bcb79adad4f459ada5610f3eae987b4e3",
|
||||||
"revCount": 58,
|
"revCount": 34,
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.pvv.ntnu.no/Grzegorz/greg-ng.git"
|
"url": "https://git.pvv.ntnu.no/Projects/greg-ng.git"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"ref": "main",
|
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.pvv.ntnu.no/Grzegorz/greg-ng.git"
|
"url": "https://git.pvv.ntnu.no/Projects/greg-ng.git"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"grzegorz-clients": {
|
"grzegorz-clients": {
|
||||||
@@ -71,18 +48,17 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1764867811,
|
"lastModified": 1726861934,
|
||||||
"narHash": "sha256-UWHiwr8tIcGcVxMLvAdNxDbQ8QuHf3REHboyxvFkYEI=",
|
"narHash": "sha256-lOzPDwktd+pwszUTbpUdQg6iCzInS11fHLfkjmnvJrM=",
|
||||||
"ref": "master",
|
"ref": "refs/heads/master",
|
||||||
"rev": "c9983e947efe047ea9d6f97157a1f90e49d0eab3",
|
"rev": "546d921ec46735dbf876e36f4af8df1064d09432",
|
||||||
"revCount": 81,
|
"revCount": 78,
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.pvv.ntnu.no/Grzegorz/grzegorz-clients.git"
|
"url": "https://git.pvv.ntnu.no/Projects/grzegorz-clients.git"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"ref": "master",
|
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.pvv.ntnu.no/Grzegorz/grzegorz-clients.git"
|
"url": "https://git.pvv.ntnu.no/Projects/grzegorz-clients.git"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"matrix-next": {
|
"matrix-next": {
|
||||||
@@ -92,61 +68,33 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1764844095,
|
"lastModified": 1727410897,
|
||||||
"narHash": "sha256-Drf1orxsmFDzO+UbPo85gHjXW7QzAM+6oTPvI7vOSik=",
|
"narHash": "sha256-tWsyxvf421ieWUJYgjV7m1eTdr2ZkO3vId7vmtvfFpQ=",
|
||||||
"owner": "dali99",
|
"owner": "dali99",
|
||||||
"repo": "nixos-matrix-modules",
|
"repo": "nixos-matrix-modules",
|
||||||
"rev": "25b9f31ef1dbc3987b4c716de716239f2b283701",
|
"rev": "ff787d410cba17882cd7b6e2e22cc88d4064193c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "dali99",
|
"owner": "dali99",
|
||||||
"ref": "v0.8.0",
|
"ref": "v0.6.1",
|
||||||
"repo": "nixos-matrix-modules",
|
"repo": "nixos-matrix-modules",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"minecraft-heatmap": {
|
"minecraft-data": {
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"nixpkgs"
|
|
||||||
],
|
|
||||||
"rust-overlay": "rust-overlay_2"
|
|
||||||
},
|
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1766407405,
|
"lastModified": 1725277886,
|
||||||
"narHash": "sha256-UEJ8F8/oG70biWRrGbL5/aB7OXzzvnYs+jxkR07UHvA=",
|
"narHash": "sha256-Fw4VbbE3EfypQWSgPDFfvVH47BHeg3ptsO715NlUM8Q=",
|
||||||
"ref": "main",
|
"ref": "refs/heads/master",
|
||||||
"rev": "e719840f72ca1b0cd169562a3a0de69899821de0",
|
"rev": "1b4087bd3322a2e2ba84271c8fcc013e6b641a58",
|
||||||
"revCount": 16,
|
"revCount": 2,
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.pvv.ntnu.no/Projects/minecraft-heatmap.git"
|
"url": "https://git.pvv.ntnu.no/Drift/minecraft-data.git"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"ref": "main",
|
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.pvv.ntnu.no/Projects/minecraft-heatmap.git"
|
"url": "https://git.pvv.ntnu.no/Drift/minecraft-data.git"
|
||||||
}
|
|
||||||
},
|
|
||||||
"minecraft-kartverket": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1765904683,
|
|
||||||
"narHash": "sha256-uXM56y5n5GWpCiCNdKlTcCAy2IntgDB21c4gBDU30io=",
|
|
||||||
"ref": "main",
|
|
||||||
"rev": "6fae27b1659efb6774cf08a4e36ed29ab0e24105",
|
|
||||||
"revCount": 26,
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://git.pvv.ntnu.no/Projects/minecraft-kartverket.git"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"ref": "main",
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://git.pvv.ntnu.no/Projects/minecraft-kartverket.git"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nix-gitea-themes": {
|
"nix-gitea-themes": {
|
||||||
@@ -156,44 +104,65 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1743881366,
|
"lastModified": 1714416973,
|
||||||
"narHash": "sha256-ScGA2IHPk9ugf9bqEZnp+YB/OJgrkZblnG/XLEKvJAo=",
|
"narHash": "sha256-aZUcvXjdETUC6wVQpWDVjLUzwpDAEca8yR0ITDeK39o=",
|
||||||
"ref": "main",
|
"ref": "refs/heads/main",
|
||||||
"rev": "db2e4becf1b11e5dfd33de12a90a7d089fcf68ec",
|
"rev": "2b23c0ba8aae68d3cb6789f0f6e4891cef26cc6d",
|
||||||
"revCount": 11,
|
"revCount": 6,
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.pvv.ntnu.no/Drift/nix-gitea-themes.git"
|
"url": "https://git.pvv.ntnu.no/oysteikt/nix-gitea-themes.git"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"ref": "main",
|
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.pvv.ntnu.no/Drift/nix-gitea-themes.git"
|
"url": "https://git.pvv.ntnu.no/oysteikt/nix-gitea-themes.git"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1764806471,
|
"lastModified": 1731779898,
|
||||||
"narHash": "sha256-Qk0SArnS83KqyS9wNt1YoTkkYKDraNrjRWKUtB9DKoM=",
|
"narHash": "sha256-oxxCrYZM0WNRoaokDyVXcPIlTc8Z2yX4QjKbgXGI3IM=",
|
||||||
"rev": "6707b1809330d0f912f5813963bb29f6f194ee81",
|
"owner": "NixOS",
|
||||||
"type": "tarball",
|
"repo": "nixpkgs",
|
||||||
"url": "https://releases.nixos.org/nixos/25.11-small/nixos-25.11.896.6707b1809330/nixexprs.tar.xz"
|
"rev": "9972661139e27eed0237df4dde34839e09028cd5",
|
||||||
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"type": "tarball",
|
"owner": "NixOS",
|
||||||
"url": "https://nixos.org/channels/nixos-25.11-small/nixexprs.tar.xz"
|
"ref": "refs/pull/332699/merge",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-stable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1730602179,
|
||||||
|
"narHash": "sha256-efgLzQAWSzJuCLiCaQUCDu4NudNlHdg2NzGLX5GYaEY=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "3c2f1c4ca372622cb2f9de8016c9a0b1cbd0f37c",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "release-24.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs-unstable": {
|
"nixpkgs-unstable": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1764854611,
|
"lastModified": 1731745710,
|
||||||
"narHash": "sha256-MVzFp4ZKwdh6U1wy4fJe/GY3Hb4cvvyJbAZOhaeBQoo=",
|
"narHash": "sha256-SVeiClbgqL071JpAspOu0gCkPSAL51kSIRwo4C/pghA=",
|
||||||
"rev": "3a4b875aef660bbd148e86b92cffea2a360c3275",
|
"owner": "NixOS",
|
||||||
"type": "tarball",
|
"repo": "nixpkgs",
|
||||||
"url": "https://releases.nixos.org/nixos/unstable-small/nixos-26.05pre906534.3a4b875aef66/nixexprs.tar.xz"
|
"rev": "dfaa4cb76c2d450d8f396bb6b9f43cede3ade129",
|
||||||
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"type": "tarball",
|
"owner": "NixOS",
|
||||||
"url": "https://nixos.org/channels/nixos-unstable-small/nixexprs.tar.xz"
|
"ref": "nixos-unstable-small",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"pvv-calendar-bot": {
|
"pvv-calendar-bot": {
|
||||||
@@ -203,16 +172,15 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1764869785,
|
"lastModified": 1723850344,
|
||||||
"narHash": "sha256-FGTIpC7gB4lbeL0bfYzn1Ge0PaCpd7VqWBLhJBx0i4A=",
|
"narHash": "sha256-aT37O9l9eclWEnqxASVNBL1dKwDHZUOqdbA4VO9DJvw=",
|
||||||
"ref": "main",
|
"ref": "refs/heads/main",
|
||||||
"rev": "8ce7fb0b1918bdb3d1489a40d73895693955e8b2",
|
"rev": "38b66677ab8c01aee10cd59e745af9ce3ea88092",
|
||||||
"revCount": 23,
|
"revCount": 19,
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.pvv.ntnu.no/Projects/calendar-bot.git"
|
"url": "https://git.pvv.ntnu.no/Projects/calendar-bot.git"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"ref": "main",
|
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.pvv.ntnu.no/Projects/calendar-bot.git"
|
"url": "https://git.pvv.ntnu.no/Projects/calendar-bot.git"
|
||||||
}
|
}
|
||||||
@@ -224,16 +192,15 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765978548,
|
"lastModified": 1725212759,
|
||||||
"narHash": "sha256-VDSPpw+/Mgo+JujoW12CRlkTs9o0tX/FEL2AR5kl5+Q=",
|
"narHash": "sha256-yZBsefIarFUEhFRj+rCGMp9Zvag3MCafqV/JfGVRVwc=",
|
||||||
"ref": "main",
|
"ref": "refs/heads/master",
|
||||||
"rev": "961f021d27f86b2aedd16290dbf85bdd9d50fd42",
|
"rev": "e7b66b4bc6a89bab74bac45b87e9434f5165355f",
|
||||||
"revCount": 532,
|
"revCount": 473,
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.pvv.ntnu.no/Projects/nettsiden.git"
|
"url": "https://git.pvv.ntnu.no/Projects/nettsiden.git"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"ref": "main",
|
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.pvv.ntnu.no/Projects/nettsiden.git"
|
"url": "https://git.pvv.ntnu.no/Projects/nettsiden.git"
|
||||||
}
|
}
|
||||||
@@ -241,12 +208,10 @@
|
|||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"disko": "disko",
|
"disko": "disko",
|
||||||
"gergle": "gergle",
|
|
||||||
"greg-ng": "greg-ng",
|
"greg-ng": "greg-ng",
|
||||||
"grzegorz-clients": "grzegorz-clients",
|
"grzegorz-clients": "grzegorz-clients",
|
||||||
"matrix-next": "matrix-next",
|
"matrix-next": "matrix-next",
|
||||||
"minecraft-heatmap": "minecraft-heatmap",
|
"minecraft-data": "minecraft-data",
|
||||||
"minecraft-kartverket": "minecraft-kartverket",
|
|
||||||
"nix-gitea-themes": "nix-gitea-themes",
|
"nix-gitea-themes": "nix-gitea-themes",
|
||||||
"nixpkgs": "nixpkgs",
|
"nixpkgs": "nixpkgs",
|
||||||
"nixpkgs-unstable": "nixpkgs-unstable",
|
"nixpkgs-unstable": "nixpkgs-unstable",
|
||||||
@@ -263,32 +228,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1765680428,
|
"lastModified": 1729391507,
|
||||||
"narHash": "sha256-fyPmRof9SZeI14ChPk5rVPOm7ISiiGkwGCunkhM+eUg=",
|
"narHash": "sha256-as0I9xieJUHf7kiK2a9znDsVZQTFWhM1pLivII43Gi0=",
|
||||||
"owner": "oxalica",
|
"owner": "oxalica",
|
||||||
"repo": "rust-overlay",
|
"repo": "rust-overlay",
|
||||||
"rev": "eb3898d8ef143d4bf0f7f2229105fc51c7731b2f",
|
"rev": "784981a9feeba406de38c1c9a3decf966d853cca",
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "oxalica",
|
|
||||||
"repo": "rust-overlay",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rust-overlay_2": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"minecraft-heatmap",
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1766371695,
|
|
||||||
"narHash": "sha256-W7CX9vy7H2Jj3E8NI4djHyF8iHSxKpb2c/7uNQ/vGFU=",
|
|
||||||
"owner": "oxalica",
|
|
||||||
"repo": "rust-overlay",
|
|
||||||
"rev": "d81285ba8199b00dc31847258cae3c655b605e8c",
|
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -301,19 +245,19 @@
|
|||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
]
|
],
|
||||||
|
"nixpkgs-stable": "nixpkgs-stable"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1766894905,
|
"lastModified": 1731748189,
|
||||||
"narHash": "sha256-pn8AxxfajqyR/Dmr1wnZYdUXHgM3u6z9x0Z1Ijmz2UQ=",
|
"narHash": "sha256-Zd/Uukvpcu26M6YGhpbsgqm6LUSLz+Q8mDZ5LOEGdiE=",
|
||||||
"owner": "Mic92",
|
"owner": "Mic92",
|
||||||
"repo": "sops-nix",
|
"repo": "sops-nix",
|
||||||
"rev": "61b39c7b657081c2adc91b75dd3ad8a91d6f07a7",
|
"rev": "d2bd7f433b28db6bc7ae03d5eca43564da0af054",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "Mic92",
|
"owner": "Mic92",
|
||||||
"ref": "master",
|
|
||||||
"repo": "sops-nix",
|
"repo": "sops-nix",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
|
|||||||
167
flake.nix
167
flake.nix
@@ -2,50 +2,44 @@
|
|||||||
description = "PVV System flake";
|
description = "PVV System flake";
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "https://nixos.org/channels/nixos-25.11-small/nixexprs.tar.xz";
|
nixpkgs.url = "github:NixOS/nixpkgs/refs/pull/332699/merge"; # remember to also update the url in base/services/auto-upgrade.nix
|
||||||
nixpkgs-unstable.url = "https://nixos.org/channels/nixos-unstable-small/nixexprs.tar.xz";
|
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable-small";
|
||||||
|
|
||||||
sops-nix.url = "github:Mic92/sops-nix/master";
|
sops-nix.url = "github:Mic92/sops-nix";
|
||||||
sops-nix.inputs.nixpkgs.follows = "nixpkgs";
|
sops-nix.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
|
||||||
disko.url = "github:nix-community/disko/v1.11.0";
|
disko.url = "github:nix-community/disko";
|
||||||
disko.inputs.nixpkgs.follows = "nixpkgs";
|
disko.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
|
||||||
pvv-nettsiden.url = "git+https://git.pvv.ntnu.no/Projects/nettsiden.git?ref=main";
|
pvv-nettsiden.url = "git+https://git.pvv.ntnu.no/Projects/nettsiden.git";
|
||||||
pvv-nettsiden.inputs.nixpkgs.follows = "nixpkgs";
|
pvv-nettsiden.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
|
||||||
pvv-calendar-bot.url = "git+https://git.pvv.ntnu.no/Projects/calendar-bot.git?ref=main";
|
pvv-calendar-bot.url = "git+https://git.pvv.ntnu.no/Projects/calendar-bot.git";
|
||||||
pvv-calendar-bot.inputs.nixpkgs.follows = "nixpkgs";
|
pvv-calendar-bot.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
|
||||||
matrix-next.url = "github:dali99/nixos-matrix-modules/v0.8.0";
|
matrix-next.url = "github:dali99/nixos-matrix-modules/v0.6.1";
|
||||||
matrix-next.inputs.nixpkgs.follows = "nixpkgs";
|
matrix-next.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
|
||||||
nix-gitea-themes.url = "git+https://git.pvv.ntnu.no/Drift/nix-gitea-themes.git?ref=main";
|
nix-gitea-themes.url = "git+https://git.pvv.ntnu.no/oysteikt/nix-gitea-themes.git";
|
||||||
nix-gitea-themes.inputs.nixpkgs.follows = "nixpkgs";
|
nix-gitea-themes.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
|
||||||
minecraft-heatmap.url = "git+https://git.pvv.ntnu.no/Projects/minecraft-heatmap.git?ref=main";
|
greg-ng.url = "git+https://git.pvv.ntnu.no/Projects/greg-ng.git";
|
||||||
minecraft-heatmap.inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
|
|
||||||
greg-ng.url = "git+https://git.pvv.ntnu.no/Grzegorz/greg-ng.git?ref=main";
|
|
||||||
greg-ng.inputs.nixpkgs.follows = "nixpkgs";
|
greg-ng.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
gergle.url = "git+https://git.pvv.ntnu.no/Grzegorz/gergle.git?ref=main";
|
grzegorz-clients.url = "git+https://git.pvv.ntnu.no/Projects/grzegorz-clients.git";
|
||||||
gergle.inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
grzegorz-clients.url = "git+https://git.pvv.ntnu.no/Grzegorz/grzegorz-clients.git?ref=master";
|
|
||||||
grzegorz-clients.inputs.nixpkgs.follows = "nixpkgs";
|
grzegorz-clients.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
|
||||||
minecraft-kartverket.url = "git+https://git.pvv.ntnu.no/Projects/minecraft-kartverket.git?ref=main";
|
minecraft-data.url = "git+https://git.pvv.ntnu.no/Drift/minecraft-data.git";
|
||||||
minecraft-kartverket.inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = { self, nixpkgs, nixpkgs-unstable, sops-nix, disko, ... }@inputs:
|
outputs = { self, nixpkgs, nixpkgs-unstable, sops-nix, disko, ... }@inputs:
|
||||||
let
|
let
|
||||||
inherit (nixpkgs) lib;
|
nixlib = nixpkgs.lib;
|
||||||
systems = [
|
systems = [
|
||||||
"x86_64-linux"
|
"x86_64-linux"
|
||||||
"aarch64-linux"
|
"aarch64-linux"
|
||||||
"aarch64-darwin"
|
"aarch64-darwin"
|
||||||
];
|
];
|
||||||
forAllSystems = f: lib.genAttrs systems f;
|
forAllSystems = f: nixlib.genAttrs systems f;
|
||||||
allMachines = builtins.attrNames self.nixosConfigurations;
|
allMachines = builtins.attrNames self.nixosConfigurations;
|
||||||
importantMachines = [
|
importantMachines = [
|
||||||
"bekkalokk"
|
"bekkalokk"
|
||||||
@@ -55,84 +49,44 @@
|
|||||||
"ildkule"
|
"ildkule"
|
||||||
];
|
];
|
||||||
in {
|
in {
|
||||||
inputs = lib.mapAttrs (_: src: src.outPath) inputs;
|
inherit inputs;
|
||||||
|
|
||||||
pkgs = forAllSystems (system:
|
|
||||||
import nixpkgs {
|
|
||||||
inherit system;
|
|
||||||
config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg)
|
|
||||||
[
|
|
||||||
"nvidia-x11"
|
|
||||||
"nvidia-settings"
|
|
||||||
];
|
|
||||||
});
|
|
||||||
|
|
||||||
nixosConfigurations = let
|
nixosConfigurations = let
|
||||||
unstablePkgs = nixpkgs-unstable.legacyPackages.x86_64-linux;
|
unstablePkgs = nixpkgs-unstable.legacyPackages.x86_64-linux;
|
||||||
|
nixosConfig = nixpkgs: name: config: nixpkgs.lib.nixosSystem (nixpkgs.lib.recursiveUpdate
|
||||||
nixosConfig =
|
rec {
|
||||||
nixpkgs:
|
|
||||||
name:
|
|
||||||
configurationPath:
|
|
||||||
extraArgs:
|
|
||||||
lib.nixosSystem (lib.recursiveUpdate
|
|
||||||
(let
|
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
in {
|
|
||||||
inherit system;
|
|
||||||
|
|
||||||
specialArgs = {
|
specialArgs = {
|
||||||
inherit unstablePkgs inputs;
|
inherit unstablePkgs inputs;
|
||||||
values = import ./values.nix;
|
values = import ./values.nix;
|
||||||
fp = path: ./${path};
|
fp = path: ./${path};
|
||||||
} // extraArgs.specialArgs or { };
|
};
|
||||||
|
|
||||||
modules = [
|
modules = [
|
||||||
configurationPath
|
./hosts/${name}/configuration.nix
|
||||||
sops-nix.nixosModules.sops
|
sops-nix.nixosModules.sops
|
||||||
] ++ extraArgs.modules or [];
|
] ++ config.modules or [];
|
||||||
|
|
||||||
pkgs = import nixpkgs {
|
pkgs = import nixpkgs {
|
||||||
inherit system;
|
inherit system;
|
||||||
config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg)
|
|
||||||
[
|
|
||||||
"nvidia-x11"
|
|
||||||
"nvidia-settings"
|
|
||||||
];
|
|
||||||
overlays = [
|
overlays = [
|
||||||
# Global overlays go here
|
# Global overlays go here
|
||||||
] ++ extraArgs.overlays or [ ];
|
] ++ config.overlays or [ ];
|
||||||
};
|
};
|
||||||
})
|
}
|
||||||
(builtins.removeAttrs extraArgs [
|
(removeAttrs config [ "modules" "overlays" ])
|
||||||
"modules"
|
|
||||||
"overlays"
|
|
||||||
"specialArgs"
|
|
||||||
])
|
|
||||||
);
|
);
|
||||||
|
|
||||||
stableNixosConfig = name: extraArgs:
|
stableNixosConfig = nixosConfig nixpkgs;
|
||||||
nixosConfig nixpkgs name ./hosts/${name}/configuration.nix extraArgs;
|
unstableNixosConfig = nixosConfig nixpkgs-unstable;
|
||||||
in {
|
in {
|
||||||
bakke = stableNixosConfig "bakke" {
|
|
||||||
modules = [
|
|
||||||
disko.nixosModules.disko
|
|
||||||
];
|
|
||||||
};
|
|
||||||
bicep = stableNixosConfig "bicep" {
|
bicep = stableNixosConfig "bicep" {
|
||||||
modules = [
|
modules = [
|
||||||
inputs.matrix-next.nixosModules.default
|
inputs.matrix-next.nixosModules.default
|
||||||
inputs.pvv-calendar-bot.nixosModules.default
|
inputs.pvv-calendar-bot.nixosModules.default
|
||||||
inputs.minecraft-heatmap.nixosModules.default
|
|
||||||
self.nixosModules.gickup
|
|
||||||
self.nixosModules.matrix-ooye
|
|
||||||
];
|
];
|
||||||
overlays = [
|
overlays = [
|
||||||
inputs.pvv-calendar-bot.overlays.default
|
inputs.pvv-calendar-bot.overlays.x86_64-linux.default
|
||||||
inputs.minecraft-heatmap.overlays.default
|
|
||||||
(final: prev: {
|
|
||||||
inherit (self.packages.${prev.system}) out-of-your-element;
|
|
||||||
})
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
bekkalokk = stableNixosConfig "bekkalokk" {
|
bekkalokk = stableNixosConfig "bekkalokk" {
|
||||||
@@ -143,11 +97,12 @@
|
|||||||
simplesamlphp = final.callPackage ./packages/simplesamlphp { };
|
simplesamlphp = final.callPackage ./packages/simplesamlphp { };
|
||||||
bluemap = final.callPackage ./packages/bluemap.nix { };
|
bluemap = final.callPackage ./packages/bluemap.nix { };
|
||||||
})
|
})
|
||||||
|
inputs.nix-gitea-themes.overlays.default
|
||||||
inputs.pvv-nettsiden.overlays.default
|
inputs.pvv-nettsiden.overlays.default
|
||||||
];
|
];
|
||||||
modules = [
|
modules = [
|
||||||
|
inputs.nix-gitea-themes.nixosModules.default
|
||||||
inputs.pvv-nettsiden.nixosModules.default
|
inputs.pvv-nettsiden.nixosModules.default
|
||||||
self.nixosModules.bluemap
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
bob = stableNixosConfig "bob" {
|
bob = stableNixosConfig "bob" {
|
||||||
@@ -159,77 +114,40 @@
|
|||||||
ildkule = stableNixosConfig "ildkule" { };
|
ildkule = stableNixosConfig "ildkule" { };
|
||||||
#ildkule-unstable = unstableNixosConfig "ildkule" { };
|
#ildkule-unstable = unstableNixosConfig "ildkule" { };
|
||||||
shark = stableNixosConfig "shark" { };
|
shark = stableNixosConfig "shark" { };
|
||||||
wenche = stableNixosConfig "wenche" { };
|
|
||||||
|
|
||||||
kommode = stableNixosConfig "kommode" {
|
|
||||||
overlays = [
|
|
||||||
inputs.nix-gitea-themes.overlays.default
|
|
||||||
];
|
|
||||||
modules = [
|
|
||||||
inputs.nix-gitea-themes.nixosModules.default
|
|
||||||
self.nixosModules.robots-txt
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
ustetind = stableNixosConfig "ustetind" {
|
|
||||||
modules = [
|
|
||||||
"${nixpkgs}/nixos/modules/virtualisation/lxc-container.nix"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
brzeczyszczykiewicz = stableNixosConfig "brzeczyszczykiewicz" {
|
brzeczyszczykiewicz = stableNixosConfig "brzeczyszczykiewicz" {
|
||||||
modules = [
|
modules = [
|
||||||
inputs.grzegorz-clients.nixosModules.grzegorz-webui
|
inputs.grzegorz-clients.nixosModules.grzegorz-webui
|
||||||
inputs.gergle.nixosModules.default
|
|
||||||
inputs.greg-ng.nixosModules.default
|
inputs.greg-ng.nixosModules.default
|
||||||
];
|
];
|
||||||
overlays = [
|
overlays = [
|
||||||
inputs.greg-ng.overlays.default
|
inputs.greg-ng.overlays.default
|
||||||
inputs.gergle.overlays.default
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
georg = stableNixosConfig "georg" {
|
georg = stableNixosConfig "georg" {
|
||||||
modules = [
|
modules = [
|
||||||
inputs.grzegorz-clients.nixosModules.grzegorz-webui
|
inputs.grzegorz-clients.nixosModules.grzegorz-webui
|
||||||
inputs.gergle.nixosModules.default
|
|
||||||
inputs.greg-ng.nixosModules.default
|
inputs.greg-ng.nixosModules.default
|
||||||
];
|
];
|
||||||
overlays = [
|
overlays = [
|
||||||
inputs.greg-ng.overlays.default
|
inputs.greg-ng.overlays.default
|
||||||
inputs.gergle.overlays.default
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
kvernberg = stableNixosConfig "kvernberg" {
|
||||||
//
|
modules = [
|
||||||
(let
|
disko.nixosModules.disko
|
||||||
machineNames = map (i: "lupine-${toString i}") (lib.range 1 5);
|
{ disko.devices.disk.disk1.device = "/dev/sda"; }
|
||||||
stableLupineNixosConfig = name: extraArgs:
|
];
|
||||||
nixosConfig nixpkgs name ./hosts/lupine/configuration.nix extraArgs;
|
};
|
||||||
in lib.genAttrs machineNames (name: stableLupineNixosConfig name {
|
};
|
||||||
modules = [{ networking.hostName = name; }];
|
|
||||||
specialArgs.lupineName = name;
|
|
||||||
}));
|
|
||||||
|
|
||||||
nixosModules = {
|
nixosModules = {
|
||||||
bluemap = ./modules/bluemap.nix;
|
|
||||||
snakeoil-certs = ./modules/snakeoil-certs.nix;
|
snakeoil-certs = ./modules/snakeoil-certs.nix;
|
||||||
snappymail = ./modules/snappymail.nix;
|
snappymail = ./modules/snappymail.nix;
|
||||||
robots-txt = ./modules/robots-txt.nix;
|
|
||||||
gickup = ./modules/gickup;
|
|
||||||
matrix-ooye = ./modules/matrix-ooye.nix;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
devShells = forAllSystems (system: {
|
devShells = forAllSystems (system: {
|
||||||
default = nixpkgs-unstable.legacyPackages.${system}.callPackage ./shell.nix { };
|
default = nixpkgs.legacyPackages.${system}.callPackage ./shell.nix { };
|
||||||
cuda = let
|
|
||||||
cuda-pkgs = import nixpkgs-unstable {
|
|
||||||
inherit system;
|
|
||||||
config = {
|
|
||||||
allowUnfree = true;
|
|
||||||
cudaSupport = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
in cuda-pkgs.callPackage ./shells/cuda.nix { };
|
|
||||||
});
|
});
|
||||||
|
|
||||||
packages = {
|
packages = {
|
||||||
@@ -238,22 +156,19 @@
|
|||||||
in rec {
|
in rec {
|
||||||
default = important-machines;
|
default = important-machines;
|
||||||
important-machines = pkgs.linkFarm "important-machines"
|
important-machines = pkgs.linkFarm "important-machines"
|
||||||
(lib.getAttrs importantMachines self.packages.x86_64-linux);
|
(nixlib.getAttrs importantMachines self.packages.x86_64-linux);
|
||||||
all-machines = pkgs.linkFarm "all-machines"
|
all-machines = pkgs.linkFarm "all-machines"
|
||||||
(lib.getAttrs allMachines self.packages.x86_64-linux);
|
(nixlib.getAttrs allMachines self.packages.x86_64-linux);
|
||||||
|
|
||||||
simplesamlphp = pkgs.callPackage ./packages/simplesamlphp { };
|
simplesamlphp = pkgs.callPackage ./packages/simplesamlphp { };
|
||||||
|
|
||||||
bluemap = pkgs.callPackage ./packages/bluemap.nix { };
|
|
||||||
|
|
||||||
out-of-your-element = pkgs.callPackage ./packages/out-of-your-element.nix { };
|
|
||||||
} //
|
} //
|
||||||
(lib.pipe null [
|
(nixlib.pipe null [
|
||||||
(_: pkgs.callPackage ./packages/mediawiki-extensions { })
|
(_: pkgs.callPackage ./packages/mediawiki-extensions { })
|
||||||
(lib.flip builtins.removeAttrs ["override" "overrideDerivation"])
|
(nixlib.flip builtins.removeAttrs ["override" "overrideDerivation"])
|
||||||
(lib.mapAttrs' (name: lib.nameValuePair "mediawiki-${name}"))
|
(nixlib.mapAttrs' (name: nixlib.nameValuePair "mediawiki-${name}"))
|
||||||
])
|
])
|
||||||
// lib.genAttrs allMachines
|
// nixlib.genAttrs allMachines
|
||||||
(machine: self.nixosConfigurations.${machine}.config.system.build.toplevel);
|
(machine: self.nixosConfigurations.${machine}.config.system.build.toplevel);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{ config, pkgs, values, ... }:
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./hardware-configuration.nix
|
|
||||||
../../base
|
|
||||||
./filesystems.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
sops.defaultSopsFile = ../../secrets/bakke/bakke.yaml;
|
|
||||||
sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
|
|
||||||
sops.age.keyFile = "/var/lib/sops-nix/key.txt";
|
|
||||||
sops.age.generateKey = true;
|
|
||||||
|
|
||||||
boot.loader.systemd-boot.enable = true;
|
|
||||||
boot.loader.efi.canTouchEfiVariables = true;
|
|
||||||
|
|
||||||
networking.hostName = "bakke";
|
|
||||||
networking.hostId = "99609ffc";
|
|
||||||
systemd.network.networks."30-enp2s0" = values.defaultNetworkConfig // {
|
|
||||||
matchConfig.Name = "enp2s0";
|
|
||||||
address = with values.hosts.bakke; [ (ipv4 + "/25") (ipv6 + "/64") ];
|
|
||||||
};
|
|
||||||
|
|
||||||
system.stateVersion = "24.05";
|
|
||||||
}
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
{
|
|
||||||
# https://github.com/nix-community/disko/blob/master/example/boot-raid1.nix
|
|
||||||
# Note: Disko was used to create the initial md raid, but is no longer in active use on this host.
|
|
||||||
disko.devices = {
|
|
||||||
disk = {
|
|
||||||
one = {
|
|
||||||
type = "disk";
|
|
||||||
device = "/dev/disk/by-id/ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E2EER6N6";
|
|
||||||
content = {
|
|
||||||
type = "gpt";
|
|
||||||
partitions = {
|
|
||||||
ESP = {
|
|
||||||
size = "500M";
|
|
||||||
type = "EF00";
|
|
||||||
content = {
|
|
||||||
type = "mdraid";
|
|
||||||
name = "boot";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
mdadm = {
|
|
||||||
size = "100%";
|
|
||||||
content = {
|
|
||||||
type = "mdraid";
|
|
||||||
name = "raid1";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
two = {
|
|
||||||
type = "disk";
|
|
||||||
device = "/dev/disk/by-id/ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E7LPLU71";
|
|
||||||
content = {
|
|
||||||
type = "gpt";
|
|
||||||
partitions = {
|
|
||||||
ESP = {
|
|
||||||
size = "500M";
|
|
||||||
type = "EF00";
|
|
||||||
content = {
|
|
||||||
type = "mdraid";
|
|
||||||
name = "boot";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
mdadm = {
|
|
||||||
size = "100%";
|
|
||||||
content = {
|
|
||||||
type = "mdraid";
|
|
||||||
name = "raid1";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
mdadm = {
|
|
||||||
boot = {
|
|
||||||
type = "mdadm";
|
|
||||||
level = 1;
|
|
||||||
metadata = "1.0";
|
|
||||||
content = {
|
|
||||||
type = "filesystem";
|
|
||||||
format = "vfat";
|
|
||||||
mountpoint = "/boot";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
raid1 = {
|
|
||||||
type = "mdadm";
|
|
||||||
level = 1;
|
|
||||||
content = {
|
|
||||||
type = "gpt";
|
|
||||||
partitions.primary = {
|
|
||||||
size = "100%";
|
|
||||||
content = {
|
|
||||||
type = "filesystem";
|
|
||||||
format = "ext4";
|
|
||||||
mountpoint = "/";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
{ config, pkgs, lib, ... }:
|
|
||||||
{
|
|
||||||
# Boot drives:
|
|
||||||
boot.swraid.enable = true;
|
|
||||||
|
|
||||||
# ZFS Data pool:
|
|
||||||
environment.systemPackages = with pkgs; [ zfs ];
|
|
||||||
boot = {
|
|
||||||
zfs = {
|
|
||||||
extraPools = [ "tank" ];
|
|
||||||
requestEncryptionCredentials = false;
|
|
||||||
};
|
|
||||||
supportedFilesystems = [ "zfs" ];
|
|
||||||
kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
|
|
||||||
};
|
|
||||||
services.zfs.autoScrub = {
|
|
||||||
enable = true;
|
|
||||||
interval = "Wed *-*-8..14 00:00:00";
|
|
||||||
};
|
|
||||||
|
|
||||||
# NFS Exports:
|
|
||||||
#TODO
|
|
||||||
|
|
||||||
# NFS Import mounts:
|
|
||||||
#TODO
|
|
||||||
}
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
# 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 = [ "ehci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ];
|
|
||||||
boot.initrd.kernelModules = [ ];
|
|
||||||
boot.kernelModules = [ "kvm-intel" ];
|
|
||||||
boot.extraModulePackages = [ ];
|
|
||||||
|
|
||||||
fileSystems."/" =
|
|
||||||
{ device = "/dev/disk/by-uuid/0f63c3d2-fc12-4ed5-a5a5-141bfd67a571";
|
|
||||||
fsType = "btrfs";
|
|
||||||
options = [ "subvol=root" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
fileSystems."/home" =
|
|
||||||
{ device = "/dev/disk/by-uuid/0f63c3d2-fc12-4ed5-a5a5-141bfd67a571";
|
|
||||||
fsType = "btrfs";
|
|
||||||
options = [ "subvol=home" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
fileSystems."/nix" =
|
|
||||||
{ device = "/dev/disk/by-uuid/0f63c3d2-fc12-4ed5-a5a5-141bfd67a571";
|
|
||||||
fsType = "btrfs";
|
|
||||||
options = [ "subvol=nix" "noatime" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
fileSystems."/boot" =
|
|
||||||
{ device = "/dev/sdc2";
|
|
||||||
fsType = "vfat";
|
|
||||||
options = [ "fmask=0022" "dmask=0022" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
swapDevices = [ ];
|
|
||||||
|
|
||||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
|
||||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
|
||||||
# still possible to use this option, but it's recommended to use it in conjunction
|
|
||||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
|
||||||
networking.useDHCP = lib.mkDefault false;
|
|
||||||
# networking.interfaces.eno1.useDHCP = lib.mkDefault true;
|
|
||||||
# networking.interfaces.enp2s0.useDHCP = lib.mkDefault true;
|
|
||||||
|
|
||||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
|
||||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
|
||||||
}
|
|
||||||
@@ -4,10 +4,12 @@
|
|||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
|
|
||||||
(fp /base)
|
(fp /base)
|
||||||
|
(fp /misc/metrics-exporters.nix)
|
||||||
|
|
||||||
./services/bluemap.nix
|
./services/bluemap/default.nix
|
||||||
|
./services/gitea/default.nix
|
||||||
./services/idp-simplesamlphp
|
./services/idp-simplesamlphp
|
||||||
./services/kerberos.nix
|
./services/kerberos
|
||||||
./services/mediawiki
|
./services/mediawiki
|
||||||
./services/nginx.nix
|
./services/nginx.nix
|
||||||
./services/phpfpm.nix
|
./services/phpfpm.nix
|
||||||
|
|||||||
@@ -1,127 +0,0 @@
|
|||||||
{ config, lib, pkgs, inputs, ... }:
|
|
||||||
let
|
|
||||||
vanillaSurvival = "/var/lib/bluemap/vanilla_survival_world";
|
|
||||||
format = pkgs.formats.hocon { };
|
|
||||||
in {
|
|
||||||
# NOTE: our versino of the module gets added in flake.nix
|
|
||||||
disabledModules = [ "services/web-apps/bluemap.nix" ];
|
|
||||||
|
|
||||||
sops.secrets."bluemap/ssh-key" = { };
|
|
||||||
sops.secrets."bluemap/ssh-known-hosts" = { };
|
|
||||||
|
|
||||||
services.bluemap = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
eula = true;
|
|
||||||
onCalendar = "*-*-* 05:45:00"; # a little over an hour after auto-upgrade
|
|
||||||
|
|
||||||
host = "minecraft.pvv.ntnu.no";
|
|
||||||
|
|
||||||
maps = let
|
|
||||||
inherit (inputs.minecraft-kartverket.packages.${pkgs.stdenv.hostPlatform.system}) bluemap-export;
|
|
||||||
in {
|
|
||||||
"verden" = {
|
|
||||||
settings = {
|
|
||||||
world = vanillaSurvival;
|
|
||||||
dimension = "minecraft:overworld";
|
|
||||||
name = "Verden";
|
|
||||||
sorting = 0;
|
|
||||||
start-pos = {
|
|
||||||
x = 0;
|
|
||||||
z = 0;
|
|
||||||
};
|
|
||||||
ambient-light = 0.1;
|
|
||||||
cave-detection-ocean-floor = -5;
|
|
||||||
marker-sets = {
|
|
||||||
_includes = [ (format.lib.mkInclude "${bluemap-export}/overworld.hocon") ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
"underverden" = {
|
|
||||||
settings = {
|
|
||||||
world = vanillaSurvival;
|
|
||||||
dimension = "minecraft:the_nether";
|
|
||||||
name = "Underverden";
|
|
||||||
sorting = 100;
|
|
||||||
start-pos = {
|
|
||||||
x = 0;
|
|
||||||
z = 0;
|
|
||||||
};
|
|
||||||
sky-color = "#290000";
|
|
||||||
void-color = "#150000";
|
|
||||||
sky-light = 1;
|
|
||||||
ambient-light = 0.6;
|
|
||||||
remove-caves-below-y = -10000;
|
|
||||||
cave-detection-ocean-floor = -5;
|
|
||||||
cave-detection-uses-block-light = true;
|
|
||||||
render-mask = [{
|
|
||||||
max-y = 90;
|
|
||||||
}];
|
|
||||||
marker-sets = {
|
|
||||||
_includes = [ (format.lib.mkInclude "${bluemap-export}/nether.hocon") ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
"enden" = {
|
|
||||||
settings = {
|
|
||||||
world = vanillaSurvival;
|
|
||||||
dimension = "minecraft:the_end";
|
|
||||||
name = "Enden";
|
|
||||||
sorting = 200;
|
|
||||||
start-pos = {
|
|
||||||
x = 0;
|
|
||||||
z = 0;
|
|
||||||
};
|
|
||||||
sky-color = "#080010";
|
|
||||||
void-color = "#080010";
|
|
||||||
sky-light = 1;
|
|
||||||
ambient-light = 0.6;
|
|
||||||
remove-caves-below-y = -10000;
|
|
||||||
cave-detection-ocean-floor = -5;
|
|
||||||
marker-sets = {
|
|
||||||
_includes = [ (format.lib.mkInclude "${bluemap-export}/the-end.hocon") ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services."render-bluemap-maps" = {
|
|
||||||
serviceConfig = {
|
|
||||||
StateDirectory = [ "bluemap/world" ];
|
|
||||||
ExecStartPre = let
|
|
||||||
rsyncArgs = lib.cli.toCommandLineShellGNU { } {
|
|
||||||
archive = true;
|
|
||||||
compress = true;
|
|
||||||
verbose = true;
|
|
||||||
no-owner = true;
|
|
||||||
no-group = true;
|
|
||||||
rsh = "${pkgs.openssh}/bin/ssh -o UserKnownHostsFile=%d/ssh-known-hosts -i %d/sshkey";
|
|
||||||
};
|
|
||||||
in "${lib.getExe pkgs.rsync} ${rsyncArgs} root@innovation.pvv.ntnu.no:/ ${vanillaSurvival}";
|
|
||||||
LoadCredential = [
|
|
||||||
"sshkey:${config.sops.secrets."bluemap/ssh-key".path}"
|
|
||||||
"ssh-known-hosts:${config.sops.secrets."bluemap/ssh-known-hosts".path}"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services.nginx.virtualHosts."minecraft.pvv.ntnu.no" = {
|
|
||||||
enableACME = true;
|
|
||||||
forceSSL = true;
|
|
||||||
kTLS = true;
|
|
||||||
http3 = true;
|
|
||||||
quic = true;
|
|
||||||
http3_hq = true;
|
|
||||||
extraConfig = ''
|
|
||||||
# Enabling QUIC 0-RTT
|
|
||||||
ssl_early_data on;
|
|
||||||
|
|
||||||
quic_gso on;
|
|
||||||
quic_retry on;
|
|
||||||
add_header Alt-Svc 'h3=":$server_port"; ma=86400';
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
networking.firewall.allowedUDPPorts = [ 443 ];
|
|
||||||
}
|
|
||||||
83
hosts/bekkalokk/services/bluemap/default.nix
Normal file
83
hosts/bekkalokk/services/bluemap/default.nix
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
{ config, lib, pkgs, inputs, ... }:
|
||||||
|
let
|
||||||
|
vanillaSurvival = "/var/lib/bluemap/vanilla_survival_world";
|
||||||
|
in {
|
||||||
|
imports = [
|
||||||
|
./module.nix # From danio, pending upstreaming
|
||||||
|
];
|
||||||
|
|
||||||
|
disabledModules = [ "services/web-servers/bluemap.nix" ];
|
||||||
|
|
||||||
|
sops.secrets."bluemap/ssh-key" = { };
|
||||||
|
sops.secrets."bluemap/ssh-known-hosts" = { };
|
||||||
|
|
||||||
|
services.bluemap = {
|
||||||
|
enable = true;
|
||||||
|
eula = true;
|
||||||
|
onCalendar = "*-*-* 05:45:00"; # a little over an hour after auto-upgrade
|
||||||
|
|
||||||
|
host = "minecraft.pvv.ntnu.no";
|
||||||
|
|
||||||
|
maps = {
|
||||||
|
"verden" = {
|
||||||
|
settings = {
|
||||||
|
world = vanillaSurvival;
|
||||||
|
sorting = 0;
|
||||||
|
ambient-light = 0.1;
|
||||||
|
cave-detection-ocean-floor = -5;
|
||||||
|
marker-sets = inputs.minecraft-data.map-markers.vanillaSurvival.verden;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"underverden" = {
|
||||||
|
settings = {
|
||||||
|
world = "${vanillaSurvival}/DIM-1";
|
||||||
|
sorting = 100;
|
||||||
|
sky-color = "#290000";
|
||||||
|
void-color = "#150000";
|
||||||
|
ambient-light = 0.6;
|
||||||
|
world-sky-light = 0;
|
||||||
|
remove-caves-below-y = -10000;
|
||||||
|
cave-detection-ocean-floor = -5;
|
||||||
|
cave-detection-uses-block-light = true;
|
||||||
|
max-y = 90;
|
||||||
|
marker-sets = inputs.minecraft-data.map-markers.vanillaSurvival.underverden;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"enden" = {
|
||||||
|
settings = {
|
||||||
|
world = "${vanillaSurvival}/DIM1";
|
||||||
|
sorting = 200;
|
||||||
|
sky-color = "#080010";
|
||||||
|
void-color = "#080010";
|
||||||
|
ambient-light = 0.6;
|
||||||
|
world-sky-light = 0;
|
||||||
|
remove-caves-below-y = -10000;
|
||||||
|
cave-detection-ocean-floor = -5;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nginx.virtualHosts."minecraft.pvv.ntnu.no" = {
|
||||||
|
enableACME = true;
|
||||||
|
forceSSL = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# TODO: render somewhere else lmao
|
||||||
|
systemd.services."render-bluemap-maps" = {
|
||||||
|
preStart = ''
|
||||||
|
mkdir -p /var/lib/bluemap/world
|
||||||
|
${pkgs.rsync}/bin/rsync \
|
||||||
|
-e "${pkgs.openssh}/bin/ssh -o UserKnownHostsFile=$CREDENTIALS_DIRECTORY/ssh-known-hosts -i $CREDENTIALS_DIRECTORY/sshkey" \
|
||||||
|
-avz --no-owner --no-group \
|
||||||
|
root@innovation.pvv.ntnu.no:/ \
|
||||||
|
${vanillaSurvival}
|
||||||
|
'';
|
||||||
|
serviceConfig = {
|
||||||
|
LoadCredential = [
|
||||||
|
"sshkey:${config.sops.secrets."bluemap/ssh-key".path}"
|
||||||
|
"ssh-known-hosts:${config.sops.secrets."bluemap/ssh-known-hosts".path}"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -25,7 +25,8 @@ let
|
|||||||
"core.conf" = coreConfig;
|
"core.conf" = coreConfig;
|
||||||
"webapp.conf" = webappConfig;
|
"webapp.conf" = webappConfig;
|
||||||
"webserver.conf" = webserverConfig;
|
"webserver.conf" = webserverConfig;
|
||||||
"packs" = cfg.packs;
|
"packs" = cfg.resourcepacks;
|
||||||
|
"addons" = cfg.resourcepacks; # TODO
|
||||||
};
|
};
|
||||||
|
|
||||||
renderConfigFolder = name: value: pkgs.linkFarm "bluemap-${name}-config" {
|
renderConfigFolder = name: value: pkgs.linkFarm "bluemap-${name}-config" {
|
||||||
@@ -36,14 +37,14 @@ let
|
|||||||
"core.conf" = coreConfig;
|
"core.conf" = coreConfig;
|
||||||
"webapp.conf" = format.generate "webapp.conf" (cfg.webappSettings // { "update-settings-file" = false; });
|
"webapp.conf" = format.generate "webapp.conf" (cfg.webappSettings // { "update-settings-file" = false; });
|
||||||
"webserver.conf" = webserverConfig;
|
"webserver.conf" = webserverConfig;
|
||||||
"packs" = value.packs;
|
"packs" = value.resourcepacks;
|
||||||
|
"addons" = cfg.resourcepacks; # TODO
|
||||||
};
|
};
|
||||||
|
|
||||||
inherit (lib) mkOption;
|
inherit (lib) mkOption;
|
||||||
in {
|
in {
|
||||||
options.services.bluemap = {
|
options.services.bluemap = {
|
||||||
enable = lib.mkEnableOption "bluemap";
|
enable = lib.mkEnableOption "bluemap";
|
||||||
package = lib.mkPackageOption pkgs "bluemap" { };
|
|
||||||
|
|
||||||
eula = mkOption {
|
eula = mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
@@ -110,7 +111,7 @@ in {
|
|||||||
metrics = lib.mkEnableOption "Sending usage metrics containing the version of bluemap in use";
|
metrics = lib.mkEnableOption "Sending usage metrics containing the version of bluemap in use";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
description = "Settings for the core.conf file, [see upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/blob/master/common/src/main/resources/de/bluecolored/bluemap/config/core.conf).";
|
description = "Settings for the core.conf file, [see upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/blob/master/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/core.conf).";
|
||||||
};
|
};
|
||||||
|
|
||||||
webappSettings = mkOption {
|
webappSettings = mkOption {
|
||||||
@@ -127,7 +128,7 @@ in {
|
|||||||
webroot = config.services.bluemap.webRoot;
|
webroot = config.services.bluemap.webRoot;
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
description = "Settings for the webapp.conf file, see [upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/blob/master/common/src/main/resources/de/bluecolored/bluemap/config/webapp.conf).";
|
description = "Settings for the webapp.conf file, see [upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/blob/master/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/webapp.conf).";
|
||||||
};
|
};
|
||||||
|
|
||||||
webserverSettings = mkOption {
|
webserverSettings = mkOption {
|
||||||
@@ -147,18 +148,18 @@ in {
|
|||||||
default = { };
|
default = { };
|
||||||
description = ''
|
description = ''
|
||||||
Settings for the webserver.conf file, usually not required.
|
Settings for the webserver.conf file, usually not required.
|
||||||
[See upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/blob/master/common/src/main/resources/de/bluecolored/bluemap/config/webserver.conf).
|
[See upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/blob/master/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/webserver.conf).
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
maps = mkOption {
|
maps = mkOption {
|
||||||
type = lib.types.attrsOf (lib.types.submodule ({ name, ... }: {
|
type = lib.types.attrsOf (lib.types.submodule {
|
||||||
options = {
|
options = {
|
||||||
packs = mkOption {
|
resourcepacks = mkOption {
|
||||||
type = lib.types.path;
|
type = lib.types.path;
|
||||||
default = cfg.packs;
|
default = cfg.resourcepacks;
|
||||||
defaultText = lib.literalExpression "config.services.bluemap.packs";
|
defaultText = lib.literalExpression "config.services.bluemap.resourcepacks";
|
||||||
description = "A set of resourcepacks, datapacks, and mods to extract resources from, loaded in alphabetical order.";
|
description = "A set of resourcepacks/mods to extract models from loaded in alphabetical order";
|
||||||
};
|
};
|
||||||
settings = mkOption {
|
settings = mkOption {
|
||||||
type = (lib.types.submodule {
|
type = (lib.types.submodule {
|
||||||
@@ -168,74 +169,43 @@ in {
|
|||||||
type = lib.types.path;
|
type = lib.types.path;
|
||||||
description = "Path to world folder containing the dimension to render";
|
description = "Path to world folder containing the dimension to render";
|
||||||
};
|
};
|
||||||
name = mkOption {
|
|
||||||
type = lib.types.str;
|
|
||||||
description = "The display name of this map (how this map will be named on the webapp)";
|
|
||||||
default = name;
|
|
||||||
defaultText = lib.literalExpression "<name>";
|
|
||||||
};
|
|
||||||
render-mask = mkOption {
|
|
||||||
type = with lib.types; listOf (attrsOf format.type);
|
|
||||||
description = "Limits for the map render";
|
|
||||||
default = [ ];
|
|
||||||
example = [
|
|
||||||
{
|
|
||||||
min-x = -4000;
|
|
||||||
max-x = 4000;
|
|
||||||
min-z = -4000;
|
|
||||||
max-z = 4000;
|
|
||||||
min-y = 50;
|
|
||||||
max-y = 100;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
subtract = true;
|
|
||||||
min-y = 90;
|
|
||||||
max-y = 127;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
description = ''
|
description = ''
|
||||||
Settings for files in `maps/`.
|
Settings for files in `maps/`.
|
||||||
See the default for an example with good options for the different world types.
|
See the default for an example with good options for the different world types.
|
||||||
For valid values [consult upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/blob/master/common/src/main/resources/de/bluecolored/bluemap/config/maps/map.conf).
|
For valid values [consult upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/blob/master/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/maps/map.conf).
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}));
|
});
|
||||||
default = {
|
default = {
|
||||||
"overworld".settings = {
|
"overworld".settings = {
|
||||||
world = cfg.defaultWorld;
|
world = "${cfg.defaultWorld}";
|
||||||
dimension = "minecraft:overworld";
|
|
||||||
name = "Overworld";
|
|
||||||
ambient-light = 0.1;
|
ambient-light = 0.1;
|
||||||
cave-detection-ocean-floor = -5;
|
cave-detection-ocean-floor = -5;
|
||||||
};
|
};
|
||||||
|
|
||||||
"nether".settings = {
|
"nether".settings = {
|
||||||
world = cfg.defaultWorld;
|
world = "${cfg.defaultWorld}/DIM-1";
|
||||||
dimension = "minecraft:the_nether";
|
|
||||||
name = "Nether";
|
|
||||||
sorting = 100;
|
sorting = 100;
|
||||||
sky-color = "#290000";
|
sky-color = "#290000";
|
||||||
void-color = "#150000";
|
void-color = "#150000";
|
||||||
sky-light = 1;
|
|
||||||
ambient-light = 0.6;
|
ambient-light = 0.6;
|
||||||
|
world-sky-light = 0;
|
||||||
remove-caves-below-y = -10000;
|
remove-caves-below-y = -10000;
|
||||||
cave-detection-ocean-floor = -5;
|
cave-detection-ocean-floor = -5;
|
||||||
cave-detection-uses-block-light = true;
|
cave-detection-uses-block-light = true;
|
||||||
|
max-y = 90;
|
||||||
};
|
};
|
||||||
|
|
||||||
"end".settings = {
|
"end".settings = {
|
||||||
world = cfg.defaultWorld;
|
world = "${cfg.defaultWorld}/DIM1";
|
||||||
dimension = "minecraft:the_end";
|
|
||||||
name = "The End";
|
|
||||||
sorting = 200;
|
sorting = 200;
|
||||||
sky-color = "#080010";
|
sky-color = "#080010";
|
||||||
void-color = "#080010";
|
void-color = "#080010";
|
||||||
sky-light = 1;
|
|
||||||
ambient-light = 0.6;
|
ambient-light = 0.6;
|
||||||
|
world-sky-light = 0;
|
||||||
remove-caves-below-y = -10000;
|
remove-caves-below-y = -10000;
|
||||||
cave-detection-ocean-floor = -5;
|
cave-detection-ocean-floor = -5;
|
||||||
};
|
};
|
||||||
@@ -243,36 +213,31 @@ in {
|
|||||||
defaultText = lib.literalExpression ''
|
defaultText = lib.literalExpression ''
|
||||||
{
|
{
|
||||||
"overworld".settings = {
|
"overworld".settings = {
|
||||||
world = cfg.defaultWorld;
|
world = "''${cfg.defaultWorld}";
|
||||||
name = "Overworld";
|
|
||||||
dimension = "minecraft:overworld";
|
|
||||||
ambient-light = 0.1;
|
ambient-light = 0.1;
|
||||||
cave-detection-ocean-floor = -5;
|
cave-detection-ocean-floor = -5;
|
||||||
};
|
};
|
||||||
|
|
||||||
"nether".settings = {
|
"nether".settings = {
|
||||||
world = cfg.defaultWorld;
|
world = "''${cfg.defaultWorld}/DIM-1";
|
||||||
dimension = "minecraft:the_nether";
|
|
||||||
name = "Nether";
|
|
||||||
sorting = 100;
|
sorting = 100;
|
||||||
sky-color = "#290000";
|
sky-color = "#290000";
|
||||||
void-color = "#150000";
|
void-color = "#150000";
|
||||||
sky-light = 1;
|
|
||||||
ambient-light = 0.6;
|
ambient-light = 0.6;
|
||||||
|
world-sky-light = 0;
|
||||||
remove-caves-below-y = -10000;
|
remove-caves-below-y = -10000;
|
||||||
cave-detection-ocean-floor = -5;
|
cave-detection-ocean-floor = -5;
|
||||||
cave-detection-uses-block-light = true;
|
cave-detection-uses-block-light = true;
|
||||||
|
max-y = 90;
|
||||||
};
|
};
|
||||||
|
|
||||||
"end".settings = {
|
"end".settings = {
|
||||||
world = cfg.defaultWorld;
|
world = "''${cfg.defaultWorld}/DIM1";
|
||||||
name = "The End";
|
|
||||||
dimension = "minecraft:the_end";
|
|
||||||
sorting = 200;
|
sorting = 200;
|
||||||
sky-color = "#080010";
|
sky-color = "#080010";
|
||||||
void-color = "#080010";
|
void-color = "#080010";
|
||||||
sky-light = 1;
|
|
||||||
ambient-light = 0.6;
|
ambient-light = 0.6;
|
||||||
|
world-sky-light = 0;
|
||||||
remove-caves-below-y = -10000;
|
remove-caves-below-y = -10000;
|
||||||
cave-detection-ocean-floor = -5;
|
cave-detection-ocean-floor = -5;
|
||||||
};
|
};
|
||||||
@@ -300,7 +265,7 @@ in {
|
|||||||
description = ''
|
description = ''
|
||||||
Where the rendered map will be stored.
|
Where the rendered map will be stored.
|
||||||
Unless you are doing something advanced you should probably leave this alone and configure webRoot instead.
|
Unless you are doing something advanced you should probably leave this alone and configure webRoot instead.
|
||||||
[See upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/tree/master/common/src/main/resources/de/bluecolored/bluemap/config/storages)
|
[See upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/tree/master/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/storages)
|
||||||
'';
|
'';
|
||||||
default = {
|
default = {
|
||||||
"file" = {
|
"file" = {
|
||||||
@@ -316,12 +281,12 @@ in {
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
packs = mkOption {
|
resourcepacks = mkOption {
|
||||||
type = lib.types.path;
|
type = lib.types.path;
|
||||||
default = pkgs.linkFarm "packs" { };
|
default = pkgs.linkFarm "resourcepacks" { };
|
||||||
description = ''
|
description = ''
|
||||||
A set of resourcepacks, datapacks, and mods to extract resources from, loaded in alphabetical order.
|
A set of resourcepacks/mods to extract models from loaded in alphabetical order.
|
||||||
Can be overriden on a per-map basis with `services.bluemap.maps.<name>.packs`.
|
Can be overriden on a per-map basis with `services.bluemap.maps.<name>.resourcepacks`.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -342,23 +307,12 @@ in {
|
|||||||
systemd.services."render-bluemap-maps" = lib.mkIf cfg.enableRender {
|
systemd.services."render-bluemap-maps" = lib.mkIf cfg.enableRender {
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
Type = "oneshot";
|
Type = "oneshot";
|
||||||
CPUSchedulingPolicy = "batch";
|
|
||||||
Group = "nginx";
|
Group = "nginx";
|
||||||
UMask = "026";
|
UMask = "026";
|
||||||
ExecStart = [
|
|
||||||
# If web folder doesnt exist generate it
|
|
||||||
''|test -f "${cfg.webRoot}" || ${lib.getExe cfg.package} -c ${webappConfigFolder} -gs''
|
|
||||||
]
|
|
||||||
++
|
|
||||||
# Render each minecraft map
|
|
||||||
lib.attrsets.mapAttrsToList
|
|
||||||
(name: value: "${lib.getExe cfg.package} -c ${renderConfigFolder name value} -r")
|
|
||||||
cfg.maps
|
|
||||||
++ [
|
|
||||||
# Generate updated webapp
|
|
||||||
"${lib.getExe cfg.package} -c ${webappConfigFolder} -gs"
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
|
script = lib.strings.concatStringsSep "\n" ((lib.attrsets.mapAttrsToList
|
||||||
|
(name: value: "${lib.getExe pkgs.bluemap} -c ${renderConfigFolder name value} -r")
|
||||||
|
cfg.maps) ++ [ "${lib.getExe pkgs.bluemap} -c ${webappConfigFolder} -gs" ]);
|
||||||
};
|
};
|
||||||
|
|
||||||
systemd.timers."render-bluemap-maps" = lib.mkIf cfg.enableRender {
|
systemd.timers."render-bluemap-maps" = lib.mkIf cfg.enableRender {
|
||||||
@@ -15,8 +15,8 @@ let
|
|||||||
enable = true;
|
enable = true;
|
||||||
name = "git-runner-${name}"; url = "https://git.pvv.ntnu.no";
|
name = "git-runner-${name}"; url = "https://git.pvv.ntnu.no";
|
||||||
labels = [
|
labels = [
|
||||||
"debian-latest:docker://node:current-bookworm"
|
"debian-latest:docker://node:18-bullseye"
|
||||||
"ubuntu-latest:docker://node:current-bookworm"
|
"ubuntu-latest:docker://node:18-bullseye"
|
||||||
];
|
];
|
||||||
tokenFile = config.sops.secrets."gitea/runners/${name}".path;
|
tokenFile = config.sops.secrets."gitea/runners/${name}".path;
|
||||||
};
|
};
|
||||||
@@ -27,15 +27,5 @@ lib.mkMerge [
|
|||||||
(mkRunner "alpha")
|
(mkRunner "alpha")
|
||||||
(mkRunner "beta")
|
(mkRunner "beta")
|
||||||
(mkRunner "epsilon")
|
(mkRunner "epsilon")
|
||||||
{
|
{ virtualisation.podman.enable = true; }
|
||||||
virtualisation.podman = {
|
|
||||||
enable = true;
|
|
||||||
defaultNetwork.settings.dns_enabled = true;
|
|
||||||
autoPrune.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
networking.dhcpcd.IPv6rs = false;
|
|
||||||
|
|
||||||
networking.firewall.interfaces."podman+".allowedUDPPorts = [53 5353];
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
190
hosts/bekkalokk/services/gitea/default.nix
Normal file
190
hosts/bekkalokk/services/gitea/default.nix
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
{ config, values, fp, pkgs, lib, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.services.gitea;
|
||||||
|
domain = "git.pvv.ntnu.no";
|
||||||
|
sshPort = 2222;
|
||||||
|
in {
|
||||||
|
imports = [
|
||||||
|
./ci.nix
|
||||||
|
./import-users
|
||||||
|
./web-secret-provider
|
||||||
|
];
|
||||||
|
|
||||||
|
sops.secrets = {
|
||||||
|
"gitea/database" = {
|
||||||
|
owner = "gitea";
|
||||||
|
group = "gitea";
|
||||||
|
};
|
||||||
|
"gitea/email-password" = {
|
||||||
|
owner = "gitea";
|
||||||
|
group = "gitea";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.gitea = {
|
||||||
|
enable = true;
|
||||||
|
appName = "PVV Git";
|
||||||
|
|
||||||
|
database = {
|
||||||
|
type = "postgres";
|
||||||
|
host = "postgres.pvv.ntnu.no";
|
||||||
|
port = config.services.postgresql.settings.port;
|
||||||
|
passwordFile = config.sops.secrets."gitea/database".path;
|
||||||
|
createDatabase = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
mailerPasswordFile = config.sops.secrets."gitea/email-password".path;
|
||||||
|
|
||||||
|
# https://docs.gitea.com/administration/config-cheat-sheet
|
||||||
|
settings = {
|
||||||
|
server = {
|
||||||
|
DOMAIN = domain;
|
||||||
|
ROOT_URL = "https://${domain}/";
|
||||||
|
PROTOCOL = "http+unix";
|
||||||
|
SSH_PORT = sshPort;
|
||||||
|
START_SSH_SERVER = true;
|
||||||
|
START_LFS_SERVER = true;
|
||||||
|
LANDING_PAGE = "explore";
|
||||||
|
};
|
||||||
|
mailer = {
|
||||||
|
ENABLED = true;
|
||||||
|
FROM = "gitea@pvv.ntnu.no";
|
||||||
|
PROTOCOL = "smtp";
|
||||||
|
SMTP_ADDR = "smtp.pvv.ntnu.no";
|
||||||
|
SMTP_PORT = 587;
|
||||||
|
USER = "gitea@pvv.ntnu.no";
|
||||||
|
SUBJECT_PREFIX = "[pvv-git]";
|
||||||
|
};
|
||||||
|
metrics = {
|
||||||
|
ENABLED = true;
|
||||||
|
ENABLED_ISSUE_BY_LABEL = true;
|
||||||
|
ENABLED_ISSUE_BY_REPOSITORY = true;
|
||||||
|
};
|
||||||
|
indexer.REPO_INDEXER_ENABLED = true;
|
||||||
|
service = {
|
||||||
|
DISABLE_REGISTRATION = true;
|
||||||
|
ENABLE_NOTIFY_MAIL = true;
|
||||||
|
AUTO_WATCH_NEW_REPOS = false;
|
||||||
|
};
|
||||||
|
admin.DEFAULT_EMAIL_NOTIFICATIONS = "onmention";
|
||||||
|
session.COOKIE_SECURE = true;
|
||||||
|
database.LOG_SQL = false;
|
||||||
|
repository = {
|
||||||
|
PREFERRED_LICENSES = lib.concatStringsSep "," [
|
||||||
|
"AGPL-3.0-only"
|
||||||
|
"AGPL-3.0-or-later"
|
||||||
|
"Apache-2.0"
|
||||||
|
"BSD-3-Clause"
|
||||||
|
"CC-BY-4.0"
|
||||||
|
"CC-BY-NC-4.0"
|
||||||
|
"CC-BY-NC-ND-4.0"
|
||||||
|
"CC-BY-NC-SA-4.0"
|
||||||
|
"CC-BY-ND-4.0"
|
||||||
|
"CC-BY-SA-4.0"
|
||||||
|
"CC0-1.0"
|
||||||
|
"GPL-2.0-only"
|
||||||
|
"GPL-3.0-only"
|
||||||
|
"GPL-3.0-or-later"
|
||||||
|
"LGPL-3.0-linking-exception"
|
||||||
|
"LGPL-3.0-only"
|
||||||
|
"LGPL-3.0-or-later"
|
||||||
|
"MIT"
|
||||||
|
"MPL-2.0"
|
||||||
|
"Unlicense"
|
||||||
|
];
|
||||||
|
DEFAULT_REPO_UNITS = lib.concatStringsSep "," [
|
||||||
|
"repo.code"
|
||||||
|
"repo.issues"
|
||||||
|
"repo.pulls"
|
||||||
|
"repo.releases"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
picture = {
|
||||||
|
DISABLE_GRAVATAR = true;
|
||||||
|
ENABLE_FEDERATED_AVATAR = false;
|
||||||
|
};
|
||||||
|
actions.ENABLED = true;
|
||||||
|
ui = {
|
||||||
|
REACTIONS = lib.concatStringsSep "," [
|
||||||
|
"+1"
|
||||||
|
"-1"
|
||||||
|
"laugh"
|
||||||
|
"confused"
|
||||||
|
"heart"
|
||||||
|
"hooray"
|
||||||
|
"rocket"
|
||||||
|
"eyes"
|
||||||
|
"100"
|
||||||
|
"anger"
|
||||||
|
"astonished"
|
||||||
|
"no_good"
|
||||||
|
"ok_hand"
|
||||||
|
"pensive"
|
||||||
|
"pizza"
|
||||||
|
"point_up"
|
||||||
|
"sob"
|
||||||
|
"skull"
|
||||||
|
"upside_down_face"
|
||||||
|
"shrug"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
"ui.meta".DESCRIPTION = "Bokstavelig talt programvareverkstedet";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = [ cfg.package ];
|
||||||
|
|
||||||
|
services.nginx.virtualHosts."${domain}" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
kTLS = true;
|
||||||
|
locations = {
|
||||||
|
"/" = {
|
||||||
|
proxyPass = "http://unix:${cfg.settings.server.HTTP_ADDR}";
|
||||||
|
extraConfig = ''
|
||||||
|
client_max_body_size 512M;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
"/metrics" = {
|
||||||
|
proxyPass = "http://unix:${cfg.settings.server.HTTP_ADDR}";
|
||||||
|
extraConfig = ''
|
||||||
|
allow ${values.hosts.ildkule.ipv4}/32;
|
||||||
|
deny all;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [ sshPort ];
|
||||||
|
|
||||||
|
# Extra customization
|
||||||
|
|
||||||
|
services.gitea-themes.monokai = pkgs.gitea-theme-monokai;
|
||||||
|
|
||||||
|
systemd.services.install-gitea-customization = {
|
||||||
|
description = "Install extra customization in gitea's CUSTOM_DIR";
|
||||||
|
wantedBy = [ "gitea.service" ];
|
||||||
|
requiredBy = [ "gitea.service" ];
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
User = cfg.user;
|
||||||
|
Group = cfg.group;
|
||||||
|
};
|
||||||
|
|
||||||
|
script = let
|
||||||
|
logo-svg = fp /assets/logo_blue_regular.svg;
|
||||||
|
logo-png = fp /assets/logo_blue_regular.png;
|
||||||
|
extraLinks = pkgs.writeText "gitea-extra-links.tmpl" ''
|
||||||
|
<a class="item" href="https://www.pvv.ntnu.no/">PVV</a>
|
||||||
|
<a class="item" href="https://wiki.pvv.ntnu.no/">Wiki</a>
|
||||||
|
<a class="item" href="https://git.pvv.ntnu.no/Drift/-/projects/4">Tokyo Drift Issues</a>
|
||||||
|
'';
|
||||||
|
in ''
|
||||||
|
install -Dm444 ${logo-svg} ${cfg.customDir}/public/assets/img/logo.svg
|
||||||
|
install -Dm444 ${logo-png} ${cfg.customDir}/public/assets/img/logo.png
|
||||||
|
install -Dm444 ${./loading.apng} ${cfg.customDir}/public/assets/img/loading.png
|
||||||
|
install -Dm444 ${extraLinks} ${cfg.customDir}/templates/custom/extra_links.tmpl
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -11,8 +11,7 @@ in
|
|||||||
|
|
||||||
systemd.services.gitea-import-users = lib.mkIf cfg.enable {
|
systemd.services.gitea-import-users = lib.mkIf cfg.enable {
|
||||||
enable = true;
|
enable = true;
|
||||||
preStart=''${pkgs.rsync}/bin/rsync -e "${pkgs.openssh}/bin/ssh -o UserKnownHostsFile=$CREDENTIALS_DIRECTORY/ssh-known-hosts -i $CREDENTIALS_DIRECTORY/sshkey" -a pvv@smtp.pvv.ntnu.no:/etc/passwd /run/gitea-import-users/passwd'';
|
preStart=''${pkgs.rsync}/bin/rsync -e "${pkgs.openssh}/bin/ssh -o UserKnownHostsFile=$CREDENTIALS_DIRECTORY/ssh-known-hosts -i $CREDENTIALS_DIRECTORY/sshkey" -a pvv@smtp.pvv.ntnu.no:/etc/passwd /tmp/passwd-import'';
|
||||||
environment.PASSWD_FILE_PATH = "/run/gitea-import-users/passwd";
|
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStart = pkgs.writers.writePython3 "gitea-import-users" {
|
ExecStart = pkgs.writers.writePython3 "gitea-import-users" {
|
||||||
flakeIgnore = [
|
flakeIgnore = [
|
||||||
@@ -26,7 +25,6 @@ in
|
|||||||
];
|
];
|
||||||
DynamicUser="yes";
|
DynamicUser="yes";
|
||||||
EnvironmentFile=config.sops.secrets."gitea/import-user-env".path;
|
EnvironmentFile=config.sops.secrets."gitea/import-user-env".path;
|
||||||
RuntimeDirectory = "gitea-import-users";
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -17,10 +17,6 @@ GITEA_API_URL = os.getenv('GITEA_API_URL')
|
|||||||
if GITEA_API_URL is None:
|
if GITEA_API_URL is None:
|
||||||
GITEA_API_URL = 'https://git.pvv.ntnu.no/api/v1'
|
GITEA_API_URL = 'https://git.pvv.ntnu.no/api/v1'
|
||||||
|
|
||||||
PASSWD_FILE_PATH = os.getenv('PASSWD_FILE_PATH')
|
|
||||||
if PASSWD_FILE_PATH is None:
|
|
||||||
PASSWD_FILE_PATH = '/tmp/passwd-import'
|
|
||||||
|
|
||||||
|
|
||||||
def gitea_list_all_users() -> dict[str, dict[str, any]] | None:
|
def gitea_list_all_users() -> dict[str, dict[str, any]] | None:
|
||||||
r = requests.get(
|
r = requests.get(
|
||||||
@@ -181,7 +177,6 @@ def ensure_gitea_user_is_part_of_team(
|
|||||||
# List of teams that all users should be part of by default
|
# List of teams that all users should be part of by default
|
||||||
COMMON_USER_TEAMS = [
|
COMMON_USER_TEAMS = [
|
||||||
("Projects", "Members"),
|
("Projects", "Members"),
|
||||||
("Grzegorz", "Members"),
|
|
||||||
("Kurs", "Members"),
|
("Kurs", "Members"),
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -191,8 +186,7 @@ def main():
|
|||||||
if existing_users is None:
|
if existing_users is None:
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
print(f"Reading passwd entries from {PASSWD_FILE_PATH}")
|
for username, name in passwd_file_parser("/tmp/passwd-import"):
|
||||||
for username, name in passwd_file_parser(PASSWD_FILE_PATH):
|
|
||||||
print(f"Processing {username}")
|
print(f"Processing {username}")
|
||||||
add_or_patch_gitea_user(username, name, existing_users)
|
add_or_patch_gitea_user(username, name, existing_users)
|
||||||
for org, team_name in COMMON_USER_TEAMS:
|
for org, team_name in COMMON_USER_TEAMS:
|
||||||
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
@@ -3,7 +3,6 @@ let
|
|||||||
organizations = [
|
organizations = [
|
||||||
"Drift"
|
"Drift"
|
||||||
"Projects"
|
"Projects"
|
||||||
"Grzegorz"
|
|
||||||
"Kurs"
|
"Kurs"
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -28,7 +27,6 @@ in
|
|||||||
users.users."gitea-web" = {
|
users.users."gitea-web" = {
|
||||||
group = "gitea-web";
|
group = "gitea-web";
|
||||||
isSystemUser = true;
|
isSystemUser = true;
|
||||||
shell = pkgs.bash;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
sops.secrets."gitea/web-secret-provider/token" = {
|
sops.secrets."gitea/web-secret-provider/token" = {
|
||||||
@@ -60,7 +58,6 @@ in
|
|||||||
key-dir = "/var/lib/gitea-web/keys/%i";
|
key-dir = "/var/lib/gitea-web/keys/%i";
|
||||||
authorized-keys-path = "/var/lib/gitea-web/authorized_keys.d/%i";
|
authorized-keys-path = "/var/lib/gitea-web/authorized_keys.d/%i";
|
||||||
rrsync-script = pkgs.writeShellScript "rrsync-chown" ''
|
rrsync-script = pkgs.writeShellScript "rrsync-chown" ''
|
||||||
mkdir -p "$1"
|
|
||||||
${lib.getExe pkgs.rrsync} -wo "$1"
|
${lib.getExe pkgs.rrsync} -wo "$1"
|
||||||
${pkgs.coreutils}/bin/chown -R gitea-web:gitea-web "$1"
|
${pkgs.coreutils}/bin/chown -R gitea-web:gitea-web "$1"
|
||||||
'';
|
'';
|
||||||
@@ -34,21 +34,7 @@ def get_org_repo_list(args: argparse.Namespace, token: str):
|
|||||||
f"{args.api_url}/orgs/{args.org}/repos",
|
f"{args.api_url}/orgs/{args.org}/repos",
|
||||||
headers = { 'Authorization': 'token ' + token },
|
headers = { 'Authorization': 'token ' + token },
|
||||||
)
|
)
|
||||||
|
return [repo["name"] for repo in result.json()]
|
||||||
results = [repo["name"] for repo in result.json()]
|
|
||||||
target = int(result.headers['X-Total-Count'])
|
|
||||||
|
|
||||||
i = 2
|
|
||||||
while len(results) < target:
|
|
||||||
result = requests.get(
|
|
||||||
f"{args.api_url}/orgs/{args.org}/repos",
|
|
||||||
params = { 'page': i },
|
|
||||||
headers = { 'Authorization': 'token ' + token },
|
|
||||||
)
|
|
||||||
results += [repo["name"] for repo in result.json()]
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
return results
|
|
||||||
|
|
||||||
|
|
||||||
def generate_ssh_key(args: argparse.Namespace, repository: str):
|
def generate_ssh_key(args: argparse.Namespace, repository: str):
|
||||||
88
hosts/bekkalokk/services/kerberos/krb5-conf-format.nix
Normal file
88
hosts/bekkalokk/services/kerberos/krb5-conf-format.nix
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
{ pkgs, lib, ... }:
|
||||||
|
|
||||||
|
# Based on
|
||||||
|
# - https://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/krb5_conf.html
|
||||||
|
# - https://manpages.debian.org/unstable/heimdal-docs/krb5.conf.5heimdal.en.html
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (lib) boolToString concatMapStringsSep concatStringsSep filter
|
||||||
|
isAttrs isBool isList mapAttrsToList mdDoc mkOption singleton splitString;
|
||||||
|
inherit (lib.types) attrsOf bool coercedTo either int listOf oneOf path
|
||||||
|
str submodule;
|
||||||
|
in
|
||||||
|
{ }: {
|
||||||
|
type = let
|
||||||
|
section = attrsOf relation;
|
||||||
|
relation = either (attrsOf value) value;
|
||||||
|
value = either (listOf atom) atom;
|
||||||
|
atom = oneOf [int str bool];
|
||||||
|
in submodule {
|
||||||
|
freeformType = attrsOf section;
|
||||||
|
options = {
|
||||||
|
include = mkOption {
|
||||||
|
default = [ ];
|
||||||
|
description = mdDoc ''
|
||||||
|
Files to include in the Kerberos configuration.
|
||||||
|
'';
|
||||||
|
type = coercedTo path singleton (listOf path);
|
||||||
|
};
|
||||||
|
includedir = mkOption {
|
||||||
|
default = [ ];
|
||||||
|
description = mdDoc ''
|
||||||
|
Directories containing files to include in the Kerberos configuration.
|
||||||
|
'';
|
||||||
|
type = coercedTo path singleton (listOf path);
|
||||||
|
};
|
||||||
|
module = mkOption {
|
||||||
|
default = [ ];
|
||||||
|
description = mdDoc ''
|
||||||
|
Modules to obtain Kerberos configuration from.
|
||||||
|
'';
|
||||||
|
type = coercedTo path singleton (listOf path);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
generate = let
|
||||||
|
indent = str: concatMapStringsSep "\n" (line: " " + line) (splitString "\n" str);
|
||||||
|
|
||||||
|
formatToplevel = args @ {
|
||||||
|
include ? [ ],
|
||||||
|
includedir ? [ ],
|
||||||
|
module ? [ ],
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
sections = removeAttrs args [ "include" "includedir" "module" ];
|
||||||
|
in concatStringsSep "\n" (filter (x: x != "") [
|
||||||
|
(concatStringsSep "\n" (mapAttrsToList formatSection sections))
|
||||||
|
(concatMapStringsSep "\n" (m: "module ${m}") module)
|
||||||
|
(concatMapStringsSep "\n" (i: "include ${i}") include)
|
||||||
|
(concatMapStringsSep "\n" (i: "includedir ${i}") includedir)
|
||||||
|
]);
|
||||||
|
|
||||||
|
formatSection = name: section: ''
|
||||||
|
[${name}]
|
||||||
|
${indent (concatStringsSep "\n" (mapAttrsToList formatRelation section))}
|
||||||
|
'';
|
||||||
|
|
||||||
|
formatRelation = name: relation:
|
||||||
|
if isAttrs relation
|
||||||
|
then ''
|
||||||
|
${name} = {
|
||||||
|
${indent (concatStringsSep "\n" (mapAttrsToList formatValue relation))}
|
||||||
|
}''
|
||||||
|
else formatValue name relation;
|
||||||
|
|
||||||
|
formatValue = name: value:
|
||||||
|
if isList value
|
||||||
|
then concatMapStringsSep "\n" (formatAtom name) value
|
||||||
|
else formatAtom name value;
|
||||||
|
|
||||||
|
formatAtom = name: atom: let
|
||||||
|
v = if isBool atom then boolToString atom else toString atom;
|
||||||
|
in "${name} = ${v}";
|
||||||
|
in
|
||||||
|
name: value: pkgs.writeText name ''
|
||||||
|
${formatToplevel value}
|
||||||
|
'';
|
||||||
|
}
|
||||||
90
hosts/bekkalokk/services/kerberos/krb5.nix
Normal file
90
hosts/bekkalokk/services/kerberos/krb5.nix
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib) mdDoc mkIf mkOption mkPackageOption mkRemovedOptionModule;
|
||||||
|
inherit (lib.types) bool;
|
||||||
|
|
||||||
|
mkRemovedOptionModule' = name: reason: mkRemovedOptionModule ["krb5" name] reason;
|
||||||
|
mkRemovedOptionModuleCfg = name: mkRemovedOptionModule' name ''
|
||||||
|
The option `krb5.${name}' has been removed. Use
|
||||||
|
`security.krb5.settings.${name}' for structured configuration.
|
||||||
|
'';
|
||||||
|
|
||||||
|
cfg = config.security.krb5;
|
||||||
|
format = import ./krb5-conf-format.nix { inherit pkgs lib; } { };
|
||||||
|
in {
|
||||||
|
imports = [
|
||||||
|
(mkRemovedOptionModuleCfg "libdefaults")
|
||||||
|
(mkRemovedOptionModuleCfg "realms")
|
||||||
|
(mkRemovedOptionModuleCfg "domain_realm")
|
||||||
|
(mkRemovedOptionModuleCfg "capaths")
|
||||||
|
(mkRemovedOptionModuleCfg "appdefaults")
|
||||||
|
(mkRemovedOptionModuleCfg "plugins")
|
||||||
|
(mkRemovedOptionModuleCfg "config")
|
||||||
|
(mkRemovedOptionModuleCfg "extraConfig")
|
||||||
|
(mkRemovedOptionModule' "kerberos" ''
|
||||||
|
The option `krb5.kerberos' has been moved to `security.krb5.package'.
|
||||||
|
'')
|
||||||
|
];
|
||||||
|
|
||||||
|
options = {
|
||||||
|
security.krb5 = {
|
||||||
|
enable = mkOption {
|
||||||
|
default = false;
|
||||||
|
description = mdDoc "Enable and configure Kerberos utilities";
|
||||||
|
type = bool;
|
||||||
|
};
|
||||||
|
|
||||||
|
package = mkPackageOption pkgs "krb5" {
|
||||||
|
example = "heimdal";
|
||||||
|
};
|
||||||
|
|
||||||
|
settings = mkOption {
|
||||||
|
default = { };
|
||||||
|
type = format.type;
|
||||||
|
description = mdDoc ''
|
||||||
|
Structured contents of the {file}`krb5.conf` file. See
|
||||||
|
{manpage}`krb5.conf(5)` for details about configuration.
|
||||||
|
'';
|
||||||
|
example = {
|
||||||
|
include = [ "/run/secrets/secret-krb5.conf" ];
|
||||||
|
includedir = [ "/run/secrets/secret-krb5.conf.d" ];
|
||||||
|
|
||||||
|
libdefaults = {
|
||||||
|
default_realm = "ATHENA.MIT.EDU";
|
||||||
|
};
|
||||||
|
|
||||||
|
realms = {
|
||||||
|
"ATHENA.MIT.EDU" = {
|
||||||
|
admin_server = "athena.mit.edu";
|
||||||
|
kdc = [
|
||||||
|
"athena01.mit.edu"
|
||||||
|
"athena02.mit.edu"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
domain_realm = {
|
||||||
|
"mit.edu" = "ATHENA.MIT.EDU";
|
||||||
|
};
|
||||||
|
|
||||||
|
logging = {
|
||||||
|
kdc = "SYSLOG:NOTICE";
|
||||||
|
admin_server = "SYSLOG:NOTICE";
|
||||||
|
default = "SYSLOG:NOTICE";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
environment = {
|
||||||
|
systemPackages = [ cfg.package ];
|
||||||
|
etc."krb5.conf".source = format.generate "krb5.conf" cfg.settings;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
meta.maintainers = builtins.attrValues {
|
||||||
|
inherit (lib.maintainers) dblsaiko h7x4;
|
||||||
|
};
|
||||||
|
}
|
||||||
1543
hosts/bekkalokk/services/kerberos/pam.nix
Normal file
1543
hosts/bekkalokk/services/kerberos/pam.nix
Normal file
File diff suppressed because it is too large
Load Diff
@@ -61,6 +61,7 @@ in {
|
|||||||
user = "mediawiki";
|
user = "mediawiki";
|
||||||
passwordFile = config.sops.secrets."mediawiki/postgres_password".path;
|
passwordFile = config.sops.secrets."mediawiki/postgres_password".path;
|
||||||
createLocally = false;
|
createLocally = false;
|
||||||
|
# TODO: create a normal database and copy over old data when the service is production ready
|
||||||
name = "mediawiki";
|
name = "mediawiki";
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -130,12 +131,6 @@ in {
|
|||||||
$wgVectorDefaultSidebarVisibleForAnonymousUser = true;
|
$wgVectorDefaultSidebarVisibleForAnonymousUser = true;
|
||||||
$wgVectorResponsive = true;
|
$wgVectorResponsive = true;
|
||||||
|
|
||||||
# Experimental dark mode support for Vector 2022
|
|
||||||
$wgVectorNightMode['beta'] = true;
|
|
||||||
$wgVectorNightMode['logged_out'] = true;
|
|
||||||
$wgVectorNightMode['logged_in'] = true;
|
|
||||||
$wgDefaultUserOptions['vector-theme'] = 'os';
|
|
||||||
|
|
||||||
# Misc
|
# Misc
|
||||||
$wgEmergencyContact = "${cfg.passwordSender}";
|
$wgEmergencyContact = "${cfg.passwordSender}";
|
||||||
$wgUseTeX = false;
|
$wgUseTeX = false;
|
||||||
@@ -220,11 +215,11 @@ in {
|
|||||||
"= /favicon.ico".alias = pkgs.runCommandLocal "mediawiki-favicon.ico" {
|
"= /favicon.ico".alias = pkgs.runCommandLocal "mediawiki-favicon.ico" {
|
||||||
buildInputs = with pkgs; [ imagemagick ];
|
buildInputs = with pkgs; [ imagemagick ];
|
||||||
} ''
|
} ''
|
||||||
magick \
|
convert \
|
||||||
${fp /assets/logo_blue_regular.png} \
|
|
||||||
-resize x64 \
|
-resize x64 \
|
||||||
-gravity center \
|
-gravity center \
|
||||||
-crop 64x64+0+0 \
|
-crop 64x64+0+0 \
|
||||||
|
${fp /assets/logo_blue_regular.png} \
|
||||||
-flatten \
|
-flatten \
|
||||||
-colors 256 \
|
-colors 256 \
|
||||||
-background transparent \
|
-background transparent \
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ in {
|
|||||||
ProtectKernelLogs = true;
|
ProtectKernelLogs = true;
|
||||||
ProtectKernelModules = true;
|
ProtectKernelModules = true;
|
||||||
ProtectKernelTunables = true;
|
ProtectKernelTunables = true;
|
||||||
|
ProtectProc = "invisible";
|
||||||
RestrictAddressFamilies = [
|
RestrictAddressFamilies = [
|
||||||
"AF_INET"
|
"AF_INET"
|
||||||
"AF_INET6"
|
"AF_INET6"
|
||||||
@@ -97,6 +98,7 @@ in {
|
|||||||
"@system-service"
|
"@system-service"
|
||||||
"~@privileged"
|
"~@privileged"
|
||||||
];
|
];
|
||||||
|
UMask = "0007";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ in
|
|||||||
custom_from
|
custom_from
|
||||||
]);
|
]);
|
||||||
|
|
||||||
dicts = with pkgs.aspellDicts; [ en en-computers nb nn fr de it ];
|
dicts = with pkgs.aspellDicts; [ en en-science en-computers nb nn fr de it ];
|
||||||
maxAttachmentSize = 20;
|
maxAttachmentSize = 20;
|
||||||
hostName = "roundcubeplaceholder.example.com";
|
hostName = "roundcubeplaceholder.example.com";
|
||||||
|
|
||||||
|
|||||||
@@ -18,16 +18,11 @@ in {
|
|||||||
restartUnits = [ "phpfpm-pvv-nettsiden.service" ];
|
restartUnits = [ "phpfpm-pvv-nettsiden.service" ];
|
||||||
});
|
});
|
||||||
|
|
||||||
security.acme.certs."www.pvv.ntnu.no" = {
|
|
||||||
extraDomainNames = [
|
|
||||||
"pvv.ntnu.no"
|
|
||||||
"www.pvv.org"
|
|
||||||
"pvv.org"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
services.idp.sp-remote-metadata = [
|
services.idp.sp-remote-metadata = [
|
||||||
"https://www.pvv.ntnu.no/simplesaml/"
|
"https://www.pvv.ntnu.no/simplesaml/"
|
||||||
|
"https://pvv.ntnu.no/simplesaml/"
|
||||||
|
"https://www.pvv.org/simplesaml/"
|
||||||
|
"https://pvv.org/simplesaml/"
|
||||||
];
|
];
|
||||||
|
|
||||||
services.pvv-nettsiden = {
|
services.pvv-nettsiden = {
|
||||||
@@ -72,9 +67,7 @@ in {
|
|||||||
ADMIN_NAME = "PVV Drift";
|
ADMIN_NAME = "PVV Drift";
|
||||||
ADMIN_EMAIL = "drift@pvv.ntnu.no";
|
ADMIN_EMAIL = "drift@pvv.ntnu.no";
|
||||||
ADMIN_PASSWORD = includeFromSops "simplesamlphp/admin_password";
|
ADMIN_PASSWORD = includeFromSops "simplesamlphp/admin_password";
|
||||||
TRUSTED_DOMAINS = [
|
TRUSTED_DOMAINS = [ cfg.domainName ];
|
||||||
"www.pvv.ntnu.no"
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -85,28 +78,13 @@ in {
|
|||||||
"catch_workers_output" = true;
|
"catch_workers_output" = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
services.nginx.virtualHosts."pvv.ntnu.no" = {
|
|
||||||
globalRedirect = cfg.domainName;
|
|
||||||
redirectCode = 307;
|
|
||||||
forceSSL = true;
|
|
||||||
useACMEHost = "www.pvv.ntnu.no";
|
|
||||||
};
|
|
||||||
|
|
||||||
services.nginx.virtualHosts."www.pvv.org" = {
|
|
||||||
globalRedirect = cfg.domainName;
|
|
||||||
redirectCode = 307;
|
|
||||||
forceSSL = true;
|
|
||||||
useACMEHost = "www.pvv.ntnu.no";
|
|
||||||
};
|
|
||||||
|
|
||||||
services.nginx.virtualHosts."pvv.org" = {
|
|
||||||
globalRedirect = cfg.domainName;
|
|
||||||
redirectCode = 307;
|
|
||||||
forceSSL = true;
|
|
||||||
useACMEHost = "www.pvv.ntnu.no";
|
|
||||||
};
|
|
||||||
|
|
||||||
services.nginx.virtualHosts.${cfg.domainName} = {
|
services.nginx.virtualHosts.${cfg.domainName} = {
|
||||||
|
serverAliases = [
|
||||||
|
"pvv.ntnu.no"
|
||||||
|
"www.pvv.org"
|
||||||
|
"pvv.org"
|
||||||
|
];
|
||||||
|
|
||||||
locations = {
|
locations = {
|
||||||
# Proxy home directories
|
# Proxy home directories
|
||||||
"^~ /~" = {
|
"^~ /~" = {
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ in {
|
|||||||
|
|
||||||
echo "Creating thumbnail for $fname"
|
echo "Creating thumbnail for $fname"
|
||||||
mkdir -p $(dirname ".thumbnails/$fname")
|
mkdir -p $(dirname ".thumbnails/$fname")
|
||||||
magick -define jpeg:size=200x200 "$fname" -thumbnail 300 -auto-orient ".thumbnails/$fname.png" ||:
|
convert -define jpeg:size=200x200 "$fname" -thumbnail 300 -auto-orient ".thumbnails/$fname.png" ||:
|
||||||
touch -m -d "$(date -R -r "$fname")" ".thumbnails/$fname.png"
|
touch -m -d "$(date -R -r "$fname")" ".thumbnails/$fname.png"
|
||||||
done <<< "$images"
|
done <<< "$images"
|
||||||
'';
|
'';
|
||||||
|
|||||||
@@ -4,13 +4,13 @@
|
|||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
|
|
||||||
(fp /base)
|
(fp /base)
|
||||||
|
(fp /misc/metrics-exporters.nix)
|
||||||
./services/nginx
|
./services/nginx
|
||||||
|
|
||||||
./services/calendar-bot.nix
|
|
||||||
#./services/git-mirrors
|
|
||||||
./services/minecraft-heatmap.nix
|
|
||||||
./services/mysql.nix
|
./services/mysql.nix
|
||||||
./services/postgres.nix
|
./services/postgres.nix
|
||||||
|
./services/mysql.nix
|
||||||
|
./services/calendar-bot.nix
|
||||||
|
|
||||||
./services/matrix
|
./services/matrix
|
||||||
];
|
];
|
||||||
@@ -20,15 +20,13 @@
|
|||||||
sops.age.keyFile = "/var/lib/sops-nix/key.txt";
|
sops.age.keyFile = "/var/lib/sops-nix/key.txt";
|
||||||
sops.age.generateKey = true;
|
sops.age.generateKey = true;
|
||||||
|
|
||||||
boot.loader.systemd-boot.enable = true;
|
boot.loader.grub.enable = true;
|
||||||
boot.loader.efi.canTouchEfiVariables = true;
|
boot.loader.grub.device = "/dev/disk/by-id/scsi-3600508b1001cb1a8751c137b30610682";
|
||||||
|
|
||||||
networking.hostName = "bicep";
|
networking.hostName = "bicep";
|
||||||
|
|
||||||
#systemd.network.networks."30-enp6s0f0" = values.defaultNetworkConfig // {
|
systemd.network.networks."30-enp6s0f0" = values.defaultNetworkConfig // {
|
||||||
systemd.network.networks."30-ens18" = values.defaultNetworkConfig // {
|
matchConfig.Name = "enp6s0f0";
|
||||||
#matchConfig.Name = "enp6s0f0";
|
|
||||||
matchConfig.Name = "ens18";
|
|
||||||
address = with values.hosts.bicep; [ (ipv4 + "/25") (ipv6 + "/64") ]
|
address = with values.hosts.bicep; [ (ipv4 + "/25") (ipv6 + "/64") ]
|
||||||
++ (with values.services.turn; [ (ipv4 + "/25") (ipv6 + "/64") ]);
|
++ (with values.services.turn; [ (ipv4 + "/25") (ipv6 + "/64") ]);
|
||||||
};
|
};
|
||||||
@@ -39,13 +37,6 @@
|
|||||||
# There are no smart devices
|
# There are no smart devices
|
||||||
services.smartd.enable = false;
|
services.smartd.enable = false;
|
||||||
|
|
||||||
# we are a vm now
|
|
||||||
services.qemuGuest.enable = true;
|
|
||||||
|
|
||||||
# Enable the OpenSSH daemon.
|
|
||||||
services.openssh.enable = true;
|
|
||||||
services.sshguard.enable = true;
|
|
||||||
|
|
||||||
# Do not change, even during upgrades.
|
# Do not change, even during upgrades.
|
||||||
# See https://search.nixos.org/options?show=system.stateVersion
|
# See https://search.nixos.org/options?show=system.stateVersion
|
||||||
system.stateVersion = "22.11";
|
system.stateVersion = "22.11";
|
||||||
|
|||||||
@@ -5,29 +5,22 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
imports =
|
imports =
|
||||||
[ (modulesPath + "/profiles/qemu-guest.nix")
|
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||||
];
|
];
|
||||||
|
|
||||||
boot.initrd.availableKernelModules = [ "ata_piix" "uhci_hcd" "ahci" "sd_mod" "sr_mod" ];
|
boot.initrd.availableKernelModules = [ "uhci_hcd" "ehci_pci" "hpsa" "ohci_pci" "usbhid" "sd_mod" ];
|
||||||
boot.initrd.kernelModules = [ ];
|
boot.initrd.kernelModules = [ ];
|
||||||
boot.kernelModules = [ ];
|
boot.kernelModules = [ "kvm-intel" ];
|
||||||
boot.extraModulePackages = [ ];
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
fileSystems."/" =
|
fileSystems."/" =
|
||||||
{ device = "/dev/disk/by-uuid/20e06202-7a09-47cc-8ef6-5e7afe19453a";
|
{ device = "/dev/disk/by-uuid/31a67903-dc00-448a-a24a-36e820318fe5";
|
||||||
fsType = "ext4";
|
fsType = "ext4";
|
||||||
};
|
};
|
||||||
|
|
||||||
# temp data disk, only 128gb not enough until we can add another disk to the system.
|
|
||||||
fileSystems."/data" =
|
fileSystems."/data" =
|
||||||
{ device = "/dev/disk/by-uuid/c81af266-0781-4084-b8eb-c2587cbcf1ba";
|
{ device = "/dev/disk/by-uuid/79e93eed-ad95-45c9-b115-4ef92afcc8c0";
|
||||||
fsType = "ext4";
|
fsType = "f2fs";
|
||||||
};
|
|
||||||
|
|
||||||
fileSystems."/boot" =
|
|
||||||
{ device = "/dev/disk/by-uuid/198B-E363";
|
|
||||||
fsType = "vfat";
|
|
||||||
options = [ "fmask=0022" "dmask=0022" ];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
swapDevices = [ ];
|
swapDevices = [ ];
|
||||||
@@ -37,7 +30,11 @@
|
|||||||
# still possible to use this option, but it's recommended to use it in conjunction
|
# still possible to use this option, but it's recommended to use it in conjunction
|
||||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||||
networking.useDHCP = lib.mkDefault true;
|
networking.useDHCP = lib.mkDefault true;
|
||||||
# networking.interfaces.ens18.useDHCP = lib.mkDefault true;
|
# networking.interfaces.enp6s0f0.useDHCP = lib.mkDefault true;
|
||||||
|
# networking.interfaces.enp6s0f1.useDHCP = lib.mkDefault true;
|
||||||
|
# networking.interfaces.enp6s0f2.useDHCP = lib.mkDefault true;
|
||||||
|
# networking.interfaces.enp6s0f3.useDHCP = lib.mkDefault true;
|
||||||
|
|
||||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
|
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,100 +0,0 @@
|
|||||||
{ config, pkgs, lib, fp, ... }:
|
|
||||||
let
|
|
||||||
cfg = config.services.gickup;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
sops.secrets."gickup/github-token" = {
|
|
||||||
owner = "gickup";
|
|
||||||
};
|
|
||||||
|
|
||||||
services.gickup = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
dataDir = "/data/gickup";
|
|
||||||
|
|
||||||
destinationSettings = {
|
|
||||||
structured = true;
|
|
||||||
zip = false;
|
|
||||||
keep = 10;
|
|
||||||
bare = true;
|
|
||||||
lfs = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
instances = let
|
|
||||||
defaultGithubConfig = {
|
|
||||||
settings.token_file = config.sops.secrets."gickup/github-token".path;
|
|
||||||
};
|
|
||||||
defaultGitlabConfig = {
|
|
||||||
# settings.token_file = ...
|
|
||||||
};
|
|
||||||
in {
|
|
||||||
"github:Git-Mediawiki/Git-Mediawiki" = defaultGithubConfig;
|
|
||||||
"github:NixOS/nixpkgs" = defaultGithubConfig;
|
|
||||||
"github:go-gitea/gitea" = defaultGithubConfig;
|
|
||||||
"github:heimdal/heimdal" = defaultGithubConfig;
|
|
||||||
"github:saltstack/salt" = defaultGithubConfig;
|
|
||||||
"github:typst/typst" = defaultGithubConfig;
|
|
||||||
"github:unmojang/FjordLauncher" = defaultGithubConfig;
|
|
||||||
"github:unmojang/drasl" = defaultGithubConfig;
|
|
||||||
"github:yushijinhun/authlib-injector" = defaultGithubConfig;
|
|
||||||
|
|
||||||
"gitlab:mx-puppet/discord/better-discord.js" = defaultGitlabConfig;
|
|
||||||
"gitlab:mx-puppet/discord/discord-markdown" = defaultGitlabConfig;
|
|
||||||
"gitlab:mx-puppet/discord/matrix-discord-parser" = defaultGitlabConfig;
|
|
||||||
"gitlab:mx-puppet/discord/mx-puppet-discord" = defaultGitlabConfig;
|
|
||||||
"gitlab:mx-puppet/mx-puppet-bridge" = defaultGitlabConfig;
|
|
||||||
|
|
||||||
"any:glibc" = {
|
|
||||||
settings.url = "https://sourceware.org/git/glibc.git";
|
|
||||||
};
|
|
||||||
|
|
||||||
"any:out-of-your-element" = {
|
|
||||||
settings.url = "https://gitdab.com/cadence/out-of-your-element.git";
|
|
||||||
};
|
|
||||||
|
|
||||||
"any:out-of-your-element-module" = {
|
|
||||||
settings.url = "https://cgit.rory.gay/nix/OOYE-module.git";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services.cgit = let
|
|
||||||
domain = "mirrors.pvv.ntnu.no";
|
|
||||||
in {
|
|
||||||
${domain} = {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.callPackage (fp /packages/cgit.nix) { };
|
|
||||||
group = "gickup";
|
|
||||||
scanPath = "${cfg.dataDir}/linktree";
|
|
||||||
settings = {
|
|
||||||
enable-commit-graph = true;
|
|
||||||
enable-follow-links = true;
|
|
||||||
enable-http-clone = true;
|
|
||||||
enable-remote-branches = true;
|
|
||||||
clone-url = "https://${domain}/$CGIT_REPO_URL";
|
|
||||||
remove-suffix = true;
|
|
||||||
root-title = "PVVSPPP";
|
|
||||||
root-desc = "PVV Speiler Praktisk og Prominent Programvare";
|
|
||||||
snapshots = "all";
|
|
||||||
logo = "/PVV-logo.png";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services.nginx.virtualHosts."mirrors.pvv.ntnu.no" = {
|
|
||||||
forceSSL = true;
|
|
||||||
enableACME = true;
|
|
||||||
|
|
||||||
locations."= /PVV-logo.png".alias = let
|
|
||||||
small-pvv-logo = pkgs.runCommandLocal "pvv-logo-96x96" {
|
|
||||||
nativeBuildInputs = [ pkgs.imagemagick ];
|
|
||||||
} ''
|
|
||||||
magick '${fp /assets/logo_blue_regular.svg}' -resize 96x96 PNG:"$out"
|
|
||||||
'';
|
|
||||||
in toString small-pvv-logo;
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services."fcgiwrap-cgit-mirrors.pvv.ntnu.no" = {
|
|
||||||
serviceConfig.BindReadOnlyPaths = [ cfg.dataDir ];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -6,14 +6,12 @@
|
|||||||
key = "synapse/turnconfig";
|
key = "synapse/turnconfig";
|
||||||
owner = config.users.users.matrix-synapse.name;
|
owner = config.users.users.matrix-synapse.name;
|
||||||
group = config.users.users.matrix-synapse.group;
|
group = config.users.users.matrix-synapse.group;
|
||||||
restartUnits = [ "coturn.service" ];
|
|
||||||
};
|
};
|
||||||
sops.secrets."matrix/coturn/static-auth-secret" = {
|
sops.secrets."matrix/coturn/static-auth-secret" = {
|
||||||
sopsFile = fp /secrets/bicep/matrix.yaml;
|
sopsFile = fp /secrets/bicep/matrix.yaml;
|
||||||
key = "coturn/static-auth-secret";
|
key = "coturn/static-auth-secret";
|
||||||
owner = config.users.users.turnserver.name;
|
owner = config.users.users.turnserver.name;
|
||||||
group = config.users.users.turnserver.group;
|
group = config.users.users.turnserver.group;
|
||||||
restartUnits = [ "coturn.service" ];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
services.matrix-synapse-next = {
|
services.matrix-synapse-next = {
|
||||||
@@ -44,15 +42,12 @@
|
|||||||
|
|
||||||
security.acme.certs.${config.services.coturn.realm} = {
|
security.acme.certs.${config.services.coturn.realm} = {
|
||||||
email = "drift@pvv.ntnu.no";
|
email = "drift@pvv.ntnu.no";
|
||||||
listenHTTP = "${values.services.turn.ipv4}:80";
|
listenHTTP = "129.241.210.213:80";
|
||||||
reloadServices = [ "coturn.service" ];
|
reloadServices = [ "coturn.service" ];
|
||||||
};
|
};
|
||||||
|
|
||||||
users.users.turnserver.extraGroups = [ "acme" ];
|
users.users.turnserver.extraGroups = [ "acme" ];
|
||||||
|
|
||||||
# It needs this to be allowed to access the files with the acme group
|
|
||||||
systemd.services.coturn.serviceConfig.PrivateUsers = lib.mkForce false;
|
|
||||||
|
|
||||||
systemd.services."acme-${config.services.coturn.realm}".serviceConfig = {
|
systemd.services."acme-${config.services.coturn.realm}".serviceConfig = {
|
||||||
AmbientCapabilities = [ "CAP_NET_BIND_SERVICE" ];
|
AmbientCapabilities = [ "CAP_NET_BIND_SERVICE" ];
|
||||||
};
|
};
|
||||||
@@ -71,7 +66,7 @@
|
|||||||
|
|
||||||
listening-ips = [
|
listening-ips = [
|
||||||
values.services.turn.ipv4
|
values.services.turn.ipv4
|
||||||
values.services.turn.ipv6
|
# values.services.turn.ipv6
|
||||||
];
|
];
|
||||||
|
|
||||||
tls-listening-port = 443;
|
tls-listening-port = 443;
|
||||||
|
|||||||
@@ -9,8 +9,7 @@
|
|||||||
./coturn.nix
|
./coturn.nix
|
||||||
./mjolnir.nix
|
./mjolnir.nix
|
||||||
|
|
||||||
# ./discord.nix
|
./discord.nix
|
||||||
./out-of-your-element.nix
|
|
||||||
./hookshot
|
./hookshot
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
services.mx-puppet-discord.enable = false;
|
services.mx-puppet-discord.enable = true;
|
||||||
services.mx-puppet-discord.settings = {
|
services.mx-puppet-discord.settings = {
|
||||||
bridge = {
|
bridge = {
|
||||||
bindAddress = "localhost";
|
bindAddress = "localhost";
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ let
|
|||||||
webhookListenPort = 8435;
|
webhookListenPort = 8435;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
imports = [
|
||||||
|
./module.nix
|
||||||
|
];
|
||||||
|
|
||||||
sops.secrets."matrix/hookshot/as_token" = {
|
sops.secrets."matrix/hookshot/as_token" = {
|
||||||
sopsFile = fp /secrets/bicep/matrix.yaml;
|
sopsFile = fp /secrets/bicep/matrix.yaml;
|
||||||
key = "hookshot/as_token";
|
key = "hookshot/as_token";
|
||||||
@@ -18,7 +22,6 @@ in
|
|||||||
sops.templates."hookshot-registration.yaml" = {
|
sops.templates."hookshot-registration.yaml" = {
|
||||||
owner = config.users.users.matrix-synapse.name;
|
owner = config.users.users.matrix-synapse.name;
|
||||||
group = config.users.groups.keys-matrix-registrations.name;
|
group = config.users.groups.keys-matrix-registrations.name;
|
||||||
restartUnits = [ "matrix-hookshot.service" ];
|
|
||||||
content = ''
|
content = ''
|
||||||
id: matrix-hookshot
|
id: matrix-hookshot
|
||||||
as_token: "${config.sops.placeholder."matrix/hookshot/as_token"}"
|
as_token: "${config.sops.placeholder."matrix/hookshot/as_token"}"
|
||||||
@@ -78,14 +81,14 @@ in
|
|||||||
outbound = true;
|
outbound = true;
|
||||||
urlPrefix = "https://hookshot.pvv.ntnu.no/webhook/";
|
urlPrefix = "https://hookshot.pvv.ntnu.no/webhook/";
|
||||||
userIdPrefix = "_webhooks_";
|
userIdPrefix = "_webhooks_";
|
||||||
allowJsTransformationFunctions = true;
|
allowJsTransformationFunctions = false;
|
||||||
waitForComplete = false;
|
waitForComplete = false;
|
||||||
};
|
};
|
||||||
feeds = {
|
feeds = {
|
||||||
enabled = true;
|
enabled = true;
|
||||||
pollIntervalSeconds = 600;
|
pollIntervalSeconds = 600;
|
||||||
};
|
};
|
||||||
|
|
||||||
serviceBots = [
|
serviceBots = [
|
||||||
{ localpart = "bot_feeds";
|
{ localpart = "bot_feeds";
|
||||||
displayname = "Aya";
|
displayname = "Aya";
|
||||||
@@ -95,11 +98,6 @@ in
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
widgets = {
|
|
||||||
roomSetupWidget.addOnInvite = false;
|
|
||||||
publicUrl = "https://hookshot.pvv.ntnu.no/widgetapi/v1/static";
|
|
||||||
};
|
|
||||||
|
|
||||||
permissions = [
|
permissions = [
|
||||||
# Users of the PVV Server
|
# Users of the PVV Server
|
||||||
{ actor = "pvv.ntnu.no";
|
{ actor = "pvv.ntnu.no";
|
||||||
@@ -134,7 +132,6 @@ in
|
|||||||
|
|
||||||
services.nginx.virtualHosts."hookshot.pvv.ntnu.no" = {
|
services.nginx.virtualHosts."hookshot.pvv.ntnu.no" = {
|
||||||
enableACME = true;
|
enableACME = true;
|
||||||
addSSL = true;
|
|
||||||
locations."/" = {
|
locations."/" = {
|
||||||
proxyPass = "http://${webhookListenAddress}:${toString webhookListenPort}";
|
proxyPass = "http://${webhookListenAddress}:${toString webhookListenPort}";
|
||||||
};
|
};
|
||||||
|
|||||||
127
hosts/bicep/services/matrix/hookshot/module.nix
Normal file
127
hosts/bicep/services/matrix/hookshot/module.nix
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.services.matrix-hookshot;
|
||||||
|
settingsFormat = pkgs.formats.yaml { };
|
||||||
|
configFile = settingsFormat.generate "matrix-hookshot-config.yml" cfg.settings;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options = {
|
||||||
|
services.matrix-hookshot = {
|
||||||
|
enable = lib.mkEnableOption "matrix-hookshot, a bridge between Matrix and project management services";
|
||||||
|
|
||||||
|
package = lib.mkPackageOption pkgs "matrix-hookshot" { };
|
||||||
|
|
||||||
|
registrationFile = lib.mkOption {
|
||||||
|
type = lib.types.path;
|
||||||
|
description = ''
|
||||||
|
Appservice registration file.
|
||||||
|
As it contains secret tokens, you may not want to add this to the publicly readable Nix store.
|
||||||
|
'';
|
||||||
|
example = lib.literalExpression ''
|
||||||
|
pkgs.writeText "matrix-hookshot-registration" \'\'
|
||||||
|
id: matrix-hookshot
|
||||||
|
as_token: aaaaaaaaaa
|
||||||
|
hs_token: aaaaaaaaaa
|
||||||
|
namespaces:
|
||||||
|
rooms: []
|
||||||
|
users:
|
||||||
|
- regex: "@_webhooks_.*:foobar"
|
||||||
|
exclusive: true
|
||||||
|
|
||||||
|
sender_localpart: hookshot
|
||||||
|
url: "http://localhost:9993"
|
||||||
|
rate_limited: false
|
||||||
|
\'\'
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
settings = lib.mkOption {
|
||||||
|
description = ''
|
||||||
|
{file}`config.yml` configuration as a Nix attribute set.
|
||||||
|
|
||||||
|
For details please see the [documentation](https://matrix-org.github.io/matrix-hookshot/latest/setup/sample-configuration.html).
|
||||||
|
'';
|
||||||
|
example = {
|
||||||
|
bridge = {
|
||||||
|
domain = "example.com";
|
||||||
|
url = "http://localhost:8008";
|
||||||
|
mediaUrl = "https://example.com";
|
||||||
|
port = 9993;
|
||||||
|
bindAddress = "127.0.0.1";
|
||||||
|
};
|
||||||
|
listeners = [
|
||||||
|
{
|
||||||
|
port = 9000;
|
||||||
|
bindAddress = "0.0.0.0";
|
||||||
|
resources = [ "webhooks" ];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
port = 9001;
|
||||||
|
bindAddress = "localhost";
|
||||||
|
resources = [
|
||||||
|
"metrics"
|
||||||
|
"provisioning"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
default = { };
|
||||||
|
type = lib.types.submodule {
|
||||||
|
freeformType = settingsFormat.type;
|
||||||
|
options = {
|
||||||
|
passFile = lib.mkOption {
|
||||||
|
type = lib.types.path;
|
||||||
|
default = "/var/lib/matrix-hookshot/passkey.pem";
|
||||||
|
description = ''
|
||||||
|
A passkey used to encrypt tokens stored inside the bridge.
|
||||||
|
File will be generated if not found.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
serviceDependencies = lib.mkOption {
|
||||||
|
type = with lib.types; listOf str;
|
||||||
|
default = lib.optional config.services.matrix-synapse.enable config.services.matrix-synapse.serviceUnit;
|
||||||
|
defaultText = lib.literalExpression ''
|
||||||
|
lib.optional config.services.matrix-synapse.enable config.services.matrix-synapse.serviceUnit
|
||||||
|
'';
|
||||||
|
description = ''
|
||||||
|
List of Systemd services to require and wait for when starting the application service,
|
||||||
|
such as the Matrix homeserver if it's running on the same host.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
systemd.services.matrix-hookshot = {
|
||||||
|
description = "a bridge between Matrix and multiple project management services";
|
||||||
|
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
wants = [ "network-online.target" ] ++ cfg.serviceDependencies;
|
||||||
|
after = [ "network-online.target" ] ++ cfg.serviceDependencies;
|
||||||
|
|
||||||
|
preStart = ''
|
||||||
|
if [ ! -f '${cfg.settings.passFile}' ]; then
|
||||||
|
mkdir -p $(dirname '${cfg.settings.passFile}')
|
||||||
|
${pkgs.openssl}/bin/openssl genpkey -out '${cfg.settings.passFile}' -outform PEM -algorithm RSA -pkeyopt rsa_keygen_bits:4096
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "simple";
|
||||||
|
Restart = "always";
|
||||||
|
ExecStart = "${cfg.package}/bin/matrix-hookshot ${configFile} ${cfg.registrationFile}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
meta.maintainers = with lib.maintainers; [ flandweber ];
|
||||||
|
}
|
||||||
@@ -6,7 +6,6 @@
|
|||||||
key = "mjolnir/access_token";
|
key = "mjolnir/access_token";
|
||||||
owner = config.users.users.mjolnir.name;
|
owner = config.users.users.mjolnir.name;
|
||||||
group = config.users.users.mjolnir.group;
|
group = config.users.users.mjolnir.group;
|
||||||
restartUnits = [ "mjolnir.service" ];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
services.mjolnir = {
|
services.mjolnir = {
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
{ config, pkgs, fp, ... }:
|
|
||||||
let
|
|
||||||
cfg = config.services.matrix-ooye;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
users.groups.keys-matrix-registrations = { };
|
|
||||||
|
|
||||||
sops.secrets = {
|
|
||||||
"matrix/ooye/as_token" = {
|
|
||||||
sopsFile = fp /secrets/bicep/matrix.yaml;
|
|
||||||
key = "ooye/as_token";
|
|
||||||
restartUnits = [ "matrix-ooye.service" ];
|
|
||||||
};
|
|
||||||
"matrix/ooye/hs_token" = {
|
|
||||||
sopsFile = fp /secrets/bicep/matrix.yaml;
|
|
||||||
key = "ooye/hs_token";
|
|
||||||
restartUnits = [ "matrix-ooye.service" ];
|
|
||||||
};
|
|
||||||
"matrix/ooye/discord_token" = {
|
|
||||||
sopsFile = fp /secrets/bicep/matrix.yaml;
|
|
||||||
key = "ooye/discord_token";
|
|
||||||
restartUnits = [ "matrix-ooye.service" ];
|
|
||||||
};
|
|
||||||
"matrix/ooye/discord_client_secret" = {
|
|
||||||
sopsFile = fp /secrets/bicep/matrix.yaml;
|
|
||||||
key = "ooye/discord_client_secret";
|
|
||||||
restartUnits = [ "matrix-ooye.service" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services.matrix-ooye = {
|
|
||||||
enable = true;
|
|
||||||
homeserver = "https://matrix.pvv.ntnu.no";
|
|
||||||
homeserverName = "pvv.ntnu.no";
|
|
||||||
discordTokenPath = config.sops.secrets."matrix/ooye/discord_token".path;
|
|
||||||
discordClientSecretPath = config.sops.secrets."matrix/ooye/discord_client_secret".path;
|
|
||||||
bridgeOrigin = "https://ooye.pvv.ntnu.no";
|
|
||||||
|
|
||||||
enableSynapseIntegration = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services."matrix-synapse" = {
|
|
||||||
after = [
|
|
||||||
"matrix-ooye-pre-start.service"
|
|
||||||
"network-online.target"
|
|
||||||
];
|
|
||||||
requires = [ "matrix-ooye-pre-start.service" ];
|
|
||||||
serviceConfig = {
|
|
||||||
LoadCredential = [
|
|
||||||
"matrix-ooye-registration:/var/lib/matrix-ooye/registration.yaml"
|
|
||||||
];
|
|
||||||
ExecStartPre = [
|
|
||||||
"+${pkgs.coreutils}/bin/cp /run/credentials/matrix-synapse.service/matrix-ooye-registration ${config.services.matrix-synapse-next.dataDir}/ooye-registration.yaml"
|
|
||||||
"+${pkgs.coreutils}/bin/chown matrix-synapse:keys-matrix-registrations ${config.services.matrix-synapse-next.dataDir}/ooye-registration.yaml"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services.matrix-synapse-next.settings = {
|
|
||||||
app_service_config_files = [
|
|
||||||
"${config.services.matrix-synapse-next.dataDir}/ooye-registration.yaml"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
services.nginx.virtualHosts."ooye.pvv.ntnu.no" = {
|
|
||||||
forceSSL = true;
|
|
||||||
enableACME = true;
|
|
||||||
locations."/".proxyPass = "http://localhost:${cfg.socket}";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
{ lib, buildPythonPackage, fetchFromGitHub, setuptools }:
|
{ lib, buildPythonPackage, fetchFromGitHub }:
|
||||||
|
|
||||||
buildPythonPackage rec {
|
buildPythonPackage rec {
|
||||||
pname = "matrix-synapse-smtp-auth";
|
pname = "matrix-synapse-smtp-auth";
|
||||||
@@ -6,9 +6,6 @@ buildPythonPackage rec {
|
|||||||
|
|
||||||
src = ./.;
|
src = ./.;
|
||||||
|
|
||||||
pyproject = true;
|
|
||||||
build-system = [ setuptools ];
|
|
||||||
|
|
||||||
doCheck = false;
|
doCheck = false;
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
|
|||||||
@@ -124,8 +124,8 @@ in {
|
|||||||
"fec0::/10"
|
"fec0::/10"
|
||||||
|
|
||||||
# NTNU
|
# NTNU
|
||||||
values.ntnu.ipv4-space
|
"129.241.0.0/16"
|
||||||
values.ntnu.ipv6-space
|
"2001:700:300::/44"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
|
||||||
let
|
|
||||||
cfg = config.services.minecraft-heatmap;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
sops.secrets."minecraft-heatmap/ssh-key/private" = {
|
|
||||||
mode = "600";
|
|
||||||
};
|
|
||||||
|
|
||||||
sops.secrets."minecraft-heatmap/postgres-passwd" = {
|
|
||||||
mode = "600";
|
|
||||||
};
|
|
||||||
|
|
||||||
services.minecraft-heatmap = {
|
|
||||||
enable = true;
|
|
||||||
database = {
|
|
||||||
host = "postgres.pvv.ntnu.no";
|
|
||||||
port = 5432;
|
|
||||||
name = "minecraft_heatmap";
|
|
||||||
user = "minecraft_heatmap";
|
|
||||||
passwordFile = config.sops.secrets."minecraft-heatmap/postgres-passwd".path;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.minecraft-heatmap-ingest-logs = {
|
|
||||||
serviceConfig.LoadCredential = [
|
|
||||||
"sshkey:${config.sops.secrets."minecraft-heatmap/ssh-key/private".path}"
|
|
||||||
];
|
|
||||||
|
|
||||||
preStart = let
|
|
||||||
knownHostsFile = pkgs.writeText "minecraft-heatmap-known-hosts" ''
|
|
||||||
innovation.pvv.ntnu.no ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE9O/y5uqcLKCodg2Q+XfZPH/AoUIyBlDhigImU+4+Kn
|
|
||||||
innovation.pvv.ntnu.no ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQClR9GvWeVPZHudlnFXhGHUX5sGX9nscsOsotnlQ4uVuGsgvRifsVsuDULlAFXwoV1tYp4vnyXlsVtMddpLI5ANOIDcZ4fgDxpfSQmtHKssNpDcfMhFJbfRVyacipjA4osxTxvLox/yjtVt+URjTHUA1MWzEwc26KfiOvWO5tCBTan7doN/4KOyT05GwBxwzUAwUmoGTacIITck2Y9qp4+xFYqehbXqPdBb15hFyd38OCQhtU1hWV2Yi18+hJ4nyjc/g5pr6mW09ULlFghe/BaTUXrTisYC6bMcJZsTDwsvld9581KPvoNZOTQhZPTEQCZZ1h54fe0ZHuveVB3TIHovZyjoUuaf4uiFOjJVaKRB+Ig+Il6r7tMUn9CyHtus/Nd86E0TFBzoKxM0OFu88oaUlDtZVrUJL5En1lGoimajebb1JPxllFN5hqIT+gVyMY6nRzkcfS7ieny/U4rzXY2rfz98selftgh3LsBywwADv65i+mPw1A/1QdND1R6fV4U=
|
|
||||||
innovation.pvv.ntnu.no ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNjl3HfsDqmALWCL9uhz9k93RAD2565ndBqUh4N/rvI7MCwEJ6iRCdDev0YzB1Fpg24oriyYoxZRP24ifC2sQf8=
|
|
||||||
'';
|
|
||||||
in ''
|
|
||||||
mkdir -p '${cfg.minecraftLogsDir}'
|
|
||||||
"${lib.getExe pkgs.rsync}" \
|
|
||||||
--archive \
|
|
||||||
--verbose \
|
|
||||||
--progress \
|
|
||||||
--no-owner \
|
|
||||||
--no-group \
|
|
||||||
--rsh="${pkgs.openssh}/bin/ssh -o UserKnownHostsFile=\"${knownHostsFile}\" -i \"$CREDENTIALS_DIRECTORY\"/sshkey" \
|
|
||||||
root@innovation.pvv.ntnu.no:/ \
|
|
||||||
'${cfg.minecraftLogsDir}'/
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -48,8 +48,6 @@
|
|||||||
IPAddressAllow = [
|
IPAddressAllow = [
|
||||||
values.ipv4-space
|
values.ipv4-space
|
||||||
values.ipv6-space
|
values.ipv6-space
|
||||||
values.hosts.ildkule.ipv4
|
|
||||||
values.hosts.ildkule.ipv6
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
{ config, pkgs, values, ... }:
|
{ config, pkgs, ... }:
|
||||||
{
|
{
|
||||||
services.postgresql = {
|
services.postgresql = {
|
||||||
enable = true;
|
enable = true;
|
||||||
package = pkgs.postgresql_15;
|
package = pkgs.postgresql_15;
|
||||||
enableTCPIP = true;
|
enableTCPIP = true;
|
||||||
|
|
||||||
|
dataDir = "/data/postgresql";
|
||||||
|
|
||||||
authentication = ''
|
authentication = ''
|
||||||
host all all ${values.ipv4-space} md5
|
host all all 129.241.210.128/25 md5
|
||||||
host all all ${values.ipv6-space} md5
|
host all all 2001:700:300:1900::/64 md5
|
||||||
host all all ${values.hosts.ildkule.ipv4}/32 md5
|
|
||||||
host all all ${values.hosts.ildkule.ipv6}/32 md5
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
# Hilsen https://pgconfigurator.cybertec-postgresql.com/
|
# Hilsen https://pgconfigurator.cybertec-postgresql.com/
|
||||||
@@ -74,40 +74,11 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
systemd.tmpfiles.settings."10-postgresql"."/data/postgresql".d = {
|
systemd.services.postgresql.serviceConfig = {
|
||||||
user = config.systemd.services.postgresql.serviceConfig.User;
|
LoadCredential = [
|
||||||
group = config.systemd.services.postgresql.serviceConfig.Group;
|
"cert:/etc/certs/postgres.crt"
|
||||||
mode = "0700";
|
"key:/etc/certs/postgres.key"
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.postgresql-setup = {
|
|
||||||
after = [
|
|
||||||
"systemd-tmpfiles-setup.service"
|
|
||||||
"systemd-tmpfiles-resetup.service"
|
|
||||||
];
|
];
|
||||||
serviceConfig = {
|
|
||||||
LoadCredential = [
|
|
||||||
"cert:/etc/certs/postgres.crt"
|
|
||||||
"key:/etc/certs/postgres.key"
|
|
||||||
];
|
|
||||||
|
|
||||||
BindPaths = [ "/data/postgresql:/var/lib/postgresql" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.postgresql = {
|
|
||||||
after = [
|
|
||||||
"systemd-tmpfiles-setup.service"
|
|
||||||
"systemd-tmpfiles-resetup.service"
|
|
||||||
];
|
|
||||||
serviceConfig = {
|
|
||||||
LoadCredential = [
|
|
||||||
"cert:/etc/certs/postgres.crt"
|
|
||||||
"key:/etc/certs/postgres.key"
|
|
||||||
];
|
|
||||||
|
|
||||||
BindPaths = [ "/data/postgresql:/var/lib/postgresql" ];
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
environment.snakeoil-certs."/etc/certs/postgres" = {
|
environment.snakeoil-certs."/etc/certs/postgres" = {
|
||||||
|
|||||||
46
hosts/bob/configuration.nix
Normal file
46
hosts/bob/configuration.nix
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
{ config, fp, pkgs, values, ... }:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
# Include the results of the hardware scan.
|
||||||
|
./hardware-configuration.nix
|
||||||
|
(fp /base)
|
||||||
|
(fp /misc/metrics-exporters.nix)
|
||||||
|
./disks.nix
|
||||||
|
|
||||||
|
(fp /misc/builder.nix)
|
||||||
|
];
|
||||||
|
|
||||||
|
sops.defaultSopsFile = fp /secrets/bob/bob.yaml;
|
||||||
|
sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
|
||||||
|
sops.age.keyFile = "/var/lib/sops-nix/key.txt";
|
||||||
|
sops.age.generateKey = true;
|
||||||
|
|
||||||
|
boot.loader.grub = {
|
||||||
|
enable = true;
|
||||||
|
efiSupport = true;
|
||||||
|
efiInstallAsRemovable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.hostName = "bob"; # Define your hostname.
|
||||||
|
|
||||||
|
systemd.network.networks."30-all" = values.defaultNetworkConfig // {
|
||||||
|
matchConfig.Name = "en*";
|
||||||
|
DHCP = "yes";
|
||||||
|
gateway = [ ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# List packages installed in system profile
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
];
|
||||||
|
|
||||||
|
# List services that you want to enable:
|
||||||
|
|
||||||
|
# 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.05"; # Did you read the comment?
|
||||||
|
|
||||||
|
}
|
||||||
39
hosts/bob/disks.nix
Normal file
39
hosts/bob/disks.nix
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# Example to create a bios compatible gpt partition
|
||||||
|
{ lib, ... }:
|
||||||
|
{
|
||||||
|
disko.devices = {
|
||||||
|
disk.disk1 = {
|
||||||
|
device = lib.mkDefault "/dev/sda";
|
||||||
|
type = "disk";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
boot = {
|
||||||
|
name = "boot";
|
||||||
|
size = "1M";
|
||||||
|
type = "EF02";
|
||||||
|
};
|
||||||
|
esp = {
|
||||||
|
name = "ESP";
|
||||||
|
size = "500M";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
root = {
|
||||||
|
name = "root";
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "ext4";
|
||||||
|
mountpoint = "/";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -5,30 +5,20 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
imports =
|
imports =
|
||||||
[ (modulesPath + "/installer/scan/not-detected.nix")
|
[ (modulesPath + "/profiles/qemu-guest.nix")
|
||||||
];
|
];
|
||||||
|
|
||||||
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "usbhid" "sd_mod" ];
|
boot.initrd.availableKernelModules = [ "ata_piix" "uhci_hcd" "virtio_pci" "virtio_blk" ];
|
||||||
boot.initrd.kernelModules = [ ];
|
boot.initrd.kernelModules = [ ];
|
||||||
boot.kernelModules = [ "kvm-intel" ];
|
boot.kernelModules = [ ];
|
||||||
boot.extraModulePackages = [ ];
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
fileSystems."/" =
|
|
||||||
{ device = "/dev/disk/by-uuid/c7bbb293-a0a3-4995-8892-0ec63e8c67dd";
|
|
||||||
fsType = "ext4";
|
|
||||||
};
|
|
||||||
|
|
||||||
swapDevices =
|
|
||||||
[ { device = "/dev/disk/by-uuid/a86ffda8-8ecb-42a1-bf9f-926072e90ca5"; }
|
|
||||||
];
|
|
||||||
|
|
||||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||||
# still possible to use this option, but it's recommended to use it in conjunction
|
# still possible to use this option, but it's recommended to use it in conjunction
|
||||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||||
networking.useDHCP = lib.mkDefault true;
|
networking.useDHCP = lib.mkDefault true;
|
||||||
# networking.interfaces.enp0s31f6.useDHCP = lib.mkDefault true;
|
# networking.interfaces.ens3.useDHCP = lib.mkDefault true;
|
||||||
|
|
||||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
# Include the results of the hardware scan.
|
# Include the results of the hardware scan.
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
(fp /base)
|
(fp /base)
|
||||||
|
(fp /misc/metrics-exporters.nix)
|
||||||
|
|
||||||
./services/grzegorz.nix
|
./services/grzegorz.nix
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
# Include the results of the hardware scan.
|
# Include the results of the hardware scan.
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
(fp /base)
|
(fp /base)
|
||||||
|
(fp /misc/metrics-exporters.nix)
|
||||||
|
|
||||||
(fp /modules/grzegorz.nix)
|
(fp /modules/grzegorz.nix)
|
||||||
];
|
];
|
||||||
@@ -24,26 +25,6 @@
|
|||||||
|
|
||||||
# List services that you want to enable:
|
# List services that you want to enable:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
services.spotifyd = {
|
|
||||||
enable = true;
|
|
||||||
settings.global = {
|
|
||||||
device_name = "georg";
|
|
||||||
use_mpris = false;
|
|
||||||
#dbus_type = "system";
|
|
||||||
#zeroconf_port = 1234;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
networking.firewall.allowedTCPPorts = [
|
|
||||||
# config.services.spotifyd.settings.zeroconf_port
|
|
||||||
5353 # spotifyd is its own mDNS service wtf
|
|
||||||
];
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# This value determines the NixOS release from which the default
|
# This value determines the NixOS release from which the default
|
||||||
# settings for stateful data, like file locations and database versions
|
# settings for stateful data, like file locations and database versions
|
||||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
# Include the results of the hardware scan.
|
# Include the results of the hardware scan.
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
(fp /base)
|
(fp /base)
|
||||||
|
(fp /misc/metrics-exporters.nix)
|
||||||
|
|
||||||
./services/monitoring
|
./services/monitoring
|
||||||
./services/nginx
|
./services/nginx
|
||||||
|
|||||||
@@ -1539,8 +1539,8 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"timezone": "browser",
|
"timezone": "browser",
|
||||||
"title": "Gitea Dashboard",
|
"title": "Gitea Dashbaord",
|
||||||
"uid": "nNq1Iw5Gz",
|
"uid": "nNq1Iw5Gz",
|
||||||
"version": 29,
|
"version": 29,
|
||||||
"weekStart": ""
|
"weekStart": ""
|
||||||
}
|
}
|
||||||
@@ -56,12 +56,13 @@ in {
|
|||||||
url = "https://raw.githubusercontent.com/matrix-org/synapse/develop/contrib/grafana/synapse.json";
|
url = "https://raw.githubusercontent.com/matrix-org/synapse/develop/contrib/grafana/synapse.json";
|
||||||
options.path = dashboards/synapse.json;
|
options.path = dashboards/synapse.json;
|
||||||
}
|
}
|
||||||
{
|
# TODO: enable once https://github.com/NixOS/nixpkgs/pull/242365 gets merged
|
||||||
name = "MySQL";
|
# {
|
||||||
type = "file";
|
# name = "MySQL";
|
||||||
url = "https://raw.githubusercontent.com/prometheus/mysqld_exporter/main/mysqld-mixin/dashboards/mysql-overview.json";
|
# type = "file";
|
||||||
options.path = dashboards/mysql.json;
|
# url = "https://raw.githubusercontent.com/prometheus/mysqld_exporter/main/mysqld-mixin/dashboards/mysql-overview.json";
|
||||||
}
|
# options.path = dashboards/mysql.json;
|
||||||
|
# }
|
||||||
{
|
{
|
||||||
name = "Postgresql";
|
name = "Postgresql";
|
||||||
type = "file";
|
type = "file";
|
||||||
@@ -75,10 +76,10 @@ in {
|
|||||||
options.path = dashboards/go-processes.json;
|
options.path = dashboards/go-processes.json;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
name = "Gitea Dashboard";
|
name = "Gitea Dashbaord";
|
||||||
type = "file";
|
type = "file";
|
||||||
url = "https://grafana.com/api/dashboards/17802/revisions/3/download";
|
url = "https://grafana.com/api/dashboards/17802/revisions/3/download";
|
||||||
options.path = dashboards/gitea-dashboard.json;
|
options.path = dashboards/gitea-dashbaord.json;
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
stateDir = "/data/monitoring/prometheus";
|
stateDir = "/data/monitoring/prometheus";
|
||||||
in {
|
in {
|
||||||
imports = [
|
imports = [
|
||||||
./exim.nix
|
|
||||||
./gitea.nix
|
./gitea.nix
|
||||||
./machines.nix
|
|
||||||
./matrix-synapse.nix
|
./matrix-synapse.nix
|
||||||
./mysqld.nix
|
# TODO: enable once https://github.com/NixOS/nixpkgs/pull/242365 gets merged
|
||||||
|
# ./mysqld.nix
|
||||||
./postgres.nix
|
./postgres.nix
|
||||||
|
./machines.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
services.prometheus = {
|
services.prometheus = {
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
{ ... }:
|
|
||||||
{
|
|
||||||
services.prometheus = {
|
|
||||||
scrapeConfigs = [
|
|
||||||
{
|
|
||||||
job_name = "exim";
|
|
||||||
scrape_interval = "15s";
|
|
||||||
static_configs = [{
|
|
||||||
targets = [ "microbel.pvv.ntnu.no:9636" ];
|
|
||||||
}];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,37 +1,54 @@
|
|||||||
{ config, ... }: let
|
{ config, ... }: let
|
||||||
cfg = config.services.prometheus;
|
cfg = config.services.prometheus;
|
||||||
|
|
||||||
mkHostScrapeConfig = name: ports: {
|
|
||||||
labels.hostname = name;
|
|
||||||
targets = map (port: "${name}.pvv.ntnu.no:${toString port}") ports;
|
|
||||||
};
|
|
||||||
|
|
||||||
defaultNodeExporterPort = 9100;
|
|
||||||
defaultSystemdExporterPort = 9101;
|
|
||||||
defaultNixosExporterPort = 9102;
|
|
||||||
in {
|
in {
|
||||||
services.prometheus.scrapeConfigs = [{
|
services.prometheus.scrapeConfigs = [{
|
||||||
job_name = "base_info";
|
job_name = "base_info";
|
||||||
static_configs = [
|
static_configs = [
|
||||||
(mkHostScrapeConfig "ildkule" [ cfg.exporters.node.port cfg.exporters.systemd.port defaultNixosExporterPort ])
|
{ labels.hostname = "ildkule";
|
||||||
|
targets = [
|
||||||
(mkHostScrapeConfig "bekkalokk" [ defaultNodeExporterPort defaultSystemdExporterPort defaultNixosExporterPort ])
|
"ildkule.pvv.ntnu.no:${toString cfg.exporters.node.port}"
|
||||||
(mkHostScrapeConfig "bicep" [ defaultNodeExporterPort defaultSystemdExporterPort defaultNixosExporterPort ])
|
"ildkule.pvv.ntnu.no:${toString cfg.exporters.systemd.port}"
|
||||||
(mkHostScrapeConfig "brzeczyszczykiewicz" [ defaultNodeExporterPort defaultSystemdExporterPort defaultNixosExporterPort ])
|
];
|
||||||
(mkHostScrapeConfig "georg" [ defaultNodeExporterPort defaultSystemdExporterPort defaultNixosExporterPort ])
|
}
|
||||||
(mkHostScrapeConfig "kommode" [ defaultNodeExporterPort defaultSystemdExporterPort defaultNixosExporterPort ])
|
{ labels.hostname = "bekkalokk";
|
||||||
(mkHostScrapeConfig "ustetind" [ defaultNodeExporterPort defaultSystemdExporterPort defaultNixosExporterPort ])
|
targets = [
|
||||||
(mkHostScrapeConfig "wenche" [ defaultNodeExporterPort defaultSystemdExporterPort defaultNixosExporterPort ])
|
"bekkalokk.pvv.ntnu.no:9100"
|
||||||
|
"bekkalokk.pvv.ntnu.no:9101"
|
||||||
(mkHostScrapeConfig "lupine-1" [ defaultNodeExporterPort defaultSystemdExporterPort defaultNixosExporterPort ])
|
];
|
||||||
# (mkHostScrapeConfig "lupine-2" [ defaultNodeExporterPort defaultSystemdExporterPort ])
|
}
|
||||||
(mkHostScrapeConfig "lupine-3" [ defaultNodeExporterPort defaultSystemdExporterPort defaultNixosExporterPort ])
|
{ labels.hostname = "bicep";
|
||||||
(mkHostScrapeConfig "lupine-4" [ defaultNodeExporterPort defaultSystemdExporterPort defaultNixosExporterPort ])
|
targets = [
|
||||||
(mkHostScrapeConfig "lupine-5" [ defaultNodeExporterPort defaultSystemdExporterPort defaultNixosExporterPort ])
|
"bicep.pvv.ntnu.no:9100"
|
||||||
|
"bicep.pvv.ntnu.no:9101"
|
||||||
(mkHostScrapeConfig "hildring" [ defaultNodeExporterPort ])
|
];
|
||||||
(mkHostScrapeConfig "isvegg" [ defaultNodeExporterPort ])
|
}
|
||||||
(mkHostScrapeConfig "microbel" [ defaultNodeExporterPort ])
|
{ labels.hostname = "brzeczyszczykiewicz";
|
||||||
|
targets = [
|
||||||
|
"brzeczyszczykiewicz.pvv.ntnu.no:9100"
|
||||||
|
"brzeczyszczykiewicz.pvv.ntnu.no:9101"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{ labels.hostname = "georg";
|
||||||
|
targets = [
|
||||||
|
"georg.pvv.ntnu.no:9100"
|
||||||
|
"georg.pvv.ntnu.no:9101"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{ labels.hostname = "hildring";
|
||||||
|
targets = [
|
||||||
|
"hildring.pvv.ntnu.no:9100"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{ labels.hostname = "isvegg";
|
||||||
|
targets = [
|
||||||
|
"isvegg.pvv.ntnu.no:9100"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{ labels.hostname = "microbel";
|
||||||
|
targets = [
|
||||||
|
"microbel.pvv.ntnu.no:9100"
|
||||||
|
];
|
||||||
|
}
|
||||||
];
|
];
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,7 @@
|
|||||||
{ config, ... }: let
|
{ config, ... }: let
|
||||||
cfg = config.services.prometheus;
|
cfg = config.services.prometheus;
|
||||||
in {
|
in {
|
||||||
sops = {
|
sops.secrets."config/mysqld_exporter" = { };
|
||||||
secrets."config/mysqld_exporter_password" = { };
|
|
||||||
|
|
||||||
templates."mysqld_exporter.conf" = {
|
|
||||||
restartUnits = [ "prometheus-mysqld-exporter.service" ];
|
|
||||||
content = let
|
|
||||||
inherit (config.sops) placeholder;
|
|
||||||
in ''
|
|
||||||
[client]
|
|
||||||
host = mysql.pvv.ntnu.no
|
|
||||||
port = 3306
|
|
||||||
user = prometheus_mysqld_exporter
|
|
||||||
password = ${placeholder."config/mysqld_exporter_password"}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services.prometheus = {
|
services.prometheus = {
|
||||||
scrapeConfigs = [{
|
scrapeConfigs = [{
|
||||||
@@ -34,7 +19,7 @@ in {
|
|||||||
|
|
||||||
exporters.mysqld = {
|
exporters.mysqld = {
|
||||||
enable = true;
|
enable = true;
|
||||||
configFile = config.sops.templates."mysqld_exporter.conf".path;
|
configFilePath = config.sops.secrets."config/mysqld_exporter".path;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
{ pkgs, values, fp, ... }:
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
# Include the results of the hardware scan.
|
|
||||||
./hardware-configuration.nix
|
|
||||||
(fp /base)
|
|
||||||
|
|
||||||
./services/gitea
|
|
||||||
./services/nginx.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
sops.defaultSopsFile = fp /secrets/kommode/kommode.yaml;
|
|
||||||
sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
|
|
||||||
sops.age.keyFile = "/var/lib/sops-nix/key.txt";
|
|
||||||
sops.age.generateKey = true;
|
|
||||||
|
|
||||||
boot.loader.systemd-boot.enable = true;
|
|
||||||
boot.loader.efi.canTouchEfiVariables = true;
|
|
||||||
|
|
||||||
networking.hostName = "kommode"; # Define your hostname.
|
|
||||||
|
|
||||||
systemd.network.networks."30-ens18" = values.defaultNetworkConfig // {
|
|
||||||
matchConfig.Name = "ens18";
|
|
||||||
address = with values.hosts.kommode; [ (ipv4 + "/25") (ipv6 + "/64") ];
|
|
||||||
};
|
|
||||||
|
|
||||||
services.btrfs.autoScrub.enable = true;
|
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [];
|
|
||||||
|
|
||||||
system.stateVersion = "24.11";
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
{ config, pkgs, lib, fp, ... }:
|
|
||||||
let
|
|
||||||
cfg = config.services.gitea;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
services.gitea-themes = {
|
|
||||||
monokai = pkgs.gitea-theme-monokai;
|
|
||||||
earl-grey = pkgs.gitea-theme-earl-grey;
|
|
||||||
pitch-black = pkgs.gitea-theme-pitch-black;
|
|
||||||
catppuccin = pkgs.gitea-theme-catppuccin;
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.gitea-customization = lib.mkIf cfg.enable {
|
|
||||||
description = "Install extra customization in gitea's CUSTOM_DIR";
|
|
||||||
wantedBy = [ "gitea.service" ];
|
|
||||||
requiredBy = [ "gitea.service" ];
|
|
||||||
|
|
||||||
serviceConfig = {
|
|
||||||
Type = "oneshot";
|
|
||||||
User = cfg.user;
|
|
||||||
Group = cfg.group;
|
|
||||||
};
|
|
||||||
|
|
||||||
script = let
|
|
||||||
logo-svg = fp /assets/logo_blue_regular.svg;
|
|
||||||
logo-png = fp /assets/logo_blue_regular.png;
|
|
||||||
|
|
||||||
extraLinks = pkgs.writeText "gitea-extra-links.tmpl" ''
|
|
||||||
<a class="item" href="https://git.pvv.ntnu.no/Drift/-/projects/4">Tokyo Drift Issues</a>
|
|
||||||
'';
|
|
||||||
|
|
||||||
extraLinksFooter = pkgs.writeText "gitea-extra-links-footer.tmpl" ''
|
|
||||||
<a class="item" href="https://www.pvv.ntnu.no/">PVV</a>
|
|
||||||
<a class="item" href="https://wiki.pvv.ntnu.no/">Wiki</a>
|
|
||||||
<a class="item" href="https://wiki.pvv.ntnu.no/wiki/Tjenester/Kodelager">PVV Gitea Howto</a>
|
|
||||||
'';
|
|
||||||
|
|
||||||
project-labels = (pkgs.formats.yaml { }).generate "gitea-project-labels.yaml" {
|
|
||||||
labels = lib.importJSON ./labels/projects.json;
|
|
||||||
};
|
|
||||||
|
|
||||||
customTemplates = pkgs.runCommandLocal "gitea-templates" {
|
|
||||||
nativeBuildInputs = with pkgs; [
|
|
||||||
coreutils
|
|
||||||
gnused
|
|
||||||
];
|
|
||||||
} ''
|
|
||||||
# Bigger icons
|
|
||||||
install -Dm444 "${cfg.package.src}/templates/repo/icon.tmpl" "$out/repo/icon.tmpl"
|
|
||||||
sed -i -e 's/24/60/g' "$out/repo/icon.tmpl"
|
|
||||||
'';
|
|
||||||
in ''
|
|
||||||
install -Dm444 ${logo-svg} ${cfg.customDir}/public/assets/img/logo.svg
|
|
||||||
install -Dm444 ${logo-png} ${cfg.customDir}/public/assets/img/logo.png
|
|
||||||
install -Dm444 ${./loading.apng} ${cfg.customDir}/public/assets/img/loading.png
|
|
||||||
install -Dm444 ${extraLinks} ${cfg.customDir}/templates/custom/extra_links.tmpl
|
|
||||||
install -Dm444 ${extraLinksFooter} ${cfg.customDir}/templates/custom/extra_links_footer.tmpl
|
|
||||||
install -Dm444 ${project-labels} ${cfg.customDir}/options/label/project-labels.yaml
|
|
||||||
|
|
||||||
"${lib.getExe pkgs.rsync}" -a "${customTemplates}/" ${cfg.customDir}/templates/
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"name": "art",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#006b75",
|
|
||||||
"description": "Requires some creativity"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "big",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#754bc4",
|
|
||||||
"description": "This is gonna take a while"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "blocked",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#850021",
|
|
||||||
"description": "This issue/PR depends on one or more other issues/PRs"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "bug",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#f05048",
|
|
||||||
"description": "Something brokey"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "ci-cd",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#d1ff78",
|
|
||||||
"description": "Continuous integrals and continuous derivation"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "crash report",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#ed1111",
|
|
||||||
"description": "Report an oopsie"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "disputed",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#5319e7",
|
|
||||||
"description": "Kranglefanter"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "documentation",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#fbca04",
|
|
||||||
"description": "Documentation changes required"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "duplicate",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#cccccc",
|
|
||||||
"description": "This issue or pull request already exists"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "feature request",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#0052cc",
|
|
||||||
"description": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "good first issue",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#009800",
|
|
||||||
"description": "Get your hands dirty with a new project here"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "me gusta",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#30ff36",
|
|
||||||
"description": "( ͡° ͜ʖ ͡°)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "packaging",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#bf642b",
|
|
||||||
"description": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "question",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#cc317c",
|
|
||||||
"description": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "security",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#ed1111",
|
|
||||||
"description": "Skommel"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "techdebt spring cleaning",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#8c6217",
|
|
||||||
"description": "The code is smelly 👃"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "testing",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#52b373",
|
|
||||||
"description": "Poke it and see if it explodes"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "ui/ux",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#f28852",
|
|
||||||
"description": "User complaints about ergonomics and economics and whatever"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "wontfix",
|
|
||||||
"exclusive": false,
|
|
||||||
"color": "#ffffff",
|
|
||||||
"description": "Nei, vil ikke"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -1,327 +0,0 @@
|
|||||||
{ config, values, lib, pkgs, unstablePkgs, ... }:
|
|
||||||
let
|
|
||||||
cfg = config.services.gitea;
|
|
||||||
domain = "git.pvv.ntnu.no";
|
|
||||||
sshPort = 2222;
|
|
||||||
in {
|
|
||||||
imports = [
|
|
||||||
./customization
|
|
||||||
./gpg.nix
|
|
||||||
./import-users
|
|
||||||
./web-secret-provider
|
|
||||||
];
|
|
||||||
|
|
||||||
sops.secrets = let
|
|
||||||
defaultConfig = {
|
|
||||||
owner = "gitea";
|
|
||||||
group = "gitea";
|
|
||||||
restartUnits = [ "gitea.service" ];
|
|
||||||
};
|
|
||||||
in {
|
|
||||||
"gitea/database" = defaultConfig;
|
|
||||||
"gitea/email-password" = defaultConfig;
|
|
||||||
"gitea/lfs-jwt-secret" = defaultConfig;
|
|
||||||
"gitea/oauth2-jwt-secret" = defaultConfig;
|
|
||||||
"gitea/secret-key" = defaultConfig;
|
|
||||||
};
|
|
||||||
|
|
||||||
services.gitea = {
|
|
||||||
enable = true;
|
|
||||||
appName = "PVV Git";
|
|
||||||
|
|
||||||
package = unstablePkgs.gitea;
|
|
||||||
|
|
||||||
database = {
|
|
||||||
type = "postgres";
|
|
||||||
host = "postgres.pvv.ntnu.no";
|
|
||||||
port = config.services.postgresql.settings.port;
|
|
||||||
passwordFile = config.sops.secrets."gitea/database".path;
|
|
||||||
createDatabase = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
mailerPasswordFile = config.sops.secrets."gitea/email-password".path;
|
|
||||||
|
|
||||||
# https://docs.gitea.com/administration/config-cheat-sheet
|
|
||||||
settings = {
|
|
||||||
server = {
|
|
||||||
DOMAIN = domain;
|
|
||||||
ROOT_URL = "https://${domain}/";
|
|
||||||
PROTOCOL = "http+unix";
|
|
||||||
SSH_PORT = sshPort;
|
|
||||||
LANDING_PAGE = "explore";
|
|
||||||
START_SSH_SERVER = true;
|
|
||||||
START_LFS_SERVER = true;
|
|
||||||
LFS_JWT_SECRET = lib.mkForce "";
|
|
||||||
LFS_JWT_SECRET_URI = "file:${config.sops.secrets."gitea/lfs-jwt-secret".path}";
|
|
||||||
};
|
|
||||||
oauth2 = {
|
|
||||||
JWT_SECRET = lib.mkForce "";
|
|
||||||
JWT_SECRET_URI = "file:${config.sops.secrets."gitea/oauth2-jwt-secret".path}";
|
|
||||||
};
|
|
||||||
"git.timeout" = {
|
|
||||||
MIGRATE = 3600;
|
|
||||||
MIRROR = 1800;
|
|
||||||
};
|
|
||||||
mailer = {
|
|
||||||
ENABLED = true;
|
|
||||||
FROM = "gitea@pvv.ntnu.no";
|
|
||||||
PROTOCOL = "smtp";
|
|
||||||
SMTP_ADDR = "smtp.pvv.ntnu.no";
|
|
||||||
SMTP_PORT = 587;
|
|
||||||
USER = "gitea@pvv.ntnu.no";
|
|
||||||
SUBJECT_PREFIX = "[pvv-git]";
|
|
||||||
};
|
|
||||||
metrics = {
|
|
||||||
ENABLED = true;
|
|
||||||
ENABLED_ISSUE_BY_LABEL = true;
|
|
||||||
ENABLED_ISSUE_BY_REPOSITORY = true;
|
|
||||||
};
|
|
||||||
indexer.REPO_INDEXER_ENABLED = true;
|
|
||||||
service = {
|
|
||||||
DISABLE_REGISTRATION = true;
|
|
||||||
ENABLE_NOTIFY_MAIL = true;
|
|
||||||
AUTO_WATCH_NEW_REPOS = false;
|
|
||||||
};
|
|
||||||
admin.DEFAULT_EMAIL_NOTIFICATIONS = "onmention";
|
|
||||||
session.COOKIE_SECURE = true;
|
|
||||||
security = {
|
|
||||||
SECRET_KEY = lib.mkForce "";
|
|
||||||
SECRET_KEY_URI = "file:${config.sops.secrets."gitea/secret-key".path}";
|
|
||||||
};
|
|
||||||
database.LOG_SQL = false;
|
|
||||||
repository = {
|
|
||||||
PREFERRED_LICENSES = lib.concatStringsSep "," [
|
|
||||||
"AGPL-3.0-only"
|
|
||||||
"AGPL-3.0-or-later"
|
|
||||||
"Apache-2.0"
|
|
||||||
"BSD-3-Clause"
|
|
||||||
"CC-BY-4.0"
|
|
||||||
"CC-BY-NC-4.0"
|
|
||||||
"CC-BY-NC-ND-4.0"
|
|
||||||
"CC-BY-NC-SA-4.0"
|
|
||||||
"CC-BY-ND-4.0"
|
|
||||||
"CC-BY-SA-4.0"
|
|
||||||
"CC0-1.0"
|
|
||||||
"GPL-2.0-only"
|
|
||||||
"GPL-3.0-only"
|
|
||||||
"GPL-3.0-or-later"
|
|
||||||
"LGPL-3.0-linking-exception"
|
|
||||||
"LGPL-3.0-only"
|
|
||||||
"LGPL-3.0-or-later"
|
|
||||||
"MIT"
|
|
||||||
"MPL-2.0"
|
|
||||||
"Unlicense"
|
|
||||||
];
|
|
||||||
DEFAULT_REPO_UNITS = lib.concatStringsSep "," [
|
|
||||||
"repo.code"
|
|
||||||
"repo.issues"
|
|
||||||
"repo.pulls"
|
|
||||||
"repo.releases"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
picture = {
|
|
||||||
DISABLE_GRAVATAR = true;
|
|
||||||
ENABLE_FEDERATED_AVATAR = false;
|
|
||||||
|
|
||||||
AVATAR_MAX_FILE_SIZE = 1024 * 1024 * 5;
|
|
||||||
# NOTE: go any bigger than this, and gitea will freeze your gif >:(
|
|
||||||
AVATAR_MAX_ORIGIN_SIZE = 1024 * 1024 * 2;
|
|
||||||
};
|
|
||||||
actions.ENABLED = true;
|
|
||||||
ui = {
|
|
||||||
REACTIONS = lib.concatStringsSep "," [
|
|
||||||
"+1"
|
|
||||||
"-1"
|
|
||||||
"laugh"
|
|
||||||
"confused"
|
|
||||||
"heart"
|
|
||||||
"hooray"
|
|
||||||
"rocket"
|
|
||||||
"eyes"
|
|
||||||
"100"
|
|
||||||
"anger"
|
|
||||||
"astonished"
|
|
||||||
"no_good"
|
|
||||||
"ok_hand"
|
|
||||||
"pensive"
|
|
||||||
"pizza"
|
|
||||||
"point_up"
|
|
||||||
"sob"
|
|
||||||
"skull"
|
|
||||||
"upside_down_face"
|
|
||||||
"shrug"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
"ui.meta".DESCRIPTION = "Bokstavelig talt programvareverkstedet";
|
|
||||||
};
|
|
||||||
|
|
||||||
dump = {
|
|
||||||
enable = true;
|
|
||||||
interval = "weekly";
|
|
||||||
type = "tar.gz";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
environment.systemPackages = [ cfg.package ];
|
|
||||||
|
|
||||||
systemd.services.gitea.serviceConfig.CPUSchedulingPolicy = "batch";
|
|
||||||
|
|
||||||
systemd.services.gitea.serviceConfig.CacheDirectory = "gitea/repo-archive";
|
|
||||||
systemd.services.gitea.serviceConfig.BindPaths = [
|
|
||||||
"%C/gitea/repo-archive:${cfg.stateDir}/data/repo-archive"
|
|
||||||
];
|
|
||||||
|
|
||||||
services.nginx.virtualHosts."${domain}" = {
|
|
||||||
forceSSL = true;
|
|
||||||
enableACME = true;
|
|
||||||
kTLS = true;
|
|
||||||
locations = {
|
|
||||||
"/" = {
|
|
||||||
proxyPass = "http://unix:${cfg.settings.server.HTTP_ADDR}";
|
|
||||||
extraConfig = ''
|
|
||||||
client_max_body_size 512M;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
"/metrics" = {
|
|
||||||
proxyPass = "http://unix:${cfg.settings.server.HTTP_ADDR}";
|
|
||||||
extraConfig = ''
|
|
||||||
allow ${values.hosts.ildkule.ipv4}/32;
|
|
||||||
allow ${values.hosts.ildkule.ipv6}/128;
|
|
||||||
deny all;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
environment.robots-txt."gitea" = {
|
|
||||||
virtualHost = domain;
|
|
||||||
rules = [
|
|
||||||
{
|
|
||||||
pre_comment = ''
|
|
||||||
Gitea internals
|
|
||||||
|
|
||||||
See these for more information:
|
|
||||||
- https://gitea.com/robots.txt
|
|
||||||
- https://codeberg.org/robots.txt
|
|
||||||
'';
|
|
||||||
User-agent = "*";
|
|
||||||
Disallow = [
|
|
||||||
"/api/*"
|
|
||||||
"/avatars"
|
|
||||||
"/*/*/src/commit/*"
|
|
||||||
"/*/*/commit/*"
|
|
||||||
"/*/*/*/refs/*"
|
|
||||||
"/*/*/*/star"
|
|
||||||
"/*/*/*/watch"
|
|
||||||
"/*/*/labels"
|
|
||||||
"/*/*/activity/*"
|
|
||||||
"/vendor/*"
|
|
||||||
"/swagger.*.json"
|
|
||||||
"/repo/create"
|
|
||||||
"/repo/migrate"
|
|
||||||
"/org/create"
|
|
||||||
"/*/*/fork"
|
|
||||||
"/*/*/watchers"
|
|
||||||
"/*/*/stargazers"
|
|
||||||
"/*/*/forks"
|
|
||||||
"*/.git/"
|
|
||||||
"/*.git"
|
|
||||||
"/*.atom"
|
|
||||||
"/*.rss"
|
|
||||||
];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
pre_comment = "Language Spam";
|
|
||||||
Disallow = "/*?lang=";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
pre_comment = ''
|
|
||||||
AI bots
|
|
||||||
|
|
||||||
Sourced from:
|
|
||||||
- https://www.vg.no/robots.txt
|
|
||||||
- https://codeberg.org/robots.txt
|
|
||||||
'';
|
|
||||||
User-agent = [
|
|
||||||
"AI2Bot"
|
|
||||||
"Ai2Bot-Dolma"
|
|
||||||
"Amazonbot"
|
|
||||||
"Applebot-Extended"
|
|
||||||
"Bytespider"
|
|
||||||
"CCBot"
|
|
||||||
"ChatGPT-User"
|
|
||||||
"Claude-Web"
|
|
||||||
"ClaudeBot"
|
|
||||||
"Crawlspace"
|
|
||||||
"Diffbot"
|
|
||||||
"FacebookBot"
|
|
||||||
"FriendlyCrawler"
|
|
||||||
"GPTBot"
|
|
||||||
"Google-Extended"
|
|
||||||
"ICC-Crawler"
|
|
||||||
"ImagesiftBot"
|
|
||||||
"Kangaroo Bot"
|
|
||||||
"Meta-ExternalAgent"
|
|
||||||
"OAI-SearchBot"
|
|
||||||
"Omgili"
|
|
||||||
"Omgilibot"
|
|
||||||
"PanguBot"
|
|
||||||
"PerplexityBot"
|
|
||||||
"PetalBot"
|
|
||||||
"Scrapy"
|
|
||||||
"SemrushBot-OCOB"
|
|
||||||
"Sidetrade indexer bot"
|
|
||||||
"Timpibot"
|
|
||||||
"VelenPublicWebCrawler"
|
|
||||||
"Webzio-Extended"
|
|
||||||
"YouBot"
|
|
||||||
"anthropic-ai"
|
|
||||||
"cohere-ai"
|
|
||||||
"cohere-training-data-crawler"
|
|
||||||
"facebookexternalhit"
|
|
||||||
"iaskspider/2.0"
|
|
||||||
"img2dataset"
|
|
||||||
"meta-externalagent"
|
|
||||||
"omgili"
|
|
||||||
"omgilibot"
|
|
||||||
];
|
|
||||||
Disallow = "/";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
Crawl-delay = "2";
|
|
||||||
}
|
|
||||||
{
|
|
||||||
Sitemap = "https://${domain}/sitemap.xml";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
networking.firewall.allowedTCPPorts = [ sshPort ];
|
|
||||||
|
|
||||||
systemd.services.gitea-dump = {
|
|
||||||
serviceConfig.ExecStart = let
|
|
||||||
args = lib.cli.toGNUCommandLineShell { } {
|
|
||||||
type = cfg.dump.type;
|
|
||||||
|
|
||||||
# This should be declarative on nixos, no need to backup.
|
|
||||||
skip-custom-dir = true;
|
|
||||||
|
|
||||||
# This can be regenerated, no need to backup
|
|
||||||
skip-index = true;
|
|
||||||
|
|
||||||
# Logs are stored in the systemd journal
|
|
||||||
skip-log = true;
|
|
||||||
};
|
|
||||||
in lib.mkForce "${lib.getExe cfg.package} ${args}";
|
|
||||||
|
|
||||||
# Only keep n backup files at a time
|
|
||||||
postStop = let
|
|
||||||
cu = prog: "'${lib.getExe' pkgs.coreutils prog}'";
|
|
||||||
backupCount = 3;
|
|
||||||
in ''
|
|
||||||
for file in $(${cu "ls"} -t1 '${cfg.dump.backupDir}' | ${cu "sort"} --reverse | ${cu "tail"} -n+${toString (backupCount + 1)}); do
|
|
||||||
${cu "rm"} "$file"
|
|
||||||
done
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
{ config, pkgs, lib, ... }:
|
|
||||||
let
|
|
||||||
cfg = config.services.gitea;
|
|
||||||
GNUPGHOME = "${config.users.users.gitea.home}/gnupg";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
sops.secrets = {
|
|
||||||
"gitea/gpg-signing-key-public" = {
|
|
||||||
owner = cfg.user;
|
|
||||||
inherit (cfg) group;
|
|
||||||
restartUnits = [
|
|
||||||
"gitea.service"
|
|
||||||
"gitea-ensure-gnupg-homedir.service"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
"gitea/gpg-signing-key-private" = {
|
|
||||||
owner = cfg.user;
|
|
||||||
inherit (cfg) group;
|
|
||||||
restartUnits = [
|
|
||||||
"gitea.service"
|
|
||||||
"gitea-ensure-gnupg-homedir.service"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.gitea.environment = { inherit GNUPGHOME; };
|
|
||||||
|
|
||||||
systemd.tmpfiles.settings."20-gitea-gnugpg".${GNUPGHOME}.d = {
|
|
||||||
inherit (cfg) user group;
|
|
||||||
mode = "700";
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.gitea-ensure-gnupg-homedir = {
|
|
||||||
description = "Import gpg key for gitea";
|
|
||||||
before = [ "gitea.service" ];
|
|
||||||
environment = { inherit GNUPGHOME; };
|
|
||||||
serviceConfig = {
|
|
||||||
Type = "oneshot";
|
|
||||||
User = cfg.user;
|
|
||||||
PrivateNetwork = true;
|
|
||||||
};
|
|
||||||
script = ''
|
|
||||||
${lib.getExe pkgs.gnupg} --import ${config.sops.secrets."gitea/gpg-signing-key-public".path}
|
|
||||||
${lib.getExe pkgs.gnupg} --import ${config.sops.secrets."gitea/gpg-signing-key-private".path}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
services.gitea.settings."repository.signing" = {
|
|
||||||
SIGNING_KEY = "0549C43374D2253C";
|
|
||||||
SIGNING_NAME = "PVV Git";
|
|
||||||
SIGNING_EMAIL = "gitea@git.pvv.ntnu.no";
|
|
||||||
INITIAL_COMMIT = "always";
|
|
||||||
WIKI = "always";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{ ... }:
|
|
||||||
{
|
|
||||||
services.nginx.enable = true;
|
|
||||||
}
|
|
||||||
44
hosts/kvernberg/configuration.nix
Normal file
44
hosts/kvernberg/configuration.nix
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{ config, fp, pkgs, values, ... }:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
# Include the results of the hardware scan.
|
||||||
|
./hardware-configuration.nix
|
||||||
|
(fp /base)
|
||||||
|
(fp /misc/metrics-exporters.nix)
|
||||||
|
./disks.nix
|
||||||
|
|
||||||
|
./services/pvvvvvv
|
||||||
|
];
|
||||||
|
|
||||||
|
sops.defaultSopsFile = fp /secrets/kvernberg/kvernberg.yaml;
|
||||||
|
sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
|
||||||
|
sops.age.keyFile = "/var/lib/sops-nix/key.txt";
|
||||||
|
sops.age.generateKey = true;
|
||||||
|
|
||||||
|
boot.loader.systemd-boot.enable = true;
|
||||||
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
|
|
||||||
|
networking.hostName = "kvernberg"; # Define your hostname.
|
||||||
|
|
||||||
|
systemd.network.networks."30-all" = values.defaultNetworkConfig // {
|
||||||
|
matchConfig.Name = "en*";
|
||||||
|
address = with values.hosts.kvernberg; [ (ipv4 + "/25") (ipv6 + "/64") ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# List packages installed in system profile
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
# No devices with SMART
|
||||||
|
services.smartd.enable = false;
|
||||||
|
|
||||||
|
# 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?
|
||||||
|
|
||||||
|
}
|
||||||
39
hosts/kvernberg/disks.nix
Normal file
39
hosts/kvernberg/disks.nix
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# Example to create a bios compatible gpt partition
|
||||||
|
{ lib, ... }:
|
||||||
|
{
|
||||||
|
disko.devices = {
|
||||||
|
disk.disk1 = {
|
||||||
|
device = lib.mkDefault "/dev/sda";
|
||||||
|
type = "disk";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
boot = {
|
||||||
|
name = "boot";
|
||||||
|
size = "1M";
|
||||||
|
type = "EF02";
|
||||||
|
};
|
||||||
|
esp = {
|
||||||
|
name = "ESP";
|
||||||
|
size = "500M";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
root = {
|
||||||
|
name = "root";
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "ext4";
|
||||||
|
mountpoint = "/";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -13,20 +13,7 @@
|
|||||||
boot.kernelModules = [ ];
|
boot.kernelModules = [ ];
|
||||||
boot.extraModulePackages = [ ];
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
fileSystems."/" =
|
swapDevices = [ ];
|
||||||
{ device = "/dev/disk/by-uuid/d421538f-a260-44ae-8e03-47cac369dcc1";
|
|
||||||
fsType = "btrfs";
|
|
||||||
};
|
|
||||||
|
|
||||||
fileSystems."/boot" =
|
|
||||||
{ device = "/dev/disk/by-uuid/86CD-4C23";
|
|
||||||
fsType = "vfat";
|
|
||||||
options = [ "fmask=0077" "dmask=0077" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
swapDevices =
|
|
||||||
[ { device = "/dev/disk/by-uuid/4cfbb41e-801f-40dd-8c58-0a0c1a6025f6"; }
|
|
||||||
];
|
|
||||||
|
|
||||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||||
11
hosts/kvernberg/services/pvvvvvv/default.nix
Normal file
11
hosts/kvernberg/services/pvvvvvv/default.nix
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./exchange.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
services.taler = {
|
||||||
|
settings = {
|
||||||
|
taler.CURRENCY = "SCHPENN";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
152
hosts/kvernberg/services/pvvvvvv/exchange.nix
Normal file
152
hosts/kvernberg/services/pvvvvvv/exchange.nix
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
{ config, lib, fp, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.services.taler;
|
||||||
|
inherit (cfg.settings.taler) CURRENCY;
|
||||||
|
in {
|
||||||
|
sops.secrets.exchange-offline-master = {
|
||||||
|
format = "binary";
|
||||||
|
sopsFile = fp /secrets/kvernberg/exhange-offline-master.priv;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.taler.exchange = {
|
||||||
|
enable = true;
|
||||||
|
debug = true;
|
||||||
|
openFirewall = true;
|
||||||
|
denominationConfig = ''
|
||||||
|
## Old denomination names cannot be used again
|
||||||
|
#[COIN-${CURRENCY}-k1-1-0]
|
||||||
|
|
||||||
|
## NOK Denominations
|
||||||
|
[coin-${CURRENCY}-nok-1-0]
|
||||||
|
VALUE = ${CURRENCY}:1
|
||||||
|
DURATION_WITHDRAW = 7 days
|
||||||
|
DURATION_SPEND = 1 years
|
||||||
|
DURATION_LEGAL = 3 years
|
||||||
|
FEE_WITHDRAW = ${CURRENCY}:0
|
||||||
|
FEE_DEPOSIT = ${CURRENCY}:0
|
||||||
|
FEE_REFRESH = ${CURRENCY}:0
|
||||||
|
FEE_REFUND = ${CURRENCY}:0
|
||||||
|
RSA_KEYSIZE = 2048
|
||||||
|
CIPHER = RSA
|
||||||
|
|
||||||
|
[coin-${CURRENCY}-nok-5-0]
|
||||||
|
VALUE = ${CURRENCY}:5
|
||||||
|
DURATION_WITHDRAW = 7 days
|
||||||
|
DURATION_SPEND = 1 years
|
||||||
|
DURATION_LEGAL = 3 years
|
||||||
|
FEE_WITHDRAW = ${CURRENCY}:0
|
||||||
|
FEE_DEPOSIT = ${CURRENCY}:0
|
||||||
|
FEE_REFRESH = ${CURRENCY}:0
|
||||||
|
FEE_REFUND = ${CURRENCY}:0
|
||||||
|
RSA_KEYSIZE = 2048
|
||||||
|
CIPHER = RSA
|
||||||
|
|
||||||
|
[coin-${CURRENCY}-nok-10-0]
|
||||||
|
VALUE = ${CURRENCY}:10
|
||||||
|
DURATION_WITHDRAW = 7 days
|
||||||
|
DURATION_SPEND = 1 years
|
||||||
|
DURATION_LEGAL = 3 years
|
||||||
|
FEE_WITHDRAW = ${CURRENCY}:0
|
||||||
|
FEE_DEPOSIT = ${CURRENCY}:0
|
||||||
|
FEE_REFRESH = ${CURRENCY}:0
|
||||||
|
FEE_REFUND = ${CURRENCY}:0
|
||||||
|
RSA_KEYSIZE = 2048
|
||||||
|
CIPHER = RSA
|
||||||
|
|
||||||
|
[coin-${CURRENCY}-nok-20-0]
|
||||||
|
VALUE = ${CURRENCY}:20
|
||||||
|
DURATION_WITHDRAW = 7 days
|
||||||
|
DURATION_SPEND = 1 years
|
||||||
|
DURATION_LEGAL = 3 years
|
||||||
|
FEE_WITHDRAW = ${CURRENCY}:0
|
||||||
|
FEE_DEPOSIT = ${CURRENCY}:0
|
||||||
|
FEE_REFRESH = ${CURRENCY}:0
|
||||||
|
FEE_REFUND = ${CURRENCY}:0
|
||||||
|
RSA_KEYSIZE = 2048
|
||||||
|
CIPHER = RSA
|
||||||
|
|
||||||
|
[coin-${CURRENCY}-nok-50-0]
|
||||||
|
VALUE = ${CURRENCY}:50
|
||||||
|
DURATION_WITHDRAW = 7 days
|
||||||
|
DURATION_SPEND = 1 years
|
||||||
|
DURATION_LEGAL = 3 years
|
||||||
|
FEE_WITHDRAW = ${CURRENCY}:0
|
||||||
|
FEE_DEPOSIT = ${CURRENCY}:0
|
||||||
|
FEE_REFRESH = ${CURRENCY}:0
|
||||||
|
FEE_REFUND = ${CURRENCY}:0
|
||||||
|
RSA_KEYSIZE = 2048
|
||||||
|
CIPHER = RSA
|
||||||
|
|
||||||
|
[coin-${CURRENCY}-nok-100-0]
|
||||||
|
VALUE = ${CURRENCY}:100
|
||||||
|
DURATION_WITHDRAW = 7 days
|
||||||
|
DURATION_SPEND = 1 years
|
||||||
|
DURATION_LEGAL = 3 years
|
||||||
|
FEE_WITHDRAW = ${CURRENCY}:0
|
||||||
|
FEE_DEPOSIT = ${CURRENCY}:0
|
||||||
|
FEE_REFRESH = ${CURRENCY}:0
|
||||||
|
FEE_REFUND = ${CURRENCY}:0
|
||||||
|
RSA_KEYSIZE = 2048
|
||||||
|
CIPHER = RSA
|
||||||
|
|
||||||
|
[coin-${CURRENCY}-nok-200-0]
|
||||||
|
VALUE = ${CURRENCY}:200
|
||||||
|
DURATION_WITHDRAW = 7 days
|
||||||
|
DURATION_SPEND = 1 years
|
||||||
|
DURATION_LEGAL = 3 years
|
||||||
|
FEE_WITHDRAW = ${CURRENCY}:0
|
||||||
|
FEE_DEPOSIT = ${CURRENCY}:0
|
||||||
|
FEE_REFRESH = ${CURRENCY}:0
|
||||||
|
FEE_REFUND = ${CURRENCY}:0
|
||||||
|
RSA_KEYSIZE = 2048
|
||||||
|
CIPHER = RSA
|
||||||
|
|
||||||
|
[coin-${CURRENCY}-nok-500-0]
|
||||||
|
VALUE = ${CURRENCY}:500
|
||||||
|
DURATION_WITHDRAW = 7 days
|
||||||
|
DURATION_SPEND = 1 years
|
||||||
|
DURATION_LEGAL = 3 years
|
||||||
|
FEE_WITHDRAW = ${CURRENCY}:0
|
||||||
|
FEE_DEPOSIT = ${CURRENCY}:0
|
||||||
|
FEE_REFRESH = ${CURRENCY}:0
|
||||||
|
FEE_REFUND = ${CURRENCY}:0
|
||||||
|
RSA_KEYSIZE = 2048
|
||||||
|
CIPHER = RSA
|
||||||
|
|
||||||
|
[coin-${CURRENCY}-nok-1000-0]
|
||||||
|
VALUE = ${CURRENCY}:1000
|
||||||
|
DURATION_WITHDRAW = 7 days
|
||||||
|
DURATION_SPEND = 1 years
|
||||||
|
DURATION_LEGAL = 3 years
|
||||||
|
FEE_WITHDRAW = ${CURRENCY}:0
|
||||||
|
FEE_DEPOSIT = ${CURRENCY}:0
|
||||||
|
FEE_REFRESH = ${CURRENCY}:0
|
||||||
|
FEE_REFUND = ${CURRENCY}:0
|
||||||
|
RSA_KEYSIZE = 2048
|
||||||
|
CIPHER = RSA
|
||||||
|
|
||||||
|
## PVV Special Prices
|
||||||
|
# 2024 pizza egenandel
|
||||||
|
[coin-${CURRENCY}-pvv-64-0]
|
||||||
|
VALUE = ${CURRENCY}:64
|
||||||
|
DURATION_WITHDRAW = 7 days
|
||||||
|
DURATION_SPEND = 1 years
|
||||||
|
DURATION_LEGAL = 3 years
|
||||||
|
FEE_WITHDRAW = ${CURRENCY}:0
|
||||||
|
FEE_DEPOSIT = ${CURRENCY}:0
|
||||||
|
FEE_REFRESH = ${CURRENCY}:0
|
||||||
|
FEE_REFUND = ${CURRENCY}:0
|
||||||
|
RSA_KEYSIZE = 2048
|
||||||
|
CIPHER = RSA
|
||||||
|
'';
|
||||||
|
settings = {
|
||||||
|
exchange = {
|
||||||
|
MASTER_PUBLIC_KEY = "J331T37C8E58P9CVE686P1JFH11DWSRJ3RE4GVDTXKES9M24ERZG";
|
||||||
|
BASE_URL = "http://kvernberg.pvv.ntnu.no:8081/";
|
||||||
|
};
|
||||||
|
exchange-offline = {
|
||||||
|
MASTER_PRIV_FILE = config.sops.secrets.exchange-offline-master.path;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
{ fp, values, lupineName, ... }:
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./hardware-configuration/${lupineName}.nix
|
|
||||||
|
|
||||||
(fp /base)
|
|
||||||
|
|
||||||
./services/gitea-runner.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
sops.defaultSopsFile = fp /secrets/lupine/lupine.yaml;
|
|
||||||
sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
|
|
||||||
sops.age.keyFile = "/var/lib/sops-nix/key.txt";
|
|
||||||
sops.age.generateKey = true;
|
|
||||||
|
|
||||||
boot.loader.systemd-boot.enable = true;
|
|
||||||
boot.loader.efi.canTouchEfiVariables = true;
|
|
||||||
|
|
||||||
systemd.network.networks."30-enp0s31f6" = values.defaultNetworkConfig // {
|
|
||||||
matchConfig.Name = "enp0s31f6";
|
|
||||||
address = with values.hosts.${lupineName}; [ (ipv4 + "/25") (ipv6 + "/64") ];
|
|
||||||
networkConfig.LLDP = false;
|
|
||||||
};
|
|
||||||
systemd.network.wait-online = {
|
|
||||||
anyInterface = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# There are no smart devices
|
|
||||||
services.smartd.enable = false;
|
|
||||||
|
|
||||||
# Do not change, even during upgrades.
|
|
||||||
# See https://search.nixos.org/options?show=system.stateVersion
|
|
||||||
system.stateVersion = "25.05";
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
# 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" "sd_mod" ];
|
|
||||||
boot.initrd.kernelModules = [ ];
|
|
||||||
boot.kernelModules = [ "kvm-intel" ];
|
|
||||||
boot.extraModulePackages = [ ];
|
|
||||||
|
|
||||||
fileSystems."/" =
|
|
||||||
{ device = "/dev/disk/by-uuid/a949e2e8-d973-4925-83e4-bcd815e65af7";
|
|
||||||
fsType = "ext4";
|
|
||||||
};
|
|
||||||
|
|
||||||
fileSystems."/boot" =
|
|
||||||
{ device = "/dev/disk/by-uuid/81D6-38D3";
|
|
||||||
fsType = "vfat";
|
|
||||||
options = [ "fmask=0077" "dmask=0077" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
swapDevices =
|
|
||||||
[ { device = "/dev/disk/by-uuid/82c2d7fa-7cd0-4398-8cf6-c892bc56264b"; }
|
|
||||||
];
|
|
||||||
|
|
||||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
|
||||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
|
||||||
# still possible to use this option, but it's recommended to use it in conjunction
|
|
||||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
|
||||||
networking.useDHCP = lib.mkDefault true;
|
|
||||||
# networking.interfaces.enp0s31f6.useDHCP = lib.mkDefault true;
|
|
||||||
|
|
||||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
|
||||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
# 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" "sd_mod" ];
|
|
||||||
boot.initrd.kernelModules = [ ];
|
|
||||||
boot.kernelModules = [ "kvm-intel" ];
|
|
||||||
boot.extraModulePackages = [ ];
|
|
||||||
|
|
||||||
fileSystems."/" =
|
|
||||||
{ device = "/dev/disk/by-uuid/aa81d439-800b-403d-ac10-9d2aac3619d0";
|
|
||||||
fsType = "ext4";
|
|
||||||
};
|
|
||||||
|
|
||||||
fileSystems."/boot" =
|
|
||||||
{ device = "/dev/disk/by-uuid/4A34-6AE5";
|
|
||||||
fsType = "vfat";
|
|
||||||
options = [ "fmask=0077" "dmask=0077" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
swapDevices =
|
|
||||||
[ { device = "/dev/disk/by-uuid/efb7cd0c-c1ae-4a86-8bc2-8e7fd0066650"; }
|
|
||||||
];
|
|
||||||
|
|
||||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
|
||||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
|
||||||
# still possible to use this option, but it's recommended to use it in conjunction
|
|
||||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
|
||||||
networking.useDHCP = lib.mkDefault true;
|
|
||||||
# networking.interfaces.enp0s31f6.useDHCP = lib.mkDefault true;
|
|
||||||
|
|
||||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
|
||||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
# 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" "sd_mod" ];
|
|
||||||
boot.initrd.kernelModules = [ ];
|
|
||||||
boot.kernelModules = [ "kvm-intel" ];
|
|
||||||
boot.extraModulePackages = [ ];
|
|
||||||
|
|
||||||
fileSystems."/" =
|
|
||||||
{ device = "/dev/disk/by-uuid/39ba059b-3205-4701-a832-e72c0122cb88";
|
|
||||||
fsType = "ext4";
|
|
||||||
};
|
|
||||||
|
|
||||||
fileSystems."/boot" =
|
|
||||||
{ device = "/dev/disk/by-uuid/63FA-297B";
|
|
||||||
fsType = "vfat";
|
|
||||||
options = [ "fmask=0077" "dmask=0077" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
swapDevices =
|
|
||||||
[ { device = "/dev/disk/by-uuid/9c72eb54-ea8c-4b09-808a-8be9b9a33869"; }
|
|
||||||
];
|
|
||||||
|
|
||||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
|
||||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
|
||||||
# still possible to use this option, but it's recommended to use it in conjunction
|
|
||||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
|
||||||
networking.useDHCP = lib.mkDefault true;
|
|
||||||
# networking.interfaces.enp0s31f6.useDHCP = lib.mkDefault true;
|
|
||||||
|
|
||||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
|
||||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
# 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" "sd_mod" ];
|
|
||||||
boot.initrd.kernelModules = [ ];
|
|
||||||
boot.kernelModules = [ "kvm-intel" ];
|
|
||||||
boot.extraModulePackages = [ ];
|
|
||||||
|
|
||||||
fileSystems."/" =
|
|
||||||
{ device = "/dev/disk/by-uuid/5f8418ad-8ec1-4f9e-939e-f3a4c36ef343";
|
|
||||||
fsType = "ext4";
|
|
||||||
};
|
|
||||||
|
|
||||||
fileSystems."/boot" =
|
|
||||||
{ device = "/dev/disk/by-uuid/F372-37DF";
|
|
||||||
fsType = "vfat";
|
|
||||||
options = [ "fmask=0077" "dmask=0077" ];
|
|
||||||
};
|
|
||||||
|
|
||||||
swapDevices =
|
|
||||||
[ { device = "/dev/disk/by-uuid/27bf292d-bbb3-48c4-a86e-456e0f1f648f"; }
|
|
||||||
];
|
|
||||||
|
|
||||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
|
||||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
|
||||||
# still possible to use this option, but it's recommended to use it in conjunction
|
|
||||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
|
||||||
networking.useDHCP = lib.mkDefault true;
|
|
||||||
# networking.interfaces.enp0s31f6.useDHCP = lib.mkDefault true;
|
|
||||||
|
|
||||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
|
||||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
{ config, lupineName, ... }:
|
|
||||||
{
|
|
||||||
# This is unfortunately state, and has to be generated one at a time :(
|
|
||||||
# To do that, comment out all except one of the runners, fill in its token
|
|
||||||
# inside the sops file, rebuild the system, and only after this runner has
|
|
||||||
# successfully registered will gitea give you the next token.
|
|
||||||
# - oysteikt Sep 2023
|
|
||||||
sops = {
|
|
||||||
secrets."gitea/runners/token" = {
|
|
||||||
key = "gitea/runners/${lupineName}";
|
|
||||||
};
|
|
||||||
|
|
||||||
templates."gitea-runner-envfile" = {
|
|
||||||
restartUnits = [
|
|
||||||
"gitea-runner-${lupineName}.service"
|
|
||||||
];
|
|
||||||
content = ''
|
|
||||||
TOKEN="${config.sops.placeholder."gitea/runners/token"}"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services.gitea-actions-runner.instances = {
|
|
||||||
${lupineName} = {
|
|
||||||
enable = true;
|
|
||||||
name = "git-runner-${lupineName}";
|
|
||||||
url = "https://git.pvv.ntnu.no";
|
|
||||||
# NOTE: gitea actions runners need node inside their docker images,
|
|
||||||
# so we are a bit limited here.
|
|
||||||
labels = [
|
|
||||||
"debian-latest:docker://node:current-trixie"
|
|
||||||
"debian-trixie:docker://node:current-trixie"
|
|
||||||
"debian-bookworm:docker://node:current-bookworm"
|
|
||||||
"debian-bullseye:docker://node:current-bullseye"
|
|
||||||
|
|
||||||
"debian-latest-slim:docker://node:current-trixie-slim"
|
|
||||||
"debian-trixie-slim:docker://node:current-trixie-slim"
|
|
||||||
"debian-bookworm-slim:docker://node:current-bookworm-slim"
|
|
||||||
"debian-bullseye-slim:docker://node:current-bullseye-slim"
|
|
||||||
|
|
||||||
"alpine-latest:docker://node:current-alpine"
|
|
||||||
"alpine-3.22:docker://node:current-alpine3.22"
|
|
||||||
"alpine-3.21:docker://node:current-alpine3.21"
|
|
||||||
|
|
||||||
# See https://gitea.com/gitea/runner-images
|
|
||||||
"ubuntu-latest:docker://docker.gitea.com/runner-images:ubuntu-latest"
|
|
||||||
"ubuntu-24.04:docker://docker.gitea.com/runner-images:ubuntu-24.04"
|
|
||||||
"ubuntu-noble:docker://docker.gitea.com/runner-images:ubuntu-24.04"
|
|
||||||
"ubuntu-22.04:docker://docker.gitea.com/runner-images:ubuntu-22.04"
|
|
||||||
"ubuntu-jammy:docker://docker.gitea.com/runner-images:ubuntu-22.04"
|
|
||||||
|
|
||||||
"ubuntu-latest-slim:docker://docker.gitea.com/runner-images:ubuntu-latest-slim"
|
|
||||||
"ubuntu-24.04-slim:docker://docker.gitea.com/runner-images:ubuntu-24.04-slim"
|
|
||||||
"ubuntu-noble-slim:docker://docker.gitea.com/runner-images:ubuntu-24.04-slim"
|
|
||||||
"ubuntu-22.04-slim:docker://docker.gitea.com/runner-images:ubuntu-22.04-slim"
|
|
||||||
"ubuntu-jammy-slim:docker://docker.gitea.com/runner-images:ubuntu-22.04-slim"
|
|
||||||
];
|
|
||||||
tokenFile = config.sops.templates."gitea-runner-envfile".path;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
virtualisation.podman = {
|
|
||||||
enable = true;
|
|
||||||
defaultNetwork.settings.dns_enabled = true;
|
|
||||||
autoPrune.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
networking.dhcpcd.IPv6rs = false;
|
|
||||||
|
|
||||||
networking.firewall.interfaces."podman+".allowedUDPPorts = [53 5353];
|
|
||||||
}
|
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
# Include the results of the hardware scan.
|
# Include the results of the hardware scan.
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
(fp /base)
|
(fp /base)
|
||||||
|
(fp /misc/metrics-exporters.nix)
|
||||||
];
|
];
|
||||||
|
|
||||||
sops.defaultSopsFile = fp /secrets/shark/shark.yaml;
|
sops.defaultSopsFile = fp /secrets/shark/shark.yaml;
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
{ config, fp, pkgs, lib, values, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
(fp /base)
|
|
||||||
|
|
||||||
./services/gitea-runners.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
sops.defaultSopsFile = fp /secrets/ustetind/ustetind.yaml;
|
|
||||||
sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
|
|
||||||
sops.age.keyFile = "/var/lib/sops-nix/key.txt";
|
|
||||||
sops.age.generateKey = true;
|
|
||||||
|
|
||||||
networking.hostName = "ustetind";
|
|
||||||
|
|
||||||
networking.useHostResolvConf = lib.mkForce false;
|
|
||||||
|
|
||||||
systemd.network.networks = {
|
|
||||||
"30-lxc-eth" = values.defaultNetworkConfig // {
|
|
||||||
matchConfig = {
|
|
||||||
Type = "ether";
|
|
||||||
Kind = "veth";
|
|
||||||
Name = [
|
|
||||||
"eth*"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
address = with values.hosts.ustetind; [ (ipv4 + "/25") (ipv6 + "/64") ];
|
|
||||||
};
|
|
||||||
"40-podman-veth" = values.defaultNetworkConfig // {
|
|
||||||
matchConfig = {
|
|
||||||
Type = "ether";
|
|
||||||
Kind = "veth";
|
|
||||||
Name = [
|
|
||||||
"veth*"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
DHCP = "yes";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
system.stateVersion = "24.11";
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
{ config, fp, pkgs, values, lib, ... }:
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
# Include the results of the hardware scan.
|
|
||||||
./hardware-configuration.nix
|
|
||||||
(fp /base)
|
|
||||||
];
|
|
||||||
|
|
||||||
nix.settings.trusted-users = [ "@nix-builder-users" ];
|
|
||||||
nix.daemonCPUSchedPolicy = "batch";
|
|
||||||
|
|
||||||
boot.binfmt.emulatedSystems = [
|
|
||||||
"aarch64-linux"
|
|
||||||
"armv7l-linux"
|
|
||||||
];
|
|
||||||
|
|
||||||
sops.defaultSopsFile = fp /secrets/wenche/wenche.yaml;
|
|
||||||
sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
|
|
||||||
sops.age.keyFile = "/var/lib/sops-nix/key.txt";
|
|
||||||
sops.age.generateKey = true;
|
|
||||||
|
|
||||||
boot.loader.grub.device = "/dev/sda";
|
|
||||||
|
|
||||||
networking.hostName = "wenche"; # Define your hostname.
|
|
||||||
|
|
||||||
systemd.network.networks."30-ens18" = values.defaultNetworkConfig // {
|
|
||||||
matchConfig.Name = "ens18";
|
|
||||||
address = with values.hosts.wenche; [ (ipv4 + "/25") (ipv6 + "/64") ];
|
|
||||||
};
|
|
||||||
|
|
||||||
hardware.graphics.enable = true;
|
|
||||||
services.xserver.videoDrivers = [ "nvidia" ];
|
|
||||||
hardware.nvidia = {
|
|
||||||
modesetting.enable = true;
|
|
||||||
open = false;
|
|
||||||
package = config.boot.kernelPackages.nvidiaPackages.production;
|
|
||||||
};
|
|
||||||
|
|
||||||
# List packages installed in system profile
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
];
|
|
||||||
|
|
||||||
system.stateVersion = "24.11"; # Did you read the comment?
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
{ config, lib, pkgs, modulesPath, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
imports =
|
|
||||||
[ (modulesPath + "/profiles/qemu-guest.nix")
|
|
||||||
];
|
|
||||||
|
|
||||||
boot.initrd.availableKernelModules = [ "ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod" ];
|
|
||||||
boot.initrd.kernelModules = [ ];
|
|
||||||
boot.kernelModules = [ "nvidia" ];
|
|
||||||
boot.extraModulePackages = [ ];
|
|
||||||
|
|
||||||
fileSystems."/" =
|
|
||||||
{ device = "/dev/disk/by-uuid/4e8ecdd2-d453-4fff-b952-f06da00f3b85";
|
|
||||||
fsType = "ext4";
|
|
||||||
};
|
|
||||||
|
|
||||||
swapDevices = [ {
|
|
||||||
device = "/var/lib/swapfile";
|
|
||||||
size = 16*1024;
|
|
||||||
} ];
|
|
||||||
|
|
||||||
networking.useDHCP = lib.mkDefault false;
|
|
||||||
# networking.interfaces.ens18.useDHCP = lib.mkDefault true;
|
|
||||||
|
|
||||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user