nix machine / user configurations

Compare changes

Choose any two refs to compare.

Changed files
+17210 -4432
_sources
dns
hosts
chernobog
dzwonek
trimounts
volsinii
wolumonde
modules
forgejo.disabled
forgejo.nix
headscale.nix
openbao.disabled
openbao.nix
perses.disabled
perses.nix
tangled.disabled
tangled.nix
webhook.disabled
webhook.nix
wsl
modules
pkgs-set
secrets
users
+186 -34
_sources/generated.json
···
{
"agenix": {
"cargoLocks": null,
-
"date": "2025-10-18",
+
"date": "2025-11-08",
"extract": null,
"name": "agenix",
"passthru": null,
···
"name": null,
"owner": "ryantm",
"repo": "agenix",
-
"rev": "2f0f812f69f3eb4140157fe15e12739adf82e32a",
+
"rev": "fcdea223397448d35d9b31f798479227e80183f6",
"sha256": "sha256-wyT7Pl6tMFbFrs8Lk/TlEs81N6L+VSybPfiIgzU8lbQ=",
"sparseCheckout": [],
"type": "github"
},
-
"version": "2f0f812f69f3eb4140157fe15e12739adf82e32a"
+
"version": "fcdea223397448d35d9b31f798479227e80183f6"
},
"blog": {
"cargoLocks": null,
-
"date": "2025-10-11",
+
"date": "2025-12-07",
"extract": null,
"name": "blog",
"passthru": null,
···
"fetchSubmodules": false,
"leaveDotGit": false,
"name": null,
-
"rev": "4705c8e9339683f0ed947224de5be50a41399bfd",
-
"sha256": "sha256-Zv1R9k4483aZQS0uhBm4jmnGmpOS1fJc10rsXntdz5I=",
+
"rev": "ab573fb4fa69204bf3f891abb49205e6bf5b4c8f",
+
"sha256": "sha256-Ee2NczojZbFfimKF51W6T0wCv3sNmdliPAKFetOJZ4I=",
"sparseCheckout": [],
"type": "git",
"url": "https://tangled.org/@ptr.pet/endpoint"
},
-
"version": "4705c8e9339683f0ed947224de5be50a41399bfd"
+
"version": "ab573fb4fa69204bf3f891abb49205e6bf5b4c8f"
},
"clickee-proxy": {
"cargoLocks": null,
···
},
"version": "a60247a8d92e1802298fc197034d0b7b54cd90b7"
},
+
"disko": {
+
"cargoLocks": null,
+
"date": "2025-12-01",
+
"extract": null,
+
"name": "disko",
+
"passthru": null,
+
"pinned": false,
+
"src": {
+
"deepClone": false,
+
"fetchSubmodules": false,
+
"leaveDotGit": false,
+
"name": null,
+
"owner": "nix-community",
+
"repo": "disko",
+
"rev": "5a88a6eceb8fd732b983e72b732f6f4b8269bef3",
+
"sha256": "sha256-D6xc3Rl8Ab6wucJWdvjNsGYGSxNjQHzRc2EZ6eeQ6l4=",
+
"sparseCheckout": [],
+
"type": "github"
+
},
+
"version": "5a88a6eceb8fd732b983e72b732f6f4b8269bef3"
+
},
+
"facter": {
+
"cargoLocks": null,
+
"date": "2025-11-27",
+
"extract": null,
+
"name": "facter",
+
"passthru": null,
+
"pinned": false,
+
"src": {
+
"deepClone": false,
+
"fetchSubmodules": false,
+
"leaveDotGit": false,
+
"name": null,
+
"owner": "nix-community",
+
"repo": "nixos-facter-modules",
+
"rev": "5ea68886d95218646d11d3551a476d458df00778",
+
"sha256": "sha256-3bbuneTKZBkYXlm0bE36kUjiDsasoIC1GWBw/UEJ9T4=",
+
"sparseCheckout": [],
+
"type": "github"
+
},
+
"version": "5ea68886d95218646d11d3551a476d458df00778"
+
},
"gomod2nix": {
"cargoLocks": null,
-
"date": "2025-10-09",
+
"date": "2025-11-24",
"extract": null,
"name": "gomod2nix",
"passthru": null,
···
"name": null,
"owner": "nix-community",
"repo": "gomod2nix",
-
"rev": "7f8d7438f5870eb167abaf2c39eea3d2302019d1",
-
"sha256": "sha256-pDyrtUQyeP1lVTMIYqJtftzDtsXEZaJjYy9ZQ/SGhL8=",
+
"rev": "02e63a239d6eabd595db56852535992c898eba72",
+
"sha256": "sha256-ur4QIAHwgFc0vXiaxn5No/FuZicxBr2p0gmT54xZkUQ=",
"sparseCheckout": [],
"type": "github"
},
-
"version": "7f8d7438f5870eb167abaf2c39eea3d2302019d1"
+
"version": "02e63a239d6eabd595db56852535992c898eba72"
},
"home": {
"cargoLocks": null,
-
"date": "2025-10-21",
+
"date": "2025-12-02",
"extract": null,
"name": "home",
"passthru": null,
···
"name": null,
"owner": "nix-community",
"repo": "home-manager",
-
"rev": "9b4a2a7c4fbd75b422f00794af02d6edb4d9d315",
-
"sha256": "sha256-IwpfaKg5c/WWQiy8b5QGaVPMvoEQ2J6kpwRFdpVpBNQ=",
+
"rev": "ff067cfc619fdf6f82d50344e7d19ff2323f0827",
+
"sha256": "sha256-S41K55kw+hWgDfgKmZ9/fMZ3F0BQDMvqFfE120fMHeE=",
"sparseCheckout": [],
"type": "github"
},
-
"version": "9b4a2a7c4fbd75b422f00794af02d6edb4d9d315"
+
"version": "ff067cfc619fdf6f82d50344e7d19ff2323f0827"
},
"limbusart": {
"cargoLocks": null,
···
"sha256": "sha256-xATZz/sHYHkEXjwcmq1DSntclWxnDIKCpH314MaL63U=",
"sparseCheckout": [],
"type": "git",
-
"url": "https://git.gaze.systems/90008/limbusart.git"
+
"url": "https://github.com/90-008/limbusart.git"
},
"version": "7f29ab57b73eb8a4db7163fc7d19a71cf89c3d8b"
},
-
"lix-module": {
+
"moonlight": {
"cargoLocks": null,
-
"date": null,
+
"date": "2025-11-26",
"extract": null,
-
"name": "lix-module",
+
"name": "moonlight",
"passthru": null,
"pinned": false,
"src": {
-
"sha256": "sha256-KYMUrTV7H/RR5/HRnjV5R3rRIuBXMemyJzTLi50NFTs=",
-
"type": "tarball",
-
"url": "https://git.lix.systems/lix-project/nixos-module/archive/2.93.3-1.tar.gz"
+
"deepClone": false,
+
"fetchSubmodules": false,
+
"leaveDotGit": false,
+
"name": null,
+
"owner": "moonlight-mod",
+
"repo": "moonlight",
+
"rev": "059476af87f7335c05424b805833864d6d9ed0e3",
+
"sha256": "sha256-Qur5AWl4Vx+It65DX+I+sc4lViz52OmXqvg+fL2t9I4=",
+
"sparseCheckout": [],
+
"type": "github"
},
-
"version": "2.93.3-1"
+
"version": "059476af87f7335c05424b805833864d6d9ed0e3"
},
"ncr": {
"cargoLocks": null,
···
},
"version": "4660aa9cd9b24bef569696eee46dbe7e8df3e237"
},
-
"nixos-wsl": {
+
"nixos-hardware": {
"cargoLocks": null,
-
"date": "2025-10-15",
+
"date": "2025-11-29",
"extract": null,
-
"name": "nixos-wsl",
+
"name": "nixos-hardware",
+
"passthru": null,
+
"pinned": false,
+
"src": {
+
"deepClone": false,
+
"fetchSubmodules": false,
+
"leaveDotGit": false,
+
"name": null,
+
"owner": "NixOS",
+
"repo": "nixos-hardware",
+
"rev": "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3",
+
"sha256": "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4=",
+
"sparseCheckout": [],
+
"type": "github"
+
},
+
"version": "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3"
+
},
+
"nixpkgs-xr": {
+
"cargoLocks": null,
+
"date": "2025-12-02",
+
"extract": null,
+
"name": "nixpkgs-xr",
"passthru": null,
"pinned": false,
"src": {
···
"leaveDotGit": false,
"name": null,
"owner": "nix-community",
-
"repo": "NixOS-WSL",
-
"rev": "f98ee1de1fa36eca63c67b600f5d617e184e82ea",
-
"sha256": "sha256-wfWqt+igns/VazjPLkyb4Z/wpn4v+XIjUeI3xY/1ENg=",
+
"repo": "nixpkgs-xr",
+
"rev": "e027c652c5a39267af02a4824a6020381cbcf7eb",
+
"sha256": "sha256-YG8APbeS7cWkA6AKiNWGD1muRIWSoSXAe5wAc4jWgaw=",
"sparseCheckout": [],
"type": "github"
},
-
"version": "f98ee1de1fa36eca63c67b600f5d617e184e82ea"
+
"version": "e027c652c5a39267af02a4824a6020381cbcf7eb"
},
"nsid-tracker": {
"cargoLocks": null,
···
},
"version": "2683e619932808b8aa78ec7100de6324c8216daf"
},
+
"nucleus": {
+
"cargoLocks": null,
+
"date": "2025-11-11",
+
"extract": null,
+
"name": "nucleus",
+
"passthru": null,
+
"pinned": false,
+
"src": {
+
"deepClone": false,
+
"fetchSubmodules": false,
+
"leaveDotGit": false,
+
"name": null,
+
"rev": "a4f73517c1a76ed20b55f21618148b8afe0fa838",
+
"sha256": "sha256-8WrGAr+aCIFCFuixtH1BSB5lMn+d/FqXsEFAmXY3HkU=",
+
"sparseCheckout": [],
+
"type": "git",
+
"url": "https://tangled.org/@ptr.pet/nucleus"
+
},
+
"version": "a4f73517c1a76ed20b55f21618148b8afe0fa838"
+
},
+
"stylix": {
+
"cargoLocks": null,
+
"date": "2025-12-01",
+
"extract": null,
+
"name": "stylix",
+
"passthru": null,
+
"pinned": false,
+
"src": {
+
"deepClone": false,
+
"fetchSubmodules": false,
+
"leaveDotGit": false,
+
"name": null,
+
"owner": "nix-community",
+
"repo": "stylix",
+
"rev": "71054adbc3629404b2f02e8385aec07f87980a2f",
+
"sha256": "sha256-hIj3aKL+G8TXrqvz0wCnUKESN5MEyrD4YxaLLARnkPs=",
+
"sparseCheckout": [],
+
"type": "github"
+
},
+
"version": "71054adbc3629404b2f02e8385aec07f87980a2f"
+
},
"tangled": {
"cargoLocks": null,
-
"date": "2025-10-22",
+
"date": "2025-11-30",
"extract": null,
"name": "tangled",
"passthru": null,
···
"fetchSubmodules": false,
"leaveDotGit": false,
"name": null,
-
"rev": "0a2ae70c248e8b880b6c109e3af8eddc0d69212b",
-
"sha256": "sha256-CEIJqCphXGAt1zzc/Q316G+sfYmpCtJ9ZVWNoXa1mk4=",
+
"rev": "d37f774fb8c60aa2bd0cb965c9884457d0afb660",
+
"sha256": "sha256-u1i7aMo0fTQ6WVdOZhG2fo/gEx2Fq8+3URmuqEBZGWI=",
"sparseCheckout": [],
"type": "git",
"url": "https://tangled.org/@tangled.org/core"
},
-
"version": "0a2ae70c248e8b880b6c109e3af8eddc0d69212b"
+
"version": "d37f774fb8c60aa2bd0cb965c9884457d0afb660"
},
"tangled-sqlite-lib": {
"cargoLocks": null,
···
"url": "https://sqlite.org/2024/sqlite-amalgamation-3450100.zip"
},
"version": "3450100"
+
},
+
"trill": {
+
"cargoLocks": null,
+
"date": "2025-11-25",
+
"extract": null,
+
"name": "trill",
+
"passthru": null,
+
"pinned": false,
+
"src": {
+
"deepClone": false,
+
"fetchSubmodules": false,
+
"leaveDotGit": false,
+
"name": null,
+
"rev": "c9604685156e009cebd0ddc3b31672455f635387",
+
"sha256": "sha256-so9EHN0GQ7rFSmnLnpRap2RqRcklhe3C1HdyAKeR6No=",
+
"sparseCheckout": [],
+
"type": "git",
+
"url": "https://tangled.org/@ptr.pet/trill"
+
},
+
"version": "c9604685156e009cebd0ddc3b31672455f635387"
+
},
+
"zen-browser": {
+
"cargoLocks": null,
+
"date": "2025-12-01",
+
"extract": null,
+
"name": "zen-browser",
+
"passthru": null,
+
"pinned": false,
+
"src": {
+
"deepClone": false,
+
"fetchSubmodules": false,
+
"leaveDotGit": false,
+
"name": null,
+
"owner": "0xc000022070",
+
"repo": "zen-browser-flake",
+
"rev": "8cded25e10b13e2999241f1c73a7d4e5e5d6f69e",
+
"sha256": "sha256-sJQHRL8trBoG/ArR+mUlyp5cyKU0pgQY+qDQzZGnVgM=",
+
"sparseCheckout": [],
+
"type": "github"
+
},
+
"version": "8cded25e10b13e2999241f1c73a7d4e5e5d6f69e"
}
}
+125 -33
_sources/generated.nix
···
{
agenix = {
pname = "agenix";
-
version = "2f0f812f69f3eb4140157fe15e12739adf82e32a";
+
version = "fcdea223397448d35d9b31f798479227e80183f6";
src = fetchFromGitHub {
owner = "ryantm";
repo = "agenix";
-
rev = "2f0f812f69f3eb4140157fe15e12739adf82e32a";
+
rev = "fcdea223397448d35d9b31f798479227e80183f6";
fetchSubmodules = false;
sha256 = "sha256-wyT7Pl6tMFbFrs8Lk/TlEs81N6L+VSybPfiIgzU8lbQ=";
};
-
date = "2025-10-18";
+
date = "2025-11-08";
};
blog = {
pname = "blog";
-
version = "4705c8e9339683f0ed947224de5be50a41399bfd";
+
version = "ab573fb4fa69204bf3f891abb49205e6bf5b4c8f";
src = fetchgit {
url = "https://tangled.org/@ptr.pet/endpoint";
-
rev = "4705c8e9339683f0ed947224de5be50a41399bfd";
+
rev = "ab573fb4fa69204bf3f891abb49205e6bf5b4c8f";
fetchSubmodules = false;
deepClone = false;
leaveDotGit = false;
sparseCheckout = [ ];
-
sha256 = "sha256-Zv1R9k4483aZQS0uhBm4jmnGmpOS1fJc10rsXntdz5I=";
+
sha256 = "sha256-Ee2NczojZbFfimKF51W6T0wCv3sNmdliPAKFetOJZ4I=";
};
-
date = "2025-10-11";
+
date = "2025-12-07";
};
clickee-proxy = {
pname = "clickee-proxy";
···
};
date = "2025-09-15";
};
+
disko = {
+
pname = "disko";
+
version = "5a88a6eceb8fd732b983e72b732f6f4b8269bef3";
+
src = fetchFromGitHub {
+
owner = "nix-community";
+
repo = "disko";
+
rev = "5a88a6eceb8fd732b983e72b732f6f4b8269bef3";
+
fetchSubmodules = false;
+
sha256 = "sha256-D6xc3Rl8Ab6wucJWdvjNsGYGSxNjQHzRc2EZ6eeQ6l4=";
+
};
+
date = "2025-12-01";
+
};
+
facter = {
+
pname = "facter";
+
version = "5ea68886d95218646d11d3551a476d458df00778";
+
src = fetchFromGitHub {
+
owner = "nix-community";
+
repo = "nixos-facter-modules";
+
rev = "5ea68886d95218646d11d3551a476d458df00778";
+
fetchSubmodules = false;
+
sha256 = "sha256-3bbuneTKZBkYXlm0bE36kUjiDsasoIC1GWBw/UEJ9T4=";
+
};
+
date = "2025-11-27";
+
};
gomod2nix = {
pname = "gomod2nix";
-
version = "7f8d7438f5870eb167abaf2c39eea3d2302019d1";
+
version = "02e63a239d6eabd595db56852535992c898eba72";
src = fetchFromGitHub {
owner = "nix-community";
repo = "gomod2nix";
-
rev = "7f8d7438f5870eb167abaf2c39eea3d2302019d1";
+
rev = "02e63a239d6eabd595db56852535992c898eba72";
fetchSubmodules = false;
-
sha256 = "sha256-pDyrtUQyeP1lVTMIYqJtftzDtsXEZaJjYy9ZQ/SGhL8=";
+
sha256 = "sha256-ur4QIAHwgFc0vXiaxn5No/FuZicxBr2p0gmT54xZkUQ=";
};
-
date = "2025-10-09";
+
date = "2025-11-24";
};
home = {
pname = "home";
-
version = "9b4a2a7c4fbd75b422f00794af02d6edb4d9d315";
+
version = "ff067cfc619fdf6f82d50344e7d19ff2323f0827";
src = fetchFromGitHub {
owner = "nix-community";
repo = "home-manager";
-
rev = "9b4a2a7c4fbd75b422f00794af02d6edb4d9d315";
+
rev = "ff067cfc619fdf6f82d50344e7d19ff2323f0827";
fetchSubmodules = false;
-
sha256 = "sha256-IwpfaKg5c/WWQiy8b5QGaVPMvoEQ2J6kpwRFdpVpBNQ=";
+
sha256 = "sha256-S41K55kw+hWgDfgKmZ9/fMZ3F0BQDMvqFfE120fMHeE=";
};
-
date = "2025-10-21";
+
date = "2025-12-02";
};
limbusart = {
pname = "limbusart";
version = "7f29ab57b73eb8a4db7163fc7d19a71cf89c3d8b";
src = fetchgit {
-
url = "https://git.gaze.systems/90008/limbusart.git";
+
url = "https://github.com/90-008/limbusart.git";
rev = "7f29ab57b73eb8a4db7163fc7d19a71cf89c3d8b";
fetchSubmodules = false;
deepClone = false;
···
};
date = "2025-07-22";
};
-
lix-module = {
-
pname = "lix-module";
-
version = "2.93.3-1";
-
src = fetchTarball {
-
url = "https://git.lix.systems/lix-project/nixos-module/archive/2.93.3-1.tar.gz";
-
sha256 = "sha256-KYMUrTV7H/RR5/HRnjV5R3rRIuBXMemyJzTLi50NFTs=";
+
moonlight = {
+
pname = "moonlight";
+
version = "059476af87f7335c05424b805833864d6d9ed0e3";
+
src = fetchFromGitHub {
+
owner = "moonlight-mod";
+
repo = "moonlight";
+
rev = "059476af87f7335c05424b805833864d6d9ed0e3";
+
fetchSubmodules = false;
+
sha256 = "sha256-Qur5AWl4Vx+It65DX+I+sc4lViz52OmXqvg+fL2t9I4=";
};
+
date = "2025-11-26";
};
ncr = {
pname = "ncr";
···
};
date = "2025-07-18";
};
-
nixos-wsl = {
-
pname = "nixos-wsl";
-
version = "f98ee1de1fa36eca63c67b600f5d617e184e82ea";
+
nixos-hardware = {
+
pname = "nixos-hardware";
+
version = "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3";
+
src = fetchFromGitHub {
+
owner = "NixOS";
+
repo = "nixos-hardware";
+
rev = "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3";
+
fetchSubmodules = false;
+
sha256 = "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4=";
+
};
+
date = "2025-11-29";
+
};
+
nixpkgs-xr = {
+
pname = "nixpkgs-xr";
+
version = "e027c652c5a39267af02a4824a6020381cbcf7eb";
src = fetchFromGitHub {
owner = "nix-community";
-
repo = "NixOS-WSL";
-
rev = "f98ee1de1fa36eca63c67b600f5d617e184e82ea";
+
repo = "nixpkgs-xr";
+
rev = "e027c652c5a39267af02a4824a6020381cbcf7eb";
fetchSubmodules = false;
-
sha256 = "sha256-wfWqt+igns/VazjPLkyb4Z/wpn4v+XIjUeI3xY/1ENg=";
+
sha256 = "sha256-YG8APbeS7cWkA6AKiNWGD1muRIWSoSXAe5wAc4jWgaw=";
};
-
date = "2025-10-15";
+
date = "2025-12-02";
};
nsid-tracker = {
pname = "nsid-tracker";
···
};
date = "2025-09-11";
};
+
nucleus = {
+
pname = "nucleus";
+
version = "a4f73517c1a76ed20b55f21618148b8afe0fa838";
+
src = fetchgit {
+
url = "https://tangled.org/@ptr.pet/nucleus";
+
rev = "a4f73517c1a76ed20b55f21618148b8afe0fa838";
+
fetchSubmodules = false;
+
deepClone = false;
+
leaveDotGit = false;
+
sparseCheckout = [ ];
+
sha256 = "sha256-8WrGAr+aCIFCFuixtH1BSB5lMn+d/FqXsEFAmXY3HkU=";
+
};
+
date = "2025-11-11";
+
};
+
stylix = {
+
pname = "stylix";
+
version = "71054adbc3629404b2f02e8385aec07f87980a2f";
+
src = fetchFromGitHub {
+
owner = "nix-community";
+
repo = "stylix";
+
rev = "71054adbc3629404b2f02e8385aec07f87980a2f";
+
fetchSubmodules = false;
+
sha256 = "sha256-hIj3aKL+G8TXrqvz0wCnUKESN5MEyrD4YxaLLARnkPs=";
+
};
+
date = "2025-12-01";
+
};
tangled = {
pname = "tangled";
-
version = "0a2ae70c248e8b880b6c109e3af8eddc0d69212b";
+
version = "d37f774fb8c60aa2bd0cb965c9884457d0afb660";
src = fetchgit {
url = "https://tangled.org/@tangled.org/core";
-
rev = "0a2ae70c248e8b880b6c109e3af8eddc0d69212b";
+
rev = "d37f774fb8c60aa2bd0cb965c9884457d0afb660";
fetchSubmodules = false;
deepClone = false;
leaveDotGit = false;
sparseCheckout = [ ];
-
sha256 = "sha256-CEIJqCphXGAt1zzc/Q316G+sfYmpCtJ9ZVWNoXa1mk4=";
+
sha256 = "sha256-u1i7aMo0fTQ6WVdOZhG2fo/gEx2Fq8+3URmuqEBZGWI=";
};
-
date = "2025-10-22";
+
date = "2025-11-30";
};
tangled-sqlite-lib = {
pname = "tangled-sqlite-lib";
···
url = "https://sqlite.org/2024/sqlite-amalgamation-3450100.zip";
sha256 = "sha256-bJoMjirsBjm2Qk9KPiy3yV3+8b/POlYe76/FQbciHro=";
};
+
};
+
trill = {
+
pname = "trill";
+
version = "c9604685156e009cebd0ddc3b31672455f635387";
+
src = fetchgit {
+
url = "https://tangled.org/@ptr.pet/trill";
+
rev = "c9604685156e009cebd0ddc3b31672455f635387";
+
fetchSubmodules = false;
+
deepClone = false;
+
leaveDotGit = false;
+
sparseCheckout = [ ];
+
sha256 = "sha256-so9EHN0GQ7rFSmnLnpRap2RqRcklhe3C1HdyAKeR6No=";
+
};
+
date = "2025-11-25";
+
};
+
zen-browser = {
+
pname = "zen-browser";
+
version = "8cded25e10b13e2999241f1c73a7d4e5e5d6f69e";
+
src = fetchFromGitHub {
+
owner = "0xc000022070";
+
repo = "zen-browser-flake";
+
rev = "8cded25e10b13e2999241f1c73a7d4e5e5d6f69e";
+
fetchSubmodules = false;
+
sha256 = "sha256-sJQHRL8trBoG/ArR+mUlyp5cyKU0pgQY+qDQzZGnVgM=";
+
};
+
date = "2025-12-01";
};
}
+17 -2
deploy.nu
···
} else {
log error $content
}
-
http post --content-type application/json $"https://discord.com/api/webhooks/($env.WEBHOOK_ID)/($env.WEBHOOK_TOKEN)" $msg
+
# http post --content-type application/json $"https://discord.com/api/webhooks/($env.WEBHOOK_ID)/($env.WEBHOOK_TOKEN)" $msg
}
def upload-paste []: any -> string {
···
user: "root",
addr: "23.88.101.188",
},
+
dzwonek: {
+
type: "nixos",
+
user: "root",
+
addr: "94.237.26.47",
+
},
+
volsinii: {
+
type: "nixos",
+
user: "root",
+
addr: "199.71.188.53",
+
},
+
trimounts: {
+
type: "nixos",
+
user: "root",
+
addr: "159.195.58.28",
+
},
"dusk@devel.mobi": {
type: "home",
user: "dusk",
···
let result_link = readlink $result_dir
let target = $"($hostcfg.user)@($hostcfg.addr)"
-
let copy_cmd = {nix copy --to $"ssh://($target)" $result_link}
+
let copy_cmd = {nix copy -s --to $"ssh://($target)" $result_link}
if (run_step "copy to" $copy_cmd) {
return
}
+76 -43
dns/dnsconfig.js
···
var DSP_CLOUDFLARE = NewDnsProvider("cloudflare");
+
var DSP_BUNNY = NewDnsProvider("bunny_dns");
var REG_NONE = NewRegistrar("none");
-
var WOLUMONDE_IP = "23.88.101.188";
+
var DZWONEK_IP4 = "94.237.26.47";
+
var DZWONEK_IP6 = "2a04:3542:1000:910:6898:1dff:fea1:4b4b";
+
var DZWONEK_IPS = [DZWONEK_IP4, DZWONEK_IP6];
+
var TRIMOUNTS_IP4 = "159.195.58.28";
+
var TRIMOUNTS_IP6 = "2a0a:4cc0:c1:e83d::b00b";
+
var TRIMOUNTS_IPS = [TRIMOUNTS_IP4, TRIMOUNTS_IP6];
+
+
function host(name, ips, opts) {
+
if (opts)
+
return [
+
A(name, ips[0], opts),
+
AAAA(name, ips[1], opts),
+
];
+
else
+
return [
+
A(name, ips[0]),
+
AAAA(name, ips[1]),
+
];
+
}
+
+
function hosts(_names, ips, opts) {
+
var names = [];
+
if (typeof _names === "string")
+
names.push(_names);
+
else
+
names = _names;
+
+
var records = [];
+
_.each(names, function (name) {
+
_.each(host(name, ips, opts), function (r) {
+
records.push(r);
+
});
+
});
+
return records;
+
}
+
+
function TRIMOUNTS(names, opts) {
+
return hosts(names, TRIMOUNTS_IPS, opts);
+
}
+
function DZWONEK(names, opts) {
+
return hosts(names, DZWONEK_IPS, opts);
+
}
+
+
function IGNORE_ACME() {
+
return IGNORE_NAME("_acme-challenge");
+
}
D(
"gaze.systems",
REG_NONE,
-
DnsProvider(DSP_CLOUDFLARE),
+
DnsProvider(DSP_BUNNY),
DefaultTTL(1),
-
A("@", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("doc", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("git", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("limbus", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("pmart", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("webhook", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("dash", WOLUMONDE_IP, CF_PROXY_OFF), // perses
-
A("knot", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("spindle", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("skeetdeck", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("likes", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("vpn", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("id", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("test", WOLUMONDE_IP, CF_PROXY_OFF),
-
// atp handles
-
A("dawn", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("guestbook", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("drew", WOLUMONDE_IP, CF_PROXY_OFF),
-
// A("meow", WOLUMONDE_IP, CF_PROXY_OFF),
-
// thing
-
// TXT("id", "a data endpoint for entity with serial id /90008/."),
-
// TXT("id", "entity linked here uses it/they pronouns. it can be referred to as /dusk/ or /dawn/."),
-
// TXT("id", "this one is not a human, try to refer to it in third person. use /this one/, /this thing/, etc."),
-
// TXT("id", "try connecting to https://gaze.systems/about for more information."),
+
TRIMOUNTS(
+
[
+
"@", "doc", "pmart", "dash", "id",
+
"knot", "spindle",
+
"guestbook",
+
],
+
CF_PROXY_OFF,
+
),
+
DZWONEK("vpn", CF_PROXY_OFF),
// github pages
CNAME("dev", "90-008.github.io."),
// fastmail
···
MX("@", 10, "in1-smtp.messagingengine.com."),
MX("@", 20, "in2-smtp.messagingengine.com."),
TXT("@", "v=spf1 include:spf.messagingengine.com ?all"),
-
TXT("_dmarc", "v=DMARC1; p=none;"),
+
TXT("_dmarc", "v=DMARC1; p=reject;"),
// resend
MX("send.poke", 10, "feedback-smtp.us-east-1.amazonses.com."),
TXT(
···
),
TXT("send.poke", "v=spf1 include:amazonses.com ~all"),
// atproto
-
// TXT("_atproto", "did=did:plc:dfl62fgb7wtjj3fcbb72naae", TTL(60)),
-
// TXT("_atproto.dusk", "did=did:plc:dfl62fgb7wtjj3fcbb72naae", TTL(60)),
+
TXT("_atproto.eris", "did=did:plc:bxjnsrfzozl365rsdo5yvuz5", TTL(60)),
+
TXT("_atproto.drew", "did=did:plc:vo6ie3kd6xvpjlof4pnb2zzp", TTL(60)),
+
IGNORE_ACME(),
);
D(
···
REG_NONE,
DnsProvider(DSP_CLOUDFLARE),
DefaultTTL(1),
-
A("@", WOLUMONDE_IP, CF_PROXY_ON),
+
TRIMOUNTS("@", CF_PROXY_ON),
TXT("@", "a data endpoint for entity with serial id /90008/."),
TXT(
"@",
-
"entity linked here uses it/they pronouns. it can be referred to as /dusk/ or /dawn/.",
+
"entity linked here uses it/that pronouns. it can also be referred to as /dawn/.",
),
TXT(
"@",
···
"@",
"try connecting to https://gaze.systems/about for more information.",
),
-
// atproto
-
// TXT("_atproto", "did=did:plc:dfl62fgb7wtjj3fcbb72naae"),
+
IGNORE_ACME(),
);
D(
"poor.dog",
REG_NONE,
-
DnsProvider(DSP_CLOUDFLARE),
+
DnsProvider(DSP_BUNNY),
DefaultTTL(1),
-
A("@", WOLUMONDE_IP, CF_PROXY_OFF),
+
TRIMOUNTS("@", CF_PROXY_OFF),
TXT("@", "v=spf1 -all"),
TXT("_dmarc", "v=DMARC1; p=reject;"),
+
TXT("_atproto", "did=did:plc:dfl62fgb7wtjj3fcbb72naae", TTL(60)),
+
IGNORE_ACME(),
);
var EMAIL_TTL = 86400;
···
D(
"ptr.pet",
REG_NONE,
-
DnsProvider(DSP_CLOUDFLARE),
+
DnsProvider(DSP_BUNNY),
DefaultTTL(1),
-
A("@", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("test", WOLUMONDE_IP, CF_PROXY_OFF),
+
TRIMOUNTS("@", CF_PROXY_OFF),
+
DZWONEK(["nucleus", "trill"], CF_PROXY_OFF),
// atproto
TXT("_atproto", "did=did:plc:dfl62fgb7wtjj3fcbb72naae"),
-
A("nil", WOLUMONDE_IP, CF_PROXY_OFF),
-
TXT("_atproto.nil", "did=did:web:dawn.gaze.systems"),
+
TXT("_atproto.nil", "did=did:plc:dumbmutt4po52ept2tczimje"),
TXT("_atproto.june", "did=did:plc:y3z2rr7q5rywu4fjn3fmfyop"),
// june
CNAME("june", "girlboss.ceo."),
···
),
// mta-sts
-
A("mta-sts", WOLUMONDE_IP, CF_PROXY_OFF),
+
TRIMOUNTS("mta-sts", CF_PROXY_OFF),
TXT("_mta-sts", "v=STSv1; id=20250930T1945", TTL(EMAIL_TTL)),
// autoconfig
-
A("autoconfig", WOLUMONDE_IP, CF_PROXY_OFF),
-
A("autodiscover", WOLUMONDE_IP, CF_PROXY_OFF),
+
TRIMOUNTS(["autoconfig", "autodiscover"], CF_PROXY_OFF),
// autodiscovery
SRV(
···
SRV("_submissions._tcp", 0, 1, 465, "smtp.migadu.com.", TTL(EMAIL_TTL)),
SRV("_imaps._tcp", 0, 1, 993, "imap.migadu.com.", TTL(EMAIL_TTL)),
SRV("_pop3s._tcp", 0, 1, 995, "pop.migadu.com.", TTL(EMAIL_TTL)),
+
+
IGNORE_ACME(),
);
+143 -6
flake.lock
···
{
"nodes": {
+
"chaotic": {
+
"inputs": {
+
"flake-schemas": "flake-schemas",
+
"home-manager": "home-manager",
+
"jovian": "jovian",
+
"nixpkgs": "nixpkgs",
+
"rust-overlay": "rust-overlay"
+
},
+
"locked": {
+
"lastModified": 1764596563,
+
"narHash": "sha256-tH3AGDWlAN3ImVuBBCLmqaqD0EbkISiPCHGeMcd430k=",
+
"owner": "chaotic-cx",
+
"repo": "nyx",
+
"rev": "0701ee838b0fb34a77b6dd4b35476b4bb09fbca9",
+
"type": "github"
+
},
+
"original": {
+
"owner": "chaotic-cx",
+
"ref": "nyxpkgs-unstable",
+
"repo": "nyx",
+
"type": "github"
+
}
+
},
+
"flake-schemas": {
+
"locked": {
+
"lastModified": 1721999734,
+
"narHash": "sha256-G5CxYeJVm4lcEtaO87LKzOsVnWeTcHGKbKxNamNWgOw=",
+
"rev": "0a5c42297d870156d9c57d8f99e476b738dcd982",
+
"revCount": 75,
+
"type": "tarball",
+
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.1.5/0190ef2f-61e0-794b-ba14-e82f225e55e6/source.tar.gz"
+
},
+
"original": {
+
"type": "tarball",
+
"url": "https://flakehub.com/f/DeterminateSystems/flake-schemas/%3D0.1.5.tar.gz"
+
}
+
},
+
"home-manager": {
+
"inputs": {
+
"nixpkgs": [
+
"chaotic",
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1764194569,
+
"narHash": "sha256-iUM9ktarEzThkayyZrzQ7oycPshAY2XRQqVKz0xX/L0=",
+
"owner": "nix-community",
+
"repo": "home-manager",
+
"rev": "9651819d75f6c7ffaf8a9227490ac704f29659f0",
+
"type": "github"
+
},
+
"original": {
+
"owner": "nix-community",
+
"repo": "home-manager",
+
"type": "github"
+
}
+
},
+
"jovian": {
+
"inputs": {
+
"nix-github-actions": "nix-github-actions",
+
"nixpkgs": [
+
"chaotic",
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1764275117,
+
"narHash": "sha256-DRcv8Y0BnWm4ZhUQnaYk1dNzC6ZhA2W9Vv5Jl4n0RbE=",
+
"owner": "Jovian-Experiments",
+
"repo": "Jovian-NixOS",
+
"rev": "96023dcc9a0febaaa3b91f447b9ae2fbe86f2923",
+
"type": "github"
+
},
+
"original": {
+
"owner": "Jovian-Experiments",
+
"repo": "Jovian-NixOS",
+
"type": "github"
+
}
+
},
+
"nix-github-actions": {
+
"inputs": {
+
"nixpkgs": [
+
"chaotic",
+
"jovian",
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1729697500,
+
"narHash": "sha256-VFTWrbzDlZyFHHb1AlKRiD/qqCJIripXKiCSFS8fAOY=",
+
"owner": "zhaofengli",
+
"repo": "nix-github-actions",
+
"rev": "e418aeb728b6aa5ca8c5c71974e7159c2df1d8cf",
+
"type": "github"
+
},
+
"original": {
+
"owner": "zhaofengli",
+
"ref": "matrix-name",
+
"repo": "nix-github-actions",
+
"type": "github"
+
}
+
},
"nixpkgs": {
-
"flake": false,
"locked": {
-
"lastModified": 1761164809,
-
"narHash": "sha256-3uM91Lx9WZomE6MMEBorJyEyBNiHWRIxza/GganDxew=",
+
"lastModified": 1764517877,
+
"narHash": "sha256-pp3uT4hHijIC8JUK5MEqeAWmParJrgBVzHLNfJDZxg4=",
"owner": "NixOS",
"repo": "nixpkgs",
-
"rev": "3d2db9755e7815937fb7b8f089fad9b44bc416d8",
+
"rev": "2d293cbfa5a793b4c50d17c05ef9e385b90edf6c",
"type": "github"
},
"original": {
"owner": "NixOS",
-
"ref": "nixos-unstable-small",
+
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
+
"nixpkgs_2": {
+
"locked": {
+
"lastModified": 1764517877,
+
"narHash": "sha256-xLPjeWHfxEJtZmosOmLaT25Vb2rbktbbE7ShRtAm8h0=",
+
"rev": "2d293cbfa5a793b4c50d17c05ef9e385b90edf6c",
+
"type": "tarball",
+
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre904649.2d293cbfa5a7/nixexprs.tar.xz?lastModified=1764517877&rev=2d293cbfa5a793b4c50d17c05ef9e385b90edf6c"
+
},
+
"original": {
+
"type": "tarball",
+
"url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz"
+
}
+
},
"root": {
"inputs": {
-
"nixpkgs": "nixpkgs"
+
"chaotic": "chaotic",
+
"nixpkgs": "nixpkgs_2"
+
}
+
},
+
"rust-overlay": {
+
"inputs": {
+
"nixpkgs": [
+
"chaotic",
+
"nixpkgs"
+
]
+
},
+
"locked": {
+
"lastModified": 1764211126,
+
"narHash": "sha256-p5y13PnMZYd5WdHk+XCzyUaLGBUCwnz2n4KYKEZM0Pw=",
+
"owner": "oxalica",
+
"repo": "rust-overlay",
+
"rev": "895935bff08cfcfb663fb9c8263c43596e7cd1ed",
+
"type": "github"
+
},
+
"original": {
+
"owner": "oxalica",
+
"repo": "rust-overlay",
+
"type": "github"
}
}
},
+5 -5
flake.nix
···
{
description = "config!!!";
-
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable-small";
-
inputs.nixpkgs.flake = false;
+
inputs.nixpkgs.url = "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz";
+
inputs.chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
outputs =
flakeInputs:
let
-
lib = import "${flakeInputs.nixpkgs}/lib";
+
lib = flakeInputs.nixpkgs.lib;
tlib = import ./lib lib;
l = lib;
···
nixosConfigurations = import ./hosts { inherit lib tlib allPkgsSets; };
homeConfigurations = import ./users { inherit lib tlib allPkgsSets; };
-
legacyPackages = l.mapAttrs (_: set: set.pkgs // { inherit (set) inputs; }) allPkgsSets;
-
packages = l.mapAttrs (_: set: set.exported) allPkgsSets;
+
# legacyPackages = l.mapAttrs (_: set: set.pkgs // { inherit (set) inputs; }) allPkgsSets;
+
# packages = l.mapAttrs (_: set: set.exported) allPkgsSets;
apps = miscApps;
# topology = lib.mapAttrs (_: pkgs:
+81
hosts/chernobog/default.nix
···
+
{
+
tlib,
+
pkgs,
+
inputs,
+
...
+
}:
+
{
+
imports =
+
with inputs;
+
[
+
"${facter}/modules/nixos/facter.nix"
+
"${disko}/module.nix"
+
"${home}/nixos"
+
"${nixos-hardware}/common/pc"
+
"${nixos-hardware}/common/pc/ssd"
+
"${nixos-hardware}/common/cpu/amd"
+
"${nixos-hardware}/common/cpu/amd/pstate.nix"
+
"${nixos-hardware}/common/cpu/amd/zenpower.nix"
+
"${nixos-hardware}/common/gpu/amd"
+
../../users/root
+
../../users/mayer
+
../../modules
+
../../locale/default.nix
+
]
+
++ (tlib.importFolder (toString ./modules));
+
+
facter.reportPath = ./facter.json;
+
+
security = {
+
pam.loginLimits = [
+
{
+
domain = "*";
+
type = "soft";
+
item = "nofile";
+
value = "16777216";
+
}
+
{
+
domain = "*";
+
type = "hard";
+
item = "nofile";
+
value = "16777216";
+
}
+
];
+
};
+
+
fonts = {
+
enableDefaultPackages = true;
+
packages = with pkgs; [
+
noto-fonts
+
noto-fonts-cjk-serif
+
noto-fonts-cjk-sans
+
noto-fonts-color-emoji
+
font-awesome
+
source-han-serif
+
source-han-sans
+
comic-mono
+
comic-relief
+
];
+
fontconfig.defaultFonts = {
+
serif = [
+
"Comic Relief"
+
"Noto Serif"
+
"Source Han Serif"
+
];
+
sansSerif = [
+
"Comic Relief"
+
"Noto Sans"
+
"Source Han Sans"
+
];
+
monospace = [ "Comic Mono" ];
+
};
+
# fontconfig.hinting.style = "full";
+
# fontconfig.subpixel.rgba = "rgb";
+
};
+
+
services.earlyoom.enable = true;
+
+
hardware.enableRedistributableFirmware = true;
+
+
system.stateVersion = "25.05";
+
}
+5829
hosts/chernobog/facter.json
···
+
{
+
"version": 1,
+
"system": "x86_64-linux",
+
"virtualisation": "none",
+
"hardware": {
+
"bios": {
+
"apm_info": {
+
"supported": false,
+
"enabled": false,
+
"version": 0,
+
"sub_version": 0,
+
"bios_flags": 0
+
},
+
"vbe_info": {
+
"version": 0,
+
"video_memory": 0
+
},
+
"pnp": false,
+
"pnp_id": 0,
+
"lba_support": false,
+
"low_memory_size": 0,
+
"smbios_version": 771
+
},
+
"bluetooth": [
+
{
+
"index": 63,
+
"attached_to": 71,
+
"class_list": [
+
"usb",
+
"bluetooth"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0115",
+
"name": "Bluetooth Device",
+
"value": 277
+
},
+
"vendor": {
+
"hex": "2357",
+
"value": 9047
+
},
+
"device": {
+
"hex": "0604",
+
"name": "TP-Link UB500 Adapter",
+
"value": 1540
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "2.00",
+
"value": 0
+
},
+
"serial": "E848B8C82000",
+
"model": "TP-Link UB500 Adapter",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-2/1-2:1.0",
+
"sysfs_bus_id": "1-2:1.0",
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 12000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "00e0",
+
"name": "wireless",
+
"value": 224
+
},
+
"device_subclass": {
+
"hex": "0001",
+
"name": "audio",
+
"value": 1
+
},
+
"device_protocol": 1,
+
"interface_class": {
+
"hex": "00e0",
+
"name": "wireless",
+
"value": 224
+
},
+
"interface_subclass": {
+
"hex": "0001",
+
"name": "audio",
+
"value": 1
+
},
+
"interface_protocol": 1,
+
"interface_number": 0,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "btusb",
+
"driver_module": "btusb",
+
"drivers": [
+
"btusb"
+
],
+
"driver_modules": [
+
"btusb"
+
],
+
"driver_info": {
+
"type": "module",
+
"db_entry_0": [
+
"btusb"
+
],
+
"active": true,
+
"modprobe": true,
+
"names": [
+
"btusb"
+
],
+
"module_args": [
+
""
+
],
+
"conf": ""
+
},
+
"module_alias": "usb:v2357p0604d0200dcE0dsc01dp01icE0isc01ip01in00"
+
},
+
{
+
"index": 69,
+
"attached_to": 71,
+
"class_list": [
+
"usb",
+
"bluetooth"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0115",
+
"name": "Bluetooth Device",
+
"value": 277
+
},
+
"vendor": {
+
"hex": "2357",
+
"value": 9047
+
},
+
"device": {
+
"hex": "0604",
+
"name": "TP-Link UB500 Adapter",
+
"value": 1540
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "2.00",
+
"value": 0
+
},
+
"serial": "E848B8C82000",
+
"model": "TP-Link UB500 Adapter",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-2/1-2:1.1",
+
"sysfs_bus_id": "1-2:1.1",
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 12000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "00e0",
+
"name": "wireless",
+
"value": 224
+
},
+
"device_subclass": {
+
"hex": "0001",
+
"name": "audio",
+
"value": 1
+
},
+
"device_protocol": 1,
+
"interface_class": {
+
"hex": "00e0",
+
"name": "wireless",
+
"value": 224
+
},
+
"interface_subclass": {
+
"hex": "0001",
+
"name": "audio",
+
"value": 1
+
},
+
"interface_protocol": 1,
+
"interface_number": 1,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "btusb",
+
"driver_module": "btusb",
+
"drivers": [
+
"btusb"
+
],
+
"driver_modules": [
+
"btusb"
+
],
+
"driver_info": {
+
"type": "module",
+
"db_entry_0": [
+
"btusb"
+
],
+
"active": true,
+
"modprobe": true,
+
"names": [
+
"btusb"
+
],
+
"module_args": [
+
""
+
],
+
"conf": ""
+
},
+
"module_alias": "usb:v2357p0604d0200dcE0dsc01dp01icE0isc01ip01in01"
+
}
+
],
+
"bridge": [
+
{
+
"index": 16,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 3
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0004",
+
"name": "PCI bridge",
+
"value": 4
+
},
+
"pci_interface": {
+
"hex": "0000",
+
"name": "Normal decode",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1483",
+
"value": 5251
+
},
+
"sub_device": {
+
"hex": "1234",
+
"value": 4660
+
},
+
"model": "AMD PCI bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:03.1",
+
"sysfs_bus_id": "0000:00:03.1",
+
"sysfs_iommu_group_id": 5,
+
"detail": {
+
"function": 1,
+
"command": 1031,
+
"header_type": 1,
+
"secondary_bus": 5,
+
"prog_if": 0
+
},
+
"driver": "pcieport",
+
"driver_module": "pcieportdrv",
+
"drivers": [
+
"pcieport"
+
],
+
"driver_modules": [
+
"pcieportdrv"
+
],
+
"module_alias": "pci:v00001022d00001483sv00001022sd00001234bc06sc04i00"
+
},
+
{
+
"index": 17,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 8
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1482",
+
"value": 5250
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:08.0",
+
"sysfs_bus_id": "0000:00:08.0",
+
"sysfs_iommu_group_id": 10,
+
"detail": {
+
"function": 0,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001482sv00000000sd00000000bc06sc00i00"
+
},
+
{
+
"index": 18,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 24
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1443",
+
"value": 5187
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:18.3",
+
"sysfs_bus_id": "0000:00:18.3",
+
"sysfs_iommu_group_id": 13,
+
"detail": {
+
"function": 3,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"driver": "k10temp",
+
"driver_module": "k10temp",
+
"drivers": [
+
"k10temp"
+
],
+
"driver_modules": [
+
"k10temp"
+
],
+
"driver_info": {
+
"type": "module",
+
"db_entry_0": [
+
"k10temp"
+
],
+
"active": true,
+
"modprobe": true,
+
"names": [
+
"k10temp"
+
],
+
"module_args": [
+
""
+
],
+
"conf": ""
+
},
+
"module_alias": "pci:v00001022d00001443sv00000000sd00000000bc06sc00i00"
+
},
+
{
+
"index": 20,
+
"attached_to": 21,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 2,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0004",
+
"name": "PCI bridge",
+
"value": 4
+
},
+
"pci_interface": {
+
"hex": "0000",
+
"name": "Normal decode",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1b21",
+
"value": 6945
+
},
+
"device": {
+
"hex": "43e9",
+
"value": 17385
+
},
+
"sub_device": {
+
"hex": "0201",
+
"value": 513
+
},
+
"model": "AMD PCI bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.2",
+
"sysfs_bus_id": "0000:02:00.2",
+
"sysfs_iommu_group_id": 15,
+
"detail": {
+
"function": 2,
+
"command": 7,
+
"header_type": 1,
+
"secondary_bus": 3,
+
"prog_if": 0
+
},
+
"driver": "pcieport",
+
"driver_module": "pcieportdrv",
+
"drivers": [
+
"pcieport"
+
],
+
"driver_modules": [
+
"pcieportdrv"
+
],
+
"module_alias": "pci:v00001022d000043E9sv00001B21sd00000201bc06sc04i00"
+
},
+
{
+
"index": 21,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 1
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0004",
+
"name": "PCI bridge",
+
"value": 4
+
},
+
"pci_interface": {
+
"hex": "0000",
+
"name": "Normal decode",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1483",
+
"value": 5251
+
},
+
"sub_device": {
+
"hex": "1234",
+
"value": 4660
+
},
+
"model": "AMD PCI bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2",
+
"sysfs_bus_id": "0000:00:01.2",
+
"sysfs_iommu_group_id": 2,
+
"detail": {
+
"function": 2,
+
"command": 1031,
+
"header_type": 1,
+
"secondary_bus": 2,
+
"prog_if": 0
+
},
+
"driver": "pcieport",
+
"driver_module": "pcieportdrv",
+
"drivers": [
+
"pcieport"
+
],
+
"driver_modules": [
+
"pcieportdrv"
+
],
+
"module_alias": "pci:v00001022d00001483sv00001022sd00001234bc06sc04i00"
+
},
+
{
+
"index": 22,
+
"attached_to": 20,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 3,
+
"number": 3
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0004",
+
"name": "PCI bridge",
+
"value": 4
+
},
+
"pci_interface": {
+
"hex": "0000",
+
"name": "Normal decode",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1b21",
+
"value": 6945
+
},
+
"device": {
+
"hex": "43ea",
+
"value": 17386
+
},
+
"sub_device": {
+
"hex": "3308",
+
"value": 13064
+
},
+
"model": "AMD PCI bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.2/0000:03:03.0",
+
"sysfs_bus_id": "0000:03:03.0",
+
"sysfs_iommu_group_id": 15,
+
"detail": {
+
"function": 0,
+
"command": 1031,
+
"header_type": 1,
+
"secondary_bus": 4,
+
"prog_if": 0
+
},
+
"driver": "pcieport",
+
"driver_module": "pcieportdrv",
+
"drivers": [
+
"pcieport"
+
],
+
"driver_modules": [
+
"pcieportdrv"
+
],
+
"module_alias": "pci:v00001022d000043EAsv00001B21sd00003308bc06sc04i00"
+
},
+
{
+
"index": 23,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 24
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1441",
+
"value": 5185
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:18.1",
+
"sysfs_bus_id": "0000:00:18.1",
+
"sysfs_iommu_group_id": 13,
+
"detail": {
+
"function": 1,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001441sv00000000sd00000000bc06sc00i00"
+
},
+
{
+
"index": 25,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 1
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1482",
+
"value": 5250
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.0",
+
"sysfs_bus_id": "0000:00:01.0",
+
"sysfs_iommu_group_id": 0,
+
"detail": {
+
"function": 0,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001482sv00000000sd00000000bc06sc00i00"
+
},
+
{
+
"index": 27,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 4
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1482",
+
"value": 5250
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:04.0",
+
"sysfs_bus_id": "0000:00:04.0",
+
"sysfs_iommu_group_id": 6,
+
"detail": {
+
"function": 0,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001482sv00000000sd00000000bc06sc00i00"
+
},
+
{
+
"index": 28,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 20
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0001",
+
"name": "ISA bridge",
+
"value": 1
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1458",
+
"value": 5208
+
},
+
"device": {
+
"hex": "790e",
+
"value": 30990
+
},
+
"sub_device": {
+
"hex": "5001",
+
"value": 20481
+
},
+
"revision": {
+
"hex": "0051",
+
"value": 81
+
},
+
"model": "AMD ISA bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:14.3",
+
"sysfs_bus_id": "0000:00:14.3",
+
"sysfs_iommu_group_id": 12,
+
"detail": {
+
"function": 3,
+
"command": 15,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d0000790Esv00001458sd00005001bc06sc01i00"
+
},
+
{
+
"index": 30,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 7
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1482",
+
"value": 5250
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:07.0",
+
"sysfs_bus_id": "0000:00:07.0",
+
"sysfs_iommu_group_id": 8,
+
"detail": {
+
"function": 0,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001482sv00000000sd00000000bc06sc00i00"
+
},
+
{
+
"index": 33,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 24
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1446",
+
"value": 5190
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:18.6",
+
"sysfs_bus_id": "0000:00:18.6",
+
"sysfs_iommu_group_id": 13,
+
"detail": {
+
"function": 6,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001446sv00000000sd00000000bc06sc00i00"
+
},
+
{
+
"index": 35,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1480",
+
"value": 5248
+
},
+
"sub_device": {
+
"hex": "1480",
+
"value": 5248
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:00.0",
+
"sysfs_bus_id": "0000:00:00.0",
+
"detail": {
+
"function": 0,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001480sv00001022sd00001480bc06sc00i00"
+
},
+
{
+
"index": 36,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 8
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0004",
+
"name": "PCI bridge",
+
"value": 4
+
},
+
"pci_interface": {
+
"hex": "0000",
+
"name": "Normal decode",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1484",
+
"value": 5252
+
},
+
"sub_device": {
+
"hex": "1484",
+
"value": 5252
+
},
+
"model": "AMD PCI bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:08.1",
+
"sysfs_bus_id": "0000:00:08.1",
+
"sysfs_iommu_group_id": 11,
+
"detail": {
+
"function": 1,
+
"command": 1031,
+
"header_type": 1,
+
"secondary_bus": 9,
+
"prog_if": 0
+
},
+
"driver": "pcieport",
+
"driver_module": "pcieportdrv",
+
"drivers": [
+
"pcieport"
+
],
+
"driver_modules": [
+
"pcieportdrv"
+
],
+
"module_alias": "pci:v00001022d00001484sv00001022sd00001484bc06sc04i00"
+
},
+
{
+
"index": 37,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 24
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1444",
+
"value": 5188
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:18.4",
+
"sysfs_bus_id": "0000:00:18.4",
+
"sysfs_iommu_group_id": 13,
+
"detail": {
+
"function": 4,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001444sv00000000sd00000000bc06sc00i00"
+
},
+
{
+
"index": 39,
+
"attached_to": 44,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 6,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0004",
+
"name": "PCI bridge",
+
"value": 4
+
},
+
"pci_interface": {
+
"hex": "0000",
+
"name": "Normal decode",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1002",
+
"name": "ATI Technologies Inc",
+
"value": 4098
+
},
+
"sub_vendor": {
+
"hex": "1002",
+
"name": "ATI Technologies Inc",
+
"value": 4098
+
},
+
"device": {
+
"hex": "1479",
+
"value": 5241
+
},
+
"sub_device": {
+
"hex": "1479",
+
"value": 5241
+
},
+
"revision": {
+
"hex": "0012",
+
"value": 18
+
},
+
"model": "ATI PCI bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:03.1/0000:05:00.0/0000:06:00.0",
+
"sysfs_bus_id": "0000:06:00.0",
+
"sysfs_iommu_group_id": 17,
+
"detail": {
+
"function": 0,
+
"command": 1031,
+
"header_type": 1,
+
"secondary_bus": 7,
+
"prog_if": 0
+
},
+
"driver": "pcieport",
+
"driver_module": "pcieportdrv",
+
"drivers": [
+
"pcieport"
+
],
+
"driver_modules": [
+
"pcieportdrv"
+
],
+
"module_alias": "pci:v00001002d00001479sv00001002sd00001479bc06sc04i00"
+
},
+
{
+
"index": 40,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 3
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1482",
+
"value": 5250
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:03.0",
+
"sysfs_bus_id": "0000:00:03.0",
+
"sysfs_iommu_group_id": 4,
+
"detail": {
+
"function": 0,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001482sv00000000sd00000000bc06sc00i00"
+
},
+
{
+
"index": 41,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 24
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1442",
+
"value": 5186
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:18.2",
+
"sysfs_bus_id": "0000:00:18.2",
+
"sysfs_iommu_group_id": 13,
+
"detail": {
+
"function": 2,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001442sv00000000sd00000000bc06sc00i00"
+
},
+
{
+
"index": 43,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 1
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0004",
+
"name": "PCI bridge",
+
"value": 4
+
},
+
"pci_interface": {
+
"hex": "0000",
+
"name": "Normal decode",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1483",
+
"value": 5251
+
},
+
"sub_device": {
+
"hex": "1234",
+
"value": 4660
+
},
+
"model": "AMD PCI bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.1",
+
"sysfs_bus_id": "0000:00:01.1",
+
"sysfs_iommu_group_id": 1,
+
"detail": {
+
"function": 1,
+
"command": 1031,
+
"header_type": 1,
+
"secondary_bus": 1,
+
"prog_if": 0
+
},
+
"driver": "pcieport",
+
"driver_module": "pcieportdrv",
+
"drivers": [
+
"pcieport"
+
],
+
"driver_modules": [
+
"pcieportdrv"
+
],
+
"module_alias": "pci:v00001022d00001483sv00001022sd00001234bc06sc04i00"
+
},
+
{
+
"index": 44,
+
"attached_to": 16,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 5,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0004",
+
"name": "PCI bridge",
+
"value": 4
+
},
+
"pci_interface": {
+
"hex": "0000",
+
"name": "Normal decode",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1002",
+
"name": "ATI Technologies Inc",
+
"value": 4098
+
},
+
"device": {
+
"hex": "1478",
+
"value": 5240
+
},
+
"revision": {
+
"hex": "0012",
+
"value": 18
+
},
+
"model": "ATI PCI bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:03.1/0000:05:00.0",
+
"sysfs_bus_id": "0000:05:00.0",
+
"sysfs_iommu_group_id": 16,
+
"detail": {
+
"function": 0,
+
"command": 7,
+
"header_type": 1,
+
"secondary_bus": 6,
+
"prog_if": 0
+
},
+
"driver": "pcieport",
+
"driver_module": "pcieportdrv",
+
"drivers": [
+
"pcieport"
+
],
+
"driver_modules": [
+
"pcieportdrv"
+
],
+
"module_alias": "pci:v00001002d00001478sv00000000sd00000000bc06sc04i00"
+
},
+
{
+
"index": 45,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 24
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1440",
+
"value": 5184
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:18.0",
+
"sysfs_bus_id": "0000:00:18.0",
+
"sysfs_iommu_group_id": 13,
+
"detail": {
+
"function": 0,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001440sv00000000sd00000000bc06sc00i00"
+
},
+
{
+
"index": 46,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 7
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0004",
+
"name": "PCI bridge",
+
"value": 4
+
},
+
"pci_interface": {
+
"hex": "0000",
+
"name": "Normal decode",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1484",
+
"value": 5252
+
},
+
"sub_device": {
+
"hex": "1484",
+
"value": 5252
+
},
+
"model": "AMD PCI bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:07.1",
+
"sysfs_bus_id": "0000:00:07.1",
+
"sysfs_iommu_group_id": 9,
+
"detail": {
+
"function": 1,
+
"command": 1031,
+
"header_type": 1,
+
"secondary_bus": 8,
+
"prog_if": 0
+
},
+
"driver": "pcieport",
+
"driver_module": "pcieportdrv",
+
"drivers": [
+
"pcieport"
+
],
+
"driver_modules": [
+
"pcieportdrv"
+
],
+
"module_alias": "pci:v00001022d00001484sv00001022sd00001484bc06sc04i00"
+
},
+
{
+
"index": 49,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 2
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1482",
+
"value": 5250
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:02.0",
+
"sysfs_bus_id": "0000:00:02.0",
+
"sysfs_iommu_group_id": 3,
+
"detail": {
+
"function": 0,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001482sv00000000sd00000000bc06sc00i00"
+
},
+
{
+
"index": 50,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 24
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1447",
+
"value": 5191
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:18.7",
+
"sysfs_bus_id": "0000:00:18.7",
+
"sysfs_iommu_group_id": 13,
+
"detail": {
+
"function": 7,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001447sv00000000sd00000000bc06sc00i00"
+
},
+
{
+
"index": 53,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 5
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1482",
+
"value": 5250
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:05.0",
+
"sysfs_bus_id": "0000:00:05.0",
+
"sysfs_iommu_group_id": 7,
+
"detail": {
+
"function": 0,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001482sv00000000sd00000000bc06sc00i00"
+
},
+
{
+
"index": 54,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 24
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1445",
+
"value": 5189
+
},
+
"model": "AMD Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:18.5",
+
"sysfs_bus_id": "0000:00:18.5",
+
"sysfs_iommu_group_id": 13,
+
"detail": {
+
"function": 5,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001445sv00000000sd00000000bc06sc00i00"
+
}
+
],
+
"cpu": [
+
{
+
"architecture": "x86_64",
+
"vendor_name": "AuthenticAMD",
+
"family": 25,
+
"model": 33,
+
"stepping": 2,
+
"features": [
+
"fpu",
+
"vme",
+
"de",
+
"pse",
+
"tsc",
+
"msr",
+
"pae",
+
"mce",
+
"cx8",
+
"apic",
+
"sep",
+
"mtrr",
+
"pge",
+
"mca",
+
"cmov",
+
"pat",
+
"pse36",
+
"clflush",
+
"mmx",
+
"fxsr",
+
"sse",
+
"sse2",
+
"ht",
+
"syscall",
+
"nx",
+
"mmxext",
+
"fxsr_opt",
+
"pdpe1gb",
+
"rdtscp",
+
"lm",
+
"constant_tsc",
+
"rep_good",
+
"nopl",
+
"xtopology",
+
"nonstop_tsc",
+
"cpuid",
+
"extd_apicid",
+
"aperfmperf",
+
"rapl",
+
"pni",
+
"pclmulqdq",
+
"monitor",
+
"ssse3",
+
"fma",
+
"cx16",
+
"sse4_1",
+
"sse4_2",
+
"x2apic",
+
"movbe",
+
"popcnt",
+
"aes",
+
"xsave",
+
"avx",
+
"f16c",
+
"rdrand",
+
"lahf_lm",
+
"cmp_legacy",
+
"svm",
+
"extapic",
+
"cr8_legacy",
+
"abm",
+
"sse4a",
+
"misalignsse",
+
"3dnowprefetch",
+
"osvw",
+
"ibs",
+
"skinit",
+
"wdt",
+
"tce",
+
"topoext",
+
"perfctr_core",
+
"perfctr_nb",
+
"bpext",
+
"perfctr_llc",
+
"mwaitx",
+
"cpb",
+
"cat_l3",
+
"cdp_l3",
+
"hw_pstate",
+
"ssbd",
+
"mba",
+
"ibrs",
+
"ibpb",
+
"stibp",
+
"vmmcall",
+
"fsgsbase",
+
"bmi1",
+
"avx2",
+
"smep",
+
"bmi2",
+
"erms",
+
"invpcid",
+
"cqm",
+
"rdt_a",
+
"rdseed",
+
"adx",
+
"smap",
+
"clflushopt",
+
"clwb",
+
"sha_ni",
+
"xsaveopt",
+
"xsavec",
+
"xgetbv1",
+
"xsaves",
+
"cqm_llc",
+
"cqm_occup_llc",
+
"cqm_mbm_total",
+
"cqm_mbm_local",
+
"user_shstk",
+
"clzero",
+
"irperf",
+
"xsaveerptr",
+
"rdpru",
+
"wbnoinvd",
+
"arat",
+
"npt",
+
"lbrv",
+
"svm_lock",
+
"nrip_save",
+
"tsc_scale",
+
"vmcb_clean",
+
"flushbyasid",
+
"decodeassists",
+
"pausefilter",
+
"pfthreshold",
+
"avic",
+
"v_vmsave_vmload",
+
"vgif",
+
"v_spec_ctrl",
+
"umip",
+
"pku",
+
"ospke",
+
"vaes",
+
"vpclmulqdq",
+
"rdpid",
+
"overflow_recov",
+
"succor",
+
"smca",
+
"fsrm",
+
"debug_swap"
+
],
+
"bugs": [
+
"sysret_ss_attrs",
+
"spectre_v1",
+
"spectre_v2",
+
"spec_store_bypass",
+
"srso",
+
"ibpb_no_ret",
+
"spectre_v2_user",
+
"tsa",
+
"vmscape"
+
],
+
"power_management": [
+
"ts",
+
"ttp",
+
"tm",
+
"hwpstate",
+
"cpb",
+
"eff_freq_ro",
+
"[13]",
+
"[14]"
+
],
+
"bogo": 6986,
+
"cache": 512,
+
"units": 12,
+
"physical_id": 0,
+
"siblings": 12,
+
"cores": 6,
+
"fpu": true,
+
"fpu_exception": true,
+
"cpuid_level": 16,
+
"write_protect": false,
+
"tlb_size": 2560,
+
"clflush_size": 64,
+
"cache_alignment": 64,
+
"address_sizes": {
+
"physical": "0x30",
+
"virtual": "0x30"
+
}
+
}
+
],
+
"disk": [
+
{
+
"index": 58,
+
"attached_to": 29,
+
"class_list": [
+
"disk",
+
"block_device",
+
"nvme"
+
],
+
"bus_type": {
+
"hex": "0096",
+
"name": "NVME",
+
"value": 150
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0106",
+
"name": "Mass Storage Device",
+
"value": 262
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Disk",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "2646",
+
"value": 9798
+
},
+
"sub_vendor": {
+
"hex": "2646",
+
"value": 9798
+
},
+
"device": {
+
"hex": "5017",
+
"name": "KINGSTON SNV2S1000G",
+
"value": 20503
+
},
+
"sub_device": {
+
"hex": "5017",
+
"value": 20503
+
},
+
"serial": "50026B768692AC90",
+
"model": "KINGSTON SNV2S1000G",
+
"sysfs_id": "/class/block/nvme0n1",
+
"sysfs_bus_id": "nvme0",
+
"sysfs_device_link": "/devices/pci0000:00/0000:00:01.1/0000:01:00.0/nvme/nvme0",
+
"unix_device_names": [
+
"/dev/disk/by-id/nvme-KINGSTON_SNV2S1000G_50026B768692AC90",
+
"/dev/disk/by-id/nvme-KINGSTON_SNV2S1000G_50026B768692AC90_1",
+
"/dev/disk/by-id/nvme-eui.00000000000000000026b768692ac905",
+
"/dev/disk/by-path/pci-0000:01:00.0-nvme-1",
+
"/dev/nvme0n1"
+
],
+
"resources": [
+
{
+
"type": "disk_geo",
+
"cylinders": 953869,
+
"heads": 64,
+
"sectors": 32,
+
"size": "0x0",
+
"geo_type": "logical"
+
},
+
{
+
"type": "size",
+
"unit": "sectors",
+
"value_1": 1953525168,
+
"value_2": 512
+
}
+
],
+
"driver": "nvme",
+
"driver_module": "nvme",
+
"drivers": [
+
"nvme"
+
],
+
"driver_modules": [
+
"nvme"
+
]
+
},
+
{
+
"index": 59,
+
"attached_to": 24,
+
"class_list": [
+
"disk",
+
"usb",
+
"scsi",
+
"block_device"
+
],
+
"bus_type": {
+
"hex": "0084",
+
"name": "SCSI",
+
"value": 132
+
},
+
"slot": {
+
"bus": 6,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0106",
+
"name": "Mass Storage Device",
+
"value": 262
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Disk",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "0951",
+
"name": "Kingston",
+
"value": 2385
+
},
+
"device": {
+
"hex": "176b",
+
"name": "XS2000",
+
"value": 5995
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "1000",
+
"value": 0
+
},
+
"serial": "E71000000000",
+
"model": "Kingston XS2000",
+
"sysfs_id": "/class/block/sda",
+
"sysfs_bus_id": "6:0:0:0",
+
"sysfs_device_link": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-1/1-1:1.0/host6/target6:0:0/6:0:0:0",
+
"unix_device_names": [
+
"/dev/disk/by-id/ata-XS2000_50026B7283281E03",
+
"/dev/disk/by-id/usb-Kingston_XS2000_50026B7283281E03-0:0",
+
"/dev/disk/by-path/pci-0000:02:00.0-usb-0:1:1.0-scsi-0:0:0:0",
+
"/dev/disk/by-path/pci-0000:02:00.0-usbv2-0:1:1.0-scsi-0:0:0:0",
+
"/dev/sda"
+
],
+
"unix_device_name2": "/dev/sg0",
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 480000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
},
+
{
+
"type": "disk_geo",
+
"cylinders": 62260,
+
"heads": 255,
+
"sectors": 63,
+
"size": "0x0",
+
"geo_type": "logical"
+
},
+
{
+
"type": "size",
+
"unit": "sectors",
+
"value_1": 1000215216,
+
"value_2": 512
+
}
+
],
+
"driver": "usb-storage",
+
"driver_module": "usb_storage",
+
"drivers": [
+
"sd",
+
"usb-storage"
+
],
+
"driver_modules": [
+
"usb_storage"
+
],
+
"driver_info": {
+
"type": "module",
+
"db_entry_0": [
+
"uas"
+
],
+
"active": true,
+
"modprobe": true,
+
"names": [
+
"uas"
+
],
+
"module_args": [
+
""
+
],
+
"conf": ""
+
},
+
"module_alias": "usb:v0951p176Bd0100dc00dsc00dp00ic08isc06ip50in00"
+
},
+
{
+
"index": 60,
+
"attached_to": 0,
+
"class_list": [
+
"disk",
+
"block_device"
+
],
+
"base_class": {
+
"hex": "0106",
+
"name": "Mass Storage Device",
+
"value": 262
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Disk",
+
"value": 0
+
},
+
"model": "Disk",
+
"sysfs_id": "/class/block/zram0",
+
"unix_device_names": [
+
"/dev/disk/by-label/zram0",
+
"/dev/disk/by-uuid/5441b8e4-1cd5-4553-9a7d-9687b7597ae7",
+
"/dev/zram0"
+
],
+
"resources": [
+
{
+
"type": "size",
+
"unit": "sectors",
+
"value_1": 4072448,
+
"value_2": 4096
+
}
+
]
+
}
+
],
+
"graphics_card": [
+
{
+
"index": 31,
+
"attached_to": 39,
+
"class_list": [
+
"graphics_card",
+
"pci"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 7,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0003",
+
"name": "Display controller",
+
"value": 3
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "VGA compatible controller",
+
"value": 0
+
},
+
"pci_interface": {
+
"hex": "0000",
+
"name": "VGA",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1002",
+
"name": "ATI Technologies Inc",
+
"value": 4098
+
},
+
"sub_vendor": {
+
"hex": "1da2",
+
"value": 7586
+
},
+
"device": {
+
"hex": "7480",
+
"value": 29824
+
},
+
"sub_device": {
+
"hex": "e482",
+
"value": 58498
+
},
+
"revision": {
+
"hex": "00c0",
+
"value": 192
+
},
+
"model": "ATI VGA compatible controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:03.1/0000:05:00.0/0000:06:00.0/0000:07:00.0",
+
"sysfs_bus_id": "0000:07:00.0",
+
"sysfs_iommu_group_id": 18,
+
"resources": [
+
{
+
"type": "io",
+
"base": 57344,
+
"range": 256,
+
"enabled": true,
+
"access": "read_write"
+
}
+
],
+
"detail": {
+
"function": 0,
+
"command": 1031,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"driver": "amdgpu",
+
"driver_module": "amdgpu",
+
"drivers": [
+
"amdgpu"
+
],
+
"driver_modules": [
+
"amdgpu"
+
],
+
"driver_info": {
+
"type": "module",
+
"db_entry_0": [
+
"amdgpu"
+
],
+
"active": true,
+
"modprobe": true,
+
"names": [
+
"amdgpu"
+
],
+
"module_args": [
+
""
+
],
+
"conf": ""
+
},
+
"module_alias": "pci:v00001002d00007480sv00001DA2sd0000E482bc03sc00i00"
+
}
+
],
+
"hub": [
+
{
+
"index": 65,
+
"attached_to": 34,
+
"class_list": [
+
"usb",
+
"hub"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "010a",
+
"name": "Hub",
+
"value": 266
+
},
+
"vendor": {
+
"hex": "1d6b",
+
"name": "Linux 6.17.4-cachyos1.lto.fc43.x86_64 xhci-hcd",
+
"value": 7531
+
},
+
"device": {
+
"hex": "0002",
+
"name": "xHCI Host Controller",
+
"value": 2
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "6.17",
+
"value": 0
+
},
+
"serial": "0000:09:00.3",
+
"model": "Linux 6.17.4-cachyos1.lto.fc43.x86_64 xhci-hcd xHCI Host Controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:08.1/0000:09:00.3/usb3/3-0:1.0",
+
"sysfs_bus_id": "3-0:1.0",
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 480000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "0009",
+
"name": "hub",
+
"value": 9
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 1,
+
"interface_class": {
+
"hex": "0009",
+
"name": "hub",
+
"value": 9
+
},
+
"interface_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"interface_protocol": 0,
+
"interface_number": 0,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "hub",
+
"driver_module": "usbcore",
+
"drivers": [
+
"hub"
+
],
+
"driver_modules": [
+
"usbcore"
+
],
+
"module_alias": "usb:v1D6Bp0002d0617dc09dsc00dp01ic09isc00ip00in00"
+
},
+
{
+
"index": 68,
+
"attached_to": 34,
+
"class_list": [
+
"usb",
+
"hub"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "010a",
+
"name": "Hub",
+
"value": 266
+
},
+
"vendor": {
+
"hex": "1d6b",
+
"name": "Linux 6.17.4-cachyos1.lto.fc43.x86_64 xhci-hcd",
+
"value": 7531
+
},
+
"device": {
+
"hex": "0003",
+
"name": "xHCI Host Controller",
+
"value": 3
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "6.17",
+
"value": 0
+
},
+
"serial": "0000:09:00.3",
+
"model": "Linux 6.17.4-cachyos1.lto.fc43.x86_64 xhci-hcd xHCI Host Controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:08.1/0000:09:00.3/usb4/4-0:1.0",
+
"sysfs_bus_id": "4-0:1.0",
+
"detail": {
+
"device_class": {
+
"hex": "0009",
+
"name": "hub",
+
"value": 9
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 3,
+
"interface_class": {
+
"hex": "0009",
+
"name": "hub",
+
"value": 9
+
},
+
"interface_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"interface_protocol": 0,
+
"interface_number": 0,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "hub",
+
"driver_module": "usbcore",
+
"drivers": [
+
"hub"
+
],
+
"driver_modules": [
+
"usbcore"
+
],
+
"module_alias": "usb:v1D6Bp0003d0617dc09dsc00dp03ic09isc00ip00in00"
+
},
+
{
+
"index": 71,
+
"attached_to": 24,
+
"class_list": [
+
"usb",
+
"hub"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "010a",
+
"name": "Hub",
+
"value": 266
+
},
+
"vendor": {
+
"hex": "1d6b",
+
"name": "Linux 6.17.4-cachyos1.lto.fc43.x86_64 xhci-hcd",
+
"value": 7531
+
},
+
"device": {
+
"hex": "0002",
+
"name": "xHCI Host Controller",
+
"value": 2
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "6.17",
+
"value": 0
+
},
+
"serial": "0000:02:00.0",
+
"model": "Linux 6.17.4-cachyos1.lto.fc43.x86_64 xhci-hcd xHCI Host Controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-0:1.0",
+
"sysfs_bus_id": "1-0:1.0",
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 480000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "0009",
+
"name": "hub",
+
"value": 9
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 1,
+
"interface_class": {
+
"hex": "0009",
+
"name": "hub",
+
"value": 9
+
},
+
"interface_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"interface_protocol": 0,
+
"interface_number": 0,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "hub",
+
"driver_module": "usbcore",
+
"drivers": [
+
"hub"
+
],
+
"driver_modules": [
+
"usbcore"
+
],
+
"module_alias": "usb:v1D6Bp0002d0617dc09dsc00dp01ic09isc00ip00in00"
+
},
+
{
+
"index": 76,
+
"attached_to": 24,
+
"class_list": [
+
"usb",
+
"hub"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "010a",
+
"name": "Hub",
+
"value": 266
+
},
+
"vendor": {
+
"hex": "1d6b",
+
"name": "Linux 6.17.4-cachyos1.lto.fc43.x86_64 xhci-hcd",
+
"value": 7531
+
},
+
"device": {
+
"hex": "0003",
+
"name": "xHCI Host Controller",
+
"value": 3
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "6.17",
+
"value": 0
+
},
+
"serial": "0000:02:00.0",
+
"model": "Linux 6.17.4-cachyos1.lto.fc43.x86_64 xhci-hcd xHCI Host Controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb2/2-0:1.0",
+
"sysfs_bus_id": "2-0:1.0",
+
"detail": {
+
"device_class": {
+
"hex": "0009",
+
"name": "hub",
+
"value": 9
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 3,
+
"interface_class": {
+
"hex": "0009",
+
"name": "hub",
+
"value": 9
+
},
+
"interface_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"interface_protocol": 0,
+
"interface_number": 0,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "hub",
+
"driver_module": "usbcore",
+
"drivers": [
+
"hub"
+
],
+
"driver_modules": [
+
"usbcore"
+
],
+
"module_alias": "usb:v1D6Bp0003d0617dc09dsc00dp03ic09isc00ip00in00"
+
}
+
],
+
"keyboard": [
+
{
+
"index": 67,
+
"attached_to": 71,
+
"class_list": [
+
"keyboard",
+
"usb"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0108",
+
"name": "Keyboard",
+
"value": 264
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Keyboard",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "3434",
+
"name": "Keychron",
+
"value": 13364
+
},
+
"device": {
+
"hex": "0340",
+
"name": "Keychron V4",
+
"value": 832
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "1.04",
+
"value": 0
+
},
+
"model": "Keychron V4",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-7/1-7:1.0",
+
"sysfs_bus_id": "1-7:1.0",
+
"unix_device_names": [
+
"/dev/input/by-id/usb-Keychron_Keychron_V4-event-kbd",
+
"/dev/input/by-path/pci-0000:02:00.0-usb-0:7:1.0-event-kbd",
+
"/dev/input/by-path/pci-0000:02:00.0-usbv2-0:7:1.0-event-kbd",
+
"/dev/input/event2"
+
],
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 12000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 0,
+
"interface_class": {
+
"hex": "0003",
+
"name": "hid",
+
"value": 3
+
},
+
"interface_subclass": {
+
"hex": "0001",
+
"name": "audio",
+
"value": 1
+
},
+
"interface_protocol": 1,
+
"interface_number": 0,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "usbhid",
+
"driver_module": "usbhid",
+
"drivers": [
+
"usbhid"
+
],
+
"driver_modules": [
+
"usbhid"
+
],
+
"driver_info": {
+
"type": "keyboard",
+
"xkb_rules": "xfree86",
+
"xkb_model": "pc104"
+
},
+
"module_alias": "usb:v3434p0340d0104dc00dsc00dp00ic03isc01ip01in00"
+
}
+
],
+
"memory": [
+
{
+
"index": 15,
+
"attached_to": 0,
+
"class_list": [
+
"memory"
+
],
+
"base_class": {
+
"hex": "0101",
+
"name": "Internally Used Class",
+
"value": 257
+
},
+
"sub_class": {
+
"hex": "0002",
+
"name": "Main Memory",
+
"value": 2
+
},
+
"model": "Main Memory",
+
"resources": [
+
{
+
"type": "phys_mem",
+
"range": 17179869184
+
}
+
]
+
}
+
],
+
"monitor": [
+
{
+
"index": 55,
+
"attached_to": 31,
+
"class_list": [
+
"monitor"
+
],
+
"base_class": {
+
"hex": "0100",
+
"name": "Monitor",
+
"value": 256
+
},
+
"sub_class": {
+
"hex": "0002",
+
"name": "LCD Monitor",
+
"value": 2
+
},
+
"vendor": {
+
"hex": "4c2d",
+
"name": "SAMSUNG",
+
"value": 19501
+
},
+
"device": {
+
"hex": "7098",
+
"name": "LF27T450F",
+
"value": 28824
+
},
+
"serial": "H4ZT300817",
+
"model": "SAMSUNG LF27T450F",
+
"resources": [
+
{
+
"type": "monitor",
+
"width": 1024,
+
"height": 768,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1024,
+
"height": 768,
+
"vertical_frequency": 70,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1024,
+
"height": 768,
+
"vertical_frequency": 75,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1280,
+
"height": 1024,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1280,
+
"height": 1024,
+
"vertical_frequency": 75,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1280,
+
"height": 720,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1920,
+
"height": 1080,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 640,
+
"height": 480,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 640,
+
"height": 480,
+
"vertical_frequency": 67,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 640,
+
"height": 480,
+
"vertical_frequency": 72,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 640,
+
"height": 480,
+
"vertical_frequency": 75,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 720,
+
"height": 400,
+
"vertical_frequency": 70,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 800,
+
"height": 600,
+
"vertical_frequency": 56,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 800,
+
"height": 600,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 800,
+
"height": 600,
+
"vertical_frequency": 72,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 800,
+
"height": 600,
+
"vertical_frequency": 75,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 832,
+
"height": 624,
+
"vertical_frequency": 75,
+
"interlaced": false
+
},
+
{
+
"type": "size",
+
"unit": "mm",
+
"value_1": 597,
+
"value_2": 336
+
}
+
],
+
"detail": {
+
"manufacture_year": 2022,
+
"manufacture_week": 11,
+
"vertical_sync": {
+
"min": 48,
+
"max": 75
+
},
+
"horizontal_sync": {
+
"min": 30,
+
"max": 84
+
},
+
"horizontal_sync_timings": {
+
"disp": 1920,
+
"sync_start": 2008,
+
"sync_end": 2052,
+
"total": 2200
+
},
+
"vertical_sync_timings": {
+
"disp": 1080,
+
"sync_start": 1084,
+
"sync_end": 1089,
+
"total": 1125
+
},
+
"clock": 148500,
+
"width": 1920,
+
"height": 1080,
+
"width_millimetres": 597,
+
"height_millimetres": 336,
+
"horizontal_flag": 43,
+
"vertical_flag": 43,
+
"vendor": "",
+
"name": "LF27T450F"
+
},
+
"driver_info": {
+
"type": "display",
+
"width": 1920,
+
"height": 1080,
+
"vertical_sync": {
+
"min": 48,
+
"max": 75
+
},
+
"horizontal_sync": {
+
"min": 30,
+
"max": 84
+
},
+
"bandwidth": 0,
+
"horizontal_sync_timings": {
+
"disp": 1920,
+
"sync_start": 2008,
+
"sync_end": 2052,
+
"total": 2200
+
},
+
"vertical_sync_timings": {
+
"disp": 1080,
+
"sync_start": 1084,
+
"sync_end": 1089,
+
"total": 1125
+
},
+
"horizontal_flag": 43,
+
"vertical_flag": 43
+
}
+
},
+
{
+
"index": 56,
+
"attached_to": 31,
+
"class_list": [
+
"monitor"
+
],
+
"base_class": {
+
"hex": "0100",
+
"name": "Monitor",
+
"value": 256
+
},
+
"sub_class": {
+
"hex": "0002",
+
"name": "LCD Monitor",
+
"value": 2
+
},
+
"vendor": {
+
"hex": "5a63",
+
"name": "VIEWSONIC",
+
"value": 23139
+
},
+
"device": {
+
"hex": "1a3d",
+
"name": "VX2418C SER",
+
"value": 6717
+
},
+
"serial": "WUE233740040",
+
"model": "VIEWSONIC VX2418C SER",
+
"resources": [
+
{
+
"type": "monitor",
+
"width": 1024,
+
"height": 768,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1024,
+
"height": 768,
+
"vertical_frequency": 70,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1024,
+
"height": 768,
+
"vertical_frequency": 75,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1280,
+
"height": 1024,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1280,
+
"height": 1024,
+
"vertical_frequency": 75,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1280,
+
"height": 720,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1280,
+
"height": 960,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1400,
+
"height": 1050,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1920,
+
"height": 1080,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 640,
+
"height": 480,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 640,
+
"height": 480,
+
"vertical_frequency": 67,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 640,
+
"height": 480,
+
"vertical_frequency": 72,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 640,
+
"height": 480,
+
"vertical_frequency": 75,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 720,
+
"height": 400,
+
"vertical_frequency": 70,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 800,
+
"height": 600,
+
"vertical_frequency": 56,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 800,
+
"height": 600,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 800,
+
"height": 600,
+
"vertical_frequency": 72,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 800,
+
"height": 600,
+
"vertical_frequency": 75,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 832,
+
"height": 624,
+
"vertical_frequency": 75,
+
"interlaced": false
+
},
+
{
+
"type": "size",
+
"unit": "mm",
+
"value_1": 521,
+
"value_2": 293
+
}
+
],
+
"detail": {
+
"manufacture_year": 2023,
+
"manufacture_week": 37,
+
"vertical_sync": {
+
"min": 48,
+
"max": 165
+
},
+
"horizontal_sync": {
+
"min": 193,
+
"max": 193
+
},
+
"horizontal_sync_timings": {
+
"disp": 1920,
+
"sync_start": 2008,
+
"sync_end": 2052,
+
"total": 2200
+
},
+
"vertical_sync_timings": {
+
"disp": 1080,
+
"sync_start": 1084,
+
"sync_end": 1089,
+
"total": 1125
+
},
+
"clock": 148500,
+
"width": 1920,
+
"height": 1080,
+
"width_millimetres": 521,
+
"height_millimetres": 293,
+
"horizontal_flag": 43,
+
"vertical_flag": 43,
+
"vendor": "",
+
"name": "VX2418C SER"
+
},
+
"driver_info": {
+
"type": "display",
+
"width": 1920,
+
"height": 1080,
+
"vertical_sync": {
+
"min": 48,
+
"max": 165
+
},
+
"horizontal_sync": {
+
"min": 193,
+
"max": 193
+
},
+
"bandwidth": 0,
+
"horizontal_sync_timings": {
+
"disp": 1920,
+
"sync_start": 2008,
+
"sync_end": 2052,
+
"total": 2200
+
},
+
"vertical_sync_timings": {
+
"disp": 1080,
+
"sync_start": 1084,
+
"sync_end": 1089,
+
"total": 1125
+
},
+
"horizontal_flag": 43,
+
"vertical_flag": 43
+
}
+
}
+
],
+
"mouse": [
+
{
+
"index": 66,
+
"attached_to": 71,
+
"class_list": [
+
"mouse",
+
"usb"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0105",
+
"name": "Mouse",
+
"value": 261
+
},
+
"sub_class": {
+
"hex": "0003",
+
"name": "USB Mouse",
+
"value": 3
+
},
+
"vendor": {
+
"hex": "3434",
+
"name": "Keychron",
+
"value": 13364
+
},
+
"device": {
+
"hex": "0340",
+
"name": "Keychron V4",
+
"value": 832
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "1.04",
+
"value": 0
+
},
+
"compat_vendor": "Unknown",
+
"compat_device": "Generic USB Mouse",
+
"model": "Keychron V4",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-7/1-7:1.2",
+
"sysfs_bus_id": "1-7:1.2",
+
"unix_device_names": [
+
"/dev/input/mice"
+
],
+
"unix_device_name2": "/dev/input/mouse0",
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 12000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 0,
+
"interface_class": {
+
"hex": "0003",
+
"name": "hid",
+
"value": 3
+
},
+
"interface_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"interface_protocol": 0,
+
"interface_number": 2,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "usbhid",
+
"driver_module": "usbhid",
+
"drivers": [
+
"usbhid"
+
],
+
"driver_modules": [
+
"usbhid"
+
],
+
"driver_info": {
+
"type": "mouse",
+
"db_entry_0": [
+
"explorerps/2",
+
"exps2"
+
],
+
"xf86": "explorerps/2",
+
"gpm": "exps2",
+
"buttons": -1,
+
"wheels": -1
+
},
+
"module_alias": "usb:v3434p0340d0104dc00dsc00dp00ic03isc00ip00in02"
+
}
+
],
+
"network_controller": [
+
{
+
"index": 48,
+
"attached_to": 22,
+
"class_list": [
+
"network_controller",
+
"pci"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 4,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0002",
+
"name": "Network controller",
+
"value": 2
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Ethernet controller",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "10ec",
+
"value": 4332
+
},
+
"sub_vendor": {
+
"hex": "1458",
+
"value": 5208
+
},
+
"device": {
+
"hex": "8168",
+
"value": 33128
+
},
+
"sub_device": {
+
"hex": "e000",
+
"value": 57344
+
},
+
"revision": {
+
"hex": "0015",
+
"value": 21
+
},
+
"model": "Ethernet controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.2/0000:03:03.0/0000:04:00.0",
+
"sysfs_bus_id": "0000:04:00.0",
+
"sysfs_iommu_group_id": 15,
+
"unix_device_names": [
+
"enp4s0"
+
],
+
"resources": [
+
{
+
"type": "hwaddr",
+
"address": 55
+
},
+
{
+
"type": "io",
+
"base": 61440,
+
"range": 256,
+
"enabled": true,
+
"access": "read_write"
+
},
+
{
+
"type": "phwaddr",
+
"address": 55
+
}
+
],
+
"detail": {
+
"function": 0,
+
"command": 1031,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"driver": "r8169",
+
"driver_module": "r8169",
+
"drivers": [
+
"r8169"
+
],
+
"driver_modules": [
+
"r8169"
+
],
+
"driver_info": {
+
"type": "module",
+
"db_entry_0": [
+
"r8169"
+
],
+
"active": true,
+
"modprobe": true,
+
"names": [
+
"r8169"
+
],
+
"module_args": [
+
""
+
],
+
"conf": ""
+
},
+
"module_alias": "pci:v000010ECd00008168sv00001458sd0000E000bc02sc00i00"
+
}
+
],
+
"network_interface": [
+
{
+
"index": 78,
+
"attached_to": 0,
+
"class_list": [
+
"network_interface"
+
],
+
"base_class": {
+
"hex": "0107",
+
"name": "Network Interface",
+
"value": 263
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Loopback",
+
"value": 0
+
},
+
"model": "Loopback network interface",
+
"sysfs_id": "/class/net/lo",
+
"unix_device_names": [
+
"lo"
+
]
+
},
+
{
+
"index": 79,
+
"attached_to": 48,
+
"class_list": [
+
"network_interface"
+
],
+
"base_class": {
+
"hex": "0107",
+
"name": "Network Interface",
+
"value": 263
+
},
+
"sub_class": {
+
"hex": "0001",
+
"name": "Ethernet",
+
"value": 1
+
},
+
"model": "Ethernet network interface",
+
"sysfs_id": "/class/net/enp4s0",
+
"sysfs_device_link": "/devices/pci0000:00/0000:00:01.2/0000:02:00.2/0000:03:03.0/0000:04:00.0",
+
"unix_device_names": [
+
"enp4s0"
+
],
+
"resources": [
+
{
+
"type": "hwaddr",
+
"address": 55
+
},
+
{
+
"type": "phwaddr",
+
"address": 55
+
}
+
],
+
"driver": "r8169",
+
"driver_module": "r8169",
+
"drivers": [
+
"r8169"
+
],
+
"driver_modules": [
+
"r8169"
+
]
+
}
+
],
+
"pci": [
+
{
+
"index": 19,
+
"attached_to": 36,
+
"class_list": [
+
"pci",
+
"unknown"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 9,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0013",
+
"value": 19
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1485",
+
"value": 5253
+
},
+
"sub_device": {
+
"hex": "1485",
+
"value": 5253
+
},
+
"model": "unknown unknown",
+
"sysfs_id": "/devices/pci0000:00/0000:00:08.1/0000:09:00.0",
+
"sysfs_bus_id": "0000:09:00.0",
+
"sysfs_iommu_group_id": 21,
+
"detail": {
+
"function": 0,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001485sv00001022sd00001485bc13sc00i00"
+
},
+
{
+
"index": 26,
+
"attached_to": 46,
+
"class_list": [
+
"pci",
+
"unknown"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 8,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0013",
+
"value": 19
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "148a",
+
"value": 5258
+
},
+
"sub_device": {
+
"hex": "148a",
+
"value": 5258
+
},
+
"model": "unknown unknown",
+
"sysfs_id": "/devices/pci0000:00/0000:00:07.1/0000:08:00.0",
+
"sysfs_bus_id": "0000:08:00.0",
+
"sysfs_iommu_group_id": 20,
+
"detail": {
+
"function": 0,
+
"command": 0,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d0000148Asv00001022sd0000148Abc13sc00i00"
+
},
+
{
+
"index": 32,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"unknown"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0008",
+
"name": "Generic system peripheral",
+
"value": 8
+
},
+
"sub_class": {
+
"hex": "0006",
+
"value": 6
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1481",
+
"value": 5249
+
},
+
"sub_device": {
+
"hex": "1481",
+
"value": 5249
+
},
+
"model": "AMD Generic system peripheral",
+
"sysfs_id": "/devices/pci0000:00/0000:00:00.2",
+
"sysfs_bus_id": "0000:00:00.2",
+
"detail": {
+
"function": 2,
+
"command": 1088,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00001022d00001481sv00001022sd00001481bc08sc06i00"
+
},
+
{
+
"index": 38,
+
"attached_to": 36,
+
"class_list": [
+
"pci",
+
"unknown"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 9,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0010",
+
"name": "Encryption controller",
+
"value": 16
+
},
+
"sub_class": {
+
"hex": "0080",
+
"name": "Encryption controller",
+
"value": 128
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"device": {
+
"hex": "1486",
+
"value": 5254
+
},
+
"sub_device": {
+
"hex": "1486",
+
"value": 5254
+
},
+
"model": "AMD Encryption controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:08.1/0000:09:00.1",
+
"sysfs_bus_id": "0000:09:00.1",
+
"sysfs_iommu_group_id": 22,
+
"detail": {
+
"function": 1,
+
"command": 1030,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"driver": "ccp",
+
"driver_module": "ccp",
+
"drivers": [
+
"ccp"
+
],
+
"driver_modules": [
+
"ccp"
+
],
+
"driver_info": {
+
"type": "module",
+
"db_entry_0": [
+
"ccp"
+
],
+
"active": true,
+
"modprobe": true,
+
"names": [
+
"ccp"
+
],
+
"module_args": [
+
""
+
],
+
"conf": ""
+
},
+
"module_alias": "pci:v00001022d00001486sv00001022sd00001486bc10sc80i00"
+
},
+
{
+
"index": 52,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"unknown"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 20
+
},
+
"base_class": {
+
"hex": "000c",
+
"name": "Serial bus controller",
+
"value": 12
+
},
+
"sub_class": {
+
"hex": "0005",
+
"name": "SMBus",
+
"value": 5
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1458",
+
"value": 5208
+
},
+
"device": {
+
"hex": "790b",
+
"value": 30987
+
},
+
"sub_device": {
+
"hex": "5001",
+
"value": 20481
+
},
+
"revision": {
+
"hex": "0061",
+
"value": 97
+
},
+
"model": "AMD SMBus",
+
"sysfs_id": "/devices/pci0000:00/0000:00:14.0",
+
"sysfs_bus_id": "0000:00:14.0",
+
"sysfs_iommu_group_id": 12,
+
"detail": {
+
"function": 0,
+
"command": 1027,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"driver_info": {
+
"type": "module",
+
"db_entry_0": [
+
"i2c_piix4"
+
],
+
"active": true,
+
"modprobe": true,
+
"names": [
+
"i2c_piix4"
+
],
+
"module_args": [
+
""
+
],
+
"conf": ""
+
},
+
"module_alias": "pci:v00001022d0000790Bsv00001458sd00005001bc0Csc05i00"
+
}
+
],
+
"sound": [
+
{
+
"index": 47,
+
"attached_to": 39,
+
"class_list": [
+
"sound",
+
"pci"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 7,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0004",
+
"name": "Multimedia controller",
+
"value": 4
+
},
+
"sub_class": {
+
"hex": "0003",
+
"value": 3
+
},
+
"vendor": {
+
"hex": "1002",
+
"name": "ATI Technologies Inc",
+
"value": 4098
+
},
+
"sub_vendor": {
+
"hex": "1002",
+
"name": "ATI Technologies Inc",
+
"value": 4098
+
},
+
"device": {
+
"hex": "ab30",
+
"value": 43824
+
},
+
"sub_device": {
+
"hex": "ab30",
+
"value": 43824
+
},
+
"model": "ATI Multimedia controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:03.1/0000:05:00.0/0000:06:00.0/0000:07:00.1",
+
"sysfs_bus_id": "0000:07:00.1",
+
"sysfs_iommu_group_id": 19,
+
"detail": {
+
"function": 1,
+
"command": 1030,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"driver": "snd_hda_intel",
+
"driver_module": "snd_hda_intel",
+
"drivers": [
+
"snd_hda_intel"
+
],
+
"driver_modules": [
+
"snd_hda_intel"
+
],
+
"driver_info": {
+
"type": "module",
+
"db_entry_0": [
+
"snd_hda_intel"
+
],
+
"active": true,
+
"modprobe": true,
+
"names": [
+
"snd_hda_intel"
+
],
+
"module_args": [
+
""
+
],
+
"conf": ""
+
},
+
"module_alias": "pci:v00001002d0000AB30sv00001002sd0000AB30bc04sc03i00"
+
},
+
{
+
"index": 51,
+
"attached_to": 36,
+
"class_list": [
+
"sound",
+
"pci"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 9,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0004",
+
"name": "Multimedia controller",
+
"value": 4
+
},
+
"sub_class": {
+
"hex": "0003",
+
"value": 3
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1458",
+
"value": 5208
+
},
+
"device": {
+
"hex": "1487",
+
"value": 5255
+
},
+
"sub_device": {
+
"hex": "a194",
+
"value": 41364
+
},
+
"model": "AMD Multimedia controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:08.1/0000:09:00.4",
+
"sysfs_bus_id": "0000:09:00.4",
+
"sysfs_iommu_group_id": 24,
+
"detail": {
+
"function": 4,
+
"command": 1030,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 0
+
},
+
"driver": "snd_hda_intel",
+
"driver_module": "snd_hda_intel",
+
"drivers": [
+
"snd_hda_intel"
+
],
+
"driver_modules": [
+
"snd_hda_intel"
+
],
+
"driver_info": {
+
"type": "module",
+
"db_entry_0": [
+
"snd_hda_intel"
+
],
+
"active": true,
+
"modprobe": true,
+
"names": [
+
"snd_hda_intel"
+
],
+
"module_args": [
+
""
+
],
+
"conf": ""
+
},
+
"module_alias": "pci:v00001022d00001487sv00001458sd0000A194bc04sc03i00",
+
"label": "Realtek ALC1220"
+
},
+
{
+
"index": 64,
+
"attached_to": 71,
+
"class_list": [
+
"sound",
+
"usb"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0004",
+
"name": "Multimedia controller",
+
"value": 4
+
},
+
"sub_class": {
+
"hex": "0001",
+
"name": "Multimedia audio controller",
+
"value": 1
+
},
+
"vendor": {
+
"hex": "17a0",
+
"name": "Samson Technologies",
+
"value": 6048
+
},
+
"device": {
+
"hex": "0304",
+
"name": "Samson Q2U Microphone",
+
"value": 772
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "10.03",
+
"value": 0
+
},
+
"model": "Samson Q2U Microphone",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-8/1-8:1.1",
+
"sysfs_bus_id": "1-8:1.1",
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 12000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 0,
+
"interface_class": {
+
"hex": "0001",
+
"name": "audio",
+
"value": 1
+
},
+
"interface_subclass": {
+
"hex": "0002",
+
"name": "comm",
+
"value": 2
+
},
+
"interface_protocol": 0,
+
"interface_number": 1,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "snd-usb-audio",
+
"driver_module": "snd_usb_audio",
+
"drivers": [
+
"snd-usb-audio"
+
],
+
"driver_modules": [
+
"snd_usb_audio"
+
],
+
"module_alias": "usb:v17A0p0304d1003dc00dsc00dp00ic01isc02ip00in01"
+
},
+
{
+
"index": 70,
+
"attached_to": 71,
+
"class_list": [
+
"sound",
+
"usb"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0004",
+
"name": "Multimedia controller",
+
"value": 4
+
},
+
"sub_class": {
+
"hex": "0001",
+
"name": "Multimedia audio controller",
+
"value": 1
+
},
+
"vendor": {
+
"hex": "17a0",
+
"name": "Samson Technologies",
+
"value": 6048
+
},
+
"device": {
+
"hex": "0304",
+
"name": "Samson Q2U Microphone",
+
"value": 772
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "10.03",
+
"value": 0
+
},
+
"model": "Samson Q2U Microphone",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-8/1-8:1.2",
+
"sysfs_bus_id": "1-8:1.2",
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 12000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 0,
+
"interface_class": {
+
"hex": "0001",
+
"name": "audio",
+
"value": 1
+
},
+
"interface_subclass": {
+
"hex": "0002",
+
"name": "comm",
+
"value": 2
+
},
+
"interface_protocol": 0,
+
"interface_number": 2,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "snd-usb-audio",
+
"driver_module": "snd_usb_audio",
+
"drivers": [
+
"snd-usb-audio"
+
],
+
"driver_modules": [
+
"snd_usb_audio"
+
],
+
"module_alias": "usb:v17A0p0304d1003dc00dsc00dp00ic01isc02ip00in02"
+
},
+
{
+
"index": 73,
+
"attached_to": 71,
+
"class_list": [
+
"sound",
+
"usb"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0004",
+
"name": "Multimedia controller",
+
"value": 4
+
},
+
"sub_class": {
+
"hex": "0001",
+
"name": "Multimedia audio controller",
+
"value": 1
+
},
+
"vendor": {
+
"hex": "17a0",
+
"name": "Samson Technologies",
+
"value": 6048
+
},
+
"device": {
+
"hex": "0304",
+
"name": "Samson Q2U Microphone",
+
"value": 772
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "10.03",
+
"value": 0
+
},
+
"model": "Samson Q2U Microphone",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-8/1-8:1.0",
+
"sysfs_bus_id": "1-8:1.0",
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 12000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 0,
+
"interface_class": {
+
"hex": "0001",
+
"name": "audio",
+
"value": 1
+
},
+
"interface_subclass": {
+
"hex": "0001",
+
"name": "audio",
+
"value": 1
+
},
+
"interface_protocol": 0,
+
"interface_number": 0,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "snd-usb-audio",
+
"driver_module": "snd_usb_audio",
+
"drivers": [
+
"snd-usb-audio"
+
],
+
"driver_modules": [
+
"snd_usb_audio"
+
],
+
"driver_info": {
+
"type": "module",
+
"db_entry_0": [
+
"snd_usb_audio"
+
],
+
"active": true,
+
"modprobe": true,
+
"names": [
+
"snd_usb_audio"
+
],
+
"module_args": [
+
""
+
],
+
"conf": ""
+
},
+
"module_alias": "usb:v17A0p0304d1003dc00dsc00dp00ic01isc01ip00in00"
+
}
+
],
+
"storage_controller": [
+
{
+
"index": 29,
+
"attached_to": 43,
+
"class_list": [
+
"storage_controller",
+
"pci"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 1,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0001",
+
"name": "Mass storage controller",
+
"value": 1
+
},
+
"sub_class": {
+
"hex": "0008",
+
"value": 8
+
},
+
"pci_interface": {
+
"hex": "0002",
+
"value": 2
+
},
+
"vendor": {
+
"hex": "2646",
+
"value": 9798
+
},
+
"sub_vendor": {
+
"hex": "2646",
+
"value": 9798
+
},
+
"device": {
+
"hex": "5017",
+
"value": 20503
+
},
+
"sub_device": {
+
"hex": "5017",
+
"value": 20503
+
},
+
"revision": {
+
"hex": "0003",
+
"value": 3
+
},
+
"model": "Mass storage controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.1/0000:01:00.0",
+
"sysfs_bus_id": "0000:01:00.0",
+
"sysfs_iommu_group_id": 14,
+
"detail": {
+
"function": 0,
+
"command": 1030,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 2
+
},
+
"driver": "nvme",
+
"driver_module": "nvme",
+
"drivers": [
+
"nvme"
+
],
+
"driver_modules": [
+
"nvme"
+
],
+
"driver_info": {
+
"type": "module",
+
"db_entry_0": [
+
"nvme"
+
],
+
"active": true,
+
"modprobe": true,
+
"names": [
+
"nvme"
+
],
+
"module_args": [
+
""
+
],
+
"conf": ""
+
},
+
"module_alias": "pci:v00002646d00005017sv00002646sd00005017bc01sc08i02"
+
},
+
{
+
"index": 42,
+
"attached_to": 21,
+
"class_list": [
+
"storage_controller",
+
"pci"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 2,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0001",
+
"name": "Mass storage controller",
+
"value": 1
+
},
+
"sub_class": {
+
"hex": "0006",
+
"value": 6
+
},
+
"pci_interface": {
+
"hex": "0001",
+
"value": 1
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1b21",
+
"value": 6945
+
},
+
"device": {
+
"hex": "43eb",
+
"value": 17387
+
},
+
"sub_device": {
+
"hex": "1062",
+
"value": 4194
+
},
+
"model": "AMD Mass storage controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.1",
+
"sysfs_bus_id": "0000:02:00.1",
+
"sysfs_iommu_group_id": 15,
+
"detail": {
+
"function": 1,
+
"command": 1030,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 1
+
},
+
"driver": "ahci",
+
"driver_module": "ahci",
+
"drivers": [
+
"ahci"
+
],
+
"driver_modules": [
+
"ahci"
+
],
+
"module_alias": "pci:v00001022d000043EBsv00001B21sd00001062bc01sc06i01"
+
}
+
],
+
"system": {
+
"form_factor": "desktop"
+
},
+
"unknown": [
+
{
+
"index": 57,
+
"attached_to": 0,
+
"class_list": [
+
"unknown"
+
],
+
"base_class": {
+
"hex": "0007",
+
"name": "Communication controller",
+
"value": 7
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Serial controller",
+
"value": 0
+
},
+
"pci_interface": {
+
"hex": "0002",
+
"name": "16550",
+
"value": 2
+
},
+
"device": {
+
"hex": "0000",
+
"name": "16550A",
+
"value": 0
+
},
+
"model": "16550A",
+
"unix_device_names": [
+
"/dev/ttyS0"
+
],
+
"resources": [
+
{
+
"type": "io",
+
"base": 1016,
+
"range": 0,
+
"enabled": true,
+
"access": "read_write"
+
}
+
]
+
}
+
],
+
"usb": [
+
{
+
"index": 61,
+
"attached_to": 71,
+
"class_list": [
+
"usb",
+
"unknown"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0000",
+
"name": "Unclassified device",
+
"value": 0
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Unclassified device",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "048d",
+
"name": "Integrated Technology Express",
+
"value": 1165
+
},
+
"device": {
+
"hex": "5702",
+
"name": "ITE Device",
+
"value": 22274
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "0.01",
+
"value": 0
+
},
+
"model": "Integrated Technology Express ITE Device",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-9/1-9:1.0",
+
"sysfs_bus_id": "1-9:1.0",
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 12000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 0,
+
"interface_class": {
+
"hex": "0003",
+
"name": "hid",
+
"value": 3
+
},
+
"interface_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"interface_protocol": 0,
+
"interface_number": 0,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "usbhid",
+
"driver_module": "usbhid",
+
"drivers": [
+
"usbhid"
+
],
+
"driver_modules": [
+
"usbhid"
+
],
+
"module_alias": "usb:v048Dp5702d0001dc00dsc00dp00ic03isc00ip00in00"
+
},
+
{
+
"index": 62,
+
"attached_to": 71,
+
"class_list": [
+
"usb",
+
"unknown"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0000",
+
"name": "Unclassified device",
+
"value": 0
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Unclassified device",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "17a0",
+
"name": "Samson Technologies",
+
"value": 6048
+
},
+
"device": {
+
"hex": "0304",
+
"name": "Samson Q2U Microphone",
+
"value": 772
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "10.03",
+
"value": 0
+
},
+
"model": "Samson Q2U Microphone",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-8/1-8:1.3",
+
"sysfs_bus_id": "1-8:1.3",
+
"unix_device_names": [
+
"/dev/input/by-id/usb-Samson_Technologies_Samson_Q2U_Microphone-event-if03",
+
"/dev/input/by-path/pci-0000:02:00.0-usb-0:8:1.3-event",
+
"/dev/input/by-path/pci-0000:02:00.0-usbv2-0:8:1.3-event",
+
"/dev/input/event7"
+
],
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 12000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 0,
+
"interface_class": {
+
"hex": "0003",
+
"name": "hid",
+
"value": 3
+
},
+
"interface_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"interface_protocol": 0,
+
"interface_number": 3,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "usbhid",
+
"driver_module": "usbhid",
+
"drivers": [
+
"usbhid"
+
],
+
"driver_modules": [
+
"usbhid"
+
],
+
"module_alias": "usb:v17A0p0304d1003dc00dsc00dp00ic03isc00ip00in03"
+
},
+
{
+
"index": 72,
+
"attached_to": 71,
+
"class_list": [
+
"usb",
+
"unknown"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0000",
+
"name": "Unclassified device",
+
"value": 0
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Unclassified device",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1e71",
+
"name": "NZXT, Inc.",
+
"value": 7793
+
},
+
"device": {
+
"hex": "2012",
+
"name": "NZXT RGB Controller",
+
"value": 8210
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "1.05",
+
"value": 0
+
},
+
"serial": "0500F00DAA0154A863145AC6",
+
"model": "NZXT RGB Controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-4/1-4:1.0",
+
"sysfs_bus_id": "1-4:1.0",
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 12000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 0,
+
"interface_class": {
+
"hex": "0003",
+
"name": "hid",
+
"value": 3
+
},
+
"interface_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"interface_protocol": 0,
+
"interface_number": 0,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "usbhid",
+
"driver_module": "usbhid",
+
"drivers": [
+
"usbhid"
+
],
+
"driver_modules": [
+
"usbhid"
+
],
+
"module_alias": "usb:v1E71p2012d0105dc00dsc00dp00ic03isc00ip00in00"
+
},
+
{
+
"index": 75,
+
"attached_to": 71,
+
"class_list": [
+
"usb",
+
"unknown"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0000",
+
"name": "Unclassified device",
+
"value": 0
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Unclassified device",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "3434",
+
"name": "Keychron",
+
"value": 13364
+
},
+
"device": {
+
"hex": "0340",
+
"name": "Keychron V4",
+
"value": 832
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "1.04",
+
"value": 0
+
},
+
"model": "Keychron V4",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-7/1-7:1.1",
+
"sysfs_bus_id": "1-7:1.1",
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 12000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 0,
+
"interface_class": {
+
"hex": "0003",
+
"name": "hid",
+
"value": 3
+
},
+
"interface_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"interface_protocol": 0,
+
"interface_number": 1,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "usbhid",
+
"driver_module": "usbhid",
+
"drivers": [
+
"usbhid"
+
],
+
"driver_modules": [
+
"usbhid"
+
],
+
"module_alias": "usb:v3434p0340d0104dc00dsc00dp00ic03isc00ip00in01"
+
}
+
],
+
"usb_controller": [
+
{
+
"index": 24,
+
"attached_to": 21,
+
"class_list": [
+
"usb_controller",
+
"pci"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 2,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "000c",
+
"name": "Serial bus controller",
+
"value": 12
+
},
+
"sub_class": {
+
"hex": "0003",
+
"name": "USB Controller",
+
"value": 3
+
},
+
"pci_interface": {
+
"hex": "0030",
+
"value": 48
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1b21",
+
"value": 6945
+
},
+
"device": {
+
"hex": "43ec",
+
"value": 17388
+
},
+
"sub_device": {
+
"hex": "1142",
+
"value": 4418
+
},
+
"model": "AMD USB Controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/0000:02:00.0",
+
"sysfs_bus_id": "0000:02:00.0",
+
"sysfs_iommu_group_id": 15,
+
"detail": {
+
"function": 0,
+
"command": 1030,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 48
+
},
+
"driver": "xhci_hcd",
+
"driver_module": "xhci_pci",
+
"drivers": [
+
"xhci_hcd"
+
],
+
"driver_modules": [
+
"xhci_pci"
+
],
+
"module_alias": "pci:v00001022d000043ECsv00001B21sd00001142bc0Csc03i30"
+
},
+
{
+
"index": 34,
+
"attached_to": 36,
+
"class_list": [
+
"usb_controller",
+
"pci"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 9,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "000c",
+
"name": "Serial bus controller",
+
"value": 12
+
},
+
"sub_class": {
+
"hex": "0003",
+
"name": "USB Controller",
+
"value": 3
+
},
+
"pci_interface": {
+
"hex": "0030",
+
"value": 48
+
},
+
"vendor": {
+
"hex": "1022",
+
"name": "AMD",
+
"value": 4130
+
},
+
"sub_vendor": {
+
"hex": "1458",
+
"value": 5208
+
},
+
"device": {
+
"hex": "149c",
+
"value": 5276
+
},
+
"sub_device": {
+
"hex": "5007",
+
"value": 20487
+
},
+
"model": "AMD USB Controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:08.1/0000:09:00.3",
+
"sysfs_bus_id": "0000:09:00.3",
+
"sysfs_iommu_group_id": 23,
+
"detail": {
+
"function": 3,
+
"command": 1031,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"prog_if": 48
+
},
+
"driver": "xhci_hcd",
+
"driver_module": "xhci_pci",
+
"drivers": [
+
"xhci_hcd"
+
],
+
"driver_modules": [
+
"xhci_pci"
+
],
+
"module_alias": "pci:v00001022d0000149Csv00001458sd00005007bc0Csc03i30"
+
}
+
]
+
},
+
"smbios": {
+
"bios": {
+
"handle": 0,
+
"vendor": "American Megatrends International, LLC.",
+
"version": "F16",
+
"date": "06/08/2023",
+
"features": [
+
"PCI supported",
+
"BIOS flashable",
+
"BIOS shadowing allowed",
+
"CD boot supported",
+
"Selectable boot supported",
+
"BIOS ROM socketed",
+
"EDD spec supported",
+
"1.2MB NEC 9800 Japanese Floppy supported",
+
"1.2MB Toshiba Japanese Floppy supported",
+
"360kB Floppy supported",
+
"1.2MB Floppy supported",
+
"720kB Floppy supported",
+
"2.88MB Floppy supported",
+
"Print Screen supported",
+
"Serial Services supported",
+
"Printer Services supported",
+
"CGA/Mono Video supported",
+
"USB Legacy supported",
+
"BIOS Boot Spec supported"
+
],
+
"start_address": "0xf0000",
+
"rom_size": 16777216
+
},
+
"board": {
+
"handle": 2,
+
"manufacturer": "Gigabyte Technology Co., Ltd.",
+
"product": "A520M H",
+
"version": "x.x",
+
"board_type": {
+
"hex": "000a",
+
"name": "Motherboard",
+
"value": 10
+
},
+
"features": [
+
"Hosting Board",
+
"Replaceable"
+
],
+
"location": "Default string",
+
"chassis": 3
+
},
+
"cache": [
+
{
+
"handle": 14,
+
"socket": "L1 - Cache",
+
"size_max": 384,
+
"size_current": 384,
+
"speed": 1,
+
"mode": {
+
"hex": "0001",
+
"name": "Write Back",
+
"value": 1
+
},
+
"enabled": true,
+
"location": {
+
"hex": "0000",
+
"name": "Internal",
+
"value": 0
+
},
+
"socketed": false,
+
"level": 0,
+
"ecc": {
+
"hex": "0006",
+
"name": "Multi-bit",
+
"value": 6
+
},
+
"cache_type": {
+
"hex": "0005",
+
"name": "Unified",
+
"value": 5
+
},
+
"associativity": {
+
"hex": "0007",
+
"name": "8-way Set-Associative",
+
"value": 7
+
},
+
"sram_type_current": [
+
"Pipeline Burst"
+
],
+
"sram_type_supported": [
+
"Pipeline Burst"
+
]
+
},
+
{
+
"handle": 15,
+
"socket": "L2 - Cache",
+
"size_max": 3072,
+
"size_current": 3072,
+
"speed": 1,
+
"mode": {
+
"hex": "0001",
+
"name": "Write Back",
+
"value": 1
+
},
+
"enabled": true,
+
"location": {
+
"hex": "0000",
+
"name": "Internal",
+
"value": 0
+
},
+
"socketed": false,
+
"level": 1,
+
"ecc": {
+
"hex": "0006",
+
"name": "Multi-bit",
+
"value": 6
+
},
+
"cache_type": {
+
"hex": "0005",
+
"name": "Unified",
+
"value": 5
+
},
+
"associativity": {
+
"hex": "0007",
+
"name": "8-way Set-Associative",
+
"value": 7
+
},
+
"sram_type_current": [
+
"Pipeline Burst"
+
],
+
"sram_type_supported": [
+
"Pipeline Burst"
+
]
+
},
+
{
+
"handle": 16,
+
"socket": "L3 - Cache",
+
"size_max": 32768,
+
"size_current": 32768,
+
"speed": 1,
+
"mode": {
+
"hex": "0001",
+
"name": "Write Back",
+
"value": 1
+
},
+
"enabled": true,
+
"location": {
+
"hex": "0000",
+
"name": "Internal",
+
"value": 0
+
},
+
"socketed": false,
+
"level": 2,
+
"ecc": {
+
"hex": "0006",
+
"name": "Multi-bit",
+
"value": 6
+
},
+
"cache_type": {
+
"hex": "0005",
+
"name": "Unified",
+
"value": 5
+
},
+
"associativity": {
+
"hex": "0008",
+
"name": "16-way Set-Associative",
+
"value": 8
+
},
+
"sram_type_current": [
+
"Pipeline Burst"
+
],
+
"sram_type_supported": [
+
"Pipeline Burst"
+
]
+
}
+
],
+
"chassis": [
+
{
+
"handle": 3,
+
"manufacturer": "Default string",
+
"version": "Default string",
+
"chassis_type": {
+
"hex": "0003",
+
"name": "Desktop",
+
"value": 3
+
},
+
"lock_present": false,
+
"bootup_state": {
+
"hex": "0003",
+
"name": "Safe",
+
"value": 3
+
},
+
"power_state": {
+
"hex": "0003",
+
"name": "Safe",
+
"value": 3
+
},
+
"thermal_state": {
+
"hex": "0003",
+
"name": "Safe",
+
"value": 3
+
},
+
"security_state": {
+
"hex": "0003",
+
"name": "None",
+
"value": 3
+
},
+
"oem": "0x0"
+
}
+
],
+
"config": {
+
"handle": 6,
+
"options": [
+
"Default string"
+
]
+
},
+
"language": [
+
{
+
"handle": 51,
+
"languages": [
+
"en|US|iso8859-1",
+
"zh|TW|unicode",
+
"zh|CN|unicode",
+
"ru|RU|iso8859-5",
+
"de|DE|iso8859-1",
+
"ja|JP|unicode",
+
"ko|KR|unicode",
+
"es|ES|iso8859-1",
+
"fr|FR|iso8859-1",
+
"it|IT|iso8859-1",
+
"pt|PT|iso8859-1",
+
"vi|VI|iso8859-1",
+
"id|ID|iso8859-1",
+
"tr|TR|iso8859-1",
+
"pl|PL|iso8859-1"
+
]
+
}
+
],
+
"memory_array": [
+
{
+
"handle": 11,
+
"location": {
+
"hex": "0003",
+
"name": "Motherboard",
+
"value": 3
+
},
+
"usage": {
+
"hex": "0003",
+
"name": "System memory",
+
"value": 3
+
},
+
"ecc": {
+
"hex": "0003",
+
"name": "None",
+
"value": 3
+
},
+
"max_size": "0x8000000",
+
"error_handle": 10,
+
"slots": 4
+
}
+
],
+
"memory_array_mapped_address": [
+
{
+
"handle": 12,
+
"array_handle": 11,
+
"start_address": "0x0",
+
"end_address": "0xc0000000",
+
"part_width": 2
+
},
+
{
+
"handle": 13,
+
"array_handle": 11,
+
"start_address": "0x100000000",
+
"end_address": "0x440000000",
+
"part_width": 2
+
}
+
],
+
"memory_device": [
+
{
+
"handle": 19,
+
"location": "DIMM 0",
+
"bank_location": "P0 CHANNEL A",
+
"manufacturer": "Unknown",
+
"part_number": "Unknown",
+
"array_handle": 11,
+
"error_handle": 18,
+
"width": 0,
+
"ecc_bits": 0,
+
"size": 0,
+
"form_factor": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"set": 0,
+
"memory_type": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"memory_type_details": [
+
"Unknown"
+
],
+
"speed": 0
+
},
+
{
+
"handle": 21,
+
"location": "DIMM 1",
+
"bank_location": "P0 CHANNEL A",
+
"manufacturer": "Unknown",
+
"part_number": "IRP3600D4V64L18S/8G",
+
"array_handle": 11,
+
"error_handle": 20,
+
"width": 64,
+
"ecc_bits": 0,
+
"size": 8388608,
+
"form_factor": {
+
"hex": "0009",
+
"name": "DIMM",
+
"value": 9
+
},
+
"set": 0,
+
"memory_type": {
+
"hex": "001a",
+
"name": "Other",
+
"value": 26
+
},
+
"memory_type_details": [
+
"Synchronous"
+
],
+
"speed": 3600
+
},
+
{
+
"handle": 24,
+
"location": "DIMM 0",
+
"bank_location": "P0 CHANNEL B",
+
"manufacturer": "Unknown",
+
"part_number": "Unknown",
+
"array_handle": 11,
+
"error_handle": 23,
+
"width": 0,
+
"ecc_bits": 0,
+
"size": 0,
+
"form_factor": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"set": 0,
+
"memory_type": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"memory_type_details": [
+
"Unknown"
+
],
+
"speed": 0
+
},
+
{
+
"handle": 26,
+
"location": "DIMM 1",
+
"bank_location": "P0 CHANNEL B",
+
"manufacturer": "Unknown",
+
"part_number": "IRP3600D4V64L18S/8G",
+
"array_handle": 11,
+
"error_handle": 25,
+
"width": 64,
+
"ecc_bits": 0,
+
"size": 8388608,
+
"form_factor": {
+
"hex": "0009",
+
"name": "DIMM",
+
"value": 9
+
},
+
"set": 0,
+
"memory_type": {
+
"hex": "001a",
+
"name": "Other",
+
"value": 26
+
},
+
"memory_type_details": [
+
"Synchronous"
+
],
+
"speed": 3600
+
}
+
],
+
"memory_device_mapped_address": [
+
{
+
"handle": 22,
+
"memory_device_handle": 21,
+
"array_map_handle": 13,
+
"start_address": "0x0",
+
"end_address": "0x400000000",
+
"row_position": 255,
+
"interleave_position": 255,
+
"interleave_depth": 255
+
},
+
{
+
"handle": 27,
+
"memory_device_handle": 26,
+
"array_map_handle": 13,
+
"start_address": "0x0",
+
"end_address": "0x400000000",
+
"row_position": 255,
+
"interleave_position": 255,
+
"interleave_depth": 255
+
}
+
],
+
"memory_error": [
+
{
+
"handle": 10,
+
"error_type": {
+
"hex": "0003",
+
"name": "OK",
+
"value": 3
+
},
+
"granularity": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"operation": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"syndrome": 0,
+
"array_address": "0x80000000",
+
"device_address": "0x80000000",
+
"range": 2147483648
+
},
+
{
+
"handle": 18,
+
"error_type": {
+
"hex": "0003",
+
"name": "OK",
+
"value": 3
+
},
+
"granularity": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"operation": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"syndrome": 0,
+
"array_address": "0x80000000",
+
"device_address": "0x80000000",
+
"range": 2147483648
+
},
+
{
+
"handle": 20,
+
"error_type": {
+
"hex": "0003",
+
"name": "OK",
+
"value": 3
+
},
+
"granularity": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"operation": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"syndrome": 0,
+
"array_address": "0x80000000",
+
"device_address": "0x80000000",
+
"range": 2147483648
+
},
+
{
+
"handle": 23,
+
"error_type": {
+
"hex": "0003",
+
"name": "OK",
+
"value": 3
+
},
+
"granularity": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"operation": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"syndrome": 0,
+
"array_address": "0x80000000",
+
"device_address": "0x80000000",
+
"range": 2147483648
+
},
+
{
+
"handle": 25,
+
"error_type": {
+
"hex": "0003",
+
"name": "OK",
+
"value": 3
+
},
+
"granularity": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"operation": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"syndrome": 0,
+
"array_address": "0x80000000",
+
"device_address": "0x80000000",
+
"range": 2147483648
+
}
+
],
+
"onboard": [
+
{
+
"handle": 4,
+
"devices": [
+
{
+
"name": "To Be Filled By O.E.M.",
+
"type": {
+
"hex": "0003",
+
"name": "Video",
+
"value": 3
+
},
+
"enabled": true
+
}
+
]
+
}
+
],
+
"port_connector": [
+
{
+
"handle": 28,
+
"port_type": {
+
"hex": "0010",
+
"name": "USB",
+
"value": 16
+
},
+
"internal_reference_designator": "J1500",
+
"external_connector_type": {
+
"hex": "0012",
+
"name": "Access Bus [USB]",
+
"value": 18
+
},
+
"external_reference_designator": "USB 3.2"
+
},
+
{
+
"handle": 29,
+
"port_type": {
+
"hex": "0010",
+
"name": "USB",
+
"value": 16
+
},
+
"internal_reference_designator": "J1501",
+
"external_connector_type": {
+
"hex": "0012",
+
"name": "Access Bus [USB]",
+
"value": 18
+
},
+
"external_reference_designator": "USB 3.2"
+
},
+
{
+
"handle": 30,
+
"port_type": {
+
"hex": "0010",
+
"name": "USB",
+
"value": 16
+
},
+
"internal_reference_designator": "J1502",
+
"external_connector_type": {
+
"hex": "0012",
+
"name": "Access Bus [USB]",
+
"value": 18
+
},
+
"external_reference_designator": "USB-C"
+
},
+
{
+
"handle": 31,
+
"port_type": {
+
"hex": "0010",
+
"name": "USB",
+
"value": 16
+
},
+
"internal_reference_designator": "J1506",
+
"external_connector_type": {
+
"hex": "0012",
+
"name": "Access Bus [USB]",
+
"value": 18
+
},
+
"external_reference_designator": "USB 3.2"
+
},
+
{
+
"handle": 32,
+
"port_type": {
+
"hex": "0010",
+
"name": "USB",
+
"value": 16
+
},
+
"internal_reference_designator": "J1507",
+
"external_connector_type": {
+
"hex": "0012",
+
"name": "Access Bus [USB]",
+
"value": 18
+
},
+
"external_reference_designator": "USB 3.2"
+
},
+
{
+
"handle": 33,
+
"port_type": {
+
"hex": "0010",
+
"name": "USB",
+
"value": 16
+
},
+
"internal_reference_designator": "J1301",
+
"external_connector_type": {
+
"hex": "0012",
+
"name": "Access Bus [USB]",
+
"value": 18
+
},
+
"external_reference_designator": "USB 3.2"
+
},
+
{
+
"handle": 34,
+
"port_type": {
+
"hex": "001f",
+
"name": "Network Port",
+
"value": 31
+
},
+
"internal_reference_designator": "J1301",
+
"external_connector_type": {
+
"hex": "000b",
+
"name": "RJ-45",
+
"value": 11
+
},
+
"external_reference_designator": "Network"
+
},
+
{
+
"handle": 35,
+
"port_type": {
+
"hex": "0020",
+
"name": "Other",
+
"value": 32
+
},
+
"internal_connector_type": {
+
"hex": "0022",
+
"name": "Other",
+
"value": 34
+
},
+
"internal_reference_designator": "J1704",
+
"external_reference_designator": "iSATA"
+
},
+
{
+
"handle": 36,
+
"port_type": {
+
"hex": "0020",
+
"name": "Other",
+
"value": 32
+
},
+
"internal_connector_type": {
+
"hex": "0022",
+
"name": "Other",
+
"value": 34
+
},
+
"internal_reference_designator": "J1705",
+
"external_reference_designator": "iSATA"
+
},
+
{
+
"handle": 37,
+
"port_type": {
+
"hex": "0020",
+
"name": "Other",
+
"value": 32
+
},
+
"internal_connector_type": {
+
"hex": "0022",
+
"name": "Other",
+
"value": 34
+
},
+
"internal_reference_designator": "J1700",
+
"external_reference_designator": "iSATA"
+
},
+
{
+
"handle": 38,
+
"port_type": {
+
"hex": "0020",
+
"name": "Other",
+
"value": 32
+
},
+
"internal_connector_type": {
+
"hex": "0022",
+
"name": "Other",
+
"value": 34
+
},
+
"internal_reference_designator": "J1702",
+
"external_reference_designator": "iSATA"
+
},
+
{
+
"handle": 39,
+
"port_type": {
+
"hex": "0020",
+
"name": "Other",
+
"value": 32
+
},
+
"internal_connector_type": {
+
"hex": "0022",
+
"name": "Other",
+
"value": 34
+
},
+
"internal_reference_designator": "J1703",
+
"external_reference_designator": "iSATA"
+
},
+
{
+
"handle": 40,
+
"port_type": {
+
"hex": "0020",
+
"name": "Other",
+
"value": 32
+
},
+
"internal_connector_type": {
+
"hex": "0022",
+
"name": "Other",
+
"value": 34
+
},
+
"internal_reference_designator": "J1706",
+
"external_reference_designator": "iSATA"
+
},
+
{
+
"handle": 41,
+
"port_type": {
+
"hex": "001c",
+
"name": "Video Port",
+
"value": 28
+
},
+
"internal_reference_designator": "J1100",
+
"external_reference_designator": "HDMI"
+
},
+
{
+
"handle": 42,
+
"port_type": {
+
"hex": "001c",
+
"name": "Video Port",
+
"value": 28
+
},
+
"internal_reference_designator": "J1101",
+
"external_reference_designator": "HDMI"
+
},
+
{
+
"handle": 43,
+
"port_type": {
+
"hex": "001c",
+
"name": "Video Port",
+
"value": 28
+
},
+
"internal_reference_designator": "J1102",
+
"external_reference_designator": "DP"
+
},
+
{
+
"handle": 44,
+
"port_type": {
+
"hex": "001d",
+
"name": "Audio Port",
+
"value": 29
+
},
+
"internal_reference_designator": "J2100",
+
"external_connector_type": {
+
"hex": "001f",
+
"name": "Mini-jack [headphones]",
+
"value": 31
+
},
+
"external_reference_designator": "Front Audio"
+
},
+
{
+
"handle": 45,
+
"port_type": {
+
"hex": "001d",
+
"name": "Audio Port",
+
"value": 29
+
},
+
"internal_reference_designator": "J2101",
+
"external_connector_type": {
+
"hex": "001f",
+
"name": "Mini-jack [headphones]",
+
"value": 31
+
},
+
"external_reference_designator": "Audio Jack"
+
},
+
{
+
"handle": 46,
+
"port_type": {
+
"hex": "001d",
+
"name": "Audio Port",
+
"value": 29
+
},
+
"internal_reference_designator": "J2102",
+
"external_connector_type": {
+
"hex": "001f",
+
"name": "Mini-jack [headphones]",
+
"value": 31
+
},
+
"external_reference_designator": "HD Audio HDR"
+
}
+
],
+
"processor": [
+
{
+
"handle": 17,
+
"socket": "AM4",
+
"socket_type": {
+
"hex": "0031",
+
"name": "Other",
+
"value": 49
+
},
+
"socket_populated": true,
+
"manufacturer": "Advanced Micro Devices, Inc.",
+
"version": "AMD Ryzen 5 5600 6-Core Processor",
+
"part": "Unknown",
+
"processor_type": {
+
"hex": "0003",
+
"name": "CPU",
+
"value": 3
+
},
+
"processor_family": {
+
"hex": "006b",
+
"name": "Other",
+
"value": 107
+
},
+
"processor_status": {
+
"hex": "0001",
+
"name": "Enabled",
+
"value": 1
+
},
+
"clock_ext": 100,
+
"clock_max": 4450,
+
"cache_handle_l1": 14,
+
"cache_handle_l2": 15,
+
"cache_handle_l3": 16
+
}
+
],
+
"slot": [
+
{
+
"handle": 47,
+
"designation": "J10",
+
"slot_type": {
+
"hex": "00aa",
+
"name": "Other",
+
"value": 170
+
},
+
"bus_width": {
+
"hex": "000d",
+
"name": "Other",
+
"value": 13
+
},
+
"usage": {
+
"hex": "0004",
+
"name": "In Use",
+
"value": 4
+
},
+
"length": {
+
"hex": "0003",
+
"name": "Short",
+
"value": 3
+
},
+
"id": 12,
+
"features": [
+
"3.3 V",
+
"PME#"
+
]
+
},
+
{
+
"handle": 48,
+
"designation": "J3700 M.2 Slot",
+
"slot_type": {
+
"hex": "00a6",
+
"name": "Other",
+
"value": 166
+
},
+
"bus_width": {
+
"hex": "0008",
+
"name": "Other",
+
"value": 8
+
},
+
"usage": {
+
"hex": "0004",
+
"name": "In Use",
+
"value": 4
+
},
+
"length": {
+
"hex": "0003",
+
"name": "Short",
+
"value": 3
+
},
+
"id": 14,
+
"features": [
+
"3.3 V",
+
"PME#"
+
]
+
},
+
{
+
"handle": 49,
+
"designation": "J3708 PCIE x4 slot from Promontory",
+
"slot_type": {
+
"hex": "00a8",
+
"name": "Other",
+
"value": 168
+
},
+
"bus_width": {
+
"hex": "000a",
+
"name": "Other",
+
"value": 10
+
},
+
"usage": {
+
"hex": "0003",
+
"name": "Available",
+
"value": 3
+
},
+
"length": {
+
"hex": "0003",
+
"name": "Short",
+
"value": 3
+
},
+
"id": 128,
+
"features": [
+
"3.3 V",
+
"PME#"
+
]
+
}
+
],
+
"system": {
+
"handle": 1,
+
"manufacturer": "Gigabyte Technology Co., Ltd.",
+
"product": "A520M H",
+
"version": "-CF",
+
"wake_up": {
+
"hex": "0006",
+
"name": "Power Switch",
+
"value": 6
+
}
+
}
+
}
+
}
+8
hosts/chernobog/modules/ananicy.nix
···
+
{ pkgs, ... }:
+
{
+
services.ananicy = {
+
enable = true;
+
package = pkgs.ananicy-cpp;
+
rulesProvider = pkgs.ananicy-rules-cachyos_git;
+
};
+
}
+53
hosts/chernobog/modules/audio.nix
···
+
{ pkgs, ... }:
+
let
+
rate = 48000;
+
quant = 512;
+
quantRateMax = "${toString quant}/${toString rate}";
+
quantRateMin = "${toString (quant / 2)}/${toString rate}";
+
in
+
{
+
imports = [ ../../../modules/audio/desktop-audio.nix ];
+
+
environment.systemPackages = with pkgs; [
+
helvum
+
pwvucontrol
+
];
+
+
security.rtkit.enable = true;
+
services.pipewire = {
+
enable = true;
+
audio.enable = true;
+
alsa.enable = true;
+
alsa.support32Bit = true;
+
pulse.enable = true;
+
jack.enable = true;
+
};
+
+
services.pipewire.extraConfig.pipewire."92-low-latency" = {
+
"context.properties" = {
+
"default.clock.rate" = rate;
+
"default.clock.quantum" = quant;
+
"default.clock.min-quantum" = quant / 2;
+
"default.clock.max-quantum" = quant;
+
};
+
};
+
+
services.pipewire.extraConfig.pipewire-pulse."92-low-latency" = {
+
context.modules = [
+
{
+
name = "libpipewire-module-protocol-pulse";
+
args = {
+
pulse.min.req = quantRateMin;
+
pulse.default.req = quantRateMax;
+
pulse.max.req = quantRateMax;
+
pulse.min.quantum = quantRateMin;
+
pulse.max.quantum = quantRateMax;
+
};
+
}
+
];
+
stream.properties = {
+
node.latency = quantRateMax;
+
resample.quality = 1;
+
};
+
};
+
}
+8
hosts/chernobog/modules/auto-mount.nix
···
+
{
+
services.udisks2.enable = true;
+
home-manager.sharedModules = [
+
{
+
services.udiskie.enable = true;
+
}
+
];
+
}
+6
hosts/chernobog/modules/bluetooth.nix
···
+
{pkgs, ...}: {
+
hardware.bluetooth.enable = true;
+
hardware.steam-hardware.enable = true;
+
+
environment.systemPackages = [pkgs.bluetuith];
+
}
+9
hosts/chernobog/modules/boot.nix
···
+
{
+
boot.loader.systemd-boot = {
+
enable = true;
+
editor = false;
+
configurationLimit = 20;
+
consoleMode = "max";
+
};
+
boot.loader.efi.canTouchEfiVariables = true;
+
}
+3
hosts/chernobog/modules/cosmic.disabled
···
+
{
+
imports = [ ../../../modules/de/cosmic.nix ];
+
}
+47
hosts/chernobog/modules/disk-config.nix
···
+
{
+
disko.devices = {
+
disk = {
+
main = {
+
type = "disk";
+
device = "/dev/nvme0n1";
+
content = {
+
type = "gpt";
+
partitions = {
+
ESP = {
+
priority = 1;
+
size = "500M";
+
type = "EF00";
+
content = {
+
type = "filesystem";
+
format = "vfat";
+
mountpoint = "/boot";
+
mountOptions = [ "umask=0077" ];
+
};
+
};
+
root = {
+
priority = 2;
+
end = "-14G";
+
content = {
+
type = "btrfs";
+
extraArgs = [ "-f" ];
+
mountpoint = "/";
+
mountOptions = [
+
"compress=zstd"
+
"noatime"
+
];
+
};
+
};
+
plainSwap = {
+
priority = 3;
+
size = "100%";
+
content = {
+
type = "swap";
+
discardPolicy = "both";
+
};
+
};
+
};
+
};
+
};
+
};
+
};
+
}
+5
hosts/chernobog/modules/fix-wake.nix
···
+
{
+
services.udev.extraRules = ''
+
ACTION=="add", KERNELS=="0000:00:01.1", ATTR{power/wakeup}="disabled"
+
'';
+
}
+17
hosts/chernobog/modules/greetd.nix
···
+
{ pkgs, ... }:
+
{
+
services.greetd = {
+
enable = true;
+
settings = {
+
terminal.vt = 1;
+
default_session = {
+
command = "${pkgs.tuigreet}/bin/tuigreet --issue --time --cmd niri-session";
+
user = "greeter";
+
};
+
};
+
};
+
systemd.services = {
+
"getty@tty1".enable = false;
+
"autovt@tty1".enable = false;
+
};
+
}
+4
hosts/chernobog/modules/kernel.nix
···
+
{ pkgs, ... }:
+
{
+
boot.kernelPackages = pkgs.linuxPackages_cachyos-lto;
+
}
+1
hosts/chernobog/modules/keychron-v4.nix
···
+
../../../modules/keyboards/keychron-v4/default.nix
+71
hosts/chernobog/modules/lact.nix/config.yaml
···
+
version: 5
+
daemon:
+
log_level: info
+
admin_group: wheel
+
disable_clocks_cleanup: false
+
apply_settings_timer: 5
+
gpus:
+
1002:7480-1DA2:E482-0000:07:00.0:
+
fan_control_enabled: false
+
pmfw_options:
+
minimum_pwm: 30
+
zero_rpm: true
+
zero_rpm_threshold: 43
+
power_cap: 198.0
+
performance_level: auto
+
max_core_clock: 3200
+
max_memory_clock: 1250
+
voltage_offset: -50
+
profiles:
+
oc:
+
gpus:
+
1002:7480-1DA2:E482-0000:07:00.0:
+
fan_control_enabled: false
+
fan_control_settings:
+
mode: static
+
static_speed: 1.0
+
temperature_key: edge
+
interval_ms: 500
+
curve:
+
40: 0.3
+
50: 0.35
+
60: 0.5
+
70: 0.75
+
80: 1.0
+
pmfw_options:
+
minimum_pwm: 15
+
target_temperature: 88
+
zero_rpm: false
+
zero_rpm_threshold: 40
+
power_cap: 198.0
+
performance_level: auto
+
max_core_clock: 3200
+
max_memory_clock: 1250
+
voltage_offset: -50
+
helldivers:
+
gpus:
+
1002:7480-1DA2:E482-0000:07:00.0:
+
fan_control_enabled: false
+
fan_control_settings:
+
mode: static
+
static_speed: 1.0
+
temperature_key: edge
+
interval_ms: 500
+
curve:
+
40: 0.3
+
50: 0.35
+
60: 0.5
+
70: 0.75
+
80: 1.0
+
pmfw_options:
+
minimum_pwm: 15
+
target_temperature: 88
+
zero_rpm: false
+
zero_rpm_threshold: 40
+
power_cap: 190.0
+
performance_level: auto
+
max_core_clock: 2600
+
max_memory_clock: 1250
+
voltage_offset: -10
+
current_profile: oc
+
auto_switch_profiles: false
+6
hosts/chernobog/modules/lact.nix/default.nix
···
+
{
+
hardware.amdgpu.overdrive.enable = true;
+
+
services.lact.enable = true;
+
environment.etc."lact/config.yaml".source = ./config.yaml;
+
}
+5
hosts/chernobog/modules/network.nix
···
+
{
+
imports = [ ../../../modules/network/dns/systemd.nix ];
+
+
networking.useDHCP = true;
+
}
+6
hosts/chernobog/modules/obs.nix
···
+
{
+
programs.obs-studio = {
+
enable = true;
+
enableVirtualCamera = true;
+
};
+
}
+5
hosts/chernobog/modules/tailscale.nix
···
+
{ config, ... }:
+
{
+
imports = [ ../../../modules/network/tailscale.nix ];
+
networking.firewall.checkReversePath = "loose";
+
}
+51
hosts/chernobog/modules/vr.nix
···
+
{ pkgs, ... }:
+
{
+
services.monado = {
+
enable = true;
+
defaultRuntime = false;
+
};
+
+
services.wivrn = {
+
enable = true;
+
openFirewall = true;
+
defaultRuntime = true;
+
autoStart = true;
+
config = {
+
enable = true;
+
json = {
+
scale = 1.0;
+
bitrate = 60000000;
+
encoders = [
+
{
+
encoder = "vaapi";
+
codec = "h265";
+
}
+
];
+
};
+
};
+
};
+
+
environment.systemPackages = with pkgs; [ wlx-overlay-s eepyxr wayvr-dashboard xrizer ];
+
+
home-manager.sharedModules = [{
+
xdg.configFile."openvr/openvrpaths.vrpath".text = ''
+
{
+
"config" :
+
[
+
"/home/mayer/.local/share/Steam/config"
+
],
+
"external_drivers" : null,
+
"jsonid" : "vrpathreg",
+
"log" :
+
[
+
"/home/mayer/.local/share/Steam/logs"
+
],
+
"runtime" :
+
[
+
"${pkgs.xrizer}/lib/xrizer"
+
],
+
"version" : 1
+
}
+
'';
+
}];
+
}
+9
hosts/chernobog/modules/zswap.nix
···
+
{
+
boot.initrd.systemd.enable = true;
+
boot.kernelParams = [
+
"zswap.enabled=1" # enables zswap
+
"zswap.compressor=lz4" # compression algorithm
+
"zswap.max_pool_percent=13" # maximum percentage of RAM that zswap is allowed to use
+
"zswap.shrinker_enabled=1" # whether to shrink the pool proactively on high memory pressure
+
];
+
}
+12 -6
hosts/default.nix
···
inherit lib;
system = null;
modules = [
-
../modules
-
../locale
-
"${set.inputs.home}/nixos"
+
# set.inputs.nixpkgs.nixosModules.readOnlyPkgs
{ networking.hostName = name; }
-
{ nixpkgs.pkgs = set.pkgs; }
+
{
+
nixpkgs.pkgs = set.pkgs;
+
chaotic.nyx.overlay.enable = false;
+
}
+
set.inputs.chaotic.nixosModules.default
(import (./. + "/${name}/default.nix"))
];
specialArgs = {
···
systems = {
# lungmen = "x86_64-linux";
# tkaronto = "x86_64-linux";
-
wolumonde = allPkgsSets.x86_64-linux;
-
wsl = allPkgsSets.x86_64-linux;
+
# wolumonde = allPkgsSets.x86_64-linux;
+
# wsl = allPkgsSets.x86_64-linux;
+
dzwonek = allPkgsSets.x86_64-linux;
+
volsinii = allPkgsSets.x86_64-linux;
+
chernobog = allPkgsSets.x86_64-linux;
+
trimounts = allPkgsSets.x86_64-linux;
};
in
lib.mapAttrs mkSystem systems
+28
hosts/dzwonek/default.nix
···
+
{
+
inputs,
+
tlib,
+
pkgs,
+
modulesPath,
+
...
+
}:
+
{
+
imports = [
+
"${inputs.agenix}/modules/age.nix"
+
"${inputs.home}/nixos"
+
"${inputs.disko}/module.nix"
+
../../modules
+
../../modules/stylix-null.nix
+
../../users/root
+
./disk-config.nix
+
]
+
++ (tlib.importFolder (toString ./modules));
+
+
environment.systemPackages = [
+
pkgs.curl
+
pkgs.gitMinimal
+
];
+
+
networking.firewall.enable = true;
+
+
system.stateVersion = "25.05";
+
}
+54
hosts/dzwonek/disk-config.nix
···
+
{
+
disko.devices = {
+
disk = {
+
main = {
+
type = "disk";
+
device = "/dev/vda";
+
content = {
+
type = "gpt";
+
partitions = {
+
boot = {
+
priority = 1;
+
name = "boot";
+
size = "1M";
+
type = "EF02";
+
};
+
esp = {
+
priority = 2;
+
name = "ESP";
+
size = "256M";
+
type = "EF00";
+
content = {
+
type = "filesystem";
+
format = "vfat";
+
mountpoint = "/boot";
+
mountOptions = [ "umask=0077" ];
+
};
+
};
+
root = {
+
priority = 3;
+
end = "-2G";
+
content = {
+
type = "btrfs";
+
extraArgs = [ "-f" ]; # Override existing partition
+
mountpoint = "/";
+
mountOptions = [
+
"compress=zstd"
+
"noatime"
+
];
+
};
+
};
+
plainSwap = {
+
priority = 4;
+
size = "100%";
+
content = {
+
type = "swap";
+
discardPolicy = "both";
+
};
+
};
+
};
+
};
+
};
+
};
+
};
+
}
+35
hosts/dzwonek/modules/hardware-configuration.nix
···
+
# Do not modify this file! It was generated by ‘nixos-generate-config’
+
# and may be overwritten by future invocations. Please make changes
+
# to /etc/nixos/configuration.nix instead.
+
{
+
config,
+
lib,
+
pkgs,
+
modulesPath,
+
...
+
}:
+
+
{
+
imports = [
+
(modulesPath + "/profiles/qemu-guest.nix")
+
];
+
+
boot.initrd.availableKernelModules = [
+
"ata_piix"
+
"uhci_hcd"
+
"virtio_pci"
+
"sr_mod"
+
"virtio_blk"
+
];
+
boot.initrd.kernelModules = [ ];
+
boot.kernelModules = [ ];
+
boot.extraModulePackages = [ ];
+
+
boot.loader.grub = {
+
efiSupport = true;
+
efiInstallAsRemovable = true;
+
};
+
+
networking.useDHCP = lib.mkDefault true;
+
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
+
}
+70
hosts/dzwonek/modules/headscale.nix/acl.nix
···
+
{ config, lib, ... }:
+
let
+
l = lib // builtins;
+
t = l.types;
+
+
cfg = config.services.headscale.acl;
+
ruleType = t.submodule {
+
options = {
+
action = l.mkOption {
+
type = t.enum [ "accept" ];
+
default = "accept";
+
};
+
proto = l.mkOption {
+
type = t.nullOr (
+
t.enum [
+
"tcp"
+
"udp"
+
]
+
);
+
default = null;
+
};
+
src = l.mkOption {
+
type = t.listOf t.str;
+
};
+
dst = l.mkOption {
+
type = t.listOf t.str;
+
};
+
};
+
};
+
in
+
{
+
options = {
+
services.headscale.acl = {
+
groups = l.mkOption {
+
type = t.attrsOf (t.listOf t.str);
+
default = [ ];
+
};
+
tagOwners = l.mkOption {
+
type = t.attrsOf (t.listOf t.str);
+
default = [ ];
+
};
+
hosts = l.mkOption {
+
type = t.attrsOf t.str;
+
default = [ ];
+
};
+
rules = l.mkOption {
+
type = t.listOf ruleType;
+
default = [ ];
+
};
+
};
+
};
+
+
config =
+
let
+
generated = l.toFile "policy.hujson" (
+
l.toJSON {
+
groups = l.mapAttrs' (k: v: l.nameValuePair "group:${k}" v) cfg.groups;
+
tagOwners = l.mapAttrs' (k: v: l.nameValuePair "tag:${k}" v) cfg.tagOwners;
+
hosts = cfg.hosts;
+
acls = l.map (rule: if rule.proto == null then l.removeAttrs rule [ "proto" ] else rule) cfg.rules;
+
}
+
);
+
in
+
{
+
services.headscale.settings.policy = {
+
mode = "file";
+
path = generated;
+
};
+
};
+
}
+96
hosts/dzwonek/modules/headscale.nix/default.nix
···
+
{ lib, config, ... }:
+
let
+
rootDomain = "gaze.systems";
+
domain = "vpn.${rootDomain}";
+
in
+
{
+
imports = [ ./acl.nix ];
+
+
age.secrets.headscaleOidcSecret = {
+
file = ../../../../secrets/headscaleOidcSecret.age;
+
mode = "600";
+
owner = config.services.headscale.user;
+
group = config.services.headscale.group;
+
};
+
+
services.headscale = {
+
enable = true;
+
address = "0.0.0.0";
+
port = 1111;
+
acl = {
+
groups.admin = [ "90008@gaze.systems" ];
+
tagOwners = {
+
private-infra = [ "group:admin" ];
+
other-infra = [ "group:admin" ];
+
};
+
hosts = {
+
chernobog = "100.64.0.8";
+
wolumonde = "100.64.0.2";
+
higashi = "100.64.0.5";
+
};
+
rules = lib.mkBefore [
+
{
+
src = [ "group:admin" ];
+
dst = [
+
"tag:private-infra:*"
+
"tag:other-infra:*"
+
];
+
}
+
{
+
src = [ "tag:private-infra" ];
+
dst = [ "tag:other-infra:*" ];
+
}
+
{
+
src = [ "tag:private-infra" ];
+
dst = [ "tag:private-infra:*" ];
+
}
+
{
+
src = [ "wolumonde" ];
+
dst = [ "chernobog:*" ];
+
}
+
{
+
src = [ "90008@gaze.systems" ];
+
dst = [ "90008@gaze.systems:*" ];
+
}
+
{
+
src = [
+
"90008@gaze.systems"
+
"tag:private-infra"
+
];
+
dst = [ "autogroup:internet:*" ];
+
}
+
];
+
};
+
settings = {
+
server_url = "https://${domain}";
+
dns = {
+
base_domain = "lan.${rootDomain}";
+
nameservers.global = [
+
"1.1.1.1"
+
"1.0.0.1"
+
"9.9.9.9"
+
"149.112.112.112"
+
];
+
};
+
oidc = {
+
issuer = "https://id.gaze.systems";
+
client_id = "ba2c2024-f75f-49a2-a156-8593becfba28";
+
client_secret_path = config.age.secrets.headscaleOidcSecret.path;
+
pkce.enabled = true;
+
only_start_if_oidc_is_available = true;
+
};
+
};
+
};
+
+
# security.acme.certs.${rootDomain}.extraDomainNames = [domain];
+
services.nginx.virtualHosts.${domain} = {
+
useACMEHost = domain;
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/" = {
+
proxyPass = "http://localhost:${toString config.services.headscale.port}";
+
proxyWebsockets = true;
+
};
+
};
+
}
+48
hosts/dzwonek/modules/nginx.nix
···
+
{
+
inputs,
+
...
+
}:
+
{
+
services.nginx = {
+
enable = true;
+
recommendedTlsSettings = true;
+
recommendedOptimisation = true;
+
recommendedGzipSettings = true;
+
recommendedProxySettings = true;
+
# /nginx_status
+
statusPage = true;
+
};
+
+
networking.firewall.allowedTCPPorts = [
+
80
+
443
+
];
+
+
# output json logs so we can consume them more easily
+
services.nginx.appendHttpConfig = ''
+
log_format json_logs escape=json '{'
+
'"_msg":"request completed",'
+
'"time":"$time_local",'
+
'"req.remoteAddr":"$remote_addr",'
+
'"req.method":"$request_method",'
+
'"req.url":"$uri",'
+
'"req.httpVersion":"$server_protocol",'
+
'"res.statusCode":$status,'
+
'"res.bodySize":$body_bytes_sent,'
+
'"req.headers.id":"$request_id",'
+
'"req.headers.referer":"$http_referer",'
+
'"req.headers.user-agent":"$http_user_agent",'
+
'"requestTime":$request_time'
+
'}';
+
access_log /var/log/nginx/access.log json_logs;
+
'';
+
+
users.users.nginx.extraGroups = [ "acme" ];
+
+
security.acme = {
+
acceptTerms = true;
+
defaults.email = (import "${inputs.self}/personal.nix").emails.primary;
+
defaults.webroot = "/var/lib/acme/acme-challenge";
+
certs."vpn.gaze.systems" = { };
+
};
+
}
+22
hosts/dzwonek/modules/nucleus.nix
···
+
{pkgs, inputs, ...}:
+
let
+
rootDomain = "vpn.gaze.systems";
+
domain = "nucleus.ptr.pet";
+
pkg = pkgs.callPackage "${inputs.nucleus}/nix" {
+
nucleus-modules = pkgs.callPackage "${inputs.nucleus}/nix/modules.nix" {};
+
PUBLIC_DOMAIN = "https://${domain}";
+
};
+
in
+
{
+
security.acme.certs.${rootDomain}.extraDomainNames = [domain];
+
services.nginx.virtualHosts.${domain} = {
+
useACMEHost = rootDomain;
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/" = {
+
root = pkg;
+
tryFiles = "$uri $uri/ /index.html";
+
};
+
};
+
}
+7
hosts/dzwonek/modules/ssh.nix
···
+
{
+
services.fail2ban.enable = true;
+
services.openssh = {
+
enable = true;
+
settings.PasswordAuthentication = false;
+
};
+
}
+12
hosts/dzwonek/modules/tailscale.nix
···
+
{ config, ... }:
+
{
+
imports = [ ../../../modules/network/tailscale.nix ];
+
+
# age.secrets.tailscaleAuthKey.file = ../../../secrets/tailscaleAuthKey.age;
+
# services.tailscale.authKeyFile = config.age.secrets.tailscaleAuthKey.path;
+
+
services.tailscale = {
+
extraSetFlags = [ "--advertise-exit-node" ];
+
useRoutingFeatures = "both";
+
};
+
}
+24
hosts/dzwonek/modules/trill.nix
···
+
{pkgs, inputs, ...}:
+
let
+
rootDomain = "vpn.gaze.systems";
+
domain = "trill.ptr.pet";
+
pkg = pkgs.callPackage "${inputs.trill}/nix" rec {
+
memos-modules = pkgs.callPackage "${inputs.trill}/nix/modules.nix" {};
+
VITE_CLIENT_URI = "https://${domain}";
+
VITE_OAUTH_CLIENT_ID = "${VITE_CLIENT_URI}/oauth-client-metadata.json";
+
VITE_OAUTH_REDIRECT_URL = "${VITE_CLIENT_URI}/";
+
};
+
in
+
{
+
security.acme.certs.${rootDomain}.extraDomainNames = [domain];
+
services.nginx.virtualHosts.${domain} = {
+
useACMEHost = rootDomain;
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/" = {
+
root = pkg;
+
tryFiles = "$uri $uri/ /index.html";
+
};
+
};
+
}
+32
hosts/trimounts/default.nix
···
+
{
+
inputs,
+
tlib,
+
pkgs,
+
...
+
}:
+
{
+
imports = with inputs; [
+
"${facter}/modules/nixos/facter.nix"
+
"${agenix}/modules/age.nix"
+
"${home}/nixos"
+
"${disko}/module.nix"
+
../../modules
+
../../modules/stylix-null.nix
+
../../users/root
+
./disk-config.nix
+
]
+
++ (tlib.importFolder (toString ./modules));
+
facter.reportPath = ./facter.json;
+
+
boot.loader.grub = {
+
efiSupport = true;
+
efiInstallAsRemovable = true;
+
};
+
+
environment.systemPackages = [
+
pkgs.curl
+
pkgs.gitMinimal
+
];
+
+
system.stateVersion = "25.11";
+
}
+54
hosts/trimounts/disk-config.nix
···
+
{
+
disko.devices = {
+
disk = {
+
main = {
+
type = "disk";
+
device = "/dev/vda";
+
content = {
+
type = "gpt";
+
partitions = {
+
boot = {
+
priority = 1;
+
name = "boot";
+
size = "1M";
+
type = "EF02";
+
};
+
esp = {
+
priority = 2;
+
name = "ESP";
+
size = "500M";
+
type = "EF00";
+
content = {
+
type = "filesystem";
+
format = "vfat";
+
mountpoint = "/boot";
+
mountOptions = [ "umask=0077" ];
+
};
+
};
+
root = {
+
priority = 3;
+
end = "-8G";
+
content = {
+
type = "btrfs";
+
extraArgs = [ "-f" ]; # Override existing partition
+
mountpoint = "/";
+
mountOptions = [
+
"compress-force=zstd:3"
+
"noatime"
+
];
+
};
+
};
+
plainSwap = {
+
priority = 4;
+
size = "100%";
+
content = {
+
type = "swap";
+
discardPolicy = "both";
+
};
+
};
+
};
+
};
+
};
+
};
+
};
+
}
+2547
hosts/trimounts/facter.json
···
+
{
+
"version": 1,
+
"system": "x86_64-linux",
+
"virtualisation": "kvm",
+
"hardware": {
+
"bios": {
+
"apm_info": {
+
"supported": false,
+
"enabled": false,
+
"version": 0,
+
"sub_version": 0,
+
"bios_flags": 0
+
},
+
"vbe_info": {
+
"version": 0,
+
"video_memory": 0
+
},
+
"pnp": false,
+
"pnp_id": 0,
+
"lba_support": false,
+
"low_memory_size": 0,
+
"smbios_version": 520
+
},
+
"bridge": [
+
{
+
"index": 11,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 1
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0001",
+
"name": "ISA bridge",
+
"value": 1
+
},
+
"vendor": {
+
"hex": "8086",
+
"name": "Intel Corporation",
+
"value": 32902
+
},
+
"sub_vendor": {
+
"hex": "1af4",
+
"value": 6900
+
},
+
"device": {
+
"hex": "7000",
+
"value": 28672
+
},
+
"sub_device": {
+
"hex": "1100",
+
"value": 4352
+
},
+
"model": "Intel ISA bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.0",
+
"sysfs_bus_id": "0000:00:01.0",
+
"detail": {
+
"function": 0,
+
"command": 7,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"irq": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00008086d00007000sv00001AF4sd00001100bc06sc01i00"
+
},
+
{
+
"index": 13,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Host bridge",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "8086",
+
"name": "Intel Corporation",
+
"value": 32902
+
},
+
"sub_vendor": {
+
"hex": "1af4",
+
"value": 6900
+
},
+
"device": {
+
"hex": "1237",
+
"value": 4663
+
},
+
"sub_device": {
+
"hex": "1100",
+
"value": 4352
+
},
+
"revision": {
+
"hex": "0002",
+
"value": 2
+
},
+
"model": "Intel Host bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:00.0",
+
"sysfs_bus_id": "0000:00:00.0",
+
"detail": {
+
"function": 0,
+
"command": 7,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"irq": 0,
+
"prog_if": 0
+
},
+
"module_alias": "pci:v00008086d00001237sv00001AF4sd00001100bc06sc00i00"
+
},
+
{
+
"index": 14,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"bridge"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 1
+
},
+
"base_class": {
+
"hex": "0006",
+
"name": "Bridge",
+
"value": 6
+
},
+
"sub_class": {
+
"hex": "0080",
+
"name": "Bridge",
+
"value": 128
+
},
+
"vendor": {
+
"hex": "8086",
+
"name": "Intel Corporation",
+
"value": 32902
+
},
+
"sub_vendor": {
+
"hex": "1af4",
+
"value": 6900
+
},
+
"device": {
+
"hex": "7113",
+
"value": 28947
+
},
+
"sub_device": {
+
"hex": "1100",
+
"value": 4352
+
},
+
"revision": {
+
"hex": "0003",
+
"value": 3
+
},
+
"model": "Intel Bridge",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.3",
+
"sysfs_bus_id": "0000:00:01.3",
+
"resources": [
+
{
+
"type": "irq",
+
"base": 9,
+
"triggered": 0,
+
"enabled": true
+
}
+
],
+
"detail": {
+
"function": 3,
+
"command": 7,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"irq": 9,
+
"prog_if": 0
+
},
+
"driver": "piix4_smbus",
+
"driver_module": "i2c_piix4",
+
"drivers": [
+
"piix4_smbus"
+
],
+
"driver_modules": [
+
"i2c_piix4"
+
],
+
"module_alias": "pci:v00008086d00007113sv00001AF4sd00001100bc06sc80i00"
+
}
+
],
+
"cdrom": [
+
{
+
"index": 23,
+
"attached_to": 16,
+
"class_list": [
+
"cdrom",
+
"scsi",
+
"block_device"
+
],
+
"bus_type": {
+
"hex": "0084",
+
"name": "SCSI",
+
"value": 132
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0106",
+
"name": "Mass Storage Device",
+
"value": 262
+
},
+
"sub_class": {
+
"hex": "0002",
+
"name": "CD-ROM",
+
"value": 2
+
},
+
"pci_interface": {
+
"hex": "0003",
+
"name": "DVD",
+
"value": 3
+
},
+
"vendor": {
+
"hex": "0000",
+
"name": "QEMU",
+
"value": 0
+
},
+
"device": {
+
"hex": "0000",
+
"name": "QEMU DVD-ROM",
+
"value": 0
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "2.5+",
+
"value": 0
+
},
+
"model": "QEMU DVD-ROM",
+
"sysfs_id": "/class/block/sr0",
+
"sysfs_bus_id": "0:0:0:0",
+
"sysfs_device_link": "/devices/pci0000:00/0000:00:01.1/ata1/host0/target0:0:0/0:0:0:0",
+
"unix_device_name": "/dev/sr0",
+
"unix_device_number": {
+
"type": 98,
+
"major": 11,
+
"minor": 0,
+
"range": 1
+
},
+
"unix_device_names": [
+
"/dev/cdrom",
+
"/dev/disk/by-id/ata-QEMU_DVD-ROM_QM00001",
+
"/dev/disk/by-label/nixos-minimal-25.05-x86_64",
+
"/dev/disk/by-path/pci-0000:00:01.1-ata-1",
+
"/dev/disk/by-path/pci-0000:00:01.1-ata-1.0",
+
"/dev/disk/by-uuid/1980-01-01-00-00-00-00",
+
"/dev/root",
+
"/dev/sr0"
+
],
+
"unix_device_name2": "/dev/sg0",
+
"unix_device_number2": {
+
"type": 99,
+
"major": 21,
+
"minor": 0,
+
"range": 1
+
},
+
"driver": "ata_piix",
+
"driver_module": "ata_piix",
+
"drivers": [
+
"ata_piix",
+
"sr"
+
],
+
"driver_modules": [
+
"ata_piix",
+
"sr_mod"
+
]
+
}
+
],
+
"cpu": [
+
{
+
"architecture": "x86_64",
+
"vendor_name": "AuthenticAMD",
+
"family": 25,
+
"model": 17,
+
"stepping": 0,
+
"features": [
+
"fpu",
+
"vme",
+
"de",
+
"pse",
+
"tsc",
+
"msr",
+
"pae",
+
"mce",
+
"cx8",
+
"apic",
+
"sep",
+
"mtrr",
+
"pge",
+
"mca",
+
"cmov",
+
"pat",
+
"pse36",
+
"clflush",
+
"mmx",
+
"fxsr",
+
"sse",
+
"sse2",
+
"syscall",
+
"nx",
+
"mmxext",
+
"fxsr_opt",
+
"pdpe1gb",
+
"rdtscp",
+
"lm",
+
"rep_good",
+
"nopl",
+
"xtopology",
+
"cpuid",
+
"extd_apicid",
+
"tsc_known_freq",
+
"pni",
+
"pclmulqdq",
+
"ssse3",
+
"fma",
+
"cx16",
+
"pcid",
+
"sse4_1",
+
"sse4_2",
+
"x2apic",
+
"movbe",
+
"popcnt",
+
"tsc_deadline_timer",
+
"aes",
+
"xsave",
+
"avx",
+
"f16c",
+
"rdrand",
+
"hypervisor",
+
"lahf_lm",
+
"cmp_legacy",
+
"cr8_legacy",
+
"abm",
+
"sse4a",
+
"misalignsse",
+
"3dnowprefetch",
+
"osvw",
+
"topoext",
+
"perfctr_core",
+
"ssbd",
+
"ibrs",
+
"ibpb",
+
"stibp",
+
"ibrs_enhanced",
+
"vmmcall",
+
"fsgsbase",
+
"tsc_adjust",
+
"bmi1",
+
"avx2",
+
"smep",
+
"bmi2",
+
"erms",
+
"invpcid",
+
"avx512f",
+
"avx512dq",
+
"rdseed",
+
"adx",
+
"smap",
+
"avx512ifma",
+
"clflushopt",
+
"clwb",
+
"avx512cd",
+
"sha_ni",
+
"avx512bw",
+
"avx512vl",
+
"xsaveopt",
+
"xsavec",
+
"xgetbv1",
+
"xsaves",
+
"avx_vnni",
+
"avx512_bf16",
+
"clzero",
+
"xsaveerptr",
+
"wbnoinvd",
+
"arat",
+
"avx512vbmi",
+
"umip",
+
"pku",
+
"ospke",
+
"avx512_vbmi2",
+
"gfni",
+
"vaes",
+
"vpclmulqdq",
+
"avx512_vnni",
+
"avx512_bitalg",
+
"avx512_vpopcntdq",
+
"la57",
+
"rdpid",
+
"movdiri",
+
"movdir64b",
+
"fsrm",
+
"avx512_vp2intersect",
+
"flush_l1d",
+
"arch_capabilities"
+
],
+
"bugs": [
+
"sysret_ss_attrs",
+
"spectre_v1",
+
"spectre_v2",
+
"spec_store_bypass",
+
"srso",
+
"ibpb_no_ret",
+
"tsa"
+
],
+
"bogo": 4593.1,
+
"cache": 1024,
+
"physical_id": 0,
+
"siblings": 1,
+
"cores": 1,
+
"fpu": true,
+
"fpu_exception": true,
+
"cpuid_level": 13,
+
"write_protect": false,
+
"tlb_size": 1024,
+
"clflush_size": 64,
+
"cache_alignment": 64,
+
"address_sizes": {
+
"physical": "0x28",
+
"virtual": "0x39"
+
}
+
},
+
{
+
"architecture": "x86_64",
+
"vendor_name": "AuthenticAMD",
+
"family": 25,
+
"model": 17,
+
"stepping": 0,
+
"features": [
+
"fpu",
+
"vme",
+
"de",
+
"pse",
+
"tsc",
+
"msr",
+
"pae",
+
"mce",
+
"cx8",
+
"apic",
+
"sep",
+
"mtrr",
+
"pge",
+
"mca",
+
"cmov",
+
"pat",
+
"pse36",
+
"clflush",
+
"mmx",
+
"fxsr",
+
"sse",
+
"sse2",
+
"syscall",
+
"nx",
+
"mmxext",
+
"fxsr_opt",
+
"pdpe1gb",
+
"rdtscp",
+
"lm",
+
"rep_good",
+
"nopl",
+
"xtopology",
+
"cpuid",
+
"extd_apicid",
+
"tsc_known_freq",
+
"pni",
+
"pclmulqdq",
+
"ssse3",
+
"fma",
+
"cx16",
+
"pcid",
+
"sse4_1",
+
"sse4_2",
+
"x2apic",
+
"movbe",
+
"popcnt",
+
"tsc_deadline_timer",
+
"aes",
+
"xsave",
+
"avx",
+
"f16c",
+
"rdrand",
+
"hypervisor",
+
"lahf_lm",
+
"cmp_legacy",
+
"cr8_legacy",
+
"abm",
+
"sse4a",
+
"misalignsse",
+
"3dnowprefetch",
+
"osvw",
+
"topoext",
+
"perfctr_core",
+
"ssbd",
+
"ibrs",
+
"ibpb",
+
"stibp",
+
"ibrs_enhanced",
+
"vmmcall",
+
"fsgsbase",
+
"tsc_adjust",
+
"bmi1",
+
"avx2",
+
"smep",
+
"bmi2",
+
"erms",
+
"invpcid",
+
"avx512f",
+
"avx512dq",
+
"rdseed",
+
"adx",
+
"smap",
+
"avx512ifma",
+
"clflushopt",
+
"clwb",
+
"avx512cd",
+
"sha_ni",
+
"avx512bw",
+
"avx512vl",
+
"xsaveopt",
+
"xsavec",
+
"xgetbv1",
+
"xsaves",
+
"avx_vnni",
+
"avx512_bf16",
+
"clzero",
+
"xsaveerptr",
+
"wbnoinvd",
+
"arat",
+
"avx512vbmi",
+
"umip",
+
"pku",
+
"ospke",
+
"avx512_vbmi2",
+
"gfni",
+
"vaes",
+
"vpclmulqdq",
+
"avx512_vnni",
+
"avx512_bitalg",
+
"avx512_vpopcntdq",
+
"la57",
+
"rdpid",
+
"movdiri",
+
"movdir64b",
+
"fsrm",
+
"avx512_vp2intersect",
+
"flush_l1d",
+
"arch_capabilities"
+
],
+
"bugs": [
+
"sysret_ss_attrs",
+
"spectre_v1",
+
"spectre_v2",
+
"spec_store_bypass",
+
"srso",
+
"ibpb_no_ret",
+
"tsa"
+
],
+
"bogo": 4593.1,
+
"cache": 1024,
+
"physical_id": 1,
+
"siblings": 1,
+
"cores": 1,
+
"fpu": true,
+
"fpu_exception": true,
+
"cpuid_level": 13,
+
"write_protect": false,
+
"tlb_size": 1024,
+
"clflush_size": 64,
+
"cache_alignment": 64,
+
"address_sizes": {
+
"physical": "0x28",
+
"virtual": "0x39"
+
}
+
},
+
{
+
"architecture": "x86_64",
+
"vendor_name": "AuthenticAMD",
+
"family": 25,
+
"model": 17,
+
"stepping": 0,
+
"features": [
+
"fpu",
+
"vme",
+
"de",
+
"pse",
+
"tsc",
+
"msr",
+
"pae",
+
"mce",
+
"cx8",
+
"apic",
+
"sep",
+
"mtrr",
+
"pge",
+
"mca",
+
"cmov",
+
"pat",
+
"pse36",
+
"clflush",
+
"mmx",
+
"fxsr",
+
"sse",
+
"sse2",
+
"syscall",
+
"nx",
+
"mmxext",
+
"fxsr_opt",
+
"pdpe1gb",
+
"rdtscp",
+
"lm",
+
"rep_good",
+
"nopl",
+
"xtopology",
+
"cpuid",
+
"extd_apicid",
+
"tsc_known_freq",
+
"pni",
+
"pclmulqdq",
+
"ssse3",
+
"fma",
+
"cx16",
+
"pcid",
+
"sse4_1",
+
"sse4_2",
+
"x2apic",
+
"movbe",
+
"popcnt",
+
"tsc_deadline_timer",
+
"aes",
+
"xsave",
+
"avx",
+
"f16c",
+
"rdrand",
+
"hypervisor",
+
"lahf_lm",
+
"cmp_legacy",
+
"cr8_legacy",
+
"abm",
+
"sse4a",
+
"misalignsse",
+
"3dnowprefetch",
+
"osvw",
+
"topoext",
+
"perfctr_core",
+
"ssbd",
+
"ibrs",
+
"ibpb",
+
"stibp",
+
"ibrs_enhanced",
+
"vmmcall",
+
"fsgsbase",
+
"tsc_adjust",
+
"bmi1",
+
"avx2",
+
"smep",
+
"bmi2",
+
"erms",
+
"invpcid",
+
"avx512f",
+
"avx512dq",
+
"rdseed",
+
"adx",
+
"smap",
+
"avx512ifma",
+
"clflushopt",
+
"clwb",
+
"avx512cd",
+
"sha_ni",
+
"avx512bw",
+
"avx512vl",
+
"xsaveopt",
+
"xsavec",
+
"xgetbv1",
+
"xsaves",
+
"avx_vnni",
+
"avx512_bf16",
+
"clzero",
+
"xsaveerptr",
+
"wbnoinvd",
+
"arat",
+
"avx512vbmi",
+
"umip",
+
"pku",
+
"ospke",
+
"avx512_vbmi2",
+
"gfni",
+
"vaes",
+
"vpclmulqdq",
+
"avx512_vnni",
+
"avx512_bitalg",
+
"avx512_vpopcntdq",
+
"la57",
+
"rdpid",
+
"movdiri",
+
"movdir64b",
+
"fsrm",
+
"avx512_vp2intersect",
+
"flush_l1d",
+
"arch_capabilities"
+
],
+
"bugs": [
+
"sysret_ss_attrs",
+
"spectre_v1",
+
"spectre_v2",
+
"spec_store_bypass",
+
"srso",
+
"ibpb_no_ret",
+
"tsa"
+
],
+
"bogo": 4593.1,
+
"cache": 1024,
+
"physical_id": 2,
+
"siblings": 1,
+
"cores": 1,
+
"fpu": true,
+
"fpu_exception": true,
+
"cpuid_level": 13,
+
"write_protect": false,
+
"tlb_size": 1024,
+
"clflush_size": 64,
+
"cache_alignment": 64,
+
"address_sizes": {
+
"physical": "0x28",
+
"virtual": "0x39"
+
}
+
},
+
{
+
"architecture": "x86_64",
+
"vendor_name": "AuthenticAMD",
+
"family": 25,
+
"model": 17,
+
"stepping": 0,
+
"features": [
+
"fpu",
+
"vme",
+
"de",
+
"pse",
+
"tsc",
+
"msr",
+
"pae",
+
"mce",
+
"cx8",
+
"apic",
+
"sep",
+
"mtrr",
+
"pge",
+
"mca",
+
"cmov",
+
"pat",
+
"pse36",
+
"clflush",
+
"mmx",
+
"fxsr",
+
"sse",
+
"sse2",
+
"syscall",
+
"nx",
+
"mmxext",
+
"fxsr_opt",
+
"pdpe1gb",
+
"rdtscp",
+
"lm",
+
"rep_good",
+
"nopl",
+
"xtopology",
+
"cpuid",
+
"extd_apicid",
+
"tsc_known_freq",
+
"pni",
+
"pclmulqdq",
+
"ssse3",
+
"fma",
+
"cx16",
+
"pcid",
+
"sse4_1",
+
"sse4_2",
+
"x2apic",
+
"movbe",
+
"popcnt",
+
"tsc_deadline_timer",
+
"aes",
+
"xsave",
+
"avx",
+
"f16c",
+
"rdrand",
+
"hypervisor",
+
"lahf_lm",
+
"cmp_legacy",
+
"cr8_legacy",
+
"abm",
+
"sse4a",
+
"misalignsse",
+
"3dnowprefetch",
+
"osvw",
+
"topoext",
+
"perfctr_core",
+
"ssbd",
+
"ibrs",
+
"ibpb",
+
"stibp",
+
"ibrs_enhanced",
+
"vmmcall",
+
"fsgsbase",
+
"tsc_adjust",
+
"bmi1",
+
"avx2",
+
"smep",
+
"bmi2",
+
"erms",
+
"invpcid",
+
"avx512f",
+
"avx512dq",
+
"rdseed",
+
"adx",
+
"smap",
+
"avx512ifma",
+
"clflushopt",
+
"clwb",
+
"avx512cd",
+
"sha_ni",
+
"avx512bw",
+
"avx512vl",
+
"xsaveopt",
+
"xsavec",
+
"xgetbv1",
+
"xsaves",
+
"avx_vnni",
+
"avx512_bf16",
+
"clzero",
+
"xsaveerptr",
+
"wbnoinvd",
+
"arat",
+
"avx512vbmi",
+
"umip",
+
"pku",
+
"ospke",
+
"avx512_vbmi2",
+
"gfni",
+
"vaes",
+
"vpclmulqdq",
+
"avx512_vnni",
+
"avx512_bitalg",
+
"avx512_vpopcntdq",
+
"la57",
+
"rdpid",
+
"movdiri",
+
"movdir64b",
+
"fsrm",
+
"avx512_vp2intersect",
+
"flush_l1d",
+
"arch_capabilities"
+
],
+
"bugs": [
+
"sysret_ss_attrs",
+
"spectre_v1",
+
"spectre_v2",
+
"spec_store_bypass",
+
"srso",
+
"ibpb_no_ret",
+
"tsa"
+
],
+
"bogo": 4593.1,
+
"cache": 1024,
+
"physical_id": 3,
+
"siblings": 1,
+
"cores": 1,
+
"fpu": true,
+
"fpu_exception": true,
+
"cpuid_level": 13,
+
"write_protect": false,
+
"tlb_size": 1024,
+
"clflush_size": 64,
+
"cache_alignment": 64,
+
"address_sizes": {
+
"physical": "0x28",
+
"virtual": "0x39"
+
}
+
}
+
],
+
"disk": [
+
{
+
"index": 24,
+
"attached_to": 18,
+
"class_list": [
+
"disk",
+
"block_device"
+
],
+
"base_class": {
+
"hex": "0106",
+
"name": "Mass Storage Device",
+
"value": 262
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Disk",
+
"value": 0
+
},
+
"model": "Disk",
+
"sysfs_id": "/class/block/vda",
+
"sysfs_bus_id": "virtio1",
+
"sysfs_device_link": "/devices/pci0000:00/0000:00:10.0/virtio1",
+
"unix_device_name": "/dev/vda",
+
"unix_device_number": {
+
"type": 98,
+
"major": 253,
+
"minor": 0,
+
"range": 16
+
},
+
"unix_device_names": [
+
"/dev/disk/by-path/pci-0000:00:10.0",
+
"/dev/disk/by-path/virtio-pci-0000:00:10.0",
+
"/dev/vda"
+
],
+
"rom_id": "0x80",
+
"resources": [
+
{
+
"type": "disk_geo",
+
"cylinders": 1065220,
+
"heads": 16,
+
"sectors": 63,
+
"size": "0x0",
+
"geo_type": "logical"
+
},
+
{
+
"type": "size",
+
"unit": "sectors",
+
"value_1": 1073741824,
+
"value_2": 512
+
}
+
],
+
"driver": "virtio-pci",
+
"driver_module": "virtio_pci",
+
"drivers": [
+
"virtio-pci",
+
"virtio_blk"
+
],
+
"driver_modules": [
+
"virtio_blk",
+
"virtio_pci"
+
]
+
}
+
],
+
"graphics_card": [
+
{
+
"index": 17,
+
"attached_to": 0,
+
"class_list": [
+
"graphics_card",
+
"pci"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 2
+
},
+
"base_class": {
+
"hex": "0003",
+
"name": "Display controller",
+
"value": 3
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "VGA compatible controller",
+
"value": 0
+
},
+
"pci_interface": {
+
"hex": "0000",
+
"name": "VGA",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1234",
+
"value": 4660
+
},
+
"sub_vendor": {
+
"hex": "1af4",
+
"value": 6900
+
},
+
"device": {
+
"hex": "1111",
+
"value": 4369
+
},
+
"sub_device": {
+
"hex": "1100",
+
"value": 4352
+
},
+
"revision": {
+
"hex": "0002",
+
"value": 2
+
},
+
"model": "VGA compatible controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:02.0",
+
"sysfs_bus_id": "0000:00:02.0",
+
"resources": [
+
{
+
"type": "mem",
+
"base": 3221225472,
+
"range": 8388608,
+
"enabled": true,
+
"access": "read_only",
+
"prefetch": "no"
+
},
+
{
+
"type": "mem",
+
"base": 3229888512,
+
"range": 4096,
+
"enabled": true,
+
"access": "read_write",
+
"prefetch": "no"
+
},
+
{
+
"type": "mem",
+
"base": 786432,
+
"range": 131072,
+
"enabled": false,
+
"access": "read_write",
+
"prefetch": "no"
+
}
+
],
+
"detail": {
+
"function": 0,
+
"command": 7,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"irq": 0,
+
"prog_if": 0
+
},
+
"driver": "bochs-drm",
+
"driver_module": "bochs",
+
"drivers": [
+
"bochs-drm"
+
],
+
"driver_modules": [
+
"bochs"
+
],
+
"module_alias": "pci:v00001234d00001111sv00001AF4sd00001100bc03sc00i00"
+
}
+
],
+
"hub": [
+
{
+
"index": 25,
+
"attached_to": 9,
+
"class_list": [
+
"usb",
+
"hub"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "010a",
+
"name": "Hub",
+
"value": 266
+
},
+
"vendor": {
+
"hex": "1d6b",
+
"name": "Linux 6.12.58 uhci_hcd",
+
"value": 7531
+
},
+
"device": {
+
"hex": "0001",
+
"name": "UHCI Host Controller",
+
"value": 1
+
},
+
"revision": {
+
"hex": "0000",
+
"name": "6.12",
+
"value": 0
+
},
+
"serial": "0000:00:01.2",
+
"model": "Linux 6.12.58 uhci_hcd UHCI Host Controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/usb1/1-0:1.0",
+
"sysfs_bus_id": "1-0:1.0",
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 12000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "0009",
+
"name": "hub",
+
"value": 9
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 0,
+
"interface_class": {
+
"hex": "0009",
+
"name": "hub",
+
"value": 9
+
},
+
"interface_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"interface_protocol": 0,
+
"interface_number": 0,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "hub",
+
"driver_module": "usbcore",
+
"drivers": [
+
"hub"
+
],
+
"driver_modules": [
+
"usbcore"
+
],
+
"module_alias": "usb:v1D6Bp0001d0612dc09dsc00dp00ic09isc00ip00in00"
+
}
+
],
+
"memory": [
+
{
+
"index": 7,
+
"attached_to": 0,
+
"class_list": [
+
"memory"
+
],
+
"base_class": {
+
"hex": "0101",
+
"name": "Internally Used Class",
+
"value": 257
+
},
+
"sub_class": {
+
"hex": "0002",
+
"name": "Main Memory",
+
"value": 2
+
},
+
"model": "Main Memory",
+
"resources": [
+
{
+
"type": "mem",
+
"base": 0,
+
"range": 8323563520,
+
"enabled": true,
+
"access": "read_write",
+
"prefetch": "unknown"
+
},
+
{
+
"type": "phys_mem",
+
"range": 8589934592
+
}
+
]
+
}
+
],
+
"monitor": [
+
{
+
"index": 22,
+
"attached_to": 17,
+
"class_list": [
+
"monitor"
+
],
+
"base_class": {
+
"hex": "0100",
+
"name": "Monitor",
+
"value": 256
+
},
+
"sub_class": {
+
"hex": "0002",
+
"name": "LCD Monitor",
+
"value": 2
+
},
+
"vendor": {
+
"hex": "4914",
+
"value": 18708
+
},
+
"device": {
+
"hex": "1234",
+
"name": "QEMU Monitor",
+
"value": 4660
+
},
+
"serial": "0",
+
"model": "QEMU Monitor",
+
"resources": [
+
{
+
"type": "monitor",
+
"width": 1024,
+
"height": 768,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1280,
+
"height": 800,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1600,
+
"height": 1200,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 1920,
+
"height": 1080,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 2048,
+
"height": 1152,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 640,
+
"height": 480,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "monitor",
+
"width": 800,
+
"height": 600,
+
"vertical_frequency": 60,
+
"interlaced": false
+
},
+
{
+
"type": "size",
+
"unit": "mm",
+
"value_1": 325,
+
"value_2": 203
+
}
+
],
+
"detail": {
+
"manufacture_year": 2014,
+
"manufacture_week": 42,
+
"vertical_sync": {
+
"min": 50,
+
"max": 125
+
},
+
"horizontal_sync": {
+
"min": 30,
+
"max": 160
+
},
+
"horizontal_sync_timings": {
+
"disp": 1280,
+
"sync_start": 1600,
+
"sync_end": 1638,
+
"total": 1728
+
},
+
"vertical_sync_timings": {
+
"disp": 800,
+
"sync_start": 804,
+
"sync_end": 808,
+
"total": 828
+
},
+
"clock": 107300,
+
"width": 1280,
+
"height": 800,
+
"width_millimetres": 325,
+
"height_millimetres": 203,
+
"horizontal_flag": 45,
+
"vertical_flag": 45,
+
"vendor": "",
+
"name": "QEMU Monitor"
+
},
+
"driver_info": {
+
"type": "display",
+
"width": 2048,
+
"height": 1152,
+
"vertical_sync": {
+
"min": 50,
+
"max": 125
+
},
+
"horizontal_sync": {
+
"min": 30,
+
"max": 160
+
},
+
"bandwidth": 0,
+
"horizontal_sync_timings": {
+
"disp": 1280,
+
"sync_start": 1600,
+
"sync_end": 1638,
+
"total": 1728
+
},
+
"vertical_sync_timings": {
+
"disp": 800,
+
"sync_start": 804,
+
"sync_end": 808,
+
"total": 828
+
},
+
"horizontal_flag": 45,
+
"vertical_flag": 45
+
}
+
}
+
],
+
"mouse": [
+
{
+
"index": 26,
+
"attached_to": 25,
+
"class_list": [
+
"mouse",
+
"usb"
+
],
+
"bus_type": {
+
"hex": "0086",
+
"name": "USB",
+
"value": 134
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0105",
+
"name": "Mouse",
+
"value": 261
+
},
+
"sub_class": {
+
"hex": "0003",
+
"name": "USB Mouse",
+
"value": 3
+
},
+
"vendor": {
+
"hex": "0627",
+
"name": "QEMU",
+
"value": 1575
+
},
+
"device": {
+
"hex": "0001",
+
"name": "QEMU USB Tablet",
+
"value": 1
+
},
+
"serial": "28754-0000:00:01.2-1",
+
"compat_vendor": "Unknown",
+
"compat_device": "Generic USB Mouse",
+
"model": "QEMU USB Tablet",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2/usb1/1-1/1-1:1.0",
+
"sysfs_bus_id": "1-1:1.0",
+
"unix_device_name": "/dev/input/mice",
+
"unix_device_number": {
+
"type": 99,
+
"major": 13,
+
"minor": 63,
+
"range": 1
+
},
+
"unix_device_names": [
+
"/dev/input/mice"
+
],
+
"unix_device_name2": "/dev/input/mouse0",
+
"unix_device_number2": {
+
"type": 99,
+
"major": 13,
+
"minor": 32,
+
"range": 1
+
},
+
"resources": [
+
{
+
"type": "baud",
+
"speed": 12000000,
+
"bits": 0,
+
"stop_bits": 0,
+
"parity": 0,
+
"handshake": 0
+
}
+
],
+
"detail": {
+
"device_class": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"device_protocol": 0,
+
"interface_class": {
+
"hex": "0003",
+
"name": "hid",
+
"value": 3
+
},
+
"interface_subclass": {
+
"hex": "0000",
+
"name": "per_interface",
+
"value": 0
+
},
+
"interface_protocol": 0,
+
"interface_number": 0,
+
"interface_alternate_setting": 0
+
},
+
"hotplug": "usb",
+
"driver": "usbhid",
+
"driver_module": "usbhid",
+
"drivers": [
+
"usbhid"
+
],
+
"driver_modules": [
+
"usbhid"
+
],
+
"driver_info": {
+
"type": "mouse",
+
"db_entry_0": [
+
"explorerps/2",
+
"exps2"
+
],
+
"xf86": "explorerps/2",
+
"gpm": "exps2",
+
"buttons": -1,
+
"wheels": -1
+
},
+
"module_alias": "usb:v0627p0001d0000dc00dsc00dp00ic03isc00ip00in00"
+
}
+
],
+
"network_controller": [
+
{
+
"index": 20,
+
"attached_to": 15,
+
"class_list": [
+
"network_controller"
+
],
+
"bus_type": {
+
"hex": "008f",
+
"name": "Virtio",
+
"value": 143
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0002",
+
"name": "Network controller",
+
"value": 2
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Ethernet controller",
+
"value": 0
+
},
+
"vendor": "Virtio",
+
"device": "Ethernet Card 0",
+
"model": "Virtio Ethernet Card 0",
+
"sysfs_id": "/devices/pci0000:00/0000:00:03.0/virtio0",
+
"sysfs_bus_id": "virtio0",
+
"unix_device_name": "ens3",
+
"unix_device_names": [
+
"ens3"
+
],
+
"resources": [
+
{
+
"type": "hwaddr",
+
"address": 50
+
},
+
{
+
"type": "phwaddr",
+
"address": 50
+
}
+
],
+
"driver": "virtio_net",
+
"driver_module": "virtio_net",
+
"drivers": [
+
"virtio_net"
+
],
+
"driver_modules": [
+
"virtio_net"
+
],
+
"module_alias": "virtio:d00000001v00001AF4"
+
}
+
],
+
"network_interface": [
+
{
+
"index": 27,
+
"attached_to": 0,
+
"class_list": [
+
"network_interface"
+
],
+
"base_class": {
+
"hex": "0107",
+
"name": "Network Interface",
+
"value": 263
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Loopback",
+
"value": 0
+
},
+
"model": "Loopback network interface",
+
"sysfs_id": "/class/net/lo",
+
"unix_device_name": "lo",
+
"unix_device_names": [
+
"lo"
+
]
+
},
+
{
+
"index": 28,
+
"attached_to": 20,
+
"class_list": [
+
"network_interface"
+
],
+
"base_class": {
+
"hex": "0107",
+
"name": "Network Interface",
+
"value": 263
+
},
+
"sub_class": {
+
"hex": "0001",
+
"name": "Ethernet",
+
"value": 1
+
},
+
"model": "Ethernet network interface",
+
"sysfs_id": "/class/net/ens3",
+
"sysfs_device_link": "/devices/pci0000:00/0000:00:03.0/virtio0",
+
"unix_device_name": "ens3",
+
"unix_device_names": [
+
"ens3"
+
],
+
"resources": [
+
{
+
"type": "hwaddr",
+
"address": 50
+
},
+
{
+
"type": "phwaddr",
+
"address": 50
+
}
+
],
+
"driver": "virtio_net",
+
"driver_module": "virtio_net",
+
"drivers": [
+
"virtio_net"
+
],
+
"driver_modules": [
+
"virtio_net"
+
]
+
}
+
],
+
"pci": [
+
{
+
"index": 8,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"unknown"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 28
+
},
+
"base_class": {
+
"hex": "0007",
+
"name": "Communication controller",
+
"value": 7
+
},
+
"sub_class": {
+
"hex": "0080",
+
"name": "Communication controller",
+
"value": 128
+
},
+
"vendor": {
+
"hex": "1af4",
+
"value": 6900
+
},
+
"sub_vendor": {
+
"hex": "1af4",
+
"value": 6900
+
},
+
"device": {
+
"hex": "1003",
+
"value": 4099
+
},
+
"sub_device": {
+
"hex": "0003",
+
"value": 3
+
},
+
"model": "Communication controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:1c.0",
+
"sysfs_bus_id": "0000:00:1c.0",
+
"resources": [
+
{
+
"type": "io",
+
"base": 49344,
+
"range": 64,
+
"enabled": true,
+
"access": "read_write"
+
},
+
{
+
"type": "irq",
+
"base": 11,
+
"triggered": 0,
+
"enabled": true
+
},
+
{
+
"type": "mem",
+
"base": 3229876224,
+
"range": 4096,
+
"enabled": true,
+
"access": "read_write",
+
"prefetch": "no"
+
},
+
{
+
"type": "mem",
+
"base": 824633753600,
+
"range": 16384,
+
"enabled": true,
+
"access": "read_only",
+
"prefetch": "no"
+
}
+
],
+
"detail": {
+
"function": 0,
+
"command": 1031,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"irq": 11,
+
"prog_if": 0
+
},
+
"driver": "virtio-pci",
+
"driver_module": "virtio_pci",
+
"drivers": [
+
"virtio-pci"
+
],
+
"driver_modules": [
+
"virtio_pci"
+
],
+
"module_alias": "pci:v00001AF4d00001003sv00001AF4sd00000003bc07sc80i00"
+
},
+
{
+
"index": 10,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"unknown"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 16
+
},
+
"base_class": {
+
"hex": "0001",
+
"name": "Mass storage controller",
+
"value": 1
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "SCSI storage controller",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1af4",
+
"value": 6900
+
},
+
"sub_vendor": {
+
"hex": "1af4",
+
"value": 6900
+
},
+
"device": {
+
"hex": "1001",
+
"value": 4097
+
},
+
"sub_device": {
+
"hex": "0002",
+
"value": 2
+
},
+
"model": "SCSI storage controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:10.0",
+
"sysfs_bus_id": "0000:00:10.0",
+
"resources": [
+
{
+
"type": "io",
+
"base": 49152,
+
"range": 128,
+
"enabled": true,
+
"access": "read_write"
+
},
+
{
+
"type": "irq",
+
"base": 11,
+
"triggered": 0,
+
"enabled": true
+
},
+
{
+
"type": "mem",
+
"base": 3229880320,
+
"range": 4096,
+
"enabled": true,
+
"access": "read_write",
+
"prefetch": "no"
+
},
+
{
+
"type": "mem",
+
"base": 824633737216,
+
"range": 16384,
+
"enabled": true,
+
"access": "read_only",
+
"prefetch": "no"
+
}
+
],
+
"detail": {
+
"function": 0,
+
"command": 1031,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"irq": 11,
+
"prog_if": 0
+
},
+
"driver": "virtio-pci",
+
"driver_module": "virtio_pci",
+
"drivers": [
+
"virtio-pci"
+
],
+
"driver_modules": [
+
"virtio_pci"
+
],
+
"module_alias": "pci:v00001AF4d00001001sv00001AF4sd00000002bc01sc00i00"
+
},
+
{
+
"index": 12,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"unknown"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 30
+
},
+
"base_class": {
+
"hex": "0000",
+
"name": "Unclassified device",
+
"value": 0
+
},
+
"sub_class": {
+
"hex": "00ff",
+
"value": 255
+
},
+
"vendor": {
+
"hex": "1af4",
+
"value": 6900
+
},
+
"sub_vendor": {
+
"hex": "1af4",
+
"value": 6900
+
},
+
"device": {
+
"hex": "1002",
+
"value": 4098
+
},
+
"sub_device": {
+
"hex": "0005",
+
"value": 5
+
},
+
"model": "Unclassified device",
+
"sysfs_id": "/devices/pci0000:00/0000:00:1e.0",
+
"sysfs_bus_id": "0000:00:1e.0",
+
"resources": [
+
{
+
"type": "io",
+
"base": 49280,
+
"range": 64,
+
"enabled": true,
+
"access": "read_write"
+
},
+
{
+
"type": "irq",
+
"base": 10,
+
"triggered": 0,
+
"enabled": true
+
},
+
{
+
"type": "mem",
+
"base": 824633769984,
+
"range": 16384,
+
"enabled": true,
+
"access": "read_only",
+
"prefetch": "no"
+
}
+
],
+
"detail": {
+
"function": 0,
+
"command": 7,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"irq": 10,
+
"prog_if": 0
+
},
+
"driver": "virtio-pci",
+
"driver_module": "virtio_pci",
+
"drivers": [
+
"virtio-pci"
+
],
+
"driver_modules": [
+
"virtio_pci"
+
],
+
"module_alias": "pci:v00001AF4d00001002sv00001AF4sd00000005bc00scFFi00"
+
},
+
{
+
"index": 15,
+
"attached_to": 0,
+
"class_list": [
+
"pci",
+
"unknown"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 3
+
},
+
"base_class": {
+
"hex": "0002",
+
"name": "Network controller",
+
"value": 2
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Ethernet controller",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "1af4",
+
"value": 6900
+
},
+
"sub_vendor": {
+
"hex": "1af4",
+
"value": 6900
+
},
+
"device": {
+
"hex": "1000",
+
"value": 4096
+
},
+
"sub_device": {
+
"hex": "0001",
+
"value": 1
+
},
+
"model": "Ethernet controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:03.0",
+
"sysfs_bus_id": "0000:00:03.0",
+
"resources": [
+
{
+
"type": "io",
+
"base": 49408,
+
"range": 64,
+
"enabled": true,
+
"access": "read_write"
+
},
+
{
+
"type": "irq",
+
"base": 10,
+
"triggered": 0,
+
"enabled": true
+
},
+
{
+
"type": "mem",
+
"base": 3229614080,
+
"range": 262144,
+
"enabled": false,
+
"access": "read_only",
+
"prefetch": "no"
+
},
+
{
+
"type": "mem",
+
"base": 3229884416,
+
"range": 4096,
+
"enabled": true,
+
"access": "read_write",
+
"prefetch": "no"
+
},
+
{
+
"type": "mem",
+
"base": 824633720832,
+
"range": 16384,
+
"enabled": true,
+
"access": "read_only",
+
"prefetch": "no"
+
}
+
],
+
"detail": {
+
"function": 0,
+
"command": 1031,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"irq": 10,
+
"prog_if": 0
+
},
+
"driver": "virtio-pci",
+
"driver_module": "virtio_pci",
+
"drivers": [
+
"virtio-pci"
+
],
+
"driver_modules": [
+
"virtio_pci"
+
],
+
"module_alias": "pci:v00001AF4d00001000sv00001AF4sd00000001bc02sc00i00"
+
}
+
],
+
"storage_controller": [
+
{
+
"index": 16,
+
"attached_to": 0,
+
"class_list": [
+
"storage_controller",
+
"pci"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 1
+
},
+
"base_class": {
+
"hex": "0001",
+
"name": "Mass storage controller",
+
"value": 1
+
},
+
"sub_class": {
+
"hex": "0001",
+
"name": "IDE interface",
+
"value": 1
+
},
+
"pci_interface": {
+
"hex": "0080",
+
"value": 128
+
},
+
"vendor": {
+
"hex": "8086",
+
"name": "Intel Corporation",
+
"value": 32902
+
},
+
"sub_vendor": {
+
"hex": "1af4",
+
"value": 6900
+
},
+
"device": {
+
"hex": "7010",
+
"value": 28688
+
},
+
"sub_device": {
+
"hex": "1100",
+
"value": 4352
+
},
+
"model": "Intel IDE interface",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.1",
+
"sysfs_bus_id": "0000:00:01.1",
+
"resources": [
+
{
+
"type": "io",
+
"base": 1014,
+
"range": 1,
+
"enabled": true,
+
"access": "read_write"
+
},
+
{
+
"type": "io",
+
"base": 368,
+
"range": 8,
+
"enabled": true,
+
"access": "read_write"
+
},
+
{
+
"type": "io",
+
"base": 49504,
+
"range": 16,
+
"enabled": true,
+
"access": "read_write"
+
},
+
{
+
"type": "io",
+
"base": 496,
+
"range": 8,
+
"enabled": true,
+
"access": "read_write"
+
},
+
{
+
"type": "io",
+
"base": 886,
+
"range": 1,
+
"enabled": true,
+
"access": "read_write"
+
}
+
],
+
"detail": {
+
"function": 1,
+
"command": 7,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"irq": 0,
+
"prog_if": 128
+
},
+
"driver": "ata_piix",
+
"driver_module": "ata_piix",
+
"drivers": [
+
"ata_piix"
+
],
+
"driver_modules": [
+
"ata_piix"
+
],
+
"module_alias": "pci:v00008086d00007010sv00001AF4sd00001100bc01sc01i80"
+
},
+
{
+
"index": 18,
+
"attached_to": 10,
+
"class_list": [
+
"storage_controller"
+
],
+
"bus_type": {
+
"hex": "008f",
+
"name": "Virtio",
+
"value": 143
+
},
+
"slot": {
+
"bus": 0,
+
"number": 0
+
},
+
"base_class": {
+
"hex": "0001",
+
"name": "Mass storage controller",
+
"value": 1
+
},
+
"sub_class": {
+
"hex": "0080",
+
"name": "Storage controller",
+
"value": 128
+
},
+
"vendor": "Virtio",
+
"device": "Storage 0",
+
"model": "Virtio Storage 0",
+
"sysfs_id": "/devices/pci0000:00/0000:00:10.0/virtio1",
+
"sysfs_bus_id": "virtio1",
+
"driver": "virtio_blk",
+
"driver_module": "virtio_blk",
+
"drivers": [
+
"virtio_blk"
+
],
+
"driver_modules": [
+
"virtio_blk"
+
],
+
"module_alias": "virtio:d00000002v00001AF4"
+
}
+
],
+
"system": {
+
"form_factor": "desktop"
+
},
+
"unknown": [
+
{
+
"index": 19,
+
"attached_to": 8,
+
"class_list": [
+
"unknown"
+
],
+
"base_class": {
+
"hex": "0000",
+
"name": "Unclassified device",
+
"value": 0
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Unclassified device",
+
"value": 0
+
},
+
"vendor": "Virtio",
+
"device": "",
+
"model": "Virtio Unclassified device",
+
"sysfs_id": "/devices/pci0000:00/0000:00:1c.0/virtio2",
+
"sysfs_bus_id": "virtio2",
+
"driver": "virtio_console",
+
"driver_module": "virtio_console",
+
"drivers": [
+
"virtio_console"
+
],
+
"driver_modules": [
+
"virtio_console"
+
],
+
"module_alias": "virtio:d00000003v00001AF4"
+
},
+
{
+
"index": 21,
+
"attached_to": 12,
+
"class_list": [
+
"unknown"
+
],
+
"base_class": {
+
"hex": "0000",
+
"name": "Unclassified device",
+
"value": 0
+
},
+
"sub_class": {
+
"hex": "0000",
+
"name": "Unclassified device",
+
"value": 0
+
},
+
"vendor": "Virtio",
+
"device": "",
+
"model": "Virtio Unclassified device",
+
"sysfs_id": "/devices/pci0000:00/0000:00:1e.0/virtio3",
+
"sysfs_bus_id": "virtio3",
+
"driver": "virtio_balloon",
+
"driver_module": "virtio_balloon",
+
"drivers": [
+
"virtio_balloon"
+
],
+
"driver_modules": [
+
"virtio_balloon"
+
],
+
"module_alias": "virtio:d00000005v00001AF4"
+
}
+
],
+
"usb_controller": [
+
{
+
"index": 9,
+
"attached_to": 0,
+
"class_list": [
+
"usb_controller",
+
"pci"
+
],
+
"bus_type": {
+
"hex": "0004",
+
"name": "PCI",
+
"value": 4
+
},
+
"slot": {
+
"bus": 0,
+
"number": 1
+
},
+
"base_class": {
+
"hex": "000c",
+
"name": "Serial bus controller",
+
"value": 12
+
},
+
"sub_class": {
+
"hex": "0003",
+
"name": "USB Controller",
+
"value": 3
+
},
+
"pci_interface": {
+
"hex": "0000",
+
"name": "UHCI",
+
"value": 0
+
},
+
"vendor": {
+
"hex": "8086",
+
"name": "Intel Corporation",
+
"value": 32902
+
},
+
"sub_vendor": {
+
"hex": "1af4",
+
"value": 6900
+
},
+
"device": {
+
"hex": "7020",
+
"value": 28704
+
},
+
"sub_device": {
+
"hex": "1100",
+
"value": 4352
+
},
+
"revision": {
+
"hex": "0001",
+
"value": 1
+
},
+
"model": "Intel USB Controller",
+
"sysfs_id": "/devices/pci0000:00/0000:00:01.2",
+
"sysfs_bus_id": "0000:00:01.2",
+
"resources": [
+
{
+
"type": "io",
+
"base": 49472,
+
"range": 32,
+
"enabled": true,
+
"access": "read_write"
+
},
+
{
+
"type": "irq",
+
"base": 11,
+
"triggered": 0,
+
"enabled": true
+
}
+
],
+
"detail": {
+
"function": 2,
+
"command": 7,
+
"header_type": 0,
+
"secondary_bus": 0,
+
"irq": 11,
+
"prog_if": 0
+
},
+
"driver": "uhci_hcd",
+
"driver_module": "uhci_hcd",
+
"drivers": [
+
"uhci_hcd"
+
],
+
"driver_modules": [
+
"uhci_hcd"
+
],
+
"driver_info": {
+
"type": "module",
+
"db_entry_0": [
+
"uhci-hcd"
+
],
+
"active": true,
+
"modprobe": true,
+
"names": [
+
"uhci-hcd"
+
],
+
"module_args": [
+
""
+
],
+
"conf": ""
+
},
+
"module_alias": "pci:v00008086d00007020sv00001AF4sd00001100bc0Csc03i00"
+
}
+
]
+
},
+
"smbios": {
+
"bios": {
+
"handle": 0,
+
"vendor": "netcup",
+
"version": "VPS 1000 G12 Pro",
+
"date": "11/28/2025",
+
"features": null,
+
"start_address": "0xe8000",
+
"rom_size": 65536
+
},
+
"chassis": [
+
{
+
"handle": 768,
+
"manufacturer": "QEMU",
+
"version": "pc-i440fx-9.2",
+
"chassis_type": {
+
"hex": "0001",
+
"name": "Other",
+
"value": 1
+
},
+
"lock_present": false,
+
"bootup_state": {
+
"hex": "0003",
+
"name": "Safe",
+
"value": 3
+
},
+
"power_state": {
+
"hex": "0003",
+
"name": "Safe",
+
"value": 3
+
},
+
"thermal_state": {
+
"hex": "0003",
+
"name": "Safe",
+
"value": 3
+
},
+
"security_state": {
+
"hex": "0002",
+
"name": "Unknown",
+
"value": 2
+
},
+
"oem": "0x0"
+
}
+
],
+
"memory_array": [
+
{
+
"handle": 4096,
+
"location": {
+
"hex": "0001",
+
"name": "Other",
+
"value": 1
+
},
+
"usage": {
+
"hex": "0003",
+
"name": "System memory",
+
"value": 3
+
},
+
"ecc": {
+
"hex": "0006",
+
"name": "Multi-bit",
+
"value": 6
+
},
+
"max_size": "0x800000",
+
"error_handle": 65534,
+
"slots": 1
+
}
+
],
+
"memory_array_mapped_address": [
+
{
+
"handle": 4864,
+
"array_handle": 4096,
+
"start_address": "0x0",
+
"end_address": "0xc0000000",
+
"part_width": 1
+
},
+
{
+
"handle": 4865,
+
"array_handle": 4096,
+
"start_address": "0x100000000",
+
"end_address": "0x240000000",
+
"part_width": 1
+
}
+
],
+
"memory_device": [
+
{
+
"handle": 4352,
+
"location": "DIMM 0",
+
"bank_location": "",
+
"manufacturer": "QEMU",
+
"part_number": "",
+
"array_handle": 4096,
+
"error_handle": 65534,
+
"width": 0,
+
"ecc_bits": 0,
+
"size": 8388608,
+
"form_factor": {
+
"hex": "0009",
+
"name": "DIMM",
+
"value": 9
+
},
+
"set": 0,
+
"memory_type": {
+
"hex": "0007",
+
"name": "RAM",
+
"value": 7
+
},
+
"memory_type_details": [
+
"Other"
+
],
+
"speed": 0
+
}
+
],
+
"processor": [
+
{
+
"handle": 1024,
+
"socket": "CPU 0",
+
"socket_type": {
+
"hex": "0001",
+
"name": "Other",
+
"value": 1
+
},
+
"socket_populated": true,
+
"manufacturer": "QEMU",
+
"version": "pc-i440fx-9.2",
+
"part": "",
+
"processor_type": {
+
"hex": "0003",
+
"name": "CPU",
+
"value": 3
+
},
+
"processor_family": {
+
"hex": "00fe",
+
"name": "Other",
+
"value": 254
+
},
+
"processor_status": {
+
"hex": "0001",
+
"name": "Enabled",
+
"value": 1
+
},
+
"clock_ext": 0,
+
"clock_max": 2000,
+
"cache_handle_l1": 0,
+
"cache_handle_l2": 0,
+
"cache_handle_l3": 0
+
},
+
{
+
"handle": 1025,
+
"socket": "CPU 1",
+
"socket_type": {
+
"hex": "0001",
+
"name": "Other",
+
"value": 1
+
},
+
"socket_populated": true,
+
"manufacturer": "QEMU",
+
"version": "pc-i440fx-9.2",
+
"part": "",
+
"processor_type": {
+
"hex": "0003",
+
"name": "CPU",
+
"value": 3
+
},
+
"processor_family": {
+
"hex": "00fe",
+
"name": "Other",
+
"value": 254
+
},
+
"processor_status": {
+
"hex": "0001",
+
"name": "Enabled",
+
"value": 1
+
},
+
"clock_ext": 0,
+
"clock_max": 2000,
+
"cache_handle_l1": 0,
+
"cache_handle_l2": 0,
+
"cache_handle_l3": 0
+
},
+
{
+
"handle": 1026,
+
"socket": "CPU 2",
+
"socket_type": {
+
"hex": "0001",
+
"name": "Other",
+
"value": 1
+
},
+
"socket_populated": true,
+
"manufacturer": "QEMU",
+
"version": "pc-i440fx-9.2",
+
"part": "",
+
"processor_type": {
+
"hex": "0003",
+
"name": "CPU",
+
"value": 3
+
},
+
"processor_family": {
+
"hex": "00fe",
+
"name": "Other",
+
"value": 254
+
},
+
"processor_status": {
+
"hex": "0001",
+
"name": "Enabled",
+
"value": 1
+
},
+
"clock_ext": 0,
+
"clock_max": 2000,
+
"cache_handle_l1": 0,
+
"cache_handle_l2": 0,
+
"cache_handle_l3": 0
+
},
+
{
+
"handle": 1027,
+
"socket": "CPU 3",
+
"socket_type": {
+
"hex": "0001",
+
"name": "Other",
+
"value": 1
+
},
+
"socket_populated": true,
+
"manufacturer": "QEMU",
+
"version": "pc-i440fx-9.2",
+
"part": "",
+
"processor_type": {
+
"hex": "0003",
+
"name": "CPU",
+
"value": 3
+
},
+
"processor_family": {
+
"hex": "00fe",
+
"name": "Other",
+
"value": 254
+
},
+
"processor_status": {
+
"hex": "0001",
+
"name": "Enabled",
+
"value": 1
+
},
+
"clock_ext": 0,
+
"clock_max": 2000,
+
"cache_handle_l1": 0,
+
"cache_handle_l2": 0,
+
"cache_handle_l3": 0
+
}
+
],
+
"system": {
+
"handle": 256,
+
"manufacturer": "netcup",
+
"product": "KVM Server",
+
"version": "VPS 1000 G12 Pro",
+
"wake_up": {
+
"hex": "0006",
+
"name": "Power Switch",
+
"value": 6
+
}
+
}
+
}
+
}
+28
hosts/trimounts/modules/arpa.nix
···
+
{ pkgs, ... }:
+
let
+
index = pkgs.writeText "index.txt" ''
+
hi there~
+
+
you are currently interfacing with one of the data endpoints
+
of entity with serial id /90008/. you may want to open a
+
connection to https://gaze.systems/about for more data.
+
+
/discord 90.008/
+
/bsky @ptr.pet/
+
/email 90008@gaze.systems/
+
+
/dig +short TXT 9.0.0.0.8.e.f.1.5.0.7.4.0.1.0.0.2.ip6.arpa/
+
'';
+
root = pkgs.runCommand "root" { } ''
+
mkdir -p $out
+
ln -s ${index} $out/index.txt
+
'';
+
in
+
{
+
services.nginx.virtualHosts."9.0.0.0.8.e.f.1.5.0.7.4.0.1.0.0.2.ip6.arpa" = {
+
inherit root;
+
locations."/".index = "index.txt";
+
quic = true;
+
kTLS = true;
+
};
+
}
+38
hosts/trimounts/modules/atproto.nix
···
+
{ pkgs, lib, ... }:
+
let
+
getFileType = name: if lib.hasSuffix ".json" name then "application/json" else "text/plain";
+
mkWellKnownCfg = files: {
+
quic = true;
+
kTLS = true;
+
locations = (
+
lib.mapAttrs' (name: file: {
+
name = "=/.well-known/${name}";
+
value = {
+
extraConfig = ''
+
alias ${file};
+
add_header access-control-allow-origin *;
+
default_type ${getFileType name};
+
'';
+
};
+
}) files
+
);
+
};
+
mkDidWebCfg = domain: {
+
"${domain}" =
+
(mkWellKnownCfg {
+
"did.json" = ../../../secrets/${domain}.did;
+
"atproto-did" = pkgs.writeText "server" "did:web:${domain}";
+
})
+
// (lib.optionalAttrs (lib.hasSuffix "gaze.systems" domain) {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
});
+
};
+
guestbookDid = "guestbook.gaze.systems";
+
in
+
{
+
security.acme.certs."gaze.systems".extraDomainNames = [guestbookDid];
+
services.nginx.virtualHosts = mkDidWebCfg guestbookDid;
+
}
+29
hosts/trimounts/modules/clickee-proxy.nix
···
+
{ config, terra, ... }:
+
let
+
port = 7145;
+
in
+
{
+
age.secrets.clickeeProxyConfig = {
+
file = ../../../secrets/clickeeProxyConfig.age;
+
};
+
+
systemd.services.clickee-proxy = {
+
description = "clickee-proxy";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
environment = {
+
PORT = toString port;
+
};
+
serviceConfig = {
+
DynamicUser = true;
+
ExecStart = "${terra.clickee-proxy}/bin/clickee-proxy";
+
Restart = "on-failure";
+
RestartSec = 5;
+
EnvironmentFile = config.age.secrets.clickeeProxyConfig.path;
+
};
+
};
+
+
services.nginx.virtualHosts."poor.dog" = {
+
locations."/click".proxyPass = "http://localhost:${toString port}";
+
};
+
}
+58
hosts/trimounts/modules/email.nix
···
+
{ pkgs, ... }:
+
{
+
security.acme.certs."ptr.pet".extraDomainNames = [
+
"mta-sts.ptr.pet"
+
"autoconfig.ptr.pet"
+
"autodiscover.ptr.pet"
+
];
+
services.nginx.virtualHosts."ptr.pet" = {
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/mail/config-v1.1.xml" = {
+
return = "301 https://autoconfig.migadu.com/mail/config-v1.1.xml";
+
};
+
locations."/Autodiscover/Autodiscover.xml" = {
+
return = "301 https://autodiscover.migadu.com/Autodiscover/Autodiscover.xml";
+
};
+
};
+
services.nginx.virtualHosts."mta-sts.ptr.pet" =
+
let
+
file = pkgs.writeText "mta-sts.txt" ''
+
version: STSv1
+
mode: enforce
+
mx: aspmx1.migadu.com
+
mx: aspmx2.migadu.com
+
max_age: 31557600
+
'';
+
in
+
{
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."=/.well-known/mta-sts.txt".extraConfig = ''
+
alias ${file};
+
default_type text/plain;
+
'';
+
};
+
services.nginx.virtualHosts."autoconfig.ptr.pet" = {
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/" = {
+
return = "301 https://autoconfig.migadu.com$request_uri";
+
};
+
};
+
services.nginx.virtualHosts."autodiscover.ptr.pet" = {
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/" = {
+
return = "301 https://autodiscover.migadu.com$request_uri";
+
};
+
};
+
}
+33
hosts/trimounts/modules/fluentbit.nix
···
+
{
+
pkgs,
+
config,
+
lib,
+
...
+
}:
+
{
+
services.fluent-bit = {
+
enable = true;
+
settings = {
+
service.flush = 1;
+
pipeline.inputs = [
+
{
+
name = "node_exporter_metrics";
+
tag = "metrics.node";
+
scrape_interval = 5;
+
}
+
# {
+
# name = "dummy";
+
# tag = "logs.dummy";
+
# dummy = ''{"_msg": "dummy"}'';
+
# }
+
{
+
name = "fluentbit_metrics";
+
tag = "metrics.fluentbit";
+
scrape_interval = 5;
+
}
+
];
+
};
+
};
+
+
systemd.services.fluent-bit.serviceConfig.StateDirectory = "fluent-bit";
+
}
+28
hosts/trimounts/modules/hedgedoc.nix
···
+
{ config, ... }:
+
let
+
cfg = config.services.hedgedoc.settings;
+
in
+
{
+
services.hedgedoc = {
+
enable = true;
+
settings = {
+
port = 3333;
+
domain = "doc.gaze.systems";
+
protocolUseSSL = true;
+
allowEmailRegister = false;
+
allowAnonymous = false;
+
allowAnonymousEdits = true;
+
allowFreeURL = true;
+
requireFreeURLAuthentication = true;
+
};
+
};
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ cfg.domain ];
+
services.nginx.virtualHosts.${cfg.domain} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/".proxyPass = "http://${cfg.host}:${toString cfg.port}";
+
};
+
}
+47
hosts/trimounts/modules/limbusart.nix
···
+
{
+
inputs,
+
pkgs,
+
lib,
+
...
+
}:
+
let
+
pkg = pkgs.callPackage "${inputs.limbusart}/package.nix" { };
+
domain = "pmart.gaze.systems";
+
in
+
{
+
systemd.services.limbusart = {
+
description = "limbusart";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
serviceConfig = lib.mkMerge [
+
{
+
User = "limbusart";
+
ExecStart = "${pkg}/bin/limbusart";
+
Restart = "on-failure";
+
RestartSec = 5;
+
WorkingDirectory = "/var/lib/limbusart";
+
EnvironmentFile = pkgs.writeText "limbusart.conf" ''
+
ARTS_PATH="arts.txt"
+
SITE_TITLE="random pm art"
+
EMBED_TITLE="random pm art here!!"
+
EMBED_DESC="click NOW to see random pm art"
+
EMBED_COLOR="#bd0000"
+
'';
+
}
+
];
+
};
+
users.users.limbusart = {
+
isSystemUser = true;
+
group = "limbusart";
+
};
+
users.groups.limbusart = { };
+
+
security.acme.certs."gaze.systems".extraDomainNames = [domain];
+
services.nginx.virtualHosts.${domain} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/".proxyPass = "http://localhost:3000";
+
};
+
}
+3
hosts/trimounts/modules/mosh.nix
···
+
{
+
programs.mosh.enable = true;
+
}
+14
hosts/trimounts/modules/navidrome.nix
···
+
{config, pkgs, ...}: {
+
services.navidrome = {
+
enable = true;
+
settings = {
+
MusicFolder = "/music";
+
Port = 9999;
+
Address = "0.0.0.0";
+
ListenBrainz = {
+
Enabled = true;
+
BaseURL = "https://piper.kittysay.xyz/1";
+
};
+
};
+
};
+
}
+15
hosts/trimounts/modules/networking.nix
···
+
{
+
networking.enableIPv6 = true;
+
networking.interfaces.ens3 = {
+
ipv6.addresses = [{
+
address = "2a0a:4cc0:c1:e83d::b00b";
+
prefixLength = 64;
+
}];
+
};
+
networking.defaultGateway6 = {
+
address = "fe80::1";
+
interface = "ens3";
+
};
+
+
networking.firewall.enable = true;
+
}
+134
hosts/trimounts/modules/nginx.nix
···
+
{
+
config,
+
lib,
+
inputs,
+
...
+
}:
+
{
+
services.nginx = {
+
enable = true;
+
recommendedTlsSettings = true;
+
recommendedOptimisation = true;
+
recommendedGzipSettings = true;
+
recommendedProxySettings = true;
+
# /nginx_status
+
statusPage = true;
+
};
+
+
networking.firewall.allowedTCPPorts = [ 80 443 ];
+
+
# output json logs so we can consume them more easily
+
services.nginx.appendHttpConfig = ''
+
log_format json_logs escape=json '{'
+
'"_msg":"request completed",'
+
'"time":"$time_local",'
+
'"req.remoteAddr":"$remote_addr",'
+
'"req.method":"$request_method",'
+
'"req.url":"$uri",'
+
'"req.httpVersion":"$server_protocol",'
+
'"res.statusCode":$status,'
+
'"res.bodySize":$body_bytes_sent,'
+
'"req.headers.id":"$request_id",'
+
'"req.headers.referer":"$http_referer",'
+
'"req.headers.user-agent":"$http_user_agent",'
+
'"requestTime":$request_time'
+
'}';
+
access_log /var/log/nginx/access.log json_logs;
+
'';
+
+
users.users.nginx.extraGroups = [ "acme" ];
+
+
age.secrets.bunnyApiKey.file = ../../../secrets/bunnyApiKey.age;
+
security.acme = {
+
acceptTerms = true;
+
defaults = {
+
group = "nginx";
+
email = (import "${inputs.self}/personal.nix").emails.primary;
+
dnsProvider = "bunny";
+
credentialFiles = {
+
BUNNY_API_KEY_FILE = config.age.secrets.bunnyApiKey.path;
+
};
+
};
+
certs."poor.dog" = { };
+
certs."ptr.pet" = { };
+
certs."gaze.systems" = { };
+
};
+
services.nginx.virtualHosts."gaze.systems" = {
+
quic = true;
+
kTLS = true;
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
};
+
services.nginx.virtualHosts."poor.dog" = {
+
quic = true;
+
kTLS = true;
+
useACMEHost = "poor.dog";
+
forceSSL = true;
+
};
+
services.nginx.virtualHosts."ptr.pet" = {
+
quic = true;
+
kTLS = true;
+
useACMEHost = "ptr.pet";
+
forceSSL = true;
+
};
+
+
services.fluent-bit.settings = {
+
parsers = [
+
{
+
name = "nginx_json";
+
format = "json";
+
time_key = "time";
+
time_format = "%d/%b/%Y:%H:%M:%S %z";
+
}
+
];
+
pipeline = {
+
inputs = [
+
{
+
name = "nginx_metrics";
+
tag = "metrics.nginx";
+
status_url = "/nginx_status";
+
nginx_plus = false;
+
}
+
{
+
name = "tail";
+
tag = "logs.nginx";
+
path = "/var/log/nginx/*.log";
+
db = "/var/lib/fluent-bit/nginx-access.db";
+
"db.locking" = true;
+
buffer_chunk_size = "4m";
+
buffer_max_size = "32m";
+
parser = "nginx_json";
+
}
+
];
+
filters = [
+
{
+
name = "modify";
+
match = "logs.nginx";
+
Add = [ "name nginx" ];
+
}
+
];
+
};
+
};
+
+
# need so fluent-bit can access nginx
+
systemd.services.fluent-bit.serviceConfig.SupplementaryGroups = lib.mkForce "systemd-journal nginx";
+
+
services.vmalert.instances."".rules.groups = [
+
{
+
name = "nginx-logs";
+
type = "vlogs";
+
interval = "1m";
+
rules = [
+
{
+
record = "nginx_request_count";
+
expr = "name:nginx | stats (res.statusCode) count() as total_requests";
+
}
+
{
+
record = "nginx_request_latency";
+
# filter out subscribeRepos requests because they are long polling http L
+
expr = "name:nginx | filter req.url:!/xrpc/com.atproto.sync.subscribeRepos | stats avg(requestTime) avg, quantile(0.5, requestTime) p50, quantile(0.9, requestTime) p90, quantile(0.99, requestTime) p99";
+
}
+
];
+
}
+
];
+
}
+65
hosts/trimounts/modules/nsid-tracker.disabled
···
+
{
+
pkgs,
+
terra,
+
inputs,
+
...
+
}:
+
let
+
client-modules = pkgs.callPackage "${inputs.nsid-tracker}/nix/client-modules.nix" { };
+
client = pkgs.callPackage "${inputs.nsid-tracker}/nix/client.nix" {
+
PUBLIC_API_URL = "gaze.systems/nsid-tracker/api";
+
inherit client-modules;
+
};
+
# server = terra.nsid-tracker-server;
+
port = 3713;
+
in
+
{
+
systemd.services.nsid-tracker-client = {
+
description = "nsid-tracker-client";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
environment = {
+
# ORIGIN = "https://gaze.systems";
+
PORT = toString port;
+
};
+
serviceConfig = {
+
DynamicUser = true;
+
ExecStart = "${client}/bin/website";
+
Restart = "on-failure";
+
RestartSec = 5;
+
WorkingDirectory = "/var/lib/nsid-tracker";
+
};
+
};
+
+
systemd.services.nsid-tracker-keep-alive = {
+
description = "keeps nsid-tracker peer connection alive";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
serviceConfig = {
+
Type = "oneshot";
+
ExecStart = "${pkgs.curl}/bin/curl http://dusk-devel-mobi:${toString port}/events";
+
};
+
};
+
systemd.timers.nsid-tracker-keep-alive.timerConfig = {
+
OnBootSec = "5 min";
+
OnUnitActiveSec = "5 min";
+
Unit = "nsid-tracker-keep-alive.service";
+
};
+
+
services.nginx.virtualHosts."gaze.systems" = {
+
locations."/nsid-tracker/api" = {
+
proxyPass = "http://100.64.0.6:${toString port}/";
+
proxyWebsockets = true;
+
extraConfig = ''
+
rewrite ^/nsid-tracker/api/(.*) /$1 break;
+
'';
+
};
+
locations."/nsid-tracker".return = "301 /nsid-tracker/";
+
locations."/nsid-tracker/" = {
+
proxyPass = "http://localhost:${toString port}/";
+
extraConfig = ''
+
rewrite ^/nsid-tracker/(.*)$ /$1 break;
+
'';
+
};
+
};
+
}
+121
hosts/trimounts/modules/pds.nix
···
+
{ lib, config, ... }:
+
let
+
pdsLocalhost = "http://localhost:${toString config.services.bluesky-pds.settings.PDS_PORT}";
+
in
+
{
+
age.secrets.pdsConfig.file = ../../../secrets/pdsConfig.age;
+
+
services.nginx.virtualHosts.${config.services.bluesky-pds.settings.PDS_HOSTNAME} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
locations = {
+
# we need to proxy /xrpc for pds to work
+
# silly but i want root domain >:3
+
"/xrpc" = {
+
proxyPass = pdsLocalhost;
+
proxyWebsockets = true;
+
# pass ws headers so we can actually proxy the ws
+
extraConfig = ''
+
proxy_set_header id $request_id;
+
client_max_body_size 100M;
+
'';
+
# higher prio just to make sure
+
priority = 100;
+
};
+
"/xrpc/app.bsky.unspecced.getAgeAssuranceState".extraConfig = ''
+
default_type application/json;
+
add_header access-control-allow-headers "authorization,dpop,atproto-accept-labelers,atproto-proxy" always;
+
add_header access-control-allow-origin "*" always;
+
return 200 '{"lastInitiatedAt":"2025-07-14T14:22:43.912Z","status":"assured"}';
+
'';
+
}
+
# others
+
// (lib.genAttrs
+
[
+
"/account"
+
"/@atproto"
+
"/oauth"
+
"=/.well-known/oauth-protected-resource"
+
"=/.well-known/oauth-authorization-server"
+
]
+
(_: {
+
proxyPass = pdsLocalhost;
+
# higher prio just to make sure
+
priority = 100;
+
})
+
);
+
};
+
# setup pds stuff
+
services.bluesky-pds = {
+
enable = true;
+
settings = {
+
PDS_HOSTNAME = "gaze.systems";
+
PDS_PORT = 1334;
+
+
PDS_SERVICE_NAME = ''"gazing at the sky"'';
+
PDS_LOGO_URL = "https://gaze.systems/icons/gaze_site.webp";
+
+
PDS_RATE_LIMITS_ENABLED = "true";
+
PDS_INVITE_REQUIRED = "true";
+
+
PDS_DID_PLC_URL = "https://plc.directory";
+
PDS_BSKY_APP_VIEW_URL = "https://api.bsky.app";
+
PDS_BSKY_APP_VIEW_DID = "did:web:api.bsky.app";
+
PDS_REPORT_SERVICE_URL = "https://mod.bsky.app";
+
PDS_REPORT_SERVICE_DID = "did:plc:ar7c4by46qjdydhdevvrndac";
+
PDS_CRAWLERS = "https://bsky.network";
+
};
+
environmentFiles = [ config.age.secrets.pdsConfig.path ];
+
};
+
+
services.fluent-bit.settings = {
+
parsers = [
+
{
+
name = "pds_json";
+
format = "json";
+
time_key = "time";
+
time_strict = false;
+
}
+
];
+
pipeline = {
+
inputs = [
+
{
+
name = "systemd";
+
tag = "logs.pds";
+
systemd_filter = "_SYSTEMD_UNIT=bluesky-pds.service";
+
}
+
];
+
filters = [
+
{
+
name = "parser";
+
match = "logs.pds";
+
key_name = "MESSAGE";
+
parser = "pds_json";
+
}
+
{
+
name = "modify";
+
match = "logs.pds";
+
Rename = [ "msg _msg" ];
+
}
+
];
+
};
+
};
+
+
services.vmalert.instances."".rules.groups = [
+
{
+
name = "pds-logs";
+
type = "vlogs";
+
interval = "1m";
+
rules = [
+
{
+
record = "pds_request_count";
+
expr = "name:pds | stats (res.statusCode) count() as total_requests";
+
}
+
{
+
record = "pds_response_latency";
+
expr = "name:pds | stats avg(responseTime) avg, quantile(0.5, responseTime) p50, quantile(0.9, responseTime) p90, quantile(0.99, responseTime) p99";
+
}
+
];
+
}
+
];
+
}
+2
hosts/trimounts/modules/perses.nix/dashboards/.gitignore
···
+
# folder used to store the results of the `percli dac build` command
+
built
+28
hosts/trimounts/modules/perses.nix/dashboards/go.mod
···
+
module dash
+
+
go 1.24.2
+
+
require (
+
github.com/beorn7/perks v1.0.1 // indirect
+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
+
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
+
github.com/jpillora/backoff v1.0.0 // indirect
+
github.com/muhlemmer/gu v0.3.1 // indirect
+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
+
github.com/perses/perses v0.50.3 // indirect
+
github.com/prometheus/client_golang v1.20.5 // indirect
+
github.com/prometheus/client_model v0.6.1 // indirect
+
github.com/prometheus/common v0.63.0 // indirect
+
github.com/prometheus/procfs v0.15.1 // indirect
+
github.com/zitadel/oidc/v3 v3.36.1 // indirect
+
github.com/zitadel/schema v1.3.0 // indirect
+
golang.org/x/crypto v0.36.0 // indirect
+
golang.org/x/net v0.35.0 // indirect
+
golang.org/x/oauth2 v0.28.0 // indirect
+
golang.org/x/sys v0.31.0 // indirect
+
golang.org/x/text v0.23.0 // indirect
+
google.golang.org/protobuf v1.36.5 // indirect
+
gopkg.in/yaml.v2 v2.4.0 // indirect
+
gopkg.in/yaml.v3 v3.0.1 // indirect
+
)
+45
hosts/trimounts/modules/perses.nix/dashboards/go.sum
···
+
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+
github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE=
+
github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA=
+
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
+
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+
github.com/muhlemmer/gu v0.3.1 h1:7EAqmFrW7n3hETvuAdmFmn4hS8W+z3LgKtrnow+YzNM=
+
github.com/muhlemmer/gu v0.3.1/go.mod h1:YHtHR+gxM+bKEIIs7Hmi9sPT3ZDUvTN/i88wQpZkrdM=
+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+
github.com/perses/perses v0.50.3 h1:BHlU9qkCFCUSP4HP5p9GwophWcxm5Vnu6Fsrx8Fb/+w=
+
github.com/perses/perses v0.50.3/go.mod h1:oqfHLOrXERvEqECShqXPjHXqVukQxcoaaTM6ySRF7hU=
+
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
+
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
+
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
+
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+
github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
+
github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
+
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
+
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+
github.com/zitadel/oidc/v3 v3.36.1 h1:1AT1NqKKEqAwx4GmKJZ9fYkWH2WIn/VKMfQ46nBtRf0=
+
github.com/zitadel/oidc/v3 v3.36.1/go.mod h1:dApGZLvWZTHRuxmcbQlW5d2XVjVYR3vGOdq536igmTs=
+
github.com/zitadel/schema v1.3.0 h1:kQ9W9tvIwZICCKWcMvCEweXET1OcOyGEuFbHs4o5kg0=
+
github.com/zitadel/schema v1.3.0/go.mod h1:NptN6mkBDFvERUCvZHlvWmmME+gmZ44xzwRXwhzsbtc=
+
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
+
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
+
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
+
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
+
golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc=
+
golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
+
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
+
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
+
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
+
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
+
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+334
hosts/trimounts/modules/perses.nix/dashboards/wolumonde.go
···
+
package main
+
+
import (
+
"flag"
+
"time"
+
+
"github.com/perses/perses/go-sdk"
+
"github.com/perses/perses/go-sdk/common"
+
dash "github.com/perses/perses/go-sdk/dashboard"
+
"github.com/perses/perses/go-sdk/panel"
+
panels "github.com/perses/perses/go-sdk/panel-group"
+
"github.com/perses/perses/go-sdk/panel/bar"
+
"github.com/perses/perses/go-sdk/panel/gauge"
+
"github.com/perses/perses/go-sdk/panel/stat"
+
"github.com/perses/perses/go-sdk/prometheus/query"
+
+
timeSeries "github.com/perses/perses/go-sdk/panel/time-series"
+
// promDs "github.com/perses/perses/go-sdk/prometheus/datasource"
+
)
+
+
func main() {
+
flag.Parse()
+
exec := sdk.NewExec()
+
+
var loadPanel = panels.AddPanel("load over 5 min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Max: 2.0,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"node_load5",
+
query.SeriesNameFormat("load"),
+
),
+
),
+
)
+
var cpuPanel = panels.AddPanel("cpu usage",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "percent",
+
},
+
Max: 100.0,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
`sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100`,
+
query.SeriesNameFormat("cpu {{cpu}}"),
+
),
+
),
+
)
+
var memoryPanel = panels.AddPanel("memory usage",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "bytes",
+
},
+
Max: 4000000000,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes",
+
query.SeriesNameFormat("current memory usage"),
+
),
+
),
+
)
+
+
var diskPanel = panels.AddPanel("disk usage /",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "bytes",
+
},
+
Max: 38000000000,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
`node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}`,
+
query.SeriesNameFormat("disk usage"),
+
),
+
),
+
)
+
+
// Gauge versions (percent unit)
+
var loadGaugePanel = panels.AddPanel("load over 5 min",
+
gauge.Chart(
+
gauge.Format(common.Format{Unit: "percent"}),
+
gauge.Max(100),
+
gauge.Calculation(common.MeanCalculation),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"node_load5 * 100 / count(count(node_cpu_seconds_total) by (cpu))",
+
query.SeriesNameFormat("load %"),
+
),
+
),
+
)
+
var cpuGaugePanel = panels.AddPanel("cpu usage",
+
gauge.Chart(
+
gauge.Format(common.Format{Unit: "percent"}),
+
gauge.Max(100),
+
gauge.Calculation(common.MeanCalculation),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
`sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100`,
+
query.SeriesNameFormat("cpu {{cpu}}"),
+
),
+
),
+
)
+
var memoryGaugePanel = panels.AddPanel("memory usage",
+
gauge.Chart(
+
gauge.Format(common.Format{Unit: "percent"}),
+
gauge.Max(100),
+
gauge.Calculation(common.MeanCalculation),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) * 100 / node_memory_MemTotal_bytes",
+
query.SeriesNameFormat("memory usage %"),
+
),
+
),
+
)
+
var diskGaugePanel = panels.AddPanel("disk usage /",
+
gauge.Chart(
+
gauge.Format(common.Format{Unit: "percent"}),
+
gauge.Max(100),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
`(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) * 100 / node_filesystem_size_bytes{mountpoint="/"}`,
+
query.SeriesNameFormat("disk usage %"),
+
),
+
),
+
)
+
+
var resPanels = dash.AddPanelGroup("resource usage",
+
panels.PanelsPerLine(4),
+
loadGaugePanel, cpuGaugePanel, memoryGaugePanel, diskGaugePanel,
+
loadPanel, cpuPanel, memoryPanel, diskPanel,
+
)
+
+
var nginxPanel = panels.AddPanel("nginx requests / min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "decimal",
+
},
+
},
+
),
+
timeSeries.WithVisual(timeSeries.Visual{
+
Display: timeSeries.BarDisplay,
+
Palette: timeSeries.Palette{
+
Mode: timeSeries.CategoricalMode,
+
},
+
Stack: timeSeries.AllStack,
+
}),
+
timeSeries.WithLegend(timeSeries.Legend{
+
Position: timeSeries.BottomPosition,
+
Size: timeSeries.SmallSize,
+
}),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"nginx_request_count",
+
query.SeriesNameFormat("{{res.statusCode}}"),
+
),
+
),
+
)
+
+
var nginxLatencyPanel = panels.AddPanel("nginx latency / min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "seconds",
+
},
+
Max: 0.5,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"nginx_request_latency",
+
query.SeriesNameFormat("{{stats_result}}"),
+
),
+
),
+
)
+
+
var nginxPanels = dash.AddPanelGroup("nginx metrics",
+
panels.PanelsPerLine(3),
+
nginxPanel,
+
nginxLatencyPanel,
+
)
+
+
var pdsPanel = panels.AddPanel("pds requests / min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "decimal",
+
},
+
},
+
),
+
timeSeries.WithVisual(timeSeries.Visual{
+
Display: timeSeries.BarDisplay,
+
Palette: timeSeries.Palette{
+
Mode: timeSeries.CategoricalMode,
+
},
+
Stack: timeSeries.AllStack,
+
}),
+
timeSeries.WithLegend(timeSeries.Legend{
+
Position: timeSeries.BottomPosition,
+
Size: timeSeries.SmallSize,
+
}),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"pds_request_count",
+
query.SeriesNameFormat("{{res.statusCode}}"),
+
),
+
),
+
)
+
+
var pdsLatencyPanel = panels.AddPanel("pds latency / min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "milliseconds",
+
},
+
Max: 500,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"pds_response_latency",
+
query.SeriesNameFormat("{{stats_result}}"),
+
),
+
),
+
)
+
+
var pdsPanels = dash.AddPanelGroup("pds metrics",
+
panels.PanelsPerLine(3),
+
pdsPanel,
+
pdsLatencyPanel,
+
)
+
+
var anubisForgejoPanel = panels.AddPanel("anubis policy actions",
+
bar.Chart(),
+
panel.AddQuery(
+
query.PromQL(
+
"anubis_policy_results",
+
query.SeriesNameFormat("{{action}}: {{rule}}"),
+
),
+
),
+
)
+
+
var forgejoPanels = dash.AddPanelGroup("forgejo",
+
panels.PanelsPerLine(3),
+
anubisForgejoPanel,
+
)
+
+
var gazesys_visit_panel = panels.AddPanel("gazesys visits",
+
bar.Chart(),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_visit_real_total + gazesys_visit_fake_total",
+
query.SeriesNameFormat("total visits"),
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_visit_fake_total",
+
query.SeriesNameFormat("(ai) bot visits"),
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_visit_real_total",
+
query.SeriesNameFormat("real visits"),
+
),
+
),
+
)
+
+
var gazesys_pet_panel = panels.AddPanel("gazesys pet",
+
stat.Chart(
+
stat.Format(common.Format{
+
Unit: "decimal",
+
ShortValues: true,
+
DecimalPlaces: 0,
+
}),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_pet_bounce_total",
+
query.SeriesNameFormat("bounce count"),
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_pet_distance_total",
+
query.SeriesNameFormat("distance travelled"),
+
),
+
),
+
)
+
+
var gazesys_panels = dash.AddPanelGroup("gazesys",
+
panels.PanelsPerLine(3),
+
gazesys_visit_panel, gazesys_pet_panel,
+
)
+
+
builder, buildErr := dash.New("wolumonde",
+
dash.ProjectName("private-infra"),
+
dash.Duration(30*time.Minute),
+
dash.RefreshInterval(time.Minute),
+
resPanels, nginxPanels, pdsPanels, gazesys_panels, forgejoPanels,
+
)
+
exec.BuildDashboard(builder, buildErr)
+
}
+104
hosts/trimounts/modules/perses.nix/default.nix
···
+
{
+
pkgs,
+
config,
+
...
+
}:
+
let
+
domain = "dash.gaze.systems";
+
port = 7412;
+
user = "perses";
+
+
provisionFolder = "provisioning";
+
provisioningFolder = "${config.users.users.${user}.home}/${provisionFolder}";
+
+
persesConfig = {
+
database.file = {
+
folder = config.users.users.${user}.home;
+
extension = "json";
+
};
+
provisioning.folders = [ provisioningFolder ];
+
security = {
+
enable_auth = true;
+
authentication = {
+
providers = {
+
enable_native = false;
+
oidc = [
+
{
+
slug_id = "pocketid";
+
name = "Pocket ID";
+
client_id = "aa583db6-e03c-4490-853a-7f2b3e089fbe";
+
issuer = config.services.pocket-id.settings.APP_URL;
+
scopes = [ "openid profile email" ];
+
}
+
];
+
};
+
disable_sign_up = false;
+
};
+
cookie = {
+
same_site = "strict";
+
secure = true;
+
};
+
};
+
};
+
persesConfigYaml = pkgs.writers.writeYAML "config.yaml" persesConfig;
+
+
secrets = config.age.secrets;
+
in
+
{
+
environment.systemPackages = [ pkgs.perses ];
+
+
users.users.${user} = {
+
isNormalUser = true;
+
group = user;
+
home = "/var/lib/${user}";
+
createHome = true;
+
uid = 1001;
+
};
+
users.groups.${user} = {
+
gid = 976;
+
};
+
+
age.secrets.persesSecret = {
+
file = ../../../../secrets/persesSecret.age;
+
owner = user;
+
group = user;
+
};
+
+
systemd.services.perses = {
+
description = "perses";
+
after = [
+
"network.target"
+
"pocket-id.service"
+
];
+
requires = [ "pocket-id.service" ];
+
serviceConfig = {
+
ExecStart = "${pkgs.perses}/bin/perses --config=${persesConfigYaml} --web.listen-address=:${toString port} --log.level=info";
+
EnvironmentFile = secrets.persesSecret.path;
+
WorkingDirectory = config.users.users.${user}.home;
+
};
+
};
+
systemd.services.perses.preStart = ''
+
rm -rf ${provisioningFolder} && mkdir -p ${provisioningFolder}
+
cp -f ${./provision}/* ${provisioningFolder}
+
'';
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ domain ];
+
services.nginx.virtualHosts.${domain} = {
+
useACMEHost = "gaze.systems"; # TODO: write a module to define vhosts for subdomains
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/" = {
+
proxyPass = "http://localhost:${toString port}";
+
};
+
};
+
+
# scrape perses metrics
+
services.victoriametrics.prometheusConfig.scrape_configs = [
+
{
+
job_name = "perses";
+
metrics_path = "/metrics";
+
static_configs = [ { targets = [ "localhost:${toString port}" ]; } ];
+
}
+
];
+
}
+3
hosts/trimounts/modules/perses.nix/provision/1-private-infra.yaml
···
+
kind: Project
+
metadata:
+
name: private-infra
+9
hosts/trimounts/modules/perses.nix/provision/2-admin-role.yaml
···
+
- kind: GlobalRole
+
metadata:
+
name: admin
+
spec:
+
permissions:
+
- actions:
+
- '*'
+
scopes:
+
- '*'
+8
hosts/trimounts/modules/perses.nix/provision/3-admin-bind-role.yaml
···
+
- kind: GlobalRoleBinding
+
metadata:
+
name: admin
+
spec:
+
role: admin
+
subjects:
+
- kind: User
+
name: 90008
+12
hosts/trimounts/modules/perses.nix/provision/4-victoria.yaml
···
+
- kind: GlobalDatasource
+
metadata:
+
name: victoria
+
spec:
+
default: true
+
plugin:
+
kind: PrometheusDatasource
+
spec:
+
proxy:
+
kind: HTTPProxy
+
spec:
+
url: http://localhost:8428
+12
hosts/trimounts/modules/perses.nix/provision/6-guest-role.yaml
···
+
- kind: GlobalRole
+
metadata:
+
name: guest
+
spec:
+
permissions:
+
- actions:
+
- 'read'
+
scopes:
+
- 'Dashboard'
+
- 'Project'
+
- 'Datasource'
+
- 'GlobalDatasource'
+8
hosts/trimounts/modules/perses.nix/provision/7-guest-role-bind.yaml
···
+
- kind: GlobalRoleBinding
+
metadata:
+
name: guest
+
spec:
+
role: guest
+
subjects:
+
- kind: User
+
name: sorryu02
+454
hosts/trimounts/modules/perses.nix/provision/90-wolumonde.yaml
···
+
kind: Dashboard
+
metadata:
+
name: wolumonde
+
createdAt: 0001-01-01T00:00:00Z
+
updatedAt: 0001-01-01T00:00:00Z
+
version: 0
+
project: private-infra
+
spec:
+
panels:
+
"0_0":
+
kind: Panel
+
spec:
+
display:
+
name: load over 5 min
+
plugin:
+
kind: GaugeChart
+
spec:
+
calculation: mean
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: node_load5 * 100 / count(count(node_cpu_seconds_total) by (cpu))
+
seriesNameFormat: load %
+
"0_1":
+
kind: Panel
+
spec:
+
display:
+
name: cpu usage
+
plugin:
+
kind: GaugeChart
+
spec:
+
calculation: mean
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100
+
seriesNameFormat: cpu {{cpu}}
+
"0_2":
+
kind: Panel
+
spec:
+
display:
+
name: memory usage
+
plugin:
+
kind: GaugeChart
+
spec:
+
calculation: mean
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) * 100 / node_memory_MemTotal_bytes
+
seriesNameFormat: memory usage %
+
"0_3":
+
kind: Panel
+
spec:
+
display:
+
name: disk usage /
+
plugin:
+
kind: GaugeChart
+
spec:
+
calculation: last
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: (node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) * 100 / node_filesystem_size_bytes{mountpoint="/"}
+
seriesNameFormat: disk usage %
+
"0_4":
+
kind: Panel
+
spec:
+
display:
+
name: load over 5 min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
max: 2
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: node_load5
+
seriesNameFormat: load
+
"0_5":
+
kind: Panel
+
spec:
+
display:
+
name: cpu usage
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100
+
seriesNameFormat: cpu {{cpu}}
+
"0_6":
+
kind: Panel
+
spec:
+
display:
+
name: memory usage
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: bytes
+
max: 4e+09
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes
+
seriesNameFormat: current memory usage
+
"0_7":
+
kind: Panel
+
spec:
+
display:
+
name: disk usage /
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: bytes
+
max: 3.8e+10
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}
+
seriesNameFormat: disk usage
+
"1_0":
+
kind: Panel
+
spec:
+
display:
+
name: nginx requests / min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
legend:
+
position: bottom
+
size: small
+
yAxis:
+
format:
+
unit: decimal
+
visual:
+
display: bar
+
palette:
+
mode: categorical
+
stack: all
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: nginx_request_count
+
seriesNameFormat: '{{res.statusCode}}'
+
"1_1":
+
kind: Panel
+
spec:
+
display:
+
name: nginx latency / min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: seconds
+
max: 0.5
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: nginx_request_latency
+
seriesNameFormat: '{{stats_result}}'
+
"2_0":
+
kind: Panel
+
spec:
+
display:
+
name: pds requests / min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
legend:
+
position: bottom
+
size: small
+
yAxis:
+
format:
+
unit: decimal
+
visual:
+
display: bar
+
palette:
+
mode: categorical
+
stack: all
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: pds_request_count
+
seriesNameFormat: '{{res.statusCode}}'
+
"2_1":
+
kind: Panel
+
spec:
+
display:
+
name: pds latency / min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: milliseconds
+
max: 500
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: pds_response_latency
+
seriesNameFormat: '{{stats_result}}'
+
"3_0":
+
kind: Panel
+
spec:
+
display:
+
name: gazesys visits
+
plugin:
+
kind: BarChart
+
spec:
+
calculation: last
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_visit_real_total + gazesys_visit_fake_total
+
seriesNameFormat: total visits
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_visit_fake_total
+
seriesNameFormat: (ai) bot visits
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_visit_real_total
+
seriesNameFormat: real visits
+
"3_1":
+
kind: Panel
+
spec:
+
display:
+
name: gazesys pet
+
plugin:
+
kind: StatChart
+
spec:
+
calculation: last
+
format:
+
unit: decimal
+
shortValues: true
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_pet_bounce_total
+
seriesNameFormat: bounce count
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_pet_distance_total
+
seriesNameFormat: distance travelled
+
"4_0":
+
kind: Panel
+
spec:
+
display:
+
name: anubis policy actions
+
plugin:
+
kind: BarChart
+
spec:
+
calculation: last
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: anubis_policy_results
+
seriesNameFormat: '{{action}}: {{rule}}'
+
layouts:
+
- kind: Grid
+
spec:
+
display:
+
title: resource usage
+
items:
+
- x: 0
+
"y": 0
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_0'
+
- x: 6
+
"y": 0
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_1'
+
- x: 12
+
"y": 0
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_2'
+
- x: 18
+
"y": 0
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_3'
+
- x: 0
+
"y": 6
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_4'
+
- x: 6
+
"y": 6
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_5'
+
- x: 12
+
"y": 6
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_6'
+
- x: 18
+
"y": 6
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_7'
+
- kind: Grid
+
spec:
+
display:
+
title: nginx metrics
+
items:
+
- x: 0
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/1_0'
+
- x: 8
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/1_1'
+
- kind: Grid
+
spec:
+
display:
+
title: pds metrics
+
items:
+
- x: 0
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/2_0'
+
- x: 8
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/2_1'
+
- kind: Grid
+
spec:
+
display:
+
title: gazesys
+
items:
+
- x: 0
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/3_0'
+
- x: 8
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/3_1'
+
- kind: Grid
+
spec:
+
display:
+
title: forgejo
+
items:
+
- x: 0
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/4_0'
+
duration: 30m
+
refreshInterval: 1m
+30
hosts/trimounts/modules/pocket-id.nix
···
+
{ config, ... }:
+
let
+
domain = "id.gaze.systems";
+
in
+
{
+
services.pocket-id = {
+
enable = true;
+
settings = {
+
APP_URL = "https://${domain}";
+
TRUST_PROXY = true;
+
PORT = 6823;
+
ANALYTICS_DISABLED = true;
+
};
+
};
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ domain ];
+
+
services.nginx.virtualHosts.${domain} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/".proxyPass = "http://localhost:${toString config.services.pocket-id.settings.PORT}";
+
locations."/".extraConfig = ''
+
proxy_busy_buffers_size 512k;
+
proxy_buffers 4 512k;
+
proxy_buffer_size 256k;
+
'';
+
};
+
}
+7
hosts/trimounts/modules/ssh.nix
···
+
{
+
services.fail2ban.enable = true;
+
services.openssh = {
+
enable = true;
+
settings.PasswordAuthentication = false;
+
};
+
}
+9
hosts/trimounts/modules/tailscale.nix
···
+
{ ... }:
+
{
+
imports = [ ../../../modules/network/tailscale.nix ];
+
+
services.tailscale = {
+
extraSetFlags = [ "--advertise-exit-node" ];
+
useRoutingFeatures = "both";
+
};
+
}
+6
hosts/trimounts/modules/tangled.nix/default.nix
···
+
{
+
imports = [
+
./knot.nix
+
./spindle.nix
+
];
+
}
+39
hosts/trimounts/modules/tangled.nix/knot.nix
···
+
{
+
config,
+
inputs,
+
terra,
+
...
+
}:
+
let
+
knotCfg = config.services.tangled.knot;
+
in
+
{
+
imports = [
+
"${inputs.tangled}/nix/modules/knot.nix"
+
];
+
+
services.tangled.knot = {
+
enable = true;
+
package = terra.tangled-knot;
+
gitUser = "git";
+
motdFile = ./motd;
+
server = {
+
listenAddr = "0.0.0.0:7777";
+
hostname = "knot.gaze.systems";
+
owner = "did:plc:dfl62fgb7wtjj3fcbb72naae";
+
};
+
};
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ knotCfg.server.hostname ];
+
+
services.nginx.virtualHosts.${knotCfg.server.hostname} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/" = {
+
proxyPass = "http://${knotCfg.server.listenAddr}";
+
proxyWebsockets = true;
+
};
+
};
+
}
+5
hosts/trimounts/modules/tangled.nix/motd
···
+
+
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+
┃ *paws at your commits* arf :3c ┃
+
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+
+64
hosts/trimounts/modules/tangled.nix/spindle.nix
···
+
{
+
lib,
+
config,
+
inputs,
+
terra,
+
...
+
}:
+
let
+
spindleCfg = config.services.tangled.spindle;
+
in
+
{
+
imports = [
+
"${inputs.tangled}/nix/modules/spindle.nix"
+
];
+
+
services.tangled.spindle = {
+
enable = true;
+
package = terra.tangled-spindle;
+
server = {
+
listenAddr = "0.0.0.0:7391";
+
hostname = "spindle.gaze.systems";
+
owner = "did:plc:dfl62fgb7wtjj3fcbb72naae";
+
# secrets = {
+
# provider = "openbao";
+
# openbao.proxyAddr = "http://spindle.bao.lan.gaze.systems";
+
# };
+
secrets.provider = "sqlite";
+
};
+
};
+
users.users.spindle = {
+
group = "spindle";
+
isSystemUser = true;
+
};
+
users.groups.spindle = { };
+
users.groups.podman.members = [ "spindle" ];
+
systemd.services.spindle = {
+
# after = lib.mkForce [ "network.target" "openbao-proxy-spindle.service" ];
+
serviceConfig = {
+
User = "spindle";
+
Group = "spindle";
+
};
+
};
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ spindleCfg.server.hostname ];
+
+
services.nginx.virtualHosts.${spindleCfg.server.hostname} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/" = {
+
proxyPass = "http://${spindleCfg.server.listenAddr}";
+
proxyWebsockets = true;
+
};
+
};
+
+
virtualisation.docker.enable = lib.mkForce false;
+
virtualisation.podman = {
+
enable = true;
+
autoPrune.enable = true;
+
dockerCompat = true;
+
dockerSocket.enable = true;
+
};
+
}
+70
hosts/trimounts/modules/victoria.nix
···
+
{ lib, config, ... }:
+
let
+
# syslogUdp = 5113;
+
metricsPort = 8428;
+
logsPort = 9428;
+
in
+
{
+
services.victoriametrics = {
+
enable = true;
+
listenAddress = ":${toString metricsPort}";
+
};
+
+
services.victorialogs = {
+
enable = true;
+
listenAddress = ":${toString logsPort}";
+
# extraOptions = ["-syslog.listenAddr.udp=:${toString syslogUdp}" "-journald.maxRequestSize=1024000000"];
+
};
+
+
services.vmalert.instances."" = {
+
enable = true;
+
settings =
+
let
+
l = "http://localhost";
+
in
+
{
+
"datasource.url" = "${l}${config.services.victorialogs.listenAddress}";
+
"remoteWrite.url" = "${l}${config.services.victoriametrics.listenAddress}";
+
"remoteRead.url" = "${l}${config.services.victoriametrics.listenAddress}";
+
"rule.defaultRuleType" = "vlogs";
+
};
+
};
+
+
services.fluent-bit.settings.pipeline.outputs = [
+
# write metrics to victoriametrics via prometheus
+
{
+
name = "prometheus_remote_write";
+
match = "metrics.*";
+
port = lib.removePrefix ":" config.services.victoriametrics.listenAddress;
+
uri = "/api/v1/write";
+
}
+
{
+
name = "http";
+
match = "logs.*";
+
port = lib.removePrefix ":" config.services.victorialogs.listenAddress;
+
uri = "/insert/jsonline?_stream_fields=stream&_msg_field=log&_time_field=date";
+
format = "json_lines";
+
json_date_format = "iso8601";
+
}
+
# write logs via syslog
+
# {
+
# name = "syslog";
+
# match = "*.log";
+
# port = syslogUdp;
+
# syslog_maxsize = 4096;
+
# syslog_severity_key = "severity";
+
# syslog_facility_key = "facility";
+
# syslog_hostname_key = "hostname";
+
# syslog_appname_key = "appname";
+
# syslog_procid_key = "procid";
+
# syslog_msgid_key = "msgid";
+
# syslog_sd_key = "sd";
+
# syslog_message_key = "message";
+
# }
+
];
+
+
# services.journald.upload = {
+
# enable = true;
+
# settings.Upload.URL = "http://localhost${config.services.victorialogs.listenAddress}/insert/journald";
+
# };
+
}
+91
hosts/trimounts/modules/website.nix
···
+
{
+
config,
+
pkgs,
+
inputs,
+
...
+
}:
+
let
+
PUBLIC_BASE_URL = "https://gaze.systems";
+
modules = (pkgs.callPackage "${inputs.blog}/nix/modules.nix" { }).overrideAttrs (_: {
+
# outputHash = "sha256-rzfSfiK8FSNFR+1QTwM/ltLZBprG9BoQsPmOt6IdXFc=";
+
});
+
pkg = pkgs.callPackage "${inputs.blog}/nix" {
+
inherit PUBLIC_BASE_URL;
+
gazesys-modules = modules;
+
};
+
port = 3003;
+
vhostConfig = {
+
locations."/".proxyPass = "http://localhost:${toString port}";
+
locations."/annoy/ws/" = {
+
proxyWebsockets = true;
+
proxyPass = "http://100.64.0.9:3111/";
+
extraConfig = ''
+
rewrite ^/annoy/ws/(.*) /$1 break;
+
'';
+
};
+
locations."/annoy/ws" = {
+
proxyWebsockets = true;
+
proxyPass = "http://100.64.0.9:3111/";
+
extraConfig = ''
+
rewrite ^/annoy/ws(.*) /$1 break;
+
'';
+
};
+
};
+
in
+
{
+
users.users.website = {
+
isSystemUser = true;
+
group = "website";
+
};
+
users.groups.website = { };
+
+
age.secrets.websiteConfig.file = ../../../secrets/websiteConfig.age;
+
+
systemd.services.website = {
+
description = "website";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
environment = {
+
HOME = "/var/lib/website";
+
ORIGIN = PUBLIC_BASE_URL;
+
PORT = toString port;
+
WEBSITE_DATA_DIR = "/var/lib/website";
+
VITE_CLOUDINARY_CLOUD_NAME = "dgtwf7mar";
+
};
+
serviceConfig = {
+
User = "website";
+
ExecStart = "${pkg}/bin/website";
+
Restart = "on-failure";
+
RestartSec = 5;
+
WorkingDirectory = "/var/lib/website";
+
EnvironmentFile = config.age.secrets.websiteConfig.path;
+
KillSignal = "SIGKILL";
+
};
+
};
+
+
# systemd.services.annoy-keep-alive = {
+
# description = "keeps annoy peer connection alive";
+
# wantedBy = [ "multi-user.target" ];
+
# after = [ "network.target" ];
+
# serviceConfig = {
+
# Type = "oneshot";
+
# ExecStart = "${pkgs.curl}/bin/curl http://100.64.0.1:3111/";
+
# };
+
# };
+
# systemd.timers.annoy-keep-alive.timerConfig = {
+
# OnBootSec = "5 min";
+
# OnUnitActiveSec = "5 min";
+
# Unit = "annoy-keep-alive.service";
+
# };
+
+
services.nginx.virtualHosts."gaze.systems" = vhostConfig;
+
services.nginx.virtualHosts."ptr.pet" = vhostConfig;
+
services.nginx.virtualHosts."poor.dog" = vhostConfig;
+
+
# services.nginx.virtualHosts."poor.dog" = {
+
# locations."=/".return = "301 https://gaze.systems$request_uri";
+
# };
+
# services.nginx.virtualHosts."ptr.pet" = {
+
# locations."=/".return = "301 https://gaze.systems$request_uri";
+
# };
+
}
+33
hosts/volsinii/default.nix
···
+
{
+
inputs,
+
tlib,
+
pkgs,
+
...
+
}:
+
{
+
imports = [
+
"${inputs.agenix}/modules/age.nix"
+
"${inputs.home}/nixos"
+
"${inputs.disko}/module.nix"
+
../../modules
+
../../modules/stylix-null.nix
+
../../users/root
+
../../users/dawn
+
./disk-config.nix
+
]
+
++ (tlib.importFolder (toString ./modules));
+
+
boot.loader.grub = {
+
efiSupport = true;
+
efiInstallAsRemovable = true;
+
};
+
+
environment.systemPackages = [
+
pkgs.curl
+
pkgs.gitMinimal
+
];
+
+
networking.firewall.enable = true;
+
+
system.stateVersion = "25.05";
+
}
+54
hosts/volsinii/disk-config.nix
···
+
{
+
disko.devices = {
+
disk = {
+
main = {
+
type = "disk";
+
device = "/dev/xvda";
+
content = {
+
type = "gpt";
+
partitions = {
+
boot = {
+
priority = 1;
+
name = "boot";
+
size = "1M";
+
type = "EF02";
+
};
+
esp = {
+
priority = 2;
+
name = "ESP";
+
size = "500M";
+
type = "EF00";
+
content = {
+
type = "filesystem";
+
format = "vfat";
+
mountpoint = "/boot";
+
mountOptions = [ "umask=0077" ];
+
};
+
};
+
root = {
+
priority = 3;
+
end = "-8G";
+
content = {
+
type = "btrfs";
+
extraArgs = [ "-f" ]; # Override existing partition
+
mountpoint = "/";
+
mountOptions = [
+
"compress=zstd"
+
"noatime"
+
];
+
};
+
};
+
plainSwap = {
+
priority = 4;
+
size = "100%";
+
content = {
+
type = "swap";
+
discardPolicy = "both";
+
};
+
};
+
};
+
};
+
};
+
};
+
};
+
}
+37
hosts/volsinii/modules/hardware-configuration.nix
···
+
# Do not modify this file! It was generated by ‘nixos-generate-config’
+
# and may be overwritten by future invocations. Please make changes
+
# to /etc/nixos/configuration.nix instead.
+
{
+
config,
+
lib,
+
pkgs,
+
modulesPath,
+
...
+
}:
+
+
{
+
imports = [ ];
+
+
boot.initrd.availableKernelModules = [
+
"ata_piix"
+
"sr_mod"
+
"xen_blkfront"
+
];
+
boot.initrd.kernelModules = [ ];
+
boot.kernelModules = [ ];
+
boot.extraModulePackages = [ ];
+
+
networking.useDHCP = false;
+
+
systemd.network.enable = true;
+
systemd.network.wait-online.enable = false;
+
systemd.network.networks."enX0" = {
+
matchConfig = {
+
Name = "enX0";
+
};
+
address = [ "199.71.188.53/29" ];
+
gateway = [ "199.71.188.49" ];
+
};
+
+
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
+
}
+7
hosts/volsinii/modules/ssh.nix
···
+
{
+
services.fail2ban.enable = true;
+
services.openssh = {
+
enable = true;
+
settings.PasswordAuthentication = false;
+
};
+
}
+7
hosts/volsinii/modules/tailscale.nix
···
+
{ config, ... }:
+
{
+
imports = [ ../../../modules/network/tailscale.nix ];
+
+
# age.secrets.tailscaleAuthKey.file = ../../../secrets/tailscaleAuthKey.age;
+
# services.tailscale.authKeyFile = config.age.secrets.tailscaleAuthKey.path;
+
}
+8 -4
hosts/wolumonde/default.nix
···
...
}:
{
-
imports = [
+
imports = with inputs; [
+
../../modules
+
../../modules/stylix-null.nix
+
../../locale
../../users/root
-
"${inputs.agenix}/modules/age.nix"
-
"${inputs.ncr}/firewall"
-
"${inputs.ncr}/firewall/hetzner"
+
"${home}/nixos"
+
"${agenix}/modules/age.nix"
+
"${ncr}/firewall"
+
"${ncr}/firewall/hetzner"
]
++ (tlib.importFolder (toString ./modules));
+28
hosts/wolumonde/modules/arpa.disabled
···
+
{ pkgs, ... }:
+
let
+
index = pkgs.writeText "index.txt" ''
+
hi there~
+
+
you are currently interfacing with one of the data endpoints
+
of entity with serial id /90008/. you may want to open a
+
connection to https://gaze.systems/about for more data.
+
+
/discord 90.008/
+
/bsky @poor.dog/
+
/email 90008@gaze.systems/
+
+
/dig +short TXT 9.0.0.0.8.e.f.1.5.0.7.4.0.1.0.0.2.ip6.arpa/
+
'';
+
root = pkgs.runCommand "root" { } ''
+
mkdir -p $out
+
ln -s ${index} $out/index.txt
+
'';
+
in
+
{
+
services.nginx.virtualHosts."9.0.0.0.8.e.f.1.5.0.7.4.0.1.0.0.2.ip6.arpa" = {
+
inherit root;
+
locations."/".index = "index.txt";
+
quic = true;
+
kTLS = true;
+
};
+
}
-28
hosts/wolumonde/modules/arpa.nix
···
-
{ pkgs, ... }:
-
let
-
index = pkgs.writeText "index.txt" ''
-
hi there~
-
-
you are currently interfacing with one of the data endpoints
-
of entity with serial id /90008/. you may want to open a
-
connection to https://gaze.systems/about for more data.
-
-
/discord 90.008/
-
/bsky @poor.dog/
-
/email 90008@gaze.systems/
-
-
/dig +short TXT 9.0.0.0.8.e.f.1.5.0.7.4.0.1.0.0.2.ip6.arpa/
-
'';
-
root = pkgs.runCommand "root" { } ''
-
mkdir -p $out
-
ln -s ${index} $out/index.txt
-
'';
-
in
-
{
-
services.nginx.virtualHosts."9.0.0.0.8.e.f.1.5.0.7.4.0.1.0.0.2.ip6.arpa" = {
-
inherit root;
-
locations."/".index = "index.txt";
-
quic = true;
-
kTLS = true;
-
};
-
}
+67
hosts/wolumonde/modules/atproto.disabled
···
+
{ pkgs, lib, ... }:
+
let
+
getFileType = name: if lib.hasSuffix ".json" name then "application/json" else "text/plain";
+
mkWellKnownCfg = files: {
+
quic = true;
+
kTLS = true;
+
locations = (
+
lib.mapAttrs' (name: file: {
+
name = "=/.well-known/${name}";
+
value = {
+
extraConfig = ''
+
alias ${file};
+
add_header access-control-allow-origin *;
+
default_type ${getFileType name};
+
'';
+
};
+
}) files
+
);
+
};
+
mkHandleCfg =
+
rootDomain: did:
+
(mkWellKnownCfg {
+
"atproto-did" = pkgs.writeText "server" did;
+
})
+
// {
+
useACMEHost = rootDomain;
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
};
+
mkDidWebCfg = domain: {
+
"${domain}" =
+
(mkWellKnownCfg {
+
"did.json" = ../../../secrets/${domain}.did;
+
"atproto-did" = pkgs.writeText "server" "did:web:${domain}";
+
})
+
// (lib.optionalAttrs (lib.hasSuffix "gaze.systems" domain) {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
});
+
};
+
dawnDid = "dawn.gaze.systems";
+
guestbookDid = "guestbook.gaze.systems";
+
in
+
{
+
security.acme.certs."gaze.systems".extraDomainNames = [
+
dawnDid
+
guestbookDid
+
"drew.gaze.systems"
+
"test.gaze.systems"
+
"eris.gaze.systems"
+
];
+
services.nginx.virtualHosts = {
+
"test.gaze.systems" = mkHandleCfg "gaze.systems" "did:web:dawn.gaze.systems";
+
"poor.dog" = mkHandleCfg "poor.dog" "did:plc:dfl62fgb7wtjj3fcbb72naae";
+
"ptr.pet" = mkHandleCfg "ptr.pet" "did:plc:dfl62fgb7wtjj3fcbb72naae";
+
"nil.ptr.pet" = mkHandleCfg "ptr.pet" "did:plc:dumbmutt4po52ept2tczimje";
+
"june.ptr.pet" = mkHandleCfg "ptr.pet" "did:plc:y3z2rr7q5rywu4fjn3fmfyop";
+
"drew.gaze.systems" = mkHandleCfg "gaze.systems" "did:plc:vo6ie3kd6xvpjlof4pnb2zzp";
+
"eris.gaze.systems" = mkHandleCfg "gaze.systems" "did:plc:bxjnsrfzozl365rsdo5yvuz5";
+
}
+
// (mkDidWebCfg dawnDid)
+
// (mkDidWebCfg guestbookDid);
+
# // (mkDidWebCfg "9.0.0.0.8.e.f.1.5.0.7.4.0.1.0.0.2.ip6.arpa");
+
}
-60
hosts/wolumonde/modules/atproto.nix
···
-
{ pkgs, lib, ... }:
-
let
-
getFileType = name: if lib.hasSuffix ".json" name then "application/json" else "text/plain";
-
mkWellKnownCfg = files: {
-
quic = true;
-
kTLS = true;
-
locations = (
-
lib.mapAttrs' (name: file: {
-
name = "=/.well-known/${name}";
-
value = {
-
extraConfig = ''
-
alias ${file};
-
add_header access-control-allow-origin *;
-
default_type ${getFileType name};
-
'';
-
};
-
}) files
-
);
-
};
-
mkHandleCfg = rootDomain: did: (mkWellKnownCfg {
-
"atproto-did" = pkgs.writeText "server" did;
-
})
-
// {
-
useACMEHost = rootDomain;
-
forceSSL = true;
-
quic = true;
-
kTLS = true;
-
};
-
mkDidWebCfg = domain: {
-
"${domain}" =
-
(mkWellKnownCfg {
-
"did.json" = ../../../secrets/${domain}.did;
-
"atproto-did" = pkgs.writeText "server" "did:web:${domain}";
-
})
-
// (lib.optionalAttrs (lib.hasSuffix "gaze.systems" domain) {
-
useACMEHost = "gaze.systems";
-
forceSSL = true;
-
quic = true;
-
kTLS = true;
-
});
-
};
-
dawnDid = "dawn.gaze.systems";
-
guestbookDid = "guestbook.gaze.systems";
-
in
-
{
-
security.acme.certs."gaze.systems".extraDomainNames = [
-
dawnDid guestbookDid "drew.gaze.systems" "test.gaze.systems"
-
];
-
services.nginx.virtualHosts = {
-
"test.gaze.systems" = mkHandleCfg "gaze.systems" "did:web:dawn.gaze.systems";
-
"poor.dog" = mkHandleCfg "poor.dog" "did:plc:dfl62fgb7wtjj3fcbb72naae";
-
"ptr.pet" = mkHandleCfg "ptr.pet" "did:plc:dfl62fgb7wtjj3fcbb72naae";
-
"nil.ptr.pet" = mkHandleCfg "ptr.pet" "did:web:dawn.gaze.systems";
-
"june.ptr.pet" = mkHandleCfg "ptr.pet" "did:plc:y3z2rr7q5rywu4fjn3fmfyop";
-
"drew.gaze.systems" = mkHandleCfg "gaze.systems" "did:plc:vo6ie3kd6xvpjlof4pnb2zzp";
-
}
-
// (mkDidWebCfg dawnDid)
-
// (mkDidWebCfg guestbookDid);
-
# // (mkDidWebCfg "9.0.0.0.8.e.f.1.5.0.7.4.0.1.0.0.2.ip6.arpa");
-
}
-83
hosts/wolumonde/modules/blog.nix
···
-
{
-
config,
-
pkgs,
-
inputs,
-
...
-
}:
-
let
-
PUBLIC_BASE_URL = "https://gaze.systems";
-
modules = (pkgs.callPackage "${inputs.blog}/nix/modules.nix" { }).overrideAttrs (_: {
-
outputHash = "sha256-FhJT1CR5FyGlWMYjGDQDSebXtPWdRvDn5DR/rtk/T+4=";
-
});
-
pkg = pkgs.callPackage "${inputs.blog}/nix" {
-
inherit PUBLIC_BASE_URL;
-
gazesys-modules = modules;
-
};
-
port = 3003;
-
in
-
{
-
users.users.website = {
-
isSystemUser = true;
-
group = "website";
-
};
-
users.groups.website = { };
-
-
systemd.services.website = {
-
description = "website";
-
wantedBy = [ "multi-user.target" ];
-
after = [ "network.target" ];
-
environment = {
-
HOME = "/var/lib/website";
-
ORIGIN = PUBLIC_BASE_URL;
-
PORT = toString port;
-
WEBSITE_DATA_DIR = "/var/lib/website";
-
VITE_CLOUDINARY_CLOUD_NAME = "dgtwf7mar";
-
};
-
serviceConfig = {
-
User = "website";
-
ExecStart = "${pkg}/bin/website";
-
Restart = "on-failure";
-
RestartSec = 5;
-
WorkingDirectory = "/var/lib/website";
-
EnvironmentFile = config.age.secrets.websiteConfig.path;
-
KillSignal = "SIGKILL";
-
};
-
};
-
-
# systemd.services.annoy-keep-alive = {
-
# description = "keeps annoy peer connection alive";
-
# wantedBy = [ "multi-user.target" ];
-
# after = [ "network.target" ];
-
# serviceConfig = {
-
# Type = "oneshot";
-
# ExecStart = "${pkgs.curl}/bin/curl http://100.64.0.1:3111/";
-
# };
-
# };
-
# systemd.timers.annoy-keep-alive.timerConfig = {
-
# OnBootSec = "5 min";
-
# OnUnitActiveSec = "5 min";
-
# Unit = "annoy-keep-alive.service";
-
# };
-
-
services.nginx.virtualHosts."gaze.systems" = {
-
locations."/".proxyPass = "http://localhost:${toString port}";
-
locations."/annoy/ws/" = {
-
proxyWebsockets = true;
-
proxyPass = "http://100.64.0.9:3111/";
-
extraConfig = ''
-
rewrite ^/annoy/ws/(.*) /$1 break;
-
'';
-
};
-
locations."/annoy/ws" = {
-
proxyWebsockets = true;
-
proxyPass = "http://100.64.0.9:3111/";
-
extraConfig = ''
-
rewrite ^/annoy/ws(.*) /$1 break;
-
'';
-
};
-
};
-
-
services.nginx.virtualHosts."poor.dog" = {
-
locations."/".return = "301 https://gaze.systems$request_uri";
-
};
-
}
+29
hosts/wolumonde/modules/clickee-proxy.disabled
···
+
{ config, terra, ... }:
+
let
+
port = 7145;
+
in
+
{
+
age.secrets.clickeeProxyConfig = {
+
file = ../../../secrets/clickeeProxyConfig.age;
+
};
+
+
systemd.services.clickee-proxy = {
+
description = "clickee-proxy";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
environment = {
+
PORT = toString port;
+
};
+
serviceConfig = {
+
DynamicUser = true;
+
ExecStart = "${terra.clickee-proxy}/bin/clickee-proxy";
+
Restart = "on-failure";
+
RestartSec = 5;
+
EnvironmentFile = config.age.secrets.clickeeProxyConfig.path;
+
};
+
};
+
+
services.nginx.virtualHosts."poor.dog" = {
+
locations."/click".proxyPass = "http://localhost:${toString port}";
+
};
+
}
-27
hosts/wolumonde/modules/clickee-proxy.nix
···
-
{config, terra, ...}: let
-
port = 7145;
-
in {
-
age.secrets.clickeeProxyConfig = {
-
file = ../../../secrets/clickeeProxyConfig.age;
-
};
-
-
systemd.services.clickee-proxy = {
-
description = "clickee-proxy";
-
wantedBy = [ "multi-user.target" ];
-
after = [ "network.target" ];
-
environment = {
-
PORT = toString port;
-
};
-
serviceConfig = {
-
DynamicUser = true;
-
ExecStart = "${terra.clickee-proxy}/bin/clickee-proxy";
-
Restart = "on-failure";
-
RestartSec = 5;
-
EnvironmentFile = config.age.secrets.clickeeProxyConfig.path;
-
};
-
};
-
-
services.nginx.virtualHosts."poor.dog" = {
-
locations."/click".proxyPass = "http://localhost:${toString port}";
-
};
-
}
+65
hosts/wolumonde/modules/email.disabled
···
+
{ pkgs, ... }:
+
{
+
security.acme.certs."ptr.pet".extraDomainNames = [
+
"mta-sts.ptr.pet"
+
"autoconfig.ptr.pet"
+
"autodiscover.ptr.pet"
+
"test.ptr.pet"
+
];
+
services.nginx.virtualHosts."test.ptr.pet" = {
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
};
+
services.nginx.virtualHosts."ptr.pet" = {
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/mail/config-v1.1.xml" = {
+
return = "301 https://autoconfig.migadu.com/mail/config-v1.1.xml";
+
};
+
locations."/Autodiscover/Autodiscover.xml" = {
+
return = "301 https://autodiscover.migadu.com/Autodiscover/Autodiscover.xml";
+
};
+
};
+
services.nginx.virtualHosts."mta-sts.ptr.pet" =
+
let
+
file = pkgs.writeText "mta-sts.txt" ''
+
version: STSv1
+
mode: enforce
+
mx: aspmx1.migadu.com
+
mx: aspmx2.migadu.com
+
max_age: 31557600
+
'';
+
in
+
{
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."=/.well-known/mta-sts.txt".extraConfig = ''
+
alias ${file};
+
default_type text/plain;
+
'';
+
};
+
services.nginx.virtualHosts."autoconfig.ptr.pet" = {
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/" = {
+
return = "301 https://autoconfig.migadu.com$request_uri";
+
};
+
};
+
services.nginx.virtualHosts."autodiscover.ptr.pet" = {
+
useACMEHost = "ptr.pet";
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/" = {
+
return = "301 https://autodiscover.migadu.com$request_uri";
+
};
+
};
+
}
-62
hosts/wolumonde/modules/email.nix
···
-
{pkgs, ...}: {
-
security.acme.certs."ptr.pet".extraDomainNames = [
-
"mta-sts.ptr.pet"
-
"autoconfig.ptr.pet"
-
"autodiscover.ptr.pet"
-
"test.ptr.pet"
-
];
-
services.nginx.virtualHosts."test.ptr.pet" = {
-
useACMEHost = "ptr.pet";
-
quic = true;
-
kTLS = true;
-
forceSSL = true;
-
};
-
services.nginx.virtualHosts."ptr.pet" = {
-
useACMEHost = "ptr.pet";
-
quic = true;
-
kTLS = true;
-
forceSSL = true;
-
locations."/mail/config-v1.1.xml" = {
-
return = "301 https://autoconfig.migadu.com/mail/config-v1.1.xml";
-
};
-
locations."/Autodiscover/Autodiscover.xml" = {
-
return = "301 https://autodiscover.migadu.com/Autodiscover/Autodiscover.xml";
-
};
-
};
-
services.nginx.virtualHosts."mta-sts.ptr.pet" = let
-
file = pkgs.writeText "mta-sts.txt" ''
-
version: STSv1
-
mode: enforce
-
mx: aspmx1.migadu.com
-
mx: aspmx2.migadu.com
-
max_age: 31557600
-
'';
-
in {
-
useACMEHost = "ptr.pet";
-
quic = true;
-
kTLS = true;
-
forceSSL = true;
-
locations."=/.well-known/mta-sts.txt".extraConfig = ''
-
alias ${file};
-
default_type text/plain;
-
'';
-
};
-
services.nginx.virtualHosts."autoconfig.ptr.pet" = {
-
useACMEHost = "ptr.pet";
-
quic = true;
-
kTLS = true;
-
forceSSL = true;
-
locations."/" = {
-
return = "301 https://autoconfig.migadu.com$request_uri";
-
};
-
};
-
services.nginx.virtualHosts."autodiscover.ptr.pet" = {
-
useACMEHost = "ptr.pet";
-
quic = true;
-
kTLS = true;
-
forceSSL = true;
-
locations."/" = {
-
return = "301 https://autodiscover.migadu.com$request_uri";
-
};
-
};
-
}
+33
hosts/wolumonde/modules/fluentbit.disabled
···
+
{
+
pkgs,
+
config,
+
lib,
+
...
+
}:
+
{
+
services.fluent-bit = {
+
enable = true;
+
settings = {
+
service.flush = 1;
+
pipeline.inputs = [
+
{
+
name = "node_exporter_metrics";
+
tag = "metrics.node";
+
scrape_interval = 5;
+
}
+
# {
+
# name = "dummy";
+
# tag = "logs.dummy";
+
# dummy = ''{"_msg": "dummy"}'';
+
# }
+
{
+
name = "fluentbit_metrics";
+
tag = "metrics.fluentbit";
+
scrape_interval = 5;
+
}
+
];
+
};
+
};
+
+
systemd.services.fluent-bit.serviceConfig.StateDirectory = "fluent-bit";
+
}
-33
hosts/wolumonde/modules/fluentbit.nix
···
-
{
-
pkgs,
-
config,
-
lib,
-
...
-
}:
-
{
-
services.fluent-bit = {
-
enable = true;
-
settings = {
-
service.flush = 1;
-
pipeline.inputs = [
-
{
-
name = "node_exporter_metrics";
-
tag = "metrics.node";
-
scrape_interval = 5;
-
}
-
# {
-
# name = "dummy";
-
# tag = "logs.dummy";
-
# dummy = ''{"_msg": "dummy"}'';
-
# }
-
{
-
name = "fluentbit_metrics";
-
tag = "metrics.fluentbit";
-
scrape_interval = 5;
-
}
-
];
-
};
-
};
-
-
systemd.services.fluent-bit.serviceConfig.StateDirectory = "fluent-bit";
-
}
+98
hosts/wolumonde/modules/forgejo.disabled/default.nix
···
+
{
+
pkgs,
+
lib,
+
config,
+
...
+
}:
+
let
+
forgejoCfg = config.services.forgejo.settings;
+
anubisCfg = config.services.anubis.instances."forgejo".settings;
+
in
+
{
+
services.forgejo = {
+
enable = true;
+
package = pkgs.forgejo;
+
lfs.enable = true;
+
settings = {
+
DEFAULT.APP_NAME = "awruff ^^";
+
server = {
+
DOMAIN = "git.gaze.systems";
+
ROOT_URL = "https://git.gaze.systems/";
+
HTTP_PORT = 9008;
+
};
+
service = {
+
DISABLE_REGISTRATION = true;
+
};
+
security.REVERSE_PROXY_TRUSTED_PROXIES = "127.0.0.0/8,::1/128";
+
session.COOKIE_SECURE = true;
+
ui = {
+
DEFAULT_SHOW_FULL_NAME = true;
+
DEFAULT_THEME = "edge-dark";
+
THEMES = "edge-dark,forgejo-dark";
+
THEME_COLOR_META_TAG = "#333644";
+
};
+
"ui.meta" = {
+
DESCRIPTION = "nyan? arf!!!! :3";
+
};
+
metrics.ENABLED = true;
+
};
+
};
+
+
# copy custom data stuff
+
systemd.services.forgejo.preStart =
+
let
+
customDir = "${config.services.forgejo.stateDir}/custom";
+
getCustomDir = name: "${customDir}/${name}";
+
makeCopyCommand = dir: ''
+
mkdir -p ${customDir}
+
rm -rf ${getCustomDir dir}
+
cp -r --no-preserve=mode,ownership ${./${dir}} ${getCustomDir dir}
+
'';
+
in
+
lib.concatMapStrings makeCopyCommand [
+
"templates"
+
"public"
+
];
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ forgejoCfg.server.DOMAIN ];
+
services.nginx.virtualHosts.${forgejoCfg.server.DOMAIN} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
# disallow metrics for public
+
locations."/metrics".return = "403";
+
locations."/" = {
+
extraConfig = ''
+
client_max_body_size 1000m;
+
'';
+
proxyPass = "http://localhost${anubisCfg.BIND}";
+
};
+
};
+
+
services.anubis.instances."forgejo".settings = {
+
BIND = ":6293";
+
BIND_NETWORK = "tcp";
+
METRICS_BIND = ":9090";
+
METRICS_BIND_NETWORK = "tcp";
+
TARGET = "http://localhost:${toString forgejoCfg.server.HTTP_PORT}";
+
WEBMASTER_EMAIL = "90008@gaze.systems";
+
SERVE_ROBOTS_TXT = true;
+
OG_PASSTHROUGH = true;
+
DIFFICULTY = 4;
+
};
+
+
# scrape forgejo metrics
+
services.victoriametrics.prometheusConfig.scrape_configs = [
+
{
+
job_name = "forgejo";
+
metrics_path = "/metrics";
+
static_configs = [ { targets = [ "localhost:${toString forgejoCfg.server.HTTP_PORT}" ]; } ];
+
}
+
{
+
job_name = "anubis_forgejo";
+
metrics_path = "/metrics";
+
static_configs = [ { targets = [ "localhost${anubisCfg.METRICS_BIND}" ]; } ];
+
}
+
];
+
}
+995
hosts/wolumonde/modules/forgejo.disabled/public/assets/css/theme-edge-dark.css
···
+
@import "https://cdn.jsdelivr.net/npm/comic-mono@0.0.1/index.css";
+
@font-face {
+
font-family: 'Comic Sans';
+
font-style: normal;
+
font-display: swap;
+
src: url('../fonts/comic.woff2') format('woff2');
+
}
+
@font-face {
+
font-family: 'Comic Sans';
+
font-style: normal;
+
font-weight: bold;
+
font-display: swap;
+
src: url('../fonts/comicbd.woff2') format('woff2');
+
}
+
@font-face {
+
font-family: 'Comic Sans';
+
font-style: italic;
+
font-display: swap;
+
src: url('../fonts/comici.woff2') format('woff2');
+
}
+
:root {
+
--fonts-proportional: "Comic Sans", sans-serif !important;
+
--fonts-monospace: "Comic Mono", monospace !important;
+
}
+
.chroma .hl{background-color:#3f424d}.chroma .ln,.chroma .lnt{color:#7f7f7f}
+
+
.chroma .k{color:#f63}
+
+
.chroma .kc{color:#fa1}
+
+
.chroma .kd{color:#9daccc}
+
+
.chroma .kn{color:#fa1}
+
+
.chroma .kp{color:#5f8700}
+
+
.chroma .kr{color:#f63}
+
+
.chroma .kt{color:#9daccc}
+
+
.chroma .na{color:#8a8a8a}
+
+
.chroma .bp,.chroma .nb{color:#9daccc}
+
+
.chroma .nc,.chroma .no{color:#fa1}
+
+
.chroma .nd{color:#9daccc}
+
+
.chroma .ni{color:#fa1}
+
+
.chroma .ne{color:#af8700}
+
+
.chroma .nf{color:#9daccc}
+
+
.chroma .nl,.chroma .nn{color:#fa1}
+
+
.chroma .nt,.chroma .nv,.chroma .nx{color:#9daccc}
+
+
.chroma .vc{color:#f81}
+
+
.chroma .vg,.chroma .vi{color:#fa1}
+
+
.chroma .s,.chroma .sa{color:#1af}
+
+
.chroma .sb{color:#a0cc75}
+
+
.chroma .dl,.chroma .sc{color:#1af}
+
+
.chroma .sd{color:#6a737d}
+
+
.chroma .s2{color:#a0cc75}
+
+
.chroma .se{color:#f63}
+
+
.chroma .sh{color:#1af}
+
+
.chroma .si,.chroma .sx{color:#fa1}
+
+
.chroma .sr{color:#97c}
+
+
.chroma .s1{color:#a0cc75}
+
+
.chroma .ss{color:#fa1}
+
+
.chroma .il,.chroma .m,.chroma .mb,.chroma .mf,.chroma .mh,.chroma .mi,.chroma .mo{color:#1af}
+
+
.chroma .o{color:#f63}
+
+
.chroma .ow{color:#5f8700}
+
+
.chroma .c,.chroma .c1,.chroma .ch,.chroma .cm{color:#6a737d}
+
+
.chroma .cs{color:#637d}
+
+
.chroma .cp,.chroma .cpf{color:#fc6}
+
+
.chroma .gd{color:#fff;background-color:#5f3737}
+
+
.chroma .ge{color:#ef5}
+
+
.chroma .gr{color:#f33}
+
+
.chroma .gh{color:#fa1}
+
+
.chroma .gi{color:#fff;background-color:#3a523a}
+
+
.chroma .go{color:#888888}
+
+
.chroma .gp{color:#555555}
+
+
.chroma .gu{color:#9daccc}
+
+
.chroma .gt{color:#f63}
+
+
.chroma .w{color:#bbbbbb}
+
+
:root {
+
--color-primary: #ccc;
+
--color-primary-dark-1: #c5c5c5;
+
--color-primary-dark-2: #bebebe;
+
--color-primary-dark-3: #b7b7b7;
+
--color-primary-dark-4: #b0b0b0;
+
--color-primary-dark-5: #a9a9a9;
+
--color-primary-dark-6: #a2a2a2;
+
--color-primary-dark-7: #9b9b9b;
+
--color-primary-light-1: #d3d3d3;
+
--color-primary-light-2: #d9d9d9;
+
--color-primary-light-3: #e0e0e0;
+
--color-primary-light-4: #e7e7e7;
+
--color-primary-light-5: #eeeeee;
+
--color-primary-light-6: #f5f5f5;
+
--color-primary-light-7: #fff;
+
--color-primary-alpha-10: #afb0b119;
+
--color-primary-alpha-20: #afb0b133;
+
--color-primary-alpha-30: #afb0b14b;
+
--color-primary-alpha-40: #afb0b166;
+
--color-primary-alpha-50: #afb0b180;
+
--color-primary-alpha-60: #afb0b199;
+
--color-primary-alpha-70: #afb0b1b3;
+
--color-primary-alpha-80: #afb0b1cc;
+
--color-primary-alpha-90: #afb0b1e1;
+
--color-secondary: #000;
+
--color-secondary-dark-1: #141414;
+
--color-secondary-dark-2: #0b0c0e;
+
--color-secondary-dark-3: #17181c;
+
--color-secondary-dark-4: #22242a;
+
--color-secondary-dark-5: #2d3139;
+
--color-secondary-dark-6: #393d47;
+
--color-secondary-dark-7: #444955;
+
--color-secondary-dark-7: #4f5563;
+
--color-secondary-dark-8: #5b6171;
+
--color-secondary-dark-8: #666d7f;
+
--color-secondary-dark-9: #71798e;
+
--color-secondary-dark-10: #808799;
+
--color-secondary-dark-11: #8e94a4;
+
--color-secondary-light-1: #373b46;
+
--color-secondary-light-2: #292c34;
+
--color-secondary-light-3: #1c1e23;
+
--color-secondary-light-4: #0e0f11;
+
--color-secondary-alpha-10: #45454519;
+
--color-secondary-alpha-20: #45454533;
+
--color-secondary-alpha-30: #4545454b;
+
--color-secondary-alpha-40: #45454566;
+
--color-secondary-alpha-50: #45454580;
+
--color-secondary-alpha-60: #45454599;
+
--color-secondary-alpha-70: #454545b3;
+
--color-secondary-alpha-80: #454545cc;
+
--color-secondary-alpha-90: #454545e1;
+
/* colors */
+
--color-red: #db2828;
+
--color-orange: #ff6600;
+
--color-yellow: #ffff99;
+
--color-olive: #abc11a;
+
--color-green: #199717;
+
--color-teal: #01fed4;
+
--color-blue: #226ac9;
+
--color-violet: #6435c9;
+
--color-purple: #a333c8;
+
--color-pink: #e03997;
+
--color-brown: #a5673f;
+
--color-grey: #767a85;
+
--color-black: #1e222e;
+
--color-gold: #a1882b;
+
--color-white: #ffffff;
+
--color-diff-removed-word-bg: #6f3333;
+
--color-diff-added-word-bg: #3c653c;
+
--color-diff-removed-row-bg: #3c2626;
+
--color-diff-added-row-bg: #283e2d;
+
--color-diff-removed-row-border: #634343;
+
--color-diff-added-row-border: #314a37;
+
--color-diff-inactive: #353846;
+
/* target-based colors */
+
--color-body: #000;
+
--color-box-header: #000;
+
--color-box-body: #070707;
+
--color-text-dark: #dee1e8;
+
--color-text: #c7cad1;
+
--color-text-light: #acb0b9;
+
--color-text-light-2: #8a8e99;
+
--color-text-light-3: #707687;
+
--color-footer: #000;
+
--color-timeline: #4c525e;
+
--color-input-text: #d5dbe6;
+
--color-input-background: #000;
+
--color-input-border: #454545;
+
--color-input-border-hover: #4e5465;
+
--color-navbar: #060606;
+
--color-light: #00000028;
+
--color-light-border: #ffffff28;
+
--color-hover: #ffffff10;
+
--color-active: #25272d;
+
--color-menu: #060606;
+
--color-card: #060606;
+
--color-markdown-table-row: #ffffff06;
+
--color-markdown-code-block: #121314;
+
--color-button: #070707;
+
--color-code-bg: #060606;
+
--color-shadow: #00000060;
+
--color-secondary-bg: #060606;
+
--color-text-focus: #fff;
+
--color-expand-button: #3c404d;
+
--color-placeholder-text: #6a737d;
+
--color-editor-line-highlight: var(--color-primary-light-5);
+
--color-project-board-bg: var(--color-secondary-light-2);
+
--color-nav-bg: var(--color-body);
+
--color-nav-hover-bg: var(--color-hover);
+
}
+
+
::-webkit-calendar-picker-indicator {
+
filter: invert(.8);
+
}
+
+
.ui.horizontal.segments > .segment {
+
background-color: #2d2d2d;
+
}
+
+
.repository .segment.reactions .ui.label.basic.blue {
+
background: var(--color-primary-alpha-20) !important;
+
}
+
+
[data-tooltip]::before,
+
[data-tooltip]::after {
+
background: #1b1c1d !important; /* .ui.inverted.popup */
+
border-color: #1b1c1d !important; /* .ui.inverted.popup */
+
color: #dbdbdb !important;
+
}
+
+
[data-tooltip]::before {
+
box-shadow: 1px 1px 0 0 #1b1c1d !important; /* .ui.inverted.popup */
+
}
+
+
.ui.green.progress .bar {
+
background-color: #848b84;
+
}
+
+
.ui.progress.success .bar {
+
background-color: #8fa37b !important;
+
}
+
+
.following.bar.light {
+
background: var(--color-body);
+
border-color: var(--color-secondary-alpha-40);
+
}
+
+
.following.bar .top.menu a.item:hover {
+
color: #fff;
+
}
+
+
.feeds .list ul li.private {
+
background: #25272d;
+
}
+
+
.ui.link.list .item,
+
.ui.link.list a.item,
+
.ui.link.list .item a:not(.ui) {
+
color: #dbdbdb;
+
}
+
+
.ui.red.label,
+
.ui.red.labels .label {
+
background-color: #7d3434 !important;
+
border-color: #8a2121 !important;
+
}
+
+
.ui.yellow.label,
+
.ui.yellow.labels .label {
+
border-color: #664d02 !important;
+
background-color: #936e00 !important;
+
}
+
+
.ui.accordion .title:not(.ui) {
+
color: #dbdbdb;
+
}
+
+
.ui.green.label,
+
.ui.green.labels .label,
+
.ui.basic.green.label {
+
background-color: #53682c !important;
+
border-color: #53682c !important;
+
}
+
+
.ui.green.labels a.label:hover,
+
.ui.basic.green.labels a.label:hover,
+
a.ui.ui.ui.green.label:hover,
+
a.ui.basic.green.label:hover {
+
background-color: #657a3e !important;
+
border-color: #657a3e !important;
+
color: #fff !important;
+
}
+
+
.ui.divider:not(.vertical):not(.horizontal) {
+
border-bottom-color: var(--color-secondary);
+
border-top-color: transparent;
+
}
+
+
.form .help {
+
color: #7f8699;
+
}
+
+
.ui .text.light.grey {
+
color: #7f8699 !important;
+
}
+
+
.ui.form .fields.error .field textarea,
+
.ui.form .fields.error .field select,
+
.ui.form .fields.error .field input:not([type]),
+
.ui.form .fields.error .field input[type="date"],
+
.ui.form .fields.error .field input[type="datetime-local"],
+
.ui.form .fields.error .field input[type="email"],
+
.ui.form .fields.error .field input[type="number"],
+
.ui.form .fields.error .field input[type="password"],
+
.ui.form .fields.error .field input[type="search"],
+
.ui.form .fields.error .field input[type="tel"],
+
.ui.form .fields.error .field input[type="time"],
+
.ui.form .fields.error .field input[type="text"],
+
.ui.form .fields.error .field input[type="file"],
+
.ui.form .fields.error .field input[type="url"],
+
.ui.form .field.error textarea,
+
.ui.form .field.error select,
+
.ui.form .field.error input:not([type]),
+
.ui.form .field.error input[type="date"],
+
.ui.form .field.error input[type="datetime-local"],
+
.ui.form .field.error input[type="email"],
+
.ui.form .field.error input[type="number"],
+
.ui.form .field.error input[type="password"],
+
.ui.form .field.error input[type="search"],
+
.ui.form .field.error input[type="tel"],
+
.ui.form .field.error input[type="time"],
+
.ui.form .field.error input[type="text"],
+
.ui.form .field.error input[type="file"],
+
.ui.form .field.error input[type="url"] {
+
background-color: #522;
+
border: 1px solid #7d3434;
+
color: #f9cbcb;
+
}
+
+
.ui.form .field.error select:focus,
+
.ui.form .field.error input:not([type]):focus,
+
.ui.form .field.error input[type="date"]:focus,
+
.ui.form .field.error input[type="datetime-local"]:focus,
+
.ui.form .field.error input[type="email"]:focus,
+
.ui.form .field.error input[type="number"]:focus,
+
.ui.form .field.error input[type="password"]:focus,
+
.ui.form .field.error input[type="search"]:focus,
+
.ui.form .field.error input[type="tel"]:focus,
+
.ui.form .field.error input[type="time"]:focus,
+
.ui.form .field.error input[type="text"]:focus,
+
.ui.form .field.error input[type="file"]:focus,
+
.ui.form .field.error input[type="url"]:focus {
+
background-color: #522;
+
border: 1px solid #a04141;
+
color: #f9cbcb;
+
}
+
+
.ui.green.button,
+
.ui.green.buttons .button {
+
background-color: #070707;
+
}
+
+
.ui.green.button:hover,
+
.ui.green.buttons .button:hover {
+
background-color: #141414;
+
}
+
+
.ui.green.button:active,
+
.ui.green.buttons .button:active {
+
background-color: #070707;
+
}
+
+
.ui.search > .results {
+
background: #2d2d2d;
+
border-color: var(--color-secondary);
+
}
+
+
.ui.search > .results .result:hover,
+
.ui.category.search > .results .category .result:hover {
+
background: var(--color-secondary);
+
}
+
+
.ui.search > .results .result .title {
+
color: #dbdbdb;
+
}
+
+
.ui.table > thead > tr > th {
+
background: var(--color-secondary);
+
color: #dbdbdb !important;
+
}
+
+
.repository.file.list #repo-files-table tr {
+
background: #070707;
+
}
+
+
.repository.file.list #repo-files-table tr:hover {
+
background-color: #2d2d2d !important;
+
}
+
+
.repository.file.editor.edit,
+
.repository.wiki.new .CodeMirror {
+
.editor-preview,
+
.editor-preview-side,
+
& + .editor-preview-side {
+
background: #25272d;
+
+
.markdown:not(code).ui.segment {
+
border-width: 0;
+
}
+
}
+
}
+
+
.overflow.menu .items .item {
+
color: #9d9d9d;
+
}
+
+
.overflow.menu .items .item:hover {
+
color: #dbdbdb;
+
}
+
+
.ui.list > .item > .content {
+
color: var(--color-secondary-dark-6) !important;
+
}
+
+
.ui.active.button:active,
+
.ui.button:active,
+
.ui.button:focus,
+
.ui.active.button {
+
background-color: #2e3e4e;
+
color: #dbdbdb;
+
}
+
+
.ui.active.button:hover {
+
background-color: #475e75;
+
color: #dbdbdb;
+
}
+
+
.repository .navbar .active.item,
+
.repository .navbar .active.item:hover {
+
border-color: transparent !important;
+
}
+
+
.ui .info.segment.top {
+
background-color: var(--color-secondary) !important;
+
}
+
+
.repository .diff-stats li {
+
border-color: var(--color-secondary);
+
}
+
+
.tag-code,
+
.tag-code td {
+
background: #25272d !important;
+
+
}
+
.tag-code td.lines-num {
+
background-color: #3a3e4c !important;
+
}
+
+
.tag-code td.lines-type-marker,
+
td.blob-hunk {
+
color: #dbdbdb !important;
+
}
+
+
.ui.attached.info.message,
+
.ui.info.message {
+
box-shadow: 0 0 0 1px #4b5e71 inset, 0 0 0 0 transparent;
+
}
+
+
.ui.bottom.attached.message {
+
background-color: #2c662d;
+
color: #ab6363;
+
}
+
+
.ui.bottom.attached.message .pull-right {
+
color: #ab6363;
+
}
+
+
.ui.info.message {
+
background-color: #2c3b4a;
+
color: #9ebcc5;
+
}
+
+
.ui .warning.header,
+
.ui.warning.message {
+
background-color: #542 !important;
+
border-color: #ec8;
+
}
+
+
.ui.warning.message {
+
color: #ec8;
+
box-shadow: 0 0 0 1px #ec8;
+
}
+
+
.ui.warning.segment {
+
border-color: #ec8;
+
}
+
+
.ui.red.message,
+
.ui.error.message {
+
background-color: #522;
+
color: #f9cbcb;
+
box-shadow: 0 0 0 1px #a04141 inset;
+
}
+
+
.ui .error.header,
+
.ui.error.message {
+
background-color: #522 !important;
+
border-color: #a04141;
+
}
+
+
.ui.error.segment {
+
border-color: #a04141;
+
}
+
+
.ui.red.button,
+
.ui.red.buttons .button {
+
background-color: #7d3434;
+
}
+
+
.ui.red.button:hover,
+
.ui.red.buttons .button:hover {
+
background-color: #984646;
+
}
+
+
.ui.positive.message {
+
background-color: #000;
+
color: #fff;
+
box-shadow: 0 0 0 1px #1c1c1c inset, 0 0 0 0 transparent;
+
}
+
+
.ui.negative.message {
+
background-color: rgba(80, 23, 17, .6);
+
color: #f9cbcb;
+
box-shadow: 0 0 0 1px rgba(121, 71, 66, .5) inset, 0 0 0 0 transparent;
+
}
+
+
.ui.list .list > .item .header,
+
.ui.list > .item .header {
+
color: #dedede;
+
}
+
+
.ui.list .list > .item .description,
+
.ui.list > .item .description {
+
color: var(--color-secondary-dark-6);
+
}
+
+
.repository.file.list #repo-files-table tbody .svg.octicon-file-directory,
+
.repository.file.list #repo-files-table tbody .svg.octicon-file-submodule {
+
color: #52555b;
+
}
+
+
.repository.labels .ui.basic.black.label {
+
background-color: #bbbbbb !important;
+
}
+
+
.lines-commit,
+
.blame .lines-num {
+
background: #060606 !important;
+
}
+
+
.lines-num {
+
color: var(--color-secondary-dark-6) !important;
+
border-color: var(--color-secondary) !important;
+
}
+
+
td.blob-excerpt {
+
background-color: rgba(0, 0, 0, .15);
+
}
+
+
.lines-code.active,
+
.lines-code .active {
+
background: #534d1b !important;
+
}
+
+
.ui.ui.ui.ui.table tr.active,
+
.ui.ui.table td.active {
+
color: #dbdbdb;
+
}
+
+
.ui.active.label {
+
background: #46484e;
+
border-color: #46484e;
+
color: #dbdbdb;
+
}
+
+
.repository .ui.attached.message.isSigned.isVerified {
+
background-color: #394829;
+
color: var(--color-secondary-dark-6);
+
+
&.message {
+
color: #ab6363;
+
.ui.text {
+
color: var(--color-secondary-dark-6);
+
}
+
.pull-right {
+
color: #ab6363;
+
}
+
}
+
}
+
+
.repository .ui.attached.message.isSigned.isVerifiedUntrusted {
+
background-color: #4a3903;
+
color: var(--color-secondary-dark-6);
+
&.message {
+
color: #c2c193;
+
.ui.text {
+
color: var(--color-secondary-dark-6);
+
}
+
a {
+
color: #c2c193;
+
}
+
}
+
}
+
+
.repository .ui.attached.message.isSigned.isVerifiedUnmatched {
+
background-color: #4e3321;
+
color: var(--color-secondary-dark-6);
+
&.message {
+
color: #c2a893;
+
.ui.text {
+
color: var(--color-secondary-dark-6);
+
}
+
a {
+
color: #c2a893;
+
}
+
}
+
}
+
+
.repository .ui.attached.message.isSigned.isWarning {
+
background-color: rgba(80, 23, 17, .6);
+
&.message {
+
color: #d07d7d;
+
.ui.text {
+
color: #d07d7d;
+
}
+
}
+
}
+
+
.ui.header .sub.header {
+
color: var(--color-secondary-dark-6);
+
}
+
+
.ui.dividing.header {
+
border-bottom: 1px solid var(--color-secondary);
+
}
+
+
.ui.modal > .header {
+
background: var(--color-secondary);
+
color: #dbdbdb;
+
}
+
+
.ui.modal > .actions {
+
background: var(--color-secondary);
+
border-color: var(--color-secondary);
+
}
+
+
.ui.modal > .content {
+
background: #2d2d2d;
+
}
+
+
.minicolors-panel {
+
background: var(--color-secondary) !important;
+
border-color: #6a737d !important;
+
}
+
+
/* invert emojis that are hard to read otherwise */
+
.emoji[aria-label="check mark"],
+
.emoji[aria-label="currency exchange"],
+
.emoji[aria-label="TOP arrow"],
+
.emoji[aria-label="END arrow"],
+
.emoji[aria-label="ON! arrow"],
+
.emoji[aria-label="SOON arrow"],
+
.emoji[aria-label="heavy dollar sign"],
+
.emoji[aria-label="copyright"],
+
.emoji[aria-label="registered"],
+
.emoji[aria-label="trade mark"],
+
.emoji[aria-label="multiply"],
+
.emoji[aria-label="plus"],
+
.emoji[aria-label="minus"],
+
.emoji[aria-label="divide"],
+
.emoji[aria-label="curly loop"],
+
.emoji[aria-label="double curly loop"],
+
.emoji[aria-label="wavy dash"],
+
.emoji[aria-label="paw prints"],
+
.emoji[aria-label="musical note"],
+
.emoji[aria-label="musical notes"] {
+
filter: invert(100%);
+
}
+
+
.edit-diff > div > .ui.table {
+
border-left-color: var(--color-secondary) !important;
+
border-right-color: var(--color-secondary) !important;
+
}
+
+
/* code mirror dark theme */
+
+
.CodeMirror {
+
&.cm-s-default,
+
&.cm-s-paper {
+
.cm-property {
+
color: #a0cc75;
+
}
+
+
.cm-header {
+
color: #9daccc;
+
}
+
+
.cm-quote {
+
color: #009900;
+
}
+
+
.cm-keyword {
+
color: #cc8a61;
+
}
+
+
.cm-atom {
+
color: #ef5e77;
+
}
+
+
.cm-number {
+
color: #ff5656;
+
}
+
+
.cm-def {
+
color: #e4e4e4;
+
}
+
+
.cm-variable-2 {
+
color: #00bdbf;
+
}
+
+
.cm-variable-3 {
+
color: #008855;
+
}
+
+
.cm-comment {
+
color: #8e9ab3;
+
}
+
+
.cm-string {
+
color: #a77272;
+
}
+
+
.cm-string-2 {
+
color: #ff5500;
+
}
+
+
.cm-meta,
+
.cm-qualifier {
+
color: #ffb176;
+
}
+
+
.cm-builtin {
+
color: #b7c951;
+
}
+
+
.cm-bracket {
+
color: #999977;
+
}
+
+
.cm-tag {
+
color: #f1d273;
+
}
+
+
.cm-attribute {
+
color: #bfcc70;
+
}
+
+
.cm-hr {
+
color: #999999;
+
}
+
+
.cm-url {
+
color: #c5cfd0;
+
}
+
+
.cm-link {
+
color: #d8c792;
+
}
+
+
.cm-error {
+
/* color: #ff6e00; */
+
color: #dbdbeb;
+
}
+
}
+
}
+
+
footer .container .links > * {
+
border-left-color: #888;
+
}
+
+
.repository.file.list #repo-files-table tbody .svg {
+
color: var(--color-secondary-dark-6);
+
}
+
+
.repository.release #release-list > li .detail .dot {
+
background-color: #4e5465;
+
border-color: #2d2d2d;
+
}
+
+
.tribute-container {
+
box-shadow: 0 .25rem .5rem rgba(0, 0, 0, .6);
+
}
+
+
.repository .repo-header .ui.huge.breadcrumb.repo-title .repo-header-icon .avatar {
+
color: #060606;
+
}
+
+
img[src$="/img/matrix.svg"] {
+
filter: invert(80%);
+
}
+
+
#git-graph-container li .time {
+
color: #6a737d;
+
}
+
+
#git-graph-container.monochrome #rel-container .flow-group {
+
stroke: dimgrey;
+
fill: dimgrey;
+
}
+
+
#git-graph-container.monochrome #rel-container .flow-group.highlight {
+
stroke: darkgrey;
+
fill: darkgrey;
+
}
+
+
#git-graph-container:not(.monochrome) #rel-container .flow-group {
+
&.flow-color-16-5 {
+
stroke: #5543b1;
+
fill: #5543b1;
+
}
+
}
+
+
#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight {
+
&.flow-color-16-5 {
+
stroke: #7058e6;
+
fill: #7058e6;
+
}
+
}
+
+
#git-graph-container #rev-list li.highlight.hover {
+
background-color: rgba(255, 255, 255, .1);
+
}
+
+
#git-graph-container .ui.buttons button#flow-color-monochrome.ui.button {
+
border-left-color: rgb(76, 80, 92);
+
border-left-style: solid;
+
border-left-width: 1px;
+
}
+
+
.mermaid-chart {
+
filter: invert(84%) hue-rotate(180deg);
+
}
+
+
.is-loading::after {
+
border-color: #4a4c58 #4a4c58 #d7d7da #d7d7da;
+
}
+
+
.markdown-block-error {
+
border: 1px solid rgba(121, 71, 66, .5) !important;
+
border-bottom: none !important;
+
}
+
+
.home .hero .svg {
+
color: var(--color-primary);
+
}
+
+
.home a {
+
color: var(--color-primary-light-1);
+
}
+
+
.ui.menu, .ui.vertical.menu {
+
background: #070707;
+
border-color: var(--color-secondary-dark-4);
+
}
+
+
.ui.menu.new-menu {
+
background: #060606;
+
}
+
+
.ui.menu.new-menu:after {
+
background: none;
+
}
+
+
.ui.checkbox label:active:before, .ui.checkbox label:hover:before, .ui.form input:not([type]):hover, .ui.form input[type=date]:hover, .ui.form input[type=datetime-local]:hover, .ui.form input[type=email]:hover, .ui.form input[type=file]:hover, .ui.form input[type=number]:hover, .ui.form input[type=password]:hover, .ui.form input[type=search]:hover, .ui.form input[type=tel]:hover, .ui.form input[type=text]:hover, .ui.form input[type=time]:hover, .ui.form input[type=url]:hover, .ui.form select:hover, .ui.form textarea:hover, .ui.input input:hover, .ui.radio.checkbox input:checked~label:before, .ui.radio.checkbox input:focus~label:before, .ui.radio.checkbox label:after, .ui.selection.dropdown:hover, input:hover, textarea:hover {
+
background: var(--color-secondary-dark-3);
+
}
+
+
.ui.checkbox input:checked~label:before, .ui.checkbox input:not([type=radio]):indeterminate~label:before, .ui.checkbox label:before, .ui.form input:not([type]), .ui.form input[type=date], .ui.form input[type=datetime-local], .ui.form input[type=email], .ui.form input[type=file], .ui.form input[type=number], .ui.form input[type=password], .ui.form input[type=search], .ui.form input[type=tel], .ui.form input[type=text], .ui.form input[type=time], .ui.form input[type=url], .ui.form select, .ui.form textarea, .ui.input>input, .ui.selection.dropdown, input, textarea {
+
background: var(--color-secondary-dark-2);
+
}
+
+
.ui.checkbox input:checked:focus~label:before, .ui.checkbox input:focus~label:before, .ui.checkbox input:not([type=radio]):indeterminate:focus~label:before, .ui.form input:not([type]):focus, .ui.form input[type=date]:focus, .ui.form input[type=datetime-local]:focus, .ui.form input[type=email]:focus, .ui.form input[type=file]:focus, .ui.form input[type=number]:focus, .ui.form input[type=password]:focus, .ui.form input[type=search]:focus, .ui.form input[type=tel]:focus, .ui.form input[type=text]:focus, .ui.form input[type=time]:focus, .ui.form input[type=url]:focus, .ui.form select:focus, .ui.form textarea:focus, .ui.input input:focus, .ui.radio.checkbox input:focus:checked~label:before, .ui.selection.dropdown:focus, input:focus, textarea:focus {
+
background: var(--color-secondary-dark-3);
+
}
+
+
.ui.list .list>.item .description, .ui.list>.item .description {
+
color: var(--color-secondary-dark-11);
+
}
+
+
.explore .navbar {
+
background-color: var(--color-box-body)!important;
+
}
+
+
.repository .header-wrapper {
+
background-color: var(--color-box-body);
+
}
+
+
.monaco-editor, .monaco-editor-background, .monaco-editor .inputarea.ime-input {
+
background-color: #181818;
+
}
+
+
.ui.blue.label, .ui.blue.labels .label, .ui.primary.label, .ui.primary.labels .label {
+
background-color: var(--color-secondary)!important;
+
border-color: var(--color-primary-dark-2)!important;
+
}
+
+
.ui.blue.button, .ui.blue.buttons .button, .ui.primary.button, .ui.primary.buttons .button {
+
background-color: #070707!important;
+
}
+
+
.ui.blue.button:hover, .ui.blue.buttons .button:hover, .ui.primary.button:hover, .ui.primary.buttons .button:hover {
+
background-color: #1c1c1c!important;
+
}
+
+
.ui.green.labels .label, .ui.ui.ui.green.label {
+
background-color: #1c1c1c!important;
+
border-color: #21ba45!important;
+
color: #fff;
+
}
+
+
.ui.red.labels .label, .ui.ui.ui.red.label {
+
background-color: #1c1c1c!important;
+
border-color: #db2828!important;
+
color: #fff;
+
}
+
+
::selection, ::-moz-selection {
+
background: var(--color-grey);
+
color: var(--color-secondary)!important;
+
}
+
+
.CodeMirror, .CodeMirror-selected, ::selection {
+
background: var(--color-primary)!important;
+
color: var(--color-secondary)!important;
+
}
+
+
.markup a, .ui.breadcrumb a {
+
color: var(--color-primary-light-7);
+
cursor: pointer;
+
text-decoration: none;
+
border-bottom: 1px solid var(--color-primary);
+
transition-property: all
+
}
+
+
.markup a:hover, .ui.breadcrumb a:hover {
+
color: #000;
+
cursor: pointer;
+
text-decoration: none;
+
background: #fff;
+
background-color: #fff
+
}
+
+
.markup .anchor {
+
border-bottom: none
+
}
+
+
.markup .anchor:hover {
+
color: var(--color-primary-light-7);
+
border-bottom: none;
+
background: var(--color-body);
+
background-color: var(--color-body)
+
}
+
+
.mtk1, .mtk10 {
+
color: #6D7178!important
+
}
hosts/wolumonde/modules/forgejo.disabled/public/assets/fonts/comic.woff2

This is a binary file and will not be displayed.

hosts/wolumonde/modules/forgejo.disabled/public/assets/fonts/comicbd.woff2

This is a binary file and will not be displayed.

hosts/wolumonde/modules/forgejo.disabled/public/assets/fonts/comici.woff2

This is a binary file and will not be displayed.

hosts/wolumonde/modules/forgejo.disabled/public/assets/img/favicon.png

This is a binary file and will not be displayed.

hosts/wolumonde/modules/forgejo.disabled/public/assets/img/grrr.webp

This is a binary file and will not be displayed.

hosts/wolumonde/modules/forgejo.disabled/public/assets/img/logo.png

This is a binary file and will not be displayed.

hosts/wolumonde/modules/forgejo.disabled/public/assets/img/wecode.gif

This is a binary file and will not be displayed.

+44
hosts/wolumonde/modules/forgejo.disabled/templates/base/head.tmpl
···
+
<!DOCTYPE html>
+
<html lang="{{ctx.Locale.Lang}}" data-theme="{{ThemeName .SignedUser}}">
+
<head>
+
<meta name="viewport" content="width=device-width, initial-scale=1">
+
{{/* Display `- .Repository.FullName` only if `.Title` does not already start with that. */}}
+
<title>{{if .Title}}{{.Title}} - {{end}}{{if and (.Repository.Name) (not (StringUtils.HasPrefix .Title .Repository.FullName))}}{{.Repository.FullName}} - {{end}}{{AppDisplayName}}</title>
+
{{if .ManifestData}}<link rel="manifest" href="data:{{.ManifestData}}">{{end}}
+
<meta name="author" content="{{if .Repository}}{{.Owner.Name}}{{else}}{{MetaAuthor}}{{end}}">
+
<meta name="description" content="{{if .Repository}}{{.Repository.Name}}{{if .Repository.Description}} - {{.Repository.Description}}{{end}}{{else}}{{MetaDescription}}{{end}}">
+
<meta name="keywords" content="{{MetaKeywords}}">
+
<meta name="referrer" content="no-referrer">
+
{{if .GoGetImport}}
+
<meta name="go-import" content="{{.GoGetImport}} git {{.RepoCloneLink.HTTPS}}">
+
<meta name="go-source" content="{{.GoGetImport}} _ {{.GoDocDirectory}} {{.GoDocFile}}">
+
{{end}}
+
{{if and .EnableFeed .FeedURL}}
+
<link rel="alternate" type="application/atom+xml" title="" href="{{.FeedURL}}.atom">
+
<link rel="alternate" type="application/rss+xml" title="" href="{{.FeedURL}}.rss">
+
{{end}}
+
<link rel="alternate icon" href="{{AssetUrlPrefix}}/img/favicon.png" type="image/png">
+
{{template "base/head_script" .}}
+
{{template "shared/user/mention_highlight" .}}
+
{{template "base/head_opengraph" .}}
+
{{template "base/head_style" .}}
+
{{template "custom/header" .}}
+
</head>
+
<body hx-headers='{"x-csrf-token": "{{.CsrfToken}}"}' hx-swap="outerHTML" hx-ext="morph" hx-push-url="false">
+
{{template "custom/body_outer_pre" .}}
+
+
<div class="full height">
+
<noscript>{{ctx.Locale.Tr "enable_javascript"}}</noscript>
+
+
{{template "custom/body_inner_pre" .}}
+
+
{{if not .PageIsInstall}}
+
{{template "base/head_navbar" .}}
+
{{end}}
+
+
{{if false}}
+
{{/* to make html structure "likely" complete to prevent IDE warnings */}}
+
</div>
+
</body>
+
</html>
+
{{end}}
+207
hosts/wolumonde/modules/forgejo.disabled/templates/base/head_navbar.tmpl
···
+
{{$notificationUnreadCount := 0}}
+
{{if and .IsSigned .NotificationUnreadCount}}
+
{{$notificationUnreadCount = call .NotificationUnreadCount}}
+
{{end}}
+
+
<nav id="navbar" aria-label="{{ctx.Locale.Tr "aria.navbar"}}">
+
<div class="navbar-left ui secondary menu">
+
<!-- the logo -->
+
<a class="item" id="navbar-logo" href="{{AppSubUrl}}/" aria-label="{{if .IsSigned}}{{ctx.Locale.Tr "dashboard"}}{{else}}{{ctx.Locale.Tr "home"}}{{end}}">
+
<img width="30" height="30" src="{{AssetUrlPrefix}}/img/logo.png" alt="{{ctx.Locale.Tr "logo"}}" aria-hidden="true">
+
</a>
+
+
<!-- mobile right menu, it must be here because in mobile view, each item is a flex column, the first item is a full row column -->
+
<div class="ui secondary menu item navbar-mobile-right only-mobile">
+
{{if .IsSigned}}
+
<a id="mobile-notifications-icon" class="item tw-w-auto tw-p-2" href="{{AppSubUrl}}/notifications" data-tooltip-content="{{ctx.Locale.Tr "notifications"}}" aria-label="{{ctx.Locale.Tr "notifications"}}">
+
<div class="tw-relative">
+
{{svg "octicon-bell"}}
+
<span class="notification_count{{if not $notificationUnreadCount}} tw-hidden{{end}}">{{$notificationUnreadCount}}</span>
+
</div>
+
</a>
+
{{end}}
+
<button class="item tw-w-auto ui icon mini button tw-p-2 tw-m-0" id="navbar-expand-toggle" aria-label="{{ctx.Locale.Tr "toggle_menu"}}">{{svg "octicon-three-bars"}}</button>
+
</div>
+
+
<!-- navbar links non-mobile -->
+
{{if and .IsSigned .MustChangePassword}}
+
{{/* No links */}}
+
{{else if .IsSigned}}
+
{{if not .UnitIssuesGlobalDisabled}}
+
<a class="item{{if .PageIsIssues}} active{{end}}" href="{{AppSubUrl}}/issues">{{ctx.Locale.Tr "issues"}}</a>
+
{{end}}
+
{{if not .UnitPullsGlobalDisabled}}
+
<a class="item{{if .PageIsPulls}} active{{end}}" href="{{AppSubUrl}}/pulls">{{ctx.Locale.Tr "pull_requests"}}</a>
+
{{end}}
+
{{if not (and .UnitIssuesGlobalDisabled .UnitPullsGlobalDisabled)}}
+
{{if .ShowMilestonesDashboardPage}}
+
<a class="item{{if .PageIsMilestonesDashboard}} active{{end}}" href="{{AppSubUrl}}/milestones">{{ctx.Locale.Tr "milestones"}}</a>
+
{{end}}
+
{{end}}
+
<a class="item{{if .PageIsExplore}} active{{end}}" href="{{AppSubUrl}}/explore/repos">{{ctx.Locale.Tr "explore"}}</a>
+
{{else if .IsLandingPageOrganizations}}
+
<a class="item{{if .PageIsExplore}} active{{end}}" href="{{AppSubUrl}}/explore/organizations">{{ctx.Locale.Tr "explore"}}</a>
+
{{else}}
+
<a class="item{{if .PageIsExplore}} active{{end}}" href="{{AppSubUrl}}/explore/repos">{{ctx.Locale.Tr "explore"}}</a>
+
{{end}}
+
+
{{template "custom/extra_links" .}}
+
+
{{if not .IsSigned}}
+
<a class="item" target="_blank" rel="noopener noreferrer" href="https://forgejo.org/docs/latest/">{{ctx.Locale.Tr "help"}}</a>
+
{{end}}
+
</div>
+
+
<!-- the full dropdown menus -->
+
<div class="navbar-right ui secondary menu">
+
{{if and .IsSigned .MustChangePassword}}
+
<div class="ui dropdown jump item" data-tooltip-content="{{ctx.Locale.Tr "user_profile_and_more"}}">
+
<span class="text tw-flex tw-items-center">
+
{{ctx.AvatarUtils.Avatar .SignedUser 24 "tw-mr-1"}}
+
<span class="only-mobile tw-ml-2">{{.SignedUser.Name}}</span>
+
<span class="not-mobile">{{svg "octicon-triangle-down"}}</span>
+
</span>
+
<div class="menu user-menu">
+
<div class="ui header">
+
{{ctx.Locale.Tr "signed_in_as"}} <strong>{{.SignedUser.Name}}</strong>
+
</div>
+
+
<div class="divider"></div>
+
<a class="item link-action" href data-url="{{AppSubUrl}}/user/logout">
+
{{svg "octicon-sign-out"}}
+
{{ctx.Locale.Tr "sign_out"}}
+
</a>
+
</div><!-- end content avatar menu -->
+
</div><!-- end dropdown avatar menu -->
+
{{else if .IsSigned}}
+
{{if EnableTimetracking}}
+
<a class="active-stopwatch-trigger item tw-mx-0{{if not .ActiveStopwatch}} tw-hidden{{end}}" href="{{.ActiveStopwatch.IssueLink}}" title="{{ctx.Locale.Tr "active_stopwatch"}}">
+
<div class="tw-relative">
+
{{svg "octicon-stopwatch"}}
+
<span class="header-stopwatch-dot"></span>
+
</div>
+
<span class="only-mobile tw-ml-2">{{ctx.Locale.Tr "active_stopwatch"}}</span>
+
</a>
+
<div class="active-stopwatch-popup item tippy-target tw-p-2">
+
<div class="tw-flex tw-items-center">
+
<a class="stopwatch-link tw-flex tw-items-center" href="{{.ActiveStopwatch.IssueLink}}">
+
{{svg "octicon-issue-opened" 16 "tw-mr-2"}}
+
<span class="stopwatch-issue">{{.ActiveStopwatch.RepoSlug}}#{{.ActiveStopwatch.IssueIndex}}</span>
+
<span class="ui primary label stopwatch-time tw-my-0 tw-mx-4" data-seconds="{{.ActiveStopwatch.Seconds}}">
+
{{if .ActiveStopwatch}}{{Sec2Time .ActiveStopwatch.Seconds}}{{end}}
+
</span>
+
</a>
+
<form class="stopwatch-commit" method="post" action="{{.ActiveStopwatch.IssueLink}}/times/stopwatch/toggle">
+
{{.CsrfTokenHtml}}
+
<button
+
type="submit"
+
class="ui button mini compact basic icon"
+
data-tooltip-content="{{ctx.Locale.Tr "repo.issues.stop_tracking"}}"
+
>{{svg "octicon-square-fill"}}</button>
+
</form>
+
<form class="stopwatch-cancel" method="post" action="{{.ActiveStopwatch.IssueLink}}/times/stopwatch/cancel">
+
{{.CsrfTokenHtml}}
+
<button
+
type="submit"
+
class="ui button mini compact basic icon"
+
data-tooltip-content="{{ctx.Locale.Tr "repo.issues.cancel_tracking"}}"
+
>{{svg "octicon-trash"}}</button>
+
</form>
+
</div>
+
</div>
+
{{end}}
+
+
<a class="item not-mobile tw-mx-0" href="{{AppSubUrl}}/notifications" data-tooltip-content="{{ctx.Locale.Tr "notifications"}}" aria-label="{{ctx.Locale.Tr "notifications"}}">
+
<div class="tw-relative">
+
{{svg "octicon-bell"}}
+
<span class="notification_count{{if not $notificationUnreadCount}} tw-hidden{{end}}">{{$notificationUnreadCount}}</span>
+
</div>
+
</a>
+
+
<div class="ui dropdown jump item tw-mx-0 tw-pr-2" data-tooltip-content="{{ctx.Locale.Tr "create_new"}}">
+
<span class="text">
+
{{svg "octicon-plus"}}
+
<span class="not-mobile">{{svg "octicon-triangle-down"}}</span>
+
<span class="only-mobile">{{ctx.Locale.Tr "create_new"}}</span>
+
</span>
+
<div class="menu">
+
<a class="item" href="{{AppSubUrl}}/repo/create">
+
{{svg "octicon-plus"}} {{ctx.Locale.Tr "new_repo.link"}}
+
</a>
+
{{if not .DisableMigrations}}
+
<a class="item" href="{{AppSubUrl}}/repo/migrate">
+
{{svg "octicon-repo-push"}} {{ctx.Locale.Tr "new_migrate.link"}}
+
</a>
+
{{end}}
+
{{if .SignedUser.CanCreateOrganization}}
+
<a class="item" href="{{AppSubUrl}}/org/create">
+
{{svg "octicon-organization"}} {{ctx.Locale.Tr "new_org.link"}}
+
</a>
+
{{end}}
+
</div><!-- end content create new menu -->
+
</div><!-- end dropdown menu create new -->
+
+
<div class="ui dropdown jump item tw-mx-0 tw-pr-2" data-tooltip-content="{{ctx.Locale.Tr "user_profile_and_more"}}">
+
<span class="text tw-flex tw-items-center">
+
{{ctx.AvatarUtils.Avatar .SignedUser 24 "tw-mr-1"}}
+
<span class="only-mobile tw-ml-2">{{.SignedUser.Name}}</span>
+
<span class="not-mobile">{{svg "octicon-triangle-down"}}</span>
+
</span>
+
<div class="menu user-menu">
+
<div class="ui header">
+
{{ctx.Locale.Tr "signed_in_as"}} <strong>{{.SignedUser.Name}}</strong>
+
</div>
+
+
<div class="divider"></div>
+
<a class="item" href="{{.SignedUser.HomeLink}}">
+
{{svg "octicon-person"}}
+
{{ctx.Locale.Tr "your_profile"}}
+
</a>
+
{{if not .DisableStars}}
+
<a class="item" href="{{.SignedUser.HomeLink}}?tab=stars">
+
{{svg "octicon-star"}}
+
{{ctx.Locale.Tr "your_starred"}}
+
</a>
+
{{end}}
+
<a class="item" href="{{AppSubUrl}}/notifications/subscriptions">
+
{{svg "octicon-bell"}}
+
{{ctx.Locale.Tr "notification.subscriptions"}}
+
</a>
+
<a class="{{if .PageIsUserSettings}}active {{end}}item" href="{{AppSubUrl}}/user/settings">
+
{{svg "octicon-tools"}}
+
{{ctx.Locale.Tr "your_settings"}}
+
</a>
+
<a class="item" target="_blank" rel="noopener noreferrer" href="https://forgejo.org/docs/latest/">
+
{{svg "octicon-question"}}
+
{{ctx.Locale.Tr "help"}}
+
</a>
+
{{if .IsAdmin}}
+
<div class="divider"></div>
+
+
<a class="{{if .PageIsAdmin}}active {{end}}item" href="{{AppSubUrl}}/admin">
+
{{svg "octicon-server"}}
+
{{ctx.Locale.Tr "admin_panel"}}
+
</a>
+
{{end}}
+
+
<div class="divider"></div>
+
<a class="item link-action" href data-url="{{AppSubUrl}}/user/logout">
+
{{svg "octicon-sign-out"}}
+
{{ctx.Locale.Tr "sign_out"}}
+
</a>
+
</div><!-- end content avatar menu -->
+
</div><!-- end dropdown avatar menu -->
+
{{else}}
+
{{if .ShowRegistrationButton}}
+
<a class="item{{if .PageIsSignUp}} active{{end}}" href="{{AppSubUrl}}/user/sign_up">
+
{{svg "octicon-person" 16 "tw-mr-1"}}
+
<span>{{ctx.Locale.Tr "register"}}</span>
+
</a>
+
{{end}}
+
<a class="item{{if .PageIsSignIn}} active{{end}}" rel="nofollow" href="{{AppSubUrl}}/user/login{{if not .PageIsSignIn}}?redirect_to={{.CurrentURL}}{{end}}">
+
{{svg "octicon-sign-in" 16 "tw-mr-1"}}
+
<span>{{ctx.Locale.Tr "sign_in"}}</span>
+
</a>
+
{{end}}
+
</div><!-- end full right menu -->
+
</nav>
+14
hosts/wolumonde/modules/forgejo.disabled/templates/home.tmpl
···
+
{{template "base/head" .}}
+
<div role="main" aria-label="{{if .IsSigned}}{{ctx.Locale.Tr "dashboard"}}{{else}}{{ctx.Locale.Tr "home"}}{{end}}" class="page-content home">
+
<div class="tw-mb-8 tw-px-8">
+
<div class="center">
+
<img class="logo" width="220" height="220" src="https://git.gaze.systems/assets/img/grrr.webp" alt="i hate software" title="i hate software">
+
<div class="hero">
+
<h2>software</h2>
+
</div>
+
<div style="height: 200vh;"></div>
+
<img class="logo" width="220" height="220" src="https://git.gaze.systems/assets/img/wecode.gif" alt="forgejo. beyond coding. we forge. but lowtiergod" title="skies ur rina">
+
</div>
+
</div>
+
</div>
+
{{template "base/footer" .}}
-98
hosts/wolumonde/modules/forgejo.nix/default.nix
···
-
{
-
pkgs,
-
lib,
-
config,
-
...
-
}:
-
let
-
forgejoCfg = config.services.forgejo.settings;
-
anubisCfg = config.services.anubis.instances."forgejo".settings;
-
in
-
{
-
services.forgejo = {
-
enable = true;
-
package = pkgs.forgejo;
-
lfs.enable = true;
-
settings = {
-
DEFAULT.APP_NAME = "awruff ^^";
-
server = {
-
DOMAIN = "git.gaze.systems";
-
ROOT_URL = "https://git.gaze.systems/";
-
HTTP_PORT = 9008;
-
};
-
service = {
-
DISABLE_REGISTRATION = true;
-
};
-
security.REVERSE_PROXY_TRUSTED_PROXIES = "127.0.0.0/8,::1/128";
-
session.COOKIE_SECURE = true;
-
ui = {
-
DEFAULT_SHOW_FULL_NAME = true;
-
DEFAULT_THEME = "edge-dark";
-
THEMES = "edge-dark,forgejo-dark";
-
THEME_COLOR_META_TAG = "#333644";
-
};
-
"ui.meta" = {
-
DESCRIPTION = "nyan? arf!!!! :3";
-
};
-
metrics.ENABLED = true;
-
};
-
};
-
-
# copy custom data stuff
-
systemd.services.forgejo.preStart =
-
let
-
customDir = "${config.services.forgejo.stateDir}/custom";
-
getCustomDir = name: "${customDir}/${name}";
-
makeCopyCommand = dir: ''
-
mkdir -p ${customDir}
-
rm -rf ${getCustomDir dir}
-
cp -r --no-preserve=mode,ownership ${./${dir}} ${getCustomDir dir}
-
'';
-
in
-
lib.concatMapStrings makeCopyCommand [
-
"templates"
-
"public"
-
];
-
-
security.acme.certs."gaze.systems".extraDomainNames = [forgejoCfg.server.DOMAIN];
-
services.nginx.virtualHosts.${forgejoCfg.server.DOMAIN} = {
-
useACMEHost = "gaze.systems";
-
forceSSL = true;
-
quic = true;
-
kTLS = true;
-
# disallow metrics for public
-
locations."/metrics".return = "403";
-
locations."/" = {
-
extraConfig = ''
-
client_max_body_size 1000m;
-
'';
-
proxyPass = "http://localhost${anubisCfg.BIND}";
-
};
-
};
-
-
services.anubis.instances."forgejo".settings = {
-
BIND = ":6293";
-
BIND_NETWORK = "tcp";
-
METRICS_BIND = ":9090";
-
METRICS_BIND_NETWORK = "tcp";
-
TARGET = "http://localhost:${toString forgejoCfg.server.HTTP_PORT}";
-
WEBMASTER_EMAIL = "90008@gaze.systems";
-
SERVE_ROBOTS_TXT = true;
-
OG_PASSTHROUGH = true;
-
DIFFICULTY = 4;
-
};
-
-
# scrape forgejo metrics
-
services.victoriametrics.prometheusConfig.scrape_configs = [
-
{
-
job_name = "forgejo";
-
metrics_path = "/metrics";
-
static_configs = [ { targets = [ "localhost:${toString forgejoCfg.server.HTTP_PORT}" ]; } ];
-
}
-
{
-
job_name = "anubis_forgejo";
-
metrics_path = "/metrics";
-
static_configs = [ { targets = [ "localhost${anubisCfg.METRICS_BIND}" ]; } ];
-
}
-
];
-
}
-995
hosts/wolumonde/modules/forgejo.nix/public/assets/css/theme-edge-dark.css
···
-
@import "https://cdn.jsdelivr.net/npm/comic-mono@0.0.1/index.css";
-
@font-face {
-
font-family: 'Comic Sans';
-
font-style: normal;
-
font-display: swap;
-
src: url('../fonts/comic.woff2') format('woff2');
-
}
-
@font-face {
-
font-family: 'Comic Sans';
-
font-style: normal;
-
font-weight: bold;
-
font-display: swap;
-
src: url('../fonts/comicbd.woff2') format('woff2');
-
}
-
@font-face {
-
font-family: 'Comic Sans';
-
font-style: italic;
-
font-display: swap;
-
src: url('../fonts/comici.woff2') format('woff2');
-
}
-
:root {
-
--fonts-proportional: "Comic Sans", sans-serif !important;
-
--fonts-monospace: "Comic Mono", monospace !important;
-
}
-
.chroma .hl{background-color:#3f424d}.chroma .ln,.chroma .lnt{color:#7f7f7f}
-
-
.chroma .k{color:#f63}
-
-
.chroma .kc{color:#fa1}
-
-
.chroma .kd{color:#9daccc}
-
-
.chroma .kn{color:#fa1}
-
-
.chroma .kp{color:#5f8700}
-
-
.chroma .kr{color:#f63}
-
-
.chroma .kt{color:#9daccc}
-
-
.chroma .na{color:#8a8a8a}
-
-
.chroma .bp,.chroma .nb{color:#9daccc}
-
-
.chroma .nc,.chroma .no{color:#fa1}
-
-
.chroma .nd{color:#9daccc}
-
-
.chroma .ni{color:#fa1}
-
-
.chroma .ne{color:#af8700}
-
-
.chroma .nf{color:#9daccc}
-
-
.chroma .nl,.chroma .nn{color:#fa1}
-
-
.chroma .nt,.chroma .nv,.chroma .nx{color:#9daccc}
-
-
.chroma .vc{color:#f81}
-
-
.chroma .vg,.chroma .vi{color:#fa1}
-
-
.chroma .s,.chroma .sa{color:#1af}
-
-
.chroma .sb{color:#a0cc75}
-
-
.chroma .dl,.chroma .sc{color:#1af}
-
-
.chroma .sd{color:#6a737d}
-
-
.chroma .s2{color:#a0cc75}
-
-
.chroma .se{color:#f63}
-
-
.chroma .sh{color:#1af}
-
-
.chroma .si,.chroma .sx{color:#fa1}
-
-
.chroma .sr{color:#97c}
-
-
.chroma .s1{color:#a0cc75}
-
-
.chroma .ss{color:#fa1}
-
-
.chroma .il,.chroma .m,.chroma .mb,.chroma .mf,.chroma .mh,.chroma .mi,.chroma .mo{color:#1af}
-
-
.chroma .o{color:#f63}
-
-
.chroma .ow{color:#5f8700}
-
-
.chroma .c,.chroma .c1,.chroma .ch,.chroma .cm{color:#6a737d}
-
-
.chroma .cs{color:#637d}
-
-
.chroma .cp,.chroma .cpf{color:#fc6}
-
-
.chroma .gd{color:#fff;background-color:#5f3737}
-
-
.chroma .ge{color:#ef5}
-
-
.chroma .gr{color:#f33}
-
-
.chroma .gh{color:#fa1}
-
-
.chroma .gi{color:#fff;background-color:#3a523a}
-
-
.chroma .go{color:#888888}
-
-
.chroma .gp{color:#555555}
-
-
.chroma .gu{color:#9daccc}
-
-
.chroma .gt{color:#f63}
-
-
.chroma .w{color:#bbbbbb}
-
-
:root {
-
--color-primary: #ccc;
-
--color-primary-dark-1: #c5c5c5;
-
--color-primary-dark-2: #bebebe;
-
--color-primary-dark-3: #b7b7b7;
-
--color-primary-dark-4: #b0b0b0;
-
--color-primary-dark-5: #a9a9a9;
-
--color-primary-dark-6: #a2a2a2;
-
--color-primary-dark-7: #9b9b9b;
-
--color-primary-light-1: #d3d3d3;
-
--color-primary-light-2: #d9d9d9;
-
--color-primary-light-3: #e0e0e0;
-
--color-primary-light-4: #e7e7e7;
-
--color-primary-light-5: #eeeeee;
-
--color-primary-light-6: #f5f5f5;
-
--color-primary-light-7: #fff;
-
--color-primary-alpha-10: #afb0b119;
-
--color-primary-alpha-20: #afb0b133;
-
--color-primary-alpha-30: #afb0b14b;
-
--color-primary-alpha-40: #afb0b166;
-
--color-primary-alpha-50: #afb0b180;
-
--color-primary-alpha-60: #afb0b199;
-
--color-primary-alpha-70: #afb0b1b3;
-
--color-primary-alpha-80: #afb0b1cc;
-
--color-primary-alpha-90: #afb0b1e1;
-
--color-secondary: #000;
-
--color-secondary-dark-1: #141414;
-
--color-secondary-dark-2: #0b0c0e;
-
--color-secondary-dark-3: #17181c;
-
--color-secondary-dark-4: #22242a;
-
--color-secondary-dark-5: #2d3139;
-
--color-secondary-dark-6: #393d47;
-
--color-secondary-dark-7: #444955;
-
--color-secondary-dark-7: #4f5563;
-
--color-secondary-dark-8: #5b6171;
-
--color-secondary-dark-8: #666d7f;
-
--color-secondary-dark-9: #71798e;
-
--color-secondary-dark-10: #808799;
-
--color-secondary-dark-11: #8e94a4;
-
--color-secondary-light-1: #373b46;
-
--color-secondary-light-2: #292c34;
-
--color-secondary-light-3: #1c1e23;
-
--color-secondary-light-4: #0e0f11;
-
--color-secondary-alpha-10: #45454519;
-
--color-secondary-alpha-20: #45454533;
-
--color-secondary-alpha-30: #4545454b;
-
--color-secondary-alpha-40: #45454566;
-
--color-secondary-alpha-50: #45454580;
-
--color-secondary-alpha-60: #45454599;
-
--color-secondary-alpha-70: #454545b3;
-
--color-secondary-alpha-80: #454545cc;
-
--color-secondary-alpha-90: #454545e1;
-
/* colors */
-
--color-red: #db2828;
-
--color-orange: #ff6600;
-
--color-yellow: #ffff99;
-
--color-olive: #abc11a;
-
--color-green: #199717;
-
--color-teal: #01fed4;
-
--color-blue: #226ac9;
-
--color-violet: #6435c9;
-
--color-purple: #a333c8;
-
--color-pink: #e03997;
-
--color-brown: #a5673f;
-
--color-grey: #767a85;
-
--color-black: #1e222e;
-
--color-gold: #a1882b;
-
--color-white: #ffffff;
-
--color-diff-removed-word-bg: #6f3333;
-
--color-diff-added-word-bg: #3c653c;
-
--color-diff-removed-row-bg: #3c2626;
-
--color-diff-added-row-bg: #283e2d;
-
--color-diff-removed-row-border: #634343;
-
--color-diff-added-row-border: #314a37;
-
--color-diff-inactive: #353846;
-
/* target-based colors */
-
--color-body: #000;
-
--color-box-header: #000;
-
--color-box-body: #070707;
-
--color-text-dark: #dee1e8;
-
--color-text: #c7cad1;
-
--color-text-light: #acb0b9;
-
--color-text-light-2: #8a8e99;
-
--color-text-light-3: #707687;
-
--color-footer: #000;
-
--color-timeline: #4c525e;
-
--color-input-text: #d5dbe6;
-
--color-input-background: #000;
-
--color-input-border: #454545;
-
--color-input-border-hover: #4e5465;
-
--color-navbar: #060606;
-
--color-light: #00000028;
-
--color-light-border: #ffffff28;
-
--color-hover: #ffffff10;
-
--color-active: #25272d;
-
--color-menu: #060606;
-
--color-card: #060606;
-
--color-markdown-table-row: #ffffff06;
-
--color-markdown-code-block: #121314;
-
--color-button: #070707;
-
--color-code-bg: #060606;
-
--color-shadow: #00000060;
-
--color-secondary-bg: #060606;
-
--color-text-focus: #fff;
-
--color-expand-button: #3c404d;
-
--color-placeholder-text: #6a737d;
-
--color-editor-line-highlight: var(--color-primary-light-5);
-
--color-project-board-bg: var(--color-secondary-light-2);
-
--color-nav-bg: var(--color-body);
-
--color-nav-hover-bg: var(--color-hover);
-
}
-
-
::-webkit-calendar-picker-indicator {
-
filter: invert(.8);
-
}
-
-
.ui.horizontal.segments > .segment {
-
background-color: #2d2d2d;
-
}
-
-
.repository .segment.reactions .ui.label.basic.blue {
-
background: var(--color-primary-alpha-20) !important;
-
}
-
-
[data-tooltip]::before,
-
[data-tooltip]::after {
-
background: #1b1c1d !important; /* .ui.inverted.popup */
-
border-color: #1b1c1d !important; /* .ui.inverted.popup */
-
color: #dbdbdb !important;
-
}
-
-
[data-tooltip]::before {
-
box-shadow: 1px 1px 0 0 #1b1c1d !important; /* .ui.inverted.popup */
-
}
-
-
.ui.green.progress .bar {
-
background-color: #848b84;
-
}
-
-
.ui.progress.success .bar {
-
background-color: #8fa37b !important;
-
}
-
-
.following.bar.light {
-
background: var(--color-body);
-
border-color: var(--color-secondary-alpha-40);
-
}
-
-
.following.bar .top.menu a.item:hover {
-
color: #fff;
-
}
-
-
.feeds .list ul li.private {
-
background: #25272d;
-
}
-
-
.ui.link.list .item,
-
.ui.link.list a.item,
-
.ui.link.list .item a:not(.ui) {
-
color: #dbdbdb;
-
}
-
-
.ui.red.label,
-
.ui.red.labels .label {
-
background-color: #7d3434 !important;
-
border-color: #8a2121 !important;
-
}
-
-
.ui.yellow.label,
-
.ui.yellow.labels .label {
-
border-color: #664d02 !important;
-
background-color: #936e00 !important;
-
}
-
-
.ui.accordion .title:not(.ui) {
-
color: #dbdbdb;
-
}
-
-
.ui.green.label,
-
.ui.green.labels .label,
-
.ui.basic.green.label {
-
background-color: #53682c !important;
-
border-color: #53682c !important;
-
}
-
-
.ui.green.labels a.label:hover,
-
.ui.basic.green.labels a.label:hover,
-
a.ui.ui.ui.green.label:hover,
-
a.ui.basic.green.label:hover {
-
background-color: #657a3e !important;
-
border-color: #657a3e !important;
-
color: #fff !important;
-
}
-
-
.ui.divider:not(.vertical):not(.horizontal) {
-
border-bottom-color: var(--color-secondary);
-
border-top-color: transparent;
-
}
-
-
.form .help {
-
color: #7f8699;
-
}
-
-
.ui .text.light.grey {
-
color: #7f8699 !important;
-
}
-
-
.ui.form .fields.error .field textarea,
-
.ui.form .fields.error .field select,
-
.ui.form .fields.error .field input:not([type]),
-
.ui.form .fields.error .field input[type="date"],
-
.ui.form .fields.error .field input[type="datetime-local"],
-
.ui.form .fields.error .field input[type="email"],
-
.ui.form .fields.error .field input[type="number"],
-
.ui.form .fields.error .field input[type="password"],
-
.ui.form .fields.error .field input[type="search"],
-
.ui.form .fields.error .field input[type="tel"],
-
.ui.form .fields.error .field input[type="time"],
-
.ui.form .fields.error .field input[type="text"],
-
.ui.form .fields.error .field input[type="file"],
-
.ui.form .fields.error .field input[type="url"],
-
.ui.form .field.error textarea,
-
.ui.form .field.error select,
-
.ui.form .field.error input:not([type]),
-
.ui.form .field.error input[type="date"],
-
.ui.form .field.error input[type="datetime-local"],
-
.ui.form .field.error input[type="email"],
-
.ui.form .field.error input[type="number"],
-
.ui.form .field.error input[type="password"],
-
.ui.form .field.error input[type="search"],
-
.ui.form .field.error input[type="tel"],
-
.ui.form .field.error input[type="time"],
-
.ui.form .field.error input[type="text"],
-
.ui.form .field.error input[type="file"],
-
.ui.form .field.error input[type="url"] {
-
background-color: #522;
-
border: 1px solid #7d3434;
-
color: #f9cbcb;
-
}
-
-
.ui.form .field.error select:focus,
-
.ui.form .field.error input:not([type]):focus,
-
.ui.form .field.error input[type="date"]:focus,
-
.ui.form .field.error input[type="datetime-local"]:focus,
-
.ui.form .field.error input[type="email"]:focus,
-
.ui.form .field.error input[type="number"]:focus,
-
.ui.form .field.error input[type="password"]:focus,
-
.ui.form .field.error input[type="search"]:focus,
-
.ui.form .field.error input[type="tel"]:focus,
-
.ui.form .field.error input[type="time"]:focus,
-
.ui.form .field.error input[type="text"]:focus,
-
.ui.form .field.error input[type="file"]:focus,
-
.ui.form .field.error input[type="url"]:focus {
-
background-color: #522;
-
border: 1px solid #a04141;
-
color: #f9cbcb;
-
}
-
-
.ui.green.button,
-
.ui.green.buttons .button {
-
background-color: #070707;
-
}
-
-
.ui.green.button:hover,
-
.ui.green.buttons .button:hover {
-
background-color: #141414;
-
}
-
-
.ui.green.button:active,
-
.ui.green.buttons .button:active {
-
background-color: #070707;
-
}
-
-
.ui.search > .results {
-
background: #2d2d2d;
-
border-color: var(--color-secondary);
-
}
-
-
.ui.search > .results .result:hover,
-
.ui.category.search > .results .category .result:hover {
-
background: var(--color-secondary);
-
}
-
-
.ui.search > .results .result .title {
-
color: #dbdbdb;
-
}
-
-
.ui.table > thead > tr > th {
-
background: var(--color-secondary);
-
color: #dbdbdb !important;
-
}
-
-
.repository.file.list #repo-files-table tr {
-
background: #070707;
-
}
-
-
.repository.file.list #repo-files-table tr:hover {
-
background-color: #2d2d2d !important;
-
}
-
-
.repository.file.editor.edit,
-
.repository.wiki.new .CodeMirror {
-
.editor-preview,
-
.editor-preview-side,
-
& + .editor-preview-side {
-
background: #25272d;
-
-
.markdown:not(code).ui.segment {
-
border-width: 0;
-
}
-
}
-
}
-
-
.overflow.menu .items .item {
-
color: #9d9d9d;
-
}
-
-
.overflow.menu .items .item:hover {
-
color: #dbdbdb;
-
}
-
-
.ui.list > .item > .content {
-
color: var(--color-secondary-dark-6) !important;
-
}
-
-
.ui.active.button:active,
-
.ui.button:active,
-
.ui.button:focus,
-
.ui.active.button {
-
background-color: #2e3e4e;
-
color: #dbdbdb;
-
}
-
-
.ui.active.button:hover {
-
background-color: #475e75;
-
color: #dbdbdb;
-
}
-
-
.repository .navbar .active.item,
-
.repository .navbar .active.item:hover {
-
border-color: transparent !important;
-
}
-
-
.ui .info.segment.top {
-
background-color: var(--color-secondary) !important;
-
}
-
-
.repository .diff-stats li {
-
border-color: var(--color-secondary);
-
}
-
-
.tag-code,
-
.tag-code td {
-
background: #25272d !important;
-
-
}
-
.tag-code td.lines-num {
-
background-color: #3a3e4c !important;
-
}
-
-
.tag-code td.lines-type-marker,
-
td.blob-hunk {
-
color: #dbdbdb !important;
-
}
-
-
.ui.attached.info.message,
-
.ui.info.message {
-
box-shadow: 0 0 0 1px #4b5e71 inset, 0 0 0 0 transparent;
-
}
-
-
.ui.bottom.attached.message {
-
background-color: #2c662d;
-
color: #ab6363;
-
}
-
-
.ui.bottom.attached.message .pull-right {
-
color: #ab6363;
-
}
-
-
.ui.info.message {
-
background-color: #2c3b4a;
-
color: #9ebcc5;
-
}
-
-
.ui .warning.header,
-
.ui.warning.message {
-
background-color: #542 !important;
-
border-color: #ec8;
-
}
-
-
.ui.warning.message {
-
color: #ec8;
-
box-shadow: 0 0 0 1px #ec8;
-
}
-
-
.ui.warning.segment {
-
border-color: #ec8;
-
}
-
-
.ui.red.message,
-
.ui.error.message {
-
background-color: #522;
-
color: #f9cbcb;
-
box-shadow: 0 0 0 1px #a04141 inset;
-
}
-
-
.ui .error.header,
-
.ui.error.message {
-
background-color: #522 !important;
-
border-color: #a04141;
-
}
-
-
.ui.error.segment {
-
border-color: #a04141;
-
}
-
-
.ui.red.button,
-
.ui.red.buttons .button {
-
background-color: #7d3434;
-
}
-
-
.ui.red.button:hover,
-
.ui.red.buttons .button:hover {
-
background-color: #984646;
-
}
-
-
.ui.positive.message {
-
background-color: #000;
-
color: #fff;
-
box-shadow: 0 0 0 1px #1c1c1c inset, 0 0 0 0 transparent;
-
}
-
-
.ui.negative.message {
-
background-color: rgba(80, 23, 17, .6);
-
color: #f9cbcb;
-
box-shadow: 0 0 0 1px rgba(121, 71, 66, .5) inset, 0 0 0 0 transparent;
-
}
-
-
.ui.list .list > .item .header,
-
.ui.list > .item .header {
-
color: #dedede;
-
}
-
-
.ui.list .list > .item .description,
-
.ui.list > .item .description {
-
color: var(--color-secondary-dark-6);
-
}
-
-
.repository.file.list #repo-files-table tbody .svg.octicon-file-directory,
-
.repository.file.list #repo-files-table tbody .svg.octicon-file-submodule {
-
color: #52555b;
-
}
-
-
.repository.labels .ui.basic.black.label {
-
background-color: #bbbbbb !important;
-
}
-
-
.lines-commit,
-
.blame .lines-num {
-
background: #060606 !important;
-
}
-
-
.lines-num {
-
color: var(--color-secondary-dark-6) !important;
-
border-color: var(--color-secondary) !important;
-
}
-
-
td.blob-excerpt {
-
background-color: rgba(0, 0, 0, .15);
-
}
-
-
.lines-code.active,
-
.lines-code .active {
-
background: #534d1b !important;
-
}
-
-
.ui.ui.ui.ui.table tr.active,
-
.ui.ui.table td.active {
-
color: #dbdbdb;
-
}
-
-
.ui.active.label {
-
background: #46484e;
-
border-color: #46484e;
-
color: #dbdbdb;
-
}
-
-
.repository .ui.attached.message.isSigned.isVerified {
-
background-color: #394829;
-
color: var(--color-secondary-dark-6);
-
-
&.message {
-
color: #ab6363;
-
.ui.text {
-
color: var(--color-secondary-dark-6);
-
}
-
.pull-right {
-
color: #ab6363;
-
}
-
}
-
}
-
-
.repository .ui.attached.message.isSigned.isVerifiedUntrusted {
-
background-color: #4a3903;
-
color: var(--color-secondary-dark-6);
-
&.message {
-
color: #c2c193;
-
.ui.text {
-
color: var(--color-secondary-dark-6);
-
}
-
a {
-
color: #c2c193;
-
}
-
}
-
}
-
-
.repository .ui.attached.message.isSigned.isVerifiedUnmatched {
-
background-color: #4e3321;
-
color: var(--color-secondary-dark-6);
-
&.message {
-
color: #c2a893;
-
.ui.text {
-
color: var(--color-secondary-dark-6);
-
}
-
a {
-
color: #c2a893;
-
}
-
}
-
}
-
-
.repository .ui.attached.message.isSigned.isWarning {
-
background-color: rgba(80, 23, 17, .6);
-
&.message {
-
color: #d07d7d;
-
.ui.text {
-
color: #d07d7d;
-
}
-
}
-
}
-
-
.ui.header .sub.header {
-
color: var(--color-secondary-dark-6);
-
}
-
-
.ui.dividing.header {
-
border-bottom: 1px solid var(--color-secondary);
-
}
-
-
.ui.modal > .header {
-
background: var(--color-secondary);
-
color: #dbdbdb;
-
}
-
-
.ui.modal > .actions {
-
background: var(--color-secondary);
-
border-color: var(--color-secondary);
-
}
-
-
.ui.modal > .content {
-
background: #2d2d2d;
-
}
-
-
.minicolors-panel {
-
background: var(--color-secondary) !important;
-
border-color: #6a737d !important;
-
}
-
-
/* invert emojis that are hard to read otherwise */
-
.emoji[aria-label="check mark"],
-
.emoji[aria-label="currency exchange"],
-
.emoji[aria-label="TOP arrow"],
-
.emoji[aria-label="END arrow"],
-
.emoji[aria-label="ON! arrow"],
-
.emoji[aria-label="SOON arrow"],
-
.emoji[aria-label="heavy dollar sign"],
-
.emoji[aria-label="copyright"],
-
.emoji[aria-label="registered"],
-
.emoji[aria-label="trade mark"],
-
.emoji[aria-label="multiply"],
-
.emoji[aria-label="plus"],
-
.emoji[aria-label="minus"],
-
.emoji[aria-label="divide"],
-
.emoji[aria-label="curly loop"],
-
.emoji[aria-label="double curly loop"],
-
.emoji[aria-label="wavy dash"],
-
.emoji[aria-label="paw prints"],
-
.emoji[aria-label="musical note"],
-
.emoji[aria-label="musical notes"] {
-
filter: invert(100%);
-
}
-
-
.edit-diff > div > .ui.table {
-
border-left-color: var(--color-secondary) !important;
-
border-right-color: var(--color-secondary) !important;
-
}
-
-
/* code mirror dark theme */
-
-
.CodeMirror {
-
&.cm-s-default,
-
&.cm-s-paper {
-
.cm-property {
-
color: #a0cc75;
-
}
-
-
.cm-header {
-
color: #9daccc;
-
}
-
-
.cm-quote {
-
color: #009900;
-
}
-
-
.cm-keyword {
-
color: #cc8a61;
-
}
-
-
.cm-atom {
-
color: #ef5e77;
-
}
-
-
.cm-number {
-
color: #ff5656;
-
}
-
-
.cm-def {
-
color: #e4e4e4;
-
}
-
-
.cm-variable-2 {
-
color: #00bdbf;
-
}
-
-
.cm-variable-3 {
-
color: #008855;
-
}
-
-
.cm-comment {
-
color: #8e9ab3;
-
}
-
-
.cm-string {
-
color: #a77272;
-
}
-
-
.cm-string-2 {
-
color: #ff5500;
-
}
-
-
.cm-meta,
-
.cm-qualifier {
-
color: #ffb176;
-
}
-
-
.cm-builtin {
-
color: #b7c951;
-
}
-
-
.cm-bracket {
-
color: #999977;
-
}
-
-
.cm-tag {
-
color: #f1d273;
-
}
-
-
.cm-attribute {
-
color: #bfcc70;
-
}
-
-
.cm-hr {
-
color: #999999;
-
}
-
-
.cm-url {
-
color: #c5cfd0;
-
}
-
-
.cm-link {
-
color: #d8c792;
-
}
-
-
.cm-error {
-
/* color: #ff6e00; */
-
color: #dbdbeb;
-
}
-
}
-
}
-
-
footer .container .links > * {
-
border-left-color: #888;
-
}
-
-
.repository.file.list #repo-files-table tbody .svg {
-
color: var(--color-secondary-dark-6);
-
}
-
-
.repository.release #release-list > li .detail .dot {
-
background-color: #4e5465;
-
border-color: #2d2d2d;
-
}
-
-
.tribute-container {
-
box-shadow: 0 .25rem .5rem rgba(0, 0, 0, .6);
-
}
-
-
.repository .repo-header .ui.huge.breadcrumb.repo-title .repo-header-icon .avatar {
-
color: #060606;
-
}
-
-
img[src$="/img/matrix.svg"] {
-
filter: invert(80%);
-
}
-
-
#git-graph-container li .time {
-
color: #6a737d;
-
}
-
-
#git-graph-container.monochrome #rel-container .flow-group {
-
stroke: dimgrey;
-
fill: dimgrey;
-
}
-
-
#git-graph-container.monochrome #rel-container .flow-group.highlight {
-
stroke: darkgrey;
-
fill: darkgrey;
-
}
-
-
#git-graph-container:not(.monochrome) #rel-container .flow-group {
-
&.flow-color-16-5 {
-
stroke: #5543b1;
-
fill: #5543b1;
-
}
-
}
-
-
#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight {
-
&.flow-color-16-5 {
-
stroke: #7058e6;
-
fill: #7058e6;
-
}
-
}
-
-
#git-graph-container #rev-list li.highlight.hover {
-
background-color: rgba(255, 255, 255, .1);
-
}
-
-
#git-graph-container .ui.buttons button#flow-color-monochrome.ui.button {
-
border-left-color: rgb(76, 80, 92);
-
border-left-style: solid;
-
border-left-width: 1px;
-
}
-
-
.mermaid-chart {
-
filter: invert(84%) hue-rotate(180deg);
-
}
-
-
.is-loading::after {
-
border-color: #4a4c58 #4a4c58 #d7d7da #d7d7da;
-
}
-
-
.markdown-block-error {
-
border: 1px solid rgba(121, 71, 66, .5) !important;
-
border-bottom: none !important;
-
}
-
-
.home .hero .svg {
-
color: var(--color-primary);
-
}
-
-
.home a {
-
color: var(--color-primary-light-1);
-
}
-
-
.ui.menu, .ui.vertical.menu {
-
background: #070707;
-
border-color: var(--color-secondary-dark-4);
-
}
-
-
.ui.menu.new-menu {
-
background: #060606;
-
}
-
-
.ui.menu.new-menu:after {
-
background: none;
-
}
-
-
.ui.checkbox label:active:before, .ui.checkbox label:hover:before, .ui.form input:not([type]):hover, .ui.form input[type=date]:hover, .ui.form input[type=datetime-local]:hover, .ui.form input[type=email]:hover, .ui.form input[type=file]:hover, .ui.form input[type=number]:hover, .ui.form input[type=password]:hover, .ui.form input[type=search]:hover, .ui.form input[type=tel]:hover, .ui.form input[type=text]:hover, .ui.form input[type=time]:hover, .ui.form input[type=url]:hover, .ui.form select:hover, .ui.form textarea:hover, .ui.input input:hover, .ui.radio.checkbox input:checked~label:before, .ui.radio.checkbox input:focus~label:before, .ui.radio.checkbox label:after, .ui.selection.dropdown:hover, input:hover, textarea:hover {
-
background: var(--color-secondary-dark-3);
-
}
-
-
.ui.checkbox input:checked~label:before, .ui.checkbox input:not([type=radio]):indeterminate~label:before, .ui.checkbox label:before, .ui.form input:not([type]), .ui.form input[type=date], .ui.form input[type=datetime-local], .ui.form input[type=email], .ui.form input[type=file], .ui.form input[type=number], .ui.form input[type=password], .ui.form input[type=search], .ui.form input[type=tel], .ui.form input[type=text], .ui.form input[type=time], .ui.form input[type=url], .ui.form select, .ui.form textarea, .ui.input>input, .ui.selection.dropdown, input, textarea {
-
background: var(--color-secondary-dark-2);
-
}
-
-
.ui.checkbox input:checked:focus~label:before, .ui.checkbox input:focus~label:before, .ui.checkbox input:not([type=radio]):indeterminate:focus~label:before, .ui.form input:not([type]):focus, .ui.form input[type=date]:focus, .ui.form input[type=datetime-local]:focus, .ui.form input[type=email]:focus, .ui.form input[type=file]:focus, .ui.form input[type=number]:focus, .ui.form input[type=password]:focus, .ui.form input[type=search]:focus, .ui.form input[type=tel]:focus, .ui.form input[type=text]:focus, .ui.form input[type=time]:focus, .ui.form input[type=url]:focus, .ui.form select:focus, .ui.form textarea:focus, .ui.input input:focus, .ui.radio.checkbox input:focus:checked~label:before, .ui.selection.dropdown:focus, input:focus, textarea:focus {
-
background: var(--color-secondary-dark-3);
-
}
-
-
.ui.list .list>.item .description, .ui.list>.item .description {
-
color: var(--color-secondary-dark-11);
-
}
-
-
.explore .navbar {
-
background-color: var(--color-box-body)!important;
-
}
-
-
.repository .header-wrapper {
-
background-color: var(--color-box-body);
-
}
-
-
.monaco-editor, .monaco-editor-background, .monaco-editor .inputarea.ime-input {
-
background-color: #181818;
-
}
-
-
.ui.blue.label, .ui.blue.labels .label, .ui.primary.label, .ui.primary.labels .label {
-
background-color: var(--color-secondary)!important;
-
border-color: var(--color-primary-dark-2)!important;
-
}
-
-
.ui.blue.button, .ui.blue.buttons .button, .ui.primary.button, .ui.primary.buttons .button {
-
background-color: #070707!important;
-
}
-
-
.ui.blue.button:hover, .ui.blue.buttons .button:hover, .ui.primary.button:hover, .ui.primary.buttons .button:hover {
-
background-color: #1c1c1c!important;
-
}
-
-
.ui.green.labels .label, .ui.ui.ui.green.label {
-
background-color: #1c1c1c!important;
-
border-color: #21ba45!important;
-
color: #fff;
-
}
-
-
.ui.red.labels .label, .ui.ui.ui.red.label {
-
background-color: #1c1c1c!important;
-
border-color: #db2828!important;
-
color: #fff;
-
}
-
-
::selection, ::-moz-selection {
-
background: var(--color-grey);
-
color: var(--color-secondary)!important;
-
}
-
-
.CodeMirror, .CodeMirror-selected, ::selection {
-
background: var(--color-primary)!important;
-
color: var(--color-secondary)!important;
-
}
-
-
.markup a, .ui.breadcrumb a {
-
color: var(--color-primary-light-7);
-
cursor: pointer;
-
text-decoration: none;
-
border-bottom: 1px solid var(--color-primary);
-
transition-property: all
-
}
-
-
.markup a:hover, .ui.breadcrumb a:hover {
-
color: #000;
-
cursor: pointer;
-
text-decoration: none;
-
background: #fff;
-
background-color: #fff
-
}
-
-
.markup .anchor {
-
border-bottom: none
-
}
-
-
.markup .anchor:hover {
-
color: var(--color-primary-light-7);
-
border-bottom: none;
-
background: var(--color-body);
-
background-color: var(--color-body)
-
}
-
-
.mtk1, .mtk10 {
-
color: #6D7178!important
-
}
hosts/wolumonde/modules/forgejo.nix/public/assets/fonts/comic.woff2

This is a binary file and will not be displayed.

hosts/wolumonde/modules/forgejo.nix/public/assets/fonts/comicbd.woff2

This is a binary file and will not be displayed.

hosts/wolumonde/modules/forgejo.nix/public/assets/fonts/comici.woff2

This is a binary file and will not be displayed.

hosts/wolumonde/modules/forgejo.nix/public/assets/img/favicon.png

This is a binary file and will not be displayed.

hosts/wolumonde/modules/forgejo.nix/public/assets/img/grrr.webp

This is a binary file and will not be displayed.

hosts/wolumonde/modules/forgejo.nix/public/assets/img/logo.png

This is a binary file and will not be displayed.

hosts/wolumonde/modules/forgejo.nix/public/assets/img/wecode.gif

This is a binary file and will not be displayed.

-44
hosts/wolumonde/modules/forgejo.nix/templates/base/head.tmpl
···
-
<!DOCTYPE html>
-
<html lang="{{ctx.Locale.Lang}}" data-theme="{{ThemeName .SignedUser}}">
-
<head>
-
<meta name="viewport" content="width=device-width, initial-scale=1">
-
{{/* Display `- .Repository.FullName` only if `.Title` does not already start with that. */}}
-
<title>{{if .Title}}{{.Title}} - {{end}}{{if and (.Repository.Name) (not (StringUtils.HasPrefix .Title .Repository.FullName))}}{{.Repository.FullName}} - {{end}}{{AppDisplayName}}</title>
-
{{if .ManifestData}}<link rel="manifest" href="data:{{.ManifestData}}">{{end}}
-
<meta name="author" content="{{if .Repository}}{{.Owner.Name}}{{else}}{{MetaAuthor}}{{end}}">
-
<meta name="description" content="{{if .Repository}}{{.Repository.Name}}{{if .Repository.Description}} - {{.Repository.Description}}{{end}}{{else}}{{MetaDescription}}{{end}}">
-
<meta name="keywords" content="{{MetaKeywords}}">
-
<meta name="referrer" content="no-referrer">
-
{{if .GoGetImport}}
-
<meta name="go-import" content="{{.GoGetImport}} git {{.RepoCloneLink.HTTPS}}">
-
<meta name="go-source" content="{{.GoGetImport}} _ {{.GoDocDirectory}} {{.GoDocFile}}">
-
{{end}}
-
{{if and .EnableFeed .FeedURL}}
-
<link rel="alternate" type="application/atom+xml" title="" href="{{.FeedURL}}.atom">
-
<link rel="alternate" type="application/rss+xml" title="" href="{{.FeedURL}}.rss">
-
{{end}}
-
<link rel="alternate icon" href="{{AssetUrlPrefix}}/img/favicon.png" type="image/png">
-
{{template "base/head_script" .}}
-
{{template "shared/user/mention_highlight" .}}
-
{{template "base/head_opengraph" .}}
-
{{template "base/head_style" .}}
-
{{template "custom/header" .}}
-
</head>
-
<body hx-headers='{"x-csrf-token": "{{.CsrfToken}}"}' hx-swap="outerHTML" hx-ext="morph" hx-push-url="false">
-
{{template "custom/body_outer_pre" .}}
-
-
<div class="full height">
-
<noscript>{{ctx.Locale.Tr "enable_javascript"}}</noscript>
-
-
{{template "custom/body_inner_pre" .}}
-
-
{{if not .PageIsInstall}}
-
{{template "base/head_navbar" .}}
-
{{end}}
-
-
{{if false}}
-
{{/* to make html structure "likely" complete to prevent IDE warnings */}}
-
</div>
-
</body>
-
</html>
-
{{end}}
-207
hosts/wolumonde/modules/forgejo.nix/templates/base/head_navbar.tmpl
···
-
{{$notificationUnreadCount := 0}}
-
{{if and .IsSigned .NotificationUnreadCount}}
-
{{$notificationUnreadCount = call .NotificationUnreadCount}}
-
{{end}}
-
-
<nav id="navbar" aria-label="{{ctx.Locale.Tr "aria.navbar"}}">
-
<div class="navbar-left ui secondary menu">
-
<!-- the logo -->
-
<a class="item" id="navbar-logo" href="{{AppSubUrl}}/" aria-label="{{if .IsSigned}}{{ctx.Locale.Tr "dashboard"}}{{else}}{{ctx.Locale.Tr "home"}}{{end}}">
-
<img width="30" height="30" src="{{AssetUrlPrefix}}/img/logo.png" alt="{{ctx.Locale.Tr "logo"}}" aria-hidden="true">
-
</a>
-
-
<!-- mobile right menu, it must be here because in mobile view, each item is a flex column, the first item is a full row column -->
-
<div class="ui secondary menu item navbar-mobile-right only-mobile">
-
{{if .IsSigned}}
-
<a id="mobile-notifications-icon" class="item tw-w-auto tw-p-2" href="{{AppSubUrl}}/notifications" data-tooltip-content="{{ctx.Locale.Tr "notifications"}}" aria-label="{{ctx.Locale.Tr "notifications"}}">
-
<div class="tw-relative">
-
{{svg "octicon-bell"}}
-
<span class="notification_count{{if not $notificationUnreadCount}} tw-hidden{{end}}">{{$notificationUnreadCount}}</span>
-
</div>
-
</a>
-
{{end}}
-
<button class="item tw-w-auto ui icon mini button tw-p-2 tw-m-0" id="navbar-expand-toggle" aria-label="{{ctx.Locale.Tr "toggle_menu"}}">{{svg "octicon-three-bars"}}</button>
-
</div>
-
-
<!-- navbar links non-mobile -->
-
{{if and .IsSigned .MustChangePassword}}
-
{{/* No links */}}
-
{{else if .IsSigned}}
-
{{if not .UnitIssuesGlobalDisabled}}
-
<a class="item{{if .PageIsIssues}} active{{end}}" href="{{AppSubUrl}}/issues">{{ctx.Locale.Tr "issues"}}</a>
-
{{end}}
-
{{if not .UnitPullsGlobalDisabled}}
-
<a class="item{{if .PageIsPulls}} active{{end}}" href="{{AppSubUrl}}/pulls">{{ctx.Locale.Tr "pull_requests"}}</a>
-
{{end}}
-
{{if not (and .UnitIssuesGlobalDisabled .UnitPullsGlobalDisabled)}}
-
{{if .ShowMilestonesDashboardPage}}
-
<a class="item{{if .PageIsMilestonesDashboard}} active{{end}}" href="{{AppSubUrl}}/milestones">{{ctx.Locale.Tr "milestones"}}</a>
-
{{end}}
-
{{end}}
-
<a class="item{{if .PageIsExplore}} active{{end}}" href="{{AppSubUrl}}/explore/repos">{{ctx.Locale.Tr "explore"}}</a>
-
{{else if .IsLandingPageOrganizations}}
-
<a class="item{{if .PageIsExplore}} active{{end}}" href="{{AppSubUrl}}/explore/organizations">{{ctx.Locale.Tr "explore"}}</a>
-
{{else}}
-
<a class="item{{if .PageIsExplore}} active{{end}}" href="{{AppSubUrl}}/explore/repos">{{ctx.Locale.Tr "explore"}}</a>
-
{{end}}
-
-
{{template "custom/extra_links" .}}
-
-
{{if not .IsSigned}}
-
<a class="item" target="_blank" rel="noopener noreferrer" href="https://forgejo.org/docs/latest/">{{ctx.Locale.Tr "help"}}</a>
-
{{end}}
-
</div>
-
-
<!-- the full dropdown menus -->
-
<div class="navbar-right ui secondary menu">
-
{{if and .IsSigned .MustChangePassword}}
-
<div class="ui dropdown jump item" data-tooltip-content="{{ctx.Locale.Tr "user_profile_and_more"}}">
-
<span class="text tw-flex tw-items-center">
-
{{ctx.AvatarUtils.Avatar .SignedUser 24 "tw-mr-1"}}
-
<span class="only-mobile tw-ml-2">{{.SignedUser.Name}}</span>
-
<span class="not-mobile">{{svg "octicon-triangle-down"}}</span>
-
</span>
-
<div class="menu user-menu">
-
<div class="ui header">
-
{{ctx.Locale.Tr "signed_in_as"}} <strong>{{.SignedUser.Name}}</strong>
-
</div>
-
-
<div class="divider"></div>
-
<a class="item link-action" href data-url="{{AppSubUrl}}/user/logout">
-
{{svg "octicon-sign-out"}}
-
{{ctx.Locale.Tr "sign_out"}}
-
</a>
-
</div><!-- end content avatar menu -->
-
</div><!-- end dropdown avatar menu -->
-
{{else if .IsSigned}}
-
{{if EnableTimetracking}}
-
<a class="active-stopwatch-trigger item tw-mx-0{{if not .ActiveStopwatch}} tw-hidden{{end}}" href="{{.ActiveStopwatch.IssueLink}}" title="{{ctx.Locale.Tr "active_stopwatch"}}">
-
<div class="tw-relative">
-
{{svg "octicon-stopwatch"}}
-
<span class="header-stopwatch-dot"></span>
-
</div>
-
<span class="only-mobile tw-ml-2">{{ctx.Locale.Tr "active_stopwatch"}}</span>
-
</a>
-
<div class="active-stopwatch-popup item tippy-target tw-p-2">
-
<div class="tw-flex tw-items-center">
-
<a class="stopwatch-link tw-flex tw-items-center" href="{{.ActiveStopwatch.IssueLink}}">
-
{{svg "octicon-issue-opened" 16 "tw-mr-2"}}
-
<span class="stopwatch-issue">{{.ActiveStopwatch.RepoSlug}}#{{.ActiveStopwatch.IssueIndex}}</span>
-
<span class="ui primary label stopwatch-time tw-my-0 tw-mx-4" data-seconds="{{.ActiveStopwatch.Seconds}}">
-
{{if .ActiveStopwatch}}{{Sec2Time .ActiveStopwatch.Seconds}}{{end}}
-
</span>
-
</a>
-
<form class="stopwatch-commit" method="post" action="{{.ActiveStopwatch.IssueLink}}/times/stopwatch/toggle">
-
{{.CsrfTokenHtml}}
-
<button
-
type="submit"
-
class="ui button mini compact basic icon"
-
data-tooltip-content="{{ctx.Locale.Tr "repo.issues.stop_tracking"}}"
-
>{{svg "octicon-square-fill"}}</button>
-
</form>
-
<form class="stopwatch-cancel" method="post" action="{{.ActiveStopwatch.IssueLink}}/times/stopwatch/cancel">
-
{{.CsrfTokenHtml}}
-
<button
-
type="submit"
-
class="ui button mini compact basic icon"
-
data-tooltip-content="{{ctx.Locale.Tr "repo.issues.cancel_tracking"}}"
-
>{{svg "octicon-trash"}}</button>
-
</form>
-
</div>
-
</div>
-
{{end}}
-
-
<a class="item not-mobile tw-mx-0" href="{{AppSubUrl}}/notifications" data-tooltip-content="{{ctx.Locale.Tr "notifications"}}" aria-label="{{ctx.Locale.Tr "notifications"}}">
-
<div class="tw-relative">
-
{{svg "octicon-bell"}}
-
<span class="notification_count{{if not $notificationUnreadCount}} tw-hidden{{end}}">{{$notificationUnreadCount}}</span>
-
</div>
-
</a>
-
-
<div class="ui dropdown jump item tw-mx-0 tw-pr-2" data-tooltip-content="{{ctx.Locale.Tr "create_new"}}">
-
<span class="text">
-
{{svg "octicon-plus"}}
-
<span class="not-mobile">{{svg "octicon-triangle-down"}}</span>
-
<span class="only-mobile">{{ctx.Locale.Tr "create_new"}}</span>
-
</span>
-
<div class="menu">
-
<a class="item" href="{{AppSubUrl}}/repo/create">
-
{{svg "octicon-plus"}} {{ctx.Locale.Tr "new_repo.link"}}
-
</a>
-
{{if not .DisableMigrations}}
-
<a class="item" href="{{AppSubUrl}}/repo/migrate">
-
{{svg "octicon-repo-push"}} {{ctx.Locale.Tr "new_migrate.link"}}
-
</a>
-
{{end}}
-
{{if .SignedUser.CanCreateOrganization}}
-
<a class="item" href="{{AppSubUrl}}/org/create">
-
{{svg "octicon-organization"}} {{ctx.Locale.Tr "new_org.link"}}
-
</a>
-
{{end}}
-
</div><!-- end content create new menu -->
-
</div><!-- end dropdown menu create new -->
-
-
<div class="ui dropdown jump item tw-mx-0 tw-pr-2" data-tooltip-content="{{ctx.Locale.Tr "user_profile_and_more"}}">
-
<span class="text tw-flex tw-items-center">
-
{{ctx.AvatarUtils.Avatar .SignedUser 24 "tw-mr-1"}}
-
<span class="only-mobile tw-ml-2">{{.SignedUser.Name}}</span>
-
<span class="not-mobile">{{svg "octicon-triangle-down"}}</span>
-
</span>
-
<div class="menu user-menu">
-
<div class="ui header">
-
{{ctx.Locale.Tr "signed_in_as"}} <strong>{{.SignedUser.Name}}</strong>
-
</div>
-
-
<div class="divider"></div>
-
<a class="item" href="{{.SignedUser.HomeLink}}">
-
{{svg "octicon-person"}}
-
{{ctx.Locale.Tr "your_profile"}}
-
</a>
-
{{if not .DisableStars}}
-
<a class="item" href="{{.SignedUser.HomeLink}}?tab=stars">
-
{{svg "octicon-star"}}
-
{{ctx.Locale.Tr "your_starred"}}
-
</a>
-
{{end}}
-
<a class="item" href="{{AppSubUrl}}/notifications/subscriptions">
-
{{svg "octicon-bell"}}
-
{{ctx.Locale.Tr "notification.subscriptions"}}
-
</a>
-
<a class="{{if .PageIsUserSettings}}active {{end}}item" href="{{AppSubUrl}}/user/settings">
-
{{svg "octicon-tools"}}
-
{{ctx.Locale.Tr "your_settings"}}
-
</a>
-
<a class="item" target="_blank" rel="noopener noreferrer" href="https://forgejo.org/docs/latest/">
-
{{svg "octicon-question"}}
-
{{ctx.Locale.Tr "help"}}
-
</a>
-
{{if .IsAdmin}}
-
<div class="divider"></div>
-
-
<a class="{{if .PageIsAdmin}}active {{end}}item" href="{{AppSubUrl}}/admin">
-
{{svg "octicon-server"}}
-
{{ctx.Locale.Tr "admin_panel"}}
-
</a>
-
{{end}}
-
-
<div class="divider"></div>
-
<a class="item link-action" href data-url="{{AppSubUrl}}/user/logout">
-
{{svg "octicon-sign-out"}}
-
{{ctx.Locale.Tr "sign_out"}}
-
</a>
-
</div><!-- end content avatar menu -->
-
</div><!-- end dropdown avatar menu -->
-
{{else}}
-
{{if .ShowRegistrationButton}}
-
<a class="item{{if .PageIsSignUp}} active{{end}}" href="{{AppSubUrl}}/user/sign_up">
-
{{svg "octicon-person" 16 "tw-mr-1"}}
-
<span>{{ctx.Locale.Tr "register"}}</span>
-
</a>
-
{{end}}
-
<a class="item{{if .PageIsSignIn}} active{{end}}" rel="nofollow" href="{{AppSubUrl}}/user/login{{if not .PageIsSignIn}}?redirect_to={{.CurrentURL}}{{end}}">
-
{{svg "octicon-sign-in" 16 "tw-mr-1"}}
-
<span>{{ctx.Locale.Tr "sign_in"}}</span>
-
</a>
-
{{end}}
-
</div><!-- end full right menu -->
-
</nav>
-14
hosts/wolumonde/modules/forgejo.nix/templates/home.tmpl
···
-
{{template "base/head" .}}
-
<div role="main" aria-label="{{if .IsSigned}}{{ctx.Locale.Tr "dashboard"}}{{else}}{{ctx.Locale.Tr "home"}}{{end}}" class="page-content home">
-
<div class="tw-mb-8 tw-px-8">
-
<div class="center">
-
<img class="logo" width="220" height="220" src="https://git.gaze.systems/assets/img/grrr.webp" alt="i hate software" title="i hate software">
-
<div class="hero">
-
<h2>software</h2>
-
</div>
-
<div style="height: 200vh;"></div>
-
<img class="logo" width="220" height="220" src="https://git.gaze.systems/assets/img/wecode.gif" alt="forgejo. beyond coding. we forge. but lowtiergod" title="skies ur rina">
-
</div>
-
</div>
-
</div>
-
{{template "base/footer" .}}
-65
hosts/wolumonde/modules/headscale.nix/acl.nix
···
-
{config, lib, ...}: let
-
l = lib // builtins;
-
t = l.types;
-
-
cfg = config.services.headscale.acl;
-
ruleType = t.submodule {
-
options = {
-
action = l.mkOption {
-
type = t.enum [ "accept" ];
-
default = "accept";
-
};
-
proto = l.mkOption {
-
type = t.nullOr (t.enum ["tcp" "udp"]);
-
default = null;
-
};
-
src = l.mkOption {
-
type = t.listOf t.str;
-
};
-
dst = l.mkOption {
-
type = t.listOf t.str;
-
};
-
};
-
};
-
in {
-
options = {
-
services.headscale.acl = {
-
groups = l.mkOption {
-
type = t.attrsOf (t.listOf t.str);
-
default = [];
-
};
-
tagOwners = l.mkOption {
-
type = t.attrsOf (t.listOf t.str);
-
default = [];
-
};
-
hosts = l.mkOption {
-
type = t.attrsOf t.str;
-
default = [];
-
};
-
rules = l.mkOption {
-
type = t.listOf ruleType;
-
default = [];
-
};
-
};
-
};
-
-
config = let
-
generated = l.toFile "policy.hujson" (l.toJSON {
-
groups = l.mapAttrs' (k: v: l.nameValuePair "group:${k}" v) cfg.groups;
-
tagOwners = l.mapAttrs' (k: v: l.nameValuePair "tag:${k}" v) cfg.tagOwners;
-
hosts = cfg.hosts;
-
acls = l.map
-
(rule:
-
if rule.proto == null
-
then l.removeAttrs rule ["proto"]
-
else rule
-
)
-
cfg.rules;
-
});
-
in {
-
services.headscale.settings.policy = {
-
mode = "file";
-
path = generated;
-
};
-
};
-
}
-90
hosts/wolumonde/modules/headscale.nix/default.nix
···
-
{ lib, config, ... }:
-
let
-
rootDomain = "gaze.systems";
-
domain = "vpn.${rootDomain}";
-
in
-
{
-
imports = [./acl.nix];
-
-
age.secrets.headscaleOidcSecret = {
-
file = ../../../../secrets/headscaleOidcSecret.age;
-
mode = "600";
-
owner = config.services.headscale.user;
-
group = config.services.headscale.group;
-
};
-
-
services.headscale = {
-
enable = true;
-
address = "0.0.0.0";
-
port = 1111;
-
acl = {
-
groups.admin = ["90008@gaze.systems"];
-
tagOwners = {
-
private-infra = ["group:admin"];
-
other-infra = ["group:admin"];
-
};
-
hosts = {
-
chernobog = "100.64.0.9";
-
wolumonde = "100.64.0.2";
-
higashi = "100.64.0.5";
-
};
-
rules = lib.mkBefore [
-
{
-
src = ["group:admin"];
-
dst = ["tag:private-infra:*" "tag:other-infra:*"];
-
}
-
{
-
src = ["tag:private-infra"];
-
dst = ["tag:other-infra:*"];
-
}
-
{
-
src = ["wolumonde"];
-
dst = ["chernobog:*"];
-
}
-
{
-
src = ["90008@gaze.systems"];
-
dst = ["90008@gaze.systems:*"];
-
}
-
{
-
src = ["90008@gaze.systems" "tag:private-infra"];
-
dst = ["autogroup:internet:*"];
-
}
-
{
-
src = ["ellite@ellite.dev"];
-
dst = ["chernobog:8463"];
-
}
-
];
-
};
-
settings = {
-
server_url = "https://${domain}";
-
dns = {
-
base_domain = "lan.${rootDomain}";
-
nameservers.global = [
-
"1.1.1.1"
-
"1.0.0.1"
-
"9.9.9.9"
-
"149.112.112.112"
-
];
-
};
-
oidc = {
-
issuer = config.services.pocket-id.settings.APP_URL;
-
client_id = "ba2c2024-f75f-49a2-a156-8593becfba28";
-
client_secret_path = config.age.secrets.headscaleOidcSecret.path;
-
pkce.enabled = true;
-
only_start_if_oidc_is_available = true;
-
};
-
};
-
};
-
-
security.acme.certs."gaze.systems".extraDomainNames = [domain];
-
services.nginx.virtualHosts.${domain} = {
-
useACMEHost = rootDomain;
-
forceSSL = true;
-
quic = true;
-
kTLS = true;
-
locations."/" = {
-
proxyPass = "http://localhost:${toString config.services.headscale.port}";
-
proxyWebsockets = true;
-
};
-
};
-
}
+28
hosts/wolumonde/modules/hedgedoc.disabled
···
+
{ config, ... }:
+
let
+
cfg = config.services.hedgedoc.settings;
+
in
+
{
+
services.hedgedoc = {
+
enable = true;
+
settings = {
+
port = 3333;
+
domain = "doc.gaze.systems";
+
protocolUseSSL = true;
+
allowEmailRegister = false;
+
allowAnonymous = false;
+
allowAnonymousEdits = true;
+
allowFreeURL = true;
+
requireFreeURLAuthentication = true;
+
};
+
};
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ cfg.domain ];
+
services.nginx.virtualHosts.${cfg.domain} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/".proxyPass = "http://${cfg.host}:${toString cfg.port}";
+
};
+
}
-28
hosts/wolumonde/modules/hedgedoc.nix
···
-
{ config, ... }: let
-
cfg = config.services.hedgedoc.settings;
-
in
-
{
-
services.hedgedoc = {
-
enable = true;
-
settings = {
-
port = 3333;
-
domain = "doc.gaze.systems";
-
protocolUseSSL = true;
-
allowEmailRegister = false;
-
allowAnonymous = false;
-
allowAnonymousEdits = true;
-
allowFreeURL = true;
-
requireFreeURLAuthentication = true;
-
};
-
};
-
-
security.acme.certs."gaze.systems".extraDomainNames = [cfg.domain];
-
services.nginx.virtualHosts.${cfg.domain} = {
-
useACMEHost = "gaze.systems";
-
forceSSL = true;
-
quic = true;
-
kTLS = true;
-
locations."/".proxyPass =
-
"http://${cfg.host}:${toString cfg.port}";
-
};
-
}
+59
hosts/wolumonde/modules/limbusart.disabled
···
+
{
+
inputs,
+
pkgs,
+
lib,
+
...
+
}:
+
let
+
pkg = pkgs.callPackage "${inputs.limbusart}/package.nix" { };
+
domain = "pmart.gaze.systems";
+
oldDomain = "limbus.gaze.systems";
+
in
+
{
+
systemd.services.limbusart = {
+
description = "limbusart";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
serviceConfig = lib.mkMerge [
+
{
+
User = "limbusart";
+
ExecStart = "${pkg}/bin/limbusart";
+
Restart = "on-failure";
+
RestartSec = 5;
+
WorkingDirectory = "/var/lib/limbusart";
+
EnvironmentFile = pkgs.writeText "limbusart.conf" ''
+
ARTS_PATH="arts.txt"
+
SITE_TITLE="random pm art"
+
EMBED_TITLE="random pm art here!!"
+
EMBED_DESC="click NOW to see random pm art"
+
EMBED_COLOR="#bd0000"
+
'';
+
}
+
];
+
};
+
users.users.limbusart = {
+
isSystemUser = true;
+
group = "limbusart";
+
};
+
users.groups.limbusart = { };
+
+
security.acme.certs."gaze.systems".extraDomainNames = [
+
domain
+
oldDomain
+
];
+
services.nginx.virtualHosts.${domain} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/".proxyPass = "http://localhost:3000";
+
};
+
# redirects
+
services.nginx.virtualHosts.${oldDomain} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
globalRedirect = domain;
+
};
+
}
-59
hosts/wolumonde/modules/limbusart.nix
···
-
{
-
inputs,
-
pkgs,
-
lib,
-
...
-
}:
-
let
-
pkg = pkgs.callPackage "${inputs.limbusart}/package.nix" { };
-
domain = "pmart.gaze.systems";
-
oldDomain = "limbus.gaze.systems";
-
in
-
{
-
systemd.services.limbusart = {
-
description = "limbusart";
-
wantedBy = [ "multi-user.target" ];
-
after = [ "network.target" ];
-
serviceConfig = lib.mkMerge [
-
{
-
User = "limbusart";
-
ExecStart = "${pkg}/bin/limbusart";
-
Restart = "on-failure";
-
RestartSec = 5;
-
WorkingDirectory = "/var/lib/limbusart";
-
EnvironmentFile = pkgs.writeText "limbusart.conf" ''
-
ARTS_PATH="arts.txt"
-
SITE_TITLE="random pm art"
-
EMBED_TITLE="random pm art here!!"
-
EMBED_DESC="click NOW to see random pm art"
-
EMBED_COLOR="#bd0000"
-
'';
-
}
-
];
-
};
-
users.users.limbusart = {
-
isSystemUser = true;
-
group = "limbusart";
-
};
-
users.groups.limbusart = { };
-
-
security.acme.certs."gaze.systems".extraDomainNames = [
-
domain
-
oldDomain
-
];
-
services.nginx.virtualHosts.${domain} = {
-
useACMEHost = "gaze.systems";
-
forceSSL = true;
-
quic = true;
-
kTLS = true;
-
locations."/".proxyPass = "http://localhost:3000";
-
};
-
# redirects
-
services.nginx.virtualHosts.${oldDomain} = {
-
useACMEHost = "gaze.systems";
-
forceSSL = true;
-
quic = true;
-
kTLS = true;
-
globalRedirect = domain;
-
};
-
}
+67 -61
hosts/wolumonde/modules/nginx.nix
···
{
+
config,
lib,
inputs,
-
pkgs,
...
}:
{
services.nginx = {
enable = true;
-
package = pkgs.nginxQuic;
recommendedTlsSettings = true;
recommendedOptimisation = true;
recommendedGzipSettings = true;
···
users.users.nginx.extraGroups = [ "acme" ];
+
age.secrets.cfDnsEditToken.file = ../../../secrets/cloudflareDnsEdit.age;
security.acme = {
acceptTerms = true;
-
defaults.email = (import "${inputs.self}/personal.nix").emails.primary;
-
defaults.webroot = "/var/lib/acme/acme-challenge";
+
defaults = {
+
group = "nginx";
+
email = (import "${inputs.self}/personal.nix").emails.primary;
+
dnsProvider = "cloudflare";
+
credentialFiles = {
+
CF_DNS_API_TOKEN_FILE = config.age.secrets.cfDnsEditToken.path;
+
};
+
};
certs."poor.dog" = { };
certs."ptr.pet" = { };
certs."gaze.systems" = { };
···
forceSSL = true;
};
-
services.fluent-bit.settings = {
-
parsers = [
-
{
-
name = "nginx_json";
-
format = "json";
-
time_key = "time";
-
time_format = "%d/%b/%Y:%H:%M:%S %z";
-
}
-
];
-
pipeline = {
-
inputs = [
-
{
-
name = "nginx_metrics";
-
tag = "metrics.nginx";
-
status_url = "/nginx_status";
-
nginx_plus = false;
-
}
-
{
-
name = "tail";
-
tag = "logs.nginx";
-
path = "/var/log/nginx/*.log";
-
db = "/var/lib/fluent-bit/nginx-access.db";
-
"db.locking" = true;
-
buffer_chunk_size = "4m";
-
buffer_max_size = "32m";
-
parser = "nginx_json";
-
}
-
];
-
filters = [
-
{
-
name = "modify";
-
match = "logs.nginx";
-
Add = [ "name nginx" ];
-
}
-
];
-
};
-
};
+
# services.fluent-bit.settings = {
+
# parsers = [
+
# {
+
# name = "nginx_json";
+
# format = "json";
+
# time_key = "time";
+
# time_format = "%d/%b/%Y:%H:%M:%S %z";
+
# }
+
# ];
+
# pipeline = {
+
# inputs = [
+
# {
+
# name = "nginx_metrics";
+
# tag = "metrics.nginx";
+
# status_url = "/nginx_status";
+
# nginx_plus = false;
+
# }
+
# {
+
# name = "tail";
+
# tag = "logs.nginx";
+
# path = "/var/log/nginx/*.log";
+
# db = "/var/lib/fluent-bit/nginx-access.db";
+
# "db.locking" = true;
+
# buffer_chunk_size = "4m";
+
# buffer_max_size = "32m";
+
# parser = "nginx_json";
+
# }
+
# ];
+
# filters = [
+
# {
+
# name = "modify";
+
# match = "logs.nginx";
+
# Add = [ "name nginx" ];
+
# }
+
# ];
+
# };
+
# };
-
# need so fluent-bit can access nginx
-
systemd.services.fluent-bit.serviceConfig.SupplementaryGroups = lib.mkForce "systemd-journal nginx";
+
# # need so fluent-bit can access nginx
+
# systemd.services.fluent-bit.serviceConfig.SupplementaryGroups = lib.mkForce "systemd-journal nginx";
-
services.vmalert.instances."".rules.groups = [
-
{
-
name = "nginx-logs";
-
type = "vlogs";
-
interval = "1m";
-
rules = [
-
{
-
record = "nginx_request_count";
-
expr = "name:nginx | stats (res.statusCode) count() as total_requests";
-
}
-
{
-
record = "nginx_request_latency";
-
# filter out subscribeRepos requests because they are long polling http L
-
expr = "name:nginx | filter req.url:!/xrpc/com.atproto.sync.subscribeRepos | stats avg(requestTime) avg, quantile(0.5, requestTime) p50, quantile(0.9, requestTime) p90, quantile(0.99, requestTime) p99";
-
}
-
];
-
}
-
];
+
# services.vmalert.instances."".rules.groups = [
+
# {
+
# name = "nginx-logs";
+
# type = "vlogs";
+
# interval = "1m";
+
# rules = [
+
# {
+
# record = "nginx_request_count";
+
# expr = "name:nginx | stats (res.statusCode) count() as total_requests";
+
# }
+
# {
+
# record = "nginx_request_latency";
+
# # filter out subscribeRepos requests because they are long polling http L
+
# expr = "name:nginx | filter req.url:!/xrpc/com.atproto.sync.subscribeRepos | stats avg(requestTime) avg, quantile(0.5, requestTime) p50, quantile(0.9, requestTime) p90, quantile(0.99, requestTime) p99";
+
# }
+
# ];
+
# }
+
# ];
}
+66
hosts/wolumonde/modules/nsid-tracker.disabled
···
+
{
+
pkgs,
+
terra,
+
inputs,
+
...
+
}:
+
let
+
client-modules = pkgs.callPackage "${inputs.nsid-tracker}/nix/client-modules.nix" { };
+
client = pkgs.callPackage "${inputs.nsid-tracker}/nix/client.nix" {
+
PUBLIC_API_URL = "gaze.systems/nsid-tracker/api";
+
inherit client-modules;
+
};
+
# server = terra.nsid-tracker-server;
+
port = 3713;
+
in
+
{
+
systemd.services.nsid-tracker-client = {
+
description = "nsid-tracker-client";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
environment = {
+
# ORIGIN = "https://gaze.systems";
+
PORT = toString port;
+
};
+
serviceConfig = {
+
DynamicUser = true;
+
ExecStart = "${client}/bin/website";
+
Restart = "on-failure";
+
RestartSec = 5;
+
WorkingDirectory = "/var/lib/nsid-tracker";
+
};
+
};
+
#
+
+
systemd.services.nsid-tracker-keep-alive = {
+
description = "keeps nsid-tracker peer connection alive";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
serviceConfig = {
+
Type = "oneshot";
+
ExecStart = "${pkgs.curl}/bin/curl http://dusk-devel-mobi:${toString port}/events";
+
};
+
};
+
systemd.timers.nsid-tracker-keep-alive.timerConfig = {
+
OnBootSec = "5 min";
+
OnUnitActiveSec = "5 min";
+
Unit = "nsid-tracker-keep-alive.service";
+
};
+
+
services.nginx.virtualHosts."gaze.systems" = {
+
locations."/nsid-tracker/api" = {
+
proxyPass = "http://100.64.0.6:${toString port}/";
+
proxyWebsockets = true;
+
extraConfig = ''
+
rewrite ^/nsid-tracker/api/(.*) /$1 break;
+
'';
+
};
+
locations."/nsid-tracker".return = "301 /nsid-tracker/";
+
locations."/nsid-tracker/" = {
+
proxyPass = "http://localhost:${toString port}/";
+
extraConfig = ''
+
rewrite ^/nsid-tracker/(.*)$ /$1 break;
+
'';
+
};
+
};
+
}
-66
hosts/wolumonde/modules/nsid-tracker.nix
···
-
{
-
pkgs,
-
terra,
-
inputs,
-
...
-
}:
-
let
-
client-modules = pkgs.callPackage "${inputs.nsid-tracker}/nix/client-modules.nix" { };
-
client = pkgs.callPackage "${inputs.nsid-tracker}/nix/client.nix" {
-
PUBLIC_API_URL = "gaze.systems/nsid-tracker/api";
-
inherit client-modules;
-
};
-
# server = terra.nsid-tracker-server;
-
port = 3713;
-
in
-
{
-
systemd.services.nsid-tracker-client = {
-
description = "nsid-tracker-client";
-
wantedBy = [ "multi-user.target" ];
-
after = [ "network.target" ];
-
environment = {
-
# ORIGIN = "https://gaze.systems";
-
PORT = toString port;
-
};
-
serviceConfig = {
-
DynamicUser = true;
-
ExecStart = "${client}/bin/website";
-
Restart = "on-failure";
-
RestartSec = 5;
-
WorkingDirectory = "/var/lib/nsid-tracker";
-
};
-
};
-
#
-
-
systemd.services.nsid-tracker-keep-alive = {
-
description = "keeps nsid-tracker peer connection alive";
-
wantedBy = [ "multi-user.target" ];
-
after = [ "network.target" ];
-
serviceConfig = {
-
Type = "oneshot";
-
ExecStart = "${pkgs.curl}/bin/curl http://dusk-devel-mobi:${toString port}/events";
-
};
-
};
-
systemd.timers.nsid-tracker-keep-alive.timerConfig = {
-
OnBootSec = "5 min";
-
OnUnitActiveSec = "5 min";
-
Unit = "nsid-tracker-keep-alive.service";
-
};
-
-
services.nginx.virtualHosts."gaze.systems" = {
-
locations."/nsid-tracker/api" = {
-
proxyPass = "http://100.64.0.6:${toString port}/";
-
proxyWebsockets = true;
-
extraConfig = ''
-
rewrite ^/nsid-tracker/api/(.*) /$1 break;
-
'';
-
};
-
locations."/nsid-tracker".return = "301 /nsid-tracker/";
-
locations."/nsid-tracker/" = {
-
proxyPass = "http://localhost:${toString port}/";
-
extraConfig = ''
-
rewrite ^/nsid-tracker/(.*)$ /$1 break;
-
'';
-
};
-
};
-
}
+46
hosts/wolumonde/modules/openbao.disabled/default.nix
···
+
{ lib, config, ... }:
+
let
+
port = 5394;
+
domain = "bao.${config.services.headscale.settings.dns.base_domain}";
+
cfg = config.services.openbao.settings;
+
apiAddress = "127.0.0.1:${toString port}";
+
in
+
{
+
imports = [ ./spindle-proxy ];
+
+
services.openbao = {
+
enable = true;
+
settings = {
+
ui = true;
+
+
listener.default = {
+
type = "tcp";
+
address = apiAddress;
+
tls_disable = true;
+
};
+
+
cluster_addr = "http://127.0.0.1:8201";
+
api_addr = "http://${apiAddress}";
+
+
storage.file.path = "/var/lib/openbao/data";
+
};
+
};
+
+
systemd.services.openbao.preStart = ''
+
mkdir -p /var/lib/openbao
+
rm -rf /var/lib/openbao/policies
+
cp -r ${./policies} /var/lib/openbao/policies
+
'';
+
+
services.headscale.settings.dns.extra_records = [
+
{
+
name = domain;
+
type = "A";
+
value = "100.64.0.2";
+
}
+
];
+
services.nginx.virtualHosts.${domain} = {
+
quic = true;
+
locations."/".proxyPass = cfg.api_addr;
+
};
+
}
+19
hosts/wolumonde/modules/openbao.disabled/policies/spindle.hcl
···
+
# Full access to spindle KV v2 data
+
path "spindle/data/*" {
+
capabilities = ["create", "read", "update", "delete"]
+
}
+
+
# Access to metadata for listing and management
+
path "spindle/metadata/*" {
+
capabilities = ["list", "read", "delete", "update"]
+
}
+
+
# Allow listing at root level
+
path "spindle/" {
+
capabilities = ["list"]
+
}
+
+
# Required for connection testing and health checks
+
path "auth/token/lookup-self" {
+
capabilities = ["read"]
+
}
+21
hosts/wolumonde/modules/openbao.disabled/spindle-proxy/README.md
···
+
see https://tangled.sh/@tangled.sh/core/blob/master/docs/spindle/openbao.md
+
+
set BAO_ADDRESS: `$env.BAO_ADDRESS = "http://bao.lan.gaze.systems"`
+
set BAO_TOKEN: `$env.BAO_TOKEN = "<root key>"`
+
+
create mount: `bao secrets enable -path=spindle -version=2 kv`
+
+
setup policy: `
+
bao policy write spindle /var/lib/openbao/policies/spindle.hcl
+
bao auth enable approle
+
bao write auth/approle/role/spindle \
+
token_policies="spindle" \
+
token_ttl=1h \
+
token_max_ttl=4h \
+
bind_secret_id=true \
+
secret_id_ttl=0 \
+
secret_id_num_uses=0
+
`
+
+
get role-id: `bao read -field=role_id auth/approle/role/spindle/role-id`
+
get secret-id: `bao write -f auth/approle/role/spindle/secret-id`
+63
hosts/wolumonde/modules/openbao.disabled/spindle-proxy/config.hcl
···
+
vault {
+
address = "%vault_address%"
+
+
# Retry configuration
+
retry {
+
num_retries = 5
+
}
+
}
+
+
# Auto-Auth using AppRole
+
auto_auth {
+
method "approle" {
+
mount_path = "auth/approle"
+
config = {
+
role_id_file_path = "%role_id%"
+
secret_id_file_path = "%secret_id%"
+
remove_secret_id_file_after_reading = false
+
}
+
}
+
+
# Write authenticated token to file
+
sink "file" {
+
config = {
+
path = "/var/lib/%name%/token"
+
mode = 0640
+
}
+
}
+
}
+
+
# API Proxy listener for Spindle
+
listener "tcp" {
+
address = "127.0.0.1:%listener_port%"
+
tls_disable = true
+
+
# Security headers
+
require_request_header = false
+
+
# Enable proxy API for management
+
proxy_api {
+
enable_quit = true
+
}
+
}
+
+
# Enable API proxy with auto-auth token
+
api_proxy {
+
use_auto_auth_token = true
+
}
+
+
cache {
+
}
+
+
# Logging configuration
+
log_level = "info"
+
log_format = "standard"
+
log_file = "/var/lib/%name%/proxy.log"
+
log_rotate_duration = "24h"
+
log_rotate_max_files = 30
+
+
# Process management
+
pid_file = "/var/lib/%name%/proxy.pid"
+
+
# Disable idle connections for reliability
+
disable_idle_connections = ["auto-auth", "proxying"]
+106
hosts/wolumonde/modules/openbao.disabled/spindle-proxy/default.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}:
+
let
+
port = 8945;
+
secrets = config.age.secrets;
+
cfgFile = pkgs.writeText "openbao-proxy-spindle-config.hcl" (
+
lib.replaceStrings
+
[
+
"%role_id%"
+
"%secret_id%"
+
"%vault_address%"
+
"%listener_port%"
+
"%name%"
+
]
+
[
+
secrets.spindleOpenbaoRoleId.path
+
secrets.spindleOpenbaoSecretId.path
+
config.services.openbao.settings.api_addr
+
(toString port)
+
name
+
]
+
(lib.fileContents ./config.hcl)
+
);
+
domain = "spindle.bao.lan.gaze.systems";
+
name = "openbao-proxy-spindle";
+
in
+
{
+
age.secrets.spindleOpenbaoRoleId = {
+
file = ../../../../../secrets/spindleOpenbaoRoleId.age;
+
mode = "600";
+
owner = name;
+
group = name;
+
};
+
age.secrets.spindleOpenbaoSecretId = {
+
file = ../../../../../secrets/spindleOpenbaoSecretId.age;
+
mode = "600";
+
owner = name;
+
group = name;
+
};
+
+
users.users.${name} = {
+
isSystemUser = true;
+
group = name;
+
};
+
users.groups.${name} = {
+
members = [ name ];
+
};
+
+
systemd.services.${name} = {
+
description = "OpenBao Proxy with Auto-Auth for tangled spindle";
+
after = [ "openbao.service" ];
+
before = [ "spindle.service" ];
+
requires = [ "openbao.service" ];
+
wantedBy = [ "multi-user.target" ];
+
serviceConfig = {
+
ExecStart = "${pkgs.openbao}/bin/bao proxy -config=${cfgFile}";
+
Restart = "on-failure";
+
RestartSec = "5";
+
LimitNOFILE = "65536";
+
User = name;
+
Group = name;
+
RuntimeDirectory = name;
+
RuntimeDirectoryMode = 0700;
+
StateDirectory = name;
+
StateDirectoryMode = 0700;
+
ProcSubset = "pid";
+
ProtectClock = true;
+
ProtectControlGroups = true;
+
ProtectHome = true;
+
ProtectHostname = true;
+
ProtectKernelLogs = true;
+
ProtectKernelModules = true;
+
ProtectKernelTunables = true;
+
ProtectProc = "invisible";
+
RestrictNamespaces = true;
+
RestrictRealtime = true;
+
RestrictAddressFamilies = [
+
"AF_INET"
+
"AF_INET6"
+
"AF_UNIX"
+
];
+
SystemCallArchitectures = "native";
+
SystemCallFilter = [
+
"@system-service"
+
"@resources"
+
"~@privileged"
+
];
+
};
+
};
+
+
services.headscale.settings.dns.extra_records = [
+
{
+
name = domain;
+
type = "A";
+
value = "100.64.0.2";
+
}
+
];
+
services.nginx.virtualHosts.${domain} = {
+
quic = true;
+
locations."/".proxyPass = "http://127.0.0.1:${toString port}";
+
};
+
}
-44
hosts/wolumonde/modules/openbao.nix/default.nix
···
-
{lib, config, ...}: let
-
port = 5394;
-
domain = "bao.${config.services.headscale.settings.dns.base_domain}";
-
cfg = config.services.openbao.settings;
-
apiAddress = "127.0.0.1:${toString port}";
-
in {
-
imports = [./spindle-proxy];
-
-
services.openbao = {
-
enable = true;
-
settings = {
-
ui = true;
-
-
listener.default = {
-
type = "tcp";
-
address = apiAddress;
-
tls_disable = true;
-
};
-
-
cluster_addr = "http://127.0.0.1:8201";
-
api_addr = "http://${apiAddress}";
-
-
storage.file.path = "/var/lib/openbao/data";
-
};
-
};
-
-
systemd.services.openbao.preStart = ''
-
mkdir -p /var/lib/openbao
-
rm -rf /var/lib/openbao/policies
-
cp -r ${./policies} /var/lib/openbao/policies
-
'';
-
-
services.headscale.settings.dns.extra_records = [
-
{
-
name = domain;
-
type = "A";
-
value = "100.64.0.2";
-
}
-
];
-
services.nginx.virtualHosts.${domain} = {
-
quic = true;
-
locations."/".proxyPass = cfg.api_addr;
-
};
-
}
-19
hosts/wolumonde/modules/openbao.nix/policies/spindle.hcl
···
-
# Full access to spindle KV v2 data
-
path "spindle/data/*" {
-
capabilities = ["create", "read", "update", "delete"]
-
}
-
-
# Access to metadata for listing and management
-
path "spindle/metadata/*" {
-
capabilities = ["list", "read", "delete", "update"]
-
}
-
-
# Allow listing at root level
-
path "spindle/" {
-
capabilities = ["list"]
-
}
-
-
# Required for connection testing and health checks
-
path "auth/token/lookup-self" {
-
capabilities = ["read"]
-
}
-21
hosts/wolumonde/modules/openbao.nix/spindle-proxy/README.md
···
-
see https://tangled.sh/@tangled.sh/core/blob/master/docs/spindle/openbao.md
-
-
set BAO_ADDRESS: `$env.BAO_ADDRESS = "http://bao.lan.gaze.systems"`
-
set BAO_TOKEN: `$env.BAO_TOKEN = "<root key>"`
-
-
create mount: `bao secrets enable -path=spindle -version=2 kv`
-
-
setup policy: `
-
bao policy write spindle /var/lib/openbao/policies/spindle.hcl
-
bao auth enable approle
-
bao write auth/approle/role/spindle \
-
token_policies="spindle" \
-
token_ttl=1h \
-
token_max_ttl=4h \
-
bind_secret_id=true \
-
secret_id_ttl=0 \
-
secret_id_num_uses=0
-
`
-
-
get role-id: `bao read -field=role_id auth/approle/role/spindle/role-id`
-
get secret-id: `bao write -f auth/approle/role/spindle/secret-id`
-63
hosts/wolumonde/modules/openbao.nix/spindle-proxy/config.hcl
···
-
vault {
-
address = "%vault_address%"
-
-
# Retry configuration
-
retry {
-
num_retries = 5
-
}
-
}
-
-
# Auto-Auth using AppRole
-
auto_auth {
-
method "approle" {
-
mount_path = "auth/approle"
-
config = {
-
role_id_file_path = "%role_id%"
-
secret_id_file_path = "%secret_id%"
-
remove_secret_id_file_after_reading = false
-
}
-
}
-
-
# Write authenticated token to file
-
sink "file" {
-
config = {
-
path = "/var/lib/%name%/token"
-
mode = 0640
-
}
-
}
-
}
-
-
# API Proxy listener for Spindle
-
listener "tcp" {
-
address = "127.0.0.1:%listener_port%"
-
tls_disable = true
-
-
# Security headers
-
require_request_header = false
-
-
# Enable proxy API for management
-
proxy_api {
-
enable_quit = true
-
}
-
}
-
-
# Enable API proxy with auto-auth token
-
api_proxy {
-
use_auto_auth_token = true
-
}
-
-
cache {
-
}
-
-
# Logging configuration
-
log_level = "info"
-
log_format = "standard"
-
log_file = "/var/lib/%name%/proxy.log"
-
log_rotate_duration = "24h"
-
log_rotate_max_files = 30
-
-
# Process management
-
pid_file = "/var/lib/%name%/proxy.pid"
-
-
# Disable idle connections for reliability
-
disable_idle_connections = ["auto-auth", "proxying"]
-93
hosts/wolumonde/modules/openbao.nix/spindle-proxy/default.nix
···
-
{ config, lib, pkgs, ... }:
-
let
-
port = 8945;
-
secrets = config.age.secrets;
-
cfgFile = pkgs.writeText "openbao-proxy-spindle-config.hcl" (
-
lib.replaceStrings
-
[
-
"%role_id%"
-
"%secret_id%"
-
"%vault_address%"
-
"%listener_port%"
-
"%name%"
-
]
-
[
-
secrets.spindleOpenbaoRoleId.path
-
secrets.spindleOpenbaoSecretId.path
-
config.services.openbao.settings.api_addr
-
(toString port)
-
name
-
]
-
(lib.fileContents ./config.hcl)
-
);
-
domain = "spindle.bao.lan.gaze.systems";
-
name = "openbao-proxy-spindle";
-
in
-
{
-
age.secrets.spindleOpenbaoRoleId = {
-
file = ../../../../../secrets/spindleOpenbaoRoleId.age;
-
mode = "600";
-
owner = name;
-
group = name;
-
};
-
age.secrets.spindleOpenbaoSecretId = {
-
file = ../../../../../secrets/spindleOpenbaoSecretId.age;
-
mode = "600";
-
owner = name;
-
group = name;
-
};
-
-
users.users.${name} = {
-
isSystemUser = true;
-
group = name;
-
};
-
users.groups.${name} = {
-
members = [name];
-
};
-
-
systemd.services.${name} = {
-
description = "OpenBao Proxy with Auto-Auth for tangled spindle";
-
after = [ "openbao.service" ];
-
before = [ "spindle.service" ];
-
requires = [ "openbao.service" ];
-
wantedBy = [ "multi-user.target" ];
-
serviceConfig = {
-
ExecStart = "${pkgs.openbao}/bin/bao proxy -config=${cfgFile}";
-
Restart = "on-failure";
-
RestartSec = "5";
-
LimitNOFILE = "65536";
-
User = name;
-
Group = name;
-
RuntimeDirectory=name;
-
RuntimeDirectoryMode=0700;
-
StateDirectory=name;
-
StateDirectoryMode=0700;
-
ProcSubset="pid";
-
ProtectClock=true;
-
ProtectControlGroups=true;
-
ProtectHome=true;
-
ProtectHostname=true;
-
ProtectKernelLogs=true;
-
ProtectKernelModules=true;
-
ProtectKernelTunables=true;
-
ProtectProc="invisible";
-
RestrictNamespaces=true;
-
RestrictRealtime=true;
-
RestrictAddressFamilies=["AF_INET" "AF_INET6" "AF_UNIX"];
-
SystemCallArchitectures="native";
-
SystemCallFilter=["@system-service" "@resources" "~@privileged"];
-
};
-
};
-
-
services.headscale.settings.dns.extra_records = [
-
{
-
name = domain;
-
type = "A";
-
value = "100.64.0.2";
-
}
-
];
-
services.nginx.virtualHosts.${domain} = {
-
quic = true;
-
locations."/".proxyPass = "http://127.0.0.1:${toString port}";
-
};
-
}
+152
hosts/wolumonde/modules/pds.disabled
···
+
{ lib, config, ... }:
+
let
+
pdsLocalhost = "http://localhost:${toString config.services.bluesky-pds.settings.PDS_PORT}";
+
in
+
{
+
services.nginx.virtualHosts.${config.services.bluesky-pds.settings.PDS_HOSTNAME} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
locations = {
+
# we need to proxy /xrpc for pds to work
+
# silly but i want root domain >:3
+
"/xrpc" = {
+
proxyPass = pdsLocalhost;
+
proxyWebsockets = true;
+
# pass ws headers so we can actually proxy the ws
+
extraConfig = ''
+
proxy_set_header id $request_id;
+
client_max_body_size 100M;
+
'';
+
# higher prio just to make sure
+
priority = 100;
+
};
+
"/xrpc/app.bsky.unspecced.getAgeAssuranceState".extraConfig = ''
+
default_type application/json;
+
add_header access-control-allow-headers "authorization,dpop,atproto-accept-labelers,atproto-proxy" always;
+
add_header access-control-allow-origin "*" always;
+
return 200 '{"lastInitiatedAt":"2025-07-14T14:22:43.912Z","status":"assured"}';
+
'';
+
}
+
# others
+
// (lib.genAttrs
+
[
+
"/account"
+
"/@atproto"
+
"/oauth"
+
"=/.well-known/oauth-protected-resource"
+
"=/.well-known/oauth-authorization-server"
+
]
+
(_: {
+
proxyPass = pdsLocalhost;
+
# higher prio just to make sure
+
priority = 100;
+
})
+
);
+
};
+
# setup pds stuff
+
services.bluesky-pds = {
+
enable = true;
+
settings = {
+
PDS_HOSTNAME = "gaze.systems";
+
PDS_PORT = 1334;
+
+
PDS_SERVICE_NAME = ''"gazing at the sky"'';
+
PDS_LOGO_URL = "https://gaze.systems/icons/gaze_site.webp";
+
+
PDS_RATE_LIMITS_ENABLED = "true";
+
PDS_INVITE_REQUIRED = "true";
+
+
PDS_DID_PLC_URL = "https://plc.directory";
+
PDS_BSKY_APP_VIEW_URL = "https://api.bsky.app";
+
PDS_BSKY_APP_VIEW_DID = "did:web:api.bsky.app";
+
PDS_REPORT_SERVICE_URL = "https://mod.bsky.app";
+
PDS_REPORT_SERVICE_DID = "did:plc:ar7c4by46qjdydhdevvrndac";
+
PDS_CRAWLERS = "https://bsky.network";
+
};
+
environmentFiles = [ config.age.secrets.pdsConfig.path ];
+
};
+
+
# services.fluent-bit.settings = {
+
# parsers = [
+
# {
+
# name = "pds_json";
+
# format = "json";
+
# time_key = "time";
+
# time_strict = false;
+
# }
+
# ];
+
# pipeline = {
+
# inputs = [
+
# {
+
# name = "systemd";
+
# tag = "logs.pds";
+
# systemd_filter = "_SYSTEMD_UNIT=bluesky-pds.service";
+
# }
+
# ];
+
# filters = [
+
# {
+
# name = "parser";
+
# match = "logs.pds";
+
# key_name = "MESSAGE";
+
# parser = "pds_json";
+
# }
+
# {
+
# name = "modify";
+
# match = "logs.pds";
+
# Rename = [ "msg _msg" ];
+
# }
+
# ];
+
# };
+
# };
+
+
# services.vmalert.instances."".rules.groups = [
+
# {
+
# name = "pds-logs";
+
# type = "vlogs";
+
# interval = "1m";
+
# rules = [
+
# {
+
# record = "pds_request_count";
+
# expr = "name:pds | stats (res.statusCode) count() as total_requests";
+
# }
+
# {
+
# record = "pds_response_latency";
+
# expr = "name:pds | stats avg(responseTime) avg, quantile(0.5, responseTime) p50, quantile(0.9, responseTime) p90, quantile(0.99, responseTime) p99";
+
# }
+
# ];
+
# }
+
# ];
+
+
# virtualisation = {
+
# podman = {
+
# enable = true;
+
# dockerCompat = true;
+
# defaultNetwork.settings.dns_enabled = true;
+
# };
+
# oci-containers.containers = {
+
# pds = {
+
# image = "ghcr.io/bluesky-social/pds:0.4";
+
# autoStart = true;
+
# environmentFiles = [ ./pds.env config.age.secrets.pdsConfig.path ];
+
# ports = [ "1334:1334" ];
+
# volumes = [
+
# "/var/lib/pds:/pds"
+
# ];
+
# extraOptions = [
+
# #"--network=host"
+
# "--label=io.containers.autoupdate=registry"
+
# ];
+
# };
+
# };
+
# };
+
# # This is the podman auto-update systemd timer.
+
# # If I start to rely on podman auto-update more, I should move this out of the PDS definition.
+
# systemd.timers."podman-auto-update" = {
+
# enable = true;
+
# timerConfig = {
+
# OnCalendar = "*-*-* 4:00:00";
+
# Persistent = true;
+
# };
+
# wantedBy = [ "timers.target" ];
+
# };
+
}
-146
hosts/wolumonde/modules/pds.nix
···
-
{ lib, config, ... }:
-
let
-
pdsLocalhost = "http://localhost:${toString config.services.pds.settings.PDS_PORT}";
-
in
-
{
-
services.nginx.virtualHosts.${config.services.pds.settings.PDS_HOSTNAME} = {
-
useACMEHost = "gaze.systems";
-
forceSSL = true;
-
locations = {
-
# we need to proxy /xrpc for pds to work
-
# silly but i want root domain >:3
-
"/xrpc" = {
-
proxyPass = pdsLocalhost;
-
proxyWebsockets = true;
-
# pass ws headers so we can actually proxy the ws
-
extraConfig = ''
-
proxy_set_header id $request_id;
-
client_max_body_size 100M;
-
'';
-
# higher prio just to make sure
-
priority = 100;
-
};
-
}
-
# others
-
// (lib.genAttrs
-
[
-
"/account"
-
"/@atproto"
-
"/oauth"
-
"=/.well-known/oauth-protected-resource"
-
"=/.well-known/oauth-authorization-server"
-
]
-
(_: {
-
proxyPass = pdsLocalhost;
-
# higher prio just to make sure
-
priority = 100;
-
})
-
);
-
};
-
# setup pds stuff
-
services.pds = {
-
enable = true;
-
settings = {
-
PDS_HOSTNAME = "gaze.systems";
-
PDS_PORT = 1334;
-
-
PDS_SERVICE_NAME = ''"gazing at the sky"'';
-
PDS_LOGO_URL = "https://gaze.systems/icons/gaze_site.webp";
-
-
PDS_RATE_LIMITS_ENABLED = "true";
-
PDS_INVITE_REQUIRED = "true";
-
-
PDS_DID_PLC_URL = "https://plc.directory";
-
PDS_BSKY_APP_VIEW_URL = "https://api.bsky.app";
-
PDS_BSKY_APP_VIEW_DID = "did:web:api.bsky.app";
-
PDS_REPORT_SERVICE_URL = "https://mod.bsky.app";
-
PDS_REPORT_SERVICE_DID = "did:plc:ar7c4by46qjdydhdevvrndac";
-
PDS_CRAWLERS = "https://bsky.network";
-
};
-
environmentFiles = [ config.age.secrets.pdsConfig.path ];
-
};
-
-
services.fluent-bit.settings = {
-
parsers = [
-
{
-
name = "pds_json";
-
format = "json";
-
time_key = "time";
-
time_strict = false;
-
}
-
];
-
pipeline = {
-
inputs = [
-
{
-
name = "systemd";
-
tag = "logs.pds";
-
systemd_filter = "_SYSTEMD_UNIT=pds.service";
-
}
-
];
-
filters = [
-
{
-
name = "parser";
-
match = "logs.pds";
-
key_name = "MESSAGE";
-
parser = "pds_json";
-
}
-
{
-
name = "modify";
-
match = "logs.pds";
-
Rename = [ "msg _msg" ];
-
}
-
];
-
};
-
};
-
-
services.vmalert.instances."".rules.groups = [
-
{
-
name = "pds-logs";
-
type = "vlogs";
-
interval = "1m";
-
rules = [
-
{
-
record = "pds_request_count";
-
expr = "name:pds | stats (res.statusCode) count() as total_requests";
-
}
-
{
-
record = "pds_response_latency";
-
expr = "name:pds | stats avg(responseTime) avg, quantile(0.5, responseTime) p50, quantile(0.9, responseTime) p90, quantile(0.99, responseTime) p99";
-
}
-
];
-
}
-
];
-
-
# virtualisation = {
-
# podman = {
-
# enable = true;
-
# dockerCompat = true;
-
# defaultNetwork.settings.dns_enabled = true;
-
# };
-
# oci-containers.containers = {
-
# pds = {
-
# image = "ghcr.io/bluesky-social/pds:0.4";
-
# autoStart = true;
-
# environmentFiles = [ ./pds.env config.age.secrets.pdsConfig.path ];
-
# ports = [ "1334:1334" ];
-
# volumes = [
-
# "/var/lib/pds:/pds"
-
# ];
-
# extraOptions = [
-
# #"--network=host"
-
# "--label=io.containers.autoupdate=registry"
-
# ];
-
# };
-
# };
-
# };
-
# # This is the podman auto-update systemd timer.
-
# # If I start to rely on podman auto-update more, I should move this out of the PDS definition.
-
# systemd.timers."podman-auto-update" = {
-
# enable = true;
-
# timerConfig = {
-
# OnCalendar = "*-*-* 4:00:00";
-
# Persistent = true;
-
# };
-
# wantedBy = [ "timers.target" ];
-
# };
-
}
+2
hosts/wolumonde/modules/perses.disabled/dashboards/.gitignore
···
+
# folder used to store the results of the `percli dac build` command
+
built
+28
hosts/wolumonde/modules/perses.disabled/dashboards/go.mod
···
+
module dash
+
+
go 1.24.2
+
+
require (
+
github.com/beorn7/perks v1.0.1 // indirect
+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
+
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
+
github.com/jpillora/backoff v1.0.0 // indirect
+
github.com/muhlemmer/gu v0.3.1 // indirect
+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
+
github.com/perses/perses v0.50.3 // indirect
+
github.com/prometheus/client_golang v1.20.5 // indirect
+
github.com/prometheus/client_model v0.6.1 // indirect
+
github.com/prometheus/common v0.63.0 // indirect
+
github.com/prometheus/procfs v0.15.1 // indirect
+
github.com/zitadel/oidc/v3 v3.36.1 // indirect
+
github.com/zitadel/schema v1.3.0 // indirect
+
golang.org/x/crypto v0.36.0 // indirect
+
golang.org/x/net v0.35.0 // indirect
+
golang.org/x/oauth2 v0.28.0 // indirect
+
golang.org/x/sys v0.31.0 // indirect
+
golang.org/x/text v0.23.0 // indirect
+
google.golang.org/protobuf v1.36.5 // indirect
+
gopkg.in/yaml.v2 v2.4.0 // indirect
+
gopkg.in/yaml.v3 v3.0.1 // indirect
+
)
+45
hosts/wolumonde/modules/perses.disabled/dashboards/go.sum
···
+
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+
github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE=
+
github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA=
+
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
+
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+
github.com/muhlemmer/gu v0.3.1 h1:7EAqmFrW7n3hETvuAdmFmn4hS8W+z3LgKtrnow+YzNM=
+
github.com/muhlemmer/gu v0.3.1/go.mod h1:YHtHR+gxM+bKEIIs7Hmi9sPT3ZDUvTN/i88wQpZkrdM=
+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
+
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+
github.com/perses/perses v0.50.3 h1:BHlU9qkCFCUSP4HP5p9GwophWcxm5Vnu6Fsrx8Fb/+w=
+
github.com/perses/perses v0.50.3/go.mod h1:oqfHLOrXERvEqECShqXPjHXqVukQxcoaaTM6ySRF7hU=
+
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
+
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
+
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
+
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+
github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
+
github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
+
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
+
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+
github.com/zitadel/oidc/v3 v3.36.1 h1:1AT1NqKKEqAwx4GmKJZ9fYkWH2WIn/VKMfQ46nBtRf0=
+
github.com/zitadel/oidc/v3 v3.36.1/go.mod h1:dApGZLvWZTHRuxmcbQlW5d2XVjVYR3vGOdq536igmTs=
+
github.com/zitadel/schema v1.3.0 h1:kQ9W9tvIwZICCKWcMvCEweXET1OcOyGEuFbHs4o5kg0=
+
github.com/zitadel/schema v1.3.0/go.mod h1:NptN6mkBDFvERUCvZHlvWmmME+gmZ44xzwRXwhzsbtc=
+
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
+
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
+
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
+
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
+
golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc=
+
golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
+
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
+
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
+
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
+
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
+
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+334
hosts/wolumonde/modules/perses.disabled/dashboards/wolumonde.go
···
+
package main
+
+
import (
+
"flag"
+
"time"
+
+
"github.com/perses/perses/go-sdk"
+
"github.com/perses/perses/go-sdk/common"
+
dash "github.com/perses/perses/go-sdk/dashboard"
+
"github.com/perses/perses/go-sdk/panel"
+
panels "github.com/perses/perses/go-sdk/panel-group"
+
"github.com/perses/perses/go-sdk/panel/bar"
+
"github.com/perses/perses/go-sdk/panel/gauge"
+
"github.com/perses/perses/go-sdk/panel/stat"
+
"github.com/perses/perses/go-sdk/prometheus/query"
+
+
timeSeries "github.com/perses/perses/go-sdk/panel/time-series"
+
// promDs "github.com/perses/perses/go-sdk/prometheus/datasource"
+
)
+
+
func main() {
+
flag.Parse()
+
exec := sdk.NewExec()
+
+
var loadPanel = panels.AddPanel("load over 5 min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Max: 2.0,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"node_load5",
+
query.SeriesNameFormat("load"),
+
),
+
),
+
)
+
var cpuPanel = panels.AddPanel("cpu usage",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "percent",
+
},
+
Max: 100.0,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
`sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100`,
+
query.SeriesNameFormat("cpu {{cpu}}"),
+
),
+
),
+
)
+
var memoryPanel = panels.AddPanel("memory usage",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "bytes",
+
},
+
Max: 4000000000,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes",
+
query.SeriesNameFormat("current memory usage"),
+
),
+
),
+
)
+
+
var diskPanel = panels.AddPanel("disk usage /",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "bytes",
+
},
+
Max: 38000000000,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
`node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}`,
+
query.SeriesNameFormat("disk usage"),
+
),
+
),
+
)
+
+
// Gauge versions (percent unit)
+
var loadGaugePanel = panels.AddPanel("load over 5 min",
+
gauge.Chart(
+
gauge.Format(common.Format{Unit: "percent"}),
+
gauge.Max(100),
+
gauge.Calculation(common.MeanCalculation),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"node_load5 * 100 / count(count(node_cpu_seconds_total) by (cpu))",
+
query.SeriesNameFormat("load %"),
+
),
+
),
+
)
+
var cpuGaugePanel = panels.AddPanel("cpu usage",
+
gauge.Chart(
+
gauge.Format(common.Format{Unit: "percent"}),
+
gauge.Max(100),
+
gauge.Calculation(common.MeanCalculation),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
`sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100`,
+
query.SeriesNameFormat("cpu {{cpu}}"),
+
),
+
),
+
)
+
var memoryGaugePanel = panels.AddPanel("memory usage",
+
gauge.Chart(
+
gauge.Format(common.Format{Unit: "percent"}),
+
gauge.Max(100),
+
gauge.Calculation(common.MeanCalculation),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) * 100 / node_memory_MemTotal_bytes",
+
query.SeriesNameFormat("memory usage %"),
+
),
+
),
+
)
+
var diskGaugePanel = panels.AddPanel("disk usage /",
+
gauge.Chart(
+
gauge.Format(common.Format{Unit: "percent"}),
+
gauge.Max(100),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
`(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) * 100 / node_filesystem_size_bytes{mountpoint="/"}`,
+
query.SeriesNameFormat("disk usage %"),
+
),
+
),
+
)
+
+
var resPanels = dash.AddPanelGroup("resource usage",
+
panels.PanelsPerLine(4),
+
loadGaugePanel, cpuGaugePanel, memoryGaugePanel, diskGaugePanel,
+
loadPanel, cpuPanel, memoryPanel, diskPanel,
+
)
+
+
var nginxPanel = panels.AddPanel("nginx requests / min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "decimal",
+
},
+
},
+
),
+
timeSeries.WithVisual(timeSeries.Visual{
+
Display: timeSeries.BarDisplay,
+
Palette: timeSeries.Palette{
+
Mode: timeSeries.CategoricalMode,
+
},
+
Stack: timeSeries.AllStack,
+
}),
+
timeSeries.WithLegend(timeSeries.Legend{
+
Position: timeSeries.BottomPosition,
+
Size: timeSeries.SmallSize,
+
}),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"nginx_request_count",
+
query.SeriesNameFormat("{{res.statusCode}}"),
+
),
+
),
+
)
+
+
var nginxLatencyPanel = panels.AddPanel("nginx latency / min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "seconds",
+
},
+
Max: 0.5,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"nginx_request_latency",
+
query.SeriesNameFormat("{{stats_result}}"),
+
),
+
),
+
)
+
+
var nginxPanels = dash.AddPanelGroup("nginx metrics",
+
panels.PanelsPerLine(3),
+
nginxPanel,
+
nginxLatencyPanel,
+
)
+
+
var pdsPanel = panels.AddPanel("pds requests / min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "decimal",
+
},
+
},
+
),
+
timeSeries.WithVisual(timeSeries.Visual{
+
Display: timeSeries.BarDisplay,
+
Palette: timeSeries.Palette{
+
Mode: timeSeries.CategoricalMode,
+
},
+
Stack: timeSeries.AllStack,
+
}),
+
timeSeries.WithLegend(timeSeries.Legend{
+
Position: timeSeries.BottomPosition,
+
Size: timeSeries.SmallSize,
+
}),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"pds_request_count",
+
query.SeriesNameFormat("{{res.statusCode}}"),
+
),
+
),
+
)
+
+
var pdsLatencyPanel = panels.AddPanel("pds latency / min",
+
timeSeries.Chart(
+
timeSeries.WithYAxis(
+
timeSeries.YAxis{
+
Format: &common.Format{
+
Unit: "milliseconds",
+
},
+
Max: 500,
+
},
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"pds_response_latency",
+
query.SeriesNameFormat("{{stats_result}}"),
+
),
+
),
+
)
+
+
var pdsPanels = dash.AddPanelGroup("pds metrics",
+
panels.PanelsPerLine(3),
+
pdsPanel,
+
pdsLatencyPanel,
+
)
+
+
var anubisForgejoPanel = panels.AddPanel("anubis policy actions",
+
bar.Chart(),
+
panel.AddQuery(
+
query.PromQL(
+
"anubis_policy_results",
+
query.SeriesNameFormat("{{action}}: {{rule}}"),
+
),
+
),
+
)
+
+
var forgejoPanels = dash.AddPanelGroup("forgejo",
+
panels.PanelsPerLine(3),
+
anubisForgejoPanel,
+
)
+
+
var gazesys_visit_panel = panels.AddPanel("gazesys visits",
+
bar.Chart(),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_visit_real_total + gazesys_visit_fake_total",
+
query.SeriesNameFormat("total visits"),
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_visit_fake_total",
+
query.SeriesNameFormat("(ai) bot visits"),
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_visit_real_total",
+
query.SeriesNameFormat("real visits"),
+
),
+
),
+
)
+
+
var gazesys_pet_panel = panels.AddPanel("gazesys pet",
+
stat.Chart(
+
stat.Format(common.Format{
+
Unit: "decimal",
+
ShortValues: true,
+
DecimalPlaces: 0,
+
}),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_pet_bounce_total",
+
query.SeriesNameFormat("bounce count"),
+
),
+
),
+
panel.AddQuery(
+
query.PromQL(
+
"gazesys_pet_distance_total",
+
query.SeriesNameFormat("distance travelled"),
+
),
+
),
+
)
+
+
var gazesys_panels = dash.AddPanelGroup("gazesys",
+
panels.PanelsPerLine(3),
+
gazesys_visit_panel, gazesys_pet_panel,
+
)
+
+
builder, buildErr := dash.New("wolumonde",
+
dash.ProjectName("private-infra"),
+
dash.Duration(30*time.Minute),
+
dash.RefreshInterval(time.Minute),
+
resPanels, nginxPanels, pdsPanels, gazesys_panels, forgejoPanels,
+
)
+
exec.BuildDashboard(builder, buildErr)
+
}
+104
hosts/wolumonde/modules/perses.disabled/default.nix
···
+
{
+
pkgs,
+
config,
+
...
+
}:
+
let
+
domain = "dash.gaze.systems";
+
port = 7412;
+
user = "perses";
+
+
provisionFolder = "provisioning";
+
provisioningFolder = "${config.users.users.${user}.home}/${provisionFolder}";
+
+
persesConfig = {
+
database.file = {
+
folder = config.users.users.${user}.home;
+
extension = "json";
+
};
+
provisioning.folders = [ provisioningFolder ];
+
security = {
+
enable_auth = true;
+
authentication = {
+
providers = {
+
enable_native = false;
+
oidc = [
+
{
+
slug_id = "pocketid";
+
name = "Pocket ID";
+
client_id = "aa583db6-e03c-4490-853a-7f2b3e089fbe";
+
issuer = config.services.pocket-id.settings.APP_URL;
+
scopes = [ "openid profile email" ];
+
}
+
];
+
};
+
disable_sign_up = false;
+
};
+
cookie = {
+
same_site = "strict";
+
secure = true;
+
};
+
};
+
};
+
persesConfigYaml = pkgs.writers.writeYAML "config.yaml" persesConfig;
+
+
secrets = config.age.secrets;
+
in
+
{
+
environment.systemPackages = [ pkgs.perses ];
+
+
users.users.${user} = {
+
isNormalUser = true;
+
group = user;
+
home = "/var/lib/${user}";
+
createHome = true;
+
uid = 1001;
+
};
+
users.groups.${user} = {
+
gid = 976;
+
};
+
+
age.secrets.persesSecret = {
+
file = ../../../../secrets/persesSecret.age;
+
owner = user;
+
group = user;
+
};
+
+
systemd.services.perses = {
+
description = "perses";
+
after = [
+
"network.target"
+
"pocket-id.service"
+
];
+
requires = [ "pocket-id.service" ];
+
serviceConfig = {
+
ExecStart = "${pkgs.perses}/bin/perses --config=${persesConfigYaml} --web.listen-address=:${toString port} --log.level=info";
+
EnvironmentFile = secrets.persesSecret.path;
+
WorkingDirectory = config.users.users.${user}.home;
+
};
+
};
+
systemd.services.perses.preStart = ''
+
rm -rf ${provisioningFolder} && mkdir -p ${provisioningFolder}
+
cp -f ${./provision}/* ${provisioningFolder}
+
'';
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ domain ];
+
services.nginx.virtualHosts.${domain} = {
+
useACMEHost = "gaze.systems"; # TODO: write a module to define vhosts for subdomains
+
quic = true;
+
kTLS = true;
+
forceSSL = true;
+
locations."/" = {
+
proxyPass = "http://localhost:${toString port}";
+
};
+
};
+
+
# scrape perses metrics
+
services.victoriametrics.prometheusConfig.scrape_configs = [
+
{
+
job_name = "perses";
+
metrics_path = "/metrics";
+
static_configs = [ { targets = [ "localhost:${toString port}" ]; } ];
+
}
+
];
+
}
+3
hosts/wolumonde/modules/perses.disabled/provision/1-private-infra.yaml
···
+
kind: Project
+
metadata:
+
name: private-infra
+9
hosts/wolumonde/modules/perses.disabled/provision/2-admin-role.yaml
···
+
- kind: GlobalRole
+
metadata:
+
name: admin
+
spec:
+
permissions:
+
- actions:
+
- '*'
+
scopes:
+
- '*'
+8
hosts/wolumonde/modules/perses.disabled/provision/3-admin-bind-role.yaml
···
+
- kind: GlobalRoleBinding
+
metadata:
+
name: admin
+
spec:
+
role: admin
+
subjects:
+
- kind: User
+
name: 90008
+12
hosts/wolumonde/modules/perses.disabled/provision/4-victoria.yaml
···
+
- kind: GlobalDatasource
+
metadata:
+
name: victoria
+
spec:
+
default: true
+
plugin:
+
kind: PrometheusDatasource
+
spec:
+
proxy:
+
kind: HTTPProxy
+
spec:
+
url: http://localhost:8428
+12
hosts/wolumonde/modules/perses.disabled/provision/6-guest-role.yaml
···
+
- kind: GlobalRole
+
metadata:
+
name: guest
+
spec:
+
permissions:
+
- actions:
+
- 'read'
+
scopes:
+
- 'Dashboard'
+
- 'Project'
+
- 'Datasource'
+
- 'GlobalDatasource'
+8
hosts/wolumonde/modules/perses.disabled/provision/7-guest-role-bind.yaml
···
+
- kind: GlobalRoleBinding
+
metadata:
+
name: guest
+
spec:
+
role: guest
+
subjects:
+
- kind: User
+
name: sorryu02
+454
hosts/wolumonde/modules/perses.disabled/provision/90-wolumonde.yaml
···
+
kind: Dashboard
+
metadata:
+
name: wolumonde
+
createdAt: 0001-01-01T00:00:00Z
+
updatedAt: 0001-01-01T00:00:00Z
+
version: 0
+
project: private-infra
+
spec:
+
panels:
+
"0_0":
+
kind: Panel
+
spec:
+
display:
+
name: load over 5 min
+
plugin:
+
kind: GaugeChart
+
spec:
+
calculation: mean
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: node_load5 * 100 / count(count(node_cpu_seconds_total) by (cpu))
+
seriesNameFormat: load %
+
"0_1":
+
kind: Panel
+
spec:
+
display:
+
name: cpu usage
+
plugin:
+
kind: GaugeChart
+
spec:
+
calculation: mean
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100
+
seriesNameFormat: cpu {{cpu}}
+
"0_2":
+
kind: Panel
+
spec:
+
display:
+
name: memory usage
+
plugin:
+
kind: GaugeChart
+
spec:
+
calculation: mean
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) * 100 / node_memory_MemTotal_bytes
+
seriesNameFormat: memory usage %
+
"0_3":
+
kind: Panel
+
spec:
+
display:
+
name: disk usage /
+
plugin:
+
kind: GaugeChart
+
spec:
+
calculation: last
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: (node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) * 100 / node_filesystem_size_bytes{mountpoint="/"}
+
seriesNameFormat: disk usage %
+
"0_4":
+
kind: Panel
+
spec:
+
display:
+
name: load over 5 min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
max: 2
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: node_load5
+
seriesNameFormat: load
+
"0_5":
+
kind: Panel
+
spec:
+
display:
+
name: cpu usage
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: percent
+
max: 100
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100
+
seriesNameFormat: cpu {{cpu}}
+
"0_6":
+
kind: Panel
+
spec:
+
display:
+
name: memory usage
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: bytes
+
max: 4e+09
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes
+
seriesNameFormat: current memory usage
+
"0_7":
+
kind: Panel
+
spec:
+
display:
+
name: disk usage /
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: bytes
+
max: 3.8e+10
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}
+
seriesNameFormat: disk usage
+
"1_0":
+
kind: Panel
+
spec:
+
display:
+
name: nginx requests / min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
legend:
+
position: bottom
+
size: small
+
yAxis:
+
format:
+
unit: decimal
+
visual:
+
display: bar
+
palette:
+
mode: categorical
+
stack: all
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: nginx_request_count
+
seriesNameFormat: '{{res.statusCode}}'
+
"1_1":
+
kind: Panel
+
spec:
+
display:
+
name: nginx latency / min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: seconds
+
max: 0.5
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: nginx_request_latency
+
seriesNameFormat: '{{stats_result}}'
+
"2_0":
+
kind: Panel
+
spec:
+
display:
+
name: pds requests / min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
legend:
+
position: bottom
+
size: small
+
yAxis:
+
format:
+
unit: decimal
+
visual:
+
display: bar
+
palette:
+
mode: categorical
+
stack: all
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: pds_request_count
+
seriesNameFormat: '{{res.statusCode}}'
+
"2_1":
+
kind: Panel
+
spec:
+
display:
+
name: pds latency / min
+
plugin:
+
kind: TimeSeriesChart
+
spec:
+
yAxis:
+
format:
+
unit: milliseconds
+
max: 500
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: pds_response_latency
+
seriesNameFormat: '{{stats_result}}'
+
"3_0":
+
kind: Panel
+
spec:
+
display:
+
name: gazesys visits
+
plugin:
+
kind: BarChart
+
spec:
+
calculation: last
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_visit_real_total + gazesys_visit_fake_total
+
seriesNameFormat: total visits
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_visit_fake_total
+
seriesNameFormat: (ai) bot visits
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_visit_real_total
+
seriesNameFormat: real visits
+
"3_1":
+
kind: Panel
+
spec:
+
display:
+
name: gazesys pet
+
plugin:
+
kind: StatChart
+
spec:
+
calculation: last
+
format:
+
unit: decimal
+
shortValues: true
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_pet_bounce_total
+
seriesNameFormat: bounce count
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: gazesys_pet_distance_total
+
seriesNameFormat: distance travelled
+
"4_0":
+
kind: Panel
+
spec:
+
display:
+
name: anubis policy actions
+
plugin:
+
kind: BarChart
+
spec:
+
calculation: last
+
queries:
+
- kind: TimeSeriesQuery
+
spec:
+
plugin:
+
kind: PrometheusTimeSeriesQuery
+
spec:
+
query: anubis_policy_results
+
seriesNameFormat: '{{action}}: {{rule}}'
+
layouts:
+
- kind: Grid
+
spec:
+
display:
+
title: resource usage
+
items:
+
- x: 0
+
"y": 0
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_0'
+
- x: 6
+
"y": 0
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_1'
+
- x: 12
+
"y": 0
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_2'
+
- x: 18
+
"y": 0
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_3'
+
- x: 0
+
"y": 6
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_4'
+
- x: 6
+
"y": 6
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_5'
+
- x: 12
+
"y": 6
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_6'
+
- x: 18
+
"y": 6
+
width: 6
+
height: 6
+
content:
+
$ref: '#/spec/panels/0_7'
+
- kind: Grid
+
spec:
+
display:
+
title: nginx metrics
+
items:
+
- x: 0
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/1_0'
+
- x: 8
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/1_1'
+
- kind: Grid
+
spec:
+
display:
+
title: pds metrics
+
items:
+
- x: 0
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/2_0'
+
- x: 8
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/2_1'
+
- kind: Grid
+
spec:
+
display:
+
title: gazesys
+
items:
+
- x: 0
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/3_0'
+
- x: 8
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/3_1'
+
- kind: Grid
+
spec:
+
display:
+
title: forgejo
+
items:
+
- x: 0
+
"y": 0
+
width: 8
+
height: 6
+
content:
+
$ref: '#/spec/panels/4_0'
+
duration: 30m
+
refreshInterval: 1m
-2
hosts/wolumonde/modules/perses.nix/dashboards/.gitignore
···
-
# folder used to store the results of the `percli dac build` command
-
built
-28
hosts/wolumonde/modules/perses.nix/dashboards/go.mod
···
-
module dash
-
-
go 1.24.2
-
-
require (
-
github.com/beorn7/perks v1.0.1 // indirect
-
github.com/cespare/xxhash/v2 v2.3.0 // indirect
-
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
-
github.com/jpillora/backoff v1.0.0 // indirect
-
github.com/muhlemmer/gu v0.3.1 // indirect
-
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
-
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
-
github.com/perses/perses v0.50.3 // indirect
-
github.com/prometheus/client_golang v1.20.5 // indirect
-
github.com/prometheus/client_model v0.6.1 // indirect
-
github.com/prometheus/common v0.63.0 // indirect
-
github.com/prometheus/procfs v0.15.1 // indirect
-
github.com/zitadel/oidc/v3 v3.36.1 // indirect
-
github.com/zitadel/schema v1.3.0 // indirect
-
golang.org/x/crypto v0.36.0 // indirect
-
golang.org/x/net v0.35.0 // indirect
-
golang.org/x/oauth2 v0.28.0 // indirect
-
golang.org/x/sys v0.31.0 // indirect
-
golang.org/x/text v0.23.0 // indirect
-
google.golang.org/protobuf v1.36.5 // indirect
-
gopkg.in/yaml.v2 v2.4.0 // indirect
-
gopkg.in/yaml.v3 v3.0.1 // indirect
-
)
-45
hosts/wolumonde/modules/perses.nix/dashboards/go.sum
···
-
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
-
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
-
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
-
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-
github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE=
-
github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA=
-
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
-
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
-
github.com/muhlemmer/gu v0.3.1 h1:7EAqmFrW7n3hETvuAdmFmn4hS8W+z3LgKtrnow+YzNM=
-
github.com/muhlemmer/gu v0.3.1/go.mod h1:YHtHR+gxM+bKEIIs7Hmi9sPT3ZDUvTN/i88wQpZkrdM=
-
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
-
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
-
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
-
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-
github.com/perses/perses v0.50.3 h1:BHlU9qkCFCUSP4HP5p9GwophWcxm5Vnu6Fsrx8Fb/+w=
-
github.com/perses/perses v0.50.3/go.mod h1:oqfHLOrXERvEqECShqXPjHXqVukQxcoaaTM6ySRF7hU=
-
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
-
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
-
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
-
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
-
github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
-
github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
-
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
-
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
-
github.com/zitadel/oidc/v3 v3.36.1 h1:1AT1NqKKEqAwx4GmKJZ9fYkWH2WIn/VKMfQ46nBtRf0=
-
github.com/zitadel/oidc/v3 v3.36.1/go.mod h1:dApGZLvWZTHRuxmcbQlW5d2XVjVYR3vGOdq536igmTs=
-
github.com/zitadel/schema v1.3.0 h1:kQ9W9tvIwZICCKWcMvCEweXET1OcOyGEuFbHs4o5kg0=
-
github.com/zitadel/schema v1.3.0/go.mod h1:NptN6mkBDFvERUCvZHlvWmmME+gmZ44xzwRXwhzsbtc=
-
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
-
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
-
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
-
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
-
golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc=
-
golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
-
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
-
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
-
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
-
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
-
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
-
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
-
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
-
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
-
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-334
hosts/wolumonde/modules/perses.nix/dashboards/wolumonde.go
···
-
package main
-
-
import (
-
"flag"
-
"time"
-
-
"github.com/perses/perses/go-sdk"
-
"github.com/perses/perses/go-sdk/common"
-
dash "github.com/perses/perses/go-sdk/dashboard"
-
"github.com/perses/perses/go-sdk/panel"
-
panels "github.com/perses/perses/go-sdk/panel-group"
-
"github.com/perses/perses/go-sdk/panel/bar"
-
"github.com/perses/perses/go-sdk/panel/gauge"
-
"github.com/perses/perses/go-sdk/panel/stat"
-
"github.com/perses/perses/go-sdk/prometheus/query"
-
-
timeSeries "github.com/perses/perses/go-sdk/panel/time-series"
-
// promDs "github.com/perses/perses/go-sdk/prometheus/datasource"
-
)
-
-
func main() {
-
flag.Parse()
-
exec := sdk.NewExec()
-
-
var loadPanel = panels.AddPanel("load over 5 min",
-
timeSeries.Chart(
-
timeSeries.WithYAxis(
-
timeSeries.YAxis{
-
Max: 2.0,
-
},
-
),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
"node_load5",
-
query.SeriesNameFormat("load"),
-
),
-
),
-
)
-
var cpuPanel = panels.AddPanel("cpu usage",
-
timeSeries.Chart(
-
timeSeries.WithYAxis(
-
timeSeries.YAxis{
-
Format: &common.Format{
-
Unit: "percent",
-
},
-
Max: 100.0,
-
},
-
),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
`sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100`,
-
query.SeriesNameFormat("cpu {{cpu}}"),
-
),
-
),
-
)
-
var memoryPanel = panels.AddPanel("memory usage",
-
timeSeries.Chart(
-
timeSeries.WithYAxis(
-
timeSeries.YAxis{
-
Format: &common.Format{
-
Unit: "bytes",
-
},
-
Max: 4000000000,
-
},
-
),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
"node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes",
-
query.SeriesNameFormat("current memory usage"),
-
),
-
),
-
)
-
-
var diskPanel = panels.AddPanel("disk usage /",
-
timeSeries.Chart(
-
timeSeries.WithYAxis(
-
timeSeries.YAxis{
-
Format: &common.Format{
-
Unit: "bytes",
-
},
-
Max: 38000000000,
-
},
-
),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
`node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}`,
-
query.SeriesNameFormat("disk usage"),
-
),
-
),
-
)
-
-
// Gauge versions (percent unit)
-
var loadGaugePanel = panels.AddPanel("load over 5 min",
-
gauge.Chart(
-
gauge.Format(common.Format{Unit: "percent"}),
-
gauge.Max(100),
-
gauge.Calculation(common.MeanCalculation),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
"node_load5 * 100 / count(count(node_cpu_seconds_total) by (cpu))",
-
query.SeriesNameFormat("load %"),
-
),
-
),
-
)
-
var cpuGaugePanel = panels.AddPanel("cpu usage",
-
gauge.Chart(
-
gauge.Format(common.Format{Unit: "percent"}),
-
gauge.Max(100),
-
gauge.Calculation(common.MeanCalculation),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
`sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100`,
-
query.SeriesNameFormat("cpu {{cpu}}"),
-
),
-
),
-
)
-
var memoryGaugePanel = panels.AddPanel("memory usage",
-
gauge.Chart(
-
gauge.Format(common.Format{Unit: "percent"}),
-
gauge.Max(100),
-
gauge.Calculation(common.MeanCalculation),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
"(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) * 100 / node_memory_MemTotal_bytes",
-
query.SeriesNameFormat("memory usage %"),
-
),
-
),
-
)
-
var diskGaugePanel = panels.AddPanel("disk usage /",
-
gauge.Chart(
-
gauge.Format(common.Format{Unit: "percent"}),
-
gauge.Max(100),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
`(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) * 100 / node_filesystem_size_bytes{mountpoint="/"}`,
-
query.SeriesNameFormat("disk usage %"),
-
),
-
),
-
)
-
-
var resPanels = dash.AddPanelGroup("resource usage",
-
panels.PanelsPerLine(4),
-
loadGaugePanel, cpuGaugePanel, memoryGaugePanel, diskGaugePanel,
-
loadPanel, cpuPanel, memoryPanel, diskPanel,
-
)
-
-
var nginxPanel = panels.AddPanel("nginx requests / min",
-
timeSeries.Chart(
-
timeSeries.WithYAxis(
-
timeSeries.YAxis{
-
Format: &common.Format{
-
Unit: "decimal",
-
},
-
},
-
),
-
timeSeries.WithVisual(timeSeries.Visual{
-
Display: timeSeries.BarDisplay,
-
Palette: timeSeries.Palette{
-
Mode: timeSeries.CategoricalMode,
-
},
-
Stack: timeSeries.AllStack,
-
}),
-
timeSeries.WithLegend(timeSeries.Legend{
-
Position: timeSeries.BottomPosition,
-
Size: timeSeries.SmallSize,
-
}),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
"nginx_request_count",
-
query.SeriesNameFormat("{{res.statusCode}}"),
-
),
-
),
-
)
-
-
var nginxLatencyPanel = panels.AddPanel("nginx latency / min",
-
timeSeries.Chart(
-
timeSeries.WithYAxis(
-
timeSeries.YAxis{
-
Format: &common.Format{
-
Unit: "seconds",
-
},
-
Max: 0.5,
-
},
-
),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
"nginx_request_latency",
-
query.SeriesNameFormat("{{stats_result}}"),
-
),
-
),
-
)
-
-
var nginxPanels = dash.AddPanelGroup("nginx metrics",
-
panels.PanelsPerLine(3),
-
nginxPanel,
-
nginxLatencyPanel,
-
)
-
-
var pdsPanel = panels.AddPanel("pds requests / min",
-
timeSeries.Chart(
-
timeSeries.WithYAxis(
-
timeSeries.YAxis{
-
Format: &common.Format{
-
Unit: "decimal",
-
},
-
},
-
),
-
timeSeries.WithVisual(timeSeries.Visual{
-
Display: timeSeries.BarDisplay,
-
Palette: timeSeries.Palette{
-
Mode: timeSeries.CategoricalMode,
-
},
-
Stack: timeSeries.AllStack,
-
}),
-
timeSeries.WithLegend(timeSeries.Legend{
-
Position: timeSeries.BottomPosition,
-
Size: timeSeries.SmallSize,
-
}),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
"pds_request_count",
-
query.SeriesNameFormat("{{res.statusCode}}"),
-
),
-
),
-
)
-
-
var pdsLatencyPanel = panels.AddPanel("pds latency / min",
-
timeSeries.Chart(
-
timeSeries.WithYAxis(
-
timeSeries.YAxis{
-
Format: &common.Format{
-
Unit: "milliseconds",
-
},
-
Max: 500,
-
},
-
),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
"pds_response_latency",
-
query.SeriesNameFormat("{{stats_result}}"),
-
),
-
),
-
)
-
-
var pdsPanels = dash.AddPanelGroup("pds metrics",
-
panels.PanelsPerLine(3),
-
pdsPanel,
-
pdsLatencyPanel,
-
)
-
-
var anubisForgejoPanel = panels.AddPanel("anubis policy actions",
-
bar.Chart(),
-
panel.AddQuery(
-
query.PromQL(
-
"anubis_policy_results",
-
query.SeriesNameFormat("{{action}}: {{rule}}"),
-
),
-
),
-
)
-
-
var forgejoPanels = dash.AddPanelGroup("forgejo",
-
panels.PanelsPerLine(3),
-
anubisForgejoPanel,
-
)
-
-
var gazesys_visit_panel = panels.AddPanel("gazesys visits",
-
bar.Chart(),
-
panel.AddQuery(
-
query.PromQL(
-
"gazesys_visit_real_total + gazesys_visit_fake_total",
-
query.SeriesNameFormat("total visits"),
-
),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
"gazesys_visit_fake_total",
-
query.SeriesNameFormat("(ai) bot visits"),
-
),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
"gazesys_visit_real_total",
-
query.SeriesNameFormat("real visits"),
-
),
-
),
-
)
-
-
var gazesys_pet_panel = panels.AddPanel("gazesys pet",
-
stat.Chart(
-
stat.Format(common.Format{
-
Unit: "decimal",
-
ShortValues: true,
-
DecimalPlaces: 0,
-
}),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
"gazesys_pet_bounce_total",
-
query.SeriesNameFormat("bounce count"),
-
),
-
),
-
panel.AddQuery(
-
query.PromQL(
-
"gazesys_pet_distance_total",
-
query.SeriesNameFormat("distance travelled"),
-
),
-
),
-
)
-
-
var gazesys_panels = dash.AddPanelGroup("gazesys",
-
panels.PanelsPerLine(3),
-
gazesys_visit_panel, gazesys_pet_panel,
-
)
-
-
builder, buildErr := dash.New("wolumonde",
-
dash.ProjectName("private-infra"),
-
dash.Duration(30*time.Minute),
-
dash.RefreshInterval(time.Minute),
-
resPanels, nginxPanels, pdsPanels, gazesys_panels, forgejoPanels,
-
)
-
exec.BuildDashboard(builder, buildErr)
-
}
-101
hosts/wolumonde/modules/perses.nix/default.nix
···
-
{
-
pkgs,
-
config,
-
...
-
}:
-
let
-
domain = "dash.gaze.systems";
-
port = 7412;
-
user = "perses";
-
-
provisionFolder = "provisioning";
-
provisioningFolder = "${config.users.users.${user}.home}/${provisionFolder}";
-
-
persesConfig = {
-
database.file = {
-
folder = config.users.users.${user}.home;
-
extension = "json";
-
};
-
provisioning.folders = [ provisioningFolder ];
-
security = {
-
enable_auth = true;
-
authentication = {
-
providers = {
-
enable_native = false;
-
oidc = [
-
{
-
slug_id = "pocketid";
-
name = "Pocket ID";
-
client_id = "aa583db6-e03c-4490-853a-7f2b3e089fbe";
-
issuer = config.services.pocket-id.settings.APP_URL;
-
scopes = [ "openid profile email" ];
-
}
-
];
-
};
-
disable_sign_up = false;
-
};
-
cookie = {
-
same_site = "strict";
-
secure = true;
-
};
-
};
-
};
-
persesConfigYaml = pkgs.writers.writeYAML "config.yaml" persesConfig;
-
-
secrets = config.age.secrets;
-
in
-
{
-
environment.systemPackages = [ pkgs.perses ];
-
-
users.users.${user} = {
-
isNormalUser = true;
-
group = user;
-
home = "/var/lib/${user}";
-
createHome = true;
-
uid = 1001;
-
};
-
users.groups.${user} = {
-
gid = 976;
-
};
-
-
age.secrets.persesSecret = {
-
file = ../../../../secrets/persesSecret.age;
-
owner = user;
-
group = user;
-
};
-
-
systemd.services.perses = {
-
description = "perses";
-
after = ["network.target" "pocket-id.service"];
-
requires = ["pocket-id.service"];
-
serviceConfig = {
-
ExecStart = "${pkgs.perses}/bin/perses --config=${persesConfigYaml} --web.listen-address=:${toString port} --log.level=info";
-
EnvironmentFile = secrets.persesSecret.path;
-
WorkingDirectory = config.users.users.${user}.home;
-
};
-
};
-
systemd.services.perses.preStart = ''
-
rm -rf ${provisioningFolder} && mkdir -p ${provisioningFolder}
-
cp -f ${./provision}/* ${provisioningFolder}
-
'';
-
-
security.acme.certs."gaze.systems".extraDomainNames = [domain];
-
services.nginx.virtualHosts.${domain} = {
-
useACMEHost = "gaze.systems"; # TODO: write a module to define vhosts for subdomains
-
quic = true;
-
kTLS = true;
-
forceSSL = true;
-
locations."/" = {
-
proxyPass = "http://localhost:${toString port}";
-
};
-
};
-
-
# scrape perses metrics
-
services.victoriametrics.prometheusConfig.scrape_configs = [
-
{
-
job_name = "perses";
-
metrics_path = "/metrics";
-
static_configs = [ { targets = [ "localhost:${toString port}" ]; } ];
-
}
-
];
-
}
-3
hosts/wolumonde/modules/perses.nix/provision/1-private-infra.yaml
···
-
kind: Project
-
metadata:
-
name: private-infra
-9
hosts/wolumonde/modules/perses.nix/provision/2-admin-role.yaml
···
-
- kind: GlobalRole
-
metadata:
-
name: admin
-
spec:
-
permissions:
-
- actions:
-
- '*'
-
scopes:
-
- '*'
-8
hosts/wolumonde/modules/perses.nix/provision/3-admin-bind-role.yaml
···
-
- kind: GlobalRoleBinding
-
metadata:
-
name: admin
-
spec:
-
role: admin
-
subjects:
-
- kind: User
-
name: 90008
-12
hosts/wolumonde/modules/perses.nix/provision/4-victoria.yaml
···
-
- kind: GlobalDatasource
-
metadata:
-
name: victoria
-
spec:
-
default: true
-
plugin:
-
kind: PrometheusDatasource
-
spec:
-
proxy:
-
kind: HTTPProxy
-
spec:
-
url: http://localhost:8428
-12
hosts/wolumonde/modules/perses.nix/provision/6-guest-role.yaml
···
-
- kind: GlobalRole
-
metadata:
-
name: guest
-
spec:
-
permissions:
-
- actions:
-
- 'read'
-
scopes:
-
- 'Dashboard'
-
- 'Project'
-
- 'Datasource'
-
- 'GlobalDatasource'
-8
hosts/wolumonde/modules/perses.nix/provision/7-guest-role-bind.yaml
···
-
- kind: GlobalRoleBinding
-
metadata:
-
name: guest
-
spec:
-
role: guest
-
subjects:
-
- kind: User
-
name: sorryu02
-454
hosts/wolumonde/modules/perses.nix/provision/90-wolumonde.yaml
···
-
kind: Dashboard
-
metadata:
-
name: wolumonde
-
createdAt: 0001-01-01T00:00:00Z
-
updatedAt: 0001-01-01T00:00:00Z
-
version: 0
-
project: private-infra
-
spec:
-
panels:
-
"0_0":
-
kind: Panel
-
spec:
-
display:
-
name: load over 5 min
-
plugin:
-
kind: GaugeChart
-
spec:
-
calculation: mean
-
format:
-
unit: percent
-
max: 100
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: node_load5 * 100 / count(count(node_cpu_seconds_total) by (cpu))
-
seriesNameFormat: load %
-
"0_1":
-
kind: Panel
-
spec:
-
display:
-
name: cpu usage
-
plugin:
-
kind: GaugeChart
-
spec:
-
calculation: mean
-
format:
-
unit: percent
-
max: 100
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100
-
seriesNameFormat: cpu {{cpu}}
-
"0_2":
-
kind: Panel
-
spec:
-
display:
-
name: memory usage
-
plugin:
-
kind: GaugeChart
-
spec:
-
calculation: mean
-
format:
-
unit: percent
-
max: 100
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) * 100 / node_memory_MemTotal_bytes
-
seriesNameFormat: memory usage %
-
"0_3":
-
kind: Panel
-
spec:
-
display:
-
name: disk usage /
-
plugin:
-
kind: GaugeChart
-
spec:
-
calculation: last
-
format:
-
unit: percent
-
max: 100
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: (node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) * 100 / node_filesystem_size_bytes{mountpoint="/"}
-
seriesNameFormat: disk usage %
-
"0_4":
-
kind: Panel
-
spec:
-
display:
-
name: load over 5 min
-
plugin:
-
kind: TimeSeriesChart
-
spec:
-
yAxis:
-
max: 2
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: node_load5
-
seriesNameFormat: load
-
"0_5":
-
kind: Panel
-
spec:
-
display:
-
name: cpu usage
-
plugin:
-
kind: TimeSeriesChart
-
spec:
-
yAxis:
-
format:
-
unit: percent
-
max: 100
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: sum by (cpu) (rate(node_cpu_seconds_total{mode=~"user|system"}[1m])) * 100
-
seriesNameFormat: cpu {{cpu}}
-
"0_6":
-
kind: Panel
-
spec:
-
display:
-
name: memory usage
-
plugin:
-
kind: TimeSeriesChart
-
spec:
-
yAxis:
-
format:
-
unit: bytes
-
max: 4e+09
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes
-
seriesNameFormat: current memory usage
-
"0_7":
-
kind: Panel
-
spec:
-
display:
-
name: disk usage /
-
plugin:
-
kind: TimeSeriesChart
-
spec:
-
yAxis:
-
format:
-
unit: bytes
-
max: 3.8e+10
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}
-
seriesNameFormat: disk usage
-
"1_0":
-
kind: Panel
-
spec:
-
display:
-
name: nginx requests / min
-
plugin:
-
kind: TimeSeriesChart
-
spec:
-
legend:
-
position: bottom
-
size: small
-
yAxis:
-
format:
-
unit: decimal
-
visual:
-
display: bar
-
palette:
-
mode: categorical
-
stack: all
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: nginx_request_count
-
seriesNameFormat: '{{res.statusCode}}'
-
"1_1":
-
kind: Panel
-
spec:
-
display:
-
name: nginx latency / min
-
plugin:
-
kind: TimeSeriesChart
-
spec:
-
yAxis:
-
format:
-
unit: seconds
-
max: 0.5
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: nginx_request_latency
-
seriesNameFormat: '{{stats_result}}'
-
"2_0":
-
kind: Panel
-
spec:
-
display:
-
name: pds requests / min
-
plugin:
-
kind: TimeSeriesChart
-
spec:
-
legend:
-
position: bottom
-
size: small
-
yAxis:
-
format:
-
unit: decimal
-
visual:
-
display: bar
-
palette:
-
mode: categorical
-
stack: all
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: pds_request_count
-
seriesNameFormat: '{{res.statusCode}}'
-
"2_1":
-
kind: Panel
-
spec:
-
display:
-
name: pds latency / min
-
plugin:
-
kind: TimeSeriesChart
-
spec:
-
yAxis:
-
format:
-
unit: milliseconds
-
max: 500
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: pds_response_latency
-
seriesNameFormat: '{{stats_result}}'
-
"3_0":
-
kind: Panel
-
spec:
-
display:
-
name: gazesys visits
-
plugin:
-
kind: BarChart
-
spec:
-
calculation: last
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: gazesys_visit_real_total + gazesys_visit_fake_total
-
seriesNameFormat: total visits
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: gazesys_visit_fake_total
-
seriesNameFormat: (ai) bot visits
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: gazesys_visit_real_total
-
seriesNameFormat: real visits
-
"3_1":
-
kind: Panel
-
spec:
-
display:
-
name: gazesys pet
-
plugin:
-
kind: StatChart
-
spec:
-
calculation: last
-
format:
-
unit: decimal
-
shortValues: true
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: gazesys_pet_bounce_total
-
seriesNameFormat: bounce count
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: gazesys_pet_distance_total
-
seriesNameFormat: distance travelled
-
"4_0":
-
kind: Panel
-
spec:
-
display:
-
name: anubis policy actions
-
plugin:
-
kind: BarChart
-
spec:
-
calculation: last
-
queries:
-
- kind: TimeSeriesQuery
-
spec:
-
plugin:
-
kind: PrometheusTimeSeriesQuery
-
spec:
-
query: anubis_policy_results
-
seriesNameFormat: '{{action}}: {{rule}}'
-
layouts:
-
- kind: Grid
-
spec:
-
display:
-
title: resource usage
-
items:
-
- x: 0
-
"y": 0
-
width: 6
-
height: 6
-
content:
-
$ref: '#/spec/panels/0_0'
-
- x: 6
-
"y": 0
-
width: 6
-
height: 6
-
content:
-
$ref: '#/spec/panels/0_1'
-
- x: 12
-
"y": 0
-
width: 6
-
height: 6
-
content:
-
$ref: '#/spec/panels/0_2'
-
- x: 18
-
"y": 0
-
width: 6
-
height: 6
-
content:
-
$ref: '#/spec/panels/0_3'
-
- x: 0
-
"y": 6
-
width: 6
-
height: 6
-
content:
-
$ref: '#/spec/panels/0_4'
-
- x: 6
-
"y": 6
-
width: 6
-
height: 6
-
content:
-
$ref: '#/spec/panels/0_5'
-
- x: 12
-
"y": 6
-
width: 6
-
height: 6
-
content:
-
$ref: '#/spec/panels/0_6'
-
- x: 18
-
"y": 6
-
width: 6
-
height: 6
-
content:
-
$ref: '#/spec/panels/0_7'
-
- kind: Grid
-
spec:
-
display:
-
title: nginx metrics
-
items:
-
- x: 0
-
"y": 0
-
width: 8
-
height: 6
-
content:
-
$ref: '#/spec/panels/1_0'
-
- x: 8
-
"y": 0
-
width: 8
-
height: 6
-
content:
-
$ref: '#/spec/panels/1_1'
-
- kind: Grid
-
spec:
-
display:
-
title: pds metrics
-
items:
-
- x: 0
-
"y": 0
-
width: 8
-
height: 6
-
content:
-
$ref: '#/spec/panels/2_0'
-
- x: 8
-
"y": 0
-
width: 8
-
height: 6
-
content:
-
$ref: '#/spec/panels/2_1'
-
- kind: Grid
-
spec:
-
display:
-
title: gazesys
-
items:
-
- x: 0
-
"y": 0
-
width: 8
-
height: 6
-
content:
-
$ref: '#/spec/panels/3_0'
-
- x: 8
-
"y": 0
-
width: 8
-
height: 6
-
content:
-
$ref: '#/spec/panels/3_1'
-
- kind: Grid
-
spec:
-
display:
-
title: forgejo
-
items:
-
- x: 0
-
"y": 0
-
width: 8
-
height: 6
-
content:
-
$ref: '#/spec/panels/4_0'
-
duration: 30m
-
refreshInterval: 1m
+30
hosts/wolumonde/modules/pocket-id.disabled
···
+
{ config, ... }:
+
let
+
domain = "id.gaze.systems";
+
in
+
{
+
services.pocket-id = {
+
enable = true;
+
settings = {
+
APP_URL = "https://${domain}";
+
TRUST_PROXY = true;
+
PORT = 6823;
+
ANALYTICS_DISABLED = true;
+
};
+
};
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ domain ];
+
+
services.nginx.virtualHosts.${domain} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/".proxyPass = "http://localhost:${toString config.services.pocket-id.settings.PORT}";
+
locations."/".extraConfig = ''
+
proxy_busy_buffers_size 512k;
+
proxy_buffers 4 512k;
+
proxy_buffer_size 256k;
+
'';
+
};
+
}
-30
hosts/wolumonde/modules/pocket-id.nix
···
-
{ config, ... }:
-
let
-
domain = "id.gaze.systems";
-
in
-
{
-
services.pocket-id = {
-
enable = true;
-
settings = {
-
APP_URL = "https://${domain}";
-
TRUST_PROXY = true;
-
PORT = 6823;
-
ANALYTICS_DISABLED = true;
-
};
-
};
-
-
security.acme.certs."gaze.systems".extraDomainNames = [domain];
-
-
services.nginx.virtualHosts.${domain} = {
-
useACMEHost = "gaze.systems";
-
forceSSL = true;
-
quic = true;
-
kTLS = true;
-
locations."/".proxyPass = "http://localhost:${toString config.services.pocket-id.settings.PORT}";
-
locations."/".extraConfig = ''
-
proxy_busy_buffers_size 512k;
-
proxy_buffers 4 512k;
-
proxy_buffer_size 256k;
-
'';
-
};
-
}
+1 -2
hosts/wolumonde/modules/secrets.nix
···
{ lib, ... }:
{
-
age.secrets.bernbotToken.file = ../../../secrets/bernbotToken.age;
-
age.secrets.websiteConfig.file = ../../../secrets/websiteConfig.age;
+
# age.secrets.bernbotToken.file = ../../../secrets/bernbotToken.age;
age.secrets.pdsConfig.file = ../../../secrets/pdsConfig.age;
# age.secrets.wgWolumondeKey = {
# file = ../../../secrets/wgWolumondeKey.age;
-4
hosts/wolumonde/modules/ssh.nix
···
-
{ inputs, ... }:
{
services.fail2ban.enable = true;
services.openssh = {
enable = true;
settings.PasswordAuthentication = false;
};
-
users.users.root.openssh.authorizedKeys.keys = [
-
(builtins.readFile "${inputs.self}/secrets/yusdacra.key.pub")
-
];
networking.firewall.public."ssh".allowedTCPPorts = [ 22 ];
}
+3 -7
hosts/wolumonde/modules/tailscale.nix
···
{ config, ... }:
{
-
age.secrets.tailscaleAuthKey.file = ../../../secrets/tailscaleAuthKey.age;
+
imports = [ ../../../modules/network/tailscale.nix ];
+
# age.secrets.tailscaleAuthKey.file = ../../../secrets/tailscaleAuthKey.age;
+
# services.tailscale.authKeyFile = config.age.secrets.tailscaleAuthKey.path;
services.tailscale = {
-
enable = true;
-
port = 41641;
extraSetFlags = [ "--advertise-exit-node" ];
-
extraUpFlags = [ "--ssh" ];
-
extraDaemonFlags = [ "--no-logs-no-support" ];
useRoutingFeatures = "both";
-
authKeyFile = config.age.secrets.tailscaleAuthKey.path;
-
openFirewall = true;
};
networking.firewall.public.tailscale.allowedUDPPorts = [
+6
hosts/wolumonde/modules/tangled.disabled/default.nix
···
+
{
+
imports = [
+
./knot.nix
+
./spindle.nix
+
];
+
}
+39
hosts/wolumonde/modules/tangled.disabled/knot.nix
···
+
{
+
config,
+
inputs,
+
terra,
+
...
+
}:
+
let
+
knotCfg = config.services.tangled.knot;
+
in
+
{
+
imports = [
+
"${inputs.tangled}/nix/modules/knot.nix"
+
];
+
+
services.tangled.knot = {
+
enable = true;
+
package = terra.tangled-knot;
+
gitUser = "git";
+
motdFile = ./motd;
+
server = {
+
listenAddr = "0.0.0.0:7777";
+
hostname = "knot.gaze.systems";
+
owner = "did:plc:dfl62fgb7wtjj3fcbb72naae";
+
};
+
};
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ knotCfg.server.hostname ];
+
+
services.nginx.virtualHosts.${knotCfg.server.hostname} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/" = {
+
proxyPass = "http://${knotCfg.server.listenAddr}";
+
proxyWebsockets = true;
+
};
+
};
+
}
+5
hosts/wolumonde/modules/tangled.disabled/motd
···
+
+
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+
┃ *paws at your commits* arf :3c ┃
+
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+
+64
hosts/wolumonde/modules/tangled.disabled/spindle.nix
···
+
{
+
lib,
+
config,
+
inputs,
+
terra,
+
...
+
}:
+
let
+
spindleCfg = config.services.tangled.spindle;
+
in
+
{
+
imports = [
+
"${inputs.tangled}/nix/modules/spindle.nix"
+
];
+
+
services.tangled.spindle = {
+
enable = true;
+
package = terra.tangled-spindle;
+
server = {
+
listenAddr = "0.0.0.0:7391";
+
hostname = "spindle.gaze.systems";
+
owner = "did:plc:dfl62fgb7wtjj3fcbb72naae";
+
# secrets = {
+
# provider = "openbao";
+
# openbao.proxyAddr = "http://spindle.bao.lan.gaze.systems";
+
# };
+
secrets.provider = "sqlite";
+
};
+
};
+
users.users.spindle = {
+
group = "spindle";
+
isSystemUser = true;
+
};
+
users.groups.spindle = { };
+
users.groups.podman.members = [ "spindle" ];
+
systemd.services.spindle = {
+
# after = lib.mkForce [ "network.target" "openbao-proxy-spindle.service" ];
+
serviceConfig = {
+
User = "spindle";
+
Group = "spindle";
+
};
+
};
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ spindleCfg.server.hostname ];
+
+
services.nginx.virtualHosts.${spindleCfg.server.hostname} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
quic = true;
+
kTLS = true;
+
locations."/" = {
+
proxyPass = "http://${spindleCfg.server.listenAddr}";
+
proxyWebsockets = true;
+
};
+
};
+
+
virtualisation.docker.enable = lib.mkForce false;
+
virtualisation.podman = {
+
enable = true;
+
autoPrune.enable = true;
+
dockerCompat = true;
+
dockerSocket.enable = true;
+
};
+
}
-3
hosts/wolumonde/modules/tangled.nix/default.nix
···
-
{
-
imports = [./knot.nix ./spindle.nix];
-
}
-39
hosts/wolumonde/modules/tangled.nix/knot.nix
···
-
{
-
config,
-
inputs,
-
terra,
-
...
-
}:
-
let
-
knotCfg = config.services.tangled-knot;
-
in
-
{
-
imports = [
-
"${inputs.tangled}/nix/modules/knot.nix"
-
];
-
-
services.tangled-knot = {
-
enable = true;
-
package = terra.tangled-knot;
-
gitUser = "git";
-
motdFile = ./motd;
-
server = {
-
listenAddr = "0.0.0.0:7777";
-
hostname = "knot.gaze.systems";
-
owner = "did:plc:dfl62fgb7wtjj3fcbb72naae";
-
};
-
};
-
-
security.acme.certs."gaze.systems".extraDomainNames = [knotCfg.server.hostname];
-
-
services.nginx.virtualHosts.${knotCfg.server.hostname} = {
-
useACMEHost = "gaze.systems";
-
forceSSL = true;
-
quic = true;
-
kTLS = true;
-
locations."/" = {
-
proxyPass = "http://${knotCfg.server.listenAddr}";
-
proxyWebsockets = true;
-
};
-
};
-
}
-5
hosts/wolumonde/modules/tangled.nix/motd
···
-
-
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-
┃ *paws at your commits* arf :3c ┃
-
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-
-63
hosts/wolumonde/modules/tangled.nix/spindle.nix
···
-
{
-
lib,
-
config,
-
inputs,
-
terra,
-
...
-
}:
-
let
-
spindleCfg = config.services.tangled-spindle;
-
in
-
{
-
imports = [
-
"${inputs.tangled}/nix/modules/spindle.nix"
-
];
-
-
services.tangled-spindle = {
-
enable = true;
-
package = terra.tangled-spindle;
-
server = {
-
listenAddr = "0.0.0.0:7391";
-
hostname = "spindle.gaze.systems";
-
owner = "did:plc:dfl62fgb7wtjj3fcbb72naae";
-
secrets = {
-
provider = "openbao";
-
openbao.proxyAddr = "http://spindle.bao.lan.gaze.systems";
-
};
-
};
-
};
-
users.users.spindle = {
-
group = "spindle";
-
isSystemUser = true;
-
};
-
users.groups.spindle = { };
-
users.groups.podman.members = [ "spindle" ];
-
systemd.services.spindle = {
-
after = lib.mkForce [ "network.target" "openbao-proxy-spindle.service" ];
-
serviceConfig = {
-
User = "spindle";
-
Group = "spindle";
-
};
-
};
-
-
security.acme.certs."gaze.systems".extraDomainNames = [spindleCfg.server.hostname];
-
-
services.nginx.virtualHosts.${spindleCfg.server.hostname} = {
-
useACMEHost = "gaze.systems";
-
forceSSL = true;
-
quic = true;
-
kTLS = true;
-
locations."/" = {
-
proxyPass = "http://${spindleCfg.server.listenAddr}";
-
proxyWebsockets = true;
-
};
-
};
-
-
virtualisation.docker.enable = lib.mkForce false;
-
virtualisation.podman = {
-
enable = true;
-
autoPrune.enable = true;
-
dockerCompat = true;
-
dockerSocket.enable = true;
-
};
-
}
+55
hosts/wolumonde/modules/unbound.disabled
···
+
{ config, lib, ... }:
+
let
+
cfg = config.services.unbound.settings;
+
in
+
{
+
services.unbound = {
+
enable = true;
+
enableRootTrustAnchor = false;
+
resolveLocalQueries = false;
+
checkconf = lib.mkForce true;
+
settings = {
+
server = {
+
interface = [ "0.0.0.0" ];
+
port = 7272;
+
+
access-control = [
+
"0.0.0.0/0 refuse" # lets explicitly refuse any queries
+
"100.84.0.0/16 allow" # only allow queries from netbird
+
];
+
+
hide-identity = true;
+
hide-version = true;
+
harden-glue = true;
+
harden-referral-path = true;
+
use-caps-for-id = true;
+
+
ratelimit = 10;
+
ratelimit-slabs = 4;
+
ratelimit-size = "4m";
+
+
unwanted-reply-threshold = 10000;
+
do-not-query-localhost = true;
+
deny-any = true;
+
+
prefetch = true;
+
prefetch-key = true;
+
};
+
forward-zone = [
+
{
+
name = ".";
+
forward-addr = [
+
"1.1.1.1"
+
"1.0.0.1"
+
"9.9.9.9"
+
"8.8.8.8"
+
];
+
}
+
];
+
};
+
};
+
networking.firewall = {
+
allowedTCPPorts = [ cfg.server.port ];
+
allowedUDPPorts = [ cfg.server.port ];
+
};
+
}
-55
hosts/wolumonde/modules/unbound.nix
···
-
{ config, lib, ... }:
-
let
-
cfg = config.services.unbound.settings;
-
in
-
{
-
services.unbound = {
-
enable = true;
-
enableRootTrustAnchor = false;
-
resolveLocalQueries = false;
-
checkconf = lib.mkForce true;
-
settings = {
-
server = {
-
interface = [ "0.0.0.0" ];
-
port = 7272;
-
-
access-control = [
-
"0.0.0.0/0 refuse" # lets explicitly refuse any queries
-
"100.84.0.0/16 allow" # only allow queries from netbird
-
];
-
-
hide-identity = true;
-
hide-version = true;
-
harden-glue = true;
-
harden-referral-path = true;
-
use-caps-for-id = true;
-
-
ratelimit = 10;
-
ratelimit-slabs = 4;
-
ratelimit-size = "4m";
-
-
unwanted-reply-threshold = 10000;
-
do-not-query-localhost = true;
-
deny-any = true;
-
-
prefetch = true;
-
prefetch-key = true;
-
};
-
forward-zone = [
-
{
-
name = ".";
-
forward-addr = [
-
"1.1.1.1"
-
"1.0.0.1"
-
"9.9.9.9"
-
"8.8.8.8"
-
];
-
}
-
];
-
};
-
};
-
networking.firewall = {
-
allowedTCPPorts = [ cfg.server.port ];
-
allowedUDPPorts = [ cfg.server.port ];
-
};
-
}
+70
hosts/wolumonde/modules/victoria.disabled
···
+
{ lib, config, ... }:
+
let
+
# syslogUdp = 5113;
+
metricsPort = 8428;
+
logsPort = 9428;
+
in
+
{
+
services.victoriametrics = {
+
enable = true;
+
listenAddress = ":${toString metricsPort}";
+
};
+
+
services.victorialogs = {
+
enable = true;
+
listenAddress = ":${toString logsPort}";
+
# extraOptions = ["-syslog.listenAddr.udp=:${toString syslogUdp}" "-journald.maxRequestSize=1024000000"];
+
};
+
+
services.vmalert.instances."" = {
+
enable = true;
+
settings =
+
let
+
l = "http://localhost";
+
in
+
{
+
"datasource.url" = "${l}${config.services.victorialogs.listenAddress}";
+
"remoteWrite.url" = "${l}${config.services.victoriametrics.listenAddress}";
+
"remoteRead.url" = "${l}${config.services.victoriametrics.listenAddress}";
+
"rule.defaultRuleType" = "vlogs";
+
};
+
};
+
+
services.fluent-bit.settings.pipeline.outputs = [
+
# write metrics to victoriametrics via prometheus
+
{
+
name = "prometheus_remote_write";
+
match = "metrics.*";
+
port = lib.removePrefix ":" config.services.victoriametrics.listenAddress;
+
uri = "/api/v1/write";
+
}
+
{
+
name = "http";
+
match = "logs.*";
+
port = lib.removePrefix ":" config.services.victorialogs.listenAddress;
+
uri = "/insert/jsonline?_stream_fields=stream&_msg_field=log&_time_field=date";
+
format = "json_lines";
+
json_date_format = "iso8601";
+
}
+
# write logs via syslog
+
# {
+
# name = "syslog";
+
# match = "*.log";
+
# port = syslogUdp;
+
# syslog_maxsize = 4096;
+
# syslog_severity_key = "severity";
+
# syslog_facility_key = "facility";
+
# syslog_hostname_key = "hostname";
+
# syslog_appname_key = "appname";
+
# syslog_procid_key = "procid";
+
# syslog_msgid_key = "msgid";
+
# syslog_sd_key = "sd";
+
# syslog_message_key = "message";
+
# }
+
];
+
+
# services.journald.upload = {
+
# enable = true;
+
# settings.Upload.URL = "http://localhost${config.services.victorialogs.listenAddress}/insert/journald";
+
# };
+
}
-70
hosts/wolumonde/modules/victoria.nix
···
-
{ lib, config, ... }:
-
let
-
# syslogUdp = 5113;
-
metricsPort = 8428;
-
logsPort = 9428;
-
in
-
{
-
services.victoriametrics = {
-
enable = true;
-
listenAddress = ":${toString metricsPort}";
-
};
-
-
services.victorialogs = {
-
enable = true;
-
listenAddress = ":${toString logsPort}";
-
# extraOptions = ["-syslog.listenAddr.udp=:${toString syslogUdp}" "-journald.maxRequestSize=1024000000"];
-
};
-
-
services.vmalert.instances."" = {
-
enable = true;
-
settings =
-
let
-
l = "http://localhost";
-
in
-
{
-
"datasource.url" = "${l}${config.services.victorialogs.listenAddress}";
-
"remoteWrite.url" = "${l}${config.services.victoriametrics.listenAddress}";
-
"remoteRead.url" = "${l}${config.services.victoriametrics.listenAddress}";
-
"rule.defaultRuleType" = "vlogs";
-
};
-
};
-
-
services.fluent-bit.settings.pipeline.outputs = [
-
# write metrics to victoriametrics via prometheus
-
{
-
name = "prometheus_remote_write";
-
match = "metrics.*";
-
port = lib.removePrefix ":" config.services.victoriametrics.listenAddress;
-
uri = "/api/v1/write";
-
}
-
{
-
name = "http";
-
match = "logs.*";
-
port = lib.removePrefix ":" config.services.victorialogs.listenAddress;
-
uri = "/insert/jsonline?_stream_fields=stream&_msg_field=log&_time_field=date";
-
format = "json_lines";
-
json_date_format = "iso8601";
-
}
-
# write logs via syslog
-
# {
-
# name = "syslog";
-
# match = "*.log";
-
# port = syslogUdp;
-
# syslog_maxsize = 4096;
-
# syslog_severity_key = "severity";
-
# syslog_facility_key = "facility";
-
# syslog_hostname_key = "hostname";
-
# syslog_appname_key = "appname";
-
# syslog_procid_key = "procid";
-
# syslog_msgid_key = "msgid";
-
# syslog_sd_key = "sd";
-
# syslog_message_key = "message";
-
# }
-
];
-
-
# services.journald.upload = {
-
# enable = true;
-
# settings.Upload.URL = "http://localhost${config.services.victorialogs.listenAddress}/insert/journald";
-
# };
-
}
+31
hosts/wolumonde/modules/webhook.disabled/default.nix
···
+
{ config, tlib, ... }:
+
let
+
domain = "webhook.gaze.systems";
+
in
+
{
+
imports = tlib.importFolder ./.;
+
+
services.webhook = {
+
enable = true;
+
urlPrefix = "";
+
};
+
+
age.secrets.webhookAuth = {
+
file = ../../../../secrets/webhookAuth.age;
+
mode = "600";
+
owner = "nginx";
+
group = "nginx";
+
};
+
+
security.acme.certs."gaze.systems".extraDomainNames = [ domain ];
+
services.nginx.virtualHosts.${domain} = {
+
useACMEHost = "gaze.systems";
+
forceSSL = true;
+
kTLS = true;
+
quic = true;
+
basicAuthFile = config.age.secrets.webhookAuth.path;
+
locations."/" = {
+
proxyPass = "http://localhost:${toString config.services.webhook.port}";
+
};
+
};
+
}
+21
hosts/wolumonde/modules/webhook.disabled/deploy-wolumonde.nix
···
+
{ pkgs, ... }:
+
let
+
port = toString 9000;
+
in
+
{
+
services.webhook.hooks."deploy-wolumonde" = {
+
execute-command = "${pkgs.curl}/bin/curl";
+
pass-arguments-to-command = builtins.map (n: {
+
source = "string";
+
name = n;
+
}) [ "http://higashi:${port}/hooks/deploy-wolumonde" ];
+
};
+
+
services.headscale.acl.rules = [
+
{
+
proto = "tcp";
+
src = [ "wolumonde" ];
+
dst = [ "higashi:${port}" ];
+
}
+
];
+
}
-29
hosts/wolumonde/modules/webhook.nix/default.nix
···
-
{ config, tlib, ... }: let
-
domain = "webhook.gaze.systems";
-
in {
-
imports = tlib.importFolder ./.;
-
-
services.webhook = {
-
enable = true;
-
urlPrefix = "";
-
};
-
-
age.secrets.webhookAuth = {
-
file = ../../../../secrets/webhookAuth.age;
-
mode = "600";
-
owner = "nginx";
-
group = "nginx";
-
};
-
-
security.acme.certs."gaze.systems".extraDomainNames = [domain];
-
services.nginx.virtualHosts.${domain} = {
-
useACMEHost = "gaze.systems";
-
forceSSL = true;
-
kTLS = true;
-
quic = true;
-
basicAuthFile = config.age.secrets.webhookAuth.path;
-
locations."/" = {
-
proxyPass = "http://localhost:${toString config.services.webhook.port}";
-
};
-
};
-
}
-20
hosts/wolumonde/modules/webhook.nix/deploy-wolumonde.nix
···
-
{ pkgs, ... }: let
-
port = toString 9000;
-
in {
-
services.webhook.hooks."deploy-wolumonde" = {
-
execute-command = "${pkgs.curl}/bin/curl";
-
pass-arguments-to-command =
-
builtins.map
-
(n: {
-
source = "string";
-
name = n;
-
})
-
[ "http://higashi:${port}/hooks/deploy-wolumonde" ];
-
};
-
-
services.headscale.acl.rules = [{
-
proto = "tcp";
-
src = ["wolumonde"];
-
dst = ["higashi:${port}"];
-
}];
-
}
+85
hosts/wolumonde/modules/website.nix
···
+
{
+
config,
+
pkgs,
+
inputs,
+
...
+
}:
+
let
+
PUBLIC_BASE_URL = "https://gaze.systems";
+
modules = (pkgs.callPackage "${inputs.blog}/nix/modules.nix" { }).overrideAttrs (_: {
+
outputHash = "sha256-rzfSfiK8FSNFR+1QTwM/ltLZBprG9BoQsPmOt6IdXFc=";
+
});
+
pkg = pkgs.callPackage "${inputs.blog}/nix" {
+
inherit PUBLIC_BASE_URL;
+
gazesys-modules = modules;
+
};
+
port = 3003;
+
in
+
{
+
users.users.website = {
+
isSystemUser = true;
+
group = "website";
+
};
+
users.groups.website = { };
+
+
age.secrets.websiteConfig.file = ../../../secrets/websiteConfig.age;
+
+
systemd.services.website = {
+
description = "website";
+
wantedBy = [ "multi-user.target" ];
+
after = [ "network.target" ];
+
environment = {
+
HOME = "/var/lib/website";
+
ORIGIN = PUBLIC_BASE_URL;
+
PORT = toString port;
+
WEBSITE_DATA_DIR = "/var/lib/website";
+
VITE_CLOUDINARY_CLOUD_NAME = "dgtwf7mar";
+
};
+
serviceConfig = {
+
User = "website";
+
ExecStart = "${pkg}/bin/website";
+
Restart = "on-failure";
+
RestartSec = 5;
+
WorkingDirectory = "/var/lib/website";
+
EnvironmentFile = config.age.secrets.websiteConfig.path;
+
KillSignal = "SIGKILL";
+
};
+
};
+
+
# systemd.services.annoy-keep-alive = {
+
# description = "keeps annoy peer connection alive";
+
# wantedBy = [ "multi-user.target" ];
+
# after = [ "network.target" ];
+
# serviceConfig = {
+
# Type = "oneshot";
+
# ExecStart = "${pkgs.curl}/bin/curl http://100.64.0.1:3111/";
+
# };
+
# };
+
# systemd.timers.annoy-keep-alive.timerConfig = {
+
# OnBootSec = "5 min";
+
# OnUnitActiveSec = "5 min";
+
# Unit = "annoy-keep-alive.service";
+
# };
+
+
services.nginx.virtualHosts."gaze.systems" = {
+
locations."/".proxyPass = "http://localhost:${toString port}";
+
locations."/annoy/ws/" = {
+
proxyWebsockets = true;
+
proxyPass = "http://100.64.0.9:3111/";
+
extraConfig = ''
+
rewrite ^/annoy/ws/(.*) /$1 break;
+
'';
+
};
+
locations."/annoy/ws" = {
+
proxyWebsockets = true;
+
proxyPass = "http://100.64.0.9:3111/";
+
extraConfig = ''
+
rewrite ^/annoy/ws(.*) /$1 break;
+
'';
+
};
+
};
+
+
services.nginx.virtualHosts."poor.dog" = {
+
locations."/".return = "301 https://gaze.systems$request_uri";
+
};
+
}
+3
hosts/wsl/default.nix
···
}:
{
imports = [
+
../../modules
+
../../locale
+
"${inputs.home}/nixos"
../../users/root
../../users/firewatch
"${inputs.nixos-wsl}/modules"
+18
modules/audio/desktop-audio.nix
···
+
{
+
services.pipewire.extraConfig.pipewire = {
+
"10-virtual-sink" = {
+
"context.objects" = [
+
{
+
factory = "adapter";
+
args = {
+
"factory.name" = "support.null-audio-sink";
+
"node.name" = "virtual_sink";
+
"node.description" = "Virtual Sink for Recording";
+
"media.class" = "Audio/Sink";
+
"audio.position" = "FL,FR";
+
};
+
}
+
];
+
};
+
};
+
}
+12 -56
modules/base/default.nix
···
systemPackages = with pkgs; [
binutils
coreutils
+
dnsutils
+
moreutils
+
iputils
curl
direnv
-
dnsutils
-
dosfstools
fd
-
bottom
-
gptfdisk
-
iputils
-
jq
-
manix
-
moreutils
-
nix-index
nmap
ripgrep
-
skim
tealdeer
usbutils
util-linux
-
whois
-
bat
-
fzf
-
eza
-
lm_sensors
-
mkpasswd
bottom
-
amber
unzip
unrar
-
hydra-check
-
du-dust
-
mosh
git
-
git-crypt
];
shellAliases =
let
ifSudo = string: mkIf config.security.sudo.enable string;
-
inherit (pkgs)
-
git
-
bat
-
eza
-
du-dust
-
;
+
inherit (pkgs) dust;
in
{
-
g = pkgBin git;
-
git-optimize = "${pkgBin git} gc --aggressive --prune=now";
-
cat = "${pkgBin bat} -pp --theme=base16";
-
c = "cat";
-
du = "${pkgBin du-dust}";
+
g = pkgBin config.programs.git.package;
+
du = "${pkgBin dust}";
df = "${coreBin "df"} -h";
free = "${pkgs.procps}/bin/free -h";
-
ls = pkgBin eza;
-
l = "${pkgBin eza} -lhg";
-
la = "${pkgBin eza} -lhg -a";
-
t = "${pkgBin eza} -lhg -T";
-
ta = "${pkgBin eza} -lhg -a -T";
n = nixBin;
nb = "${nixBin} build";
nf = "${nixBin} flake";
···
nfui = "${nixBin} flake update";
nfs = "${nixBin} flake show";
nsh = "${nixBin} shell";
-
nix-store-refs = "nix-store -qR";
-
nosrs = ifSudo "sudo nixos-rebuild --fast switch";
-
nosrb = ifSudo "sudo nixos-rebuild --fast boot";
-
nosrt = ifSudo "sudo nixos-rebuild --fast test";
-
ngc = ifSudo "sudo nix-collect-garbage";
-
ngcdo = ifSudo "sudo nix-collect-garbage --delete-old";
top = "${pkgs.bottom}/bin/btm";
myip = "${pkgs.dnsutils}/bin/dig +short myip.opendns.com @208.67.222.222 2>&1";
-
mn =
-
let
-
manix_preview = "manix '{}' | sed 's/type: /> type: /g' | bat -l Markdown --color=always --plain";
-
in
-
''manix "" | rg '^# ' | sed 's/^# \(.*\) (.*/\1/;s/ (.*//;s/^# //' | sk --preview="${manix_preview}" | xargs manix'';
# systemd
ctl = "systemctl";
stl = ifSudo "s systemctl";
···
diff-closures /run/current-system "$systemConfig"
fi
'';
+
users.mutableUsers = false;
-
programs = {
-
command-not-found.enable = true;
-
git = {
-
enable = true;
-
config = {
-
safe.directory = [ "/etc/nixos" ];
-
};
-
};
+
+
programs.mosh = {
+
enable = true;
+
openFirewall = false;
};
+
programs.git.enable = true;
}
+2 -1
modules/base/hm-system-defaults.nix
···
config,
inputs,
tlib,
+
terra,
...
}:
{
···
)
];
home-manager.extraSpecialArgs = {
-
inherit inputs tlib;
+
inherit terra inputs tlib;
nixosConfig = config;
};
}
+2
modules/base/nix.nix
···
{
+
pkgs,
lib,
inputs,
...
}:
{
nix = {
+
package = pkgs.lixPackageSets.git.lix;
registry = builtins.mapAttrs (_: v: { flake = v; }) (lib.filterAttrs (_: v: v ? outputs) inputs);
gc.automatic = false;
optimise.automatic = true;
+9
modules/de/cosmic.nix
···
+
{ pkgs, ... }:
+
{
+
services.displayManager.cosmic-greeter.enable = true;
+
services.desktopManager.cosmic.enable = true;
+
environment.cosmic.excludePackages = with pkgs; [
+
cosmic-edit
+
cosmic-term
+
];
+
}
+1 -1
modules/network/dns/cloudflare.nix
···
{
networking.resolvconf.useLocalResolver = true;
networking.networkmanager.dns = lib.mkForce "none";
-
services.dnscrypt-proxy2 = {
+
services.dnscrypt-proxy = {
enable = true;
settings = {
server_names = [
+17
modules/network/dns/systemd.nix
···
+
{
+
networking.nameservers = [
+
"1.1.1.1"
+
"1.0.0.1"
+
];
+
+
services.resolved = {
+
enable = true;
+
dnssec = "true";
+
domains = [ "~." ];
+
fallbackDns = [
+
"1.1.1.1"
+
"1.0.0.1"
+
];
+
dnsovertls = "true";
+
};
+
}
-1
modules/network/ssh.nix
···
enable = true;
challengeResponseAuthentication = false;
passwordAuthentication = false;
-
forwardX11 = true;
};
}
+12
modules/network/tailscale.nix
···
+
{ lib, ... }:
+
{
+
services.tailscale = {
+
enable = true;
+
port = 41641;
+
# extraUpFlags = [ "--ssh" ];
+
extraDaemonFlags = [ "--no-logs-no-support" ];
+
openFirewall = true;
+
};
+
+
networking.interfaces.tailscale0.useDHCP = lib.mkForce false;
+
}
-7
modules/nushell/aliases.nu
···
-
alias l = ls
-
alias ll = ls -l
-
alias la = ls -a
-
-
alias cat = bat
-
alias c = bat
-
alias g = git
alias n = nix
+14 -9
modules/nushell/prompt.nu
···
wolumonde: {start: "0x603F26", end: "0x6C4E31"},
chernobog: {start: "0xA94438", end: "0xD24545"},
"sd-148036": {start: "0x595CFF", end: "0xC6F8FF"},
+
dzwonek: {start: "0x595CFF", end: "0xC6F8FF"},
+
volsinii: {start: "0x595CFF", end: "0xC6F8FF"},
+
trimounts: {start: "0x533A71", end: "0xFE5F55"},
}
let user_colors = {
kirara: {start: "0xFF407D", end: "0xEE99C2"},
root: {start: "0xC5172E", end: "0xBF3131"},
dusk: {start: "0x640D5F", end: "0xD91656"},
+
dawn: {start: "0x640D5F", end: "0xD91656"},
+
mayer: {start: "0x640D5F", end: "0xD91656"},
}
def create_left_prompt [] {
let hostname = sys host | get hostname
# str replace handles whoami output on windows
-
let username = ^whoami | str replace $"($hostname)\\" ""
+
let username = whoami | str replace $"($hostname)\\" ""
let c = $host_colors | get $hostname
let hostname_fmt = $hostname | ansi gradient --fgstart $c.start --fgend $c.end
···
let dir = match (do -i { $env.PWD | path relative-to $nu.home-path }) {
null => $env.PWD
'' => '~'
-
$relative_pwd => ([~ $relative_pwd] | path join)
+
$relative_pwd => ([~ $relative_pwd] | path join | path split | last 2 | path join)
}
-
let separator_color = ansi light_cyan
-
let string_color = ansi light_yellow
-
$"($separator_color)//($hostname_fmt)($separator_color)/($username_fmt)($separator_color)/($string_color)cwd=\"($dir)\""
+
let separator_color = ansi magenta
+
let string_color = ansi yellow
+
$"($separator_color)//($hostname_fmt)($separator_color)/($username_fmt)($separator_color)/($string_color)cwd=\"($dir)\"($separator_color)/\n"
}
def create_right_prompt [] {
···
# The prompt indicators are environmental variables that represent
# the state of the prompt
-
$env.PROMPT_INDICATOR = {|| "/ " }
-
$env.PROMPT_INDICATOR_VI_INSERT = {|| "/: " }
-
$env.PROMPT_INDICATOR_VI_NORMAL = {|| "/ " }
-
$env.PROMPT_MULTILINE_INDICATOR = {|| "/::: " }
+
$env.PROMPT_INDICATOR = {|| $"(ansi magenta)//" }
+
$env.PROMPT_INDICATOR_VI_INSERT = {|| "//:" }
+
$env.PROMPT_INDICATOR_VI_NORMAL = {|| "//" }
+
$env.PROMPT_MULTILINE_INDICATOR = {|| "//:::" }
+16
modules/stylix-null.nix
···
+
{lib, ...}:
+
let
+
options = {
+
stylix = lib.mkOption {
+
type = lib.types.raw;
+
};
+
};
+
in
+
{
+
inherit options;
+
config = {
+
home-manager.sharedModules = [{
+
inherit options;
+
}];
+
};
+
}
+40 -8
nvfetcher.toml
···
# nvfetcher configuration for Nix flake inputs
-
[lix-module]
-
src.manual = "2.93.3-1"
-
fetch.tarball = "https://git.lix.systems/lix-project/nixos-module/archive/2.93.3-1.tar.gz"
+
[facter]
+
src.git = "https://github.com/nix-community/nixos-facter-modules"
+
fetch.github = "nix-community/nixos-facter-modules"
-
[nixos-wsl]
-
src.git = "https://github.com/nix-community/NixOS-WSL"
-
fetch.github = "nix-community/NixOS-WSL"
+
[nixos-hardware]
+
src.git = "https://github.com/NixOS/nixos-hardware"
+
fetch.github = "NixOS/nixos-hardware"
+
+
[disko]
+
src.git = "https://github.com/nix-community/disko"
+
fetch.github = "nix-community/disko"
[home]
src.git = "https://github.com/nix-community/home-manager"
···
fetch.git = "https://tangled.org/@ptr.pet/nixos-cloud-resources"
[limbusart]
-
src.git = "https://git.gaze.systems/90008/limbusart.git"
-
fetch.git = "https://git.gaze.systems/90008/limbusart.git"
+
src.git = "https://github.com/90-008/limbusart.git"
+
fetch.git = "https://github.com/90-008/limbusart.git"
[clickee-proxy]
src.git = "https://tangled.org/@ptr.pet/clickee-proxy"
···
src.git = "https://tangled.org/@ptr.pet/nsid-tracker"
fetch.git = "https://tangled.org/@ptr.pet/nsid-tracker"
+
[nucleus]
+
src.git = "https://tangled.org/@ptr.pet/nucleus"
+
fetch.git = "https://tangled.org/@ptr.pet/nucleus"
+
+
[trill]
+
src.git = "https://tangled.org/@ptr.pet/trill"
+
fetch.git = "https://tangled.org/@ptr.pet/trill"
+
+
## TANGLED ##
+
[tangled]
src.git = "https://tangled.org/@tangled.org/core"
fetch.git = "https://tangled.org/@tangled.org/core"
···
[gomod2nix]
src.git = "https://github.com/nix-community/gomod2nix"
fetch.github = "nix-community/gomod2nix"
+
+
## TANGLED ##
+
+
[moonlight]
+
src.git = "https://github.com/moonlight-mod/moonlight"
+
fetch.github = "moonlight-mod/moonlight"
+
+
[zen-browser]
+
src.git = "https://github.com/0xc000022070/zen-browser-flake"
+
fetch.github = "0xc000022070/zen-browser-flake"
+
+
[stylix]
+
src.git = "https://github.com/nix-community/stylix"
+
fetch.github = "nix-community/stylix"
+
+
[nixpkgs-xr]
+
src.git = "https://github.com/nix-community/nixpkgs-xr"
+
fetch.github = "nix-community/nixpkgs-xr"
+12 -13
pkgs-set/default.nix
···
;
};
inputs = (l.mapAttrs (_: inp: inp // { __toString = s: toString s.src; }) _inputs) // flakeInputs;
-
pkgs = _pkgs.appendOverlays (
-
l.flatten (
-
l.mapAttrsToList (
-
name: _:
-
if name != "disabled" then
-
let
-
o = import "${./overlays}/${name}";
-
in
-
if (l.functionArgs o) ? inputs then o { inherit inputs; } else o
-
else
-
[ ]
-
) (l.readDir ./overlays)
-
)
+
overlays = l.flatten (
+
l.mapAttrsToList (
+
name: _:
+
if name != "disabled" then
+
let
+
o = import "${./overlays}/${name}";
+
in
+
if (l.functionArgs o) ? inputs then o { inherit inputs; } else o
+
else
+
[ ]
+
) (l.readDir ./overlays)
);
+
pkgs = _pkgs.appendOverlays (overlays ++ [ flakeInputs.chaotic.overlays.cache-friendly ]);
terraPkgs = pkgs.lib.makeScope pkgs.newScope (
self:
l.genAttrs (l.map (l.removeSuffix ".nix") (l.attrNames (l.readDir ./pkgs))) (
+6
pkgs-set/overlays/navidrome.nix/default.nix
···
+
final: prev: {
+
navidrome = prev.navidrome.overrideAttrs (old: {
+
patches = (old.patches or []) ++ [./origin_url.patch];
+
doCheck = false;
+
});
+
}
+85
pkgs-set/overlays/navidrome.nix/origin_url.patch
···
+
diff --git a/core/agents/listenbrainz/agent.go b/core/agents/listenbrainz/agent.go
+
index 769b0f5..758eb85 100644
+
--- a/core/agents/listenbrainz/agent.go
+
+++ b/core/agents/listenbrainz/agent.go
+
@@ -3,6 +3,7 @@ package listenbrainz
+
import (
+
"context"
+
"errors"
+
+ "fmt"
+
"net/http"
+
+
"github.com/navidrome/navidrome/conf"
+
@@ -52,6 +53,10 @@ func (l *listenBrainzAgent) formatListen(track *model.MediaFile) listenInfo {
+
artistNames := slice.Map(track.Participants[model.RoleArtist], func(p model.Participant) string {
+
return p.Name
+
})
+
+ var originURL string
+
+ if v := track.Tags.Values(model.TagSource); len(v) > 0 {
+
+ originURL = v[0]
+
+ }
+
li := listenInfo{
+
TrackMetadata: trackMetadata{
+
ArtistName: track.Artist,
+
@@ -67,9 +72,12 @@ func (l *listenBrainzAgent) formatListen(track *model.MediaFile) listenInfo {
+
ReleaseMBID: track.MbzAlbumID,
+
ReleaseGroupMBID: track.MbzReleaseGroupID,
+
DurationMs: int(track.Duration * 1000),
+
+ OriginURL: originURL,
+
},
+
},
+
}
+
+ fmt.Printf("listen info: %+v\n", li)
+
+ fmt.Printf("track tags: %+v\n", track.Tags)
+
return li
+
}
+
+
diff --git a/core/agents/listenbrainz/agent_test.go b/core/agents/listenbrainz/agent_test.go
+
index e99b442..11e7b3c 100644
+
--- a/core/agents/listenbrainz/agent_test.go
+
+++ b/core/agents/listenbrainz/agent_test.go
+
@@ -69,6 +69,7 @@ var _ = Describe("listenBrainzAgent", func() {
+
"ArtistNames": ConsistOf("Artist 1", "Artist 2"),
+
"ArtistMBIDs": ConsistOf("mbz-111", "mbz-222"),
+
"DurationMs": Equal(142200),
+
+ "OriginURL": Ignore(),
+
}),
+
}),
+
}))
+
diff --git a/core/agents/listenbrainz/client.go b/core/agents/listenbrainz/client.go
+
index 168aad5..807bdef 100644
+
--- a/core/agents/listenbrainz/client.go
+
+++ b/core/agents/listenbrainz/client.go
+
@@ -82,6 +82,7 @@ type additionalInfo struct {
+
ReleaseMBID string `json:"release_mbid,omitempty"`
+
ReleaseGroupMBID string `json:"release_group_mbid,omitempty"`
+
DurationMs int `json:"duration_ms,omitempty"`
+
+ OriginURL string `json:"origin_url,omitempty"`
+
}
+
+
func (c *client) validateToken(ctx context.Context, apiKey string) (*listenBrainzResponse, error) {
+
diff --git a/model/tag.go b/model/tag.go
+
index 674f688..ecd1a12 100644
+
--- a/model/tag.go
+
+++ b/model/tag.go
+
@@ -194,6 +194,7 @@ const (
+
TagISRC TagName = "isrc"
+
TagBPM TagName = "bpm"
+
TagExplicitStatus TagName = "explicitstatus"
+
+ TagSource TagName = "source"
+
+
// Dates and years
+
+
diff --git a/resources/mappings.yaml b/resources/mappings.yaml
+
index d1da5c6..905ad01 100644
+
--- a/resources/mappings.yaml
+
+++ b/resources/mappings.yaml
+
@@ -251,6 +251,8 @@ additional:
+
aliases: [ txxx:script, script, ----:com.apple.itunes:script, wm/script ]
+
subtitle:
+
aliases: [ tit3, subtitle, ----:com.apple.itunes:subtitle, wm/subtitle ]
+
+ source:
+
+ aliases: [ source, woas, audio source, txxx:source, ----:com.apple.itunes:source ]
+
website:
+
aliases: [ woar, website, weblink, wm/authorurl ]
+
work:
+3
pkgs-set/overlays/nixpkgs-xr.nix
···
+
{inputs, ...}: final: prev:
+
((import inputs.nixpkgs-xr).overlays.default final prev)
+
// { wivrn = prev.wivrn; }
+49
pkgs-set/pkgs/helium.nix
···
+
{
+
lib,
+
pkgs,
+
...
+
}:
+
pkgs.appimageTools.wrapType2 rec {
+
pname = "helium";
+
version = "0.6.4.1";
+
+
src = let
+
platformMap = {
+
"x86_64-linux" = "x86_64";
+
"aarch64-linux" = "arm64";
+
};
+
+
platform = platformMap.${pkgs.system};
+
+
hashes = {
+
"x86_64-linux" = "sha256-DlEFuFwx2Qjr9eb6uiSYzM/F3r2hdtkMW5drJyJt/YE=";
+
"aarch64-linux" = "sha256-B63tvOtSRlMRJozvzC7lqG2LM0ZgLIq2G/AHABl+Qqg=";
+
};
+
+
hash = hashes.${pkgs.system};
+
in
+
pkgs.fetchurl {
+
url = "https://github.com/imputnet/helium-linux/releases/download/${version}/helium-${version}-${platform}.AppImage";
+
inherit hash;
+
};
+
+
extraInstallCommands = let
+
contents = pkgs.appimageTools.extractType2 {inherit pname version src;};
+
in ''
+
mkdir -p "$out/share/applications"
+
mkdir -p "$out/share/lib/helium"
+
cp -r ${contents}/opt/helium/locales "$out/share/lib/helium"
+
cp -r ${contents}/usr/share/* "$out/share"
+
cp "${contents}/${pname}.desktop" "$out/share/applications/"
+
substituteInPlace $out/share/applications/${pname}.desktop --replace-fail 'Exec=AppRun' 'Exec=${meta.mainProgram}'
+
'';
+
+
meta = {
+
description = "Private, fast, and honest web browser based on Chromium";
+
homepage = "https://github.com/imputnet/helium-chromium";
+
changelog = "https://github.com/imputnet/helium-linux/releases/tag/${version}";
+
platforms = ["x86_64-linux" "aarch64-linux"];
+
license = lib.licenses.gpl3;
+
mainProgram = "helium";
+
};
+
}
+1
pkgs-set/pkgs/moonlight.nix
···
+
{ callPackage, inputs, ... }: callPackage "${inputs.moonlight}/nix" { }
+1
pkgs-set/pkgs/zen-browser.nix
···
+
{ pkgs, inputs, ... }: (import inputs.zen-browser { inherit pkgs; }).twilight
-19
secrets/bernbotToken.age
···
-
age-encryption.org/v1
-
-> ssh-ed25519 KjIL7g 9zqnchTxa2RNHh6dA3ywXt7kkdP7PIT09IDW5S5NBQU
-
kBvwfU6jyBgPkjww8mm7aKjDeC/te9AySRQhWW8zDkA
-
-> ssh-rsa Abmvag
-
CK5dRW3YSK7sSZoYqxuolfjHQkIKEKbzX4Z6PjaRaF5l5+/JPQnFhi+/AvhjAD5T
-
kdgUw6NjWRRRz8oxRfdXezDv+ilFT1SomYvvbc0BtVm1MSoSrw8mwvcP10E1Ufet
-
B5SgfGR1RCKrzUxG+zD7iXRfnpvpC7RURSRqSFoLZOEiHYE+yRaEWsL7bq5jrIqt
-
OOH7OP+g+ScReyaTz02ReHqCNnKl4YqM5V1EfCEgrchwMbEFZji7cqmoTQcG0Dbd
-
c16kdGwzTJrqKkcTGnGn+MwQb5WrSvWmE5JTliq+ksC8Mujot+ufZa1UFPz3uPJh
-
j2UIc4sWTRba7Jz/nqL2Ef5d8LeXtus/TqNszRBW3AIffXl5I04kQTb+sAv8WPTx
-
fH34li8Dd2RZdK/iPlJMqsUJhnb/4QpvDQaqigAzX9WLQy4sllsXQdjSwgm8Chen
-
0peoZsFiPkQrQ3qs9tm0JI8xFbFOnvaso0o9iMGi6JZfc1Xx1P1l533yJjm6BOAl
-
h7rX7ocLi8kfTmXAIzo80Ux0WfHyWkqvMbE6E59T5tVwcTyJQwg3F8UFs+HB7zY9
-
NajjyLZP7FnLFyEY9OkdZ+TmTERu7EssHWVVnm7y3YdglUbGI7dvNrYXEfK35HEN
-
kAofFoIKRIEx/EJfcqFksb3ghIg+d3TzfMSJlefhJXg
-
-> ~am?#^s~-grease
-
TZj9QCRRKFXA4zbN86Hc88WzEJGSfhfdiylgXgsVqmgdevbrs+Yek0NpdA
-
--- TI12rWP+DxEO/4ynIKZLXUraDINwjquPe27/MLbF+ws
-
��=�W�g�ަ�|�.��U<6�J�]^8!s��Q�$ps����a��4�q?!#�f�� ҿ������JO��^�F�Twgh@낺�֨P������� �vw�`�`4�;��3 �G\�
+21
secrets/bunnyApiKey.age
···
+
age-encryption.org/v1
+
-> ssh-rsa Abmvag
+
XNh6H/W0srZXbGmkLGQ/YpXfamisyK/duLeSftkcrXU67b5s8x40HUv1NaKr/QQt
+
7ZBvKfm+8YsKcmmXaIINOHl6/LQ6GTpWprN91VDxTGOGzpO/GmD8MOUk8zfJYh+D
+
3soDoZuuk1gr8Q7+f8AIrfT+x3QwHA2h3hCm3un3MqhmAicTTip2C3NFQhlsEwHi
+
DhgOJ1Wy9/lSXwIzhg62s8KDOQ4cBETA8PRvspWh8GsV1oLU/brk2itwUaj0P8xA
+
uQrQzo71rbUttXeGnW4yBZjzzGMJe5iHY3H4aQxjklC1yGpInDf3HGaO6X/yaZBx
+
vRx2YxwCH4AdhgVpllbZo2++uGX8mye6fu5Lap04+dXU+ubglEvDQ1uRDrbXML9/
+
PpRszgmu5z7k9u+qWI/aBywUChvVSy4TDWKcj2JAqvCuU7QYiEi6SKhIiDLNd/BQ
+
7aa/GHSUpUu6TnpRwuBF4l2g5+jO27hsNWb3nAm/SV5YHEVCn+Tr5PiRPxBK8Fa0
+
ngJjBK5r4ra+uGulwGn1uoM0jYVCl6EtjtKgLeP5cvbdLylKWRXRYxyL7XTxqmHb
+
oLJsVvxuF1pFiaUkAmMBctaYdMw9EVwV8vTp4/eebVe6pU0Lmxv5B0u5nDiWar5o
+
RQzfwfGhtOaE0PUQNqVz7VfdoIzCcUjqnJMwInh+XwU
+
-> ssh-ed25519 y5W/qA rZ2rTM2n2bPULAefeeUvEFwskCNIEh5KdkC7uEnBcXM
+
P75OaqdeAt3BVa/xprDvJ/bLoGLkU6qdteVvwD9fO8M
+
-> ssh-ed25519 LaQclg Bnt8Z3Cve0gG6ItbJq+1+fUT/ykFsngstap8ymEr1m4
+
filHMr3njOkRpbu4UwutvqxVLf8joTBvqs3JT1gu7kk
+
--- pkIfClG050A3Kp8c+HUQJDwlxM1BbFaCRx8Vp0++xbI
+
4�dc���/\�ڦ �@:e��:e�o;�
+
�E�d\W�#m
+
��WA��#�uaJ��T�<���X�R���X�X"9 ���)�'U:7��+�,�hNϏ�Ul\� FSP8c
secrets/clickeeProxyConfig.age

This is a binary file and will not be displayed.

+22
secrets/cloudflareDnsEdit.age
···
+
age-encryption.org/v1
+
-> ssh-rsa Abmvag
+
RLzSHns6rm+PKThSJC768KmC2a9odftJWSSWqNR36LA5wb1wU5YpP/EHt6P50AY/
+
JsFPydPP+XTso4rSclWuW1gjEEzfQdwBJy0c9QNo6WRwtLsR2jLC/VBULqTPsHUH
+
bSR138+wtdICBLRMY71VvEcdrtONMm8dqc/STV5e270yDU+HtCW2Vwxu837CpUzQ
+
6xHV1NDURR5NugjQspW3mVBrFSx7OpE2iGrSYsCzXNpFK9JsC40yG/YZzqf2ktM4
+
BlWTNGRd2M/QOXwCOOdsgQHfN4DtHBR/nrC+sdauJahKxSR0RVB2jQgrH2LsmnB9
+
Xh8ttoYKwkVHQmOEUbtCnqKpzf7qGqyRX2+smkGaB2RzSxhNmUEmdV0dAEMXtGZd
+
aBFMw233WioqNygHxfgYkUtA2jFjBEVeAp74iKH7fB1/8fKa+SSeLEcv/IuIAOSp
+
WjqI7El5U882SviAyMuQ6hzWBLejCNBueZTgJVR0Iyk0fTjeLNM4rhqTQswyDjBh
+
7jnjAgVMaqZTRHrQFkBimkjX3QXutvRcjyutY3niUNRCZacvJ8bVIuIhNbqFOLJR
+
Io/bRwys/qR1a44GFMxbQG6Hm0NRIIK791cxxilZpnNiJHs02TLTXzuIq0bfTssz
+
3FjUZa6Oaerum2I/BidWJuYm4Cm6tJuftYn7XS1q+4I
+
-> ssh-ed25519 y5W/qA /qpByEN29ydHS/WgwLlOQjby7fYCI7hDOUSMJ+s0ZHA
+
Je4qhR22hERajFv/7EbQodKo4ldYqsrUgFdtt1KbXUA
+
-> ssh-ed25519 KjIL7g v+JVYql3+Tm/eam/1Vl/VSN97rq/8idFMcea1u7JEgE
+
bqgK9JhL1CF9O/35WzOj3J2fHSUQcMesbamMatJRBbk
+
-> ssh-ed25519 LaQclg u0qjpT1TcL0sAapagUr6opDbr3FRFsTtnK9wEoIJvxM
+
Uof2ZOkgEtdY301j0Ql6i9+WjQusspUvn1kMGgaSfp0
+
--- 8kcgq1sQjU2uSmskmkb3SUmsXubI1HtWBhs2RuuVJcE
+
�5��;�h9���#`c֎�
+
����9�k�4�S 鯘��L:�/����׀P}a��oՇ:$��.����
-1
secrets/dawn.gaze.systems.did
···
],
"id": "did:web:dawn.gaze.systems",
"alsoKnownAs": [
-
"at://nil.ptr.pet",
"at://dawn.gaze.systems",
"at://test.gaze.systems"
],
+1
secrets/dawn.key.pub
···
+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILUIHFy8lBU8Iy5253Lglw0v67k9ozxjLWprjTjwTsrm
secrets/deployWebhook.age

This is a binary file and will not be displayed.

+15 -16
secrets/develMobiTailscaleAuthKey.age
···
age-encryption.org/v1
-> ssh-rsa Abmvag
-
lQA8yF03lXDRaAi/NwoBND9eO0/l25mqeBNBhbegtGkHYzAmuGgTsMg316NUeGuh
-
m0mKomReg0mg7IJKa4PsEvBOxCHzgSzbWnHrWpdWlt0IuEjOV0DQSNUmsmqtHvgK
-
x3bGDxDIARYvVQfPEg//z+epQvZ8m0Xzs3eFBsHIRNnkbbUM5y4g4zeyD1AwRWAo
-
uEV/UsRPHDIlOpFmgX6WAMJMM5D76bObpz7p9hgIXRV1RoowdYTKnOr4lniTzzgJ
-
p/TstHgDgg2wAhsk6x0BK5fKfQfaV93xiJ0IrQ8q7hezPjIo9c+cTU06hAKGx2px
-
OuE9hCtlr++1sJW6ypGZyQKD0SsL2847P81qC6wsGsIms0TbxFTvGUAiWBH4aaER
-
sVP5kQJIde2E4wv6fJS12NgwxxZ6wIg18tH6vWsa+Pm29qSqAl0NkqlboyH5cBdu
-
sxrYLUbDwlT6BHBrD2zM/1eAZETS4lIwT6yC+atD4IHFxlQzgSwPZ/yckvNdFXuX
-
x+B6OLPF9U5fBsL6aFZUSj5O817jEsvGSRWuzg6FFv485COtnkWatqjhh/RfjcK3
-
2REUF1UHhc+3Ygf1m70GO0Mv1Dmkdy0GHM4ZCOHsjl6NrW1xT1JbAJ/QnLhxgEu3
-
WX/Aedo7PLS5sKuLm21MapTpAI9LoP6RxHJsCdAkZWk
-
-> ssh-ed25519 P0dmWA 14xbJxyHvpxkrEnyXjluVOIBMAhJI/vzMSXmQNCiXCo
-
ePf284ZFf83j/l4/XovHWPele0XgAb2fmWC0WnTp9Hc
-
--- SbKm7tFxXg0clw5eV8yXQ+PJdyzD297Qk9swcPeVIF0
-
2پ�H�p^��DR�E��O=zh_ �ٴ%����LqB���nF b6v�"ן<�� �k*��Q���E�� =bOh"
-
����Z�#
+
jpacR+uaQhefJsOr/izH+CeIpVSGTnzwzjTiHp1tEZ9z8C91AR6O6rhQmpOWzcQ4
+
2nDYiJVNOq7LtqpMYg9V5pDbg1mezcmWYbPdIQ/r10EZSTO3HdfTjLmiaU8tjOjH
+
7E36nugTWimw9No+5CDx7WV05umzEk+Dbs+Eh3DFNb7osQHMA1ne7dt0i0cXwYtk
+
uk43rvESB/U156UTDwWhL9zrZZsDqSAHcKbDPugpyLuZD+J1X7TsN0nm/ORZ+KjF
+
d5tx+XfFSxCS0+L7IQo2iMbT7d9fH2Mm0AGFvqmoiA3VK6Gh2er0bjBeJG7zHT1j
+
4zQYLlgMZIbaiv7+HcNdDOE/sbc0w+hUXrp7OiD6Y46DG3SVJpaIb++jdbXqYIyP
+
JACuAMZ+8eaxCCqVjpAplxT8XKkO8RzKHuIIbsWXEz7vJF4/kGx726NYVLbbPiMt
+
uWeuWj/7F1aIUcoFLwHAlEJTBVZ8DqxxxKNN3lPWx9oT45g9OQSM7DQQQEHh+dXD
+
Sv+orI1xWH13yc+fKvAH3xO6EvtK+SsNGxMlDaaiY5d5Ge2tY+7ho8stuA3lrUci
+
SxGQRnZ2EyhMWRSeAyBWuDMbMoxHjnqyGafeAh7NGbcS+x9JJMJJbax10Lq4Pf8x
+
pzmArcFRy0f4qHs/gtG+gdFe50eseBwEUCxzOzD3Gf0
+
-> ssh-ed25519 P0dmWA L5363eamFUs/6XqutW8qFRkSf5/kJ/KM1ZfMjD/W9wQ
+
rUDig5w6fWMAft5IQ949RozvidtnEBWnwMKCBBeLzSU
+
--- 4EQMCrfAojPxm//Hlmohbr39Mso1vZigcfCqUD0TDDI
+
q+� O,��u���.3θ{B;�Z�u|3���Bp���� ;b���܃j��7)�.}�� �%Qv� ʙqu�����.
+1
secrets/dzwonek.key.pub
···
+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGmAPY6Si6vf4bfi5r24XVDka7p/tcl4uHHuItFbf1vP
-17
secrets/forgejoActRunnerToken.age
···
-
age-encryption.org/v1
-
-> ssh-rsa Abmvag
-
OmNZB1HxonlxQcPAmmJtUW5aZULDXFJBiBcswviAqTqZESzGCzZSe/dGEEsh9QOF
-
ZZpC699LqLqNMJUJFCRuy+eiXgi98J4MVMlMFPBScGF3huhuNlZ7EvryB+MAibqa
-
SouBuR0JXJ4dWhB5SJkA/Z5uFxwABCqvRzBZrjL5ldJoVXeTVl+e+8W/dR7VB/u1
-
nzdlDaVxziH6aO/al0qeaNIQXCtUmmy+IKVZ8dnwwEDZwcgNp0p227K62R0UqI95
-
Qsp/w+xTJyIu1XC2CaRvKA304PHbzUAqhAvexgvMXFi0A6cM4VoTk9Hrk1TH38VK
-
tF8LU6jh873g9JpxCXwIJlATuiXMWO8u6EWEDPs7uJm+3Pvzja1qqUrBk7kwgZy6
-
iLOJndyL0i52/PK6Rlt0mqsUNSzXvNuvtViKbvXsTCXPOG8vQCXj6hqNtXfFzipX
-
laNlH8tyLhjMaQZzlU1SS0F+J3LSpF7gDpQywr6m5HNL7iaEL+zUEinn2lpDQCD6
-
OWh1kTcPj8RprnH701P7vcS+21e5S0zxGXPGoYF/Xhj/BYGPz44I1d6hTYWuqSB2
-
n/Xw21GFykIVPSWT32Yt/zVlaQagMUHDvMDUTK7yZmxT9BYO6a783KdE2G2hPy6V
-
Uup5AKvbTpWtDtZ8D5u37/YO1li4Cquigw6QV7AUz5k
-
-> ssh-ed25519 KjIL7g 1Ctb1OJio8Uues4VZyrgvo3G4Av4TRQ8EepnoIWaJ2M
-
AZJRr+JmLcJ9lvhnSpw6LOCtWbi/0nQe6mL7ugRsNUg
-
--- Ruv76wNOAJ0qhpvcoNa06V0Eml/a+FeyPXCCTXhAdrI
-
��]KE���Ԫ���W�,��[_��5'J�����2��j��h^��so ��W��7�@���M�g�X��%�����
secrets/headplaneSecrets.age

This is a binary file and will not be displayed.

+15 -16
secrets/headscaleOidcSecret.age
···
age-encryption.org/v1
-> ssh-rsa Abmvag
-
Qh13LIT59dB6mn0FyXVA8+7+kwn0kw9kmQ0MgKG4o6ABTD99SsyTezCZEPfSUg3a
-
U/pH+UTezBGFAVkYhvB+WP9rJT4zRWMng585JObbGUzCgau6+ImSZOnsjRB0CipK
-
kYgpLcw+3OVZT2Kj1RAwee3rPbImfm2ubn8U/zEn3fmbxHXBXB9KO+TDWPf78cFT
-
3rpxkgVl1fxtOb3R+tSupj9J+RsGlrjPzDV4I/4DEuh9amEHTLphLZ/Cn4kwF/1u
-
UySknhamanR5Aqg1pkx47SCcMSbEfJUjp0VfEMg19Sfdi2FWMhZQ80KvnMr/9okg
-
sNZw14WeZYixd48cia5ky8P9HOgeLoglJButTjedP8GuPSWx9I4kx5O/TXDj2ZKc
-
tC2GzhuFYfNloOsx9lNhweDjC6jnBuPyK93MnUrMoeaLgT80X7kdkCdh3NFZccsB
-
Bz+2ewTIFBER9j80FPubMJc3EhfgKh/rSY6adDtXn7eAiwgt6hyuT3s/6A0qW1ns
-
LU9SBO0e/Bi0/s17GomsIMldI0sN1qKC6R1Ub4W6V+1EsZfq1YTKvVasI7e8pHBg
-
dez/ihtiYF6RIhisdZib0wAqVjhYH1mml5MBKacyUY7VaHcl6vfSFe3WeysNor07
-
jlC1IPTngRsxItMV0wDb9/x9Uf1r+8fC19o3qPMBx8I
-
-> ssh-ed25519 KjIL7g X9TumeXjPPf+9e3ouaqHowAagQE6tOrDb5pWp8uzyGE
-
p8Z6ooZw8PZ0UgDbfw2RhfPT4iAnamialMN5Yimtbb8
-
--- RLloYQEWGgr1lT/H1WwKTYaKTJs+pgCA79oOmZRbNWk
-
)��@*�Q��fa����,�
-
[��0�}1�G �X�rT:��t�?�S#��ɻ��
+
iCAioy9OUeFw+o+gqWPf6lmUAt9XM5CfDYD343fGYdVSKi+8V8dJFVwaLEUd7hTl
+
XunScV4IJzm4Ka2F0ILnOxdsnxmqy8nmWYyAX84hn8Y9+oJxjUL0tVhQ5tp7Mjwk
+
VExB5OO3fi8ft7LDhAn8G0p9rzOMH+q2VsEq+yOcAREPcPJhbr8ggGiFtYMGOJHP
+
DNtcwPDUmdagm0FEJYXpwNrx2Dt5VT1cTVBNUhwwFK54khFAAvBJgTDXl/4QEQJt
+
2gTNkYgVQbeijBgLNSZK506hKUKCLBn2DWUT7+njiLbho3No1lcFs0ywOcMRF8Ym
+
qNmewkeWA0i2pIemeFUudhwBj2EoFAuS3fa2NP1fsGN03hQ2WyeSjsTnfu/9bb4Q
+
VtsPKRBPlStsvKY3yYug/UvoTnGosgDcWYadUc8YA7250TbIQGT3A6AP/lJ7io64
+
26kQd7cPUIXxISUjqOwSlQYShqoEuUjTxad3rpa/G7W8ipFXQR7BdzVV1IZaYmWT
+
OgVheJ5A9TfHbYG87+7TAZnKjYdYZ53AlZGfdTWb4hAHJVqByZ3LBcH74yuElFQS
+
Og/3k2FPKrXHpFH09LhyM0ro3UPwHwpkMuKM/x+80HUZE0Ple+etSy1+umpDXlqN
+
UftNwoLc1mvp+I5Nkc2M2+hwCRC81kl9lYq6f31xp+0
+
-> ssh-ed25519 y5W/qA M8TkWQD89YNmflfSs86D1ago/yYM3B1ZG2/IHLkaYG4
+
fb2gabcKsPzF8Njs7lz7P2S+7361CEoLGIJmRSNHJcM
+
--- zAZubmMLjvK/7icW5btyg3KKOvjvSYmInXLuhhXpm6s
+
���9M*@$�0�/����gI�Y�0�m�����e�b\YK�Ǩ���P����*X�V����(�=q
secrets/musikquadConfig.age

This is a binary file and will not be displayed.

+13 -13
secrets/nixGithubAccessToken.age
···
age-encryption.org/v1
-> ssh-rsa Abmvag
-
xrD7F4nsxziObEEEBix1FRvZg0SpzbAEab/LD0U0D87v+K4i5xNpWu3J8NlzP5tl
-
7OAwL3BFT64gjWDGCdQPYd3MeIa0ZMY2no3qtn+owfaiN9w01h9ESiKrSZp0nc/2
-
lZkizYPTK63MSxzD+CV3nAjsJFsrZPhCCyP4isenPwxEaJGnCEclgJasPq+ikKNj
-
bcqzaTbEBKG+D4zpbH/C8zZBSgy20l/TRRmpKqZACOYcnGhHy02k24nZ3txvd6oE
-
87mQUIFaOUKkAGZBmilui/xcwVwD3B1UHQi6E/gILZH9noRswibk/9e591/ctZCt
-
tBkNLQgp+Wa/39mYb8fybFgM/+s+2sXmn/nD+yP45QN2PY6U37QxHMo/9T+m5PVn
-
HUrpmfKldlFpK0qfm7p2xd3cJ890SBcl2Ae71YoI2rk2UgNfr0KttrIjHR7UIL1e
-
jxa+buD0f7hA58Vp/BIW4qNGbEGqyqr3KQgpbHmzdFt8WcBaexRtJD5HpOhvqL45
-
P6rQpkG6feGOKYgo8h1FaQ7inlMCUFD1B/wPjB885owmH4gOay5x7ROLDvOZy48t
-
zxqTeIs38PIZkl1IVHjcoJPGxkNyRJKqp+f/NfrX9ddmNVQn+MAiAc99Teu+V70H
-
yleAiB6Pj4+rBL9GHC6LpdIpmvaOLql7ncniD9TatLE
-
--- iYc3dQdWS9U5zrVaIeEWcWoVkzv5Zny1SUb0n5gH+jc
-
q��l��G+Z��c���j�UQdΩ0���̌1��G��.%�(���{8ݨHI�&R�~����Cijn����P˹�e�-Xh���$���E�+׫,���;���
+
JYLINd8u48uaE+Lu3/a3P1q62wh2/4IVZ/4gtXndgqyPmKualZs4T/kedoE/faDh
+
7N5tXy/e808GRrt++AN+v7s1WU4R+Z4wkrlVOGxIb/XHDLVEdxfsr/VUCHpEDtRL
+
5v5CNp5oebK6lydFiSQbO6pReEgdmTL/ODhqGfENlrxd24UmohTrFhIPlppVLVie
+
64rFXDsRTSzeusuSNs5q1rPJKLxjO9bMSzK6M5bVdwMGfCClX1VYpcQa13MyHpbb
+
/cCBmWCPqXKgz+se9TpHzBCgGS0znw4rn3Q45PeTU/jhVv7dWwtArQI+s3ci7CJz
+
PO2g4VJyiAkP6NnI7CgkihGgMnYi+lGueE/eQre/wtq9E796xShw4DqOjuEREqCj
+
1d0wqaI77C/sYd/LkjoNKO9zqh9Lj1xOMmDbajr1b/gDLCam7J2pHFtyiq2/XIR1
+
0bP55ASmhMSGyevC21+fOoc/HzZivUykb4GCyuYZKtlCxDlX8LflB5kZA1tuydnW
+
EZ3FYxl1fg4YsM4NkHMkO+b8EtgmPmCGclKaAT44TyUHw/Ujx4mpB5116t6deNVY
+
Oiu2Sv1grjbTa+DMGlNwa8tNnPwAkWXus6y53AFvOSRkGLrLjabvWQ1fmbmGuQNZ
+
f2GiRM+dEM/xx6XXKQbnQHwJa/qhEiGYSHHgBMUaE9s
+
--- TwOBndKs41VlTlnVu/l0m7TN1HVKj87i54F/7+oarY4
+
�Vp��-J��'#��=� W����V�R bZ__��8���Ʊ���>�Q� 1�H��I������n����_�_)UIyR��R�M h�U�% �ს�G���!��)S)�R
secrets/pdsConfig.age

This is a binary file and will not be displayed.

+17 -15
secrets/persesSecret.age
···
age-encryption.org/v1
-> ssh-rsa Abmvag
-
oA9+rRHwGJJ2TiR2+GqE4HofvQJzWI1n0Rppl7itE/QGVmzo8Kq2Qh3XSkb2jCzT
-
1k1M2cHdIB/2XF1htn0lQp5uA6s+NO66T9hjniJulzZ5xLem7sNOFl/JSbCuYnb+
-
QI4sCiZhuqGD6SEQhHpwzMEttml9rI1xpYJ+o/kqGkmOOIqzkZYQh2duYYEl6dhn
-
5Hi+CEve3Cz9XkFnzaADWgzgsMtSG3MdqvTm2C9x3lAGCRlC3LrzfRB8GlwGalqU
-
ecPui7CyqQlPQO6Uq+fl+wPyHqqeZk0Y1uIXxMsjsIiO3a5rMQDLFjalsNlENZ/E
-
KZBgYueuUcJGUHx4N+tjDubsR4XK6nlPIdIVNwrwghWQY/dtH7KW9iW3i53vRfwV
-
CICagM6s8ZUIkSLOxGrxOeY8iXJnRMaWvyZNrSgulP+5YUkw5gPOLxtNFGmZzqzk
-
tTunLg8Sq2ODvY3cob4YtNkjrfy0VNeQiOPvNB/Dq0f98qva3LgHrCL2IFTfW6Oi
-
pPmq7qaliqYKLCyNMZr1J/G21yEY04Rdook/0O23Q17vN5bqzHWPI7AALVz/wPVW
-
GR9JDb51aE580CN5F4d6NFLCXzGORkMK4RpsmhLR7S/ZlrO2j7ogp4gxiNsIO/ag
-
ERe1TYzt6isXlW04jaJvr/rsPZEcDCAhLJSXfVCe2ww
-
-> ssh-ed25519 KjIL7g spE6zz6WOstZj+lFRjzyS4shiP4pN0zcsH1f2Lqu9CQ
-
3L1pC1NLl0H1Yj0tqsx+4SFrlm+We5U4PTOgkC8NQ2U
-
--- bnFtsqx/Mjo9vgpzn/WvhM2Va4onBW65d82hxjk6rA4
-
�3' &x_���e��h��c�o�P�J�j�g�ϸY5ڍ6��O]Δ@�M�Iϟ������Z%[c��)�,&�����w�� O�f@|H��@�9�
+
IC9ZInud32ueWR3owngph/eKReklaRfgY6bDKDmA0OT5IEvisOYK8lhGwAzOZdIq
+
i+K5p7C30qe1+1fmZ3ZNcQMKeIq79LdpiR7Xb6DT+BAT5g++wsXqqsvxZYyR4Ux7
+
dPxr05VJXE6HkoUQ2gcG/rlED1M7EoRq1TBm1UV4wIDiWy/ZdZZRvM8C++CD2h4V
+
d4cLoDzVZxYdi3s+NRXpbg62fIO//suAYvlMjbKQasEBWv88R8rwj5br+o/AbCR8
+
hkjctI+EuMHzq7hwlZ211hb/HDLnFckWmIao9Hvw6PpyFMIUmuQWsgn6yHQ6zJQx
+
zIXNgAYpX5bR8i0VXvwNwlfWOOqNcOU4QD7ZO4qFs+ZYTlHvo1m1RNhDIBbhC9UM
+
v3C8fU0RTaWhUkcacXn3VXBiJIHXzFLiAfxQ1ft5HPOjsOOhHwphMFwblCukTJ45
+
SNVErkK32YeW6J0nyQGHRNHNSgbZC274caZ8R3nlTynkYRoF6/dy7Q1OLNILF4Vd
+
qW54oLZs9A6ralFkDfObl4rxOcz4HPdwH9p/kWzW1C1IrfZk0m5eOppFzZ2fUHra
+
FED8mJ0vH5E0oCL7JBDVx3A+Ss5vj7zpJePL10UQvfWI8qUIXHZT6wbIt/XfRvtq
+
rbr0g9tQtnnpOMJwgu1GzL1xQWGelAS8pvV8GPb5Vvg
+
-> ssh-ed25519 KjIL7g 0DtiBKi0aL82kjE3AgAbwkCw+fuIWXMvzi52eem0JgM
+
ujkcowuy/vokA+jqV7d5RcZGeg2yhzh8IdQQHJ/wZns
+
-> ssh-ed25519 LaQclg m/1lrK8ks3LlAQYG0/85pZiyQvhh16/Y5bX+k9HPpgU
+
zJD9xgF9GuHGHYSkczPGllccYqW7y/+UZrlCveFJIt4
+
--- ZM1sl++OddBxYlx8/57o/BWcSsU3rHQ41q7cJCoZiPs
+
�C{���9�C�yC��'�]����P�X��n��ZD��}�q2�[�@�R8�h���'����a�:�B2X��}<5��D�����6�������p���*��
-17
secrets/ratholeCreds.age
···
-
age-encryption.org/v1
-
-> ssh-rsa Abmvag
-
j/fkXBIYFCGzWN2QVhdiOYO6yRFRRntkQXavvd+uHXI/jdyasqQSHuLUaO1jpGYH
-
lbDo0Uhq3kKDeZMN7N9LJ7OT96yP0E1Kuvw+uiyAOME93j0oBLnqepubm3UKcFOX
-
I+kyCwNbMd78t8p90N3EePy08UymQWSjl7zZctp//zEuhFy+8C2WHWczc0tscMP2
-
r0yOzFrB4CMF5cGY6xOCeU8wP679NJ33DWyvMzhp1qVKd2+2zaMNIKP16qMdTk2H
-
BqpkBlAbMZnLnlKJxC1V7XIGkyeFP1EHTDasmAXyRgIIZCpQrwz+OiqqlnNGGB0X
-
7tAJnRC+5eA3C/Hx881bIjuiI5Q+oFqE2xIOplgMILibdhmOcO0l097qIyFfE6an
-
QwiQlcA5Q/ztAkB+twsGnOVf667FSniyHV7C9x26RwzKlKL3tYi63HAtmzCD8MNo
-
CxFxOrp0wxOgOVgRwatIGMPzb7vtztO2nurBFWzC2CqQ9TBtML7xLWmLY0IEMX6w
-
6e5j4xoFZhAXnFjHlG32uas4L3p1/r9o33U/l1F+QLmquYnGjtY3DAFwQi4EEme/
-
SB8pPU1V8kVpLVocvIVQjsVvIw2WaGvByukGDdjvGM6FpYP2qbCvdU7YEH1HjbU7
-
qri5oQRNqE0SMYgDuOSbrQM39YTbxw7441YMVHwO3wc
-
-> ssh-ed25519 KjIL7g Y106z8/ny0bweAkbMDQaEfOnfahPvtBVnA5BZsGyhU8
-
8OlNVmEB89YtEr8jwb9hQFer1hLhN2hgR0mfaxFJdgM
-
--- PxhoqXn3lFUpWN2/VPNItbNRXhXMIBrTSVVehGPEGrA
-
��:��ZX�2r�}�)瘴�냩sT�Q��,��k��f�Q�q��dM`��J\�;ow*�R^��`V�>��mN&�v� �W�_����?臰sG�xK�������l"y*C$��O�
+13 -47
secrets/secrets.nix
···
let
yusdacra = builtins.readFile ./yusdacra.key.pub;
-
wolumonde = builtins.readFile ./wolumonde.key.pub;
+
dzwonek = builtins.readFile ./dzwonek.key.pub;
+
trimounts = builtins.readFile ./trimounts.key.pub;
develMobi = builtins.readFile ./develMobi.key.pub;
in
{
-
"bernbotToken.age".publicKeys = [
-
yusdacra
-
wolumonde
-
];
-
"musikquadConfig.age".publicKeys = [
-
yusdacra
-
wolumonde
-
];
"nixGithubAccessToken.age".publicKeys = [ yusdacra ];
"websiteConfig.age".publicKeys = [
yusdacra
-
wolumonde
-
];
-
"forgejoActRunnerToken.age".publicKeys = [
-
yusdacra
-
wolumonde
-
];
-
"xrayConfig.age".publicKeys = [
-
yusdacra
-
wolumonde
+
trimounts
];
"pdsConfig.age".publicKeys = [
yusdacra
-
wolumonde
-
];
-
"webhookAuth.age".publicKeys = [
-
yusdacra
-
wolumonde
+
trimounts
];
"clickeeProxyConfig.age".publicKeys = [
yusdacra
-
wolumonde
+
trimounts
];
-
"deployWebhook.age".publicKeys = [ yusdacra ];
"persesSecret.age".publicKeys = [
yusdacra
-
wolumonde
-
];
-
"ratholeCreds.age".publicKeys = [
-
yusdacra
-
wolumonde
-
];
-
"socksPassword.age".publicKeys = [
-
yusdacra
-
wolumonde
+
trimounts
];
"headscaleOidcSecret.age".publicKeys = [
yusdacra
-
wolumonde
-
];
-
"headplaneSecrets.age".publicKeys = [
-
yusdacra
-
wolumonde
-
];
-
"tailscaleAuthKey.age".publicKeys = [
-
yusdacra
-
wolumonde
+
dzwonek
];
"develMobiTailscaleAuthKey.age".publicKeys = [
yusdacra
develMobi
];
-
"spindleOpenbaoRoleId.age".publicKeys = [
+
"cloudflareDnsEdit.age".publicKeys = [
yusdacra
-
wolumonde
+
dzwonek
+
trimounts
];
-
"spindleOpenbaoSecretId.age".publicKeys = [
+
"bunnyApiKey.age".publicKeys = [
yusdacra
-
wolumonde
+
dzwonek
+
trimounts
];
}
-17
secrets/socksPassword.age
···
-
age-encryption.org/v1
-
-> ssh-rsa Abmvag
-
qP6PmMyeXGQ48vMHyJd6607QsGWNt8jcJd8DbPbx5Gu6Axw9tsj5NUcNqgbW58uf
-
xnwwytfXeoGKP9vbhwkKnwsXJ30Dw9xtiUd4/czefLfqxR7z66iZqSD5u9u2QrEf
-
z7Ib4d20Vc4XoxiBkt7rK32jc+/7Bac0Nj/9JiJXJwiPvjP/p0SaE8PR1bMCFUxB
-
/cr+ITdZN48pVW7g1cxMkzMPZdzhiCNBtmxK+6rDH4B1LX0/TWgHdBbRd7OSf+KT
-
OvflhrqoUcbbPd9uq60/z3h0xTeJpi8AvCzcQAxNd5cwFAREfbrgyRMPassA7nfj
-
KwE8+kNrfuDdW+zPAgPTxqnV0o2Zlnl4IyF+ir97EtZCICrn79ged298NEXhGM6h
-
0SS1D7pBrYswx5mxODssFg9XSr6KuVWCQpdiD5kBnciy6lyz2CHZthKZzEVpLkst
-
OHpqllgPQMxUoEs1kQlJ113TV+vrJC13Omh/QEF3GKRgZf0zwphaO9oGWg7w5MHC
-
ZqfAxhkIfF5BSvLLuMSXMIV84D2Lg6c4rKAPKjQcs8lS7rFGzG1vnRrZSfajnjIy
-
y9Vy2xG3LZGYPO9DkXfaFkBYcMDnddBSLCYDg1JH9Qcd2uvNkHDsQWUtkxs9EuzT
-
WvRnlmsappTn8a8chtUOcqUodIHRP1JOUYiYLsQcyHk
-
-> ssh-ed25519 KjIL7g gSYsK2Q0irpI5ebMq8C+c7HE8RPblC5uUm9T9Ys2Y1c
-
tYfSM5IPaeJR7O8DkmeTNSpDeYrhGdbk0pS2cJFJOYg
-
--- L64+NZvJKztXFQHf0M6EOx1TSI93/ikJkD2zDe+/IGI
-
; jse���B�N�I�|�!��}x K����$�"��$��
-17
secrets/spindleOpenbaoRoleId.age
···
-
age-encryption.org/v1
-
-> ssh-rsa Abmvag
-
i1WEFfFEf7rvpH8pfM4+Z7mBSJwzAa/xNP5YMp0aVk9AMpFoT/39mwzr0LMtnruk
-
u8Dz3ILegSyc69L9Ge1rNX6L5mN0qUyjsN1h/cMCh9Cgw4DxYkRB9NYI3xNUQFau
-
xHVbgJ8DBDwZ3XnM0JYf9c23Kk1oft+PV07JKtyBN6r8JGCpu7N5Ccb/oj4epnS0
-
0DgoEDLT9DgiZXVo+Q6w++gfSq58ClYaguoHaDCTBdRKHans9BWIqJ7pAOu9hXcl
-
vyuw/jz0bwKKh474xiCHArw4xN+ji7aFTRG3FkeK52giWoK95+P4z5ieaHJKz2jk
-
I4HiGjgpfDGJzsgz5yEJFhntlnOWVHChvyZ1QSEKe2OIGAQmfGSbDRBYPS2wrfeL
-
v8JueFHCG4ABh53+guzmjTMZTRjh8O5d2YEcrrWhGgwssHxUTzNE4KUCVkNV4/OS
-
6+hvmU1NC8rYBNMRiZtYiu6osmtWndYYFCsJpURfyFoDzCWmvjl6pxNFTtTTukMm
-
WBgKxC2K4EwQ27k6IExm2epDH5kwdJrPGe8yZIl3zK9Y1Sa+Q3LYp8D5QWUv2uts
-
lQXTVvJVrg9wn1AfxCnGBApCPIvEiw8PwU/adfa+UMKN/kGMvE6iL0+J2aGTxO4l
-
zmyLUErh9f8iBIF/90DIqf9FrjBWcbtv3zphmgHZkII
-
-> ssh-ed25519 KjIL7g GZl/qIbkVajzJn0ZsI0ImzIyGdjm1tMFbEh4LnOALAA
-
WXYCRfsfYU+nI67+4d6PX/iER2aA7Flt6xWPlvYELDg
-
--- Y8pLVkJQfP5piXtWJ3AegPsLLj3NDWXpmt3aoiwicgo
-
E�RR�y��������@����X���t�$ǻ��s���Ǟ���~��|�r�F�~�n��NG
-17
secrets/spindleOpenbaoSecretId.age
···
-
age-encryption.org/v1
-
-> ssh-rsa Abmvag
-
G3DtXBNVhNcRiXlpQ7iJ8kZrsu59WF62pnLheEGKj2JGg6m+LLOqLChQg1YOSjB1
-
zIy3QwpfXB4Rn081lXEXKvs6Jr1FbAkhggeLLtflPEAouxPiJ1HkxtyCNv02L+Pj
-
uBvi32fMnTw3Kep6LTNBqkAhsvFNf02zsNxm+KfFpwn+kWvUtGdsHeAsWIXO/4lL
-
FjbPI860FvbfrAp0r7Hv79MRLYTUhki7gX+VZooEngobCImTiq9NR++MpdsMmovC
-
hst6CESEuTdqhw2SrTteGU10E+5q1jd1z0T+ttHe0GqKmQwuQB4S1KtSx74xiQhV
-
gg8ZyVAVdSt49s9YLRMdJjFWHXNPC3GKQzlXWZ4xLrpeBc3YrQhp3+7iRhRB92gX
-
GhWdw/UN9fKPbILi2W+3bSEByGzJ2iBo0BMxK0I7541ZgpQHOOvySLHzElnpRdwD
-
I3+GuDif1cHusLBVruwUubfr11UwzOLkUgzP504Sf55liMSjnq5DxzkaUERzTg/T
-
SNmC9misXkxUpwWSYKjSEe5p3x8CsJwmVkrXh+N9GFiYD+Al/9aWPrmw+Kl4CMe6
-
MJlxCpfVKTdx3ePA7d7POx1RQuBf78nTg5XCyBf2BB2lycKkg05hX+1VzTCYMChZ
-
zLh1RiSWtRxgIbljwWanPW0AmZaDkRTxdilbFg2sa7U
-
-> ssh-ed25519 KjIL7g C+NvzMVX+2NdIXoYGPv1yeGRaHnSEQQuG7MS3e5SKlE
-
L5TFRde0T/sn8teeFuBy3c8fydmiI07NT+pFnIIyYwE
-
--- fcPjYFQG6lbT2cGzt/oZhO5PahAoiN4yUT12xa4Kc8s
-
�ZZ�/h��������p�]�AR!�O��`�2��K<���Eo��R����VN �����G�p��0u
-17
secrets/tailscaleAuthKey.age
···
-
age-encryption.org/v1
-
-> ssh-rsa Abmvag
-
cdEH6fTtZbBDJzNHCRdD6/xjHl/CG//VQqF5qIdJ+CVBTYZ8cyaY13fkJG7hKPAR
-
WaMcRKyPwgAA1Dbhc3/K2VwGAZBSibIHhkj+iBOfu46WIRjEGPcz9HrMVMI6MmRf
-
cCOw4VdTWYrUbcOclC9mGy/dimw+hHaTFIuepuDulVsSjC56kYDrhBSg+nmBBY1n
-
7nHiHOznHhjXfao65AuB++1kxqf7RifEq6bDcfgkvaXhUDJrc2kDY78o9qctvfFR
-
6sX77+vt8xxRgTZvWkix14WQRfOvWfXsroFfoSnno0A3KYlkko0JKxwkd/G56efi
-
BA41j5OES3K+NxwdNvHlA73uXs/jumgtI76JXg7KHh2zWDbG6qtA290piKb6hSG8
-
VnWoFJ37SKFNZTOuMjgpwurzzyCscRf4RHGy3/anUd/1yAK8RS35nlOS3QDKECyu
-
Q6FIwcBItvZkzBmoFJKj6seUENZ46Wb6h1AOhaTCljkQyGTqti16Es0CGcyw+iTe
-
OFWj7C6JXIlr/D8PTFK0pR9bVWc+NcJ0EF12kCC7jeqkBZ1BCa/SI3y3RxEGxVBQ
-
qnJpeci/jEi6vUczx669+JU/WT015Ad73CwrILpY6GdvM5B5dLhKoiRTcrmZErLW
-
N3qR1s0e+GDMOD6j6KQ9p5ob4/Iwb4KyFT1ua3pvVeo
-
-> ssh-ed25519 KjIL7g BiO1JiyYp3Ekc5pPeMi8tMNcY+jaUcuDMrLl1r31FTk
-
6ynf4SG+Bg+vaTwiNssmwXUM7L8hIrkhK4OEPBCiyaY
-
--- Didicg7j8DbrYwg+DCCiLrfp92LLa4nim3oPnRESZSw
-
ւ���22�6Y[�"�u<s{�?��ʲ.�� 5�t0!ul5�Q�y�.dܰEz��%7&��CA��Ko�^ YvD�P�
+1
secrets/trimounts.key.pub
···
+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDLuA1/cZ/xTN4dv5U0fvD9Glo6HlF5YA4U1pvFjxx6V
+1
secrets/volsinii.key.pub
···
+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEKFdogRnTNHcIwtdQqdX5O+1nvMDCX2iFx7Gd3eFIF9
-17
secrets/webhookAuth.age
···
-
age-encryption.org/v1
-
-> ssh-rsa Abmvag
-
tZQpEZGaxBAguq42O3bbAm/n0HIvQpSUGI7WG+EK1saehatjvCKz943/w3p2Fg6q
-
XlrW6du6PkD6dx+IRilU9gxRkUbQ980Fe7YkGMLpQpg8VtbDgvarcF4wqiheCRYR
-
jwjdg3NpxP1N9lF6GDeHzKveKQlsk4zlDFSqQm/Z7MfZ0FCUata5KF6O3R03jnqP
-
3eUI4g5PawwR0ifAIgXfLOtqdWMBOUYGVwHxSPCl9Ej9T64YAA2MAl0v4H0l/8Up
-
YIZQeHXCrwu8GedSKB/5Txycfh7VKaEPEW4Gmq9XuOYzxTjE7//SaHqa3mTFOzWL
-
sXAJUf5zivQ4rmCw/kxhRTi1fGgbJ4tHggkqx5+pQmFh/5YLngPeYenkMgwfllDK
-
eGKpTvr7OhmIUD9P4NuU3iIMQNF1PyQQjTBKHmTS0jXt7C29LfVT6gJ12j3v4N4H
-
Tp7Saqe6I43J1/dnp4ia7rOnztHJdEadZu9IvEooeQ/RTl8sOCyis3dbHUZtCBYZ
-
+qxsGEqa66XoooofMrD9o3NExcNe+xSan/1q/H0qp5jCZlWfmYdafYzoKmv8Ww45
-
k7bktFrleFzjc0hVchx4N/Rb+JgrHCxewwB60UtND7texaNYby6VTO/m8A3je1Uo
-
wLmIkpyOMhjaW+qvnYH7agWCBd1bTLOD1RvzGTEY5gE
-
-> ssh-ed25519 KjIL7g 2V4ItOmfSsbtLZp00Gm/r9H0f+k+mAr+5GUbkKsUHyU
-
k9jKx7HBmXnDFkJk5fCccs6KbQQE7cd3KQDq4yeutQU
-
--- t5dl05mvDzgKtCxG4ATzeoVm8PySg3WvGBPkFxWFyrw
-
�.�3&?�����l�^F�n,�>��5΄B�V�����)@���X�[�G}���G���v�n�������t4-F�q��9#¿�&2ڋщC�„ɡ
secrets/websiteConfig.age

This is a binary file and will not be displayed.

secrets/xrayConfig.age

This is a binary file and will not be displayed.

+51
users/dawn/default.nix
···
+
{lib, tlib, inputs, pkgs, ...}@nixosArgs:
+
let
+
l = lib;
+
nixosConfig = nixosArgs.config;
+
in
+
{
+
users.users.dawn = {
+
isNormalUser = true;
+
createHome = true;
+
home = "/home/dawn";
+
extraGroups = ["wheel"];
+
shell = pkgs.bashInteractive;
+
hashedPassword = "$y$j9T$TxLlqj0RWsBtIrEhOTyqh1$mfvSCn5j7VAUymWe2/qUTB7.JdwXbqF5qWqUjqQCMu3";
+
openssh.authorizedKeys.keys = [
+
(builtins.readFile "${inputs.self}/secrets/yusdacra.key.pub")
+
];
+
};
+
+
environment.shells = with pkgs; [
+
bashInteractive
+
nushell
+
];
+
+
home-manager.users.dawn = {pkgs, ...}: {
+
imports =
+
let
+
modulesToEnable = l.flatten [
+
[
+
"zoxide"
+
"direnv"
+
"nushell"
+
]
+
# dev stuff
+
[
+
"zed"
+
"helix"
+
"git"
+
"ssh"
+
]
+
];
+
in
+
l.flatten [
+
(tlib.prefixStrings "${inputs.self}/users/modules/" modulesToEnable)
+
];
+
+
home = {
+
homeDirectory = nixosConfig.users.users.dawn.home;
+
packages = with pkgs; [omnisharp-roslyn rustup gcc gnumake cmake dotnet-sdk_8];
+
};
+
};
+
}
+4 -1
users/dusk@devel.mobi/default.nix
···
enable = true;
controlServer = "https://vpn.gaze.systems";
authKeyFile = config.age.secrets.tailscaleAuthKey.path;
-
extraUpFlags = [ "--advertise-exit-node=true" "--hostname=dusk-devel-mobi" ];
+
extraUpFlags = [
+
"--advertise-exit-node=true"
+
"--hostname=dusk-devel-mobi"
+
];
};
programs = {
+164
users/mayer/default.nix
···
+
{
+
pkgs,
+
lib,
+
tlib,
+
config,
+
terra,
+
...
+
}@globalAttrs:
+
let
+
l = lib // builtins;
+
+
nixosConfig = globalAttrs.config;
+
in
+
{
+
imports = [ ./stylix.nix ];
+
+
users.users.mayer = {
+
isNormalUser = true;
+
createHome = true;
+
home = "/home/mayer";
+
extraGroups = l.flatten [
+
"wheel"
+
"adbusers"
+
"dialout"
+
"video"
+
"input"
+
];
+
shell = pkgs.nushell;
+
hashedPassword = "$6$spzqhAyJfhHy$iHgLBlhjGn1l8PnbjJdWTn1GPvcjMqYNKUzdCe/7IrX6sHNgETSr/Nfpdmq9FCXLhrAfwHOd/q/8SvfeIeNX4/";
+
};
+
+
environment.shells = with pkgs; [
+
bashInteractive
+
nushell
+
];
+
programs = {
+
steam = {
+
enable = true;
+
package = pkgs.steam.override {
+
extraPkgs = pkgs': with pkgs'; [
+
vulkan-loader
+
wayland
+
wayland-protocols
+
xorg.libXcursor
+
xorg.libXi
+
xorg.libXinerama
+
xorg.libXScrnSaver
+
libpng
+
libpulseaudio
+
libvorbis
+
stdenv.cc.cc.lib # Provides libstdc++.so.6
+
libkrb5
+
keyutils
+
];
+
};
+
extraCompatPackages = with pkgs; [
+
proton-ge-bin
+
];
+
};
+
gamescope = {
+
enable = true;
+
capSysNice = true;
+
};
+
gamemode.enable = true;
+
appimage = {
+
enable = true;
+
binfmt = true;
+
};
+
niri.enable = true;
+
};
+
systemd = {
+
targets.network-online.enable = false;
+
services = {
+
systemd-networkd-wait-online.enable = false;
+
NetworkManager-wait-online.enable = false;
+
};
+
};
+
+
services.gnome.gnome-keyring.enable = true;
+
security.polkit.enable = true;
+
+
security.pam.loginLimits = [
+
{
+
domain = "@users";
+
item = "rtprio";
+
type = "-";
+
value = 1;
+
}
+
];
+
+
xdg.portal = {
+
enable = true;
+
wlr.enable = true;
+
xdgOpenUsePortal = true;
+
};
+
+
services.joycond.enable = true;
+
+
home-manager.users.mayer =
+
{
+
pkgs,
+
inputs,
+
...
+
}:
+
{
+
imports =
+
let
+
modulesToEnable = l.flatten [
+
[
+
"settings"
+
"niri"
+
"foot"
+
]
+
# cli stuff
+
[
+
"zoxide"
+
"direnv"
+
"nushell"
+
]
+
# dev stuff
+
[
+
"zed"
+
"helix"
+
"git"
+
"ssh"
+
]
+
[
+
"zen"
+
"discord"
+
]
+
];
+
in
+
l.flatten [
+
(tlib.prefixStrings "${inputs.self}/users/modules/" modulesToEnable)
+
];
+
+
home = {
+
homeDirectory = nixosConfig.users.users.mayer.home;
+
packages = (with pkgs; [
+
# Font stuff
+
noto-fonts-cjk-sans
+
font-awesome
+
dejavu_fonts
+
# Programs
+
imv
+
mpv
+
ffmpeg
+
mupdf
+
xdg-utils
+
transmission_4-gtk
+
prismlauncher
+
lutris
+
gearlever
+
signal-desktop
+
bs-manager
+
cemu
+
tor-browser
+
supersonic-wayland
+
]) ++ [terra.helium];
+
};
+
+
fonts.fontconfig.enable = l.mkForce true;
+
};
+
}
+65
users/mayer/stylix.conf.nix
···
+
{
+
config,
+
pkgs,
+
...
+
}:
+
{
+
stylix.enable = true;
+
stylix.autoEnable = false;
+
+
stylix.targets = {
+
console.enable = true;
+
fontconfig.enable = true;
+
font-packages.enable = true;
+
qt.enable = true;
+
gnome.enable = true;
+
gtk.enable = true;
+
};
+
+
stylix.image = ./wallpaper.png;
+
stylix.polarity = "dark";
+
stylix.base16Scheme = "${pkgs.base16-schemes}/share/themes/catppuccin-mocha.yaml";
+
stylix.override = {
+
base00 = "#000000";
+
base01 = "#11111b";
+
base0D = "#cba6f7";
+
base0E = "#89b4fa";
+
};
+
+
stylix.cursor = {
+
package = pkgs.bibata-cursors;
+
name = "Bibata-Modern-Classic";
+
size = 24;
+
};
+
+
stylix.fonts = {
+
serif = {
+
name = "Comic Relief";
+
package = pkgs.comic-relief;
+
};
+
sansSerif = config.stylix.fonts.serif;
+
monospace = {
+
name = "Comic Mono";
+
package = pkgs.comic-mono;
+
};
+
};
+
+
stylix.fonts.sizes = {
+
popups = 13;
+
terminal = 13;
+
};
+
+
stylix.opacity = {
+
terminal = 0.7;
+
applications = 0.9;
+
desktop = 0.9;
+
popups = 0.9;
+
};
+
+
stylix.icons = {
+
enable = true;
+
dark = "Yaru-dark";
+
light = "Yaru";
+
package = pkgs.yaru-theme;
+
};
+
}
+10
users/mayer/stylix.home.nix
···
+
{
+
inputs,
+
...
+
}:
+
{
+
imports = [
+
(import inputs.stylix).homeModules.stylix
+
./stylix.conf.nix
+
];
+
}
+10
users/mayer/stylix.nix
···
+
{
+
inputs,
+
...
+
}:
+
{
+
imports = [
+
(import inputs.stylix).nixosModules.stylix
+
./stylix.conf.nix
+
];
+
}
users/mayer/wallpaper.png

This is a binary file and will not be displayed.

+43 -31
users/modules/discord/default.nix
···
{
-
config,
+
pkgs,
+
terra,
inputs,
-
pkgs,
lib,
...
}:
+
let
+
pkg = pkgs.discord.override {
+
withMoonlight = true;
+
inherit (terra) moonlight;
+
withOpenASAR = true;
+
withTTS = false;
+
};
+
in
{
-
home.persistence."${config.system.persistDir}${config.home.homeDirectory}".directories = [
-
".config/ArmCord"
+
# imports = ["${inputs.moonlight}/nix/home-manager.nix"];
+
+
home.packages = [
+
(pkgs.symlinkJoin {
+
name = "discord";
+
paths = [ pkg ];
+
buildInputs = [ pkgs.makeWrapper ];
+
postBuild = ''
+
wrapProgram $out/bin/discord \
+
--add-flags "--proxy-server=socks5://127.0.0.1:1337"
+
wrapProgram $out/bin/Discord \
+
--add-flags "--proxy-server=socks5://127.0.0.1:1337"
+
'';
+
})
];
-
home.packages =
-
let
-
flags = [
-
# "--flag-switches-begin"
-
# "--enable-features=UseOzonePlatform,WebRTCPipeWireCapturer"
-
# "--flag-switches-end"
-
# "--ozone-platform=wayland"
-
# "--enable-webrtc-pipewire-capturer"
-
# "--disable-gpu-memory-buffer-video-frames"
-
# "--enable-accelerated-mjpeg-decode"
-
# "--enable-accelerated-video"
-
# "--enable-gpu-rasterization"
-
# "--enable-native-gpu-memory-buffers"
-
# "--enable-zero-copy"
-
# "--ignore-gpu-blocklist"
-
];
-
pkg =
-
(pkgs.armcord.override {
-
nss = pkgs.nss_latest;
-
}).overrideAttrs
-
(old: {
-
# preInstall = ''
-
# gappsWrapperArgs+=("--add-flags" "${lib.concatStringsSep " " flags}")
-
# '';
-
});
-
in
-
[ pkg ];
+
+
systemd.user.services.discord-socks-proxy = {
+
Unit = {
+
Description = "SSH SOCKS5 proxy for Discord";
+
After = [ "network-online.target" ];
+
Wants = [ "network-online.target" ];
+
};
+
+
Service = {
+
Type = "simple";
+
ExecStart = "${pkgs.openssh}/bin/ssh -N -D 127.0.0.1:1337 root@trimounts";
+
Restart = "on-failure";
+
RestartSec = "3s";
+
};
+
+
Install = {
+
WantedBy = [ "default.target" ];
+
};
+
};
}
+262
users/modules/discord/moonlight.json
···
+
{
+
"extensions": {
+
"moonbase": true,
+
"disableSentry": true,
+
"noTrack": true,
+
"noHideToken": true,
+
"alwaysShowForwardTime": {
+
"enabled": true
+
},
+
"betterCodeblocks": {
+
"enabled": true
+
},
+
"ownerCrown": {
+
"enabled": true
+
},
+
"betterEmbedsYT": {
+
"enabled": true
+
},
+
"callTimer": {
+
"enabled": true
+
},
+
"clearUrls": {
+
"enabled": true
+
},
+
"cloneExpressions": {
+
"enabled": true
+
},
+
"copyAvatarUrl": {
+
"enabled": true
+
},
+
"copyWebp": {
+
"enabled": true
+
},
+
"dmFavorites": {
+
"enabled": true
+
},
+
"domOptimizer": {
+
"enabled": true
+
},
+
"experiments": {
+
"enabled": true,
+
"config": {
+
"devtools": true
+
}
+
},
+
"inAppNotifications": {
+
"enabled": true
+
},
+
"nativeFixes": {
+
"enabled": true,
+
"config": {
+
"vulkan": false
+
}
+
},
+
"noJoinMessageWave": {
+
"enabled": true
+
},
+
"noReplyPing": {
+
"enabled": true
+
},
+
"noSmoothScrolling": {
+
"enabled": true
+
},
+
"oneko": {
+
"enabled": true
+
},
+
"osuTyping": {
+
"enabled": false
+
},
+
"platformIcons": {
+
"enabled": false
+
},
+
"pronouns": {
+
"enabled": true
+
},
+
"quietLoggers": {
+
"enabled": true
+
},
+
"remind-me": {
+
"enabled": true
+
},
+
"reverseImageSearch": {
+
"enabled": true
+
},
+
"sendTimestamps": {
+
"enabled": true
+
},
+
"showReplySelf": {
+
"enabled": true
+
},
+
"showVoiceMemberCount": {
+
"enabled": true
+
},
+
"translateText": {
+
"enabled": true
+
},
+
"unindent": {
+
"enabled": true
+
},
+
"moonlight-css": {
+
"enabled": true,
+
"config": {
+
"paths": [
+
"https://gist.githubusercontent.com/90-008/67ee4f4090a6892b760bb242dee7d34d/raw/5ae2efc2ab08e42f1966d2f5b0e0a4163b1e7433/dickcord.css",
+
"https://gist.githubusercontent.com/90-008/d47b927184ae485456956840692edca0/raw/90d40509c67fd4068d133662b7320842fd1e4772/gistfile1.txt",
+
"https://gist.githubusercontent.com/90-008/b031ebeb852bda832c1ba6258b4bdfa1/raw/ae1a3077a7edc8db2511b868eb8ac44f66f98905/hide.css",
+
"https://gist.githubusercontent.com/90-008/b5e835890e263bf1eec4a9d83b4a8dbe/raw/3780220391742455c2e9fd0230af45e3c6091829/gistfile1.css",
+
"https://ukriu.github.io/cssCord/Other/noDistractions.css",
+
"https://raw.githubusercontent.com/Bonkeyzz/Discord-Remove-useless-chat-buttons/main/RemoveChatButtons.theme.css"
+
],
+
"themeAttributes": true
+
}
+
},
+
"selectivelyReduceMotion": {
+
"enabled": true,
+
"config": {
+
"avatarDecorations": false,
+
"profileEffects": false,
+
"scrolling": true
+
}
+
},
+
"mediaTweaks": {
+
"enabled": true,
+
"config": {
+
"noThumbnailSize": false,
+
"noWebp": false,
+
"noGifAutosend": false,
+
"imageUrls": false
+
}
+
},
+
"allActivities": {
+
"enabled": true
+
},
+
"betterTags": {
+
"enabled": true
+
},
+
"noHelp": {
+
"enabled": true
+
},
+
"noReplyChainNag": {
+
"enabled": true
+
},
+
"onePingPerDM": {
+
"enabled": true,
+
"config": {
+
"allowMentionsBypass": true
+
}
+
},
+
"silenceTyping": {
+
"enabled": true
+
},
+
"betterUploadButton": {
+
"enabled": true
+
},
+
"customSearchEngine": {
+
"enabled": true
+
},
+
"dmDates": {
+
"enabled": true
+
},
+
"doubleClickActions": {
+
"enabled": false
+
},
+
"imgTitle": {
+
"enabled": true,
+
"config": {
+
"showFullUrl": true
+
}
+
},
+
"imageViewer": {
+
"enabled": true
+
},
+
"inviteToNowhere": {
+
"enabled": true
+
},
+
"markdown": {
+
"enabled": true
+
},
+
"mentionAvatars": {
+
"enabled": true
+
},
+
"noInlineLinks": {
+
"enabled": true
+
},
+
"noMaskedLinkPaste": {
+
"enabled": true
+
},
+
"openExternally": {
+
"enabled": true
+
},
+
"resolver": {
+
"enabled": true
+
},
+
"alwaysFocus": false,
+
"callIdling": true,
+
"colorConsistency": true,
+
"freeScreenShare": true,
+
"highlight": {
+
"enabled": false,
+
"config": {
+
"ignoreFocusMode": true,
+
"keywords": []
+
}
+
},
+
"spacepack": {
+
"config": {
+
"addToGlobalScope": true
+
}
+
},
+
"muteGuildOnJoin": true,
+
"antiDelete": {
+
"enabled": true,
+
"config": {
+
"ignoreBots": false,
+
"ignoreSelf": true,
+
"ignorePluralKit": false,
+
"ignoredUsers": [
+
"647368715742216193",
+
"798918994987188276"
+
]
+
}
+
},
+
"nameColor": {
+
"enabled": true,
+
"config": {
+
"colorize": "All"
+
}
+
},
+
"freeMoji": true,
+
"freeStickers": true,
+
"meow": {
+
"enabled": true,
+
"config": {
+
"woof": true
+
}
+
},
+
"doubleClickToJoin": true,
+
"linkRedirect": false,
+
"manuallyJoinVoice": true,
+
"popoutDates": true,
+
"removeTopBar": true,
+
"streamQualityWorkaround": true,
+
"whosWatching": false,
+
"cleanChatBar": {
+
"enabled": true,
+
"config": {
+
"removedButtons": [
+
"gift",
+
"activity",
+
"sticker"
+
]
+
}
+
},
+
"favouriteGifSearch": true,
+
"noOnboardingDelay": true
+
},
+
"repositories": [
+
"https://moonlight-mod.github.io/extensions-dist/repo.json",
+
"https://cynosphere.github.io/schirra/repo.json",
+
"https://lare354.github.io/moonlight-plugins/repo.json"
+
]
+
}
+20 -3
users/modules/foot/default.nix
···
}:
{
settings.terminal.name = "foot";
-
settings.terminal.binary = "${pkgs.foot}/bin/foot";
+
settings.terminal.binary = "${pkgs.foot}/bin/footclient";
programs.foot = {
enable = true;
package = pkgs.foot;
-
server.enable = false;
-
settings.main.dpi-aware = lib.mkForce "yes";
+
server.enable = true;
+
settings = {
+
# colors = {
+
# alpha = 0.7;
+
# background = "000000";
+
# };
+
main = {
+
# login-shell = "yes";
+
dpi-aware = lib.mkForce "yes";
+
};
+
csd = {
+
preferred = "client";
+
size = 0;
+
};
+
mouse.hide-when-typing = "yes";
+
scrollback.lines = 100000;
+
bell.system = "no";
+
};
};
+
stylix.targets.foot.enable = true;
}
+58 -41
users/modules/git/default.nix
···
{ pkgs, ... }:
+
let
+
name = "dawn";
+
email = "90008@gaze.systems";
+
in
{
programs.git = {
enable = true;
-
extraConfig = {
-
pull.rebase = true;
-
safe.directory = "/etc/nixos";
-
diff.external = "${pkgs.difftastic}/bin/difft";
-
};
-
lfs.enable = true;
-
aliases = {
-
a = "add -p";
-
co = "checkout";
-
cob = "checkout -b";
-
f = "fetch -p";
-
c = "commit";
-
ps = "push";
-
pl = "pull";
-
rb = "rebase";
-
ba = "branch -a";
-
bd = "branch -d";
-
bD = "branch -D";
-
d = "diff";
-
dc = "diff --cached";
-
ds = "diff --staged";
-
rs = "restore";
-
rss = "restore --staged";
-
s = "status -sb";
-
ss = "stash";
-
ssp = "stash pop";
-
ssl = "stash list";
-
ssd = "stash drop";
-
# reset
-
rsoft = "reset --soft";
-
rhard = "reset --hard";
-
rs1ft = "soft HEAD~1";
-
rh1rd = "hard HEAD~1";
-
# logging
-
l = "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";
-
};
+
includes = [
+
{
+
contents = {
+
gpg.format = "ssh";
+
commit.gpgsign = true;
+
user = {
+
inherit name email;
+
signingkey = builtins.readFile ../../../secrets/yusdacra.key.pub;
+
};
+
};
+
}
+
{
+
contents = {
+
+
pull.rebase = true;
+
diff.external = "${pkgs.difftastic}/bin/difft";
+
alias = {
+
a = "add -p";
+
co = "checkout";
+
cob = "checkout -b";
+
f = "fetch -p";
+
c = "commit";
+
ps = "push";
+
pl = "pull";
+
rb = "rebase";
+
ba = "branch -a";
+
bd = "branch -d";
+
bD = "branch -D";
+
d = "diff";
+
dc = "diff --cached";
+
ds = "diff --staged";
+
rs = "restore";
+
rss = "restore --staged";
+
s = "status -sb";
+
ss = "stash";
+
ssp = "stash pop";
+
ssl = "stash list";
+
ssd = "stash drop";
+
# reset
+
rsoft = "reset --soft";
+
rhard = "reset --hard";
+
rs1ft = "soft HEAD~1";
+
rh1rd = "hard HEAD~1";
+
# logging
+
l = "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";
+
};
+
};
+
}
+
];
};
}
+1 -2
users/modules/helix/default.nix
···
{
-
# stylix.targets.helix.enable = false;
+
stylix.targets.helix.enable = true;
programs.helix = {
enable = true;
languages.language = [
···
}
];
settings = {
-
theme = "ferra";
editor = {
soft-wrap.enable = true;
line-number = "relative";
+7 -3
users/modules/mako/default.nix
···
{ ... }:
{
-
programs.mako = {
+
stylix.targets.mako.enable = true;
+
services.mako = {
enable = true;
-
anchor = "top-center";
-
borderRadius = 16;
+
settings = {
+
anchor = "top-right";
+
border-radius = 2;
+
default-timeout = 4000;
+
};
};
}
+364
users/modules/niri/config.kdl
···
+
// This config is in the KDL format: https://kdl.dev
+
// "/-" comments out the following node.
+
// Check the wiki for a full description of the configuration:
+
// https://yalter.github.io/niri/Configuration:-Introduction
+
+
// Input device configuration.
+
// Find the full list of options on the wiki:
+
// https://yalter.github.io/niri/Configuration:-Input
+
input {
+
keyboard {
+
xkb {
+
// You can set rules, model, layout, variant and options.
+
// For more information, see xkeyboard-config(7).
+
+
// For example:
+
// layout "us,ru"
+
// options "grp:win_space_toggle,compose:ralt,ctrl:nocaps"
+
options "compose:ralt"
+
+
// If this section is empty, niri will fetch xkb settings
+
// from org.freedesktop.locale1. You can control these using
+
// localectl set-x11-keymap.
+
}
+
+
// Enable numlock on startup, omitting this setting disables it.
+
// numlock
+
}
+
+
touchpad {
+
// off
+
tap
+
// dwt
+
// dwtp
+
// drag false
+
// drag-lock
+
natural-scroll
+
// accel-speed 0.2
+
accel-profile "flat"
+
// scroll-method "two-finger"
+
// disabled-on-external-mouse
+
}
+
+
mouse {
+
// off
+
// natural-scroll
+
// accel-speed 0.2
+
accel-profile "flat"
+
// scroll-method "no-scroll"
+
}
+
+
trackpoint {
+
// off
+
// natural-scroll
+
// accel-speed 0.2
+
accel-profile "flat"
+
// scroll-method "on-button-down"
+
// scroll-button 273
+
// scroll-button-lock
+
// middle-emulation
+
}
+
+
warp-mouse-to-focus
+
focus-follows-mouse max-scroll-amount="0%"
+
+
mod-key "Super"
+
mod-key-nested "Alt"
+
}
+
+
output "HDMI-A-2" {
+
mode "1920x1080@74.973"
+
scale 1
+
}
+
+
output "DP-1" {
+
mode "1920x1080@165.009"
+
scale 1
+
}
+
+
// Settings that influence how windows are positioned and sized.
+
// Find more information on the wiki:
+
// https://yalter.github.io/niri/Configuration:-Layout
+
layout {
+
// Set gaps around windows in logical pixels.
+
gaps 0
+
+
// When to center a column when changing focus, options are:
+
// - "never", default behavior, focusing an off-screen column will keep at the left
+
// or right edge of the screen.
+
// - "always", the focused column will always be centered.
+
// - "on-overflow", focusing a column will center it if it doesn't fit
+
// together with the previously focused column.
+
center-focused-column "never"
+
+
// You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between.
+
preset-column-widths {
+
// Proportion sets the width as a fraction of the output width, taking gaps into account.
+
// For example, you can perfectly fit four windows sized "proportion 0.25" on an output.
+
// The default preset widths are 1/3, 1/2 and 2/3 of the output.
+
proportion 0.33333
+
proportion 0.5
+
proportion 0.66667
+
+
// Fixed sets the width in logical pixels exactly.
+
// fixed 1920
+
}
+
+
// default-column-width { proportion 1.0; }
+
+
focus-ring { off; }
+
border { off; }
+
// shadow { off; }
+
+
struts { }
+
}
+
+
spawn-at-startup "swaybg" "-i" "%%wallpaper%%"
+
+
hotkey-overlay {
+
// skip-at-startup
+
}
+
+
prefer-no-csd
+
+
screenshot-path "~/shots/%Y-%m-%d_%H-%M-%S.png"
+
+
environment {
+
ELECTRON_OZONE_PLATFORM_HINT "auto"
+
}
+
+
animations {
+
// off
+
+
// Slow down all animations by this factor. Values below 1 speed them up instead.
+
slowdown 1.4
+
}
+
+
// Open the Firefox picture-in-picture player as floating by default.
+
window-rule {
+
// This app-id regular expression will work for both:
+
// - host Firefox (app-id is "firefox")
+
// - Flatpak Firefox (app-id is "org.mozilla.firefox")
+
match app-id=r#"firefox$"# title="^Picture-in-Picture$"
+
+
open-floating true
+
}
+
+
window-rule {
+
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
+
match app-id=r#"^org\.gnome\.World\.Secrets$"#
+
// match namespace="^notifications$"
+
+
block-out-from "screen-capture"
+
}
+
+
window-rule {
+
match app-id="steam" title=r#"^notificationtoasts_\d+_desktop$"#
+
default-floating-position x=10 y=10 relative-to="bottom-right"
+
}
+
+
window-rule {
+
geometry-corner-radius 0
+
clip-to-geometry true
+
}
+
+
binds {
+
Mod+Shift+Slash { show-hotkey-overlay; }
+
+
Mod+Return hotkey-overlay-title="terminal: foot" { spawn "footclient"; }
+
Mod+D hotkey-overlay-title="launcher: wofi" { spawn "tofi-drun"; }
+
+
Alt+S hotkey-overlay-title="screenshot screen" { screenshot-screen; }
+
Alt+Shift+S hotkey-overlay-title="screenshot" { screenshot; }
+
+
XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+"; }
+
XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; }
+
XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; }
+
XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; }
+
+
XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; }
+
XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; }
+
+
Mod+O repeat=false { toggle-overview; }
+
Mod+Q cooldown-ms=50 { close-window; }
+
+
Mod+Left { focus-column-left; }
+
Mod+Down { focus-window-down; }
+
Mod+Up { focus-window-up; }
+
Mod+Right { focus-column-right; }
+
Mod+H { focus-column-left; }
+
Mod+J { focus-window-down; }
+
Mod+K { focus-window-up; }
+
Mod+L { focus-column-right; }
+
+
Mod+Shift+Left { move-column-left; }
+
Mod+Shift+Down { move-window-down; }
+
Mod+Shift+Up { move-window-up; }
+
Mod+Shift+Right { move-column-right; }
+
Mod+Shift+H { move-column-left; }
+
Mod+Shift+J { move-window-down; }
+
Mod+Shift+K { move-window-up; }
+
Mod+Shift+L { move-column-right; }
+
+
// Alternative commands that move across workspaces when reaching
+
// the first or last window in a column.
+
// Mod+J { focus-window-or-workspace-down; }
+
// Mod+K { focus-window-or-workspace-up; }
+
// Mod+Ctrl+J { move-window-down-or-to-workspace-down; }
+
// Mod+Ctrl+K { move-window-up-or-to-workspace-up; }
+
+
Mod+Home { focus-column-first; }
+
Mod+End { focus-column-last; }
+
Mod+Ctrl+Home { move-column-to-first; }
+
Mod+Ctrl+End { move-column-to-last; }
+
+
Mod+Ctrl+Left { focus-monitor-left; }
+
Mod+Ctrl+Down { focus-monitor-down; }
+
Mod+Ctrl+Up { focus-monitor-up; }
+
Mod+Ctrl+Right { focus-monitor-right; }
+
Mod+Ctrl+H { focus-monitor-left; }
+
Mod+Ctrl+J { focus-monitor-down; }
+
Mod+Ctrl+K { focus-monitor-up; }
+
Mod+Ctrl+L { focus-monitor-right; }
+
+
Mod+Shift+Ctrl+Left { move-column-to-monitor-left; }
+
Mod+Shift+Ctrl+Down { move-column-to-monitor-down; }
+
Mod+Shift+Ctrl+Up { move-column-to-monitor-up; }
+
Mod+Shift+Ctrl+Right { move-column-to-monitor-right; }
+
Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
+
Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
+
Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
+
Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
+
+
Mod+Page_Down { focus-workspace-down; }
+
Mod+Page_Up { focus-workspace-up; }
+
//Mod+U { focus-workspace-down; }
+
//Mod+I { focus-workspace-up; }
+
Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
+
Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
+
//Mod+Ctrl+U { move-column-to-workspace-down; }
+
//Mod+Ctrl+I { move-column-to-workspace-up; }
+
+
Mod+Shift+Page_Down { move-workspace-down; }
+
Mod+Shift+Page_Up { move-workspace-up; }
+
Mod+Shift+U { move-workspace-down; }
+
Mod+Shift+I { move-workspace-up; }
+
+
// You can bind mouse wheel scroll ticks using the following syntax.
+
// These binds will change direction based on the natural-scroll setting.
+
//
+
// To avoid scrolling through workspaces really fast, you can use
+
// the cooldown-ms property. The bind will be rate-limited to this value.
+
// You can set a cooldown on any bind, but it's most useful for the wheel.
+
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
+
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
+
Mod+Shift+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
+
Mod+Shift+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
+
+
// Usually scrolling up and down with Shift in applications results in
+
// horizontal scrolling; these binds replicate that.
+
Alt+WheelScrollDown { focus-column-right; }
+
Alt+WheelScrollUp { focus-column-left; }
+
Alt+Shift+WheelScrollDown { move-column-right; }
+
Alt+Shift+WheelScrollUp { move-column-left; }
+
+
Mod+1 { focus-workspace 1; }
+
Mod+2 { focus-workspace 2; }
+
Mod+3 { focus-workspace 3; }
+
Mod+4 { focus-workspace 4; }
+
Mod+5 { focus-workspace 5; }
+
Mod+6 { focus-workspace 6; }
+
Mod+7 { focus-workspace 7; }
+
Mod+8 { focus-workspace 8; }
+
Mod+9 { focus-workspace 9; }
+
Mod+Ctrl+1 { move-column-to-workspace 1; }
+
Mod+Ctrl+2 { move-column-to-workspace 2; }
+
Mod+Ctrl+3 { move-column-to-workspace 3; }
+
Mod+Ctrl+4 { move-column-to-workspace 4; }
+
Mod+Ctrl+5 { move-column-to-workspace 5; }
+
Mod+Ctrl+6 { move-column-to-workspace 6; }
+
Mod+Ctrl+7 { move-column-to-workspace 7; }
+
Mod+Ctrl+8 { move-column-to-workspace 8; }
+
Mod+Ctrl+9 { move-column-to-workspace 9; }
+
+
// Switches focus between the current and the previous workspace.
+
// Mod+Tab { focus-workspace-previous; }
+
+
// The following binds move the focused window in and out of a column.
+
// If the window is alone, they will consume it into the nearby column to the side.
+
// If the window is already in a column, they will expel it out.
+
Mod+BracketLeft { consume-or-expel-window-left; }
+
Mod+BracketRight { consume-or-expel-window-right; }
+
+
// Consume one window from the right to the bottom of the focused column.
+
Mod+Comma { consume-window-into-column; }
+
// Expel the bottom window from the focused column to the right.
+
Mod+Period { expel-window-from-column; }
+
+
Mod+R { switch-preset-column-width; }
+
// Cycling through the presets in reverse order is also possible.
+
// Mod+R { switch-preset-column-width-back; }
+
Mod+Shift+R { switch-preset-window-height; }
+
Mod+Ctrl+R { reset-window-height; }
+
Mod+F { maximize-column; }
+
Mod+Shift+F { fullscreen-window; }
+
+
// Expand the focused column to space not taken up by other fully visible columns.
+
// Makes the column "fill the rest of the space".
+
Mod+Ctrl+F { expand-column-to-available-width; }
+
+
Mod+C { center-column; }
+
+
// Center all fully visible columns on screen.
+
Mod+Ctrl+C { center-visible-columns; }
+
+
// Finer width adjustments.
+
// This command can also:
+
// * set width in pixels: "1000"
+
// * adjust width in pixels: "-5" or "+5"
+
// * set width as a percentage of screen width: "25%"
+
// * adjust width as a percentage of screen width: "-10%" or "+10%"
+
// Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,
+
// set-column-width "100" will make the column occupy 200 physical screen pixels.
+
Mod+Minus { set-column-width "-10%"; }
+
Mod+Equal { set-column-width "+10%"; }
+
+
// Finer height adjustments when in column with other windows.
+
Mod+Shift+Minus { set-window-height "-10%"; }
+
Mod+Shift+Equal { set-window-height "+10%"; }
+
+
// Move the focused window between the floating and the tiling layout.
+
Mod+V { toggle-window-floating; }
+
Mod+Shift+V { switch-focus-between-floating-and-tiling; }
+
+
// Toggle tabbed column display mode.
+
// Windows in this column will appear as vertical tabs,
+
// rather than stacked on top of each other.
+
Mod+W { toggle-column-tabbed-display; }
+
+
// Actions to switch layouts.
+
// Note: if you uncomment these, make sure you do NOT have
+
// a matching layout switch hotkey configured in xkb options above.
+
// Having both at once on the same hotkey will break the switching,
+
// since it will switch twice upon pressing the hotkey (once by xkb, once by niri).
+
// Mod+Space { switch-layout "next"; }
+
// Mod+Shift+Space { switch-layout "prev"; }
+
+
// Applications such as remote-desktop clients and software KVM switches may
+
// request that niri stops processing the keyboard shortcuts defined here
+
// so they may, for example, forward the key presses as-is to a remote machine.
+
// It's a good idea to bind an escape hatch to toggle the inhibitor,
+
// so a buggy application can't hold your session hostage.
+
//
+
// The allow-inhibiting=false property can be applied to other binds as well,
+
// which ensures niri always processes them, even when an inhibitor is active.
+
Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
+
+
// The quit action will show a confirmation dialog to avoid accidental exits.
+
Mod+Shift+E { quit; }
+
Ctrl+Alt+Delete { quit; }
+
+
// Powers off the monitors. To turn them back on, do any input like
+
// moving the mouse or pressing any other key.
+
Mod+Shift+P { power-off-monitors; }
+
}
+31
users/modules/niri/default.nix
···
+
{
+
config,
+
nixosConfig,
+
pkgs,
+
lib,
+
tlib,
+
...
+
}:
+
let
+
l = lib;
+
in
+
{
+
imports = [
+
../wayland
+
../wlsunset
+
../mako
+
../tofi
+
];
+
+
home.packages = with pkgs; [niri xwayland-satellite brightnessctl swaybg];
+
xdg.configFile."niri/config.kdl".text =
+
let
+
replace = {
+
wallpaper = toString ../../mayer/wallpaper.png;
+
};
+
in
+
l.replaceStrings
+
(l.map (n: "%%${n}%%") (l.attrNames replace))
+
(l.attrValues replace)
+
(l.fileContents ./config.kdl);
+
}
+10 -62
users/modules/nushell/default.nix
···
{ pkgs, lib, ... }:
{
+
home.shell.enableNushellIntegration = true;
+
+
stylix.targets.nushell.enable = true;
programs.carapace.enable = true;
-
programs.carapace.enableNushellIntegration = true;
programs.nushell = {
enable = true;
-
shellAliases = {
-
myip = lib.mkForce "echo";
+
shellAliases = lib.mapAttrs (_: lib.mkForce) {
+
myip = "echo";
+
l = "ls";
+
ls = "ls";
+
ll = "ls -l";
+
la = "ls -a";
};
extraEnv = ''
source-env ${./prompt.nu}
'';
extraConfig = ''
-
let carapace_completer = {|spans: list<string>|
-
carapace $spans.0 nushell ...$spans
-
| from json
-
| if ($in | default [] | where value == $"($spans | last)ERR" | is-empty) { $in } else { null }
-
}
-
$env.CARAPACE_BRIDGES = 'zsh,fish,bash,inshellisense'
-
-
let fish_completer = {|spans|
-
${lib.getExe pkgs.fish} --command $'complete "--do-complete=($spans | str join " ")"'
-
| $"value(char tab)description(char newline)" + $in
-
| from tsv --flexible --no-infer
-
}
-
-
let zoxide_completer = {|spans|
-
$spans | skip 1 | zoxide query -l ...$in | lines | where {|x| $x != $env.PWD}
-
}
-
-
let multiple_completers = {|spans|
-
## alias fixer start https://www.nushell.sh/cookbook/external_completers.html#alias-completions
-
let expanded_alias = scope aliases
-
| where name == $spans.0
-
| get -i 0.expansion
-
-
let spans = if $expanded_alias != null {
-
$spans
-
| skip 1
-
| prepend ($expanded_alias | split row ' ' | take 1)
-
} else {
-
$spans
-
}
-
## alias fixer end
-
-
match $spans.0 {
-
__zoxide_z | __zoxide_zi => $zoxide_completer
-
_ => $carapace_completer
-
} | do $in $spans
-
}
-
-
$env.config = {
-
show_banner: false,
-
completions: {
-
case_sensitive: false # case-sensitive completions
-
quick: true # set to false to prevent auto-selecting completions
-
partial: true # set to false to prevent partial filling of the prompt
-
algorithm: "fuzzy" # prefix or fuzzy
-
external: {
-
# set to false to prevent nushell looking into $env.PATH to find more suggestions
-
enable: true
-
# set to lower can improve completion performance at the cost of omitting some options
-
max_results: 100
-
completer: $multiple_completers
-
}
-
}
-
}
-
$env.PATH = ($env.PATH |
-
split row (char esep) |
-
append /usr/bin/env
-
)
-
source ${./aliases.nu}
+
$env.config.show_banner = false
'';
};
}
+1 -1
users/modules/rofi/default.nix
···
{ pkgs, ... }:
{
+
stylix.targets.rofi.enable = true;
programs.rofi = {
enable = true;
-
package = pkgs.rofi-wayland;
};
}
-12
users/modules/settings/default.nix
···
type = t.bool;
default = true;
};
-
settings.iconTheme = {
-
name = l.mkOption {
-
type = t.str;
-
};
-
package = l.mkOption {
-
type = t.package;
-
};
-
};
settings.terminal = {
name = l.mkOption {
type = t.str;
···
type = t.path;
};
};
-
};
-
-
config = l.mkIf cfg.enable {
-
gtk.iconTheme = cfg.iconTheme;
};
}
+10 -10
users/modules/ssh/default.nix
···
enable = true;
enableDefaultConfig = false;
matchBlocks."*" = {
-
forwardAgent = false;
-
serverAliveInterval = 0;
-
serverAliveCountMax = 3;
-
compression = true;
-
hashKnownHosts = true;
-
addKeysToAgent = "yes";
-
userKnownHostsFile = "~/.ssh/known_hosts";
-
controlMaster = "no";
-
controlPath = "~/.ssh/master-%r@%n:%p";
-
controlPersist = "no";
+
forwardAgent = false;
+
serverAliveInterval = 0;
+
serverAliveCountMax = 3;
+
compression = true;
+
hashKnownHosts = true;
+
addKeysToAgent = "yes";
+
userKnownHostsFile = "~/.ssh/known_hosts";
+
controlMaster = "no";
+
controlPath = "~/.ssh/master-%r@%n:%p";
+
controlPersist = "no";
};
# Only needed for darcs hub
# extraConfig = ''
+29 -26
users/modules/sway/default.nix
···
imports = [
../wayland
../swaylock
+
# ../swayidle
../wlsunset
-
../dunst
-
../rofi
+
../mako
+
../tofi
# ./swayidle.nix
];
+
+
stylix.targets.sway.enable = true;
wayland.windowManager = {
sway =
let
-
mkRofiCmd =
-
args:
-
"${config.programs.rofi.package}/bin/rofi ${lib.concatStringsSep " " args} | ${pkgs.sway}/bin/swaymsg --";
inherit (tlib) pkgBin;
in
{
enable = true;
-
extraSessionCommands = ''
-
export QT_QPA_PLATFORM=wayland
-
'';
wrapperFeatures.gtk = true;
-
extraConfig = ''
-
exec dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway
-
exec xprop -root -f _XWAYLAND_GLOBAL_OUTPUT_SCALE 32c -set _XWAYLAND_GLOBAL_OUTPUT_SCALE 2
-
'';
+
systemd.variables = [ "--all" ];
config = {
bars = [ ];
-
gaps.smartBorders = "on";
-
menu = mkRofiCmd [
-
"-show"
-
"drun"
-
];
+
window = {
+
border = 0;
+
titlebar = false;
+
};
+
menu = "${config.programs.tofi.package}/bin/tofi-drun";
modifier = "Mod4";
terminal = config.settings.terminal.binary;
+
startup = [
+
{ command = "mkdir -p ${config.home.homeDirectory}/shots"; }
+
];
keybindings =
let
mod = config.wayland.windowManager.sway.config.modifier;
···
shotDir = config.home.homeDirectory + "/shots";
in
lib.mkOptionDefault {
+
"${mod}+d" = "exec ${config.wayland.windowManager.sway.config.menu}";
+
"${mod}+Return" = "exec ${config.wayland.windowManager.sway.config.terminal}";
"${mod}+Escape" = "exec ${wlogout} -p layer-shell";
"${mod}+q" = "kill";
"${mod}+Shift+e" = "exit";
"${mod}+Shift+r" = "reload";
-
# Screenshot and copy it to clipboard
+
# screenshot and copy it to clipboard
"Mod1+s" = ''
exec export SFILE="${shotFile}.png" && mkdir -p ${shotDir} && ${grim} "$SFILE" && ${cat} "$SFILE" | ${wl-copy} -t image/png
'';
-
# Save selected area as a picture and copy it to clipboard
+
# save selected area as a picture and copy it to clipboard
"Mod1+Shift+s" = ''
exec export SFILE="${shotFile}.png" && mkdir -p ${shotDir} && ${grim} -g "$(${slurp})" "$SFILE" && ${cat} "$SFILE" | ${wl-copy} -t image/png
'';
-
# Record screen
-
"Mod1+r" = ''exec mkdir -p ${shotDir} && ${wf-recorder} -x yuv420p -f "${shotFile}.mp4"'';
-
# Record an area
+
# record screen
+
"Mod1+r" =
+
''exec mkdir -p ${shotDir} && ${wf-recorder} --audio-backend=pipewire --audio=alsa_output.pci-0000_09_00.4.pro-output-0.monitor -f "${shotFile}.mp4"'';
+
# record an area
"Mod1+Shift+r" =
-
''exec mkdir -p ${shotDir} && ${wf-recorder} -x yuv420p -g "$(${slurp})" -f "${shotFile}.mp4"'';
-
# Stop recording
+
''exec mkdir -p ${shotDir} && ${wf-recorder} --audio-backend=pipewire --audio=alsa_output.pci-0000_09_00.4.pro-output-0.monitor -g "$(${slurp})" -f "${shotFile}.mp4"'';
+
# stop recording
"Mod1+c" = "exec pkill -INT wf-recorder";
"XF86AudioRaiseVolume" = "exec ${pactl} set-sink-volume 0 +5%";
"XF86AudioLowerVolume" = "exec ${pactl} set-sink-volume 0 -5%";
···
};
input = {
"13364:832:Keychron_Keychron_V4_Keyboard" = {
-
xkb_layout = nixosConfig.services.xserver.layout;
+
xkb_layout = nixosConfig.services.xserver.xkb.layout;
};
"1:1:AT_Translated_Set_2_keyboard" = {
xkb_layout = "tr";
···
scale = "2";
adaptive_sync = "on";
};
-
"HDMI-A-1" = {
+
"DP-1" = {
+
mode = "1920x1080@165.009Hz";
+
};
+
"HDMI-A-2" = {
mode = "1920x1080@74.973Hz";
};
};
+45
users/modules/swayidle/default.nix
···
+
{ pkgs, ... }:
+
{
+
services.swayidle =
+
let
+
# Lock command
+
lock = "${pkgs.swaylock}/bin/swaylock --daemonize";
+
display = status: "swaymsg 'output * power ${status}'";
+
in
+
{
+
enable = true;
+
timeouts = [
+
{
+
timeout = 60;
+
command = display "off";
+
resumeCommand = display "on";
+
}
+
{
+
timeout = 60 * 5;
+
command = lock;
+
}
+
{
+
timeout = 60 * 10;
+
command = "${pkgs.systemd}/bin/systemctl suspend";
+
}
+
];
+
events = [
+
{
+
event = "before-sleep";
+
command = (display "off") + "; " + lock;
+
}
+
{
+
event = "after-resume";
+
command = display "on";
+
}
+
{
+
event = "lock";
+
command = (display "off") + "; " + lock;
+
}
+
{
+
event = "unlock";
+
command = display "on";
+
}
+
];
+
};
+
}
+1
users/modules/swaylock/default.nix
···
{ pkgs, ... }:
{
+
stylix.targets.swaylock.enable = true;
programs.swaylock = {
package = pkgs.swaylock-effects;
settings = {
+24
users/modules/tofi/default.nix
···
+
{ pkgs, lib, config, ... }:
+
{
+
stylix.targets.tofi.enable = true;
+
programs.tofi = {
+
enable = true;
+
package = pkgs.tofi.overrideAttrs (old: {
+
patches = [(pkgs.fetchpatch2 {
+
url = "https://patch-diff.githubusercontent.com/raw/philj56/tofi/pull/189.patch";
+
hash = "sha256-qsXRyNE9x1sSDrCq/LTQY/DTEMwYAJB3U0/dPXX/jw4=";
+
})];
+
});
+
settings = {
+
outline-width = 0;
+
border-width = 0;
+
width = "48%";
+
height = "20%";
+
num-results = 7;
+
font = lib.mkForce "${config.stylix.fonts.serif.package}/share/fonts/truetype/ComicRelief.ttf";
+
hint-font = false;
+
ascii-input = true;
+
drun-launch = true;
+
};
+
};
+
}
+10
users/modules/zed/default.nix
···
+
{ pkgs, ... }:
+
{
+
stylix.targets.zed.enable = true;
+
programs.zed-editor = {
+
enable = true;
+
extensions = [ "nix" "deno" "toml" "svelte" ];
+
extraPackages = with pkgs; [ nixd nil ];
+
installRemoteServer = true;
+
};
+
}
+4
users/modules/zen/default.nix
···
+
{ terra, ... }:
+
{
+
home.packages = [ terra.zen-browser ];
+
}
+1 -12
users/modules/zoxide/default.nix
···
{
-
pkgs,
-
config,
-
lib,
-
...
-
}:
-
{
-
home.packages = [ pkgs.zoxide ];
-
home.persistence."${config.system.persistDir}${config.home.homeDirectory}".directories =
-
lib.singleton ".local/share/zoxide";
-
programs.zsh.initExtra = ''
-
eval "$(zoxide init zsh)"
-
'';
+
programs.zoxide.enable = true;
}
+10 -4
users/root/default.nix
···
-
{ pkgs, ... }:
+
{ inputs, pkgs, ... }:
{
-
users.users.root.initialHashedPassword = "$6$XLWo1sPpgp63Zm$XHBbULH9q1gb/.yalPPU/I7EgTcW80bM.moCjIe/qGyOwE47VcXNVbTHloBZdIWQq0MfIG0IxInAu59.oJyos/";
-
environment.systemPackages = [ pkgs.nushell ];
-
users.users.root.shell = pkgs.nushell;
+
users.users.root = {
+
shell = pkgs.nushell;
+
initialHashedPassword = "$6$XLWo1sPpgp63Zm$XHBbULH9q1gb/.yalPPU/I7EgTcW80bM.moCjIe/qGyOwE47VcXNVbTHloBZdIWQq0MfIG0IxInAu59.oJyos/";
+
openssh.authorizedKeys.keys = [
+
(builtins.readFile "${inputs.self}/secrets/yusdacra.key.pub")
+
];
+
};
+
+
environment.systemPackages = [pkgs.bashInteractive pkgs.nushell];
home-manager.users.root = {
imports = [ ../modules/nushell ];
};