Compare commits
14
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2ca158ebf8 | ||
|
|
85f75812fc | ||
|
|
78822deb2d | ||
|
|
73ffd2057e | ||
|
|
ff653cdd86 | ||
|
|
62c1a63208 | ||
|
|
fedf0be4d4 | ||
|
|
e57f73bcfe | ||
|
|
0fffc56ca7 | ||
|
|
9381f54f66 | ||
|
|
c765ea319b | ||
|
|
2318eb48ed | ||
|
|
c2c9428805 | ||
|
|
54d5290d0a |
No files matched your search
@@ -3,4 +3,3 @@
|
||||
result
|
||||
result-*
|
||||
run-vm-*
|
||||
.nixos-test-history
|
||||
Generated
+37
-397
@@ -38,22 +38,6 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"blobs": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1604995301,
|
||||
"narHash": "sha256-wcLzgLec6SGJA8fx1OEN1yV/Py5b+U5iyYpksUY/yLw=",
|
||||
"owner": "simple-nixos-mailserver",
|
||||
"repo": "blobs",
|
||||
"rev": "2cccdf1ca48316f2cfd1c9a0017e8de5a7156265",
|
||||
"type": "gitlab"
|
||||
},
|
||||
"original": {
|
||||
"owner": "simple-nixos-mailserver",
|
||||
"repo": "blobs",
|
||||
"type": "gitlab"
|
||||
}
|
||||
},
|
||||
"call-flake": {
|
||||
"locked": {
|
||||
"lastModified": 1687380775,
|
||||
@@ -69,69 +53,6 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"clan-community": {
|
||||
"inputs": {
|
||||
"clan-core": [
|
||||
"clan-core"
|
||||
],
|
||||
"data-mesher": [
|
||||
"clan-community",
|
||||
"clan-core",
|
||||
"data-mesher"
|
||||
],
|
||||
"disko": [
|
||||
"clan-community",
|
||||
"clan-core",
|
||||
"disko"
|
||||
],
|
||||
"flake-parts": [
|
||||
"flake-parts"
|
||||
],
|
||||
"nix-darwin": [
|
||||
"clan-community",
|
||||
"clan-core",
|
||||
"nix-darwin"
|
||||
],
|
||||
"nix-github-actions": "nix-github-actions",
|
||||
"nix-select": [
|
||||
"clan-community",
|
||||
"clan-core",
|
||||
"nix-select"
|
||||
],
|
||||
"nix-unit": "nix-unit",
|
||||
"nixpkgs": [
|
||||
"clan-community",
|
||||
"clan-core",
|
||||
"nixpkgs"
|
||||
],
|
||||
"sops-nix": [
|
||||
"clan-community",
|
||||
"clan-core",
|
||||
"sops-nix"
|
||||
],
|
||||
"systems": [
|
||||
"clan-community",
|
||||
"clan-core",
|
||||
"systems"
|
||||
],
|
||||
"treefmt-nix": [
|
||||
"treefmt-nix"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1784417092,
|
||||
"narHash": "sha256-no5eDYWPUZZu4GtLufnA7b7CiZC4qAhCgf70gFiDLZk=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "20371843d45f61217019e489d6857842dc8a0203",
|
||||
"revCount": 73,
|
||||
"type": "git",
|
||||
"url": "https://git.clan.lol/clan/clan-community"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://git.clan.lol/clan/clan-community"
|
||||
}
|
||||
},
|
||||
"clan-core": {
|
||||
"inputs": {
|
||||
"data-mesher": "data-mesher",
|
||||
@@ -151,11 +72,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1792819087,
|
||||
"narHash": "sha256-1bxllGymY+u3NvEX4FHMZyE4l9y0nRpvk/qLaPkwAjg=",
|
||||
"lastModified": 1772411144,
|
||||
"narHash": "sha256-WhXudztwPNnKXaqGX4DOqNfHzHdBSiGCvKGHM20pscw=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "94862153f6e63016151d7c527f9e7bb3e96b0598",
|
||||
"revCount": 15417,
|
||||
"rev": "92cc85bc24eb31ce5725e1e72753129810ce3fe9",
|
||||
"revCount": 13201,
|
||||
"type": "git",
|
||||
"url": "https://git.clan.lol/clan/clan-core"
|
||||
},
|
||||
@@ -164,36 +85,6 @@
|
||||
"url": "https://git.clan.lol/clan/clan-core"
|
||||
}
|
||||
},
|
||||
"cnx-network": {
|
||||
"inputs": {
|
||||
"clan-core": [
|
||||
"clan-core"
|
||||
],
|
||||
"flake-parts": [
|
||||
"flake-parts"
|
||||
],
|
||||
"nixos-mailserver": "nixos-mailserver",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"treefmt-nix": [
|
||||
"treefmt-nix"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1790583225,
|
||||
"narHash": "sha256-Nhgf1hptHA9pgcGN4U1wQqDg1cc3t6oCT/HCgBcRs/w=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "b2749dcc6ebe5d055b691f32dd47039f745a7d0e",
|
||||
"revCount": 203,
|
||||
"type": "git",
|
||||
"url": "https://git.b4l.co.th/B4L/cnx-network-clan"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://git.b4l.co.th/B4L/cnx-network-clan"
|
||||
}
|
||||
},
|
||||
"data-mesher": {
|
||||
"inputs": {
|
||||
"flake-parts": [
|
||||
@@ -210,11 +101,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1791886485,
|
||||
"narHash": "sha256-/+7ayxD7PeW6wMQiHw20UJHmSTGN8Y5HXbn0zG/EgoA=",
|
||||
"rev": "8d4d36437f9fff6ecaa34872bd53c3ed09ef5464",
|
||||
"lastModified": 1772273147,
|
||||
"narHash": "sha256-Wzhoc6ifjTDZi8aVRH3fuLJPdd4ouNTTwwVhgoMcMek=",
|
||||
"rev": "d5de7a8d9e5726e678c94e62fe8ac3a809fee5da",
|
||||
"type": "tarball",
|
||||
"url": "https://git.clan.lol/api/v1/repos/clan/data-mesher/archive/8d4d36437f9fff6ecaa34872bd53c3ed09ef5464.tar.gz"
|
||||
"url": "https://git.clan.lol/api/v1/repos/clan/data-mesher/archive/d5de7a8d9e5726e678c94e62fe8ac3a809fee5da.tar.gz"
|
||||
},
|
||||
"original": {
|
||||
"type": "tarball",
|
||||
@@ -249,11 +140,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1792526520,
|
||||
"narHash": "sha256-3hSJlv8mUVnZPMWK2+CM7a9O+nR6Z4mCh27NfLCmTPc=",
|
||||
"lastModified": 1771881364,
|
||||
"narHash": "sha256-A5uE/hMium5of/QGC6JwF5TGoDAfpNtW00T0s9u/PN8=",
|
||||
"owner": "nix-community",
|
||||
"repo": "disko",
|
||||
"rev": "cedd626e11b635470fa6f9fdb8ad79b0075dd7f9",
|
||||
"rev": "a4cb7bf73f264d40560ba527f9280469f1f081c6",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -295,22 +186,6 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-compat": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1767039857,
|
||||
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
|
||||
"owner": "NixOS",
|
||||
"repo": "flake-compat",
|
||||
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"repo": "flake-compat",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-parts": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": [
|
||||
@@ -419,11 +294,11 @@
|
||||
"std": "std"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1789106589,
|
||||
"narHash": "sha256-RMQdAvDaa4eUcdePDqUGAhnyTtzKxc6a8abauy8bzb0=",
|
||||
"lastModified": 1779175997,
|
||||
"narHash": "sha256-Ps/4s3jwaZdLVEpO+1cRs54VbPbgMeXJUqa4CWSPJSY=",
|
||||
"owner": "kurogeek",
|
||||
"repo": "frappix",
|
||||
"rev": "dbfa76d84df6354bd7528c9d0c407387f66c3e33",
|
||||
"rev": "0f1b4bcfb8c3b976e808a57e491d10857a1a45ac",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -432,57 +307,6 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"git-hooks": {
|
||||
"inputs": {
|
||||
"flake-compat": [
|
||||
"cnx-network",
|
||||
"nixos-mailserver",
|
||||
"flake-compat"
|
||||
],
|
||||
"gitignore": "gitignore",
|
||||
"nixpkgs": [
|
||||
"cnx-network",
|
||||
"nixos-mailserver",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1778507602,
|
||||
"narHash": "sha256-kTwur1wV+01SdqskVMSo6JMEpg71ps3HpbFY2GsflKs=",
|
||||
"owner": "cachix",
|
||||
"repo": "git-hooks.nix",
|
||||
"rev": "61ab0e80d9c7ab14c256b5b453d8b3fb0189ba0a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "cachix",
|
||||
"repo": "git-hooks.nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"gitignore": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"cnx-network",
|
||||
"nixos-mailserver",
|
||||
"git-hooks",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1709087332,
|
||||
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "gitignore.nix",
|
||||
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "gitignore.nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"haskell-flake": {
|
||||
"locked": {
|
||||
"lastModified": 1675296942,
|
||||
@@ -529,11 +353,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1788355065,
|
||||
"narHash": "sha256-gAz5oTI7ur34CfuakQduiQd/2ZhO62Bn2XXg08nZYYQ=",
|
||||
"lastModified": 1768068402,
|
||||
"narHash": "sha256-bAXnnJZKJiF7Xr6eNW6+PhBf1lg2P1aFUO9+xgWkXfA=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "d9d750e4fc11c10cab2da677bdd31e427f3a3a71",
|
||||
"rev": "8bc5473b6bc2b6e1529a9c4040411e1199c43b4c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -610,35 +434,6 @@
|
||||
"url": "https://gti.telent.net/dan/liminix"
|
||||
}
|
||||
},
|
||||
"matthew-hardware": {
|
||||
"inputs": {
|
||||
"disko": [
|
||||
"clan-core",
|
||||
"disko"
|
||||
],
|
||||
"flake-parts": [
|
||||
"flake-parts"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"unf": "unf"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1789393925,
|
||||
"narHash": "sha256-8PHRxSVWxu1ol1AIrqiP8g6t+h9fLekTgDdpgRa+sME=",
|
||||
"ref": "mc/wip",
|
||||
"rev": "ebee3891bc9cbec584f611b4bcdf12618da25148",
|
||||
"revCount": 34,
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/matthewcroughan/matthew-hardware"
|
||||
},
|
||||
"original": {
|
||||
"ref": "mc/wip",
|
||||
"type": "git",
|
||||
"url": "https://codeberg.org/matthewcroughan/matthew-hardware"
|
||||
}
|
||||
},
|
||||
"microvm": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
@@ -689,11 +484,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1792737899,
|
||||
"narHash": "sha256-P0/GhewcEQmAbzq3QunNWY2jLJaYH9F6c/5dEM/jQ4M=",
|
||||
"lastModified": 1772379624,
|
||||
"narHash": "sha256-NG9LLTWlz4YiaTAiRGChbrzbVxBfX+Auq4Ab/SWmk4A=",
|
||||
"owner": "nix-darwin",
|
||||
"repo": "nix-darwin",
|
||||
"rev": "bb0b90dbd54e207100de72b5dcbe3188c98a4b69",
|
||||
"rev": "52d061516108769656a8bd9c6e811c677ec5b462",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -702,49 +497,6 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix-github-actions": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"clan-community",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1737420293,
|
||||
"narHash": "sha256-F1G5ifvqTpJq7fdkT34e/Jy9VCyzd5XfJ9TO8fHhJWE=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nix-github-actions",
|
||||
"rev": "f4158fa080ef4503c8f4c820967d946c2af31ec9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "nix-github-actions",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix-github-actions_2": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"clan-community",
|
||||
"nix-unit",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1737420293,
|
||||
"narHash": "sha256-F1G5ifvqTpJq7fdkT34e/Jy9VCyzd5XfJ9TO8fHhJWE=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nix-github-actions",
|
||||
"rev": "f4158fa080ef4503c8f4c820967d946c2af31ec9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "nix-github-actions",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix-select": {
|
||||
"locked": {
|
||||
"lastModified": 1763303120,
|
||||
@@ -758,32 +510,6 @@
|
||||
"url": "https://git.clan.lol/clan/nix-select/archive/main.tar.gz"
|
||||
}
|
||||
},
|
||||
"nix-unit": {
|
||||
"inputs": {
|
||||
"nix-github-actions": "nix-github-actions_2",
|
||||
"nixpkgs": [
|
||||
"clan-community",
|
||||
"nixpkgs"
|
||||
],
|
||||
"treefmt-nix": [
|
||||
"clan-community",
|
||||
"treefmt-nix"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1779338171,
|
||||
"narHash": "sha256-affUbv/bwE8SLGhuWKniDr7SVO+Lo1XEPjCZdyU5kgQ=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nix-unit",
|
||||
"rev": "6ab1f232562a01d18b40d5ed6a58718c4f3a74bc",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "nix-unit",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixago": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils_3",
|
||||
@@ -796,11 +522,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1746801636,
|
||||
"narHash": "sha256-dlcKfIXp/eqFHzFm+DzseXAWWlpVwyk9cTvCKGtVKkw=",
|
||||
"lastModified": 1714086354,
|
||||
"narHash": "sha256-yKVQMxL9p7zCWUhnGhDzRVT8sDgHoI3V595lBK0C2YA=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixago",
|
||||
"rev": "8cc33f973ab3a891d8a41391e73ef451a783960b",
|
||||
"rev": "5133633e9fe6b144c8e00e3b212cdbd5a173b63d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -809,54 +535,6 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixos-images": {
|
||||
"inputs": {
|
||||
"nixos-stable": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"nixos-unstable": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1784802994,
|
||||
"narHash": "sha256-4PcD0Ibzdkh85G+70w5dLlR9YgQ2bmNIjiPPMSzO57w=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixos-images",
|
||||
"rev": "6ece16b0c97986fe085122e796044add4cc3ff64",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "nixos-images",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixos-mailserver": {
|
||||
"inputs": {
|
||||
"blobs": "blobs",
|
||||
"flake-compat": "flake-compat",
|
||||
"git-hooks": "git-hooks",
|
||||
"nixpkgs": [
|
||||
"cnx-network",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1785198005,
|
||||
"narHash": "sha256-falBPi+PJtMx0vwII8L24wjDGXNZMwRiVXsw8WTXLEo=",
|
||||
"owner": "simple-nixos-mailserver",
|
||||
"repo": "nixos-mailserver",
|
||||
"rev": "d357b9f048c5532ec81b0e0034c0b8463d5ddd46",
|
||||
"type": "gitlab"
|
||||
},
|
||||
"original": {
|
||||
"owner": "simple-nixos-mailserver",
|
||||
"ref": "nixos-26.05",
|
||||
"repo": "nixos-mailserver",
|
||||
"type": "gitlab"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1712920918,
|
||||
@@ -874,11 +552,11 @@
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1780365719,
|
||||
"narHash": "sha256-QfWfccTN+70ZQ4m2qlU9PiKfz2Yppq94058iJyARNwc=",
|
||||
"lastModified": 1778458615,
|
||||
"narHash": "sha256-cY07EsdhBJ8tFXPzDYevgqxRev9ZLxFonuq9wmq5kwg=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "ffa10e26ae11d676b2db836259889f1f571cb14f",
|
||||
"rev": "c6e5ca3c836a5f4dd9af9f2c1fc1c38f0fac988a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -888,22 +566,6 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_3": {
|
||||
"locked": {
|
||||
"lastModified": 1792773339,
|
||||
"narHash": "sha256-rZLrzrC6i+jnTAlvPZHogKDulY7WWDEv9hJeHieO7Zw=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "3ec636362e1816bc2f0888fa0fa2c69f1bc9e504",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nosys": {
|
||||
"locked": {
|
||||
"lastModified": 1668010795,
|
||||
@@ -935,15 +597,16 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1787579760,
|
||||
"narHash": "sha256-WGhIEINOICx7bhV3WrSz0QTzv8uzaaa9AXvD1clIWpc=",
|
||||
"lastModified": 1708640854,
|
||||
"narHash": "sha256-EpcAmvIS4ErqhXtVEfd2GPpU/E/s8CCRSfYzk6FZ/fY=",
|
||||
"owner": "paisano-nix",
|
||||
"repo": "core",
|
||||
"rev": "88739c84d308876714322eb9844ede6597c1a580",
|
||||
"rev": "adcf742bc9463c08764ca9e6955bd5e7dcf3a3fe",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "paisano-nix",
|
||||
"ref": "0.2.0",
|
||||
"repo": "core",
|
||||
"type": "github"
|
||||
}
|
||||
@@ -990,18 +653,14 @@
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"clan-community": "clan-community",
|
||||
"clan-core": "clan-core",
|
||||
"cnx-network": "cnx-network",
|
||||
"devshell": "devshell",
|
||||
"flake-parts": "flake-parts",
|
||||
"frappix": "frappix",
|
||||
"home-manager": "home-manager",
|
||||
"import-tree": "import-tree",
|
||||
"liminix": "liminix",
|
||||
"matthew-hardware": "matthew-hardware",
|
||||
"nixos-images": "nixos-images",
|
||||
"nixpkgs": "nixpkgs_3",
|
||||
"nixpkgs": "nixpkgs_2",
|
||||
"plasma-manager": "plasma-manager",
|
||||
"treefmt-nix": "treefmt-nix"
|
||||
}
|
||||
@@ -1014,11 +673,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1792809984,
|
||||
"narHash": "sha256-KV+CaZX7QS0hcdKxwGKehDb1jmUgx6lbkTPpaoIW5Nw=",
|
||||
"lastModified": 1772340640,
|
||||
"narHash": "sha256-1nq7+Kt5IUBD8Hu3nptVPbMf+22rNJoHT0t9L1X+GKA=",
|
||||
"owner": "Mic92",
|
||||
"repo": "sops-nix",
|
||||
"rev": "442449fa7b1fe6c692d0103ac9fc8f9e82931cf3",
|
||||
"rev": "dec4d8eac700dcd2fe3c020857d3ee220ec147f1",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -1105,16 +764,15 @@
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1791244623,
|
||||
"narHash": "sha256-uuanbkFk8a313Zfrxdcz8Us/yQtaxNnKJtX8v0ZPpd8=",
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "d36eeed142f88b5a636f2e3856a53c61654cf29b",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"ref": "future-26.11",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
@@ -1169,24 +827,6 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"unf": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1779596435,
|
||||
"narHash": "sha256-ztzeJVOQDhQtE0z9DwtSWL+OyoWKZrAD4gzRRvUP9ug=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "4f5ab30ee524f09126b09f42f249c0aba756459d",
|
||||
"revCount": 6,
|
||||
"type": "git",
|
||||
"url": "https://git.atagen.co/atagen/unf"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://git.atagen.co/atagen/unf"
|
||||
}
|
||||
},
|
||||
"yants": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
|
||||
@@ -7,12 +7,6 @@
|
||||
inputs.treefmt-nix.follows = "treefmt-nix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
clan-community = {
|
||||
url = "git+https://git.clan.lol/clan/clan-community";
|
||||
inputs.clan-core.follows = "clan-core";
|
||||
inputs.flake-parts.follows = "flake-parts";
|
||||
inputs.treefmt-nix.follows = "treefmt-nix";
|
||||
};
|
||||
devshell = {
|
||||
url = "github:numtide/devshell";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
@@ -31,7 +25,7 @@
|
||||
inputs.home-manager.follows = "home-manager";
|
||||
};
|
||||
import-tree.url = "github:vic/import-tree";
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
treefmt-nix = {
|
||||
url = "github:numtide/treefmt-nix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
@@ -45,29 +39,6 @@
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.devshell.follows = "devshell";
|
||||
};
|
||||
|
||||
nixos-images = {
|
||||
url = "github:nix-community/nixos-images";
|
||||
inputs.nixos-unstable.follows = "nixpkgs";
|
||||
inputs.nixos-stable.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
matthew-hardware = {
|
||||
url = "git+https://codeberg.org/matthewcroughan/matthew-hardware?ref=mc/wip";
|
||||
inputs.flake-parts.follows = "flake-parts";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.disko.follows = "clan-core/disko";
|
||||
};
|
||||
|
||||
# `router` clan service (site gateway: PPPoE, VLAN bridge, Kea/Blocky,
|
||||
# nftables). Consumed via `module.input = "cnx-network"` in inventories/router.nix.
|
||||
cnx-network = {
|
||||
url = "git+https://git.b4l.co.th/B4L/cnx-network-clan";
|
||||
inputs.clan-core.follows = "clan-core";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.flake-parts.follows = "flake-parts";
|
||||
inputs.treefmt-nix.follows = "treefmt-nix";
|
||||
};
|
||||
};
|
||||
outputs =
|
||||
{
|
||||
@@ -85,6 +56,7 @@
|
||||
./shell.nix
|
||||
|
||||
./overlays
|
||||
./modules/nixos
|
||||
./machines
|
||||
./routers
|
||||
./inventories
|
||||
@@ -100,26 +72,18 @@
|
||||
inherit system;
|
||||
overlays = [
|
||||
inputs.self.overlays.packagesOverlay
|
||||
inputs.self.overlays.frappixFrappeOverlay
|
||||
inputs.self.overlays.frappixLibsOverlay
|
||||
inputs.self.overlays.frappixPythonOverlay
|
||||
inputs.self.overlays.frappixToolsOverlay
|
||||
];
|
||||
config = { };
|
||||
};
|
||||
packages.think = pkgs.think-gtcm;
|
||||
packages.think-be = pkgs.think-backend-gtcm;
|
||||
packages.file-uploader = pkgs.gtcm-file-uploader;
|
||||
packages.installer =
|
||||
(pkgs.nixos [
|
||||
inputs.nixos-images.nixosModules.image-installer
|
||||
{
|
||||
users.users.root.openssh.authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAB/raxJR8gASmquP63weHelbi+da2WBJR1DgzHPNz/f"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDuhpzDHBPvn8nv8RH1MRomDOaXyP4GziQm7r3MZ1Syk"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEcZ/p1Ofa9liwIzPWzNtONhJ7+FUWd2lCz33r81t8+w kurogeek@kurogeek"
|
||||
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIOJDRQfb1+7VK5tOe8W40iryfBWYRO6Uf1r2viDjmsJtAAAABHNzaDo="
|
||||
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIDgsWq+G/tcr6eUQYT7+sJeBtRmOMabgFiIgIV44XNc6AAAABHNzaDo="
|
||||
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIJMi3TAuwDtIeO4MsORlBZ31HzaV5bji1fFBPcC9/tWuAAAABHNzaDo="
|
||||
];
|
||||
}
|
||||
]).config.system.build.isoImage;
|
||||
packages.erpnext_thailand = pkgs.erpnext_thailand;
|
||||
packages.thai_payroll = pkgs.thai_payroll;
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
+35
-323
@@ -2,7 +2,6 @@
|
||||
imports = [
|
||||
./personal-computer.nix
|
||||
./emmie.nix
|
||||
./router.nix
|
||||
];
|
||||
clan = {
|
||||
inventory = {
|
||||
@@ -17,17 +16,16 @@
|
||||
"deneb"
|
||||
"bosona"
|
||||
];
|
||||
w = [
|
||||
"sirius"
|
||||
"stellio"
|
||||
];
|
||||
w = [ "sirius" ];
|
||||
b4l = [
|
||||
"rigel"
|
||||
"neptune"
|
||||
"rana"
|
||||
"petra"
|
||||
"alasia"
|
||||
];
|
||||
phonebox = [
|
||||
"neptune"
|
||||
"rigel"
|
||||
"almach"
|
||||
"alpheratz"
|
||||
@@ -35,173 +33,25 @@
|
||||
"adhil"
|
||||
"buna"
|
||||
];
|
||||
|
||||
prometheus = [
|
||||
"cursa"
|
||||
"rigel"
|
||||
"vega"
|
||||
"buna"
|
||||
];
|
||||
|
||||
dm-bootstrapper = [
|
||||
"rigel"
|
||||
"cursa"
|
||||
"deneb"
|
||||
"bosona"
|
||||
"canopus"
|
||||
];
|
||||
|
||||
dm-pull-deploy = [
|
||||
global-network = [
|
||||
"rana"
|
||||
"rigel"
|
||||
"vega"
|
||||
"sirius"
|
||||
"hadar"
|
||||
"procyon"
|
||||
"alasia"
|
||||
];
|
||||
};
|
||||
|
||||
instances = {
|
||||
|
||||
borgbackup = {
|
||||
module = {
|
||||
name = "borgbackup";
|
||||
input = "clan-core";
|
||||
};
|
||||
roles.client.machines."cursa".settings.destinations = {
|
||||
alex = {
|
||||
repo = "ssh://borg@10.0.10.225:2222/backup/cursa/backup";
|
||||
rsh = "ssh -i /run/secrets/vars/borgbackup/borgbackup.ssh";
|
||||
};
|
||||
};
|
||||
roles.client.machines."hadar".settings.destinations = {
|
||||
alex = {
|
||||
repo = "ssh://borg@10.0.10.225:2222/backup/hadar/backup";
|
||||
rsh = "ssh -i /run/secrets/vars/borgbackup/borgbackup.ssh";
|
||||
};
|
||||
};
|
||||
roles.client.machines."procyon".settings.destinations = {
|
||||
alex = {
|
||||
repo = "ssh://borg@10.0.10.225:2222/backup/procyon/backup";
|
||||
rsh = "ssh -i /run/secrets/vars/borgbackup/borgbackup.ssh";
|
||||
};
|
||||
};
|
||||
roles.client.machines."bosona".settings.destinations = {
|
||||
alex = {
|
||||
repo = "ssh://borg@10.0.10.225:2222/backup/bosona/backup";
|
||||
rsh = "ssh -i /run/secrets/vars/borgbackup/borgbackup.ssh";
|
||||
};
|
||||
};
|
||||
roles.client.machines."canopus".settings.destinations = {
|
||||
alex = {
|
||||
repo = "ssh://borg@10.0.10.225:2222/backup/canopus/backup";
|
||||
rsh = "ssh -i /run/secrets/vars/borgbackup/borgbackup.ssh";
|
||||
};
|
||||
};
|
||||
roles.client.machines."deneb".settings.destinations = {
|
||||
alex = {
|
||||
repo = "ssh://borg@10.0.10.225:2222/backup/deneb/backup";
|
||||
rsh = "ssh -i /run/secrets/vars/borgbackup/borgbackup.ssh";
|
||||
};
|
||||
};
|
||||
roles.client.machines."alasia".settings.destinations = {
|
||||
alex = {
|
||||
repo = "ssh://borg@10.0.10.225:2222/backup/alasia/backup";
|
||||
rsh = "ssh -i /run/secrets/vars/borgbackup/borgbackup.ssh";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
data-mesher = {
|
||||
module = {
|
||||
name = "data-mesher";
|
||||
input = "clan-core";
|
||||
};
|
||||
roles.bootstrap.tags = [ "dm-bootstrapper" ];
|
||||
roles.default.tags = [ "all" ];
|
||||
roles.default.settings.interfaces = [ "ygg" ];
|
||||
};
|
||||
|
||||
auto-pull-update = {
|
||||
module = {
|
||||
name = "dm-pull-deploy";
|
||||
input = "clan-community";
|
||||
};
|
||||
roles.push.machines."rigel".settings = {
|
||||
gitUrl = "https://git.b4l.co.th/newedge/infra.git";
|
||||
branch = "main";
|
||||
};
|
||||
roles.push.extraModules = [
|
||||
(
|
||||
{ pkgs, config, ... }:
|
||||
{
|
||||
# work around until upstream is fixed
|
||||
environment.systemPackages = [
|
||||
(pkgs.writeShellApplication {
|
||||
name = "custom-dm-send-deploy";
|
||||
runtimeInputs = [
|
||||
config.services.data-mesher.package
|
||||
pkgs.git
|
||||
pkgs.nix
|
||||
pkgs.jq
|
||||
];
|
||||
text =
|
||||
let
|
||||
settings.gitUrl = "https://git.b4l.co.th/newedge/infra.git";
|
||||
settings.branch = "main";
|
||||
in
|
||||
''
|
||||
if [ $# -gt 1 ]; then
|
||||
echo "Usage: dm-send-deploy [<flake-ref>]"
|
||||
echo "Without arguments, sends the latest commit on '${settings.branch}' from ${settings.gitUrl}"
|
||||
echo "Example: dm-send-deploy git+https://example.com/repo.git?rev=abc123..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
KEY="${config.clan.core.vars.generators.dm-pull-deploy-signing-key.files."signing.key".path}"
|
||||
if [ ! -r "$KEY" ]; then
|
||||
echo "Error: cannot read signing key at $KEY (are you root?)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ $# -eq 1 ]; then
|
||||
FLAKE_REF="$1"
|
||||
else
|
||||
REV=$(git ls-remote "${settings.gitUrl}" "refs/heads/${settings.branch}" | cut -f1)
|
||||
if [ -z "$REV" ]; then
|
||||
echo "Error: could not determine latest commit on ${settings.branch} from ${settings.gitUrl}"
|
||||
exit 1
|
||||
fi
|
||||
FLAKE_REF="git+${settings.gitUrl}?rev=$REV"
|
||||
fi
|
||||
|
||||
TMPFILE=$(mktemp)
|
||||
trap 'rm -f "$TMPFILE"' EXIT
|
||||
|
||||
printf '%s' "$FLAKE_REF" > "$TMPFILE"
|
||||
|
||||
NETWORK_ID="${config.clan.core.vars.generators.data-mesher-network.files."network.pub".path}"
|
||||
|
||||
data-mesher file update "$TMPFILE" \
|
||||
--url http://localhost:7331 \
|
||||
--network-id "$NETWORK_ID" \
|
||||
--key "$KEY" \
|
||||
--name "dm_pull_deploy/target"
|
||||
|
||||
echo "Deployment target pushed: $FLAKE_REF"
|
||||
'';
|
||||
})
|
||||
];
|
||||
}
|
||||
)
|
||||
];
|
||||
roles.default.tags = [ "dm-pull-deploy" ];
|
||||
roles.default.settings.action = "switch";
|
||||
};
|
||||
|
||||
sshd = {
|
||||
roles.server.tags."all" = { };
|
||||
roles.server.settings = {
|
||||
authorizedKeys = {
|
||||
"berwn" = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAB/raxJR8gASmquP63weHelbi+da2WBJR1DgzHPNz/f";
|
||||
"davhau" = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDuhpzDHBPvn8nv8RH1MRomDOaXyP4GziQm7r3MZ1Syk";
|
||||
"vi" =
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAmgyEGuY/r7SDlJgrzYmQqpcWS5W+fCzRi3OS59ne4W openpgp:0xFF687387";
|
||||
"kurogeek" =
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEcZ/p1Ofa9liwIzPWzNtONhJ7+FUWd2lCz33r81t8+w kurogeek@kurogeek";
|
||||
"matthewcroughan" =
|
||||
@@ -252,13 +102,7 @@
|
||||
name = "zerotier";
|
||||
input = "clan-core";
|
||||
};
|
||||
roles.controller.machines."vega" = {
|
||||
settings.allowedIds = [
|
||||
"dbe44c0287" # Alex-gateway
|
||||
"b0e0b84fd3" # Alex
|
||||
"2bd36db8cc" # kurogeek-thinkpad
|
||||
];
|
||||
};
|
||||
roles.controller.machines."vega" = { };
|
||||
roles.peer.tags.glom = { };
|
||||
};
|
||||
|
||||
@@ -267,13 +111,7 @@
|
||||
name = "zerotier";
|
||||
input = "clan-core";
|
||||
};
|
||||
roles.controller.machines."rigel" = {
|
||||
settings.allowedIds = [
|
||||
"dbe44c0287" # Alex-gateway
|
||||
"b0e0b84fd3" # Alex
|
||||
"2bd36db8cc" # kurogeek-thinkpad
|
||||
];
|
||||
};
|
||||
roles.controller.machines."rigel" = { };
|
||||
roles.peer.tags.b4l = { };
|
||||
};
|
||||
|
||||
@@ -291,36 +129,17 @@
|
||||
roles.peer.tags."poy" = { };
|
||||
};
|
||||
|
||||
internet = {
|
||||
module.name = "internet";
|
||||
roles.default.machines = {
|
||||
ramus.settings.host = "5.223.63.55";
|
||||
tangra.settings.host = "5.223.65.50";
|
||||
};
|
||||
};
|
||||
|
||||
yggdrasil-global-network = {
|
||||
module = {
|
||||
name = "yggdrasil";
|
||||
input = "clan-core";
|
||||
};
|
||||
roles.default.tags."all" = { };
|
||||
roles.default.settings.extraYggdrasilIPs = [
|
||||
# kurogeek's laptop
|
||||
"200:c8db:ea9b:5bdc:44ed:ad87:462a:6bd0"
|
||||
];
|
||||
roles.default.tags."global-network" = { };
|
||||
roles.default.settings.extraPeers = [
|
||||
"tls://133.18.201.69:54232"
|
||||
"tls://153.120.42.137:54232"
|
||||
"tcp://yg-sin.magicum.net:23901"
|
||||
"tls://asia.deinfra.org:15015"
|
||||
"tls://ygg5.mk16.de:1338?key=0000009611ae5391dc0aceea9f3fa6a0dc1279f4306059339e84bfb8b74d2f9b"
|
||||
"tls://ygg.jjolly.dev:3443"
|
||||
"tls://[2602:fc24:18:7a42::1]:993"
|
||||
"tcp://leo.node.3dt.net:9002"
|
||||
"tcp://ygg-kcmo.incognet.io:8883"
|
||||
"tls://23.184.48.86:1443"
|
||||
"tls://192.3.13.16:8118"
|
||||
"tls://ygg-pa.incognet.io:8884"
|
||||
"tls://mo.us.ygg.triplebit.org:993"
|
||||
];
|
||||
};
|
||||
|
||||
@@ -331,31 +150,30 @@
|
||||
};
|
||||
roles.server.machines."alasia".settings = {
|
||||
public_url = "tailvpn.public.newedge.house";
|
||||
base_domain = "tailnet.newedge.house";
|
||||
advertise_routes = [ "10.0.10.0/24" ];
|
||||
dns = {
|
||||
magic_dns = true;
|
||||
base_domain = "tailvpn.newedge.house";
|
||||
nameservers = [
|
||||
"10.0.10.82"
|
||||
"1.1.1.1"
|
||||
"8.8.8.8"
|
||||
];
|
||||
extra_records = [
|
||||
{
|
||||
name = "poyerp.newedge.house";
|
||||
type = "A";
|
||||
value = "10.0.10.1";
|
||||
}
|
||||
{
|
||||
name = "glomerp.newedge.house";
|
||||
type = "A";
|
||||
value = "10.0.10.1";
|
||||
}
|
||||
];
|
||||
};
|
||||
nameservers = [
|
||||
"10.0.10.82"
|
||||
"1.1.1.1"
|
||||
"8.8.8.8"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
yggdrasil-phone-network = {
|
||||
module = {
|
||||
name = "yggdrasil";
|
||||
input = "clan-core";
|
||||
};
|
||||
roles.default.tags."phonebox" = { };
|
||||
roles.default.settings.extraPeers = [
|
||||
"tls://ygg.jjolly.dev:3443"
|
||||
"tls://[2602:fc24:18:7a42::1]:993"
|
||||
"tcp://leo.node.3dt.net:9002"
|
||||
"tcp://ygg-kcmo.incognet.io:8883"
|
||||
];
|
||||
};
|
||||
|
||||
phonebox = {
|
||||
module = {
|
||||
name = "phonebox";
|
||||
@@ -365,13 +183,6 @@
|
||||
roles.default.machines."adhil".settings = {
|
||||
ata-ethernet-iface = "end0";
|
||||
};
|
||||
roles.default.machines."rigel".settings = {
|
||||
extraClientNumbers = [
|
||||
"01"
|
||||
"02"
|
||||
];
|
||||
extraFixedIPClient = { };
|
||||
};
|
||||
};
|
||||
|
||||
pulse-stream = {
|
||||
@@ -466,105 +277,6 @@
|
||||
dataDir = "/mnt/hdd/samba";
|
||||
};
|
||||
};
|
||||
|
||||
wordpress = {
|
||||
module = {
|
||||
name = "wordpress";
|
||||
input = "self";
|
||||
};
|
||||
roles.server.machines."tangra".settings = {
|
||||
tenants = [
|
||||
"poyfestival.com"
|
||||
];
|
||||
phpfpmOptions = ''
|
||||
upload_max_filesize=64M
|
||||
post_max_size=128M
|
||||
'';
|
||||
wpExtraConfig = ''
|
||||
define('WP_MEMORY_LIMIT', '256M');
|
||||
define('WP_DEBUG', false);
|
||||
define('WP_DEBUG_DISPLAY', false);
|
||||
define('WP_DEBUG_LOG', false);
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
prometheus-monitoring = {
|
||||
module = {
|
||||
name = "prometheus";
|
||||
input = "self";
|
||||
};
|
||||
roles.server.machines."cursa".settings = {
|
||||
matrix-alertmanager = {
|
||||
enable = true;
|
||||
homeserverUrl = "https://matrix-client.matrix.org";
|
||||
matrixUser = "@nixapollo:matrix.org";
|
||||
matrixRooms = [
|
||||
{
|
||||
receivers = [
|
||||
"matrix"
|
||||
];
|
||||
roomId = "!rqIrWqPvsXqMgYpcNZ:matrix.org";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
roles.nodes.machines = {
|
||||
vega.settings = {
|
||||
exporters.smartctl = { };
|
||||
exporters.zfs = { };
|
||||
};
|
||||
rigel.settings = {
|
||||
exporters.smartctl = { };
|
||||
};
|
||||
sirius.settings = {
|
||||
exporters.smartctl = { };
|
||||
exporters.zfs = { };
|
||||
};
|
||||
buna.settings = {
|
||||
exporters.smartctl = { };
|
||||
};
|
||||
mirach.settings = {
|
||||
exporters.smartctl = { };
|
||||
};
|
||||
almach.settings = {
|
||||
exporters.smartctl = { };
|
||||
};
|
||||
stellio.settings.exporters.smartctl = { };
|
||||
};
|
||||
};
|
||||
|
||||
wifi =
|
||||
let
|
||||
networks = {
|
||||
home = { };
|
||||
glom = { };
|
||||
};
|
||||
in
|
||||
{
|
||||
module.name = "wifi";
|
||||
module.input = "clan-community";
|
||||
|
||||
roles.default = {
|
||||
machines."buna".settings = { inherit networks; };
|
||||
|
||||
extraModules = [
|
||||
(
|
||||
{ lib, ... }:
|
||||
{
|
||||
# profile names match the network attr names above;
|
||||
# 0 = retry forever for both (defaults: 4 autoconnect attempts, 3 auth attempts)
|
||||
networking.networkmanager.ensureProfiles.profiles = lib.mapAttrs (_: _: {
|
||||
connection.autoconnect-retries = 0;
|
||||
connection.auth-retries = 0;
|
||||
}) networks;
|
||||
}
|
||||
)
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,91 +0,0 @@
|
||||
# Site gateways: the `router` clan service from cnx-network-clan (see
|
||||
# flake.nix input `cnx-network`, and that repo's modules/clan/router/README.md).
|
||||
# One instance for the fleet; each site adds its gateway machine with the
|
||||
# site's port / VLAN layout. `clan vars generate <gw>` then prompts for the
|
||||
# PPPoE username/password.
|
||||
{ lib, ... }:
|
||||
let
|
||||
# Admin mesh = the site's ZeroTier network. The service only opens SSH,
|
||||
# metrics and iperf3 to this prefix, so the gateway must also be a peer of
|
||||
# the same network (tag membership in default.nix). Prefix derivation as in
|
||||
# cnx-network's modules/mesh-hosts.nix: fd + 8-byte network id + 0x9993,
|
||||
# /88 covers every peer.
|
||||
meshSubnet =
|
||||
instance:
|
||||
let
|
||||
networkId = lib.fileContents ../vars/shared/zerotier-network-${instance}/network-id/value;
|
||||
full = "fd" + networkId + "9993";
|
||||
hextet = i: builtins.substring (i * 4) 4 full;
|
||||
in
|
||||
"${hextet 0}:${hextet 1}:${hextet 2}:${hextet 3}:${hextet 4}:${builtins.substring 20 2 full}00::/88";
|
||||
in
|
||||
{
|
||||
clan.inventory.instances.router = {
|
||||
module = {
|
||||
name = "router";
|
||||
input = "cnx-network";
|
||||
};
|
||||
|
||||
roles.default.settings.mesh.subnet = meshSubnet "w-network";
|
||||
|
||||
# stellio: GL.iNet Flint 2 (GL-MT6000, MT7986a). Ports as named by the
|
||||
# device tree in matthew-hardware: eth1 = the 2.5G "WAN" port, lan1 = the
|
||||
# 2.5G LAN port, lan2-lan5 = the 1G LAN ports (DSA on the MT7531 switch).
|
||||
roles.default.machines.stellio.settings = {
|
||||
site = "white-house";
|
||||
siteId = 8;
|
||||
|
||||
# PPPoE on the ISP's VLAN 10, as on the liminix router it replaces
|
||||
# (routers/white-house); set to null if the ISP runs PPPoE untagged.
|
||||
wan.interface = "end1";
|
||||
wan.vlanId = 10;
|
||||
|
||||
# lan1 (2.5G): untagged mgmt port for on-site recovery. lan2-lan4 (1G):
|
||||
# untagged client ports on lan. lan5 is the pre-cutover staging uplink:
|
||||
# DHCP client into the old LAN (routers/white-house), SSH only, no VLAN
|
||||
# membership; set stagingPort = null at cutover.
|
||||
accessPorts = {
|
||||
lan1 = "mgmt";
|
||||
lan2 = "lan";
|
||||
lan3 = "lan";
|
||||
lan4 = "lan";
|
||||
};
|
||||
stagingPort = "lan5";
|
||||
|
||||
# Both MT7976 radios serve lan as an untagged access port, one SSID per
|
||||
# band named like the GL-AR750 it stands in for ("GL-AR750" on 2.4 GHz,
|
||||
# "GL-AR750-5" on 5 GHz) so clients roam over unchanged. Passphrases
|
||||
# are the `wifi-GL-AR750-passphrase` / `wifi-GL-AR750-5-passphrase`
|
||||
# vars prompts. Channels as on the old router. Check the band mapping
|
||||
# with `iw phy` (mt7986: phy0/wlan0 = 2.4 GHz, phy1/wlan1 = 5 GHz).
|
||||
wifi = {
|
||||
enable = true;
|
||||
countryCode = "TH";
|
||||
networks = {
|
||||
"GL-AR750".vlan = "lan";
|
||||
"GL-AR750-5".vlan = "lan";
|
||||
};
|
||||
radios = {
|
||||
wlan0 = {
|
||||
band = "2g";
|
||||
channel = 2;
|
||||
wifi6 = true;
|
||||
networks = [ "GL-AR750" ];
|
||||
};
|
||||
wlan1 = {
|
||||
band = "5g";
|
||||
channel = 36;
|
||||
wifi6 = true;
|
||||
networks = [ "GL-AR750-5" ];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# 10.1.<id>.0/24, router .1, DHCP pool .100-.199.
|
||||
vlans = {
|
||||
mgmt.id = 10;
|
||||
lan.id = 20;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
+3
-6
@@ -19,7 +19,7 @@
|
||||
"installedAt": 1765277591
|
||||
},
|
||||
"buna": {
|
||||
"installedAt": 1787123510
|
||||
"installedAt": 1765343708
|
||||
},
|
||||
"rana": {
|
||||
"installedAt": 1773134236
|
||||
@@ -48,11 +48,8 @@
|
||||
"bosona": {
|
||||
"installedAt": 1779098893
|
||||
},
|
||||
"tangra": {
|
||||
"installedAt": 1779958921
|
||||
},
|
||||
"cursa": {
|
||||
"installedAt": 1782187627
|
||||
"saturn": {
|
||||
"installedAt": 1779766873
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,8 +17,6 @@ in
|
||||
inputs.self.overlays.frappixLibsOverlay
|
||||
inputs.self.overlays.frappixPythonOverlay
|
||||
inputs.self.overlays.frappixToolsOverlay
|
||||
inputs.self.overlays.posthogPr578265Overlay # TEMPORARY, see overlays/nixpkgs-pr-578265-posthog.nix
|
||||
inputs.self.overlays.frappixFixupsOverlay
|
||||
];
|
||||
|
||||
clan.core.vars.generators.frappix = {
|
||||
|
||||
+215
-64
@@ -25,7 +25,10 @@
|
||||
{
|
||||
"index": 8,
|
||||
"attached_to": 0,
|
||||
"class_list": ["pci", "bridge"],
|
||||
"class_list": [
|
||||
"pci",
|
||||
"bridge"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0004",
|
||||
"name": "PCI",
|
||||
@@ -73,7 +76,10 @@
|
||||
{
|
||||
"index": 9,
|
||||
"attached_to": 0,
|
||||
"class_list": ["pci", "bridge"],
|
||||
"class_list": [
|
||||
"pci",
|
||||
"bridge"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0004",
|
||||
"name": "PCI",
|
||||
@@ -125,7 +131,10 @@
|
||||
{
|
||||
"index": 10,
|
||||
"attached_to": 0,
|
||||
"class_list": ["pci", "bridge"],
|
||||
"class_list": [
|
||||
"pci",
|
||||
"bridge"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0004",
|
||||
"name": "PCI",
|
||||
@@ -173,7 +182,10 @@
|
||||
{
|
||||
"index": 11,
|
||||
"attached_to": 0,
|
||||
"class_list": ["pci", "bridge"],
|
||||
"class_list": [
|
||||
"pci",
|
||||
"bridge"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0004",
|
||||
"name": "PCI",
|
||||
@@ -229,7 +241,10 @@
|
||||
{
|
||||
"index": 12,
|
||||
"attached_to": 0,
|
||||
"class_list": ["pci", "bridge"],
|
||||
"class_list": [
|
||||
"pci",
|
||||
"bridge"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0004",
|
||||
"name": "PCI",
|
||||
@@ -282,14 +297,21 @@
|
||||
},
|
||||
"driver": "piix4_smbus",
|
||||
"driver_module": "i2c_piix4",
|
||||
"drivers": ["piix4_smbus"],
|
||||
"driver_modules": ["i2c_piix4"],
|
||||
"drivers": [
|
||||
"piix4_smbus"
|
||||
],
|
||||
"driver_modules": [
|
||||
"i2c_piix4"
|
||||
],
|
||||
"module_alias": "pci:v00008086d00007113sv00001AF4sd00001100bc06sc80i00"
|
||||
},
|
||||
{
|
||||
"index": 17,
|
||||
"attached_to": 0,
|
||||
"class_list": ["pci", "bridge"],
|
||||
"class_list": [
|
||||
"pci",
|
||||
"bridge"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0004",
|
||||
"name": "PCI",
|
||||
@@ -339,7 +361,11 @@
|
||||
{
|
||||
"index": 22,
|
||||
"attached_to": 15,
|
||||
"class_list": ["cdrom", "scsi", "block_device"],
|
||||
"class_list": [
|
||||
"cdrom",
|
||||
"scsi",
|
||||
"block_device"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0084",
|
||||
"name": "SCSI",
|
||||
@@ -396,8 +422,14 @@
|
||||
"unix_device_name2": "/dev/sg1",
|
||||
"driver": "ata_piix",
|
||||
"driver_module": "ata_piix",
|
||||
"drivers": ["ata_piix", "sr"],
|
||||
"driver_modules": ["ata_piix", "sr_mod"]
|
||||
"drivers": [
|
||||
"ata_piix",
|
||||
"sr"
|
||||
],
|
||||
"driver_modules": [
|
||||
"ata_piix",
|
||||
"sr_mod"
|
||||
]
|
||||
}
|
||||
],
|
||||
"cpu": [
|
||||
@@ -464,7 +496,9 @@
|
||||
"spectre_v2_user",
|
||||
"its"
|
||||
],
|
||||
"power_management": [""],
|
||||
"power_management": [
|
||||
""
|
||||
],
|
||||
"bogo": 4224,
|
||||
"cache": 16384,
|
||||
"page_size": 4096,
|
||||
@@ -546,7 +580,9 @@
|
||||
"spectre_v2_user",
|
||||
"its"
|
||||
],
|
||||
"power_management": [""],
|
||||
"power_management": [
|
||||
""
|
||||
],
|
||||
"bogo": 4224,
|
||||
"cache": 16384,
|
||||
"page_size": 4096,
|
||||
@@ -570,7 +606,11 @@
|
||||
{
|
||||
"index": 23,
|
||||
"attached_to": 19,
|
||||
"class_list": ["disk", "scsi", "block_device"],
|
||||
"class_list": [
|
||||
"disk",
|
||||
"scsi",
|
||||
"block_device"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0084",
|
||||
"name": "SCSI",
|
||||
@@ -634,15 +674,24 @@
|
||||
],
|
||||
"driver": "virtio_scsi",
|
||||
"driver_module": "virtio_scsi",
|
||||
"drivers": ["sd", "virtio_scsi"],
|
||||
"driver_modules": ["sd_mod", "virtio_scsi"]
|
||||
"drivers": [
|
||||
"sd",
|
||||
"virtio_scsi"
|
||||
],
|
||||
"driver_modules": [
|
||||
"sd_mod",
|
||||
"virtio_scsi"
|
||||
]
|
||||
}
|
||||
],
|
||||
"graphics_card": [
|
||||
{
|
||||
"index": 16,
|
||||
"attached_to": 0,
|
||||
"class_list": ["graphics_card", "pci"],
|
||||
"class_list": [
|
||||
"graphics_card",
|
||||
"pci"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0004",
|
||||
"name": "PCI",
|
||||
@@ -699,8 +748,12 @@
|
||||
},
|
||||
"driver": "bochs-drm",
|
||||
"driver_module": "bochs",
|
||||
"drivers": ["bochs-drm"],
|
||||
"driver_modules": ["bochs"],
|
||||
"drivers": [
|
||||
"bochs-drm"
|
||||
],
|
||||
"driver_modules": [
|
||||
"bochs"
|
||||
],
|
||||
"module_alias": "pci:v00001234d00001111sv00001AF4sd00001100bc03sc00i00"
|
||||
}
|
||||
],
|
||||
@@ -708,7 +761,10 @@
|
||||
{
|
||||
"index": 24,
|
||||
"attached_to": 7,
|
||||
"class_list": ["usb", "hub"],
|
||||
"class_list": [
|
||||
"usb",
|
||||
"hub"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0086",
|
||||
"name": "USB",
|
||||
@@ -781,8 +837,12 @@
|
||||
"hotplug": "usb",
|
||||
"driver": "hub",
|
||||
"driver_module": "usbcore",
|
||||
"drivers": ["hub"],
|
||||
"driver_modules": ["usbcore"],
|
||||
"drivers": [
|
||||
"hub"
|
||||
],
|
||||
"driver_modules": [
|
||||
"usbcore"
|
||||
],
|
||||
"module_alias": "usb:v1D6Bp0001d0618dc09dsc00dp00ic09isc00ip00in00"
|
||||
}
|
||||
],
|
||||
@@ -790,7 +850,9 @@
|
||||
{
|
||||
"index": 5,
|
||||
"attached_to": 0,
|
||||
"class_list": ["memory"],
|
||||
"class_list": [
|
||||
"memory"
|
||||
],
|
||||
"base_class": {
|
||||
"hex": "0101",
|
||||
"name": "Internally Used Class",
|
||||
@@ -814,7 +876,9 @@
|
||||
{
|
||||
"index": 21,
|
||||
"attached_to": 16,
|
||||
"class_list": ["monitor"],
|
||||
"class_list": [
|
||||
"monitor"
|
||||
],
|
||||
"base_class": {
|
||||
"hex": "0100",
|
||||
"name": "Monitor",
|
||||
@@ -960,7 +1024,10 @@
|
||||
{
|
||||
"index": 25,
|
||||
"attached_to": 24,
|
||||
"class_list": ["mouse", "usb"],
|
||||
"class_list": [
|
||||
"mouse",
|
||||
"usb"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0086",
|
||||
"name": "USB",
|
||||
@@ -996,7 +1063,9 @@
|
||||
"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_names": ["/dev/input/mice"],
|
||||
"unix_device_names": [
|
||||
"/dev/input/mice"
|
||||
],
|
||||
"unix_device_name2": "/dev/input/mouse0",
|
||||
"resources": [
|
||||
{
|
||||
@@ -1037,11 +1106,18 @@
|
||||
"hotplug": "usb",
|
||||
"driver": "usbhid",
|
||||
"driver_module": "usbhid",
|
||||
"drivers": ["usbhid"],
|
||||
"driver_modules": ["usbhid"],
|
||||
"drivers": [
|
||||
"usbhid"
|
||||
],
|
||||
"driver_modules": [
|
||||
"usbhid"
|
||||
],
|
||||
"driver_info": {
|
||||
"type": "mouse",
|
||||
"db_entry_0": ["explorerps/2", "exps2"],
|
||||
"db_entry_0": [
|
||||
"explorerps/2",
|
||||
"exps2"
|
||||
],
|
||||
"xf86": "explorerps/2",
|
||||
"gpm": "exps2",
|
||||
"buttons": -1,
|
||||
@@ -1054,7 +1130,9 @@
|
||||
{
|
||||
"index": 18,
|
||||
"attached_to": 13,
|
||||
"class_list": ["network_controller"],
|
||||
"class_list": [
|
||||
"network_controller"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "008f",
|
||||
"name": "Virtio",
|
||||
@@ -1079,7 +1157,9 @@
|
||||
"model": "Virtio Ethernet Card 0",
|
||||
"sysfs_id": "/devices/pci0000:00/0000:00:12.0/virtio1",
|
||||
"sysfs_bus_id": "virtio1",
|
||||
"unix_device_names": ["ens18"],
|
||||
"unix_device_names": [
|
||||
"ens18"
|
||||
],
|
||||
"resources": [
|
||||
{
|
||||
"type": "hwaddr",
|
||||
@@ -1092,8 +1172,12 @@
|
||||
],
|
||||
"driver": "virtio_net",
|
||||
"driver_module": "virtio_net",
|
||||
"drivers": ["virtio_net"],
|
||||
"driver_modules": ["virtio_net"],
|
||||
"drivers": [
|
||||
"virtio_net"
|
||||
],
|
||||
"driver_modules": [
|
||||
"virtio_net"
|
||||
],
|
||||
"module_alias": "virtio:d00000001v00001AF4"
|
||||
}
|
||||
],
|
||||
@@ -1101,7 +1185,9 @@
|
||||
{
|
||||
"index": 26,
|
||||
"attached_to": 18,
|
||||
"class_list": ["network_interface"],
|
||||
"class_list": [
|
||||
"network_interface"
|
||||
],
|
||||
"base_class": {
|
||||
"hex": "0107",
|
||||
"name": "Network Interface",
|
||||
@@ -1115,7 +1201,9 @@
|
||||
"model": "Ethernet network interface",
|
||||
"sysfs_id": "/class/net/ens18",
|
||||
"sysfs_device_link": "/devices/pci0000:00/0000:00:12.0/virtio1",
|
||||
"unix_device_names": ["ens18"],
|
||||
"unix_device_names": [
|
||||
"ens18"
|
||||
],
|
||||
"resources": [
|
||||
{
|
||||
"type": "hwaddr",
|
||||
@@ -1128,13 +1216,19 @@
|
||||
],
|
||||
"driver": "virtio_net",
|
||||
"driver_module": "virtio_net",
|
||||
"drivers": ["virtio_net"],
|
||||
"driver_modules": ["virtio_net"]
|
||||
"drivers": [
|
||||
"virtio_net"
|
||||
],
|
||||
"driver_modules": [
|
||||
"virtio_net"
|
||||
]
|
||||
},
|
||||
{
|
||||
"index": 27,
|
||||
"attached_to": 0,
|
||||
"class_list": ["network_interface"],
|
||||
"class_list": [
|
||||
"network_interface"
|
||||
],
|
||||
"base_class": {
|
||||
"hex": "0107",
|
||||
"name": "Network Interface",
|
||||
@@ -1147,14 +1241,19 @@
|
||||
},
|
||||
"model": "Loopback network interface",
|
||||
"sysfs_id": "/class/net/lo",
|
||||
"unix_device_names": ["lo"]
|
||||
"unix_device_names": [
|
||||
"lo"
|
||||
]
|
||||
}
|
||||
],
|
||||
"pci": [
|
||||
{
|
||||
"index": 13,
|
||||
"attached_to": 0,
|
||||
"class_list": ["pci", "unknown"],
|
||||
"class_list": [
|
||||
"pci",
|
||||
"unknown"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0004",
|
||||
"name": "PCI",
|
||||
@@ -1211,14 +1310,21 @@
|
||||
},
|
||||
"driver": "virtio-pci",
|
||||
"driver_module": "virtio_pci",
|
||||
"drivers": ["virtio-pci"],
|
||||
"driver_modules": ["virtio_pci"],
|
||||
"drivers": [
|
||||
"virtio-pci"
|
||||
],
|
||||
"driver_modules": [
|
||||
"virtio_pci"
|
||||
],
|
||||
"module_alias": "pci:v00001AF4d00001000sv00001AF4sd00000001bc02sc00i00"
|
||||
},
|
||||
{
|
||||
"index": 14,
|
||||
"attached_to": 0,
|
||||
"class_list": ["pci", "unknown"],
|
||||
"class_list": [
|
||||
"pci",
|
||||
"unknown"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0004",
|
||||
"name": "PCI",
|
||||
@@ -1274,8 +1380,12 @@
|
||||
},
|
||||
"driver": "virtio-pci",
|
||||
"driver_module": "virtio_pci",
|
||||
"drivers": ["virtio-pci"],
|
||||
"driver_modules": ["virtio_pci"],
|
||||
"drivers": [
|
||||
"virtio-pci"
|
||||
],
|
||||
"driver_modules": [
|
||||
"virtio_pci"
|
||||
],
|
||||
"module_alias": "pci:v00001AF4d00001002sv00001AF4sd00000005bc00scFFi00"
|
||||
}
|
||||
],
|
||||
@@ -1283,7 +1393,10 @@
|
||||
{
|
||||
"index": 6,
|
||||
"attached_to": 17,
|
||||
"class_list": ["storage_controller", "pci"],
|
||||
"class_list": [
|
||||
"storage_controller",
|
||||
"pci"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0004",
|
||||
"name": "PCI",
|
||||
@@ -1340,14 +1453,21 @@
|
||||
},
|
||||
"driver": "virtio-pci",
|
||||
"driver_module": "virtio_pci",
|
||||
"drivers": ["virtio-pci"],
|
||||
"driver_modules": ["virtio_pci"],
|
||||
"drivers": [
|
||||
"virtio-pci"
|
||||
],
|
||||
"driver_modules": [
|
||||
"virtio_pci"
|
||||
],
|
||||
"module_alias": "pci:v00001AF4d00001004sv00001AF4sd00000008bc01sc00i00"
|
||||
},
|
||||
{
|
||||
"index": 15,
|
||||
"attached_to": 0,
|
||||
"class_list": ["storage_controller", "pci"],
|
||||
"class_list": [
|
||||
"storage_controller",
|
||||
"pci"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0004",
|
||||
"name": "PCI",
|
||||
@@ -1437,8 +1557,12 @@
|
||||
},
|
||||
"driver": "ata_piix",
|
||||
"driver_module": "ata_piix",
|
||||
"drivers": ["ata_piix"],
|
||||
"driver_modules": ["ata_piix"],
|
||||
"drivers": [
|
||||
"ata_piix"
|
||||
],
|
||||
"driver_modules": [
|
||||
"ata_piix"
|
||||
],
|
||||
"module_alias": "pci:v00008086d00007010sv00001AF4sd00001100bc01sc01i80"
|
||||
}
|
||||
],
|
||||
@@ -1449,7 +1573,9 @@
|
||||
{
|
||||
"index": 19,
|
||||
"attached_to": 6,
|
||||
"class_list": ["unknown"],
|
||||
"class_list": [
|
||||
"unknown"
|
||||
],
|
||||
"base_class": {
|
||||
"hex": "0000",
|
||||
"name": "Unclassified device",
|
||||
@@ -1467,14 +1593,20 @@
|
||||
"sysfs_bus_id": "virtio2",
|
||||
"driver": "virtio_scsi",
|
||||
"driver_module": "virtio_scsi",
|
||||
"drivers": ["virtio_scsi"],
|
||||
"driver_modules": ["virtio_scsi"],
|
||||
"drivers": [
|
||||
"virtio_scsi"
|
||||
],
|
||||
"driver_modules": [
|
||||
"virtio_scsi"
|
||||
],
|
||||
"module_alias": "virtio:d00000008v00001AF4"
|
||||
},
|
||||
{
|
||||
"index": 20,
|
||||
"attached_to": 14,
|
||||
"class_list": ["unknown"],
|
||||
"class_list": [
|
||||
"unknown"
|
||||
],
|
||||
"base_class": {
|
||||
"hex": "0000",
|
||||
"name": "Unclassified device",
|
||||
@@ -1492,8 +1624,12 @@
|
||||
"sysfs_bus_id": "virtio0",
|
||||
"driver": "virtio_balloon",
|
||||
"driver_module": "virtio_balloon",
|
||||
"drivers": ["virtio_balloon"],
|
||||
"driver_modules": ["virtio_balloon"],
|
||||
"drivers": [
|
||||
"virtio_balloon"
|
||||
],
|
||||
"driver_modules": [
|
||||
"virtio_balloon"
|
||||
],
|
||||
"module_alias": "virtio:d00000005v00001AF4"
|
||||
}
|
||||
],
|
||||
@@ -1501,7 +1637,10 @@
|
||||
{
|
||||
"index": 7,
|
||||
"attached_to": 0,
|
||||
"class_list": ["usb_controller", "pci"],
|
||||
"class_list": [
|
||||
"usb_controller",
|
||||
"pci"
|
||||
],
|
||||
"bus_type": {
|
||||
"hex": "0004",
|
||||
"name": "PCI",
|
||||
@@ -1568,15 +1707,25 @@
|
||||
},
|
||||
"driver": "uhci_hcd",
|
||||
"driver_module": "uhci_hcd",
|
||||
"drivers": ["uhci_hcd"],
|
||||
"driver_modules": ["uhci_hcd"],
|
||||
"drivers": [
|
||||
"uhci_hcd"
|
||||
],
|
||||
"driver_modules": [
|
||||
"uhci_hcd"
|
||||
],
|
||||
"driver_info": {
|
||||
"type": "module",
|
||||
"db_entry_0": ["uhci-hcd"],
|
||||
"db_entry_0": [
|
||||
"uhci-hcd"
|
||||
],
|
||||
"active": true,
|
||||
"modprobe": true,
|
||||
"names": ["uhci-hcd"],
|
||||
"module_args": [""],
|
||||
"names": [
|
||||
"uhci-hcd"
|
||||
],
|
||||
"module_args": [
|
||||
""
|
||||
],
|
||||
"conf": ""
|
||||
},
|
||||
"module_alias": "pci:v00008086d00007020sv00001AF4sd00001100bc0Csc03i00"
|
||||
@@ -1689,7 +1838,9 @@
|
||||
"name": "RAM",
|
||||
"value": 7
|
||||
},
|
||||
"memory_type_details": ["Other"],
|
||||
"memory_type_details": [
|
||||
"Other"
|
||||
],
|
||||
"speed": 0
|
||||
}
|
||||
],
|
||||
|
||||
+615
-737
File diff suppressed because it is too large.
Load diff
@@ -13,12 +13,11 @@ in
|
||||
|
||||
imports = [ inputs.frappix.nixosModules.x86_64-linux.frappix ];
|
||||
nixpkgs.overlays = [
|
||||
inputs.self.overlays.packagesOverlay
|
||||
inputs.self.overlays.frappixFrappeOverlay
|
||||
inputs.self.overlays.frappixLibsOverlay
|
||||
inputs.self.overlays.frappixPythonOverlay
|
||||
inputs.self.overlays.frappixToolsOverlay
|
||||
inputs.self.overlays.posthogPr578265Overlay # TEMPORARY, see overlays/nixpkgs-pr-578265-posthog.nix
|
||||
inputs.self.overlays.frappixFixupsOverlay
|
||||
];
|
||||
|
||||
clan.core.vars.generators.frappix = {
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
...
|
||||
}:
|
||||
{
|
||||
clan.core.settings.machine.description =
|
||||
"VM machine for collecting prometheus metrics and fire alerts";
|
||||
|
||||
nixpkgs.hostPlatform = {
|
||||
system = "x86_64-linux";
|
||||
};
|
||||
|
||||
system.stateVersion = "25.11";
|
||||
clan.core.sops.defaultGroups = [ "admins" ];
|
||||
}
|
||||
@@ -9,15 +9,7 @@
|
||||
];
|
||||
clan = {
|
||||
meta.name = "NewEdgeClan";
|
||||
machines = {
|
||||
cursa = { ... }: { clan.core.state."vars".folders = [ "/var/lib" ]; };
|
||||
hadar = { ... }: { clan.core.state."vars".folders = [ "/var/lib" ]; };
|
||||
procyon = { ... }: { clan.core.state."vars".folders = [ "/var/lib" ]; };
|
||||
bosona = { ... }: { clan.core.state."vars".folders = [ "/var/lib" ]; };
|
||||
canopus = { ... }: { clan.core.state."vars".folders = [ "/var/lib" ]; };
|
||||
deneb = { ... }: { clan.core.state."vars".folders = [ "/var/lib" ]; };
|
||||
alasia = { ... }: { clan.core.state."vars".folders = [ "/var/lib" ]; };
|
||||
};
|
||||
machines = { };
|
||||
secrets.age.plugins = [
|
||||
"age-plugin-yubikey"
|
||||
"age-plugin-fido2-hmac"
|
||||
|
||||
@@ -25,13 +25,8 @@ in
|
||||
inputs.self.overlays.frappixLibsOverlay
|
||||
inputs.self.overlays.frappixPythonOverlay
|
||||
inputs.self.overlays.frappixToolsOverlay
|
||||
inputs.self.overlays.frappixAppsOverlay
|
||||
inputs.self.overlays.posthogPr578265Overlay # TEMPORARY, see overlays/nixpkgs-pr-578265-posthog.nix
|
||||
inputs.self.overlays.frappixFixupsOverlay
|
||||
];
|
||||
|
||||
fonts.packages = [ pkgs.tlwg ];
|
||||
|
||||
clan.core.vars.generators.frappix = {
|
||||
files = {
|
||||
sslCertificate.secret = false;
|
||||
@@ -61,8 +56,6 @@ in
|
||||
pkgs.frappix.erpnext
|
||||
pkgs.frappix.hrms
|
||||
pkgs.frappix.crm
|
||||
pkgs.frappix.posprinter
|
||||
pkgs.frappix.default_thai_company
|
||||
];
|
||||
sites = {
|
||||
"${sitename}" = {
|
||||
@@ -72,8 +65,6 @@ in
|
||||
"erpnext"
|
||||
"hrms"
|
||||
"crm"
|
||||
"posprinter"
|
||||
"default_thai_company"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
@@ -5,10 +5,17 @@
|
||||
...
|
||||
}:
|
||||
let
|
||||
domain = "w-inventory.newedge.house";
|
||||
domain = "poy-inventory.newedge.house";
|
||||
in
|
||||
{
|
||||
clan.core.settings.machine.description = "VM machine that host Inventree system for Poy";
|
||||
imports = [
|
||||
inputs.self.nixosModules.inventree
|
||||
];
|
||||
|
||||
nixpkgs.overlays = [
|
||||
inputs.self.overlays.packagesOverlay
|
||||
];
|
||||
|
||||
nixpkgs.hostPlatform = {
|
||||
system = "x86_64-linux";
|
||||
@@ -75,13 +82,19 @@ in
|
||||
|
||||
services.inventree = {
|
||||
enable = true;
|
||||
inherit domain;
|
||||
hostName = "${domain}";
|
||||
config.site_url = "https://${config.services.inventree.hostName}";
|
||||
secretKeyFile = config.clan.core.vars.generators.inventree.files.secret-key.path;
|
||||
adminPasswordFile = config.clan.core.vars.generators.inventree.files.admin-password.path;
|
||||
settings.INVENTREE_SITE_URL = "https://${domain}";
|
||||
settings.INVENTREE_FRONTEND_SETTINGS = ''{"mobile_mode": "allow-ignore"}'';
|
||||
config.oidc_private_key_file = config.clan.core.vars.generators.inventree.files.oidc-key.path;
|
||||
config.adminPasswordFile = config.clan.core.vars.generators.inventree.files.admin-password.path;
|
||||
};
|
||||
|
||||
# services.nginx.virtualHosts."${domain}" = {
|
||||
# forceSSL = true;
|
||||
# sslCertificate = config.clan.core.vars.generators.nginx.files.sslCert.path;
|
||||
# sslCertificateKey = config.clan.core.vars.generators.nginx.files.sslKey.path;
|
||||
# };
|
||||
|
||||
system.stateVersion = "25.11";
|
||||
clan.core.sops.defaultGroups = [ "admins" ];
|
||||
}
|
||||
@@ -10,6 +10,7 @@
|
||||
};
|
||||
system.stateVersion = "25.11";
|
||||
clan.core.sops.defaultGroups = [ "admins" ];
|
||||
clan.core.networking.targetHost = "root@[${config.clan.core.vars.generators.zerotier.files.zerotier-ip.value}]";
|
||||
|
||||
networking.interfaces.enx00e04c106368.useDHCP = true; # recovery
|
||||
|
||||
|
||||
@@ -9,6 +9,13 @@ let
|
||||
in
|
||||
{
|
||||
clan.core.settings.machine.description = "VM machine that host Inventree system for Glom";
|
||||
imports = [
|
||||
inputs.self.nixosModules.inventree
|
||||
];
|
||||
|
||||
nixpkgs.overlays = [
|
||||
inputs.self.overlays.packagesOverlay
|
||||
];
|
||||
|
||||
nixpkgs.hostPlatform = {
|
||||
system = "x86_64-linux";
|
||||
@@ -75,12 +82,19 @@ in
|
||||
|
||||
services.inventree = {
|
||||
enable = true;
|
||||
inherit domain;
|
||||
hostName = "${domain}";
|
||||
config.site_url = "https://${config.services.inventree.hostName}";
|
||||
secretKeyFile = config.clan.core.vars.generators.inventree.files.secret-key.path;
|
||||
adminPasswordFile = config.clan.core.vars.generators.inventree.files.admin-password.path;
|
||||
settings.INVENTREE_SITE_URL = "https://${domain}";
|
||||
config.oidc_private_key_file = config.clan.core.vars.generators.inventree.files.oidc-key.path;
|
||||
config.adminPasswordFile = config.clan.core.vars.generators.inventree.files.admin-password.path;
|
||||
};
|
||||
|
||||
# services.nginx.virtualHosts."${domain}" = {
|
||||
# forceSSL = true;
|
||||
# sslCertificate = config.clan.core.vars.generators.nginx.files.sslCert.path;
|
||||
# sslCertificateKey = config.clan.core.vars.generators.nginx.files.sslKey.path;
|
||||
# };
|
||||
|
||||
system.stateVersion = "25.11";
|
||||
clan.core.sops.defaultGroups = [ "admins" ];
|
||||
}
|
||||
@@ -9,6 +9,7 @@
|
||||
clan.core.settings.machine.description = "A Hetzner VPS machine own by Alex.";
|
||||
|
||||
clan.core.sops.defaultGroups = [ "admins" ];
|
||||
clan.core.networking.targetHost = "root@[${config.clan.core.vars.generators.zerotier.files.zerotier-ip.value}]";
|
||||
|
||||
clan.core.vars.generators.acme = {
|
||||
share = true;
|
||||
|
||||
@@ -54,9 +54,7 @@ in
|
||||
self.nixosModules.think-gtcm
|
||||
self.nixosModules.think-backend-gtcm
|
||||
];
|
||||
nixpkgs.overlays = [
|
||||
self.overlays.packagesOverlay
|
||||
];
|
||||
nixpkgs.overlays = [ self.overlays.packagesOverlay ];
|
||||
|
||||
clan.core.vars.generators.greaterchiangmai = {
|
||||
files = {
|
||||
|
||||
@@ -1,7 +1,18 @@
|
||||
{ config, ... }:
|
||||
{
|
||||
imports = [
|
||||
(import ../../lib/auto-accept-zerotier-members.nix {
|
||||
memberIds = [
|
||||
"dbe44c0287" # Alex-gateway
|
||||
"b0e0b84fd3" # Alex
|
||||
"2bd36db8cc" # kurogeek-thinkpad
|
||||
];
|
||||
})
|
||||
];
|
||||
|
||||
system.stateVersion = "25.11";
|
||||
clan.core.sops.defaultGroups = [ "admins" ];
|
||||
clan.core.networking.targetHost = "root@[${config.clan.core.vars.generators.zerotier.files.zerotier-ip.value}]";
|
||||
|
||||
clan.core.settings.machine.description = "Zima board computer for testing in B4L";
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
{
|
||||
inputs,
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
sitename = "test.newedge.house";
|
||||
in
|
||||
{
|
||||
clan.core.settings.machine.description = "VM machine for test things";
|
||||
|
||||
imports = [ inputs.frappix.nixosModules.x86_64-linux.frappix ];
|
||||
nixpkgs.overlays = [
|
||||
inputs.self.overlays.packagesOverlay
|
||||
inputs.self.overlays.frappixFrappeOverlay
|
||||
inputs.self.overlays.frappixLibsOverlay
|
||||
inputs.self.overlays.frappixPythonOverlay
|
||||
inputs.self.overlays.frappixToolsOverlay
|
||||
];
|
||||
|
||||
clan.core.vars.generators.frappix = {
|
||||
files = {
|
||||
sslCertificate.secret = false;
|
||||
sslCertificateKey = {
|
||||
owner = "nginx";
|
||||
group = "nginx";
|
||||
secret = true;
|
||||
};
|
||||
adminPassword.secret = true;
|
||||
};
|
||||
runtimeInputs = with pkgs; [
|
||||
openssl
|
||||
xkcdpass
|
||||
];
|
||||
script = ''
|
||||
openssl req -x509 -newkey rsa:4096 -keyout $out/sslCertificateKey -out $out/sslCertificate -sha256 -days 3650 -nodes -subj "/C=TH/ST=ChiangMai/L=ChiangMai/O=localhost/CN=localhost"
|
||||
xkcdpass --numwords 4 --delimiter - --count 1 | tr -d "\n" > "$out"/adminPassword
|
||||
'';
|
||||
};
|
||||
|
||||
services.frappe = {
|
||||
enable = true;
|
||||
project = "glomerp";
|
||||
gunicorn_workers = 2;
|
||||
adminPassword = config.clan.core.vars.generators.frappix.files.adminPassword.path;
|
||||
apps = [
|
||||
pkgs.frappix.erpnext
|
||||
pkgs.frappix.hrms
|
||||
pkgs.erpnext_thailand
|
||||
pkgs.thai_payroll
|
||||
];
|
||||
sites = {
|
||||
"${sitename}" = {
|
||||
domains = [ sitename ];
|
||||
apps = [
|
||||
"frappe"
|
||||
"erpnext"
|
||||
"hrms"
|
||||
"erpnext_thailand"
|
||||
"thai_payroll"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
services.nginx.virtualHosts."${sitename}" = {
|
||||
sslCertificate = config.clan.core.vars.generators.frappix.files.sslCertificate.path;
|
||||
sslCertificateKey = config.clan.core.vars.generators.frappix.files.sslCertificateKey.path;
|
||||
};
|
||||
|
||||
nixpkgs.hostPlatform = {
|
||||
system = "x86_64-linux";
|
||||
};
|
||||
|
||||
clan.core.vars.generators.nginx = {
|
||||
files = {
|
||||
sslCert = {
|
||||
owner = "nginx";
|
||||
group = "nginx";
|
||||
secret = true;
|
||||
};
|
||||
sslKey = {
|
||||
owner = "nginx";
|
||||
group = "nginx";
|
||||
secret = true;
|
||||
};
|
||||
};
|
||||
|
||||
runtimeInputs = [
|
||||
pkgs.openssl
|
||||
];
|
||||
script = ''
|
||||
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
|
||||
-keyout $out/sslKey \
|
||||
-out $out/sslCert \
|
||||
-subj "/CN=localhost"
|
||||
'';
|
||||
};
|
||||
|
||||
networking.firewall.allowedTCPPorts = [
|
||||
80
|
||||
443
|
||||
];
|
||||
|
||||
system.stateVersion = "25.11";
|
||||
clan.core.sops.defaultGroups = [ "admins" ];
|
||||
}
|
||||
File renamed without changes.
@@ -475,7 +475,7 @@
|
||||
"fpu_exception": false,
|
||||
"cpuid_level": 13,
|
||||
"write_protect": false,
|
||||
"tlb_size": 32764,
|
||||
"tlb_size": 32766,
|
||||
"clflush_size": 64,
|
||||
"cache_alignment": 128,
|
||||
"address_sizes": {
|
||||
@@ -557,7 +557,7 @@
|
||||
"fpu_exception": false,
|
||||
"cpuid_level": 13,
|
||||
"write_protect": false,
|
||||
"tlb_size": 32764,
|
||||
"tlb_size": 32766,
|
||||
"clflush_size": 64,
|
||||
"cache_alignment": 128,
|
||||
"address_sizes": {
|
||||
@@ -1100,24 +1100,6 @@
|
||||
"network_interface": [
|
||||
{
|
||||
"index": 26,
|
||||
"attached_to": 0,
|
||||
"class_list": ["network_interface"],
|
||||
"base_class": {
|
||||
"hex": "0107",
|
||||
"name": "Network Interface",
|
||||
"value": 263
|
||||
},
|
||||
"sub_class": {
|
||||
"hex": "0000",
|
||||
"name": "Loopback",
|
||||
"value": 0
|
||||
},
|
||||
"model": "Loopback network interface",
|
||||
"sysfs_id": "/class/net/lo",
|
||||
"unix_device_names": ["lo"]
|
||||
},
|
||||
{
|
||||
"index": 27,
|
||||
"attached_to": 18,
|
||||
"class_list": ["network_interface"],
|
||||
"base_class": {
|
||||
@@ -1148,6 +1130,24 @@
|
||||
"driver_module": "virtio_net",
|
||||
"drivers": ["virtio_net"],
|
||||
"driver_modules": ["virtio_net"]
|
||||
},
|
||||
{
|
||||
"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_names": ["lo"]
|
||||
}
|
||||
],
|
||||
"pci": [
|
||||
@@ -1587,8 +1587,8 @@
|
||||
"bios": {
|
||||
"handle": 0,
|
||||
"vendor": "Proxmox distribution of EDK II",
|
||||
"version": "4.2025.05-1~bpo12+1",
|
||||
"date": "03/12/2026",
|
||||
"version": "4.2025.02-4~bpo12+1",
|
||||
"date": "07/10/2025",
|
||||
"features": null,
|
||||
"start_address": "0xe8000",
|
||||
"rom_size": 65536
|
||||
@@ -5,6 +5,8 @@
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
self.nixosModules.common
|
||||
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
|
||||
@@ -21,12 +23,15 @@
|
||||
nixpkgs.hostPlatform = {
|
||||
system = "aarch64-linux";
|
||||
};
|
||||
nixpkgs.buildPlatform = {
|
||||
system = "x86_64-linux";
|
||||
};
|
||||
|
||||
system.stateVersion = "25.11";
|
||||
|
||||
services.journald.extraConfig = ''
|
||||
Storage=volatile
|
||||
RuntimeMaxUse=30M
|
||||
RuntimeMaxFileSize=10M
|
||||
'';
|
||||
|
||||
services.udisks2.enable = false;
|
||||
|
||||
nix.settings.log-lines = 25;
|
||||
@@ -49,23 +54,6 @@
|
||||
"sd_mod"
|
||||
];
|
||||
|
||||
boot = {
|
||||
consoleLogLevel = 0;
|
||||
kernel.sysctl = {
|
||||
"fs.suid_dumpable" = 0;
|
||||
"kernel.core_pattern" = "/dev/null";
|
||||
};
|
||||
tmp = {
|
||||
useTmpfs = true;
|
||||
};
|
||||
};
|
||||
|
||||
services.journald.settings.Journal.Storage = "none";
|
||||
|
||||
systemd = {
|
||||
coredump.enable = false;
|
||||
};
|
||||
|
||||
fileSystems."/mnt/hdd" = {
|
||||
device = "zdata/nas";
|
||||
fsType = "zfs";
|
||||
|
||||
@@ -1,197 +0,0 @@
|
||||
{
|
||||
config,
|
||||
inputs,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
inputs.matthew-hardware.nixosModules.mt7986a-glinet-gl-mt6000
|
||||
];
|
||||
|
||||
config = {
|
||||
hardware.mt7986a-glinet-gl-mt6000.enable = true;
|
||||
hardware.mt7986a-glinet-gl-mt6000.zealous = true;
|
||||
hardware.mt7986a-glinet-gl-mt6000.image.repart.enable = true;
|
||||
|
||||
nixpkgs.hostPlatform.system = "aarch64-linux";
|
||||
nixpkgs.buildPlatform.system = "x86_64-linux";
|
||||
|
||||
system.stateVersion = "26.11";
|
||||
clan.core.sops.defaultGroups = [ "admins" ];
|
||||
|
||||
clan.core.settings.name = "stellio";
|
||||
clan.core.settings.machine.description = "Flint-2 router";
|
||||
|
||||
# Root is ext4 on the Flint 2's eMMC: keep steady-state writes off it.
|
||||
# The journal is persistent but bounded (256M) and synced once a minute
|
||||
# (the router needs logs for pppd/kea debugging and, after the Sep 2026
|
||||
# unlogged reboots, for post-mortem; volatile storage left nothing).
|
||||
# /tmp is tmpfs, no core dumps, and ext4 skips atime updates and
|
||||
# flushes its journal every 60 s instead of 5 s so the small periodic
|
||||
# writes (Kea leases, timesyncd clock, speedtest textfile, journal)
|
||||
# coalesce. A power cut loses at most a minute of that state.
|
||||
fileSystems."/".options = [
|
||||
"noatime"
|
||||
"commit=60"
|
||||
];
|
||||
boot.tmp.useTmpfs = true;
|
||||
services.journald.settings.Journal = {
|
||||
Storage = "persistent";
|
||||
SystemMaxUse = "256M";
|
||||
SyncIntervalSec = "1m";
|
||||
};
|
||||
systemd.coredump.enable = false;
|
||||
|
||||
# Upstream 07d9958739 (mainline 2026-05, not in linux-6.18.y). The MT7531
|
||||
# switch on the Flint 2 hangs off MDIO, and mt7530_get_stats64 took the
|
||||
# MDIO mutex under the RCU read lock that /proc/net/dev holds, so any
|
||||
# stats reader (zerotier-one, node exporter, `ip -s link`) that raced a
|
||||
# PHY access oopsed the box: "BUG: scheduling while atomic" ->
|
||||
# "Unable to handle kernel paging request" on 2026-09-20 09:02 UTC.
|
||||
# Drop once boot.kernelPackages moves to a kernel that carries it.
|
||||
boot.kernelPatches = [
|
||||
{
|
||||
name = "mt7530-get-stats64-atomic";
|
||||
patch = ./mt7530-get-stats64-atomic.patch;
|
||||
}
|
||||
];
|
||||
|
||||
# nixpkgs' services.blocky check runs the aarch64 blocky in a
|
||||
# system.checks derivation, which an x86_64 builder without binfmt cannot
|
||||
# execute (`--max-jobs 0` -> Exec format error). Validate the same YAML
|
||||
# with the build host's blocky instead. Drop once cnx-network's router
|
||||
# service carries this itself (router/dns: validate the Blocky config
|
||||
# with the build host's binary).
|
||||
services.blocky.enableConfigCheck = false;
|
||||
system.checks = [
|
||||
(pkgs.runCommand "check-blocky-config" { } ''
|
||||
${lib.getExe pkgs.buildPackages.blocky} --config ${
|
||||
(pkgs.formats.yaml { }).generate "blocky-config.yaml" config.services.blocky.settings
|
||||
} validate && touch $out
|
||||
'')
|
||||
];
|
||||
|
||||
# The router service opens SSH only to the mgmt VLAN, the staging port
|
||||
# and the ZeroTier mesh (inventories/router.nix). Also admit it over
|
||||
# Yggdrasil (fleet-wide instance in inventories/default.nix) so the box
|
||||
# stays reachable when ZeroTier's controller/relays are down. Scoped to
|
||||
# the tunnel interface (clan-core's yggdrasil service names it `ygg`):
|
||||
# only decrypted 200::/7 traffic arrives there, so a spoofed source on
|
||||
# the WAN never matches.
|
||||
networking.firewall.interfaces.${config.services.yggdrasil.settings.IfName}.allowedTCPPorts = [
|
||||
22
|
||||
];
|
||||
|
||||
# AIS delegates a single /64 over PPPoE (seen 2026-10-02: "ppp0: DHCP:
|
||||
# received delegated prefix 2405:9800:b910:1f5d::/64"). The router
|
||||
# service hands out sub-prefixes with SubnetId=auto, so whichever VLAN
|
||||
# interface comes up first takes the whole /64 -- on this box vlan-mgmt
|
||||
# did, and vlan-lan logged "Couldn't find a suitable prefix. Ran out of
|
||||
# address space": no RA prefix on lan, so clients had no global IPv6.
|
||||
# Pin the ids: lan (where the clients are) always gets subnet 0, i.e.
|
||||
# the entire prefix when it is a /64; mgmt asks for subnet 1, which
|
||||
# fails harmlessly on a /64 (mgmt is reached over v4 and the meshes) and
|
||||
# starts working unchanged if AIS ever delegates wider. Drop once
|
||||
# cnx-network's router service exposes a per-VLAN subnet id.
|
||||
systemd.network.networks."40-vlan-lan".dhcpPrefixDelegationConfig.SubnetId = lib.mkForce "0x0";
|
||||
systemd.network.networks."40-vlan-mgmt".dhcpPrefixDelegationConfig.SubnetId = lib.mkForce "0x1";
|
||||
|
||||
# Interim copy of cnx-network-clan 45643d6 (router/ipv6: deprecate
|
||||
# withdrawn DHCPv6-PD prefixes); drop when the input is bumped past it.
|
||||
# networkd never deprecates a prefix it stops announcing (systemd#29651):
|
||||
# on every reboot the first PPPoE session lands on another AIS BNG, is
|
||||
# torn down minutes later, and the reconnect brings a different /64.
|
||||
# networkd announces the new prefix at once but clients keep the old
|
||||
# one preferred for the rest of its 1800 s lifetime, so RFC 6724 source
|
||||
# selection picks the dead prefix and every v6 connection fails for up
|
||||
# to 30 minutes (2026-10-08 07:57). Watch vlan-* for networkd removing a
|
||||
# dynamic (PD) address and send up to three RAs with that /64 at
|
||||
# preferred lifetime 0, one short-lived radvd per RA (SIGKILLed: no
|
||||
# shutdown RA with router lifetime 0), stopping as soon as the prefix is
|
||||
# back on the interface -- a plain flap re-delegates the same /64 within
|
||||
# seconds and a deprecating RA sent after networkd re-announced it would
|
||||
# leave clients deprecated until the next periodic RA (08:19 today).
|
||||
systemd.services.router-radv-deprecate = {
|
||||
description = "Deprecate withdrawn DHCPv6-PD prefixes on the VLANs";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "systemd-networkd.service" ];
|
||||
path = [
|
||||
pkgs.iproute2
|
||||
pkgs.ipcalc
|
||||
pkgs.radvd
|
||||
];
|
||||
serviceConfig = {
|
||||
Restart = "always";
|
||||
RestartSec = 2;
|
||||
RuntimeDirectory = "router-radv-deprecate";
|
||||
};
|
||||
script = ''
|
||||
conf=$RUNTIME_DIRECTORY/radvd.conf
|
||||
pid=$RUNTIME_DIRECTORY/radvd.pid
|
||||
|
||||
# /64s of the global addresses currently on an interface.
|
||||
prefixes_on() {
|
||||
ip -o -6 addr show dev "$1" scope global | while read -r _ _ _ a _; do
|
||||
echo "$(ipcalc --no-decorate -n "$a")/''${a##*/}"
|
||||
done
|
||||
}
|
||||
|
||||
# "Deleted 4: vlan-lan inet6 2001:db8::1/64 scope global dynamic mngtmpaddr \ valid_lft ..."
|
||||
ip -o -6 monitor address | while read -r event _ dev _ addr _ scope rest; do
|
||||
[[ $event == Deleted && $dev == vlan-* && $scope == global && $rest == *dynamic* ]] || continue
|
||||
prefix="$(ipcalc --no-decorate -n "$addr")/''${addr##*/}"
|
||||
cat > "$conf" <<EOF
|
||||
interface $dev {
|
||||
AdvSendAdvert on;
|
||||
MinRtrAdvInterval 3;
|
||||
MaxRtrAdvInterval 4;
|
||||
AdvDefaultLifetime 1800;
|
||||
AdvCurHopLimit 0;
|
||||
prefix $prefix {
|
||||
AdvOnLink on;
|
||||
AdvAutonomous on;
|
||||
AdvPreferredLifetime 0;
|
||||
AdvValidLifetime 7200;
|
||||
};
|
||||
};
|
||||
EOF
|
||||
for _ in 1 2 3; do
|
||||
if prefixes_on "$dev" | grep -qxF "$prefix"; then
|
||||
echo "$dev: $prefix is back, leaving it announced"
|
||||
break
|
||||
fi
|
||||
echo "$dev: deprecating withdrawn prefix $prefix"
|
||||
rm -f "$pid"
|
||||
# radvd sends its first RA on start; the next would follow 3-4 s later.
|
||||
radvd -C "$conf" -p "$pid" -n -m stderr &
|
||||
sleep 1
|
||||
kill -KILL $! 2>/dev/null || true
|
||||
wait $! || true
|
||||
sleep 2
|
||||
done
|
||||
done
|
||||
'';
|
||||
};
|
||||
|
||||
systemd.services.heartbeat-push = {
|
||||
description = "Heartbeat push to uptime monitor";
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${pkgs.curl}/bin/curl -s -o /dev/null https://uptime.b4l.co.th/api/push/X0WCHAcY5gPf1U8If7BT1FLjpacZqGZu?status=up&msg=OK&ping=";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.timers.heartbeat-push = {
|
||||
description = "Heartbeat push timer";
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = {
|
||||
OnBootSec = "60s";
|
||||
OnUnitActiveSec = "60s";
|
||||
Unit = "heartbeat-push.service";
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{ inputs, ... }:
|
||||
{
|
||||
disko = {
|
||||
imageBuilder = {
|
||||
# Avoid double emulation to significantly speed up image building process.
|
||||
# Update the system according to your host system.
|
||||
# See https://github.com/nix-community/disko/issues/856
|
||||
qemu =
|
||||
inputs.nixpkgs.legacyPackages.x86_64-linux.qemu
|
||||
+ "/bin/qemu-system-aarch64 -M virt -cpu cortex-a57";
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,230 +0,0 @@
|
||||
From 07d99587396024932e02474c3a5bede71d108454 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Sat, 2 May 2026 11:55:02 +0100
|
||||
Subject: net: dsa: mt7530: fix .get_stats64 sleeping in atomic context
|
||||
|
||||
The .get_stats64 callback runs in atomic context, but on
|
||||
MDIO-connected switches every register read acquires the MDIO bus
|
||||
mutex, which can sleep:
|
||||
[ 12.645973] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:609
|
||||
[ 12.654442] in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 759, name: grep
|
||||
[ 12.663377] preempt_count: 0, expected: 0
|
||||
[ 12.667410] RCU nest depth: 1, expected: 0
|
||||
[ 12.671511] INFO: lockdep is turned off.
|
||||
[ 12.675441] CPU: 0 UID: 0 PID: 759 Comm: grep Tainted: G S W 7.0.0+ #0 PREEMPT
|
||||
[ 12.675453] Tainted: [S]=CPU_OUT_OF_SPEC, [W]=WARN
|
||||
[ 12.675456] Hardware name: Bananapi BPI-R64 (DT)
|
||||
[ 12.675459] Call trace:
|
||||
[ 12.675462] show_stack+0x14/0x1c (C)
|
||||
[ 12.675477] dump_stack_lvl+0x68/0x8c
|
||||
[ 12.675487] dump_stack+0x14/0x1c
|
||||
[ 12.675495] __might_resched+0x14c/0x220
|
||||
[ 12.675504] __might_sleep+0x44/0x80
|
||||
[ 12.675511] __mutex_lock+0x50/0xb10
|
||||
[ 12.675523] mutex_lock_nested+0x20/0x30
|
||||
[ 12.675532] mt7530_get_stats64+0x40/0x2ac
|
||||
[ 12.675542] dsa_user_get_stats64+0x2c/0x40
|
||||
[ 12.675553] dev_get_stats+0x44/0x1e0
|
||||
[ 12.675564] dev_seq_printf_stats+0x24/0xe0
|
||||
[ 12.675575] dev_seq_show+0x14/0x3c
|
||||
[ 12.675583] seq_read_iter+0x37c/0x480
|
||||
[ 12.675595] seq_read+0xd0/0xec
|
||||
[ 12.675605] proc_reg_read+0x94/0xe4
|
||||
[ 12.675615] vfs_read+0x98/0x29c
|
||||
[ 12.675625] ksys_read+0x54/0xdc
|
||||
[ 12.675633] __arm64_sys_read+0x18/0x20
|
||||
[ 12.675642] invoke_syscall.constprop.0+0x54/0xec
|
||||
[ 12.675653] do_el0_svc+0x3c/0xb4
|
||||
[ 12.675662] el0_svc+0x38/0x200
|
||||
[ 12.675670] el0t_64_sync_handler+0x98/0xdc
|
||||
[ 12.675679] el0t_64_sync+0x158/0x15c
|
||||
|
||||
For MDIO-connected switches, poll MIB counters asynchronously using a
|
||||
delayed workqueue every second and let .get_stats64 return the cached
|
||||
values under a spinlock. A mod_delayed_work() call on each read
|
||||
triggers an immediate refresh so counters stay responsive when queried
|
||||
more frequently.
|
||||
|
||||
MMIO-connected switches (MT7988, EN7581, AN7583) are not affected
|
||||
because their regmap does not sleep, so they continue to read MIB
|
||||
counters directly in .get_stats64.
|
||||
|
||||
Fixes: 88c810f35ed5 ("net: dsa: mt7530: implement .get_stats64")
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
Acked-by: Chester A. Unal <chester.a.unal@arinc9.com>
|
||||
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
||||
Link: https://patch.msgid.link/6940b913da2c29156f0feff74b678d3c526ee84c.1777719253.git.daniel@makrotopia.org
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/dsa/mt7530.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++--
|
||||
drivers/net/dsa/mt7530.h | 8 ++++++
|
||||
2 files changed, 80 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
|
||||
index b9423389c2ef0..44d670904ad89 100644
|
||||
--- a/drivers/net/dsa/mt7530.c
|
||||
+++ b/drivers/net/dsa/mt7530.c
|
||||
@@ -25,6 +25,9 @@
|
||||
|
||||
#include "mt7530.h"
|
||||
|
||||
+#define MT7530_STATS_POLL_INTERVAL (1 * HZ)
|
||||
+#define MT7530_STATS_RATE_LIMIT (HZ / 10)
|
||||
+
|
||||
static struct mt753x_pcs *pcs_to_mt753x_pcs(struct phylink_pcs *pcs)
|
||||
{
|
||||
return container_of(pcs, struct mt753x_pcs, pcs);
|
||||
@@ -906,10 +909,9 @@ static void mt7530_get_rmon_stats(struct dsa_switch *ds, int port,
|
||||
*ranges = mt7530_rmon_ranges;
|
||||
}
|
||||
|
||||
-static void mt7530_get_stats64(struct dsa_switch *ds, int port,
|
||||
- struct rtnl_link_stats64 *storage)
|
||||
+static void mt7530_read_port_stats64(struct mt7530_priv *priv, int port,
|
||||
+ struct rtnl_link_stats64 *storage)
|
||||
{
|
||||
- struct mt7530_priv *priv = ds->priv;
|
||||
uint64_t data;
|
||||
|
||||
/* MIB counter doesn't provide a FramesTransmittedOK but instead
|
||||
@@ -951,6 +953,54 @@ static void mt7530_get_stats64(struct dsa_switch *ds, int port,
|
||||
&storage->rx_crc_errors);
|
||||
}
|
||||
|
||||
+static void mt7530_stats_refresh(struct mt7530_priv *priv)
|
||||
+{
|
||||
+ struct rtnl_link_stats64 stats = {};
|
||||
+ struct dsa_port *dp;
|
||||
+ int port;
|
||||
+
|
||||
+ dsa_switch_for_each_user_port(dp, priv->ds) {
|
||||
+ port = dp->index;
|
||||
+
|
||||
+ mt7530_read_port_stats64(priv, port, &stats);
|
||||
+
|
||||
+ spin_lock_bh(&priv->stats_lock);
|
||||
+ priv->ports[port].stats = stats;
|
||||
+ priv->stats_last = jiffies;
|
||||
+ spin_unlock_bh(&priv->stats_lock);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void mt7530_stats_poll(struct work_struct *work)
|
||||
+{
|
||||
+ struct mt7530_priv *priv = container_of(work, struct mt7530_priv,
|
||||
+ stats_work.work);
|
||||
+
|
||||
+ mt7530_stats_refresh(priv);
|
||||
+ schedule_delayed_work(&priv->stats_work,
|
||||
+ MT7530_STATS_POLL_INTERVAL);
|
||||
+}
|
||||
+
|
||||
+static void mt7530_get_stats64(struct dsa_switch *ds, int port,
|
||||
+ struct rtnl_link_stats64 *storage)
|
||||
+{
|
||||
+ struct mt7530_priv *priv = ds->priv;
|
||||
+ bool refresh;
|
||||
+
|
||||
+ if (priv->bus) {
|
||||
+ spin_lock_bh(&priv->stats_lock);
|
||||
+ *storage = priv->ports[port].stats;
|
||||
+ refresh = time_after(jiffies, priv->stats_last +
|
||||
+ MT7530_STATS_RATE_LIMIT);
|
||||
+ spin_unlock_bh(&priv->stats_lock);
|
||||
+ if (refresh)
|
||||
+ mod_delayed_work(system_percpu_wq,
|
||||
+ &priv->stats_work, 0);
|
||||
+ } else {
|
||||
+ mt7530_read_port_stats64(priv, port, storage);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void mt7530_get_eth_ctrl_stats(struct dsa_switch *ds, int port,
|
||||
struct ethtool_eth_ctrl_stats *ctrl_stats)
|
||||
{
|
||||
@@ -3137,9 +3187,24 @@ mt753x_setup(struct dsa_switch *ds)
|
||||
if (ret && priv->irq_domain)
|
||||
mt7530_free_mdio_irq(priv);
|
||||
|
||||
+ if (!ret && priv->bus) {
|
||||
+ mt7530_stats_refresh(priv);
|
||||
+ schedule_delayed_work(&priv->stats_work,
|
||||
+ MT7530_STATS_POLL_INTERVAL);
|
||||
+ }
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static void
|
||||
+mt753x_teardown(struct dsa_switch *ds)
|
||||
+{
|
||||
+ struct mt7530_priv *priv = ds->priv;
|
||||
+
|
||||
+ if (priv->bus)
|
||||
+ cancel_delayed_work_sync(&priv->stats_work);
|
||||
+}
|
||||
+
|
||||
static int mt753x_set_mac_eee(struct dsa_switch *ds, int port,
|
||||
struct ethtool_keee *e)
|
||||
{
|
||||
@@ -3257,6 +3322,7 @@ static int mt7988_setup(struct dsa_switch *ds)
|
||||
static const struct dsa_switch_ops mt7530_switch_ops = {
|
||||
.get_tag_protocol = mtk_get_tag_protocol,
|
||||
.setup = mt753x_setup,
|
||||
+ .teardown = mt753x_teardown,
|
||||
.preferred_default_local_cpu_port = mt753x_preferred_default_local_cpu_port,
|
||||
.get_strings = mt7530_get_strings,
|
||||
.get_ethtool_stats = mt7530_get_ethtool_stats,
|
||||
@@ -3395,6 +3461,9 @@ mt7530_probe_common(struct mt7530_priv *priv)
|
||||
priv->ds->ops = &mt7530_switch_ops;
|
||||
priv->ds->phylink_mac_ops = &mt753x_phylink_mac_ops;
|
||||
mutex_init(&priv->reg_mutex);
|
||||
+ spin_lock_init(&priv->stats_lock);
|
||||
+ INIT_DELAYED_WORK(&priv->stats_work, mt7530_stats_poll);
|
||||
+
|
||||
dev_set_drvdata(dev, priv);
|
||||
|
||||
return 0;
|
||||
diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h
|
||||
index 3e0090bed298d..dd33b0df3419e 100644
|
||||
--- a/drivers/net/dsa/mt7530.h
|
||||
+++ b/drivers/net/dsa/mt7530.h
|
||||
@@ -796,6 +796,7 @@ struct mt7530_fdb {
|
||||
* @pvid: The VLAN specified is to be considered a PVID at ingress. Any
|
||||
* untagged frames will be assigned to the related VLAN.
|
||||
* @sgmii_pcs: Pointer to PCS instance for SerDes ports
|
||||
+ * @stats: Cached port statistics for MDIO-connected switches
|
||||
*/
|
||||
struct mt7530_port {
|
||||
bool enable;
|
||||
@@ -803,6 +804,7 @@ struct mt7530_port {
|
||||
u32 pm;
|
||||
u16 pvid;
|
||||
struct phylink_pcs *sgmii_pcs;
|
||||
+ struct rtnl_link_stats64 stats;
|
||||
};
|
||||
|
||||
/* Port 5 mode definitions of the MT7530 switch */
|
||||
@@ -875,6 +877,9 @@ struct mt753x_info {
|
||||
* @create_sgmii: Pointer to function creating SGMII PCS instance(s)
|
||||
* @active_cpu_ports: Holding the active CPU ports
|
||||
* @mdiodev: The pointer to the MDIO device structure
|
||||
+ * @stats_lock: Protects cached per-port stats from concurrent access
|
||||
+ * @stats_work: Delayed work for polling MIB counters on MDIO switches
|
||||
+ * @stats_last: Jiffies timestamp of last MIB counter poll
|
||||
*/
|
||||
struct mt7530_priv {
|
||||
struct device *dev;
|
||||
@@ -900,6 +905,9 @@ struct mt7530_priv {
|
||||
int (*create_sgmii)(struct mt7530_priv *priv);
|
||||
u8 active_cpu_ports;
|
||||
struct mdio_device *mdiodev;
|
||||
+ spinlock_t stats_lock; /* protects cached stats counters */
|
||||
+ struct delayed_work stats_work;
|
||||
+ unsigned long stats_last;
|
||||
};
|
||||
|
||||
struct mt7530_hw_vlan_entry {
|
||||
--
|
||||
cgit 1.3.1-korg
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
{ ... }:
|
||||
{
|
||||
system.stateVersion = "25.11";
|
||||
nixpkgs.hostPlatform = {
|
||||
system = "x86_64-linux";
|
||||
};
|
||||
|
||||
clan.core.settings.name = "tangra";
|
||||
clan.core.settings.machine.description =
|
||||
"A Hetzner VPS machine own by Alex. This is a machine for poyfestival.com";
|
||||
|
||||
clan.core.sops.defaultGroups = [ "admins" ];
|
||||
|
||||
clan.core.vars.generators.acme = {
|
||||
share = true;
|
||||
files.email.secret = false;
|
||||
|
||||
prompts.email = {
|
||||
type = "line";
|
||||
description = "Email for ACME registeration";
|
||||
};
|
||||
|
||||
script = ''
|
||||
cat $prompts/email > $out/email
|
||||
'';
|
||||
};
|
||||
|
||||
users.users.nginx.extraGroups = [ "acme" ];
|
||||
|
||||
security.acme.acceptTerms = true;
|
||||
|
||||
imports = [ ];
|
||||
}
|
||||
@@ -1,86 +0,0 @@
|
||||
{ ... }:
|
||||
let
|
||||
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
|
||||
os = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_119349241";
|
||||
in
|
||||
{
|
||||
|
||||
boot.loader = {
|
||||
systemd-boot = {
|
||||
enable = true;
|
||||
};
|
||||
efi = {
|
||||
canTouchEfiVariables = true;
|
||||
};
|
||||
};
|
||||
|
||||
boot.zfs.forceImportRoot = true;
|
||||
|
||||
disko.devices = {
|
||||
disk = {
|
||||
"os-${hashDisk os}" = {
|
||||
type = "disk";
|
||||
device = os;
|
||||
content = {
|
||||
type = "gpt";
|
||||
partitions = {
|
||||
ESP = {
|
||||
size = "1G";
|
||||
type = "EF00";
|
||||
content = {
|
||||
type = "filesystem";
|
||||
format = "vfat";
|
||||
mountpoint = "/boot";
|
||||
mountOptions = [ "nofail" ];
|
||||
};
|
||||
};
|
||||
system = {
|
||||
size = "100%";
|
||||
content = {
|
||||
type = "zfs";
|
||||
pool = "zroot";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
zpool = {
|
||||
zroot = {
|
||||
type = "zpool";
|
||||
rootFsOptions = {
|
||||
mountpoint = "none";
|
||||
compression = "lz4";
|
||||
acltype = "posixacl";
|
||||
xattr = "sa";
|
||||
"com.sun:auto-snapshot" = "true";
|
||||
};
|
||||
options.ashift = "12";
|
||||
datasets = {
|
||||
"root" = {
|
||||
type = "zfs_fs";
|
||||
options.mountpoint = "none";
|
||||
};
|
||||
"root/nixos" = {
|
||||
type = "zfs_fs";
|
||||
options.mountpoint = "/";
|
||||
mountpoint = "/";
|
||||
};
|
||||
"root/home" = {
|
||||
type = "zfs_fs";
|
||||
options.mountpoint = "/home";
|
||||
mountpoint = "/home";
|
||||
};
|
||||
"root/tmp" = {
|
||||
type = "zfs_fs";
|
||||
mountpoint = "/tmp";
|
||||
options = {
|
||||
mountpoint = "/tmp";
|
||||
sync = "disabled";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -10,9 +10,17 @@
|
||||
|
||||
(inputs.import-tree ./services)
|
||||
|
||||
(import ../../lib/auto-accept-zerotier-members.nix {
|
||||
memberIds = [
|
||||
"dbe44c0287" # Alex-gateway
|
||||
"b0e0b84fd3" # Alex
|
||||
"2bd36db8cc" # kurogeek-thinkpad
|
||||
];
|
||||
})
|
||||
];
|
||||
|
||||
clan.core.sops.defaultGroups = [ "admins" ];
|
||||
clan.core.networking.targetHost = "root@[${config.clan.core.vars.generators.zerotier.files.zerotier-ip.value}]";
|
||||
|
||||
clan.core.settings.machine.description = "Glom NAS";
|
||||
|
||||
|
||||
@@ -82,11 +82,8 @@ in
|
||||
};
|
||||
|
||||
services.avahi = {
|
||||
settings.publish = {
|
||||
disable-publishing = false;
|
||||
disable-user-service-publishing = false;
|
||||
publish-addresses = true;
|
||||
};
|
||||
publish.enable = true;
|
||||
publish.userServices = true;
|
||||
# ^^ Needed to allow samba to automatically register mDNS records (without the need for an `extraServiceFile`
|
||||
nssmdns4 = true;
|
||||
# ^^ Not one hundred percent sure if this is needed- if it aint broke, don't fix it
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
# Apple Network
|
||||
|
||||
This service allows atalkd instances to connect to each other over vxlan over Yggdrasil. We need to use vxlan due to the support of broadcasting it provides. The service will form a network of star-topology vxlan using the underlying Yggdrasil network. With this vxlan network, we can have a private Apple Talk network over the internet.
|
||||
@@ -1,139 +0,0 @@
|
||||
{ clanLib, ... }:
|
||||
{
|
||||
_class = "clan.service";
|
||||
manifest.name = "apple-network";
|
||||
manifest.description = "This service will create an instance of `atalkd` for each peer to talk to Apple machines over Apple Talk protocol and automatically connect each peer using vxlan over Yggdrasil network to achieve Apple Talk over internet experience";
|
||||
manifest.readme = builtins.readFile ./README.md;
|
||||
manifest.categories = [ "Network" ];
|
||||
|
||||
roles.peer = {
|
||||
description = "A gateway machine that allow classic Apple machines to connect to other Apple machines over the internet";
|
||||
|
||||
interface =
|
||||
{ lib, ... }:
|
||||
{
|
||||
options = {
|
||||
zone_name = lib.mkOption {
|
||||
type = with lib.types; str;
|
||||
description = "Zone name for Apple Talk protocol";
|
||||
default = "Default";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
perInstance =
|
||||
{ roles, settings, ... }:
|
||||
{
|
||||
nixosModule =
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
vxlanPort = 4789;
|
||||
|
||||
getYggdrasilIP =
|
||||
machineName:
|
||||
if config.clan.core.vars.generators.yggdrasil.files.address ? value then
|
||||
clanLib.getPublicValue {
|
||||
flake = config.clan.core.settings.directory;
|
||||
machine = machineName;
|
||||
generator = "yggdrasil";
|
||||
file = "address";
|
||||
default = null;
|
||||
}
|
||||
else
|
||||
throw "clanService/yggdrasil is required";
|
||||
|
||||
noSelfPeers = builtins.filter (peerName: peerName != config.clan.core.settings.machine.name) (
|
||||
lib.mapAttrsToList (machineName: _: machineName) roles.peer.machines
|
||||
);
|
||||
|
||||
sortedPeers = builtins.sort (x: y: x < y) (
|
||||
lib.mapAttrsToList (machineName: _: machineName) roles.peer.machines
|
||||
);
|
||||
|
||||
getMachineIndex = machineName: lib.lists.findFirstIndex (x: x == machineName) null sortedPeers;
|
||||
|
||||
selfVXAddress = "192.168.254.${
|
||||
lib.toString ((getMachineIndex config.clan.core.settings.machine.name) + 1)
|
||||
}/24";
|
||||
in
|
||||
{
|
||||
|
||||
services.atalkd = {
|
||||
enable = true;
|
||||
interfaces = {
|
||||
vxlan.config = ''
|
||||
-router -phase 2 -net 1 -zone "${settings.zone_name}"
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
networking.useNetworkd = true;
|
||||
|
||||
networking.firewall.interfaces."ygg".allowedUDPPorts = [ vxlanPort ];
|
||||
|
||||
boot.kernelModules = [ "vxlan" ];
|
||||
|
||||
systemd.network.netdevs =
|
||||
builtins.listToAttrs (
|
||||
map (
|
||||
peerName:
|
||||
(lib.nameValuePair "10-apl-vxlan-${peerName}" {
|
||||
enable = true;
|
||||
netdevConfig = {
|
||||
Name = "vxlan-${peerName}";
|
||||
Kind = "vxlan";
|
||||
};
|
||||
vxlanConfig = {
|
||||
VNI = (getMachineIndex config.clan.core.settings.machine.name) + (getMachineIndex peerName);
|
||||
Remote = getYggdrasilIP peerName;
|
||||
DestinationPort = vxlanPort;
|
||||
Independent = true;
|
||||
};
|
||||
})
|
||||
) noSelfPeers
|
||||
)
|
||||
// {
|
||||
"10-apl-vxlan" = {
|
||||
enable = true;
|
||||
netdevConfig = {
|
||||
Kind = "bridge";
|
||||
Name = "vxlan";
|
||||
};
|
||||
bridgeConfig = {
|
||||
STP = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
systemd.network.networks =
|
||||
builtins.listToAttrs (
|
||||
map (
|
||||
peerName:
|
||||
(lib.nameValuePair "10-apl-vxlan-${peerName}" {
|
||||
enable = true;
|
||||
matchConfig.Name = "vxlan-${peerName}";
|
||||
networkConfig.Bridge = "vxlan";
|
||||
})
|
||||
) noSelfPeers
|
||||
)
|
||||
// {
|
||||
"10-apl-vxlan" = {
|
||||
enable = true;
|
||||
matchConfig.Name = "vxlan";
|
||||
address = [ selfVXAddress ];
|
||||
};
|
||||
};
|
||||
|
||||
environment.systemPackages = [
|
||||
pkgs.netatalk
|
||||
pkgs.bridge-utils
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{ inputs, self, ... }:
|
||||
let
|
||||
module = ./default.nix;
|
||||
in
|
||||
{
|
||||
clan.modules = {
|
||||
apple-network = module;
|
||||
};
|
||||
perSystem =
|
||||
{ ... }:
|
||||
{
|
||||
clan.nixosTests.service-apple-network = {
|
||||
imports = [ ./tests/vm/default.nix ];
|
||||
_module.args = { inherit self inputs; };
|
||||
|
||||
clan.modules."@clan/apple-network" = module;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
{
|
||||
self,
|
||||
lib,
|
||||
config,
|
||||
hostPkgs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
name = "service-apple-network";
|
||||
|
||||
result.update-vars =
|
||||
let
|
||||
relativeDir = lib.removePrefix "${self}/" (toString config.clan.directory);
|
||||
in
|
||||
hostPkgs.writeShellScriptBin "update-vars" ''
|
||||
set -x
|
||||
export PRJ_ROOT=$(git rev-parse --show-toplevel)
|
||||
${
|
||||
self.inputs.clan-core.packages.${hostPkgs.system}.clan-cli
|
||||
}/bin/clan-generate-test-vars $PRJ_ROOT/${relativeDir} ${config.name}
|
||||
'';
|
||||
|
||||
clan = {
|
||||
directory = ./.;
|
||||
test.useContainers = false;
|
||||
|
||||
inventory = {
|
||||
meta.domain = "test.clan";
|
||||
|
||||
machines.peer1 = { };
|
||||
machines.peer2 = { };
|
||||
machines.peer3 = { };
|
||||
|
||||
instances = {
|
||||
apple-network = {
|
||||
module.name = "@clan/apple-network";
|
||||
module.input = "self";
|
||||
roles.peer.machines = {
|
||||
peer1 = { };
|
||||
peer2 = { };
|
||||
peer3 = { };
|
||||
};
|
||||
};
|
||||
yggdrasil = {
|
||||
module.name = "yggdrasil";
|
||||
roles.default.tags.all = { };
|
||||
roles.default.settings.extraPeers = [
|
||||
"tls://ygg.jjolly.dev:3443"
|
||||
"tls://[2602:fc24:18:7a42::1]:993"
|
||||
"tcp://leo.node.3dt.net:9002"
|
||||
"tcp://ygg-kcmo.incognet.io:8883"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
nodes = {
|
||||
peer1 = { };
|
||||
peer2 = { };
|
||||
peer3 = { };
|
||||
};
|
||||
|
||||
testScript = _: ''
|
||||
# cannot test connectivity due to Yggdrasil's establishment
|
||||
start_all()
|
||||
peer1.wait_for_unit("atalkd")
|
||||
peer1.succeed("systemctl status atalkd")
|
||||
|
||||
peer2.wait_for_unit("atalkd")
|
||||
peer2.succeed("systemctl status atalkd")
|
||||
|
||||
peer3.wait_for_unit("atalkd")
|
||||
peer3.succeed("systemctl status atalkd")
|
||||
'';
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
[
|
||||
{
|
||||
"publickey": "age1f92zl8y70z5w9gn0l5leg2fhyvxy6m93dfh7n6ltgvuu9nyg6epsrw6t8x",
|
||||
"type": "age"
|
||||
}
|
||||
]
|
||||
@@ -1,6 +0,0 @@
|
||||
[
|
||||
{
|
||||
"publickey": "age1u36fr87cru90vfznf5szasya9nhvvseh4atk8zsdj0rrsu0nnvwqsyt8g6",
|
||||
"type": "age"
|
||||
}
|
||||
]
|
||||
@@ -1,6 +0,0 @@
|
||||
[
|
||||
{
|
||||
"publickey": "age1rka3368ltqc787xw99uu762lqfk7qxld9265u2t62fpxnp9xhufsc2q5rw",
|
||||
"type": "age"
|
||||
}
|
||||
]
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:hC4Lle6mXuTFq//wBHUTyH3X778u/gYJSXJOiQ7xUb+gnC8beH1olxL2ZhtUiMkktzhsPM/j6cxhltPp25UTeJnUOcoYesqZcp8=,iv:WOx2P2Cu4v58xM9ePjAw1gdA0fFnGG2UqEXH2iksGoo=,tag:43n1ibVSy2AeS9f5qQBKNQ==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtT244N1Q3Zk9pRjFFQlUr\ncDExSTBwSWk5UXVyMjhWclQwSFZaYnpTRFY0CnE5YStVdzMrS3BKYzYvc3V3QVFY\nbDVwVytoNERveU1xQllqNUFGV2hYbGMKLS0tIDJSUmkwMUQzL3Y0MU5qZTJ3eFN3\nNGdwamM1UDBPdzhvSWsyZzR6anZ0eFEKKnr1/7rf3fH1i7KUoZdilLDgb44K2qzn\nI9Y+7FbV4gzQUzKWjAQeFN37Z4Qiuy0xJVA0lw8KvM+NCxSZDfh3kw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-03T10:46:56Z",
|
||||
"mac": "ENC[AES256_GCM,data:hmpbOtra6EyNiPg7EsA3F4elHEO87JPUr4VKVppvzUwLX1HSj67WrU6k3rEoJT+k7Hq1lxnAzDEckSG1fUOap11rk8ksp1IAGR0+yqykC/Qj/Nl8wXqP84gr49bJK6xE/DDdCRCcBff2d6IpnehyEr8fGFEZbWGygblec8U8GPo=,iv:+M1C3rL22foowr0VD80jwrNFb5xz4k5JQ/DJm4ThKHk=,tag:wabFAC5NTCVGfIQQzm0yGg==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../users/admin
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:ndWIEOqP2ybCN7Ak5g+8q3YG5rLQ7OuSv/vCbnMA8AK6Lby2JMGRkRGysqJdyEF7eh4w7PpZ/AtKPtPbUucjeTB5+8g76PPJTBE=,iv:EYy0GGqEBmIc5rSWP7Zleb5eQ0JzTz84HqeJPpCSpxk=,tag:iMgTUb9+wxE9S2kKoOEvsQ==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQTEF6OXN4K0dHdXhWWmt2\neG5wdkNIc2F0UnFEeHFLQkdTWkFpUWhTa0NBCmw2N2J1T0FJVE9JR3VBRWV0THh5\nVEZlbVZrcXAwK3BsYXFOZUF6c3lRSkUKLS0tIFRCQzNUaGFHdERWNWR4enVWRGpx\nbDEzRU9jWHgxWHovaENjbkFlZERIbkkKvAW31gTJg9izrWuAMeDHS9SWPQYtxRBY\necDCn8QORFrnDdxEusCnGJrAU4kmS3Y3CwSHCtEijs3JdIgg9wl/MA==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-03T10:47:04Z",
|
||||
"mac": "ENC[AES256_GCM,data:y1U2vsdqR97fPAnp6iZiLY1KbWYmgDqgZ5bwIkWPCr7Gjjrn+qV+sc2T1BTVz3Zo0JOz4ScCc+f6snVsFKdCDU/NmDVFt/sqyH4NHUPRQ3StsQim8C7IkSwUtm3EhrqpLYFD21MEjrYYdHMHbWybxrOI0qI6mDwZymHJFeCLdQA=,iv:lVvPn69eQE/huwDmwePepfpi2l9ZOPQO7W20o4AJBFQ=,tag:7VPfjKZsBVJTZxNwTcI6sg==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../users/admin
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:JPdetkhtF9eSmgEfCO2exXlGQ5KWLeIM3mnW5BfyTY8r0PxWSEGAwBskC1SiDdRERWB2VEbPiPgCNXMnGaYlDqSdZN6R9wSFvsQ=,iv:qGveNhUtgxvKnmdsPoPpffKyi5srlq0Pd6aW283B5C0=,tag:TcJsCrBlzfjXvztcRaxYFQ==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAvdjNHa1RlcFJHazB5TXFu\nOUQ4REpCZm5Yc3ZhcVhwT1FqRHlvbnoxZWlFCnNrVUEyK2ZYSmlacmJ2b2QrclZl\nSDV1eWxXVmJxZlhMMXgrTWtjcjVhQlkKLS0tIHZPN3pCUVBLQmpRVGx6SDBQNDZo\nSitheGhXNGl5QW9HTGNsTTdTdWVwaE0KfuM5xZOPbR1lxkJPJUOVrtlW5Ujobemp\nid40reDqxKQxP3khJv8lf9ZoN8LAx2Iwh0DeAl+UJpsoVWgS7uI2qQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-07T04:54:10Z",
|
||||
"mac": "ENC[AES256_GCM,data:Tt8yqzfAnSDe2n7KDt1Z/D73hkS1w7DsqIh+s5WljLzar9PEt5vUCLb8DIvBwITyzGAoHH1ym3v3NrnJWCdxajKExTMBf4aY3MJCtykeCG37701S/KxumjTW9/fJw74gcET5I6NafTWb6H5XHsrRaQX1Xnspcs8B7uLGZZ28dSM=,iv:Fo5UPVhnjuOx6Cp4grofHOiD2pm0TXuRRuoTwvxKn1s=,tag:VQ/TF1TiyJADj7/3RwPCAg==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../users/admin
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"publickey": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
|
||||
"type": "age"
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
26.11
|
||||
@@ -1 +0,0 @@
|
||||
200:e6cc:c86:f02d:b0d5:fba9:9b2c:eb77
|
||||
-1
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/peer1
|
||||
-18
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:6YDp5S2TzEnhDgGhcz8cA3uBsfDt0Oc4JpztB1JUcg/+tDBbeaQN4MLxuZKstXn2Hb1mYtBLlX0vHw++T181Js2sIznyfC1lr68GOvQAp4NYgf23dXpdZk/CMPNUMiGOYVwKWQ/Z0/p0azJ6xV29dYQcM4Q9hys=,iv:Ijzz8hm0looCWoSpjg/rYKp9jhvzRuLboKWHrlwVeFA=,tag:kJcH/1Pu+9q9f2J68LETug==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYNDNEL3kvdEpEMjYyOFJG\nMk5adU04M3hxa21jTTZNM2dQREpmUlVES1NvCjh6eDNFZ1hzUVlTY3Nidnp3TkYr\nRVl4TFlrNUE3dVIzZzg2VWMwTFBYUXMKLS0tIFE0dVFQQmxwOFJ6YkdaQlh6dUlW\nTi8rdXdQbGR1eXpLcTdOandqQmxka3cKImbmJQo2YMYMSQD8kNTgol3VJ4YGIaoz\nl3AY4u/fobg5qlzVQwV33G0/Wf72Z2aTjSLnP4thnasQ89PdYvs7hA==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1f92zl8y70z5w9gn0l5leg2fhyvxy6m93dfh7n6ltgvuu9nyg6epsrw6t8x"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiaWw5SU9KWmJnVVVmTVpr\nL1V6RnRYUGg2UnhXR1BnVTh5eFhnNFpidGdjCmdMeU1nZkZmTTVwbkNaVElFa0Z4\nVkdGdjc4c2lPWGNrVGxocE9iQUZ3QTAKLS0tIHIzTzRRbXVkM3I4ZVRxeSs5eHV5\nTUxOaytzb2MxQ2UybkVCYWVWVmVEcUEKPeK+CC7r3CP5BJqg9thWNHWjPBp/ueHU\nRif6T79kqf+c3B34qXwR0zfyM1+a0r9GAVVC2/q+Ha/As5sPJU39ww==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-03T10:46:56Z",
|
||||
"mac": "ENC[AES256_GCM,data:PffiPU1GR9DojTb7TxzBkpivKV2ybmmq9h4pOOyq7p5BAIPF+JSe+BDtbItQ+Gn5LnitQRUVvhat8E2iYfz3JgNxNKcsNFU/mWtCz3PlqyiuRzUBtEL3zYfhdMi8hYYlVdfMumaK3VMk+b4uDGExR+MpURL97TFku47qRbzbILs=,iv:3//fj7WtIX2QNYB9ub1JKAFIn5vJeuZl6rqaEsX0oQc=,tag:njU+WAVq7xBgE0sna2dMKA==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
-1
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/admin
|
||||
@@ -1 +0,0 @@
|
||||
8c99f9bc87e92795022b32698a440d6f9fe01d1110f867de8176bb190b92acab
|
||||
@@ -1 +0,0 @@
|
||||
26.11
|
||||
@@ -1 +0,0 @@
|
||||
200:eb95:7d1b:3ac3:62e7:24af:2274:3771
|
||||
-1
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/peer2
|
||||
-18
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:vOwMqT12A5ap5hRvCGTjTUX4sXKO3N7KE8eQ+/SCcBWndU9/b2AehiNgplWWMGcYdmeDL9qI8V2pPkgBkQ/tWH6N8DccSM/zQzrBUkXvRApl6hvNZAWuBVf/P4MW4/EbRGtMg2tEXkaPDtRn2TsDK7ygmXmqArI=,iv:FkxFx/ClAftLu85S6Uq3ZOom+YDOpeWGlYLOFBmFfnk=,tag:zprw62qiu+hmLZEZbnqYXA==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA0WVB1M2ttd0FocGhTSjNo\nUDFIcmpsL051TndWbkJVakJHbUxjY3Q3NjM0CnkrbFlHS1E4bkZJQTIvMDJ3VDFv\nNW1OdmwvalBEelN2d3YwbHVqTW94OFEKLS0tIGtpOWxCM29xdXhQL2Yzb094OG1n\nT21mc25yU1dJL29vekRHdldzdDR3dEkKoZ1dPRaPg8iVsuec6IhV3cLPchokV2wv\nu6qb92hsLQuyPHDA01Oey0jxmaYMQGtAVjo2zEM+E+zrKY+f2pHIUQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArcmo5d2x6c3J0YTkwMGJE\nanphd2FiUjdGdmdNeW0rL0FpcTVSM3dublZ3CnphajNVV2YrTGl2a3ZqMTJKeU4v\nTzZRS2F5MlA5Ny84cFFoNWZQZnpBZTgKLS0tIHVKQUJWcmlPdy9GNXNBYnpJcEVC\nNmJVMlpvSzZPdk1JY2hIZVEvc3cwV2MKE/cMJU/j5g62njJ49AfnLutmxkpz/gxX\nIqWe1m7Uxl/awVFa7F8N7TUkd0jLbAGXZaonDjiBxOTwg/jr/apnuQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1u36fr87cru90vfznf5szasya9nhvvseh4atk8zsdj0rrsu0nnvwqsyt8g6"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-03T10:47:04Z",
|
||||
"mac": "ENC[AES256_GCM,data:wiIkwEDwGJZe0u8qLHthPkCXubeIGyHV8yBo8CsSengLVTOtRZ877zTrFvE74ATF1pGE3DFJ5qGRrOGgKJ4VOl043LbEBs0bxZC495pPMPYszimp2UAf/XE3QWlNi9p4Ce/kbvUDd0W3SRt4hIv6HOLWApiRoqfS2qSMUnBQeW0=,iv:Hs7EysUnje/iWZRhJLlqf8wuFJnIMpWfXWHrilfmM5I=,tag:Rgj9x4ZOM2fihKKNQ4ux3g==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
-1
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/admin
|
||||
@@ -1 +0,0 @@
|
||||
8a354172629e4e8c6da86ec5e447411e4238cf7bb439b798fae56509a82d7472
|
||||
@@ -1 +0,0 @@
|
||||
26.11
|
||||
@@ -1 +0,0 @@
|
||||
200:3dcd:9b0d:103c:f953:1e8:e3a2:ed90
|
||||
-1
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/peer3
|
||||
-18
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:7no9ZnfatNLEykz+JOUExxmaRzBr7B5PEcevETySJWHTCCjSULdRb2KLxbXP5OKWSuJbR8pJ+p+nZuyr7aOTyXrU+fgwf/Pff4KGaZbKf1t3HJun8wJ2q62uaFYu8ACbNFfwIzJ51SPGcO7IHxfjWn5k9zG7av4=,iv:+VNvFKAJ+HDCGZciug8SKHOcM1JZQUAbZpRT5en4xcU=,tag:3kcDHWIs9ITzTKDiyyYhnQ==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBvZ0VFcGhPR0NrMGU4dStU\nZGpnMHZmbUF0R0NFNWQzNGVpZXhYQ24xNXk0CnJIYmJYMnBmeURLZytBcXNRNG5u\nZzk4cXdPdnJIU0JVam1NWFA3TkhuWFkKLS0tIDZYUEVGMUtCQWdSM3k4WEZhdUt3\naElkc3o5SXlFYTJLNUpGZ0ptNm96M2MKYKW5emktK2M+IYX0v/swCV1fgrQXQVlb\nmz11rN5fJWV5wvLcTtyU9imgZLB9MfRMyIYlHzD2HPbW+zr8Fe+bBQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBZVDVxY3JrWk1TY3ZsazNz\naVl4Vk1vRUdkRTdlaDU1TE15dC96ZHlxQ1ZBCmYvSmh1QlBNRnJyRy9kcDR0cXhY\neDdPUXZ6b2FkWnBXbzA4bzU1aFo3bEUKLS0tIHMrb05Oa3FrRzh5VHN1RWRmUU9W\ndGZUYTVVQkIzM3FRRHp6NXlEdEU0VTgK7ibTaEcvbVTQjcbgeylu2s5tmI5kAadM\nFGiOgJhDFuzbHxXIEQlsCBIaXe6LlGhBo41VZbMxme5py6nJFTBHKg==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1rka3368ltqc787xw99uu762lqfk7qxld9265u2t62fpxnp9xhufsc2q5rw"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-07-07T04:54:10Z",
|
||||
"mac": "ENC[AES256_GCM,data:gonhuGY61G3Gdtj7q23aTNYU95fjLMz2uVTsSX+Hw10LGUTEMM8LF/Phae9kr5BZKD8BYaIgH32As2+n0B9jZ4WV77A5hUe2NJze9d0A40P2MtMh9xFWWh7yEXXnx5dy1UDrthL2LBa7ebPspuaC0mFhRHdoJK3J2W1m41PGjZc=,iv:H4yNuE8i3UxVjAUIpnaFX6i8/DaO4uIlHrEY9VaSiRs=,tag:9lJtixSNv7tpox0V3ZoNnA==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
-1
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/admin
|
||||
@@ -1 +0,0 @@
|
||||
e119327977e183567f0b8e2e8937c9d04708e296beed57792a1b6935eacf69d9
|
||||
@@ -19,6 +19,12 @@
|
||||
description = "Public URL for accessing the instance";
|
||||
};
|
||||
|
||||
base_domain = lib.mkOption {
|
||||
type = with lib.types; str;
|
||||
default = "";
|
||||
description = "Defines the base domain to create the hostnames for MagicDNS in Headscale. `base_domain` must be a FQDN, without the trailing dot. The FQDN of the hosts will be `hostname.base_domain (e.g. myhost.tailnet.example.com)";
|
||||
};
|
||||
|
||||
advertise_routes = lib.mkOption {
|
||||
type = with lib.types; listOf str;
|
||||
default = [ ];
|
||||
@@ -26,57 +32,14 @@
|
||||
example = [ "192.168.1.0/24" ];
|
||||
};
|
||||
|
||||
dns = {
|
||||
base_domain = lib.mkOption {
|
||||
type = with lib.types; str;
|
||||
default = "";
|
||||
description = "Defines the base domain to create the hostnames for MagicDNS in Headscale. `base_domain` must be a FQDN, without the trailing dot. The FQDN of the hosts will be `hostname.base_domain (e.g. myhost.tailnet.example.com)";
|
||||
};
|
||||
|
||||
nameservers = lib.mkOption {
|
||||
type = with lib.types; listOf str;
|
||||
default = [
|
||||
"1.1.1.1"
|
||||
"8.8.8.8"
|
||||
];
|
||||
description = "List of nameservers to pass to Tailscale clients";
|
||||
example = [ "10.0.10.1" ];
|
||||
};
|
||||
|
||||
magic_dns = lib.mkOption {
|
||||
type = with lib.types; bool;
|
||||
default = true;
|
||||
description = "Whether to enable MagicDNS";
|
||||
};
|
||||
|
||||
extra_records = lib.mkOption {
|
||||
type =
|
||||
with lib.types;
|
||||
nullOr (
|
||||
listOf (submodule {
|
||||
options = {
|
||||
name = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "DNS record name.";
|
||||
example = "grafana.tailnet.example.com";
|
||||
};
|
||||
type = lib.mkOption {
|
||||
type = lib.types.enum [
|
||||
"A"
|
||||
"AAAA"
|
||||
];
|
||||
description = "DNS record type.";
|
||||
example = "A";
|
||||
};
|
||||
value = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "DNS record value (IP address).";
|
||||
example = "100.64.0.3";
|
||||
};
|
||||
};
|
||||
})
|
||||
);
|
||||
};
|
||||
nameservers = lib.mkOption {
|
||||
type = with lib.types; listOf str;
|
||||
default = [
|
||||
"1.1.1.1"
|
||||
"8.8.8.8"
|
||||
];
|
||||
description = "List of nameservers to pass to Tailscale clients";
|
||||
example = [ "10.0.10.1" ];
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -207,11 +170,9 @@
|
||||
settings.server_url = "https://${settings.public_url}";
|
||||
|
||||
settings.dns = {
|
||||
base_domain = settings.dns.base_domain;
|
||||
base_domain = settings.base_domain;
|
||||
override_local_dns = true;
|
||||
nameservers.global = settings.dns.nameservers;
|
||||
magic_dns = settings.dns.magic_dns;
|
||||
extra_records = settings.dns.extra_records;
|
||||
nameservers.global = settings.nameservers;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -66,6 +66,8 @@
|
||||
"AutofillAddressEnabled" = false;
|
||||
"AutofillCreditCardEnabled" = false;
|
||||
"TranslateEnabled" = false;
|
||||
"DnsOverHttpsMode" = "secure";
|
||||
"DnsOverHttpsTemplates" = "https://dns.adguard-dns.com/dns-query";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -79,46 +81,25 @@
|
||||
inputs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
dictionaries = pkgs.hunspell.withDicts (
|
||||
d: with d; [
|
||||
en-us-large
|
||||
th-th
|
||||
]
|
||||
);
|
||||
in
|
||||
{
|
||||
imports = [ inputs.plasma-manager.homeModules.plasma-manager ];
|
||||
|
||||
systemd.user.sessionVariables = {
|
||||
DICPATH = "${dictionaries}/share/hunspell";
|
||||
};
|
||||
|
||||
home = {
|
||||
homeDirectory = lib.mkForce "/home/${username}";
|
||||
stateVersion = osConfig.system.stateVersion;
|
||||
|
||||
packages = with pkgs; [
|
||||
libreoffice-qt6
|
||||
dictionaries
|
||||
|
||||
libreoffice-fresh
|
||||
element-desktop
|
||||
signal-desktop
|
||||
brave
|
||||
keepassxc
|
||||
vlc
|
||||
thunderbird
|
||||
wasabiwallet
|
||||
protonmail-desktop
|
||||
];
|
||||
};
|
||||
programs.chromium.package = pkgs.brave;
|
||||
|
||||
programs.firefox = {
|
||||
enable = true;
|
||||
# Keep the pre-26.05 profile location; moving it would orphan the existing profile.
|
||||
configPath = ".mozilla/firefox";
|
||||
};
|
||||
|
||||
programs.home-manager.enable = true;
|
||||
services.syncthing.tray.enable = osConfig.services.syncthing.enable;
|
||||
programs.plasma.enable = true;
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
homeDirectory = lib.mkForce "/home/${username}";
|
||||
stateVersion = osConfig.system.stateVersion;
|
||||
packages = with pkgs; [
|
||||
libreoffice-stable
|
||||
libreoffice-fresh
|
||||
element-desktop
|
||||
signal-desktop
|
||||
brave
|
||||
|
||||
@@ -42,27 +42,10 @@
|
||||
dbhost = lib.mkDefault "/run/postgresql";
|
||||
dbuser = lib.mkDefault "nextcloud";
|
||||
dbname = lib.mkDefault "nextcloud";
|
||||
adminuser = lib.mkDefault "admin";
|
||||
adminpassFile = lib.mkDefault config.clan.core.vars.generators.nextcloud.files.adminpassFile.path;
|
||||
};
|
||||
};
|
||||
|
||||
# nixpkgs installs Nextcloud with --disable-admin-user; create the
|
||||
# admin account ourselves once the instance is installed.
|
||||
systemd.services.nextcloud-admin-user = {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "nextcloud-setup.service" ];
|
||||
requires = [ "nextcloud-setup.service" ];
|
||||
before = [ "phpfpm-nextcloud.service" ];
|
||||
path = [ config.services.nextcloud.occ ];
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
User = "nextcloud";
|
||||
};
|
||||
script = ''
|
||||
if ! nextcloud-occ user:info admin >/dev/null 2>&1; then
|
||||
NC_PASS="$(<${config.clan.core.vars.generators.nextcloud.files.adminpassFile.path})" \
|
||||
nextcloud-occ user:add admin --password-from-env --group admin
|
||||
fi
|
||||
'';
|
||||
};
|
||||
|
||||
clan.core.state.nextcloud.folders = [
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
server.wait_for_unit("phpfpm-nextcloud.service")
|
||||
|
||||
# Admin account exists and is in the admin group
|
||||
server.succeed("nextcloud-occ user:info admin --output=json | grep -q '\"groups\":\\[\"admin\"\\]'")
|
||||
# Check that garage is running
|
||||
server.succeed("systemctl status phpfpm-nextcloud.service")
|
||||
'';
|
||||
}
|
||||
@@ -16,6 +16,18 @@
|
||||
...
|
||||
}:
|
||||
{
|
||||
nixpkgs.overlays = [
|
||||
(final: prev: {
|
||||
pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [
|
||||
(pyFinal: pyPrev: {
|
||||
psycopg = pyPrev.psycopg.overrideAttrs (old: {
|
||||
disabledTests = old.disabledTests ++ [ "test_stats_connect" ];
|
||||
});
|
||||
})
|
||||
];
|
||||
})
|
||||
];
|
||||
|
||||
services.paperless = {
|
||||
enable = lib.mkDefault true;
|
||||
};
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
boot.supportedFilesystems = {
|
||||
ntfs = true;
|
||||
};
|
||||
}
|
||||
@@ -5,4 +5,5 @@
|
||||
|
||||
services.displayManager.sddm.enable = lib.mkForce false;
|
||||
services.displayManager.gdm.enable = true;
|
||||
services.displayManager.gdm.wayland = true;
|
||||
}
|
||||
@@ -24,36 +24,6 @@
|
||||
description = "";
|
||||
default = "";
|
||||
};
|
||||
options.extraClientNumbers = lib.mkOption {
|
||||
type = with lib.types; listOf str;
|
||||
description = "List of client suffix number.";
|
||||
default = [ ];
|
||||
};
|
||||
|
||||
options.extraFixedIPClient = lib.mkOption {
|
||||
type = lib.types.attrsOf (
|
||||
lib.types.submodule {
|
||||
options = {
|
||||
ip = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "IP address for this client";
|
||||
};
|
||||
|
||||
name = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Name of the client";
|
||||
};
|
||||
};
|
||||
}
|
||||
);
|
||||
description = "Extra client to be added to pjsip config as a fixed IP auth";
|
||||
example = {
|
||||
"01" = {
|
||||
ip = "192.168.1.3";
|
||||
name = "bob";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
perInstance =
|
||||
{
|
||||
@@ -156,41 +126,6 @@
|
||||
remove_existing=yes
|
||||
'';
|
||||
|
||||
genLocalSIPEndpointV6 =
|
||||
{ localNumber }:
|
||||
''
|
||||
[${localNumber}](internal_endpoint)
|
||||
transport=transport-udp6
|
||||
aors=${localNumber}
|
||||
auth=${localNumber}
|
||||
|
||||
[${localNumber}](userpass_auth)
|
||||
username=${localNumber}
|
||||
password=${localNumber}
|
||||
|
||||
[${localNumber}](dynamiic_aor)
|
||||
max_contacts=1
|
||||
'';
|
||||
|
||||
genLocalSIPIPEndpoint = number: ''
|
||||
|
||||
[${number}](internal_endpoint)
|
||||
aors=${number}
|
||||
auth=${number}
|
||||
contact_deny=0.0.0.0/0
|
||||
contact_deny=::/0
|
||||
contact_permit=${settings.extraFixedIPClient.${number}.ip}/128
|
||||
|
||||
[${number}](dynamiic_aor)
|
||||
max_contacts=1
|
||||
remove_existing=yes
|
||||
|
||||
[${number}](userpass_auth)
|
||||
username=${number}
|
||||
password=${number}
|
||||
|
||||
'';
|
||||
|
||||
genLocalExtenConf =
|
||||
{ localNumber }:
|
||||
''
|
||||
@@ -224,7 +159,7 @@
|
||||
throw "clanService/yggdrasil is required";
|
||||
in
|
||||
{
|
||||
clan.core.vars.generators.phonebox = {
|
||||
clan.core.vars.generators.phonebox = builtins.break {
|
||||
files = {
|
||||
server-prefix-number.secret = false;
|
||||
ata-local-number.secret = false;
|
||||
@@ -256,13 +191,6 @@
|
||||
'';
|
||||
};
|
||||
|
||||
# Phonebox nodes are headless and unattended. Observed on mirach/almach
|
||||
# (2026-07..09): hard hangs leave no journal/pstore trace and stay down
|
||||
# until someone power-cycles the board. Arm the hardware watchdog so a
|
||||
# hung kernel/PID1 resets itself, and reboot instead of halting on panic.
|
||||
systemd.settings.Manager.RuntimeWatchdogSec = "30s";
|
||||
boot.kernel.sysctl."kernel.panic" = 10;
|
||||
|
||||
networking.interfaces = {
|
||||
${ata-interface} = {
|
||||
useDHCP = false;
|
||||
@@ -287,7 +215,7 @@
|
||||
dhcp-range = [
|
||||
"192.168.254.100,192.168.254.100,255.255.255.0,3m"
|
||||
];
|
||||
leasefile-ro = true;
|
||||
dhcp-leasefile = "/dev/null";
|
||||
dhcp-option = [
|
||||
"3,192.168.254.1"
|
||||
];
|
||||
@@ -330,7 +258,6 @@
|
||||
in
|
||||
{
|
||||
"${matchAll}".allowedTCPPorts = [ 80 ];
|
||||
"ygg".allowedTCPPorts = [ 80 ];
|
||||
};
|
||||
|
||||
services.asterisk = {
|
||||
@@ -404,7 +331,7 @@
|
||||
in
|
||||
''
|
||||
[from-internal]
|
||||
exten => 99,1,Answer()
|
||||
exten => 999,1,Answer()
|
||||
same => n,Playback(hello-world)
|
||||
same => n,Hangup()
|
||||
|
||||
@@ -429,14 +356,6 @@
|
||||
+ (genLocalExtenConf {
|
||||
localNumber = config.clan.core.vars.generators.phonebox.files.ata-local-number.value;
|
||||
})
|
||||
+ lib.concatStringsSep "\n" (
|
||||
builtins.map (number: genLocalExtenConf { localNumber = number; }) settings.extraClientNumbers
|
||||
)
|
||||
+ lib.concatStringsSep "\n" (
|
||||
lib.mapAttrsToList (
|
||||
number: _: genLocalExtenConf { localNumber = number; }
|
||||
) settings.extraFixedIPClient
|
||||
)
|
||||
+ serverConf;
|
||||
|
||||
"rtp.conf" = ''
|
||||
@@ -490,12 +409,6 @@
|
||||
+ (genLocalSIPEndpoint {
|
||||
localNumber = config.clan.core.vars.generators.phonebox.files.ata-local-number.value;
|
||||
})
|
||||
+ lib.concatStringsSep "\n" (
|
||||
builtins.map (number: genLocalSIPEndpointV6 { localNumber = number; }) settings.extraClientNumbers
|
||||
)
|
||||
+ lib.concatStringsSep "\n" (
|
||||
lib.mapAttrsToList (number: _: genLocalSIPIPEndpoint number) settings.extraFixedIPClient
|
||||
)
|
||||
+ serverConf;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
# Prometheus
|
||||
|
||||
Monitoring over the Yggdrasil network. Requires the `yggdrasil` clan service on every machine in the instance.
|
||||
|
||||
Roles:
|
||||
|
||||
- `server`: runs Prometheus and Alertmanager, scraping every `nodes` machine by its Yggdrasil address. Optional `matrix-alertmanager` forwards alerts to Matrix rooms; the bot token and webhook secret are generated as clan vars.
|
||||
- `nodes`: enables the `services.prometheus.exporters` listed in `exporters` (with `openFirewall`) so the server can harvest them.
|
||||
@@ -1,323 +0,0 @@
|
||||
{ clanLib, ... }:
|
||||
{
|
||||
_class = "clan.service";
|
||||
manifest.name = "prometheus";
|
||||
manifest.description = "The Prometheus monitoring system and time series database.";
|
||||
manifest.readme = builtins.readFile ./README.md;
|
||||
manifest.categories = [ "System" ];
|
||||
|
||||
roles.server = {
|
||||
description = "Prometheus server that scraps all data from nodes";
|
||||
|
||||
interface =
|
||||
{ lib, ... }:
|
||||
{
|
||||
options = {
|
||||
scrape_interval = lib.mkOption {
|
||||
type = with lib.types; nullOr str;
|
||||
default = "1m";
|
||||
description = "How often to scrape targets. Default is 1 minutes";
|
||||
};
|
||||
extra_rules = lib.mkOption {
|
||||
type = with lib.types; listOf attrs;
|
||||
default = [ ];
|
||||
description = "Additional rules for Prometheus";
|
||||
};
|
||||
default_receiver = lib.mkOption {
|
||||
type = with lib.types; attrs;
|
||||
default = {
|
||||
name = "default";
|
||||
};
|
||||
description = "Definition of a default receiver, default is doing nothing";
|
||||
};
|
||||
matrix-alertmanager = {
|
||||
enable = lib.mkOption {
|
||||
type = with lib.types; bool;
|
||||
default = false;
|
||||
description = "Whether to enable `services.matrix-alertmanager`";
|
||||
};
|
||||
homeserverUrl = lib.mkOption {
|
||||
type = with lib.types; str;
|
||||
default = "https://matrix-client.matrix.org";
|
||||
description = "URL of the Matrix homeserver to use";
|
||||
};
|
||||
matrixUser = lib.mkOption {
|
||||
type = with lib.types; str;
|
||||
description = "Matrix user for the bot";
|
||||
};
|
||||
matrixRooms = lib.mkOption {
|
||||
type = lib.types.listOf (
|
||||
lib.types.submodule {
|
||||
options = {
|
||||
receivers = lib.mkOption {
|
||||
type = lib.types.listOf lib.types.str;
|
||||
description = "List of receivers for this room";
|
||||
};
|
||||
roomId = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Matrix room ID";
|
||||
apply =
|
||||
x:
|
||||
assert lib.assertMsg (lib.hasPrefix "!" x) "Matrix room ID must start with a '!'. Got: ${x}";
|
||||
x;
|
||||
};
|
||||
};
|
||||
}
|
||||
);
|
||||
description = ''
|
||||
Combination of Alertmanager receiver(s) and rooms for the bot to join.
|
||||
Each Alertmanager receiver can be mapped to post to a matrix room.
|
||||
|
||||
Note, you must use a room ID and not a room alias/name. Room IDs start
|
||||
with a "!".
|
||||
'';
|
||||
example = [
|
||||
{
|
||||
receivers = [
|
||||
"receiver1"
|
||||
"receiver2"
|
||||
];
|
||||
roomId = "!roomid@example.com";
|
||||
}
|
||||
{
|
||||
receivers = [ "receiver3" ];
|
||||
roomId = "!differentroomid@example.com";
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
perInstance =
|
||||
{
|
||||
settings,
|
||||
roles,
|
||||
...
|
||||
}:
|
||||
{
|
||||
nixosModule =
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
getYggdrasilIP =
|
||||
machineName:
|
||||
if config.clan.core.vars.generators.yggdrasil.files.address ? value then
|
||||
clanLib.getPublicValue {
|
||||
flake = config.clan.core.settings.directory;
|
||||
machine = machineName;
|
||||
generator = "yggdrasil";
|
||||
file = "address";
|
||||
default = null;
|
||||
}
|
||||
else
|
||||
throw "clanService/yggdrasil is required";
|
||||
|
||||
matrixRoomReceivers = lib.unique (
|
||||
lib.concatMap (entry: entry.receivers) settings.matrix-alertmanager.matrixRooms
|
||||
);
|
||||
in
|
||||
lib.mkMerge [
|
||||
{
|
||||
networking.firewall.allowedTCPPorts = [
|
||||
9090
|
||||
];
|
||||
services.prometheus = {
|
||||
enable = true;
|
||||
|
||||
globalConfig = {
|
||||
scrape_interval = settings.scrape_interval;
|
||||
};
|
||||
|
||||
alertmanagers = [
|
||||
{
|
||||
scheme = "http";
|
||||
path_prefix = "/";
|
||||
static_configs = [ { targets = [ "localhost:9093" ]; } ];
|
||||
}
|
||||
];
|
||||
|
||||
alertmanager = {
|
||||
enable = true;
|
||||
configuration = {
|
||||
global = {
|
||||
resolve_timeout = "5m";
|
||||
};
|
||||
route = {
|
||||
receiver = "default";
|
||||
routes = map (mReceiver: { receiver = mReceiver; }) matrixRoomReceivers;
|
||||
};
|
||||
receivers = [
|
||||
{ name = "default"; }
|
||||
]
|
||||
++ map (mReceiver: {
|
||||
name = mReceiver;
|
||||
webhook_configs = [
|
||||
{
|
||||
url_file = config.clan.core.vars.generators.prometheus.files.matrix-alertmanager-urlfile.path;
|
||||
send_resolved = true;
|
||||
}
|
||||
];
|
||||
}) matrixRoomReceivers;
|
||||
};
|
||||
};
|
||||
|
||||
scrapeConfigs = lib.mapAttrsToList (machineName: machineVal: {
|
||||
tls_config.insecure_skip_verify = true;
|
||||
job_name = "${machineName}";
|
||||
static_configs = lib.mapAttrsToList (
|
||||
exporterName: exporterVal:
|
||||
let
|
||||
targetPort =
|
||||
if exporterVal ? port then
|
||||
exporterVal.port
|
||||
else
|
||||
config.services.prometheus.exporters."${exporterName}".port;
|
||||
targetHost = getYggdrasilIP machineName;
|
||||
in
|
||||
{
|
||||
targets = [ "[${targetHost}]:${lib.toString targetPort}" ];
|
||||
}
|
||||
) machineVal.settings.exporters;
|
||||
}) roles.nodes.machines;
|
||||
|
||||
rules = [
|
||||
(builtins.toJSON {
|
||||
groups = [
|
||||
{
|
||||
name = "default";
|
||||
rules = [
|
||||
{
|
||||
alert = "NodesDown";
|
||||
expr = "count by (job) (up == 0) > 0";
|
||||
for = "1m";
|
||||
labels = {
|
||||
severity = "critical";
|
||||
};
|
||||
annotations.summary = "Node **{{ $labels.job }}** has been down for more than 1 minutes.";
|
||||
}
|
||||
{
|
||||
alert = "SmartCtlErrors";
|
||||
expr = "smartctl_device_error_log_count > 0";
|
||||
for = "5m";
|
||||
labels = {
|
||||
severity = "critical";
|
||||
};
|
||||
annotations.summary = ''
|
||||
Errors occur on **{{ $labels.job }}**
|
||||
Disk {{ $labels.device }} {{ $value }}
|
||||
'';
|
||||
}
|
||||
{
|
||||
alert = "ZFSPoolsHealth";
|
||||
expr = "zfs_pool_health > 0";
|
||||
for = "5m";
|
||||
labels = {
|
||||
severity = "critical";
|
||||
};
|
||||
annotations.summary = ''
|
||||
Unhealthy Pool at **{{ $labels.job }}**
|
||||
Pool {{ $labels.pool }} value {{ $value }}
|
||||
'';
|
||||
}
|
||||
]
|
||||
++ settings.extra_rules;
|
||||
}
|
||||
];
|
||||
})
|
||||
];
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
(lib.optionalAttrs settings.matrix-alertmanager.enable {
|
||||
|
||||
clan.core.vars.generators.prometheus = {
|
||||
files.matrix-alertmanager-token.secret = true;
|
||||
files.matrix-alertmanager-secret.secret = true;
|
||||
files.matrix-alertmanager-urlfile = {
|
||||
secret = true;
|
||||
owner = "alertmanager";
|
||||
group = "alertmanager";
|
||||
};
|
||||
script = ''
|
||||
echo "" > $out/matrix-alertmanager-token
|
||||
openssl rand -hex 32 > "$out"/matrix-alertmanager-secret
|
||||
|
||||
echo "http://localhost:3000/alerts?secret=$(cat $out/matrix-alertmanager-secret)" > $out/matrix-alertmanager-urlfile
|
||||
'';
|
||||
runtimeInputs = [
|
||||
pkgs.openssl
|
||||
];
|
||||
};
|
||||
|
||||
# nixpkgs runs alertmanager with DynamicUser; that user only exists
|
||||
# while the service runs, so sops-install-secrets cannot resolve the
|
||||
# owner of matrix-alertmanager-urlfile at boot and rejects the whole
|
||||
# manifest (no secrets installed). Use a static user instead.
|
||||
users.users.alertmanager = {
|
||||
isSystemUser = true;
|
||||
group = "alertmanager";
|
||||
};
|
||||
users.groups.alertmanager = { };
|
||||
systemd.services.alertmanager.serviceConfig = {
|
||||
DynamicUser = lib.mkForce false;
|
||||
User = "alertmanager";
|
||||
Group = "alertmanager";
|
||||
};
|
||||
|
||||
services.matrix-alertmanager = lib.mkIf settings.matrix-alertmanager.enable {
|
||||
enable = true;
|
||||
tokenFile = config.clan.core.vars.generators.prometheus.files.matrix-alertmanager-token.path;
|
||||
secretFile = config.clan.core.vars.generators.prometheus.files.matrix-alertmanager-secret.path;
|
||||
homeserverUrl = settings.matrix-alertmanager.homeserverUrl;
|
||||
matrixUser = settings.matrix-alertmanager.matrixUser;
|
||||
matrixRooms = settings.matrix-alertmanager.matrixRooms;
|
||||
};
|
||||
})
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
roles.nodes = {
|
||||
description = "A node will expose metrics for server to harvest";
|
||||
|
||||
interface =
|
||||
{ lib, ... }:
|
||||
{
|
||||
options = {
|
||||
exporters = lib.mkOption {
|
||||
type = lib.types.attrsOf (lib.types.submodule { });
|
||||
default = { };
|
||||
description = "Mirror of services.prometheus.exporters";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
perInstance =
|
||||
{ settings, ... }:
|
||||
let
|
||||
enabledExporters = builtins.mapAttrs (
|
||||
name: value:
|
||||
value
|
||||
// {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
}
|
||||
) settings.exporters;
|
||||
in
|
||||
{
|
||||
nixosModule =
|
||||
{ ... }:
|
||||
{
|
||||
services.prometheus.exporters = enabledExporters;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{ self, inputs, ... }:
|
||||
let
|
||||
module = ./default.nix;
|
||||
in
|
||||
{
|
||||
clan.modules = {
|
||||
prometheus = module;
|
||||
};
|
||||
perSystem =
|
||||
{ ... }:
|
||||
{
|
||||
clan.nixosTests.service-prometheus = {
|
||||
imports = [ ./tests/vm/default.nix ];
|
||||
_module.args = { inherit self inputs; };
|
||||
|
||||
clan.modules."@clan/prometheus" = module;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,101 +0,0 @@
|
||||
{
|
||||
self,
|
||||
hostPkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
{
|
||||
name = "service-prometheus";
|
||||
result.update-vars =
|
||||
let
|
||||
relativeDir = lib.removePrefix "${self}/" (toString config.clan.directory);
|
||||
in
|
||||
hostPkgs.writeShellScriptBin "update-vars" ''
|
||||
set -x
|
||||
export PRJ_ROOT=$(git rev-parse --show-toplevel)
|
||||
${
|
||||
self.inputs.clan-core.packages.${hostPkgs.system}.clan-cli
|
||||
}/bin/clan-generate-test-vars $PRJ_ROOT/${relativeDir} ${config.name}
|
||||
'';
|
||||
|
||||
clan = {
|
||||
test.useContainers = false;
|
||||
directory = ./.;
|
||||
inventory = {
|
||||
machines.server = { };
|
||||
machines.nodeA = { };
|
||||
|
||||
instances = {
|
||||
yggdrasil = {
|
||||
module.name = "yggdrasil";
|
||||
roles.default.machines.server = { };
|
||||
roles.default.machines.nodeA = { };
|
||||
};
|
||||
|
||||
prometheus = {
|
||||
module.name = "@clan/prometheus";
|
||||
module.input = "self";
|
||||
roles.nodes.machines."nodeA".settings = {
|
||||
exporters.smartctl = { };
|
||||
};
|
||||
roles.server.machines."server".settings = {
|
||||
extra_rules = [
|
||||
{
|
||||
alert = "test";
|
||||
expr = "zfs_pool_health > 0";
|
||||
for = "5m";
|
||||
labels = {
|
||||
severity = "critical";
|
||||
};
|
||||
annotations.summary = ''
|
||||
Unhealthy Pool at {{ $labels.job }}
|
||||
Pool {{ $labels.pool }} value {{ $value }}
|
||||
'';
|
||||
}
|
||||
];
|
||||
|
||||
matrix-alertmanager = {
|
||||
enable = true;
|
||||
matrixUser = "test@matrixtest.org";
|
||||
matrixRooms = [
|
||||
{
|
||||
roomId = "!testroom";
|
||||
receivers = [ "matrix" ];
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
nodes = {
|
||||
server = { };
|
||||
nodeA = { };
|
||||
};
|
||||
|
||||
testScript =
|
||||
{ nodes, ... }:
|
||||
''
|
||||
start_all()
|
||||
|
||||
server.wait_for_unit("prometheus.service")
|
||||
|
||||
nodeA.wait_for_unit("prometheus-smartctl-exporter.service")
|
||||
nodeA.wait_for_open_port(9633)
|
||||
|
||||
nodeA.succeed("systemctl status prometheus-smartctl-exporter.service")
|
||||
nodeA.succeed("curl http://localhost:9633/metrics")
|
||||
|
||||
|
||||
server_ip = server.succeed("ip -4 addr show eth1 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'").strip()
|
||||
nodeA_ip = nodeA.succeed("ip -4 addr show eth1 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'").strip()
|
||||
|
||||
server.succeed(f"ping -c 3 {nodeA_ip}")
|
||||
server.succeed(f"curl -v http://{nodeA_ip}:9633/metrics")
|
||||
|
||||
'';
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
[
|
||||
{
|
||||
"publickey": "age1kxsp8pa8am6k333nxs4akjqkhht8gspznmlqz4pxn35h5dj4uv5qj6q6fl",
|
||||
"type": "age"
|
||||
}
|
||||
]
|
||||
@@ -1,6 +0,0 @@
|
||||
[
|
||||
{
|
||||
"publickey": "age1dkrf438z3337d2qnc7ugkggua99xkh55wuf9zgun35fjrxdpnf5qkg4z6j",
|
||||
"type": "age"
|
||||
}
|
||||
]
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:Z8I3ecNV2N2jed1sPBU+tI5r5qB2nVTO7aNyMxvp0ztujn8kXjw+thSvLGtRygL2V9rSmPJalHQf1IYUriXgCmYtfg5InPDCAqk=,iv:O4rSyg2G6PJWHURZ/BTBKmn1AVekbNBdg5137sOPL/U=,tag:4/CLfO50laZ8ljWkr6o4qA==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTSWxnekYvREdZMTBMVlRq\nRmtCemFYZDhLYU93azc5czdoTVUydFFUL1JzCmo4ZHlrNi8yeW15N2JxTytWeCtk\nbjRwWUVlazUwTlMwc1RZVU8xYlVlckEKLS0tIFVPeU5KMVFwdExFT0wzeXZka2Jo\nSmxEM2RPTWdoZXJxK0dpemUzVkNzdGcKfXdiSeAcNwEZi7kh9c89ss5K+dYG0lhq\nFsf2I0A1csxqqnYJqXPmwlVGMzuWDrWRU0uc+hQLndP3TbadVux64w==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-06-11T07:43:55Z",
|
||||
"mac": "ENC[AES256_GCM,data:OCPR2tkbN72MdaczO47UNCJBb1KjABHQH9q7dtVEwoAhKg4QWFtsDaMwBTVE9qe48nlaWQbxT1mM7uztm6RXLkc5y2c3danPUYFj/FK/ffqpaxv3oReyxWqMoGayT23kFbB0TWEx1K8Jp3gOkwCPg+ZRClvhV1dXrfnwIwZHrBY=,iv:3puPIWFIxRF1KtrmyG54LqCc7Zg4/AOMD65QjYdN970=,tag:RoIVltMKw7WUvgW6sNk6mA==,type:str]",
|
||||
"version": "3.13.0"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../users/admin
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:Nuq6ege3HJOxpRgA6fnxdD2Wj+KCw+3PaJCxmZirJl3mkRVLnZgUUhr+gOVEup9Ifjl1ZnP+PqV7b9pPR/WQg0LARYtxIC1QGJ8=,iv:v9p9lsefP5V9McAJCzS7v9sl8XHr9/hAL41XwFbwMOA=,tag:ETK+CFFJAAzGTpowQNAZMQ==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArN0NEWFZoZWlyeUtZc3hi\ndnVNcHl4eVVHckRLeFhPYUt4a3BwMElFMVZZCklkU1NEWVVmSGw1NmJmWWkrVHFH\nVTN5U0x3NXdiQUJCc095TElzMWZCMXMKLS0tIHRXQkJNREFYUFFvMXM1Sk53VW5z\naTRjMXozZXZiNU8zSkF5d2hhdklBY1EKWwsPi6YiHKFfAyqWH2u75hw47gzcQOz/\n95Im0FgadhqGDCeZhTDfEAc4b1VWQULInsjeRapzf5OJOwekbz6guA==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-06-11T07:45:26Z",
|
||||
"mac": "ENC[AES256_GCM,data:mTKFSBFnUzu3rldQCHPZHoyzDdwPzBWPIAhemC1XyG5PiQ/OczStjYaLzZQGCpPvOjBb5Ntqrc+dnaOedZgKlOdaPjZs1U2ZDWadoeWQ2TAKWYA6+kN7PXomsxtHhntiaujMy3502eh06VyiutpVuCdzK2cfEwuno8nyIcHgtXk=,iv:/5DRvFVDQA+yd8m/+Cyxb+aIsfwoaFcV6KRQ/7ISHnU=,tag:z31P6CL0NNRlQThqwapVNA==,type:str]",
|
||||
"version": "3.13.0"
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../users/admin
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"publickey": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
|
||||
"type": "age"
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
26.05
|
||||
@@ -1 +0,0 @@
|
||||
204:b10b:6057:4bbe:2b44:fc58:c6fd:90ad
|
||||
-1
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/nodeA
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:JkuciSmL5nmSjcYn22W7iHKzuRxWMJ5dixYllm0aSM7DsyAp9mQzIYJJmalepp7sEhSJ5As3vQW6ZpOQ3G8ZheG06++1GlM8lvVV2FKmYvKHQpI+V7WyUJl7dpfu+5A6BzWES0GbC1g8l/a8sb/+jjEoqUTAj/4=,iv:tehdHsdm2uSRAAzImHhwBSnSBF6lzjLzF9HIPnoi9s0=,tag:dWnQhAiJeCkcssjko+dUpw==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOVmRSR2xDNmdPYW5MNUVH\nYWVpaTc0TjdOZFBTSEJDL1Z3VG9vVHkrZUFjCklUMUU1bnVmZFJYbzVPd09oZm1U\nNHY0R1hNQnBBc2V4Y2RWQ1ZZRjdOK0kKLS0tIEJkSWFaTDJzMDNJR3QwQzRVdld4\ndDA5ZmZSeTYyVUE5Y1Z1T1l5QmpHRTQKSaN+MIazA8RXhRSyFSkDTyXEp43COpbf\nXOzAhTXja+ut/akUuKadDS4xycZ+ZXAreVmdsF4SWvwZkmPeew+hKQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1kxsp8pa8am6k333nxs4akjqkhht8gspznmlqz4pxn35h5dj4uv5qj6q6fl"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBMNmZkTHlaRWl1V3UvcGxk\nR0hhL1lNekNzb0REaEc4bitBZkcwYmRDb2hjCnloQTZUL3ZneWZQZk9NTEc1bGNB\nY3ljdFRMMUhLeDdyblhVY3lSOFBXc1UKLS0tIEJUc1ZpQmtuNlRUUEVmajY5TGdP\ncSs2RkZXcnJYRlEvcEtYSWxIWmkrVEkKgQnfxuZuxl1OpZDUPVuqseSN89WnBGFw\nx2PI3cqN67R2tV/FEjOZo+GFgxW93SYdMvxzg2aG2q/7xOQxfj9sjg==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-06-11T07:44:25Z",
|
||||
"mac": "ENC[AES256_GCM,data:gRk1t7xFxXSTUcZQw0DCH3QtRnQJF4Mc4kZeeckhuQdc/VATj+cq+ugicrcGJWbbXzAscQLG6g72+Qiane5nFfzmjNoO6JMe181wm7pY/5St+2MjXZEzwAaYjn6ZAm+U7aiUVcp8RBjFIL9HCvBF8qFl7rqqTvYHnTOU0V6TIIo=,iv:eUvZFDKl8PX5QaQPmwJXaokawQMNP0TGOklTAMgB/sg=,tag:3cHICox8bKWkPKMUgvLuXA==,type:str]",
|
||||
"version": "3.13.0"
|
||||
}
|
||||
}
|
||||
-1
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/admin
|
||||
@@ -1 +0,0 @@
|
||||
0a77a4fd45a20ea5d81d39c8137a97dd4988c692ce4263959559b8c3f966c1de
|
||||
-1
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/server
|
||||
-18
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:VszBHfdaNOOYYa6tNUPq9CsJHp+KMBTnZOdHnJz6v3pZQl1zCeYdW3ExvDfNY85tUAZ3YAHthD9JhuR1D+VVVn8=,iv:zbMmaTDZ5mL9IzRTEzuTSPkfwrwOlOIFJtLQyTzGkPw=,tag:Ez68y6gMIj0e/RYQ/Z+s8Q==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBlenlYOCt2RkJOK1hDdUti\ncUpxS1F1RTBnZGo1Njg0Y0EwbzM1dWM5b1hJClFKQ1NDRVVpRXRpOGx3SU52MDZZ\nVVh2NDg5TDgzckFKZ0lNaG1tTEk0MmsKLS0tIHRvR0IzWFZUVkJEM0dwRFZ2SFRz\nNHpCYkI4dUx6YXJSd0xreUN1aUtKNEUK/SJqs5pbFipbp9P7ASUMby7H5ProXknF\nGMvHcIxa6OLLOCRA39YZBVEUlRd03j3rVFILZqVq47CwfaeHj0WBdw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1dkrf438z3337d2qnc7ugkggua99xkh55wuf9zgun35fjrxdpnf5qkg4z6j"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA4cWMzaElhYmZaRGhmMXJQ\nbWk2WVl0UmtidjdzYXM0enB3MGdTMWRMVDBjCmdiNEx2RURGL0ZtWCtkcHlabUs0\nVis2d3JieC8yOXV5OW9sN1l5ZWs5Sk0KLS0tIFNmaVpDQklaUDFQK1JnZWZzMDF6\nY0g1M2NHNTEvSkRsTVJSODcxcVVrV0EK8FLzflXqPcooAPh38L7oVliUY8WbB97W\naQYvGf/yo9Izmm8Pa0/ZUGSRnCVRAXtQ1IeR1uPNyuy47mHXO7n7Bw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-06-22T07:46:31Z",
|
||||
"mac": "ENC[AES256_GCM,data:ewR8kGgrAj7i6b5UUwh4Fn4CbtRcsDSHhHzrBwGBi9S0XWaatVTQAAmsAVm7DEiJ+a3SQLIAyx6Ef7uqCsZagmzs7LBq0YXNxWtxv62EWPwx8Vihzz3gscDJo1DM3ictX7yi6EiipQ0aYoPCh1veqw8AspLdwnkBxdUF2C+0muc=,iv:bo7vq8BfL437ZI63Os96pAg8EKi8NnrqhABz4Jft9YI=,tag:8krOKra/Z3MJdlmZFBZ7YQ==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
-1
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/admin
|
||||
-1
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/server
|
||||
-18
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:Mw==,iv:ylmBzsJVBD2pcQNkLcdthT9FX7YW84yZk0u7SlJUdaY=,tag:O1oT/MVijlrQDQG1ddFKlg==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRd2ZIMElrK2ZacXFTTHFl\nWDkwbGROS1d3WlhzcHhQK21Fc1pmWFZ1VkJRCjlrY1E0cndsZUR1dVQ2L0dud3RQ\nbDlNa3NQZjBPQTAxdUVkUk9lYkgyTGcKLS0tIEUyMVE5Y25BOFJyUWdkdWI1L3VQ\nSE5ubkMvWU9YbE94VTN2VXFUc2F0ajQKKz5VJEtEQcKggoO89ZSfpB3KLBHCnMf+\no8llbCm5bZ39S3qA2Q8spOK4AlkW/NiaCQE4G1LSkvvT6tYEMkwbyQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1dkrf438z3337d2qnc7ugkggua99xkh55wuf9zgun35fjrxdpnf5qkg4z6j"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBnNHhVMWNhZGR6LzgrcG05\nMmVUYU1zcC93YklZUkVETFhZL1BISU13MEFNCjFSZ25EQUQrZTNIcmliTG5UV2xp\nKzQ3MzhkdzcxeGgyV3oxbXo5Y0ZMcmMKLS0tIDVMZjdYWjRkUE50dmE5dm42alpn\nbk1JN1poZWp2bEZNQ3VIdm9PS3Z1ZlEKYOTa7L9tVKq3gZbAeKmCifIxs/sqaPoj\nqdUlsPkwBPjSvlv1QLdRbjBICPdyfH+GiHCmj78DitzZ+KUnRKYqSQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-06-22T07:46:31Z",
|
||||
"mac": "ENC[AES256_GCM,data:NqKlCAKKPF0OTesGozt0GSSd/HT8+h4meiO57EBzD7vwLc9mobG0rLn5C2i3e7tBM13VYzR66qPzQtaWI/jVA7BpJ0PNa2u9MHA2JV6nshRdhMtYgxVCBy8Had7IixAZEs1lLE2zHcWRvLMJPOvUp7tpghb34RddmF/Po/Mkm2s=,iv:9XCsu+rO/DbtaLt13O0/PUo/yV2eUjNP+GGmkYjOIfY=,tag:7tzJE5XBR5PfOqdIh7IKAQ==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
-1
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/admin
|
||||
-1
@@ -1 +0,0 @@
|
||||
../../../../../../sops/machines/server
|
||||
-18
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"data": "ENC[AES256_GCM,data:LetAgJg1TgcJL+W7dX8k8MlvpS3PPwVGdco3Z6a8fGhGeQARcuHWV57K4lLQzPpJ7Cruxc6XGQn1U/t3cubdp2NPtwQsP9jaIqPnlZblrq6foHaUmBLaRzc4ed7HOo94ErfV5ZY=,iv:jdt3jMNlK3QvJP8i3OlGydkRPRd2rVybnmUxCDCxfz4=,tag:imNVcalMwnpuaLCdaoaegg==,type:str]",
|
||||
"sops": {
|
||||
"age": [
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA4WU9IT3g4TVpiSWdYMUFo\nZGpSUG5xekZLaGMzNTZlcHFaSm1kbTBxUHhjClRIMzlhWW9ub2JFZHhVY3I3TkF3\nU0t5eHJVeFVHRStoNTFkT0lpYnNoMFkKLS0tIEM3aWdIL2RrSGx0ZkdheVRtYUhm\nUHZxeGZvUlBybWJFTHIrZDNxZVloemMKvpt+hkFaRUEXNp1dcfnIWD1i6fyVkaZm\neTn6RBxl1idVN1XlXAwrHHTekuZIobST5kGTV0uR3nLk5Cmhe2x93g==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1dkrf438z3337d2qnc7ugkggua99xkh55wuf9zgun35fjrxdpnf5qkg4z6j"
|
||||
},
|
||||
{
|
||||
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBjTDlTM0JBaEowaXJOV1hE\nZWZ2UmUzQmlyek5NRWlqWDZiY0FXVHpKL1d3CitreGc3OUFzS0tYYm5UZ0tUb2pX\nb0pZZ3VacVBma09pSDEyalc0VU1HTVUKLS0tIE5YcnY2RnFCVk13dDZJQ3NMZDQ4\nTGgrY3FwMW5ybjM0a0FmNllrRWZYNWMK2BklSFSm1jT1SsdaMtFWZX4uu4JT2kGi\njyD9E/G0yGl5JH8xfKO/x7vIPuow96WW8bx9aqGRnshXqbe6WzvbIQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||
}
|
||||
],
|
||||
"lastmodified": "2026-06-22T07:46:31Z",
|
||||
"mac": "ENC[AES256_GCM,data:bO9VvnIcjXDSyTdEHm1l5Dqm4umLC7FCEaJIbuC+M776q+GR3crq1FWm7J6tinlHDNFX/WmcS417b5WY5VJlP3jqvCalQdttg0EzlhwT65vATvJHoYEp8uqahyLzA9tj9ncQ9LL2XGFeIsvWnU9OcZ5s/42v2DtVdS1/32PT+7U=,iv:W29qp/zHP367rkwiMmpPQcKS/5g6HR5CZGkGCIacwD4=,tag:3DHc5kdj1Ar+7TcaSOnj+Q==,type:str]",
|
||||
"version": "3.13.1"
|
||||
}
|
||||
}
|
||||
-1
@@ -1 +0,0 @@
|
||||
../../../../../../sops/users/admin
|
||||
@@ -1 +0,0 @@
|
||||
26.05
|
||||
@@ -1 +0,0 @@
|
||||
202:8a70:e215:f822:c67a:f191:b04a:a8f
|
||||
Loaded 100 of 1118 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user