nix machine / user configurations

Compare changes

Choose any two refs to compare.

Changed files
+9701 -3727
_sources
dns
hosts
chernobog
dzwonek
trimounts
volsinii
wolumonde
modules
pkgs-set
secrets
users
+106 -45
_sources/generated.json
···
{
"agenix": {
"cargoLocks": null,
-
"date": "2025-10-28",
+
"date": "2025-11-08",
"extract": null,
"name": "agenix",
"passthru": null,
···
"name": null,
"owner": "ryantm",
"repo": "agenix",
-
"rev": "9ba0d85de3eaa7afeab493fed622008b6e4924f5",
-
"sha256": "sha256-lsNWuj4Z+pE7s0bd2OKicOFq9bK86JE0ZGeKJbNqb94=",
+
"rev": "fcdea223397448d35d9b31f798479227e80183f6",
+
"sha256": "sha256-wyT7Pl6tMFbFrs8Lk/TlEs81N6L+VSybPfiIgzU8lbQ=",
"sparseCheckout": [],
"type": "github"
},
-
"version": "9ba0d85de3eaa7afeab493fed622008b6e4924f5"
+
"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,
···
},
"disko": {
"cargoLocks": null,
-
"date": "2025-10-17",
+
"date": "2025-12-01",
"extract": null,
"name": "disko",
"passthru": null,
···
"name": null,
"owner": "nix-community",
"repo": "disko",
-
"rev": "3a9450b26e69dcb6f8de6e2b07b3fc1c288d85f5",
-
"sha256": "sha256-y7UhnWlER8r776JsySqsbTUh2Txf7K30smfHlqdaIQw=",
+
"rev": "5a88a6eceb8fd732b983e72b732f6f4b8269bef3",
+
"sha256": "sha256-D6xc3Rl8Ab6wucJWdvjNsGYGSxNjQHzRc2EZ6eeQ6l4=",
"sparseCheckout": [],
"type": "github"
},
-
"version": "3a9450b26e69dcb6f8de6e2b07b3fc1c288d85f5"
+
"version": "5a88a6eceb8fd732b983e72b732f6f4b8269bef3"
},
"facter": {
"cargoLocks": null,
-
"date": "2025-10-22",
+
"date": "2025-11-27",
"extract": null,
"name": "facter",
"passthru": null,
···
"name": null,
"owner": "nix-community",
"repo": "nixos-facter-modules",
-
"rev": "70bcd64225d167c7af9b475c4df7b5abba5c7de8",
-
"sha256": "sha256-4lDjGnWRBLwqKQ4UWSUq6Mvxu9r8DSqCCydodW/Jsi8=",
+
"rev": "5ea68886d95218646d11d3551a476d458df00778",
+
"sha256": "sha256-3bbuneTKZBkYXlm0bE36kUjiDsasoIC1GWBw/UEJ9T4=",
"sparseCheckout": [],
"type": "github"
},
-
"version": "70bcd64225d167c7af9b475c4df7b5abba5c7de8"
+
"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-28",
+
"date": "2025-12-02",
"extract": null,
"name": "home",
"passthru": null,
···
"name": null,
"owner": "nix-community",
"repo": "home-manager",
-
"rev": "ca2ab1d877a24d5a437dad62f56b8b2c02e964e9",
-
"sha256": "sha256-fHr+tIYBJccNF8QWqgowfRmEAtAMSt1deZIRNKL8A7c=",
+
"rev": "ff067cfc619fdf6f82d50344e7d19ff2323f0827",
+
"sha256": "sha256-S41K55kw+hWgDfgKmZ9/fMZ3F0BQDMvqFfE120fMHeE=",
"sparseCheckout": [],
"type": "github"
},
-
"version": "ca2ab1d877a24d5a437dad62f56b8b2c02e964e9"
+
"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"
},
"moonlight": {
"cargoLocks": null,
-
"date": "2025-10-23",
+
"date": "2025-11-26",
"extract": null,
"name": "moonlight",
"passthru": null,
···
"name": null,
"owner": "moonlight-mod",
"repo": "moonlight",
-
"rev": "0b927a86a447a145f20bb5ee43fac79a724640f2",
-
"sha256": "sha256-lQpl6ecQfQ7KzEIytH3k4hLtvq+KkTL+3IR2ZukdZWM=",
+
"rev": "059476af87f7335c05424b805833864d6d9ed0e3",
+
"sha256": "sha256-Qur5AWl4Vx+It65DX+I+sc4lViz52OmXqvg+fL2t9I4=",
"sparseCheckout": [],
"type": "github"
},
-
"version": "0b927a86a447a145f20bb5ee43fac79a724640f2"
+
"version": "059476af87f7335c05424b805833864d6d9ed0e3"
},
"ncr": {
"cargoLocks": null,
···
},
"nixos-hardware": {
"cargoLocks": null,
-
"date": "2025-10-20",
+
"date": "2025-11-29",
"extract": null,
"name": "nixos-hardware",
"passthru": null,
···
"name": null,
"owner": "NixOS",
"repo": "nixos-hardware",
-
"rev": "d6645c340ef7d821602fd2cd199e8d1eed10afbc",
-
"sha256": "sha256-2m1S4jl+GEDtlt2QqeHil8Ny456dcGSKJAM7q3j/BFU=",
+
"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": {
+
"deepClone": false,
+
"fetchSubmodules": false,
+
"leaveDotGit": false,
+
"name": null,
+
"owner": "nix-community",
+
"repo": "nixpkgs-xr",
+
"rev": "e027c652c5a39267af02a4824a6020381cbcf7eb",
+
"sha256": "sha256-YG8APbeS7cWkA6AKiNWGD1muRIWSoSXAe5wAc4jWgaw=",
"sparseCheckout": [],
"type": "github"
},
-
"version": "d6645c340ef7d821602fd2cd199e8d1eed10afbc"
+
"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-10-28",
+
"date": "2025-12-01",
"extract": null,
"name": "stylix",
"passthru": null,
···
"name": null,
"owner": "nix-community",
"repo": "stylix",
-
"rev": "f8f4e3c3658ee962f8f332a56720c8dfc2836f7a",
-
"sha256": "sha256-nKOOPeblDcebtYfBjHo+PHXHKNSNKuifn1EGcBEgKWs=",
+
"rev": "71054adbc3629404b2f02e8385aec07f87980a2f",
+
"sha256": "sha256-hIj3aKL+G8TXrqvz0wCnUKESN5MEyrD4YxaLLARnkPs=",
"sparseCheckout": [],
"type": "github"
},
-
"version": "f8f4e3c3658ee962f8f332a56720c8dfc2836f7a"
+
"version": "71054adbc3629404b2f02e8385aec07f87980a2f"
},
"tangled": {
"cargoLocks": null,
-
"date": "2025-10-28",
+
"date": "2025-11-30",
"extract": null,
"name": "tangled",
"passthru": null,
···
"fetchSubmodules": false,
"leaveDotGit": false,
"name": null,
-
"rev": "7949848c82215f1fffa948bf5e61f7e8eff94a71",
-
"sha256": "sha256-yng1Usbmcwrcz3H214CF9Xp/zr58qr2578yw26YrTGk=",
+
"rev": "d37f774fb8c60aa2bd0cb965c9884457d0afb660",
+
"sha256": "sha256-u1i7aMo0fTQ6WVdOZhG2fo/gEx2Fq8+3URmuqEBZGWI=",
"sparseCheckout": [],
"type": "git",
"url": "https://tangled.org/@tangled.org/core"
},
-
"version": "7949848c82215f1fffa948bf5e61f7e8eff94a71"
+
"version": "d37f774fb8c60aa2bd0cb965c9884457d0afb660"
},
"tangled-sqlite-lib": {
"cargoLocks": null,
···
},
"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-10-27",
+
"date": "2025-12-01",
"extract": null,
"name": "zen-browser",
"passthru": null,
···
"name": null,
"owner": "0xc000022070",
"repo": "zen-browser-flake",
-
"rev": "79a94872a3e6993a051c4e22a2dcb02c1d088acf",
-
"sha256": "sha256-E1PobJMiFmVUX2YdqYk/MpKb0LXavOYvlg8DCBBzlHc=",
+
"rev": "8cded25e10b13e2999241f1c73a7d4e5e5d6f69e",
+
"sha256": "sha256-sJQHRL8trBoG/ArR+mUlyp5cyKU0pgQY+qDQzZGnVgM=",
"sparseCheckout": [],
"type": "github"
},
-
"version": "79a94872a3e6993a051c4e22a2dcb02c1d088acf"
+
"version": "8cded25e10b13e2999241f1c73a7d4e5e5d6f69e"
}
}
+85 -45
_sources/generated.nix
···
{
agenix = {
pname = "agenix";
-
version = "9ba0d85de3eaa7afeab493fed622008b6e4924f5";
+
version = "fcdea223397448d35d9b31f798479227e80183f6";
src = fetchFromGitHub {
owner = "ryantm";
repo = "agenix";
-
rev = "9ba0d85de3eaa7afeab493fed622008b6e4924f5";
+
rev = "fcdea223397448d35d9b31f798479227e80183f6";
fetchSubmodules = false;
-
sha256 = "sha256-lsNWuj4Z+pE7s0bd2OKicOFq9bK86JE0ZGeKJbNqb94=";
+
sha256 = "sha256-wyT7Pl6tMFbFrs8Lk/TlEs81N6L+VSybPfiIgzU8lbQ=";
};
-
date = "2025-10-28";
+
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";
···
};
disko = {
pname = "disko";
-
version = "3a9450b26e69dcb6f8de6e2b07b3fc1c288d85f5";
+
version = "5a88a6eceb8fd732b983e72b732f6f4b8269bef3";
src = fetchFromGitHub {
owner = "nix-community";
repo = "disko";
-
rev = "3a9450b26e69dcb6f8de6e2b07b3fc1c288d85f5";
+
rev = "5a88a6eceb8fd732b983e72b732f6f4b8269bef3";
fetchSubmodules = false;
-
sha256 = "sha256-y7UhnWlER8r776JsySqsbTUh2Txf7K30smfHlqdaIQw=";
+
sha256 = "sha256-D6xc3Rl8Ab6wucJWdvjNsGYGSxNjQHzRc2EZ6eeQ6l4=";
};
-
date = "2025-10-17";
+
date = "2025-12-01";
};
facter = {
pname = "facter";
-
version = "70bcd64225d167c7af9b475c4df7b5abba5c7de8";
+
version = "5ea68886d95218646d11d3551a476d458df00778";
src = fetchFromGitHub {
owner = "nix-community";
repo = "nixos-facter-modules";
-
rev = "70bcd64225d167c7af9b475c4df7b5abba5c7de8";
+
rev = "5ea68886d95218646d11d3551a476d458df00778";
fetchSubmodules = false;
-
sha256 = "sha256-4lDjGnWRBLwqKQ4UWSUq6Mvxu9r8DSqCCydodW/Jsi8=";
+
sha256 = "sha256-3bbuneTKZBkYXlm0bE36kUjiDsasoIC1GWBw/UEJ9T4=";
};
-
date = "2025-10-22";
+
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 = "ca2ab1d877a24d5a437dad62f56b8b2c02e964e9";
+
version = "ff067cfc619fdf6f82d50344e7d19ff2323f0827";
src = fetchFromGitHub {
owner = "nix-community";
repo = "home-manager";
-
rev = "ca2ab1d877a24d5a437dad62f56b8b2c02e964e9";
+
rev = "ff067cfc619fdf6f82d50344e7d19ff2323f0827";
fetchSubmodules = false;
-
sha256 = "sha256-fHr+tIYBJccNF8QWqgowfRmEAtAMSt1deZIRNKL8A7c=";
+
sha256 = "sha256-S41K55kw+hWgDfgKmZ9/fMZ3F0BQDMvqFfE120fMHeE=";
};
-
date = "2025-10-28";
+
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;
···
};
moonlight = {
pname = "moonlight";
-
version = "0b927a86a447a145f20bb5ee43fac79a724640f2";
+
version = "059476af87f7335c05424b805833864d6d9ed0e3";
src = fetchFromGitHub {
owner = "moonlight-mod";
repo = "moonlight";
-
rev = "0b927a86a447a145f20bb5ee43fac79a724640f2";
+
rev = "059476af87f7335c05424b805833864d6d9ed0e3";
fetchSubmodules = false;
-
sha256 = "sha256-lQpl6ecQfQ7KzEIytH3k4hLtvq+KkTL+3IR2ZukdZWM=";
+
sha256 = "sha256-Qur5AWl4Vx+It65DX+I+sc4lViz52OmXqvg+fL2t9I4=";
};
-
date = "2025-10-23";
+
date = "2025-11-26";
};
ncr = {
pname = "ncr";
···
};
nixos-hardware = {
pname = "nixos-hardware";
-
version = "d6645c340ef7d821602fd2cd199e8d1eed10afbc";
+
version = "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3";
src = fetchFromGitHub {
owner = "NixOS";
repo = "nixos-hardware";
-
rev = "d6645c340ef7d821602fd2cd199e8d1eed10afbc";
+
rev = "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3";
fetchSubmodules = false;
-
sha256 = "sha256-2m1S4jl+GEDtlt2QqeHil8Ny456dcGSKJAM7q3j/BFU=";
+
sha256 = "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4=";
};
-
date = "2025-10-20";
+
date = "2025-11-29";
+
};
+
nixpkgs-xr = {
+
pname = "nixpkgs-xr";
+
version = "e027c652c5a39267af02a4824a6020381cbcf7eb";
+
src = fetchFromGitHub {
+
owner = "nix-community";
+
repo = "nixpkgs-xr";
+
rev = "e027c652c5a39267af02a4824a6020381cbcf7eb";
+
fetchSubmodules = false;
+
sha256 = "sha256-YG8APbeS7cWkA6AKiNWGD1muRIWSoSXAe5wAc4jWgaw=";
+
};
+
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 = "f8f4e3c3658ee962f8f332a56720c8dfc2836f7a";
+
version = "71054adbc3629404b2f02e8385aec07f87980a2f";
src = fetchFromGitHub {
owner = "nix-community";
repo = "stylix";
-
rev = "f8f4e3c3658ee962f8f332a56720c8dfc2836f7a";
+
rev = "71054adbc3629404b2f02e8385aec07f87980a2f";
fetchSubmodules = false;
-
sha256 = "sha256-nKOOPeblDcebtYfBjHo+PHXHKNSNKuifn1EGcBEgKWs=";
+
sha256 = "sha256-hIj3aKL+G8TXrqvz0wCnUKESN5MEyrD4YxaLLARnkPs=";
};
-
date = "2025-10-28";
+
date = "2025-12-01";
};
tangled = {
pname = "tangled";
-
version = "7949848c82215f1fffa948bf5e61f7e8eff94a71";
+
version = "d37f774fb8c60aa2bd0cb965c9884457d0afb660";
src = fetchgit {
url = "https://tangled.org/@tangled.org/core";
-
rev = "7949848c82215f1fffa948bf5e61f7e8eff94a71";
+
rev = "d37f774fb8c60aa2bd0cb965c9884457d0afb660";
fetchSubmodules = false;
deepClone = false;
leaveDotGit = false;
sparseCheckout = [ ];
-
sha256 = "sha256-yng1Usbmcwrcz3H214CF9Xp/zr58qr2578yw26YrTGk=";
+
sha256 = "sha256-u1i7aMo0fTQ6WVdOZhG2fo/gEx2Fq8+3URmuqEBZGWI=";
};
-
date = "2025-10-28";
+
date = "2025-11-30";
};
tangled-sqlite-lib = {
pname = "tangled-sqlite-lib";
···
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 = "79a94872a3e6993a051c4e22a2dcb02c1d088acf";
+
version = "8cded25e10b13e2999241f1c73a7d4e5e5d6f69e";
src = fetchFromGitHub {
owner = "0xc000022070";
repo = "zen-browser-flake";
-
rev = "79a94872a3e6993a051c4e22a2dcb02c1d088acf";
+
rev = "8cded25e10b13e2999241f1c73a7d4e5e5d6f69e";
fetchSubmodules = false;
-
sha256 = "sha256-E1PobJMiFmVUX2YdqYk/MpKb0LXavOYvlg8DCBBzlHc=";
+
sha256 = "sha256-sJQHRL8trBoG/ArR+mUlyp5cyKU0pgQY+qDQzZGnVgM=";
};
-
date = "2025-10-27";
+
date = "2025-12-01";
};
}
+5
deploy.nu
···
user: "root",
addr: "199.71.188.53",
},
+
trimounts: {
+
type: "nixos",
+
user: "root",
+
addr: "159.195.58.28",
+
},
"dusk@devel.mobi": {
type: "home",
user: "dusk",
+76 -44
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_IP = "94.237.26.47";
+
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", DZWONEK_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": 1761512058,
-
"narHash": "sha256-FYDC/VM/Tu7bJ9uwxmZqIhkz7QblCcp65+LMb4StGTY=",
+
"lastModified": 1764517877,
+
"narHash": "sha256-pp3uT4hHijIC8JUK5MEqeAWmParJrgBVzHLNfJDZxg4=",
"owner": "NixOS",
"repo": "nixpkgs",
-
"rev": "42060c40fd43c114af7010980168f8dcba734d3b",
+
"rev": "2d293cbfa5a793b4c50d17c05ef9e385b90edf6c",
"type": "github"
},
"original": {
"owner": "NixOS",
+
"ref": "nixos-unstable",
"repo": "nixpkgs",
-
"rev": "42060c40fd43c114af7010980168f8dcba734d3b",
"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/42060c40fd43c114af7010980168f8dcba734d3b";
-
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:
+37 -22
hosts/chernobog/default.nix
···
{
-
config,
-
lib,
tlib,
pkgs,
inputs,
···
imports =
with inputs;
[
-
"${inputs.facter}/modules/nixos/facter.nix"
-
"${inputs.disko}/module.nix"
-
"${inputs.home}/nixos"
-
"${inputs.nixos-hardware}/common/pc"
-
"${inputs.nixos-hardware}/common/pc/ssd"
-
"${inputs.nixos-hardware}/common/cpu/amd"
-
"${inputs.nixos-hardware}/common/cpu/amd/pstate.nix"
-
"${inputs.nixos-hardware}/common/cpu/amd/zenpower.nix"
-
"${inputs.nixos-hardware}/common/gpu/amd"
+
"${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/base
+
../../modules
+
../../locale/default.nix
]
++ (tlib.importFolder (toString ./modules));
···
];
};
-
services.pipewire = {
-
enable = true;
-
audio.enable = true;
-
alsa.enable = true;
-
alsa.support32Bit = true;
-
pulse.enable = true;
-
jack.enable = true;
-
};
-
fonts = {
enableDefaultPackages = true;
-
packages = [ pkgs.dejavu_fonts ];
+
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;
+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];
+
}
+1
hosts/chernobog/modules/boot.nix
···
enable = true;
editor = false;
configurationLimit = 20;
+
consoleMode = "max";
};
boot.loader.efi.canTouchEfiVariables = true;
}
+1 -1
hosts/chernobog/modules/greetd.nix
···
settings = {
terminal.vt = 1;
default_session = {
-
command = "${pkgs.tuigreet}/bin/tuigreet --issue --time --cmd sway";
+
command = "${pkgs.tuigreet}/bin/tuigreet --issue --time --cmd niri-session";
user = "greeter";
};
};
+4
hosts/chernobog/modules/kernel.nix
···
+
{ pkgs, ... }:
+
{
+
boot.kernelPackages = pkgs.linuxPackages_cachyos-lto;
+
}
+25
hosts/chernobog/modules/lact.nix/config.yaml
···
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
+2
hosts/chernobog/modules/lact.nix/default.nix
···
{
+
hardware.amdgpu.overdrive.enable = true;
+
services.lact.enable = true;
environment.etc."lact/config.yaml".source = ./config.yaml;
}
+1 -1
hosts/chernobog/modules/network.nix
···
{
-
imports = [ ../../../modules/network/dns ];
+
imports = [ ../../../modules/network/dns/systemd.nix ];
networking.useDHCP = true;
}
+6
hosts/chernobog/modules/obs.nix
···
+
{
+
programs.obs-studio = {
+
enable = true;
+
enableVirtualCamera = true;
+
};
+
}
+35 -2
hosts/chernobog/modules/vr.nix
···
openFirewall = true;
defaultRuntime = true;
autoStart = true;
+
config = {
+
enable = true;
+
json = {
+
scale = 1.0;
+
bitrate = 60000000;
+
encoders = [
+
{
+
encoder = "vaapi";
+
codec = "h265";
+
}
+
];
+
};
+
};
};
-
# programs.envision.enable = true;
+
environment.systemPackages = with pkgs; [ wlx-overlay-s eepyxr wayvr-dashboard xrizer ];
-
environment.systemPackages = [ pkgs.wlx-overlay-s ];
+
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
+
}
+
'';
+
}];
}
+8 -2
hosts/default.nix
···
inherit lib;
system = null;
modules = [
+
# 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;
+
# 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
+1
hosts/dzwonek/default.nix
···
"${inputs.home}/nixos"
"${inputs.disko}/module.nix"
../../modules
+
../../modules/stylix-null.nix
../../users/root
./disk-config.nix
]
+5 -5
hosts/dzwonek/modules/headscale.nix/default.nix
···
other-infra = [ "group:admin" ];
};
hosts = {
-
chernobog = "100.64.0.9";
+
chernobog = "100.64.0.8";
wolumonde = "100.64.0.2";
higashi = "100.64.0.5";
};
···
dst = [ "tag:other-infra:*" ];
}
{
+
src = [ "tag:private-infra" ];
+
dst = [ "tag:private-infra:*" ];
+
}
+
{
src = [ "wolumonde" ];
dst = [ "chernobog:*" ];
}
···
"tag:private-infra"
];
dst = [ "autogroup:internet:*" ];
-
}
-
{
-
src = [ "ellite@ellite.dev" ];
-
dst = [ "chernobog:8463" ];
}
];
};
-3
hosts/dzwonek/modules/nginx.nix
···
{
-
lib,
inputs,
-
pkgs,
...
}:
{
services.nginx = {
enable = true;
-
package = pkgs.nginxQuic;
recommendedTlsSettings = true;
recommendedOptimisation = true;
recommendedGzipSettings = true;
+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";
+
};
+
};
+
}
-4
hosts/dzwonek/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")
-
];
}
+5
hosts/dzwonek/modules/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";
+
# };
+
}
+2 -1
hosts/volsinii/default.nix
···
inputs,
tlib,
pkgs,
-
modulesPath,
...
}:
{
···
"${inputs.home}/nixos"
"${inputs.disko}/module.nix"
../../modules
+
../../modules/stylix-null.nix
../../users/root
+
../../users/dawn
./disk-config.nix
]
++ (tlib.importFolder (toString ./modules));
-4
hosts/volsinii/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")
-
];
}
+6 -5
hosts/wolumonde/default.nix
···
...
}:
{
-
imports = [
+
imports = with inputs; [
../../modules
+
../../modules/stylix-null.nix
../../locale
-
"${inputs.home}/nixos"
../../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");
+
}
-65
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-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 = { };
-
-
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}";
+
};
+
}
-29
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";
+
};
+
};
+
}
-65
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" .}}
+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;
-
'';
-
};
-
};
-
}
+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)
-
}
-104
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
hosts/wolumonde/modules/secrets.nix
···
{ lib, ... }:
{
# age.secrets.bernbotToken.file = ../../../secrets/bernbotToken.age;
-
age.secrets.websiteConfig.file = ../../../secrets/websiteConfig.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 ];
}
+4
hosts/wolumonde/modules/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";
+
};
networking.firewall.public.tailscale.allowedUDPPorts = [
config.services.tailscale.port
+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;
+
};
+
}
-6
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 ┃
-
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-
-64
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";
-
# };
-
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;
-
};
-
}
+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";
-
# };
-
}
+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";
+
};
+
}
+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";
+
};
+
}
+
];
+
};
+
};
+
}
+2 -4
modules/base/default.nix
···
shellAliases =
let
ifSudo = string: mkIf config.security.sudo.enable string;
-
inherit (pkgs)
-
du-dust
-
;
+
inherit (pkgs) dust;
in
{
g = pkgBin config.programs.git.package;
-
du = "${pkgBin du-dust}";
+
du = "${pkgBin dust}";
df = "${coreBin "df"} -h";
free = "${pkgs.procps}/bin/free -h";
n = nixBin;
+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;
};
}
+4 -3
modules/network/tailscale.nix
···
+
{ lib, ... }:
{
services.tailscale = {
enable = true;
port = 41641;
-
extraSetFlags = [ "--advertise-exit-node" ];
-
extraUpFlags = [ "--ssh" ];
+
# extraUpFlags = [ "--ssh" ];
extraDaemonFlags = [ "--no-logs-no-support" ];
-
useRoutingFeatures = "both";
openFirewall = true;
};
+
+
networking.interfaces.tailscale0.useDHCP = lib.mkForce false;
}
+10 -9
modules/nushell/prompt.nu
···
"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"},
···
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;
+
}];
+
};
+
}
+14 -2
nvfetcher.toml
···
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"
···
[nsid-tracker]
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 ##
···
[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";
+
};
+
}
+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/develMobiTailscaleAuthKey.age

