My Nix Configuration

Compare changes

Choose any two refs to compare.

Changed files
+11007 -8887
.zed
checks
deploy
devShells
homeModules
homes
x86_64-linux
pyrox@marvin
pyrox@prefect
pyrox@thought
pyrox@zaphod
thehedgehog@marvin
thehedgehog@prefect
thehedgehog@thought
thehedgehog@zaphod
hosts
marvin
prefect
thought
zaphod
lib
modules
nixosModules
overlays
bluez-wiimote
cinny
hy3-fixes
nix-index
nixos-option
openssh-fixperms
sway-unwrapped
packages
shells
default
systems
x86_64-linux
marvin
prefect
thought
zaphod
templates
+7 -6
.envrc
···
-
if ! has nix_direnv_version || ! nix_direnv_version 3.0.6; then
-
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.6/direnvrc" "sha256-RYcUJaRMf8oF5LznDrlCXbkOQrywm0HDv1VjYGaJGdM="
+
if ! has nix_direnv_version || ! nix_direnv_version 3.1.0; then
+
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.1.0/direnvrc" "sha256-yMJ2OVMzrFaDPn7q8nCBZFRYpL/f0RcHzhmw/i6btJM="
fi
-
export NH_FLAKE=$(pwd)
+
export NH_NOM=1
+
export NH_LOG=nh=info
+
NH_FLAKE=$(pwd)
+
export NH_FLAKE
-
if [[ $(hostname) == "zaphod" ]]; then
-
use flake . --accept-flake-config
-
fi
+
use flake . --accept-flake-config
+31
.nvim.lua
···
+
local nvim_lsp = require("lspconfig")
+
nvim_lsp.nixd.setup({
+
cmd = { "nixd" },
+
settings = {
+
nixd = {
+
nixpkgs = {
+
expr = "import <nixpkgs> { }",
+
},
+
formatting = {
+
command = { "treefmt" },
+
},
+
options = {
+
nixos = {
+
expr = "(builtins.getFlake (builtins.toString ./.)).nixosConfigurations.zaphod.options",
+
},
+
home_manager = {
+
expr = "(builtins.getFlake (builtins.toString ./.)).nixosConfigurations.zaphod.options.home-manager.users.type.getSubOptions []",
+
},
+
flake_parts = {
+
expr = "(builtins.getFlake (builtins.toString ./.)).debug.options",
+
},
+
flake_parts_perSystem = {
+
expr = "(builtins.getFlake (builtins.toString ./.)).currentSystem.options",
+
},
+
my_modules = {
+
exper = "(pkgs.lib.evalModules { modules = (builtins.getFlake (builtins.toString ./.)).nixosModules; }).options",
+
},
+
},
+
},
+
},
+
})
+1
.shellcheckrc
···
+
disable=SC2148
+23
.zed/settings.json
···
+
// Folder-specific settings
+
//
+
// For a full list of overridable settings, and general information on folder-specific settings,
+
// see the documentation: https://zed.dev/docs/configuring-zed#settings-files
+
{
+
"lsp": {
+
"nixd": {
+
"settings": {
+
"options": {
+
"nixos": {
+
"expr": "(builtins.getFlake (builtins.toString ./.)).nixosConfigurations.zaphod.options"
+
},
+
"home-manager": {
+
"expr": "(builtins.getFlake (builtins.toString ./.)).nixosConfigurations.zaphod.options.home-manager.users.type.getSubOptions []"
+
},
+
"flake-parts": {
+
"expr": "(builtins.getFlake (builtins.toString ./.)).debug.options"
+
}
+
}
+
}
+
}
+
}
+
}
+4 -2
Justfile
···
alias s := switch
build:
-
nh os build . --verbose -- --show-trace --accept-flake-config
+
nixos-rebuild-ng build --flake . --accept-flake-config --verbose --show-trace \
+
--max-jobs 3 --cores 6 \
+
&& nvd diff /run/current-system result
switch:
-
nh os switch . --verbose -- --show-trace --accept-flake-config
+
nixos-rebuild-ng switch --flake . --accept-flake-config --verbose --show-trace --sudo
+30 -18
README.md
···
# PyroConf, a custom Nix config
## No Place Like ~
-
This is PyroNet's (relatively) production-grade NixOS config repo. It contains configurations for 3 different machines, as well as `home-manager` configurations.
-
I try to keep the configuration organized. All home-manager related items go in `/home`, host configurations go in `/hosts`, and custom packages are in `/pkgs`, among other folders.
+
This is PyroNet's (relatively) production-grade NixOS config repo. It contains configurations for 3 different machines,
+
as well as `home-manager` configurations.
-
My machines serve production infra for *.pyrox.dev domains. There are a few exceptions:
-
* [My blog](https://blog.pyrox.dev), and the [root domain](https://pyrox.dev) which are served by [OMG.LOL](https://omg.lol).
-
I highly recommend their services, as you get a great domain name at a company that cares about you. If you do sign up, consider using [my referral link](https://omg.lol?refer=py), as I get 3 months of service credit if you sign up through it.
+
I try to keep the configuration organized. All home-manager related items go in `/home`, host configurations go in
+
`/hosts`, and custom packages are in `/pkgs`, among other folders.
+
+
My machines serve production infra for \*.pyrox.dev domains. There are a few exceptions:
+
+
- [My blog](https://blog.pyrox.dev), and the [root domain](https://pyrox.dev) which are served by
+
[OMG.LOL](https://omg.lol). I highly recommend their services, as you get a great domain name at a company that cares
+
about you. If you do sign up, consider using [my referral link](https://omg.lol?refer=py), as I get 3 months of
+
service credit if you sign up through it.
There are some services I run that many homelabs do not. They are:
-
* Authoritative DNS for my domains, run on `prefect`.
-
* A Tailscale tunnel from `marvin` to `prefect` which allows me to run services on `marvin` while having them be externally accessible.
-
* Email services for my domains, also run on `prefect`, with all email data backed up hourly to `marvin`, ensuring data reliability.
-
* Connections to the [DN42](https://dn42.us) network, run on `prefect`.
+
+
- Authoritative DNS for my domains, run on `prefect`.
+
- A Tailscale tunnel from `marvin` to `prefect` which allows me to run services on `marvin` while having them be
+
externally accessible.
+
- Email services for my domains, also run on `prefect`, with all email data backed up hourly to `marvin`, ensuring data
+
reliability.
+
- Connections to the [DN42](https://dn42.us) network, run on `prefect`.
I also run many typical homelab services, such as:
-
* [Vaultwarden](https://github.com/danigarcia/vaultwarden) for passwords
-
* [Jellyfin](https://jellyfin.org) for media
-
* [Authentik](https://goauthentik.io) for central auth
-
* And many more
+
+
- [Vaultwarden](https://github.com/danigarcia/vaultwarden) for passwords
+
- [Jellyfin](https://jellyfin.org) for media
+
- [Authentik](https://goauthentik.io) for central auth
+
- And many more
# Contact
-
If you have any questions about any of the services I run, or would like to reach out, my contact info is on my profile [here](https://pyrox.dev)
+
+
If you have any questions about any of the services I run, or would like to reach out, my contact info is on my profile
+
[here](https://pyrox.dev)
# License
-
Copyright (c) 2023 Pyrox and PyroNet. All rights reserved.
-
This Source Code Form is subject to the terms of the Mozilla Public
-
License, v. 2.0. If a copy of the MPL was not distributed with this
-
file, You can obtain one at <http://mozilla.org/MPL/2.0/>.
+
+
Copyright (c) 2023 Pyrox and PyroNet. All rights reserved. This Source Code Form is subject to the terms of the Mozilla
+
Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at
+
<http://mozilla.org/MPL/2.0/>.
-4
TODO.md
···
- [ ] Add Attic and use as an internal binary cache
- [ ] https://docs.attic.rs/
-
- [ ] Switch Authentik from Docker to Authentik-nix
-
- https://github.com/nix-community/authentik-nix
- [ ] Move all Docker containers to using native versions of databases, redis, etc.
- Ensures higher performance and reduces the number of running containers.
- https://github.com/felschr/nixos-config/blob/main/services/immich.nix for an example of how to do it
-
- [ ] Add Archivebox service(needs custom module)
-
- [ ] Add Immich service
## Zaphod
-2
checks/deploy/default.nix
···
-
{ inputs, ... }:
-
builtins.mapAttrs (_: deployLib: deployLib.deployChecks inputs.self.deploy) inputs.deploy-rs.lib
+22
devShells/default/default.nix
···
+
{
+
pkgs,
+
...
+
}:
+
pkgs.mkShellNoCC {
+
packages = [
+
# keep-sorted start
+
pkgs.deadnix
+
pkgs.just
+
pkgs.nil
+
pkgs.nix-output-monitor
+
pkgs.nix-tree
+
pkgs.nix-update
+
pkgs.nixd
+
pkgs.nixfmt-rfc-style
+
pkgs.nixos-rebuild-ng
+
pkgs.nvd
+
pkgs.statix
+
pkgs.tokei
+
# keep-sorted endd
+
];
+
}
+9
devShells/default.nix
···
+
_: {
+
perSystem =
+
{ pkgs, ... }:
+
{
+
devShells = {
+
default = pkgs.callPackage ./default { };
+
};
+
};
+
}
+398 -522
flake.lock
···
{
"nodes": {
+
"actor-typeahead-src": {
+
"flake": false,
+
"locked": {
+
"lastModified": 1762835797,
+
"narHash": "sha256-heizoWUKDdar6ymfZTnj3ytcEv/L4d4fzSmtr0HlXsQ=",
+
"ref": "refs/heads/main",
+
"rev": "677fe7f743050a4e7f09d4a6f87bbf1325a06f6b",
+
"revCount": 6,
+
"type": "git",
+
"url": "https://tangled.org/@jakelazaroff.com/actor-typeahead"
+
},
+
"original": {
+
"type": "git",
+
"url": "https://tangled.org/@jakelazaroff.com/actor-typeahead"
+
}
+
},
"agenix": {
"inputs": {
"darwin": "darwin",
···
"nixpkgs": [
"nixpkgs"
],
-
"systems": [
-
"systems"
-
]
+
"systems": "systems"
},
"locked": {
-
"lastModified": 1736955230,
-
"narHash": "sha256-uenf8fv2eG5bKM8C/UvFaiJMZ4IpUFaQxk9OH5t/1gA=",
+
"lastModified": 1762618334,
+
"narHash": "sha256-wyT7Pl6tMFbFrs8Lk/TlEs81N6L+VSybPfiIgzU8lbQ=",
"owner": "ryantm",
"repo": "agenix",
-
"rev": "e600439ec4c273cf11e06fe4d9d906fb98fa097c",
+
"rev": "fcdea223397448d35d9b31f798479227e80183f6",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"authentik": {
+
"bird": {
"inputs": {
-
"authentik-src": "authentik-src",
-
"flake-compat": [
-
"flake-compat"
-
],
+
"flake-utils": "flake-utils",
+
"nixpkgs": [
+
"dn42",
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1757884119,
+
"narHash": "sha256-RF0Em7PjDRaQ5cBFgc3fL22qgDVbv2HoVW1TDRaaSNo=",
+
"owner": "NuschtOS",
+
"repo": "bird.nix",
+
"rev": "f8d18c2c8eebd477987001a9c0af50a9ca7909e5",
+
"type": "github"
+
},
+
"original": {
+
"owner": "NuschtOS",
+
"repo": "bird.nix",
+
"type": "github"
+
}
+
},
+
"buildbot-nix": {
+
"inputs": {
"flake-parts": [
"flake-parts"
],
-
"flake-utils": [
-
"flake-utils"
-
],
-
"napalm": "napalm",
+
"hercules-ci-effects": "hercules-ci-effects",
"nixpkgs": [
"nixpkgs"
],
-
"poetry2nix": "poetry2nix",
-
"systems": "systems"
+
"treefmt-nix": []
},
"locked": {
-
"lastModified": 1738503522,
-
"narHash": "sha256-1yrVbGLBMBPl34EibVARkUB9Gak1GjLRLZXJk9jbHxU=",
+
"lastModified": 1763946641,
+
"narHash": "sha256-kPP7k2b+Dkd91yJO01y3l1F0t+Mqvv8+FrPfjcCwszg=",
"owner": "nix-community",
-
"repo": "authentik-nix",
-
"rev": "bc62d5509989f5dca633c65b58aa0ac79a48db3e",
+
"repo": "buildbot-nix",
+
"rev": "cd32d1c420320383bfcc80c1b0b402b6a7eccc23",
"type": "github"
},
"original": {
"owner": "nix-community",
-
"repo": "authentik-nix",
+
"repo": "buildbot-nix",
"type": "github"
}
},
-
"authentik-src": {
-
"flake": false,
+
"caelestia": {
+
"inputs": {
+
"caelestia-cli": "caelestia-cli",
+
"nixpkgs": [
+
"nixpkgs"
+
],
+
"quickshell": [
+
"quickshell"
+
]
+
},
"locked": {
-
"lastModified": 1738183650,
-
"narHash": "sha256-4XdYlqfd23TVPaJ0R5tEBIpDXLV4mFHdXhIWp5dIvIE=",
-
"owner": "goauthentik",
-
"repo": "authentik",
-
"rev": "f1b7a9f934e6b58a1884ba753575eac6267f4b6e",
+
"lastModified": 1764466211,
+
"narHash": "sha256-rBK+usqfAP9ZuEthw9wMCwTKQgKUMmziuzrrkpDZdzY=",
+
"owner": "caelestia-dots",
+
"repo": "shell",
+
"rev": "40813e520582c5df11f6d4c870a31900fe171cce",
"type": "github"
},
"original": {
-
"owner": "goauthentik",
-
"ref": "version/2024.12.3",
-
"repo": "authentik",
+
"owner": "caelestia-dots",
+
"repo": "shell",
"type": "github"
}
},
-
"blobs": {
-
"flake": false,
-
"locked": {
-
"lastModified": 1604995301,
-
"narHash": "sha256-wcLzgLec6SGJA8fx1OEN1yV/Py5b+U5iyYpksUY/yLw=",
-
"owner": "simple-nixos-mailserver",
-
"repo": "blobs",
-
"rev": "2cccdf1ca48316f2cfd1c9a0017e8de5a7156265",
-
"type": "gitlab"
-
},
-
"original": {
-
"owner": "simple-nixos-mailserver",
-
"repo": "blobs",
-
"type": "gitlab"
-
}
-
},
-
"buildbot-nix": {
+
"caelestia-cli": {
"inputs": {
-
"flake-parts": [
-
"flake-parts"
+
"caelestia-shell": [
+
"caelestia"
],
-
"hercules-ci-effects": "hercules-ci-effects",
"nixpkgs": [
+
"caelestia",
"nixpkgs"
-
],
-
"treefmt-nix": "treefmt-nix_2"
+
]
},
"locked": {
-
"lastModified": 1739456434,
-
"narHash": "sha256-uJAPcqNplLPM0L6vzZCkghyU6vLQzZm+zOzDODq/pY8=",
-
"owner": "Mic92",
-
"repo": "buildbot-nix",
-
"rev": "dfa7ed3c4e3b300b6e8bd02ffda6cbc6aa2b2817",
+
"lastModified": 1764381410,
+
"narHash": "sha256-WR/oQQjveFqQxo8oHngZuOVgBQINDgPe+lCXLeNhAAg=",
+
"owner": "caelestia-dots",
+
"repo": "cli",
+
"rev": "ed12d4cb82600872a82feb577711be1148c7af35",
"type": "github"
},
"original": {
-
"owner": "Mic92",
-
"repo": "buildbot-nix",
+
"owner": "caelestia-dots",
+
"repo": "cli",
"type": "github"
}
},
···
"nixpkgs": "nixpkgs"
},
"locked": {
-
"lastModified": 1739934729,
-
"narHash": "sha256-PcrLk10meIJICzUJqtCMOJxoITzbH52fZg2XAB7SSsM=",
+
"lastModified": 1764325801,
+
"narHash": "sha256-LQ7tsrXs1wuB6KBwUctL3JlUsG/FWI2pCI6NkoO52dk=",
"owner": "catppuccin",
"repo": "nix",
-
"rev": "b1ff2a638afa827f1473498190a2c1cae1cf41cf",
+
"rev": "a696fed6b9b6aa89ef495842cdca3fc2a7cef0de",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1700795494,
-
"narHash": "sha256-gzGLZSiOhf155FW7262kdHo2YDeugp3VuIFb4/GGng0=",
+
"lastModified": 1744478979,
+
"narHash": "sha256-dyN+teG9G82G+m+PX/aSAagkC+vUv0SgUw3XkPhQodQ=",
"owner": "lnl7",
"repo": "nix-darwin",
-
"rev": "4b9b83d5a92e8c1fbfd8eb27eda375908c11ec4d",
+
"rev": "43975d782b418ebf4969e9ccba82466728c2851b",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"deploy-rs": {
+
"dgop": {
"inputs": {
-
"flake-compat": [
-
"flake-compat"
-
],
"nixpkgs": [
+
"dms",
"nixpkgs"
-
],
-
"utils": [
-
"flake-utils"
]
},
"locked": {
-
"lastModified": 1727447169,
-
"narHash": "sha256-3KyjMPUKHkiWhwR91J1YchF6zb6gvckCAY1jOE+ne0U=",
-
"owner": "serokell",
-
"repo": "deploy-rs",
-
"rev": "aa07eb05537d4cd025e2310397a6adcedfe72c76",
+
"lastModified": 1762435535,
+
"narHash": "sha256-QhzRn7pYN35IFpKjjxJAj3GPJECuC+VLhoGem3ezycc=",
+
"owner": "AvengeMedia",
+
"repo": "dgop",
+
"rev": "6cf638dde818f9f8a2e26d0243179c43cb3458d7",
"type": "github"
},
"original": {
-
"owner": "serokell",
-
"repo": "deploy-rs",
+
"owner": "AvengeMedia",
+
"repo": "dgop",
"type": "github"
}
},
-
"devshell": {
+
"dms": {
"inputs": {
+
"dgop": "dgop",
"nixpkgs": [
-
"topology",
"nixpkgs"
]
},
"locked": {
-
"lastModified": 1728330715,
-
"narHash": "sha256-xRJ2nPOXb//u1jaBnDP56M7v5ldavjbtR6lfGqSvcKg=",
-
"owner": "numtide",
-
"repo": "devshell",
-
"rev": "dd6b80932022cea34a019e2bb32f6fa9e494dfef",
+
"lastModified": 1764553800,
+
"narHash": "sha256-kHlx3E3K2UNWI1Hpbyl5zieoOVevZfwz8P/OcyViDHY=",
+
"owner": "AvengeMedia",
+
"repo": "DankMaterialShell",
+
"rev": "7959a795753d9f646cfb9e21cfb778adf7e5c933",
+
"type": "github"
+
},
+
"original": {
+
"owner": "AvengeMedia",
+
"repo": "DankMaterialShell",
+
"type": "github"
+
}
+
},
+
"dms-plugins": {
+
"flake": false,
+
"locked": {
+
"lastModified": 1764085668,
+
"narHash": "sha256-KtOu12NVLdyho9T4EXJaReNhFO98nAXpemkb6yeOvwE=",
+
"owner": "AvengeMedia",
+
"repo": "dms-plugins",
+
"rev": "3bc66f186a8184cb8eca5fdfc0699cb4a828cd90",
+
"type": "github"
+
},
+
"original": {
+
"owner": "AvengeMedia",
+
"repo": "dms-plugins",
+
"type": "github"
+
}
+
},
+
"dms-power-usage": {
+
"flake": false,
+
"locked": {
+
"lastModified": 1760429135,
+
"narHash": "sha256-M/H4nlAzUFrxZ01ldaR/YH1hqVN4vlBrkaCUqjtMaTM=",
+
"owner": "Daniel-42-z",
+
"repo": "dms-power-usage",
+
"rev": "3f75b651d90210c6f9442a099cf14262ac47750d",
"type": "github"
},
"original": {
-
"owner": "numtide",
-
"repo": "devshell",
+
"owner": "Daniel-42-z",
+
"repo": "dms-power-usage",
"type": "github"
}
},
-
"dns": {
+
"dms-wp-shuffler": {
+
"flake": false,
+
"locked": {
+
"lastModified": 1760657995,
+
"narHash": "sha256-71kZLdVZmWMG+sgpbPHH8RFGmvLWve9NNTpZNJXrRd4=",
+
"owner": "Daniel-42-z",
+
"repo": "dms-wallpaper-shuffler",
+
"rev": "cc459906990e562d3a332bd5c6869e8f5af1ee52",
+
"type": "github"
+
},
+
"original": {
+
"owner": "Daniel-42-z",
+
"repo": "dms-wallpaper-shuffler",
+
"type": "github"
+
}
+
},
+
"dn42": {
"inputs": {
-
"flake-utils": [
-
"flake-utils"
-
],
+
"bird": "bird",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
-
"lastModified": 1737653493,
-
"narHash": "sha256-qTbv8Pm9WWF63M5Fj0Od9E54/lsbMSQUBHw/s30eFok=",
-
"owner": "nix-community",
-
"repo": "dns.nix",
-
"rev": "96e548ae8bd44883afc5bddb9dacd0502542276d",
+
"lastModified": 1764646680,
+
"narHash": "sha256-HEVzGL23bev8CuZXbLgDZRWy+mD/qPZhRBpjag7G/dU=",
+
"owner": "pyrox0",
+
"repo": "dn43.nix",
+
"rev": "c8b68602cf1ef696e6a9f9c25e8c177d4101331b",
"type": "github"
},
"original": {
-
"owner": "nix-community",
-
"repo": "dns.nix",
+
"owner": "pyrox0",
+
"repo": "dn43.nix",
+
"type": "github"
+
}
+
},
+
"easy-hosts": {
+
"locked": {
+
"lastModified": 1755470564,
+
"narHash": "sha256-KB1ZryVDoQcbIsItOf4WtxkHhh3ppj+XwMpSnt/2QHc=",
+
"owner": "tgirlcloud",
+
"repo": "easy-hosts",
+
"rev": "d0422bc7b3db26268982aa15d07e60370e76ee1d",
+
"type": "github"
+
},
+
"original": {
+
"owner": "tgirlcloud",
+
"repo": "easy-hosts",
"type": "github"
}
},
"flake-compat": {
"locked": {
-
"lastModified": 1733328505,
-
"narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
+
"lastModified": 1761588595,
+
"narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=",
"owner": "edolstra",
"repo": "flake-compat",
-
"rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
+
"rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5",
"type": "github"
},
"original": {
···
"flake-compat_2": {
"flake": false,
"locked": {
-
"lastModified": 1696426674,
-
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
-
"owner": "edolstra",
-
"repo": "flake-compat",
-
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
-
"type": "github"
+
"lastModified": 1751685974,
+
"narHash": "sha256-NKw96t+BgHIYzHUjkTK95FqYRVKB8DHpVhefWSz/kTw=",
+
"rev": "549f2762aebeff29a2e5ece7a7dc0f955281a1d1",
+
"type": "tarball",
+
"url": "https://git.lix.systems/api/v1/repos/lix-project/flake-compat/archive/549f2762aebeff29a2e5ece7a7dc0f955281a1d1.tar.gz?rev=549f2762aebeff29a2e5ece7a7dc0f955281a1d1"
},
"original": {
-
"owner": "edolstra",
-
"repo": "flake-compat",
-
"type": "github"
+
"type": "tarball",
+
"url": "https://git.lix.systems/lix-project/flake-compat/archive/main.tar.gz"
}
},
"flake-parts": {
"inputs": {
-
"nixpkgs-lib": [
-
"nixpkgs-lib"
-
]
+
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
-
"lastModified": 1738453229,
-
"narHash": "sha256-7H9XgNiGLKN1G1CgRh0vUL4AheZSYzPm+zmZ7vxbJdo=",
+
"lastModified": 1763759067,
+
"narHash": "sha256-LlLt2Jo/gMNYAwOgdRQBrsRoOz7BPRkzvNaI/fzXi2Q=",
"owner": "hercules-ci",
"repo": "flake-parts",
-
"rev": "32ea77a06711b758da0ad9bd6a844c5740a87abd",
+
"rev": "2cccadc7357c0ba201788ae99c4dfa90728ef5e0",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"flake-root": {
-
"locked": {
-
"lastModified": 1723604017,
-
"narHash": "sha256-rBtQ8gg+Dn4Sx/s+pvjdq3CB2wQNzx9XGFq/JVGCB6k=",
-
"owner": "srid",
-
"repo": "flake-root",
-
"rev": "b759a56851e10cb13f6b8e5698af7b59c44be26e",
-
"type": "github"
-
},
-
"original": {
-
"owner": "srid",
-
"repo": "flake-root",
-
"type": "github"
-
}
-
},
"flake-utils": {
"inputs": {
-
"systems": [
-
"systems"
-
]
+
"systems": "systems_2"
},
"locked": {
"lastModified": 1731533236,
···
"type": "github"
}
},
-
"flake-utils-plus": {
+
"flake-utils_2": {
"inputs": {
-
"flake-utils": "flake-utils_2"
+
"systems": "systems_3"
},
"locked": {
-
"lastModified": 1715533576,
-
"narHash": "sha256-fT4ppWeCJ0uR300EH3i7kmgRZnAVxrH+XtK09jQWihk=",
-
"owner": "gytis-ivaskevicius",
-
"repo": "flake-utils-plus",
-
"rev": "3542fe9126dc492e53ddd252bb0260fe035f2c0f",
+
"lastModified": 1731533236,
+
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
+
"owner": "numtide",
+
"repo": "flake-utils",
+
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
-
"owner": "gytis-ivaskevicius",
-
"repo": "flake-utils-plus",
-
"rev": "3542fe9126dc492e53ddd252bb0260fe035f2c0f",
+
"owner": "numtide",
+
"repo": "flake-utils",
"type": "github"
}
},
-
"flake-utils_2": {
+
"flake-utils_3": {
"inputs": {
-
"systems": "systems_2"
+
"systems": "systems_5"
},
"locked": {
"lastModified": 1694529238,
···
"type": "github"
}
},
-
"gitignore": {
+
"golink": {
"inputs": {
"nixpkgs": [
-
"topology",
-
"pre-commit-hooks",
"nixpkgs"
-
]
+
],
+
"systems": "systems_4"
},
"locked": {
-
"lastModified": 1709087332,
-
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
-
"owner": "hercules-ci",
-
"repo": "gitignore.nix",
-
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
+
"lastModified": 1764170522,
+
"narHash": "sha256-4c9jCOfkKNRHJLXgOIcVcNSaw/XaiVaqesaLJn86wGA=",
+
"owner": "tailscale",
+
"repo": "golink",
+
"rev": "6821994de926c565d3ef9fbf3cb0e0fcb780f4be",
"type": "github"
},
"original": {
-
"owner": "hercules-ci",
-
"repo": "gitignore.nix",
+
"owner": "tailscale",
+
"repo": "golink",
"type": "github"
}
},
-
"golink": {
+
"gomod2nix": {
"inputs": {
-
"flake-utils": [
-
"flake-utils"
-
],
+
"flake-utils": "flake-utils_3",
"nixpkgs": [
+
"tangled",
"nixpkgs"
]
},
"locked": {
-
"lastModified": 1736547866,
-
"narHash": "sha256-Zmcuo1lab4V1nMcEU0vZ49XwvIhGJyZUybW4m5hLfJg=",
-
"owner": "tailscale",
-
"repo": "golink",
-
"rev": "c21529a06d80c16b6da1a0dab98dff3d84ad86fc",
+
"lastModified": 1754078208,
+
"narHash": "sha256-YVoIFDCDpYuU3riaDEJ3xiGdPOtsx4sR5eTzHTytPV8=",
+
"owner": "nix-community",
+
"repo": "gomod2nix",
+
"rev": "7f963246a71626c7fc70b431a315c4388a0c95cf",
"type": "github"
},
"original": {
-
"owner": "tailscale",
-
"repo": "golink",
+
"owner": "nix-community",
+
"repo": "gomod2nix",
"type": "github"
}
},
"hardware": {
"locked": {
-
"lastModified": 1738816619,
-
"narHash": "sha256-5yRlg48XmpcX5b5HesdGMOte+YuCy9rzQkJz+imcu6I=",
+
"lastModified": 1764440730,
+
"narHash": "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4=",
"owner": "nixos",
"repo": "nixos-hardware",
-
"rev": "2eccff41bab80839b1d25b303b53d339fbb07087",
+
"rev": "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1738237977,
-
"narHash": "sha256-oJN/yvRL7G0WlR/hTkQIjFbPkzCV+sFnNB/38Tb9RL4=",
+
"lastModified": 1758022363,
+
"narHash": "sha256-ENUhCRWgSX4ni751HieNuQoq06dJvApV/Nm89kh+/A0=",
"owner": "hercules-ci",
"repo": "hercules-ci-effects",
-
"rev": "6d1b6d5d59758b4f5f05745f774fc13cdc59da43",
+
"rev": "1a3667d33e247ad35ca250698d63f49a5453d824",
"type": "github"
},
"original": {
···
]
},
"locked": {
-
"lastModified": 1739571712,
-
"narHash": "sha256-0UdSDV/TBY+GuxXLbrLq3l2Fq02ciyKCIMy4qmnfJXQ=",
+
"lastModified": 1764544324,
+
"narHash": "sha256-GVBGjO7UsmzLrlOJV8NlKSxukHaHencrJqWkCA6FkqI=",
"owner": "nix-community",
"repo": "home-manager",
-
"rev": "6d3163aea47fdb1fe19744e91306a2ea4f602292",
+
"rev": "e4e25a8c310fa45f2a8339c7972dc43d2845a612",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"iceshrimp": {
-
"inputs": {
-
"nixpkgs": [
-
"nixpkgs"
-
]
-
},
+
"htmx-src": {
+
"flake": false,
"locked": {
-
"lastModified": 1721338360,
-
"narHash": "sha256-1CEhakLtPq+Lqo+p40wo00hkewmyzPAvjBr8ah6Faqk=",
-
"ref": "refs/heads/dev",
-
"rev": "98c3678cfbcea5e750a5947394d35a73ae72634a",
-
"revCount": 48,
-
"type": "git",
-
"url": "https://iceshrimp.dev/pyrox/packaging"
+
"narHash": "sha256-nm6avZuEBg67SSyyZUhjpXVNstHHgUxrtBHqJgowU08=",
+
"type": "file",
+
"url": "https://unpkg.com/htmx.org@2.0.4/dist/htmx.min.js"
},
"original": {
-
"type": "git",
-
"url": "https://iceshrimp.dev/pyrox/packaging"
+
"type": "file",
+
"url": "https://unpkg.com/htmx.org@2.0.4/dist/htmx.min.js"
}
},
-
"mailserver": {
-
"inputs": {
-
"blobs": "blobs",
-
"flake-compat": [
-
"flake-compat"
-
],
-
"nixpkgs": [
-
"nixpkgs"
-
],
-
"nixpkgs-24_11": "nixpkgs-24_11"
-
},
+
"htmx-ws-src": {
+
"flake": false,
"locked": {
-
"lastModified": 1739121270,
-
"narHash": "sha256-EmJhpy9U8sVlepl2QPjG019VfG67HcucsQNItTqW6cA=",
-
"owner": "simple-nixos-mailserver",
-
"repo": "nixos-mailserver",
-
"rev": "8c1c4640b878c692dd3d8055e8cdea0a2bbd8cf3",
-
"type": "gitlab"
+
"narHash": "sha256-2fg6KyEJoO24q0fQqbz9RMaYNPQrMwpZh29tkSqdqGY=",
+
"type": "file",
+
"url": "https://cdn.jsdelivr.net/npm/htmx-ext-ws@2.0.2"
},
"original": {
-
"owner": "simple-nixos-mailserver",
-
"ref": "master",
-
"repo": "nixos-mailserver",
-
"type": "gitlab"
+
"type": "file",
+
"url": "https://cdn.jsdelivr.net/npm/htmx-ext-ws@2.0.2"
}
},
-
"my-pkgs": {
-
"inputs": {
-
"nixpkgs": [
-
"nixpkgs"
-
]
-
},
+
"ibm-plex-mono-src": {
+
"flake": false,
"locked": {
-
"lastModified": 1718762298,
-
"narHash": "sha256-HU73BsUdmpYn6SMgs+4Zpj1fPA94H0CAC2pYhIxqUoY=",
-
"ref": "refs/heads/main",
-
"rev": "1aa7198174b166f6f3153a69388cc4f650471750",
-
"revCount": 13,
-
"type": "git",
-
"url": "https://git.pyrox.dev/pyrox/pkgs"
+
"lastModified": 1731402384,
+
"narHash": "sha256-OwUmrPfEehLDz0fl2ChYLK8FQM2p0G1+EMrGsYEq+6g=",
+
"type": "tarball",
+
"url": "https://github.com/IBM/plex/releases/download/@ibm/plex-mono@1.1.0/ibm-plex-mono.zip"
},
"original": {
-
"type": "git",
-
"url": "https://git.pyrox.dev/pyrox/pkgs"
+
"type": "tarball",
+
"url": "https://github.com/IBM/plex/releases/download/@ibm/plex-mono@1.1.0/ibm-plex-mono.zip"
}
},
-
"napalm": {
-
"inputs": {
-
"flake-utils": [
-
"authentik",
-
"flake-utils"
-
],
-
"nixpkgs": [
-
"authentik",
-
"nixpkgs"
-
]
-
},
+
"indigo": {
+
"flake": false,
"locked": {
-
"lastModified": 1725806412,
-
"narHash": "sha256-lGZjkjds0p924QEhm/r0BhAxbHBJE1xMOldB/HmQH04=",
-
"owner": "willibutz",
-
"repo": "napalm",
-
"rev": "b492440d9e64ae20736d3bec5c7715ffcbde83f5",
+
"lastModified": 1753693716,
+
"narHash": "sha256-DMIKnCJRODQXEHUxA+7mLzRALmnZhkkbHlFT2rCQYrE=",
+
"owner": "oppiliappan",
+
"repo": "indigo",
+
"rev": "5f170569da9360f57add450a278d73538092d8ca",
"type": "github"
},
"original": {
-
"owner": "willibutz",
-
"ref": "avoid-foldl-stack-overflow",
-
"repo": "napalm",
+
"owner": "oppiliappan",
+
"repo": "indigo",
"type": "github"
}
},
-
"nh": {
-
"inputs": {
-
"nixpkgs": [
-
"nixpkgs"
-
]
-
},
+
"inter-fonts-src": {
+
"flake": false,
"locked": {
-
"lastModified": 1738579718,
-
"narHash": "sha256-HcNEFumdZ4Y59CBB1h1IzOyPxwn0u/Wson6hhzItXCA=",
-
"owner": "viperML",
-
"repo": "nh",
-
"rev": "8ef70b642b8351c010a48f43dda6a1ebf038f5d9",
-
"type": "github"
+
"lastModified": 1731687360,
+
"narHash": "sha256-5vdKKvHAeZi6igrfpbOdhZlDX2/5+UvzlnCQV6DdqoQ=",
+
"type": "tarball",
+
"url": "https://github.com/rsms/inter/releases/download/v4.1/Inter-4.1.zip"
},
"original": {
-
"owner": "viperML",
-
"repo": "nh",
-
"type": "github"
+
"type": "tarball",
+
"url": "https://github.com/rsms/inter/releases/download/v4.1/Inter-4.1.zip"
}
},
-
"nix-github-actions": {
-
"inputs": {
-
"nixpkgs": [
-
"authentik",
-
"poetry2nix",
-
"nixpkgs"
-
]
-
},
+
"lucide-src": {
+
"flake": false,
"locked": {
-
"lastModified": 1729742964,
-
"narHash": "sha256-B4mzTcQ0FZHdpeWcpDYPERtyjJd/NIuaQ9+BV1h+MpA=",
-
"owner": "nix-community",
-
"repo": "nix-github-actions",
-
"rev": "e04df33f62cdcf93d73e9a04142464753a16db67",
-
"type": "github"
+
"lastModified": 1754044466,
+
"narHash": "sha256-+exBR2OToB1iv7ZQI2S4B0lXA/QRvC9n6U99UxGpJGs=",
+
"type": "tarball",
+
"url": "https://github.com/lucide-icons/lucide/releases/download/0.536.0/lucide-icons-0.536.0.zip"
},
"original": {
-
"owner": "nix-community",
-
"repo": "nix-github-actions",
-
"type": "github"
+
"type": "tarball",
+
"url": "https://github.com/lucide-icons/lucide/releases/download/0.536.0/lucide-icons-0.536.0.zip"
}
},
-
"nix-index": {
+
"my-pkgs": {
"inputs": {
-
"flake-compat": [
-
"flake-compat"
-
],
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
-
"lastModified": 1721228133,
-
"narHash": "sha256-3ym31/VGIC1IKBbkrFAO0lKsHO+XGQ+mgCQqHsE91dw=",
-
"owner": "nix-community",
-
"repo": "nix-index",
-
"rev": "8c0532bcf8da840ed18e99ad2bf948cb9f5190a9",
-
"type": "github"
+
"lastModified": 1718762298,
+
"narHash": "sha256-HU73BsUdmpYn6SMgs+4Zpj1fPA94H0CAC2pYhIxqUoY=",
+
"ref": "refs/heads/main",
+
"rev": "1aa7198174b166f6f3153a69388cc4f650471750",
+
"revCount": 13,
+
"type": "git",
+
"url": "https://git.pyrox.dev/pyrox/pkgs"
},
"original": {
-
"owner": "nix-community",
-
"repo": "nix-index",
-
"type": "github"
+
"type": "git",
+
"url": "https://git.pyrox.dev/pyrox/pkgs"
}
},
"nix-index-database": {
···
]
},
"locked": {
-
"lastModified": 1739071773,
-
"narHash": "sha256-/Ak+Quinhmdxa9m3shjm4lwwwqmzG8zzGhhhhgR1k9I=",
+
"lastModified": 1764475780,
+
"narHash": "sha256-77jL5H5x51ksLiOUDjY0ZK8e2T4ZXLhj3ap8ETvknWI=",
"owner": "Mic92",
"repo": "nix-index-database",
-
"rev": "895d81b6228bbd50a6ef22f5a58a504ca99763ea",
+
"rev": "5a3ff8c1a09003f399f43d5742d893c0b1ab8af0",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"nix-search": {
-
"inputs": {
-
"flake-compat": [
-
"flake-compat"
-
],
-
"flake-utils": [
-
"flake-utils"
-
],
-
"nixpkgs": [
-
"nixpkgs"
-
]
-
},
-
"locked": {
-
"lastModified": 1730410509,
-
"narHash": "sha256-dOdcXKfSwi0THOjtgP3O/46SWoUY+T7LL9nGwOXXJfw=",
-
"owner": "diamondburned",
-
"repo": "nix-search",
-
"rev": "868420cf077bc542f42db3e51b3bd87f3397d5d7",
-
"type": "github"
-
},
-
"original": {
-
"owner": "diamondburned",
-
"repo": "nix-search",
-
"type": "github"
-
}
-
},
-
"nixd": {
-
"inputs": {
-
"flake-parts": [
-
"flake-parts"
-
],
-
"flake-root": "flake-root",
-
"nixpkgs": [
-
"nixpkgs"
-
],
-
"treefmt-nix": "treefmt-nix_3"
-
},
-
"locked": {
-
"lastModified": 1739259093,
-
"narHash": "sha256-pltdsmg4oh1AVNrMbKUgx1VPbndVdCGID5mrBmRIdVI=",
-
"owner": "nix-community",
-
"repo": "nixd",
-
"rev": "065dcb4cb2f8269d6d15d2b2491a79cff47f9550",
-
"type": "github"
-
},
-
"original": {
-
"owner": "nix-community",
-
"repo": "nixd",
-
"type": "github"
-
}
-
},
"nixpkgs": {
"locked": {
-
"lastModified": 1736012469,
-
"narHash": "sha256-/qlNWm/IEVVH7GfgAIyP6EsVZI6zjAx1cV5zNyrs+rI=",
+
"lastModified": 1763966396,
+
"narHash": "sha256-6eeL1YPcY1MV3DDStIDIdy/zZCDKgHdkCmsrLJFiZf0=",
"owner": "NixOS",
"repo": "nixpkgs",
-
"rev": "8f3e1f807051e32d8c95cd12b9b421623850a34d",
+
"rev": "5ae3b07d8d6527c42f17c876e404993199144b6a",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"nixpkgs-24_11": {
-
"locked": {
-
"lastModified": 1734083684,
-
"narHash": "sha256-5fNndbndxSx5d+C/D0p/VF32xDiJCJzyOqorOYW4JEo=",
-
"owner": "NixOS",
-
"repo": "nixpkgs",
-
"rev": "314e12ba369ccdb9b352a4db26ff419f7c49fa84",
-
"type": "github"
-
},
-
"original": {
-
"id": "nixpkgs",
-
"ref": "nixos-24.11",
-
"type": "indirect"
-
}
-
},
"nixpkgs-lib": {
"locked": {
-
"lastModified": 1739062995,
-
"narHash": "sha256-mmFWnEny5HClHPnDWs45goJfdo/UXghdxr79uKvJ5fQ=",
+
"lastModified": 1761765539,
+
"narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
-
"rev": "ad729b690927c9b6a130aeb346768c796339e3f8",
+
"rev": "719359f4562934ae99f5443f20aa06c2ffff91fc",
"type": "github"
},
"original": {
···
"type": "github"
}
},
-
"nixpkgs_2": {
+
"nixpkgs-stalwart-fix": {
"locked": {
-
"lastModified": 1739451785,
-
"narHash": "sha256-3ebRdThRic9bHMuNi2IAA/ek9b32bsy8F5R4SvGTIog=",
-
"owner": "nixos",
+
"lastModified": 1762728499,
+
"narHash": "sha256-XtT/8ID3gz9RGk8ITBnktmodq5/ZG6tF60XSfuKSmro=",
+
"owner": "pyrox0",
"repo": "nixpkgs",
-
"rev": "1128e89fd5e11bb25aedbfc287733c6502202ea9",
+
"rev": "b5178ff139339638e98a1e5833add22b047f96d0",
"type": "github"
},
"original": {
-
"owner": "nixos",
-
"ref": "nixpkgs-unstable",
+
"owner": "pyrox0",
+
"ref": "fix/stalwart-module",
"repo": "nixpkgs",
"type": "github"
}
},
-
"poetry2nix": {
-
"inputs": {
-
"flake-utils": [
-
"authentik",
-
"flake-utils"
-
],
-
"nix-github-actions": "nix-github-actions",
-
"nixpkgs": [
-
"authentik",
-
"nixpkgs"
-
],
-
"systems": [
-
"authentik",
-
"systems"
-
],
-
"treefmt-nix": "treefmt-nix"
+
"nixpkgs_2": {
+
"locked": {
+
"lastModified": 1764527385,
+
"narHash": "sha256-gpwyCnyi2or0InBXe+4I9YeED3Uly3EGH58qvVnchBY=",
+
"rev": "23258e03aaa49b3a68597e3e50eb0cbce7e42e9d",
+
"type": "tarball",
+
"url": "https://releases.nixos.org/nixpkgs/nixpkgs-26.05pre904683.23258e03aaa4/nixexprs.tar.xz"
},
+
"original": {
+
"type": "tarball",
+
"url": "https://nixpkgs.dev/channel/nixpkgs-unstable"
+
}
+
},
+
"nixpkgs_3": {
"locked": {
-
"lastModified": 1736884309,
-
"narHash": "sha256-eiCqmKl0BIRiYk5/ZhZozwn4/7Km9CWTbc15Cv+VX5k=",
-
"owner": "nix-community",
-
"repo": "poetry2nix",
-
"rev": "75d0515332b7ca269f6d7abfd2c44c47a7cbca7b",
+
"lastModified": 1751984180,
+
"narHash": "sha256-LwWRsENAZJKUdD3SpLluwDmdXY9F45ZEgCb0X+xgOL0=",
+
"owner": "nixos",
+
"repo": "nixpkgs",
+
"rev": "9807714d6944a957c2e036f84b0ff8caf9930bc0",
"type": "github"
},
"original": {
-
"owner": "nix-community",
-
"repo": "poetry2nix",
+
"owner": "nixos",
+
"ref": "nixos-unstable",
+
"repo": "nixpkgs",
"type": "github"
}
},
-
"pre-commit-hooks": {
+
"quickshell": {
"inputs": {
-
"flake-compat": "flake-compat_2",
-
"gitignore": "gitignore",
"nixpkgs": [
-
"topology",
-
"nixpkgs"
-
],
-
"nixpkgs-stable": [
-
"topology",
"nixpkgs"
]
},
"locked": {
-
"lastModified": 1730797577,
-
"narHash": "sha256-SrID5yVpyUfknUTGWgYkTyvdr9J1LxUym4om3SVGPkg=",
-
"owner": "cachix",
-
"repo": "pre-commit-hooks.nix",
-
"rev": "1864030ed24a2b8b4e4d386a5eeaf0c5369e50a9",
+
"lastModified": 1764482797,
+
"narHash": "sha256-ynV90KoBrPe38YFlKAHtPFk4Ee3IANUsIFGxRaq7H/s=",
+
"owner": "quickshell-mirror",
+
"repo": "quickshell",
+
"rev": "d24e8e9736287d01ee73ef9d573d2bc316a62d5c",
"type": "github"
},
"original": {
-
"owner": "cachix",
-
"repo": "pre-commit-hooks.nix",
+
"owner": "quickshell-mirror",
+
"repo": "quickshell",
"type": "github"
}
},
"root": {
"inputs": {
"agenix": "agenix",
-
"authentik": "authentik",
"buildbot-nix": "buildbot-nix",
+
"caelestia": "caelestia",
"ctp": "ctp",
-
"deploy-rs": "deploy-rs",
-
"dns": "dns",
+
"dms": "dms",
+
"dms-plugins": "dms-plugins",
+
"dms-power-usage": "dms-power-usage",
+
"dms-wp-shuffler": "dms-wp-shuffler",
+
"dn42": "dn42",
+
"easy-hosts": "easy-hosts",
"flake-compat": "flake-compat",
"flake-parts": "flake-parts",
-
"flake-utils": "flake-utils",
+
"flake-utils": "flake-utils_2",
"golink": "golink",
"hardware": "hardware",
"home-manager": "home-manager",
-
"iceshrimp": "iceshrimp",
-
"mailserver": "mailserver",
"my-pkgs": "my-pkgs",
-
"nh": "nh",
-
"nix-index": "nix-index",
"nix-index-database": "nix-index-database",
-
"nix-search": "nix-search",
-
"nixd": "nixd",
"nixpkgs": "nixpkgs_2",
-
"nixpkgs-lib": "nixpkgs-lib",
-
"snowfall-lib": "snowfall-lib",
-
"stable": "stable",
-
"systems": "systems_3",
-
"topology": "topology"
+
"nixpkgs-stalwart-fix": "nixpkgs-stalwart-fix",
+
"quickshell": "quickshell",
+
"tangled": "tangled",
+
"treefmt-nix": "treefmt-nix"
}
},
-
"snowfall-lib": {
-
"inputs": {
-
"flake-compat": [
-
"flake-compat"
-
],
-
"flake-utils-plus": "flake-utils-plus",
-
"nixpkgs": [
-
"nixpkgs"
-
]
-
},
+
"sqlite-lib-src": {
+
"flake": false,
"locked": {
-
"lastModified": 1736130495,
-
"narHash": "sha256-4i9nAJEZFv7vZMmrE0YG55I3Ggrtfo5/T07JEpEZ/RM=",
-
"owner": "snowfallorg",
-
"repo": "lib",
-
"rev": "02d941739f98a09e81f3d2d9b3ab08918958beac",
-
"type": "github"
-
},
-
"original": {
-
"owner": "snowfallorg",
-
"repo": "lib",
-
"type": "github"
-
}
-
},
-
"stable": {
-
"locked": {
-
"lastModified": 1735563628,
-
"narHash": "sha256-OnSAY7XDSx7CtDoqNh8jwVwh4xNL/2HaJxGjryLWzX8=",
-
"owner": "nixos",
-
"repo": "nixpkgs",
-
"rev": "b134951a4c9f3c995fd7be05f3243f8ecd65d798",
-
"type": "github"
+
"lastModified": 1706631843,
+
"narHash": "sha256-bJoMjirsBjm2Qk9KPiy3yV3+8b/POlYe76/FQbciHro=",
+
"type": "tarball",
+
"url": "https://sqlite.org/2024/sqlite-amalgamation-3450100.zip"
},
"original": {
-
"owner": "nixos",
-
"ref": "nixos-24.05",
-
"repo": "nixpkgs",
-
"type": "github"
+
"type": "tarball",
+
"url": "https://sqlite.org/2024/sqlite-amalgamation-3450100.zip"
}
},
"systems": {
"locked": {
-
"lastModified": 1689347949,
-
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
+
"lastModified": 1681028828,
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
-
"repo": "default-linux",
-
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
+
"repo": "default",
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
-
"repo": "default-linux",
+
"repo": "default",
"type": "github"
}
},
···
"type": "github"
}
},
-
"topology": {
-
"inputs": {
-
"devshell": "devshell",
-
"flake-utils": [
-
"flake-utils"
-
],
-
"nixpkgs": [
-
"nixpkgs"
-
],
-
"pre-commit-hooks": "pre-commit-hooks"
-
},
+
"systems_4": {
"locked": {
-
"lastModified": 1738246091,
-
"narHash": "sha256-2+KkZsRO+XlOFbXbRgMZbRtlqn5MBNYj4HNmZ/2Tojg=",
-
"owner": "oddlama",
-
"repo": "nix-topology",
-
"rev": "5526269fa3eedf4f4bc00c0bf7a03db31d24b029",
+
"lastModified": 1681028828,
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+
"owner": "nix-systems",
+
"repo": "default",
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
-
"owner": "oddlama",
-
"repo": "nix-topology",
+
"owner": "nix-systems",
+
"repo": "default",
"type": "github"
}
},
-
"treefmt-nix": {
-
"inputs": {
-
"nixpkgs": [
-
"authentik",
-
"poetry2nix",
-
"nixpkgs"
-
]
-
},
+
"systems_5": {
"locked": {
-
"lastModified": 1730120726,
-
"narHash": "sha256-LqHYIxMrl/1p3/kvm2ir925tZ8DkI0KA10djk8wecSk=",
-
"owner": "numtide",
-
"repo": "treefmt-nix",
-
"rev": "9ef337e492a5555d8e17a51c911ff1f02635be15",
+
"lastModified": 1681028828,
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+
"owner": "nix-systems",
+
"repo": "default",
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
-
"owner": "numtide",
-
"repo": "treefmt-nix",
+
"owner": "nix-systems",
+
"repo": "default",
"type": "github"
}
},
-
"treefmt-nix_2": {
+
"tangled": {
"inputs": {
-
"nixpkgs": [
-
"buildbot-nix",
-
"nixpkgs"
-
]
+
"actor-typeahead-src": "actor-typeahead-src",
+
"flake-compat": "flake-compat_2",
+
"gomod2nix": "gomod2nix",
+
"htmx-src": "htmx-src",
+
"htmx-ws-src": "htmx-ws-src",
+
"ibm-plex-mono-src": "ibm-plex-mono-src",
+
"indigo": "indigo",
+
"inter-fonts-src": "inter-fonts-src",
+
"lucide-src": "lucide-src",
+
"nixpkgs": "nixpkgs_3",
+
"sqlite-lib-src": "sqlite-lib-src"
},
"locked": {
-
"lastModified": 1738953846,
-
"narHash": "sha256-yrK3Hjcr8F7qS/j2F+r7C7o010eVWWlm4T1PrbKBOxQ=",
-
"owner": "numtide",
-
"repo": "treefmt-nix",
-
"rev": "4f09b473c936d41582dd744e19f34ec27592c5fd",
-
"type": "github"
+
"lastModified": 1764494836,
+
"narHash": "sha256-u1i7aMo0fTQ6WVdOZhG2fo/gEx2Fq8+3URmuqEBZGWI=",
+
"ref": "refs/heads/master",
+
"rev": "d37f774fb8c60aa2bd0cb965c9884457d0afb660",
+
"revCount": 1689,
+
"type": "git",
+
"url": "https://tangled.org/@tangled.org/core"
},
"original": {
-
"owner": "numtide",
-
"repo": "treefmt-nix",
-
"type": "github"
+
"type": "git",
+
"url": "https://tangled.org/@tangled.org/core"
}
},
-
"treefmt-nix_3": {
+
"treefmt-nix": {
"inputs": {
"nixpkgs": [
-
"nixd",
"nixpkgs"
]
},
"locked": {
-
"lastModified": 1734704479,
-
"narHash": "sha256-MMi74+WckoyEWBRcg/oaGRvXC9BVVxDZNRMpL+72wBI=",
+
"lastModified": 1762938485,
+
"narHash": "sha256-AlEObg0syDl+Spi4LsZIBrjw+snSVU4T8MOeuZJUJjM=",
"owner": "numtide",
"repo": "treefmt-nix",
-
"rev": "65712f5af67234dad91a5a4baee986a8b62dbf8f",
+
"rev": "5b4ee75aeefd1e2d5a1cc43cf6ba65eba75e83e4",
"type": "github"
},
"original": {
+103 -170
flake.nix
···
substitute = "true";
extra-substituters = [
"https://cache.nixos.org"
-
"https://crane.cachix.org"
-
"https://isabelroses.cachix.org"
"https://nix-community.cachix.org"
-
"https://nixpkgs-wayland.cachix.org"
-
"https://viperml.cachix.org"
];
trusted-public-keys = [
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
-
"crane.cachix.org-1:8Scfpmn9w+hGdXH/Q9tTLiYAE/2dnJYRJP7kl80GuRk="
-
"isabelroses.cachix.org-1:mXdV/CMcPDaiTmkQ7/4+MzChpOe6Cb97njKmBQQmLPM="
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
-
"nixpkgs-wayland.cachix.org-1:3lwxaILxMRkVhehr5StQprHdEo4IrE8sRho9R9HOLYA="
-
"viperml.cachix.org-1:qZhKBMTfmcLL+OG6fj/hzsMEedgKvZVFRRAhq7j8Vh8="
];
cores = 0;
max-jobs = 2;
···
description = "PyroNet machines and services";
inputs = {
-
snowfall-lib = {
-
url = "github:snowfallorg/lib";
-
inputs.nixpkgs.follows = "nixpkgs";
-
inputs.flake-compat.follows = "flake-compat";
+
flake-parts = {
+
url = "github:hercules-ci/flake-parts";
};
-
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
-
stable.url = "github:nixos/nixpkgs/nixos-24.05";
+
nixpkgs.url = "https://nixpkgs.dev/channel/nixpkgs-unstable";
+
nixpkgs-stalwart-fix.url = "github:pyrox0/nixpkgs/fix/stalwart-module";
# Overrides
flake-compat.url = "github:edolstra/flake-compat";
-
systems.url = "github:nix-systems/default";
-
flake-parts = {
-
url = "github:hercules-ci/flake-parts";
-
inputs.nixpkgs-lib.follows = "nixpkgs-lib";
-
};
flake-utils = {
url = "github:numtide/flake-utils";
-
inputs.systems.follows = "systems";
};
-
nixpkgs-lib.url = "github:nix-community/nixpkgs.lib";
# Inputs
agenix = {
url = "github:ryantm/agenix";
inputs = {
nixpkgs.follows = "nixpkgs";
-
systems.follows = "systems";
home-manager.follows = "home-manager";
-
};
-
};
-
authentik = {
-
url = "github:nix-community/authentik-nix";
-
inputs = {
-
flake-utils.follows = "flake-utils";
-
flake-parts.follows = "flake-parts";
-
flake-compat.follows = "flake-compat";
-
nixpkgs.follows = "nixpkgs";
};
};
buildbot-nix = {
-
url = "github:Mic92/buildbot-nix";
+
url = "github:nix-community/buildbot-nix";
inputs.nixpkgs.follows = "nixpkgs";
inputs.flake-parts.follows = "flake-parts";
+
inputs.treefmt-nix.follows = "";
+
};
+
caelestia = {
+
url = "github:caelestia-dots/shell";
+
inputs.nixpkgs.follows = "nixpkgs";
+
inputs.quickshell.follows = "quickshell";
};
ctp = {
url = "github:catppuccin/nix";
};
-
deploy-rs = {
-
url = "github:serokell/deploy-rs";
-
inputs = {
-
nixpkgs.follows = "nixpkgs";
-
utils.follows = "flake-utils";
-
flake-compat.follows = "flake-compat";
-
};
+
dn42 = {
+
url = "github:pyrox0/dn43.nix";
+
inputs.nixpkgs.follows = "nixpkgs";
};
-
dns = {
-
url = "github:nix-community/dns.nix";
-
inputs.flake-utils.follows = "flake-utils";
+
dms = {
+
url = "github:AvengeMedia/DankMaterialShell";
inputs.nixpkgs.follows = "nixpkgs";
};
+
# DMS Plugins
+
dms-wp-shuffler = {
+
url = "github:Daniel-42-z/dms-wallpaper-shuffler";
+
flake = false;
+
};
+
dms-power-usage = {
+
url = "github:Daniel-42-z/dms-power-usage";
+
flake = false;
+
};
+
dms-plugins = {
+
url = "github:AvengeMedia/dms-plugins";
+
flake = false;
+
};
+
easy-hosts.url = "github:tgirlcloud/easy-hosts";
golink = {
url = "github:tailscale/golink";
-
inputs.flake-utils.follows = "flake-utils";
inputs.nixpkgs.follows = "nixpkgs";
};
hardware = {
···
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
-
iceshrimp = {
-
url = "git+https://iceshrimp.dev/pyrox/packaging";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
mailserver = {
-
url = "gitlab:simple-nixos-mailserver/nixos-mailserver/master";
-
inputs = {
-
flake-compat.follows = "flake-compat";
-
nixpkgs.follows = "nixpkgs";
-
};
-
};
-
nix-search = {
-
url = "github:diamondburned/nix-search";
-
inputs.nixpkgs.follows = "nixpkgs";
-
inputs.flake-utils.follows = "flake-utils";
-
inputs.flake-compat.follows = "flake-compat";
-
};
-
nh = {
-
url = "github:viperML/nh";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
-
nixd = {
-
url = "github:nix-community/nixd";
-
inputs.nixpkgs.follows = "nixpkgs";
-
inputs.flake-parts.follows = "flake-parts";
-
};
-
nix-index = {
-
url = "github:nix-community/nix-index";
-
inputs.flake-compat.follows = "flake-compat";
-
inputs.nixpkgs.follows = "nixpkgs";
-
};
nix-index-database = {
url = "github:Mic92/nix-index-database";
inputs.nixpkgs.follows = "nixpkgs";
···
url = "git+https://git.pyrox.dev/pyrox/pkgs";
inputs.nixpkgs.follows = "nixpkgs";
};
-
topology = {
-
url = "github:oddlama/nix-topology";
+
quickshell = {
+
url = "github:quickshell-mirror/quickshell";
+
inputs.nixpkgs.follows = "nixpkgs";
+
};
+
tangled = {
+
url = "git+https://tangled.org/@tangled.org/core";
+
};
+
treefmt-nix = {
+
url = "github:numtide/treefmt-nix";
inputs.nixpkgs.follows = "nixpkgs";
-
inputs.flake-utils.follows = "flake-utils";
};
};
outputs =
-
inputs@{ self, ... }:
-
let
-
lib = inputs.snowfall-lib.mkLib {
-
inherit inputs;
-
src = ./.;
-
snowfall = {
-
meta = {
-
name = "pyronet";
-
title = "PyroNet Config";
-
};
-
namespace = "py";
-
};
-
};
-
overlays = [
-
self.overlays.pyronet-packages
-
self.overlays.nix-index
-
self.overlays.bluez-wiimote
-
self.overlays.sway-unwrapped
-
inputs.my-pkgs.overlays.cinny
-
inputs.golink.overlay
-
inputs.nixd.overlays.default
-
inputs.topology.overlays.default
+
inputs:
+
inputs.flake-parts.lib.mkFlake { inherit inputs; } {
+
# Systems we want to build for
+
systems = [
+
"x86_64-linux"
];
-
in
-
lib.mkFlake {
-
# Nixpkgs configuration
-
channels-config = {
-
allowUnfree = true;
-
};
-
# Overlays for Nixpkgs.
-
inherit overlays;
-
-
# Home-manager configurations
-
homes = {
-
# Default modules for all homes
-
modules = with inputs; [
-
nix-index-database.hmModules.nix-index
-
ctp.homeManagerModules.catppuccin
-
];
-
};
-
-
# NixOS Configurations
-
systems = {
-
# Modules for all systems
-
modules.nixos = with inputs; [
-
agenix.nixosModules.default
-
buildbot-nix.nixosModules.buildbot-worker
-
ctp.nixosModules.catppuccin
-
topology.nixosModules.default
-
];
-
hosts = {
-
# Zaphod, my personal Framework 16 laptop
-
zaphod.modules = with inputs; [ hardware.nixosModules.framework-16-7040-amd ];
-
-
# Prefect, my main VPS
-
prefect.modules = with inputs; [ mailserver.nixosModule ];
+
# Flake modules
+
imports = [
+
inputs.easy-hosts.flakeModule
+
inputs.home-manager.flakeModules.home-manager
+
inputs.treefmt-nix.flakeModule
+
./packages.nix
+
./lib
+
./overlays
+
./devShells
+
./nixosModules
+
./homeModules
+
./templates
+
./hosts
+
];
-
# Marvin, my main homelab machine
-
marvin.modules = with inputs; [
-
authentik.nixosModules.default
-
buildbot-nix.nixosModules.buildbot-master
-
golink.nixosModules.default
-
iceshrimp.nixosModules.default
-
];
-
};
-
};
-
templates = {
-
uv.description = "Python template flake that uses uv";
-
};
+
# # Flake attributes
+
# flake = {
+
#
+
# };
-
outputs-builder = channels: {
-
# Define default packages to use everywhere
-
packages = {
-
nvim = channels.nixpkgs.neovim-unwrapped;
-
customGit = channels.nixpkgs.git.override {
-
withLibsecret = true;
-
withSsh = true;
-
perlSupport = false;
-
osxkeychainSupport = false;
-
guiSupport = false;
-
svnSupport = false;
+
# Per-system stuff
+
perSystem =
+
{
+
system,
+
...
+
}:
+
{
+
_module.args.pkgs = import inputs.nixpkgs {
+
inherit system;
+
overlays = [
+
inputs.self.overlays.openssh-fixperms
+
inputs.golink.overlays.default
+
];
+
config = {
+
allowUnfree = true;
+
};
};
-
};
-
formatter = channels.nixpkgs.nixfmt-rfc-style;
-
-
};
-
deploy = lib.mkDeploy { inherit (inputs) self; };
-
topology = import inputs.topology {
-
pkgs = import inputs.nixpkgs {
-
inherit overlays;
-
system = "x86_64-linux";
+
treefmt = {
+
programs = {
+
deadnix = {
+
enable = true;
+
no-underscore = true;
+
};
+
jsonfmt.enable = true;
+
jsonfmt.excludes = [ ".zed/settings.json" ];
+
just.enable = true;
+
keep-sorted.enable = true;
+
mdformat.enable = true;
+
mdformat.settings.wrap = 120;
+
nixf-diagnose.enable = true;
+
nixfmt.enable = true;
+
nixfmt.indent = 2;
+
nixfmt.width = 120;
+
shellcheck.enable = true;
+
statix.enable = true;
+
stylua.enable = true;
+
taplo.enable = true;
+
yamlfmt.enable = true;
+
};
+
};
};
-
modules = [
-
./topology.nix
-
{ nixosConfigurations = self.nixosConfigurations; }
-
];
-
};
-
+
# Enable debugging for nixd
+
debug = true;
};
}
+17
homeModules/all-modules.nix
···
+
{ inputs, ... }:
+
{
+
imports = [
+
inputs.self.homeModules.profiles
+
inputs.self.homeModules.programs
+
inputs.self.homeModules.scripts
+
inputs.self.homeModules.services
+
inputs.self.homeModules.theming
+
inputs.self.homeModules.wayland
+
inputs.self.homeModules.xdg
+
+
inputs.nix-index-database.homeModules.nix-index
+
inputs.ctp.homeModules.catppuccin
+
inputs.caelestia.homeManagerModules.default
+
inputs.dms.homeModules.dankMaterialShell.default
+
];
+
}
+17
homeModules/default.nix
···
+
{
+
inputs,
+
flake-parts-lib,
+
...
+
}:
+
{
+
flake.homeModules = {
+
wayland = import ./wayland;
+
xdg = import ./xdg;
+
programs = import ./programs;
+
services = import ./services;
+
scripts = import ./scripts;
+
theming = import ./theming;
+
profiles = import ./profiles;
+
allModules = flake-parts-lib.importApply ./all-modules.nix { inherit inputs; };
+
};
+
}
+24
homeModules/profiles/base/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}:
+
+
let
+
cfg = config.py.profiles.base;
+
in
+
{
+
options.py.profiles.base.enable = lib.mkEnableOption "Base Home Profile";
+
config = lib.mkIf cfg.enable {
+
home.stateVersion = "26.05";
+
home.language = {
+
base = "en_US.utf8";
+
};
+
manual = {
+
manpages.enable = false;
+
html.enable = false;
+
json.enable = false;
+
};
+
programs.man.enable = false;
+
};
+
}
+68
homeModules/profiles/cli/default.nix
···
+
{
+
pkgs,
+
lib,
+
config,
+
...
+
}:
+
let
+
inherit (lib) mkDefault mkEnableOption;
+
cfg = config.py.profiles.cli;
+
in
+
{
+
options.py.profiles.cli.enable = mkEnableOption "CLI Profile";
+
config = lib.mkIf cfg.enable {
+
py.profiles.base.enable = true;
+
py.programs = {
+
bat.enable = mkDefault true;
+
direnv.enable = mkDefault true;
+
fish.enable = mkDefault true;
+
fzf.enable = mkDefault true;
+
git = {
+
enable = mkDefault true;
+
gh.enable = mkDefault true;
+
lazygit.enable = mkDefault true;
+
};
+
gpg.enable = mkDefault true;
+
helix.enable = mkDefault true;
+
nix-index.enable = mkDefault true;
+
nushell.enable = mkDefault true;
+
pandoc.enable = mkDefault true;
+
ssh.enable = mkDefault true;
+
starship.enable = mkDefault true;
+
wakatime.enable = mkDefault true;
+
zoxide.enable = mkDefault true;
+
};
+
catppuccin = {
+
btop.enable = true;
+
glamour.enable = true;
+
};
+
programs = {
+
eza = {
+
enable = true;
+
icons = "auto";
+
git = true;
+
enableBashIntegration = false;
+
enableIonIntegration = false;
+
};
+
btop = {
+
enable = true;
+
};
+
};
+
xdg.configFile = {
+
"rbw/config.json".source = ./rbw-config.json;
+
};
+
home.packages = with pkgs; [
+
btrfs-progs
+
fd
+
fzf
+
glow
+
gnupg
+
nix-search
+
pinentry-qt
+
rbw
+
rsync
+
xdg-utils
+
yt-dlp
+
];
+
};
+
}
+7
homeModules/profiles/cli/rbw-config.json
···
+
{
+
"email": "pyrox@pyrox.dev",
+
"base_url": "https://bw.pyrox.dev",
+
"identity_url": null,
+
"lock_timeout": 3600,
+
"pinentry": "pinentry"
+
}
+10
homeModules/profiles/default.nix
···
+
{
+
imports = [
+
./base/default.nix
+
./cli/default.nix
+
./desktop/default.nix
+
./development/default.nix
+
./gui/default.nix
+
./server/default.nix
+
];
+
}
+76
homeModules/profiles/desktop/default.nix
···
+
{
+
pkgs,
+
lib,
+
config,
+
...
+
}:
+
let
+
cfg = config.py.profiles.desktop;
+
inherit (cfg) shell;
+
inherit (lib) mkIf mkDefault mkEnableOption;
+
+
mkShellOption =
+
name: var:
+
lib.mkOption {
+
type = lib.types.bool;
+
default = if (shell == var) then true else false;
+
description = "Enable ${name}";
+
readOnly = true;
+
visible = false;
+
internal = true;
+
};
+
in
+
{
+
options.py.profiles.desktop = {
+
enable = mkEnableOption "Desktop Config";
+
shell = lib.mkOption {
+
type = lib.types.enum [
+
"caelestia"
+
"dms"
+
];
+
default = "caelestia";
+
description = "The desktop shell to use in the graphical environment";
+
};
+
caelestia = mkShellOption "Caelestia shell" "caelestia";
+
dms = mkShellOption "DMS" "dms";
+
};
+
config = mkIf cfg.enable {
+
py.profiles.base.enable = true;
+
py.profiles.cli.enable = true;
+
py.profiles.gui.enable = true;
+
py.profiles.development.enable = true;
+
programs.mpv = {
+
enable = mkDefault true;
+
scripts = with pkgs.mpvScripts; [
+
videoclip
+
mpris
+
modernz
+
thumbfast
+
];
+
config = {
+
osc = false;
+
keep-open = true;
+
};
+
scriptOpts = {
+
modernz.greenandgrumpy = true;
+
videoclip.preset = "medium";
+
videoclip.video_folder_path = "~/Videos/mpv-clips/";
+
videoclip.video_width = 1920;
+
videoclip.video_height = 1080;
+
};
+
};
+
home.packages = with pkgs; [
+
archipelago
+
brightnessctl
+
clipman
+
dex
+
keepassxc
+
playerctl
+
poptracker
+
thunderbird
+
wl-clipboard
+
zotero
+
];
+
services.easyeffects.enable = mkDefault true;
+
};
+
}
+25
homeModules/profiles/development/default.nix
···
+
{
+
pkgs,
+
config,
+
lib,
+
...
+
}:
+
let
+
customPython = pkgs.python313.withPackages (ps: [ ps.pip ]);
+
cfg = config.py.profiles.development;
+
in
+
{
+
options.py.profiles.development.enable = lib.mkEnableOption "Development Profile";
+
config = lib.mkIf cfg.enable {
+
py.programs = {
+
neovim.enable = true;
+
};
+
home.packages = with pkgs; [
+
any-nix-shell
+
customPython
+
editorconfig-core-c
+
nil
+
nixd
+
];
+
};
+
}
+47
homeModules/profiles/gui/default.nix
···
+
{
+
pkgs,
+
lib,
+
osConfig,
+
config,
+
...
+
}:
+
let
+
inherit (lib) mkDefault mkEnableOption;
+
cfg = config.py.profiles.gui;
+
in
+
{
+
options.py.profiles.gui.enable = mkEnableOption "GUI Profile";
+
config = lib.mkIf cfg.enable {
+
py = {
+
programs = {
+
chromium.enable = mkDefault true;
+
firefox.enable = mkDefault true;
+
ghostty.enable = mkDefault true;
+
kitty.enable = mkDefault false;
+
obs.enable = mkDefault true;
+
vscodium.enable = mkDefault false;
+
zed-editor.enable = mkDefault true;
+
};
+
services = {
+
gpg-agent.enable = mkDefault true;
+
kdeconnect.enable = mkDefault true;
+
syncthing.enable = mkDefault false;
+
};
+
};
+
home.packages = with pkgs; [
+
chatterino2
+
equibop
+
krita
+
libappindicator
+
libappindicator-gtk3
+
prismlauncher
+
pwvucontrol
+
hyprshot
+
satty
+
ueberzug
+
(olympus.overrideAttrs (_: {
+
celesteWrapper = osConfig.programs.steam.package.run;
+
}))
+
];
+
};
+
}
+15
homeModules/profiles/server/default.nix
···
+
{
+
lib,
+
config,
+
...
+
}:
+
let
+
cfg = config.py.profiles.server;
+
in
+
{
+
options.py.profiles.server.enable = lib.mkEnableOption "Server Profile";
+
config = lib.mkIf cfg.enable {
+
py.profiles.base.enable = true;
+
py.profiles.cli.enable = true;
+
};
+
}
+50
homeModules/programs/caelestia/caelestia-cli.json
···
+
{
+
"record": {
+
"extraArgs": []
+
},
+
"theme": {
+
"enableTerm": false,
+
"enableHypr": false,
+
"enableDiscord": false,
+
"enableSpicetify": false,
+
"enableFuzzel": false,
+
"enableBtop": true,
+
"enableGtk": false,
+
"enableQt": false
+
},
+
"toggles": {
+
"discord": {
+
"discord": {
+
"enable": true,
+
"match": [
+
{
+
"class": "equibop"
+
}
+
],
+
"command": [
+
"equibop"
+
],
+
"move": true
+
}
+
},
+
"sysmon": {
+
"btop": {
+
"enable": true,
+
"match": [
+
{
+
"class": "btop",
+
"title": "btop",
+
"workspace": {
+
"name": "special:sysmon"
+
}
+
}
+
],
+
"command": [
+
"ghostty",
+
"-e",
+
"btop"
+
]
+
}
+
}
+
}
+
}
+364
homeModules/programs/caelestia/caelestia-shell.json
···
+
{
+
"appearance": {
+
"anim": {
+
"durations": {
+
"scale": 0.5
+
}
+
},
+
"font": {
+
"family": {
+
"clock": "Inter",
+
"material": "Material Symbols Rounded",
+
"mono": "BlexMono Nerd Font",
+
"sans": "Inter"
+
},
+
"size": {
+
"scale": 1.1
+
}
+
},
+
"padding": {
+
"scale": 1
+
},
+
"rounding": {
+
"scale": 0
+
},
+
"spacing": {
+
"scale": 0.5
+
},
+
"transparency": {
+
"base": 0.85,
+
"enabled": false,
+
"layers": 0.4
+
}
+
},
+
"background": {
+
"desktopClock": {
+
"enabled": false
+
},
+
"enabled": true,
+
"visualiser": {
+
"autoHide": true,
+
"enabled": false,
+
"rounding": 1,
+
"spacing": 1
+
}
+
},
+
"bar": {
+
"clock": {
+
"showIcon": false
+
},
+
"dragThreshold": 20,
+
"entries": [
+
{
+
"enabled": true,
+
"id": "workspaces"
+
},
+
{
+
"enabled": true,
+
"id": "spacer"
+
},
+
{
+
"enabled": false,
+
"id": "activeWindow"
+
},
+
{
+
"enabled": true,
+
"id": "spacer"
+
},
+
{
+
"enabled": true,
+
"id": "clock"
+
},
+
{
+
"enabled": true,
+
"id": "statusIcons"
+
},
+
{
+
"enabled": true,
+
"id": "tray"
+
},
+
{
+
"enabled": true,
+
"id": "power"
+
}
+
],
+
"persistent": true,
+
"scrollActions": {
+
"brightness": false,
+
"volume": false,
+
"workspaces": false
+
},
+
"showOnHover": true,
+
"status": {
+
"showAudio": true,
+
"showBattery": true,
+
"showBluetooth": true,
+
"showKbLayout": false,
+
"showLockStatus": true,
+
"showMicrophone": false,
+
"showNetwork": true
+
},
+
"tray": {
+
"background": true,
+
"compact": false,
+
"iconSubs": [],
+
"recolour": true
+
},
+
"workspaces": {
+
"activeIndicator": true,
+
"activeLabel": "",
+
"activeTrail": false,
+
"label": " ",
+
"occupiedBg": false,
+
"occupiedLabel": "",
+
"perMonitorWorkspaces": true,
+
"showWindows": true,
+
"shown": 5
+
}
+
},
+
"border": {
+
"rounding": 0,
+
"thickness": 10
+
},
+
"dashboard": {
+
"dragThreshold": 50,
+
"enabled": true,
+
"mediaUpdateInterval": 500,
+
"showOnHover": true
+
},
+
"general": {
+
"apps": {
+
"audio": [
+
"pwvucontrol"
+
],
+
"explorer": [
+
"thunar"
+
],
+
"playback": [
+
"mpv"
+
],
+
"terminal": [
+
"ghostty"
+
]
+
},
+
"battery": {
+
"criticalLevel": 3,
+
"warnLevels": [
+
{
+
"icon": "battery_android_frame_2",
+
"level": 20,
+
"message": "You might want to plug in a charger",
+
"title": "Low battery"
+
},
+
{
+
"icon": "battery_android_frame_1",
+
"level": 10,
+
"message": "You should probably plug in a charger <b>now</b>",
+
"title": "Did you see the previous message?"
+
},
+
{
+
"critical": true,
+
"icon": "battery_android_alert",
+
"level": 5,
+
"message": "PLUG THE CHARGER RIGHT NOW!!",
+
"title": "Critical battery level"
+
}
+
]
+
},
+
"idle": {
+
"inhibitWhenAudio": false,
+
"lockBeforeSleep": false,
+
"timeouts": []
+
}
+
},
+
"launcher": {
+
"actionPrefix": ">",
+
"actions": [
+
{
+
"command": [
+
"autocomplete",
+
"calc"
+
],
+
"dangerous": false,
+
"description": "Do simple math equations (powered by Qalc)",
+
"enabled": true,
+
"icon": "calculate",
+
"name": "Calculator"
+
},
+
{
+
"name": "Wallpaper",
+
"icon": "image",
+
"description": "Change the current wallpaper",
+
"command": [
+
"autocomplete",
+
"wallpaper"
+
],
+
"enabled": true,
+
"dangerous": false
+
},
+
{
+
"name": "Random",
+
"icon": "casino",
+
"description": "Switch to a random wallpaper",
+
"command": [
+
"caelestia",
+
"wallpaper",
+
"-r"
+
],
+
"enabled": true,
+
"dangerous": false
+
},
+
{
+
"command": [
+
"systemctl",
+
"poweroff"
+
],
+
"dangerous": true,
+
"description": "Shutdown the system",
+
"enabled": true,
+
"icon": "power_settings_new",
+
"name": "Shutdown"
+
},
+
{
+
"command": [
+
"systemctl",
+
"reboot"
+
],
+
"dangerous": true,
+
"description": "Reboot the system",
+
"enabled": true,
+
"icon": "cached",
+
"name": "Reboot"
+
},
+
{
+
"command": [
+
"loginctl",
+
"terminate-user",
+
""
+
],
+
"dangerous": true,
+
"description": "Log out of the current session",
+
"enabled": true,
+
"icon": "exit_to_app",
+
"name": "Logout"
+
},
+
{
+
"command": [
+
"loginctl",
+
"lock-session"
+
],
+
"dangerous": false,
+
"description": "Lock the current session",
+
"enabled": true,
+
"icon": "lock",
+
"name": "Lock"
+
},
+
{
+
"command": [
+
"systemctl",
+
"suspend"
+
],
+
"dangerous": false,
+
"description": "Suspend",
+
"enabled": true,
+
"icon": "bedtime",
+
"name": "Sleep"
+
}
+
],
+
"dragThreshold": 50,
+
"enableDangerousActions": false,
+
"hiddenApps": [],
+
"maxShown": 7,
+
"maxWallpapers": 9,
+
"showOnHover": false,
+
"specialPrefix": "@",
+
"useFuzzy": {
+
"actions": false,
+
"apps": true,
+
"schemes": false,
+
"variants": false,
+
"wallpapers": false
+
},
+
"vimKeybinds": true
+
},
+
"lock": {
+
"recolourLogo": false,
+
"enableFprint": false
+
},
+
"notifs": {
+
"actionOnClick": true,
+
"clearThreshold": 0.3,
+
"defaultExpireTimeout": 5000,
+
"expandThreshold": 20,
+
"expire": true
+
},
+
"osd": {
+
"enableBrightness": true,
+
"enableMicrophone": false,
+
"enabled": true,
+
"hideDelay": 2000
+
},
+
"paths": {
+
"mediaGif": "",
+
"sessionGif": "",
+
"wallpaperDir": "~/bgs/wallpapers"
+
},
+
"services": {
+
"audioIncrement": 0.1,
+
"defaultPlayer": "Spotify",
+
"gpuType": "",
+
"playerAliases": [
+
{
+
"from": "Mozilla firefox",
+
"to": "Firefox"
+
}
+
],
+
"smartScheme": false,
+
"useFahrenheit": true,
+
"useTwelveHourClock": false,
+
"visualiserBars": 0,
+
"weatherLocation": "Norfolk+Virginia"
+
},
+
"session": {
+
"commands": {
+
"hibernate": [
+
"systemctl",
+
"suspend"
+
],
+
"logout": [
+
"loginctl",
+
"terminate-user"
+
],
+
"reboot": [
+
"systemctl",
+
"reboot"
+
],
+
"shutdown": [
+
"systemctl",
+
"poweroff"
+
]
+
},
+
"dragThreshold": 30,
+
"enabled": true,
+
"vimKeybinds": true
+
},
+
"sidebar": {
+
"dragThreshold": 80,
+
"enabled": true
+
},
+
"utilities": {
+
"enabled": true,
+
"maxToasts": 4,
+
"toasts": {
+
"audioInputChanged": true,
+
"audioOutputChanged": true,
+
"capsLockChanged": true,
+
"chargingChanged": true,
+
"configLoaded": true,
+
"dndChanged": true,
+
"gameModeChanged": true,
+
"numLockChanged": true,
+
"nowPlaying": true
+
}
+
}
+
}
+23
homeModules/programs/caelestia/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}:
+
let
+
cfg = config.py.profiles.desktop.caelestia;
+
en = config.py.profiles.desktop.enable;
+
in
+
{
+
config = lib.mkIf (cfg && en) {
+
programs.caelestia = {
+
enable = true;
+
settings = builtins.fromJSON (builtins.readFile ./caelestia-shell.json);
+
systemd = {
+
enable = true;
+
target = "graphical-session.target";
+
};
+
cli.enable = true;
+
cli.settings = builtins.fromJSON (builtins.readFile ./caelestia-cli.json);
+
};
+
};
+
}
+18
homeModules/programs/chromium/default.nix
···
+
{
+
pkgs,
+
config,
+
lib,
+
...
+
}:
+
let
+
cfg = config.py.programs.chromium;
+
in
+
{
+
options.py.programs.chromium.enable = lib.mkEnableOption "Chromium";
+
+
config.programs.chromium = lib.mkIf cfg.enable {
+
enable = true;
+
package = pkgs.ungoogled-chromium;
+
dictionaries = [ pkgs.hunspellDictsChromium.en_US ];
+
};
+
}
+23
homeModules/programs/default.nix
···
+
{
+
imports = [
+
# keep-sorted start
+
./caelestia
+
./chromium
+
./dms
+
./firefox
+
./fish
+
./ghostty
+
./git
+
./gpg
+
./helix
+
./kitty
+
./misc-programs
+
./neovim
+
./nushell
+
./ssh
+
./starship
+
./vscodium
+
./zed-editor
+
# keep-sorted end
+
];
+
}
+20
homeModules/programs/dms/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}:
+
let
+
cfg = config.py.profiles.desktop.dms;
+
en = config.py.profiles.desktop.enable;
+
in
+
{
+
config = lib.mkIf (cfg && en) {
+
programs.dankMaterialShell = {
+
enable = true;
+
enableDynamicTheming = false;
+
enableAudioWavelength = false;
+
enableCalendarEvents = false;
+
enableSystemSound = false;
+
};
+
};
+
}
+27
homeModules/programs/firefox/default.nix
···
+
{ config, lib, ... }:
+
let
+
cfg = config.py.programs.firefox;
+
in
+
{
+
options.py.programs.firefox = {
+
enable = lib.mkEnableOption "Firefox configuration";
+
};
+
config = lib.mkIf cfg.enable {
+
programs.firefox = {
+
inherit (cfg) enable;
+
package = null;
+
profiles = {
+
default = {
+
id = 0;
+
isDefault = true;
+
name = "Default";
+
};
+
acc_testing = {
+
id = 1;
+
isDefault = false;
+
name = "Accessibility Testing";
+
};
+
};
+
};
+
};
+
}
+44
homeModules/programs/fish/default.nix
···
+
{
+
pkgs,
+
lib,
+
config,
+
...
+
}:
+
let
+
inherit (lib) mkEnableOption mkIf;
+
cfg = config.py.programs.fish;
+
in
+
{
+
options.py.programs.fish.enable = mkEnableOption "fish shell";
+
config.catppuccin.fish.enable = cfg.enable;
+
config.programs.fish = mkIf cfg.enable {
+
enable = true;
+
shellAliases = {
+
"lg" = "lazygit";
+
"cat" = "bat";
+
"gls" = "eza -lah@ --icons --git --git-ignore --no-user";
+
"ls" = "eza --icons -a";
+
"ll" = "eza --icons -lah@";
+
"lt" = "eza --icons --tree -a";
+
"dig" = "doggo";
+
"nt" = "nixpkgs-track";
+
};
+
shellInit = ''
+
set -x GPG_TTY (tty)
+
set -x SSH_AUTH_SOCK (gpgconf --list-dirs agent-ssh-socket)
+
gpgconf --launch gpg-agent
+
'';
+
+
interactiveShellInit = ''
+
fzf_configure_bindings --directory=\cf --git_log=\cl --git_status=\cg \
+
--history=\cr --variables=\cv --processes=\cp
+
'';
+
+
plugins = [
+
{
+
inherit (pkgs.fishPlugins.fzf-fish) src;
+
name = "fzf-fish";
+
}
+
];
+
};
+
}
+20
homeModules/programs/ghostty/default.nix
···
+
{
+
lib,
+
config,
+
...
+
}:
+
let
+
cfg = config.py.programs.ghostty;
+
in
+
{
+
options.py.programs.ghostty.enable = lib.mkEnableOption "ghostty";
+
config.catppuccin.ghostty.enable = cfg.enable;
+
config.programs.ghostty = lib.mkIf cfg.enable {
+
enable = true;
+
enableFishIntegration = true;
+
installBatSyntax = true;
+
enableBashIntegration = true;
+
enableZshIntegration = false;
+
settings = import ./settings.nix;
+
};
+
}
+19
homeModules/programs/ghostty/settings.nix
···
+
{
+
font-family = "IBM Plex Mono";
+
font-family-bold = "IBM Plex Mono Bold";
+
font-family-italic = "IBM Plex Mono Italic";
+
font-family-bold-italic = "IBM Plex Mono Bold Italic";
+
font-size = 14;
+
+
cursor-style = "block";
+
+
window-decoration = false;
+
window-inherit-working-directory = false;
+
+
clipboard-read = "allow";
+
clipboard-write = "allow";
+
clipboard-paste-protection = true;
+
+
shell-integration-features = "cursor,sudo,title";
+
auto-update = "off";
+
}
+106
homeModules/programs/git/default.nix
···
+
{
+
pkgs,
+
lib,
+
config,
+
...
+
}:
+
let
+
cfg = config.py.programs.git;
+
in
+
{
+
options.py.programs.git = {
+
enable = lib.mkEnableOption "git configuration";
+
lazygit.enable = lib.mkEnableOption "lazygit configuration";
+
gh.enable = lib.mkEnableOption "gh configuration";
+
};
+
config = {
+
catppuccin = {
+
lazygit.enable = cfg.lazygit.enable;
+
};
+
programs = {
+
git = lib.mkIf cfg.enable {
+
enable = true;
+
package = pkgs.git;
+
settings = {
+
branch.sort = "-committerdate";
+
column.ui = "auto";
+
core.editor = lib.getExe pkgs.neovim;
+
"credential \"https://git.pyrox.dev\"".username = "pyrox";
+
credential.helper = "rbw";
+
diff = {
+
algorithm = "histogram";
+
colorMoved = "plain";
+
mnemonicPrefix = true;
+
renames = true;
+
};
+
fetch = {
+
all = true;
+
prune = true;
+
pruneTags = true;
+
};
+
gpg.ssh.allowedSignersFile = "~/.ssh/authorized_signatures";
+
init.defaultBranch = "main";
+
pull.rebase = false;
+
push = {
+
autoSetupRemote = true;
+
followTags = true;
+
};
+
rebase.updateRefs = true;
+
tag.sort = "version:refname";
+
lfs = {
+
enable = true;
+
skipSmudge = false;
+
};
+
user = {
+
email = "pyrox@pyrox.dev";
+
name = "dish";
+
};
+
signing = {
+
key = "~/.ssh/main.pub";
+
format = "ssh";
+
signByDefault = true;
+
};
+
};
+
};
+
delta = {
+
enable = true;
+
options.line-numbers = true;
+
enableGitIntegration = true;
+
};
+
mergiraf = lib.mkIf cfg.enable {
+
enable = true;
+
};
+
lazygit = lib.mkIf cfg.lazygit.enable {
+
enable = true;
+
settings = {
+
gui = {
+
nerdFontsVersion = "3";
+
showRandomTip = false;
+
theme.selectedLineBgColor = [ "default" ];
+
};
+
git.pagers = [
+
{
+
pager = "${lib.getExe pkgs.delta} --dark --paging=never";
+
colorArg = "always";
+
}
+
];
+
services = {
+
"git.pyrox.dev" = "gitea:git.pyrox.dev";
+
"git.dn42.dev" = "gitea:git.dn42.dev";
+
"codeberg.org" = "gitea:codeberg.org";
+
};
+
};
+
};
+
gh = lib.mkIf cfg.gh.enable {
+
enable = true;
+
gitCredentialHelper.enable = true;
+
settings = {
+
editor = lib.getExe pkgs.neovim;
+
git_protocol = "https";
+
browser = lib.mkIf config.py.profiles.gui.enable pkgs.firefox;
+
prompt = "enabled";
+
};
+
};
+
};
+
};
+
}
+49
homeModules/programs/gpg/default.nix
···
+
{
+
pkgs,
+
lib,
+
config,
+
...
+
}:
+
let
+
cfg = config.py.programs.gpg;
+
in
+
{
+
options.py.programs.gpg.enable = lib.mkEnableOption "gpg";
+
config.programs.gpg = lib.mkIf cfg.enable {
+
enable = true;
+
settings = {
+
personal-cipher-preferences = "AES256 AES192 AES";
+
personal-digest-preferences = "SHA512 SHA384 SHA256";
+
personal-compress-preferences = "ZLIB BZIP2 ZIP Uncompressed";
+
default-preference-list = "SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed";
+
cert-digest-algo = "SHA512";
+
s2k-digest-algo = "SHA512";
+
s2k-cipher-algo = "AES256";
+
charset = "utf-8";
+
fixed-list-mode = true;
+
no-comments = true;
+
no-emit-version = true;
+
no-greeting = true;
+
keyid-format = "0xlong";
+
list-options = "show-uid-validity";
+
verify-options = "show-uid-validity";
+
with-fingerprint = true;
+
with-key-origin = true;
+
require-cross-certification = true;
+
no-symkey-cache = true;
+
use-agent = true;
+
throw-keyids = true;
+
default-key = "0xFE1D8A7D620C611F";
+
trusted-key = "0xFE1D8A7D620C611F";
+
keyserver = "hkps://keys.openpgp.org";
+
};
+
scdaemonSettings = {
+
card-timeout = "60";
+
pcsc-shared = true;
+
# shared-access = true;
+
disable-ccid = true;
+
pcsc-driver = "${pkgs.pcsclite.out}/lib/libpcsclite.so";
+
reader-port = "Yubico Yubi";
+
};
+
};
+
}
+15
homeModules/programs/helix/default.nix
···
+
{ config, lib, ... }:
+
let
+
cfg = config.py.programs.helix;
+
in
+
{
+
options.py.programs.helix.enable = lib.mkEnableOption "helix editor";
+
config.catppuccin.helix = {
+
inherit (cfg) enable;
+
useItalics = cfg.enable;
+
};
+
config.programs.helix = lib.mkIf cfg.enable {
+
enable = true;
+
settings = import ./settings.nix;
+
};
+
}
+25
homeModules/programs/helix/settings.nix
···
+
{
+
editor = {
+
line-number = "absolute";
+
mouse = false;
+
auto-save = true;
+
true-color = true;
+
bufferline = "multiple";
+
cursor-shape = {
+
normal = "block";
+
insert = "bar";
+
select = "underline";
+
};
+
lsp = {
+
display-messages = true;
+
auto-signature-help = true;
+
display-signature-help-docs = true;
+
};
+
whitespace.render = {
+
space = "none";
+
tab = "all";
+
newline = "all";
+
};
+
indent-guides.render = true;
+
};
+
}
+14
homeModules/programs/kitty/default.nix
···
+
{ lib, config, ... }:
+
let
+
cfg = config.py.programs.kitty;
+
in
+
{
+
options.py.programs.kitty.enable = lib.mkEnableOption "kitty";
+
config.catppuccin.kitty.enable = cfg.enable;
+
config.programs.kitty = lib.mkIf cfg.enable {
+
enable = true;
+
font.name = "BlexMono Nerd Font";
+
font.size = 14;
+
settings = import ./settings.nix;
+
};
+
}
+41
homeModules/programs/kitty/settings.nix
···
+
{
+
# Font settings
+
bold_font = "BlexMono Nerd Font Bold";
+
italic_font = "BlexMono Nerd Font Italic";
+
bold_italic_font = "BlexMono Nerd Font Bold Italic";
+
# Cursor Settings
+
scrollback_lines = 10000;
+
wheel_scroll_multiplier = 3;
+
touch_scroll_multiplier = 2;
+
scrollback_pager = "page";
+
cursor_shape = "block";
+
# Mouse settings
+
mouse_hide_wait = "0.5";
+
open_url_with = "default";
+
strip_trailing_spaces = "smart";
+
focus_follows_mouse = true;
+
# Perf settings
+
repaint_delay = 16;
+
sync_to_monitor = true;
+
# Terminal Bell settings
+
enable_audio_bell = false;
+
# Window settings
+
hide_window_decorations = true;
+
# Tab Bar settings
+
tab_bar_edge = "bottom";
+
tab_bar_margin_width = 0;
+
tab_bar_margin_height = "0 0";
+
tab_bar_style = "powerline";
+
tab_bar_min_tabs = 2;
+
+
shell = "fish";
+
editor = "nvim";
+
allow_remote_control = "socket-only";
+
listen_on = "unix:/tmp/mykitty";
+
update_check_interval = 0;
+
allow_hyperlinks = true;
+
shell_integration = "no-cursor";
+
term = "xterm-kitty";
+
remember_window_size = "no";
+
linux_display_server = "wayland";
+
}
+78
homeModules/programs/misc-programs/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}:
+
let
+
cfg = config.py.programs;
+
inherit (lib) mkEnableOption mkIf;
+
in
+
{
+
options.py.programs = {
+
bat.enable = mkEnableOption "bat";
+
direnv.enable = mkEnableOption "direnv";
+
fzf.enable = mkEnableOption "fzf";
+
nix-index.enable = mkEnableOption "nix-index";
+
obs.enable = mkEnableOption "OBS Studio";
+
pandoc.enable = mkEnableOption "pandoc";
+
wakatime.enable = mkEnableOption "wakatime";
+
zoxide.enable = mkEnableOption "zoxide";
+
};
+
config = {
+
catppuccin = {
+
bat.enable = cfg.bat.enable;
+
fzf.enable = cfg.fzf.enable;
+
obs.enable = cfg.obs.enable;
+
};
+
programs = {
+
bat = mkIf cfg.bat.enable {
+
enable = true;
+
};
+
direnv = mkIf cfg.direnv.enable {
+
enable = true;
+
enableBashIntegration = true;
+
enableNushellIntegration = true;
+
enableZshIntegration = true;
+
nix-direnv.enable = true;
+
stdlib = builtins.readFile ./direnv-stdlib.sh;
+
};
+
fzf = mkIf cfg.fzf.enable {
+
enable = true;
+
enableBashIntegration = true;
+
enableZshIntegration = true;
+
};
+
nix-index = mkIf cfg.nix-index.enable {
+
enable = true;
+
enableBashIntegration = true;
+
enableFishIntegration = true;
+
enableZshIntegration = true;
+
};
+
obs-studio = mkIf cfg.obs.enable {
+
enable = true;
+
plugins = with pkgs.obs-studio-plugins; [
+
obs-text-pthread
+
obs-backgroundremoval
+
input-overlay
+
obs-tuna
+
obs-pipewire-audio-capture
+
obs-vkcapture
+
wlrobs
+
];
+
};
+
pandoc = mkIf cfg.pandoc.enable { enable = true; };
+
zoxide = mkIf cfg.zoxide.enable {
+
enable = true;
+
enableBashIntegration = true;
+
enableFishIntegration = true;
+
enableZshIntegration = true;
+
};
+
};
+
home = {
+
packages = mkIf cfg.wakatime.enable [ pkgs.wakatime-cli ];
+
sessionVariables = {
+
WAKATIME_HOME = "${config.xdg.configHome}/wakatime";
+
};
+
};
+
};
+
}
+26
homeModules/programs/misc-programs/direnv-stdlib.sh
···
+
layout_poetry() {
+
PYPROJECT_TOML="\$\{PYPROJECT_TOML:-pyproject.toml}"
+
if [[ ! -f "$PYPROJECT_TOML" ]]; then
+
log_status "No pyproject.toml found. Executing \`poetry init\` to create a \`$PYPROJECT_TOML\` first."
+
poetry init
+
fi
+
+
if [[ -d ".venv" ]]; then
+
VIRTUAL_ENV="$(pwd)/.venv"
+
else
+
VIRTUAL_ENV=$(
+
poetry env info --path 2>/dev/null
+
true
+
)
+
fi
+
+
if [[ -z $VIRTUAL_ENV || ! -d $VIRTUAL_ENV ]]; then
+
log_status "No virtual environment exists. Executing \`poetry install\` to create one."
+
poetry install
+
VIRTUAL_ENV=$(poetry env info --path)
+
fi
+
+
PATH_add "$VIRTUAL_ENV/bin"
+
export POETRY_ACTIVE=1
+
export VIRTUAL_ENV
+
}
+35
homeModules/programs/neovim/default.nix
···
+
{
+
pkgs,
+
config,
+
lib,
+
...
+
}:
+
let
+
cfg = config.py.programs.neovim;
+
in
+
{
+
options.py.programs.neovim.enable = lib.mkEnableOption "Neovim Configuration";
+
+
config.programs.neovim = lib.mkIf cfg.enable {
+
enable = true;
+
viAlias = true;
+
vimAlias = true;
+
vimdiffAlias = true;
+
withRuby = false;
+
withNodeJs = false;
+
withPython3 = false;
+
extraPackages = [
+
pkgs.bottom
+
pkgs.fd
+
pkgs.gcc
+
pkgs.go
+
pkgs.nodejs
+
# ]
+
# ++ lib.optionals config.py.profiles.gui.enable [
+
# pkgs.ffmpegthumbnailer
+
# pkgs.fontpreview
+
# pkgs.poppler
+
# pkgs.ueberzug
+
];
+
};
+
}
+369
homeModules/programs/nushell/config.nu
···
+
source ~/.zoxide.nu
+
source ~/.cache/starship/init.nu
+
+
source /home/thehedgehog/.cache/starship/init.nu
+
+
let-env config = ($env | default {} config).config
+
let-env config = ($env.config | default {} hooks)
+
let-env config = ($env.config | update hooks ($env.config.hooks | default [] pre_prompt))
+
let-env config = ($env.config | update hooks.pre_prompt ($env.config.hooks.pre_prompt | append {
+
code: "
+
let direnv = (direnv export json | from json)
+
let direnv = if ($direnv | length) == 1 { $direnv } else { {} }
+
$direnv | load-env
+
"
+
}))
+
+
let-env config = {
+
ls: {
+
use_ls_colors: true # use the LS_COLORS environment variable to colorize output
+
clickable_links: true # enable or disable clickable links. Your terminal has to support links.
+
}
+
rm: {
+
always_trash: false # always act as if -t was given. Can be overridden with -p
+
}
+
cd: {
+
abbreviations: false # allows `cd s/o/f` to expand to `cd some/other/folder`
+
}
+
table: {
+
mode: rounded # basic, compact, compact_double, light, thin, with_love, rounded, reinforced, heavy, none, other
+
index_mode: always # "always" show indexes, "never" show indexes, "auto" = show indexes when a table has "index" column
+
trim: {
+
methodology: wrapping # wrapping or truncating
+
wrapping_try_keep_words: true # A strategy used by the 'wrapping' methodology
+
truncating_suffix: "..." # A suffix used by the 'truncating' methodology
+
}
+
}
+
+
explore: {
+
help_banner: true
+
exit_esc: true
+
+
command_bar_text: '#C4C9C6'
+
# command_bar: {fg: '#C4C9C6' bg: '#223311' }
+
+
status_bar_background: {fg: '#1D1F21' bg: '#C4C9C6' }
+
# status_bar_text: {fg: '#C4C9C6' bg: '#223311' }
+
+
highlight: {bg: 'yellow' fg: 'black' }
+
+
status: {
+
# warn: {bg: 'yellow', fg: 'blue'}
+
# error: {bg: 'yellow', fg: 'blue'}
+
# info: {bg: 'yellow', fg: 'blue'}
+
}
+
+
try: {
+
# border_color: 'red'
+
# highlighted_color: 'blue'
+
+
# reactive: false
+
}
+
+
table: {
+
split_line: '#404040'
+
+
cursor: true
+
+
line_index: true
+
line_shift: true
+
line_head_top: true
+
line_head_bottom: true
+
+
show_head: true
+
show_index: true
+
+
# selected_cell: {fg: 'white', bg: '#777777'}
+
# selected_row: {fg: 'yellow', bg: '#C1C2A3'}
+
# selected_column: blue
+
+
# padding_column_right: 2
+
# padding_column_left: 2
+
+
# padding_index_left: 2
+
# padding_index_right: 1
+
}
+
+
config: {
+
cursor_color: {bg: 'yellow' fg: 'black' }
+
+
# border_color: white
+
# list_color: green
+
}
+
}
+
+
history: {
+
max_size: 10000 # Session has to be reloaded for this to take effect
+
sync_on_enter: true # Enable to share history between multiple sessions, else you have to close the session to write history to file
+
file_format: "plaintext" # "sqlite" or "plaintext"
+
}
+
completions: {
+
case_sensitive: false # set to true to enable case-sensitive completions
+
quick: true # set this to false to prevent auto-selecting completions when only one remains
+
partial: true # set this to false to prevent partial filling of the prompt
+
algorithm: "prefix" # prefix or fuzzy
+
external: {
+
enable: true # set to false to prevent nushell looking into $env.PATH to find more suggestions, `false` recommended for WSL users as this look up my be very slow
+
max_results: 100 # setting it lower can improve completion performance at the cost of omitting some options
+
completer: null # check 'carapace_completer' above as an example
+
}
+
}
+
filesize: {
+
metric: true # true => KB, MB, GB (ISO standard), false => KiB, MiB, GiB (Windows standard)
+
format: "auto" # b, kb, kib, mb, mib, gb, gib, tb, tib, pb, pib, eb, eib, zb, zib, auto
+
}
+
cursor_shape: {
+
emacs: line # block, underscore, line (line is the default)
+
vi_insert: block # block, underscore, line (block is the default)
+
vi_normal: underscore # block, underscore, line (underscore is the default)
+
}
+
color_config: $dark_theme # if you want a light theme, replace `$dark_theme` to `$light_theme`
+
use_grid_icons: true
+
footer_mode: "25" # always, never, number_of_rows, auto
+
float_precision: 2 # the precision for displaying floats in tables
+
# buffer_editor: "emacs" # command that will be used to edit the current line buffer with ctrl+o, if unset fallback to $env.EDITOR and $env.VISUAL
+
use_ansi_coloring: true
+
edit_mode: emacs # emacs, vi
+
shell_integration: true # enables terminal markers and a workaround to arrow keys stop working issue
+
# true or false to enable or disable the welcome banner at startup
+
show_banner: true
+
render_right_prompt_on_last_line: false # true or false to enable or disable right prompt to be rendered on last line of the prompt.
+
+
hooks: {
+
pre_prompt: [{
+
null # replace with source code to run before the prompt is shown
+
}]
+
pre_execution: [{
+
null # replace with source code to run before the repl input is run
+
}]
+
env_change: {
+
PWD: [{|before, after|
+
null # replace with source code to run if the PWD environment is different since the last repl input
+
}]
+
}
+
display_output: {
+
if (term size).columns >= 100 { table -e } else { table }
+
}
+
}
+
menus: [
+
# Configuration for default nushell menus
+
# Note the lack of source parameter
+
{
+
name: completion_menu
+
only_buffer_difference: false
+
marker: "| "
+
type: {
+
layout: columnar
+
columns: 4
+
col_width: 20 # Optional value. If missing all the screen width is used to calculate column width
+
col_padding: 2
+
}
+
style: {
+
text: green
+
selected_text: green_reverse
+
description_text: yellow
+
}
+
}
+
{
+
name: history_menu
+
only_buffer_difference: true
+
marker: "? "
+
type: {
+
layout: list
+
page_size: 10
+
}
+
style: {
+
text: green
+
selected_text: green_reverse
+
description_text: yellow
+
}
+
}
+
{
+
name: help_menu
+
only_buffer_difference: true
+
marker: "? "
+
type: {
+
layout: description
+
columns: 4
+
col_width: 20 # Optional value. If missing all the screen width is used to calculate column width
+
col_padding: 2
+
selection_rows: 4
+
description_rows: 10
+
}
+
style: {
+
text: green
+
selected_text: green_reverse
+
description_text: yellow
+
}
+
}
+
# Example of extra menus created using a nushell source
+
# Use the source field to create a list of records that populates
+
# the menu
+
{
+
name: commands_menu
+
only_buffer_difference: false
+
marker: "# "
+
type: {
+
layout: columnar
+
columns: 4
+
col_width: 20
+
col_padding: 2
+
}
+
style: {
+
text: green
+
selected_text: green_reverse
+
description_text: yellow
+
}
+
source: { |buffer, position|
+
$nu.scope.commands
+
| where name =~ $buffer
+
| each { |it| {value: $it.name description: $it.usage} }
+
}
+
}
+
{
+
name: vars_menu
+
only_buffer_difference: true
+
marker: "# "
+
type: {
+
layout: list
+
page_size: 10
+
}
+
style: {
+
text: green
+
selected_text: green_reverse
+
description_text: yellow
+
}
+
source: { |buffer, position|
+
$nu.scope.vars
+
| where name =~ $buffer
+
| sort-by name
+
| each { |it| {value: $it.name description: $it.type} }
+
}
+
}
+
{
+
name: commands_with_description
+
only_buffer_difference: true
+
marker: "# "
+
type: {
+
layout: description
+
columns: 4
+
col_width: 20
+
col_padding: 2
+
selection_rows: 4
+
description_rows: 10
+
}
+
style: {
+
text: green
+
selected_text: green_reverse
+
description_text: yellow
+
}
+
source: { |buffer, position|
+
$nu.scope.commands
+
| where name =~ $buffer
+
| each { |it| {value: $it.name description: $it.usage} }
+
}
+
}
+
]
+
keybindings: [
+
{
+
name: completion_menu
+
modifier: none
+
keycode: tab
+
mode: [emacs vi_normal vi_insert]
+
event: {
+
until: [
+
{ send: menu name: completion_menu }
+
{ send: menunext }
+
]
+
}
+
}
+
{
+
name: completion_previous
+
modifier: shift
+
keycode: backtab
+
mode: [emacs, vi_normal, vi_insert] # Note: You can add the same keybinding to all modes by using a list
+
event: { send: menuprevious }
+
}
+
{
+
name: history_menu
+
modifier: control
+
keycode: char_r
+
mode: emacs
+
event: { send: menu name: history_menu }
+
}
+
{
+
name: next_page
+
modifier: control
+
keycode: char_x
+
mode: emacs
+
event: { send: menupagenext }
+
}
+
{
+
name: undo_or_previous_page
+
modifier: control
+
keycode: char_z
+
mode: emacs
+
event: {
+
until: [
+
{ send: menupageprevious }
+
{ edit: undo }
+
]
+
}
+
}
+
{
+
name: yank
+
modifier: control
+
keycode: char_y
+
mode: emacs
+
event: {
+
until: [
+
{edit: pastecutbufferafter}
+
]
+
}
+
}
+
{
+
name: unix-line-discard
+
modifier: control
+
keycode: char_u
+
mode: [emacs, vi_normal, vi_insert]
+
event: {
+
until: [
+
{edit: cutfromlinestart}
+
]
+
}
+
}
+
{
+
name: kill-line
+
modifier: control
+
keycode: char_k
+
mode: [emacs, vi_normal, vi_insert]
+
event: {
+
until: [
+
{edit: cuttolineend}
+
]
+
}
+
}
+
# Keybindings used to trigger the user defined menus
+
{
+
name: commands_menu
+
modifier: control
+
keycode: char_t
+
mode: [emacs, vi_normal, vi_insert]
+
event: { send: menu name: commands_menu }
+
}
+
{
+
name: vars_menu
+
modifier: alt
+
keycode: char_o
+
mode: [emacs, vi_normal, vi_insert]
+
event: { send: menu name: vars_menu }
+
}
+
{
+
name: commands_with_description
+
modifier: control
+
keycode: char_s
+
mode: [emacs, vi_normal, vi_insert]
+
event: { send: menu name: commands_with_description }
+
}
+
]
+
}
+12
homeModules/programs/nushell/default.nix
···
+
{ config, lib, ... }:
+
let
+
cfg = config.py.programs.nushell;
+
in
+
{
+
options.py.programs.nushell.enable = lib.mkEnableOption "Nushell";
+
config.programs.nushell = lib.mkIf cfg.enable {
+
enable = true;
+
configFile.source = ./config.nu;
+
envFile.source = ./env.nu;
+
};
+
}
+9
homeModules/programs/nushell/env.nu
···
+
zoxide init nushell --hook prompt | save ~/.zoxide.nu
+
mkdir ~/.cache/starship
+
starship init nu | save ~/.cache/starship/init.nu
+
+
let starship_cache = "/home/thehedgehog/.cache/starship"
+
if not ($starship_cache | path exists) {
+
mkdir $starship_cache
+
}
+
/etc/profiles/per-user/thehedgehog/bin/starship init nu | save --force /home/thehedgehog/.cache/starship/init.nu
+1
homeModules/programs/ssh/backup.pub
···
+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM= 993390@993390-student-FVFD26HVJ1WK
+57
homeModules/programs/ssh/default.nix
···
+
{ lib, config, ... }:
+
let
+
cfg = config.py.programs.ssh;
+
in
+
{
+
options.py.programs.ssh.enable = lib.mkEnableOption "ssh";
+
config = lib.mkIf cfg.enable {
+
programs.ssh = {
+
enable = true;
+
enableDefaultConfig = false;
+
matchBlocks = {
+
"*" = {
+
forwardAgent = false;
+
addKeysToAgent = "no";
+
serverAliveInterval = 0;
+
serverAliveCountMax = 3;
+
hashKnownHosts = false;
+
userKnownHostsFile = "~/.ssh/known_hosts";
+
controlMaster = "no";
+
controlPath = "~/.ssh/master-%r@%n:%p";
+
controlPersist = "no";
+
compression = true;
+
};
+
"marvin" = {
+
hostname = "100.123.15.72";
+
user = "thehedgehog";
+
port = 22;
+
extraOptions = {
+
"IdentitiesOnly" = "no";
+
"PreferredAuthentications" = "publickey";
+
};
+
};
+
"prefect" = {
+
hostname = "100.93.63.54";
+
user = "thehedgehog";
+
port = 22;
+
extraOptions = {
+
"IdentitiesOnly" = "no";
+
"PreferredAuthentications" = "publickey";
+
};
+
};
+
"botw" = {
+
hostname = "bandit.labs.overthewire.org";
+
port = 2220;
+
sendEnv = [
+
"WECHALLUSER"
+
"WECHALLTOKEN"
+
];
+
};
+
};
+
extraOptionOverrides = {
+
"Match" = ''host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"'';
+
};
+
};
+
home.file.".ssh/authorized_signatures".text = import ./ssh-auth-signers.nix;
+
};
+
}
+7
homeModules/programs/ssh/ssh-auth-signers.nix
···
+
''
+
hedgehog@mrhedgehog.xyz ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw==
+
hedgehog@mrhedgehog.xyz ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM=
+
me@thehedgehog.me ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw==
+
me@thehedgehog.me ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM=
+
me@thehedgehog.me ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK97n2SgV/U1mLzxcaEDl85iF5D3jm7xboZ+S01+CbM/8zxVoWyjVHCqTwDcrLwP0c5Z51BNj7U0UkGIgR4zTSM=
+
''
+1
homeModules/programs/ssh/yubikey-back.pub
···
+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw== cardno:15 567 372
+1
homeModules/programs/ssh/yubikey-main.pub
···
+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBBsOIMMZVmleClXfqUMrnmyh8PFuyiJqHKEZ51Xy746
+1
homeModules/programs/ssh/yubikey-new.pub
···
+
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK97n2SgV/U1mLzxcaEDl85iF5D3jm7xboZ+S01+CbM/8zxVoWyjVHCqTwDcrLwP0c5Z51BNj7U0UkGIgR4zTSM=
+15
homeModules/programs/starship/default.nix
···
+
{ lib, config, ... }:
+
let
+
cfg = config.py.programs.starship;
+
in
+
{
+
options.py.programs.starship.enable = lib.mkEnableOption "starship";
+
config.catppuccin.starship.enable = false;
+
config.programs.starship = lib.mkIf cfg.enable {
+
enable = true;
+
enableFishIntegration = true;
+
enableBashIntegration = true;
+
enableZshIntegration = true;
+
settings = import ./settings.nix { inherit lib; };
+
};
+
}
+104
homeModules/programs/starship/settings.nix
···
+
{ lib }:
+
{
+
format = lib.concatStrings [
+
"$hostname"
+
"$directory"
+
"$python"
+
"$deno"
+
"$nodejs"
+
"$lua"
+
"$git_branch"
+
"$git_status"
+
"$battery"
+
"$shlvl"
+
"$character"
+
];
+
right_format = lib.concatStrings [ "$nix_shell" ];
+
+
directory = {
+
read_only = " ";
+
};
+
git_branch = {
+
symbol = " ";
+
format = "(\\[[$symbol$branch]($style)\\])";
+
};
+
git_status = {
+
format = "(\\[[$all_status$ahead_behind]($style)\\])";
+
};
+
deno = {
+
symbol = " ";
+
format = "(\\[[$symbol($version)]($style)\\])";
+
};
+
nodejs = {
+
format = "(\\[[$symbol($version)]($style)\\])";
+
detect_files = [
+
"package.json"
+
".node-version"
+
".nvmrc"
+
"!deno.json"
+
"!deno.lock"
+
];
+
};
+
lua = {
+
symbol = " ";
+
format = "(\\[[$symbol($version)]($style)\\])";
+
};
+
package = {
+
symbol = "󰏖 ";
+
format = "(\\[[$symbol$version]($style)\\])";
+
};
+
python = {
+
symbol = " ";
+
pyenv_version_name = false;
+
version_format = "v$major.$minor";
+
format = "(\\[[$symbol($version)($virtualenv)]($style)\\])";
+
};
+
shlvl = {
+
symbol = " ";
+
format = "(\\[[$symbol$shlvl]($style)\\])";
+
};
+
nix_shell = {
+
symbol = " ";
+
format = "(\\[[$symbol($name)]($style)\\])";
+
};
+
aws.disabled = true;
+
conda.disabled = true;
+
crystal.disabled = true;
+
dart.disabled = true;
+
docker_context.disabled = true;
+
dotnet.disabled = true;
+
elixir.disabled = true;
+
elm.disabled = true;
+
env_var.disabled = true;
+
erlang.disabled = true;
+
gcloud.disabled = true;
+
golang.disabled = true;
+
helm.disabled = true;
+
java.disabled = true;
+
jobs.disabled = true;
+
julia.disabled = true;
+
kotlin.disabled = true;
+
kubernetes.disabled = true;
+
memory_usage.disabled = true;
+
hg_branch.disabled = true;
+
nim.disabled = true;
+
ocaml.disabled = true;
+
openstack.disabled = true;
+
perl.disabled = true;
+
php.disabled = true;
+
purescript.disabled = true;
+
rlang.disabled = true;
+
red.disabled = true;
+
ruby.disabled = true;
+
rust.disabled = true;
+
scala.disabled = true;
+
singularity.disabled = true;
+
swift.disabled = true;
+
terraform.disabled = true;
+
time.disabled = true;
+
username.disabled = true;
+
vagrant.disabled = true;
+
vlang.disabled = true;
+
vcsh.disabled = true;
+
zig.disabled = true;
+
}
+54
homeModules/programs/vscodium/default.nix
···
+
{
+
pkgs,
+
lib,
+
config,
+
...
+
}:
+
let
+
cfg = config.py.programs.vscodium;
+
in
+
{
+
options.py.programs.vscodium.enable = lib.mkEnableOption "VSCodium";
+
config.programs.vscode = lib.mkIf cfg.enable {
+
enable = true;
+
package = pkgs.vscode;
+
profiles.default.userSettings = {
+
"biome.lspBin" = "";
+
"breadcrumbs.enabled" = false;
+
"editor.formatOnPaste" = true;
+
"editor.formatOnSave" = true;
+
"editor.formatOnSaveMode" = "file";
+
"editor.formatOnType" = true;
+
"editor.fontSize" = 15;
+
"editor.fontFamily" = "'IBM Plex Mono', 'monospace', monospace";
+
"editor.minimap.enabled" = false;
+
"explorer.confirmDelete" = false;
+
"explorer.confirmDragAndDrop" = false;
+
"extensions.autoCheckUpdates" = false;
+
"extensions.autoUpdate" = false;
+
"extensions.closeExtensionDetailsOnViewChange" = true;
+
"extensions.ignoreRecommendations" = true;
+
"npm.keybindingsChangedWarningShown" = true;
+
"ruff.nativeServer" = true;
+
"ruff.showNotifications" = "onError";
+
"nix.enableLanguageServer" = true;
+
"nix.serverPath" = lib.getExe pkgs.nixd;
+
"[nix]" = {
+
"editor.defaultFormatter" = "brettm12345.nixfmt-vscode";
+
};
+
"python.analysis.autoImportCompletions" = true;
+
"python.analysis.autoSearchPaths" = true;
+
"python.analysis.completeFunctionParens" = true;
+
"python.experiments.enabled" = false;
+
"python.languageServer" = "Pylance";
+
"telemetry.telemetryLevel" = "off";
+
"terminal.external.linuxExec" = "ghostty";
+
"update.mode" = "none";
+
"update.showReleaseNotes" = false;
+
"workbench.colorTheme" = "Catppuccin Mocha";
+
"workbench.iconTheme" = "catppuccin-mocha";
+
"vscode-neovim.neovimExecutablePaths.linux" = lib.getExe pkgs.neovim;
+
"python.formatting.provider" = "black";
+
};
+
};
+
}
+36
homeModules/programs/zed-editor/default.nix
···
+
{
+
pkgs,
+
lib,
+
config,
+
...
+
}:
+
let
+
cfg = config.py.programs.zed-editor;
+
in
+
{
+
options.py.programs.zed-editor.enable = lib.mkEnableOption "Zed Editor";
+
config.programs.zed-editor = lib.mkIf cfg.enable {
+
enable = true;
+
package = pkgs.zed-editor.fhsWithPackages (pkgs: [
+
pkgs.zlib
+
pkgs.openssl
+
pkgs.openssh-patched
+
pkgs.kdePackages.qtdeclarative
+
]);
+
userSettings = import ./settings.nix;
+
extensions = [
+
"catppuccin"
+
"catppuccin-icons"
+
"git-firefly"
+
"nix"
+
"ruff"
+
"fish"
+
"just"
+
"discord-presence"
+
"wakatime"
+
"mermaid"
+
"caddyfile"
+
"vento"
+
];
+
};
+
}
+100
homeModules/programs/zed-editor/settings.nix
···
+
{
+
auto_update = false;
+
buffer_font_family = "BlexMono Nerd Font";
+
buffer_font_size = 15;
+
disable_ai = true;
+
git_panel.button = true;
+
load_direnv = "direct";
+
lsp.deno.settings.deno.enable = true;
+
relative_line_numbers = true;
+
show_edit_predictions = false;
+
soft_wrap = "none";
+
terminal.dock = "bottom";
+
theme = "Catppuccin Mocha";
+
ui_font_family = "Inter";
+
ui_font_size = 15;
+
vim_mode = true;
+
wrap_guides = [ 100 ];
+
+
icon_theme = {
+
mode = "dark";
+
dark = "Catppuccin Mocha";
+
light = "Catppuccin Mocha";
+
};
+
+
inlay_hints = {
+
enabled = true;
+
edit_debounce_ms = 500;
+
};
+
+
languages = {
+
Nix = {
+
formatter.external = {
+
command = "nixfmt";
+
arguments = [
+
"--quiet"
+
"--filename"
+
"{buffer_path}"
+
"--"
+
];
+
};
+
};
+
TypeScript = {
+
enable_language_server = true;
+
language_servers = [
+
"deno"
+
"!typescript-language-server"
+
"!vtsls"
+
"!eslint"
+
];
+
formatter = "language_server";
+
prettier.allowed = false;
+
};
+
Vento = {
+
enable_language_server = true;
+
language_servers = [
+
"vscode-html-language-server"
+
"tailwindcss-language-server"
+
];
+
format_on_save = "on";
+
formatter.external = {
+
command = "deno";
+
arguments = [
+
"task"
+
"fmt"
+
"--stdin"
+
"{buffer_path}"
+
];
+
};
+
};
+
};
+
+
lsp = {
+
tailwindcss-language-server = {
+
settings = {
+
includeLanguages = {
+
"vento" = "html";
+
"*.vto" = "html";
+
};
+
experimental = {
+
classRegex = [
+
"class=\"([^\"]*)"
+
"class={\"([^\"}]*)"
+
"class=format!({\"([^\"}]*)"
+
];
+
};
+
};
+
};
+
};
+
+
tabs = {
+
file_icons = true;
+
git_status = true;
+
show_diagnostics = "errors";
+
};
+
+
telemetry = {
+
metrics = false;
+
diagnostics = false;
+
};
+
}
+1
homeModules/scripts/default.nix
···
+
_: { }
+7
homeModules/services/default.nix
···
+
{
+
imports = [
+
./gpg-agent
+
./kdeconnect
+
./syncthing
+
];
+
}
+24
homeModules/services/gpg-agent/default.nix
···
+
{ lib, config, ... }:
+
let
+
cfg = config.py.services.gpg-agent;
+
in
+
{
+
options.py.services.gpg-agent.enable = lib.mkEnableOption "gpg-agent";
+
config.services.gpg-agent = lib.mkIf cfg.enable {
+
enable = true;
+
enableExtraSocket = true;
+
enableScDaemon = true;
+
enableSshSupport = true;
+
defaultCacheTtl = 600;
+
maxCacheTtl = 600;
+
sshKeys = [
+
# My Normal GPG Key(Authentication Subkey)
+
"485329FEF73C42C6C42879F66C8B971F3FD4A132"
+
"CFEFCD08CFE6F0849F32ABC9C5CF3158A2FE1392"
+
];
+
extraConfig = ''
+
ttyname $GPG_TTY
+
max-cache-ttl-ssh 600
+
'';
+
};
+
}
+11
homeModules/services/kdeconnect/default.nix
···
+
{ lib, config, ... }:
+
let
+
cfg = config.py.services.kdeconnect;
+
in
+
{
+
options.py.services.kdeconnect.enable = lib.mkEnableOption "KDEConnect";
+
config.services.kdeconnect = lib.mkIf cfg.enable {
+
enable = true;
+
indicator = true;
+
};
+
}
+11
homeModules/services/syncthing/default.nix
···
+
{ lib, config, ... }:
+
let
+
cfg = config.py.services.syncthing;
+
in
+
{
+
options.py.services.syncthing.enable = lib.mkEnableOption "Syncthing";
+
config.services.syncthing = lib.mkIf cfg.enable {
+
enable = true;
+
tray.enable = true;
+
};
+
}
+46
homeModules/theming/default.nix
···
+
{
+
pkgs,
+
config,
+
lib,
+
...
+
}:
+
let
+
pro = config.py.profiles;
+
inherit (lib) mkDefault mkIf;
+
in
+
{
+
catppuccin = {
+
flavor = "mocha";
+
accent = "blue";
+
};
+
home.pointerCursor = mkIf pro.gui.enable {
+
package = pkgs.catppuccin-cursors.mochaBlue;
+
name = "catppuccin-mocha-blue-cursors";
+
gtk.enable = true;
+
hyprcursor.enable = true;
+
};
+
gtk = mkIf pro.gui.enable {
+
enable = true;
+
theme = mkDefault {
+
name = "Colloid-Dark-Compact-Catppuccin";
+
package = pkgs.colloid-gtk-theme.override {
+
tweaks = [
+
"catppuccin"
+
"black"
+
];
+
colorVariants = [ "dark" ];
+
sizeVariants = [ "compact" ];
+
themeVariants = [ "default" ];
+
};
+
};
+
font = {
+
name = "IBM Plex Mono";
+
size = 14;
+
};
+
gtk3.bookmarks = [ "file:///${config.home.homeDirectory}/Downloads" ];
+
iconTheme = mkIf pro.gui.enable {
+
package = mkDefault pkgs.colloid-icon-theme;
+
name = "Colloid-Dark";
+
};
+
};
+
}
+32
homeModules/wayland/default.nix
···
+
{
+
pkgs,
+
config,
+
osConfig,
+
lib,
+
...
+
}:
+
let
+
c = osConfig.py.programs.hyprland;
+
in
+
{
+
imports = [
+
./services.nix
+
./hypridle.nix
+
];
+
config = {
+
catppuccin.hyprland.enable = c.enable;
+
wayland.windowManager.hyprland = {
+
inherit (c) enable;
+
# Per https://nix-community.github.io/home-manager/options.xhtml#opt-wayland.windowManager.hyprland.package
+
package = null;
+
systemd = {
+
enable = true;
+
enableXdgAutostart = true;
+
};
+
settings = import ./settings.nix { inherit lib config; };
+
plugins = [
+
pkgs.hyprlandPlugins.hy3
+
];
+
};
+
};
+
}
+11
homeModules/wayland/env.nix
···
+
{
+
env = [
+
"WLR_NO_HARDWARE_CURSORS, 1"
+
"WLR_RENDERER_ALLOW_SOFTWARE, 1"
+
"NIXOS_OZONE_WL, 1"
+
"XDG_SESSION_TYPE, wayland"
+
"QT_QPA_PLATFORM, wayland"
+
"XDG_CURRENT_DESKTOP, Hyprland"
+
"XDG_SESSION_DESKTOP, Hyprland"
+
];
+
}
+36
homeModules/wayland/hypridle.nix
···
+
{
+
config,
+
lib,
+
...
+
}:
+
let
+
cfg = config.wayland.windowManager.hyprland;
+
in
+
{
+
config.services.hypridle = lib.mkIf cfg.enable {
+
enable = true;
+
settings = {
+
general = {
+
lock_cmd = "loginctl lock-session";
+
# before_sleep_cmd = "loginctl lock-session";
+
after_sleep_cmd = "hyprctl dispatch dpms on";
+
inhibit_sleep = 3;
+
};
+
listener = [
+
{
+
timeout = 420;
+
on-timeout = "loginctl lock-session";
+
}
+
{
+
timeout = 600;
+
on-timeout = "hyprctl dispatch dpms off";
+
on-resume = "hyprctl dispatch dpms on";
+
}
+
{
+
timeout = 900;
+
on-timeout = "systemctl resume";
+
}
+
];
+
};
+
};
+
}
+110
homeModules/wayland/keybindings.nix
···
+
{ lib, shell }:
+
{
+
"$mod" = "SUPER";
+
"$satty" = "satty -f -";
+
+
binde = [
+
# Media binds that can be held and repeated
+
", XF86MonBrightnessDown, exec, brightnessctl set 5%-"
+
", XF86MonBrightnessUp, exec, brightnessctl set +5%"
+
", XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"
+
", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
+
];
+
+
bind = [
+
"SUPER_SHIFT, F, exec, MOZ_DISABLE_RDD_SANDBOX=1 firefox"
+
"$mod, Return, exec, ghostty"
+
"SUPER_SHIFT, E, exit"
+
+
# Media Binds
+
", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
+
", XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
+
", XF86AudioPlay, exec, playerctl play-pause"
+
", XF86AudioNext, exec, playerctl next"
+
", XF86AudioPrev, exec, playerctl previous"
+
+
# Workspace binds
+
"$mod, 1, workspace, 01"
+
"SUPER_SHIFT, 1, hy3:movetoworkspace, 01"
+
"$mod, 2, workspace, 02"
+
"SUPER_SHIFT, 2, hy3:movetoworkspace, 02"
+
"$mod, 3, workspace, 03"
+
"SUPER_SHIFT, 3, hy3:movetoworkspace, 03"
+
"$mod, 4, workspace, 04"
+
"SUPER_SHIFT, 4, hy3:movetoworkspace, 04"
+
"$mod, 5, workspace, 05"
+
"SUPER_SHIFT, 5, hy3:movetoworkspace, 05"
+
"$mod, 6, workspace, 06"
+
"SUPER_SHIFT, 6, hy3:movetoworkspace, 06"
+
"$mod, 7, workspace, 07"
+
"SUPER_SHIFT, 7, hy3:movetoworkspace, 07"
+
"$mod, 8, workspace, 08"
+
"SUPER_SHIFT, 8, hy3:movetoworkspace, 08"
+
"$mod, 9, workspace, 09"
+
"SUPER_SHIFT, 9, hy3:movetoworkspace, 09"
+
"$mod, 0, workspace, 10"
+
"SUPER_SHIFT, 0, hy3:movetoworkspace, 10"
+
# Scratchpad
+
"SUPER_SHIFT, -, hy3:movetoworkspace, special:default"
+
"$mod, -, togglespecialworkspace, default"
+
+
# Window Management
+
"SUPER_SHIFT, Up, hy3:movewindow, up, once, visible"
+
"SUPER_SHIFT, K, hy3:movewindow, up, once, visible"
+
"$mod, Up, hy3:movefocus, up, visible, warp"
+
"$mod, K, hy3:movefocus, up, visible, warp"
+
+
"SUPER_SHIFT, Right, hy3:movewindow, right, once, visible"
+
"SUPER_SHIFT, L, hy3:movewindow, right, once, visible"
+
"$mod, Right, hy3:movefocus, right, visible, warp"
+
"$mod, L, hy3:movefocus, right, visible, warp"
+
+
"SUPER_SHIFT, Left, hy3:movewindow, left, once, visible"
+
"SUPER_SHIFT, H, hy3:movewindow, left, once, visible"
+
"$mod, Left, hy3:movefocus, left, visible, warp"
+
"$mod, H, hy3:movefocus, left, visible, warp"
+
+
"SUPER_SHIFT, Down, hy3:movewindow, down, once, visible"
+
"SUPER_SHIFT, J, hy3:movewindow, down, once, visible"
+
"$mod, Down, hy3:movefocus, down, visible, warp"
+
"$mod, J, hy3:movefocus, down, visible, warp"
+
+
"SUPER_SHIFT, Q, killactive"
+
"$mod, F, fullscreen, 0"
+
# Super-(literal equals)
+
"$mod, code:21, hy3:togglefocuslayer"
+
# Super-(literal plus)
+
"SUPER_SHIFT, code:21, togglefloating, active"
+
+
# Screenshots
+
"SHIFT, F3, exec, hyprshot -m output --raw -z -s | $satty"
+
"SHIFT, F4, exec, hyprshot -m region --raw -z -s | $satty"
+
]
+
++ lib.optionals (shell == "caelestia") [
+
"$mod, X, global, caelestia:session"
+
", XF86PowerOff , global, caelestia:session"
+
"$mod, Space, global, caelestia:launcher"
+
]
+
++ lib.optionals (shell == "dms") [
+
"$mod, X, exec, dms ipc call powermenu toggle"
+
", XF86PowerOff ,exec, dms ipc call powermenu toggle"
+
"SUPER_SHIFT, X, exec, dms ipc call lock lock"
+
"$mod, Space, exec, dms ipc call spotlight toggle"
+
];
+
+
bindm = [
+
"$mod, mouse:272, movewindow"
+
];
+
+
# Unbind a bunch of default keybinds
+
unbind = [
+
"$mod, C"
+
"$mod, E"
+
"$mod, J"
+
"$mod, M"
+
"$mod, P"
+
"$mod, Q"
+
"$mod, R"
+
"$mod, V"
+
];
+
}
+8
homeModules/wayland/monitors.nix
···
+
{
+
monitor = [
+
"eDP-1, 2560x1600@165, 0x0, 1, vrr, 1"
+
"desc:Acer Technologies SA241Y 0x1497CF17, preferred, 2560x0, 1"
+
# Fallback for random monitors
+
", preferred, auto, 1"
+
];
+
}
+7
homeModules/wayland/plugins.nix
···
+
{
+
plugin = {
+
hy3 = {
+
no_gaps_when_only = 1;
+
};
+
};
+
}
+10
homeModules/wayland/services.nix
···
+
{
+
config,
+
...
+
}:
+
let
+
cfg = config.wayland.windowManager.hyprland;
+
in
+
{
+
services.hyprpolkitagent.enable = cfg.enable;
+
}
+25
homeModules/wayland/settings.nix
···
+
{ config, lib, ... }:
+
let
+
inherit (config.py.profiles.desktop) shell;
+
keybinds = import ./keybindings.nix { inherit lib shell; };
+
monitors = import ./monitors.nix;
+
variables = import ./variables.nix;
+
plugins = import ./plugins.nix;
+
env = import ./env.nix;
+
windowrules = import ./windowrules.nix;
+
in
+
{
+
animation = [
+
"global, 1, 4, default"
+
];
+
exec-once = lib.optionals (shell == "dms") [
+
"dms run"
+
"bash -c \"wl-paste --watch cliphist store &\""
+
];
+
}
+
// keybinds
+
// monitors
+
// variables
+
// plugins
+
// env
+
// windowrules
+35
homeModules/wayland/variables.nix
···
+
# https://wiki.hypr.land/Configuring/Variables
+
{
+
general = {
+
gaps_in = 1;
+
gaps_out = 10;
+
layout = "hy3";
+
resize_on_border = true;
+
};
+
decoration = {
+
blur.enabled = false;
+
shadow.enabled = false;
+
};
+
misc = {
+
disable_hyprland_logo = true;
+
disable_splash_rendering = true;
+
font_family = "Inter";
+
mouse_move_focuses_monitor = true;
+
};
+
input = {
+
kb_options = "caps:escape";
+
repeat_delay = 300;
+
touchpad = {
+
scroll_factor = 1.5;
+
tap_button_map = "lmr";
+
tap-and-drag = false;
+
};
+
};
+
cursor = {
+
hotspot_padding = 2;
+
};
+
ecosystem = {
+
no_update_news = true;
+
no_donation_nag = true;
+
};
+
}
+7
homeModules/wayland/windowrules.nix
···
+
{
+
windowrule = [
+
"immediate, content game, title:Celeste"
+
"tile, title:Melvor Idle"
+
"immediate, content game, fullscreen, monitor DP-2, class:steam_app_49520, initialClass:steam_app_49520"
+
];
+
}
+128
homeModules/xdg/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}:
+
let
+
homeDir = config.home.homeDirectory;
+
pro = config.py.profiles;
+
in
+
{
+
xdg = {
+
enable = true;
+
mime.enable = lib.mkIf pro.gui.enable true;
+
configHome = lib.mkForce "${homeDir}/.config";
+
dataHome = lib.mkForce "${homeDir}/.local/share";
+
portal = lib.mkIf pro.gui.enable {
+
enable = true;
+
xdgOpenUsePortal = true;
+
extraPortals = [
+
pkgs.xdg-desktop-portal-gtk
+
];
+
config = {
+
common = {
+
default = [
+
"hyprland"
+
"gtk"
+
];
+
"org.freedesktop.impl.portal.FileChooser" = [ "gtk" ];
+
};
+
};
+
};
+
mimeApps = lib.mkIf pro.gui.enable {
+
enable = true;
+
associations.added = {
+
"application/pdf" = [ "firefox.desktop" ];
+
"application/rdf+xml" = [ "firefox.desktop" ];
+
"application/rss+xml" = [ "firefox.desktop" ];
+
"application/xhtml+xml" = [ "firefox.desktop" ];
+
"application/xhtml_xml" = [ "firefox.desktop" ];
+
"application/xml" = [ "firefox.desktop" ];
+
"image/gif" = [
+
"viewnior.desktop"
+
"firefox.desktop"
+
];
+
"image/jpeg" = [
+
"viewnior.desktop"
+
"firefox.desktop"
+
];
+
"image/png" = [
+
"viewnior.desktop"
+
"firefox.desktop"
+
];
+
"image/webp" = [
+
"viewnior.desktop"
+
"firefox.desktop"
+
];
+
"text/html" = [ "firefox.desktop" ];
+
"text/xml" = [ "firefox.desktop" ];
+
"x-scheme-handler/http" = [ "firefox.desktop" ];
+
"x-scheme-handler/https" = [ "firefox.desktop" ];
+
"x-scheme-handler/about" = [ "firefox.desktop" ];
+
"x-scheme-handler/unknown" = [ "firefox.desktop" ];
+
"x-scheme-handler/mailto" = [
+
"thunderbird.desktop"
+
"firefox.desktop"
+
];
+
"x-scheme-handler/webcal" = [
+
"firefox.desktop"
+
"thunderbird.desktop"
+
];
+
};
+
defaultApplications = {
+
"application/pdf" = [ "firefox.desktop" ];
+
"application/rdf+xml" = [ "firefox.desktop" ];
+
"application/rss+xml" = [ "firefox.desktop" ];
+
"application/xhtml+xml" = [ "firefox.desktop" ];
+
"application/xhtml_xml" = [ "firefox.desktop" ];
+
"application/xml" = [ "firefox.desktop" ];
+
"image/gif" = [
+
"viewnior.desktop"
+
"firefox.desktop"
+
];
+
"image/jpeg" = [
+
"viewnior.desktop"
+
"firefox.desktop"
+
];
+
"image/png" = [
+
"viewnior.desktop"
+
"firefox.desktop"
+
];
+
"image/webp" = [
+
"viewnior.desktop"
+
"firefox.desktop"
+
];
+
"text/html" = [ "firefox.desktop" ];
+
"text/xml" = [ "firefox.desktop" ];
+
"x-scheme-handler/http" = [ "firefox.desktop" ];
+
"x-scheme-handler/https" = [ "firefox.desktop" ];
+
"x-scheme-handler/about" = [ "firefox.desktop" ];
+
"x-scheme-handler/unknown" = [ "firefox.desktop" ];
+
"x-scheme-handler/mailto" = [
+
"thunderbird.desktop"
+
"firefox.desktop"
+
];
+
"x-scheme-handler/webcal" = [
+
"firefox.desktop"
+
"thunderbird.desktop"
+
];
+
"x-scheme-handler/steam" = [
+
"steam-native.desktop"
+
"steam.desktop"
+
];
+
"x-scheme-handler/steamlink" = [
+
"steam-native.desktop"
+
"steam.desktop"
+
];
+
};
+
};
+
userDirs = {
+
enable = true;
+
createDirectories = true;
+
music = "$HOME/music";
+
publicShare = "$HOME/.xdg/share";
+
templates = "$HOME/.xdg/templates";
+
};
+
};
+
}
-8
homes/x86_64-linux/pyrox@marvin/default.nix
···
-
{
-
snowfallorg.user = {
-
enable = true;
-
};
-
py = {
-
profiles.server.enable = true;
-
};
-
}
-8
homes/x86_64-linux/pyrox@prefect/default.nix
···
-
{
-
snowfallorg.user = {
-
enable = true;
-
};
-
py = {
-
profiles.server.enable = true;
-
};
-
}
-8
homes/x86_64-linux/pyrox@thought/default.nix
···
-
{
-
snowfallorg.user = {
-
enable = true;
-
};
-
py = {
-
profiles.server.enable = true;
-
};
-
}
-55
homes/x86_64-linux/pyrox@zaphod/default.nix
···
-
{
-
pkgs,
-
...
-
}:
-
{
-
imports = [
-
./files/pamKeys.nix
-
./files/distrobox-config.nix
-
];
-
snowfallorg.user = {
-
enable = true;
-
};
-
home.packages = [
-
pkgs.mindustry
-
];
-
py = {
-
profiles.desktop.enable = true;
-
};
-
py.services.kanshi.settings = [
-
{
-
profile = {
-
name = "laptop-only";
-
outputs = [
-
{
-
criteria = "eDP-1";
-
status = "enable";
-
scale = 1.2;
-
position = "0,0";
-
adaptiveSync = true;
-
}
-
];
-
};
-
}
-
{
-
profile = {
-
name = "office";
-
outputs = [
-
{
-
criteria = "eDP-1";
-
status = "enable";
-
scale = 1.2;
-
position = "0,0";
-
adaptiveSync = true;
-
}
-
{
-
criteria = "Acer Technologies SA241Y 0x1497CF17";
-
status = "enable";
-
scale = 1.0;
-
position = "2160,0";
-
}
-
];
-
};
-
}
-
];
-
}
-7
homes/x86_64-linux/pyrox@zaphod/files/distrobox-config.nix
···
-
{
-
xdg.configFile."distrobox/distrobox.conf" = {
-
text = ''
-
distrobox_sudo_program="doas"
-
'';
-
};
-
}
-5
homes/x86_64-linux/pyrox@zaphod/files/pamKeys.nix
···
-
{
-
xdg.configFile."Yubico/u2f_keys".text = ''
-
thehedgehog:iC1dk7d+DYFX60wpkDlWdwNpkRLXmML7iDjxh4TRXe8OhsAb2pgKiY6tVLHeZIK3WOVA1DuWU8rWlHdma3eqJg==,NdBJTVCvOamU35ad3fJRv6A6YZQIYrojcVk9a8WYMVvTtKO+xyIeBvunlidHv4Zb0rYrOvK6u7Gb4N5x6T6FIQ==,es256,+presence:juWx2IphhNuHZHiv8nG3i2WWTyR5A+CWp5iHz2AmE7aj3b3rgj85Gl1PMpmZlvlwDgbCP+dlcP5PPzTFloB3Ow==,FEXBkP0PzZSURoIbLuGiRRHFIcSiqEz/ieNPRqRY/hqLJ4AsvGwJ1xdIX7F8qAQuMSp8m7usuBLS4u+4FGg3Ng==,es256,+presence
-
'';
-
}
-8
homes/x86_64-linux/thehedgehog@marvin/default.nix
···
-
{
-
snowfallorg.user = {
-
enable = true;
-
};
-
py = {
-
profiles.server.enable = true;
-
};
-
}
-8
homes/x86_64-linux/thehedgehog@prefect/default.nix
···
-
{
-
snowfallorg.user = {
-
enable = true;
-
};
-
py = {
-
profiles.server.enable = true;
-
};
-
}
-8
homes/x86_64-linux/thehedgehog@thought/default.nix
···
-
{
-
snowfallorg.user = {
-
enable = true;
-
};
-
py = {
-
profiles.server.enable = true;
-
};
-
}
-53
homes/x86_64-linux/thehedgehog@zaphod/default.nix
···
-
{
-
pkgs,
-
...
-
}:
-
{
-
snowfallorg.user = {
-
enable = true;
-
};
-
home.packages = [
-
pkgs.mindustry
-
(pkgs.zed-editor.fhsWithPackages (pkgs: [
-
pkgs.zlib
-
pkgs.openssl
-
]))
-
];
-
py.profiles.desktop.enable = true;
-
py.services.kanshi.settings = [
-
{
-
profile = {
-
name = "laptop-only";
-
outputs = [
-
{
-
criteria = "eDP-1";
-
status = "enable";
-
scale = 1.2;
-
position = "0,0";
-
adaptiveSync = true;
-
}
-
];
-
};
-
}
-
{
-
profile = {
-
name = "office";
-
outputs = [
-
{
-
criteria = "eDP-1";
-
status = "enable";
-
scale = 1.2;
-
position = "0,0";
-
adaptiveSync = true;
-
}
-
{
-
criteria = "Acer Technologies SA241Y 0x1497CF17";
-
status = "enable";
-
scale = 1.0;
-
position = "2160,0";
-
}
-
];
-
};
-
}
-
];
-
}
+69
hosts/default.nix
···
+
{ inputs, ... }:
+
{
+
easy-hosts = {
+
shared = {
+
modules = [
+
inputs.agenix.nixosModules.default
+
inputs.ctp.nixosModules.catppuccin
+
inputs.home-manager.nixosModules.home-manager
+
inputs.self.nixosModules.chromium
+
inputs.self.nixosModules.defaultConfig
+
inputs.self.nixosModules.defaultUsers
+
inputs.self.nixosModules.firefox
+
inputs.self.nixosModules.hyprland
+
inputs.self.nixosModules.forgejo-runner
+
inputs.self.nixosModules.hm-pyrox
+
inputs.self.nixosModules.hm-thehedgehog
+
inputs.self.nixosModules.miscPrograms
+
inputs.self.nixosModules.neovim
+
inputs.self.nixosModules.profiles
+
inputs.self.nixosModules.scrutiny
+
];
+
};
+
path = ./.;
+
hosts = {
+
marvin = {
+
deployable = true;
+
tags = [
+
"server"
+
"home"
+
];
+
modules = [
+
inputs.golink.nixosModules.default
+
inputs.tangled.nixosModules.knot
+
inputs.tangled.nixosModules.spindle
+
];
+
};
+
prefect = {
+
deployable = true;
+
tags = [
+
"server"
+
"vps"
+
];
+
modules = [
+
inputs.dn42.nixosModules.default
+
];
+
};
+
thought = {
+
deployable = true;
+
tags = [
+
"server"
+
"vps"
+
];
+
};
+
zaphod = {
+
deployable = true;
+
tags = [ "laptop" ];
+
modules = [
+
inputs.hardware.nixosModules.framework-16-7040-amd
+
inputs.self.nixosModules.hm-pyrox-zaphod
+
inputs.self.nixosModules.hm-thehedgehog-zaphod
+
{
+
home-manager.useGlobalPkgs = true;
+
home-manager.useUserPackages = true;
+
}
+
];
+
};
+
};
+
};
+
}
+58
hosts/marvin/bootloader.nix
···
+
{ pkgs, ... }:
+
let
+
fileSystems = {
+
btrfs = true;
+
ext4 = true;
+
vfat = true;
+
zfs = true;
+
};
+
in
+
{
+
boot = {
+
extraModulePackages = [ ];
+
kernelModules = [ "kvm-amd" ];
+
kernelPackages = pkgs.linuxPackages_6_1;
+
kernelParams = [ "nohibernate" ];
+
supportedFilesystems = fileSystems;
+
zfs.devNodes = "/dev/";
+
+
# Initrd config
+
initrd = {
+
availableKernelModules = [
+
"xhci_pci"
+
"ahci"
+
"nvme"
+
"usbhid"
+
"usb_storage"
+
"sd_mod"
+
];
+
supportedFilesystems = fileSystems;
+
kernelModules = [ ];
+
};
+
+
# Systemd-boot config
+
loader = {
+
systemd-boot.enable = true;
+
systemd-boot.configurationLimit = 5;
+
efi = {
+
canTouchEfiVariables = true;
+
efiSysMountPoint = "/boot/efi";
+
};
+
};
+
+
kernel.sysctl = {
+
"net.ipv4.ip_forward" = 1;
+
"net.ipv6.conf.all.forwarding" = 1;
+
};
+
+
# ZFS Config
+
# I use ZFS as my bulk data storage
+
# zfs = {
+
# enabled = true;
+
# };
+
};
+
# ZFS mount stuff
+
services.udev.extraRules = ''
+
ACTION=="add|change", KERNEL=="sd[a-z]*[0-9]*|mmcblk[0-9]*p[0-9]*|nvme[0-9]*n[0-9]*p[0-9]*", ENV{ID_FS_TYPE}=="zfs_member", ATTR{../queue/scheduler}="none"
+
'';
+
}
+82
hosts/marvin/default.nix
···
+
{ ... }:
+
{
+
imports = [
+
# Machine-specific configurations.
+
./bootloader.nix
+
./firewall.nix
+
./networking.nix
+
./hardware.nix
+
+
# Running Services
+
# keep-sorted start
+
./services/anubis.nix
+
./services/avahi.nix
+
./services/bots.nix
+
./services/deemix.nix
+
./services/gdq-cals.nix
+
./services/git.nix
+
./services/golink.nix
+
./services/grafana.nix
+
./services/immich.nix
+
./services/jellyfin.nix
+
./services/matrix.nix
+
./services/miniflux.nix
+
./services/nextcloud
+
./services/nginx.nix
+
./services/pinchflat.nix
+
./services/planka.nix
+
./services/pocket-id.nix
+
./services/podman.nix
+
./services/postgres.nix
+
./services/prometheus.nix
+
./services/scrutiny.nix
+
./services/syncthing.nix
+
./services/tailscale.nix
+
./services/tangled.nix
+
./services/vaultwarden.nix
+
./services/zfs.nix
+
# keep-sorted end
+
];
+
nix.settings.max-jobs = 12;
+
networking = {
+
networkmanager = {
+
enable = true;
+
};
+
wireless = {
+
enable = false;
+
};
+
};
+
fileSystems = {
+
"/" = {
+
fsType = "btrfs";
+
device = "/dev/disk/by-uuid/f15e4072-80dc-414e-a1fc-158ea441aebd";
+
# options = [ "subvol=@" ];
+
};
+
"/boot/efi" = {
+
fsType = "vfat";
+
device = "/dev/disk/by-uuid/EE05-66B4";
+
};
+
"/var" = {
+
fsType = "zfs";
+
device = "tank/var";
+
options = [ "zfsutil" ];
+
};
+
"/var/log/journal" = {
+
fsType = "zfs";
+
device = "tank/var/log/journal";
+
options = [ "zfsutil" ];
+
};
+
};
+
swapDevices = [ { device = "/dev/disk/by-uuid/e69409bc-9cf0-4795-8620-33a021a4b729"; } ];
+
users.groups.misc.gid = 1000;
+
time.timeZone = "America/New_York";
+
py = {
+
profiles.server.enable = true;
+
users.default.enable = true;
+
programs = {
+
fish.enable = true;
+
neovim.enable = true;
+
};
+
};
+
services.pulseaudio.enable = false;
+
}
+18
hosts/marvin/firewall.nix
···
+
{
+
networking.firewall = {
+
allowedTCPPorts = [
+
80
+
443
+
6912
+
34197
+
];
+
allowedUDPPorts = [
+
4367
+
34197
+
];
+
trustedInterfaces = [
+
"tailscale0"
+
"wg0"
+
];
+
};
+
}
+12
hosts/marvin/hardware.nix
···
+
{
+
hardware = {
+
enableAllFirmware = true;
+
enableRedistributableFirmware = true;
+
bluetooth.enable = false;
+
bumblebee.enable = false;
+
ckb-next.enable = false;
+
cpu.amd.updateMicrocode = true;
+
gpgSmartcards.enable = true;
+
graphics.enable = true;
+
};
+
}
+35
hosts/marvin/networking.nix
···
+
{ lib, pkgs, ... }:
+
{
+
networking = {
+
hostName = "marvin";
+
hostId = "5711215d";
+
enableIPv6 = true;
+
useDHCP = lib.mkDefault true;
+
interfaces = {
+
enp42s0.useDHCP = lib.mkDefault true;
+
wlp41s0.useDHCP = lib.mkDefault true;
+
};
+
networkmanager = {
+
enable = true;
+
};
+
wireless.enable = false;
+
+
# Enable NAT for containers
+
nat = {
+
enable = true;
+
internalInterfaces = [ "ve-+" ];
+
externalInterface = "wlp41s0";
+
# Lazy IPv6 connectivity for the container
+
enableIPv6 = true;
+
};
+
};
+
systemd.services.wpa_supplicant.environment.OPENSSL_CONF = pkgs.writeText "openssl.cnf" ''
+
openssl_conf = openssl_init
+
[openssl_init]
+
ssl_conf = ssl_sect
+
[ssl_sect]
+
system_default = system_default_sect
+
[system_default_sect]
+
Options = UnsafeLegacyRenegotiation
+
'';
+
}
+28
hosts/marvin/services/anubis.nix
···
+
{
+
config,
+
self',
+
...
+
}:
+
{
+
config = {
+
services.anubis.defaultOptions = {
+
enable = true;
+
extraFlags = [ "-metrics-bind \"\"" ];
+
settings = {
+
BIND_NETWORK = "tcp";
+
METRICS_BIND_NETWORK = "tcp";
+
SERVE_ROBOTS_TXT = true;
+
COOKIE_DOMAIN = ".pyrox.dev";
+
ED25519_PRIVATE_KEY_HEX_FILE = config.age.secrets.anubis-key.path;
+
OG_PASSTHROUGH = true;
+
OG_CACHE_CONSIDER_HOST = true;
+
POLICY_FNAME = "${self'.packages.anubis-files}/policies/default.yaml";
+
};
+
};
+
age.secrets.anubis-key = {
+
file = ./secrets/anubis-key.age;
+
owner = "anubis";
+
group = "anubis";
+
};
+
};
+
}
+10
hosts/marvin/services/avahi.nix
···
+
{
+
services.avahi = {
+
enable = true;
+
publish = {
+
enable = true;
+
addresses = true;
+
workstation = true;
+
};
+
};
+
}
+46
hosts/marvin/services/bots.nix
···
+
{ pkgs, ... }:
+
{
+
systemd.services = {
+
io-bot = {
+
enable = false;
+
wantedBy = [ "multi-user.target" ];
+
after = [
+
"network.target"
+
"io-bot-lavalink.service"
+
];
+
description = "I/O, my personal bot";
+
path = [ pkgs.python311 ];
+
serviceConfig = {
+
ExecStart = "${pkgs.bash}/bin/bash start.sh";
+
Restart = "always";
+
RestartSec = 3;
+
WorkingDirectory = "/home/thehedgehog/io-py";
+
};
+
};
+
io-bot-lavalink = {
+
enable = false;
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
description = "Lavalink server for I/O";
+
serviceConfig = {
+
ExecStart = "${pkgs.openjdk17_headless}/bin/java -jar ../Lavalink.jar";
+
Restart = "always";
+
RestartSec = 3;
+
WorkingDirectory = "/home/thehedgehog/io-py/config";
+
};
+
};
+
misc-bot = {
+
enable = false;
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
description = "Random Bot 1";
+
path = [ pkgs.python311 ];
+
serviceConfig = {
+
ExecStart = "${pkgs.bash}/bin/bash start.sh";
+
Restart = "always";
+
RestartSec = 3;
+
WorkingDirectory = "/home/thehedgehog/bots/bot1";
+
};
+
};
+
};
+
}
+53
hosts/marvin/services/buildbot.nix
···
+
{ config, self, ... }:
+
let
+
as = config.age.secrets;
+
d = self.lib.data.services.buildbot;
+
g = self.lib.data.services.git;
+
bbSecret = {
+
owner = "buildbot";
+
group = "buildbot";
+
};
+
in
+
{
+
services = {
+
buildbot-nix.master = {
+
enable = true;
+
dbUrl = "postgresql://buildbot@localhost/buildbot";
+
workersFile = as.buildbot-workers.path;
+
authBackend = "gitea";
+
gitea = {
+
enable = true;
+
tokenFile = as.buildbot-gitea-token.path;
+
oauthSecretFile = as.buildbot-oauth-secret.path;
+
instanceUrl = g.extUrl;
+
oauthId = "2bfd5c46-43a7-4d98-b443-9176dc0a9452";
+
topic = "buildbot-enable";
+
};
+
admins = [ "pyrox" ];
+
domain = d.extUrl;
+
useHttps = true;
+
};
+
postgresql = {
+
ensureUsers = [
+
{
+
name = "buildbot";
+
ensureDBOwnership = true;
+
ensureClauses.login = true;
+
}
+
];
+
ensureDatabases = [ "buildbot" ];
+
};
+
buildbot-master.port = 6915;
+
};
+
age.secrets = {
+
buildbot-gitea-token = bbSecret // {
+
file = ./secrets/buildbot-gitea-token.age;
+
};
+
buildbot-oauth-secret = bbSecret // {
+
file = ./secrets/buildbot-oauth-secret.age;
+
};
+
buildbot-workers = bbSecret // {
+
file = ./secrets/buildbot-workers.age;
+
};
+
};
+
}
+21
hosts/marvin/services/deemix.nix
···
+
{ self, ... }:
+
let
+
d = self.lib.data.services.deemix;
+
in
+
{
+
virtualisation.oci-containers.containers.deemix = {
+
image = "ghcr.io/bambanah/deemix:latest";
+
volumes = [
+
"/var/lib/deemix:/config"
+
"/var/lib/music:/downloads"
+
];
+
ports = [ "${toString d.port}:6595" ];
+
environment = {
+
PUID = "1000";
+
PGID = "1000";
+
UMASK_SET = "022";
+
DEEMIX_SINGLE_USER = "true";
+
DISABLE_OWNERSHIP_CHECK = "true";
+
};
+
};
+
}
+38
hosts/marvin/services/gdq-cals.nix
···
+
{
+
lib,
+
pkgs,
+
...
+
}:
+
let
+
pyWithLibs = pkgs.python312.withPackages (ps: [
+
ps.pytz
+
ps.icalendar
+
ps.requests
+
ps.google-auth-oauthlib
+
ps.google-api-python-client
+
]);
+
in
+
{
+
config.systemd = {
+
services.gdq-calendars = {
+
wantedBy = [ "multi-user.target" ];
+
description = "GDQ Calendar Updater";
+
path = [ pyWithLibs ];
+
serviceConfig = {
+
ExecStart = "${lib.getExe pyWithLibs} gdq_cal_ics_exporter.py --fatales --gcal --disable_general";
+
Type = "oneshot";
+
WorkingDirectory = "/home/thehedgehog/gdq-cals/";
+
User = "thehedgehog";
+
Group = "users";
+
RemainAfterExit = true;
+
};
+
};
+
timers.gdq-calendars = {
+
wantedBy = [ "timers.target" ];
+
timerConfig = {
+
OnCalendar = "*-*-* 00/2:00:00";
+
Unit = "gdq-calendars.service";
+
};
+
};
+
};
+
}
+166
hosts/marvin/services/git.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
self',
+
self,
+
...
+
}:
+
let
+
cfg = config.services.forgejo.settings;
+
age = config.age.secrets;
+
+
forgejoSecret = {
+
owner = "forgejo";
+
group = "forgejo";
+
};
+
+
d = self.lib.data.services.git;
+
in
+
{
+
catppuccin.forgejo.enable = true;
+
py.services.forgejo-runner = {
+
enable = true;
+
tokenFile = age.forgejo-default-runner-token.path;
+
};
+
services.forgejo = {
+
enable = true;
+
package = pkgs.forgejo;
+
lfs.enable = true;
+
database = {
+
type = "postgres";
+
createDatabase = true;
+
passwordFile = age.forgejo-db-pw.path;
+
};
+
secrets = {
+
mailer.PASSWD = age.forgejo-mail-pw.path;
+
security.SECRET_KEY = lib.mkForce age.forgejo-secret-key.path;
+
security.INTERNAL_TOKEN = lib.mkForce age.forgejo-internal-token.path;
+
oauth2.JWT_SECRET = lib.mkForce age.forgejo-oauth2-jwt-secret.path;
+
server.LFS_JWT_SECRET = lib.mkForce age.forgejo-lfs-jwt-secret.path;
+
};
+
settings = {
+
DEFAULT = {
+
APP_NAME = "dishNet Git";
+
RUN_MODE = "prod";
+
};
+
attachment = {
+
MAX_SIZE = 200;
+
};
+
log.LOGGER_ROUTER_MODE = "";
+
mailer = {
+
ENABLED = true;
+
FROM = "dishNet Git <git@pyrox.dev>";
+
PROTOCOL = "smtps";
+
SMTP_ADDR = "mail.pyrox.dev";
+
SMTP_PORT = 465;
+
USER = "git@pyrox.dev";
+
};
+
picture = {
+
ENABLE_FEDERATED_AVATAR = true;
+
};
+
ui = {
+
DEFAULT_SHOW_FULL_NAME = true;
+
USE_SERVICE_WORKER = true;
+
SHOW_USER_EMAIL = false;
+
};
+
"ui.meta" = {
+
AUTHOR = "dish";
+
DESCRIPTION = "dishNet Git Services";
+
};
+
metrics = {
+
ENABLED = true;
+
};
+
server = {
+
DISABLE_SSH = true;
+
DOMAIN = d.extUrl;
+
HTTP_PORT = d.port;
+
ROOT_URL = "https://${cfg.server.DOMAIN}";
+
LFS_START_SERVER = true;
+
};
+
#
+
indexer = {
+
# Enable issue indexing
+
ISSUE_INDEXER_TYPE = "bleve";
+
ISSUE_INDEXER_PATH = "indexers/issues.bleve";
+
# Enable repo indexing
+
REPO_INDEXER_ENABLED = true;
+
REPO_INDEXER_REPO_TYPES = "sources,forks";
+
REPO_INDEXER_TYPE = "bleve";
+
REPO_INDEXER_PATH = "indexers/repos.bleve";
+
};
+
session = {
+
PROVIDER = "db";
+
COOKIE_SECURE = true;
+
COOKIE_NAME = "pyrogit-session";
+
DOMAIN = d.extUrl;
+
# Sessions last for 1 week
+
GC_INTERVAL_TIME = 86400 * 7;
+
SESSION_LIFE_TIME = 86400 * 7;
+
};
+
service = {
+
DISABLE_REGISTRATION = true;
+
AUTO_WATCH_NEW_REPOS = false;
+
};
+
security = {
+
INSTALL_LOCK = true;
+
COOKIE_USERNAME = "pyrogit-user";
+
COOKIE_REMEMBER_NAME = "pyrogit-auth";
+
MIN_PASSWORD_LENGTH = 10;
+
PASSWORD_COMPLEXITY = "lower,upper,digit,spec";
+
PASSWORD_HASH_ALGO = "argon2";
+
PASSWORD_CHECK_PWN = true;
+
ONLY_ALLOW_PUSH_IF_GITEA_ENVIRONMENT_SET = true;
+
# Only allow reverse proxies from Tailscale tailnet
+
REVERSE_PROXY_TRUSTED_PROXIES = "10.64.0.0/10";
+
};
+
actions = {
+
ENABLED = true;
+
};
+
};
+
};
+
age.secrets = lib.mkIf config.services.forgejo.enable {
+
forgejo-db-pw = forgejoSecret // {
+
file = ./secrets/forgejo/db-pw.age;
+
};
+
forgejo-mail-pw = forgejoSecret // {
+
file = ./secrets/forgejo/mail-pw.age;
+
};
+
forgejo-aux-docs-runner-token = forgejoSecret // {
+
file = ./secrets/forgejo/aux-docs-runner-token.age;
+
};
+
forgejo-default-runner-token = forgejoSecret // {
+
file = ./secrets/forgejo/default-runner-token.age;
+
};
+
forgejo-gitgay-runner-token = forgejoSecret // {
+
file = ./secrets/forgejo/gitgay-runner-token.age;
+
};
+
forgejo-internal-token = forgejoSecret // {
+
file = ./secrets/forgejo/internal-token.age;
+
};
+
forgejo-oauth2-jwt-secret = forgejoSecret // {
+
file = ./secrets/forgejo/oauth2-jwt-secret.age;
+
};
+
forgejo-lfs-jwt-secret = forgejoSecret // {
+
file = ./secrets/forgejo/lfs-jwt-secret.age;
+
};
+
forgejo-secret-key = forgejoSecret // {
+
file = ./secrets/forgejo/secret-key.age;
+
};
+
};
+
services.anubis.instances.forgejo = lib.mkIf config.services.forgejo.enable {
+
settings = {
+
BIND = ":${toString d.anubis}";
+
POLICY_FNAME = "${self'.packages.anubis-files}/policies/forgejo.yaml";
+
TARGET = "http://localhost:${toString d.port}";
+
};
+
};
+
services.prometheus.scrapeConfigs = lib.mkIf config.services.forgejo.enable [
+
{
+
job_name = "forgejo";
+
static_configs = [
+
{ targets = [ "127.0.0.1:${toString config.services.forgejo.settings.server.HTTP_PORT}" ]; }
+
];
+
}
+
];
+
}
+5
hosts/marvin/services/golink.nix
···
+
{
+
services.golink = {
+
enable = true;
+
};
+
}
+69
hosts/marvin/services/grafana.nix
···
+
{
+
config,
+
self',
+
self,
+
...
+
}:
+
let
+
d = self.lib.data.services.grafana;
+
a = self.lib.data.services.authentik;
+
in
+
{
+
services.grafana = {
+
enable = true;
+
settings = {
+
analytics.reporting_enable = false;
+
"auth.generic_oauth" = {
+
name = "central";
+
icon = "signin";
+
enabled = "true";
+
client_id = "89f4607cf446a777a6b25ebde8731cdcb80b04c1";
+
client_secret = "89eccaa8a31104c218df5cfe37c87f0ea0bbddcd1571bddb7f7fbf5a09045efd59c61f1caaa79483ad59aac2c19488b254acdaced47e66a6505865a14a63ac4a";
+
auth_url = "https://${a.extUrl}/application/o/authorize/";
+
token_url = "https://${a.extUrl}/application/o/token/";
+
api_url = "https://${a.extUrl}/application/o/userinfo/";
+
scopes = "openid profile email";
+
};
+
"auth" = {
+
signout_redirect_url = "https://${a.extUrl}/if/session-end/stathog/";
+
disableLoginForm = true;
+
};
+
security = {
+
admin_user = "pyrox";
+
admin_password = "$__file{${config.age.secrets.grafana-admin.path}}";
+
};
+
server = {
+
root_url = "https://${d.extUrl}";
+
domain = d.extUrl;
+
http_port = d.port;
+
http_addr = "0.0.0.0";
+
};
+
smtp = {
+
enabled = true;
+
user = "grafana@pyrox.dev";
+
from_address = "grafana@pyrox.dev";
+
host = "mail.pyrox.dev:465";
+
password = "$__file{${config.age.secrets.grafana-smtp-password.path}}";
+
};
+
};
+
};
+
age.secrets = {
+
grafana-admin = {
+
file = ./secrets/grafana-admin-password.age;
+
owner = "grafana";
+
group = "grafana";
+
};
+
grafana-smtp-password = {
+
file = ./secrets/grafana-smtp-password.age;
+
owner = "grafana";
+
group = "grafana";
+
};
+
};
+
services.anubis.instances.grafana = {
+
settings = {
+
BIND = ":${toString d.anubis}";
+
POLICY_FNAME = "${self'.packages.anubis-files}/policies/default.yaml";
+
TARGET = "http://localhost:${toString d.port}";
+
};
+
};
+
}
+223
hosts/marvin/services/immich-config.json
···
+
{
+
"backup": {
+
"database": {
+
"cronExpression": "0 02 * * *",
+
"enabled": true,
+
"keepLastAmount": 14
+
}
+
},
+
"ffmpeg": {
+
"accel": "vaapi",
+
"accelDecode": true,
+
"acceptedAudioCodecs": ["aac", "mp3", "libopus"],
+
"acceptedContainers": ["mov", "ogg", "webm"],
+
"acceptedVideoCodecs": ["h264"],
+
"bframes": -1,
+
"cqMode": "auto",
+
"crf": 23,
+
"gopSize": 0,
+
"maxBitrate": "0",
+
"preferredHwDevice": "auto",
+
"preset": "veryfast",
+
"refs": 0,
+
"targetAudioCodec": "aac",
+
"targetResolution": "720",
+
"targetVideoCodec": "h264",
+
"temporalAQ": false,
+
"threads": 0,
+
"tonemap": "hable",
+
"transcode": "required",
+
"twoPass": false
+
},
+
"image": {
+
"colorspace": "p3",
+
"extractEmbedded": false,
+
"fullsize": {
+
"enabled": false,
+
"format": "jpeg",
+
"quality": 80
+
},
+
"preview": {
+
"format": "jpeg",
+
"quality": 80,
+
"size": 1440
+
},
+
"thumbnail": {
+
"format": "webp",
+
"quality": 80,
+
"size": 250
+
}
+
},
+
"job": {
+
"backgroundTask": {
+
"concurrency": 5
+
},
+
"faceDetection": {
+
"concurrency": 2
+
},
+
"library": {
+
"concurrency": 5
+
},
+
"metadataExtraction": {
+
"concurrency": 5
+
},
+
"migration": {
+
"concurrency": 5
+
},
+
"notifications": {
+
"concurrency": 5
+
},
+
"ocr": {
+
"concurrency": 1
+
},
+
"search": {
+
"concurrency": 5
+
},
+
"sidecar": {
+
"concurrency": 5
+
},
+
"smartSearch": {
+
"concurrency": 2
+
},
+
"thumbnailGeneration": {
+
"concurrency": 3
+
},
+
"videoConversion": {
+
"concurrency": 1
+
},
+
"workflow": {
+
"concurrency": 5
+
}
+
},
+
"library": {
+
"scan": {
+
"cronExpression": "0 0 * * *",
+
"enabled": true
+
},
+
"watch": {
+
"enabled": false
+
}
+
},
+
"logging": {
+
"enabled": true,
+
"level": "log"
+
},
+
"machineLearning": {
+
"availabilityChecks": {
+
"enabled": true,
+
"interval": 30000,
+
"timeout": 2000
+
},
+
"clip": {
+
"enabled": true,
+
"modelName": "ViT-B-16-SigLIP2__webli"
+
},
+
"duplicateDetection": {
+
"enabled": true,
+
"maxDistance": 0.01
+
},
+
"enabled": true,
+
"facialRecognition": {
+
"enabled": true,
+
"maxDistance": 0.5,
+
"minFaces": 7,
+
"minScore": 0.7,
+
"modelName": "buffalo_l"
+
},
+
"ocr": {
+
"enabled": true,
+
"maxResolution": 736,
+
"minDetectionScore": 0.5,
+
"minRecognitionScore": 0.8,
+
"modelName": "EN__PP-OCRv5_mobile"
+
},
+
"urls": ["http://localhost:3003"]
+
},
+
"map": {
+
"darkStyle": "https://tiles.immich.cloud/v1/style/dark.json",
+
"enabled": true,
+
"lightStyle": "https://tiles.immich.cloud/v1/style/light.json"
+
},
+
"metadata": {
+
"faces": {
+
"import": false
+
}
+
},
+
"newVersionCheck": {
+
"enabled": false
+
},
+
"nightlyTasks": {
+
"clusterNewFaces": true,
+
"databaseCleanup": true,
+
"generateMemories": true,
+
"missingThumbnails": true,
+
"startTime": "00:00",
+
"syncQuotaUsage": true
+
},
+
"notifications": {
+
"smtp": {
+
"enabled": true,
+
"from": "dishNet Photos <immich@pyrox.dev>",
+
"replyTo": "",
+
"transport": {
+
"host": "mail.pyrox.dev",
+
"ignoreCert": false,
+
"port": 25,
+
"secure": true,
+
"username": "immich@pyrox.dev"
+
}
+
}
+
},
+
"oauth": {
+
"autoLaunch": false,
+
"autoRegister": true,
+
"buttonText": "Login with Pocket-ID",
+
"clientId": "f1312240-d9fc-4336-aca6-b98316867848",
+
"defaultStorageQuota": null,
+
"enabled": true,
+
"issuerUrl": "https://auth.pyrox.dev",
+
"mobileOverrideEnabled": false,
+
"mobileRedirectUri": "",
+
"profileSigningAlgorithm": "none",
+
"roleClaim": "immich_role",
+
"scope": "openid email profile immich_role",
+
"signingAlgorithm": "RS256",
+
"storageLabelClaim": "preferred_username",
+
"storageQuotaClaim": "immich_quota",
+
"timeout": 30000,
+
"tokenEndpointAuthMethod": "client_secret_post"
+
},
+
"passwordLogin": {
+
"enabled": true
+
},
+
"reverseGeocoding": {
+
"enabled": true
+
},
+
"server": {
+
"externalDomain": "https://img.pyrox.dev",
+
"loginPageMessage": "",
+
"publicUsers": true
+
},
+
"storageTemplate": {
+
"enabled": false,
+
"hashVerificationEnabled": true,
+
"template": "{{y}}/{{y}}-{{MM}}-{{dd}}/{{filename}}"
+
},
+
"templates": {
+
"email": {
+
"albumInviteTemplate": "",
+
"albumUpdateTemplate": "",
+
"welcomeTemplate": ""
+
}
+
},
+
"theme": {
+
"customCss": ""
+
},
+
"trash": {
+
"days": 30,
+
"enabled": true
+
},
+
"user": {
+
"deleteDelay": 7
+
}
+
}
+51
hosts/marvin/services/immich.nix
···
+
{
+
self,
+
config,
+
lib,
+
...
+
}:
+
let
+
d = self.lib.data.services.immich;
+
in
+
{
+
services = {
+
immich = {
+
inherit (d) port;
+
enable = true;
+
host = "0.0.0.0";
+
redis.enable = true;
+
mediaLocation = "/var/media/photos/";
+
accelerationDevices = [ "/dev/dri/renderD128" ];
+
settings = lib.recursiveUpdate (builtins.fromJSON (builtins.readFile ./immich-config.json)) {
+
oauth.clientSecret._secret = config.age.secrets.immich-oauth-secret.path;
+
notifications.smtp.transport.password._secret = config.age.secrets.immich-mail-pw.path;
+
server.externalDomain = "https://${d.extUrl}";
+
};
+
};
+
immich-public-proxy = {
+
enable = true;
+
port = d.pubProxy;
+
immichUrl = "http://localhost:${toString d.port}";
+
settings.ipp = {
+
downloadedFilename = 1;
+
};
+
};
+
};
+
systemd.services.immich-public-proxy.environment.PUBLIC_BASE_URL = "https://${d.extUrl}";
+
users.users.immich.extraGroups = [
+
"video"
+
"render"
+
];
+
age.secrets = {
+
immich-oauth-secret = {
+
file = ./secrets/immich/oauth-secret.age;
+
owner = "immich";
+
group = "immich";
+
};
+
immich-mail-pw = {
+
file = ./secrets/immich/mail-pw.age;
+
owner = "immich";
+
group = "immich";
+
};
+
};
+
}
+71
hosts/marvin/services/jellyfin.nix
···
+
{
+
lib,
+
config,
+
self',
+
...
+
}:
+
let
+
cfg = config.services.jellyfin;
+
in
+
{
+
services.jellyfin = {
+
enable = true;
+
};
+
users.users.jellyfin.extraGroups = [
+
"input"
+
"render"
+
"video"
+
];
+
networking.firewall.allowedUDPPorts = [
+
1900
+
7359
+
];
+
services.prometheus.scrapeConfigs = lib.mkIf cfg.enable [
+
{
+
job_name = "jellyfin_server";
+
static_configs = [ { targets = [ "127.0.0.1:8096" ]; } ];
+
}
+
{
+
job_name = "jellyfin";
+
static_configs = [ { targets = [ "127.0.0.1:30103" ]; } ];
+
}
+
];
+
systemd.services.jellyfin-exporter = lib.mkIf cfg.enable {
+
enable = true;
+
wantedBy = [ "multi-user.target" ];
+
after = [
+
"network.target"
+
"jellyfin.service"
+
];
+
description = "Jellyfin Metrics Exporter for Prometheus";
+
serviceConfig = {
+
ExecStart = "${lib.getExe self'.packages.jellyfin-exporter} @${config.age.secrets.jellyfin-exporter-config.path}";
+
ReadOnlyPaths = [ config.age.secrets.jellyfin-exporter-config.path ];
+
Restart = "always";
+
DynamicUser = true;
+
User = "jellyfin-exporter";
+
Group = "jellyfin-exporter";
+
StateDirectory = "jellyfin-exporter";
+
CacheDirectory = "stalwart-mail";
+
+
# Hardening
+
MemoryDenyWriteExecute = true;
+
PrivateDevices = true;
+
PrivateTmp = true;
+
ProtectClock = true;
+
ProtectControlGroups = true;
+
ProtectHome = true;
+
ProtectHostname = true;
+
ProtectKernelLogs = true;
+
ProtectKernelModules = true;
+
ProtectKernelTunables = true;
+
RestrictNamespaces = true;
+
RestrictRealtime = true;
+
RestrictSUIDSGID = true;
+
};
+
};
+
age.secrets.jellyfin-exporter-config = lib.mkIf cfg.enable {
+
file = ./secrets/jellyfin-exporter-config.age;
+
mode = "444";
+
};
+
}
+53
hosts/marvin/services/matrix.nix
···
+
{
+
self,
+
...
+
}:
+
let
+
d = self.lib.data.services.matrix-server;
+
in
+
{
+
services.matrix-conduit = {
+
enable = true;
+
+
settings.global = {
+
inherit (d) port;
+
server_name = "pyrox.dev";
+
max_request_size = 1024 * 1024 * 50;
+
allow_registration = false;
+
allow_federation = true;
+
allow_check_for_updates = false;
+
trusted_servers = [
+
"matrix.org"
+
"vector.im"
+
"catgirl.cloud"
+
"nixos.org"
+
];
+
address = "0.0.0.0";
+
well_known = {
+
client = "https://${d.extUrl}";
+
server = "${d.extUrl}:443";
+
};
+
media = {
+
backend = "filesystem";
+
directory_structure = {
+
depth = 2;
+
length = 3;
+
};
+
retention = [
+
{
+
space = "100G";
+
}
+
{
+
scope = "remote";
+
accessed = "30d";
+
created = "90d";
+
}
+
{
+
scope = "thumbnail";
+
space = "1G";
+
}
+
];
+
};
+
};
+
};
+
}
+38
hosts/marvin/services/miniflux.nix
···
+
{
+
config,
+
self,
+
...
+
}:
+
let
+
d = self.lib.data.services.miniflux;
+
in
+
{
+
services.miniflux = {
+
enable = true;
+
config = {
+
PORT = d.port;
+
FETCH_YOUTUBE_WATCH_TIME = 1;
+
BASE_URL = "https://${d.extUrl}";
+
CREATE_ADMIN = 1;
+
WEBAUTHN = 1;
+
WORKER_POOL_SIZE = 5;
+
};
+
adminCredentialsFile = config.age.secrets.miniflux-admin.path;
+
};
+
users.users.miniflux.isSystemUser = true;
+
users.users.miniflux.group = "miniflux";
+
users.groups.miniflux = { };
+
age.secrets = {
+
miniflux-admin = {
+
file = ./secrets/miniflux-admin.age;
+
owner = "miniflux";
+
group = "miniflux";
+
};
+
};
+
services.anubis.instances.miniflux = {
+
settings = {
+
BIND = ":${toString d.anubis}";
+
TARGET = "http://localhost:${toString d.port}";
+
};
+
};
+
}
+112
hosts/marvin/services/nextcloud/default.nix
···
+
{
+
config,
+
pkgs,
+
lib,
+
self',
+
self,
+
...
+
}:
+
let
+
d = self.lib.data.services.nextcloud;
+
i = self.lib.data.services.nextcloud-imaginary;
+
in
+
{
+
imports = [
+
./office.nix
+
./imaginary.nix
+
];
+
services.nextcloud = {
+
enable = true;
+
package = pkgs.nextcloud32;
+
phpPackage = lib.mkForce pkgs.php82;
+
appstoreEnable = true;
+
caching.redis = true;
+
# Enable Webfinger
+
webfinger = true;
+
# Any additional PHP Extensions we need
+
phpExtraExtensions = all: [
+
all.pdlib
+
all.bz2
+
];
+
config = {
+
adminpassFile = config.age.secrets.nextcloud-admin-pw.path;
+
adminuser = "pyrox";
+
dbtype = "pgsql";
+
};
+
settings = {
+
default_phone_region = "US";
+
overwriteprotocol = "https";
+
trusted_proxies = [ "100.64.0.0/10" ];
+
# Preview Settings
+
"preview_imaginary_url" = "http://localhost:${builtins.toString i.port}";
+
"preview_format" = "webp";
+
"preview_ffmpeg_path" = "${pkgs.ffmpeg-headless}/bin/ffmpeg";
+
"enabledPreviewProviders" = [
+
"OC\\Preview\\Font"
+
"OC\\Preview\\Krita"
+
"OC\\Preview\\MP3"
+
"OC\\Preview\\MarkDown"
+
"OC\\Preview\\MSOfficeDoc"
+
"OC\\Preview\\OpenDocument"
+
"OC\\Preview\\TXT"
+
"OC\\Preview\\Imaginary"
+
];
+
# Memories Configuration
+
"memories.exiftool" = "${pkgs.exiftool}/bin/exiftool";
+
"memories.exiftool_no_local" = true;
+
# # Index Everything
+
"memories.index.mode" = "1";
+
# # GIS Data in Postgres
+
"memories.gis_type" = 2;
+
# # Transcoding
+
"memories.vod.disable" = false;
+
"memories.vod.vaapi" = true;
+
"memories.vod.nvenc" = false;
+
"memories.vod.use_gop_size" = false; # NVENV-only
+
"memories.vod.ffmpeg" = "${pkgs.ffmpeg-headless}/bin/ffmpeg";
+
"memories.vod.ffprobe" = "${pkgs.ffmpeg-headless}/bin/ffprobe";
+
"memories.vod.path" = "/var/lib/nextcloud/store-apps/memories/bin-ext/go-vod-amd64";
+
"memories.vod.external" = false;
+
+
# Recognize Options
+
"node_binary" = "${pkgs.nodejs_20}/bin/node";
+
"tensorflow.cores" = 6;
+
"tensorflow.gpu" = false;
+
"musicnn.enabled" = false;
+
"movinet.enabled" = false;
+
"faces.enable" = true;
+
"imagenet.enabled" = true;
+
"landmarks.enabled" = true;
+
};
+
phpOptions = {
+
"opcache.interned_strings_buffer" = "32";
+
"opcache.jit" = "1255";
+
"opcache.jit_buffer_size" = "256M";
+
"opcache.save_comments" = "1";
+
"opcache.validate_timestamps" = "0";
+
};
+
poolSettings = {
+
"pm" = "dynamic";
+
"pm.max_children" = 43;
+
"pm.start_servers" = 10;
+
"pm.min_spare_servers" = 10;
+
"pm.max_spare_servers" = 32;
+
"pm.max_requests" = 500;
+
};
+
configureRedis = true;
+
database.createLocally = true;
+
hostName = d.extUrl;
+
};
+
age.secrets.nextcloud-admin-pw = {
+
file = ./nextcloud-admin-pw.age;
+
owner = "nextcloud";
+
group = "nextcloud";
+
};
+
services.anubis.instances.nextcloud = {
+
settings = {
+
BIND = ":${toString d.anubis}";
+
POLICY_FNAME = "${self'.packages.anubis-files}/policies/nextcloud.yaml";
+
TARGET = "http://localhost:${toString d.port}";
+
};
+
};
+
}
+13
hosts/marvin/services/nextcloud/imaginary.nix
···
+
{ self, ... }:
+
let
+
d = self.lib.data.services.nextcloud-imaginary;
+
in
+
{
+
services.imaginary = {
+
inherit (d) port;
+
enable = true;
+
address = "localhost";
+
settings.return-size = true;
+
settings.disable-endpoints = "form";
+
};
+
}
+21
hosts/marvin/services/nextcloud/nextcloud-admin-pw.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA f3m5ux9oJxmPDheJ82b171yuc+2/YfPklKOi9+TRqAk
+
QlVi9vN0mFBwa4lGeWgHhy7xeGmzv87lHy1teE4Ju38
+
-> ssh-rsa fFaiTA
+
OE+aFl2tmjMJOOtfhoVGOnWmF64OqGQ21FuhcCaDz+K05lmO4F+6q0dblr/8gOD/
+
aUX7qKNS6/ylBn1sjdWs6LKEFSfQQmPD26MDAFciDRMR5GCylKQzVN+ZVFjS36tr
+
tWl1wiuGlK25szMdPMTfH2mUd2RpyceGirTFXbDppBQvlboivVV51FVgHQJUmell
+
ak4dXDNvlSX/Q2VfIrfr6LurJrPPpJ8phgD/yqvwoEr1DhbrtdBJWHLnP7GlAi9D
+
WexmhyWALCbfJjpPTKBumGmFFzCf5FvEhw4WW3wSkK+RwoyPDq+f5JyM0mEUNgjM
+
tI5cbyaZ+FuoZgwouSLPU1zSaE5DCucRrWoMLw/F/1rXZl6aXmiX+sJYhwTOnfvS
+
UxEs+7i+E/+yPP0otfoEeU7fSUQgkVcfDwwCF95vvSoX2ZeocU3IaosovmQNHiQk
+
VNR2z8WZx7y5bBxxxMuA9sKwhDbqpS+O7Yr34PSO2aZMvctfJZMFHOGO3LWtCMOo
+
/EtZSwtTL1P3z7ZVr9SpBOT1Cp5f6JhM8fRwcv/+cssWrv031LDpX7R2lUXd0E9/
+
b8ZI6NotJfXicqf1qS91GYttz9FpXKSTx+wc28eEQNoHdE9vJydYd8p/FfsPNnbo
+
E7kEz0KgTTIC0lfRN5/CKHJ3urAN47UCzBkht/gArHM
+
-> ssh-ed25519 wpmdHA miwIKKntwHzAVfbSs0wQyxEuiPGS4OPisTtLkasNaHE
+
psG8Q1MCrd2cuHNFhBoJlHTUA8Rk2alsRahoaTaZ96I
+
-> f-grease Q=!6H\ CBdSy[)u
+
sOGvXIX7dyTl5tFUlDOfuXyR5KrAFTehzsMhjUiqFD/N
+
--- 6GHjrSO/f/nkqePu2iFESH76n7G1KPN6F+xp6ChHPec
+
��!��c�8i^����lκ�l>�E|o�q��T�[9��V�I�J^}�� � O{:5�> ��Sb����J�p�
+29
hosts/marvin/services/nextcloud/office.nix
···
+
{ self', self, ... }:
+
let
+
d = self.lib.data.services.nextcloud-office;
+
in
+
{
+
services.collabora-online = {
+
enable = true;
+
inherit (d) port;
+
settings = {
+
ssl.enable = false;
+
ssl.termination = true;
+
};
+
aliasGroups = [
+
{
+
host = "https://office.pyrox.dev:443";
+
}
+
{
+
host = "https://cloud.pyrox.dev:443";
+
}
+
];
+
};
+
services.anubis.instances.nextcloud-office = {
+
settings = {
+
BIND = ":${toString d.anubis}";
+
POLICY_FNAME = "${self'.packages.anubis-files}/policies/nextcloud-office.yaml";
+
TARGET = "http://localhost:${toString d.port}";
+
};
+
};
+
}
+18
hosts/marvin/services/nginx.nix
···
+
{ self, ... }:
+
let
+
n = self.lib.data.services.nextcloud;
+
in
+
{
+
services.nginx = {
+
virtualHosts = {
+
"${n.extUrl}" = {
+
listen = [
+
{
+
inherit (n) port;
+
addr = "0.0.0.0";
+
}
+
];
+
};
+
};
+
};
+
}
+48
hosts/marvin/services/pinchflat.nix
···
+
{
+
config,
+
lib,
+
self,
+
...
+
}:
+
let
+
cfg = config.services.pinchflat;
+
age = config.age.secrets;
+
d = self.lib.data.services.pinchflat;
+
in
+
{
+
services.pinchflat = {
+
enable = true;
+
inherit (d) port;
+
secretsFile = age.pinchflat-secrets.path;
+
mediaDir = "/var/media/youtube";
+
extraConfig = {
+
YT_DLP_WORKER_CONCURRENCY = 2;
+
};
+
};
+
systemd.services.pinchflat = lib.mkIf cfg.enable {
+
serviceConfig = {
+
DynamicUser = lib.mkForce false;
+
User = lib.mkForce "pinchflat";
+
Group = lib.mkForce "pinchflat";
+
};
+
};
+
users.users.pinchflat = lib.mkIf cfg.enable {
+
isSystemUser = true;
+
group = "pinchflat";
+
};
+
users.groups.pinchflat = lib.mkIf cfg.enable { };
+
age.secrets = lib.mkIf cfg.enable {
+
pinchflat-secrets = {
+
owner = "pinchflat";
+
group = "pinchflat";
+
file = ./secrets/pinchflat-secrets.age;
+
};
+
};
+
# BGUtil Docker Container for yt-dlp
+
virtualisation.oci-containers.containers.ytdlp-bgutil-provider = lib.mkIf cfg.enable {
+
image = "brainicism/bgutil-ytdlp-pot-provider";
+
ports = [
+
"4416:4416"
+
];
+
};
+
}
+122
hosts/marvin/services/planka.nix
···
+
{
+
lib,
+
config,
+
self,
+
self',
+
pkgs,
+
...
+
}:
+
let
+
d = self.lib.data.services.planka;
+
+
commonServiceConfig = {
+
EnvironmentFile = config.age.secrets.planka-env.path;
+
StateDirectory = "planka";
+
WorkingDirectory = "/var/lib/planka";
+
User = "planka";
+
Group = "planka";
+
+
# Hardening
+
LockPersonality = true;
+
NoNewPrivileges = true;
+
PrivateDevices = true;
+
PrivateMounts = true;
+
PrivateTmp = true;
+
PrivateUsers = true;
+
ProtectClock = true;
+
ProtectControlGroups = true;
+
ProtectHome = true;
+
ProtectHostname = true;
+
ProtectKernelLogs = true;
+
ProtectKernelModules = true;
+
ProtectKernelTunables = true;
+
ProtectProc = "invisible";
+
RemoveIPC = true;
+
RestrictRealtime = true;
+
RestrictSUIDSGID = true;
+
UMask = "0660";
+
RestrictAddressFamilies = [
+
"AF_UNIX"
+
"AF_INET"
+
"AF_INET6"
+
];
+
};
+
in
+
{
+
systemd = {
+
tmpfiles.settings = {
+
"10-planka"."/var/lib/planka".d = {
+
group = "planka";
+
user = "planka";
+
mode = "0755";
+
};
+
};
+
services = {
+
planka-init-db = {
+
wantedBy = [ "multi-user.target" ];
+
after = [ "postgres.target" ];
+
description = "Planka Kanban Database Init Script";
+
path = [
+
pkgs.nodejs
+
];
+
script = ''
+
if [ ! -f /var/lib/planka/db-init-ran ]; then
+
node run ${self'.packages.planka}/lib/node_modules/planka/db/init.js && \
+
touch /var/lib/planka/db-init-ran
+
fi
+
'';
+
serviceConfig = commonServiceConfig // {
+
Type = "oneshot";
+
SyslogIdentifier = "planka-init-db";
+
};
+
};
+
planka-server = {
+
after = [ "planka-init-db.service" ];
+
wantedBy = [ "multi-user.target" ];
+
description = "Planka Kanban Server";
+
documentation = [ "https://docs.planka.cloud" ];
+
environment = {
+
DATABASE_URL = "postgresql://%2Frun%2Fpostgresql/planka";
+
DEFAULT_ADMIN_EMAIL = "pyrox@pyrox.dev";
+
DEFAULT_ADMIN_USERNAME = "pyrox";
+
TRUST_PROXY = "true";
+
DEFAULT_LANGUAGE = "en-US";
+
BASE_URL = "https://${d.extUrl}";
+
NODE_ENV = "production";
+
};
+
serviceConfig = commonServiceConfig // {
+
Type = "simple";
+
ExecStart = "${lib.getExe self'.packages.planka} --port ${toString d.port}";
+
SyslogIdentifier = "planka";
+
};
+
};
+
};
+
};
+
users.users.planka = {
+
isSystemUser = true;
+
group = "planka";
+
};
+
users.groups.planka = { };
+
services.postgresql = {
+
ensureUsers = [
+
{
+
name = "planka";
+
ensureDBOwnership = true;
+
ensureClauses.login = true;
+
}
+
];
+
ensureDatabases = [ "planka" ];
+
};
+
age.secrets.planka-env = {
+
file = ./secrets/planka-env.age;
+
owner = "planka";
+
group = "planka";
+
};
+
services.anubis.instances.planka = {
+
settings = {
+
COOKIE_DOMAIN = ".cs2a.club";
+
BIND = ":${toString d.anubis}";
+
TARGET = "http://localhost:${toString d.port}";
+
};
+
};
+
}
+49
hosts/marvin/services/pocket-id.nix
···
+
{
+
config,
+
self,
+
...
+
}:
+
let
+
d = self.lib.data.services.pocket-id;
+
in
+
{
+
services.pocket-id = {
+
enable = true;
+
environmentFile = config.age.secrets.pocket-id-secrets.path;
+
settings = {
+
APP_URL = "https://${d.extUrl}";
+
TRUST_PROXY = true;
+
UPDATE_CHECK_DISABLED = true;
+
PORT = d.port;
+
+
# Frontend Config
+
UI_CONFIG_DISABLED = true;
+
APP_NAME = "dishNet Auth";
+
SESSION_DURATION = 120;
+
EMAILS_VERIFIED = true;
+
ALLOW_OWN_ACCOUNT_EDIT = true;
+
DISABLE_ANIMATIONS = true;
+
SMTP_HOST = "mail.pyrox.dev";
+
SMTP_PORT = 465;
+
SMTP_FROM = "auth@pyrox.dev";
+
SMTP_USER = "auth@pyrox.dev";
+
SMTP_TLS = "tls";
+
SMTP_SKIP_CERT_VERIFY = false;
+
LDAP_ENABLED = false;
+
};
+
};
+
+
age.secrets.pocket-id-secrets = {
+
file = ./secrets/pocket-id-secrets.age;
+
owner = "pocket-id";
+
group = "pocket-id";
+
};
+
services.anubis.instances = {
+
pocket-id = {
+
settings = {
+
BIND = ":${toString d.anubis}";
+
TARGET = "http://localhost:${toString d.port}";
+
};
+
};
+
};
+
}
+16
hosts/marvin/services/podman.nix
···
+
{
+
virtualisation = {
+
oci-containers.backend = "docker";
+
docker = {
+
enable = true;
+
storageDriver = "zfs";
+
autoPrune.enable = true;
+
liveRestore = true;
+
daemon.settings = {
+
experimental = true;
+
ip6tables = true;
+
fixed-cidr-v6 = "2001:db8:1::/64";
+
};
+
};
+
};
+
}
+50
hosts/marvin/services/postgres.nix
···
+
{ pkgs, ... }:
+
# let
+
# cfg = config.services.postgresql;
+
# in
+
{
+
services.postgresql = {
+
enable = true;
+
package = pkgs.postgresql_16;
+
enableJIT = true;
+
# Settings taken from [PGTune](https://pgtune.leopard.in.ua/)
+
settings = {
+
max_connections = "300";
+
shared_buffers = "2GB";
+
effective_cache_size = "6GB";
+
maintenance_work_mem = "512MB";
+
checkpoint_completion_target = 0.9;
+
wal_buffers = "16MB";
+
default_statistics_target = 100;
+
random_page_cost = 4;
+
effective_io_concurrency = 2;
+
work_mem = "2621kB";
+
huge_pages = "off";
+
min_wal_size = "1GB";
+
max_wal_size = "4GB";
+
max_worker_processes = 8;
+
max_parallel_workers_per_gather = 4;
+
max_parallel_workers = 8;
+
max_parallel_maintenance_workers = 4;
+
};
+
};
+
# systemd.timers.pg-autovacuum = {
+
# description = "Timer for Postgres Autovacuum";
+
# timerConfig = {
+
# OnCalendar = "*-*-* 01:00:00";
+
# Unit = "pg-autovacuum.service";
+
# };
+
# };
+
# systemd.services.pg-autovacuum = {
+
# description = "Vacuum all Postgres databases.";
+
# requisite = [ "postgresql.service" ];
+
# wantedBy = [ "multi-user.target" ];
+
# serviceConfig = {
+
# Type = "oneshot";
+
# User = "postgres";
+
# Group = "postgres";
+
# SyslogIdentifier = "pg-autovacuum";
+
# ExecStart = "${cfg.package}/bin/vacuumdb --all --echo --jobs=6 --parallel=5 --analyze --verbose";
+
# };
+
# };
+
}
+26
hosts/marvin/services/prometheus.nix
···
+
{ config, ... }:
+
{
+
services.prometheus = {
+
enable = true;
+
port = 6999;
+
exporters = {
+
node = {
+
enable = true;
+
enabledCollectors = [ "systemd" ];
+
port = 6998;
+
};
+
};
+
scrapeConfigs = [
+
{
+
job_name = "marvin";
+
static_configs = [
+
{ targets = [ "127.0.0.1:${toString config.services.prometheus.exporters.node.port}" ]; }
+
];
+
}
+
{
+
job_name = "prometheus";
+
static_configs = [ { targets = [ "127.0.0.1:6999" ]; } ];
+
}
+
];
+
};
+
}
+32
hosts/marvin/services/scrutiny.nix
···
+
{ self, ... }:
+
let
+
d = self.lib.data.services.scrutiny;
+
in
+
{
+
services.scrutiny = {
+
enable = true;
+
influxdb.enable = true;
+
settings = {
+
web = {
+
listen = {
+
inherit (d) port;
+
};
+
influxdb.tls.insecure_skip_verify = true;
+
};
+
};
+
collector = {
+
enable = true;
+
settings = {
+
api.endpoint = "http://localhost:${toString d.port}";
+
devices = [
+
{
+
device = "/dev/sdb";
+
commands = {
+
metrics_smart_args = "-xv 188,raw16 --xall --json -T permissive";
+
};
+
}
+
];
+
};
+
};
+
};
+
}
+20
hosts/marvin/services/secrets/anubis-key.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA 0nhVhc10cQVe6R565JAHib/nXjCJz30CkP8stgrr2H8
+
UZvBZgQSA0RJoXhgub7bvONXH7Tr4fyLngYaeV0RaiI
+
-> ssh-rsa fFaiTA
+
KTErOmc2adbOX4BDCpbGCSxi2P507OhPJygCguq32e8MpEQtUQM39ryS24z2iPko
+
JefAkJDFz7MnF3FrlsQhs0Tn68XFKWNU6/qcduWsrn0mFkF+UTWylg4LifOmfaxh
+
iGUkUzSsneZHpnJRYX7nI2e2dV6FD++Dm2fOjyBQpOZemas3qb8jM4t8SbtUCkOB
+
tarqwI3R60xdwlv4UnoIQgnALdKkQ/2p/tBSQV2i47iCMo2ksHC57Q8FqfsMBRbF
+
1QPfvaSKS+85mkkew9qhGCTiI9CTPMJ1LytFPrN7hYvwWJEdqBXQplaGnK/Z3v6A
+
riKcb2z7uB5fL37DmEtESejxMVdo8AeJRhBKWNf065wve5UjvVE3NNver/F+aiOW
+
nhPZPD5uwv8G4Bu5jStBSeceqkwdxqagnqWE4HqNB/MUshOehEbjdSHVxcNslsu+
+
ay4lCudcIbWUgfD3fTQO8sVBral6Z42DgZ1DDgzDGzw4CAw2s7iu1gVL19yr+KkZ
+
L1sLVdTKAKEvTMsmDLtC8hEnU5LzOhw/+6zu+jCEpiAM1tdLiZXAbXtX70qfFoG0
+
vdrmNxkKMqeBQ6mOIx2HtIGfZaEZac9psbT71aU8g0oHa0GVIoj/6s13kOxDe4V7
+
SyKVhTN/uRSzePWyjNtikK4A8I2+A1wh705hBo11cq0
+
-> ssh-ed25519 wpmdHA Zr0B8acivkr2BMIZhSUWzkXKlGi1JFQESG6/WQ279is
+
wyCREE9Va/xD+Fyjn+iYDvXNNHs3Jasz7CZ7jVuRmC0
+
--- riW/wZBclVd4FZPODjzrhFo3UoMSsvMp257fOv86tRg
+
]�
+
0���c��Q,��*$���L�Z��1"L&�d}%a ��c3�B�.�'���tKƖď-]*t����L��B%�8S���F���N����/�.a��
+23
hosts/marvin/services/secrets/authentik-env.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA Mq6LpVWnock3MlBHyxTdIz0MRgayV1DmPc7G0YUYmno
+
Hjhpy+AkQ12MPP5/nFdfCbUYjlB7urYgodmNH3MYQys
+
-> ssh-rsa fFaiTA
+
nUWzhFls8eejZQcIvXT1OQcoLCUPs/xkrGmJZ9nYsimIg9O1SvSvsksTzpF+kPxb
+
FSm0mpN5LSI5qIWkTVCARSygCXh5oW7O5BteIEslfZQ2mBWWfUIUfXjxgyMR5YNI
+
WuMQ5NLag3uulDKFm7nX/MW9MdF5TQqsp2waDxZR8twErIHXxyYV7L50OpgHXshN
+
YF+MQ44G8CpKfnMlJT2LqYdcwtCD5CbPyyJVGzPtKXXMCO90ep7kgsdAtwRzRQ/A
+
pOm1kN0E4OtOCCTuUEu9KcTjREFEzVdNDo+sK1aTxZVgDMT5Q+1MW8LMAjxJkJaH
+
EhgiwzOB1wuKNJmT3oTHxCZeXebEZVIgzrM0d8G/ZpRezMhPQuVhPNwTuSTS6Nmu
+
UoLpGd836qa4wRiCnyw2wv5NWC9dk9egXGmpJP0WuYkm977nV8rNPD6Y0yo1zdXN
+
bR11U5nGhNmKaZR7JuF4uXnscDwuLjezTqbnfWLnWWfsPchUdwxSLkBWfxOt9Bwb
+
UXXRCXmP1G7G76L8Lq4px5w9cuOf1m40aIRFDAQvsU8lcjNh+x6Hlrs6e6JLpTIU
+
hSm9RNis+NfC4eUTbBzvHQJl5pOcc4qGDhRfZHHHgFviGtDRNnCX8Qti0s55z5xj
+
92YLwusKCLsY/qfUMGxR6xJOH+qF1slnKJUze6Fm+3A
+
-> ssh-ed25519 wpmdHA y8GnMn9T4Pd/luf2iFGLgwiH2+28omDf+koJjTnjHjY
+
bhwyh4cWPs0/WaDEAV6tQ9VT8Rwg+54O48IXDlp3WnM
+
-> zEWmG,-grease
+
RnR4Sk7VgVxA
+
--- rw5rtJ/Nk3pe6NIho1qUG8THDMN/gyC82qDL9WF+1ec
+
�as����Dp��c�´���i�x�AQ>�w��o�bI 0�X����Za�AH#���0�|����HR5�������S��G���9Y��{��ּ_"������r4?x՚5�tG�F|�&�gXC�\9�P
+
y�K�`����LeS` !��21�����U1��S�?�X1[�7Qӫ��D�!�>���XǍ�)mH��#[�C�r�4����9σb
+
lf �K_PB���$�X�n��(V�Q����u�?ix�z��I��Zܘ
+20
hosts/marvin/services/secrets/buildbot/gitea-token.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA sXjW2SR1XZX72GNOub2LDOyPErSL1frz/6h1/PCpYQc
+
C1S5xYK8e0wjxXUo3Fv1Bly/KexFni/vUVQXvTOaYjM
+
-> ssh-rsa fFaiTA
+
hp5tbxse6zTj3F9+cURU7l1wgQ7xPqetn//fPbeAWgOaE6mV5AgKmul7rHEL9IIH
+
aFTvalTWR/KnFznYtlW/k8NJ8kxsO8xF+E5TzFnJHoJ1kcnxzx470m/erc928n48
+
XcqN+XT2OS7xxH8i4v+pTqsCniK5oKpUbXujFBDdLQzHr6PfudD7KflSDklIdYEB
+
Hcd1wPtnOwD7lPPrH4MIVNcAsZdc1gdieWI6WAyYhwyCGkHx+AAtbGBGIRxpM6eA
+
/iau2CyIL3NoQO5ahuocI3j6JZg/rjf8CrB6BOcjST63xxJOtb/Z1vCDMN8IL7h5
+
BC/W0jeLSWG6j/HtGXQHcBuuCe9X6ghNxHjJnXTlW5gyy/5fkfg1VwH1GH7LSgr3
+
tULl2deCUc13COd+c74wPl1tndaCFou3syWQI1+g6cxafdjNeC4toQVVTjiWKArW
+
9FxAfmOHRqkren+G68rV3r9HUwiik5yfFj3i0ReiSJOs+PnFdwiia+qEyEU6c+RA
+
ZKm02DA0xdIKvWRhBcV3LfXa59gM/fqHY7fPOr764UE8G3OxhU41YokRxSF2Amjr
+
SrrTdd9ifydgm/6QOezR/rGdIPednZGw7AifVDtzStqfeK2N/1UptXmRTqJxNKDl
+
HqChILGJP+4oQ9C40DBJKqoDoQ4cgdABf+cVvum4Vuo
+
-> ssh-ed25519 wpmdHA ihAY2EmeXBKtEYivtyxIM4f9DT8l4r+fB1aZq+/bBjI
+
cTxIJd2UpHpk6+kRC6kYnkWpk5vNOKN3KaTObI2yK60
+
--- wb5Zy32SMDk6XSAwzGDLz1fHZkTmFQRJu3UdOSO6ALs
+
�6�3
+
��x�p�(SFx��9%�l�`��mNy�i'��?i�������@Nw��ϖ�Xh\ơ� �A�X�{�
hosts/marvin/services/secrets/buildbot/oauth-secret.age

This is a binary file and will not be displayed.

+19
hosts/marvin/services/secrets/buildbot/worker-password.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA gwCfKQU/RuO5wvWJt+BNo9vMIH4cQNKC4YBo4zgeM00
+
568cl7NUSUNWPCF3SL8SSqsyV3qqKmM4CoqmQ+yynUs
+
-> ssh-rsa fFaiTA
+
xa/L5kqpE+MAOnbQFeOi4u53k9RdTz7di+bFiDwkUMoxPwKKWmT6DejEq2JmqcL6
+
adkNyc7sS9mfyoCC55WttpC1VBtyCtWCvJIuG8vtO11RsBfA6GvHLG4uuuHRGEqQ
+
i9IGIVBIUdCT+q4Eu8zV5hVEdbuufDGTbp1Ye2MZszl99XE3FKBgBNMfMyYL4fO4
+
+GE6kuTMdgwlI1CKFlQH5cZSMwGtm1ElTZcwd0Zl1Zu/5Y4mKwJ78RLtdmoIpYW/
+
8TnvuH1uD6PFZQ6f0RDxNnEnyZuAezTx16tjFfTuoI1/lyvq6t6et/f9TysKTnZZ
+
W0PSBFvTaxE1IKaO/PRynd9ZrBbLgk8pibCP6HgM8ev1Gbl4vLjq/0t+t0PEVquH
+
y0MXvO6OvjGs89JS9/AYbBAsFxmD/FcKGm857fKFqE2a+SguX0oTBbjNx/PG0rAm
+
RTx9CR2wCUhTq5KheRmL+Ik/T/Yv4QuDid6p93PHcwJ2YUqXPyMEuTyv/nhjSEGa
+
v3GX7sIQh0aC0LSHF0ielfyxjvAXysNKiIZaN+DU0tGTgKW/QvMOnUKB4X3EZCHu
+
yMGgV1vR+pVTLx7xoAyjPL9DQC9ezMlSs5gcZVEV3NLRndz5Es2SAgg7r0mXy5fg
+
PZz7XVriGa+2JhcAnDbFWgFjqwI7r5MSTpq8Sl9FZ8E
+
-> ssh-ed25519 wpmdHA wfideEEHVJwKpYxqET5LDOE859htEZIpg1UxKIGSayM
+
V5vr78i22cOHPS8+ZFluqMDfH9D3vzkHQ51Oos+MWq0
+
--- ltXrwcgDWjvOiOkbNmi8MAUtgcevsUKA2ooV7UyB03s
+
�� ������U���������q���{l���˓��<��=r��Žv�ݸ�H���Z��V��
+21
hosts/marvin/services/secrets/buildbot/workers.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA NyjUU036+HYwviv9FB7Onyl3YYScNe/vLXpAYnbbJxU
+
pecvax2BSVOYEgCHxoQyWTRzBRpq8N2ertX0QAw600Y
+
-> ssh-rsa fFaiTA
+
Tdwy6FqSqpMxc7x/Ygwiz8ssPwug7sk1BZ0QghMZkoO8KPJwldUcYfsgQxklzisx
+
JuMDTBacCxN6/RnIfvcagtYZ2NeKsGkhk6KZ1QtcDt9oWrLD9KQBs/YlBmkJGE3L
+
SqAcQX9AybGQ+ODS8ZbXR7WTcCy0I85Jiy60QYRfkX5lElL0BAbbuphn6xtm0dt7
+
YuArYTndGI1KOgcnDCia8Az84vzjIh/Cp4AGthmhAOQP2R1k94LI8p1639RqlrkT
+
XAdsglg344l7ki2Eib4pPADDmhKttrJ/79DTK0X+1757PaUyxMif55WIrxQLzE2s
+
QHhwj1pka1HynIGy87cwILAlvqWNFUQ9lTbfMNfTLMBEJ7hH/HB6Adpmr0CVhKKG
+
B3WfC9l3v/15owcb3qLeP/dkaarjHbTM4FafOLkjrhdEgYCEGK/ls3vx0Deq4x39
+
G3WO/fclUQyjcO/g17i9yyfmuupL11Juk8xRyaU5fzi5O7gtGnPlLxhBqXE1s9Xa
+
FzSSBHztAYAT7D7wodoE+LsTAajRoMQnTkFuP0pvO81C8z7dMXVckYvPco8dTbHY
+
wujBpw+h//2oIfWxgM6lzZGKny+VsbFSVDz3JURCeWUaFpjdDHzkk7fd+fXAdhcx
+
Wh25XuYYKvr1SOjo1ux9hAgbH/KAGKy9hoXzpbs6q6I
+
-> ssh-ed25519 wpmdHA iO+7sYjfsEVkwxtiRMgi/5liBd5I56Cl3nIo5fFe6gc
+
Rhez8a+eG9D4kV6I3R7eRdEty3dVyYybBCsDoD3gy8Q
+
--- W7rtaU3i9bkD3+2PKJbOeDK8AlFhpW0t3Lp6MeJ7RiQ
+
���
+
.I�s ��q^hA���Ch�D��s��������|����8[�%xX�n+�Qb�#f�gUL�C�c9p������RgBd9e%'Y8�F��gկ~�15�D���d�K��C�c>���w
+
tP(�cr�����p7
hosts/marvin/services/secrets/forgejo/aux-docs-runner-token.age

This is a binary file and will not be displayed.

+21
hosts/marvin/services/secrets/forgejo/db-pw.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA 2iR3dpVJpZQc8SpHKJMDdoFgRQ3SdR+1Z6MJNOXBYRA
+
gN/aJwxHXwAH+UPyVG3C0iwNyitvqleasEId230Ta5I
+
-> ssh-rsa fFaiTA
+
o1krn+dfavUdLS/kL1jr0fzPdM9U8r22e2HXUyB8Cjg8K39QNR0tIUnJOeDh+ySk
+
5mnA2fIhCc8TDmxViSVelV34xPBJUE97Uv4ny8d33oAM/h+Z9lUVkNYqBQIvy/7A
+
VbXPr4exw09vIKqMII8r7Jk84h/W/+FNCOD0eD/hoIEihkEKmTlGaKnDrIukWK5u
+
3oohSQ8vjz57NjyNAVMpqBR+N/kgix7Qn2nWie0Y+8a6Oe09KGv8o4NSvMsoF36g
+
ZoahpTkWqN5kEMciduo4bGUPO0WlKS8JtmpgZnOB9s0BN1xHqGyFheh2lkprW8m7
+
5RsnmjveQ5W/YOjQwfZcyx7MzWGu/tdAOa24ZxDMoVuz6p1fVYNmVx5roj8ddU8M
+
Zf4LIRyq+p0reWEZyx4kGM9KO3e3uBdjEcd1hN8c11Nuhq8sQWtCzZIfXUpbWFsc
+
tFdKrAkxnrCjFbwkBLj9KRrstJ2U9kvQPjv/TLUu3nfZvQrT3r6La7nh43yJVFbO
+
BEKiebbMKZ/uXpat9ysBblaDSDLgFq9bG+fKaDCurK8xLeihEmUUto3+zJ2ju0xN
+
9/5y4wvaHp2ubn2garimQA5SL/MXviroM3Ihis1QXh/EjCqUAsNDWuxj4yGq7KjH
+
pyJh4POTwFwa1+dieajao44dXbjR8agomTDNsFcvciw
+
-> ssh-ed25519 wpmdHA Yn2SflGKXRy8gFw49DgIgYgQ4wW8E2DGGI7dB08Fp3g
+
h+CktGIMZuh8mRJawXRRNrN6ekc96ET5vIHEE+560R0
+
-> VEh-grease \tZ(&
+
sarIr7CdltfkDsPGC746Bj2bSi4JYbJyJyqFIY6mTlr89qhx+Q
+
--- Oogb2JMBAeU5WMAOhFDuLMUwj6Y3yGjn4FDAJ8IsNTo
+
�oi�KAe�+���i��\��*����:��� �c�6��(�1�����敽#�Stq���y�/�T�� h�|
+20
hosts/marvin/services/secrets/forgejo/default-runner-token.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA wAo/lrx6N+r+RDRkW+diss7p9GXRuBKJ8X3m9SqsUms
+
j7n9oR9u1XkSPikdXm7ck0nOlt1QOJ1ZBGcU/b+kgr4
+
-> ssh-rsa fFaiTA
+
jP6zvnCemRTSeHZzkwCQw4ISRuQVNwPRDVr1zqPlx19z7s+c5NSH2k+ryjgbVWkc
+
EoP+SMR2sguwhi6SvKNvFZOp4+oAu4ATWGCvjTiqD+iNj0IR9pd+TMIVD6g117eM
+
0W2LQN+Yw9tDpT5vX4RSR+Vs9rvWkNgZI58Rib4DprRP9lcD4hjpUyFWLnjsm/PV
+
4YGMyt9CCQWT4UuEj8PZGK/l1uQRNIoXlHj83Ewl7WNhlO7I08kSDKke39VkIiXj
+
55FOLCIq8rgT8mUsBqr2EJRzS9hJpKIytYdhLmTdAMdpfXWvjDTVAKIYO7DnAWdk
+
uU+ORVOfKEYjD4uuYODhS/n2U6USwNF/R2E6JB806LOglASacw7o9h2oTXEpiW8u
+
KJq3VkmnhaE9h7SOkBISlGC+y9MDm0Lv07P0hHBr1j+oaeVehMst9HO8S2ngVp6H
+
0ZjokI6JpExinFn+UDoocXUK9s33Hvzg/q672JmgIos56wmCtFX7A/ba2isKpajp
+
WIQMgvQEVxaUBpbRQTjj5SNGVRMns2cJWWpvinyjLMWRj8J+0OEzOLyrvnCpZZw1
+
DS+ffnwCd/7t3zxnyyl+xeRVD0tq7Dd1X4oxmSNDEHKcNKhjsDnIEd1y/tcTsUUN
+
X9GDhHLFLoS3BxBydkJ6dSH9knlE5KZAc3wKtjw+AQA
+
-> ssh-ed25519 wpmdHA hgNiJmcUepbnNwU+8zcRC7xlhou25Uv3mKO7L36RlQA
+
1uSnVNpcQTGhYw+L02JQSd1PUrC6t6Dh4QI+eXbr8NI
+
--- H3xuoJ0qmwWqAJoiY8nFXbTOpOeEcKcr2zc6CozBFtU
+
W���S���2��+jz[�귐��P1�>��b�R�J�-��
+
&�jm^���E ~��37ܢ6���/�$�ÒH>9p� ,
+19
hosts/marvin/services/secrets/forgejo/gitgay-runner-token.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA NtvHYtlP2R1/ySw+0gQk8q1QJcujtjMK9h8BXTLnpFU
+
5+iRMI+OvjQMSR8TkEO5QXFp0u6De3EVtmt+OttYLAw
+
-> ssh-rsa fFaiTA
+
MiYovathZe/ZO/NvHsRTFaAlj8GsHgBcbVkkV9MDoYhacdomegj+J2nQks/j+TbP
+
zU9BSBMSyzWrYuCi15kISyk962mSc7Gte4nwJvUUiZdWq/Vm2dSLyV57EHBgSXl/
+
C9DHnS78OgTDn8YeeRviLkJ87LEEPF9yGG2z/YN4i53Cuy8UDQagdpFG4dWjGnQn
+
hImg4bI99h1coaCf8PfsuLsdumbR6y12rdW0A5cEyhfDoodV9hILGuP9KCtUXNxO
+
BrxDlpVC5CjUZ1xcz1qgQA8QvKbl7qVitxmr5+1pHwtscaiTufOs4MI+ZxCKwOhJ
+
VPiy01TesPHR9oua/7Ap4dBOTpKRPb8GyaCVyRvkb4cVIlQNgIYuL3pkB3KOM3Ct
+
VhvXVgXxB6Gb78gJkBy/uwmnSybfnzjv1z+yA9f8VFBzt+i2kDq8/37Tng9DSVGj
+
4yS67uYQkT5+OVrcjNwBd3NAguVNNg1PEsIE8SvnLXRmI79gjiMdlmZFTsAl2EZN
+
2CMUaR9r0O88xhEf7FKQ9CUjZjfZvyhHPaJXADfducaVhB56RCIf3jwtsdFnTzzZ
+
UMIYJ57Pe8m0ESjzp/8+6wH4MPaMULSJhxnpUJW5y5qqnpvRo1dQiPRkW3Xxjh3H
+
2ulClJg8m7Tqj/nASJFZkqI7PUxjnAteEUcY2WBRtMA
+
-> ssh-ed25519 wpmdHA OYK95VOo8jFn31+P4keeW0eJco7PKVE82NQL0U+0f1I
+
D7O1m8QTLBARYjzUJBBX18Ko62iu7ETDD/CJHptTBf8
+
--- ku5u3TkIGQvE212JtizdwVoz4B0Jx3wvvPrGFfvihGg
+
�gL�y+72.O\A�,U&z����y +�Y��OB=�#� �=/���}�@W�xx���� \'��~�x.����5?�X�
hosts/marvin/services/secrets/forgejo/internal-token.age

This is a binary file and will not be displayed.

hosts/marvin/services/secrets/forgejo/lfs-jwt-secret.age

This is a binary file and will not be displayed.

+22
hosts/marvin/services/secrets/forgejo/mail-pw.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA QbfTwmaq7Y7u8CL4KBCcGrCyT4b1lGky7FH11QCTvmk
+
IdVtZ+2EyxvRLVXUTiiLPfAcKdkfY34MZrzn7SSl9eg
+
-> ssh-rsa fFaiTA
+
XfTTdTEAls+Qtl2WYcHCaKd+vE4eZaY5Rh1llYAfeAxBsmgq4vmSS1UFkPD5HUMl
+
9dkHZuEYyySdhOM7RFICYpwbWAdSybs08dFI4rjpYiU0ZuT54aDmvTtioVIIVvn+
+
E9YEphsIO4jbqTDEk0lgBNs622vlJ/d6xV6Loc15ZFYxyqteXTTpQii2Jpzh010b
+
PW+LlzSChr4yMZWRqKQV2QcHQD699L3p4X5eleuUkMh1N+mM0U0RlDPnRzDx+10L
+
yMZxyRjWs+u2mo1SuNrgzn14D9SewJXbhYvc+KcigTWhQymr4XHDCPguB4UExonu
+
/JodLIpjVA4ZlTQV56jjMgOXDE5bk+TpHMULn2mxxXFxtDPzvamOjnjTNS9b6PVF
+
/JHcRgHpoY4Z6KgQN4cR7naj23pco/k8DbI2f7TYTXTHxSl1wfLbaTwdtEpnuO4F
+
D+sNXQC1wI5Kr0fQV6l1NwtPI1De2NbR4S8SKKJRDk+xdhnmiD3qawy+I5D2e8Ri
+
JLkzUn4xeQgSLibXrDWJI++JCnc0le2OgdZ/uJd5feJJaSr8ISRW2Rhvq168bamf
+
tTPFVG6V0YRC/oGgytT2TOtqrx9+Ewf2TN2BUdlckUp3k1L6JiZJg3Tnps8RaCvo
+
wfsGS1ZKcadS6dQyfAKe7vr9Q/dEVYoOR0SIstLae6o
+
-> ssh-ed25519 wpmdHA L3dLS8TuV+mkf9lT3ChtIvLxciLJIHhPdUFz8dcoe3I
+
tpSkZkQ3yidTctaAk3yzye/DJiUYBeHvJBu7JDVsCqk
+
-> 4-nZ-grease @h[XP&o
+
g+aR0SZXoWycWqRgm2Ry00EJ29VWxfzDI3UmPg
+
--- SlVpGEGQXxhp7CUE1f+LoX4rGtOONFm1SSq/gwGITpk
+
\�;^_��T�p�R��21f��v̵]���O(��L���5X��ol&�����$
+
��y���l^��"��V�c~
+19
hosts/marvin/services/secrets/forgejo/oauth2-jwt-secret.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA yaO0bR/AMXXrY7ZqH9GlFFFNSYtd3YdIaZHeBkmAV2Y
+
emQoXCiHu59lqhMo6+6RZcjykzCFgQL//LeMoMf42m0
+
-> ssh-rsa fFaiTA
+
vUrw2prvE5tBUMfKD/VtBYzoCz+OholrDVO4/8gvKWcUVBls1wjDHH3DXR68YRTt
+
Kxxv/Nzi4aHOdwBgF/UQ4FkFE8Lq13N8upgVhUph6ryFI77bEZ30EJdI9bSNEPiD
+
L75lnD/oqvALZviQGypX+phllyc/vihJuWF7wHEkNzowLYSfoYv0SoZYUym9nORG
+
aRyw936NP1GGhOgnoqCfl/AJqE48nXlhK9SfJ/8xTfHrEgeT5e5lid6s9Uw0j/m0
+
ZXA/ut6yoLS4+SgbOJR1RosiMav55+DGOVJ4PgK8s7hhzxyUTPqtoSPiQoLzjvqW
+
vp4IY3DMSqPEsb7rbHn2eIfnaGqFof7x4HbG/ablKRQtx13DTJ0m2MKDubH2RWQT
+
MZGiqA+h4jVShLBY8zX0l596K3eFdJqxZyxU5rzP5ahgS2JKaaaEarPdHXuZ1P+U
+
NSGZ1O8hW0GQ6lyeTjyGA+ZwjWk+CBZFj4iaTGi9tnMLeF9GctVcNrSTNVxlUmek
+
rBIfb5QXA8zuTJWbxcEjrFJb9dmjC7Sd9EtCfIRh6VQBXlClBQgSOZVqH6RBhJ51
+
iRL9Po2Xrb/Y08w+BrCqdecfeDU027E/Ds2uSdoSK2OMJ6ZNaz3RER4HXitltPA+
+
gN3W5et8lD9DIW+cc1wj2MyitEFZh9pJ7C+uB6YF81Y
+
-> ssh-ed25519 wpmdHA w2zM2j5IAfn51aylYdRUz8WCuv7FkumpxepsfqS//W0
+
gVcYqjAA4ULVcSmS7BVRqF8kfWHbtjlX3659+CGQbME
+
--- 1L+ACPbJPa2Y3wxSGr/7CBTPYXIOxOHynEhlUZGLgzw
+
��jq�uz�P3� "�}ܬĩ�W/距���ߎ+�΀q���*}�a��6��I,5<sB�m�{J�%(��a�A���
+19
hosts/marvin/services/secrets/forgejo/secret-key.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA 2bKuQvw8O9MVoEjaS212yLxAjIcnoT9K1XfZ+WDUsQI
+
sA0hNHX+vfLlM0WORLnrxMbHsqwNoqCrSTCY7iIBtmY
+
-> ssh-rsa fFaiTA
+
qIb+f5jyeTmKqW/ylUBcQH5tz0/0SM/ovGWkr1xiloqieANaMEdMTiQRYNrMpOtl
+
HUn4YjLZ7RqlOUBvRWJkMsSaj2gnPCUBnnNh2exCG/rLWnbL2OfC3yFAcfFKSAc+
+
f/jiudo0PmSStP8o8S/Q+k74cxbg1ic/eMfX4hdHCxliI7privKtxOSz3yiuW2Tq
+
ZOMKQ/YF3rqMD/O0jdUFu1OzdCuBj+GtpPrJGR5NJmeQJw8wM9Zk4ZMpW6MkOPij
+
tK5URdwX15dDTC8woUCwvFdVKTd7+VV0E5p2y2ooIr9SNFOyK6ehwINIpoPvoQKn
+
SgObyRUc4jksyPirl0r+1h2bFuJdWY/JhPb5pyeSZpI4VybZwWY0RpYgWtMNUJ3j
+
4YJ22pKKtkH0NXsWhwzG8Tmv7S0kDsZS+yD3vMD/mkAnlSt5cK0MnMXpqxfS0PWM
+
lhk7iD/ne29yCvl3aWTfJF2Uc7gi2gcHZ9WscS07ysWD2kBkQAsMBohSNPP+sE9C
+
qH8BFrlFBJs1K95jmnbtIprA9k7S0P9ahqnCh4B1PmNP7dWvVDjWeknrij3p4Vuo
+
GibCDtFWrbO37Aksefs0AF2wGQmaHRHtAhdL2Ieh/v5yP1HMcMTpYvTFqw04AnRq
+
C5Qj3pd89I2Zxfu71X8UuNqXFaDt7FTVPqQXA/QXmi4
+
-> ssh-ed25519 wpmdHA bOhWTK7ltgJA9tVCQn/Has4cqeiGkLukCtV6ns2xgmg
+
m18TCv820K+AhM3DsTG14LXWSSJ2Q0agwW/67B2cv7s
+
--- RDzTUIZVWDsM2snL8JjZNi7JR3+uDVBqCpcXQwq5ics
+
%-�t�'=*єNzW2�N��v�*��3��Ew�-������9yMg�Ğ��p/�OQ��I@},��VZy�ꧣUQ"���q��9moی�����g�to�
+23
hosts/marvin/services/secrets/grafana-admin-password.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA XeXuqrum348P3vNXQH2ikpZfSIiLeJWejxY3tgGv+2g
+
C40Ha7mJHes78csqAtgEBOMrVhZ84jR2MIw96o6xlKg
+
-> ssh-rsa fFaiTA
+
gMFfSu49RZeKk9Gj2jhdeG+Yvais/e8Xfw/7Vysgv5a9aZrNcduGcaVV36jYogMG
+
D5nC5LqFDlvYKrfJDeQ5JKoYb6SJQ027qopoithQPMSRAIc4Ke6EwkIGPkH8a/R6
+
+WgfUlaFiacOqRmNB2ObQvQvyKQt4EPihkqt76b2gGoz3e+lS6SS6pT2UUqHbV6d
+
BqBgzc68YWS0IZPtyMcLNFL/TpGH3y0sf335ypuytiEHMmH9qN39h33rFRYB7gdB
+
nGuKZ0nhqn3VQUWAiSWJW46+oGF78bsFRgnPvMVqc4TQaiXLG/Qv1jVEgBU/GSHC
+
GbrE7fgBMMN2noX7zQ7NdBbOZF9J4gVm031lo3mpI4GlaO7G24EUTdG8JmP2cTcZ
+
Q4iiiiZaOxWWhJ9ObDYr2clvm8P3TLqE6C77yzlA1QMo957rr4RO3HHDgfn/Ge6n
+
gx30M/SCLKvCeyZTmRWHULlzlsr8MShENJf/zeKdbnNaMacofXgwL+mCe8bWHcrQ
+
OfPmXBHa4UPb7zbESOaNgbYhCzjNEhqcXKn2AXbWcNJGImyOf0PievCBPGo/B013
+
VETrs8gd1ud8GplsT8b0XMmAJDrJSPSJC7ieyjBFGU+dWucwtUtw3VajqMjklAZO
+
6gWo+ybtXA473LFpzu4MVA0Zr1nwaYajJDMsygfVVos
+
-> ssh-ed25519 wpmdHA hqXiyptEBUhTluqATQtTHNjpQMsEWGweLZBM0vNr+0Q
+
sSUev74dcNmHWZZF4l0iJjgEH+zX3pJ+1d88cZFU1QA
+
-> W-grease dB_Ln,<Q 8OG=
+
mn5NEEyg97gp+G6d9APe+CT+9uqp68TCOpqqwOYMk2BZwpVqmTysx1r595h66ShQ
+
4fDWVuM9W8k+nr7tuV1jSRtA/XH0NhwxgwM
+
--- uqf0oP6H6UKtTSOO2W5kZtxmF3loWg9vD1tVqn442PQ
+
����ц�-��^W� ���� �qv�UP'w�=��N�7���;n���
+
,a�%5�'һRTz��u]��P,
hosts/marvin/services/secrets/grafana-smtp-password.age

This is a binary file and will not be displayed.

+19
hosts/marvin/services/secrets/immich/mail-pw.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA 3PVJMF6BgxuDxN9NAEYqcZaYEUhK9TB5XprRyW13Kx0
+
AIQQG+4/9SVPcfq9ZtL/JsWDmLvW03UiAJaJ1nHSckQ
+
-> ssh-rsa fFaiTA
+
ZPBI1w2a48Md+Rt92ssVcfxN26zTLCEalT+jG8SJBv07ouOzd4ibPq65m6uOQU/+
+
EEgHe23fGsPP4oISWDUgVFxesLA3wjsTWmbVrkrBzGQNeNnevIRMcJu7vWDtby/+
+
dVxPQIoXH0jPlcDQCm2lwOGD+du+Nb4PnVseRPDaXRypKKmx+J057FQemYBk4OWx
+
yUfbKV2gHHcuRTVUQG6XAQwWvhh4e25fyc+MzKZNPUK4c/SVibjAsUH+Edd+NaV5
+
yxku5k4TFZkU69sl2zCdgWfYVTowTGYGyf4Kf+I/kl9m13zIk9vRpocgt4APaJnv
+
p+KxJvbYRiprWl+IzZg6TwXY5mA1IbvlppR4aak1pwaIE76CgF5mGNDGkviGndtP
+
+eCMIocp6lk2U0dJEYkBtmjNbxFh3dxOcirgdNDypYPlZTSGvSRGhpL4nUJRsR+l
+
A7rJ5aHH2B4Vi93zgSV0PWiWSA7899bzgN1kQKKIgYln6Tl8UxQSNt5L3L4VajuW
+
3UqCltyGWt/926BMS+GrDZSWCEtVsDs5XQqDKEx6D+iviHZJXniI+RhH/eM7FLjp
+
iXgCRkBIALo2lOiScpr2rtfGDViq3Nh64cIslEPiewjVFTCxkxH+LuQ1stukrNki
+
IF0+pZ65rgatMAdnZRFXfRxmywKD99z4WRHAxvYloXc
+
-> ssh-ed25519 wpmdHA SQlzD3yqbnoF0JHqPFFDUugbm8jlBsdntLzF/WlJbjo
+
FggpB1k5xbq62QNlwkocwjiWhEqNjHAxR/GwoPhXbC8
+
--- 1g4f2OQbS5iXm/cqBamEWuapvZHorxfX7wHizfPcYsc
+
�z�92�LN=9���$O���fP���E���~�.��}7�eڰq��y�N�I�L����"%�V�lz'�أ�
+19
hosts/marvin/services/secrets/immich/oauth-secret.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA 4osfKV5/wFT7mCdc4TjP7pJHdD8wzV7VKKiBSGRqImk
+
wU6RSxJh8SBbXbiwCl4lXD/m1THoAg5n1Y7pyKFPiec
+
-> ssh-rsa fFaiTA
+
RTHaBLsBWbDEmY80LktVL/C6CeFinLm3/4t/hoWmbzLLoElBL86EGVdrE5ovjUYl
+
j5+ZacmqahwjCtF/ZGBt8MFkWOK9u90YDfLp+kb2ILVy/E+CcQ3xPpH9bf83pPl/
+
aZmttaRlhnhSDYVXB0lHx3u/cCrYhTf6TjEoVGZ/XrLW0BRmO6GSwcmTrachZzdJ
+
je+pf2ug//mnAJR0y4MxjGlNPD/Vaj/UiaFQjPT+7ZvUUSkbv/QpPqyhhosFA11e
+
1EGp21ppwUnJSNdYh2vulpQGurB5bPlv6Y8FpcFKivq/qKmA4ydyER3NcCca5Ly+
+
01jQ1HRqWylYJj7K4hnxSjnNlOXCrJATuPJYoNdt2U1DnolUAqL6JIP/qNmYx8Fb
+
ZrfFINBmPsNc9XJn14T4J+VB6e68ODBOvZdbzoBQOWAObnP5OH+zLYCB3II+aLPp
+
Zo5WsNBBdZih4EbO0Y9PNWBjyCzxqs7zXPg1PjjDVHN/tIpSGnqoCqCPGuePhgRV
+
h1gnP/lqOW2U1oL004hi3etsUsk3kXHjr35GXMVBeay+3uGXkZqhNYYSluQnJSrs
+
rzahZZ8/q0FDdlUixWHb2uQjL1XMTqUcw8wPsUak8shkx8s7GPKNxtEKFcK46jk4
+
ac9TCyee4HzPC/SWkLGFl0bt9s9lGTBSNQrVzogY/sg
+
-> ssh-ed25519 wpmdHA C6npqn5aqimGJlo+UlvYOoqXSu/hW1JVNAmBPP1Vvjk
+
gWzXqL92jI83iqSr3dydJo+UAz5OGBo6kw6QC4KRWgM
+
--- ltHFDmeAbJsQtyY4CKFEz8OGAkPkue/8upHNOOQgn5I
+
��O�ӌ#&`���P�IZ�#�[��+�tdeG�ui�����?n"��(��b� ]s� y줔���
+19
hosts/marvin/services/secrets/jellyfin-exporter-config.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA TYkyDIP1q7bJrSI0YsLBg1F78NF0AnWGTDBL5EdkexI
+
wPDeCC6nUE2Y0xzepEc3p5DM4W5VmXgoUQ7Lxe7pEf4
+
-> ssh-rsa fFaiTA
+
OAT8CyT8DHsr5gkiqhaP5eg//9BAiIGFbiYtr3Wyj3gRv91qsjtRh+MKggqysSPk
+
EN0z7NeoVujFe1mF3/dIFrQD5rcyVSomOnGytmL6R1aSDP677S0JoXUi1RaYfyYq
+
NE59VXK27kCTwsnsD3F2Aish+xmYvBTmUSHDXU/DtKGRB7vgqRSBlMUC9nHCKYvn
+
9dBC7gzikMRBNJ7ciOLfB1m7cR3A31gw+4OpUYqlLXCvfdCuh5QPhToy4VDPFZOq
+
5C4upvtK1qcyy8ZBLL1mwfLpP79t9NIHZnbg0q5fNwSqUkmGfV+mAJHKH5bZMbxB
+
5soPF9yV3mXqXbhl4xEhOMVd50LJwE8t/CyWqkLmZ8CmQ1UovsI4qIDEXP3tLSmC
+
PAT/RYqw84Pzb7Yd8RYELWnbWR/4BbzjkR5rbj7sklSo55be+A0N5YoWuU1ApBR8
+
8LKCKJMzaWnfHS6WNeMNHHP+j7SlBlKnqJWjbjfURJG1HyRx8TIJZ40jZUzfeFG1
+
W4U0RFQZ83d6vz4MBLa9Fk0ms6NyJoO+Rgh0Wl45tritHtkkwYWyxxPL2yPivQ/w
+
NDtBn08eliJzxhAGz0pAHETU8aHgNkLAXbMGku9U/hDaQ4XjGH3np6WOjwnCxJ0W
+
W7ChuMLXcD7CopjGkJSwTUQB3W1McVLQ34yfD7ZroJM
+
-> ssh-ed25519 wpmdHA JpxYf1dtrdlZEx4E8Su0scbGteAREMlKJ3OHfqDWyRc
+
/ZVDz4HSKPT6OyeryIEkfplDLN2XIWm0b4ncg/xezfs
+
--- oY4WmthKy5Ytp1j3hd81DRGFW1A2818Wr9pYmc14hRU
+
�;�2����}�O3h�u5�� ��缻�N��s}oVU���@��嬝��L�at��8�x��P�R��d�Rx{3�b��?o����x8`��V ܬ�"*����e�� #NV��?� ��aP��N��Iɥ�j��S��y3�i����hgп\�D�b��1;��\A<d��f9����A�g�J4؞��R����'תs�COCs� ���ŒN�v�"��vk>8,�DR���
hosts/marvin/services/secrets/miniflux-admin.age

This is a binary file and will not be displayed.

+24
hosts/marvin/services/secrets/minio-root.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA mgvSF87cU7AZU7wodayiSUZAKkAkwqSrtjhqa4Pykl4
+
eFNRjsChXz5ij9uOJvf+mJIE5zd6pwKJie7UKmwl5bE
+
-> ssh-rsa fFaiTA
+
NcGWHG9CTQ1Gpje+gsMrVlp1qc8w9NW+Onvv8WhaI+IFVEcUD85fvgPaO2jI88jK
+
TXyPk9RanxiCupk7dF9OXqMprOHexss+h9SSl1AN+4V0Ob/H0r63de0Uuro70t/4
+
/4FP8t5AE/aoFGdw6CeGyhOYjoLo6YRZAq4fYO0vvitFdcbWVm99OFbO3WfoxNZB
+
TgUJ2ELV1mRfPKe3QwHYLztKcyxN4CArjNjQvjQbLXS2Hbu3I4f4qIdKPwGVC1HE
+
Q0c9veAaffaAGgbNUyohDjN4I4jEzkRhTlRN4LNQmOUNLBorWu9ml+IyCnsg2Q+a
+
nIyp6OvE7t0qElPv7H4m7krBP6WsSXLhUkCd75VgWEgJRqsLz7p8XyUpb/EhPmql
+
CQy8gcAnsvNjYzC0xpZKsxN37dRvmTmQkWd3E1w4XDwHoh8EMdVXFkTAIZ3IZabZ
+
4MSkwhtgTBMiQvWMxIPN9fgsd6t1GawDsH+uN0tPpBslerlF17bszmdSdVYpYZBN
+
Z2YE9z13vbL3eHvp83fp7n7Ale8sFd6FQ6VpbAa0xHiwYV0WooUHymhcG2W8Lcq9
+
5w9LJSaV7HMxjc0nUBloxsOF6ODcrOsfNo1VXe1vnbDAwhDqpcwaylxUoh3zpXHW
+
XBEIzqVG3qC3ACD/xqCy27DkomgKXCG9eJvirAiQ2Uk
+
-> ssh-ed25519 wpmdHA xWldzzokOiLqGXnhbDz+xpHYeqkV0ZNuQJqGp1h28VQ
+
i2/gdjHevsacZhuSDeABMAKEbU0U00U0TQWSHDS82ws
+
-> \G-grease v0 "."c0,-f Y3.
+
MpzHrbDONd6D0zPzvCfz/ycI8sKBIP20soAtSN7EucFLN6BCbb13KT1BOh/Yvg5o
+
+52Mlpg3p0KAdZFYp9Siqmcrb8GEEZ/8lqKu/n8TyD1BWe+eWq2PfbrhCtgqvMlR
+
Dg
+
--- lLxTWRzSaZ/GAzAmD88c//dzNqT4UDZQb4szP7MgCGY
+
+�P��������q�f =Yc��,)��F�P�9�.���� �Z<��ɟF�c,�q���o��Y �>������\�l��z��2ϯ���_s���z��&_�B��q<�J����+0h�_��W
+
hosts/marvin/services/secrets/nix-serve-priv.age

This is a binary file and will not be displayed.

hosts/marvin/services/secrets/pinchflat-secrets.age

This is a binary file and will not be displayed.

hosts/marvin/services/secrets/planka-env.age

This is a binary file and will not be displayed.

hosts/marvin/services/secrets/pocket-id-secrets.age

This is a binary file and will not be displayed.

+43
hosts/marvin/services/secrets/secrets.nix
···
+
let
+
ssh-new = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAxOg9nOtfbedq9AlnXNVUfyU8Mwfj4IB7HX/4VoWeXP";
+
yubi-back = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw==";
+
marvin = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP60B1IOdfJRrDcCKajMV8YJNC01gSsccZi3DKHlS6YJ";
+
marvinDefault = [
+
marvin
+
yubi-back
+
ssh-new
+
];
+
in
+
{
+
"anubis-key.age".publicKeys = marvinDefault;
+
"authentik-env.age".publicKeys = marvinDefault;
+
# "buildbot/gitea-token.age".publicKeys = marvinDefault;
+
# "buildbot/oauth-secret.age".publicKeys = marvinDefault;
+
# "buildbot/worker-password.age".publicKeys = marvinDefault;
+
# "buildbot/workers.age".publicKeys = marvinDefault;
+
"forgejo/aux-docs-runner-token.age".publicKeys = marvinDefault;
+
"forgejo/db-pw.age".publicKeys = marvinDefault;
+
"forgejo/default-runner-token.age".publicKeys = marvinDefault;
+
"forgejo/gitgay-runner-token.age".publicKeys = marvinDefault;
+
"forgejo/internal-token.age".publicKeys = marvinDefault;
+
"forgejo/lfs-jwt-secret.age".publicKeys = marvinDefault;
+
"forgejo/mail-pw.age".publicKeys = marvinDefault;
+
"forgejo/oauth2-jwt-secret.age".publicKeys = marvinDefault;
+
"forgejo/secret-key.age".publicKeys = marvinDefault;
+
"golink-authkey.age".publicKeys = marvinDefault;
+
"grafana-admin-password.age".publicKeys = marvinDefault;
+
"grafana-smtp-password.age".publicKeys = marvinDefault;
+
"immich/oauth-secret.age".publicKeys = marvinDefault;
+
"immich/mail-pw.age".publicKeys = marvinDefault;
+
"jellyfin-exporter-config.age".publicKeys = marvinDefault;
+
"minio-root.age".publicKeys = marvinDefault;
+
"miniflux-admin.age".publicKeys = marvinDefault;
+
"../nextcloud/nextcloud-admin-pw.age".publicKeys = marvinDefault;
+
"nix-serve-priv.age".publicKeys = marvinDefault;
+
"pinchflat-secrets.age".publicKeys = marvinDefault;
+
"planka-env.age".publicKeys = marvinDefault;
+
"pocket-id-secrets.age".publicKeys = marvinDefault;
+
"vaultwarden-vars.age".publicKeys = marvinDefault;
+
"vaultwarden-pgpass.age".publicKeys = marvinDefault;
+
"webmentiond-env.age".publicKeys = marvinDefault;
+
}
hosts/marvin/services/secrets/thehedgehog-key.age

This is a binary file and will not be displayed.

hosts/marvin/services/secrets/thehedgehog-pem.age

This is a binary file and will not be displayed.

+20
hosts/marvin/services/secrets/vaultwarden-pgpass.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 iqBxIA MmMZMGXNjC0521Tc/YRvAc4uV6Mj14Hrncf05PEEEns
+
3gv8ZFgFx8CHTRelKT4AOGdNTnTtNsJqOCoynmzuOWI
+
-> ssh-rsa fFaiTA
+
Uy93t1IeeIHUwzKCA6m00kl58Z7Uyzsx08CFF2trLruf3iB6+mk703K6QMkrBUHR
+
awSxL8TOLlRwV/h/ckFfTMlltPYcs49s1NV5BhqRSFQJpFOWtoh2RH+6HpZt7lVv
+
8rS2lnlrsm+s+oragwMPMtjLbN5llH3NiZ4V8C2bksKllxAYZJ98rT+kFB+k1BGI
+
o8GcP7Z4+SyEyr4NZBo7pIdpyPYIvhw2MQUSM80Hs30IKGkvBuybDefYY7tSSCZ8
+
puFY2uGI0tLcX9PCT73M7NRCO4Z9lgQgixDrLerDl4pwLd+6p5UHBk9DdmcxyX3f
+
hYC75XcIMOKJfnSUd/maMzx7xgCHtGRuGTp2sHccC5pkjlhI7S8e6Exae66UjXYC
+
5AAA18m8Vzjcck0WiEE7XsZMCwYuKLg53wzsyhPLsHOTiu7BqRg8S/pmArY2SOa+
+
DfQE/fjpljGeKC9mDfyLe4+lyGQ1lUCzASacd1kG5iWS2NM0KDEG/iUTsurfY2gI
+
5v76P3r5iV6jQUGpwScH5XgaekbqC/Xp58p9JbNmPeD5q10ORPggJov4BmqZlX/c
+
Zf2ImTzmECdFRRpcQHZEd/XpR2BfEXCfeLKJiwjYEYKYchD0eWOC7LUnb3+n1Ce+
+
XtlEs77kAkY1SfZyBv9AkP0FXUrfh7VLMeAh2cIsNzw
+
-> ssh-ed25519 wpmdHA tjOcqTNJbYxD3s9DqfIHUHdw0xqtkWjMou7lPrANHEA
+
s+9wASJ94ILA0SZYCrHO877yLLs+rZApqrJGi3sBznI
+
--- CM35xl4mV3DtEYw5Fhzjpj79v4twt09X+weM5EoNkGw
+
��M�y&�q��p{p�W>û`A��@��L��/�@����:P���߿u�Nڏ&��^v��0�*/�u�q[�<�M<6J�W� �����9��~c��v�z
+
k>���ˊ �I�
hosts/marvin/services/secrets/vaultwarden-vars.age

This is a binary file and will not be displayed.

hosts/marvin/services/secrets/webmentiond-env.age

This is a binary file and will not be displayed.

+15
hosts/marvin/services/syncthing.nix
···
+
{
+
services.syncthing = {
+
enable = false;
+
guiAddress = "0.0.0.0:8384";
+
};
+
# Open The Ports!
+
networking.firewall.allowedTCPPorts = [
+
8384
+
22000
+
];
+
networking.firewall.allowedUDPPorts = [
+
22000
+
21027
+
];
+
}
+12
hosts/marvin/services/tailscale.nix
···
+
{ config, ... }:
+
{
+
services.tailscale = {
+
enable = true;
+
permitCertUid = "962";
+
};
+
networking.firewall = {
+
trustedInterfaces = [ "tailscale0" ];
+
allowedUDPPorts = [ config.services.tailscale.port ];
+
checkReversePath = "loose";
+
};
+
}
+44
hosts/marvin/services/tangled.nix
···
+
{
+
config,
+
lib,
+
self,
+
...
+
}:
+
let
+
cfg = config.services.tangled.knot;
+
dk = self.lib.data.services.tangled-knot;
+
ds = self.lib.data.services.tangled-spindle;
+
in
+
{
+
services = {
+
tangled = {
+
knot = {
+
enable = true;
+
gitUser = "git";
+
stateDir = "/var/lib/tangled-knot";
+
repo.scanPath = "${cfg.stateDir}/repos";
+
server = {
+
listenAddr = "0.0.0.0:${toString dk.port}";
+
hostname = dk.extUrl;
+
internalListenAddr = "127.0.0.1:${toString dk.intListenPort}";
+
owner = "did:plc:5cqzysioqzttihsnbsaxrggu";
+
};
+
};
+
spindle = {
+
enable = true;
+
server = {
+
listenAddr = "0.0.0.0:${toString ds.port}";
+
hostname = ds.extUrl;
+
owner = "did:plc:5cqzysioqzttihsnbsaxrggu";
+
};
+
pipelines.workflowTimeout = "10m";
+
};
+
};
+
openssh = {
+
enable = lib.mkForce cfg.enable;
+
ports = [ 2222 ];
+
settings.AllowUsers = [ "git" ];
+
settings.AllowGroups = [ "git" ];
+
};
+
};
+
}
+101
hosts/marvin/services/vaultwarden.nix
···
+
{
+
config,
+
self,
+
self',
+
...
+
}:
+
let
+
+
d = self.lib.data.services.vaultwarden;
+
+
vaultwardenSecret = {
+
owner = "vaultwarden";
+
group = "vaultwarden";
+
};
+
in
+
{
+
services.vaultwarden = {
+
enable = true;
+
dbBackend = "postgresql";
+
config = {
+
# Web Server Settings
+
domain = "https://${d.extUrl}";
+
rocketAddress = "0.0.0.0";
+
rocketCliColors = false;
+
rocketPort = d.port;
+
reloadTemplates = false;
+
logTimestampFormat = "%Y-%m-%d %H:%M:%S.%3f";
+
# # Ratelimiting
+
loginRatelimitSeconds = 60;
+
loginRatelimitMaxBurst = 10;
+
adminRatelimitSeconds = 120;
+
adminRatelimitMaxBurst = 2;
+
adminSessionLifetime = 10;
+
+
# Logging
+
useSyslog = true;
+
extendedLogging = true;
+
+
# Features
+
sendsAllowed = true;
+
emailChangeAllowed = true;
+
emergencyAccessAllowed = true;
+
+
# Invitations
+
invitationsAllowed = true;
+
invitationOrgName = "dishNet Vault";
+
invitationExpirationHours = 168;
+
+
# Database
+
databaseUrl = "postgresql://localhost:5432/vaultwarden";
+
+
# Signups
+
signupsAllowed = false;
+
signupsVerify = true;
+
signupsDomainWhitelist = "pyrox.dev";
+
+
# Passwords
+
# # 1 Mil hash iterations by default
+
passwordIterations = 1000000;
+
passwordHintsAllowed = true;
+
showPasswordHint = true;
+
+
# Mail
+
smtpFrom = "vault@pyrox.dev";
+
smtpFromName = "dishNet Vault <vault@pyrox.dev>";
+
smtpUsername = "vault@pyrox.dev";
+
smtpSecurity = "force_tls";
+
smtpPort = 465;
+
smtpHost = "mail.pyrox.dev";
+
smtpAuthMechanism = "Login";
+
smtpTimeout = 20;
+
smtpEmbedImages = true;
+
useSendmail = false;
+
+
# Authentication
+
incomplete2faTimeLimit = 5;
+
# # Email 2FA
+
emailExpirationTime = 180;
+
emailTokenSize = 7;
+
requireDeviceEmail = true;
+
+
# Misc Settings
+
trashAutoDeleteDays = 14;
+
};
+
environmentFile = config.age.secrets.vaultwarden-vars.path;
+
};
+
systemd.services.vaultwarden.environment.PGPASSFILE = config.age.secrets.vaultwarden-pgpass.path;
+
age.secrets.vaultwarden-vars = vaultwardenSecret // {
+
file = ./secrets/vaultwarden-vars.age;
+
};
+
age.secrets.vaultwarden-pgpass = vaultwardenSecret // {
+
file = ./secrets/vaultwarden-pgpass.age;
+
};
+
services.anubis.instances.vaultwarden = {
+
settings = {
+
BIND = ":${toString d.anubis}";
+
POLICY_FNAME = "${self'.packages.anubis-files}/policies/vaultwarden.yaml";
+
TARGET = "http://localhost:${toString d.port}";
+
};
+
};
+
}
+8
hosts/marvin/services/zfs.nix
···
+
{
+
services.zfs = {
+
trim.enable = true;
+
autoScrub.enable = true;
+
autoScrub.pools = [ "tank" ];
+
autoSnapshot.enable = true;
+
};
+
}
+44
hosts/prefect/bootloader.nix
···
+
{ pkgs, modulesPath, ... }:
+
let
+
fileSystems = {
+
btrfs = true;
+
ext4 = true;
+
vfat = true;
+
zfs = true;
+
};
+
in
+
{
+
imports = [ (modulesPath + "/profiles/qemu-guest.nix") ];
+
boot = {
+
zfs.devNodes = "/dev/";
+
loader = {
+
grub.device = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_21170924";
+
grub.enable = true;
+
};
+
initrd = {
+
availableKernelModules = [
+
"ata_piix"
+
"uhci_hcd"
+
"xen_blkfront"
+
"ahci"
+
"xhci_pci"
+
"virtio_pci"
+
"sd_mod"
+
"sr_mod"
+
];
+
kernelModules = [ "nvme" ];
+
supportedFilesystems = fileSystems;
+
};
+
supportedFilesystems = fileSystems;
+
kernelPackages = pkgs.linuxPackages_6_1;
+
kernel.sysctl = {
+
"net.ipv4.ip_forward" = true;
+
"net.ipv6.conf.all.forwarding" = true;
+
"net.ipv4.conf.default.rp_filter" = false;
+
"net.ipv4.conf.all.rp_filter" = false;
+
};
+
};
+
services.udev.extraRules = ''
+
ACTION=="add|change", KERNEL=="sd[a-z]*[0-9]*|mmcblk[0-9]*p[0-9]*|nvme[0-9]*n[0-9]*p[0-9]*", ENV{ID_FS_TYPE}=="zfs_member", ATTR{../queue/scheduler}="none"
+
'';
+
}
+56
hosts/prefect/default.nix
···
+
{
+
pkgs,
+
inputs,
+
...
+
}:
+
{
+
disabledModules = [
+
"services/mail/stalwart-mail.nix"
+
];
+
imports = [
+
"${inputs.nixpkgs-stalwart-fix}/nixos/modules/services/mail/stalwart-mail.nix"
+
# Machine-specific configurations.
+
./bootloader.nix
+
./firewall.nix
+
./networking.nix
+
./hardware.nix
+
./packages.nix
+
+
# DN42 Services
+
./dn42/default.nix
+
+
# Running Services
+
./services/acme.nix
+
./services/caddy.nix
+
./services/fail2ban.nix
+
./services/mailserver
+
./services/prometheus.nix
+
./services/secrets.nix
+
./services/tailscale.nix
+
];
+
fileSystems = {
+
"/" = {
+
fsType = "ext4";
+
device = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_21170924-part1";
+
};
+
};
+
+
nix.settings.max-jobs = 2;
+
nix.settings.cores = 2;
+
+
programs.fish.enable = true;
+
programs.fish.interactiveShellInit = ''
+
${pkgs.direnv}/bin/direnv hook fish | source
+
'';
+
py = {
+
profiles.server.enable = true;
+
users.default.enable = true;
+
programs = {
+
fish.enable = true;
+
neovim.enable = true;
+
};
+
services.scrutiny.collector.enable = false;
+
};
+
security.tpm2.enable = false;
+
security.tpm2.abrmd.enable = false;
+
}
+67
hosts/prefect/dn42/default.nix
···
+
{ pkgs, config, ... }:
+
let
+
cfg42 = config.dn42;
+
in
+
{
+
imports = [
+
./peers
+
];
+
networking = {
+
interfaces.lo = {
+
ipv4.addresses = [
+
{
+
address = "172.20.43.96";
+
prefixLength = 32;
+
}
+
];
+
ipv6.addresses = [
+
{
+
address = "fd21:1500:66b0::1";
+
prefixLength = 128;
+
}
+
{
+
address = "fe80::1";
+
prefixLength = 128;
+
}
+
];
+
};
+
};
+
+
environment.systemPackages = with pkgs; [
+
dnsutils
+
mtr
+
tcpdump
+
wireguard-tools
+
];
+
dn42 = {
+
enable = true;
+
# ASN corresponding to DN42 PYRONET
+
as = 4242422459;
+
# Communities config
+
# https://dn42.dev/howto/BGP-communities
+
region = 42;
+
country = 1840;
+
routerId = cfg42.addr.v4;
+
# Primary IP Addresses
+
addr = {
+
v4 = "172.20.43.96";
+
v6 = "fd21:1500:66b0::1";
+
};
+
# Owned IP Ranges
+
nets = {
+
v4 = [ "172.20.43.96/27" ];
+
v6 = [ "fd21:1500:66b0::/48" ];
+
};
+
# Enable StayRTR
+
# https://github.com/bgp/stayrtr
+
stayrtr.enable = true;
+
# Peer with GRC
+
# https://dn42.dev/services/Route-Collector
+
collector.enable = true;
+
+
wg.tunnelDefaults = {
+
privateKeyFile = "/run/agenix/dn42-privkey";
+
localAddrs.v4 = cfg42.addr.v4;
+
};
+
};
+
}
+25
hosts/prefect/dn42/peers/bandura.nix
···
+
{ dn42Types, ... }:
+
{
+
config.dn42 = {
+
peers.bandura = {
+
as = 4242422923;
+
addr.v6 = "fe80::2926";
+
interface = "wg42_bandura";
+
extendedNextHop = true;
+
# My side
+
srcAddr.v6 = "fe80::11";
+
# Communities
+
crypto = dn42Types.crypto.safePFS;
+
latency = dn42Types.latency."55ms";
+
bandwidth = dn42Types.bandwidth."1000mb";
+
transit = true;
+
};
+
wg.tunnels.bandura = {
+
listenPort = 44923;
+
peerPubKey = "xPW1/cWYDkk/IAss1GbdwVMW7fzKtyHA+qrfCriOB2k=";
+
peerEndpoint = "aurora.mk16.de:52459";
+
peerAddrs.v6 = "fe80::2926";
+
localAddrs.v6 = "fe80::11";
+
};
+
};
+
}
+26
hosts/prefect/dn42/peers/catgirls.nix
···
+
{ dn42Types, ... }:
+
{
+
config.dn42 = {
+
peers.catgirls = {
+
as = 4242421411;
+
addr.v6 = "fe80::2189:124";
+
interface = "wg42_catgirls";
+
extendedNextHop = true;
+
# My side
+
srcAddr.v6 = "fe80::111";
+
# Communities
+
crypto = dn42Types.crypto.safePFS;
+
latency = dn42Types.latency."148ms";
+
bandwidth = dn42Types.bandwidth."1000mb";
+
transit = true;
+
};
+
wg.tunnels.catgirls = {
+
enable = false;
+
listenPort = 43411;
+
peerPubKey = "";
+
peerEndpoint = "";
+
peerAddrs.v6 = "fe80::111";
+
localAddrs.v6 = "fe80::7";
+
};
+
};
+
}
+26
hosts/prefect/dn42/peers/chrismoos.nix
···
+
{ dn42Types, ... }:
+
{
+
config.dn42 = {
+
peers.chrismoos = {
+
as = 4242421588;
+
addr.v6 = "fe80::1588";
+
interface = "wg42_chrismoos";
+
extendedNextHop = true;
+
# My side
+
srcAddr.v6 = "fe80::100";
+
# Communities
+
crypto = dn42Types.crypto.safePFS;
+
latency = dn42Types.latency."2.7ms";
+
bandwidth = dn42Types.bandwidth."1000mb";
+
transit = true;
+
};
+
wg.tunnels.chrismoos = {
+
listenPort = 43588;
+
peerPubKey = "itmJ4Z8V1aNN368P6kMzuQM+GdzWbBKZjJiXrgSeGlw=";
+
peerEndpoint = "us-qas01.dn42.tech9.io:58768";
+
peerAddrs.v4 = "172.20.16.143";
+
peerAddrs.v6 = "fe80::1588";
+
localAddrs.v6 = "fe80::100";
+
};
+
};
+
}
+29
hosts/prefect/dn42/peers/darkpoint.nix
···
+
{ dn42Types, ... }:
+
let
+
peerv6 = "fe80::150";
+
localv6 = "fe80::113";
+
in
+
{
+
config.dn42 = {
+
peers.darkpoint = {
+
as = 4242420150;
+
addr.v6 = peerv6;
+
interface = "wg42_darkpoint";
+
extendedNextHop = true;
+
# My side
+
srcAddr.v6 = localv6;
+
# Communities
+
crypto = dn42Types.crypto.safePFS;
+
latency = dn42Types.latency."2.7ms";
+
bandwidth = dn42Types.bandwidth."1000mb";
+
transit = true;
+
};
+
wg.tunnels.darkpoint = {
+
listenPort = 42150;
+
peerPubKey = "1o0XfQvBM1gqknqzfuOnVmf2RjRTHuyMZYNipSSb2TQ=";
+
peerEndpoint = "iad.darkpoint.xyz:22459";
+
peerAddrs.v6 = peerv6;
+
localAddrs.v6 = localv6;
+
};
+
};
+
}
+23
hosts/prefect/dn42/peers/default.nix
···
+
_:
+
let
+
dn42Types = import ../types.nix;
+
in
+
{
+
# Port numbers are 42000 + `last 4 digits of ASN`
+
imports = [
+
# keep-sorted start
+
(import ./bandura.nix { inherit dn42Types; })
+
# (import ./catgirls.nix { inherit dn42Types; })
+
(import ./chrismoos.nix { inherit dn42Types; })
+
(import ./darkpoint.nix { inherit dn42Types; })
+
(import ./iedon.nix { inherit dn42Types; })
+
(import ./kioubit.nix { inherit dn42Types; })
+
(import ./lare.nix { inherit dn42Types; })
+
(import ./potato.nix { inherit dn42Types; })
+
(import ./prefixlabs.nix { inherit dn42Types; })
+
(import ./routedbits.nix { inherit dn42Types; })
+
(import ./sunnet.nix { inherit dn42Types; })
+
(import ./uffsalot.nix { inherit dn42Types; })
+
# keep-sorted end
+
];
+
}
+26
hosts/prefect/dn42/peers/iedon.nix
···
+
{ dn42Types, ... }:
+
{
+
config.dn42 = {
+
peers.iedon = {
+
as = 4242422189;
+
addr.v6 = "fe80::2189:124";
+
interface = "wg42_iedon";
+
extendedNextHop = true;
+
# My side
+
srcAddr.v6 = "fe80::6";
+
# Communities
+
crypto = dn42Types.crypto.safePFS;
+
latency = dn42Types.latency."20ms";
+
bandwidth = dn42Types.bandwidth."1000mb";
+
transit = true;
+
};
+
wg.tunnels.iedon = {
+
listenPort = 44198;
+
peerPubKey = "2Wmv10a9eVSni9nfZ7YPsyl3ZC5z7vHq0sTZGgk5WGo=";
+
peerEndpoint = "us-nyc.dn42.iedon.net:48883";
+
peerAddrs.v4 = "172.23.91.124";
+
peerAddrs.v6 = "fe80::2189:124";
+
localAddrs.v6 = "fe80::6";
+
};
+
};
+
}
+27
hosts/prefect/dn42/peers/kioubit.nix
···
+
{ dn42Types, ... }:
+
{
+
config.dn42 = {
+
peers.kioubit = {
+
as = 4242423914;
+
addr.v6 = "fe80::ade0";
+
interface = "wg42_kioubit";
+
extendedNextHop = true;
+
# My side
+
srcAddr.v6 = "fe80::ade1";
+
# Communities
+
crypto = dn42Types.crypto.safePFS;
+
latency = dn42Types.latency."7.3ms";
+
bandwidth = dn42Types.bandwidth."1000mb";
+
transit = true;
+
};
+
wg.tunnels.kioubit = {
+
listenPort = 45914;
+
peerPubKey = "6Cylr9h1xFduAO+5nyXhFI1XJ0+Sw9jCpCDvcqErF1s=";
+
peerEndpoint = "us2.g-load.eu:22459";
+
peerAddrs.v4 = "172.20.53.98";
+
peerAddrs.v6 = "fe80::ade0";
+
localAddrs.v4 = "192.168.220.70";
+
localAddrs.v6 = "fe80::ade1";
+
};
+
};
+
}
+25
hosts/prefect/dn42/peers/lare.nix
···
+
{ dn42Types, ... }:
+
{
+
config.dn42 = {
+
peers.lare = {
+
as = 4242423035;
+
addr.v6 = "fe80::3035:137";
+
interface = "wg42_lare";
+
extendedNextHop = true;
+
# My side
+
srcAddr.v6 = "fe80::112";
+
# Communities
+
crypto = dn42Types.crypto.safePFS;
+
latency = dn42Types.latency."20ms";
+
bandwidth = dn42Types.bandwidth."1000mb";
+
transit = true;
+
};
+
wg.tunnels.lare = {
+
listenPort = 45035;
+
peerPubKey = "AREskFoxP2cd6DXoJ7druDsiWKX+8TwrkQqfi4JxRRw=";
+
peerEndpoint = "use2.dn42.lare.cc:22459";
+
peerAddrs.v6 = "fe80::3035:137";
+
localAddrs.v6 = "fe80::112";
+
};
+
};
+
}
+26
hosts/prefect/dn42/peers/potato.nix
···
+
{ dn42Types, ... }:
+
{
+
config.dn42 = {
+
peers.potato = {
+
as = 4242421816;
+
addr.v6 = "fe80::1816";
+
interface = "wg42_potato";
+
extendedNextHop = true;
+
# My side
+
srcAddr.v6 = "fe80::111";
+
# Communities
+
crypto = dn42Types.crypto.safePFS;
+
latency = dn42Types.latency."148ms";
+
bandwidth = dn42Types.bandwidth."1000mb";
+
transit = true;
+
};
+
wg.tunnels.potato = {
+
enable = false;
+
listenPort = 43816;
+
peerPubKey = "LUwqKS6QrCPv510Pwt1eAIiHACYDsbMjrkrbGTJfviU=";
+
peerEndpoint = "las.node.potat0.cc:22459";
+
peerAddrs.v6 = "fe80::1816";
+
localAddrs.v6 = "fe80::9";
+
};
+
};
+
}
+26
hosts/prefect/dn42/peers/prefixlabs.nix
···
+
{ dn42Types, ... }:
+
{
+
config.dn42 = {
+
peers.prefixlabs = {
+
as = 4242421240;
+
addr.v6 = "fe80::1240:2";
+
interface = "wg42_prefixlabs";
+
extendedNextHop = true;
+
# My side
+
srcAddr.v6 = "fe80::240";
+
# Communities
+
crypto = dn42Types.crypto.safePFS;
+
latency = dn42Types.latency."7.3ms";
+
bandwidth = dn42Types.bandwidth."1000mb";
+
transit = true;
+
};
+
wg.tunnels.prefixlabs = {
+
listenPort = 43240;
+
peerPubKey = "uRYzFGi+/B6pD0FR2SW3G/OzC5LPJXePNIt0s+nJfW0=";
+
peerEndpoint = "us-01.prefixlabs.net:22459";
+
peerAddrs.v4 = "172.20.209.11";
+
peerAddrs.v6 = "fe80::1240:2";
+
localAddrs.v6 = "fe80::240";
+
};
+
};
+
}
+26
hosts/prefect/dn42/peers/routedbits.nix
···
+
{ dn42Types, ... }:
+
{
+
config.dn42 = {
+
peers.routedbits = {
+
as = 4242420207;
+
addr.v6 = "fe80::207";
+
interface = "wg42_routedbits";
+
extendedNextHop = true;
+
# My side
+
srcAddr.v6 = "fe80::5";
+
# Communities
+
crypto = dn42Types.crypto.safePFS;
+
latency = dn42Types.latency."2.7ms";
+
bandwidth = dn42Types.bandwidth."1000mb";
+
transit = true;
+
};
+
wg.tunnels.routedbits = {
+
listenPort = 42207;
+
peerPubKey = "/RLM4EcF8b7FKKcxnvHIYyDoES59HXIBqhKEWt4yRy0=";
+
peerEndpoint = "router.iad1.routedbits.com:52459";
+
peerAddrs.v4 = "172.20.19.73";
+
peerAddrs.v6 = "fe80::207";
+
localAddrs.v6 = "fe80::5";
+
};
+
};
+
}
+26
hosts/prefect/dn42/peers/sunnet.nix
···
+
{ dn42Types, ... }:
+
{
+
config.dn42 = {
+
peers.sunnet = {
+
as = 4242423088;
+
addr.v6 = "fe80::3088:193";
+
interface = "wg42_sunnet";
+
extendedNextHop = true;
+
# My side
+
srcAddr.v6 = "fe80::abcd";
+
# Communities
+
crypto = dn42Types.crypto.safePFS;
+
latency = dn42Types.latency."148ms";
+
bandwidth = dn42Types.bandwidth."1000mb";
+
transit = true;
+
};
+
wg.tunnels.sunnet = {
+
listenPort = 45088;
+
peerPubKey = "QSAeFPotqFpF6fFe3CMrMjrpS5AL54AxWY2w1+Ot2Bo=";
+
peerEndpoint = "lax1-us.dn42.6700.cc:22459";
+
peerAddrs.v4 = "172.21.100.193";
+
peerAddrs.v6 = "fe80::3088:193";
+
localAddrs.v6 = "fe80::abcd";
+
};
+
};
+
}
+26
hosts/prefect/dn42/peers/uffsalot.nix
···
+
{ dn42Types, ... }:
+
{
+
config.dn42 = {
+
peers.uffsalot = {
+
as = 4242420780;
+
addr.v6 = "fe80::780";
+
interface = "wg42_uffsalot";
+
extendedNextHop = true;
+
# My side
+
srcAddr.v6 = "fe80::10";
+
# Communities
+
crypto = dn42Types.crypto.safePFS;
+
latency = dn42Types.latency."148ms";
+
bandwidth = dn42Types.bandwidth."1000mb";
+
transit = true;
+
};
+
wg.tunnels.uffsalot = {
+
listenPort = 42780;
+
peerPubKey = "7V65FxvD9AQetyUr0qSiu+ik8samB4Atrw2ekvC0xQM=";
+
peerEndpoint = "dn42-de-fra4.brand-web.net:42459";
+
peerAddrs.v4 = "172.20.191.129";
+
peerAddrs.v6 = "fe80::780";
+
localAddrs.v6 = "fe80::10";
+
};
+
};
+
}
+63
hosts/prefect/dn42/types.nix
···
+
# DN42 Community Standard BGP Communities
+
# See main lists here: https://dn42.dev/howto/BGP-communities
+
{
+
latency = {
+
"2.7ms" = 1;
+
"7.3ms" = 2;
+
"20ms" = 3;
+
"55ms" = 4;
+
"148ms" = 5;
+
"403ms" = 6;
+
"1097ms" = 7;
+
"2981ms" = 8;
+
"gt2981" = 9;
+
};
+
bandwidth = {
+
"0.1mb" = 21;
+
"1mb" = 22;
+
"10mb" = 23;
+
"100mb" = 24;
+
"1000mb" = 25;
+
};
+
crypto = {
+
unencrypted = 31;
+
unsafeVPN = 32;
+
safeNoPFS = 33;
+
safePFS = 34;
+
};
+
region = {
+
europe = 41;
+
northAmericaEast = 42;
+
northAmericaCentral = 43;
+
northAmericaWest = 44;
+
centralAmerica = 45;
+
southAmericaEast = 46;
+
southAmericaWest = 47;
+
africaNorth = 48;
+
africaSouth = 49;
+
asiaSouth = 50;
+
asiaSouthEast = 51;
+
asiaEast = 52;
+
pacificOceania = 53;
+
antarctica = 54;
+
asiaNorth = 55;
+
asiaWest = 56;
+
centralAsia = 57;
+
};
+
country = {
+
canada = 1124;
+
china = 1156;
+
taiwan = 1158;
+
france = 1250;
+
germany = 1276;
+
hongKong = 1344;
+
japan = 1392;
+
netherlands = 1528;
+
norway = 1578;
+
russianFederation = 1643;
+
singapore = 1702;
+
switzerland = 1756;
+
unitedKingdom = 1826;
+
unitedStatesOfAmerica = 1840;
+
};
+
}
+44
hosts/prefect/firewall.nix
···
+
{
+
# Enable using nftables instead of iptables
+
networking.nftables.enable = true;
+
networking.firewall = {
+
enable = true;
+
allowedTCPPorts = [
+
25
+
80
+
143
+
179
+
389
+
443
+
465
+
587
+
636
+
993
+
4130
+
4190
+
6900
+
8000
+
];
+
allowedUDPPorts = [
+
80
+
636
+
4367
+
6900
+
34197
+
];
+
allowedUDPPortRanges = [
+
{
+
from = 42000;
+
to = 52000;
+
}
+
];
+
trustedInterfaces = [
+
"wg0"
+
];
+
extraForwardRules = ''
+
meta iifname "wg42_*" meta oifname "wg42_*" accept
+
meta iifname tailscale0 meta oifname "wg42_*" accept
+
meta iifname "wg42_*" meta oifname tailscale0 tcp dport 22 accept
+
'';
+
};
+
}
+1
hosts/prefect/hardware.nix
···
+
{ zramSwap.enable = true; }
+35
hosts/prefect/networking.nix
···
+
{ lib, ... }:
+
{
+
networking = {
+
hostName = "prefect";
+
hostId = "496e5e96";
+
nameservers = lib.mkForce [
+
"172.20.0.53"
+
"172.23.0.53"
+
"fd42:d42:d42:53::1"
+
"fd42:d42:d42:54::1"
+
"2a01:4ff:ff00::add:2"
+
"2a01:4ff:ff00::add:1"
+
"185.12.64.1"
+
"185.12.64.2"
+
"100.123.15.72"
+
];
+
resolvconf.enable = false;
+
resolvconf.extraConfig = ''
+
name_servers="172.20.0.53 172.23.0.53 fd42:d42:d42:53::1 fd42:d42:d42:54::1 2a01:4ff:ff00::add:2 2a01:4ff:ff00::add:1 185.12.64.1 185.12.64.2 100.64.0.3 45.11.45.11"
+
# name_servers="100.64.0.3"
+
'';
+
interfaces.enp1s0 = {
+
ipv6.addresses = [
+
{
+
address = "2a01:4ff:f0:98bf::1";
+
prefixLength = 64;
+
}
+
];
+
};
+
defaultGateway6 = {
+
address = "fe80::1";
+
interface = "enp1s0";
+
};
+
};
+
}
+4
hosts/prefect/packages.nix
···
+
{ pkgs, ... }:
+
{
+
environment.systemPackages = with pkgs; [ direnv ];
+
}
+19
hosts/prefect/secrets/acme-creds.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 LcWOqQ W9y79zRYtD++Eh6rHy123fXPpbjF/VKym6yKbiJdeko
+
RblRsoHs16Zi2sG3wqdcW60hRUWG2QQQS/Rvro5fPlk
+
-> ssh-rsa fFaiTA
+
gfo7VZ2QjUSHTSuY5fL9clW/RwnMLbFEBcM6tGwXdaJBtnGJiK3TE/haiX078y9l
+
Yw8qA04rQ0d4PSN2aUvLhbj1la8WfkutwZM1E4otuiI0waPLVBK7lyImSucMJVRW
+
ZyYJuRUNAbyGZcj6qrbTPOK2qv4NORbVNJrXA5utUOn7+SimpifUcN60mSY1LTXG
+
AmWa+qo7iWTkSngEG+ZaqnCqKRBGn9j3b9h925ah13PKaP9Y1g3L2EtSj/Z0BMPS
+
PGTuObBgc1a+mQswcDY1tLq2gdohPAoRV/6djRdL7cnkVK3gcrPq+qca6Vy4xV1N
+
w1IPPb4TTEPuTdqJRHQ/56b3QK9+ahpDUQMfUGcJ7nQeVqYksu8fbEhkCNTW2nK7
+
Z+XC9BbksI/xlIC0t7HjMf99c2rLxbBY3lkh8EiH3vlCEURAqbAw4yRjSeUU24SP
+
ieEI3fFp1ShFxVKQ15mcICGD6bCK55S7lk6RFYMsPFn+gaNWpy1k6KPPom6Bw0pf
+
uHQ2Mc8eTPe6pmeLkV133TIvf5fWZTpOaw9fV9DLyggd04yTYsfbn2g7TBEC/PaK
+
9UjuxtlyZOLWzvoa6leKhqJDhJnQcYKSXGczjMtWzwwdhDlK7gM84uSw/NHjc/uP
+
mswdQXpTIZ3AawGtgJy1hx0gxOBNNTJTu3T0kR2TP9E
+
-> ssh-ed25519 wpmdHA QHgeXP4+KHH7z+oNDoJiQx2W5rywdt8ufTFqMKJSAg4
+
8Ws80AAf/4LYBu+BIxFaCf5+X6STrurg2Oel8wQ4LVI
+
--- gtLhAHFMWYrIqO7DB2HyBXvh3rFaTY9T99R/1Nn8Jq0
+
(�h�=gx��:�d9�y��^c�m���2b��$�� K�M3:�f*�VH�8�h���9��!� i�U����k?��
+19
hosts/prefect/secrets/dn42-peerfinder-uuid.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 LcWOqQ kBcl/7oOU9vxw5FShoRs1rLr2+8ax3O28SA8iqme1kI
+
dxRn2Ty/FmzLURNoJTVz8Xf49Xb6+93ThfkebsF7qrE
+
-> ssh-rsa fFaiTA
+
qdSIS9RJua3Z/MMrLrbtwMYApTD981CJbHiiRlgdQEPfW8Dl1ghPSv9MS9hI2xb+
+
KCU6BTW9gxYYXvg2iG2b/VrU5zOLllop7C9e9+ks8G7hVqDEC/PAG2Jru8IhUjgR
+
sDXE/UDOCgvwGm9ykd+h6fndFGGy412C5XraYKOx3RFCyWZPo3r+V4di04t49IQG
+
A58opz3cIALRbCg8w0GcQprdI7qvr2pX8xfwPdsOk0MOr6i/4s8V1KJhFG5rT9e1
+
hOAEpLXTl6rtHKA12GfgMokS4D5da7Eae7P7MQcu+CMRCRFdtaRwAXCsmyy0Nixu
+
Pk06ewkhXDRfsZG8Vjr1akyZMAP0V7b2IzlCFfmZ55V7SqkjQp5p/ewD9W0H7nfU
+
xI3tS2k0JgX/lyP2QOkNvRv1bR/pFjrkN0xWXe333NL96XibTuSC1yWaXxll8eXv
+
EkuZK10FMqLBZv2QTiZgjEltxFJTLUD+A1cNqSIYzOaTcj862drejkSUqDmhvjBR
+
9cOLfvxcJ65SPP2FfcA8u7FulWPeUa1WI1Rr8hMECQ1wVQG7vz617se+2Sm6W60G
+
ZwihmOzAE2UbG60msdkhl5/P/oL2kprupZ3XZfSeBrcsexvbMqHxWdfXryO7NveG
+
TqjwROdJ6JvJgKvukpll5fppjhiQlPs6wJpDNxqR+UE
+
-> ssh-ed25519 wpmdHA gm6QPnESX+3cUNK1cn4pGYufAIlpGM456PE9HoKqejY
+
E98aiJNwJ4xzoAWu7a2s757zaK8qXo+l+Jv8xFMg430
+
--- nsAD74FL+Wqkye1GO6/ZQ9MViWxCE0wRjKmcJsf27lE
+
P\ɸju�}qP^�g+�n��m���W�g� � 1�+�Ԕ���T�M�ߤ������b��(���4�Y5��
+19
hosts/prefect/secrets/dn42-privkey.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 LcWOqQ B+/jn8M0138SSUaT13FksSgPgm4Na6S28UceeqJH4w4
+
VA055+VxxIEKeADY7V6ov4xplN54LjnqqzpKPcHd/yI
+
-> ssh-rsa fFaiTA
+
SJQN8/1W+RoGGy07BuHPUbSAqpSd6n0/BreSlD07a2WXqhwap/NK2KUd5CODrSXm
+
upjycEsVm7hE+qgSTYDH7kXHPvAqdns3BnKVer4404dIoTgO0mGO5xhkkZb8vSFT
+
x0mUgfEzHc6jJFZ94KTbaajbIVxyoXtdFOIRZ7XgzxUNDpVaK+zI0C5KCph027vv
+
V4FmK+4lSbhXJkZDdk7Qsogm5i9piwz7ibIYqVU8SkdA9Ogp6a4BySIgaYObakEd
+
ZuYGOFnw04Fcepqtf+NiigWDt4RpIXBC3ePQ/TrmriC5gaByFNPgasJ/GiKmtZs9
+
oBYfB7jlyQ+FZ9FCWt06MC2sZJRWLYVClLGYOMc5zi78U9Q4fs0MjRfs6PSJYk0G
+
fgHo7KDLBEnVWluzTVPhMsKmWhTpFu+aYWQ7VE0Qfc1uolJH1TmsKaZ0y32Ewnry
+
YfqwPBCaFUN2uuWmBsiMuKBFQ55ky948kqSfD+GJkCrN5TwS5ZZwFWpkHdKGbL8e
+
geTvZaD9UB48oV0Ad9vnNWuu/Nfr64XnYOXKNt9ezAR9nmUEh+tHbwC2x3xBjyn7
+
Oy1JjH4hRwK8L9d5hrtKIP9gWIIUFjEsi1vcgnKm9nieInGnHd2zsUxH3JbqRggl
+
Ul7e/oZcILBQ8+Jgz6CFvKMUFztLtndZrVdM14rVR0g
+
-> ssh-ed25519 wpmdHA p5t4c9VAcYR3gV+nwKgJmqEA5e5NLlTHuSYudGgtkGA
+
RRxMP1ONcrJCZl7b/nTli+cPPaSpk9+BHN2ZZFNNHWI
+
--- /EK83atFakXmrSbmNXdshl6JcCqq4ReYGA+JrHTh8jY
+
�A��{f�.ydcv�zx����0�!�"fn� i$.����|C��'��������0^�F���?�&�Ks��T�ȡ�{ІO
+19
hosts/prefect/secrets/headscale-oidc-secret.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 LcWOqQ 9WEpxu36UKkp8wETOX7Bzbe7RbIr2k+iUh6iqlYt1AI
+
w4g2hxFzUFsOynUUrwtQBwVJtIFiRqQYPUzKwCwEKL0
+
-> ssh-rsa fFaiTA
+
E0MNb/JGvaAlGYw9C0dC5mKybhNAyuYj2+s0w8+aQ1p/OH7bDacXJbEF5JSyA8oO
+
pd/c44QCQRIFFrnEOddvYsUsq3d8x1Hxs4LUMXF2XMmtljBiFSPZ2u/NFljmY/i0
+
3/ppVQWlmFEMbk/tFb70sw6yVg+ZQN3+K1VQnLSpqm/v9WyruPYUCwRx2O8Zfy/E
+
0LiFqnSGcxMPCNQ2BQFTDXqXA0wjasKb+sDbqzki9Uxok6VmCCQ5xfPmv+L2V1PY
+
VgNUOPx9Vfo4iuuQAt4RMdlSQbG/xTja57TDVsjGXi+vDDJGfX5kJLunjuFWBP8Q
+
A+KPPl+PB9+Hqnzxwbz6r1lRCX/GIUtVcddWE7o/4rkVXIGPwWOg5hD/fLPNnu1E
+
3iqhA+Hs1uMeqr8fGLSR4B9kNBPqqJUIqrg+bbsUpxo0qtYdHgvSECY38dE/kHVh
+
LNbJ2XqGf065UjzRvNLWsrLEUZPpAB32MxBt7PG2Lrd/OmjdVf4PVyyYn7icmaSj
+
zYE2MI7qQb8VUpsGttggYmhltxx6I0/fUMLkXZuWTtzDQdjrrGu5crCmveVyXWfT
+
f1YzefQ/wEGasTJbH6MSyWqanl4D5BGVVtXcNQluDpCxI3EYX8VI9zRfMHrNXsEc
+
rNjUM+Nm4KSubFScMDRReiVszZXyf4rTVWEXmmVcJeI
+
-> ssh-ed25519 wpmdHA qtkvqOY/HL1dHuJB11jppDBAJiwGS7FcEV/Zz1BQ4lg
+
YsTTYNL2KrMEuuKTNLYq2Rx1Ic76Bd2LzAvLeRqdFYQ
+
--- iUSmUHHGyMQENZOuZzSfivf7LTeLd2wh5B4DeApwpcA
+
���)���NWv�ӘԐ|κ$(`1�ӟ%t�' ��ް�M�lԧ�Pr�ͬ Ԓ����I� ��h�W!������)N�Xz +r,���;�1SuJ_��@k_C�ߝvvyǵ����r{�z�pK�� �ڝ���t9h\t^�i0c7����ax�����q1
+21
hosts/prefect/secrets/secrets.nix
···
+
let
+
yubi-back = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw==";
+
prefect = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP532AB5mkNvE29MkDDY8HEf8ZdktGWiI0PzLrvbmLQe";
+
ssh-new = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAxOg9nOtfbedq9AlnXNVUfyU8Mwfj4IB7HX/4VoWeXP";
+
default = [
+
prefect
+
yubi-back
+
ssh-new
+
];
+
in
+
{
+
"headscale-oidc-secret.age".publicKeys = default;
+
"dn42-privkey.age".publicKeys = default;
+
"dn42-peerfinder-uuid.age".publicKeys = default;
+
"wireguard-priv-key.age".publicKeys = default;
+
"acme-creds.age".publicKeys = default;
+
"stalwart-secret-rsa.age".publicKeys = default;
+
"stalwart-secret-ed25519.age".publicKeys = default;
+
"stalwart-desec-token.age".publicKeys = default;
+
"stalwart-fallback-admin-pw.age".publicKeys = default;
+
}
+20
hosts/prefect/secrets/stalwart-desec-token.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 LcWOqQ jGFXEJomNDBCR77u3stHaHCWq/VAkUrixdxvF07330o
+
05GhqYBL8QFz8a8GRHJ3h8bL1puZYfPE/leeHbXNw3o
+
-> ssh-rsa fFaiTA
+
J1BWit5DxgYimZRyMycqN55IBNcCyRx6yFmtE4si04OkBniECA+3XVYeB2U+kTIs
+
aEsnW5X4yl1X/+ZBKSUdR/h87IO679xuwn6dgxbkkQSYKbiSPXXv9KMxj4rc9O7D
+
PcCvl2PFHjp2x2K0EqAeOmAleSVaCoCkimKF1lLg3Wv6YMeFmbdQMPfycLLFtB6A
+
AljWA8MgRYdhKBmx7fX9iVnnslHgEFjjYp9tlHAORFEcxt5qoldlJcz65IqpkDCk
+
lnFFV1Ve3jAGl/OKJ9DH7PjHtYBrYfR3wTtEYIoTRtLqsrRjVvkDYUKHsaqNwv8C
+
8Um91XpIyYkhxPWzwU5Btd99N+dG2dpCVd8Qe2oNjotOsHHjmZGIQOCr6i3kDEVZ
+
KMSDD27fE1SWIGvvwmLefW5Z4rE1MTqZqKx+qMjd2LRZwXls3DgBfSrNRjGW7s3u
+
bnV3t4Cp+iwmXJjpGm+mLeeaO/TdPEfcT6++rzuDvFABmG46ZogVDd1bkuI4Ls0D
+
N0sMNUSYc1qKXIjYyMskQwmc4yhFPFwnRaHrLuNq9c0oLu/Wwq9S53J7EdnA+ZQ0
+
RYx3BzQwOdzqDc9gZIHwJ30pBa0CxXOWyYNk/zg4v0rr/F7PCkgpHJO+CrtYTxuf
+
6cJJJJ2fcxNzofRwZyPIX1k5IFqzIcr+Tv1GXgIO5CU
+
-> ssh-ed25519 wpmdHA bf+e7LA2JpY4ln+kWFhL69zcIIoVVyiK+XeLZhukowg
+
HAG4AS/CScv8dbnskAE3ibxNuPwtoNAeF78HbabawFg
+
--- d+QudebUDJm/84Gb2yn3lZLzCZpbBz39AqYhGRIvx5w
+
�"���_�*� L�S���!o�R
+
{���� ˳��d��8�p˃O���4��"��Ӊ�
+20
hosts/prefect/secrets/stalwart-fallback-admin-pw.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 LcWOqQ 7togPtzcJXZIAe+97CEtOpKYvKcXdMPZN1ZXaDtiF2M
+
bx4Slxv+LPXPTyjRbl/1fme4nEO2aY9pF6J5ww7k2gQ
+
-> ssh-rsa fFaiTA
+
I9AeATPIo5M+Tqd0lbLs37jGa/I/m6C56/vVdVd2r2kH8FobbhFXkypmBfZjleNB
+
FqP4Jn12IAWACTY9LEoSrhaeABpdZAUE6Vt+hqYDOc8UL5WuTekVUCW+Sw2EJbnl
+
oyBBcTRSuSd3OEO3Q4hp5SmHiGUkL7eDfEdXMXe7fnYEIfJoYu6Op1bLoTK7Tiuz
+
g5c7a9kgxcD73ynfeRz0kQM/AXbEXrtu0Wr7CH9ZWWmCkkhcpNnS7CRtTb5Qhk4L
+
oTVn+Rs6Mgv395pmV0Ou3fqkys3+t7PdO+tHDtlMNqORn3KaQuPLAWjgBCG1408T
+
iGpbkqdoGb3VpBUfw/dWISPrDZsJGcLOFULHX76JKIGQXV/UG8zNlS5lddo7zY7T
+
mh8tBqZrj9MWOwkG0nDDV87sEFOqFfj4gclEF5GRE55Sypog6oRZLTVjvH636E+2
+
mztdPJyhUzMtvhQQfvftG+AwxhNGt4SRdMd7O+QeYSWmqykTlZx7nF73BBeYP0JC
+
xSmVsdxuS3aur2HcogCSICo2+jGGoP33FOYnpzVY/Y67B4tunfL1ItfmbGeKVwG0
+
f9sm6meYvRw9JvAdBcqFILOxPvg/P2VARaf5fDpZP6MmRTWkl9FH2J1Wp9m7ZMi3
+
m8RAfpH7l5U/vVcbLYUaL5w0e4cNeHBQSbn/AhqCeFQ
+
-> ssh-ed25519 wpmdHA rPRuQwrporOZbD6kpZwGZbZoEYNvG7E+t1zDolmwmzE
+
CtTiaRwa+S+vn1wrUjkZWatUkLcvXVPQDbsvtwdT7X4
+
--- xDaJBT4M3JZNN0aABAp9QnPw7rsl/D9/SRIz0aHEGRE
+
��?�%*�N��������"h#_E��:c&��f�d�r��
+
���J<Ci����X��g�;�ҏ� f�\^����Y�q�+��S�{ =܀a� �L�ն�������Vt�n�����EXu�hݿZ0�׎�����u��+ޖ���
hosts/prefect/secrets/stalwart-secret-ed25519.age

This is a binary file and will not be displayed.

hosts/prefect/secrets/stalwart-secret-rsa.age

This is a binary file and will not be displayed.

+19
hosts/prefect/secrets/wireguard-priv-key.age
···
+
age-encryption.org/v1
+
-> ssh-ed25519 LcWOqQ BTHdUq7iDGg8yOCg1pEWJS/eoz3xpLDuxhDEMPwoDXg
+
AMzM5h6v1fBKP1AwKuzTztmlSDhzs03z9XF0zWJEh0M
+
-> ssh-rsa fFaiTA
+
mgOVWNlEMvC0gJPDlTu+hHRzwUM4g7tI0a3R5+ta6SHvRPA0hWmvMZTv3xAwBep+
+
eKv/OWBizVdCV8EGnWx+GPIZ7yOWTp0SeXhMoZGDZaxZN3TAH2ZE1G80GUSlw1Xa
+
+tRp0ct0VFj3kgcc8TK+csVXXdkQKkY7IPv6dTUktxlsNvcL8NtpIOU91w5lRfKz
+
9A1CMtMv0rYUuw7tlim4QKqxhR39d7ZWlOH0h/EKwuHosNOqotmYgDLnGfMcbksU
+
nu4tvHI3aTc/BUbJEkR0Kh9v7i3E05wv5JquSqTmtixbyLbHnA7KvXgqhETyGMr4
+
OJKB6lMJzhEyzNtb4wfe3TRmf2qT8ps7lDA4a2836b2dCnd7oBVYByCgLK74zXzn
+
1TMIdStHNK/G7q3VBw7XmRbHZvu/OTiYz54KVWvT3MAHz2UmlFdOXNWm8HqCqkkQ
+
6JdRZ/PCwWpXrrlC5A5s1FICOjTbtL4KbiMfSOGq5LdoZ7m2txl6gUXuvwB51Tdy
+
lc9ry4IGAvs0XXOaKXR+5zy/+s2JwfRbTS1AzRrthDx0VhDp+WhsjW60A3RVG3Gz
+
3fTuTNUBqBWEoVWtdFRL2JeJL7znmfSJFjjpkOGB9KcMz3ioYp30Pjt4m8bM1UhT
+
zuCHYb8jkX8CSgkp0EbPBQ3OORt8NGx6mVqiuWQjJmI
+
-> ssh-ed25519 wpmdHA u5AgCOwHFFFWdH2Tw0duMd07wLEoa8kc2hFrC/i8pFQ
+
1tq9YV8UTXwxt7XQ9xMTBr9Hn9VWMvsyQ8BJImx+VZk
+
--- ZEQB6NqhPqOHbdiwnzdRNi8WNd5+tP/78Lub739rbOg
+
��sr�R�[��V�㹒U������g%l�$�,ⵖ���C������ ��l3`ˆ���J&��p=���C`
+33
hosts/prefect/services/acme.nix
···
+
{ config, ... }:
+
{
+
security.acme = {
+
acceptTerms = true;
+
certs."pyroxdev-mail" = {
+
domain = "mail.pyrox.dev";
+
extraDomainNames = [
+
"dav.pyrox.dev"
+
"mta-sts.pyrox.dev"
+
"autoconfig.pyrox.dev"
+
"autodiscover.pyrox.dev"
+
];
+
reloadServices = [ "stalwart-mail" ];
+
};
+
defaults = {
+
# LE Production Server
+
server = "https://acme-v02.api.letsencrypt.org/directory";
+
email = "pyrox@pyrox.dev";
+
# For DNS Challenges, use DeSec(my provider)
+
dnsProvider = "desec";
+
# Enable DNS Propagation checks(ensure DNS records exist before requesting certs)
+
dnsPropagationCheck = true;
+
dnsResolver = "9.9.9.9:53";
+
# Agenix-encrypted credentials for ACME
+
credentialsFile = config.age.secrets.acme-creds.path;
+
};
+
};
+
age.secrets.acme-creds = {
+
file = ../secrets/acme-creds.age;
+
owner = "acme";
+
group = "acme";
+
};
+
}
+374
hosts/prefect/services/caddy.nix
···
+
{ pkgs, self, ... }:
+
let
+
pns = self.lib.data.services;
+
inherit (self.lib.data) mail;
+
marvin = "http://${self.lib.data.hosts.marvin.ts.ip4}";
+
marvinIP = self.lib.data.hosts.marvin.ts.ip4;
+
inherit (self.lib.data) tsNet;
+
in
+
{
+
services.caddy = {
+
enable = true;
+
package = pkgs.caddy.withPlugins {
+
plugins = [
+
"github.com/caddy-dns/desec@v1.0.1"
+
"github.com/greenpau/caddy-security@v1.1.31"
+
"github.com/tailscale/caddy-tailscale@v0.0.0-20251016213337-01d084e119cb"
+
"github.com/mholt/caddy-l4@v0.0.0-20251001194302-2e3e6cf60b25"
+
"github.com/mohammed90/caddy-git-fs@v0.0.0-20240805164056-529acecd1830"
+
];
+
hash = "sha256-kvChIK67UKn5vMFMcLszSl5AfW1BNHTRm1aXX5t5Wyc=";
+
};
+
email = "pyrox@pyrox.dev";
+
virtualHosts = {
+
"mail.pyrox.dev" = { };
+
# Redirect old domains -> pyrox.dev
+
"blog.pyrox.dev" = {
+
serverAliases = [
+
"www.pyrox.dev"
+
"thehedgehog.me"
+
];
+
extraConfig = ''
+
redir https://pyrox.dev{uri} permanent
+
'';
+
};
+
"pyrox.dev" = {
+
extraConfig = ''
+
route {
+
header /.well-known/matrix/* Access-Control-Allow-Origin *
+
reverse_proxy /.well-known/matrix/* http://100.123.15.72:6922
+
redir /.well-known/carddav https://cloud.pyrox.dev/.well-known/carddav temporary
+
redir /.well-known/caldav https://cloud.pyrox.dev/.well-known/caldav temporary
+
header /.well-known/openpgpkey/* Access-Control-Allow-Origin *
+
header /.well-known/openpgpkey/hu/* application/octet-stream
+
respond /.well-known/openpgpkey/*/policy 200
+
header /.well-known/fursona Content-Type application/json
+
header {
+
X-Content-Type-Options nosniff
+
Permissions-Policy accelerometer=(), autoplay=(), camera=(), cross-origin-isolated=(), unload=(),
+
+Permissions-Policy display-capture=(), encrypted-media=(), fullscreen=(), geolocation=(),
+
+Permissions-Policy gyroscope=(), keyboard-map=(), magnetometer=(), microphone=(), midi=(),
+
+Permissions-Policy payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(),
+
+Permissions-Policy sync-xhr=(self), usb=(), web-share=(), xr-spatial-tracking=(), clipboard-read=(),
+
+Permissions-Policy clipboard-write=(), gamepad=(), hid=(), idle-detection=(), interest-cohort=(), serial=()
+
X-Frame-Options SAMEORIGIN
+
Referrer-Policy origin
+
-Server
+
}
+
file_server {
+
fs blog-repo
+
hide .git
+
precompressed br gzip
+
}
+
}
+
'';
+
};
+
+
# Authentication
+
${pns.pocket-id.extUrl} = {
+
extraConfig = ''
+
reverse_proxy ${marvin}:${toString pns.pocket-id.port}
+
'';
+
};
+
+
# Vaultwarden
+
${pns.vaultwarden.extUrl} = {
+
extraConfig = ''
+
header / {
+
Strict-Transport-Security "max-age=31536000;"
+
X-XSS-Protection "0"
+
X-Frame-Options "DENY"
+
X-Robots-Tag "noindex, nofollow"
+
X-Content-Type-Options "nosniff"
+
-Server
+
-X-Powered-By
+
-Last-Modified
+
}
+
reverse_proxy ${marvin}:${toString pns.vaultwarden.anubis} {
+
header_up X-Real-IP {remote_host}
+
header_up X-Http-Version {http.request.proto}
+
}
+
'';
+
};
+
+
# Cinny + Conduit
+
${pns.matrix-server.extUrl} = {
+
extraConfig = ''
+
handle /_matrix/* {
+
reverse_proxy ${marvin}:${toString pns.matrix-server.port}
+
}
+
handle {
+
root * /var/www/cinny/dist/
+
try_files {path} / index.html
+
file_server
+
}
+
'';
+
};
+
# Jellyfin
+
${pns.jellyfin.extUrl} = {
+
extraConfig = ''
+
@blocked not remote_ip 100.64.0.0/10 private_ranges
+
reverse_proxy ${marvin}:${toString pns.jellyfin.port}
+
handle /metrics* {
+
respond @blocked "Access Denied" 403
+
}
+
'';
+
};
+
+
# Yourmother.website
+
"yourmother.website" = {
+
extraConfig = ''
+
header Content-Type text/html
+
respond 200 {
+
body `<!DOCTYPE html>
+
<html>
+
<head>
+
<meta http-equiv="Refresh" content="0; url=https://youtube.com/watch?v=oHg5SJYRHA0" />
+
</head>
+
</html>`
+
}
+
'';
+
};
+
+
# OpenPGP WKD stuff
+
"openpgpkey.pyrox.dev" = {
+
serverAliases = [ "openpgpkey.thehedgehog.me" ];
+
extraConfig = ''
+
respond /.well-known/openpgpkey/{labels.1}.{labels.0}/policy 200
+
header Access-Control-Allow-Origin *
+
header /.well-known/openpgpkey/{labels.1}.{labels.0}/hu/* Content-Type application/octet-stream
+
file_server {
+
fs blog-repo
+
}
+
'';
+
};
+
+
# Metrics
+
":6899" = {
+
extraConfig = ''
+
metrics /metrics
+
'';
+
};
+
# SIMPLE HOSTS
+
+
# Forgejo
+
${pns.git.extUrl} = {
+
extraConfig = ''
+
reverse_proxy ${marvin}:${toString pns.git.anubis} {
+
header_up X-Real-Ip {remote_host}
+
header_up X-Http-Version {http.request.proto}
+
}
+
'';
+
};
+
+
# Grafana
+
${pns.grafana.extUrl} = {
+
extraConfig = ''
+
reverse_proxy ${marvin}:${toString pns.grafana.anubis} {
+
header_up X-Real-Ip {remote_host}
+
header_up X-Http-Version {http.request.proto}
+
}
+
'';
+
};
+
+
# Miniflux
+
${pns.miniflux.extUrl} = {
+
extraConfig = ''
+
reverse_proxy ${marvin}:${toString pns.miniflux.anubis} {
+
header_up X-Real-Ip {remote_host}
+
header_up X-Http-Version {http.request.proto}
+
}
+
'';
+
};
+
+
# Nextcloud
+
${pns.nextcloud.extUrl} = {
+
extraConfig = ''
+
reverse_proxy ${marvin}:${toString pns.nextcloud.anubis} {
+
header_up X-Real-Ip {remote_host}
+
header_up X-Http-Version {http.request.proto}
+
}
+
'';
+
};
+
+
# Nextcloud-Office(Collabora)
+
${pns.nextcloud-office.extUrl} = {
+
extraConfig = ''
+
reverse_proxy ${marvin}:${toString pns.nextcloud-office.anubis} {
+
header_up X-Real-Ip {remote_host}
+
header_up X-Http-Version {http.request.proto}
+
}
+
'';
+
};
+
+
# Planka
+
${pns.planka.extUrl} = {
+
extraConfig = ''
+
reverse_proxy ${marvin}:${toString pns.planka.anubis} {
+
header_up X-Real-Ip {remote_host}
+
header_up X-Http-Version {http.request.proto}
+
}
+
'';
+
};
+
+
# Immich
+
${pns.immich.extUrl} = {
+
extraConfig = ''
+
@public path /share /share/*
+
handle @public {
+
reverse_proxy ${marvin}:${toString pns.immich.pubProxy}
+
}
+
reverse_proxy ${marvin}:${toString pns.immich.port}
+
'';
+
};
+
+
# Tangled Services
+
${pns.tangled-knot.extUrl} = {
+
extraConfig = ''
+
reverse_proxy ${marvin}:${toString pns.tangled-knot.port}
+
'';
+
};
+
${pns.tangled-spindle.extUrl} = {
+
extraConfig = ''
+
reverse_proxy ${marvin}:${toString pns.tangled-spindle.port}
+
'';
+
};
+
+
# Simple Tailscale Hosts
+
+
# Deemix
+
"${pns.deemix.tsHost}.${tsNet}" = {
+
extraConfig = ''
+
bind tailscale/${pns.deemix.tsHost}
+
tailscale_auth
+
reverse_proxy ${marvin}:${toString pns.deemix.port}
+
'';
+
};
+
# Pinchflat
+
"${pns.pinchflat.tsHost}.${tsNet}" = {
+
extraConfig = ''
+
bind tailscale/${pns.pinchflat.tsHost}
+
tailscale_auth
+
reverse_proxy ${marvin}:${toString pns.pinchflat.port}
+
'';
+
};
+
+
"http://mail.pyrox.dev" = {
+
serverAliases = [
+
"http://mta-sts.pyrox.dev"
+
"http://autodiscover.pyrox.dev"
+
"http://autoconfig.pyrox.dev"
+
"http://dav.pyrox.dev"
+
];
+
extraConfig = ''
+
reverse_proxy 127.0.0.1:${toString mail.intHTTP} {
+
transport http {
+
proxy_protocol v2
+
}
+
}
+
+
'';
+
};
+
};
+
# Mail Config
+
globalConfig = ''
+
filesystem blog-repo git ${marvin}:${toString pns.git.port}/pyrox/new-blog {
+
ref refs/heads/pages
+
refresh_period 10m
+
}
+
servers :80 {
+
listener_wrappers {
+
layer4 {
+
@maildomains http host mail.pyrox.dev mta-sts.pyrox.dev autoconfig.pyrox.dev autodiscover.pyrox.dev dav.pyrox.dev
+
route @maildomains {
+
subroute {
+
@a http
+
route @a {
+
proxy {
+
proxy_protocol v2
+
upstream 127.0.0.1:${toString mail.intHTTP}
+
}
+
}
+
}
+
}
+
}
+
http_redirect
+
}
+
}
+
servers :443 {
+
listener_wrappers {
+
layer4 {
+
@maildomains tls sni mail.pyrox.dev mta-sts.pyrox.dev autoconfig.pyrox.dev autodiscover.pyrox.dev dav.pyrox.dev
+
route @maildomains {
+
proxy {
+
proxy_protocol v2
+
upstream 127.0.0.1:${toString mail.intHTTPS}
+
}
+
}
+
}
+
tls
+
}
+
}
+
layer4 {
+
:22 {
+
@a ssh
+
route @a {
+
proxy {
+
upstream ${marvinIP}:2222
+
}
+
}
+
}
+
:25 {
+
route {
+
proxy {
+
proxy_protocol v2
+
upstream 127.0.0.1:40025
+
}
+
}
+
}
+
:143 {
+
route {
+
proxy {
+
proxy_protocol v2
+
upstream 127.0.0.1:${toString mail.intIMAP}
+
}
+
}
+
}
+
:465 {
+
route {
+
proxy {
+
proxy_protocol v2
+
upstream 127.0.0.1:${toString mail.intSMTPS}
+
}
+
}
+
}
+
:587 {
+
route {
+
proxy {
+
proxy_protocol v2
+
upstream 127.0.0.1:${toString mail.intSMTP}
+
}
+
}
+
}
+
:993 {
+
route {
+
proxy {
+
proxy_protocol v2
+
upstream 127.0.0.1:${toString mail.intIMAPS}
+
}
+
}
+
}
+
:4190 {
+
route {
+
proxy {
+
proxy_protocol v2
+
upstream 127.0.0.1:${toString mail.intManageSieve}
+
}
+
}
+
}
+
}
+
'';
+
};
+
systemd.services.caddy.serviceConfig.CapabilityBoundingSet = "CAP_NET_BIND_SERVICE";
+
systemd.services.caddy.serviceConfig.AmbientCapabilities = "CAP_NET_BIND_SERVICE";
+
}
+38
hosts/prefect/services/fail2ban.nix
···
+
{
+
services.fail2ban = {
+
enable = true;
+
maxretry = 5;
+
ignoreIP = [
+
"4349:3909:beef::/48"
+
"100.64.0.0/10"
+
"127.0.0.0/8"
+
"10.0.0.0/8"
+
"172.16.0.0/12"
+
"192.168.0.0/16"
+
];
+
jails = {
+
postfix = {
+
filter = "postfix";
+
settings = {
+
action = "nftables";
+
port = "143,993";
+
};
+
};
+
dovecot = {
+
filter = "dovecot";
+
settings = {
+
action = "nftables";
+
port = "25,465,587";
+
};
+
};
+
# I don't use SSHd right now, but if I do, re-enable this.
+
# sshd = {
+
# filter = "sshd";
+
# settings = {
+
# action = "nftables";
+
# port = "22";
+
# };
+
# };
+
};
+
};
+
}
+73
hosts/prefect/services/headscale.nix
···
+
# Headscale is a tailscale-compatible control plane that you can use with all of the clients.
+
{
+
services.headscale = {
+
enable = true;
+
port = 6900;
+
# Set so that anything can access this. Default is localhost only, which is useless
+
address = "0.0.0.0";
+
# Server URL is the FQDN of this server
+
serverUrl = "https://vpn.thehedgehog.me:6900";
+
dns = {
+
# All domains are .hog domains internally
+
baseDomain = "hog";
+
# Enable MagicDNS
+
# See https://tailscale.com/kb/1081/magicdns/ for more details
+
magicDns = true;
+
# I inject DNS.sb as my secondary nameserver, and my adblocking server as primary.
+
nameservers = [ "45.11.45.11" ];
+
# Domains to inject, so I can type "media/" into my search bar and go to "media.main.hog"
+
# You can't tell headscale to not create a namespace, so this is the best that I can do
+
domains = [ "main.hog" ];
+
};
+
# Automatic TLS
+
tls = {
+
letsencrypt = {
+
# Set up automatic Let's Encrypt cert pulls
+
hostname = "vpn.thehedgehog.me";
+
};
+
};
+
# Disabled since if this goes down, then it's a pain to reconnect to auth
+
# OIDC configuration, so I can have my beloved SSO.
+
# openIdConnect = {
+
# # Issuer is HedgeCloud auth, my private auth server
+
# issuer = "https://auth.thehedgehog.me/application/o/hedgevpn/";
+
# # All people get assigned to the "main" namespace
+
# domainMap = {
+
# ".*" = "main";
+
# };
+
# # Set client ID for OIDC
+
# clientId = "25066b6b1e72718186f8c0dc20f7892951834b6e";
+
# # Client Secret is in this file
+
# clientSecretFile = "/run/agenix/headscale-oidc-secret";
+
# };
+
# Misc settings that aren't set in the above sections
+
settings = {
+
# Set challenge type, forwarded by Caddy
+
tls_letsencrypt_challenge_type = "HTTP-01";
+
# oidc.strip_email_domain = true;
+
# NixOS handles our updates
+
disable_check_updates = true;
+
ip_prefixes = [
+
"4349:3909:beef::/48"
+
"100.64.0.0/10"
+
];
+
derp = {
+
server = {
+
enabled = true;
+
region_id = 969;
+
region_code = "internal";
+
region_name = "Internal DERP";
+
stun_listen_addr = "0.0.0.0:6869";
+
};
+
};
+
};
+
};
+
systemd.services.headscale.serviceConfig.CapabilityBoundingSet = [
+
"CAP_CHOWN"
+
"CAP_NET_BIND_SERVICE"
+
];
+
systemd.services.headscale.serviceConfig.AmbientCapabilities = [
+
"CAP_CHOWN"
+
"CAP_NET_BIND_SERVICE"
+
];
+
}
+21
hosts/prefect/services/mailserver/acme.nix
···
+
# ACME for certs, using TLS-ALPN-01 Challenges(one fewer ports open)
+
# https://stalw.art/docs/server/tls/acme/configuration
+
{ cfg, sec }:
+
{
+
letsencrypt = {
+
directory = "https://acme-staging-v02.api.letsencrypt.org/directory";
+
challenge = "dns-01";
+
contact = [ "pyrox@pyrox.dev" ];
+
domains = [
+
"mail.pyrox.dev"
+
"mta-sts.pyrox.dev"
+
"autoconfig.pyrox.dev"
+
"autodiscover.pyrox.dev"
+
];
+
cache = "${cfg.dataDir}/acme/certs";
+
renew-before = "30d";
+
default = true;
+
provider = "desec";
+
secret = "%{file:${sec.stalwart-desec-token.path}}%";
+
};
+
}
+21
hosts/prefect/services/mailserver/auth.nix
···
+
{ ifThen, otherwise }:
+
let
+
relVer = [
+
(ifThen "protocol = 'smtp'" "relaxed")
+
(otherwise "disable")
+
];
+
in
+
{
+
dkim = {
+
sign = [
+
(ifThen "sender_domain = 'pyrox.dev'" "['rsa', 'ed25519']")
+
(otherwise false)
+
];
+
};
+
spf.verify.ehlo = relVer;
+
spf.verify.mail-from = relVer;
+
dmarc.verify = relVer;
+
iprev.verify = relVer;
+
arc.seal = "'ed25519'";
+
arc.verify = "relaxed";
+
}
+25
hosts/prefect/services/mailserver/auto-ban.nix
···
+
# Strict Auto-ban
+
# https://stalw.art/docs/server/auto-ban
+
{
+
auth.rate = "15/1d";
+
abuse.rate = "15/1d";
+
loiter.rate = "15/1d";
+
scan = {
+
rate = "20/1d";
+
paths = [
+
"*.php*"
+
"*.cgi*"
+
"*.asp*"
+
"*/wp-*"
+
"*/php*"
+
"*/cgi-bin*"
+
"*xmlrpc*"
+
"*../*"
+
"*/..*"
+
"*joomla*"
+
"*wordpress*"
+
"*drupal*"
+
"/.git*"
+
];
+
};
+
}
+25
hosts/prefect/services/mailserver/calendar.nix
···
+
# Calendar settings
+
# https://stalw.art/docs/collaboration/calendar
+
{
+
max-recurrence-expansions = 2048;
+
# 512 KiB
+
max-size = 524288;
+
max-attendees-per-instance = 20;
+
default.href-name = "default";
+
default.display-name = "Personal";
+
# Scheduling
+
# https://stalw.art/docs/collaboration/scheduling
+
scheduling.enable = true;
+
# 1 MiB
+
scheduling.inbound.max-size = 1048576;
+
scheduling.outbound.max-recipients = 100;
+
scheduling.inbox.auto-expunge = "30d";
+
scheduling.http-rsvp.enable = true;
+
scheduling.http-rsvp.expiration = "7d";
+
# Notifications
+
# https://stalw.art/docs/collaboration/notifications
+
alarms.enable = true;
+
alarms.minimum-interval = "1h";
+
alarms.from.name = "PyroNet Calendars";
+
alarms.from.email = "calendar-notifs@pyrox.dev";
+
}
+216
hosts/prefect/services/mailserver/default.nix
···
+
{
+
config,
+
lib,
+
self,
+
...
+
}:
+
let
+
d = self.lib.data.mail;
+
cfg = config.services.stalwart-mail;
+
sec = config.age.secrets;
+
credsDir = "/run/credentials/stalwart-mail.service";
+
certDir = config.security.acme.certs."pyroxdev-mail".directory;
+
isAuthenticated = d: {
+
"if" = "!is_empty(authenticated_as)";
+
"then" = d;
+
};
+
otherwise = d: {
+
"else" = d;
+
};
+
ifThen = f: d: {
+
"if" = f;
+
"then" = d;
+
};
+
smSecret = {
+
owner = "stalwart-mail";
+
group = "stalwart-mail";
+
};
+
in
+
{
+
services.stalwart-mail = {
+
credentials = {
+
cert = "${certDir}/cert.pem";
+
key = "${certDir}/key.pem";
+
};
+
enable = true;
+
dataDir = "/var/lib/stalwart";
+
settings = {
+
tracer.stdout.level = "info";
+
authentication.fallback-admin = {
+
user = "fallback";
+
secret = "%{file:${sec.stalwart-fallback-admin-pw.path}}%";
+
};
+
config = {
+
local-keys = [
+
"asn.*"
+
"auth.*"
+
"authentication.*"
+
"auto-ban.*"
+
"calendar.*"
+
"certificate.*"
+
"changes.*"
+
"cluster.*"
+
"config.*"
+
"contacts.*"
+
"directory.*"
+
"http.*"
+
"imap.*"
+
"jmap.*"
+
"queue.*"
+
"report.*"
+
"resolver.*"
+
"server.*"
+
"session.*"
+
"signature.*"
+
"storage.*"
+
"store.*"
+
"tracer.*"
+
"webadmin.*"
+
"form.*"
+
"email.*"
+
"spam-filter.*"
+
];
+
};
+
certificate = {
+
default = {
+
default = true;
+
cert = "%{file:${credsDir}/cert}%";
+
private-key = "%{file:${credsDir}/key}%";
+
subjects = [
+
"dav.pyrox.dev"
+
"mail.pyrox.dev"
+
"mta-sts.pyrox.dev"
+
"autoconfig.pyrox.dev"
+
"autodiscover.pyrox.dev"
+
];
+
};
+
};
+
server = import ./server.nix { inherit d; };
+
# Use NixOS-generated certs now, since stalwart can't do it on its own
+
# (DeSec API Errors abound)
+
# acme = import ./acme.nix { inherit cfg sec; };
+
# HTTP Configuration
+
# https://stalw.art/docs/http/overview
+
http = {
+
url = "'https://${d.extUrl}'";
+
hsts = true;
+
rate-limit = {
+
account = "10000/1m";
+
};
+
};
+
# Disable HTTP Forms submission
+
# https://stalw.art/docs/http/form-submission
+
form.enable = false;
+
# DKIM Signatures
+
signature = import ./signature.nix { inherit sec; };
+
# Storage Settings
+
# https://stalw.art/docs/storage/overview
+
store = {
+
data = {
+
type = "rocksdb";
+
path = "${cfg.dataDir}/db";
+
purge.frequency = "0 3 *";
+
};
+
blob = {
+
type = "fs";
+
path = "${cfg.dataDir}/blobs";
+
depth = 2;
+
compression = "lz4";
+
purge.frequency = "0 4 *";
+
};
+
db.path = "${cfg.dataDir}/db2";
+
};
+
storage = {
+
data = "data";
+
blob = "blob";
+
fts = "data";
+
lookup = "data";
+
directory = "default";
+
};
+
directory = {
+
default = {
+
type = "internal";
+
store = "data";
+
};
+
};
+
# ASN/GeoIP Lookups
+
# https://stalw.art/docs/server/asn
+
asn = {
+
type = "dns";
+
separator = "|";
+
zone.ipv4 = "origin.asn.cymru.com";
+
zone.ipv6 = "origin6.asn.cymru.com";
+
index.asn = 0;
+
index.asn-name = 1;
+
index.country = 2;
+
};
+
auto-ban = import ./auto-ban.nix;
+
# JMAP Settings
+
# https://stalw.art/docs/email/jmap
+
jmap = {
+
mailbox.max-depth = 10;
+
mailbox.max-name-length = 255;
+
# 50 MB
+
email.max-attachment-size = 50 * 1000 * 1000;
+
# 75 MB
+
email.max-size = 75 * 1000 * 1000;
+
email.parse.max-items = 10;
+
};
+
imap = import ./imap.nix;
+
# Maintainance
+
# https://stalw.art/docs/email/maintenance
+
email.auto-expunge = "180d";
+
changes.max-history = 10000;
+
session = import ./session.nix { inherit isAuthenticated otherwise ifThen; };
+
queue = import ./queue.nix { inherit d ifThen otherwise; };
+
# DNS Settings
+
# https://stalw.art/docs/mta/outbound/dns
+
resolver = {
+
custom = [
+
"tls://dns11.quad9.net"
+
"tcp://1.1.1.1"
+
];
+
concurrency = 2;
+
preserve-intermediates = true;
+
timeout = "5s";
+
attempts = 3;
+
edns = true;
+
};
+
report = import ./report.nix { inherit d; };
+
calendar = import ./calendar.nix;
+
# Authentication
+
auth = import ./auth.nix { inherit ifThen otherwise; };
+
# Contacts
+
# https://stalw.art/docs/collaboration/contact
+
contacts = {
+
# 512 KiB
+
max-size = 524288;
+
default.href-name = "default";
+
default.display-name = "Contacts";
+
};
+
# Spam Filtering
+
# https://stalw.art/docs/spamfilter/overview
+
spam-filter = {
+
card-is-ham = true;
+
};
+
};
+
};
+
systemd.services.stalwart-mail.serviceConfig = {
+
Restart = lib.mkForce "always";
+
RestartSec = lib.mkForce 1;
+
};
+
age.secrets = {
+
stalwart-secret-rsa = smSecret // {
+
file = ../../secrets/stalwart-secret-rsa.age;
+
};
+
stalwart-secret-ed25519 = smSecret // {
+
file = ../../secrets/stalwart-secret-ed25519.age;
+
};
+
stalwart-desec-token = smSecret // {
+
file = ../../secrets/stalwart-desec-token.age;
+
};
+
stalwart-fallback-admin-pw = smSecret // {
+
file = ../../secrets/stalwart-fallback-admin-pw.age;
+
};
+
};
+
}
+42
hosts/prefect/services/mailserver/imap.nix
···
+
# https://stalw.art/docs/email/imap
+
{
+
# 50 MiB
+
request.max-size = 52428800;
+
auth.max-failures = 3;
+
auth.allow-plain-text = false;
+
folders =
+
let
+
folder = {
+
create = true;
+
subscribe = true;
+
};
+
in
+
{
+
inbox = folder // {
+
name = "Inbox";
+
};
+
drafts = folder // {
+
name = "Drafts";
+
};
+
sent = folder // {
+
name = "Sent";
+
};
+
trash = folder // {
+
name = "Trash";
+
};
+
archive = folder // {
+
name = "Archive";
+
};
+
junk = folder // {
+
name = "Junk";
+
};
+
shared = {
+
name = "Shared Folders";
+
create = true;
+
subscribe = false;
+
};
+
};
+
timeout.authenticated = "30m";
+
timeout.anonymous = "1m";
+
timeout.idle = "30m";
+
}
+97
hosts/prefect/services/mailserver/queue.nix
···
+
{
+
d,
+
ifThen,
+
otherwise,
+
}:
+
# Queue Management
+
# https://stalw.art/docs/mta/outbound/overview
+
{
+
# Virtual Queues
+
# https://stalw.art/docs/mta/outbound/queue
+
virtual.default.threads-per-node = 100;
+
virtual.admin.threads-per-node = 10;
+
virtual.local.threads-per-node = 100;
+
# Schedules
+
# https://stalw.art/docs/mta/outbound/schedule
+
schedule =
+
let
+
queue = {
+
retry = [
+
"1m"
+
"2m"
+
"5m"
+
"10m"
+
"15m"
+
"30m"
+
"1h"
+
"2h"
+
];
+
notify = [
+
"1d"
+
"3d"
+
];
+
max-attempts = 15;
+
};
+
in
+
{
+
default = queue // {
+
queue-name = "default";
+
};
+
admin = queue // {
+
queue-name = "admin";
+
};
+
local = queue // {
+
queue-name = "local";
+
};
+
};
+
# Routes
+
# https://stalw.art/docs/mta/outbound/routing
+
route = {
+
local.type = "local";
+
remote = {
+
type = "mx";
+
ip-lookup = "ipv6_then_ipv4";
+
tls.implicit = false;
+
tls.allow-invalid-certs = false;
+
};
+
};
+
# Strategies
+
# https://stalw.art/docs/mta/outbound/strategy
+
strategy = {
+
schedule = [
+
(ifThen "is_local_domain('', rcpt_domain)" "'local'")
+
(ifThen "source = 'dsn'" "'admin'")
+
(ifThen "source = 'report'" "'admin'")
+
(ifThen "source = 'autogenerated'" "'admin'")
+
(otherwise "'default'")
+
];
+
route = [
+
(ifThen "is_local_domain('', rcpt_domain)" "'local'")
+
(otherwise "'remote'")
+
];
+
connection = "'default'";
+
tls = "'default'";
+
};
+
# Remote Connection
+
# https://stalw.art/docs/mta/outbound/connection
+
connection.default = {
+
ehlo-hostname = d.extUrl;
+
source-ips = d.extIPs;
+
timeout = {
+
connect = "3m";
+
greeting = "3m";
+
ehlo = "3m";
+
mail-from = "3m";
+
rcpt-to = "3m";
+
data = "10m";
+
};
+
};
+
tls.default = {
+
dane = "optional";
+
mta-sts = "optional";
+
starttls = "optional";
+
allow-invalid-certs = false;
+
timeout.tls = "3m";
+
timeout.mta-sts = "3m";
+
};
+
}
+64
hosts/prefect/services/mailserver/report.nix
···
+
{ d }:
+
# Reports
+
# https://stalw.art/docs/mta/reports/overview
+
{
+
domain = "pyrox.dev";
+
submitter = "'${d.extUrl}'";
+
analysis = {
+
addresses = [
+
"dmarc@"
+
"reports@"
+
"spf@"
+
"dkim@"
+
"abuse@"
+
];
+
forward = true;
+
store = "30d";
+
};
+
dsn = {
+
from-name = "'PyroNet Mail'";
+
from-address = "'mail@pyrox.dev'";
+
sign = "['rsa', 'ed25519']";
+
};
+
dkim = {
+
from-name = "'PyroNet Mail Reports'";
+
from-address = "'noreply-dkim@pyrox.dev'";
+
subject = "'DKIM Authentication Failure Report'";
+
sign = "['rsa', 'ed25519']";
+
send = "1/1d";
+
};
+
spf = {
+
from-name = "'PyroNet Mail Reports'";
+
from-address = "'noreply-spf@pyrox.dev'";
+
subject = "'SPF Authentication Failure Report'";
+
sign = "['rsa', 'ed25519']";
+
send = "1/1d";
+
};
+
dmarc = {
+
from-name = "'PyroNet Mail Reports'";
+
from-address = "'noreply-dmarc@pyrox.dev'";
+
subject = "'DMARC Authentication Failure Report'";
+
sign = "['rsa', 'ed25519']";
+
send = "1/1d";
+
aggregate = {
+
from-name = "'DMARC Report'";
+
from-address = "'noreply-dmarc@pyrox.dev'";
+
org-name = "'PyroNet Mail'";
+
contact-info = "'pyrox@pyrox.dev'";
+
send = "daily";
+
# 25 MiB
+
max-size = 26214400;
+
sign = "['rsa', 'ed25519']";
+
};
+
};
+
tls.aggregate = {
+
from-name = "'PyroNet Mail Reports'";
+
from-address = "'noreply-tls@pyrox.dev'";
+
org-name = "'PyroNet Mail'";
+
contact-info = "'pyrox@pyrox.dev'";
+
send = "daily";
+
# 25 MiB
+
max-size = 26214400;
+
sign = "['rsa', 'ed25519']";
+
};
+
}
+69
hosts/prefect/services/mailserver/server.nix
···
+
{ d }:
+
{
+
hostname = d.extUrl;
+
# TLS
+
# https://stalw.art/docs/server/tls/overview
+
tls = {
+
enable = true;
+
implicit = false;
+
ignore-client-order = true;
+
};
+
# Listeners
+
# https://stalw.art/docs/server/listener
+
listener = {
+
smtp = {
+
bind = [
+
"[::]:${toString d.intSMTP}"
+
"[::]:40025"
+
];
+
protocol = "smtp";
+
# Explicit TLS
+
tls.implicit = false;
+
};
+
smtps = {
+
bind = "[::]:${toString d.intSMTPS}";
+
protocol = "smtp";
+
# Implicit TLS
+
tls.implicit = true;
+
};
+
imap = {
+
bind = "[::]:${toString d.intIMAP}";
+
protocol = "imap";
+
# Explicit TLS
+
tls.implicit = false;
+
};
+
imaps = {
+
bind = "[::]:${toString d.intIMAPS}";
+
protocol = "imap";
+
# Implicit TLS
+
tls.implicit = true;
+
};
+
managesieve = {
+
bind = "[::]:${toString d.intManageSieve}";
+
protocol = "managesieve";
+
# Explicit TLS
+
tls.implicit = false;
+
};
+
https = {
+
bind = "[::]:${toString d.intHTTPS}";
+
protocol = "http";
+
# Implicit TLS
+
tls.implicit = true;
+
};
+
http = {
+
bind = "[::]:${toString d.intHTTP}";
+
protocol = "http";
+
# Implicit TLS
+
tls.implicit = false;
+
};
+
};
+
# Proxy Protocol from Caddy
+
# Only accepts proxy protocol from Tailscale IP Ranges
+
# https://tailscale.com/kb/1015/100.x-addresses
+
# https://tailscale.com/kb/1033/ip-and-dns-addresses
+
proxy.trusted-networks = [
+
"fd7a:115c:a1e0::/48"
+
"100.64.0.0/10"
+
"127.0.0.1/8"
+
];
+
}
+63
hosts/prefect/services/mailserver/session.nix
···
+
{
+
isAuthenticated,
+
otherwise,
+
ifThen,
+
}:
+
# MTA Settings
+
# https://stalw.art/docs/mta/overview
+
{
+
# Inbound
+
# https://stalw.art/docs/mta/inbound/overview
+
# # EHLO Stage
+
# # https://stalw.art/docs/mta/inbound/ehlo
+
ehlo = {
+
require = true;
+
reject-non-fqdn = [
+
(ifThen "protocol = 'smtp'" true)
+
(otherwise false)
+
];
+
};
+
# # RCPT Stage
+
# # https://stalw.art/docs/mta/inbound/rcpt
+
rcpt = {
+
relay = [
+
(isAuthenticated true)
+
(otherwise false)
+
];
+
subaddressing = true;
+
};
+
auth = {
+
mechanisms = [
+
(ifThen "local_port != 40025 && is_tls" "[plain, login, oauthbearer, xoauth2]")
+
(ifThen "local_port != 40025" "[oauthbearer, xoauth2]")
+
(otherwise false)
+
];
+
directory = "'default'";
+
require = [
+
(ifThen "local_port != 40025" true)
+
(otherwise false)
+
];
+
must-match-sender = true;
+
};
+
extensions =
+
let
+
ifAuthed = [
+
(isAuthenticated true)
+
(otherwise false)
+
];
+
in
+
{
+
pipelining = true;
+
chunking = true;
+
requiretls = true;
+
no-soliciting = "";
+
dsn = ifAuthed;
+
deliver-by = [
+
(isAuthenticated "15d")
+
(otherwise false)
+
];
+
mt-priority = false;
+
vrfy = ifAuthed;
+
expn = ifAuthed;
+
};
+
}
+42
hosts/prefect/services/mailserver/signature.nix
···
+
{ sec }:
+
let
+
headers = [
+
"From"
+
"To"
+
"Cc"
+
"Date"
+
"Subject"
+
"Message-ID"
+
"Organization"
+
"MIME-Version"
+
"Content-Type"
+
"In-Reply-To"
+
"References"
+
"List-Id"
+
"User-Agent"
+
"Thread-Topic"
+
"Thread-Index"
+
];
+
in
+
{
+
rsa = {
+
inherit headers;
+
private-key = "%{file:${sec.stalwart-secret-rsa.path}}%";
+
domain = "pyrox.dev";
+
selector = "rsa-default";
+
algorithm = "rsa-sha256";
+
canonicalization = "relaxed/relaxed";
+
expire = "10d";
+
report = true;
+
};
+
ed25519 = {
+
inherit headers;
+
private-key = "%{file:${sec.stalwart-secret-ed25519.path}}%";
+
domain = "pyrox.dev";
+
selector = "default";
+
algorithm = "ed25519-sha256";
+
canonicalization = "relaxed/relaxed";
+
expire = "10d";
+
report = true;
+
};
+
}
+158
hosts/prefect/services/named.conf
···
+
include "/etc/bind/rndc.key";
+
controls {
+
inet 127.0.0.1 allow {localhost;} keys {"rndc-key";};
+
};
+
+
acl cachenetworks { 127.0.0.0/24; };
+
acl dn42-dns { 172.20.129.2; 172.20.1.255; 172.22.76.110; 172.20.14.33; };
+
+
options {
+
directory "/run/named";
+
pid-file "/run/named/named.pid";
+
+
# Server Identity
+
version "420.69";
+
server-id "zaphod";
+
hostname "zaphod";
+
+
# Enable DNSSEC
+
dnssec-validation no;
+
+
# Only listen to local addresses
+
listen-on { 127.0.0.1; };
+
listen-on-v6 { ::1; };
+
allow-query { any; };
+
# disable the integrated handling of RFC1918 and non-assigned IPv6 space reverse dns
+
empty-zones-enable no;
+
validate-except {
+
# DN42 Zones
+
"dn42";
+
"20.172.in-addr.arpa";
+
"21.172.in-addr.arpa";
+
"22.172.in-addr.arpa";
+
"23.172.in-addr.arpa";
+
"10.in-addr.arpa";
+
"d.f.ip6.arpa";
+
# ChaosVPN Zones
+
"hack";
+
"31.172.in-addr.arpa";
+
"100.10.in-addr.arpa";
+
"101.10.in-addr.arpa";
+
"102.10.in-addr.arpa";
+
"103.10.in-addr.arpa";
+
+
# NeoNetwork Zones
+
"neo";
+
"127.10.in-addr.arpa";
+
"7.2.1.0.0.1.d.f.ip6.arpa";
+
};
+
+
# Recursion settings
+
recursion yes;
+
allow-recursion { any; };
+
allow-recursion-on { any; };
+
allow-query-cache { any; };
+
allow-query-cache-on { any; };
+
prefetch 10;
+
};
+
+
# DN42 Zones
+
zone "dn42" {
+
type forward;
+
forward only;
+
forwarders { 172.20.0.53; 172.23.0.53; };
+
};
+
zone "20.172.in-addr.arpa" {
+
type forward;
+
forward only;
+
forwarders { 172.20.0.53; 172.23.0.53; };
+
};
+
zone "21.172.in-addr.arpa" {
+
type forward;
+
forward only;
+
forwarders { 172.20.0.53; 172.23.0.53; };
+
};
+
zone "22.172.in-addr.arpa" {
+
type forward;
+
forward only;
+
forwarders { 172.20.0.53; 172.23.0.53; };
+
};
+
zone "23.172.in-addr.arpa" {
+
type forward;
+
forward only;
+
forwarders { 172.20.0.53; 172.23.0.53; };
+
};
+
zone "10.in-addr.arpa" {
+
type forward;
+
forward only;
+
forwarders { 172.20.0.53; 172.23.0.53; };
+
};
+
zone "d.f.ip6.arpa" {
+
type forward;
+
forward only;
+
forwarders { 172.20.0.53; 172.23.0.53; };
+
};
+
+
# ChaosVPN Zones
+
zone "hack" {
+
type forward;
+
forward only;
+
forwarders { 172.31.0.5; 172.31.255.53; };
+
};
+
zone "31.172.in-addr.arpa" {
+
type forward;
+
forward only;
+
forwarders { 172.31.0.5; 172.31.255.53; };
+
};
+
zone "100.10.in-addr.arpa" {
+
type forward;
+
forward only;
+
forwarders { 172.31.0.5; 172.31.255.53; };
+
};
+
zone "101.10.in-addr.arpa" {
+
type forward;
+
forward only;
+
forwarders { 172.31.0.5; 172.31.255.53; };
+
};
+
zone "102.10.in-addr.arpa" {
+
type forward;
+
forward only;
+
forwarders { 172.31.0.5; 172.31.255.53; };
+
};
+
zone "103.10.in-addr.arpa" {
+
type forward;
+
forward only;
+
forwarders { 172.31.0.5; 172.31.255.53; };
+
};
+
+
# NeoNetwork
+
zone "neo" {
+
type forward;
+
forward only;
+
forwarders { 10.127.255.53; };
+
};
+
zone "127.10.in-addr.arpa" {
+
type forward;
+
forward only;
+
forwarders { 10.127.255.53; };
+
};
+
zone "7.2.1.0.0.1.d.f.ip6.arpa" {
+
type forward;
+
forward only;
+
forwarders { 10.127.255.53; };
+
};
+
+
zone "crxn" {
+
type forward;
+
forward only;
+
forwarders { fd92:58b6:2b2::5353; };
+
};
+
# Fallback root zone
+
zone "." {
+
type forward;
+
forward only;
+
forwarders { 100.123.15.72; 9.9.9.9; };
+
};
+
+
+
+37
hosts/prefect/services/prometheus.nix
···
+
{ config, ... }:
+
{
+
services.prometheus = {
+
enable = true;
+
port = 6999;
+
exporters = {
+
node = {
+
enable = true;
+
enabledCollectors = [ "systemd" ];
+
port = 6998;
+
};
+
bird = {
+
enable = true;
+
};
+
};
+
scrapeConfigs = [
+
{
+
job_name = "prefect";
+
static_configs = [
+
{ targets = [ "127.0.0.1:${toString config.services.prometheus.exporters.node.port}" ]; }
+
];
+
}
+
{
+
job_name = "caddy";
+
static_configs = [ { targets = [ "127.0.0.1:6899" ]; } ];
+
}
+
{
+
job_name = "bird";
+
static_configs = [ { targets = [ "127.0.0.1:9324" ]; } ];
+
}
+
{
+
job_name = "prometheus";
+
static_configs = [ { targets = [ "127.0.0.1:6999" ]; } ];
+
}
+
];
+
};
+
}
+22
hosts/prefect/services/secrets.nix
···
+
{
+
config.age.secrets = {
+
# headscale-oidc-secret = {
+
# file = ../secrets/headscale-oidc-secret.age;
+
# path = "/run/agenix/headscale-oidc-secret";
+
# owner = "headscale";
+
# group = "headscale";
+
# };
+
dn42-privkey = {
+
file = ../secrets/dn42-privkey.age;
+
path = "/run/agenix/dn42-privkey";
+
};
+
dn42-peerfinder-uuid = {
+
file = ../secrets/dn42-peerfinder-uuid.age;
+
path = "/run/agenix/dn42-peerfinder-uuid";
+
};
+
wireguard-priv-key = {
+
file = ../secrets/wireguard-priv-key.age;
+
path = "/run/agenix/wireguard-priv-key";
+
};
+
};
+
}
+10
hosts/prefect/services/tailscale.nix
···
+
{ config, ... }:
+
{
+
services.tailscale = {
+
enable = true;
+
};
+
networking.firewall = {
+
trustedInterfaces = [ "tailscale0" ];
+
allowedUDPPorts = [ config.services.tailscale.port ];
+
};
+
}
+39
hosts/thought/bootloader.nix
···
+
{ pkgs, modulesPath, ... }:
+
let
+
fileSystems = {
+
btrfs = true;
+
ext4 = true;
+
vfat = true;
+
};
+
in
+
{
+
imports = [ (modulesPath + "/profiles/qemu-guest.nix") ];
+
boot = {
+
loader = {
+
grub.device = "/dev/sda";
+
grub.enable = true;
+
};
+
initrd = {
+
availableKernelModules = [
+
"ata_piix"
+
"uhci_hcd"
+
"xen_blkfront"
+
"ahci"
+
"xhci_pci"
+
"virtio_pci"
+
"sd_mod"
+
"sr_mod"
+
];
+
kernelModules = [ "nvme" ];
+
supportedFilesystems = fileSystems;
+
};
+
supportedFilesystems = fileSystems;
+
kernelPackages = pkgs.linuxPackages_latest;
+
kernel.sysctl = {
+
"net.ipv4.ip_forward" = 1;
+
"net.ipv6.conf.all.forwarding" = 1;
+
"net.ipv4.conf.default.rp_filter" = 0;
+
"net.ipv4.conf.all.rp_filter" = 0;
+
};
+
};
+
}
+35
hosts/thought/default.nix
···
+
{ pkgs, system, ... }:
+
{
+
imports = [
+
# Machine-specific configurations.
+
./bootloader.nix
+
./firewall.nix
+
./networking.nix
+
./hardware.nix
+
./packages.nix
+
+
# Running Services
+
./services/prometheus.nix
+
./services/tailscale.nix
+
];
+
nixpkgs.hostPlatform.system = system;
+
py = {
+
profiles.server.enable = true;
+
users.default.enable = true;
+
programs = {
+
fish.enable = true;
+
neovim.enable = true;
+
};
+
};
+
fileSystems = {
+
"/" = {
+
fsType = "ext4";
+
device = "/dev/sda1";
+
};
+
};
+
+
programs.fish.enable = true;
+
programs.fish.interactiveShellInit = ''
+
${pkgs.direnv}/bin/direnv hook fish | source
+
'';
+
}
+25
hosts/thought/disks.nix
···
+
{
+
disko.devices.disk = {
+
main = {
+
type = "disk";
+
device = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_33656227";
+
content = {
+
type = "gpt";
+
partitions = {
+
boot = {
+
size = "1M";
+
type = "EF02";
+
};
+
root = {
+
size = "100%";
+
content = {
+
type = "filesystem";
+
format = "btrfs";
+
mountpoint = "/";
+
};
+
};
+
};
+
};
+
};
+
};
+
}
+46
hosts/thought/firewall.nix
···
+
{
+
networking.firewall = {
+
enable = true;
+
allowedTCPPorts = [ 8000 ];
+
allowedUDPPorts = [ 34197 ];
+
};
+
services.ferm = {
+
enable = true;
+
config = ''
+
domain ip table filter chain INPUT proto icmp ACCEPT;
+
domain ip6 table filter chain INPUT proto (ipv6-icmp icmp) ACCEPT;
+
domain (ip ip6) table filter {
+
chain INPUT {
+
policy DROP;
+
interface lo ACCEPT;
+
interface tailscale0 ACCEPT;
+
interface wg42_+ ACCEPT;
+
interface wg0 ACCEPT;
+
proto tcp dport (22 25 53 80 143 389 443 465 587 636 993 4190 6900 8000 http https 34197) ACCEPT;
+
proto udp dport (22 25 53 480:510 636 4367 6900 8000 34197) ACCEPT;
+
proto tcp dport (179) ACCEPT;
+
# dns
+
proto (udp tcp) dport domain ACCEPT;
+
mod state state (INVALID) DROP;
+
mod state state (ESTABLISHED RELATED) ACCEPT;
+
}
+
chain OUTPUT {
+
policy ACCEPT;
+
}
+
chain FORWARD {
+
policy DROP;
+
# allow intern routing and dn42 forwarding
+
interface wg42_+ outerface wg42_+ ACCEPT;
+
interface tailscale0 outerface tailscale0 ACCEPT;
+
interface tailscale0 outerface wg42_+ ACCEPT;
+
# but dn42 -> intern only with execptions
+
interface wg42_+ outerface tailscale0 {
+
proto (ipv6-icmp icmp) ACCEPT; # Allow SSH Access from dn42 to devices behind tailscale0 Interfaces
+
proto tcp dport (ssh) ACCEPT;
+
mod state state (ESTABLISHED) ACCEPT;
+
}
+
}
+
}
+
'';
+
};
+
}
+1
hosts/thought/hardware.nix
···
+
{ zramSwap.enable = true; }
+22
hosts/thought/networking.nix
···
+
{ lib, ... }:
+
{
+
networking = {
+
hostName = "thought";
+
hostId = "1e22528e";
+
useDHCP = false;
+
nameservers = lib.mkForce [ ];
+
resolvconf.enable = false;
+
interfaces.enp1s0 = {
+
ipv6.addresses = [
+
{
+
address = "2a01:4ff:1f0:c98a::1";
+
prefixLength = 64;
+
}
+
];
+
};
+
defaultGateway6 = {
+
address = "fe80::1";
+
interface = "enp1s0";
+
};
+
};
+
}
+4
hosts/thought/packages.nix
···
+
{ pkgs, ... }:
+
{
+
environment.systemPackages = with pkgs; [ direnv ];
+
}
+4
hosts/thought/secrets/secrets.nix
···
+
{
+
imports = [ ../../common/secrets/secrets.nix ];
+
# "headscale-oidc-secret.age".publicKeys = [ prefect yubi-main yubi-back ];
+
}
+37
hosts/thought/services/prometheus.nix
···
+
{ config, ... }:
+
{
+
services.prometheus = {
+
enable = true;
+
port = 6999;
+
exporters = {
+
node = {
+
enable = true;
+
enabledCollectors = [ "systemd" ];
+
port = 6998;
+
};
+
bird = {
+
enable = true;
+
};
+
};
+
scrapeConfigs = [
+
{
+
job_name = "prefect";
+
static_configs = [
+
{ targets = [ "127.0.0.1:${toString config.services.prometheus.exporters.node.port}" ]; }
+
];
+
}
+
{
+
job_name = "caddy";
+
static_configs = [ { targets = [ "127.0.0.1:6899" ]; } ];
+
}
+
{
+
job_name = "bird";
+
static_configs = [ { targets = [ "127.0.0.1:9324" ]; } ];
+
}
+
{
+
job_name = "prometheus";
+
static_configs = [ { targets = [ "127.0.0.1:6999" ]; } ];
+
}
+
];
+
};
+
}
+11
hosts/thought/services/tailscale.nix
···
+
{ config, ... }:
+
{
+
services.tailscale = {
+
enable = true;
+
};
+
networking.firewall = {
+
trustedInterfaces = [ "tailscale0" ];
+
allowedUDPPorts = [ config.services.tailscale.port ];
+
checkReversePath = "loose";
+
};
+
}
+52
hosts/zaphod/bootloader.nix
···
+
{ pkgs, config, ... }:
+
let
+
fileSystems = {
+
btrfs = true;
+
ext4 = true;
+
vfat = true;
+
ntfs = true;
+
};
+
in
+
{
+
boot = {
+
kernelParams = [
+
"amdgpu.dcdebugmask=0x410"
+
];
+
bootspec.enable = true;
+
kernelPackages = pkgs.linuxPackages_latest;
+
extraModulePackages = with config.boot.kernelPackages; [
+
v4l2loopback
+
framework-laptop-kmod
+
];
+
kernelModules = [
+
"v4l2loopback"
+
"btusb"
+
"cros_ec"
+
"cros_ec_lpcs"
+
];
+
supportedFilesystems = fileSystems;
+
initrd = {
+
enable = true;
+
network.enable = false;
+
availableKernelModules = [
+
"xhci_pci"
+
"thunderbolt"
+
"nvme"
+
"usb_storage"
+
"usbhid"
+
"sd_mod"
+
];
+
kernelModules = [ ];
+
};
+
loader = {
+
systemd-boot = {
+
enable = true;
+
configurationLimit = 5;
+
};
+
efi.canTouchEfiVariables = true;
+
};
+
plymouth.enable = true;
+
plymouth.font = "${pkgs.ibm-plex}/share/fonts/opentype/IBMPlexMono-Regular.otf";
+
};
+
catppuccin.plymouth.enable = true;
+
}
+22
hosts/zaphod/console.nix
···
+
{
+
console = {
+
colors = [
+
"1a1b26"
+
"f7768e"
+
"73daca"
+
"e0af68"
+
"7aa2f7"
+
"bb9af7"
+
"7dcfff"
+
"c0caf5"
+
"565f89"
+
"f7768e"
+
"73daca"
+
"e0af68"
+
"7aa2f7"
+
"bb9af7"
+
"7dcfff"
+
"c0caf5"
+
];
+
};
+
}
+57
hosts/zaphod/default.nix
···
+
{ ... }:
+
{
+
imports = [
+
# Machine specific configs
+
./bootloader.nix
+
./console.nix
+
./fonts.nix
+
./hardware.nix
+
# ./kde.nix
+
./networking.nix
+
./misc.nix
+
./packages.nix
+
./power.nix
+
+
# Security
+
./security/modules.nix
+
+
# Services
+
./services/modules.nix
+
+
# Machine-specific programs.
+
./programs/ssh.nix
+
./programs/zsh.nix
+
+
# Agenix secrets
+
# ./secret-files.nix
+
];
+
py = {
+
profiles.gui.enable = true;
+
users.default.enable = true;
+
programs = {
+
appimage.enable = true;
+
chromium.enable = true;
+
dconf.enable = true;
+
firefox.enable = true;
+
fish.enable = true;
+
hyprland.enable = true;
+
less.enable = true;
+
neovim.enable = true;
+
noisetorch.enable = true;
+
steam.enable = true;
+
wireshark.enable = true;
+
};
+
};
+
+
fileSystems = {
+
"/" = {
+
fsType = "btrfs";
+
device = "/dev/disk/by-uuid/dce547b5-71db-4b80-a029-370c4b7765ab";
+
};
+
"/boot" = {
+
fsType = "vfat";
+
device = "/dev/disk/by-uuid/2F06-FA92";
+
};
+
};
+
swapDevices = [ { device = "/dev/disk/by-uuid/5f64b6ad-f471-4c6f-8536-59f581e16827"; } ];
+
}
+24
hosts/zaphod/fonts.nix
···
+
{ pkgs, lib, ... }:
+
{
+
fonts = {
+
fontDir.enable = true;
+
fontconfig = {
+
enable = lib.mkForce true;
+
defaultFonts = {
+
serif = [ "IBM Plex Serif" ];
+
sansSerif = [ "IBM Plex Sans" ];
+
monospace = [
+
"IBM Plex Mono"
+
"FiraCode Nerd Font Mono"
+
];
+
emoji = [ "JoyPixels" ];
+
};
+
};
+
packages = with pkgs; [
+
ibm-plex
+
nerd-fonts.blex-mono
+
nerd-fonts.symbols-only
+
inter
+
];
+
};
+
}
+40
hosts/zaphod/hardware.nix
···
+
{ pkgs, ... }:
+
{
+
hardware = {
+
enableAllFirmware = false;
+
enableRedistributableFirmware = false;
+
firmware = [
+
pkgs.linux-firmware
+
pkgs.alsa-firmware
+
pkgs.sof-firmware
+
];
+
bluetooth = {
+
enable = true;
+
hsphfpd.enable = false;
+
powerOnBoot = true;
+
};
+
gpgSmartcards.enable = true;
+
amdgpu = {
+
opencl.enable = false;
+
initrd.enable = true;
+
};
+
graphics = {
+
enable = true;
+
extraPackages = [
+
pkgs.gamescope
+
pkgs.mangohud
+
];
+
extraPackages32 = [
+
pkgs.pkgsi686Linux.mangohud
+
];
+
};
+
wirelessRegulatoryDatabase = true;
+
framework.enableKmod = false;
+
keyboard.qmk.enable = true;
+
keyboard.qmk.keychronSupport = true;
+
};
+
services.udev.packages = [
+
pkgs.qmk-udev-rules
+
pkgs.logitech-udev-rules
+
];
+
}
+20
hosts/zaphod/kde.nix
···
+
{
+
services.xserver = {
+
enable = false;
+
displayManager = {
+
sddm.enable = false;
+
defaultSession = "plasmawayland";
+
};
+
desktopManager.plasma5 = {
+
enable = false;
+
phononBackend = "vlc";
+
runUsingSystemd = true;
+
useQtScaling = true;
+
};
+
};
+
qt = {
+
enable = true;
+
platformTheme = "kde";
+
style = "cleanlooks";
+
};
+
}
+59
hosts/zaphod/misc.nix
···
+
{ lib, pkgs, ... }:
+
{
+
documentation = {
+
enable = false;
+
doc.enable = false;
+
man = {
+
enable = false;
+
generateCaches = false;
+
mandoc.enable = true;
+
};
+
nixos.enable = false;
+
};
+
environment = {
+
homeBinInPath = true;
+
localBinInPath = true;
+
};
+
services.openssh.settings.PermitRootLogin = lib.mkForce "yes";
+
time.timeZone = "America/New_York";
+
#
+
# systemd.tmpfiles.rules = ["L+ /lib64 - - - - /run/current-system/sw/lib64"];
+
+
virtualisation.virtualbox = {
+
host.enable = false;
+
host.enableExtensionPack = false;
+
guest = {
+
enable = false;
+
clipboard = true;
+
seamless = false;
+
dragAndDrop = true;
+
};
+
};
+
# Enable Virt-manager
+
virtualisation.libvirtd.enable = false;
+
programs.dconf.enable = true;
+
# environment.systemPackages = with pkgs; [virt-manager];
+
+
users.extraGroups.vboxusers.members = [
+
"thehedgehog"
+
"pyrox"
+
];
+
# users.extraGroups.libvirtd.members = ["thehedgehog" "pyrox"];
+
xdg.portal.xdgOpenUsePortal = true;
+
+
# Nix-LD
+
programs.nix-ld.enable = true;
+
+
programs.steam.extraPackages = [
+
pkgs.pixman
+
];
+
+
services.upower = {
+
enable = true;
+
percentageLow = 30;
+
percentageCritical = 15;
+
};
+
+
# For caelestia screen recording
+
programs.gpu-screen-recorder.enable = true;
+
}
+51
hosts/zaphod/networking.nix
···
+
{ lib, pkgs, ... }:
+
{
+
networking = {
+
enableB43Firmware = false;
+
enableIPv6 = true;
+
hostId = "28c6bad2";
+
hostName = "zaphod";
+
usePredictableInterfaceNames = lib.mkDefault true;
+
# Interface config
+
interfaces.wlp1s0.useDHCP = lib.mkDefault true;
+
# Enable NetworkManager and disable wpa_supplicant
+
networkmanager = {
+
enable = true;
+
dns = lib.mkForce "default";
+
wifi.powersave = true;
+
};
+
wireless = {
+
enable = false;
+
};
+
+
# Tailscale fix(not needed, but recommended)
+
firewall.checkReversePath = "loose";
+
+
# DNS Servers
+
# Only use local resolver
+
nameservers = lib.mkForce [ ];
+
+
resolvconf.enable = false;
+
};
+
services.resolved = {
+
enable = false;
+
llmnr = "true";
+
fallbackDns = [ "158.59.252.11" ];
+
extraConfig = ''
+
MulticastDNS=true
+
'';
+
};
+
systemd.services.wpa_supplicant.environment.OPENSSL_CONF = pkgs.writeText "openssl.cnf" ''
+
openssl_conf = openssl_init
+
[openssl_init]
+
ssl_conf = ssl_sect
+
[ssl_sect]
+
system_default = system_default_sect
+
[system_default_sect]
+
Options = UnsafeLegacyRenegotiation
+
'';
+
services.mullvad-vpn = {
+
enable = false;
+
package = pkgs.mullvad-vpn;
+
};
+
}
+23
hosts/zaphod/packages.nix
···
+
{
+
pkgs,
+
inputs',
+
...
+
}:
+
{
+
environment.systemPackages = [
+
inputs'.agenix.packages.default
+
pkgs.file
+
pkgs.gnupg
+
pkgs.libappindicator
+
pkgs.kdePackages.kdenlive
+
pkgs.libappindicator-gtk3
+
pkgs.nixpkgs-track
+
pkgs.pmutils
+
pkgs.qbittorrent
+
pkgs.steam-run
+
# Tools for working with Framework computers
+
pkgs.framework-tool-tui
+
pkgs.fw-ectool
+
pkgs.framework-tool
+
];
+
}
+1
hosts/zaphod/power.nix
···
+
{ powerManagement.enable = true; }
+10
hosts/zaphod/programs/gnupg.nix
···
+
{
+
programs.gnupg = {
+
agent = {
+
enable = true;
+
enableSSHSupport = true;
+
enableBrowserSocket = true;
+
};
+
dirmngr.enable = true;
+
};
+
}
+6
hosts/zaphod/programs/ssh.nix
···
+
{
+
programs.ssh = {
+
enableAskPassword = false;
+
forwardX11 = false;
+
};
+
}
+13
hosts/zaphod/programs/zsh.nix
···
+
{
+
programs.zsh = {
+
enable = true;
+
enableBashCompletion = true;
+
enableCompletion = true;
+
enableGlobalCompInit = true;
+
autosuggestions.enable = true;
+
autosuggestions.async = true;
+
histSize = 10000;
+
syntaxHighlighting.enable = true;
+
vteIntegration = true;
+
};
+
}
+8
hosts/zaphod/secret-files.nix
···
+
{
+
config.age.secrets = {
+
wg-privkey = {
+
file = ./secrets/wg-privkey.age;
+
path = "/run/agenix/wg-privkey";
+
};
+
};
+
}
+12
hosts/zaphod/secrets/secrets.nix
···
+
let
+
yubi-back = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw==";
+
yubi-main = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBBsOIMMZVmleClXfqUMrnmyh8PFuyiJqHKEZ51Xy746";
+
backup = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM=";
+
in
+
{
+
"wg-privkey.age".publicKeys = [
+
yubi-back
+
yubi-main
+
backup
+
];
+
}
hosts/zaphod/secrets/wg-privkey.age

This is a binary file and will not be displayed.

+6
hosts/zaphod/security/modules.nix
···
+
{
+
imports = [ ./pam.nix ];
+
security = {
+
protectKernelImage = true;
+
};
+
}
+9
hosts/zaphod/security/pam.nix
···
+
{
+
security.pam = {
+
p11.enable = false;
+
p11.control = "sufficient";
+
u2f.enable = true;
+
u2f.settings.cue = true;
+
sshAgentAuth.enable = false;
+
};
+
}
+6
hosts/zaphod/services/avahi.nix
···
+
{
+
services.avahi = {
+
enable = true;
+
nssmdns4 = true;
+
};
+
}
+20
hosts/zaphod/services/docker.nix
···
+
{ pkgs, ... }:
+
let
+
betterDocker = pkgs.docker.override {
+
buildxSupport = false;
+
composeSupport = false;
+
sbomSupport = false;
+
};
+
in
+
{
+
virtualisation.docker = {
+
enable = true;
+
package = betterDocker;
+
rootless = {
+
enable = false;
+
package = betterDocker;
+
setSocketVariable = true;
+
};
+
storageDriver = "btrfs";
+
};
+
}
+4
hosts/zaphod/services/flatpak.nix
···
+
{
+
services.flatpak.enable = true;
+
xdg.portal.enable = true;
+
}
+8
hosts/zaphod/services/fprintd.nix
···
+
{ pkgs, ... }:
+
{
+
services.fprintd = {
+
enable = false;
+
tod.enable = false;
+
tod.driver = pkgs.libfprint-2-tod1-goodix;
+
};
+
}
+9
hosts/zaphod/services/fwupd.nix
···
+
{
+
services.fwupd = {
+
enable = true;
+
extraRemotes = [ "lvfs-testing" ];
+
uefiCapsuleSettings = {
+
"DisableCapsuleUpdateOnDisk" = true;
+
};
+
};
+
}
+10
hosts/zaphod/services/greeter.nix
···
+
{
+
services.displayManager.ly = {
+
enable = true;
+
x11Support = false;
+
settings = {
+
clear_password = true;
+
hide_version_string = true;
+
};
+
};
+
}
+13
hosts/zaphod/services/kmscon.nix
···
+
{ pkgs, ... }:
+
{
+
services.kmscon = {
+
enable = true;
+
hwRender = true;
+
fonts = [
+
{
+
name = "BlexMono Nerd Font";
+
package = pkgs.nerd-fonts.blex-mono;
+
}
+
];
+
};
+
}
+18
hosts/zaphod/services/misc.nix
···
+
{ config, lib, ... }:
+
{
+
services = {
+
blueman.enable = false;
+
fstrim.enable = lib.mkDefault true;
+
tlp.enable = lib.mkDefault (
+
(lib.versionOlder (lib.versions.majorMinor lib.version) "21.05") || !config.services.power-profiles-daemon.enable
+
);
+
libinput.enable = lib.mkDefault true;
+
logind.settings.Login = {
+
HandlePowerKey = "ignore";
+
HandlePowerKeyLongPress = "ignore";
+
HandleLidSwitch = "ignore";
+
HandleLidSwitchExternalPower = "ignore";
+
HandleLidSwitchDocked = "ignore";
+
};
+
};
+
}
+17
hosts/zaphod/services/modules.nix
···
+
{
+
imports = [
+
./avahi.nix
+
./docker.nix
+
./flatpak.nix
+
./fprintd.nix
+
./fwupd.nix
+
./greeter.nix
+
./kmscon.nix
+
./misc.nix
+
./packagekit.nix
+
./pcscd.nix
+
./pipewire.nix
+
./ssh.nix
+
./tailscale.nix
+
];
+
}
+5
hosts/zaphod/services/packagekit.nix
···
+
{
+
services = {
+
packagekit.enable = false;
+
};
+
}
+5
hosts/zaphod/services/pcscd.nix
···
+
{
+
services.pcscd = {
+
enable = true;
+
};
+
}
+12
hosts/zaphod/services/pipewire.nix
···
+
{
+
services.pipewire = {
+
enable = true;
+
alsa.enable = true;
+
alsa.support32Bit = true;
+
audio.enable = true;
+
jack.enable = true;
+
pulse.enable = true;
+
wireplumber.enable = true;
+
};
+
security.rtkit.enable = true;
+
}
+6
hosts/zaphod/services/ssh.nix
···
+
{
+
# services.openssh = {
+
# enable = true;
+
# permitRootLogin = "prohibit-password";
+
# };
+
}
+5
hosts/zaphod/services/tailscale.nix
···
+
{
+
services.tailscale = {
+
enable = true;
+
};
+
}
+4 -2
lib/data/default.nix
···
{
-
data.hosts = builtins.fromTOML (builtins.readFile ./hosts.toml);
-
data.services = builtins.fromTOML (builtins.readFile ./services.toml);
+
hosts = builtins.fromTOML (builtins.readFile ./hosts.toml);
+
services = builtins.fromTOML (builtins.readFile ./services.toml);
+
mail = builtins.fromTOML (builtins.readFile ./mail.toml);
+
tsNet = "coelacanth-dragon.ts.net";
}
+10
lib/data/mail.toml
···
+
extUrl = "mail.pyrox.dev"
+
extIPs = ["5.161.140.5", "2a01:4ff:f0:98bf:0:0:0:1"]
+
# internal port is 40k+real mail port
+
intSMTP = 40587
+
intSMTPS = 40465
+
intIMAP = 40143
+
intIMAPS = 40993
+
intManageSieve = 44190
+
intHTTPS = 40443
+
intHTTP = 40080
+59 -2
lib/data/services.toml
···
# Schema:
# port: what port the service uses internally, int
# host: What host the service runs on
-
# extUrl: if needed, the externally accessible domain name of the service
+
# extUrl: (optional) the externally accessible domain name of the service
+
# anubis: What port the anubis service for this domain will use, int
+
# tsHost: (optional) What Tailscale host this service will run on, for services only available via Tailscale.
+
# # Should only be set if this is available externally, if at all, since TS-only services aren't able to be scraped.
+
# Current lowest unassigned port: 6938
[authentik]
port = 6908
host = "marvin"
extUrl = "auth.pyrox.dev"
+
anubis = 8401
[buildbot-server]
port = 6915
···
port = 6907
host = "marvin"
extUrl = "deemix.pyrox.dev"
+
tsHost = "deemix"
[git]
port = 6904
host = "marvin"
extUrl = "git.pyrox.dev"
+
anubis = 8402
[grafana]
port = 6914
host = "marvin"
extUrl = "stats.pyrox.dev"
+
anubis = 8403
[iceshrimp]
port = 6923
host = "marvin"
extUrl = "soc.pyrox.dev"
+
+
[immich]
+
port = 6936
+
host = "marvin"
+
extUrl = "img.pyrox.dev"
+
pubProxy = 6937
[jellyfin]
port = 8096
host = "marvin"
extUrl = "media.pyrox.dev"
+
anubis = 8404
+
exporter = 30103
[matrix-server]
port = 6922
···
port = 6903
host = "marvin"
extUrl = "rss.pyrox.dev"
+
anubis = 8405
[nextcloud]
port = 6926
host = "marvin"
extUrl = "cloud.pyrox.dev"
+
anubis = 8406
[nextcloud-imaginary]
port = 6928
···
port = 6927
host = "marvin"
extUrl = "office.pyrox.dev"
+
anubis = 8407
+
+
[pinchflat]
+
port = 6930
+
host = "marvin"
+
tsHost = "yt"
+
+
[pingvin-share]
+
port = 6933
+
host = "marvin"
+
extUrl = "share.pyrox.dev"
+
anubis = 8410
+
be-port = 30104
+
be-anubis = 30105
[planka]
port = 6929
host = "marvin"
extUrl = "plan.cs2a.club"
+
anubis = 8408
[prosody]
host = "marvin"
extUrl = "xmpp.pyrox.dev"
+
[pocket-id]
+
port = 6932
+
host = "marvin"
+
extUrl = "auth.pyrox.dev"
+
anubis = 8401
+
[redlib]
port = 6901
host = "marvin"
-
extUrl = "reddit.pyrox.dev"
+
tsHost = "reddit"
+
+
[scrutiny]
+
port = 6931
+
host = "marvin"
+
tsHost = "scrutiny"
+
+
[tangled-knot]
+
port = 6934
+
host = "marvin"
+
extUrl = "knot.pyrox.dev"
+
intListenPort = 30106
+
+
[tangled-spindle]
+
port = 6935
+
host = "marvin"
+
extUrl = "spindle.pyrox.dev"
+
[vaultwarden]
port = 6912
host = "marvin"
extUrl = "bw.pyrox.dev"
+
anubis = 8409
[webmentiond]
port = 6925
+5
lib/default.nix
···
+
_: {
+
flake = {
+
lib.data = import ./data;
+
};
+
}
+1 -1
lib/deploy/default.nix
···
let
inherit (inputs) deploy-rs;
in
-
rec {
+
{
## Create deployment configuration for use with deploy-rs.
##
## ```nix
-24
modules/home/profiles/base/default.nix
···
-
{
-
config,
-
lib,
-
...
-
}:
-
let
-
cfg = config.py.profiles.base;
-
in
-
{
-
options.py.profiles.base.enable = lib.mkEnableOption "Base Home Profile";
-
config = lib.mkIf cfg.enable {
-
programs.home-manager.enable = true;
-
home.stateVersion = "25.05";
-
home.language = {
-
base = "en_US.utf8";
-
};
-
manual = {
-
manpages.enable = false;
-
html.enable = false;
-
json.enable = false;
-
};
-
programs.man.enable = false;
-
};
-
}
-69
modules/home/profiles/cli/default.nix
···
-
{
-
pkgs,
-
lib,
-
config,
-
inputs,
-
system,
-
...
-
}:
-
let
-
cfg = config.py.profiles.cli;
-
inherit (lib) mkEnableOption mkDefault mkIf;
-
in
-
{
-
options.py.profiles.cli.enable = mkEnableOption "CLI Profile";
-
config = mkIf cfg.enable {
-
py.programs = {
-
bat.enable = mkDefault true;
-
direnv.enable = mkDefault true;
-
fish.enable = mkDefault true;
-
fzf.enable = mkDefault true;
-
git = {
-
enable = mkDefault true;
-
gh.enable = mkDefault true;
-
lazygit.enable = mkDefault true;
-
};
-
gpg.enable = mkDefault true;
-
helix.enable = mkDefault true;
-
nix-index.enable = mkDefault true;
-
nushell.enable = mkDefault true;
-
pandoc.enable = mkDefault true;
-
ssh.enable = mkDefault true;
-
starship.enable = mkDefault true;
-
wakatime.enable = mkDefault true;
-
zoxide.enable = mkDefault true;
-
};
-
catppuccin = {
-
btop.enable = true;
-
glamour.enable = true;
-
};
-
programs = {
-
eza = {
-
enable = true;
-
icons = "auto";
-
git = true;
-
enableBashIntegration = false;
-
enableIonIntegration = false;
-
};
-
btop = {
-
enable = true;
-
};
-
};
-
xdg.configFile = {
-
"rbw/config.json".source = ./rbw-config.json;
-
};
-
home.packages = with pkgs; [
-
btrfs-progs
-
fd
-
fzf
-
glow
-
gnupg
-
pinentry
-
rbw
-
rsync
-
xdg-utils
-
yt-dlp
-
inputs.nix-search.packages.${system}.default
-
];
-
};
-
}
-1
modules/home/profiles/cli/rbw-config.json
···
-
{"email":"pyrox@pyrox.dev","base_url":"https://bw.pyrox.dev","identity_url":null,"lock_timeout":3600,"pinentry":"pinentry"}
-38
modules/home/profiles/desktop/default.nix
···
-
{
-
pkgs,
-
config,
-
lib,
-
...
-
}:
-
let
-
cfg = config.py.profiles.desktop;
-
inherit (lib) mkIf mkDefault mkEnableOption;
-
in
-
{
-
options.py.profiles.desktop.enable = mkEnableOption "Desktop Config";
-
config = mkIf cfg.enable {
-
py.profiles = {
-
base.enable = mkDefault true;
-
cli.enable = mkDefault true;
-
gui.enable = mkDefault true;
-
development.enable = mkDefault true;
-
};
-
programs.mpv.enable = mkDefault true;
-
home.packages = with pkgs; [
-
archipelago
-
brightnessctl
-
clipman
-
dex
-
fractal
-
keepassxc
-
newsflash
-
playerctl
-
poptracker
-
thunderbird
-
wlogout
-
wl-clipboard
-
zotero
-
];
-
services.easyeffects.enable = mkDefault true;
-
};
-
}
-25
modules/home/profiles/development/default.nix
···
-
{
-
pkgs,
-
lib,
-
config,
-
...
-
}:
-
let
-
customPython = pkgs.python313.withPackages (ps: [ ps.pip ]);
-
cfg = config.py.profiles.development;
-
in
-
{
-
options.py.profiles.development.enable = lib.mkEnableOption "Development Profile";
-
config = lib.mkIf cfg.enable {
-
py.programs = {
-
neovim.enable = true;
-
};
-
home.packages = with pkgs; [
-
any-nix-shell
-
customPython
-
editorconfig-core-c
-
nil
-
nixd
-
];
-
};
-
}
-55
modules/home/profiles/gui/default.nix
···
-
{
-
pkgs,
-
lib,
-
config,
-
...
-
}:
-
let
-
cfg = config.py.profiles.gui;
-
inherit (lib) mkEnableOption mkIf mkDefault;
-
in
-
{
-
options.py.profiles.gui.enable = mkEnableOption "GUI Profile";
-
config = mkIf cfg.enable {
-
home.sessionVariables = {
-
XDG_CURRENT_DESKTOP = "sway";
-
};
-
py = {
-
gui.enable = true;
-
programs = {
-
chromium.enable = mkDefault true;
-
firefox.enable = mkDefault true;
-
ghostty.enable = mkDefault true;
-
kitty.enable = mkDefault false;
-
obs.enable = mkDefault true;
-
vscodium.enable = mkDefault true;
-
wlogout.enable = mkDefault true;
-
};
-
services = {
-
gpg-agent.enable = mkDefault true;
-
kanshi.enable = mkDefault true;
-
kdeconnect.enable = mkDefault true;
-
mako.enable = mkDefault true;
-
swayidle.enable = mkDefault true;
-
syncthing.enable = mkDefault false;
-
};
-
};
-
home.packages = with pkgs; [
-
chatterino2
-
equibop
-
gajim
-
grim
-
krita
-
libappindicator
-
libappindicator-gtk3
-
lutris
-
prismlauncher
-
pwvucontrol
-
py.olympus
-
satty
-
slurp
-
sway-launcher-desktop
-
ueberzug
-
];
-
};
-
}
-13
modules/home/profiles/server/default.nix
···
-
{ lib, config, ... }:
-
let
-
cfg = config.py.profiles.server;
-
in
-
{
-
options.py.profiles.server.enable = lib.mkEnableOption "Server Profile";
-
config = lib.mkIf cfg.enable {
-
py.profiles = {
-
base.enable = lib.mkDefault true;
-
cli.enable = lib.mkDefault true;
-
};
-
};
-
}
-18
modules/home/programs/chromium/default.nix
···
-
{
-
pkgs,
-
config,
-
lib,
-
...
-
}:
-
let
-
cfg = config.py.programs.chromium;
-
in
-
{
-
options.py.programs.chromium.enable = lib.mkEnableOption "Chromium";
-
-
config.programs.chromium = lib.mkIf cfg.enable {
-
enable = true;
-
package = pkgs.ungoogled-chromium;
-
dictionaries = [ pkgs.hunspellDictsChromium.en_US ];
-
};
-
}
-22
modules/home/programs/firefox/default.nix
···
-
{ config, lib, ... }:
-
let
-
cfg = config.py.programs.firefox;
-
in
-
{
-
options.py.programs.firefox = {
-
enable = lib.mkEnableOption "Firefox configuration";
-
};
-
config = lib.mkIf cfg.enable {
-
programs.firefox = {
-
inherit (cfg) enable;
-
package = null;
-
profiles = {
-
default = {
-
id = 0;
-
isDefault = true;
-
name = "Default";
-
};
-
};
-
};
-
};
-
}
-44
modules/home/programs/fish/default.nix
···
-
{
-
pkgs,
-
lib,
-
config,
-
...
-
}:
-
let
-
inherit (lib) getExe mkEnableOption mkIf;
-
cfg = config.py.programs.fish;
-
in
-
{
-
options.py.programs.fish.enable = mkEnableOption "fish shell";
-
config.catppuccin.fish.enable = cfg.enable;
-
config.programs.fish = mkIf cfg.enable {
-
enable = true;
-
shellAliases = {
-
"lg" = getExe pkgs.lazygit;
-
"cat" = getExe pkgs.bat;
-
"gls" = "${getExe pkgs.eza} -lah@ --icons --git --git-ignore --no-user";
-
"ls" = "${getExe pkgs.eza} --icons -a";
-
"ll" = "${getExe pkgs.eza} --icons -lah@";
-
"lt" = "${getExe pkgs.eza} --icons --tree -a";
-
"dig" = getExe pkgs.doggo;
-
};
-
shellInit = ''
-
set -x GPG_TTY (tty)
-
set -x SSH_AUTH_SOCK (gpgconf --list-dirs agent-ssh-socket)
-
gpgconf --launch gpg-agent
-
'';
-
-
interactiveShellInit = ''
-
fzf_configure_bindings --directory=\cf --git_log=\cl --git_status=\cg \
-
--history=\cr --variables=\cv --processes=\cp
-
any-nix-shell fish --info-right | source
-
'';
-
-
plugins = [
-
{
-
inherit (pkgs.fishPlugins.fzf-fish) src;
-
name = "fzf-fish";
-
}
-
];
-
};
-
}
-16
modules/home/programs/ghostty/default.nix
···
-
{ lib, config, ... }:
-
let
-
cfg = config.py.programs.ghostty;
-
in
-
{
-
options.py.programs.ghostty.enable = lib.mkEnableOption "ghostty";
-
config.catppuccin.ghostty.enable = cfg.enable;
-
config.programs.ghostty = lib.mkIf cfg.enable {
-
enable = true;
-
enableFishIntegration = true;
-
installBatSyntax = true;
-
enableBashIntegration = true;
-
enableZshIntegration = false;
-
settings = import ./settings.nix;
-
};
-
}
-17
modules/home/programs/ghostty/settings.nix
···
-
{
-
font-family = "BlexMono Nerd Font";
-
font-family-bold = "BlexMono Nerd Font Bold";
-
font-family-italic = "BlexMono Nerd Font Italic";
-
font-family-bold-italic = "BlexMono Nerd Font Bold Italic";
-
font-size = 14;
-
-
cursor-style = "block";
-
window-decoration = false;
-
-
clipboard-read = "allow";
-
clipboard-write = "allow";
-
clipboard-paste-protection = true;
-
-
shell-integration-features = "cursor,sudo,title";
-
auto-update = "off";
-
}
-111
modules/home/programs/git/default.nix
···
-
{
-
pkgs,
-
lib,
-
config,
-
...
-
}:
-
let
-
cfg = config.py.programs.git;
-
in
-
{
-
options.py.programs.git = {
-
enable = lib.mkEnableOption "git configuration";
-
lazygit.enable = lib.mkEnableOption "lazygit configuration";
-
gh.enable = lib.mkEnableOption "gh configuration";
-
};
-
config = {
-
catppuccin = {
-
lazygit.enable = cfg.lazygit.enable;
-
};
-
programs = {
-
git = lib.mkIf cfg.enable {
-
enable = true;
-
package = pkgs.py.customGit;
-
aliases = {
-
a = "add -p";
-
co = "checkout";
-
cob = "checkout -b";
-
f = "fetch -p";
-
c = "commit";
-
p = "push";
-
ba = "branch -a";
-
bd = "branch -d";
-
bD = "branch -D";
-
d = "diff";
-
dc = "diff --cached";
-
ds = "diff --staged";
-
r = "restore";
-
rs = "restore --staged";
-
st = "status -sb";
-
# reset
-
soft = "reset --soft";
-
hard = "reset --hard";
-
s1ft = "soft HEAD~1";
-
h1rd = "hard HEAD~1";
-
# logging
-
lg = "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit";
-
plog = "log --graph --pretty='format:%C(red)%d%C(reset) %C(yellow)%h%C(reset) %ar %C(green)%aN%C(reset) %s'";
-
tlog = "log --stat --since='1 Day Ago' --graph --pretty=oneline --abbrev-commit --date=relative";
-
rank = "shortlog -sn --no-merges";
-
# delete merged branches
-
bdm = "!git branch --merged | grep -v '*' | xargs -n 1 git branch -d";
-
wt = "worktree";
-
};
-
delta = {
-
enable = true;
-
options.line-numbers = true;
-
};
-
extraConfig = {
-
core.editor = lib.getExe pkgs.py.nvim;
-
init.defaultBranch = "main";
-
pull.rebase = false;
-
"credential \"https://git.pyrox.dev\"".username = "pyrox";
-
credential.helper = "rbw";
-
gpg = {
-
ssh.allowedSignersFile = "~/.ssh/authorized_signatures";
-
};
-
};
-
lfs = {
-
enable = true;
-
skipSmudge = false;
-
};
-
signing = {
-
key = "~/.ssh/main.pub";
-
format = "ssh";
-
signByDefault = true;
-
};
-
userEmail = "pyrox@pyrox.dev";
-
userName = "dish";
-
};
-
lazygit = lib.mkIf cfg.lazygit.enable {
-
enable = true;
-
settings = {
-
gui = {
-
nerdFontsVersion = "3";
-
showRandomTip = false;
-
theme.selectedLineBgColor = [ "default" ];
-
};
-
git.paging = {
-
pager = "${lib.getExe pkgs.delta} --dark --paging=never";
-
colorArg = "always";
-
};
-
services = {
-
"git.pyrox.dev" = "gitea:git.pyrox.dev";
-
"git.dn42.dev" = "gitea:git.dn42.dev";
-
"codeberg.org" = "gitea:codeberg.org";
-
};
-
};
-
};
-
gh = lib.mkIf cfg.gh.enable {
-
enable = true;
-
gitCredentialHelper.enable = true;
-
settings = {
-
editor = lib.getExe pkgs.py.nvim;
-
git_protocol = "https";
-
browser = lib.mkIf config.py.gui.enable pkgs.firefox;
-
prompt = "enabled";
-
};
-
};
-
};
-
};
-
}
-49
modules/home/programs/gpg/default.nix
···
-
{
-
pkgs,
-
lib,
-
config,
-
...
-
}:
-
let
-
cfg = config.py.programs.gpg;
-
in
-
{
-
options.py.programs.gpg.enable = lib.mkEnableOption "gpg";
-
config.programs.gpg = lib.mkIf cfg.enable {
-
enable = true;
-
settings = {
-
personal-cipher-preferences = "AES256 AES192 AES";
-
personal-digest-preferences = "SHA512 SHA384 SHA256";
-
personal-compress-preferences = "ZLIB BZIP2 ZIP Uncompressed";
-
default-preference-list = "SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed";
-
cert-digest-algo = "SHA512";
-
s2k-digest-algo = "SHA512";
-
s2k-cipher-algo = "AES256";
-
charset = "utf-8";
-
fixed-list-mode = true;
-
no-comments = true;
-
no-emit-version = true;
-
no-greeting = true;
-
keyid-format = "0xlong";
-
list-options = "show-uid-validity";
-
verify-options = "show-uid-validity";
-
with-fingerprint = true;
-
with-key-origin = true;
-
require-cross-certification = true;
-
no-symkey-cache = true;
-
use-agent = true;
-
throw-keyids = true;
-
default-key = "0xFE1D8A7D620C611F";
-
trusted-key = "0xFE1D8A7D620C611F";
-
keyserver = "hkps://keys.openpgp.org";
-
};
-
scdaemonSettings = {
-
card-timeout = "60";
-
pcsc-shared = true;
-
# shared-access = true;
-
disable-ccid = true;
-
pcsc-driver = "${pkgs.pcsclite.out}/lib/libpcsclite.so";
-
reader-port = "Yubico Yubi";
-
};
-
};
-
}
-15
modules/home/programs/helix/default.nix
···
-
{ config, lib, ... }:
-
let
-
cfg = config.py.programs.helix;
-
in
-
{
-
options.py.programs.helix.enable = lib.mkEnableOption "helix editor";
-
config.catppuccin.helix = {
-
enable = cfg.enable;
-
useItalics = cfg.enable;
-
};
-
config.programs.helix = lib.mkIf cfg.enable {
-
enable = true;
-
settings = import ./settings.nix;
-
};
-
}
-25
modules/home/programs/helix/settings.nix
···
-
{
-
editor = {
-
line-number = "absolute";
-
mouse = false;
-
auto-save = true;
-
true-color = true;
-
bufferline = "multiple";
-
cursor-shape = {
-
normal = "block";
-
insert = "bar";
-
select = "underline";
-
};
-
lsp = {
-
display-messages = true;
-
auto-signature-help = true;
-
display-signature-help-docs = true;
-
};
-
whitespace.render = {
-
space = "none";
-
tab = "all";
-
newline = "all";
-
};
-
indent-guides.render = true;
-
};
-
}
-14
modules/home/programs/kitty/default.nix
···
-
{ lib, config, ... }:
-
let
-
cfg = config.py.programs.kitty;
-
in
-
{
-
options.py.programs.kitty.enable = lib.mkEnableOption "kitty";
-
config.catppuccin.kitty.enable = cfg.enable;
-
config.programs.kitty = lib.mkIf cfg.enable {
-
enable = true;
-
font.name = "BlexMono Nerd Font";
-
font.size = 14;
-
settings = import ./settings.nix;
-
};
-
}
-41
modules/home/programs/kitty/settings.nix
···
-
{
-
# Font settings
-
bold_font = "BlexMono Nerd Font Bold";
-
italic_font = "BlexMono Nerd Font Italic";
-
bold_italic_font = "BlexMono Nerd Font Bold Italic";
-
# Cursor Settings
-
scrollback_lines = 10000;
-
wheel_scroll_multiplier = 3;
-
touch_scroll_multiplier = 2;
-
scrollback_pager = "page";
-
cursor_shape = "block";
-
# Mouse settings
-
mouse_hide_wait = "0.5";
-
open_url_with = "default";
-
strip_trailing_spaces = "smart";
-
focus_follows_mouse = true;
-
# Perf settings
-
repaint_delay = 16;
-
sync_to_monitor = true;
-
# Terminal Bell settings
-
enable_audio_bell = false;
-
# Window settings
-
hide_window_decorations = true;
-
# Tab Bar settings
-
tab_bar_edge = "bottom";
-
tab_bar_margin_width = 0;
-
tab_bar_margin_height = "0 0";
-
tab_bar_style = "powerline";
-
tab_bar_min_tabs = 2;
-
-
shell = "fish";
-
editor = "nvim";
-
allow_remote_control = "socket-only";
-
listen_on = "unix:/tmp/mykitty";
-
update_check_interval = 0;
-
allow_hyperlinks = true;
-
shell_integration = "no-cursor";
-
term = "xterm-kitty";
-
remember_window_size = "no";
-
linux_display_server = "wayland";
-
}
-78
modules/home/programs/misc-programs/default.nix
···
-
{
-
config,
-
lib,
-
pkgs,
-
...
-
}:
-
let
-
cfg = config.py.programs;
-
inherit (lib) mkEnableOption mkIf;
-
in
-
{
-
options.py.programs = {
-
bat.enable = mkEnableOption "bat";
-
direnv.enable = mkEnableOption "direnv";
-
fzf.enable = mkEnableOption "fzf";
-
nix-index.enable = mkEnableOption "nix-index";
-
obs.enable = mkEnableOption "OBS Studio";
-
pandoc.enable = mkEnableOption "pandoc";
-
wakatime.enable = mkEnableOption "wakatime";
-
zoxide.enable = mkEnableOption "zoxide";
-
};
-
config = {
-
catppuccin = {
-
bat.enable = cfg.bat.enable;
-
fzf.enable = cfg.fzf.enable;
-
obs.enable = cfg.obs.enable;
-
};
-
programs = {
-
bat = mkIf cfg.bat.enable {
-
enable = true;
-
};
-
direnv = mkIf cfg.direnv.enable {
-
enable = true;
-
enableBashIntegration = true;
-
enableNushellIntegration = true;
-
enableZshIntegration = true;
-
nix-direnv.enable = true;
-
stdlib = builtins.readFile ./direnv-stdlib.sh;
-
};
-
fzf = mkIf cfg.fzf.enable {
-
enable = true;
-
enableBashIntegration = true;
-
enableZshIntegration = true;
-
};
-
nix-index = mkIf cfg.nix-index.enable {
-
enable = true;
-
enableBashIntegration = true;
-
enableFishIntegration = true;
-
enableZshIntegration = true;
-
};
-
obs-studio = mkIf cfg.obs.enable {
-
enable = true;
-
plugins = with pkgs.obs-studio-plugins; [
-
obs-text-pthread
-
obs-backgroundremoval
-
input-overlay
-
obs-tuna
-
obs-pipewire-audio-capture
-
obs-vkcapture
-
wlrobs
-
];
-
};
-
pandoc = mkIf cfg.pandoc.enable { enable = true; };
-
zoxide = mkIf cfg.zoxide.enable {
-
enable = true;
-
enableBashIntegration = true;
-
enableFishIntegration = true;
-
enableZshIntegration = true;
-
};
-
};
-
home = {
-
packages = mkIf cfg.wakatime.enable [ pkgs.wakatime ];
-
sessionVariables = {
-
WAKATIME_HOME = "${config.xdg.configHome}/wakatime";
-
};
-
};
-
};
-
}
-26
modules/home/programs/misc-programs/direnv-stdlib.sh
···
-
layout_poetry() {
-
PYPROJECT_TOML="\$\{PYPROJECT_TOML:-pyproject.toml}"
-
if [[ ! -f "$PYPROJECT_TOML" ]]; then
-
log_status "No pyproject.toml found. Executing \`poetry init\` to create a \`$PYPROJECT_TOML\` first."
-
poetry init
-
fi
-
-
if [[ -d ".venv" ]]; then
-
VIRTUAL_ENV="$(pwd)/.venv"
-
else
-
VIRTUAL_ENV=$(
-
poetry env info --path 2>/dev/null
-
true
-
)
-
fi
-
-
if [[ -z $VIRTUAL_ENV || ! -d $VIRTUAL_ENV ]]; then
-
log_status "No virtual environment exists. Executing \`poetry install\` to create one."
-
poetry install
-
VIRTUAL_ENV=$(poetry env info --path)
-
fi
-
-
PATH_add "$VIRTUAL_ENV/bin"
-
export POETRY_ACTIVE=1
-
export VIRTUAL_ENV
-
}
-37
modules/home/programs/neovim/default.nix
···
-
{
-
pkgs,
-
config,
-
lib,
-
...
-
}:
-
let
-
cfg = config.py.programs.neovim;
-
in
-
{
-
options.py.programs.neovim.enable = lib.mkEnableOption "Neovim Configuration";
-
-
config.programs.neovim = lib.mkIf cfg.enable {
-
enable = true;
-
package = pkgs.py.nvim;
-
viAlias = true;
-
vimAlias = true;
-
vimdiffAlias = true;
-
withRuby = false;
-
withNodeJs = false;
-
withPython3 = false;
-
extraPackages =
-
[
-
pkgs.bottom
-
pkgs.fd
-
pkgs.gcc
-
pkgs.go
-
pkgs.nodejs
-
]
-
++ lib.optionals config.py.profiles.gui.enable [
-
pkgs.ffmpegthumbnailer
-
pkgs.fontpreview
-
pkgs.poppler
-
pkgs.ueberzug
-
];
-
};
-
}
-369
modules/home/programs/nushell/config.nu
···
-
source ~/.zoxide.nu
-
source ~/.cache/starship/init.nu
-
-
source /home/thehedgehog/.cache/starship/init.nu
-
-
let-env config = ($env | default {} config).config
-
let-env config = ($env.config | default {} hooks)
-
let-env config = ($env.config | update hooks ($env.config.hooks | default [] pre_prompt))
-
let-env config = ($env.config | update hooks.pre_prompt ($env.config.hooks.pre_prompt | append {
-
code: "
-
let direnv = (direnv export json | from json)
-
let direnv = if ($direnv | length) == 1 { $direnv } else { {} }
-
$direnv | load-env
-
"
-
}))
-
-
let-env config = {
-
ls: {
-
use_ls_colors: true # use the LS_COLORS environment variable to colorize output
-
clickable_links: true # enable or disable clickable links. Your terminal has to support links.
-
}
-
rm: {
-
always_trash: false # always act as if -t was given. Can be overridden with -p
-
}
-
cd: {
-
abbreviations: false # allows `cd s/o/f` to expand to `cd some/other/folder`
-
}
-
table: {
-
mode: rounded # basic, compact, compact_double, light, thin, with_love, rounded, reinforced, heavy, none, other
-
index_mode: always # "always" show indexes, "never" show indexes, "auto" = show indexes when a table has "index" column
-
trim: {
-
methodology: wrapping # wrapping or truncating
-
wrapping_try_keep_words: true # A strategy used by the 'wrapping' methodology
-
truncating_suffix: "..." # A suffix used by the 'truncating' methodology
-
}
-
}
-
-
explore: {
-
help_banner: true
-
exit_esc: true
-
-
command_bar_text: '#C4C9C6'
-
# command_bar: {fg: '#C4C9C6' bg: '#223311' }
-
-
status_bar_background: {fg: '#1D1F21' bg: '#C4C9C6' }
-
# status_bar_text: {fg: '#C4C9C6' bg: '#223311' }
-
-
highlight: {bg: 'yellow' fg: 'black' }
-
-
status: {
-
# warn: {bg: 'yellow', fg: 'blue'}
-
# error: {bg: 'yellow', fg: 'blue'}
-
# info: {bg: 'yellow', fg: 'blue'}
-
}
-
-
try: {
-
# border_color: 'red'
-
# highlighted_color: 'blue'
-
-
# reactive: false
-
}
-
-
table: {
-
split_line: '#404040'
-
-
cursor: true
-
-
line_index: true
-
line_shift: true
-
line_head_top: true
-
line_head_bottom: true
-
-
show_head: true
-
show_index: true
-
-
# selected_cell: {fg: 'white', bg: '#777777'}
-
# selected_row: {fg: 'yellow', bg: '#C1C2A3'}
-
# selected_column: blue
-
-
# padding_column_right: 2
-
# padding_column_left: 2
-
-
# padding_index_left: 2
-
# padding_index_right: 1
-
}
-
-
config: {
-
cursor_color: {bg: 'yellow' fg: 'black' }
-
-
# border_color: white
-
# list_color: green
-
}
-
}
-
-
history: {
-
max_size: 10000 # Session has to be reloaded for this to take effect
-
sync_on_enter: true # Enable to share history between multiple sessions, else you have to close the session to write history to file
-
file_format: "plaintext" # "sqlite" or "plaintext"
-
}
-
completions: {
-
case_sensitive: false # set to true to enable case-sensitive completions
-
quick: true # set this to false to prevent auto-selecting completions when only one remains
-
partial: true # set this to false to prevent partial filling of the prompt
-
algorithm: "prefix" # prefix or fuzzy
-
external: {
-
enable: true # set to false to prevent nushell looking into $env.PATH to find more suggestions, `false` recommended for WSL users as this look up my be very slow
-
max_results: 100 # setting it lower can improve completion performance at the cost of omitting some options
-
completer: null # check 'carapace_completer' above as an example
-
}
-
}
-
filesize: {
-
metric: true # true => KB, MB, GB (ISO standard), false => KiB, MiB, GiB (Windows standard)
-
format: "auto" # b, kb, kib, mb, mib, gb, gib, tb, tib, pb, pib, eb, eib, zb, zib, auto
-
}
-
cursor_shape: {
-
emacs: line # block, underscore, line (line is the default)
-
vi_insert: block # block, underscore, line (block is the default)
-
vi_normal: underscore # block, underscore, line (underscore is the default)
-
}
-
color_config: $dark_theme # if you want a light theme, replace `$dark_theme` to `$light_theme`
-
use_grid_icons: true
-
footer_mode: "25" # always, never, number_of_rows, auto
-
float_precision: 2 # the precision for displaying floats in tables
-
# buffer_editor: "emacs" # command that will be used to edit the current line buffer with ctrl+o, if unset fallback to $env.EDITOR and $env.VISUAL
-
use_ansi_coloring: true
-
edit_mode: emacs # emacs, vi
-
shell_integration: true # enables terminal markers and a workaround to arrow keys stop working issue
-
# true or false to enable or disable the welcome banner at startup
-
show_banner: true
-
render_right_prompt_on_last_line: false # true or false to enable or disable right prompt to be rendered on last line of the prompt.
-
-
hooks: {
-
pre_prompt: [{
-
null # replace with source code to run before the prompt is shown
-
}]
-
pre_execution: [{
-
null # replace with source code to run before the repl input is run
-
}]
-
env_change: {
-
PWD: [{|before, after|
-
null # replace with source code to run if the PWD environment is different since the last repl input
-
}]
-
}
-
display_output: {
-
if (term size).columns >= 100 { table -e } else { table }
-
}
-
}
-
menus: [
-
# Configuration for default nushell menus
-
# Note the lack of source parameter
-
{
-
name: completion_menu
-
only_buffer_difference: false
-
marker: "| "
-
type: {
-
layout: columnar
-
columns: 4
-
col_width: 20 # Optional value. If missing all the screen width is used to calculate column width
-
col_padding: 2
-
}
-
style: {
-
text: green
-
selected_text: green_reverse
-
description_text: yellow
-
}
-
}
-
{
-
name: history_menu
-
only_buffer_difference: true
-
marker: "? "
-
type: {
-
layout: list
-
page_size: 10
-
}
-
style: {
-
text: green
-
selected_text: green_reverse
-
description_text: yellow
-
}
-
}
-
{
-
name: help_menu
-
only_buffer_difference: true
-
marker: "? "
-
type: {
-
layout: description
-
columns: 4
-
col_width: 20 # Optional value. If missing all the screen width is used to calculate column width
-
col_padding: 2
-
selection_rows: 4
-
description_rows: 10
-
}
-
style: {
-
text: green
-
selected_text: green_reverse
-
description_text: yellow
-
}
-
}
-
# Example of extra menus created using a nushell source
-
# Use the source field to create a list of records that populates
-
# the menu
-
{
-
name: commands_menu
-
only_buffer_difference: false
-
marker: "# "
-
type: {
-
layout: columnar
-
columns: 4
-
col_width: 20
-
col_padding: 2
-
}
-
style: {
-
text: green
-
selected_text: green_reverse
-
description_text: yellow
-
}
-
source: { |buffer, position|
-
$nu.scope.commands
-
| where name =~ $buffer
-
| each { |it| {value: $it.name description: $it.usage} }
-
}
-
}
-
{
-
name: vars_menu
-
only_buffer_difference: true
-
marker: "# "
-
type: {
-
layout: list
-
page_size: 10
-
}
-
style: {
-
text: green
-
selected_text: green_reverse
-
description_text: yellow
-
}
-
source: { |buffer, position|
-
$nu.scope.vars
-
| where name =~ $buffer
-
| sort-by name
-
| each { |it| {value: $it.name description: $it.type} }
-
}
-
}
-
{
-
name: commands_with_description
-
only_buffer_difference: true
-
marker: "# "
-
type: {
-
layout: description
-
columns: 4
-
col_width: 20
-
col_padding: 2
-
selection_rows: 4
-
description_rows: 10
-
}
-
style: {
-
text: green
-
selected_text: green_reverse
-
description_text: yellow
-
}
-
source: { |buffer, position|
-
$nu.scope.commands
-
| where name =~ $buffer
-
| each { |it| {value: $it.name description: $it.usage} }
-
}
-
}
-
]
-
keybindings: [
-
{
-
name: completion_menu
-
modifier: none
-
keycode: tab
-
mode: [emacs vi_normal vi_insert]
-
event: {
-
until: [
-
{ send: menu name: completion_menu }
-
{ send: menunext }
-
]
-
}
-
}
-
{
-
name: completion_previous
-
modifier: shift
-
keycode: backtab
-
mode: [emacs, vi_normal, vi_insert] # Note: You can add the same keybinding to all modes by using a list
-
event: { send: menuprevious }
-
}
-
{
-
name: history_menu
-
modifier: control
-
keycode: char_r
-
mode: emacs
-
event: { send: menu name: history_menu }
-
}
-
{
-
name: next_page
-
modifier: control
-
keycode: char_x
-
mode: emacs
-
event: { send: menupagenext }
-
}
-
{
-
name: undo_or_previous_page
-
modifier: control
-
keycode: char_z
-
mode: emacs
-
event: {
-
until: [
-
{ send: menupageprevious }
-
{ edit: undo }
-
]
-
}
-
}
-
{
-
name: yank
-
modifier: control
-
keycode: char_y
-
mode: emacs
-
event: {
-
until: [
-
{edit: pastecutbufferafter}
-
]
-
}
-
}
-
{
-
name: unix-line-discard
-
modifier: control
-
keycode: char_u
-
mode: [emacs, vi_normal, vi_insert]
-
event: {
-
until: [
-
{edit: cutfromlinestart}
-
]
-
}
-
}
-
{
-
name: kill-line
-
modifier: control
-
keycode: char_k
-
mode: [emacs, vi_normal, vi_insert]
-
event: {
-
until: [
-
{edit: cuttolineend}
-
]
-
}
-
}
-
# Keybindings used to trigger the user defined menus
-
{
-
name: commands_menu
-
modifier: control
-
keycode: char_t
-
mode: [emacs, vi_normal, vi_insert]
-
event: { send: menu name: commands_menu }
-
}
-
{
-
name: vars_menu
-
modifier: alt
-
keycode: char_o
-
mode: [emacs, vi_normal, vi_insert]
-
event: { send: menu name: vars_menu }
-
}
-
{
-
name: commands_with_description
-
modifier: control
-
keycode: char_s
-
mode: [emacs, vi_normal, vi_insert]
-
event: { send: menu name: commands_with_description }
-
}
-
]
-
}
-12
modules/home/programs/nushell/default.nix
···
-
{ config, lib, ... }:
-
let
-
cfg = config.py.programs.nushell;
-
in
-
{
-
options.py.programs.nushell.enable = lib.mkEnableOption "Nushell";
-
config.programs.nushell = lib.mkIf cfg.enable {
-
enable = true;
-
configFile.source = ./config.nu;
-
envFile.source = ./env.nu;
-
};
-
}
-9
modules/home/programs/nushell/env.nu
···
-
zoxide init nushell --hook prompt | save ~/.zoxide.nu
-
mkdir ~/.cache/starship
-
starship init nu | save ~/.cache/starship/init.nu
-
-
let starship_cache = "/home/thehedgehog/.cache/starship"
-
if not ($starship_cache | path exists) {
-
mkdir $starship_cache
-
}
-
/etc/profiles/per-user/thehedgehog/bin/starship init nu | save --force /home/thehedgehog/.cache/starship/init.nu
-1
modules/home/programs/ssh/backup.pub
···
-
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM= 993390@993390-student-FVFD26HVJ1WK
-45
modules/home/programs/ssh/default.nix
···
-
{ lib, config, ... }:
-
let
-
cfg = config.py.programs.ssh;
-
in
-
{
-
options.py.programs.ssh.enable = lib.mkEnableOption "ssh";
-
config = lib.mkIf cfg.enable {
-
programs.ssh = {
-
enable = true;
-
compression = true;
-
matchBlocks = {
-
"marvin" = {
-
hostname = "100.123.15.72";
-
user = "thehedgehog";
-
port = 22;
-
extraOptions = {
-
"IdentitiesOnly" = "no";
-
"PreferredAuthentications" = "publickey";
-
};
-
};
-
"prefect" = {
-
hostname = "100.93.63.54";
-
user = "thehedgehog";
-
port = 22;
-
extraOptions = {
-
"IdentitiesOnly" = "no";
-
"PreferredAuthentications" = "publickey";
-
};
-
};
-
"botw" = {
-
hostname = "bandit.labs.overthewire.org";
-
port = 2220;
-
sendEnv = [
-
"WECHALLUSER"
-
"WECHALLTOKEN"
-
];
-
};
-
};
-
extraOptionOverrides = {
-
"Match" = ''host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"'';
-
};
-
};
-
home.file.".ssh/authorized_signatures".text = import ./ssh-auth-signers.nix;
-
};
-
}
-7
modules/home/programs/ssh/ssh-auth-signers.nix
···
-
''
-
hedgehog@mrhedgehog.xyz ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw==
-
hedgehog@mrhedgehog.xyz ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM=
-
me@thehedgehog.me ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw==
-
me@thehedgehog.me ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM=
-
me@thehedgehog.me ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK97n2SgV/U1mLzxcaEDl85iF5D3jm7xboZ+S01+CbM/8zxVoWyjVHCqTwDcrLwP0c5Z51BNj7U0UkGIgR4zTSM=
-
''
-1
modules/home/programs/ssh/yubikey-back.pub
···
-
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw== cardno:15 567 372
-1
modules/home/programs/ssh/yubikey-main.pub
···
-
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBBsOIMMZVmleClXfqUMrnmyh8PFuyiJqHKEZ51Xy746
-1
modules/home/programs/ssh/yubikey-new.pub
···
-
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK97n2SgV/U1mLzxcaEDl85iF5D3jm7xboZ+S01+CbM/8zxVoWyjVHCqTwDcrLwP0c5Z51BNj7U0UkGIgR4zTSM=
-15
modules/home/programs/starship/default.nix
···
-
{ lib, config, ... }:
-
let
-
cfg = config.py.programs.starship;
-
in
-
{
-
options.py.programs.starship.enable = lib.mkEnableOption "starship";
-
config.catppuccin.starship.enable = false;
-
config.programs.starship = lib.mkIf cfg.enable {
-
enable = true;
-
enableFishIntegration = true;
-
enableBashIntegration = true;
-
enableZshIntegration = true;
-
settings = import ./settings.nix { inherit lib; };
-
};
-
}
-100
modules/home/programs/starship/settings.nix
···
-
{ lib }:
-
{
-
format = lib.concatStrings [
-
"$hostname"
-
"$directory"
-
"$rust"
-
"$python"
-
"$golang"
-
"$nodejs"
-
"$lua"
-
"$git_branch"
-
"$git_status"
-
"$battery"
-
"$shlvl"
-
" "
-
"$character"
-
];
-
right_format = lib.concatStrings [ "$nix_shell" ];
-
-
directory = {
-
read_only = " ";
-
};
-
git_branch = {
-
symbol = " ";
-
format = "\\[[$symbol$branch]($style)\\]";
-
};
-
git_status = {
-
format = "([\\[$all_status$ahead_behind\\]]($style))";
-
};
-
golang = {
-
symbol = " ";
-
format = "\\[[$symbol($version)]($style)\\]";
-
};
-
nodejs = {
-
format = "\\[[$symbol($version)]($style)\\]";
-
};
-
lua = {
-
symbol = " ";
-
format = "\\[[\${symbol}\${version}]($style)\\]";
-
};
-
package = {
-
symbol = " ";
-
format = "\\[[$symbol$version]($style)\\]";
-
};
-
python = {
-
symbol = " ";
-
format = "\\[[\${symbol}\${pyenv_prefix}(\${version})(\\($virtualenv\\))]($style)\\]";
-
};
-
rust = {
-
symbol = " ";
-
format = "\\[[$symbol($version)]($style)\\]";
-
};
-
shlvl = {
-
symbol = " ";
-
};
-
nix_shell = {
-
symbol = " ";
-
format = "\\[[$symbol($name)]($style)\\]";
-
};
-
aws.disabled = true;
-
conda.disabled = true;
-
crystal.disabled = true;
-
dart.disabled = true;
-
deno.disabled = true;
-
docker_context.disabled = true;
-
dotnet.disabled = true;
-
elixir.disabled = true;
-
elm.disabled = true;
-
env_var.disabled = true;
-
erlang.disabled = true;
-
gcloud.disabled = true;
-
helm.disabled = true;
-
hostname.disabled = true;
-
java.disabled = true;
-
jobs.disabled = true;
-
julia.disabled = true;
-
kotlin.disabled = true;
-
kubernetes.disabled = true;
-
memory_usage.disabled = true;
-
hg_branch.disabled = true;
-
nim.disabled = true;
-
ocaml.disabled = true;
-
openstack.disabled = true;
-
perl.disabled = true;
-
php.disabled = true;
-
purescript.disabled = true;
-
rlang.disabled = true;
-
red.disabled = true;
-
ruby.disabled = true;
-
scala.disabled = true;
-
singularity.disabled = true;
-
swift.disabled = true;
-
terraform.disabled = true;
-
time.disabled = true;
-
username.disabled = true;
-
vagrant.disabled = true;
-
vlang.disabled = true;
-
vcsh.disabled = true;
-
zig.disabled = true;
-
}
-54
modules/home/programs/vscodium/default.nix
···
-
{
-
pkgs,
-
lib,
-
config,
-
...
-
}:
-
let
-
cfg = config.py.programs.vscodium;
-
in
-
{
-
options.py.programs.vscodium.enable = lib.mkEnableOption "VSCodium";
-
config.programs.vscode = lib.mkIf cfg.enable {
-
enable = true;
-
package = pkgs.vscode;
-
userSettings = {
-
"biome.lspBin" = "";
-
"breadcrumbs.enabled" = false;
-
"editor.formatOnPaste" = true;
-
"editor.formatOnSave" = true;
-
"editor.formatOnSaveMode" = "file";
-
"editor.formatOnType" = true;
-
"editor.fontSize" = 15;
-
"editor.fontFamily" = "'IBM Plex Mono', 'monospace', monospace";
-
"editor.minimap.enabled" = false;
-
"explorer.confirmDelete" = false;
-
"explorer.confirmDragAndDrop" = false;
-
"extensions.autoCheckUpdates" = false;
-
"extensions.autoUpdate" = false;
-
"extensions.closeExtensionDetailsOnViewChange" = true;
-
"extensions.ignoreRecommendations" = true;
-
"npm.keybindingsChangedWarningShown" = true;
-
"ruff.nativeServer" = true;
-
"ruff.showNotifications" = "onError";
-
"nix.enableLanguageServer" = true;
-
"nix.serverPath" = lib.getExe pkgs.nixd;
-
"[nix]" = {
-
"editor.defaultFormatter" = "brettm12345.nixfmt-vscode";
-
};
-
"python.analysis.autoImportCompletions" = true;
-
"python.analysis.autoSearchPaths" = true;
-
"python.analysis.completeFunctionParens" = true;
-
"python.experiments.enabled" = false;
-
"python.languageServer" = "Pylance";
-
"telemetry.telemetryLevel" = "off";
-
"terminal.external.linuxExec" = "ghostty";
-
"update.mode" = "none";
-
"update.showReleaseNotes" = false;
-
"workbench.colorTheme" = "Catppuccin Mocha";
-
"workbench.iconTheme" = "catppuccin-mocha";
-
"vscode-neovim.neovimExecutablePaths.linux" = lib.getExe pkgs.py.nvim;
-
"python.formatting.provider" = "black";
-
};
-
};
-
}
-55
modules/home/programs/wlogout/default.nix
···
-
{
-
pkgs,
-
config,
-
lib,
-
...
-
}:
-
let
-
cfg = config.py.programs.wlogout;
-
pkg = config.programs.wlogout.package;
-
in
-
{
-
options.py.programs.wlogout.enable = lib.mkEnableOption "wlogout";
-
config.programs.wlogout = lib.mkIf cfg.enable {
-
enable = true;
-
style = import ./style.nix { inherit pkg; };
-
layout = [
-
{
-
label = "hibernate";
-
action = "systemctl hibernate";
-
text = "Hibernate";
-
keybind = "h";
-
}
-
{
-
label = "reboot";
-
action = "systemctl reboot";
-
text = "Reboot";
-
keybind = "r";
-
}
-
{
-
label = "suspend";
-
action = "systemctl suspend";
-
text = "Suspend";
-
keybind = "u";
-
}
-
{
-
label = "suspend-then-hibernate";
-
action = "systemctl suspend-then-hibernate";
-
text = "Supend then Hibernate";
-
keybind = "p";
-
}
-
{
-
label = "lock";
-
action = "${pkgs.swaylock-effects}/bin/swaylock";
-
text = "Lock";
-
keybind = "l";
-
}
-
{
-
label = "shutdown";
-
action = "systemctl poweroff";
-
text = "Shutdown";
-
keybind = "s";
-
}
-
];
-
};
-
}
-52
modules/home/programs/wlogout/style.nix
···
-
{ pkg, ... }:
-
let
-
icon-path = "${pkg}/share/wlogout/icons";
-
in
-
''
-
* {
-
background-image: none;
-
}
-
window {
-
background-image: image(url("/home/thehedgehog/bgs/ctp-waves.png"), url("/home/thehedgehog/bgs/ctp-waves.png"));
-
background-size: cover;
-
}
-
button {
-
color: #cdd6f4;
-
background-color: #11111b;
-
border: none;
-
border-color: #6c7086;
-
background-repeat: no-repeat;
-
background-position: center;
-
background-size: 25%;
-
}
-
-
button:focus, button:active, button:hover {
-
background-color: #1e1e2e;
-
outline-style: none;
-
border:none;
-
}
-
-
#lock {
-
background-image: image(url("${icon-path}/lock.png"), url("${icon-path}/lock.png"));
-
}
-
-
#suspend-then-hibernate {
-
background-image: image(url("${icon-path}/suspend.png"), url("${icon-path}/suspend.png"));
-
}
-
-
#suspend {
-
background-image: image(url("${icon-path}/suspend.png"), url("${icon-path}/suspend.png"));
-
}
-
-
#hibernate {
-
background-image: image(url("${icon-path}/hibernate.png"), url("${icon-path}/hibernate.png"));
-
}
-
-
#shutdown {
-
background-image: image(url("${icon-path}/shutdown.png"), url("${icon-path}/shutdown.png"));
-
}
-
-
#reboot {
-
background-image: image(url("${icon-path}/reboot.png"), url("${icon-path}/reboot.png"));
-
}
-
''
-1
modules/home/scripts/default.nix
···
-
_: { }
-24
modules/home/services/gpg-agent/default.nix
···
-
{ lib, config, ... }:
-
let
-
cfg = config.py.services.gpg-agent;
-
in
-
{
-
options.py.services.gpg-agent.enable = lib.mkEnableOption "gpg-agent";
-
config.services.gpg-agent = lib.mkIf cfg.enable {
-
enable = true;
-
enableExtraSocket = true;
-
enableScDaemon = true;
-
enableSshSupport = true;
-
defaultCacheTtl = 600;
-
maxCacheTtl = 600;
-
sshKeys = [
-
# My Normal GPG Key(Authentication Subkey)
-
"485329FEF73C42C6C42879F66C8B971F3FD4A132"
-
"CFEFCD08CFE6F0849F32ABC9C5CF3158A2FE1392"
-
];
-
extraConfig = ''
-
ttyname $GPG_TTY
-
max-cache-ttl-ssh 600
-
'';
-
};
-
}
-18
modules/home/services/kanshi/default.nix
···
-
{ config, lib, ... }:
-
let
-
cfg = config.py.services.kanshi;
-
in
-
{
-
options.py.services.kanshi = {
-
enable = lib.mkEnableOption "kanshi";
-
settings = lib.mkOption {
-
type = lib.types.listOf lib.types.attrs;
-
default = [ ];
-
description = "The value of `config.services.kanshi.settings`.";
-
};
-
};
-
config.services.kanshi = lib.mkIf cfg.enable {
-
enable = true;
-
inherit (cfg) settings;
-
};
-
}
-11
modules/home/services/kdeconnect/default.nix
···
-
{ lib, config, ... }:
-
let
-
cfg = config.py.services.kdeconnect;
-
in
-
{
-
options.py.services.kdeconnect.enable = lib.mkEnableOption "KDEConnect";
-
config.services.kdeconnect = lib.mkIf cfg.enable {
-
enable = true;
-
indicator = true;
-
};
-
}
-27
modules/home/services/mako/default.nix
···
-
{ lib, config, ... }:
-
let
-
cfg = config.py.services.mako;
-
in
-
{
-
options.py.services.mako.enable = lib.mkEnableOption "mako";
-
# avoid IFD
-
config.catppuccin.mako.enable = false;
-
config.services.mako = lib.mkIf cfg.enable {
-
enable = true;
-
actions = true;
-
defaultTimeout = 10000;
-
font = "IBM Plex Sans 14pt";
-
icons = true;
-
layer = "overlay";
-
-
# Vendored Catppuccin Theme(avoids IFD)
-
backgroundColor = "#1e1e2e";
-
textColor = "#cdd6f4";
-
borderColor = "#89b4fa";
-
progressColor = "over #313244";
-
extraConfig = ''
-
[urgency=high]
-
border-color=#fab387
-
'';
-
};
-
}
-31
modules/home/services/swayidle/default.nix
···
-
{
-
pkgs,
-
config,
-
lib,
-
...
-
}:
-
let
-
cfg = config.py.services.swayidle;
-
in
-
{
-
options.py.services.swayidle.enable = lib.mkEnableOption "swayidle";
-
config.services.swayidle = lib.mkIf cfg.enable {
-
enable = true;
-
events = [
-
{
-
event = "lock";
-
command = "${pkgs.swaylock}/bin/swaylock -C ~/.config/swaylock/config";
-
}
-
{
-
event = "after-resume";
-
command = ''swaymsg "output * dpms on"'';
-
}
-
];
-
timeouts = [
-
{
-
timeout = 180;
-
command = "${pkgs.swaylock}/bin/swaylock -C ~/.config/swaylock/config";
-
}
-
];
-
};
-
}
-11
modules/home/services/syncthing/default.nix
···
-
{ lib, config, ... }:
-
let
-
cfg = config.py.services.syncthing;
-
in
-
{
-
options.py.services.syncthing.enable = lib.mkEnableOption "Syncthing";
-
config.services.syncthing = lib.mkIf cfg.enable {
-
enable = true;
-
tray.enable = true;
-
};
-
}
-44
modules/home/theming/default.nix
···
-
{
-
pkgs,
-
config,
-
lib,
-
...
-
}:
-
let
-
pro = config.py.profiles;
-
in
-
{
-
catppuccin = {
-
flavor = "mocha";
-
accent = "blue";
-
};
-
home.pointerCursor = lib.mkIf pro.gui.enable {
-
package = pkgs.catppuccin-cursors.mochaBlue;
-
name = "Catppuccin-Mocha-Blue";
-
gtk.enable = true;
-
};
-
gtk = lib.mkIf pro.gui.enable {
-
enable = true;
-
theme = {
-
name = "Colloid-Dark-Compact-Catppuccin";
-
package = pkgs.colloid-gtk-theme.override {
-
tweaks = [
-
"catppuccin"
-
"black"
-
];
-
colorVariants = [ "dark" ];
-
sizeVariants = [ "compact" ];
-
themeVariants = [ "default" ];
-
};
-
};
-
font = {
-
name = "IBM Plex Mono";
-
size = 14;
-
};
-
gtk3.bookmarks = [ "file:///${config.home.homeDirectory}/Downloads" ];
-
iconTheme = {
-
package = pkgs.colloid-icon-theme;
-
name = "Colloid-Dark";
-
};
-
};
-
}
-8
modules/home/wayland/default.nix
···
-
{
-
imports = [
-
./sway.nix
-
./keybindings.nix
-
./waybar.nix
-
./swaylock.nix
-
];
-
}
-46
modules/home/wayland/keybindings.nix
···
-
{ config, lib, ... }:
-
let
-
inherit (config.wayland.windowManager.sway.config) menu;
-
mod = config.wayland.windowManager.sway.config.modifier;
-
term = config.wayland.windowManager.sway.config.terminal;
-
grim = "grim -g";
-
slurp-screen = "\"$(slurp -c -b '#1e1e2e80' -o -r)\" -";
-
slurp-box = "\"$(slurp -c '#f38ba8ff' -b '#1e1e2e80' -w 1 -d -F 'IBM Plex Mono')\" -";
-
satty = "satty -f -";
-
cfg = config.py.gui;
-
in
-
{
-
config.wayland.windowManager.sway.config.keybindings = lib.mkIf cfg.enable (
-
lib.mkOptionDefault {
-
"${mod}+d" = "${menu}";
-
"${mod}+Shift+F" = "exec MOZ_DISABLE_RDD_SANDBOX=1 firefox";
-
"${mod}+Return" = "exec ${term}";
-
# "${mod}+Shift+Return" = "exec ${pkgs.wezterm}/bin/wezterm";
-
"${mod}+x" = "exec wlogout";
-
"${mod}+s" = null;
-
"${mod}+w" = null;
-
"XF86MonBrightnessDown" = "exec brightnessctl set 5%-";
-
"XF86MonBrightnessUp" = "exec brightnessctl set +5%";
-
"XF86AudioRaiseVolume" = "exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+";
-
"XF86AudioLowerVolume" = "exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-";
-
"XF86AudioMute" = "exec wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle";
-
"XF86AudioMicMute" = "exec wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle";
-
"XF86AudioPlay" = "exec playerctl play-pause";
-
"XF86AudioNext" = "exec playerctl next";
-
"XF86AudioPrev" = "exec playerctl previous";
-
"Shift+F3" = "exec ${grim} ${slurp-screen} | ${satty}";
-
"Shift+F4" = "exec ${grim} ${slurp-box} | ${satty}";
-
"${mod}+Shift+1" = "move container to workspace number 1";
-
"${mod}+Shift+2" = "move container to workspace number 2";
-
"${mod}+Shift+3" = "move container to workspace number 3";
-
"${mod}+Shift+4" = "move container to workspace number 4";
-
"${mod}+Shift+5" = "move container to workspace number 5";
-
"${mod}+Shift+6" = "move container to workspace number 6";
-
"${mod}+Shift+7" = "move container to workspace number 7";
-
"${mod}+Shift+8" = "move container to workspace number 8";
-
"${mod}+Shift+9" = "move container to workspace number 9";
-
"${mod}+Shift+0" = "move container to workspace number 10";
-
"${mod}+0" = "workspace number 10";
-
}
-
);
-
}
-162
modules/home/wayland/sway.nix
···
-
{
-
pkgs,
-
config,
-
lib,
-
...
-
}:
-
let
-
term = config.wayland.windowManager.sway.config.terminal;
-
homeDir = config.home.homeDirectory;
-
cfg = config.py.gui;
-
in
-
{
-
options.py.gui = {
-
enable = lib.mkEnableOption "GUI Configuration";
-
};
-
config = lib.mkIf cfg.enable {
-
catppuccin = {
-
sway.enable = true;
-
};
-
home.sessionVariables = {
-
XDG_CURRENT_DESKTOP = "sway";
-
};
-
wayland.windowManager.sway = {
-
enable = lib.mkDefault true;
-
package = null;
-
# nix-community/home-manager/issues/5311
-
checkConfig = false;
-
wrapperFeatures.base = true;
-
wrapperFeatures.gtk = true;
-
extraConfig = ''
-
default_border pixel
-
focus_on_window_activation smart
-
'';
-
systemd = {
-
enable = true;
-
xdgAutostart = true;
-
};
-
config = {
-
terminal = lib.getExe pkgs.ghostty;
-
menu = "exec ${term} --class=py.floating --window-height=15 --window-width=10 --font-size=16 -e ${pkgs.sway-launcher-desktop}/bin/sway-launcher-desktop";
-
modifier = "Mod4";
-
bars = [ { command = "true"; } ];
-
focus = {
-
followMouse = true;
-
mouseWarping = true;
-
newWindow = "smart";
-
};
-
fonts = {
-
names = [ "IBM Plex Sans" ];
-
style = "Regular";
-
size = 12.0;
-
};
-
gaps = {
-
inner = 4;
-
outer = 4;
-
smartBorders = "off";
-
smartGaps = false;
-
};
-
input = {
-
"type:keyboard" = {
-
xkb_options = "caps:escape";
-
};
-
"type:mouse" = {
-
accel_profile = "flat";
-
};
-
"type:touchpad" = {
-
accel_profile = "adaptive";
-
scroll_factor = "1.5";
-
tap = "enabled";
-
};
-
};
-
modes = {
-
resize = {
-
Escape = "mode default";
-
Return = "mode default";
-
Up = "resize shrink height 10 px";
-
Down = "resize grow height 10 px";
-
Left = "resize shrink width 10 px";
-
Right = "resize grow width 10 px";
-
h = "resize shrink width 10 px";
-
j = "resize grow height 10 px";
-
k = "resize shrink height 10 px";
-
l = "resize grow width 10 px";
-
};
-
};
-
output = {
-
eDP-1 = {
-
scale = "1.2";
-
};
-
"*" = {
-
bg = "${homeDir}/bgs/xenia-hangout-mocha.png fill";
-
};
-
};
-
startup = [
-
{ command = "${pkgs.dex}/bin/dex -a"; }
-
{ command = "${homeDir}/scripts/unfuck-xdg-portals.fish"; }
-
{ command = "wl-paste -t text --watch clipman store --no-persist"; }
-
];
-
window = {
-
commands = [
-
{
-
command = "inhibit_idle fullscreen";
-
criteria = {
-
class = "Chromium|zoom|Firefox";
-
};
-
}
-
{
-
command = "floating enable, sticky enable, resize set 20 ppt 40 ppt, border pixel 4";
-
criteria = {
-
app_id = "^py.floating$";
-
};
-
}
-
{
-
command = "resize set 20 ppt";
-
criteria = {
-
title = "Mumble PTT";
-
};
-
}
-
];
-
};
-
colors = {
-
background = "$base";
-
focused = {
-
border = "$pink";
-
background = "$base";
-
text = "$text";
-
indicator = "$rosewater";
-
childBorder = "$pink";
-
};
-
focusedInactive = {
-
border = "$mauve";
-
background = "$base";
-
text = "$text";
-
indicator = "$rosewater";
-
childBorder = "$mauve";
-
};
-
unfocused = {
-
border = "$mauve";
-
background = "$base";
-
text = "$text";
-
indicator = "$rosewater";
-
childBorder = "$mauve";
-
};
-
urgent = {
-
border = "$peach";
-
background = "$base";
-
text = "$peach";
-
indicator = "$overlay0";
-
childBorder = "$peach";
-
};
-
placeholder = {
-
border = "$overlay0";
-
background = "$base";
-
text = "$text";
-
indicator = "$overlay0";
-
childBorder = "$overlay0";
-
};
-
};
-
};
-
};
-
};
-
}
-61
modules/home/wayland/swaylock.nix
···
-
{ lib, config, ... }:
-
let
-
cfg = config.py.gui;
-
in
-
{
-
catppuccin = {
-
swaylock.enable = false;
-
};
-
programs.swaylock = lib.mkIf cfg.enable {
-
enable = lib.mkDefault true;
-
settings = {
-
daemonize = true;
-
image = "/home/thehedgehog/bgs/ctp-waves.png";
-
scaling = "fill";
-
line-uses-ring = true;
-
ignore-empty-password = true;
-
clock = true;
-
timestr = "%T";
-
effect-blur = "5x5";
-
-
font = "IBM Plex Sans";
-
font-size = 20;
-
-
indicator = true;
-
indicator-idle-visible = true;
-
indicator-radius = 100;
-
indicator-thickness = 5;
-
-
# Catppuccin Theme(avoid IFD by vendoring it in here)
-
color = "1e1e2e";
-
bs-hl-color = "f5e0dc";
-
caps-lock-bs-hl-color = "f5e0dc";
-
caps-lock-key-hl-color = "a6e3a1";
-
inside-color = "00000000";
-
inside-clear-color = "00000000";
-
inside-caps-lock-color = "00000000";
-
inside-ver-color = "00000000";
-
inside-wrong-color = "00000000";
-
key-hl-color = "a6e3a1";
-
layout-bg-color = "00000000";
-
layout-border-color = "00000000";
-
layout-text-color = "cdd6f4";
-
line-color = "00000000";
-
line-clear-color = "00000000";
-
line-caps-lock-color = "00000000";
-
line-ver-color = "00000000";
-
line-wrong-color = "00000000";
-
ring-color = "b4befe";
-
ring-clear-color = "f5e0dc";
-
ring-caps-lock-color = "fab387";
-
ring-ver-color = "89b4fa";
-
ring-wrong-color = "eba0ac";
-
separator-color = "00000000";
-
text-color = "cdd6f4";
-
text-clear-color = "f5e0dc";
-
text-caps-lock-color = "fab387";
-
text-ver-color = "89b4fa";
-
text-wrong-color = "eba0ac";
-
};
-
};
-
}
-37
modules/home/wayland/waybar-mocha.css
···
-
/*
-
*
-
* Catppuccin Mocha palette
-
* Maintainer: rubyowo
-
*
-
*/
-
-
@define-color base #1e1e2e;
-
@define-color mantle #181825;
-
@define-color crust #11111b;
-
-
@define-color text #cdd6f4;
-
@define-color subtext0 #a6adc8;
-
@define-color subtext1 #bac2de;
-
-
@define-color surface0 #313244;
-
@define-color surface1 #45475a;
-
@define-color surface2 #585b70;
-
-
@define-color overlay0 #6c7086;
-
@define-color overlay1 #7f849c;
-
@define-color overlay2 #9399b2;
-
-
@define-color blue #89b4fa;
-
@define-color lavender #b4befe;
-
@define-color sapphire #74c7ec;
-
@define-color sky #89dceb;
-
@define-color teal #94e2d5;
-
@define-color green #a6e3a1;
-
@define-color yellow #f9e2af;
-
@define-color peach #fab387;
-
@define-color maroon #eba0ac;
-
@define-color red #f38ba8;
-
@define-color mauve #cba6f7;
-
@define-color pink #f5c2e7;
-
@define-color flamingo #f2cdcd;
-
@define-color rosewater #f5e0dc;
-119
modules/home/wayland/waybar-style.css
···
-
@import "mocha.css";
-
#waybar {
-
font-family:
-
BlexMono Nerd Font,
-
sans-serif;
-
font-size: 16px;
-
}
-
-
#window {
-
padding: 0 10px;
-
}
-
-
window#waybar {
-
border: none;
-
border-radius: 0;
-
box-shadow: none;
-
text-shadow: none;
-
transition-duration: 0s;
-
color: @text;
-
background: @base;
-
}
-
-
#workspaces {
-
margin: 0 5px;
-
}
-
-
#workspaces button {
-
padding: 0 8px;
-
color: @text;
-
border: 2px solid @subtext0;
-
border-radius: 10px;
-
min-width: 25px;
-
margin-right: 8px;
-
}
-
-
#workspaces button.visible {
-
color: @subtext0;
-
}
-
-
#workspaces button.focused {
-
border: 3px solid @mauve;
-
}
-
-
#workspaces button.urgent {
-
background-color: @red;
-
}
-
-
#workspaces button:hover {
-
box-shadow: inherit;
-
border-color: @blue;
-
color: @blue;
-
}
-
-
/* Repeat style here to ensure properties are overwritten as there's no !important and button:hover above resets the colour */
-
-
#workspaces button.focused {
-
color: @subtext0;
-
}
-
#workspaces button.focused:hover {
-
color: @text;
-
}
-
-
#tray,
-
#mode,
-
#battery,
-
#temperature,
-
#cpu,
-
#memory,
-
#network,
-
#wireplumber,
-
#clock,
-
#idle_inhibitor,
-
#sway-language,
-
#backlight {
-
padding: 2px 8px;
-
margin: 2px 5px;
-
color: @text;
-
}
-
-
#tray:hover,
-
#mode:hover,
-
#battery:hover,
-
#temperature:hover,
-
#cpu:hover,
-
#memory:hover,
-
#network:hover,
-
#wireplumber:hover,
-
#clock:hover,
-
#idle_inhibitor:hover,
-
#sway-language:hover,
-
#backlight:hover {
-
padding: 2px 8px;
-
margin: 2px 5px;
-
color: @base;
-
background-color: @subtext1;
-
}
-
-
#clock {
-
font-weight: bold;
-
}
-
-
#battery.warning {
-
color: @yellow;
-
}
-
-
#battery.critical {
-
color: @red;
-
}
-
-
#battery.charging {
-
color: @green;
-
}
-
-
@keyframes blink {
-
to {
-
background-color: #ffffff;
-
color: black;
-
}
-
}
-156
modules/home/wayland/waybar.nix
···
-
{
-
pkgs,
-
lib,
-
config,
-
inputs,
-
system,
-
...
-
}:
-
let
-
cfg = config.py.gui;
-
in
-
{
-
config = {
-
xdg.configFile."waybar/mocha.css" = lib.mkIf cfg.enable {
-
source = ./waybar-mocha.css;
-
recursive = false;
-
};
-
catppuccin.waybar.enable = false;
-
programs.waybar = lib.mkIf cfg.enable {
-
enable = lib.mkDefault true;
-
systemd.enable = true;
-
systemd.target = "sway-session.target";
-
style = ./waybar-style.css;
-
settings = {
-
mainBar = {
-
layer = "top";
-
position = "top";
-
height = 32;
-
modules-left = [
-
"sway/workspaces"
-
"sway/mode"
-
];
-
modules-center = [ "custom/media" ];
-
modules-right = [
-
"idle_inhibitor"
-
"wireplumber"
-
"network"
-
"temperature"
-
"backlight"
-
"battery"
-
"clock"
-
"tray"
-
];
-
"sway/workspaces" = {
-
disable-scroll = true;
-
enable-bar-scroll = false;
-
active-only = false;
-
all-outputs = false;
-
format = "{icon}";
-
};
-
"idle_inhibitor" = {
-
format = "{icon}";
-
format-icons = {
-
"activated" = "";
-
"deactivated" = "";
-
};
-
};
-
"tray" = {
-
icon-size = 25;
-
spacing = 12;
-
};
-
"clock" = {
-
tooltip-format = "<tt><small>{calendar}</small></tt>";
-
format = "{:%H:%M:%S}  ";
-
format-alt = "{%d %b %Y}";
-
interval = 1;
-
};
-
"cpu" = {
-
format = "{usage}% ";
-
interval = 5;
-
tooltip = false;
-
};
-
"memory" = {
-
format = "{}% ";
-
};
-
"temperature" = {
-
critical-threshold = 80;
-
format = "{temperatureC}°C {icon}";
-
format-icons = [
-
""
-
""
-
""
-
""
-
""
-
];
-
};
-
"backlight" = {
-
format = "{percent}% {icon}";
-
format-icons = [
-
"󰃚"
-
"󰃛"
-
"󰃜"
-
"󰃝"
-
"󰃞"
-
"󰃟"
-
"󰃠"
-
];
-
};
-
"battery" = {
-
states = {
-
good = 80;
-
warning = 30;
-
critical = 15;
-
};
-
format = "{capacity}% {icon}";
-
format-charging = "{capacity}% 󰂄";
-
format-plugged = "{capacity}% ";
-
format-alt = "{time} {icon}";
-
format-icons = [
-
"󰂎"
-
"󰁺"
-
"󰁻"
-
"󰁼"
-
"󰁽"
-
"󰁾"
-
"󰁿"
-
"󰂀"
-
"󰂁"
-
"󰂂"
-
"󰁹"
-
];
-
};
-
"network" = {
-
format-wifi = "{essid} <big></big>";
-
format-ethernet = "{ifname}: {ipaddr}/{cidr} 󰈀";
-
format-linked = "{ifname} (No IP) 󰄡";
-
format-disconnected = "Disconnected! ⚠";
-
format-alt = "{ifname}: {ipaddr}/{cidr}";
-
on-click = lib.getExe pkgs.networkmanagerapplet;
-
};
-
"wireplumber" = {
-
format = "{volume}% {icon}";
-
format-muted = "󰝟";
-
format-icons = [
-
""
-
""
-
""
-
];
-
on-click = lib.getExe pkgs.pwvucontrol;
-
};
-
"custom/media" = {
-
format = "{icon}{}";
-
return-type = "json";
-
format-icons = {
-
Paused = " ";
-
Playing = " ";
-
};
-
max-length = 70;
-
exec = ''${lib.getExe pkgs.playerctl} -a metadata --format '{"text": "{{playerName}}: {{artist}} - {{markup_escape(title)}}", "tooltip": "{{playerName}} : {{markup_escape(title)}}", "alt": "{{status}}", "class": "{{status}}"}' -F'';
-
on-click = "${lib.getExe pkgs.playerctl} play-pause";
-
};
-
};
-
};
-
};
-
};
-
}
-127
modules/home/xdg/default.nix
···
-
{
-
config,
-
lib,
-
pkgs,
-
...
-
}:
-
let
-
homeDir = config.home.homeDirectory;
-
pro = config.py.profiles;
-
in
-
{
-
xdg = {
-
enable = true;
-
mime.enable = lib.mkIf pro.gui.enable true;
-
configHome = lib.mkForce "${homeDir}/.config";
-
dataHome = lib.mkForce "${homeDir}/.local/share";
-
portal = lib.mkIf pro.gui.enable {
-
enable = true;
-
xdgOpenUsePortal = true;
-
extraPortals = [
-
pkgs.xdg-desktop-portal-gtk
-
pkgs.xdg-desktop-portal-wlr
-
];
-
config = {
-
common = {
-
default = [ "gtk" ];
-
"org.freedesktop.impl.portal.Screenshot" = [ "wlr" ];
-
"org.freedesktop.impl.portal.ScreenCast" = [ "wlr" ];
-
};
-
};
-
};
-
mimeApps = lib.mkIf pro.gui.enable {
-
enable = true;
-
associations.added = {
-
"application/pdf" = [ "firefox.desktop" ];
-
"application/rdf+xml" = [ "firefox.desktop" ];
-
"application/rss+xml" = [ "firefox.desktop" ];
-
"application/xhtml+xml" = [ "firefox.desktop" ];
-
"application/xhtml_xml" = [ "firefox.desktop" ];
-
"application/xml" = [ "firefox.desktop" ];
-
"image/gif" = [
-
"viewnior.desktop"
-
"firefox.desktop"
-
];
-
"image/jpeg" = [
-
"viewnior.desktop"
-
"firefox.desktop"
-
];
-
"image/png" = [
-
"viewnior.desktop"
-
"firefox.desktop"
-
];
-
"image/webp" = [
-
"viewnior.desktop"
-
"firefox.desktop"
-
];
-
"text/html" = [ "firefox.desktop" ];
-
"text/xml" = [ "firefox.desktop" ];
-
"x-scheme-handler/http" = [ "firefox.desktop" ];
-
"x-scheme-handler/https" = [ "firefox.desktop" ];
-
"x-scheme-handler/about" = [ "firefox.desktop" ];
-
"x-scheme-handler/unknown" = [ "firefox.desktop" ];
-
"x-scheme-handler/mailto" = [
-
"thunderbird.desktop"
-
"firefox.desktop"
-
];
-
"x-scheme-handler/webcal" = [
-
"firefox.desktop"
-
"thunderbird.desktop"
-
];
-
};
-
defaultApplications = {
-
"application/pdf" = [ "firefox.desktop" ];
-
"application/rdf+xml" = [ "firefox.desktop" ];
-
"application/rss+xml" = [ "firefox.desktop" ];
-
"application/xhtml+xml" = [ "firefox.desktop" ];
-
"application/xhtml_xml" = [ "firefox.desktop" ];
-
"application/xml" = [ "firefox.desktop" ];
-
"image/gif" = [
-
"viewnior.desktop"
-
"firefox.desktop"
-
];
-
"image/jpeg" = [
-
"viewnior.desktop"
-
"firefox.desktop"
-
];
-
"image/png" = [
-
"viewnior.desktop"
-
"firefox.desktop"
-
];
-
"image/webp" = [
-
"viewnior.desktop"
-
"firefox.desktop"
-
];
-
"text/html" = [ "firefox.desktop" ];
-
"text/xml" = [ "firefox.desktop" ];
-
"x-scheme-handler/http" = [ "firefox.desktop" ];
-
"x-scheme-handler/https" = [ "firefox.desktop" ];
-
"x-scheme-handler/about" = [ "firefox.desktop" ];
-
"x-scheme-handler/unknown" = [ "firefox.desktop" ];
-
"x-scheme-handler/mailto" = [
-
"thunderbird.desktop"
-
"firefox.desktop"
-
];
-
"x-scheme-handler/webcal" = [
-
"firefox.desktop"
-
"thunderbird.desktop"
-
];
-
"x-scheme-handler/steam" = [
-
"steam-native.desktop"
-
"steam.desktop"
-
];
-
"x-scheme-handler/steamlink" = [
-
"steam-native.desktop"
-
"steam.desktop"
-
];
-
};
-
};
-
userDirs = {
-
enable = true;
-
createDirectories = true;
-
music = "$HOME/music";
-
publicShare = "$HOME/.xdg/share";
-
templates = "$HOME/.xdg/templates";
-
};
-
};
-
}
-73
modules/nixos/default-config/bootloader.nix
···
-
{
-
boot = {
-
tmp.cleanOnBoot = true;
-
# Disable unused kernel modules
-
# https://madaidans-insecurities.github.io/guides/linux-hardening.html?#kasr-kernel-modules
-
blacklistedKernelModules = [
-
# Obscure network protocols
-
"af_802154"
-
"appletalk"
-
"atm"
-
"ax25"
-
"can"
-
"dccp"
-
"decnet"
-
"econet"
-
"ipx"
-
"n-hdlc"
-
"netrom"
-
"p8022"
-
"p8023"
-
"psnap"
-
"rds"
-
"rose"
-
"sctp"
-
"tipc"
-
"x25"
-
# Old or rare or insufficiently audited filesystems
-
# or ones I just don't want loaded
-
"adfs"
-
"affs"
-
"befs"
-
"bfs"
-
"cramfs"
-
"efs"
-
"erofs"
-
"f2fs"
-
"freevxfs"
-
"hfs"
-
"hfsplus"
-
"hpfs"
-
"jffs2"
-
"jfs"
-
"minix"
-
"nilfs2"
-
"ntfs"
-
"ocfs2"
-
"omfs"
-
"orangefs"
-
"qnx4"
-
"qnx6"
-
"reiserfs"
-
"sysv"
-
"ubifs"
-
"ufs"
-
# Network filesystems - I don't use these
-
"gfs2"
-
"nfs"
-
"nfsv3"
-
"nfsv4"
-
# Vivid driver
-
# Only used for testing purposes, has caused security issues. Disable.
-
"vivid"
-
];
-
-
kernelParams = [
-
# Page allocator randomization
-
# Should hardon and improve performance
-
"page_alloc.shuffle=1"
-
# Disable debugfs - not needed
-
"debugfs=off"
-
];
-
};
-
}
-24
modules/nixos/default-config/default.nix
···
-
{ pkgs, ... }:
-
{
-
imports = [
-
./bootloader.nix
-
./networking.nix
-
./nixConfig.nix
-
./nixpkgsConfig.nix
-
./packages.nix
-
./programs
-
./root.nix
-
./security.nix
-
./services
-
./ssh.nix
-
./users.nix
-
];
-
system.stateVersion = "25.05";
-
system.disableInstallerTools = true;
-
nix.package = pkgs.nixVersions.stable;
-
catppuccin = {
-
flavor = "mocha";
-
accent = "mauve";
-
tty.enable = true;
-
};
-
}
-38
modules/nixos/default-config/networking.nix
···
-
{ pkgs, lib, ... }:
-
{
-
networking = {
-
networkmanager.plugins = lib.mkForce [ pkgs.networkmanager-openvpn ];
-
nameservers = [
-
"9.9.9.9"
-
"fd42:d42:d42:53::1"
-
"fd42:d42:d42:54::1"
-
"172.23.0.53"
-
"172.20.0.53"
-
];
-
timeServers = [
-
"0.pool.ntp.org"
-
"1.pool.ntp.org"
-
"2.pool.ntp.org"
-
"3.pool.ntp.org"
-
];
-
resolvconf.extraConfig = ''
-
name_servers="9.9.9.9 fd42:d42:d42:53::1 fd42:d42:d42:54::1 172.23.0.53 172.20.0.53"
-
'';
-
};
-
boot.kernel.sysctl = {
-
# Disable ICMP Redirects
-
# https://askubuntu.com/questions/118273/what-are-icmp-redirects-and-should-they-be-blocked
-
"net.ipv4.conf.all.accept_redirects" = 0;
-
"net.ipv4.conf.default.accept_redirects" = 0;
-
"net.ipv4.conf.all.secure_redirects" = 0;
-
"net.ipv4.conf.default.secure_redirects" = 0;
-
"net.ipv6.conf.all.accept_redirects" = 0;
-
"net.ipv6.conf.default.accept_redirects" = 0;
-
};
-
# Disable *-wait-online services as they block rebuilds often.
-
# https://github.com/NixOS/nixpkgs/issues/180175
-
systemd.services = {
-
NetworkManager-wait-online.enable = lib.mkForce false;
-
systemd-networkd-wait-online.enable = lib.mkForce false;
-
};
-
}
-102
modules/nixos/default-config/nixConfig.nix
···
-
{
-
pkgs,
-
lib,
-
inputs,
-
...
-
}:
-
let
-
userList = [
-
"root"
-
"thehedgehog"
-
"pyrox"
-
];
-
flakeInputs = lib.filterAttrs (name: value: (value ? outputs) && (name != "self")) inputs;
-
in
-
{
-
nix = {
-
enable = true;
-
# We use `nh.clean` instead, so this is disabled
-
gc.automatic = false;
-
registry = lib.mapAttrs (_: v: { flake = v; }) flakeInputs;
-
settings = {
-
# Don't auto-accept flake-defined nix settings, they're a CVE waiting to happen.
-
accept-flake-config = false;
-
# Allow these users to access the daemon
-
allowed-users = userList;
-
# No pre-defined nixbld users
-
auto-allocate-uids = true;
-
# Always optimize the store
-
auto-optimise-store = true;
-
# Compress build logs to save space
-
compress-build-log = true;
-
# Use all available cores to build
-
cores = 0;
-
experimental-features = [
-
# Use auto-generated uids instead of users in the nixbld group
-
"auto-allocate-uids"
-
# Can allow saving space in the store by content-addressing instead of input-addressing derivations
-
"ca-derivations"
-
# Build inside cgroups
-
"cgroups"
-
# Duh
-
"flakes"
-
# Nix3 CLI
-
"nix-command"
-
# Disallow URL Literals as they are deprecated
-
"no-url-literals"
-
# Allow Nix to call itself
-
"recursive-nix"
-
];
-
# Build from source if substitution fails
-
fallback = true;
-
# Write an empty flake registry
-
flake-registry = pkgs.writers.writeJSON "registry-empty.json" {
-
flakes = [ ];
-
version = 2;
-
};
-
# allow keeping direnv gc roots
-
keep-derivations = true;
-
# Keep going even if a build fails, so that all possible succeeding builds do
-
keep-going = true;
-
# More direnv gc root stuff
-
keep-outputs = true;
-
# Show fewer log lines from failed builds since I get them from nh
-
log-lines = 10;
-
# Extra system features
-
system-features = [
-
"big-parallel"
-
"kvm"
-
"nixos-test"
-
"recursive-nix"
-
];
-
# The pubkeys of the below substituters
-
trusted-public-keys = [
-
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
-
"crane.cachix.org-1:8Scfpmn9w+hGdXH/Q9tTLiYAE/2dnJYRJP7kl80GuRk="
-
"isabelroses.cachix.org-1:mXdV/CMcPDaiTmkQ7/4+MzChpOe6Cb97njKmBQQmLPM="
-
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
-
"nixpkgs-wayland.cachix.org-1:3lwxaILxMRkVhehr5StQprHdEo4IrE8sRho9R9HOLYA="
-
"viperml.cachix.org-1:qZhKBMTfmcLL+OG6fj/hzsMEedgKvZVFRRAhq7j8Vh8="
-
];
-
# Extra substituters
-
trusted-substituters = [
-
"https://cache.nixos.org"
-
"https://crane.cachix.org"
-
"https://isabelroses.cachix.org"
-
"https://nix-community.cachix.org"
-
"https://nixpkgs-wayland.cachix.org"
-
"https://viperml.cachix.org"
-
];
-
# These users have additional daemon rights
-
trusted-users = userList;
-
# Use cgroups for building
-
use-cgroups = true;
-
# Allow use of the registry
-
use-registries = true;
-
# XDG base dirs to avoid cluttering $HOME
-
use-xdg-base-directories = true;
-
# I almost always work in a dirty tree, I know it's dirty
-
warn-dirty = false;
-
};
-
};
-
}
-7
modules/nixos/default-config/nixpkgsConfig.nix
···
-
{
-
nixpkgs = {
-
config = {
-
allowUnfree = true;
-
};
-
};
-
}
-20
modules/nixos/default-config/packages.nix
···
-
{ pkgs, ... }:
-
{
-
environment.systemPackages = with pkgs; [
-
direnv
-
doggo
-
fzf
-
kitty.terminfo
-
lazygit
-
nix-output-monitor
-
pciutils
-
py.customGit
-
ripgrep
-
tailscale
-
unrar
-
unzip
-
wezterm.terminfo
-
zip
-
usbutils
-
];
-
}
-7
modules/nixos/default-config/programs/default.nix
···
-
{
-
imports = [
-
./ssh.nix
-
./nh.nix
-
];
-
programs.fish.enable = true;
-
}
-9
modules/nixos/default-config/programs/nh.nix
···
-
{ inputs, ... }:
-
{
-
programs.nh = {
-
enable = true;
-
package = inputs.nh.packages.x86_64-linux.default;
-
clean.enable = true;
-
clean.extraArgs = "-k 5";
-
};
-
}
-35
modules/nixos/default-config/programs/ssh.nix
···
-
{
-
programs.ssh = {
-
ciphers = [
-
"chacha20-poly1305@openssh.com"
-
"aes256-gcm@openssh.com"
-
"aes128-gcm@openssh.com"
-
"aes256-ctr"
-
"aes192-ctr"
-
"aes128-ctr"
-
];
-
macs = [
-
"umac-128-etm@openssh.com"
-
"hmac-sha2-256-etm@openssh.com"
-
"hmac-sha2-512-etm@openssh.com"
-
];
-
kexAlgorithms = [
-
# Experimental, disabled for now.
-
# "sntrup761x25519-sha512@openssh.com"
-
"curve25519-sha256"
-
"curve25519-sha256@libssh.org"
-
# Disabled for being 2048-bit
-
# "diffie-hellman-group-exchange-sha256"
-
];
-
hostKeyAlgorithms = [
-
"ssh-ed25519-cert-v01@openssh.com"
-
"sk-ssh-ed25519-cert-v01@openssh.com"
-
"rsa-sha2-512-cert-v01@openssh.com"
-
"rsa-sha2-256-cert-v01@openssh.com"
-
"ssh-ed25519"
-
"sk-ssh-ed25519@openssh.com"
-
"rsa-sha2-512"
-
"rsa-sha2-256"
-
];
-
};
-
}
-8
modules/nixos/default-config/root.nix
···
-
{
-
users.users.root = {
-
openssh.authorizedKeys.keys = [
-
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw=="
-
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM="
-
];
-
};
-
}
modules/nixos/default-config/secrets/powerdns-secrets.age

This is a binary file and will not be displayed.

-22
modules/nixos/default-config/secrets/secrets.nix
···
-
let
-
prefect = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP532AB5mkNvE29MkDDY8HEf8ZdktGWiI0PzLrvbmLQe";
-
thought = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGkJcLykggEp427h2IywoiR74Yl3N+FU6Pwx9ZFQ3vjq";
-
yubi-back = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw==";
-
yubi-main = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBBsOIMMZVmleClXfqUMrnmyh8PFuyiJqHKEZ51Xy746";
-
backup = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM=";
-
marvin = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP60B1IOdfJRrDcCKajMV8YJNC01gSsccZi3DKHlS6YJ";
-
servers = [
-
prefect
-
thought
-
marvin
-
];
-
personal = [
-
yubi-back
-
yubi-main
-
backup
-
];
-
all-keys = servers ++ personal;
-
in
-
{
-
"powerdns-secrets.age".publicKeys = all-keys;
-
}
-35
modules/nixos/default-config/security.nix
···
-
{ pkgs, ... }:
-
{
-
# Everything should use doas instead of sudo
-
# Sudo is kept enabled for tools that ~can't~ won't use doas.
-
security = {
-
doas = {
-
enable = true;
-
wheelNeedsPassword = false;
-
};
-
# Needed for nixos-rebuild to work properly
-
sudo.enable = true;
-
-
# TPM configuration
-
tpm2 = {
-
enable = true;
-
abrmd.enable = true;
-
applyUdevRules = true;
-
pkcs11.enable = false;
-
};
-
-
# Set up extra certificates for DN42 specifically
-
pki.certificateFiles = [
-
(pkgs.fetchurl {
-
url = "https://dn42.burble.com/burble-dn42-ca.pem";
-
name = "burble-dn42-ca.pem";
-
sha256 = "0wcrjkiav018bpl87583g0v60clx3jg3wfyf8d9h8zdkwcb16b2g";
-
})
-
(pkgs.fetchurl {
-
url = "https://aur.archlinux.org/cgit/aur.git/plain/dn42.crt?h=ca-certificates-dn42&id=646f7effb290adf25c7e9fea3b41bf055522ba29";
-
name = "dn42.crt";
-
sha256 = "sha256-wsMeC9/tlppSNZGrqfZFLAjv3AMj1KwIAWeh2XBpiYs=";
-
})
-
];
-
};
-
}
-6
modules/nixos/default-config/services/default.nix
···
-
{
-
imports = [
-
./ntp.nix
-
./tailscale.nix
-
];
-
}
-5
modules/nixos/default-config/services/ntp.nix
···
-
{
-
services.ntp = {
-
enable = true;
-
};
-
}
-5
modules/nixos/default-config/services/tailscale.nix
···
-
{
-
services.tailscale = {
-
enable = true;
-
};
-
}
-34
modules/nixos/default-config/ssh.nix
···
-
{
-
age.identityPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
-
services.openssh = {
-
enable = false;
-
allowSFTP = false;
-
settings = {
-
PermitRootLogin = "prohibit-password";
-
PasswordAuthentication = false;
-
KbdInteractiveAuthentication = false;
-
KexAlgorithms = [
-
# Experimental, disabled for now.
-
# "sntrup761x25519-sha512@openssh.com"
-
"curve25519-sha256"
-
"curve25519-sha256@libssh.org"
-
# Disabled for being 2048-bit
-
# "diffie-hellman-group-exchange-sha256"
-
];
-
Ciphers = [
-
"chacha20-poly1305@openssh.com"
-
"aes256-gcm@openssh.com"
-
"aes128-gcm@openssh.com"
-
"aes256-ctr"
-
"aes192-ctr"
-
"aes128-ctr"
-
];
-
Macs = [
-
"hmac-sha2-512-etm@openssh.com"
-
"hmac-sha2-256-etm@openssh.com"
-
"umac-128-etm@openssh.com"
-
];
-
};
-
};
-
networking.firewall.allowedTCPPorts = [ 22 ];
-
}
-15
modules/nixos/default-config/users.nix
···
-
{ lib, ... }:
-
{
-
users.users = {
-
pyrox = lib.mkDefault {
-
isNormalUser = true;
-
description = lib.mkDefault "Pyrox";
-
extraGroups = [
-
"networkmanager"
-
"wheel"
-
"input"
-
"wireshark"
-
];
-
};
-
};
-
}
-1
modules/nixos/default-users/backup.pub
···
-
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM= 993390@993390-student-FVFD26HVJ1WK
-72
modules/nixos/default-users/default.nix
···
-
{
-
pkgs,
-
config,
-
lib,
-
...
-
}:
-
let
-
cfg = config.py.users.default;
-
in
-
{
-
options.py.users.default.enable = lib.mkEnableOption "Default PyroNet Users";
-
options.py.user.name = lib.mkOption {
-
type = lib.types.str;
-
default = "thehedgehog";
-
description = "User for deploy-rs deployments.";
-
};
-
-
config = lib.mkIf cfg.enable {
-
users.users.pyrox = {
-
description = "Pyrox";
-
isNormalUser = true;
-
extraGroups = [
-
"adbusers"
-
"wheel"
-
"networkmanager"
-
"video"
-
"docker"
-
"wireshark"
-
"input"
-
];
-
hashedPassword = "$6$6EtuZhVOJdfI9DYP$1Qnd7R8qdN.E5yE2kDQCNg2zgJ5cIjNBKsIW/qJgb8wcKlUpIoVg/fEKvBkAgCiLyojVG2kzfu4J9LR8rA8a2/";
-
shell = pkgs.fish;
-
openssh = {
-
authorizedKeys = {
-
keyFiles = [
-
./yubikey-new.pub
-
./yubikey-main.pub
-
./yubikey-back.pub
-
./backup.pub
-
];
-
keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP532AB5mkNvE29MkDDY8HEf8ZdktGWiI0PzLrvbmLQe" ];
-
};
-
};
-
};
-
users.users.thehedgehog = {
-
description = "The Hedgehog";
-
isNormalUser = true;
-
extraGroups = [
-
"adbusers"
-
"wheel"
-
"networkmanager"
-
"video"
-
"docker"
-
"wireshark"
-
"input"
-
];
-
hashedPassword = "$6$6EtuZhVOJdfI9DYP$1Qnd7R8qdN.E5yE2kDQCNg2zgJ5cIjNBKsIW/qJgb8wcKlUpIoVg/fEKvBkAgCiLyojVG2kzfu4J9LR8rA8a2/";
-
shell = pkgs.fish;
-
openssh = {
-
authorizedKeys = {
-
keyFiles = [
-
./yubikey-new.pub
-
./yubikey-main.pub
-
./yubikey-back.pub
-
./backup.pub
-
];
-
keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP532AB5mkNvE29MkDDY8HEf8ZdktGWiI0PzLrvbmLQe" ];
-
};
-
};
-
};
-
};
-
}
-1
modules/nixos/default-users/yubikey-back.pub
···
-
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw== cardno:15 567 372
-1
modules/nixos/default-users/yubikey-main.pub
···
-
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBBsOIMMZVmleClXfqUMrnmyh8PFuyiJqHKEZ51Xy746
-1
modules/nixos/default-users/yubikey-new.pub
···
-
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK97n2SgV/U1mLzxcaEDl85iF5D3jm7xboZ+S01+CbM/8zxVoWyjVHCqTwDcrLwP0c5Z51BNj7U0UkGIgR4zTSM=
-20
modules/nixos/profiles/default.nix
···
-
{ config, lib, ... }:
-
let
-
cfg = config.py.profiles;
-
in
-
{
-
options.py.profiles = {
-
base.enable = lib.mkEnableOption "Base Profile";
-
cli.enable = lib.mkEnableOption "CLI Profile";
-
development.enable = lib.mkEnableOption "Development Profile";
-
graphical.enable = lib.mkEnableOption "Graphical Profile";
-
server.enable = lib.mkEnableOption "Server Profile";
-
};
-
config = {
-
py.profiles = {
-
base.enable = lib.mkDefault true;
-
cli.enable = lib.mkDefault true;
-
development.enable = lib.mkDefault cfg.graphical.enable;
-
};
-
};
-
}
-16
modules/nixos/programs/chromium/default.nix
···
-
{ config, lib, ... }:
-
let
-
cfg = config.py.programs.chromium;
-
in
-
{
-
options.py.programs.chromium.enable = lib.mkEnableOption "Chromium";
-
-
config = lib.mkIf cfg.enable {
-
programs.chromium = {
-
enable = true;
-
defaultSearchProviderEnabled = true;
-
defaultSearchProviderSearchURL = "https://kagi.com/search?q={searchTerms}";
-
extraOpts = import ./extraOpts.nix;
-
};
-
};
-
}
-82
modules/nixos/programs/chromium/extraOpts.nix
···
-
{
-
AbusiveExperienceInterventionEnforce = false;
-
AccessCodeCastEnabled = false;
-
AdsSettingForIntrusiveAdsSites = 2;
-
AllowDeletingBrowserHistory = true;
-
AllowDinosaurEasterEgg = true;
-
AllowFileSelectionDialogs = true;
-
AllowSystemNotifications = true;
-
AudioCaptureAllowed = true;
-
AudioSandboxEnabled = true;
-
AutofillAddressEnabled = false;
-
AutofillCreditCardEnabled = false;
-
AutoplayAllowed = false;
-
BackgroundModeEnabled = false;
-
BookmarkBarEnabled = false;
-
BrowserLabsEnabled = true;
-
BrowserSignin = 0;
-
BuiltInDnsClientEnabled = false;
-
ChromeVariations = 2;
-
ClickToCallEnabled = false;
-
ClientCertificateManagementAllowed = 0;
-
CloudExtensionRequestEnabled = false;
-
CloudProfileReportingEnabled = false;
-
CloudReportingEnabled = false;
-
CommandLineFlagSecurityWarningsEnabled = false;
-
ComponentUpdatesEnabled = false;
-
ContextualSearchEnabled = false;
-
DNSInterceptionChecksEnabled = false;
-
DataLeakPreventionReportingEnabled = false;
-
DefaultBrowserSettingEnabled = false;
-
DefaultClipboardSetting = 3;
-
DefaultFileSystemReadGuardSetting = 3;
-
DefaultFileSystemWriteGuardSetting = 3;
-
DefaultGeolocationSetting = 3;
-
DefaultImagesSetting = 1;
-
DefaultInsecureContentSetting = 3;
-
DefaultNotificationsSetting = 2;
-
DefaultSensorsSetting = 2;
-
DefaultSerialGuardSetting = 2;
-
DefaultWebBluetoothGuardSetting = 3;
-
DefaultWebHidGuardSetting = 3;
-
DefaultWebUsbGuardSetting = 3;
-
DefaultWindowPlacementSetting = 3;
-
DesktopSharingHubEnabled = false;
-
DeveloperToolsAvailability = 1;
-
DevToolsGenAiSettings = 2;
-
GenAILocalFoundationalModelSettings = 1;
-
HelpMeWriteSettings = 2;
-
TabOrganizerSettings = 2;
-
CreateThemesSettings = 2;
-
Disable3DAPIs = false;
-
DisableScreenshots = false;
-
EditBookmarksEnabled = true;
-
EnableMediaRouter = false;
-
ForceGoogleSafeSearch = false;
-
ForceYouTubeRestrict = 0;
-
FullscreenAllowed = true;
-
HardwareAccelerationModeEnabled = true;
-
HeadlessMode = 1;
-
HideWebStoreIcon = true;
-
HttpsOnlyMode = "allowed";
-
ImportAutofillFormData = false;
-
ImportBookmarks = false;
-
ImportHistory = false;
-
ImportHomepage = false;
-
ImportSavedPasswords = false;
-
ImportSearchEngine = false;
-
IncognitoModeAvailability = 0;
-
InsecureFormsWarningsEnabled = false;
-
LensRegionSearchEnabled = false;
-
MediaRecommendationsEnabled = false;
-
MetricsReportingEnabled = false;
-
NTPCardsVisible = false;
-
NetworkPredictionOptions = 2;
-
PasswordDismissCompromisedAlertEnabled = false;
-
PasswordLeakDetectionEnabled = false;
-
PasswordManagerEnabled = false;
-
PaymentMethodQueryEnabled = false;
-
ShowCastIconInToolbar = false;
-
SyncDisabled = true;
-
SystemUse24HourClock = true;
-
}
-28
modules/nixos/programs/firefox/default.nix
···
-
{
-
config,
-
lib,
-
pkgs,
-
...
-
}:
-
let
-
cfg = config.py.programs.firefox;
-
in
-
{
-
options.py.programs.firefox = {
-
enable = lib.mkEnableOption "Firefox configuration";
-
};
-
-
config = lib.mkIf cfg.enable {
-
programs.firefox = {
-
enable = true;
-
package = pkgs.firefox;
-
wrapperConfig.cfg = {
-
smartcardSupport = true;
-
pipewireSupport = true;
-
ffmpegSupport = true;
-
};
-
policies = import ./policies.nix;
-
preferences = import ./extraPrefs.nix;
-
};
-
};
-
}
-69
modules/nixos/programs/firefox/extensions.nix
···
-
let
-
mkAMO = short: {
-
installation_mode = "force_installed";
-
install_url = "https://addons.mozilla.org/firefox/downloads/latest/${short}/latest.xpi";
-
};
-
in
-
{
-
# Addons from AMO
-
"{1be309c5-3e4f-4b99-927d-bb500eb4fa88}" = mkAMO "augmented-steam";
-
"{446900e4-71c2-419f-a6a7-df9c091e268b}" = mkAMO "bitwarden-password-manager" // {
-
default_area = "navbar";
-
};
-
"{bbb880ce-43c9-47ae-b746-c3e0096c5b76}" = mkAMO "catppuccin-gh-file-explorer";
-
"{74145f27-f039-47ce-a470-a662b129930a}" = mkAMO "clearurls";
-
"gdpr@cavi.au.dk" = mkAMO "consent-o-matic";
-
"{5cce4ab5-3d47-41b9-af5e-8203eea05245}" = mkAMO "control-panel-for-twitter";
-
"CookieAutoDelete@kennydo.com" = mkAMO "cookie-autodelete";
-
"addon@darkreader.org" = mkAMO "darkreader" // {
-
default_area = "navbar";
-
};
-
"DontFuckWithPaste@raim.ist" = mkAMO "don-t-fuck-with-paste";
-
"{72bd91c9-3dc5-40a8-9b10-dec633c0873f}" = mkAMO "enhanced-github";
-
"headereditor-amo@addon.firefoxcn.net" = mkAMO "header-editor";
-
"idcac-pub@guus.ninja" = mkAMO "istilldontcareaboutcookies";
-
"search@kagi.com" = mkAMO "kagi-search-for-firefox";
-
"7esoorv3@alefvanoon.anonaddy.me" = mkAMO "libredirect" // {
-
default_area = "navbar";
-
};
-
"github-forks-addon@musicallyut.in" = mkAMO "lovely-forks";
-
"firefox-addon@pronoundb.org" = mkAMO "pronoundb";
-
"{30280527-c46c-4e03-bb16-2e3ed94fa57c}" = mkAMO "protondb-for-steam";
-
"redirector@einaregilsson.com" = mkAMO "redirector";
-
"{a4c4eda4-fb84-4a84-b4a1-f7c1cbf2a1ad}" = mkAMO "refined-github-";
-
"{762f9885-5a13-4abd-9c77-433dcd38b8fd}" = mkAMO "return-youtube-dislikes";
-
"{48748554-4c01-49e8-94af-79662bf34d50}" = mkAMO "privacy-pass";
-
"sponsorBlocker@ajay.app" = mkAMO "sponsorblock";
-
"firefox-extension@steamdb.info" = mkAMO "steam-database";
-
"{7a7a4a92-a2a0-41d1-9fd7-1e92480d612d}" = mkAMO "styl-us" // {
-
default_area = "navbar";
-
};
-
"jid0-3GUEt1r69sQNSrca5p8kx9Ezc3U@jetpack" = mkAMO "terms-of-service-didnt-read";
-
"{76ef94a4-e3d0-4c6f-961a-d38a429a332b}" = mkAMO "ttv-lol-pro";
-
"uBlock0@raymondhill.net" = mkAMO "ublock-origin" // {
-
default_area = "navbar";
-
};
-
"{799c0914-748b-41df-a25c-22d008f9e83f}" = mkAMO "web-scrobbler" // {
-
default_area = "navbar";
-
};
-
"yeah@dimden.dev" = mkAMO "yeah-for-twitter";
-
# Official Mozilla Extensions
-
# Still downloaded from AMO
-
"@contain-facebook" = mkAMO "facebook-container";
-
"FirefoxColor@mozilla.com" = mkAMO "firefox-color";
-
"firefox-translations-addon@mozilla.org" = mkAMO "firefox-translations";
-
"@testpilot-containers" = mkAMO "multi-account-containers";
-
# External Addons
-
"frankerfacez@frankerfacez.com" = {
-
installation_mode = "force_installed";
-
install_url = "https://cdn.frankerfacez.com/script/frankerfacez-4.0-an+fx.xpi";
-
};
-
"magnolia@12.34" = {
-
installation_mode = "force_installed";
-
install_url = "https://github.com/bpc-clone/bpc_updates/releases/download/latest/bypass_paywalls_clean-latest.xpi";
-
};
-
"zotero@chnm.gmu.edu" = {
-
installation_mode = "force_installed";
-
install_url = "https://www.zotero.org/download/connector/dl?browser=firefox";
-
};
-
}
-169
modules/nixos/programs/firefox/extraPrefs.nix
···
-
{
-
"accessibility.typeaheadfind.flashBar" = 0;
-
"app.normandy.api_url" = "";
-
"app.normandy.enabled" = false;
-
"app.normandy.first_run" = false;
-
"app.shield.optoutstudies.enabled" = false;
-
"app.update.auto" = false;
-
"app.update.backgroundErrors" = 1;
-
"app.update.disable_button.showUpdateHistory" = false;
-
"beacon.enabled" = false;
-
"browser.aboutConfig.showWarning" = false;
-
"browser.bookmarks.addedImportButton" = true;
-
"browser.contentblocking.report.hide_vpn_banner" = true;
-
"browser.contentblocking.report.lockwise.enabled" = false;
-
"browser.contentblocking.report.show_mobile_app" = false;
-
"browser.contentblocking.report.social.url" = "";
-
"browser.formfill.enable" = false;
-
"browser.laterrun.bookkeeping.profileCreationTime" = 0;
-
"browser.laterrun.bookkeeping.sessionCount" = 0;
-
"browser.newtabpage.activity-stream.discoverystream.enabled" = false;
-
"browser.newtabpage.activity-stream.discoverystream.endpointSpocsClear" = "";
-
"browser.newtabpage.activity-stream.discoverystream.endpoints" = "";
-
"browser.newtabpage.activity-stream.discoverystream.personalization.enabled" = false;
-
"browser.newtabpage.activity-stream.discoverystream.readTime.enabled" = false;
-
"browser.newtabpage.activity-stream.discoverystream.rec.impressions" = "{}";
-
"browser.newtabpage.activity-stream.discoverystream.recentSaves.enabled" = false;
-
"browser.newtabpage.activity-stream.discoverystream.saveToPocketCard.enabled" = false;
-
"browser.newtabpage.activity-stream.discoverystream.sendToPocket.enabled" = false;
-
"browser.newtabpage.activity-stream.discoverystream.spoc.impressions" = "{}";
-
"browser.newtabpage.activity-stream.feeds.recommendationprovider" = false;
-
"browser.newtabpage.activity-stream.feeds.telemetry" = false;
-
"browser.newtabpage.activity-stream.impressionId" = "{}";
-
"browser.newtabpage.activity-stream.section.highlights.includePocket" = false;
-
"browser.newtabpage.activity-stream.telemetry" = false;
-
"browser.newtabpage.activity-stream.telemetry.structuredIngestion.endpoint" = "";
-
"browser.newtabpage.activity-stream.telemetry.ut.events" = false;
-
"browser.partnerlink.attributionURL" = "";
-
"browser.partnerlink.campaign.topsites" = "";
-
"browser.ping-centre.telemetry" = false;
-
"browser.places.importBookmarksHTML" = false;
-
"browser.pocket.enabled" = false;
-
"browser.safebrowsing.downloads.enabled" = false;
-
"browser.safebrowsing.downloads.remote.block_dangerous" = false;
-
"browser.safebrowsing.downloads.remote.block_dangerous_host" = false;
-
"browser.safebrowsing.downloads.remote.block_potentially_unwanted" = false;
-
"browser.safebrowsing.downloads.remote.block_uncommon" = false;
-
"browser.safebrowsing.downloads.remote.enabled" = false;
-
"browser.safebrowsing.downloads.remote.url" = "";
-
"browser.safebrowsing.malware.enabled" = false;
-
"browser.safebrowsing.phishing.enabled" = false;
-
# Disable safebrowsing shit
-
"browser.safebrowsing.provider.google.advisoryURL" = "";
-
"browser.safebrowsing.provider.google.gethashURL" = "";
-
"browser.safebrowsing.provider.google.reportURL" = "";
-
"browser.safebrowsing.provider.google.updateURL" = "";
-
"browser.safebrowsing.provider.google4.advisoryURL" = "";
-
"browser.safebrowsing.provider.google4.dataSharingURL" = "";
-
"browser.safebrowsing.provider.google4.gethashURL" = "";
-
"browser.safebrowsing.provider.google4.lists" = "";
-
"browser.safebrowsing.provider.google4.reportURL" = "";
-
"browser.safebrowsing.provider.google4.updateURL" = "";
-
"browser.safebrowsing.provider.mozilla.gethashURL" = "";
-
"browser.safebrowsing.provider.mozilla.lastupdatetime" = "";
-
"browser.safebrowsing.provider.mozilla.lists" = "";
-
"browser.safebrowsing.provider.mozilla.lists.base" = "";
-
"browser.safebrowsing.provider.mozilla.lists.content" = "";
-
"browser.safebrowsing.provider.mozilla.nextupdatetime" = "";
-
"browser.safebrowsing.provider.mozilla.updateURL" = "";
-
"browser.search.serpEventTelemetry.enabled" = false;
-
"browser.send_pings" = false;
-
"browser.tabs.warnOnClose" = true;
-
# Disable useless suggestions
-
"browser.urlbar.suggest.addons" = false;
-
"browser.urlbar.suggest.bookmark" = true;
-
"browser.urlbar.suggest.calculator" = true;
-
"browser.urlbar.suggest.clipboard" = false;
-
"browser.urlbar.suggest.engines" = false;
-
"browser.urlbar.suggest.history" = true;
-
"browser.urlbar.suggest.mdn" = false;
-
"browser.urlbar.suggest.openpage" = true;
-
"browser.urlbar.suggest.pocket" = false;
-
"browser.urlbar.suggest.quicksuggest.nonsponsored" = false;
-
"browser.urlbar.suggest.quicksuggest.sponsored" = false;
-
"browser.urlbar.suggest.topsites" = false;
-
"browser.urlbar.suggest.trending" = false;
-
"browser.urlbar.suggest.weather" = false;
-
# Disable sensors
-
"device.sensors.ambientLight.enabled" = false;
-
"device.sensors.enabled" = false;
-
"device.sensors.motion.enabled" = false;
-
"device.sensors.orientation.enabled" = false;
-
"device.sensors.proximity.enabled" = false;
-
"device.sensors.test.events" = false;
-
"devtools.chrome.enabled" = true;
-
"doh-rollout.uri" = "";
-
"dom.battery.enabled" = false;
-
"dom.event.clipboardevents.enabled" = false;
-
"dom.security.unexpected_system_load_telemetry_enabled" = false;
-
"dom.webgpu.enabled" = true;
-
"extensions.formautofill.addresses.enabled" = false;
-
"extensions.formautofill.creditCards.enabled" = false;
-
"extensions.htmlaboutaddons.recommendations.enabled" = false;
-
# Disable Pocket
-
"extensions.pocket.enabled" = false;
-
"extensions.pocket.showHome" = false;
-
"extensions.pocket.site" = "";
-
"extensions.recommendations.privacyPolicyUrl" = "";
-
"extensions.recommendations.themeRecommendationUrl" = "";
-
"extensions.ui.dictionary.hidden" = true;
-
"extensions.update.autoUpdateDefault" = false;
-
"extensions.webextensions.restrictedDomains" = "";
-
"privacy.clearOnShutdown.downloads" = true;
-
"privacy.donottrackheader.enabled" = false;
-
"privacy.resistFingerprinting.block_mozAddonManager" = true;
-
"remote.prefs.recommended" = false;
-
"services.settings.server" = "";
-
"signon.autofillForms" = false;
-
"signon.generation.enabled" = false;
-
"signon.management.page.breach-alerts.enabled" = false;
-
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
-
"ui.systemUsesDarkTheme" = 1;
-
"webgl.force-enabled" = true;
-
"xpinstall.signatures.required" = false;
-
# Disable telemetry stuff
-
# Already disabled in policies, but better safe than sorry.
-
"browser.urlbar.eventTelemetry.enabled" = false;
-
"browser.urlbar.quicksuggest.dataCollection.enabled" = false;
-
"datareporting.healthreport.infoURL" = "";
-
"datareporting.policy.firstRunURL" = "";
-
"security.app_menu.recordEventTelemetry" = false;
-
"security.certerrors.recordEventTelemetry" = false;
-
"security.identitypopup.recordEventTelemetry" = false;
-
"security.protectionspopup.recordEventTelemetry" = false;
-
"network.trr.confirmation_telemetry_enabled" = false;
-
"privacy.trackingprotection.origin_telemetry.enabled" = false;
-
"toolkit.telemetry.bhrPing.enabled" = false;
-
"toolkit.telemetry.cachedClientID" = "";
-
"toolkit.telemetry.dap_enabled" = false;
-
"toolkit.telemetry.dap_helper" = "";
-
"toolkit.telemetry.dap_leader" = "";
-
"toolkit.telemetry.dap_task1_enabled" = false;
-
"toolkit.telemetry.debugSlowSql" = false;
-
"toolkit.telemetry.firstShutdownPing.enabled" = false;
-
"toolkit.telemetry.geckoview.streaming" = false;
-
"toolkit.telemetry.newProfilePing.enabled" = false;
-
"toolkit.telemetry.pioneer-new-studies-available" = false;
-
"toolkit.telemetry.previousBuildID" = "";
-
"toolkit.telemetry.reportingpolicy.firstRun" = "";
-
"toolkit.telemetry.server" = "";
-
"toolkit.telemetry.server_owner" = "";
-
"toolkit.telemetry.shutdownPingSender.backgroundtask.enabled" = false;
-
"toolkit.telemetry.shutdownPingSender.enabled" = false;
-
"toolkit.telemetry.shutdownPingSender.enabledFirstSession" = false;
-
"toolkit.telemetry.testing.overrideProductsCheck" = false;
-
"toolkit.telemetry.unified" = false;
-
"toolkit.telemetry.updatePing.enabled" = "";
-
# FastFox
-
"media.memory_cache_max_size" = 65536;
-
"browser.cache.jsbc_compression_level" = 3;
-
"image.mem.decode_bytes_at_a_time" = 32768;
-
"network.http.max-connections" = 1800;
-
"network.http.max-persistent-connections-per-server" = 10;
-
"network.http.max-urgent-start-excessive-connections-per-host" = 5;
-
"network.dns.max_high_priority_threads" = 8;
-
"network.ssl_tokens_cache_capacity" = 10240;
-
"network.dns.disablePrefetch" = true;
-
"browser.places.speculativeConnect.enabled" = false;
-
"browser.urlbar.speculativeConnect.enabled" = false;
-
}
-66
modules/nixos/programs/firefox/policies.nix
···
-
{
-
AppAutoUpdate = false;
-
AutofillAddressEnabled = false;
-
AutofillCreditCardEnabled = false;
-
BackgroundAppUpdate = false;
-
DisableAppUpdate = true;
-
DisableBuiltinPDFViewer = false;
-
DisableFirefoxAccounts = true;
-
DisableFirefoxStudies = true;
-
DisableMasterPasswordCreation = true;
-
DisablePocket = true;
-
DisableSetDesktopBackground = true;
-
DisableTelemetry = true;
-
DNSOverHTTPS = {
-
Enabled = false;
-
ProviderURL = "https://dns.nextdns.io/36e7f7";
-
Locked = true;
-
};
-
DontCheckDefaultBrowser = true;
-
ExtensionSettings = import ./extensions.nix;
-
ExtensionUpdate = true;
-
FirefoxHome = {
-
Search = true;
-
TopSites = false;
-
SponsoredTopSites = false;
-
Highlights = false;
-
Pocket = false;
-
SponsoredPocket = false;
-
Snippets = false;
-
Locked = true;
-
};
-
FirefoxSuggest = {
-
WebSuggestions = false;
-
SponsoredSuggestions = false;
-
ImproveSuggest = false;
-
Locked = true;
-
};
-
HardwareAcceleration = true;
-
Homepage = {
-
URL = "about:blank";
-
Locked = true;
-
StartPage = "previous-session";
-
};
-
ManualAppUpdateOnly = true;
-
OfferToSaveLogins = false;
-
OfferToSaveLoginsDefault = false;
-
OverrideFirstRunPage = "";
-
OverridePostUpdatePage = "";
-
PasswordManagerEnabled = false;
-
PDFjs = {
-
Enabled = true;
-
EnablePermissions = false;
-
};
-
PrintingEnabled = true;
-
SearchBar = "unified";
-
ShowHomeButton = false;
-
UserMessaging = {
-
WhatsNew = false;
-
ExtensionRecommendations = false;
-
FeatureRecommendations = false;
-
UrlbarInterventions = false;
-
SkipOnboarding = false;
-
MoreFromMozilla = false;
-
Locked = true;
-
};
-
}
-28
modules/nixos/programs/misc/default.nix
···
-
{ config, lib, ... }:
-
let
-
cfg = config.py.programs;
-
inherit (lib) mkEnableOption mkIf;
-
in
-
{
-
options.py.programs = {
-
appimage.enable = mkEnableOption "Appimage";
-
dconf.enable = mkEnableOption "dconf";
-
fish.enable = mkEnableOption "fish shell";
-
less.enable = mkEnableOption "less";
-
noisetorch.enable = mkEnableOption "NoiseTorch";
-
steam.enable = mkEnableOption "Steam";
-
wireshark.enable = mkEnableOption "Wireshark";
-
};
-
config.programs = {
-
appimage = mkIf cfg.appimage.enable {
-
enable = true;
-
binfmt = true;
-
};
-
dconf.enable = mkIf cfg.dconf.enable true;
-
fish.enable = mkIf cfg.fish.enable true;
-
less.enable = mkIf cfg.less.enable true;
-
noisetorch.enable = mkIf cfg.noisetorch.enable true;
-
steam.enable = mkIf cfg.steam.enable true;
-
wireshark.enable = mkIf cfg.wireshark.enable true;
-
};
-
}
-23
modules/nixos/programs/neovim/default.nix
···
-
{
-
pkgs,
-
lib,
-
config,
-
...
-
}:
-
let
-
cfg = config.py.programs.neovim;
-
in
-
{
-
options.py.programs.neovim.enable = lib.mkEnableOption "Neovim configuration";
-
-
config.programs.neovim = lib.mkIf cfg.enable {
-
enable = true;
-
package = pkgs.py.nvim;
-
defaultEditor = true;
-
viAlias = true;
-
vimAlias = true;
-
withRuby = false;
-
withNodeJs = false;
-
withPython3 = false;
-
};
-
}
-20
modules/nixos/services/buildbot/default.nix
···
-
{ config, lib, ... }:
-
let
-
cfg = config.py.services.buildbot.worker;
-
in
-
{
-
options.py.services.buildbot.worker = {
-
enable = lib.mkEnableOption "buildbot worker";
-
passwordFile = lib.mkOption {
-
type = lib.types.path;
-
description = "Password file for the worker";
-
default = null;
-
};
-
};
-
config.services.buildbot-nix.worker = lib.mkIf cfg.enable {
-
enable = true;
-
name = config.networking.hostName;
-
masterUrl = "tcp:host=marvin:port=6915";
-
workerPasswordFile = cfg.passwordFile;
-
};
-
}
-61
modules/nixos/services/forgejo-runner/default.nix
···
-
{
-
pkgs,
-
config,
-
lib,
-
...
-
}:
-
let
-
runnerBase = {
-
enable = true;
-
url = "https://git.pyrox.dev";
-
labels = [
-
"default:docker://git.pyrox.dev/pyrox/flake-base:latest"
-
"nodejs:docker://node:20"
-
"nodejs-alpine:docker://node:20-alpine"
-
"nodejs-lts:docker://node:20"
-
"nodejs-lts:docker://node:20-alpine"
-
"nodejs-latest:docker://node:21"
-
"nodejs-latest-alpine:docker://node:21-alpine"
-
"alpine:docker://alpine:3.19"
-
];
-
settings = {
-
log.level = "info";
-
runner = {
-
insecure = false;
-
capacity = 4;
-
};
-
cache = {
-
enabled = true;
-
dir = "/var/lib/forgejo/runners/cache/";
-
host = "";
-
port = 0;
-
};
-
container = {
-
# Automatically create a network for containers
-
network = "";
-
enable_ipv6 = false;
-
};
-
};
-
};
-
cfg = config.py.services.forgejo-runner;
-
in
-
{
-
options.py.services.forgejo-runner = {
-
enable = lib.mkEnableOption "Forgejo Actions Runner configuration";
-
tokenFile = lib.mkOption {
-
type = lib.types.path;
-
description = "Token for default runner";
-
example = /path/to/token/file;
-
};
-
};
-
-
config.services.gitea-actions-runner = lib.mkIf cfg.enable {
-
package = pkgs.forgejo-actions-runner;
-
instances = {
-
"${config.networking.hostName}-default" = runnerBase // {
-
inherit (cfg) tokenFile;
-
name = "${config.networking.hostName}";
-
};
-
};
-
};
-
}
+74
nixosModules/default-config/bootloader.nix
···
+
{
+
boot = {
+
tmp.cleanOnBoot = true;
+
# Disable unused kernel modules
+
# https://madaidans-insecurities.github.io/guides/linux-hardening.html?#kasr-kernel-modules
+
blacklistedKernelModules = [
+
# Obscure network protocols
+
"af_802154"
+
"appletalk"
+
"atm"
+
"ax25"
+
"can"
+
"dccp"
+
"decnet"
+
"econet"
+
"ipx"
+
"n-hdlc"
+
"netrom"
+
"p8022"
+
"p8023"
+
"psnap"
+
"rds"
+
"rose"
+
"sctp"
+
"tipc"
+
"x25"
+
# Old or rare or insufficiently audited filesystems
+
# or ones I just don't want loaded
+
"adfs"
+
"affs"
+
"befs"
+
"bfs"
+
"cramfs"
+
"efs"
+
"erofs"
+
"f2fs"
+
"freevxfs"
+
"hfs"
+
"hfsplus"
+
"hpfs"
+
"jffs2"
+
"jfs"
+
"minix"
+
"nilfs2"
+
"ntfs"
+
"ocfs2"
+
"omfs"
+
"orangefs"
+
"qnx4"
+
"qnx6"
+
"reiserfs"
+
"sysv"
+
"ubifs"
+
"ufs"
+
# Network filesystems - I don't use these
+
"gfs2"
+
"nfs"
+
"nfsv3"
+
"nfsv4"
+
# Vivid driver
+
# Only used for testing purposes, has caused security issues. Disable.
+
"vivid"
+
];
+
+
kernelParams = [
+
# Page allocator randomization
+
# Should hardon and improve performance
+
"page_alloc.shuffle=1"
+
];
+
# Don't use either of these so disable them
+
kexec.enable = false;
+
bcache.enable = false;
+
};
+
}
+37
nixosModules/default-config/default.nix
···
+
{ lib, ... }:
+
{
+
imports = [
+
./bootloader.nix
+
./networking.nix
+
./nixConfig.nix
+
./nixpkgsConfig.nix
+
./packages.nix
+
./programs
+
./root.nix
+
./security.nix
+
./services
+
./ssh.nix
+
./users.nix
+
];
+
system = {
+
stateVersion = "26.05";
+
disableInstallerTools = true;
+
tools.nixos-rebuild.enable = true;
+
};
+
catppuccin = {
+
flavor = "mocha";
+
accent = "mauve";
+
tty.enable = true;
+
};
+
documentation = {
+
enable = lib.mkDefault false;
+
man.enable = lib.mkDefault false;
+
man.man-db.enable = lib.mkDefault false;
+
man.generateCaches = lib.mkDefault false;
+
man.mandoc.enable = lib.mkDefault false;
+
doc.enable = lib.mkDefault false;
+
nixos.enable = false;
+
dev.enable = false;
+
info.enable = false;
+
};
+
}
+38
nixosModules/default-config/networking.nix
···
+
{ pkgs, lib, ... }:
+
{
+
networking = {
+
networkmanager.plugins = lib.mkForce [ pkgs.networkmanager-openvpn ];
+
nameservers = [
+
"9.9.9.9"
+
"fd42:d42:d42:53::1"
+
"fd42:d42:d42:54::1"
+
"172.23.0.53"
+
"172.20.0.53"
+
];
+
timeServers = [
+
"0.pool.ntp.org"
+
"1.pool.ntp.org"
+
"2.pool.ntp.org"
+
"3.pool.ntp.org"
+
];
+
resolvconf.extraConfig = ''
+
name_servers="9.9.9.9 fd42:d42:d42:53::1 fd42:d42:d42:54::1 172.23.0.53 172.20.0.53"
+
'';
+
};
+
boot.kernel.sysctl = {
+
# Disable ICMP Redirects
+
# https://askubuntu.com/questions/118273/what-are-icmp-redirects-and-should-they-be-blocked
+
"net.ipv4.conf.all.accept_redirects" = 0;
+
"net.ipv4.conf.default.accept_redirects" = 0;
+
"net.ipv4.conf.all.secure_redirects" = 0;
+
"net.ipv4.conf.default.secure_redirects" = 0;
+
"net.ipv6.conf.all.accept_redirects" = 0;
+
"net.ipv6.conf.default.accept_redirects" = 0;
+
};
+
# Disable *-wait-online services as they block rebuilds often.
+
# https://github.com/NixOS/nixpkgs/issues/180175
+
systemd.services = {
+
NetworkManager-wait-online.enable = lib.mkForce false;
+
systemd-networkd-wait-online.enable = lib.mkForce false;
+
};
+
}
+91
nixosModules/default-config/nixConfig.nix
···
+
{
+
pkgs,
+
lib,
+
inputs,
+
...
+
}:
+
let
+
userList = [
+
"root"
+
"thehedgehog"
+
"pyrox"
+
];
+
flakeInputs = lib.filterAttrs (name: value: (value ? outputs) && (name != "self")) inputs;
+
in
+
{
+
nix = {
+
enable = true;
+
gc.automatic = true;
+
registry = lib.mapAttrs (_: v: { flake = v; }) flakeInputs;
+
settings = {
+
# Don't auto-accept flake-defined nix settings, they're a CVE waiting to happen.
+
accept-flake-config = false;
+
# Allow these users to access the daemon
+
allowed-users = userList;
+
# No pre-defined nixbld users
+
auto-allocate-uids = true;
+
# Always optimize the store
+
auto-optimise-store = true;
+
# Compress build logs to save space
+
compress-build-log = true;
+
# Use all available cores to build
+
cores = lib.mkDefault 8;
+
experimental-features = [
+
# Use auto-generated uids instead of users in the nixbld group
+
"auto-allocate-uids"
+
# Can allow saving space in the store by content-addressing instead of input-addressing derivations
+
"ca-derivations"
+
# Build inside cgroups
+
"cgroups"
+
# Duh
+
"flakes"
+
# Nix3 CLI
+
"nix-command"
+
# Disallow URL Literals as they are deprecated
+
"no-url-literals"
+
];
+
# Build from source if substitution fails
+
fallback = true;
+
# Write an empty flake registry
+
flake-registry = pkgs.writers.writeJSON "registry-empty.json" {
+
flakes = [ ];
+
version = 2;
+
};
+
# allow keeping direnv gc roots
+
keep-derivations = true;
+
# Keep going even if a build fails, so that all possible succeeding builds do
+
keep-going = true;
+
# More direnv gc root stuff
+
keep-outputs = true;
+
log-lines = 20;
+
# Limit the max amount of builds
+
max-jobs = lib.mkDefault 4;
+
# Extra system features
+
system-features = [
+
"big-parallel"
+
"kvm"
+
"nixos-test"
+
];
+
# The pubkeys of the below substituters
+
trusted-public-keys = [
+
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
+
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
+
];
+
# Extra substituters
+
trusted-substituters = [
+
"https://cache.nixos.org"
+
"https://nix-community.cachix.org"
+
];
+
# These users have additional daemon rights
+
trusted-users = userList;
+
# Use cgroups for building
+
use-cgroups = true;
+
# Allow use of the registry
+
use-registries = true;
+
# XDG base dirs to avoid cluttering $HOME
+
use-xdg-base-directories = true;
+
# I almost always work in a dirty tree, I know it's dirty
+
warn-dirty = false;
+
};
+
};
+
}
+17
nixosModules/default-config/nixpkgsConfig.nix
···
+
{
+
inputs,
+
...
+
}:
+
{
+
nixpkgs = {
+
overlays = [
+
inputs.self.overlays.openssh-fixperms
+
inputs.self.overlays.hy3-fixes
+
inputs.golink.overlays.default
+
inputs.quickshell.overlays.default
+
];
+
config = {
+
allowUnfree = true;
+
};
+
};
+
}
+19
nixosModules/default-config/packages.nix
···
+
{ pkgs, ... }:
+
{
+
environment.systemPackages = with pkgs; [
+
direnv
+
doggo
+
fzf
+
ghostty.terminfo
+
lazygit
+
nix-output-monitor
+
pciutils
+
git
+
ripgrep
+
tailscale
+
unrar
+
unzip
+
zip
+
usbutils
+
];
+
}
+6
nixosModules/default-config/programs/default.nix
···
+
{
+
imports = [
+
./ssh.nix
+
];
+
programs.fish.enable = true;
+
}
+35
nixosModules/default-config/programs/ssh.nix
···
+
{
+
programs.ssh = {
+
ciphers = [
+
"chacha20-poly1305@openssh.com"
+
"aes256-gcm@openssh.com"
+
"aes128-gcm@openssh.com"
+
"aes256-ctr"
+
"aes192-ctr"
+
"aes128-ctr"
+
];
+
macs = [
+
"umac-128-etm@openssh.com"
+
"hmac-sha2-256-etm@openssh.com"
+
"hmac-sha2-512-etm@openssh.com"
+
];
+
kexAlgorithms = [
+
# Experimental, disabled for now.
+
# "sntrup761x25519-sha512@openssh.com"
+
"curve25519-sha256"
+
"curve25519-sha256@libssh.org"
+
# Disabled for being 2048-bit
+
# "diffie-hellman-group-exchange-sha256"
+
];
+
hostKeyAlgorithms = [
+
"ssh-ed25519-cert-v01@openssh.com"
+
"sk-ssh-ed25519-cert-v01@openssh.com"
+
"rsa-sha2-512-cert-v01@openssh.com"
+
"rsa-sha2-256-cert-v01@openssh.com"
+
"ssh-ed25519"
+
"sk-ssh-ed25519@openssh.com"
+
"rsa-sha2-512"
+
"rsa-sha2-256"
+
];
+
};
+
}
+8
nixosModules/default-config/root.nix
···
+
{
+
users.users.root = {
+
openssh.authorizedKeys.keys = [
+
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw=="
+
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM="
+
];
+
};
+
}
nixosModules/default-config/secrets/powerdns-secrets.age

This is a binary file and will not be displayed.

+22
nixosModules/default-config/secrets/secrets.nix
···
+
let
+
prefect = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP532AB5mkNvE29MkDDY8HEf8ZdktGWiI0PzLrvbmLQe";
+
thought = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGkJcLykggEp427h2IywoiR74Yl3N+FU6Pwx9ZFQ3vjq";
+
yubi-back = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw==";
+
yubi-main = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBBsOIMMZVmleClXfqUMrnmyh8PFuyiJqHKEZ51Xy746";
+
backup = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM=";
+
marvin = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP60B1IOdfJRrDcCKajMV8YJNC01gSsccZi3DKHlS6YJ";
+
servers = [
+
prefect
+
thought
+
marvin
+
];
+
personal = [
+
yubi-back
+
yubi-main
+
backup
+
];
+
all-keys = servers ++ personal;
+
in
+
{
+
"powerdns-secrets.age".publicKeys = all-keys;
+
}
+38
nixosModules/default-config/security.nix
···
+
{ pkgs, lib, ... }:
+
let
+
inherit (lib) mkDefault;
+
in
+
{
+
# Everything should use doas instead of sudo
+
# Sudo is kept enabled for tools that ~can't~ won't use doas.
+
security = {
+
doas = {
+
enable = true;
+
wheelNeedsPassword = false;
+
};
+
# Needed for nixos-rebuild to work properly
+
sudo.enable = true;
+
+
# TPM configuration
+
tpm2 = {
+
enable = mkDefault true;
+
abrmd.enable = mkDefault true;
+
applyUdevRules = mkDefault true;
+
pkcs11.enable = mkDefault false;
+
};
+
+
# Set up extra certificates for DN42 specifically
+
pki.certificateFiles = [
+
(pkgs.fetchurl {
+
url = "https://dn42.burble.com/burble-dn42-ca.pem";
+
name = "burble-dn42-ca.pem";
+
sha256 = "0wcrjkiav018bpl87583g0v60clx3jg3wfyf8d9h8zdkwcb16b2g";
+
})
+
(pkgs.fetchurl {
+
url = "https://aur.archlinux.org/cgit/aur.git/plain/dn42.crt?h=ca-certificates-dn42&id=646f7effb290adf25c7e9fea3b41bf055522ba29";
+
name = "dn42.crt";
+
sha256 = "sha256-wsMeC9/tlppSNZGrqfZFLAjv3AMj1KwIAWeh2XBpiYs=";
+
})
+
];
+
};
+
}
+12
nixosModules/default-config/services/default.nix
···
+
{
+
imports = [
+
./ntp.nix
+
./tailscale.nix
+
];
+
services = {
+
# Perlless user management
+
userborn = {
+
enable = true;
+
};
+
};
+
}
+5
nixosModules/default-config/services/ntp.nix
···
+
{
+
services.ntp = {
+
enable = true;
+
};
+
}
+5
nixosModules/default-config/services/tailscale.nix
···
+
{
+
services.tailscale = {
+
enable = true;
+
};
+
}
+34
nixosModules/default-config/ssh.nix
···
+
{
+
age.identityPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
+
services.openssh = {
+
enable = false;
+
allowSFTP = false;
+
settings = {
+
PermitRootLogin = "prohibit-password";
+
PasswordAuthentication = false;
+
KbdInteractiveAuthentication = false;
+
KexAlgorithms = [
+
# Experimental, disabled for now.
+
# "sntrup761x25519-sha512@openssh.com"
+
"curve25519-sha256"
+
"curve25519-sha256@libssh.org"
+
# Disabled for being 2048-bit
+
# "diffie-hellman-group-exchange-sha256"
+
];
+
Ciphers = [
+
"chacha20-poly1305@openssh.com"
+
"aes256-gcm@openssh.com"
+
"aes128-gcm@openssh.com"
+
"aes256-ctr"
+
"aes192-ctr"
+
"aes128-ctr"
+
];
+
Macs = [
+
"hmac-sha2-512-etm@openssh.com"
+
"hmac-sha2-256-etm@openssh.com"
+
"umac-128-etm@openssh.com"
+
];
+
};
+
};
+
networking.firewall.allowedTCPPorts = [ 22 ];
+
}
+15
nixosModules/default-config/users.nix
···
+
{ lib, ... }:
+
{
+
users.users = {
+
pyrox = lib.mkDefault {
+
isNormalUser = true;
+
description = lib.mkDefault "Pyrox";
+
extraGroups = [
+
"networkmanager"
+
"wheel"
+
"input"
+
"wireshark"
+
];
+
};
+
};
+
}
+1
nixosModules/default-users/backup.pub
···
+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM= 993390@993390-student-FVFD26HVJ1WK
+72
nixosModules/default-users/default.nix
···
+
{
+
pkgs,
+
config,
+
lib,
+
...
+
}:
+
let
+
cfg = config.py.users.default;
+
in
+
{
+
options.py.users.default.enable = lib.mkEnableOption "Default PyroNet Users";
+
options.py.user.name = lib.mkOption {
+
type = lib.types.str;
+
default = "thehedgehog";
+
description = "User for deploy-rs deployments.";
+
};
+
+
config = lib.mkIf cfg.enable {
+
users.users.pyrox = {
+
description = "Pyrox";
+
isNormalUser = true;
+
extraGroups = [
+
"adbusers"
+
"wheel"
+
"networkmanager"
+
"video"
+
"docker"
+
"wireshark"
+
"input"
+
];
+
hashedPassword = "$y$j9T$Lwu/kwfIYVH6ApPNFv5TL.$xXtWoVxOKDW0xQtw7yf2JGWP3JI6r9WIqV19W0/zrg5";
+
shell = pkgs.fish;
+
openssh = {
+
authorizedKeys = {
+
keyFiles = [
+
./yubikey-new.pub
+
./yubikey-main.pub
+
./yubikey-back.pub
+
./backup.pub
+
];
+
keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP532AB5mkNvE29MkDDY8HEf8ZdktGWiI0PzLrvbmLQe" ];
+
};
+
};
+
};
+
users.users.thehedgehog = {
+
description = "The Hedgehog";
+
isNormalUser = true;
+
extraGroups = [
+
"adbusers"
+
"wheel"
+
"networkmanager"
+
"video"
+
"docker"
+
"wireshark"
+
"input"
+
];
+
hashedPassword = "$y$j9T$Lwu/kwfIYVH6ApPNFv5TL.$xXtWoVxOKDW0xQtw7yf2JGWP3JI6r9WIqV19W0/zrg5";
+
shell = pkgs.fish;
+
openssh = {
+
authorizedKeys = {
+
keyFiles = [
+
./yubikey-new.pub
+
./yubikey-main.pub
+
./yubikey-back.pub
+
./backup.pub
+
];
+
keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP532AB5mkNvE29MkDDY8HEf8ZdktGWiI0PzLrvbmLQe" ];
+
};
+
};
+
};
+
};
+
}
+1
nixosModules/default-users/yubikey-back.pub
···
+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw== cardno:15 567 372
+1
nixosModules/default-users/yubikey-main.pub
···
+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBBsOIMMZVmleClXfqUMrnmyh8PFuyiJqHKEZ51Xy746
+1
nixosModules/default-users/yubikey-new.pub
···
+
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK97n2SgV/U1mLzxcaEDl85iF5D3jm7xboZ+S01+CbM/8zxVoWyjVHCqTwDcrLwP0c5Z51BNj7U0UkGIgR4zTSM=
+27
nixosModules/default.nix
···
+
_: {
+
flake.nixosModules = {
+
# Top-level
+
defaultConfig = import ./default-config;
+
defaultUsers = import ./default-users;
+
profiles = import ./profiles;
+
+
dn42Wireguard = import ./dn42Wireguard;
+
+
# Programs
+
chromium = import ./programs/chromium;
+
firefox = import ./programs/firefox;
+
hyprland = import ./programs/hyprland;
+
miscPrograms = import ./programs/misc;
+
neovim = import ./programs/neovim;
+
+
# Services
+
buildbot = import ./services/buildbot;
+
forgejo-runner = import ./services/forgejo-runner;
+
scrutiny = import ./services/scrutiny;
+
+
hm-pyrox = import ./homes/pyrox;
+
hm-thehedgehog = import ./homes/thehedgehog;
+
hm-pyrox-zaphod = import ./homes/pyrox-zaphod;
+
hm-thehedgehog-zaphod = import ./homes/thehedgehog-zaphod;
+
};
+
}
+125
nixosModules/dn42Wireguard/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}:
+
let
+
inherit (lib) types;
+
cfg = config.networking.dn42.wg;
+
+
tunnelDef = {
+
options = {
+
enable = lib.mkOption {
+
description = "Whether to enable this wireguard tunnel";
+
type = types.bool;
+
default = true;
+
example = false;
+
};
+
listenPort = lib.mkOption {
+
description = "The port this tunnel listens on";
+
type = types.port;
+
example = 42000;
+
};
+
privateKeyFile = lib.mkOption {
+
description = "Path to the tunnel's private key";
+
type = types.nullOr types.path;
+
example = "/path/to/private/key";
+
default = null;
+
};
+
peerPubKey = lib.mkOption {
+
description = "Public key of the peer you're connecting to";
+
type = types.str;
+
example = "e6kp9sca4XIzncKa9GEQwyOnMjje299Xg9ZdgXWMwHg=";
+
};
+
peerEndpoint = lib.mkOption {
+
description = "The endpoint of the peer you're connecting to";
+
type = types.str;
+
example = "example.com:42000";
+
};
+
peerAddrs = {
+
v4 = lib.mkOption {
+
description = "The peer IPv4 address to connect to in the tunnel";
+
type = types.nullOr types.str;
+
example = "192.168.1.1";
+
default = null;
+
};
+
v6 = lib.mkOption {
+
description = "The peer IPv6 address to connect to in the tunnel";
+
type = types.nullOr types.str;
+
example = "fe80::42";
+
default = null;
+
};
+
};
+
localAddrs = {
+
v4 = lib.mkOption {
+
description = "The local IPv4 address to listen on in the tunnel";
+
type = types.nullOr types.str;
+
example = "192.168.1.1";
+
default = null;
+
};
+
v6 = lib.mkOption {
+
description = "The local IPv6 address to listen on in the tunnel";
+
type = types.nullOr types.str;
+
example = "fe80::42";
+
default = null;
+
};
+
};
+
};
+
};
+
in
+
{
+
options.networking.dn42.wg = {
+
tunnelDefaults = lib.mkOption {
+
description = "The default settings to apply to all tunnels";
+
type = types.submodule tunnelDef;
+
};
+
tunnels = lib.mkOption {
+
description = "DN42 WireGuard tunnels configuration";
+
type = types.attrsOf (types.submodule tunnelDef);
+
};
+
};
+
config.networking = {
+
wireguard.interfaces = lib.mapAttrs' (
+
name: value:
+
let
+
# Merge defaults with tunnel config, right side has priority
+
# so tunnel config overrides defaults
+
fc = cfg.tunnelDefaults // (lib.filterAttrs (_: v: v != null) value);
+
in
+
lib.nameValuePair "wg42_${name}" {
+
inherit (fc) listenPort privateKeyFile;
+
allowedIPsAsRoutes = false;
+
peers = [
+
{
+
endpoint = fc.peerEndpoint;
+
publicKey = fc.peerPubKey;
+
allowedIPs = [
+
"0.0.0.0/0"
+
"::/0"
+
];
+
dynamicEndpointRefreshSeconds = 5;
+
persistentKeepalive = 15;
+
}
+
];
+
postSetup = ''
+
${lib.optionalString (
+
fc.peerAddrs.v4 != null && fc.localAddrs.v4 != null
+
) "${pkgs.iproute2}/bin/ip addr add ${fc.localAddrs.v4} peer ${fc.peerAddrs.v4} dev wg42_${name}"}
+
${lib.optionalString (
+
fc.peerAddrs.v6 != null && fc.localAddrs.v6 != null
+
) "${pkgs.iproute2}/bin/ip addr add ${fc.localAddrs.v6} peer ${fc.peerAddrs.v6} dev wg42_${name}"}
+
'';
+
}
+
) (lib.filterAttrs (_: v: v.enable) cfg.tunnels);
+
firewall = {
+
trustedInterfaces = lib.mapAttrsToList (name: _: "wg42_" + name) (lib.filterAttrs (_: v: v.enable) cfg.tunnels);
+
checkReversePath = false;
+
extraInputRules = ''
+
ip saddr 172.20.0.0/14 accept
+
ip6 saddr fd00::/8 accept
+
ip6 saddr fe80::/64 accept
+
'';
+
};
+
};
+
}
+18
nixosModules/homes/pyrox/default.nix
···
+
{
+
lib,
+
inputs,
+
...
+
}:
+
{
+
home-manager.users.pyrox = {
+
imports = [
+
inputs.self.homeModules.allModules
+
{
+
home.username = "pyrox";
+
home.stateVersion = "26.05";
+
py.profiles.server.enable = lib.mkDefault true;
+
py.profiles.desktop.enable = lib.mkDefault false;
+
}
+
];
+
};
+
}
+16
nixosModules/homes/pyrox-zaphod/default.nix
···
+
{
+
pkgs,
+
...
+
}:
+
{
+
home-manager.users.pyrox = {
+
imports = [
+
./files/pamKeys.nix
+
./files/distrobox-config.nix
+
];
+
home.packages = [
+
pkgs.mindustry
+
];
+
py.profiles.desktop.enable = true;
+
};
+
}
+7
nixosModules/homes/pyrox-zaphod/files/distrobox-config.nix
···
+
{
+
xdg.configFile."distrobox/distrobox.conf" = {
+
text = ''
+
distrobox_sudo_program="doas"
+
'';
+
};
+
}
+5
nixosModules/homes/pyrox-zaphod/files/pamKeys.nix
···
+
{
+
xdg.configFile."Yubico/u2f_keys".text = ''
+
thehedgehog:iC1dk7d+DYFX60wpkDlWdwNpkRLXmML7iDjxh4TRXe8OhsAb2pgKiY6tVLHeZIK3WOVA1DuWU8rWlHdma3eqJg==,NdBJTVCvOamU35ad3fJRv6A6YZQIYrojcVk9a8WYMVvTtKO+xyIeBvunlidHv4Zb0rYrOvK6u7Gb4N5x6T6FIQ==,es256,+presence:juWx2IphhNuHZHiv8nG3i2WWTyR5A+CWp5iHz2AmE7aj3b3rgj85Gl1PMpmZlvlwDgbCP+dlcP5PPzTFloB3Ow==,FEXBkP0PzZSURoIbLuGiRRHFIcSiqEz/ieNPRqRY/hqLJ4AsvGwJ1xdIX7F8qAQuMSp8m7usuBLS4u+4FGg3Ng==,es256,+presence
+
'';
+
}
+18
nixosModules/homes/thehedgehog/default.nix
···
+
{
+
lib,
+
inputs,
+
...
+
}:
+
{
+
home-manager.users.thehedgehog = {
+
imports = [
+
inputs.self.homeModules.allModules
+
{
+
home.username = "thehedgehog";
+
home.stateVersion = "26.05";
+
py.profiles.server.enable = lib.mkDefault true;
+
py.profiles.desktop.enable = lib.mkDefault false;
+
}
+
];
+
};
+
}
+34
nixosModules/homes/thehedgehog-zaphod/default.nix
···
+
{
+
pkgs,
+
lib,
+
inputs,
+
self',
+
...
+
}:
+
let
+
shell = "caelestia";
+
in
+
{
+
home-manager.users.thehedgehog = {
+
home.packages = [
+
pkgs.mindustry
+
pkgs.signal-desktop
+
self'.packages.glide-browser-bin
+
];
+
home.sessionVariables = {
+
QT_QPA_PLATFORM = "wayland;xcb";
+
GDK_BACKEND = "wayland,x11,*";
+
NIXOS_OZONE_WL = "1";
+
};
+
py.profiles.desktop = {
+
inherit shell;
+
enable = true;
+
};
+
programs.dankMaterialShell.plugins = lib.mkIf (shell == "dms") {
+
dms-wallpaper-shuffler.src = inputs.dms-wp-shuffler;
+
dms-power-usage.src = inputs.dms-power-usage;
+
DankPomodoroTimer.src = "${inputs.dms-plugins}/DankPomodoroTimer";
+
DankBatteryAlerts.src = "${inputs.dms-plugins}/DankBatteryAlerts";
+
};
+
};
+
}
+20
nixosModules/profiles/default.nix
···
+
{ config, lib, ... }:
+
let
+
cfg = config.py.profiles;
+
in
+
{
+
options.py.profiles = {
+
base.enable = lib.mkEnableOption "Base Profile";
+
cli.enable = lib.mkEnableOption "CLI Profile";
+
development.enable = lib.mkEnableOption "Development Profile";
+
gui.enable = lib.mkEnableOption "GUI Profile";
+
server.enable = lib.mkEnableOption "Server Profile";
+
};
+
config = {
+
py.profiles = {
+
base.enable = lib.mkDefault true;
+
cli.enable = lib.mkDefault true;
+
development.enable = lib.mkDefault cfg.gui.enable;
+
};
+
};
+
}
+16
nixosModules/programs/chromium/default.nix
···
+
{ config, lib, ... }:
+
let
+
cfg = config.py.programs.chromium;
+
in
+
{
+
options.py.programs.chromium.enable = lib.mkEnableOption "Chromium";
+
+
config = lib.mkIf cfg.enable {
+
programs.chromium = {
+
enable = true;
+
defaultSearchProviderEnabled = true;
+
defaultSearchProviderSearchURL = "https://kagi.com/search?q={searchTerms}";
+
extraOpts = import ./extraOpts.nix;
+
};
+
};
+
}
+82
nixosModules/programs/chromium/extraOpts.nix
···
+
{
+
AbusiveExperienceInterventionEnforce = false;
+
AccessCodeCastEnabled = false;
+
AdsSettingForIntrusiveAdsSites = 2;
+
AllowDeletingBrowserHistory = true;
+
AllowDinosaurEasterEgg = true;
+
AllowFileSelectionDialogs = true;
+
AllowSystemNotifications = true;
+
AudioCaptureAllowed = true;
+
AudioSandboxEnabled = true;
+
AutofillAddressEnabled = false;
+
AutofillCreditCardEnabled = false;
+
AutoplayAllowed = false;
+
BackgroundModeEnabled = false;
+
BookmarkBarEnabled = false;
+
BrowserLabsEnabled = true;
+
BrowserSignin = 0;
+
BuiltInDnsClientEnabled = false;
+
ChromeVariations = 2;
+
ClickToCallEnabled = false;
+
ClientCertificateManagementAllowed = 0;
+
CloudExtensionRequestEnabled = false;
+
CloudProfileReportingEnabled = false;
+
CloudReportingEnabled = false;
+
CommandLineFlagSecurityWarningsEnabled = false;
+
ComponentUpdatesEnabled = false;
+
ContextualSearchEnabled = false;
+
DNSInterceptionChecksEnabled = false;
+
DataLeakPreventionReportingEnabled = false;
+
DefaultBrowserSettingEnabled = false;
+
DefaultClipboardSetting = 3;
+
DefaultFileSystemReadGuardSetting = 3;
+
DefaultFileSystemWriteGuardSetting = 3;
+
DefaultGeolocationSetting = 3;
+
DefaultImagesSetting = 1;
+
DefaultInsecureContentSetting = 3;
+
DefaultNotificationsSetting = 2;
+
DefaultSensorsSetting = 2;
+
DefaultSerialGuardSetting = 2;
+
DefaultWebBluetoothGuardSetting = 3;
+
DefaultWebHidGuardSetting = 3;
+
DefaultWebUsbGuardSetting = 3;
+
DefaultWindowPlacementSetting = 3;
+
DesktopSharingHubEnabled = false;
+
DeveloperToolsAvailability = 1;
+
DevToolsGenAiSettings = 2;
+
GenAILocalFoundationalModelSettings = 1;
+
HelpMeWriteSettings = 2;
+
TabOrganizerSettings = 2;
+
CreateThemesSettings = 2;
+
Disable3DAPIs = false;
+
DisableScreenshots = false;
+
EditBookmarksEnabled = true;
+
EnableMediaRouter = false;
+
ForceGoogleSafeSearch = false;
+
ForceYouTubeRestrict = 0;
+
FullscreenAllowed = true;
+
HardwareAccelerationModeEnabled = true;
+
HeadlessMode = 1;
+
HideWebStoreIcon = true;
+
HttpsOnlyMode = "allowed";
+
ImportAutofillFormData = false;
+
ImportBookmarks = false;
+
ImportHistory = false;
+
ImportHomepage = false;
+
ImportSavedPasswords = false;
+
ImportSearchEngine = false;
+
IncognitoModeAvailability = 0;
+
InsecureFormsWarningsEnabled = false;
+
LensRegionSearchEnabled = false;
+
MediaRecommendationsEnabled = false;
+
MetricsReportingEnabled = false;
+
NTPCardsVisible = false;
+
NetworkPredictionOptions = 2;
+
PasswordDismissCompromisedAlertEnabled = false;
+
PasswordLeakDetectionEnabled = false;
+
PasswordManagerEnabled = false;
+
PaymentMethodQueryEnabled = false;
+
ShowCastIconInToolbar = false;
+
SyncDisabled = true;
+
SystemUse24HourClock = true;
+
}
+28
nixosModules/programs/firefox/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}:
+
let
+
cfg = config.py.programs.firefox;
+
in
+
{
+
options.py.programs.firefox = {
+
enable = lib.mkEnableOption "Firefox configuration";
+
};
+
+
config = lib.mkIf cfg.enable {
+
programs.firefox = {
+
enable = true;
+
package = pkgs.firefox;
+
wrapperConfig.cfg = {
+
smartcardSupport = true;
+
pipewireSupport = true;
+
ffmpegSupport = true;
+
};
+
policies = import ./policies.nix;
+
preferences = import ./extraPrefs.nix;
+
};
+
};
+
}
+68
nixosModules/programs/firefox/extensions.nix
···
+
let
+
mkAMO = short: {
+
installation_mode = "force_installed";
+
install_url = "https://addons.mozilla.org/firefox/downloads/latest/${short}/latest.xpi";
+
};
+
in
+
{
+
# Addons from AMO
+
"{1be309c5-3e4f-4b99-927d-bb500eb4fa88}" = mkAMO "augmented-steam";
+
"{446900e4-71c2-419f-a6a7-df9c091e268b}" = mkAMO "bitwarden-password-manager" // {
+
default_area = "navbar";
+
};
+
"{bbb880ce-43c9-47ae-b746-c3e0096c5b76}" = mkAMO "catppuccin-gh-file-explorer";
+
"{74145f27-f039-47ce-a470-a662b129930a}" = mkAMO "clearurls";
+
"gdpr@cavi.au.dk" = mkAMO "consent-o-matic";
+
"{5cce4ab5-3d47-41b9-af5e-8203eea05245}" = mkAMO "control-panel-for-twitter";
+
"CookieAutoDelete@kennydo.com" = mkAMO "cookie-autodelete";
+
"addon@darkreader.org" = mkAMO "darkreader" // {
+
default_area = "navbar";
+
};
+
"DontFuckWithPaste@raim.ist" = mkAMO "don-t-fuck-with-paste";
+
"{72bd91c9-3dc5-40a8-9b10-dec633c0873f}" = mkAMO "enhanced-github";
+
"headereditor-amo@addon.firefoxcn.net" = mkAMO "header-editor";
+
"{cb31ec5d-c49a-4e5a-b240-16c767444f62}" = mkAMO "indie-wiki-buddy";
+
"idcac-pub@guus.ninja" = mkAMO "istilldontcareaboutcookies";
+
"search@kagi.com" = mkAMO "kagi-search-for-firefox";
+
"7esoorv3@alefvanoon.anonaddy.me" = mkAMO "libredirect" // {
+
default_area = "navbar";
+
};
+
"github-forks-addon@musicallyut.in" = mkAMO "lovely-forks";
+
"firefox-addon@pronoundb.org" = mkAMO "pronoundb";
+
"{30280527-c46c-4e03-bb16-2e3ed94fa57c}" = mkAMO "protondb-for-steam";
+
"redirector@einaregilsson.com" = mkAMO "redirector";
+
"{a4c4eda4-fb84-4a84-b4a1-f7c1cbf2a1ad}" = mkAMO "refined-github-";
+
"sponsorBlocker@ajay.app" = mkAMO "sponsorblock";
+
"firefox-extension@steamdb.info" = mkAMO "steam-database";
+
"{7a7a4a92-a2a0-41d1-9fd7-1e92480d612d}" = mkAMO "styl-us" // {
+
default_area = "navbar";
+
};
+
"jid0-3GUEt1r69sQNSrca5p8kx9Ezc3U@jetpack" = mkAMO "terms-of-service-didnt-read";
+
"{76ef94a4-e3d0-4c6f-961a-d38a429a332b}" = mkAMO "ttv-lol-pro";
+
"uBlock0@raymondhill.net" = mkAMO "ublock-origin" // {
+
default_area = "navbar";
+
};
+
"{799c0914-748b-41df-a25c-22d008f9e83f}" = mkAMO "web-scrobbler" // {
+
default_area = "navbar";
+
};
+
"yeah@dimden.dev" = mkAMO "yeah-for-twitter";
+
# Official Mozilla Extensions
+
# Still downloaded from AMO
+
"@contain-facebook" = mkAMO "facebook-container";
+
"FirefoxColor@mozilla.com" = mkAMO "firefox-color";
+
"firefox-translations-addon@mozilla.org" = mkAMO "firefox-translations";
+
"@testpilot-containers" = mkAMO "multi-account-containers";
+
# External Addons
+
"frankerfacez@frankerfacez.com" = {
+
installation_mode = "force_installed";
+
install_url = "https://cdn.frankerfacez.com/script/frankerfacez-4.0-an+fx.xpi";
+
};
+
"magnolia@12.34" = {
+
installation_mode = "force_installed";
+
install_url = "https://github.com/bpc-clone/bpc_updates/releases/download/latest/bypass_paywalls_clean-latest.xpi";
+
};
+
"zotero@chnm.gmu.edu" = {
+
installation_mode = "force_installed";
+
install_url = "https://www.zotero.org/download/connector/dl?browser=firefox";
+
};
+
}
+172
nixosModules/programs/firefox/extraPrefs.nix
···
+
{
+
"accessibility.typeaheadfind.flashBar" = 0;
+
"app.normandy.api_url" = "";
+
"app.normandy.enabled" = false;
+
"app.normandy.first_run" = false;
+
"app.shield.optoutstudies.enabled" = false;
+
"app.update.auto" = false;
+
"app.update.backgroundErrors" = 1;
+
"app.update.disable_button.showUpdateHistory" = false;
+
"beacon.enabled" = false;
+
"browser.aboutConfig.showWarning" = false;
+
"browser.bookmarks.addedImportButton" = true;
+
"browser.contentblocking.report.hide_vpn_banner" = true;
+
"browser.contentblocking.report.lockwise.enabled" = false;
+
"browser.contentblocking.report.show_mobile_app" = false;
+
"browser.contentblocking.report.social.url" = "";
+
"browser.formfill.enable" = false;
+
"browser.laterrun.bookkeeping.profileCreationTime" = 0;
+
"browser.laterrun.bookkeeping.sessionCount" = 0;
+
"browser.newtabpage.activity-stream.discoverystream.enabled" = false;
+
"browser.newtabpage.activity-stream.discoverystream.endpointSpocsClear" = "";
+
"browser.newtabpage.activity-stream.discoverystream.endpoints" = "";
+
"browser.newtabpage.activity-stream.discoverystream.personalization.enabled" = false;
+
"browser.newtabpage.activity-stream.discoverystream.readTime.enabled" = false;
+
"browser.newtabpage.activity-stream.discoverystream.rec.impressions" = "{}";
+
"browser.newtabpage.activity-stream.discoverystream.recentSaves.enabled" = false;
+
"browser.newtabpage.activity-stream.discoverystream.saveToPocketCard.enabled" = false;
+
"browser.newtabpage.activity-stream.discoverystream.sendToPocket.enabled" = false;
+
"browser.newtabpage.activity-stream.discoverystream.spoc.impressions" = "{}";
+
"browser.newtabpage.activity-stream.feeds.recommendationprovider" = false;
+
"browser.newtabpage.activity-stream.feeds.telemetry" = false;
+
"browser.newtabpage.activity-stream.impressionId" = "{}";
+
"browser.newtabpage.activity-stream.section.highlights.includePocket" = false;
+
"browser.newtabpage.activity-stream.telemetry" = false;
+
"browser.newtabpage.activity-stream.telemetry.structuredIngestion.endpoint" = "";
+
"browser.newtabpage.activity-stream.telemetry.ut.events" = false;
+
"browser.partnerlink.attributionURL" = "";
+
"browser.partnerlink.campaign.topsites" = "";
+
"browser.ping-centre.telemetry" = false;
+
"browser.places.importBookmarksHTML" = false;
+
"browser.pocket.enabled" = false;
+
"browser.safebrowsing.downloads.enabled" = false;
+
"browser.safebrowsing.downloads.remote.block_dangerous" = false;
+
"browser.safebrowsing.downloads.remote.block_dangerous_host" = false;
+
"browser.safebrowsing.downloads.remote.block_potentially_unwanted" = false;
+
"browser.safebrowsing.downloads.remote.block_uncommon" = false;
+
"browser.safebrowsing.downloads.remote.enabled" = false;
+
"browser.safebrowsing.downloads.remote.url" = "";
+
"browser.safebrowsing.malware.enabled" = false;
+
"browser.safebrowsing.phishing.enabled" = false;
+
# Disable safebrowsing shit
+
"browser.safebrowsing.provider.google.advisoryURL" = "";
+
"browser.safebrowsing.provider.google.gethashURL" = "";
+
"browser.safebrowsing.provider.google.reportURL" = "";
+
"browser.safebrowsing.provider.google.updateURL" = "";
+
"browser.safebrowsing.provider.google4.advisoryURL" = "";
+
"browser.safebrowsing.provider.google4.dataSharingURL" = "";
+
"browser.safebrowsing.provider.google4.gethashURL" = "";
+
"browser.safebrowsing.provider.google4.lists" = "";
+
"browser.safebrowsing.provider.google4.reportURL" = "";
+
"browser.safebrowsing.provider.google4.updateURL" = "";
+
"browser.safebrowsing.provider.mozilla.gethashURL" = "";
+
"browser.safebrowsing.provider.mozilla.lastupdatetime" = "";
+
"browser.safebrowsing.provider.mozilla.lists" = "";
+
"browser.safebrowsing.provider.mozilla.lists.base" = "";
+
"browser.safebrowsing.provider.mozilla.lists.content" = "";
+
"browser.safebrowsing.provider.mozilla.nextupdatetime" = "";
+
"browser.safebrowsing.provider.mozilla.updateURL" = "";
+
"browser.search.serpEventTelemetry.enabled" = false;
+
"browser.send_pings" = false;
+
"browser.tabs.warnOnClose" = true;
+
# Disable useless suggestions
+
"browser.urlbar.suggest.addons" = false;
+
"browser.urlbar.suggest.bookmark" = true;
+
"browser.urlbar.suggest.calculator" = true;
+
"browser.urlbar.suggest.clipboard" = false;
+
"browser.urlbar.suggest.engines" = false;
+
"browser.urlbar.suggest.history" = true;
+
"browser.urlbar.suggest.mdn" = false;
+
"browser.urlbar.suggest.openpage" = true;
+
"browser.urlbar.suggest.pocket" = false;
+
"browser.urlbar.suggest.quicksuggest.nonsponsored" = false;
+
"browser.urlbar.suggest.quicksuggest.sponsored" = false;
+
"browser.urlbar.suggest.topsites" = false;
+
"browser.urlbar.suggest.trending" = false;
+
"browser.urlbar.suggest.weather" = false;
+
# Disable sensors
+
"device.sensors.ambientLight.enabled" = false;
+
"device.sensors.enabled" = false;
+
"device.sensors.motion.enabled" = false;
+
"device.sensors.orientation.enabled" = false;
+
"device.sensors.proximity.enabled" = false;
+
"device.sensors.test.events" = false;
+
"devtools.chrome.enabled" = true;
+
"doh-rollout.uri" = "";
+
"dom.battery.enabled" = false;
+
"dom.event.clipboardevents.enabled" = false;
+
"dom.security.unexpected_system_load_telemetry_enabled" = false;
+
"dom.webgpu.enabled" = true;
+
"extensions.formautofill.addresses.enabled" = false;
+
"extensions.formautofill.creditCards.enabled" = false;
+
"extensions.htmlaboutaddons.recommendations.enabled" = false;
+
# Disable Pocket
+
"extensions.pocket.enabled" = false;
+
"extensions.pocket.showHome" = false;
+
"extensions.pocket.site" = "";
+
"extensions.recommendations.privacyPolicyUrl" = "";
+
"extensions.recommendations.themeRecommendationUrl" = "";
+
"extensions.ui.dictionary.hidden" = true;
+
"extensions.update.autoUpdateDefault" = false;
+
"extensions.webextensions.restrictedDomains" = "";
+
"privacy.clearOnShutdown.downloads" = true;
+
"privacy.donottrackheader.enabled" = false;
+
"privacy.resistFingerprinting.block_mozAddonManager" = true;
+
"remote.prefs.recommended" = false;
+
"services.settings.server" = "";
+
"signon.autofillForms" = false;
+
"signon.generation.enabled" = false;
+
"signon.management.page.breach-alerts.enabled" = false;
+
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
+
"ui.systemUsesDarkTheme" = 1;
+
"webgl.force-enabled" = true;
+
"xpinstall.signatures.required" = false;
+
# Disable telemetry stuff
+
# Already disabled in policies, but better safe than sorry.
+
"browser.urlbar.eventTelemetry.enabled" = false;
+
"browser.urlbar.quicksuggest.dataCollection.enabled" = false;
+
"datareporting.healthreport.infoURL" = "";
+
"datareporting.policy.firstRunURL" = "";
+
"security.app_menu.recordEventTelemetry" = false;
+
"security.certerrors.recordEventTelemetry" = false;
+
"security.identitypopup.recordEventTelemetry" = false;
+
"security.protectionspopup.recordEventTelemetry" = false;
+
"network.trr.confirmation_telemetry_enabled" = false;
+
"privacy.trackingprotection.origin_telemetry.enabled" = false;
+
"toolkit.telemetry.bhrPing.enabled" = false;
+
"toolkit.telemetry.cachedClientID" = "";
+
"toolkit.telemetry.dap_enabled" = false;
+
"toolkit.telemetry.dap_helper" = "";
+
"toolkit.telemetry.dap_leader" = "";
+
"toolkit.telemetry.dap_task1_enabled" = false;
+
"toolkit.telemetry.debugSlowSql" = false;
+
"toolkit.telemetry.firstShutdownPing.enabled" = false;
+
"toolkit.telemetry.geckoview.streaming" = false;
+
"toolkit.telemetry.newProfilePing.enabled" = false;
+
"toolkit.telemetry.pioneer-new-studies-available" = false;
+
"toolkit.telemetry.previousBuildID" = "";
+
"toolkit.telemetry.reportingpolicy.firstRun" = "";
+
"toolkit.telemetry.server" = "";
+
"toolkit.telemetry.server_owner" = "";
+
"toolkit.telemetry.shutdownPingSender.backgroundtask.enabled" = false;
+
"toolkit.telemetry.shutdownPingSender.enabled" = false;
+
"toolkit.telemetry.shutdownPingSender.enabledFirstSession" = false;
+
"toolkit.telemetry.testing.overrideProductsCheck" = false;
+
"toolkit.telemetry.unified" = false;
+
"toolkit.telemetry.updatePing.enabled" = "";
+
# FastFox
+
"media.memory_cache_max_size" = 65536;
+
"browser.cache.jsbc_compression_level" = 3;
+
"image.mem.decode_bytes_at_a_time" = 32768;
+
"network.http.max-connections" = 1800;
+
"network.http.max-persistent-connections-per-server" = 10;
+
"network.http.max-urgent-start-excessive-connections-per-host" = 5;
+
"network.dns.max_high_priority_threads" = 8;
+
"network.ssl_tokens_cache_capacity" = 10240;
+
"network.dns.disablePrefetch" = true;
+
"browser.places.speculativeConnect.enabled" = false;
+
"browser.urlbar.speculativeConnect.enabled" = false;
+
+
# Other Tweaks
+
"security.fileuri.strict_origin_policy" = false;
+
}
+66
nixosModules/programs/firefox/policies.nix
···
+
{
+
AppAutoUpdate = false;
+
AutofillAddressEnabled = false;
+
AutofillCreditCardEnabled = false;
+
BackgroundAppUpdate = false;
+
DisableAppUpdate = true;
+
DisableBuiltinPDFViewer = false;
+
DisableFirefoxAccounts = true;
+
DisableFirefoxStudies = true;
+
DisableMasterPasswordCreation = true;
+
DisablePocket = true;
+
DisableSetDesktopBackground = true;
+
DisableTelemetry = true;
+
DNSOverHTTPS = {
+
Enabled = false;
+
ProviderURL = "https://dns.nextdns.io/36e7f7";
+
Locked = true;
+
};
+
DontCheckDefaultBrowser = true;
+
ExtensionSettings = import ./extensions.nix;
+
ExtensionUpdate = true;
+
FirefoxHome = {
+
Search = true;
+
TopSites = false;
+
SponsoredTopSites = false;
+
Highlights = false;
+
Pocket = false;
+
SponsoredPocket = false;
+
Snippets = false;
+
Locked = true;
+
};
+
FirefoxSuggest = {
+
WebSuggestions = false;
+
SponsoredSuggestions = false;
+
ImproveSuggest = false;
+
Locked = true;
+
};
+
HardwareAcceleration = true;
+
Homepage = {
+
URL = "about:blank";
+
Locked = true;
+
StartPage = "previous-session";
+
};
+
ManualAppUpdateOnly = true;
+
OfferToSaveLogins = false;
+
OfferToSaveLoginsDefault = false;
+
OverrideFirstRunPage = "";
+
OverridePostUpdatePage = "";
+
PasswordManagerEnabled = false;
+
PDFjs = {
+
Enabled = true;
+
EnablePermissions = false;
+
};
+
PrintingEnabled = true;
+
SearchBar = "unified";
+
ShowHomeButton = false;
+
UserMessaging = {
+
WhatsNew = false;
+
ExtensionRecommendations = false;
+
FeatureRecommendations = false;
+
UrlbarInterventions = false;
+
SkipOnboarding = false;
+
MoreFromMozilla = false;
+
Locked = true;
+
};
+
}
+19
nixosModules/programs/hyprland/default.nix
···
+
{
+
config,
+
lib,
+
...
+
}:
+
let
+
cfg = config.py.programs.hyprland;
+
in
+
{
+
options = {
+
py.programs.hyprland.enable = lib.mkEnableOption "Hyprland";
+
};
+
config = lib.mkIf cfg.enable {
+
programs.hyprland = {
+
enable = true;
+
xwayland.enable = true;
+
};
+
};
+
}
+46
nixosModules/programs/misc/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}:
+
let
+
cfg = config.py.programs;
+
inherit (lib) mkEnableOption mkIf;
+
in
+
{
+
options.py.programs = {
+
appimage.enable = mkEnableOption "Appimage";
+
dconf.enable = mkEnableOption "dconf";
+
fish.enable = mkEnableOption "fish shell";
+
less.enable = mkEnableOption "less";
+
noisetorch.enable = mkEnableOption "NoiseTorch";
+
steam.enable = mkEnableOption "Steam";
+
wireshark.enable = mkEnableOption "Wireshark";
+
};
+
config = {
+
programs = {
+
appimage = mkIf cfg.appimage.enable {
+
enable = true;
+
binfmt = true;
+
};
+
dconf.enable = mkIf cfg.dconf.enable true;
+
fish.enable = mkIf cfg.fish.enable true;
+
less.enable = mkIf cfg.less.enable true;
+
noisetorch.enable = mkIf cfg.noisetorch.enable true;
+
steam = mkIf cfg.steam.enable {
+
enable = true;
+
protontricks.enable = true;
+
gamescopeSession.enable = true;
+
extraCompatPackages = with pkgs; [
+
steamtinkerlaunch
+
];
+
};
+
wireshark.enable = mkIf cfg.wireshark.enable true;
+
};
+
environment.systemPackages = lib.optionals cfg.steam.enable [
+
pkgs.steamtinkerlaunch
+
pkgs.protonplus
+
];
+
};
+
}
+21
nixosModules/programs/neovim/default.nix
···
+
{
+
lib,
+
config,
+
...
+
}:
+
let
+
cfg = config.py.programs.neovim;
+
in
+
{
+
options.py.programs.neovim.enable = lib.mkEnableOption "Neovim configuration";
+
+
config.programs.neovim = lib.mkIf cfg.enable {
+
enable = true;
+
defaultEditor = true;
+
viAlias = true;
+
vimAlias = true;
+
withRuby = false;
+
withNodeJs = false;
+
withPython3 = false;
+
};
+
}
+20
nixosModules/services/buildbot/default.nix
···
+
{ config, lib, ... }:
+
let
+
cfg = config.py.services.buildbot.worker;
+
in
+
{
+
options.py.services.buildbot.worker = {
+
enable = lib.mkEnableOption "buildbot worker";
+
passwordFile = lib.mkOption {
+
type = lib.types.path;
+
description = "Password file for the worker";
+
default = null;
+
};
+
};
+
config.services.buildbot-nix.worker = lib.mkIf cfg.enable {
+
enable = true;
+
name = config.networking.hostName;
+
masterUrl = "tcp:host=marvin:port=6915";
+
workerPasswordFile = cfg.passwordFile;
+
};
+
}
+59
nixosModules/services/forgejo-runner/default.nix
···
+
{
+
pkgs,
+
config,
+
lib,
+
...
+
}:
+
let
+
runnerBase = {
+
enable = true;
+
url = "https://git.pyrox.dev";
+
labels = [
+
"default:docker://git.pyrox.dev/pyrox/flake-base:latest"
+
"nodejs:docker://node:20"
+
"nodejs-alpine:docker://node:20-alpine"
+
"nodejs-lts:docker://node:20"
+
"nodejs-lts:docker://node:20-alpine"
+
"nodejs-latest:docker://node:21"
+
"nodejs-latest-alpine:docker://node:21-alpine"
+
"alpine:docker://alpine:3.19"
+
];
+
settings = {
+
log.level = "info";
+
runner = {
+
insecure = false;
+
capacity = 4;
+
};
+
cache = {
+
enabled = true;
+
port = 0;
+
};
+
container = {
+
# Automatically create a network for containers
+
network = "";
+
enable_ipv6 = false;
+
};
+
};
+
};
+
cfg = config.py.services.forgejo-runner;
+
in
+
{
+
options.py.services.forgejo-runner = {
+
enable = lib.mkEnableOption "Forgejo Actions Runner configuration";
+
tokenFile = lib.mkOption {
+
type = lib.types.path;
+
description = "Token for default runner";
+
example = /path/to/token/file;
+
};
+
};
+
+
config.services.gitea-actions-runner = lib.mkIf cfg.enable {
+
package = pkgs.forgejo-runner;
+
instances = {
+
"${config.networking.hostName}-default" = runnerBase // {
+
inherit (cfg) tokenFile;
+
name = "${config.networking.hostName}";
+
};
+
};
+
};
+
}
+30
nixosModules/services/scrutiny/default.nix
···
+
{
+
config,
+
lib,
+
self,
+
...
+
}:
+
let
+
cfg = config.py.services.scrutiny.collector;
+
apiUrl = "https://marvin.${self.lib.data.tsNet}:${toString self.lib.data.services.scrutiny.port}";
+
in
+
{
+
options.py.services.scrutiny = {
+
collector = {
+
enable = lib.mkEnableOption "Scrutiny Collector";
+
extraSettings = lib.mkOption {
+
type = lib.types.attrs;
+
description = "Extra settings to merge to the default scrutiny collector options";
+
default = { };
+
};
+
};
+
};
+
config.services.scrutiny.collector = lib.mkIf cfg.enable {
+
enable = true;
+
settings = {
+
host.id = config.networking.hostName;
+
api.endpoint = apiUrl;
+
}
+
// cfg.extraSettings;
+
};
+
}
+4
optnix.toml
···
+
[scopes.flake-parts]
+
description = "flake-parts config"
+
options-list-cmd = "nix eval --json .#debug.options-doc"
+
evaluator = "nix eval .#debug.config.{{ .Option }}"
-12
overlays/bluez-wiimote/default.nix
···
-
# deadnix: skip
-
_:
-
# deadnix: skip
-
final: prev:
-
let
-
inherit (prev.lib) enableFeature;
-
in
-
{
-
bluez-wiimote = prev.bluez.overrideAttrs (old: {
-
configureFlags = (old.configureFlags or [ ]) ++ [ (enableFeature true "wiimote") ];
-
});
-
}
+5
overlays/cinny/default.nix
···
+
_: _final: prev: {
+
cinny-unwrapped = prev.cinny-unwrapped.overrideAttrs (old: {
+
patches = (old.patches or [ ]) ++ [ ./nix-commands.patch ];
+
});
+
}
+47
overlays/cinny/nix-commands.patch
···
+
diff --git c/src/app/features/room/RoomInput.tsx i/src/app/features/room/RoomInput.tsx
+
index eb214f62..d2b43481 100644
+
--- c/src/app/features/room/RoomInput.tsx
+
+++ i/src/app/features/room/RoomInput.tsx
+
@@ -306,6 +306,12 @@ export const RoomInput = forwardRef<HTMLDivElement, RoomInputProps>(
+
} else if (commandName === Command.UnFlip) {
+
plainText = `${UNFLIP} ${plainText}`;
+
customHtml = `${UNFLIP} ${customHtml}`;
+
+ } else if (commandName === Command.NixIssue) {
+
+ plainText = `https://github.com/nixos/nixpkgs/issues/${plainText}`;
+
+ customHtml = `https://github.com/nixos/nixpkgs/issues/${customHtml}`;
+
+ } else if (commandName === Command.NixPR) {
+
+ plainText = `https://github.com/nixos/nixpkgs/pull/${plainText}`;
+
+ customHtml = `https://github.com/nixos/nixpkgs/pull/${customHtml}`;
+
} else if (commandName) {
+
const commandContent = commands[commandName as Command];
+
if (commandContent) {
+
diff --git c/src/app/hooks/useCommands.ts i/src/app/hooks/useCommands.ts
+
index bc7d2892..bb6ce6f6 100644
+
--- c/src/app/hooks/useCommands.ts
+
+++ i/src/app/hooks/useCommands.ts
+
@@ -52,6 +52,8 @@ export enum Command {
+
ConvertToRoom = 'converttoroom',
+
TableFlip = 'tableflip',
+
UnFlip = 'unflip',
+
+ NixIssue = 'nixi',
+
+ NixPR = 'nixp',
+
}
+
+
export type CommandContent = {
+
@@ -67,6 +69,16 @@ export const useCommands = (mx: MatrixClient, room: Room): CommandRecord => {
+
+
const commands: CommandRecord = useMemo(
+
() => ({
+
+ [Command.NixPR]: {
+
+ name: Command.NixPR,
+
+ description: 'Link to nixpkgs PR.',
+
+ exe: async () => undefined,
+
+ },
+
+ [Command.NixIssue]: {
+
+ name: Command.NixIssue,
+
+ description: 'Link to nixpkgs issue.',
+
+ exe: async () => undefined,
+
+ },
+
[Command.Me]: {
+
name: Command.Me,
+
description: 'Send action message',
+7
overlays/default.nix
···
+
{
+
flake.overlays = {
+
cinny = import ./cinny;
+
openssh-fixperms = import ./openssh-fixperms;
+
hy3-fixes = import ./hy3-fixes;
+
};
+
}
+12
overlays/hy3-fixes/default.nix
···
+
_final: prev: {
+
hyprlandPlugins = prev.hyprlandPlugins // {
+
hy3 = prev.hyprlandPlugins.hy3.overrideAttrs (old: {
+
patches = (old.patches or [ ]) ++ [
+
(prev.fetchpatch {
+
url = "https://github.com/outfoxxed/hy3/commit/8a3f46a40984e74094f71b5bd38df3dbe5daa97f.patch?full_index=1";
+
hash = "sha256-zNGCMcidRx7zV3mnlQT4EjA36g7MeBf6A9gyvITeZ4c=";
+
})
+
];
+
});
+
};
+
}
-2
overlays/nix-index/default.nix
···
-
# deadnix: skip
-
{ inputs, ... }: final: prev: { inherit (inputs.nix-index.packages.${prev.system}) nix-index; }
-3
overlays/nixos-option/default.nix
···
-
_:
-
# deadnix: skip
-
final: prev: { nixos-option = prev.nixos-rebuild; }
+6
overlays/openssh-fixperms/default.nix
···
+
_final: prev: {
+
openssh-patched = prev.openssh.overrideAttrs (old: {
+
patches = (old.patches or [ ]) ++ [ ./permfix.patch ];
+
doCheck = false;
+
});
+
}
+13
overlays/openssh-fixperms/permfix.patch
···
+
diff --git a/readconf.h b/readconf.h
+
index ded13c9..94f489e 100644
+
--- a/readconf.h
+
+++ b/readconf.h
+
@@ -213,7 +213,7 @@ typedef struct {
+
#define SESSION_TYPE_SUBSYSTEM 1
+
#define SESSION_TYPE_DEFAULT 2
+
+
-#define SSHCONF_CHECKPERM 1 /* check permissions on config file */
+
+#define SSHCONF_CHECKPERM 0 /* check permissions on config file */
+
#define SSHCONF_USERCONF 2 /* user provided config file not system */
+
#define SSHCONF_FINAL 4 /* Final pass over config, after canon. */
+
#define SSHCONF_NEVERMATCH 8 /* Match/Host never matches; internal only */
-15
overlays/sway-unwrapped/default.nix
···
-
# deadnix: skip
-
_:
-
# deadnix: skip
-
final: prev:
-
let
-
inherit (prev.lib.strings) mesonOption mesonEnable;
-
in
-
{
-
sway-unwrapped = prev.sway-unwrapped.overrideAttrs {
-
mesonFlags = [
-
(mesonOption "sd-bus-provider" "libsystemd")
-
(mesonEnable "tray" true)
-
];
-
};
-
}
+20
packages/anubis-files/package.nix
···
+
{
+
stdenv,
+
...
+
}:
+
stdenv.mkDerivation {
+
pname = "pyronet-anubis-files";
+
version = "1.0.0";
+
+
src = ./src;
+
+
buildPhase = ''
+
substituteInPlace policies/*.yaml \
+
--replace-fail "CUSTOM" $out
+
'';
+
+
installPhase = ''
+
mkdir $out
+
cp -r * $out/
+
'';
+
}
+56
packages/anubis-files/src/policies/default.yaml
···
+
bots:
+
- import: CUSTOM/policies/meta/base.yaml
+
dnsbl: false
+
openGraph:
+
enabled: true
+
considerHost: false
+
ttl: 24h
+
status_codes:
+
CHALLENGE: 200
+
DENY: 200
+
thresholds:
+
- name: minimal-suspicion
+
expression: weight <= 0
+
action: ALLOW
+
- name: mild-suspicion
+
expression:
+
all:
+
- weight > 0
+
- weight < 10
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/metarefresh
+
algorithm: metarefresh
+
difficulty: 1
+
report_as: 1
+
- name: moderate-suspicion
+
expression:
+
all:
+
- weight >= 10
+
- weight < 20
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 2 # two leading zeros, very fast for most clients
+
report_as: 2
+
- name: mild-proof-of-work
+
expression:
+
all:
+
- weight >= 20
+
- weight < 30
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 4
+
report_as: 4
+
# For clients that are browser like and have gained many points from custom rules
+
- name: extreme-suspicion
+
expression: weight >= 30
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 6
+
report_as: 5
+64
packages/anubis-files/src/policies/forgejo.yaml
···
+
bots:
+
- import: CUSTOM/policies/meta/base.yaml
+
- import: (data)/clients/git.yaml
+
- import: (data)/apps/gitea-rss-feeds.yaml
+
+
# Allow forgejo runner connections from localhost and tailscale
+
- name: forgejo-runner
+
user_agent_regex: connect-go
+
action: ALLOW
+
+
dnsbl: false
+
openGraph:
+
enabled: true
+
considerHost: false
+
ttl: 24h
+
status_codes:
+
CHALLENGE: 200
+
DENY: 200
+
thresholds:
+
- name: minimal-suspicion
+
expression: weight <= 0
+
action: ALLOW
+
- name: mild-suspicion
+
expression:
+
all:
+
- weight > 0
+
- weight < 10
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/metarefresh
+
algorithm: metarefresh
+
difficulty: 1
+
report_as: 1
+
- name: moderate-suspicion
+
expression:
+
all:
+
- weight >= 10
+
- weight < 20
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 2 # two leading zeros, very fast for most clients
+
report_as: 2
+
- name: mild-proof-of-work
+
expression:
+
all:
+
- weight >= 20
+
- weight < 30
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 4
+
report_as: 4
+
# For clients that are browser like and have gained many points from custom rules
+
- name: extreme-suspicion
+
expression: weight >= 30
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 6
+
report_as: 5
+54
packages/anubis-files/src/policies/meta/base.yaml
···
+
# keep-sorted start
+
- import: (data)/bots/_deny-pathological.yaml
+
- import: (data)/bots/aggressive-brazilian-scrapers.yaml
+
- import: (data)/clients/x-firefox-ai.yaml
+
- import: (data)/common/keep-internet-working.yaml
+
- import: (data)/common/rfc-violations.yaml
+
- import: (data)/crawlers/_allow-good.yaml
+
- import: (data)/meta/ai-block-aggressive.yaml
+
# keep-sorted end
+
- name: realistic-browser-catchall
+
expression:
+
all:
+
- '"User-Agent" in headers'
+
- '( userAgent.contains("Firefox") ) || ( userAgent.contains("Chrome") ) || ( userAgent.contains("Safari") )'
+
- '"Accept" in headers'
+
- '"Sec-Fetch-Dest" in headers'
+
- '"Sec-Fetch-Mode" in headers'
+
- '"Sec-Fetch-Site" in headers'
+
- '"Accept-Encoding" in headers'
+
- '( headers["Accept-Encoding"].contains("zstd") || headers["Accept-Encoding"].contains("br") )'
+
- '"Accept-Language" in headers'
+
action: WEIGH
+
weight:
+
adjust: -10
+
# The Upgrade-Insecure-Requests header is typically sent by browsers, but not always
+
- name: upgrade-insecure-requests
+
expression: '"Upgrade-Insecure-Requests" in headers'
+
action: WEIGH
+
weight:
+
adjust: -2
+
# Chrome should behave like Chrome
+
- name: chrome-is-proper
+
expression:
+
all:
+
- userAgent.contains("Chrome")
+
- '"Sec-Ch-Ua" in headers'
+
- 'headers["Sec-Ch-Ua"].contains("Chromium")'
+
- '"Sec-Ch-Ua-Mobile" in headers'
+
- '"Sec-Ch-Ua-Platform" in headers'
+
action: WEIGH
+
weight:
+
adjust: -5
+
- name: should-have-accept
+
expression: '!("Accept" in headers)'
+
action: WEIGH
+
weight:
+
adjust: 5
+
# Generic catchall rule
+
- name: generic-browser
+
user_agent_regex: >-
+
Mozilla|Opera|Chrome|Chromium
+
action: WEIGH
+
weight:
+
adjust: 10
packages/anubis-files/src/policies/meta/openGraph.yaml

This is a binary file and will not be displayed.

+56
packages/anubis-files/src/policies/nextcloud-office.yaml
···
+
bots:
+
- import: CUSTOM/policies/meta/base.yaml
+
# Allow requests from the nextcloud server to bypass checks
+
- name: allow-nextcloud-server
+
user_agent_regex: ^Nextcloud Server / richdocuments$
+
action: ALLOW
+
dnsbl: false
+
status_codes:
+
CHALLENGE: 200
+
DENY: 200
+
thresholds:
+
- name: minimal-suspicion
+
expression: weight <= 0
+
action: ALLOW
+
- name: mild-suspicion
+
expression:
+
all:
+
- weight > 0
+
- weight < 10
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/metarefresh
+
algorithm: metarefresh
+
difficulty: 1
+
report_as: 1
+
- name: moderate-suspicion
+
expression:
+
all:
+
- weight >= 10
+
- weight < 20
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 2 # two leading zeros, very fast for most clients
+
report_as: 2
+
- name: mild-proof-of-work
+
expression:
+
all:
+
- weight >= 20
+
- weight < 30
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 4
+
report_as: 4
+
# For clients that are browser like and have gained many points from custom rules
+
- name: extreme-suspicion
+
expression: weight >= 30
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 6
+
report_as: 5
+88
packages/anubis-files/src/policies/nextcloud.yaml
···
+
bots:
+
- import: CUSTOM/policies/meta/base.yaml
+
# Allow android apps that I use
+
- name: allow-android-apps
+
user_agent_regex: Nextcloud-android|DAVx5|ICSx5
+
action: ALLOW
+
# Allow the Thunderbird Filelink app
+
- name: allow-thunderbird-filelink
+
user_agent_regex: ^Filelink for \*cloud.*$
+
action: ALLOW
+
# Allow anyone accessing the **authenticated** DAV endpoint.
+
- name: allow-dav
+
path_regex: ^/remote.php/dav/.*$
+
action: ALLOW
+
# Allow public shares so that I can more easily send them
+
- name: allow-public-shares
+
path_regex: ^/s/.*$
+
action: ALLOW
+
# Allow clients to load assets to not break public shares
+
- name: allow-assets
+
action: ALLOW
+
expression:
+
any:
+
# Dist files from nextcloud core
+
- 'path.startsWith("/dist/")'
+
# Core Nextcloud files
+
- 'path.startsWith("/js/core")'
+
- 'path.startsWith("/core/css/")'
+
# Viewer app files
+
- 'path.startsWith("/apps/viewer")'
+
# Theme CSS
+
- 'path.startsWith("/apps/theming/")'
+
# Public DAV endpoint
+
- 'path.startsWith("/public.php/dav/files/")'
+
dnsbl: false
+
openGraph:
+
enabled: true
+
considerHost: false
+
ttl: 24h
+
status_codes:
+
CHALLENGE: 200
+
DENY: 200
+
thresholds:
+
- name: minimal-suspicion
+
expression: weight <= 0
+
action: ALLOW
+
- name: mild-suspicion
+
expression:
+
all:
+
- weight > 0
+
- weight < 10
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/metarefresh
+
algorithm: metarefresh
+
difficulty: 1
+
report_as: 1
+
- name: moderate-suspicion
+
expression:
+
all:
+
- weight >= 10
+
- weight < 20
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 2 # two leading zeros, very fast for most clients
+
report_as: 2
+
- name: mild-proof-of-work
+
expression:
+
all:
+
- weight >= 20
+
- weight < 30
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 4
+
report_as: 4
+
# For clients that are browser like and have gained many points from custom rules
+
- name: extreme-suspicion
+
expression: weight >= 30
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 6
+
report_as: 5
+63
packages/anubis-files/src/policies/vaultwarden.yaml
···
+
bots:
+
- import: CUSTOM/policies/meta/base.yaml
+
# Allow bitwarden apps
+
- name: allow-bitwarden-mobile
+
user_agent_regex: Bitwarden_Mobile
+
action: ALLOW
+
- name: allow-bitwarden-webext
+
user_agent_regex: Mozilla
+
action: ALLOW
+
dnsbl: false
+
openGraph:
+
enabled: true
+
considerHost: false
+
ttl: 24h
+
status_codes:
+
CHALLENGE: 200
+
DENY: 200
+
thresholds:
+
- name: minimal-suspicion
+
expression: weight <= 0
+
action: ALLOW
+
- name: mild-suspicion
+
expression:
+
all:
+
- weight > 0
+
- weight < 10
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/metarefresh
+
algorithm: metarefresh
+
difficulty: 1
+
report_as: 1
+
- name: moderate-suspicion
+
expression:
+
all:
+
- weight >= 10
+
- weight < 20
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 2 # two leading zeros, very fast for most clients
+
report_as: 2
+
- name: mild-proof-of-work
+
expression:
+
all:
+
- weight >= 20
+
- weight < 30
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 4
+
report_as: 4
+
# For clients that are browser like and have gained many points from custom rules
+
- name: extreme-suspicion
+
expression: weight >= 30
+
action: CHALLENGE
+
challenge:
+
# https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work
+
algorithm: fast
+
difficulty: 6
+
report_as: 5
+26
packages/bgutil-pot-server/librusty_v8.nix
···
+
# COPIED FROM nixpkgs/pkgs/by-name/router
+
{
+
lib,
+
stdenv,
+
fetchurl,
+
}:
+
+
let
+
fetch_librusty_v8 =
+
args:
+
fetchurl {
+
name = "librusty_v8-${args.version}";
+
url = "https://github.com/denoland/rusty_v8/releases/download/v${args.version}/librusty_v8_release_${stdenv.hostPlatform.rust.rustcTarget}.a";
+
sha256 = args.shas.${stdenv.hostPlatform.system};
+
meta = {
+
inherit (args) version;
+
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+
};
+
};
+
in
+
fetch_librusty_v8 {
+
version = "130.0.7";
+
shas = {
+
x86_64-linux = "sha256-pkdsuU6bAkcIHEZUJOt5PXdzK424CEgTLXjLtQ80t10=";
+
};
+
}
+49
packages/bgutil-pot-server/package.nix
···
+
{
+
lib,
+
callPackage,
+
rustPlatform,
+
fetchFromGitHub,
+
pkg-config,
+
openssl,
+
_experimental-update-script-combinators,
+
nix-update-script,
+
}:
+
rustPlatform.buildRustPackage (finalAttrs: {
+
pname = "bgutil-pot-server";
+
version = "0.6.0";
+
+
src = fetchFromGitHub {
+
owner = "jim60105";
+
repo = "bgutil-ytdlp-pot-provider-rs";
+
tag = "v${finalAttrs.version}";
+
hash = "sha256-kEu5WqOymH8yAyMhGKtVPOq3qlTRpFU/FO71uWEX/e8=";
+
};
+
+
cargoHash = "sha256-fJZeyIsFUfpWeC1MWsU1hANb6cqC9xHQOnhcohEMTeM=";
+
+
nativeBuildInputs = [
+
pkg-config
+
];
+
+
buildInputs = [
+
openssl
+
];
+
+
env.RUSTY_V8_ARCHIVE = callPackage ./librusty_v8.nix { };
+
+
doCheck = false;
+
+
passthru.updateScript = _experimental-update-script-combinators.sequence [
+
(nix-update-script { })
+
./update-librusty.sh
+
];
+
+
meta = {
+
changelog = "https://github.com/jim60105/bgutil-ytdlp-pot-provider-rs/releases/tag/v${finalAttrs.version}";
+
description = "Proof-of-origin token provider plugin for yt-dlp in Rust";
+
homepage = "https://github.com/jim60105/bgutil-ytdlp-pot-provider-rs";
+
license = lib.licenses.gpl3Plus;
+
maintainers = with lib.maintainers; [ pyrox0 ];
+
mainProgram = "bgutil-pot";
+
};
+
})
+45
packages/bgutil-pot-server/update-librusty.sh
···
+
#!/usr/bin/env nix-shell
+
#!nix-shell -i bash -p gnugrep gnused nix jq
+
# shellcheck shell=bash
+
# COPIED FROM nixpkgs/pkgs/by-name/wi/windmill
+
+
set -eu -o pipefail
+
+
echo "librusty_v8: UPDATING"
+
+
BGUTIL_LATEST_VERSION=$(curl ${GITHUB_TOKEN:+-u ":$GITHUB_TOKEN"} --silent --fail --location "https://api.github.com/repos/jim60105/bgutil-ytdlp-pot-provider-rs/releases/latest" | jq --raw-output .tag_name)
+
CARGO_LOCK=$(curl ${GITHUB_TOKEN:+-u ":$GITHUB_TOKEN"} --silent --fail --location "https://github.com/jim60105/bgutil-ytdlp-pot-provider-rs/raw/$BGUTIL_LATEST_VERSION/Cargo.lock")
+
+
PACKAGE_DIR=$(dirname "$(readlink --canonicalize-existing "${BASH_SOURCE[0]}")")
+
OUTPUT_FILE="$PACKAGE_DIR/librusty_v8.nix"
+
NEW_VERSION=$(echo "$CARGO_LOCK" | grep --after-context 5 'name = "v8"' | grep 'version =' | sed -E 's/version = "//;s/"//')
+
+
CURRENT_VERSION=""
+
if [ -f "$OUTPUT_FILE" ]; then
+
CURRENT_VERSION="$(grep 'version =' "$OUTPUT_FILE" | sed -E 's/version = "//;s/"//')"
+
fi
+
+
if [ "$CURRENT_VERSION" == "$NEW_VERSION" ]; then
+
echo "No update needed, $CURRENT_VERSION is already latest"
+
exit 0
+
fi
+
+
x86Hash="$(nix-prefetch-url --type sha256 https://github.com/denoland/rusty_v8/releases/download/v"$NEW_V")"
+
TEMP_FILE="$OUTPUT_FILE.tmp"
+
cat >"$TEMP_FILE" <<EOF
+
# COPIED FROM nixpkgs/pkgs/by-name/wi/windmill
+
# auto-generated file -- DO NOT EDIT!
+
{ fetchLibrustyV8 }:
+
+
fetchLibrustyV8 {
+
version = "$NEW_VERSION";
+
shas = {
+
# NOTE; Follows supported platforms of package (see meta.platforms attribute)!
+
x86_64-linux = "$(nix hash convert --hash-algo sha256 --from nix32 "$x86Hash")";
+
};
+
}
+
EOF
+
+
mv "$TEMP_FILE" "$OUTPUT_FILE"
+
+
echo "librusty_v8: UPDATE DONE"
-24
packages/doc2dash/default.nix
···
-
{
-
fetchFromGitHub,
-
python3Packages,
-
}: python3Packages.buildPythonApplication rec {
-
pname = "doc2dash";
-
version = "3.1.0";
-
pyproject = true;
-
-
src = fetchFromGitHub {
-
owner = "hynek";
-
repo = "doc2dash";
-
rev = version;
-
hash = "sha256-u6K+BDc9tUxq4kCekTaqQLtNN/OLVc3rh14sVSfPtoQ=";
-
};
-
-
build-system = with python3Packages; [ hatchling hatch-vcs hatch-fancy-pypi-readme];
-
-
dependencies = with python3Packages; [attrs beautifulsoup4 click rich];
-
-
nativeCheckInputs = with python3Packages; [
-
pytestCheckHook
-
pytest-cov-stub
-
];
-
}
+34
packages/doc2dash/package.nix
···
+
{
+
fetchFromGitHub,
+
python3Packages,
+
}:
+
python3Packages.buildPythonApplication rec {
+
pname = "doc2dash";
+
version = "3.1.0";
+
pyproject = true;
+
+
src = fetchFromGitHub {
+
owner = "hynek";
+
repo = "doc2dash";
+
rev = version;
+
hash = "sha256-u6K+BDc9tUxq4kCekTaqQLtNN/OLVc3rh14sVSfPtoQ=";
+
};
+
+
build-system = with python3Packages; [
+
hatchling
+
hatch-vcs
+
hatch-fancy-pypi-readme
+
];
+
+
dependencies = with python3Packages; [
+
attrs
+
beautifulsoup4
+
click
+
rich
+
];
+
+
nativeCheckInputs = with python3Packages; [
+
pytestCheckHook
+
pytest-cov-stub
+
];
+
}
+147
packages/glide-browser-bin/package.nix
···
+
{
+
lib,
+
stdenv,
+
fetchurl,
+
# keep-sorted start
+
adwaita-icon-theme,
+
alsa-lib,
+
autoPatchelfHook,
+
copyDesktopItems,
+
curl,
+
dbus-glib,
+
gtk3,
+
hicolor-icon-theme,
+
libXtst,
+
libva,
+
makeBinaryWrapper,
+
makeDesktopItem,
+
patchelfUnstable,
+
pciutils,
+
pipewire,
+
wrapGAppsHook3,
+
# keep-sorted end
+
nix-update-script,
+
...
+
}:
+
stdenv.mkDerivation (finalAttrs: {
+
pname = "glide-browser";
+
version = "0.1.55a";
+
+
src = fetchurl {
+
url = "https://github.com/glide-browser/glide/releases/download/${finalAttrs.version}/glide.linux-x86_64.tar.xz";
+
hash = "sha256-mjk8KmB/T5ZpB9AMQw1mtb9VbMXVX2VV4N+hWpWkSYI=";
+
};
+
+
nativeBuildInputs = [
+
# keep-sorted start
+
autoPatchelfHook
+
copyDesktopItems
+
makeBinaryWrapper
+
patchelfUnstable
+
wrapGAppsHook3
+
# keep-sorted end
+
];
+
+
buildInputs = [
+
# keep-sorted start
+
adwaita-icon-theme
+
alsa-lib
+
dbus-glib
+
gtk3
+
hicolor-icon-theme
+
libXtst
+
# keep-sorted end
+
];
+
+
runtimeDependencies = [
+
# keep-sorted start
+
curl
+
libva.out
+
pciutils
+
# keep-sorted end
+
];
+
+
appendRunpaths = [ "${pipewire}/lib" ];
+
+
# Firefox uses "relrhack" to manually process relocations from a fixed offset
+
patchelfFlags = [ "--no-clobber-old-sections" ];
+
+
installPhase = ''
+
runHook preInstall
+
+
mkdir -p $out/bin $out/share/icons/hicolor/ $out/lib/glide-browser-bin-${finalAttrs.version}
+
cp -t $out/lib/glide-browser-bin-${finalAttrs.version} -r *
+
chmod +x $out/lib/glide-browser-bin-${finalAttrs.version}/glide
+
iconDir=$out/share/icons/hicolor
+
browserIcons=$out/lib/glide-browser-bin-${finalAttrs.version}/browser/chrome/icons/default
+
+
for i in 16 32 48 64 128; do
+
iconSizeDir="$iconDir/''${i}x$i/apps"
+
mkdir -p $iconSizeDir
+
cp $browserIcons/default$i.png $iconSizeDir/glide-browser.png
+
done
+
+
+
ln -s $out/lib/glide-browser-bin-${finalAttrs.version}/glide $out/bin/glide
+
ln -s $out/bin/glide $out/bin/glide-browser
+
+
runHook postInstall
+
'';
+
+
desktopItems = [
+
(makeDesktopItem {
+
name = "glide-browser-bin";
+
exec = "glide-browser --name glide-browser %U";
+
icon = "glide-browser";
+
desktopName = "Glide Browser";
+
genericName = "Web Browser";
+
terminal = false;
+
startupNotify = true;
+
startupWMClass = "glide-browser";
+
categories = [
+
"Network"
+
"WebBrowser"
+
];
+
mimeTypes = [
+
"text/html"
+
"text/xml"
+
"application/xhtml+xml"
+
"application/vnd.mozilla.xul+xml"
+
"x-scheme-handler/http"
+
"x-scheme-handler/https"
+
];
+
actions = {
+
new-window = {
+
name = "New Window";
+
exec = "glide-browser --new-window %U";
+
};
+
new-private-window = {
+
name = "New Private Window";
+
exec = "glide-browser --private-window %U";
+
};
+
profile-manager-window = {
+
name = "Profile Manager";
+
exec = "glide-browser --ProfileManager";
+
};
+
};
+
})
+
];
+
+
passthru.updateScript = nix-update-script {
+
extraArgs = [
+
"--url"
+
"https://github.com/glide-browser/glide"
+
];
+
};
+
+
meta = {
+
changelog = "https://glide-browser.app/changelog#${finalAttrs.version}";
+
description = "Extensible and keyboard-focused web browser, based on Firefox (binary package)";
+
homepage = "https://glide-browser.app/";
+
license = lib.licenses.mpl20;
+
sourceProvenance = [ lib.sourceTypes.binaryNativeCode ];
+
platforms = [ "x86_64-linux" ];
+
maintainers = with lib.maintainers; [ pyrox0 ];
+
mainProgram = "glide-browser";
+
};
+
})
+34
packages/jellyfin-exporter/package.nix
···
+
{
+
lib,
+
buildGoModule,
+
fetchFromGitHub,
+
...
+
}:
+
buildGoModule (finalAttrs: {
+
pname = "jellyfin-exporter";
+
version = "1.3.9";
+
+
src = fetchFromGitHub {
+
owner = "rebelcore";
+
repo = "jellyfin_exporter";
+
tag = "v${finalAttrs.version}";
+
hash = "sha256-oHPzdV+Fe7XmSyRWm5jh7oGqlY9uyLy7u9tCTlkfhQk=";
+
};
+
+
# We need to patch the tests since we don't move the binary to `$GOPATH/bin`, but to `$out/bin` instead.
+
postPatch = ''
+
substituteInPlace jellyfin_exporter_test.go \
+
--replace-fail "GOPATH" "out"
+
'';
+
+
vendorHash = "sha256-Z3XM4vTsm5R/Me1jR9oqLcWqmEn1bd653UNvDKLM80g=";
+
+
meta = {
+
changelog = "https://github.com/rebelcore/jellyfin_exporter/blob/v${finalAttrs.version}/CHANGELOG.md";
+
description = "Jellyfin Media System metrics exporter for prometheus";
+
homepage = "https://github.com/rebelcore/jellyfin_exporter";
+
license = lib.licenses.asl20;
+
maintainers = with lib.maintainers; [ pyrox0 ];
+
mainProgram = "jellyfin_exporter";
+
};
+
})
-45
packages/olympus/default.nix
···
-
{ pkgs }:
-
let
-
olympus = pkgs.stdenv.mkDerivation rec {
-
pname = "olympus";
-
version = "4238";
-
-
# https://everestapi.github.io/
-
src = pkgs.fetchzip {
-
url = "https://dev.azure.com/EverestAPI/Olympus/_apis/build/builds/${version}/artifacts?artifactName=linux.main&$format=zip#linux.main.zip";
-
hash = "sha256-KWDr4KsF23iDWA9h/r+cnpDIKKwCVVOfuh6sjvXSnII=";
-
};
-
-
buildInputs = [ pkgs.unzip ];
-
installPhase = ''
-
mkdir -p "$out/opt/olympus/"
-
mv dist.zip "$out/opt/olympus/" && cd "$out/opt/olympus/"
-
-
unzip dist.zip && rm dist.zip
-
mkdir $out && echo XDG_DATA_HOME=$out
-
-
echo y | XDG_DATA_HOME="$out/share/" bash install.sh
-
sed -i "/ldconfig/d" ./love
-
sed -i "s/Exec=.*/Exec=olympus %u/g" ../../share/applications/Olympus.desktop
-
'';
-
};
-
in
-
pkgs.buildFHSEnv {
-
name = "olympus";
-
runScript = "${olympus}/opt/olympus/olympus";
-
targetPkgs = pkgs: [
-
pkgs.freetype
-
pkgs.zlib
-
pkgs.SDL2
-
pkgs.curl
-
pkgs.libpulseaudio
-
pkgs.gtk3
-
pkgs.glib
-
pkgs.libGL
-
pkgs.libdrm
-
];
-
-
# https://github.com/EverestAPI/Olympus/blob/main/lib-linux/olympus.desktop
-
# https://stackoverflow.com/questions/8822097/how-to-replace-a-whole-line-with-sed
-
extraInstallCommands = ''cp -r "${olympus}/share/" $out'';
-
}
+19
packages/pingvin-share-config/package.nix
···
+
{
+
pkgs,
+
stdenv,
+
settings ? { },
+
...
+
}:
+
let
+
format = pkgs.formats.yaml { };
+
file = format.generate "config.yaml" settings;
+
in
+
stdenv.mkDerivation {
+
pname = "pingvin-share-config";
+
version = "1.0.0";
+
+
installPhase = ''
+
mkdir $out
+
cp ${file} $out/config.yaml
+
'';
+
}
+138
packages/planka/package.nix
···
+
{
+
lib,
+
stdenv,
+
fetchFromGitHub,
+
fetchNpmDeps,
+
nix-update-script,
+
npmHooks,
+
dart-sass,
+
nodejs,
+
python3,
+
}:
+
let
+
version = "2.0.0-rc.4";
+
src = fetchFromGitHub {
+
owner = "plankanban";
+
repo = "planka";
+
tag = "v${version}";
+
hash = "sha256-RUOIOXrpoNGxoKwUlgkPsk4kTnA95E+iwYIjBzSBoTA=";
+
};
+
meta = {
+
description = "Kanban-style project mastering tool for everyone";
+
homepage = "https://docs.planka.cloud/";
+
license = {
+
fullName = "Planka Community License";
+
url = "https://github.com/plankanban/planka/blob/master/LICENSE.md";
+
free = false;
+
redistributable = true;
+
};
+
maintainers = with lib.maintainers; [ pyrox0 ];
+
};
+
+
frontend = stdenv.mkDerivation (finalAttrs: {
+
pname = "planka-frontend";
+
inherit version src meta;
+
+
sourceRoot = "${finalAttrs.src.name}/client";
+
+
npmDeps = fetchNpmDeps {
+
inherit (finalAttrs) src sourceRoot;
+
hash = "sha256-XtVwO8253XBVtG0jrikeVr1yaS1PpphCbN5B6jz54qc=";
+
};
+
+
npmFlags = [
+
"--ignore-scripts"
+
];
+
+
nativeBuildInputs = [
+
npmHooks.npmConfigHook
+
nodejs
+
dart-sass
+
];
+
+
buildPhase = ''
+
runHook preBuild
+
+
npx patch-package
+
+
# Replace dart path in sass-embedded since node_modules doesn't have the native binary
+
substituteInPlace node_modules/sass-embedded/dist/lib/src/compiler-path.js \
+
--replace-fail 'compilerCommand = (() => {' 'compilerCommand = (() => { return ["${lib.getExe dart-sass}"];'
+
+
npm run build
+
+
runHook postBuild
+
'';
+
+
installPhase = ''
+
runHook preInstall
+
+
mkdir $out/
+
mv dist $out/dist
+
+
runHook postInstall
+
'';
+
});
+
+
serverPython = python3.withPackages (ps: [ ps.apprise ]);
+
in
+
stdenv.mkDerivation (finalAttrs: {
+
pname = "planka";
+
inherit version src;
+
+
sourceRoot = "${finalAttrs.src.name}/server";
+
+
npmDeps = fetchNpmDeps {
+
inherit (finalAttrs) src sourceRoot;
+
hash = "sha256-yW9uzPALGdPrrUV129ToXayLyeLbAK9mCl2emCPYUdc=";
+
};
+
+
npmFlags = [ "--ignore-scripts" ];
+
+
nativeBuildInputs = [
+
npmHooks.npmConfigHook
+
nodejs
+
];
+
+
buildInputs = [
+
serverPython
+
nodejs
+
];
+
+
preBuild = ''
+
# Patch notifs helper to use nixpkgs' python
+
substituteInPlace api/helpers/utils/send-notifications.js \
+
--replace-fail '(`$' '(`' \
+
--replace-fail "{sails.config.appPath}/.venv/bin/python3" "${lib.getExe serverPython}"
+
'';
+
+
buildPhase = ''
+
runHook preBuild
+
+
npx patch-package
+
+
runHook postBuild
+
'';
+
+
installPhase = ''
+
runHook preInstall
+
+
npm prune --omit=dev --no-save $npmFlags "$${npmFlagsArray[@]}"
+
find node_modules -maxdepth 1 -type d -empty -delete
+
+
mkdir -p $out/lib/node_modules/planka
+
mkdir $out/bin
+
mv * $out/lib/node_modules/planka
+
cp -t $out/lib/node_modules/planka/public -r ${frontend}/dist/*
+
cp ${frontend}/dist/index.html $out/lib/node_modules/planka/views/index.html
+
+
ln -s $out/lib/node_modules/planka/start.sh $out/bin/planka
+
+
runHook postInstall
+
'';
+
+
passthru.updateScript = nix-update-script { extraArgs = [ "--version=unstable" ]; };
+
meta = meta // {
+
mainProgram = "planka";
+
};
+
})
+26
packages.nix
···
+
{
+
perSystem =
+
{
+
pkgs,
+
lib,
+
...
+
}:
+
let
+
packages = lib.packagesFromDirectoryRecursive {
+
inherit (pkgs) callPackage;
+
directory = ./packages;
+
};
+
in
+
{
+
legacyPackages = packages;
+
packages = lib.filterAttrs (
+
_: pkg:
+
let
+
isDerivation = lib.isDerivation pkg;
+
availableOnHost = lib.meta.availableOn pkgs.stdenv.hostPlatform pkg;
+
isBroken = pkg.meta.broken or false;
+
in
+
isDerivation && !isBroken && availableOnHost
+
) packages;
+
};
+
}
-18
shells/default/default.nix
···
-
{
-
inputs,
-
pkgs,
-
system,
-
...
-
}:
-
pkgs.mkShellNoCC {
-
packages = [
-
pkgs.deadnix
-
pkgs.just
-
pkgs.nil
-
pkgs.nix-tree
-
pkgs.nixd
-
pkgs.nixfmt-rfc-style
-
pkgs.statix
-
inputs.deploy-rs.packages.${system}.default
-
];
-
}
-58
systems/x86_64-linux/marvin/bootloader.nix
···
-
{ pkgs, ... }:
-
let
-
fileSystems = {
-
btrfs = true;
-
ext4 = true;
-
vfat = true;
-
zfs = true;
-
};
-
in
-
{
-
boot = {
-
extraModulePackages = [ ];
-
kernelModules = [ "kvm-amd" ];
-
kernelPackages = pkgs.linuxPackages_6_1;
-
kernelParams = [ "nohibernate" ];
-
supportedFilesystems = fileSystems;
-
zfs.devNodes = "/dev/";
-
-
# Initrd config
-
initrd = {
-
availableKernelModules = [
-
"xhci_pci"
-
"ahci"
-
"nvme"
-
"usbhid"
-
"usb_storage"
-
"sd_mod"
-
];
-
supportedFilesystems = fileSystems;
-
kernelModules = [ ];
-
};
-
-
# Systemd-boot config
-
loader = {
-
systemd-boot.enable = true;
-
systemd-boot.configurationLimit = 5;
-
efi = {
-
canTouchEfiVariables = true;
-
efiSysMountPoint = "/boot/efi";
-
};
-
};
-
-
kernel.sysctl = {
-
"net.ipv4.ip_forward" = 1;
-
"net.ipv6.conf.all.forwarding" = 1;
-
};
-
-
# ZFS Config
-
# I use ZFS as my bulk data storage
-
# zfs = {
-
# enabled = true;
-
# };
-
};
-
# ZFS mount stuff
-
services.udev.extraRules = ''
-
ACTION=="add|change", KERNEL=="sd[a-z]*[0-9]*|mmcblk[0-9]*p[0-9]*|nvme[0-9]*n[0-9]*p[0-9]*", ENV{ID_FS_TYPE}=="zfs_member", ATTR{../queue/scheduler}="none"
-
'';
-
}
-74
systems/x86_64-linux/marvin/default.nix
···
-
{ system, ... }:
-
{
-
imports = [
-
# Machine-specific configurations.
-
./bootloader.nix
-
./firewall.nix
-
./networking.nix
-
./hardware.nix
-
-
# Running Services
-
./services/authentik.nix
-
./services/avahi.nix
-
./services/bots.nix
-
./services/deemix.nix
-
./services/git.nix
-
./services/golink.nix
-
./services/grafana.nix
-
./services/iceshrimp.nix
-
./services/jellyfin.nix
-
./services/matrix.nix
-
./services/miniflux.nix
-
./services/nginx.nix
-
./services/nextcloud
-
./services/planka.nix
-
./services/podman.nix
-
./services/postgres.nix
-
./services/prometheus.nix
-
# ./services/redlib.nix
-
./services/syncthing.nix
-
./services/tailscale.nix
-
./services/vaultwarden.nix
-
./services/zfs.nix
-
];
-
nix.settings.max-jobs = 12;
-
nixpkgs.hostPlatform.system = system;
-
networking = {
-
networkmanager = {
-
enable = true;
-
};
-
wireless = {
-
enable = false;
-
};
-
};
-
fileSystems = {
-
"/" = {
-
fsType = "btrfs";
-
device = "/dev/disk/by-uuid/f15e4072-80dc-414e-a1fc-158ea441aebd";
-
# options = [ "subvol=@" ];
-
};
-
"/boot/efi" = {
-
fsType = "vfat";
-
device = "/dev/disk/by-uuid/EE05-66B4";
-
};
-
"/var" = {
-
fsType = "zfs";
-
device = "tank/var";
-
options = [ "zfsutil" ];
-
};
-
"/var/log/journal" = {
-
fsType = "zfs";
-
device = "tank/var/log/journal";
-
options = [ "zfsutil" ];
-
};
-
};
-
swapDevices = [ { device = "/dev/disk/by-uuid/e69409bc-9cf0-4795-8620-33a021a4b729"; } ];
-
users.groups.misc.gid = 1000;
-
py = {
-
users.default.enable = true;
-
programs = {
-
fish.enable = true;
-
neovim.enable = true;
-
};
-
};
-
}
-18
systems/x86_64-linux/marvin/firewall.nix
···
-
{
-
networking.firewall = {
-
allowedTCPPorts = [
-
80
-
443
-
6912
-
34197
-
];
-
allowedUDPPorts = [
-
4367
-
34197
-
];
-
trustedInterfaces = [
-
"tailscale0"
-
"wg0"
-
];
-
};
-
}
-13
systems/x86_64-linux/marvin/hardware.nix
···
-
{
-
hardware = {
-
enableAllFirmware = true;
-
enableRedistributableFirmware = true;
-
bluetooth.enable = false;
-
bumblebee.enable = false;
-
ckb-next.enable = false;
-
cpu.amd.updateMicrocode = true;
-
gpgSmartcards.enable = true;
-
graphics.enable = false;
-
pulseaudio.enable = false;
-
};
-
}
-35
systems/x86_64-linux/marvin/networking.nix
···
-
{ lib, pkgs, ... }:
-
{
-
networking = {
-
hostName = "marvin";
-
hostId = "5711215d";
-
enableIPv6 = true;
-
useDHCP = lib.mkDefault true;
-
interfaces = {
-
enp42s0.useDHCP = lib.mkDefault true;
-
wlp41s0.useDHCP = lib.mkDefault true;
-
};
-
networkmanager = {
-
enable = true;
-
};
-
wireless.enable = false;
-
-
# Enable NAT for containers
-
nat = {
-
enable = true;
-
internalInterfaces = [ "ve-+" ];
-
externalInterface = "wlp41s0";
-
# Lazy IPv6 connectivity for the container
-
enableIPv6 = true;
-
};
-
};
-
systemd.services.wpa_supplicant.environment.OPENSSL_CONF = pkgs.writeText "openssl.cnf" ''
-
openssl_conf = openssl_init
-
[openssl_init]
-
ssl_conf = ssl_sect
-
[ssl_sect]
-
system_default = system_default_sect
-
[system_default_sect]
-
Options = UnsafeLegacyRenegotiation
-
'';
-
}
-88
systems/x86_64-linux/marvin/services/authentik.nix
···
-
{ config, lib, ... }:
-
let
-
d = lib.py.data.services.authentik;
-
in
-
{
-
virtualisation.oci-containers.containers =
-
let
-
authentikVersion = "2024.10";
-
base = {
-
environmentFiles = [ config.age.secrets.authentik-env.path ];
-
extraOptions = [ "--network=authentik" ];
-
};
-
authentikBase = base // {
-
image = "ghcr.io/goauthentik/server:${authentikVersion}";
-
environment = {
-
AUTHENTIK_REDIS__HOST = "authentik-redict";
-
-
# Postgres Settings
-
AUTHENTIK_POSTGRESQL__HOST = "authentik-db";
-
AUTHENTIK_POSTGRESQL__PORT = "5432";
-
AUTHENTIK_POSTGRESQL__USER = "authentik";
-
AUTHENTIK_POSTGRESQL__NAME = "authentik";
-
AUTHENTIK_POSTGRESQL__PASSWORD = "\${PG_PASS}";
-
-
# Disable error reporting
-
AUTHENTIK_ERROR_REPORTING__ENABLED = "false";
-
-
# Avatars are an attribute based on an uploaded file
-
AUTHENTIK_AVATARS = "attributes.user.avatar";
-
-
# Email Settings
-
AUTHENTIK_EMAIL__HOST = "mail.pyrox.dev";
-
AUTHENTIK_EMAIL__USERNAME = "auth@pyrox.dev";
-
AUTHENTIK_EMAIL__PORT = "465";
-
AUTHENTIK_EMAIL__USE_TLS = "true";
-
AUTHENTIK_EMAIL__FROM = "PyroServ Auth <auth@pyrox.dev>";
-
};
-
};
-
authentikVols = [
-
"/var/lib/authentik/media:/media"
-
"/var/lib/authentik/templates:/templates"
-
];
-
in
-
{
-
authentik-db = base // {
-
image = "postgres:12-alpine";
-
volumes = [ "/var/lib/authentik/db_12:/var/lib/postgresql/data" ];
-
environment = {
-
POSTGRES_PASSWORD = "\${PG_PASS}";
-
POSTGRES_USER = "authentik";
-
POSTGRES_DB = "authentik";
-
};
-
};
-
authentik-redict = {
-
image = "registry.redict.io/redict:alpine";
-
extraOptions = [ "--network=authentik" ];
-
};
-
authentik-server = authentikBase // {
-
cmd = [ "server" ];
-
ports = [
-
"${toString d.port}:9000"
-
"6943:9443"
-
"9301:9300"
-
];
-
volumes = authentikVols ++ [ "/var/lib/authentik/custom.css:/web/dist/custom.css" ];
-
};
-
authentik-worker = authentikBase // {
-
cmd = [ "worker" ];
-
volumes = authentikVols ++ [ "/var/lib/authentik/certs:/certs" ];
-
};
-
authentik-ldap = base // {
-
image = "ghcr.io/goauthentik/ldap:${authentikVersion}";
-
ports = [
-
"389:3389"
-
"636:6636"
-
];
-
environment = {
-
AUTHENTIK_HOST = "https://${d.extUrl}";
-
AUTHENTIK_INSECURE = "false";
-
};
-
};
-
};
-
age.secrets.authentik-env = {
-
file = ./secrets/authentik-env.age;
-
owner = "thehedgehog";
-
group = "misc";
-
};
-
}
-10
systems/x86_64-linux/marvin/services/avahi.nix
···
-
{
-
services.avahi = {
-
enable = true;
-
publish = {
-
enable = true;
-
addresses = true;
-
workstation = true;
-
};
-
};
-
}
-5
systems/x86_64-linux/marvin/services/bookstack.nix
···
-
{
-
services.bookstack = {
-
enable = true;
-
};
-
}
-46
systems/x86_64-linux/marvin/services/bots.nix
···
-
{ pkgs, ... }:
-
{
-
systemd.services = {
-
io-bot = {
-
enable = false;
-
wantedBy = [ "multi-user.target" ];
-
after = [
-
"network.target"
-
"io-bot-lavalink.service"
-
];
-
description = "I/O, my personal bot";
-
path = [ pkgs.python311 ];
-
serviceConfig = {
-
ExecStart = "${pkgs.bash}/bin/bash start.sh";
-
Restart = "always";
-
RestartSec = 3;
-
WorkingDirectory = "/home/thehedgehog/io-py";
-
};
-
};
-
io-bot-lavalink = {
-
enable = false;
-
wantedBy = [ "multi-user.target" ];
-
after = [ "network.target" ];
-
description = "Lavalink server for I/O";
-
serviceConfig = {
-
ExecStart = "${pkgs.openjdk17_headless}/bin/java -jar ../Lavalink.jar";
-
Restart = "always";
-
RestartSec = 3;
-
WorkingDirectory = "/home/thehedgehog/io-py/config";
-
};
-
};
-
misc-bot = {
-
enable = false;
-
wantedBy = [ "multi-user.target" ];
-
after = [ "network.target" ];
-
description = "Random Bot 1";
-
path = [ pkgs.python311 ];
-
serviceConfig = {
-
ExecStart = "${pkgs.bash}/bin/bash start.sh";
-
Restart = "always";
-
RestartSec = 3;
-
WorkingDirectory = "/home/thehedgehog/bots/bot1";
-
};
-
};
-
};
-
}
-53
systems/x86_64-linux/marvin/services/buildbot.nix
···
-
{ config, lib, ... }:
-
let
-
as = config.age.secrets;
-
d = lib.py.data.services.buildbot;
-
g = lib.py.data.services.git;
-
bbSecret = {
-
owner = "buildbot";
-
group = "buildbot";
-
};
-
in
-
{
-
services = {
-
buildbot-nix.master = {
-
enable = true;
-
dbUrl = "postgresql://buildbot@localhost/buildbot";
-
workersFile = as.buildbot-workers.path;
-
authBackend = "gitea";
-
gitea = {
-
enable = true;
-
tokenFile = as.buildbot-gitea-token.path;
-
oauthSecretFile = as.buildbot-oauth-secret.path;
-
instanceUrl = g.extUrl;
-
oauthId = "2bfd5c46-43a7-4d98-b443-9176dc0a9452";
-
topic = "buildbot-enable";
-
};
-
admins = [ "pyrox" ];
-
domain = d.extUrl;
-
useHttps = true;
-
};
-
postgresql = {
-
ensureUsers = [
-
{
-
name = "buildbot";
-
ensureDBOwnership = true;
-
ensureClauses.login = true;
-
}
-
];
-
ensureDatabases = [ "buildbot" ];
-
};
-
buildbot-master.port = 6915;
-
};
-
age.secrets = {
-
buildbot-gitea-token = bbSecret // {
-
file = ./secrets/buildbot-gitea-token.age;
-
};
-
buildbot-oauth-secret = bbSecret // {
-
file = ./secrets/buildbot-oauth-secret.age;
-
};
-
buildbot-workers = bbSecret // {
-
file = ./secrets/buildbot-workers.age;
-
};
-
};
-
}
-21
systems/x86_64-linux/marvin/services/deemix.nix
···
-
{ data, lib, ... }:
-
let
-
d = lib.py.data.services.deemix;
-
in
-
{
-
virtualisation.oci-containers.containers.deemix = {
-
image = "registry.gitlab.com/bockiii/deemix-docker";
-
volumes = [
-
"/var/lib/deemix:/config"
-
"/var/lib/music:/downloads"
-
];
-
ports = [ "${toString d.port}:6595" ];
-
environment = {
-
PUID = "1000";
-
PGID = "1000";
-
UMASK_SET = "022";
-
DEEMIX_SINGLE_USER = "true";
-
DISABLE_OWNERSHIP_CHECK = "true";
-
};
-
};
-
}
-149
systems/x86_64-linux/marvin/services/git.nix
···
-
{
-
config,
-
lib,
-
pkgs,
-
...
-
}:
-
let
-
cfg = config.services.forgejo.settings;
-
age = config.age.secrets;
-
-
forgejoSecret = {
-
owner = "forgejo";
-
group = "forgejo";
-
};
-
-
d = lib.py.data.services.git;
-
in
-
{
-
catppuccin.forgejo.enable = true;
-
py.services.forgejo-runner = {
-
enable = true;
-
tokenFile = age.forgejo-default-runner-token.path;
-
};
-
services.forgejo = {
-
enable = true;
-
package = pkgs.forgejo;
-
lfs.enable = true;
-
database = {
-
type = "postgres";
-
createDatabase = true;
-
passwordFile = age.forgejo-db-pw.path;
-
};
-
secrets = {
-
mailer.PASSWD = age.forgejo-mail-pw.path;
-
security.SECRET_KEY = lib.mkForce age.forgejo-secret-key.path;
-
security.INTERNAL_TOKEN = lib.mkForce age.forgejo-internal-token.path;
-
oauth2.JWT_SECRET = lib.mkForce age.forgejo-oauth2-jwt-secret.path;
-
server.LFS_JWT_SECRET = lib.mkForce age.forgejo-lfs-jwt-secret.path;
-
};
-
settings = {
-
DEFAULT = {
-
APP_NAME = "PyroNet Git";
-
RUN_MODE = "prod";
-
};
-
attachment = {
-
MAX_SIZE = 200;
-
};
-
log."logger.router.MODE" = "";
-
mailer = {
-
ENABLED = true;
-
FROM = "PyroNet Git <git@pyrox.dev>";
-
PROTOCOL = "smtps";
-
SMTP_ADDR = "mail.pyrox.dev";
-
SMTP_PORT = 465;
-
USER = "git@pyrox.dev";
-
};
-
picture = {
-
ENABLE_FEDERATED_AVATAR = true;
-
};
-
ui = {
-
DEFAULT_SHOW_FULL_NAME = true;
-
USE_SERVICE_WORKER = true;
-
SHOW_USER_EMAIL = false;
-
};
-
"ui.meta" = {
-
AUTHOR = "dish";
-
DESCRIPTION = "PyroNet Git Services";
-
};
-
metrics = {
-
ENABLED = true;
-
};
-
server = {
-
DISABLE_SSH = true;
-
DOMAIN = d.extUrl;
-
HTTP_PORT = d.port;
-
ROOT_URL = "https://${cfg.server.DOMAIN}";
-
LFS_START_SERVER = true;
-
};
-
#
-
indexer = {
-
# Enable issue indexing
-
ISSUE_INDEXER_TYPE = "bleve";
-
ISSUE_INDEXER_PATH = "indexers/issues.bleve";
-
# Enable repo indexing
-
REPO_INDEXER_ENABLED = true;
-
REPO_INDEXER_REPO_TYPES = "sources,forks,templates,mirrors";
-
REPO_INDEXER_TYPE = "bleve";
-
REPO_INDEXER_PATH = "indexers/repos.bleve";
-
};
-
session = {
-
PROVIDER = "db";
-
COOKIE_SECURE = true;
-
COOKIE_NAME = "pyrogit-session";
-
DOMAIN = d.extUrl;
-
# Sessions last for 1 week
-
GC_INTERVAL_TIME = 86400 * 7;
-
SESSION_LIFE_TIME = 86400 * 7;
-
};
-
service = {
-
DISABLE_REGISTRATION = true;
-
AUTO_WATCH_NEW_REPOS = false;
-
};
-
security = {
-
INSTALL_LOCK = true;
-
COOKIE_USERNAME = "pyrogit-user";
-
COOKIE_REMEMBER_NAME = "pyrogit-auth";
-
MIN_PASSWORD_LENGTH = 10;
-
PASSWORD_COMPLEXITY = "lower,upper,digit,spec";
-
PASSWORD_HASH_ALGO = "argon2";
-
PASSWORD_CHECK_PWN = true;
-
ONLY_ALLOW_PUSH_IF_GITEA_ENVIRONMENT_SET = true;
-
# Only allow reverse proxies from Tailscale tailnet
-
REVERSE_PROXY_TRUSTED_PROXIES = "10.64.0.0/10";
-
};
-
actions = {
-
ENABLED = true;
-
};
-
};
-
};
-
age.secrets = {
-
forgejo-db-pw = forgejoSecret // {
-
file = ./secrets/forgejo-db-pw.age;
-
};
-
forgejo-mail-pw = forgejoSecret // {
-
file = ./secrets/forgejo-mail-pw.age;
-
};
-
forgejo-aux-docs-runner-token = forgejoSecret // {
-
file = ./secrets/forgejo-aux-docs-runner-token.age;
-
};
-
forgejo-default-runner-token = forgejoSecret // {
-
file = ./secrets/forgejo-default-runner-token.age;
-
};
-
forgejo-gitgay-runner-token = forgejoSecret // {
-
file = ./secrets/forgejo-gitgay-runner-token.age;
-
};
-
forgejo-internal-token = forgejoSecret // {
-
file = ./secrets/forgejo-internal-token.age;
-
};
-
forgejo-oauth2-jwt-secret = forgejoSecret // {
-
file = ./secrets/forgejo-oauth2-jwt-secret.age;
-
};
-
forgejo-lfs-jwt-secret = forgejoSecret // {
-
file = ./secrets/forgejo-lfs-jwt-secret.age;
-
};
-
forgejo-secret-key = forgejoSecret // {
-
file = ./secrets/forgejo-secret-key.age;
-
};
-
};
-
}
-12
systems/x86_64-linux/marvin/services/golink.nix
···
-
{
-
services.golink = {
-
enable = true;
-
tailscaleAuthKeyFile = /run/agenix/golink-authkey;
-
};
-
age.secrets.golink-authkey = {
-
file = ./secrets/golink-authkey.age;
-
path = "/run/agenix/golink-authkey";
-
owner = "golink";
-
group = "golink";
-
};
-
}
-57
systems/x86_64-linux/marvin/services/grafana.nix
···
-
{ config, lib, ... }:
-
let
-
d = lib.py.data.services.grafana;
-
a = lib.py.data.services.authentik;
-
in
-
{
-
services.grafana = {
-
enable = true;
-
settings = {
-
analytics.reporting_enable = false;
-
"auth.generic_oauth" = {
-
name = "central";
-
icon = "signin";
-
enabled = "true";
-
client_id = "89f4607cf446a777a6b25ebde8731cdcb80b04c1";
-
client_secret = "89eccaa8a31104c218df5cfe37c87f0ea0bbddcd1571bddb7f7fbf5a09045efd59c61f1caaa79483ad59aac2c19488b254acdaced47e66a6505865a14a63ac4a";
-
auth_url = "https://${a.extUrl}/application/o/authorize/";
-
token_url = "https://${a.extUrl}/application/o/token/";
-
api_url = "https://${a.extUrl}/application/o/userinfo/";
-
scopes = "openid profile email";
-
};
-
"auth" = {
-
signout_redirect_url = "https://${a.extUrl}/if/session-end/stathog/";
-
disableLoginForm = true;
-
};
-
security = {
-
admin_user = "pyrox";
-
admin_password = "$__file{${config.age.secrets.grafana-admin.path}}";
-
};
-
server = {
-
root_url = "https://${d.extUrl}";
-
domain = d.extUrl;
-
http_port = d.port;
-
http_addr = "0.0.0.0";
-
};
-
smtp = {
-
enabled = true;
-
user = "grafana@thehedgehog.me";
-
from_address = "grafana@thehedgehog.me";
-
host = "smtp.migadu.com:465";
-
password = "$__file{${config.age.secrets.grafana-smtp-password.path}}";
-
};
-
};
-
};
-
age.secrets = {
-
grafana-admin = {
-
file = ./secrets/grafana-admin-password.age;
-
owner = "grafana";
-
group = "grafana";
-
};
-
grafana-smtp-password = {
-
file = ./secrets/grafana-smtp-password.age;
-
owner = "grafana";
-
group = "grafana";
-
};
-
};
-
}
-96
systems/x86_64-linux/marvin/services/iceshrimp.nix
···
-
{
-
config,
-
inputs,
-
pkgs,
-
lib,
-
...
-
}:
-
let
-
-
d = lib.py.data.services.iceshrimp;
-
-
package = inputs.iceshrimp.packages.x86_64-linux.iceshrimp-pre.overrideAttrs rec {
-
version = "2023.12.8-pyrox1";
-
src = pkgs.fetchgit {
-
url = "https://iceshrimp.dev/pyrox/iceshrimp";
-
hash = "sha256-hxZ3rVVAiAMFAYhZ2o+WhlMuhjbt5EyHKOl1VyyL5RA=";
-
rev = "v${version}";
-
fetchLFS = true;
-
deepClone = false;
-
};
-
patches = [ ];
-
};
-
in
-
{
-
services.iceshrimp = {
-
inherit package;
-
enable = true;
-
secretConfig = config.age.secrets.iceshrimp-secret-config.path;
-
dbPasswordFile = config.age.secrets.iceshrimp-db-password.path;
-
createDb = true;
-
configureNginx.enable = false;
-
settings = {
-
inherit (d) port;
-
url = "https://${d.extUrl}";
-
accountDomain = "pyrox.dev";
-
redis.port = 6997;
-
maxNoteLength = 16384;
-
maxCaptionLength = 8192;
-
clusterLimit = 4;
-
deliverJobConcurrency = 192;
-
inboxJobConcurrency = 32;
-
deliverJobPerSec = 256;
-
inboxJobPerSec = 32;
-
outgoingAddressFamily = "dual";
-
# See the withdrawal patches for obliterate info
-
enableObliterate = true;
-
obliterateJobPerSec = 16;
-
obliterateJobMaxAttempts = 3;
-
mediaCleanup = {
-
cron = true;
-
maxAgeDays = 30;
-
cleanAvatars = true;
-
cleanHeaders = true;
-
};
-
htmlCache = {
-
ttl = "6h";
-
prewarm = true;
-
dbFallback = true;
-
};
-
wordMuteCache.ttl = "24h";
-
isManagedHosting = true;
-
email = {
-
managed = true;
-
address = "social@pyrox.dev";
-
host = "mail.pyrox.dev";
-
port = 465;
-
user = "social@pyrox.dev";
-
useImplicitSslTls = true;
-
};
-
objectStorage = {
-
managed = true;
-
baseUrl = "https://pool.jortage.com/socialpyroxdev";
-
bucket = "socialpyroxdev";
-
prefix = "mkmedia";
-
endpoint = "pool-api.jortage.com";
-
region = "jort";
-
useSsl = true;
-
connnectOverProxy = false;
-
setPublicReadOnUpload = false;
-
s3ForcePathStyle = true;
-
};
-
};
-
};
-
age.secrets = {
-
iceshrimp-secret-config = {
-
inherit (config.services.iceshrimp) group;
-
file = ./secrets/iceshrimp-secret-config.age;
-
owner = config.services.iceshrimp.user;
-
};
-
iceshrimp-db-password = {
-
file = ./secrets/iceshrimp-db-password.age;
-
owner = "postgres";
-
group = "postgres";
-
};
-
};
-
}
-9
systems/x86_64-linux/marvin/services/jellyfin.nix
···
-
{
-
services.jellyfin = {
-
enable = true;
-
};
-
networking.firewall.allowedUDPPorts = [
-
1900
-
7359
-
];
-
}
-29
systems/x86_64-linux/marvin/services/matrix.nix
···
-
{
-
lib,
-
...
-
}:
-
let
-
d = lib.py.data.services.matrix-server;
-
in
-
{
-
services.matrix-conduit = {
-
enable = true;
-
-
settings.global = {
-
inherit (d) port;
-
server_name = "pyrox.dev";
-
max_request_size = 1024 * 1024 * 50;
-
allow_registration = false;
-
allow_federation = true;
-
allow_check_for_updates = false;
-
trusted_servers = [
-
"matrix.org"
-
"vector.im"
-
"catgirl.cloud"
-
];
-
address = "0.0.0.0";
-
well_known_client = "https://${d.extUrl}";
-
well_known_server = "${d.extUrl}:443";
-
};
-
};
-
}
-26
systems/x86_64-linux/marvin/services/miniflux.nix
···
-
{config, lib, ...}: let
-
d = lib.py.data.services.miniflux;
-
in {
-
services.miniflux = {
-
enable = true;
-
config = {
-
PORT = d.port;
-
FETCH_YOUTUBE_WATCH_TIME = 1;
-
BASE_URL = "https://${d.extUrl}";
-
CREATE_ADMIN = 1;
-
WEBAUTHN = 1;
-
WORKER_POOL_SIZE = 5;
-
};
-
adminCredentialsFile = config.age.secrets.miniflux-admin.path;
-
};
-
users.users.miniflux.isSystemUser = true;
-
users.users.miniflux.group = "miniflux";
-
users.groups.miniflux = {};
-
age.secrets = {
-
miniflux-admin = {
-
file = ./secrets/miniflux-admin.age;
-
owner = "miniflux";
-
group = "miniflux";
-
};
-
};
-
}
-11
systems/x86_64-linux/marvin/services/minio.nix
···
-
{ config, ... }:
-
{
-
services.minio = {
-
enable = true;
-
region = "us-east-1";
-
browser = true;
-
listenAddress = ":6990";
-
consoleAddress = ":6991";
-
rootCredentialsFile = config.age.secrets.minio-root.path;
-
};
-
}
-104
systems/x86_64-linux/marvin/services/nextcloud/default.nix
···
-
{
-
config,
-
pkgs,
-
lib,
-
...
-
}:
-
let
-
d = lib.py.data.services.nextcloud;
-
i = lib.py.data.services.nextcloud-imaginary;
-
in
-
{
-
imports = [
-
./office.nix
-
./imaginary.nix
-
];
-
services.nextcloud = {
-
enable = true;
-
package = pkgs.nextcloud30;
-
phpPackage = lib.mkForce pkgs.php82;
-
appstoreEnable = true;
-
caching.redis = true;
-
# Enable Webfinger
-
webfinger = true;
-
# Any additional PHP Extensions we need
-
phpExtraExtensions = all: [
-
all.pdlib
-
all.bz2
-
];
-
config = {
-
adminpassFile = config.age.secrets.nextcloud-admin-pw.path;
-
adminuser = "pyrox";
-
dbtype = "pgsql";
-
};
-
settings = {
-
default_phone_region = "US";
-
overwriteprotocol = "https";
-
trusted_proxies = [ "100.64.0.0/10" ];
-
# Preview Settings
-
"preview_imaginary_url" = "http://localhost:${builtins.toString i.port}";
-
"preview_format" = "webp";
-
"preview_ffmpeg_path" = "${pkgs.ffmpeg-headless}/bin/ffmpeg";
-
"enabledPreviewProviders" = [
-
"OC\\Preview\\Font"
-
"OC\\Preview\\Krita"
-
"OC\\Preview\\MP3"
-
"OC\\Preview\\MarkDown"
-
"OC\\Preview\\MSOfficeDoc"
-
"OC\\Preview\\OpenDocument"
-
"OC\\Preview\\TXT"
-
"OC\\Preview\\Imaginary"
-
];
-
# Memories Configuration
-
"memories.exiftool" = "${pkgs.exiftool}/bin/exiftool";
-
"memories.exiftool_no_local" = true;
-
# # Index Everything
-
"memories.index.mode" = 1;
-
# # GIS Data in Postgres
-
"memories.gis_type" = 2;
-
# # Transcoding
-
"memories.vod.disable" = false;
-
"memories.vod.vaapi" = true;
-
"memories.vod.nvenc" = false;
-
"memories.vod.use_gop_size" = false; # NVENV-only
-
"memories.vod.ffmpeg" = "${pkgs.ffmpeg-headless}/bin/ffmpeg";
-
"memories.vod.ffprobe" = "${pkgs.ffmpeg-headless}/bin/ffprobe";
-
"memories.vod.path" = "/var/lib/nextcloud/store-apps/memories/bin-ext/go-vod-amd64";
-
"memories.vod.external" = false;
-
-
# Recognize Options
-
"node_binary" = "${pkgs.nodejs_20}/bin/node";
-
"tensorflow.cores" = 6;
-
"tensorflow.gpu" = false;
-
"musicnn.enabled" = false;
-
"movinet.enabled" = false;
-
"faces.enable" = true;
-
"imagenet.enabled" = true;
-
"landmarks.enabled" = true;
-
};
-
phpOptions = {
-
"opcache.interned_strings_buffer" = "32";
-
"opcache.jit" = "1255";
-
"opcache.jit_buffer_size" = "256M";
-
"opcache.save_comments" = "1";
-
"opcache.validate_timestamps" = "0";
-
};
-
poolSettings = {
-
"pm" = "dynamic";
-
"pm.max_children" = 43;
-
"pm.start_servers" = 10;
-
"pm.min_spare_servers" = 10;
-
"pm.max_spare_servers" = 32;
-
"pm.max_requests" = 500;
-
};
-
configureRedis = true;
-
database.createLocally = true;
-
hostName = d.extUrl;
-
nginx.recommendedHttpHeaders = true;
-
};
-
age.secrets.nextcloud-admin-pw = {
-
file = ./nextcloud-admin-pw.age;
-
owner = "nextcloud";
-
group = "nextcloud";
-
};
-
}
-13
systems/x86_64-linux/marvin/services/nextcloud/imaginary.nix
···
-
{ lib, ... }:
-
let
-
d = lib.py.data.services.nextcloud-imaginary;
-
in
-
{
-
services.imaginary = {
-
inherit (d) port;
-
enable = true;
-
address = "localhost";
-
settings.return-size = true;
-
settings.disable-endpoints = "form";
-
};
-
}
-21
systems/x86_64-linux/marvin/services/nextcloud/nextcloud-admin-pw.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA f3m5ux9oJxmPDheJ82b171yuc+2/YfPklKOi9+TRqAk
-
QlVi9vN0mFBwa4lGeWgHhy7xeGmzv87lHy1teE4Ju38
-
-> ssh-rsa fFaiTA
-
OE+aFl2tmjMJOOtfhoVGOnWmF64OqGQ21FuhcCaDz+K05lmO4F+6q0dblr/8gOD/
-
aUX7qKNS6/ylBn1sjdWs6LKEFSfQQmPD26MDAFciDRMR5GCylKQzVN+ZVFjS36tr
-
tWl1wiuGlK25szMdPMTfH2mUd2RpyceGirTFXbDppBQvlboivVV51FVgHQJUmell
-
ak4dXDNvlSX/Q2VfIrfr6LurJrPPpJ8phgD/yqvwoEr1DhbrtdBJWHLnP7GlAi9D
-
WexmhyWALCbfJjpPTKBumGmFFzCf5FvEhw4WW3wSkK+RwoyPDq+f5JyM0mEUNgjM
-
tI5cbyaZ+FuoZgwouSLPU1zSaE5DCucRrWoMLw/F/1rXZl6aXmiX+sJYhwTOnfvS
-
UxEs+7i+E/+yPP0otfoEeU7fSUQgkVcfDwwCF95vvSoX2ZeocU3IaosovmQNHiQk
-
VNR2z8WZx7y5bBxxxMuA9sKwhDbqpS+O7Yr34PSO2aZMvctfJZMFHOGO3LWtCMOo
-
/EtZSwtTL1P3z7ZVr9SpBOT1Cp5f6JhM8fRwcv/+cssWrv031LDpX7R2lUXd0E9/
-
b8ZI6NotJfXicqf1qS91GYttz9FpXKSTx+wc28eEQNoHdE9vJydYd8p/FfsPNnbo
-
E7kEz0KgTTIC0lfRN5/CKHJ3urAN47UCzBkht/gArHM
-
-> ssh-ed25519 wpmdHA miwIKKntwHzAVfbSs0wQyxEuiPGS4OPisTtLkasNaHE
-
psG8Q1MCrd2cuHNFhBoJlHTUA8Rk2alsRahoaTaZ96I
-
-> f-grease Q=!6H\ CBdSy[)u
-
sOGvXIX7dyTl5tFUlDOfuXyR5KrAFTehzsMhjUiqFD/N
-
--- 6GHjrSO/f/nkqePu2iFESH76n7G1KPN6F+xp6ChHPec
-
��!��c�8i^����lκ�l>�E|o�q��T�[9��V�I�J^}�� � O{:5�> ��Sb����J�p�
-22
systems/x86_64-linux/marvin/services/nextcloud/office.nix
···
-
{ lib, ... }:
-
let
-
d = lib.py.data.services.nextcloud-office;
-
in
-
{
-
services.collabora-online = {
-
enable = true;
-
port = d.port;
-
settings = {
-
ssl.enable = false;
-
ssl.termination = true;
-
};
-
aliasGroups = [
-
{
-
host = "https://office.pyrox.dev:443";
-
}
-
{
-
host = "https://cloud.pyrox.dev:443";
-
}
-
];
-
};
-
}
-18
systems/x86_64-linux/marvin/services/nginx.nix
···
-
{ lib, ... }:
-
let
-
n = lib.py.data.services.nextcloud;
-
in
-
{
-
services.nginx = {
-
virtualHosts = {
-
"${n.extUrl}" = {
-
listen = [
-
{
-
inherit (n) port;
-
addr = "0.0.0.0";
-
}
-
];
-
};
-
};
-
};
-
}
-42
systems/x86_64-linux/marvin/services/planka.nix
···
-
{ config, lib, ... }:
-
let
-
dataDir = "/var/lib/planka";
-
d = lib.py.data.services.planka;
-
in
-
{
-
virtualisation.oci-containers.containers = {
-
planka-server = {
-
image = "ghcr.io/plankanban/planka:latest";
-
ports = [ "${toString d.port}:1337" ];
-
environment = {
-
BASE_URL = "https://${d.extUrl}";
-
DATABASE_URL = "postgresql://planka@planka-db/planka";
-
# Default Admin
-
DEFAULT_ADMIN_EMAIL = "pyrox@pyrox.dev";
-
DEFAULT_ADMIN_USERNAME = "pyrox";
-
};
-
environmentFiles = [ config.age.secrets.planka-env.path ];
-
volumes = [
-
"${dataDir}/user-avatars:/app/public/user-avatars"
-
"${dataDir}/project-background-images:/app/public/project-background-images"
-
"${dataDir}/attachments:/app/private/attachments"
-
];
-
extraOptions = [ "--network=planka" ];
-
};
-
planka-db = {
-
image = "postgres:16-alpine";
-
volumes = [ "${dataDir}/db:/var/lib/postgresql/data" ];
-
environment = {
-
POSTGRES_USER = "planka";
-
POSTGRES_DB = "planka";
-
POSTGRES_HOST_AUTH_METHOD = "trust";
-
};
-
extraOptions = [ "--network=planka" ];
-
};
-
};
-
age.secrets.planka-env = {
-
file = ./secrets/planka-env.age;
-
owner = "thehedgehog";
-
group = "misc";
-
};
-
}
-16
systems/x86_64-linux/marvin/services/podman.nix
···
-
{
-
virtualisation = {
-
oci-containers.backend = "docker";
-
docker = {
-
enable = true;
-
storageDriver = "zfs";
-
autoPrune.enable = true;
-
liveRestore = true;
-
daemon.settings = {
-
experimental = true;
-
ip6tables = true;
-
fixed-cidr-v6 = "2001:db8:1::/64";
-
};
-
};
-
};
-
}
-50
systems/x86_64-linux/marvin/services/postgres.nix
···
-
{ pkgs, config, ... }:
-
let
-
cfg = config.services.postgresql;
-
in
-
{
-
services.postgresql = {
-
enable = true;
-
package = pkgs.postgresql_16;
-
enableJIT = true;
-
# Settings taken from [PGTune](https://pgtune.leopard.in.ua/)
-
settings = {
-
max_connections = "300";
-
shared_buffers = "2GB";
-
effective_cache_size = "6GB";
-
maintenance_work_mem = "512MB";
-
checkpoint_completion_target = 0.9;
-
wal_buffers = "16MB";
-
default_statistics_target = 100;
-
random_page_cost = 4;
-
effective_io_concurrency = 2;
-
work_mem = "2621kB";
-
huge_pages = "off";
-
min_wal_size = "1GB";
-
max_wal_size = "4GB";
-
max_worker_processes = 8;
-
max_parallel_workers_per_gather = 4;
-
max_parallel_workers = 8;
-
max_parallel_maintenance_workers = 4;
-
};
-
};
-
systemd.timers.pg-autovacuum = {
-
description = "Timer for Postgres Autovacuum";
-
timerConfig = {
-
OnCalendar = "*-*-* 01:00:00";
-
Unit = "pg-autovacuum.service";
-
};
-
};
-
systemd.services.pg-autovacuum = {
-
description = "Vacuum all Postgres databases.";
-
requisite = [ "postgresql.service" ];
-
wantedBy = [ "multi-user.target" ];
-
serviceConfig = {
-
Type = "oneshot";
-
User = "postgres";
-
Group = "postgres";
-
SyslogIdentifier = "pg-autovacuum";
-
ExecStart = "${cfg.package}/bin/vacuumdb --all --echo --jobs=6 --parallel=5 --analyze --verbose";
-
};
-
};
-
}
-40
systems/x86_64-linux/marvin/services/prometheus.nix
···
-
{ config, ... }:
-
{
-
services.prometheus = {
-
enable = true;
-
port = 6999;
-
exporters = {
-
node = {
-
enable = true;
-
enabledCollectors = [ "systemd" ];
-
port = 6998;
-
};
-
};
-
scrapeConfigs = [
-
{
-
job_name = "marvin";
-
static_configs = [
-
{ targets = [ "127.0.0.1:${toString config.services.prometheus.exporters.node.port}" ]; }
-
];
-
}
-
{
-
job_name = "gitea";
-
static_configs = [
-
{ targets = [ "127.0.0.1:${toString config.services.gitea.settings.server.HTTP_PORT}" ]; }
-
];
-
}
-
{
-
job_name = "jellyfin";
-
static_configs = [ { targets = [ "127.0.0.1:8096" ]; } ];
-
}
-
{
-
job_name = "authentik";
-
static_configs = [ { targets = [ "127.0.0.1:9301" ]; } ];
-
}
-
{
-
job_name = "prometheus";
-
static_configs = [ { targets = [ "127.0.0.1:6999" ]; } ];
-
}
-
];
-
};
-
}
-14
systems/x86_64-linux/marvin/services/prosody.nix
···
-
{
-
# deadnix: skip
-
config,
-
# deadnix: skip
-
pkgs,
-
# deadnix: skip
-
lib,
-
...
-
}:
-
{
-
services.prosody = {
-
enable = true;
-
};
-
}
-12
systems/x86_64-linux/marvin/services/redlib.nix
···
-
{ pkgs, lib, ... }:
-
let
-
d = lib.py.data.services.redlib;
-
in
-
{
-
services.libreddit = {
-
inherit (d) port;
-
enable = true;
-
package = pkgs.redlib;
-
openFirewall = false;
-
};
-
}
-23
systems/x86_64-linux/marvin/services/secrets/authentik-env.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA Mq6LpVWnock3MlBHyxTdIz0MRgayV1DmPc7G0YUYmno
-
Hjhpy+AkQ12MPP5/nFdfCbUYjlB7urYgodmNH3MYQys
-
-> ssh-rsa fFaiTA
-
nUWzhFls8eejZQcIvXT1OQcoLCUPs/xkrGmJZ9nYsimIg9O1SvSvsksTzpF+kPxb
-
FSm0mpN5LSI5qIWkTVCARSygCXh5oW7O5BteIEslfZQ2mBWWfUIUfXjxgyMR5YNI
-
WuMQ5NLag3uulDKFm7nX/MW9MdF5TQqsp2waDxZR8twErIHXxyYV7L50OpgHXshN
-
YF+MQ44G8CpKfnMlJT2LqYdcwtCD5CbPyyJVGzPtKXXMCO90ep7kgsdAtwRzRQ/A
-
pOm1kN0E4OtOCCTuUEu9KcTjREFEzVdNDo+sK1aTxZVgDMT5Q+1MW8LMAjxJkJaH
-
EhgiwzOB1wuKNJmT3oTHxCZeXebEZVIgzrM0d8G/ZpRezMhPQuVhPNwTuSTS6Nmu
-
UoLpGd836qa4wRiCnyw2wv5NWC9dk9egXGmpJP0WuYkm977nV8rNPD6Y0yo1zdXN
-
bR11U5nGhNmKaZR7JuF4uXnscDwuLjezTqbnfWLnWWfsPchUdwxSLkBWfxOt9Bwb
-
UXXRCXmP1G7G76L8Lq4px5w9cuOf1m40aIRFDAQvsU8lcjNh+x6Hlrs6e6JLpTIU
-
hSm9RNis+NfC4eUTbBzvHQJl5pOcc4qGDhRfZHHHgFviGtDRNnCX8Qti0s55z5xj
-
92YLwusKCLsY/qfUMGxR6xJOH+qF1slnKJUze6Fm+3A
-
-> ssh-ed25519 wpmdHA y8GnMn9T4Pd/luf2iFGLgwiH2+28omDf+koJjTnjHjY
-
bhwyh4cWPs0/WaDEAV6tQ9VT8Rwg+54O48IXDlp3WnM
-
-> zEWmG,-grease
-
RnR4Sk7VgVxA
-
--- rw5rtJ/Nk3pe6NIho1qUG8THDMN/gyC82qDL9WF+1ec
-
�as����Dp��c�´���i�x�AQ>�w��o�bI 0�X����Za�AH#���0�|����HR5�������S��G���9Y��{��ּ_"������r4?x՚5�tG�F|�&�gXC�\9�P
-
y�K�`����LeS` !��21�����U1��S�?�X1[�7Qӫ��D�!�>���XǍ�)mH��#[�C�r�4����9σb
-
lf �K_PB���$�X�n��(V�Q����u�?ix�z��I��Zܘ
-20
systems/x86_64-linux/marvin/services/secrets/buildbot-gitea-token.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA sXjW2SR1XZX72GNOub2LDOyPErSL1frz/6h1/PCpYQc
-
C1S5xYK8e0wjxXUo3Fv1Bly/KexFni/vUVQXvTOaYjM
-
-> ssh-rsa fFaiTA
-
hp5tbxse6zTj3F9+cURU7l1wgQ7xPqetn//fPbeAWgOaE6mV5AgKmul7rHEL9IIH
-
aFTvalTWR/KnFznYtlW/k8NJ8kxsO8xF+E5TzFnJHoJ1kcnxzx470m/erc928n48
-
XcqN+XT2OS7xxH8i4v+pTqsCniK5oKpUbXujFBDdLQzHr6PfudD7KflSDklIdYEB
-
Hcd1wPtnOwD7lPPrH4MIVNcAsZdc1gdieWI6WAyYhwyCGkHx+AAtbGBGIRxpM6eA
-
/iau2CyIL3NoQO5ahuocI3j6JZg/rjf8CrB6BOcjST63xxJOtb/Z1vCDMN8IL7h5
-
BC/W0jeLSWG6j/HtGXQHcBuuCe9X6ghNxHjJnXTlW5gyy/5fkfg1VwH1GH7LSgr3
-
tULl2deCUc13COd+c74wPl1tndaCFou3syWQI1+g6cxafdjNeC4toQVVTjiWKArW
-
9FxAfmOHRqkren+G68rV3r9HUwiik5yfFj3i0ReiSJOs+PnFdwiia+qEyEU6c+RA
-
ZKm02DA0xdIKvWRhBcV3LfXa59gM/fqHY7fPOr764UE8G3OxhU41YokRxSF2Amjr
-
SrrTdd9ifydgm/6QOezR/rGdIPednZGw7AifVDtzStqfeK2N/1UptXmRTqJxNKDl
-
HqChILGJP+4oQ9C40DBJKqoDoQ4cgdABf+cVvum4Vuo
-
-> ssh-ed25519 wpmdHA ihAY2EmeXBKtEYivtyxIM4f9DT8l4r+fB1aZq+/bBjI
-
cTxIJd2UpHpk6+kRC6kYnkWpk5vNOKN3KaTObI2yK60
-
--- wb5Zy32SMDk6XSAwzGDLz1fHZkTmFQRJu3UdOSO6ALs
-
�6�3
-
��x�p�(SFx��9%�l�`��mNy�i'��?i�������@Nw��ϖ�Xh\ơ� �A�X�{�
systems/x86_64-linux/marvin/services/secrets/buildbot-oauth-secret.age

This is a binary file and will not be displayed.

-19
systems/x86_64-linux/marvin/services/secrets/buildbot-worker-password.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA gwCfKQU/RuO5wvWJt+BNo9vMIH4cQNKC4YBo4zgeM00
-
568cl7NUSUNWPCF3SL8SSqsyV3qqKmM4CoqmQ+yynUs
-
-> ssh-rsa fFaiTA
-
xa/L5kqpE+MAOnbQFeOi4u53k9RdTz7di+bFiDwkUMoxPwKKWmT6DejEq2JmqcL6
-
adkNyc7sS9mfyoCC55WttpC1VBtyCtWCvJIuG8vtO11RsBfA6GvHLG4uuuHRGEqQ
-
i9IGIVBIUdCT+q4Eu8zV5hVEdbuufDGTbp1Ye2MZszl99XE3FKBgBNMfMyYL4fO4
-
+GE6kuTMdgwlI1CKFlQH5cZSMwGtm1ElTZcwd0Zl1Zu/5Y4mKwJ78RLtdmoIpYW/
-
8TnvuH1uD6PFZQ6f0RDxNnEnyZuAezTx16tjFfTuoI1/lyvq6t6et/f9TysKTnZZ
-
W0PSBFvTaxE1IKaO/PRynd9ZrBbLgk8pibCP6HgM8ev1Gbl4vLjq/0t+t0PEVquH
-
y0MXvO6OvjGs89JS9/AYbBAsFxmD/FcKGm857fKFqE2a+SguX0oTBbjNx/PG0rAm
-
RTx9CR2wCUhTq5KheRmL+Ik/T/Yv4QuDid6p93PHcwJ2YUqXPyMEuTyv/nhjSEGa
-
v3GX7sIQh0aC0LSHF0ielfyxjvAXysNKiIZaN+DU0tGTgKW/QvMOnUKB4X3EZCHu
-
yMGgV1vR+pVTLx7xoAyjPL9DQC9ezMlSs5gcZVEV3NLRndz5Es2SAgg7r0mXy5fg
-
PZz7XVriGa+2JhcAnDbFWgFjqwI7r5MSTpq8Sl9FZ8E
-
-> ssh-ed25519 wpmdHA wfideEEHVJwKpYxqET5LDOE859htEZIpg1UxKIGSayM
-
V5vr78i22cOHPS8+ZFluqMDfH9D3vzkHQ51Oos+MWq0
-
--- ltXrwcgDWjvOiOkbNmi8MAUtgcevsUKA2ooV7UyB03s
-
�� ������U���������q���{l���˓��<��=r��Žv�ݸ�H���Z��V��
-21
systems/x86_64-linux/marvin/services/secrets/buildbot-workers.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA NyjUU036+HYwviv9FB7Onyl3YYScNe/vLXpAYnbbJxU
-
pecvax2BSVOYEgCHxoQyWTRzBRpq8N2ertX0QAw600Y
-
-> ssh-rsa fFaiTA
-
Tdwy6FqSqpMxc7x/Ygwiz8ssPwug7sk1BZ0QghMZkoO8KPJwldUcYfsgQxklzisx
-
JuMDTBacCxN6/RnIfvcagtYZ2NeKsGkhk6KZ1QtcDt9oWrLD9KQBs/YlBmkJGE3L
-
SqAcQX9AybGQ+ODS8ZbXR7WTcCy0I85Jiy60QYRfkX5lElL0BAbbuphn6xtm0dt7
-
YuArYTndGI1KOgcnDCia8Az84vzjIh/Cp4AGthmhAOQP2R1k94LI8p1639RqlrkT
-
XAdsglg344l7ki2Eib4pPADDmhKttrJ/79DTK0X+1757PaUyxMif55WIrxQLzE2s
-
QHhwj1pka1HynIGy87cwILAlvqWNFUQ9lTbfMNfTLMBEJ7hH/HB6Adpmr0CVhKKG
-
B3WfC9l3v/15owcb3qLeP/dkaarjHbTM4FafOLkjrhdEgYCEGK/ls3vx0Deq4x39
-
G3WO/fclUQyjcO/g17i9yyfmuupL11Juk8xRyaU5fzi5O7gtGnPlLxhBqXE1s9Xa
-
FzSSBHztAYAT7D7wodoE+LsTAajRoMQnTkFuP0pvO81C8z7dMXVckYvPco8dTbHY
-
wujBpw+h//2oIfWxgM6lzZGKny+VsbFSVDz3JURCeWUaFpjdDHzkk7fd+fXAdhcx
-
Wh25XuYYKvr1SOjo1ux9hAgbH/KAGKy9hoXzpbs6q6I
-
-> ssh-ed25519 wpmdHA iO+7sYjfsEVkwxtiRMgi/5liBd5I56Cl3nIo5fFe6gc
-
Rhez8a+eG9D4kV6I3R7eRdEty3dVyYybBCsDoD3gy8Q
-
--- W7rtaU3i9bkD3+2PKJbOeDK8AlFhpW0t3Lp6MeJ7RiQ
-
���
-
.I�s ��q^hA���Ch�D��s��������|����8[�%xX�n+�Qb�#f�gUL�C�c9p������RgBd9e%'Y8�F��gկ~�15�D���d�K��C�c>���w
-
tP(�cr�����p7
systems/x86_64-linux/marvin/services/secrets/forgejo-aux-docs-runner-token.age

This is a binary file and will not be displayed.

-21
systems/x86_64-linux/marvin/services/secrets/forgejo-db-pw.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA 2iR3dpVJpZQc8SpHKJMDdoFgRQ3SdR+1Z6MJNOXBYRA
-
gN/aJwxHXwAH+UPyVG3C0iwNyitvqleasEId230Ta5I
-
-> ssh-rsa fFaiTA
-
o1krn+dfavUdLS/kL1jr0fzPdM9U8r22e2HXUyB8Cjg8K39QNR0tIUnJOeDh+ySk
-
5mnA2fIhCc8TDmxViSVelV34xPBJUE97Uv4ny8d33oAM/h+Z9lUVkNYqBQIvy/7A
-
VbXPr4exw09vIKqMII8r7Jk84h/W/+FNCOD0eD/hoIEihkEKmTlGaKnDrIukWK5u
-
3oohSQ8vjz57NjyNAVMpqBR+N/kgix7Qn2nWie0Y+8a6Oe09KGv8o4NSvMsoF36g
-
ZoahpTkWqN5kEMciduo4bGUPO0WlKS8JtmpgZnOB9s0BN1xHqGyFheh2lkprW8m7
-
5RsnmjveQ5W/YOjQwfZcyx7MzWGu/tdAOa24ZxDMoVuz6p1fVYNmVx5roj8ddU8M
-
Zf4LIRyq+p0reWEZyx4kGM9KO3e3uBdjEcd1hN8c11Nuhq8sQWtCzZIfXUpbWFsc
-
tFdKrAkxnrCjFbwkBLj9KRrstJ2U9kvQPjv/TLUu3nfZvQrT3r6La7nh43yJVFbO
-
BEKiebbMKZ/uXpat9ysBblaDSDLgFq9bG+fKaDCurK8xLeihEmUUto3+zJ2ju0xN
-
9/5y4wvaHp2ubn2garimQA5SL/MXviroM3Ihis1QXh/EjCqUAsNDWuxj4yGq7KjH
-
pyJh4POTwFwa1+dieajao44dXbjR8agomTDNsFcvciw
-
-> ssh-ed25519 wpmdHA Yn2SflGKXRy8gFw49DgIgYgQ4wW8E2DGGI7dB08Fp3g
-
h+CktGIMZuh8mRJawXRRNrN6ekc96ET5vIHEE+560R0
-
-> VEh-grease \tZ(&
-
sarIr7CdltfkDsPGC746Bj2bSi4JYbJyJyqFIY6mTlr89qhx+Q
-
--- Oogb2JMBAeU5WMAOhFDuLMUwj6Y3yGjn4FDAJ8IsNTo
-
�oi�KAe�+���i��\��*����:��� �c�6��(�1�����敽#�Stq���y�/�T�� h�|
-20
systems/x86_64-linux/marvin/services/secrets/forgejo-default-runner-token.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA wAo/lrx6N+r+RDRkW+diss7p9GXRuBKJ8X3m9SqsUms
-
j7n9oR9u1XkSPikdXm7ck0nOlt1QOJ1ZBGcU/b+kgr4
-
-> ssh-rsa fFaiTA
-
jP6zvnCemRTSeHZzkwCQw4ISRuQVNwPRDVr1zqPlx19z7s+c5NSH2k+ryjgbVWkc
-
EoP+SMR2sguwhi6SvKNvFZOp4+oAu4ATWGCvjTiqD+iNj0IR9pd+TMIVD6g117eM
-
0W2LQN+Yw9tDpT5vX4RSR+Vs9rvWkNgZI58Rib4DprRP9lcD4hjpUyFWLnjsm/PV
-
4YGMyt9CCQWT4UuEj8PZGK/l1uQRNIoXlHj83Ewl7WNhlO7I08kSDKke39VkIiXj
-
55FOLCIq8rgT8mUsBqr2EJRzS9hJpKIytYdhLmTdAMdpfXWvjDTVAKIYO7DnAWdk
-
uU+ORVOfKEYjD4uuYODhS/n2U6USwNF/R2E6JB806LOglASacw7o9h2oTXEpiW8u
-
KJq3VkmnhaE9h7SOkBISlGC+y9MDm0Lv07P0hHBr1j+oaeVehMst9HO8S2ngVp6H
-
0ZjokI6JpExinFn+UDoocXUK9s33Hvzg/q672JmgIos56wmCtFX7A/ba2isKpajp
-
WIQMgvQEVxaUBpbRQTjj5SNGVRMns2cJWWpvinyjLMWRj8J+0OEzOLyrvnCpZZw1
-
DS+ffnwCd/7t3zxnyyl+xeRVD0tq7Dd1X4oxmSNDEHKcNKhjsDnIEd1y/tcTsUUN
-
X9GDhHLFLoS3BxBydkJ6dSH9knlE5KZAc3wKtjw+AQA
-
-> ssh-ed25519 wpmdHA hgNiJmcUepbnNwU+8zcRC7xlhou25Uv3mKO7L36RlQA
-
1uSnVNpcQTGhYw+L02JQSd1PUrC6t6Dh4QI+eXbr8NI
-
--- H3xuoJ0qmwWqAJoiY8nFXbTOpOeEcKcr2zc6CozBFtU
-
W���S���2��+jz[�귐��P1�>��b�R�J�-��
-
&�jm^���E ~��37ܢ6���/�$�ÒH>9p� ,
-19
systems/x86_64-linux/marvin/services/secrets/forgejo-gitgay-runner-token.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA NtvHYtlP2R1/ySw+0gQk8q1QJcujtjMK9h8BXTLnpFU
-
5+iRMI+OvjQMSR8TkEO5QXFp0u6De3EVtmt+OttYLAw
-
-> ssh-rsa fFaiTA
-
MiYovathZe/ZO/NvHsRTFaAlj8GsHgBcbVkkV9MDoYhacdomegj+J2nQks/j+TbP
-
zU9BSBMSyzWrYuCi15kISyk962mSc7Gte4nwJvUUiZdWq/Vm2dSLyV57EHBgSXl/
-
C9DHnS78OgTDn8YeeRviLkJ87LEEPF9yGG2z/YN4i53Cuy8UDQagdpFG4dWjGnQn
-
hImg4bI99h1coaCf8PfsuLsdumbR6y12rdW0A5cEyhfDoodV9hILGuP9KCtUXNxO
-
BrxDlpVC5CjUZ1xcz1qgQA8QvKbl7qVitxmr5+1pHwtscaiTufOs4MI+ZxCKwOhJ
-
VPiy01TesPHR9oua/7Ap4dBOTpKRPb8GyaCVyRvkb4cVIlQNgIYuL3pkB3KOM3Ct
-
VhvXVgXxB6Gb78gJkBy/uwmnSybfnzjv1z+yA9f8VFBzt+i2kDq8/37Tng9DSVGj
-
4yS67uYQkT5+OVrcjNwBd3NAguVNNg1PEsIE8SvnLXRmI79gjiMdlmZFTsAl2EZN
-
2CMUaR9r0O88xhEf7FKQ9CUjZjfZvyhHPaJXADfducaVhB56RCIf3jwtsdFnTzzZ
-
UMIYJ57Pe8m0ESjzp/8+6wH4MPaMULSJhxnpUJW5y5qqnpvRo1dQiPRkW3Xxjh3H
-
2ulClJg8m7Tqj/nASJFZkqI7PUxjnAteEUcY2WBRtMA
-
-> ssh-ed25519 wpmdHA OYK95VOo8jFn31+P4keeW0eJco7PKVE82NQL0U+0f1I
-
D7O1m8QTLBARYjzUJBBX18Ko62iu7ETDD/CJHptTBf8
-
--- ku5u3TkIGQvE212JtizdwVoz4B0Jx3wvvPrGFfvihGg
-
�gL�y+72.O\A�,U&z����y +�Y��OB=�#� �=/���}�@W�xx���� \'��~�x.����5?�X�
systems/x86_64-linux/marvin/services/secrets/forgejo-internal-token.age

This is a binary file and will not be displayed.

systems/x86_64-linux/marvin/services/secrets/forgejo-lfs-jwt-secret.age

This is a binary file and will not be displayed.

-22
systems/x86_64-linux/marvin/services/secrets/forgejo-mail-pw.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA QbfTwmaq7Y7u8CL4KBCcGrCyT4b1lGky7FH11QCTvmk
-
IdVtZ+2EyxvRLVXUTiiLPfAcKdkfY34MZrzn7SSl9eg
-
-> ssh-rsa fFaiTA
-
XfTTdTEAls+Qtl2WYcHCaKd+vE4eZaY5Rh1llYAfeAxBsmgq4vmSS1UFkPD5HUMl
-
9dkHZuEYyySdhOM7RFICYpwbWAdSybs08dFI4rjpYiU0ZuT54aDmvTtioVIIVvn+
-
E9YEphsIO4jbqTDEk0lgBNs622vlJ/d6xV6Loc15ZFYxyqteXTTpQii2Jpzh010b
-
PW+LlzSChr4yMZWRqKQV2QcHQD699L3p4X5eleuUkMh1N+mM0U0RlDPnRzDx+10L
-
yMZxyRjWs+u2mo1SuNrgzn14D9SewJXbhYvc+KcigTWhQymr4XHDCPguB4UExonu
-
/JodLIpjVA4ZlTQV56jjMgOXDE5bk+TpHMULn2mxxXFxtDPzvamOjnjTNS9b6PVF
-
/JHcRgHpoY4Z6KgQN4cR7naj23pco/k8DbI2f7TYTXTHxSl1wfLbaTwdtEpnuO4F
-
D+sNXQC1wI5Kr0fQV6l1NwtPI1De2NbR4S8SKKJRDk+xdhnmiD3qawy+I5D2e8Ri
-
JLkzUn4xeQgSLibXrDWJI++JCnc0le2OgdZ/uJd5feJJaSr8ISRW2Rhvq168bamf
-
tTPFVG6V0YRC/oGgytT2TOtqrx9+Ewf2TN2BUdlckUp3k1L6JiZJg3Tnps8RaCvo
-
wfsGS1ZKcadS6dQyfAKe7vr9Q/dEVYoOR0SIstLae6o
-
-> ssh-ed25519 wpmdHA L3dLS8TuV+mkf9lT3ChtIvLxciLJIHhPdUFz8dcoe3I
-
tpSkZkQ3yidTctaAk3yzye/DJiUYBeHvJBu7JDVsCqk
-
-> 4-nZ-grease @h[XP&o
-
g+aR0SZXoWycWqRgm2Ry00EJ29VWxfzDI3UmPg
-
--- SlVpGEGQXxhp7CUE1f+LoX4rGtOONFm1SSq/gwGITpk
-
\�;^_��T�p�R��21f��v̵]���O(��L���5X��ol&�����$
-
��y���l^��"��V�c~
-19
systems/x86_64-linux/marvin/services/secrets/forgejo-oauth2-jwt-secret.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA yaO0bR/AMXXrY7ZqH9GlFFFNSYtd3YdIaZHeBkmAV2Y
-
emQoXCiHu59lqhMo6+6RZcjykzCFgQL//LeMoMf42m0
-
-> ssh-rsa fFaiTA
-
vUrw2prvE5tBUMfKD/VtBYzoCz+OholrDVO4/8gvKWcUVBls1wjDHH3DXR68YRTt
-
Kxxv/Nzi4aHOdwBgF/UQ4FkFE8Lq13N8upgVhUph6ryFI77bEZ30EJdI9bSNEPiD
-
L75lnD/oqvALZviQGypX+phllyc/vihJuWF7wHEkNzowLYSfoYv0SoZYUym9nORG
-
aRyw936NP1GGhOgnoqCfl/AJqE48nXlhK9SfJ/8xTfHrEgeT5e5lid6s9Uw0j/m0
-
ZXA/ut6yoLS4+SgbOJR1RosiMav55+DGOVJ4PgK8s7hhzxyUTPqtoSPiQoLzjvqW
-
vp4IY3DMSqPEsb7rbHn2eIfnaGqFof7x4HbG/ablKRQtx13DTJ0m2MKDubH2RWQT
-
MZGiqA+h4jVShLBY8zX0l596K3eFdJqxZyxU5rzP5ahgS2JKaaaEarPdHXuZ1P+U
-
NSGZ1O8hW0GQ6lyeTjyGA+ZwjWk+CBZFj4iaTGi9tnMLeF9GctVcNrSTNVxlUmek
-
rBIfb5QXA8zuTJWbxcEjrFJb9dmjC7Sd9EtCfIRh6VQBXlClBQgSOZVqH6RBhJ51
-
iRL9Po2Xrb/Y08w+BrCqdecfeDU027E/Ds2uSdoSK2OMJ6ZNaz3RER4HXitltPA+
-
gN3W5et8lD9DIW+cc1wj2MyitEFZh9pJ7C+uB6YF81Y
-
-> ssh-ed25519 wpmdHA w2zM2j5IAfn51aylYdRUz8WCuv7FkumpxepsfqS//W0
-
gVcYqjAA4ULVcSmS7BVRqF8kfWHbtjlX3659+CGQbME
-
--- 1L+ACPbJPa2Y3wxSGr/7CBTPYXIOxOHynEhlUZGLgzw
-
��jq�uz�P3� "�}ܬĩ�W/距���ߎ+�΀q���*}�a��6��I,5<sB�m�{J�%(��a�A���
-19
systems/x86_64-linux/marvin/services/secrets/forgejo-secret-key.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA 2bKuQvw8O9MVoEjaS212yLxAjIcnoT9K1XfZ+WDUsQI
-
sA0hNHX+vfLlM0WORLnrxMbHsqwNoqCrSTCY7iIBtmY
-
-> ssh-rsa fFaiTA
-
qIb+f5jyeTmKqW/ylUBcQH5tz0/0SM/ovGWkr1xiloqieANaMEdMTiQRYNrMpOtl
-
HUn4YjLZ7RqlOUBvRWJkMsSaj2gnPCUBnnNh2exCG/rLWnbL2OfC3yFAcfFKSAc+
-
f/jiudo0PmSStP8o8S/Q+k74cxbg1ic/eMfX4hdHCxliI7privKtxOSz3yiuW2Tq
-
ZOMKQ/YF3rqMD/O0jdUFu1OzdCuBj+GtpPrJGR5NJmeQJw8wM9Zk4ZMpW6MkOPij
-
tK5URdwX15dDTC8woUCwvFdVKTd7+VV0E5p2y2ooIr9SNFOyK6ehwINIpoPvoQKn
-
SgObyRUc4jksyPirl0r+1h2bFuJdWY/JhPb5pyeSZpI4VybZwWY0RpYgWtMNUJ3j
-
4YJ22pKKtkH0NXsWhwzG8Tmv7S0kDsZS+yD3vMD/mkAnlSt5cK0MnMXpqxfS0PWM
-
lhk7iD/ne29yCvl3aWTfJF2Uc7gi2gcHZ9WscS07ysWD2kBkQAsMBohSNPP+sE9C
-
qH8BFrlFBJs1K95jmnbtIprA9k7S0P9ahqnCh4B1PmNP7dWvVDjWeknrij3p4Vuo
-
GibCDtFWrbO37Aksefs0AF2wGQmaHRHtAhdL2Ieh/v5yP1HMcMTpYvTFqw04AnRq
-
C5Qj3pd89I2Zxfu71X8UuNqXFaDt7FTVPqQXA/QXmi4
-
-> ssh-ed25519 wpmdHA bOhWTK7ltgJA9tVCQn/Has4cqeiGkLukCtV6ns2xgmg
-
m18TCv820K+AhM3DsTG14LXWSSJ2Q0agwW/67B2cv7s
-
--- RDzTUIZVWDsM2snL8JjZNi7JR3+uDVBqCpcXQwq5ics
-
%-�t�'=*єNzW2�N��v�*��3��Ew�-������9yMg�Ğ��p/�OQ��I@},��VZy�ꧣUQ"���q��9moی�����g�to�
systems/x86_64-linux/marvin/services/secrets/golink-authkey.age

This is a binary file and will not be displayed.

-23
systems/x86_64-linux/marvin/services/secrets/grafana-admin-password.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA XeXuqrum348P3vNXQH2ikpZfSIiLeJWejxY3tgGv+2g
-
C40Ha7mJHes78csqAtgEBOMrVhZ84jR2MIw96o6xlKg
-
-> ssh-rsa fFaiTA
-
gMFfSu49RZeKk9Gj2jhdeG+Yvais/e8Xfw/7Vysgv5a9aZrNcduGcaVV36jYogMG
-
D5nC5LqFDlvYKrfJDeQ5JKoYb6SJQ027qopoithQPMSRAIc4Ke6EwkIGPkH8a/R6
-
+WgfUlaFiacOqRmNB2ObQvQvyKQt4EPihkqt76b2gGoz3e+lS6SS6pT2UUqHbV6d
-
BqBgzc68YWS0IZPtyMcLNFL/TpGH3y0sf335ypuytiEHMmH9qN39h33rFRYB7gdB
-
nGuKZ0nhqn3VQUWAiSWJW46+oGF78bsFRgnPvMVqc4TQaiXLG/Qv1jVEgBU/GSHC
-
GbrE7fgBMMN2noX7zQ7NdBbOZF9J4gVm031lo3mpI4GlaO7G24EUTdG8JmP2cTcZ
-
Q4iiiiZaOxWWhJ9ObDYr2clvm8P3TLqE6C77yzlA1QMo957rr4RO3HHDgfn/Ge6n
-
gx30M/SCLKvCeyZTmRWHULlzlsr8MShENJf/zeKdbnNaMacofXgwL+mCe8bWHcrQ
-
OfPmXBHa4UPb7zbESOaNgbYhCzjNEhqcXKn2AXbWcNJGImyOf0PievCBPGo/B013
-
VETrs8gd1ud8GplsT8b0XMmAJDrJSPSJC7ieyjBFGU+dWucwtUtw3VajqMjklAZO
-
6gWo+ybtXA473LFpzu4MVA0Zr1nwaYajJDMsygfVVos
-
-> ssh-ed25519 wpmdHA hqXiyptEBUhTluqATQtTHNjpQMsEWGweLZBM0vNr+0Q
-
sSUev74dcNmHWZZF4l0iJjgEH+zX3pJ+1d88cZFU1QA
-
-> W-grease dB_Ln,<Q 8OG=
-
mn5NEEyg97gp+G6d9APe+CT+9uqp68TCOpqqwOYMk2BZwpVqmTysx1r595h66ShQ
-
4fDWVuM9W8k+nr7tuV1jSRtA/XH0NhwxgwM
-
--- uqf0oP6H6UKtTSOO2W5kZtxmF3loWg9vD1tVqn442PQ
-
����ц�-��^W� ���� �qv�UP'w�=��N�7���;n���
-
,a�%5�'һRTz��u]��P,
systems/x86_64-linux/marvin/services/secrets/grafana-smtp-password.age

This is a binary file and will not be displayed.

-23
systems/x86_64-linux/marvin/services/secrets/iceshrimp-db-password.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA g+DkjSGDd+i/sdqRCuU2I2Qzmq4Q+FI7wSyfkdM9q0Q
-
cG52xAS/VPjCNgHdky0/jbMvF5tF+cB8BxFNCHYlf2s
-
-> ssh-rsa fFaiTA
-
r5mQer6QBi+HdSS16OLHfv/oh0hbug5drdX/BuQHMORogiDfHEM03K6pmg9064Ep
-
CJgl6z3IS9hlLX7cSq2kVSvP9gk+l5AmI+pMZkJyT9ED43g6wtRI7yiy1ALO0rqB
-
z/CPaoLkFNFlt7sDg5rijAB+t6DNAxULfFj8KR3b+NvGrrW6Vbaio+T5mg1A2PTd
-
60eEfuqdn9dHVI82FQFmai1LwoyButrUNn3UiP8aIdvFUueixcqsAXSK1zjPJZ5B
-
VeAkshwhB9+HKMH1cyRa6LUbzJYxAQBhkgTFqS/r64h3ZAYHTc0lY44VtVhbnEQI
-
76PBEOcQXXjvPR6yvbcVZfpqCkqfo9hb7wogPfJiRMjKM/qlpR19KOf21T0hsV6q
-
b7nYf01yBscx6GKXREkZoxgpo6iLLzVQqU5SzQgs7nxW089JdJ62WoZvJwTxv2G8
-
AdzImnsw73q55MgOYtv/A3hGM8O1Jw4Q4UfMSS43xB+cuvtlEmSqi5mFh0gPbqQR
-
LN8+OcDLz0SR8U6xHj9ufXfhHc4nwO8iZpzav5nZXMEb3Gmva3k8U+nnmuPKqsrL
-
VxFmGNxqmWPfxO0FJC/cxLKME/Lj2MU9r6KT8RQ00BjHUfoDgbFzHVLqIEbIE+Vr
-
/Glcmz/Ecrt3kTwfAhEDpj6g0XVNHt7HA+r4SDWjI00
-
-> ssh-ed25519 wpmdHA LUF/UncaQTEMQepVAhEqFm345dICeW3d3QGhiflTSH8
-
ImxpR4innOw1jMSF4gvmOGRDl0BzqAhOyz+GFstsJG4
-
-> Cg-grease k7q9
-
MLRf60C4nbEc9XHo26cg7UYySbZtOMP2kZtZmvLiS1XFeIqQaR0RgRcUOoTblYzo
-
KQ
-
--- PV6HHY8kDdpFcgNu83K/cwz4qQCW38jcHkTOkCunxrk
-
�*ǜ�lq��^��fʀ���l�� R��C}Մ�ɧ���F�ĩ�&�~h�
-
̟�r��6ʞac,����lc� >
systems/x86_64-linux/marvin/services/secrets/iceshrimp-secret-config.age

This is a binary file and will not be displayed.

systems/x86_64-linux/marvin/services/secrets/miniflux-admin.age

This is a binary file and will not be displayed.

-24
systems/x86_64-linux/marvin/services/secrets/minio-root.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA mgvSF87cU7AZU7wodayiSUZAKkAkwqSrtjhqa4Pykl4
-
eFNRjsChXz5ij9uOJvf+mJIE5zd6pwKJie7UKmwl5bE
-
-> ssh-rsa fFaiTA
-
NcGWHG9CTQ1Gpje+gsMrVlp1qc8w9NW+Onvv8WhaI+IFVEcUD85fvgPaO2jI88jK
-
TXyPk9RanxiCupk7dF9OXqMprOHexss+h9SSl1AN+4V0Ob/H0r63de0Uuro70t/4
-
/4FP8t5AE/aoFGdw6CeGyhOYjoLo6YRZAq4fYO0vvitFdcbWVm99OFbO3WfoxNZB
-
TgUJ2ELV1mRfPKe3QwHYLztKcyxN4CArjNjQvjQbLXS2Hbu3I4f4qIdKPwGVC1HE
-
Q0c9veAaffaAGgbNUyohDjN4I4jEzkRhTlRN4LNQmOUNLBorWu9ml+IyCnsg2Q+a
-
nIyp6OvE7t0qElPv7H4m7krBP6WsSXLhUkCd75VgWEgJRqsLz7p8XyUpb/EhPmql
-
CQy8gcAnsvNjYzC0xpZKsxN37dRvmTmQkWd3E1w4XDwHoh8EMdVXFkTAIZ3IZabZ
-
4MSkwhtgTBMiQvWMxIPN9fgsd6t1GawDsH+uN0tPpBslerlF17bszmdSdVYpYZBN
-
Z2YE9z13vbL3eHvp83fp7n7Ale8sFd6FQ6VpbAa0xHiwYV0WooUHymhcG2W8Lcq9
-
5w9LJSaV7HMxjc0nUBloxsOF6ODcrOsfNo1VXe1vnbDAwhDqpcwaylxUoh3zpXHW
-
XBEIzqVG3qC3ACD/xqCy27DkomgKXCG9eJvirAiQ2Uk
-
-> ssh-ed25519 wpmdHA xWldzzokOiLqGXnhbDz+xpHYeqkV0ZNuQJqGp1h28VQ
-
i2/gdjHevsacZhuSDeABMAKEbU0U00U0TQWSHDS82ws
-
-> \G-grease v0 "."c0,-f Y3.
-
MpzHrbDONd6D0zPzvCfz/ycI8sKBIP20soAtSN7EucFLN6BCbb13KT1BOh/Yvg5o
-
+52Mlpg3p0KAdZFYp9Siqmcrb8GEEZ/8lqKu/n8TyD1BWe+eWq2PfbrhCtgqvMlR
-
Dg
-
--- lLxTWRzSaZ/GAzAmD88c//dzNqT4UDZQb4szP7MgCGY
-
+�P��������q�f =Yc��,)��F�P�9�.���� �Z<��ɟF�c,�q���o��Y �>������\�l��z��2ϯ���_s���z��&_�B��q<�J����+0h�_��W
-
systems/x86_64-linux/marvin/services/secrets/nix-serve-priv.age

This is a binary file and will not be displayed.

systems/x86_64-linux/marvin/services/secrets/planka-env.age

This is a binary file and will not be displayed.

-39
systems/x86_64-linux/marvin/services/secrets/secrets.nix
···
-
let
-
ssh-new = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAxOg9nOtfbedq9AlnXNVUfyU8Mwfj4IB7HX/4VoWeXP";
-
yubi-back = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw==";
-
marvin = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP60B1IOdfJRrDcCKajMV8YJNC01gSsccZi3DKHlS6YJ";
-
marvinDefault = [
-
marvin
-
yubi-back
-
ssh-new
-
];
-
in
-
{
-
"authentik-env.age".publicKeys = marvinDefault;
-
"buildbot-worker-password.age".publicKeys = marvinDefault;
-
"buildbot-gitea-token.age".publicKeys = marvinDefault;
-
"buildbot-oauth-secret.age".publicKeys = marvinDefault;
-
"buildbot-workers.age".publicKeys = marvinDefault;
-
"forgejo-db-pw.age".publicKeys = marvinDefault;
-
"forgejo-mail-pw.age".publicKeys = marvinDefault;
-
"forgejo-aux-docs-runner-token.age".publicKeys = marvinDefault;
-
"forgejo-default-runner-token.age".publicKeys = marvinDefault;
-
"forgejo-gitgay-runner-token.age".publicKeys = marvinDefault;
-
"forgejo-internal-token.age".publicKeys = marvinDefault;
-
"forgejo-lfs-jwt-secret.age".publicKeys = marvinDefault;
-
"forgejo-oauth2-jwt-secret.age".publicKeys = marvinDefault;
-
"forgejo-secret-key.age".publicKeys = marvinDefault;
-
"golink-authkey.age".publicKeys = marvinDefault;
-
"grafana-admin-password.age".publicKeys = marvinDefault;
-
"grafana-smtp-password.age".publicKeys = marvinDefault;
-
"iceshrimp-secret-config.age".publicKeys = marvinDefault;
-
"iceshrimp-db-password.age".publicKeys = marvinDefault;
-
"minio-root.age".publicKeys = marvinDefault;
-
"miniflux-admin.age".publicKeys = marvinDefault;
-
"../nextcloud/nextcloud-admin-pw.age".publicKeys = marvinDefault;
-
"nix-serve-priv.age".publicKeys = marvinDefault;
-
"planka-env.age".publicKeys = marvinDefault;
-
"vaultwarden-vars.age".publicKeys = marvinDefault;
-
"vaultwarden-pgpass.age".publicKeys = marvinDefault;
-
"webmentiond-env.age".publicKeys = marvinDefault;
-
}
systems/x86_64-linux/marvin/services/secrets/thehedgehog-key.age

This is a binary file and will not be displayed.

systems/x86_64-linux/marvin/services/secrets/thehedgehog-pem.age

This is a binary file and will not be displayed.

-20
systems/x86_64-linux/marvin/services/secrets/vaultwarden-pgpass.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 iqBxIA MmMZMGXNjC0521Tc/YRvAc4uV6Mj14Hrncf05PEEEns
-
3gv8ZFgFx8CHTRelKT4AOGdNTnTtNsJqOCoynmzuOWI
-
-> ssh-rsa fFaiTA
-
Uy93t1IeeIHUwzKCA6m00kl58Z7Uyzsx08CFF2trLruf3iB6+mk703K6QMkrBUHR
-
awSxL8TOLlRwV/h/ckFfTMlltPYcs49s1NV5BhqRSFQJpFOWtoh2RH+6HpZt7lVv
-
8rS2lnlrsm+s+oragwMPMtjLbN5llH3NiZ4V8C2bksKllxAYZJ98rT+kFB+k1BGI
-
o8GcP7Z4+SyEyr4NZBo7pIdpyPYIvhw2MQUSM80Hs30IKGkvBuybDefYY7tSSCZ8
-
puFY2uGI0tLcX9PCT73M7NRCO4Z9lgQgixDrLerDl4pwLd+6p5UHBk9DdmcxyX3f
-
hYC75XcIMOKJfnSUd/maMzx7xgCHtGRuGTp2sHccC5pkjlhI7S8e6Exae66UjXYC
-
5AAA18m8Vzjcck0WiEE7XsZMCwYuKLg53wzsyhPLsHOTiu7BqRg8S/pmArY2SOa+
-
DfQE/fjpljGeKC9mDfyLe4+lyGQ1lUCzASacd1kG5iWS2NM0KDEG/iUTsurfY2gI
-
5v76P3r5iV6jQUGpwScH5XgaekbqC/Xp58p9JbNmPeD5q10ORPggJov4BmqZlX/c
-
Zf2ImTzmECdFRRpcQHZEd/XpR2BfEXCfeLKJiwjYEYKYchD0eWOC7LUnb3+n1Ce+
-
XtlEs77kAkY1SfZyBv9AkP0FXUrfh7VLMeAh2cIsNzw
-
-> ssh-ed25519 wpmdHA tjOcqTNJbYxD3s9DqfIHUHdw0xqtkWjMou7lPrANHEA
-
s+9wASJ94ILA0SZYCrHO877yLLs+rZApqrJGi3sBznI
-
--- CM35xl4mV3DtEYw5Fhzjpj79v4twt09X+weM5EoNkGw
-
��M�y&�q��p{p�W>û`A��@��L��/�@����:P���߿u�Nڏ&��^v��0�*/�u�q[�<�M<6J�W� �����9��~c��v�z
-
k>���ˊ �I�
systems/x86_64-linux/marvin/services/secrets/vaultwarden-vars.age

This is a binary file and will not be displayed.

systems/x86_64-linux/marvin/services/secrets/webmentiond-env.age

This is a binary file and will not be displayed.

-15
systems/x86_64-linux/marvin/services/syncthing.nix
···
-
{
-
services.syncthing = {
-
enable = false;
-
guiAddress = "0.0.0.0:8384";
-
};
-
# Open The Ports!
-
networking.firewall.allowedTCPPorts = [
-
8384
-
22000
-
];
-
networking.firewall.allowedUDPPorts = [
-
22000
-
21027
-
];
-
}
-12
systems/x86_64-linux/marvin/services/tailscale.nix
···
-
{ config, ... }:
-
{
-
services.tailscale = {
-
enable = true;
-
permitCertUid = "962";
-
};
-
networking.firewall = {
-
trustedInterfaces = [ "tailscale0" ];
-
allowedUDPPorts = [ config.services.tailscale.port ];
-
checkReversePath = "loose";
-
};
-
}
-118
systems/x86_64-linux/marvin/services/vaultwarden.nix
···
-
{
-
pkgs,
-
config,
-
lib,
-
...
-
}:
-
let
-
-
d = lib.py.data.services.vaultwarden;
-
-
vaultwardenSecret = {
-
owner = "vaultwarden";
-
group = "vaultwarden";
-
};
-
in
-
{
-
services.vaultwarden = {
-
enable = true;
-
dbBackend = "postgresql";
-
webVaultPackage = pkgs.vaultwarden-vault;
-
config = {
-
# Web Server Settings
-
domain = "https://${d.extUrl}";
-
webVaultFolder = "${pkgs.vaultwarden-vault}/share/vaultwarden/vault";
-
rocketAddress = "0.0.0.0";
-
rocketCliColors = false;
-
rocketPort = d.port;
-
websocketEnabled = true;
-
ipHeader = "X-Real-IP";
-
reloadTemplates = false;
-
logTimestampFormat = "%Y-%m-%d %H:%M:%S.%3f";
-
# # Ratelimiting
-
loginRatelimitSeconds = 60;
-
loginRatelimitMaxBurst = 10;
-
adminRatelimitSeconds = 120;
-
adminRatelimitMaxBurst = 2;
-
adminSessionLifetime = 10;
-
-
# Logging
-
useSyslog = true;
-
logLevel = "info";
-
extendedLogging = true;
-
-
# Features
-
sendsAllowed = true;
-
emailChangeAllowed = true;
-
emergencyAccessAllowed = true;
-
-
# Invitations
-
invitationsAllowed = true;
-
invitationOrgName = "PyroNet Vault";
-
invitationExpirationHours = 168;
-
-
# Database
-
databaseUrl = "postgresql://localhost:5432/vaultwarden";
-
-
# Signups
-
signupsAllowed = false;
-
signupsVerify = true;
-
signupsVerifyResendTime = 3600;
-
signupsVerifyResendLimit = 5;
-
signupsDomainWhitelist = "pyrox.dev";
-
-
# Passwords
-
# # 1 Mil hash iterations by default
-
passwordIterations = 1000000;
-
passwordHintsAllowed = true;
-
showPasswordHint = true;
-
-
# Mail
-
smtpFrom = "vault@pyrox.dev";
-
smtpFromName = "PyroNet Vault <vault@pyrox.dev>";
-
smtpUsername = "vault@pyrox.dev";
-
smtpSecurity = "force_tls";
-
smtpPort = 465;
-
smtpHost = "mail.pyrox.dev";
-
smtpAuthMechanism = "Login";
-
smtpTimeout = 20;
-
smtpEmbedImages = true;
-
useSendmail = false;
-
smtpDebug = false;
-
smtpAcceptInvalidCerts = false;
-
smtpAcceptInvalidHostnames = false;
-
-
# Authentication
-
authenticatorDisableTimeDrift = false;
-
disable2faRemember = false;
-
incomplete2faTimeLimit = 5;
-
# # Email 2FA
-
emailAttemptsLimit = 3;
-
emailExpirationTime = 180;
-
emailTokenSize = 7;
-
requireDeviceEmail = true;
-
-
# Icons
-
disableIconDownload = false;
-
iconService = "internal";
-
iconRedirectCode = 302;
-
iconDownloadTimeout = 10;
-
iconBlacklistNonGlobalIps = true;
-
# # 30 Day TTL
-
iconCacheTtl = 30 * 24 * 60 * 60;
-
iconCacheNegttl = 30 * 24 * 60 * 60;
-
-
# Misc Settings
-
trashAutoDeleteDays = 14;
-
};
-
environmentFile = config.age.secrets.vaultwarden-vars.path;
-
};
-
systemd.services.vaultwarden.environment.PGPASSFILE = config.age.secrets.vaultwarden-pgpass.path;
-
environment.systemPackages = with pkgs; [ vaultwarden-vault ];
-
age.secrets.vaultwarden-vars = vaultwardenSecret // {
-
file = ./secrets/vaultwarden-vars.age;
-
};
-
age.secrets.vaultwarden-pgpass = vaultwardenSecret // {
-
file = ./secrets/vaultwarden-pgpass.age;
-
};
-
}
-23
systems/x86_64-linux/marvin/services/webmentiond.nix
···
-
{ config, lib, ... }:
-
let
-
d = lib.py.data.services.webmentiond;
-
p = toString d.port;
-
in
-
{
-
virtualisation.oci-containers.containers.webmentiond = {
-
image = "zerok/webmentiond:latest";
-
volumes = [ "/var/lib/webmentiond:/data" ];
-
environmentFiles = [ config.age.secrets.webmentiond-env.path ];
-
ports = [ "${p}:${p}" ];
-
cmd = [
-
"--addr 0.0.0.0:${p}"
-
"--public-url https://${d.extUrl}"
-
"--auth-admin-emails pyrox@pyrox.dev"
-
];
-
};
-
config.age.secrets = {
-
webmentiond-env.path = ./secrets/webmentiond-env.age;
-
owner = "thehedgehog";
-
group = "misc";
-
};
-
}
-8
systems/x86_64-linux/marvin/services/zfs.nix
···
-
{
-
services.zfs = {
-
trim.enable = true;
-
autoScrub.enable = true;
-
autoScrub.pools = [ "tank" ];
-
autoSnapshot.enable = true;
-
};
-
}
-44
systems/x86_64-linux/prefect/bootloader.nix
···
-
{ pkgs, modulesPath, ... }:
-
let
-
fileSystems = {
-
btrfs = true;
-
ext4 = true;
-
vfat = true;
-
zfs = true;
-
};
-
in
-
{
-
imports = [ (modulesPath + "/profiles/qemu-guest.nix") ];
-
boot = {
-
zfs.devNodes = "/dev/";
-
loader = {
-
grub.device = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_21170924";
-
grub.enable = true;
-
};
-
initrd = {
-
availableKernelModules = [
-
"ata_piix"
-
"uhci_hcd"
-
"xen_blkfront"
-
"ahci"
-
"xhci_pci"
-
"virtio_pci"
-
"sd_mod"
-
"sr_mod"
-
];
-
kernelModules = [ "nvme" ];
-
supportedFilesystems = fileSystems;
-
};
-
supportedFilesystems = fileSystems;
-
kernelPackages = pkgs.linuxPackages_6_1;
-
kernel.sysctl = {
-
"net.ipv4.ip_forward" = 1;
-
"net.ipv6.conf.all.forwarding" = 1;
-
"net.ipv4.conf.default.rp_filter" = 0;
-
"net.ipv4.conf.all.rp_filter" = 0;
-
};
-
};
-
services.udev.extraRules = ''
-
ACTION=="add|change", KERNEL=="sd[a-z]*[0-9]*|mmcblk[0-9]*p[0-9]*|nvme[0-9]*n[0-9]*p[0-9]*", ENV{ID_FS_TYPE}=="zfs_member", ATTR{../queue/scheduler}="none"
-
'';
-
}
-48
systems/x86_64-linux/prefect/default.nix
···
-
{ pkgs, system, ... }:
-
{
-
imports = [
-
# Machine-specific configurations.
-
./bootloader.nix
-
./firewall.nix
-
./networking.nix
-
./hardware.nix
-
./packages.nix
-
-
# DN42 Services
-
./dn42/default.nix
-
-
# Running Services
-
# ./services/acme.nix
-
./services/blog-update.nix
-
./services/caddy.nix
-
# ./services/dn42-peerfinder.nix
-
./services/fail2ban.nix
-
# ./services/headscale.nix
-
./services/mailserver
-
# ./services/netdata.nix
-
./services/nginx
-
./services/prometheus.nix
-
./services/secrets.nix
-
./services/tailscale.nix
-
# ./services/zerotier.nix
-
];
-
nixpkgs.hostPlatform.system = system;
-
fileSystems = {
-
"/" = {
-
fsType = "ext4";
-
device = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_21170924-part1";
-
};
-
};
-
-
programs.fish.enable = true;
-
programs.fish.interactiveShellInit = ''
-
${pkgs.direnv}/bin/direnv hook fish | source
-
'';
-
py = {
-
users.default.enable = true;
-
programs = {
-
fish.enable = true;
-
neovim.enable = true;
-
};
-
};
-
}
-109
systems/x86_64-linux/prefect/dn42/bgp.nix
···
-
_: {
-
sessions = [
-
# Chrismoos
-
{
-
multi = true;
-
multihop = false;
-
gracefulRestart = true;
-
name = "chrismoos";
-
neigh = "fe80::1588%wg42_chris";
-
as = "4242421588";
-
link = "1";
-
}
-
# Kioubit
-
{
-
multi = true;
-
multihop = false;
-
gracefulRestart = true;
-
name = "kioubit";
-
neigh = "fe80::ade0%wg42_kioubit";
-
as = "4242423914";
-
link = "3";
-
}
-
# IEDON
-
{
-
multi = true;
-
multihop = false;
-
gracefulRestart = true;
-
name = "ideon";
-
neigh = "fe80::2189:e8%wg42_iedon";
-
as = "4242422189";
-
link = "5";
-
}
-
# SUNNET
-
{
-
multi = true;
-
multihop = false;
-
gracefulRestart = true;
-
name = "sunnet";
-
neigh = "fe80::3088:194%wg42_sunnet";
-
as = "4242423088";
-
link = "3";
-
}
-
# C4TG1RL5
-
{
-
multi = true;
-
multihop = false;
-
gracefulRestart = true;
-
name = "c4tg1rl5";
-
neigh = "fe80::4242%wg42_catgirls";
-
as = "4242421411";
-
link = "6";
-
}
-
# Potat0
-
{
-
multi = true;
-
multihop = false;
-
gracefulRestart = true;
-
name = "potato";
-
neigh = "fe80::1816%wg42_potato";
-
as = "4242421816";
-
link = "2";
-
}
-
# Uffsalot-v6
-
{
-
multi = false;
-
v4 = false;
-
v6 = true;
-
multihop = false;
-
gracefulRestart = true;
-
name = "uffsalot_v6";
-
neigh = "fe80::780%wg42_uffsalot";
-
as = "4242420780";
-
link = "5";
-
}
-
# Uffsalot-v6
-
{
-
multi = false;
-
v4 = true;
-
v6 = false;
-
multihop = false;
-
gracefulRestart = true;
-
name = "uffsalot_v4";
-
neigh = "172.20.191.129";
-
as = "4242420780";
-
link = "5";
-
}
-
# Bandura
-
{
-
multi = true;
-
multihop = false;
-
gracefulRestart = true;
-
name = "bandura";
-
neigh = "fe80::2926%wg42_bandura";
-
as = "4242422923";
-
link = "4";
-
}
-
# Bluemedia
-
{
-
multi = true;
-
multihop = false;
-
gracefulRestart = true;
-
name = "bluemedia";
-
neigh = "fe80::42:3343:20:1%wg42_bluemedia";
-
as = "4242423343";
-
link = "5";
-
}
-
];
-
extraConfig = "";
-
}
-315
systems/x86_64-linux/prefect/dn42/bird.conf
···
-
log stderr all;
-
debug protocols all;
-
timeformat protocol iso long;
-
################################################
-
# Variable header #
-
################################################
-
-
define OWNAS = 4242422459;
-
define OWNIP = 172.20.43.96;
-
define OWNIPv6 = fd21:1500:66b0::1;
-
define OWNNET = 172.20.43.96/27;
-
define OWNNETv6 = fd21:1500:66b0::/48;
-
define OWNNETSET = [172.20.43.96/29+];
-
define OWNNETSETv6 = [fd21:1500:66b0::/48+];
-
define DN42_REGION = 42;
-
-
################################################
-
# Header end #
-
################################################
-
-
router id OWNIP;
-
-
protocol device {
-
scan time 10;
-
}
-
-
/*
-
* Utility functions
-
*/
-
-
function is_self_net() {
-
return net ~ OWNNETSET;
-
}
-
-
function is_self_net_v6() {
-
return net ~ OWNNETSETv6;
-
}
-
-
function is_valid_network() {
-
return net ~ [
-
172.20.0.0/14{21,29}, # dn42
-
172.20.0.0/24{28,32}, # dn42 Anycast
-
172.21.0.0/24{28,32}, # dn42 Anycast
-
172.22.0.0/24{28,32}, # dn42 Anycast
-
172.23.0.0/24{28,32}, # dn42 Anycast
-
172.31.0.0/16+, # ChaosVPN
-
10.100.0.0/14+, # ChaosVPN
-
10.127.0.0/16{16,32}, # neonetwork
-
10.0.0.0/8{15,24} # Freifunk.net
-
];
-
}
-
-
roa4 table dn42_roa;
-
roa6 table dn42_roa_v6;
-
-
protocol static {
-
roa4 { table dn42_roa; };
-
include "/etc/bird/roa_dn42.conf";
-
};
-
-
protocol static {
-
roa6 { table dn42_roa_v6; };
-
include "/etc/bird/roa_dn42_v6.conf";
-
};
-
-
function is_valid_network_v6() {
-
return net ~ [
-
fd00::/8{44,64} # ULA address space as per RFC 4193
-
];
-
}
-
-
protocol kernel {
-
scan time 20;
-
-
ipv6 {
-
import none;
-
export filter {
-
if source = RTS_STATIC then reject;
-
krt_prefsrc = OWNIPv6;
-
accept;
-
};
-
};
-
};
-
-
protocol kernel {
-
scan time 20;
-
ipv4 {
-
import none;
-
export filter {
-
if source = RTS_STATIC then reject;
-
krt_prefsrc = OWNIP;
-
accept;
-
};
-
};
-
}
-
-
protocol static {
-
route OWNNET reject;
-
-
ipv4 {
-
import all;
-
export none;
-
};
-
}
-
-
protocol static {
-
route OWNNETv6 reject;
-
-
ipv6 {
-
import all;
-
export none;
-
};
-
}
-
-
template bgp dnpeers {
-
local as OWNAS;
-
path metric 1;
-
}
-
-
protocol ospf v3 {
-
ipv4 {
-
export filter {
-
if source = RTS_STATIC || source = RTS_BGP then reject;
-
accept;
-
};
-
};
-
-
area 0 {
-
interface "lo" {
-
stub;
-
};
-
-
interface "ospf_*"{
-
type pointopoint;
-
};
-
};
-
}
-
-
protocol ospf v3 {
-
ipv6 {
-
export filter {
-
if source = RTS_STATIC || source = RTS_BGP then reject;
-
accept;
-
};
-
};
-
-
area 0 {
-
interface "lo" {
-
stub;
-
};
-
-
interface "ospf_*" {
-
type pointopoint;
-
};
-
-
};
-
}
-
-
-
function update_latency(int link_latency) {
-
bgp_community.add((64511, link_latency));
-
if (64511, 9) ~ bgp_community then { bgp_community.delete([(64511, 1..8)]); return 9; }
-
else if (64511, 8) ~ bgp_community then { bgp_community.delete([(64511, 1..7)]); return 8; }
-
else if (64511, 7) ~ bgp_community then { bgp_community.delete([(64511, 1..6)]); return 7; }
-
else if (64511, 6) ~ bgp_community then { bgp_community.delete([(64511, 1..5)]); return 6; }
-
else if (64511, 5) ~ bgp_community then { bgp_community.delete([(64511, 1..4)]); return 5; }
-
else if (64511, 4) ~ bgp_community then { bgp_community.delete([(64511, 1..3)]); return 4; }
-
else if (64511, 3) ~ bgp_community then { bgp_community.delete([(64511, 1..2)]); return 3; }
-
else if (64511, 2) ~ bgp_community then { bgp_community.delete([(64511, 1..1)]); return 2; }
-
else return 1;
-
}
-
-
function update_bandwidth(int link_bandwidth) {
-
bgp_community.add((64511, link_bandwidth));
-
if (64511, 21) ~ bgp_community then { bgp_community.delete([(64511, 22..29)]); return 21; }
-
else if (64511, 22) ~ bgp_community then { bgp_community.delete([(64511, 23..29)]); return 22; }
-
else if (64511, 23) ~ bgp_community then { bgp_community.delete([(64511, 24..29)]); return 23; }
-
else if (64511, 24) ~ bgp_community then { bgp_community.delete([(64511, 25..29)]); return 24; }
-
else if (64511, 25) ~ bgp_community then { bgp_community.delete([(64511, 26..29)]); return 25; }
-
else if (64511, 26) ~ bgp_community then { bgp_community.delete([(64511, 27..29)]); return 26; }
-
else if (64511, 27) ~ bgp_community then { bgp_community.delete([(64511, 28..29)]); return 27; }
-
else if (64511, 28) ~ bgp_community then { bgp_community.delete([(64511, 29..29)]); return 28; }
-
else return 29;
-
}
-
-
function update_crypto(int link_crypto) {
-
bgp_community.add((64511, link_crypto));
-
if (64511, 31) ~ bgp_community then { bgp_community.delete([(64511, 32..34)]); return 31; }
-
else if (64511, 32) ~ bgp_community then { bgp_community.delete([(64511, 33..34)]); return 32; }
-
else if (64511, 33) ~ bgp_community then { bgp_community.delete([(64511, 34..34)]); return 33; }
-
else return 34;
-
}
-
-
function get_region() {
-
if (64511, 41) ~ bgp_community then { return 41; }
-
else if (64511, 42) ~ bgp_community then { return 42; }
-
else if (64511, 43) ~ bgp_community then { return 43; }
-
else if (64511, 44) ~ bgp_community then { return 44; }
-
else if (64511, 45) ~ bgp_community then { return 45; }
-
else if (64511, 46) ~ bgp_community then { return 46; }
-
else if (64511, 47) ~ bgp_community then { return 47; }
-
else if (64511, 48) ~ bgp_community then { return 48; }
-
else if (64511, 49) ~ bgp_community then { return 49; }
-
else if (64511, 50) ~ bgp_community then { return 50; }
-
else if (64511, 51) ~ bgp_community then { return 51; }
-
else if (64511, 52) ~ bgp_community then { return 52; }
-
else if (64511, 53) ~ bgp_community then { return 53; }
-
else return DN42_REGION;
-
}
-
-
-
function calculate_local_pref(int dn42_latency)
-
int pref;
-
{
-
pref = 100;
-
if (is_self_net() || is_self_net_v6()) then {
-
pref = 2000;
-
}
-
else if (bgp_path.len = 1) then {
-
pref = 1000;
-
}
-
else if (DN42_REGION = get_region()) then {
-
pref= 500;
-
}
-
else {
-
if (DN42_REGION > get_region()) then {
-
pref = 500 - ((DN42_REGION - get_region()) * 10);
-
}
-
else {
-
pref = 500 - ((get_region() - DN42_REGION) * 10);
-
}
-
}
-
pref = pref - 10*dn42_latency - 10* bgp_path.len;
-
if pref > 2000 then {
-
pref = 10;
-
}
-
return pref;
-
}
-
-
function update_flags(int link_latency; int link_bandwidth; int link_crypto)
-
int dn42_latency;
-
int dn42_bandwidth;
-
int dn42_crypto;
-
{
-
dn42_latency = update_latency(link_latency);
-
dn42_bandwidth = update_bandwidth(link_bandwidth) - 20;
-
dn42_crypto = update_crypto(link_crypto) - 30;
-
if dn42_bandwidth > 5 then dn42_bandwidth = 5;
-
bgp_local_pref = calculate_local_pref(dn42_latency);
-
return true;
-
}
-
-
-
function dn42_import_filter(int link_latency; int link_bandwidth; int link_crypto) {
-
if (is_valid_network() && !is_self_net()) || (is_valid_network_v6() && !is_self_net_v6()) then {
-
if roa_check(dn42_roa, net, bgp_path.last) != ROA_VALID && roa_check(dn42_roa_v6, net, bgp_path.last) != ROA_VALID then {
-
print "[dn42] Import : ROA check failed for ", net, " ASN ", bgp_path.last, " on ", proto;
-
reject;
-
}
-
update_flags(link_latency, link_bandwidth, link_crypto);
-
if (65535, 666) ~ bgp_community then dest = RTD_BLACKHOLE;
-
accept;
-
}
-
print "[dn42] Import : Invalid Network for ", net, " ASN ", bgp_path.last, " on ", proto;
-
reject;
-
}
-
-
function dn42_export_filter(int link_latency; int link_bandwith; int link_crypto) {
-
if is_valid_network() || is_valid_network_v6() then {
-
# if roa_check(dn42_roa, net, bgp_path.last) != ROA_VALID && roa_check(dn42_roa_v6, net, bgp_path.last) != ROA_VALID then {
-
# print "[dn42] Export : ROA check failed for ", net, " ASN ", bgp_path.last, " on ", proto;
-
# reject;
-
# }
-
if source = RTS_STATIC then bgp_community.add((64511, DN42_REGION));
-
update_flags(link_latency, link_bandwith, link_crypto);
-
accept;
-
}
-
reject;
-
}
-
-
protocol bgp route_collector from dnpeers {
-
neighbor fd42:4242:2601:ac12::1 as 4242422602;
-
multihop;
-
ipv4 {
-
# export all available paths to the collector
-
add paths tx;
-
-
# import/export filters
-
import none;
-
export filter {
-
# export all valid routes
-
if ( is_valid_network() && source ~ [ RTS_STATIC, RTS_BGP ] )
-
then {
-
accept;
-
}
-
reject;
-
};
-
};
-
-
ipv6 {
-
# export all available paths to the collector
-
add paths tx;
-
-
# import/export filters
-
import none;
-
export filter {
-
# export all valid routes
-
if ( is_valid_network_v6() && source ~ [ RTS_STATIC, RTS_BGP ] )
-
then {
-
accept;
-
}
-
reject;
-
};
-
};
-
}
-31
systems/x86_64-linux/prefect/dn42/default.nix
···
-
{ pkgs, ... }:
-
{
-
imports = [
-
./services.nix
-
./wireguard.nix
-
];
-
networking.interfaces.lo = {
-
ipv4.addresses = [
-
{
-
address = "172.20.43.96";
-
prefixLength = 32;
-
}
-
];
-
ipv6.addresses = [
-
{
-
address = "fd21:1500:66b0::1";
-
prefixLength = 128;
-
}
-
{
-
address = "fe80::1";
-
prefixLength = 128;
-
}
-
];
-
};
-
environment.systemPackages = with pkgs; [
-
dnsutils
-
mtr
-
tcpdump
-
wireguard-tools
-
];
-
}
-95
systems/x86_64-linux/prefect/dn42/services.nix
···
-
{ pkgs, lib, ... }:
-
let
-
script = pkgs.writeShellScriptBin "update-roa" ''
-
mkdir -p /etc/bird/
-
${pkgs.curl}/bin/curl -sfSLR {-o,-z}/etc/bird/roa_dn42_v6.conf https://dn42.burble.com/roa/dn42_roa_bird2_6.conf
-
${pkgs.curl}/bin/curl -sfSLR {-o,-z}/etc/bird/roa_dn42.conf https://dn42.burble.com/roa/dn42_roa_bird2_4.conf
-
${pkgs.bird2}/bin/birdc c
-
${pkgs.bird2}/bin/birdc reload in all
-
'';
-
bgp = import ./bgp.nix { };
-
in
-
{
-
systemd = {
-
timers.dn42-roa = {
-
description = "Trigger a ROA table update";
-
-
timerConfig = {
-
OnBootSec = "5m";
-
OnUnitInactiveSec = "1h";
-
Unit = "dn42-roa.service";
-
};
-
-
wantedBy = [ "timers.target" ];
-
before = [ "bird.service" ];
-
};
-
services = {
-
dn42-roa = {
-
after = [ "network.target" ];
-
description = "DN42 ROA Updated";
-
unitConfig = {
-
Type = "one-shot";
-
};
-
serviceConfig = {
-
ExecStart = "${script}/bin/update-roa";
-
};
-
};
-
};
-
services.bird-lg-proxy.serviceConfig.User = lib.mkForce "bird2";
-
services.bird-lg-proxy.serviceConfig.Group = lib.mkForce "bird2";
-
};
-
-
services = {
-
bird-lg = {
-
proxy = {
-
enable = true;
-
listenAddress = "0.0.0.0:8000";
-
birdSocket = "/var/run/bird/bird.ctl";
-
# allowedIPs = ["0.0.0.0/0"];
-
};
-
frontend = {
-
enable = true;
-
domain = "thehedgehog.me";
-
dnsInterface = "asn.lantian.dn42";
-
listenAddress = "0.0.0.0:6920";
-
netSpecificMode = "dn42";
-
# protocolFilter = ["bgp" "ospf" "static"];
-
proxyPort = 8000;
-
servers = [ "dn42" ];
-
whois = "whois.burble.dn42";
-
# titleBrand = "THEHEDGEHOG LG";
-
# navbar.brand = "THEHEDGEHOG LG";
-
};
-
};
-
-
bird = {
-
enable = true;
-
package = pkgs.bird2;
-
checkConfig = false;
-
config =
-
builtins.readFile ./bird.conf
-
+ lib.concatStrings (
-
builtins.map (
-
x:
-
"\n protocol bgp ${x.name} from dnpeers {\n ${
-
if x.multihop then "multihop;" else ""
-
}\n ${
-
if x.gracefulRestart then "graceful restart on;" else ""
-
}\n neighbor ${x.neigh} as ${x.as};\n ${
-
if x.multi || x.v4 then
-
"\n ipv4 {\n extended next hop on;\n import where dn42_import_filter(${x.link},25,34);\n export where dn42_export_filter(${x.link},25,34);\n import keep filtered;\n };\n "
-
else
-
""
-
}\n ${
-
if x.multi || x.v6 then
-
"\n ipv6 {\n extended next hop on;\n import where dn42_import_filter(${x.link},25,34);\n export where dn42_export_filter(${x.link},25,34);\n import keep filtered;\n };\n "
-
else
-
""
-
}\n }\n "
-
) bgp.sessions
-
)
-
+ bgp.extraConfig;
-
};
-
};
-
users.users.thehedgehog.extraGroups = [ "bird2" ];
-
}
-86
systems/x86_64-linux/prefect/dn42/tunnels.nix
···
-
{ tunnel, ... }:
-
let
-
# deadnix: skip
-
defaultPubKey = "e6kp9sca4XIzncKa9GEQwyOnMjje299Xg9ZdgXWMwHg=";
-
defaultPrivKeyFile = "/run/agenix/dn42-privkey";
-
defaultLocalIPv4 = "172.20.43.96";
-
in
-
{
-
wg42_chris =
-
# Ports 485-486 available
-
-
tunnel 487 defaultPrivKeyFile "itmJ4Z8V1aNN368P6kMzuQM+GdzWbBKZjJiXrgSeGlw=" defaultLocalIPv4
-
"fe80::100"
-
"us-qas01.dn42.tech9.io:52322"
-
"wg42_chris"
-
"172.20.16.143"
-
"fe80::1588";
-
-
wg42_kioubit =
-
tunnel 488 defaultPrivKeyFile "6Cylr9h1xFduAO+5nyXhFI1XJ0+Sw9jCpCDvcqErF1s=" defaultLocalIPv4
-
"fe80::3"
-
"us2.g-load.eu:22459"
-
"wg42_kioubit"
-
"172.20.53.98"
-
"fe80::ade0";
-
-
# Ports 489-490 available
-
-
wg42_iedon =
-
tunnel 491 defaultPrivKeyFile "Sz0UhewjDk2yRKI0QL9rB+5daWpXFVlbbz9cLfVVLn4=" defaultLocalIPv4
-
"fe80::6"
-
"us-sjc.dn42.kuu.moe:35470"
-
"wg42_iedon"
-
"172.23.91.117"
-
"fe80::2189:e8";
-
-
wg42_sunnet =
-
tunnel 492 defaultPrivKeyFile "wAI2D+0GeBnFUqm3xZsfvVlfGQ5iDWI/BykEBbkc62c=" defaultLocalIPv4
-
"fe80::abcd"
-
"nyc1-us.dn42.6700.cc:22459"
-
"wg42_sunnet"
-
"172.21.100.194"
-
"fe80::3088:194";
-
-
wg42_catgirls =
-
tunnel 493 defaultPrivKeyFile "jo8eAfY8LeA4FAEJ4laYYMNkMd4z3oO/zN5DN0Mo+RQ=" defaultLocalIPv4
-
"fe80::7"
-
"karx.xyz:22459"
-
"wg42_catgirls"
-
""
-
"fe80::4242";
-
-
# Port 494 Available
-
-
wg42_potato =
-
tunnel 495 defaultPrivKeyFile "LUwqKS6QrCPv510Pwt1eAIiHACYDsbMjrkrbGTJfviU=" defaultLocalIPv4
-
"fe80::9"
-
"us1.dn42.potat0.cc:22459"
-
"wg42_potato"
-
""
-
"fe80::1816";
-
-
wg42_uffsalot =
-
tunnel 496 defaultPrivKeyFile "7V65FxvD9AQetyUr0qSiu+ik8samB4Atrw2ekvC0xQM=" defaultLocalIPv4
-
"fe80::10"
-
"dn42-de-fra4.brand-web.net:42459"
-
"wg42_uffsalot"
-
"172.20.191.129"
-
"fe80::780";
-
-
wg42_bandura =
-
tunnel 497 defaultPrivKeyFile "xPW1/cWYDkk/IAss1GbdwVMW7fzKtyHA+qrfCriOB2k=" defaultLocalIPv4
-
"fe80::11"
-
"aurora.mk16.de:52459"
-
"wg42_bandura"
-
""
-
"fe80::2926";
-
-
wg42_bluemedia =
-
tunnel 498 defaultPrivKeyFile "7HNg2+uMI2WfntN+WlMnlTDG6xra/Dusee82cuXWMBY=" defaultLocalIPv4
-
"fe80::12"
-
"de-fra01.dn42.bluemedia.dev:22459"
-
"wg42_bluemedia"
-
"172.22.167.82"
-
"fe80::42:3343:20:1";
-
}
-59
systems/x86_64-linux/prefect/dn42/wireguard.nix
···
-
{ pkgs, lib, ... }:
-
let
-
defaultLocalIPv4 = "172.20.43.96/32";
-
defaultLocalIPv6 = "fe80::1/64";
-
privKeyFile = "/run/agenix/dn42-privkey";
-
# deadnix: skip
-
defaultPubKey = "e6kp9sca4XIzncKa9GEQwyOnMjje299Xg9ZdgXWMwHg=";
-
in
-
{
-
environment.systemPackages = [ pkgs.wireguard-tools ];
-
-
networking.wireguard.interfaces = import ./tunnels.nix rec {
-
customTunnel =
-
listenPort: privKeyFile: peerPubKey: endpoint: name: peerIPv4: peerIPv6: localIPv4: localIPv6: isOspf: {
-
inherit listenPort;
-
privateKeyFile = privKeyFile;
-
allowedIPsAsRoutes = false;
-
peers = [
-
{
-
inherit endpoint;
-
publicKey = peerPubKey;
-
allowedIPs = [
-
"0.0.0.0/0"
-
"::/0"
-
];
-
dynamicEndpointRefreshSeconds = 5;
-
persistentKeepalive = 15;
-
}
-
];
-
postSetup =
-
''
-
${
-
if peerIPv4 != "" then
-
"${pkgs.iproute2}/bin/ip addr add ${localIPv4} peer ${peerIPv4} dev ${name}"
-
else
-
""
-
}
-
${
-
if peerIPv6 != "" then
-
"${pkgs.iproute2}/bin/ip -6 addr add ${localIPv6} peer ${peerIPv6} dev ${name}"
-
else
-
""
-
}
-
''
-
+ lib.optionalString isOspf "${pkgs.iproute2}/bin/ip -6 addr add ${defaultLocalIPv6} dev ${name}";
-
};
-
# deadnix: skip
-
tunnel =
-
listenPort: privKey: peerPubKey: localIPv4: localIPv6: endpoint: name: peerIPv4: peerIPv6:
-
customTunnel listenPort privKeyFile peerPubKey endpoint name peerIPv4 peerIPv6 localIPv4 localIPv6
-
false;
-
# deadnix: skip
-
ospf =
-
listenPort: privKey: peerPubKey: endpoint: name: peerIPv4: peerIPv6: ULAIPv6:
-
customTunnel listenPort privKeyFile peerPubKey endpoint name peerIPv4 peerIPv6 defaultLocalIPv4
-
ULAIPv6
-
true;
-
};
-
}
-56
systems/x86_64-linux/prefect/firewall.nix
···
-
{
-
# Enable using nftables instead of iptables
-
networking.nftables.enable = true;
-
networking.firewall = {
-
enable = true;
-
allowedTCPPorts = [
-
80
-
143
-
179
-
389
-
443
-
465
-
587
-
636
-
993
-
4130
-
6900
-
8000
-
];
-
allowedUDPPorts = [
-
636
-
4367
-
6900
-
34197
-
];
-
allowedUDPPortRanges = [
-
{
-
from = 480;
-
to = 510;
-
}
-
];
-
trustedInterfaces = [
-
"tailscale0"
-
"wg0"
-
-
# DN42 Interfaces
-
"wg42_bandura"
-
"wg42_bluemedia"
-
"wg42_catgirls"
-
"wg42_chris"
-
"wg42_iedon"
-
"wg42_kioubit"
-
"wg42_liki"
-
"wg42_lutoma"
-
"wg42_potato"
-
"wg42_sunnet"
-
"wg42_uffsalot"
-
"wg42_usman"
-
];
-
extraForwardRules = ''
-
meta iifname "wg42_*" meta oifname "wg42_*" accept
-
meta iifname tailscale0 meta oifname "wg42_*" accept
-
meta iifname "wg42_*" meta oifname tailscale0 tcp dport 22 accept
-
'';
-
};
-
}
-1
systems/x86_64-linux/prefect/hardware.nix
···
-
{ zramSwap.enable = true; }
-35
systems/x86_64-linux/prefect/networking.nix
···
-
{ lib, ... }:
-
{
-
networking = {
-
hostName = "prefect";
-
hostId = "496e5e96";
-
nameservers = lib.mkForce [
-
"172.20.0.53"
-
"172.23.0.53"
-
"fd42:d42:d42:53::1"
-
"fd42:d42:d42:54::1"
-
"2a01:4ff:ff00::add:2"
-
"2a01:4ff:ff00::add:1"
-
"185.12.64.1"
-
"185.12.64.2"
-
"100.123.15.72"
-
];
-
resolvconf.enable = false;
-
resolvconf.extraConfig = ''
-
name_servers="172.20.0.53 172.23.0.53 fd42:d42:d42:53::1 fd42:d42:d42:54::1 2a01:4ff:ff00::add:2 2a01:4ff:ff00::add:1 185.12.64.1 185.12.64.2 100.64.0.3 45.11.45.11"
-
# name_servers="100.64.0.3"
-
'';
-
interfaces.enp1s0 = {
-
ipv6.addresses = [
-
{
-
address = "2a01:4ff:f0:98bf::1";
-
prefixLength = 64;
-
}
-
];
-
};
-
defaultGateway6 = {
-
address = "fe80::1";
-
interface = "enp1s0";
-
};
-
};
-
}
-4
systems/x86_64-linux/prefect/packages.nix
···
-
{ pkgs, ... }:
-
{
-
environment.systemPackages = with pkgs; [ direnv ];
-
}
systems/x86_64-linux/prefect/secrets/acme-creds.age

This is a binary file and will not be displayed.

-22
systems/x86_64-linux/prefect/secrets/dn42-peerfinder-uuid.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 LcWOqQ lCXo2TQBEAvr7KhmVvvbwjN83hnL+5UcpStdcjqv60g
-
nDAEHj5Sjvm3OKeu/sGKp+/2ev9xRzNt7nKEQF4mXKc
-
-> ssh-ed25519 ihSg8g a5yUPLIjgg66GHD2e786WRLBw4WM/uS9sgNpfB12h3A
-
z9i6/l6PuvvpectHTX8Pukk32IWs1fxW9PeEsKwJi6o
-
-> ssh-rsa fFaiTA
-
DQCJr2/nQoGFk0D/0V6BF8n+q1l8EQoxPIxW0UpiGMaXo4XyquW7ml+NReZLZlbX
-
Mn6YZ34OVX5G9iyopbFxwrXlKynFkVMOHBSdZLUMA0jcACB8NjyXOd6Xul47mgXO
-
gfPnDctyz5koORMkBDIXVq0nFz/JcjtoZw+Dt+4xF9S5YpL85c1c0mNBk11KZ5lk
-
+m1fQYeH9VvVGd85f5w3ar8boKOr9bzWemBezlA1kYWuepvNj02TmM7BTidujvSW
-
i3aaJz9x0I8YYP8A97sUiHqoOile9iEwgxmR+jIbAayGoA/psHuWhoZEc6vCpmO1
-
J/EUc3XVeNi65XsTNHnp9Am+R6v0oHELy7ZTb6ZmFvcI+YiCOK9Z6Uu/s9HADXdg
-
HStH8rnWprr+OOhJCKsG+sER9yeVEHxasnYp19RWiQfey/uRZ0c8pgNHl6gL/dP5
-
liGO2S1z5XutLHtano4KqMrLuhx0Q3LMwCCYqwh8Im8Ys99ybhqwsIiswcp2reO/
-
eAf5JqsMSAV2RF9FPbaje5iIjguot5b/hW3oHqyolxx4YW71paPT0XY5jxAdX8uB
-
78Ix6hfb/VuWYX9bbwWOd+m9LGWmMXlcXaq/0sP4vtyTFtwx4YUhNDgAFZS9SQN0
-
Qn86PhoH7v+u3UL8KaRqyGdtPMHBu5dSLk4rstagMww
-
-> 7{1=-grease
-
aCyD1f3xk2/qELFbODbpIM/Dc4bsllly+tqxNS2UGdGF9QKUd3q3qGZ+J/OAwo6U
-
sOXwmgGsvUWTuZKkOiq8dZAAJBMI+gm7F887iIziTM7c70nDZgM4ZJw
-
--- Deear164Z0UavR1aoVnqYOKLN1JSbzTWP0e1aAB2UyQ
-
�kv<���c��F���߶��i����-��ql�7V�+CMbm�/�*�vy���KO��t�f���H/�
-21
systems/x86_64-linux/prefect/secrets/dn42-privkey.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 LcWOqQ 2p/ECOGBMuvZJOXwJbUaGNYqscmr71TA3DkWzjjBr24
-
6PSCl0C856tR1awTfzINwvRzMiYnj22Me6rLn7/MxIg
-
-> ssh-ed25519 ihSg8g MjXixI0aAR7c9QawSq82iQhvdN3ymq/DgydGfS6Hqxs
-
LL2aqkMnudIef3LrUj64bnQNnX2OuNYU7fSwiDy9GUc
-
-> ssh-rsa fFaiTA
-
c2QK8KSL9TLDT4WtkxN/uM7Qr0IV046TvIUMH+AEuM2/6n+na1vWDMSAN0peVADE
-
e1lDmEPQZhXJJivm4QiZGIHMRqQlLIsxVIFc/x8UERrEKbZFx2ixRedjLZIggx98
-
ran0p0B5hYujepGGnEeTdN57fGOMwUm7cjt8lt+NNFxNYAPpAp9HWgNl/zEnUfIJ
-
jva09tcxel3UOo+pKXU9ABZwdEJulKQh0LWby7oIR7VSSTaazlS78jSPFtGb4usB
-
evHs3tM2bEOHmzyjhkpoP4mOpKhT17kAZW/79GyngPRFo/KzLLXMdvHP7WA/BHuk
-
Au4elgb/PPyknzq0l/Bdona0JQMLiqU7VKRhWVhd/hfk1ebryhDFUFdd3DCQIYMu
-
FZPaBPWv97C2wuCI9x0MCojrg4YZ8vg7MzIqcjoRliOSQzzbtwLbHSbqABF24kvD
-
qSu7MNzOkA268meCoKq4Zwq/7/iBx2Y7kU60QOtcF5wr8h8ItxCoIsFY4du+eGsu
-
KMlmyATiQQSlLPV0XYbVfXj+QqFUT6uaL8+pcihxf89Z18dDr0faFBJdCMzg0oQU
-
cC0Fger4mdesMCzTwwiQKDgmr4VEY8FEKVYJKEyvNmAMgQ4ffu1ayDwvCKT7J6Cl
-
MWFJd/Uu3FwQW4js06xesk6gFapRho6pX1bW3O30GAw
-
-> Y8W~90-grease
-
rMjbbRProIOJp5bL7fpF3LcUpd15dRntintI6J4wQ5UUcteGWsu/XQeHdAw
-
--- ZbmVkB97YWXL+/wk1XWkkcjFWTlppeJVKfT0f5SAhRE
-
�D�;��}�P���S��_�\�x�j�T3�Ex�?=��ē�Uo��xնPS��K#�������/�r�$�Q��s"~c
-23
systems/x86_64-linux/prefect/secrets/headscale-oidc-secret.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 LcWOqQ /qbLa3wYnzmIzStlN1bkWacoEu10eYMK+QuqiQG40yU
-
RF5tvyMowBrPbJ/GwkAEcC4CZAIJO03IxVTzXoP4UW4
-
-> ssh-ed25519 ihSg8g G0//nDlcriBk3ZD0eYSz5fLniG3QtTI+7lOVJRuSkAI
-
GIgnujrTlNpP5sKN83+jcLbKldDFRD8raGc0NFiSGGk
-
-> ssh-rsa fFaiTA
-
MTceua+C/2xtv7AhC1Z5JfNGDRQgewr7cgLI3cJ1LVZ2MvE7d8mGhrXcB5ZTj3Ew
-
+hdNloFxvIqFH9SGvwyOUuyCHdvWnBbgo/jQMSHCfIjrzWAiW//jDuYoVpQDAAkj
-
PUbIEwxsKOcxVovYXI8Km0xlJipAfYb947nmSX4fEvopqSv8CcDSMKuMarmsk28C
-
NKBzpduYZO5EtrzyxEjxF3gsM19Eak/kdwYNBqpAfSy83gm62qcXnlYOO9qyQfY+
-
lG0fRwI4bj0s9CGUuovOkqX1htPT6paAJauXfz76Z+I2+EU0mzxTj3Cbw33DXrY6
-
ygtbQcx16442q9NT6MubPPQLhneu3iTLkFjYp/tyRi3SaYJq0Xq00kvcS3Fa33yh
-
uOxSm1zRp808oamRMvjaeT5dK0dCqCH3w90er3qUQDPjr1l5PQk38QkNIDKew+V9
-
6wjIAhELdSNiiIHdzrsps9NzcuGYiq22VsIbdMP33dHRHUVfg9BTKZ+b0D9PKIeW
-
IWZP9JgZ3n1oTLEz8JA6zLoIOCNEA/UxXJQt+rOC4Iab61tM8nc78YvDU/JI3Q5y
-
cRneNiR8ajPy3JHDtf8seplSP8iOQuGUzQOjReaXRKoZAiJqOZfVAAfnWAWbtKEC
-
01YBxhcUqi5lTo+MLdfGDU+JGnkwJY2WY5JpsFRMR+I
-
-> ]Wd5-grease A8@{\ D" ip5n1A 6O$*i
-
FdMZg+d1pT6zi7iuAYoSZTh/qNszRzmWTPiuVStOAKxKCZ9s38w2BDdM8hnPywkB
-
kp/IkIP4DdcstuTjjXeA8Iq0au1HXV7lv6bhsaRxUQ
-
--- /HHMIZdum4T0wQ1w2Uxk+p2uLdohkg6sSsQ3VRWDjvo
-
��*ԏ��g�pg��h�X� ?H�� Vo
-
���;��$Q��!I@�Α��,[�@���c����Ű �߅�lܲB� NeˎY���O�����q�,�=h�n7"��>�y�[�=O�~^{�fʷa���}sV�o<�at��|]�T$�ϱ� , �w�Q
-35
systems/x86_64-linux/prefect/secrets/secrets.nix
···
-
let
-
yubi-back = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw==";
-
yubi-main = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBBsOIMMZVmleClXfqUMrnmyh8PFuyiJqHKEZ51Xy746";
-
# deadnix: skip
-
backup = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM=";
-
prefect = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP532AB5mkNvE29MkDDY8HEf8ZdktGWiI0PzLrvbmLQe";
-
in
-
{
-
imports = [ ../../common/secrets/secrets.nix ];
-
"headscale-oidc-secret.age".publicKeys = [
-
prefect
-
yubi-main
-
yubi-back
-
];
-
"dn42-privkey.age".publicKeys = [
-
prefect
-
yubi-main
-
yubi-back
-
];
-
"dn42-peerfinder-uuid.age".publicKeys = [
-
prefect
-
yubi-main
-
yubi-back
-
];
-
"wireguard-priv-key.age".publicKeys = [
-
prefect
-
yubi-main
-
yubi-back
-
];
-
"acme-creds.age".publicKeys = [
-
prefect
-
yubi-main
-
yubi-back
-
];
-
}
-22
systems/x86_64-linux/prefect/secrets/wireguard-priv-key.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 LcWOqQ g84V98MwKjOCCuR5Rtg+gkLlqFolPYg3LV39a5tZGUI
-
h/UWIu+BTynxqpNQ6/Bd/b3It/YQ62dDZE+EG939kZU
-
-> ssh-ed25519 ihSg8g X1E3eKRhjuYNxFysUvqVmYhOXTq8caTiBELvon2S6Rw
-
tp/90DAk5j3C8FC9xDLnZrFYehYr7LUgNEt1wv35uJo
-
-> ssh-rsa fFaiTA
-
vdTyDtO1BW6AqZKXqYuD2+LSrItuTQ7V621EQztUNRH5Xqnvmu+iBrWrp0N+mskj
-
CXnOvTmljRKVZeYrL7klVrMm9injKnm/RE7xXFGH0r3RACCZBAM8RBeTP+2uaY3k
-
80h7lFdGbaYr7Cll4GFrE7yu4U3ppEz64miTm9flPSqbYWhx95KErzDrqHjpX/Z2
-
DUUPElZoOROSItMhFIJrTjpvSphZl/iaQvXNN4Iyyo4/jJuTEfyjjSdJxoZFDTuA
-
A9MDAe8ntpv//fCVmf5Fl0n/Z3ZGZUiuxfLKmoNk1YiU/iZHKYjqgNvqUjcBMKdL
-
0kH0TEONYpXnJRRPZ1WdpPaAZRdAv8vDRbBImAmswKRp86JV6l1FKmiyJ+f26Szx
-
C+tUpSA99To7Qu5sd3f1FZvyO7uYxKaRXTVGz31GjaLfTVqoz//SANDTex6fbhrh
-
T6MQQpN8qA0iGzl8oIGoA4yAcvOTRyDhYFQ7Pl4e5RxfYg+LSf7aHFTcqBW3W+R/
-
8ZgV8uMVVqPHaE7ALmd/Ohwf5/ijk7fpkhcUQrZW7Phh+q1i/RwgM27C+/9Ci+Y/
-
Lld9c5brVFpr2zc4nky9SSEgn5LX3WQ+NBcI/7p2oqf10L9rXQg70nkrnc484V4I
-
H/ijJorqeqpF5APsS7PQvFaq4pM6KNEPkBJXvSmRDfM
-
-> U-grease K/ {M?A uT &Znu
-
HQXShu9SFsh/px2FbJYOujtCUFuADqncNSrabK336xrvF0DatA7g0JIdK+sL/gBE
-
OGTuNwJO6VYm0AHh9UK/3K1gCqrvge3s/E5/FoDPUkcdnw
-
--- FA4ZAcsL7emSCKvfVXZPp0lSxto1VXJxRYRVqm6jBjY
-
� ��07���ܼ`�H}Ž��k�R�������\�'m���-�Rk�]Z��"0ʎ����r�H��+�� �H�y–#
-166
systems/x86_64-linux/prefect/services/Caddyfile
···
-
{
-
email pyrox@pyrox.dev
-
}
-
thehedgehog.me {
-
redir https://pyrox.dev{uri} permanent
-
}
-
pyrox.dev {
-
route {
-
header /.well-known/matrix/* Access-Control-Allow-Origin *
-
reverse_proxy /.well-known/matrix/* http://100.123.15.72:6922
-
redir /.well-known/carddav https://cloud.pyrox.dev/.well-known/carddav temporary
-
redir /.well-known/caldav https://cloud.pyrox.dev/.well-known/caldav temporary
-
header /.well-known/openpgpkey/* Access-Control-Allow-Origin *
-
header /.well-known/openpgpkey/hu/* application/octet-stream
-
respond /.well-known/openpgpkey/*/policy 200
-
header /.well-known/fursona Content-Type application/json
-
file_server {
-
root /var/www/blog
-
hide .git
-
precompressed br gzip
-
}
-
}
-
}
-
-
www.pyrox.dev {
-
redir https://pyrox.dev{uri} permanent
-
}
-
-
# Authentik - Self-hosted OIDC and LDAP server
-
auth.pyrox.dev:443 {
-
reverse_proxy http://100.123.15.72:6908
-
}
-
auth.pyrox.dev:80 {
-
reverse_proxy http://100.123.15.72:6908
-
}
-
http://auth.pyrox.dev:389 {
-
reverse_proxy http://100.123.15.72:389
-
}
-
auth.pyrox.dev:636 {
-
reverse_proxy http://100.123.15.72:636
-
}
-
-
blog.pyrox.dev {
-
redir https://pyrox.dev{uri} permanent
-
}
-
-
# Vaultwarden - Self-Hosted Bitwarden Server
-
bw.pyrox.dev {
-
reverse_proxy 100.123.15.72:6912 {
-
header_up X-Real-IP {remote_host}
-
}
-
}
-
-
cloud.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6926
-
}
-
-
# Deemix - download music from Deezer
-
deemix.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6907
-
}
-
-
# Gitea(Forgejo) - Self-hosted Git forge
-
git.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6904
-
}
-
-
library.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6921
-
}
-
-
mail.pyrox.dev {
-
}
-
-
# Cinny: Elegant matrix client
-
# Also has Dendrite for matrix server
-
matrix.pyrox.dev {
-
@index {
-
not path /index.html
-
not path /public/*
-
not path /assets/*
-
not path /config.json
-
not path /manifest.json
-
not path /pdf.worker.min.js
-
not path /olm.wasm
-
path /*
-
}
-
handle /_matrix/* {
-
reverse_proxy http://100.123.15.72:6922
-
}
-
handle {
-
root * /var/www/cinny/dist/
-
redir /*/olm.wasm /olm.wasm
-
redir @index /index.html
-
file_server
-
}
-
}
-
-
# Jellyfin - Self-hosted media server
-
media.pyrox.dev {
-
@blocked not remote_ip 100.64.0.0/10 private_ranges
-
reverse_proxy http://100.123.15.72:8096
-
handle /metrics* {
-
respond @blocked "Access Denied" 403
-
}
-
}
-
-
mta-sts.pyrox.dev {
-
header Content-Type text/plain; charset=utf-8
-
respond /.well-known/mta-sts.txt <<END
-
version: STSv1
-
mode: enforce
-
mx: mail.pyrox.dev
-
mx:mail2.pyrox.dev
-
max_age: 2419200
-
END 200
-
}
-
-
office.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6927
-
}
-
-
# Miniflux
-
rss.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6903
-
}
-
-
# Iceshrimp
-
soc.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6923
-
}
-
-
# Grafana - stats dashboard
-
stats.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6914
-
}
-
-
# Yourmother.website - The best rick-roll URL, period
-
yourmother.website {
-
header Content-Type text/html
-
respond 200 {
-
body `<!DOCTYPE html>
-
<html>
-
<head>
-
<meta http-equiv="Refresh" content="0; url=https://youtube.com/watch?v=oHg5SJYRHA0" />
-
</head>
-
</html>`
-
}
-
}
-
-
plan.cs2a.club {
-
reverse_proxy http://100.123.15.72:6929
-
}
-
-
# OpenPGP Key
-
openpgpkey.thehedgehog.me, openpgpkey.pyrox.dev {
-
respond /.well-known/openpgpkey/{labels.1}.{labels.0}/policy 200
-
header Access-Control-Allow-Origin *
-
header /.well-known/openpgpkey/{labels.1}.{labels.0}/hu/* Content-Type application/octet-stream
-
file_server {
-
root /var/www/blog/
-
}
-
}
-
:6899 {
-
metrics /metrics
-
}
-23
systems/x86_64-linux/prefect/services/acme.nix
···
-
{ config, ... }:
-
{
-
security.acme = {
-
certs."pyrox.dev" = {
-
domain = "*.pyrox.dev";
-
};
-
defaults = {
-
# LE Production Server
-
server = "https://acme-v02.api.letsencrypt.org/directory";
-
# use EC-384 instead of the default, EC-256
-
keyType = "ec384";
-
email = "pyrox@pyrox.dev";
-
# Enable OSCP Must-Staple(see https://blog.apnic.net/2019/01/15/is-the-web-ready-for-ocsp-must-staple/ )
-
ocspMustStaple = true;
-
# For DNS Challenges, use ClouDNS(my provider)
-
dnsProvider = "cloudns";
-
# Enable DNS Propagation checks(ensure DNS records exist before requesting certs)
-
dnsPropagationCheck = true;
-
# Agenix-encrypted credentials for ClouDNS
-
credentialsFile = config.age.secrets.acme-creds.path;
-
};
-
};
-
}
-30
systems/x86_64-linux/prefect/services/blog-update.nix
···
-
{ pkgs, lib, ... }:
-
{
-
systemd.timers.blog-update = {
-
enable = true;
-
after = [ "network.target" ];
-
wantedBy = [ "multi-user.target" ];
-
description = "Blog Update Timer";
-
timerConfig = {
-
Unit = "blog-update.service";
-
OnUnitActiveSec = 300;
-
};
-
};
-
-
systemd.services.blog-update = {
-
enable = true;
-
wantedBy = [ "multi-user.target" ];
-
description = "Blog Update Service";
-
path = [
-
"${pkgs.git}"
-
];
-
serviceConfig = {
-
WorkingDirectory = "/var/www/blog";
-
User = "caddy";
-
Group = "caddy";
-
Type = "oneshot";
-
ExecStartPre = "${lib.getExe pkgs.git} fetch origin pages";
-
ExecStart = "${lib.getExe pkgs.git} reset --hard origin/pages";
-
};
-
};
-
}
-5
systems/x86_64-linux/prefect/services/blog-update.sh
···
-
node scripts/precommit.js
-
node scripts/predeploy.js
-
hugo -d out
-
cp -fvr out/ /var/www/blog/
-
exit 0
-17
systems/x86_64-linux/prefect/services/caddy.nix
···
-
{ pkgs, ... }:
-
{
-
services.caddy = {
-
enable = true;
-
package = pkgs.caddy.withPlugins {
-
plugins = [
-
"github.com/caddy-dns/desec@v0.0.0-20240526070323-822a6a2014b2"
-
"github.com/greenpau/caddy-security@v1.1.29"
-
];
-
hash = "sha256-nfBjtwqn7UOGRr5Aqy0y1u9AYhWU9TLjbdhZ9uAwtHY=";
-
};
-
configFile = ./Caddyfile;
-
adapter = "caddyfile";
-
};
-
systemd.services.caddy.serviceConfig.CapabilityBoundingSet = "CAP_NET_BIND_SERVICE";
-
systemd.services.caddy.serviceConfig.AmbientCapabilities = "CAP_NET_BIND_SERVICE";
-
}
-4
systems/x86_64-linux/prefect/services/dn42-peerfinder.nix
···
-
{ config, ... }:
-
{
-
config.py.services.dn42-pingfinder.uuidFile = config.age.secrets.dn42-peerfinder-uuid.path;
-
}
-38
systems/x86_64-linux/prefect/services/fail2ban.nix
···
-
{
-
services.fail2ban = {
-
enable = true;
-
maxretry = 5;
-
ignoreIP = [
-
"4349:3909:beef::/48"
-
"100.64.0.0/10"
-
"127.0.0.0/8"
-
"10.0.0.0/8"
-
"172.16.0.0/12"
-
"192.168.0.0/16"
-
];
-
jails = {
-
postfix = {
-
filter = "postfix";
-
settings = {
-
action = "nftables";
-
port = "143,993";
-
};
-
};
-
dovecot = {
-
filter = "dovecot";
-
settings = {
-
action = "nftables";
-
port = "25,465,587";
-
};
-
};
-
# I don't use SSHd right now, but if I do, re-enable this.
-
# sshd = {
-
# filter = "sshd";
-
# settings = {
-
# action = "nftables";
-
# port = "22";
-
# };
-
# };
-
};
-
};
-
}
-73
systems/x86_64-linux/prefect/services/headscale.nix
···
-
# Headscale is a tailscale-compatible control plane that you can use with all of the clients.
-
{
-
services.headscale = {
-
enable = true;
-
port = 6900;
-
# Set so that anything can access this. Default is localhost only, which is useless
-
address = "0.0.0.0";
-
# Server URL is the FQDN of this server
-
serverUrl = "https://vpn.thehedgehog.me:6900";
-
dns = {
-
# All domains are .hog domains internally
-
baseDomain = "hog";
-
# Enable MagicDNS
-
# See https://tailscale.com/kb/1081/magicdns/ for more details
-
magicDns = true;
-
# I inject DNS.sb as my secondary nameserver, and my adblocking server as primary.
-
nameservers = [ "45.11.45.11" ];
-
# Domains to inject, so I can type "media/" into my search bar and go to "media.main.hog"
-
# You can't tell headscale to not create a namespace, so this is the best that I can do
-
domains = [ "main.hog" ];
-
};
-
# Automatic TLS
-
tls = {
-
letsencrypt = {
-
# Set up automatic Let's Encrypt cert pulls
-
hostname = "vpn.thehedgehog.me";
-
};
-
};
-
# Disabled since if this goes down, then it's a pain to reconnect to auth
-
# OIDC configuration, so I can have my beloved SSO.
-
# openIdConnect = {
-
# # Issuer is HedgeCloud auth, my private auth server
-
# issuer = "https://auth.thehedgehog.me/application/o/hedgevpn/";
-
# # All people get assigned to the "main" namespace
-
# domainMap = {
-
# ".*" = "main";
-
# };
-
# # Set client ID for OIDC
-
# clientId = "25066b6b1e72718186f8c0dc20f7892951834b6e";
-
# # Client Secret is in this file
-
# clientSecretFile = "/run/agenix/headscale-oidc-secret";
-
# };
-
# Misc settings that aren't set in the above sections
-
settings = {
-
# Set challenge type, forwarded by Caddy
-
tls_letsencrypt_challenge_type = "HTTP-01";
-
# oidc.strip_email_domain = true;
-
# NixOS handles our updates
-
disable_check_updates = true;
-
ip_prefixes = [
-
"4349:3909:beef::/48"
-
"100.64.0.0/10"
-
];
-
derp = {
-
server = {
-
enabled = true;
-
region_id = 969;
-
region_code = "internal";
-
region_name = "Internal DERP";
-
stun_listen_addr = "0.0.0.0:6869";
-
};
-
};
-
};
-
};
-
systemd.services.headscale.serviceConfig.CapabilityBoundingSet = [
-
"CAP_CHOWN"
-
"CAP_NET_BIND_SERVICE"
-
];
-
systemd.services.headscale.serviceConfig.AmbientCapabilities = [
-
"CAP_CHOWN"
-
"CAP_NET_BIND_SERVICE"
-
];
-
}
-127
systems/x86_64-linux/prefect/services/mailserver/default.nix
···
-
{ lib, pkgs, ... }:
-
{
-
imports = [
-
./logins.nix
-
./monitoring.nix
-
./overrides.nix
-
];
-
mailserver = {
-
enable = true;
-
fqdn = "mail.pyrox.dev";
-
openFirewall = true;
-
-
# All domains this server runs email for
-
domains = [ "pyrox.dev" ];
-
-
# Enable STARTTLS
-
enableImap = true;
-
enableSubmission = true;
-
-
# Disable POP3, I don't use it and neither should you
-
enablePop3 = false;
-
enablePop3Ssl = false;
-
-
# Enable ManageSieve so that we don't need to change the config to update sieves
-
enableManageSieve = true;
-
-
# Set directories for services
-
mailDirectory = "/srv/mail/vmail";
-
sieveDirectory = "/srv/mail/sieve";
-
indexDir = "/var/lib/dovecot/indices";
-
dkimKeyDirectory = "/srv/mail/dkim";
-
-
# Set all no-reply addresses
-
rejectRecipients = [
-
"no-reply@pyrox.dev"
-
"dmarc-noreply@pyrox.dev"
-
];
-
-
# DKIM Settings
-
dkimBodyCanonicalization = "relaxed";
-
dkimHeaderCanonicalization = "relaxed";
-
dkimKeyBits = 4096;
-
dkimSelector = "mail";
-
dkimSigning = true;
-
-
# DMARC Settings
-
dmarcReporting = {
-
enable = true;
-
domain = "pyrox.dev";
-
localpart = "dmarc-noreply";
-
fromName = "PyroNet Mail DMARC Service";
-
organizationName = "PyroNet Mail";
-
};
-
-
# Mailboxes for all users
-
mailboxes = {
-
Drafts = {
-
auto = "subscribe";
-
specialUse = "Drafts";
-
};
-
Junk = {
-
auto = "subscribe";
-
specialUse = "Junk";
-
};
-
Sent = {
-
auto = "subscribe";
-
specialUse = "Sent";
-
};
-
Trash = {
-
auto = "subscribe";
-
specialUse = "Trash";
-
};
-
};
-
-
# Full-Text-Search Settings
-
fullTextSearch = {
-
enable = true;
-
autoIndex = true;
-
enforced = "body";
-
maintenance = {
-
enable = true;
-
onCalendar = "daily";
-
randomizedDelaySec = 1000;
-
};
-
memoryLimit = 2048;
-
minSize = 3;
-
};
-
-
# Certificate Settings
-
certificateScheme = "manual";
-
certificateFile = "/var/lib/mail/mail.crt";
-
keyFile = "/var/lib/mail/mail.key";
-
};
-
-
services.opendkim = {
-
user = lib.mkForce "virtualMail";
-
group = lib.mkForce "virtualMail";
-
};
-
-
# Copy mail certs every month so that they don't expire
-
systemd = {
-
timers."copy-mail-certs" = {
-
wantedBy = [ "timers.target" ];
-
timerConfig = {
-
OnBootSec = "5m";
-
OnCalendar = "monthly";
-
Unit = "copy-mail-certs.service";
-
};
-
};
-
-
services."copy-mail-certs" = {
-
script = ''
-
set -eu
-
cp -fvr /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/mail.pyrox.dev/mail.pyrox.dev.crt /var/lib/mail/mail.crt
-
chmod a+r /var/lib/mail/mail.crt
-
cp -fvr /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/mail.pyrox.dev/mail.pyrox.dev.key /var/lib/mail/mail.key
-
chmod a+r /var/lib/mail/mail.key
-
chown -hR virtualMail:virtualMail /var/lib/mail/
-
'';
-
serviceConfig = {
-
Type = "oneshot";
-
User = "root";
-
};
-
};
-
};
-
-
}
-37
systems/x86_64-linux/prefect/services/mailserver/logins.nix
···
-
{
-
mailserver.loginAccounts = {
-
"pyrox@pyrox.dev" = {
-
hashedPassword = "$2b$05$8k04quBe6adg8d1yznEp3uNYM54MOVJTwDGIWvzocQFoWbmcCvebC";
-
aliases = [
-
"pyrox"
-
"postmaster@pyrox.dev"
-
"abuse@pyrox.dev"
-
"domains@pyrox.dev"
-
];
-
};
-
"social@pyrox.dev" = {
-
hashedPassword = "$2b$05$kFDeXvSKU9oXuQXlitA7v.kkbzgCDTrm4O3Nb1kifPe7yAR7.KimO";
-
sendOnly = true;
-
};
-
"auth@pyrox.dev" = {
-
hashedPassword = "$2b$05$O049hbSwRJ5VYeAA8lLR4e6.fqVWf4PotgIUAO356j5K.OoGH5PF.";
-
sendOnly = true;
-
};
-
"vault@pyrox.dev" = {
-
hashedPassword = "$2b$05$MHo03BG3AVpBh4NE97zQ8.gTPx2sCoa6Jsw.DRxHBOBaKZ8DbfPrS";
-
sendOnly = true;
-
};
-
"library@pyrox.dev" = {
-
hashedPassword = "$2b$05$IHsSbEla8KL4gwExvFECFuuoP0ESk66K29R.vawTpbxEpuw1ahii.";
-
sendOnly = true;
-
};
-
"cloud@pyrox.dev" = {
-
hashedPassword = "$2b$05$kmbsJ2X3Y2l0KYO8jjy1SOJP29coEeKFaMqU6qvRzz/dLJp78CAk6";
-
sendOnly = true;
-
};
-
"git@pyrox.dev" = {
-
hashedPassword = "$2b$05$uZoLVdCo48rLVBFdG0.UXua8a.84w1PzmLYOpJ1qTNo25KCdQlflm";
-
sendOnly = true;
-
};
-
};
-
}
-46
systems/x86_64-linux/prefect/services/mailserver/monitoring.nix
···
-
{ config, pkgs, ... }:
-
# let
-
# cfg = config.mailserver;
-
# in
-
{
-
mailserver.monitoring = {
-
enable = true;
-
alertAddress = "pyrox@pyrox.dev";
-
config = ''
-
set daemon 120 with start delay 60
-
set mailserver
-
localhost
-
set alert ${config.mailserver.monitoring.alertAddress}
-
-
set httpd port 2812 and use address localhost
-
allow localhost
-
allow admin:obwjoawijerfoijsiwfj29jf2f2jd
-
-
check filesystem root with path /
-
if space usage > 80% then alert
-
if inode usage > 80% then alert
-
-
check system $HOST
-
if cpu usage > 95% for 10 cycles then alert
-
if memory usage > 75% for 5 cycles then alert
-
if swap usage > 20% for 10 cycles then alert
-
if loadavg (1min) > 90 for 15 cycles then alert
-
if loadavg (5min) > 80 for 10 cycles then alert
-
if loadavg (15min) > 70 for 8 cycles then alert
-
-
check process postfix with pidfile /var/lib/postfix/queue/pid/master.pid
-
start program = "${pkgs.systemd}/bin/systemctl start postfix"
-
stop program = "${pkgs.systemd}/bin/systemctl stop postfix"
-
if failed port 25 protocol smtp for 5 cycles then restart
-
-
check process dovecot with pidfile /var/run/dovecot2/master.pid
-
start program = "${pkgs.systemd}/bin/systemctl start dovecot2"
-
stop program = "${pkgs.systemd}/bin/systemctl stop dovecot2"
-
if failed host ${config.mailserver.fqdn} port 993 type tcpssl sslauto protocol imap for 5 cycles then restart
-
-
check process rspamd with matching "rspamd: main process"
-
start program = "${pkgs.systemd}/bin/systemctl start rspamd"
-
stop program = "${pkgs.systemd}/bin/systemctl stop rspamd"
-
'';
-
};
-
}
-21
systems/x86_64-linux/prefect/services/mailserver/overrides.nix
···
-
{ lib, ... }:
-
let
-
inherit (lib) mkForce;
-
tlsProtocols = ">=TLSv1.2";
-
excludeCiphers = "MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL, AES128-SHA, AES256-SHA";
-
in
-
{
-
services.postfix.config = {
-
# only support TLS 1.3/1.2
-
smtpd_tls_protocols = mkForce tlsProtocols;
-
smtp_tls_protocols = mkForce tlsProtocols;
-
smtpd_tls_mandatory_protocols = mkForce tlsProtocols;
-
smtp_tls_mandatory_protocols = mkForce tlsProtocols;
-
-
# Exclude insecure ciphers
-
smtpd_tls_mandatory_exclude_ciphers = mkForce excludeCiphers;
-
smtpd_tls_exclude_ciphers = mkForce excludeCiphers;
-
smtp_tls_mandatory_exclude_ciphers = mkForce excludeCiphers;
-
smtp_tls_exclude_ciphers = mkForce excludeCiphers;
-
};
-
}
-158
systems/x86_64-linux/prefect/services/named.conf
···
-
include "/etc/bind/rndc.key";
-
controls {
-
inet 127.0.0.1 allow {localhost;} keys {"rndc-key";};
-
};
-
-
acl cachenetworks { 127.0.0.0/24; };
-
acl dn42-dns { 172.20.129.2; 172.20.1.255; 172.22.76.110; 172.20.14.33; };
-
-
options {
-
directory "/run/named";
-
pid-file "/run/named/named.pid";
-
-
# Server Identity
-
version "420.69";
-
server-id "zaphod";
-
hostname "zaphod";
-
-
# Enable DNSSEC
-
dnssec-validation no;
-
-
# Only listen to local addresses
-
listen-on { 127.0.0.1; };
-
listen-on-v6 { ::1; };
-
allow-query { any; };
-
# disable the integrated handling of RFC1918 and non-assigned IPv6 space reverse dns
-
empty-zones-enable no;
-
validate-except {
-
# DN42 Zones
-
"dn42";
-
"20.172.in-addr.arpa";
-
"21.172.in-addr.arpa";
-
"22.172.in-addr.arpa";
-
"23.172.in-addr.arpa";
-
"10.in-addr.arpa";
-
"d.f.ip6.arpa";
-
# ChaosVPN Zones
-
"hack";
-
"31.172.in-addr.arpa";
-
"100.10.in-addr.arpa";
-
"101.10.in-addr.arpa";
-
"102.10.in-addr.arpa";
-
"103.10.in-addr.arpa";
-
-
# NeoNetwork Zones
-
"neo";
-
"127.10.in-addr.arpa";
-
"7.2.1.0.0.1.d.f.ip6.arpa";
-
};
-
-
# Recursion settings
-
recursion yes;
-
allow-recursion { any; };
-
allow-recursion-on { any; };
-
allow-query-cache { any; };
-
allow-query-cache-on { any; };
-
prefetch 10;
-
};
-
-
# DN42 Zones
-
zone "dn42" {
-
type forward;
-
forward only;
-
forwarders { 172.20.0.53; 172.23.0.53; };
-
};
-
zone "20.172.in-addr.arpa" {
-
type forward;
-
forward only;
-
forwarders { 172.20.0.53; 172.23.0.53; };
-
};
-
zone "21.172.in-addr.arpa" {
-
type forward;
-
forward only;
-
forwarders { 172.20.0.53; 172.23.0.53; };
-
};
-
zone "22.172.in-addr.arpa" {
-
type forward;
-
forward only;
-
forwarders { 172.20.0.53; 172.23.0.53; };
-
};
-
zone "23.172.in-addr.arpa" {
-
type forward;
-
forward only;
-
forwarders { 172.20.0.53; 172.23.0.53; };
-
};
-
zone "10.in-addr.arpa" {
-
type forward;
-
forward only;
-
forwarders { 172.20.0.53; 172.23.0.53; };
-
};
-
zone "d.f.ip6.arpa" {
-
type forward;
-
forward only;
-
forwarders { 172.20.0.53; 172.23.0.53; };
-
};
-
-
# ChaosVPN Zones
-
zone "hack" {
-
type forward;
-
forward only;
-
forwarders { 172.31.0.5; 172.31.255.53; };
-
};
-
zone "31.172.in-addr.arpa" {
-
type forward;
-
forward only;
-
forwarders { 172.31.0.5; 172.31.255.53; };
-
};
-
zone "100.10.in-addr.arpa" {
-
type forward;
-
forward only;
-
forwarders { 172.31.0.5; 172.31.255.53; };
-
};
-
zone "101.10.in-addr.arpa" {
-
type forward;
-
forward only;
-
forwarders { 172.31.0.5; 172.31.255.53; };
-
};
-
zone "102.10.in-addr.arpa" {
-
type forward;
-
forward only;
-
forwarders { 172.31.0.5; 172.31.255.53; };
-
};
-
zone "103.10.in-addr.arpa" {
-
type forward;
-
forward only;
-
forwarders { 172.31.0.5; 172.31.255.53; };
-
};
-
-
# NeoNetwork
-
zone "neo" {
-
type forward;
-
forward only;
-
forwarders { 10.127.255.53; };
-
};
-
zone "127.10.in-addr.arpa" {
-
type forward;
-
forward only;
-
forwarders { 10.127.255.53; };
-
};
-
zone "7.2.1.0.0.1.d.f.ip6.arpa" {
-
type forward;
-
forward only;
-
forwarders { 10.127.255.53; };
-
};
-
-
zone "crxn" {
-
type forward;
-
forward only;
-
forwarders { fd92:58b6:2b2::5353; };
-
};
-
# Fallback root zone
-
zone "." {
-
type forward;
-
forward only;
-
forwarders { 100.123.15.72; 9.9.9.9; };
-
};
-
-
-
-7
systems/x86_64-linux/prefect/services/netdata.nix
···
-
{
-
services.netdata = {
-
enable = true;
-
python.enable = true;
-
enableAnalyticsReporting = false;
-
};
-
}
-38
systems/x86_64-linux/prefect/services/nginx/default.nix
···
-
{ lib, ... }:
-
{
-
services.nginx = {
-
enable = true;
-
additionalModules = [ ];
-
recommendedOptimisation = true;
-
recommendedTlsSettings = true;
-
recommendedGzipSettings = true;
-
recommendedProxySettings = true;
-
virtualHosts = lib.mkForce { };
-
streamConfig = ''
-
server {
-
listen 34197 udp;
-
proxy_pass 100.123.15.72:34197;
-
proxy_responses 0;
-
}
-
'';
-
appendHttpConfig = ''
-
# Add X-Frame-Options to prevent clickjacking
-
add_header X-Frame-Options SAMEORIGIN;
-
-
# Prevent mime type sniffing
-
add_header X-Content-Type-Options nosniff;
-
-
# Never send Referer header
-
add_header Referrer-Policy no-referrer;
-
-
# Require CORS or CORP headers for cross-origin resources
-
add_header Cross-Origin-Embedder-Policy require-corp;
-
-
# Keep our own Browsing Context Group
-
add_header Cross-Origin-Opener-Policy same-origin;
-
-
# Sites that require CORP will not load my assets
-
add_header Cross-Origin-Resource-Policy same-origin;
-
'';
-
};
-
}
-1
systems/x86_64-linux/prefect/services/nginx/pyrox.dev.nix
···
-
{ }
-37
systems/x86_64-linux/prefect/services/prometheus.nix
···
-
{ config, ... }:
-
{
-
services.prometheus = {
-
enable = true;
-
port = 6999;
-
exporters = {
-
node = {
-
enable = true;
-
enabledCollectors = [ "systemd" ];
-
port = 6998;
-
};
-
bird = {
-
enable = true;
-
};
-
};
-
scrapeConfigs = [
-
{
-
job_name = "prefect";
-
static_configs = [
-
{ targets = [ "127.0.0.1:${toString config.services.prometheus.exporters.node.port}" ]; }
-
];
-
}
-
{
-
job_name = "caddy";
-
static_configs = [ { targets = [ "127.0.0.1:6899" ]; } ];
-
}
-
{
-
job_name = "bird";
-
static_configs = [ { targets = [ "127.0.0.1:9324" ]; } ];
-
}
-
{
-
job_name = "prometheus";
-
static_configs = [ { targets = [ "127.0.0.1:6999" ]; } ];
-
}
-
];
-
};
-
}
-26
systems/x86_64-linux/prefect/services/secrets.nix
···
-
{
-
config.age.secrets = {
-
# headscale-oidc-secret = {
-
# file = ../secrets/headscale-oidc-secret.age;
-
# path = "/run/agenix/headscale-oidc-secret";
-
# owner = "headscale";
-
# group = "headscale";
-
# };
-
dn42-privkey = {
-
file = ../secrets/dn42-privkey.age;
-
path = "/run/agenix/dn42-privkey";
-
};
-
dn42-peerfinder-uuid = {
-
file = ../secrets/dn42-peerfinder-uuid.age;
-
path = "/run/agenix/dn42-peerfinder-uuid";
-
};
-
wireguard-priv-key = {
-
file = ../secrets/wireguard-priv-key.age;
-
path = "/run/agenix/wireguard-priv-key";
-
};
-
acme-creds = {
-
file = ../secrets/acme-creds.age;
-
group = "acme";
-
};
-
};
-
}
-11
systems/x86_64-linux/prefect/services/tailscale.nix
···
-
{ config, ... }:
-
{
-
services.tailscale = {
-
enable = true;
-
};
-
networking.firewall = {
-
trustedInterfaces = [ "tailscale0" ];
-
allowedUDPPorts = [ config.services.tailscale.port ];
-
checkReversePath = "loose";
-
};
-
}
-6
systems/x86_64-linux/prefect/services/zerotier.nix
···
-
{
-
services.zerotierone = {
-
enable = true;
-
joinNetworks = [ "a84ac5c10a3b1d69" ];
-
};
-
}
-39
systems/x86_64-linux/thought/bootloader.nix
···
-
{ pkgs, modulesPath, ... }:
-
let
-
fileSystems = {
-
btrfs = true;
-
ext4 = true;
-
vfat = true;
-
};
-
in
-
{
-
imports = [ (modulesPath + "/profiles/qemu-guest.nix") ];
-
boot = {
-
loader = {
-
grub.device = "/dev/sda";
-
grub.enable = true;
-
};
-
initrd = {
-
availableKernelModules = [
-
"ata_piix"
-
"uhci_hcd"
-
"xen_blkfront"
-
"ahci"
-
"xhci_pci"
-
"virtio_pci"
-
"sd_mod"
-
"sr_mod"
-
];
-
kernelModules = [ "nvme" ];
-
supportedFilesystems = fileSystems;
-
};
-
supportedFilesystems = fileSystems;
-
kernelPackages = pkgs.linuxPackages_latest;
-
kernel.sysctl = {
-
"net.ipv4.ip_forward" = 1;
-
"net.ipv6.conf.all.forwarding" = 1;
-
"net.ipv4.conf.default.rp_filter" = 0;
-
"net.ipv4.conf.all.rp_filter" = 0;
-
};
-
};
-
}
-34
systems/x86_64-linux/thought/default.nix
···
-
{ pkgs, system, ... }:
-
{
-
imports = [
-
# Machine-specific configurations.
-
./bootloader.nix
-
./firewall.nix
-
./networking.nix
-
./hardware.nix
-
./packages.nix
-
-
# Running Services
-
./services/prometheus.nix
-
./services/tailscale.nix
-
];
-
nixpkgs.hostPlatform.system = system;
-
py = {
-
users.default.enable = true;
-
programs = {
-
fish.enable = true;
-
neovim.enable = true;
-
};
-
};
-
fileSystems = {
-
"/" = {
-
fsType = "ext4";
-
device = "/dev/sda1";
-
};
-
};
-
-
programs.fish.enable = true;
-
programs.fish.interactiveShellInit = ''
-
${pkgs.direnv}/bin/direnv hook fish | source
-
'';
-
}
-25
systems/x86_64-linux/thought/disks.nix
···
-
{
-
disko.devices.disk = {
-
main = {
-
type = "disk";
-
device = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_33656227";
-
content = {
-
type = "gpt";
-
partitions = {
-
boot = {
-
size = "1M";
-
type = "EF02";
-
};
-
root = {
-
size = "100%";
-
content = {
-
type = "filesystem";
-
format = "btrfs";
-
mountpoint = "/";
-
};
-
};
-
};
-
};
-
};
-
};
-
}
-46
systems/x86_64-linux/thought/firewall.nix
···
-
{
-
networking.firewall = {
-
enable = true;
-
allowedTCPPorts = [ 8000 ];
-
allowedUDPPorts = [ 34197 ];
-
};
-
services.ferm = {
-
enable = true;
-
config = ''
-
domain ip table filter chain INPUT proto icmp ACCEPT;
-
domain ip6 table filter chain INPUT proto (ipv6-icmp icmp) ACCEPT;
-
domain (ip ip6) table filter {
-
chain INPUT {
-
policy DROP;
-
interface lo ACCEPT;
-
interface tailscale0 ACCEPT;
-
interface wg42_+ ACCEPT;
-
interface wg0 ACCEPT;
-
proto tcp dport (22 25 53 80 143 389 443 465 587 636 993 4190 6900 8000 http https 34197) ACCEPT;
-
proto udp dport (22 25 53 480:510 636 4367 6900 8000 34197) ACCEPT;
-
proto tcp dport (179) ACCEPT;
-
# dns
-
proto (udp tcp) dport domain ACCEPT;
-
mod state state (INVALID) DROP;
-
mod state state (ESTABLISHED RELATED) ACCEPT;
-
}
-
chain OUTPUT {
-
policy ACCEPT;
-
}
-
chain FORWARD {
-
policy DROP;
-
# allow intern routing and dn42 forwarding
-
interface wg42_+ outerface wg42_+ ACCEPT;
-
interface tailscale0 outerface tailscale0 ACCEPT;
-
interface tailscale0 outerface wg42_+ ACCEPT;
-
# but dn42 -> intern only with execptions
-
interface wg42_+ outerface tailscale0 {
-
proto (ipv6-icmp icmp) ACCEPT; # Allow SSH Access from dn42 to devices behind tailscale0 Interfaces
-
proto tcp dport (ssh) ACCEPT;
-
mod state state (ESTABLISHED) ACCEPT;
-
}
-
}
-
}
-
'';
-
};
-
}
-1
systems/x86_64-linux/thought/hardware.nix
···
-
{ zramSwap.enable = true; }
-22
systems/x86_64-linux/thought/networking.nix
···
-
{ lib, ... }:
-
{
-
networking = {
-
hostName = "thought";
-
hostId = "1e22528e";
-
useDHCP = false;
-
nameservers = lib.mkForce [ ];
-
resolvconf.enable = false;
-
interfaces.enp1s0 = {
-
ipv6.addresses = [
-
{
-
address = "2a01:4ff:1f0:c98a::1";
-
prefixLength = 64;
-
}
-
];
-
};
-
defaultGateway6 = {
-
address = "fe80::1";
-
interface = "enp1s0";
-
};
-
};
-
}
-4
systems/x86_64-linux/thought/packages.nix
···
-
{ pkgs, ... }:
-
{
-
environment.systemPackages = with pkgs; [ direnv ];
-
}
-14
systems/x86_64-linux/thought/secrets/secrets.nix
···
-
let
-
# deadnix: skip
-
yubi-back = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw==";
-
# deadnix: skip
-
yubi-main = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBBsOIMMZVmleClXfqUMrnmyh8PFuyiJqHKEZ51Xy746";
-
# deadnix: skip
-
backup = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM=";
-
# deadnix: skip
-
thought = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGkJcLykggEp427h2IywoiR74Yl3N+FU6Pwx9ZFQ3vjq";
-
in
-
{
-
imports = [ ../../common/secrets/secrets.nix ];
-
# "headscale-oidc-secret.age".publicKeys = [ prefect yubi-main yubi-back ];
-
}
-37
systems/x86_64-linux/thought/services/prometheus.nix
···
-
{ config, ... }:
-
{
-
services.prometheus = {
-
enable = true;
-
port = 6999;
-
exporters = {
-
node = {
-
enable = true;
-
enabledCollectors = [ "systemd" ];
-
port = 6998;
-
};
-
bird = {
-
enable = true;
-
};
-
};
-
scrapeConfigs = [
-
{
-
job_name = "prefect";
-
static_configs = [
-
{ targets = [ "127.0.0.1:${toString config.services.prometheus.exporters.node.port}" ]; }
-
];
-
}
-
{
-
job_name = "caddy";
-
static_configs = [ { targets = [ "127.0.0.1:6899" ]; } ];
-
}
-
{
-
job_name = "bird";
-
static_configs = [ { targets = [ "127.0.0.1:9324" ]; } ];
-
}
-
{
-
job_name = "prometheus";
-
static_configs = [ { targets = [ "127.0.0.1:6999" ]; } ];
-
}
-
];
-
};
-
}
-11
systems/x86_64-linux/thought/services/tailscale.nix
···
-
{ config, ... }:
-
{
-
services.tailscale = {
-
enable = true;
-
};
-
networking.firewall = {
-
trustedInterfaces = [ "tailscale0" ];
-
allowedUDPPorts = [ config.services.tailscale.port ];
-
checkReversePath = "loose";
-
};
-
}
-45
systems/x86_64-linux/zaphod/bootloader.nix
···
-
{ pkgs, ... }:
-
let
-
fileSystems = {
-
btrfs = true;
-
ext4 = true;
-
vfat = true;
-
};
-
in
-
{
-
boot = {
-
kernelParams = [
-
"amdgpu.dcdebugmask=0x410"
-
];
-
bootspec.enable = true;
-
kernelPackages = pkgs.linuxPackages_latest;
-
extraModulePackages = with pkgs.linuxPackages_latest; [ v4l2loopback ];
-
kernelModules = [
-
"v4l2loopback"
-
"kvm-amd"
-
"btusb"
-
];
-
supportedFilesystems = fileSystems;
-
initrd = {
-
enable = true;
-
network.enable = false;
-
availableKernelModules = [
-
"xhci_pci"
-
"thunderbolt"
-
"nvme"
-
"usb_storage"
-
"usbhid"
-
"sd_mod"
-
];
-
kernelModules = [ ];
-
};
-
loader = {
-
systemd-boot = {
-
enable = true;
-
configurationLimit = 5;
-
};
-
efi.canTouchEfiVariables = true;
-
};
-
plymouth.enable = true;
-
};
-
}
-22
systems/x86_64-linux/zaphod/console.nix
···
-
{
-
console = {
-
colors = [
-
"1a1b26"
-
"f7768e"
-
"73daca"
-
"e0af68"
-
"7aa2f7"
-
"bb9af7"
-
"7dcfff"
-
"c0caf5"
-
"565f89"
-
"f7768e"
-
"73daca"
-
"e0af68"
-
"7aa2f7"
-
"bb9af7"
-
"7dcfff"
-
"c0caf5"
-
];
-
};
-
}
-57
systems/x86_64-linux/zaphod/default.nix
···
-
{ system, ... }:
-
{
-
imports = [
-
# Machine specific configs
-
./bootloader.nix
-
./console.nix
-
./fonts.nix
-
./hardware.nix
-
# ./kde.nix
-
./networking.nix
-
./misc.nix
-
./packages.nix
-
./power.nix
-
-
# Security
-
./security/modules.nix
-
-
# Services
-
./services/modules.nix
-
-
# Machine-specific programs.
-
./programs/ssh.nix
-
./programs/sway.nix
-
./programs/zsh.nix
-
-
# Agenix secrets
-
# ./secret-files.nix
-
];
-
nixpkgs.hostPlatform.system = system;
-
py = {
-
users.default.enable = true;
-
programs = {
-
appimage.enable = true;
-
chromium.enable = true;
-
dconf.enable = true;
-
firefox.enable = true;
-
fish.enable = true;
-
less.enable = true;
-
neovim.enable = true;
-
noisetorch.enable = true;
-
steam.enable = true;
-
wireshark.enable = true;
-
};
-
};
-
-
fileSystems = {
-
"/" = {
-
fsType = "btrfs";
-
device = "/dev/disk/by-uuid/dce547b5-71db-4b80-a029-370c4b7765ab";
-
};
-
"/boot" = {
-
fsType = "vfat";
-
device = "/dev/disk/by-uuid/2F06-FA92";
-
};
-
};
-
swapDevices = [ { device = "/dev/disk/by-uuid/5f64b6ad-f471-4c6f-8536-59f581e16827"; } ];
-
}
-25
systems/x86_64-linux/zaphod/fonts.nix
···
-
{ pkgs, lib, ... }:
-
{
-
fonts = {
-
fontDir.enable = true;
-
fontconfig = {
-
enable = lib.mkForce true;
-
defaultFonts = {
-
serif = [ "IBM Plex Serif" ];
-
sansSerif = [ "IBM Plex Sans" ];
-
monospace = [
-
"IBM Plex Mono"
-
"FiraCode Nerd Font Mono"
-
];
-
emoji = [ "JoyPixels" ];
-
};
-
};
-
packages = with pkgs; [
-
ibm-plex
-
nerd-fonts.fira-code
-
nerd-fonts.fira-mono
-
nerd-fonts.blex-mono
-
nerd-fonts.jetbrains-mono
-
];
-
};
-
}
-42
systems/x86_64-linux/zaphod/hardware.nix
···
-
{ pkgs, ... }:
-
{
-
hardware = {
-
enableAllFirmware = true;
-
enableRedistributableFirmware = true;
-
bluetooth = {
-
enable = true;
-
package = pkgs.bluez-wiimote;
-
hsphfpd.enable = false;
-
powerOnBoot = true;
-
};
-
brillo.enable = true;
-
deviceTree.enable = false;
-
gpgSmartcards.enable = true;
-
graphics = {
-
enable = true;
-
extraPackages = [
-
pkgs.gamescope
-
pkgs.mangohud
-
];
-
extraPackages32 = [
-
pkgs.pkgsi686Linux.mangohud
-
];
-
};
-
sensor = {
-
hddtemp = {
-
enable = true;
-
drives = [ "/dev/disk/by-id/nvme-CT2000P2SSD8_2128E5B6F934" ];
-
unit = "F";
-
};
-
};
-
wirelessRegulatoryDatabase = true;
-
};
-
services.udev.packages = [
-
pkgs.qmk-udev-rules
-
pkgs.logitech-udev-rules
-
];
-
hardware.amdgpu = {
-
opencl.enable = false;
-
initrd.enable = true;
-
};
-
}
-20
systems/x86_64-linux/zaphod/kde.nix
···
-
{
-
services.xserver = {
-
enable = false;
-
displayManager = {
-
sddm.enable = false;
-
defaultSession = "plasmawayland";
-
};
-
desktopManager.plasma5 = {
-
enable = false;
-
phononBackend = "vlc";
-
runUsingSystemd = true;
-
useQtScaling = true;
-
};
-
};
-
qt = {
-
enable = true;
-
platformTheme = "kde";
-
style = "cleanlooks";
-
};
-
}
-57
systems/x86_64-linux/zaphod/misc.nix
···
-
{ lib, pkgs, ... }:
-
{
-
documentation = {
-
enable = true;
-
doc.enable = false;
-
man = {
-
enable = true;
-
generateCaches = false;
-
man-db.enable = false;
-
mandoc.enable = true;
-
};
-
nixos.enable = false;
-
};
-
environment = {
-
homeBinInPath = true;
-
localBinInPath = true;
-
};
-
services.openssh.settings.PermitRootLogin = lib.mkForce "yes";
-
time.timeZone = "America/New_York";
-
#
-
# systemd.tmpfiles.rules = ["L+ /lib64 - - - - /run/current-system/sw/lib64"];
-
-
virtualisation.virtualbox = {
-
host.enable = true;
-
host.enableExtensionPack = false;
-
guest = {
-
enable = false;
-
clipboard = true;
-
seamless = false;
-
dragAndDrop = true;
-
};
-
};
-
# Enable Virt-manager
-
virtualisation.libvirtd.enable = false;
-
programs.dconf.enable = true;
-
# environment.systemPackages = with pkgs; [virt-manager];
-
-
users.extraGroups.vboxusers.members = [
-
"thehedgehog"
-
"pyrox"
-
];
-
# users.extraGroups.libvirtd.members = ["thehedgehog" "pyrox"];
-
# xdg.portal.extraPortals = [
-
# pkgs.xdg-desktop-portal-gtk
-
# ];
-
xdg.portal.wlr.enable = true;
-
xdg.portal.xdgOpenUsePortal = true;
-
-
users.users.root.hashedPassword = "$6$6EtuZhVOJdfI9DYP$1Qnd7R8qdN.E5yE2kDQCNg2zgJ5cIjNBKsIW/qJgb8wcKlUpIoVg/fEKvBkAgCiLyojVG2kzfu4J9LR8rA8a2/";
-
-
# Nix-LD
-
programs.nix-ld.enable = true;
-
-
programs.steam.extraPackages = [
-
pkgs.pixman
-
];
-
}
-51
systems/x86_64-linux/zaphod/networking.nix
···
-
{ lib, pkgs, ... }:
-
{
-
networking = {
-
enableB43Firmware = false;
-
enableIPv6 = true;
-
hostId = "28c6bad2";
-
hostName = "zaphod";
-
usePredictableInterfaceNames = lib.mkDefault true;
-
# Interface config
-
interfaces.wlp1s0.useDHCP = lib.mkDefault true;
-
# Enable NetworkManager and disable wpa_supplicant
-
networkmanager = {
-
enable = true;
-
dns = lib.mkForce "default";
-
wifi.powersave = true;
-
};
-
wireless = {
-
enable = false;
-
};
-
-
# Tailscale fix(not needed, but recommended)
-
firewall.checkReversePath = "loose";
-
-
# DNS Servers
-
# Only use local resolver
-
nameservers = lib.mkForce [ ];
-
-
resolvconf.enable = false;
-
};
-
services.resolved = {
-
enable = false;
-
llmnr = "true";
-
fallbackDns = [ "158.59.252.11" ];
-
extraConfig = ''
-
MulticastDNS=true
-
'';
-
};
-
systemd.services.wpa_supplicant.environment.OPENSSL_CONF = pkgs.writeText "openssl.cnf" ''
-
openssl_conf = openssl_init
-
[openssl_init]
-
ssl_conf = ssl_sect
-
[ssl_sect]
-
system_default = system_default_sect
-
[system_default_sect]
-
Options = UnsafeLegacyRenegotiation
-
'';
-
services.mullvad-vpn = {
-
enable = true;
-
package = pkgs.mullvad-vpn;
-
};
-
}
-36
systems/x86_64-linux/zaphod/packages.nix
···
-
{
-
pkgs,
-
inputs,
-
config,
-
...
-
}:
-
{
-
environment.systemPackages = [
-
inputs.agenix.packages.${pkgs.system}.default
-
pkgs.android-tools
-
pkgs.clinfo
-
pkgs.deadnix
-
pkgs.file
-
pkgs.gamescope
-
pkgs.gnupg
-
pkgs.hibernate
-
pkgs.goverlay
-
pkgs.libappindicator
-
pkgs.libappindicator-gtk3
-
pkgs.mangohud
-
pkgs.kdePackages.kdenlive
-
pkgs.networkmanagerapplet
-
pkgs.pipewire.jack
-
pkgs.pmutils
-
pkgs.qbittorrent
-
pkgs.sbctl
-
pkgs.scrcpy
-
pkgs.statix
-
pkgs.steam-run
-
pkgs.libva-utils
-
pkgs.v4l-utils
-
pkgs.vdpauinfo
-
pkgs.xwiimote
-
pkgs.py.doc2dash
-
];
-
}
-1
systems/x86_64-linux/zaphod/power.nix
···
-
{ powerManagement.enable = true; }
-10
systems/x86_64-linux/zaphod/programs/gnupg.nix
···
-
{
-
programs.gnupg = {
-
agent = {
-
enable = true;
-
enableSSHSupport = true;
-
enableBrowserSocket = true;
-
};
-
dirmngr.enable = true;
-
};
-
}
-6
systems/x86_64-linux/zaphod/programs/ssh.nix
···
-
{
-
programs.ssh = {
-
enableAskPassword = false;
-
forwardX11 = false;
-
};
-
}
-13
systems/x86_64-linux/zaphod/programs/sway.nix
···
-
{ pkgs, ... }:
-
{
-
programs.sway = {
-
enable = true;
-
extraPackages = with pkgs; [
-
swaylock-effects
-
swayidle
-
kitty
-
];
-
wrapperFeatures.base = true;
-
wrapperFeatures.gtk = true;
-
};
-
}
-13
systems/x86_64-linux/zaphod/programs/zsh.nix
···
-
{
-
programs.zsh = {
-
enable = true;
-
enableBashCompletion = true;
-
enableCompletion = true;
-
enableGlobalCompInit = true;
-
autosuggestions.enable = true;
-
autosuggestions.async = true;
-
histSize = 10000;
-
syntaxHighlighting.enable = true;
-
vteIntegration = true;
-
};
-
}
-8
systems/x86_64-linux/zaphod/secret-files.nix
···
-
{
-
config.age.secrets = {
-
wg-privkey = {
-
file = ./secrets/wg-privkey.age;
-
path = "/run/agenix/wg-privkey";
-
};
-
};
-
}
-12
systems/x86_64-linux/zaphod/secrets/secrets.nix
···
-
let
-
yubi-back = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTVGi3PItsbUhFgnFZlqo1iUggL4npMg94+9FsyhEPfShcQwJK2/jJzjv5S9KPuk3cY7aoqyVFLbnasSBZPXmscJmOiVNvtWvHoC3QPXvf3IAcVZ5KOLpY2NJlPx/pAb31C6ewtg8v3VlyhL4zEp6M+AGwXX51tFDh2GnYD+7SNF+aMhKCrX63syAhgPy3F8mZ2RIDLAu+lsYlwdpWRkSEv9kcjX/6+3QgUWjfPBaKEeYID22ihSuj7+AiuAt0gM4q0TY/Hpcx+qDLonrIuBnm1hMZDgbv//D0sHIUxJQkGTKTEbkZxoh0Qri7UV/V6l3mETaG40deuemMU7RFY7Khl8RajNZ+9z0FdquS/HCt8+fYQk6eLneJrMIQ1bI4awrtblG3P2Yf2QUu+H3kfCQe44R3WjUugTbNtumVgyQBzl2dzlIVn1pZBeyZy70XCgbaFKkDR8Y/qZiUoZ0afP3vTOXhkn5UBfutTKwUiSGh3S8Ge5YhNgKHWE2eQp1ckEm0IMJV/q5Nsw/yBBXj/kfD8ekz96LQ+gP5JFLq4EaipXI7FM4aZNOBUZU1l/sCEuq7m997nrBucTKqGm7Ho3rq7bgdj4f6GyUJXSMOM1cN61LLrRumZGGTH8WghVL7ligxZyNFcQoudR8jfpf4mrgRxipQOe1A2umvuufMr+l/bw==";
-
yubi-main = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBBsOIMMZVmleClXfqUMrnmyh8PFuyiJqHKEZ51Xy746";
-
backup = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCyTiGctsHaTUlRJn2XQ/745dD0UWGWO8W0en8J5rf7BLI8lL/hPUmbNt45vC5754LXcBjnp1t/1FNgiGhvNZIWJpC+elBmhyMhg8z1exRZPD+as7XaH7scnij2vSbSphQFUqH433ggAGe77x5bc7wKFp9n7vj8G1u0JJxMEe1M7kNFY0+ShNtaHna3LxiQOVcW7qVlNKZP8Ol1V7kZLblRADCJMTYOXDIbktA8bbGRfGhbNjJGkL665qz36haYwb2i6A4sC7Y583N8ro8hIDG/ByJqwbl/Sz4rSxkT6G4+OdBvS6sa7TovNXHjmQCculMIltdog7UhgyBsim1sTzxAen3YyFRi1Cz/kLM0oH39m/W4IoMvJcNZCJ3ItLgy+lEVMd87jVOqfuq/hyjHVI0wJtU2Si2HTxv7aKL8gPzqXwbNH+nhkhlQ0ZH8zKVBunOgLDgsmGIky5X/T3bpWZpIoFkOR7AYrId/5dOeGM3pHhHb6woZ3SRubZ43Ah/VdJM=";
-
in
-
{
-
"wg-privkey.age".publicKeys = [
-
yubi-back
-
yubi-main
-
backup
-
];
-
}
systems/x86_64-linux/zaphod/secrets/wg-privkey.age

This is a binary file and will not be displayed.

-6
systems/x86_64-linux/zaphod/security/modules.nix
···
-
{
-
imports = [ ./pam.nix ];
-
security = {
-
protectKernelImage = true;
-
};
-
}
-9
systems/x86_64-linux/zaphod/security/pam.nix
···
-
{
-
security.pam = {
-
p11.enable = false;
-
p11.control = "sufficient";
-
u2f.enable = true;
-
u2f.settings.cue = true;
-
sshAgentAuth.enable = false;
-
};
-
}
-6
systems/x86_64-linux/zaphod/services/avahi.nix
···
-
{
-
services.avahi = {
-
enable = true;
-
nssmdns4 = true;
-
};
-
}
-20
systems/x86_64-linux/zaphod/services/docker.nix
···
-
{ pkgs, ... }:
-
let
-
betterDocker = pkgs.docker.override {
-
buildxSupport = false;
-
composeSupport = false;
-
sbomSupport = false;
-
};
-
in
-
{
-
virtualisation.docker = {
-
enable = false;
-
package = betterDocker;
-
rootless = {
-
enable = true;
-
package = betterDocker;
-
setSocketVariable = true;
-
};
-
storageDriver = "btrfs";
-
};
-
}
-4
systems/x86_64-linux/zaphod/services/flatpak.nix
···
-
{
-
services.flatpak.enable = true;
-
xdg.portal.enable = true;
-
}
-8
systems/x86_64-linux/zaphod/services/fprintd.nix
···
-
{ pkgs, ... }:
-
{
-
services.fprintd = {
-
enable = true;
-
tod.enable = true;
-
tod.driver = pkgs.libfprint-2-tod1-goodix;
-
};
-
}
-9
systems/x86_64-linux/zaphod/services/fwupd.nix
···
-
{
-
services.fwupd = {
-
enable = true;
-
extraRemotes = [ "lvfs-testing" ];
-
uefiCapsuleSettings = {
-
"DisableCapsuleUpdateOnDisk" = true;
-
};
-
};
-
}
-12
systems/x86_64-linux/zaphod/services/greetd.nix
···
-
{ pkgs, ... }:
-
{
-
services.greetd = {
-
enable = true;
-
settings = {
-
default_session = {
-
command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd 'sway -c /home/thehedgehog/.config/sway/config'";
-
user = "greeter";
-
};
-
};
-
};
-
}
-13
systems/x86_64-linux/zaphod/services/kmscon.nix
···
-
{ pkgs, ... }:
-
{
-
services.kmscon = {
-
enable = true;
-
hwRender = true;
-
fonts = [
-
{
-
name = "BlexMono Nerd Font";
-
package = pkgs.nerd-fonts.blex-mono;
-
}
-
];
-
};
-
}
-12
systems/x86_64-linux/zaphod/services/misc.nix
···
-
{ config, lib, ... }:
-
{
-
services = {
-
blueman.enable = true;
-
fstrim.enable = lib.mkDefault true;
-
tlp.enable = lib.mkDefault (
-
(lib.versionOlder (lib.versions.majorMinor lib.version) "21.05")
-
|| !config.services.power-profiles-daemon.enable
-
);
-
libinput.enable = lib.mkDefault true;
-
};
-
}
-17
systems/x86_64-linux/zaphod/services/modules.nix
···
-
{
-
imports = [
-
./avahi.nix
-
./docker.nix
-
./flatpak.nix
-
./fprintd.nix
-
./fwupd.nix
-
./greetd.nix
-
./kmscon.nix
-
./misc.nix
-
./packagekit.nix
-
./pcscd.nix
-
./pipewire.nix
-
./ssh.nix
-
./tailscale.nix
-
];
-
}
-5
systems/x86_64-linux/zaphod/services/packagekit.nix
···
-
{
-
services = {
-
packagekit.enable = false;
-
};
-
}
-5
systems/x86_64-linux/zaphod/services/pcscd.nix
···
-
{
-
services.pcscd = {
-
enable = true;
-
};
-
}
-12
systems/x86_64-linux/zaphod/services/pipewire.nix
···
-
{
-
services.pipewire = {
-
enable = true;
-
alsa.enable = true;
-
alsa.support32Bit = true;
-
audio.enable = true;
-
jack.enable = true;
-
pulse.enable = true;
-
wireplumber.enable = true;
-
};
-
security.rtkit.enable = true;
-
}
-6
systems/x86_64-linux/zaphod/services/ssh.nix
···
-
{
-
# services.openssh = {
-
# enable = true;
-
# permitRootLogin = "prohibit-password";
-
# };
-
}
-5
systems/x86_64-linux/zaphod/services/tailscale.nix
···
-
{
-
services.tailscale = {
-
enable = true;
-
};
-
}
+15
templates/default.nix
···
+
{
+
self,
+
...
+
}:
+
{
+
flake = {
+
templates = {
+
uv = {
+
path = ./uv;
+
description = "uv project template";
+
};
+
};
+
defaultTemplate = self.templates.uv;
+
};
+
}
-78
topology.nix
···
-
{ config, ... }:
-
let
-
inherit (config.lib.topology) mkInternet mkConnection;
-
mkTS = addresses: {
-
inherit addresses;
-
network = "tailscale";
-
virtual = true;
-
};
-
in
-
{
-
topology = {
-
-
};
-
nodes.internet = mkInternet {
-
connections = [
-
(mkConnection "marvin" "wlp41s0")
-
(mkConnection "prefect" "enp1s0")
-
(mkConnection "thought" "enp1s0")
-
(mkConnection "zaphod" "wlp1s0")
-
];
-
};
-
networks.tailscale = {
-
name = "Tailscale";
-
cidrv4 = "100.64.0.0/10";
-
cidrv6 = "fd7a:115c:a1e0::/96";
-
};
-
nodes = {
-
marvin = {
-
interfaces.enp42s0 = {
-
renderer.hidePhysicalConnections = true;
-
};
-
interfaces.tailscale0 =
-
mkTS [
-
"100.123.15.72"
-
"\n"
-
"fd7a:115c:a1e0:ab12:4843:cd96:627b:f48"
-
]
-
// {
-
physicalConnections = [
-
(mkConnection "prefect" "tailscale0")
-
(mkConnection "marvin" "tailscale0")
-
];
-
};
-
};
-
zaphod = {
-
interfaces = {
-
vboxnet0.virtual = true;
-
tailscale0 =
-
mkTS [
-
"100.125.9.36"
-
""
-
"fd7a:115c:a1e0:ab12:4843:cd96:627d:924"
-
]
-
// {
-
physicalConnections = [
-
(mkConnection "prefect" "tailscale0")
-
(mkConnection "marvin" "tailscale0")
-
];
-
};
-
};
-
};
-
prefect = {
-
interfaces.tailscale0 =
-
mkTS [
-
"100.93.63.54"
-
"\n"
-
"fd7a:115c:a1e0:ab12:4843:cd96:625d:3f36"
-
]
-
// {
-
physicalConnections = [
-
(mkConnection "marvin" "tailscale0")
-
(mkConnection "zaphod" "tailscale0")
-
];
-
};
-
};
-
thought = { };
-
};
-
}