This is a binary file and will not be displayed.

secrets/headscaleOidcSecret.age

This is a binary file and will not be displayed.

secrets/nixGithubAccessToken.age

This is a binary file and will not be displayed.

+19 -17
secrets/pdsConfig.age
···
age-encryption.org/v1
-> ssh-rsa Abmvag
-
Ti+WByG/+vCEtMtvVSUYqnjhLnL6gmVHj+8+ARD12zrfV+l0LZxW7TFGqWvtQ+9N
-
0aCa5AGao4ngjom0JHhFm+DzklR13V6FyB1zAQugBuPDlJFPPZmRH9jTMpbiRWK0
-
+uAFreWIkRtsYrOYaFOWIVOUxAl7immdbx7y55Q6u55y936t8aRRP+r8LCIsd+5E
-
dlWmxTRyYBXG4MNkCfyDeuvCnFxGFlmPXVqJeXyHBL+/Gw4nLzMvRM0PQqlkOLeS
-
DfJUpeWT0fptykuf7nmYr0sYembv4pks9E4lLNJ51PcdR2NqC4Aaq6s9+dM+b9Yg
-
p8Zg7HvCWxlSeNuf/gnu5jisj93ImrwJJSpkSv+AqThGkVtRpN6gzErSXPOQe9tn
-
RuESiumGO+Thh8+1F9iMitCm9pvVDkBrVDPmTBZS5xT8v67VcIcCmkmfh1Svq/di
-
dWhMereLu9oXd9Nudtg3uvlzWp68kCAQFjOVyhi6Li15FuPw+vvkc72c2OPv9AeZ
-
vNmIuaCHLa5VIPqOPJEaLGMuHSd80TFCAhYq4laca9gg6cgufyGlFCR4SVXA9qy8
-
Gi8SI+wdBbi5+RKveju2/58Wbas6oIqmP6IOgTibwYl3uQ8EE4YhG1QocChN553X
-
0pjhtSBTyXgVuy3bqz5eA4QAkCcDocwT/4R4eaNGLW0
-
-> ssh-ed25519 KjIL7g QPvc+LbTi8URL1atJNHHalHRyVGlz7pmrbOeMtjP6gM
-
lH3IhynTXpQ3Z4hFGn4bJZ/vEWte7qZqeAhixghjoe8
-
--- rIrWSZf0Q7b4fWtd9+gXxJpD9AoC0xWE7iWkUGCekDc
-
��)����ϲX� 0)��J�!���x�'E���vp�O�N~�23x��"��(Q�0�f_]7��ב��V�e���]+_/;:ؿ�g<.rJ��>W�R�K"�L#��/��+�Ƴ3M*Õ��:�Q'L��-}�#�Y�p������I
-
��Dm���{��ܫ�L��s��b�;�
-
c*�ݷ�u�m�����+^d�ؓ�0k2yty��>����������F�L&����qk����Ⱦ��c �Y'{�,�G�V��tS�I���7�W�� ��Qp���a�f{f�2O`x�=��y��7�ߓ�}��{=﷋�Í�O����P0�=f�P�B\p���l�.��F�����bm|Oл;-��ǾS�����Ғ�_Ԥ
+
SbNEqnr2eT0YR293LnQtJInXLmx7g+iCJwnZ4GmmEM2euePiEY69s8lRQUb7MQU8
+
xghOLEo/gr74/wtrOUf+4Ge3OM8KiAZt3QLuREJYz1xI6+gnMaievWbinAA+Ly0L
+
KdmFyshVGl+xKA0QPpc6fTO4XnAEH0g5Rg5upZoAfRARmOYeIQvXaWW2ehjI1Izw
+
RINcoszonp5egzZ9QJ6huruT2actz2XIAsZX/0NYQdjC6xmChxfTOxuXQskbzzyK
+
42eholIkf/5fYre4HmB7ePKuZeUeVRhK0RYemBq/ZNNUCf1ExjE/wDKTWpuPOafV
+
J2/7kP7OkwIEeEYXvLPvYM2HRasIbDUBmLOlj7L4E8BgMzKV7FmCr2n27m7iCjhz
+
y0sTpEk1y2N/rDvc/GCuZNtGNZIrbfzGaz5fhgegvO0Jogc2km4LVaEOQlA+AI5w
+
fxew6hCZkISaw+CjNaBOk45XXhMsONfW63uba6kgzj3h2+9jG1UmEPJAuNdgkjze
+
32lBZ58np+cA+aENt4sZu5nKk90Rsq54aNntfaHuFMFIfvK4RZj3HwHCAND+9XJ1
+
SNkNetcehX9jzZYm5Npnlhleft92TACYbtIIoi/zqgYMLDaHeAW6ZDAnW9sgO7mo
+
uSVwa8Gf5SwUY6v8IgVDwQVHiq8WTtRgRJmImP/mvS4
+
-> ssh-ed25519 KjIL7g tRXe9XXGtJyjCQuHU4oD7L5veJ8BKCFHUdXuSAa6/D4
+
vjVwtS7dKxTkjGHeLzV0G2uzIyEYaaSLplxOvfApIa0
+
-> ssh-ed25519 LaQclg 81iLpPZTOiW2ZNnfy8lErpeHiQoTtIpariQ5153Nwl4
+
5wqZUoo5CxEPHwVy9SSspvECTWAQ8qgjbj44WCx/kdw
+
--- z1wPplzF3WsIHxojXxcZnq91akMO+Hj1WFth2ujJAvY
+
�X RM�V˛a^�Z2A욓ר)h���h�� hV�Z��e&�.��l��ɉ/n�aIد-��q��(�id� DT
+
�d�e��T�cHiɂ*^�4��+�?� �����y��-nD=��]��(������ѝG�Z���ɲ���P�w9�g��j>��d��Ϥ�������F�t�~��P�QS� ,z�%Ad�E�t=�R�B�ُܱ~����7��ެ{1=�� ����kOV=W3���e��CN��q�Ϥ���.\���n�wW����c�R;G
+
�6�f"�W����7f_�MZ;���.Х�Ѓ�@���3���Ǫ&,��1�ܕ�����]l�J�L!a֟� �r��}9 ��o@�.]��ƈ�fS����=�@��
+17 -16
secrets/persesSecret.age
···
age-encryption.org/v1
-> ssh-rsa Abmvag
-
gnRXwWRObKH5JCBDDPVRDHsgSj4m3zwOHAFLDAXTmWjs0mVNKSu5AFtKkoJuUuzs
-
RQFGn3b4pv6duPjpEW4t0DBkAOCwgqTqvF3oSKNBSDuhNU4+XzCJgBZDesO3VZ/S
-
zZxM8kq14sM484pZSRI0A86VNSlR7q8lyF1kth+bn5dum7Ihq87Re6jW+OyFwL7L
-
tkTON5L4aMqjI4fMQl/PcRU+04sYkKug6JQO/DDyFXvjvROuO43ZChjqGGj4ol9b
-
mXPOJuabzUtWGoTwg7+IHhbyUbanoO+2gCMejRGbZbBTh+bOftNx0bvNj8lrxgit
-
oE5sXhqPeI9BhOGWiJvR+32YdHl2WRYQ/7nNdWsnA0UuiPRHPu827g91NrVgjxBk
-
SpgoabwZpCUl8GlfihtTvw3NbV6WnIUv0ew9bwlyf129uvH7Rn61o0JMnq5m37Zt
-
rJjLJ262zIdb4eS1QgycI+ugeb290Vh22niTLLKoJxAFdLyzSr84XsfUVyrjhJfz
-
Ll+12c7ApTcgwhuhOkFLmU8SUNwxhH523fV8zcQ/1E9yjpa26qQcTF+ujRV8FIwb
-
kVGLDHUXehU5gm/nsuQVaULYHRC50pvu7wKKZsj0UqdQeKCx1CwBOdFk6Qctxl9N
-
VvAenIra/FVImcrimQ/sNCeg8UasT+gvbY5KjhwPzkY
-
-> ssh-ed25519 KjIL7g +FQdRCFxlkayD4Hq9xb4WCE139upxkpSrvh7412gqlo
-
jxDJlUgJZfftyeyhikKi4zLhtM6fVXxAGMmD7gcQZgM
-
--- OXRvMmNqRzo4NGF4ihpPSHu77W8dH45HwJJIDI3hUCY
-
&}͘8��;YX5
-
�$m3�1r['�%<7�����W�D��h�0�%��C$�Il1;ɛl�1�i�A��E�z��,n݆�|b�?2N�}�m/Ӈ�
+
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���*��
+15 -6
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
{
"nixGithubAccessToken.age".publicKeys = [ yusdacra ];
"websiteConfig.age".publicKeys = [
yusdacra
-
wolumonde
+
trimounts
];
"pdsConfig.age".publicKeys = [
yusdacra
-
wolumonde
+
trimounts
];
"clickeeProxyConfig.age".publicKeys = [
yusdacra
-
wolumonde
+
trimounts
];
-
"deployWebhook.age".publicKeys = [ yusdacra ];
"persesSecret.age".publicKeys = [
yusdacra
-
wolumonde
+
trimounts
];
"headscaleOidcSecret.age".publicKeys = [
yusdacra
···
"develMobiTailscaleAuthKey.age".publicKeys = [
yusdacra
develMobi
+
];
+
"cloudflareDnsEdit.age".publicKeys = [
+
yusdacra
+
dzwonek
+
trimounts
+
];
+
"bunnyApiKey.age".publicKeys = [
+
yusdacra
+
dzwonek
+
trimounts
];
}
+1
secrets/trimounts.key.pub
···
+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDLuA1/cZ/xTN4dv5U0fvD9Glo6HlF5YA4U1pvFjxx6V
secrets/websiteConfig.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];
+
};
+
};
+
}
+63 -43
users/mayer/default.nix
···
lib,
tlib,
config,
+
terra,
...
}@globalAttrs:
let
···
nixosConfig = globalAttrs.config;
in
{
+
imports = [ ./stylix.nix ];
+
users.users.mayer = {
isNormalUser = true;
createHome = true;
···
"adbusers"
"dialout"
"video"
+
"input"
];
shell = pkgs.nushell;
hashedPassword = "$6$spzqhAyJfhHy$iHgLBlhjGn1l8PnbjJdWTn1GPvcjMqYNKUzdCe/7IrX6sHNgETSr/Nfpdmq9FCXLhrAfwHOd/q/8SvfeIeNX4/";
···
nushell
];
programs = {
-
steam.enable = true;
-
gamescope.enable = true;
+
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;
};
-
sway.enable = true;
+
niri.enable = true;
};
systemd = {
targets.network-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 =
{
-
config,
pkgs,
inputs,
-
secrets,
...
}:
-
let
-
personal = import ../../personal.nix;
-
name = personal.name;
-
email = personal.emails.primary;
-
in
{
imports =
let
modulesToEnable = l.flatten [
[
-
"wayland"
+
"settings"
+
"niri"
"foot"
]
# cli stuff
···
]
# dev stuff
[
+
"zed"
"helix"
"git"
"ssh"
]
[
"zen"
+
"discord"
]
];
in
l.flatten [
(tlib.prefixStrings "${inputs.self}/users/modules/" modulesToEnable)
-
./stylix.nix
];
home = {
homeDirectory = nixosConfig.users.users.mayer.home;
-
packages = with pkgs; [
+
packages = (with pkgs; [
# Font stuff
noto-fonts-cjk-sans
font-awesome
···
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;
-
-
settings.iconTheme = {
-
name = "Yaru-dark";
-
package = pkgs.yaru-theme;
-
};
-
-
home.pointerCursor = {
-
package = pkgs.bibata-cursors;
-
name = "Bibata-Modern-Classic";
-
size = 24;
-
gtk.enable = true;
-
x11.enable = true;
-
};
-
gtk.enable = true;
-
gtk.theme.package = pkgs.yaru-theme;
-
gtk.theme.name = "Yaru-dark";
-
-
programs.git.includes = [
-
{
-
contents = {
-
gpg.format = "ssh";
-
commit.gpgsign = true;
-
user = {
-
inherit name email;
-
signingkey = builtins.readFile ../../secrets/yusdacra.key.pub;
-
};
-
};
-
}
-
];
};
}
+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
+
];
+
}
+4 -57
users/mayer/stylix.nix
···
{
inputs,
-
config,
-
pkgs,
-
terra,
-
lib,
...
}:
{
-
imports = [ (import inputs.stylix).homeModules.stylix ];
-
-
stylix.image = ./wallpaper.png;
-
stylix.polarity = "dark";
-
stylix.base16Scheme =
-
let
-
night = "#2b292d";
-
ash = "#383539";
-
umber = "#4d424b";
-
bark = "#6F5D63";
-
mist = "#D1D1E0";
-
sage = "#B1B695";
-
blush = "#fecdb2";
-
coral = "#ffa07a";
-
rose = "#F6B6C9";
-
ember = "#e06b75";
-
honey = "#F5D76E";
-
in
-
{
-
base00 = night;
-
base01 = ash;
-
base02 = umber;
-
base03 = bark;
-
base04 = blush;
-
base05 = mist;
-
base06 = mist;
-
base07 = bark;
-
base08 = ember;
-
base09 = honey;
-
base0A = rose;
-
base0B = sage;
-
base0C = bark;
-
base0D = coral;
-
base0E = blush;
-
base0F = umber;
-
};
-
-
stylix.fonts = {
-
serif = {
-
name = "Comic Relief";
-
package = pkgs.comic-relief;
-
};
-
sansSerif = config.stylix.fonts.serif;
-
monospace = {
-
name = "Comic Mono";
-
package = terra.comic-mono;
-
};
-
};
-
-
stylix.fonts.sizes = {
-
popups = 13;
-
terminal = 13;
-
};
+
imports = [
+
(import inputs.stylix).nixosModules.stylix
+
./stylix.conf.nix
+
];
}
users/mayer/wallpaper.png

This is a binary file and will not be displayed.

+38 -4
users/modules/discord/default.nix
···
pkgs,
terra,
inputs,
+
lib,
...
}:
+
let
+
pkg = pkgs.discord.override {
+
withMoonlight = true;
+
inherit (terra) moonlight;
+
withOpenASAR = true;
+
withTTS = false;
+
};
+
in
{
# imports = ["${inputs.moonlight}/nix/home-manager.nix"];
home.packages = [
-
(pkgs.discord.override {
-
withMoonlight = true;
-
inherit (terra) moonlight;
-
withOpenASAR = true;
+
(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"
+
'';
})
];
+
+
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" ];
+
};
+
};
}
+8 -4
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;
+
server.enable = true;
settings = {
+
# colors = {
+
# alpha = 0.7;
+
# background = "000000";
+
# };
main = {
-
login-shell = "yes";
+
# login-shell = "yes";
dpi-aware = lib.mkForce "yes";
-
font = "Comic Mono:size=12";
};
csd = {
preferred = "client";
···
bell.system = "no";
};
};
+
stylix.targets.foot.enable = true;
}
+14
users/modules/git/default.nix
···
{ pkgs, ... }:
+
let
+
name = "dawn";
+
email = "90008@gaze.systems";
+
in
{
programs.git = {
enable = true;
includes = [
+
{
+
contents = {
+
gpg.format = "ssh";
+
commit.gpgsign = true;
+
user = {
+
inherit name email;
+
signingkey = builtins.readFile ../../../secrets/yusdacra.key.pub;
+
};
+
};
+
}
{
contents = {
+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);
+
}
+9 -1
users/modules/nushell/default.nix
···
{
home.shell.enableNushellIntegration = true;
+
stylix.targets.nushell.enable = true;
programs.carapace.enable = 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 = ''
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;
};
}
+18 -15
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;
wrapperFeatures.gtk = true;
+
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 = [
···
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";
···
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"'';
+
"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"'';
+
''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%";
···
};
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";
···
adaptive_sync = "on";
};
"DP-1" = {
-
mode = "1920x1080@165Hz";
+
mode = "1920x1080@165.009Hz";
};
-
"HDMI-A-1" = {
+
"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;
+
};
+
}
+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 ];
};