Compare commits
169
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1d9921f1ae | ||
|
|
7388715d30 | ||
|
|
b3304c0ef5 | ||
|
|
e955ea82f3 | ||
|
|
067c00330b | ||
|
|
60e2450c66 | ||
|
|
3185a5a375 | ||
|
|
348a1d7301 | ||
|
|
33eda7d2cb | ||
|
|
34ca5aec6b | ||
|
|
d2f7b85283 | ||
|
|
d12ef9faec | ||
|
|
3e60f73251 | ||
|
|
bc986f0e51 | ||
|
|
214f6a4d2a | ||
|
|
41d02d19ea | ||
|
|
4f79033b04 | ||
|
|
9b99b2dd8c | ||
|
|
a145f6ca43 | ||
|
|
f77f46c4e5 | ||
|
|
c2ea5ff472 | ||
|
|
0e972936d3 | ||
|
|
b35004a3ad | ||
|
|
d7e98290c3 | ||
|
|
f5922887bf | ||
|
|
879230dca7 | ||
|
|
1c7e2ff268 | ||
|
|
b324ee5352 | ||
|
|
d21cbcb85d | ||
|
|
6a0c87b77d | ||
|
|
db5ef17dba | ||
|
|
251f2804c6 | ||
|
|
c8951f6da8 | ||
|
|
394c2c2aba | ||
|
|
bb7a01f758 | ||
|
|
a6b46f9c74 | ||
|
|
e865d0832e | ||
|
|
307dbbe044 | ||
|
|
69651258d6 | ||
|
|
53c491f537 | ||
|
|
a8ccb1b6ba | ||
|
|
e6217401f9 | ||
|
|
d97fb37f0e | ||
|
|
75e71f9ce9 | ||
|
|
19540ea1da | ||
|
|
431f78f8af | ||
|
|
95eea6fc26 | ||
|
|
387a34ffff | ||
|
|
37a833887b | ||
|
|
a69fc4240a | ||
|
|
15c586fbdb | ||
|
|
2daf74d134 | ||
|
|
1934787e80 | ||
|
|
2a476a7bfe | ||
|
|
e94137ecbf | ||
|
|
d22f543043 | ||
|
|
e5e4a38cf1 | ||
|
|
89faa7d97d | ||
|
|
fc4430e4f1 | ||
|
|
f735423d98 | ||
|
|
985dd927c4 | ||
|
|
10d6f85b5e | ||
|
|
85cdfce6a9 | ||
|
|
e62757cf1c | ||
|
|
a1fb195bf4 | ||
|
|
9eb9fdec6c | ||
|
|
a8323e2396 | ||
|
|
855ab6e277 | ||
|
|
2932e9e335 | ||
|
|
4940550c62 | ||
|
|
258934a46b | ||
|
|
2476be3799 | ||
|
|
08111e7a8a | ||
|
|
99cc8efea0 | ||
|
|
09198fda28 | ||
|
|
e16886c62c | ||
|
|
c939d67cb6 | ||
|
|
600aa885d4 | ||
|
|
8efd97599a | ||
|
|
686df31049 | ||
|
|
c3e3ca84a2 | ||
|
|
f8cc47614f | ||
|
|
904754e059 | ||
|
|
673f9b1f8b | ||
|
|
993385f1db | ||
|
|
088c1a0033 | ||
|
|
fcba03f3d0 | ||
|
|
8ba503ca5d | ||
|
|
3b78dfec41 | ||
|
|
8509fff746 | ||
|
|
fb4c6966af | ||
|
|
ec8c826565 | ||
|
|
e84e03cd05 | ||
|
|
2a81d137a8 | ||
|
|
70934153ac | ||
|
|
db475b232f | ||
|
|
32a75d84cc | ||
|
|
640552e260 | ||
|
|
b37f597eaa | ||
|
|
f8954fd200 | ||
|
|
6d1490bd28 | ||
|
|
234f000756 | ||
|
|
14c7f34108 | ||
|
|
f354c3f353 | ||
|
|
c0a0c64425 | ||
|
|
05f3f118ac | ||
|
|
21dbcb3113 | ||
|
|
6b7f54d0a2 | ||
|
|
0d70a9e018 | ||
|
|
aee34e5b86 | ||
|
|
0460014b75 | ||
|
|
84d050fb0c | ||
|
|
3847c7d92d | ||
|
|
81936ac524 | ||
|
|
45d8154a04 | ||
|
|
03400f1c93 | ||
|
|
603598a3f9 | ||
|
|
757b07c22f | ||
|
|
b7fba0e151 | ||
|
|
75278cdb6a | ||
|
|
67f12856e1 | ||
|
|
475c0eda64 | ||
|
|
828d61d818 | ||
|
|
0218447008 | ||
|
|
2741be72c7 | ||
|
|
e8beb7f2a9 | ||
|
|
b2728bf1de | ||
|
|
d65dcb51a3 | ||
|
|
87bc9a21d9 | ||
|
|
ca25dde780 | ||
|
|
c61900f9e6 | ||
|
|
1077d357ca | ||
|
|
6b84824a53 | ||
|
|
c74d647ec3 | ||
|
|
58a5c95c32 | ||
|
|
9a26c75884 | ||
|
|
276b939252 | ||
|
|
3eb44f2958 | ||
|
|
9bbdb74f85 | ||
|
|
35b6058c09 | ||
|
|
88d9234332 | ||
|
|
eabead05ab | ||
|
|
a1bef073cf | ||
|
|
f35e8c755c | ||
|
|
71ae25a58c | ||
|
|
0e61efe5b5 | ||
|
|
84e4c68f0e | ||
|
|
559155d411 | ||
|
|
2bb0177ffa | ||
|
|
15ed4ae5f7 | ||
|
|
792217f640 | ||
|
|
ba1914e48c | ||
|
|
07b3601206 | ||
|
|
93458eb6d4 | ||
|
|
6f7b3c238e | ||
|
|
de0b8fb07e | ||
|
|
3111548c99 | ||
|
|
841224b20f | ||
|
|
45536f4a8d | ||
|
|
4717763fed | ||
|
|
53f33eb13a | ||
|
|
b18807b1ef | ||
|
|
2c0b4b1472 | ||
|
|
d713e5104c | ||
|
|
e9a4662620 | ||
|
|
eba1a0c1ca | ||
|
|
4eb5d6873a | ||
|
|
71f553a6f2 | ||
|
|
8e218a71e0 |
@@ -0,0 +1,51 @@
|
||||
name: Update flake.lock
|
||||
|
||||
"on":
|
||||
schedule:
|
||||
- cron: "0 0 * * 0" # Every Sunday at midnight UTC
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
update-flake-lock:
|
||||
runs-on: nix-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Update flake.lock
|
||||
run: nix flake update
|
||||
|
||||
- name: Create PR if changed
|
||||
env:
|
||||
GITEA_TOKEN: ${{ secrets.KLAATU_TOKEN }}
|
||||
GITEA_URL: https://src.thehellings.com
|
||||
REPO: greg/nixos
|
||||
run: |
|
||||
if git diff --quiet flake.lock; then
|
||||
echo "flake.lock unchanged, nothing to do"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
BRANCH="auto/update-flake-lock-$(date +%Y%m%d)"
|
||||
git config user.email "klaatu@thehellings.com"
|
||||
git config user.name "klaatu"
|
||||
git checkout -b "$BRANCH"
|
||||
git add flake.lock
|
||||
git commit -m "chore: update flake.lock $(date +%Y-%m-%d)"
|
||||
|
||||
# Push branch using token auth
|
||||
git remote set-url origin "https://klaatu:${GITEA_TOKEN}@${GITEA_URL#https://}/${REPO}.git"
|
||||
git push origin "$BRANCH"
|
||||
|
||||
# Create PR via Gitea API
|
||||
curl -s -X POST \
|
||||
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
"${GITEA_URL}/api/v1/repos/${REPO}/pulls" \
|
||||
-d "{
|
||||
\"title\": \"chore: update flake.lock $(date +%Y-%m-%d)\",
|
||||
\"head\": \"$BRANCH\",
|
||||
\"base\": \"main\",
|
||||
\"body\": \"Automated weekly flake.lock update.\\n\\nGenerated by Gitea Actions.\",
|
||||
\"assignees\": [\"greg\"]
|
||||
}"
|
||||
@@ -0,0 +1,58 @@
|
||||
name: Update manifest chart versions
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 0 * * 1" # Every Monday at midnight UTC
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
update-manifests:
|
||||
runs-on: [bare-metal, nix-latest]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Scan manifests for chart version updates
|
||||
run: |
|
||||
echo "TODO: implement manifest update scanning"
|
||||
echo ""
|
||||
echo "Planned implementation:"
|
||||
echo " 1. Parse each manifests/*/chart.yaml for HelmRelease chart versions"
|
||||
echo " 2. Query artifact hub or helm repo for latest versions"
|
||||
echo " 3. Emit a diff of available updates"
|
||||
echo ""
|
||||
echo "Scanned manifests directories:"
|
||||
ls manifests/
|
||||
|
||||
- name: Create PR if changes found
|
||||
env:
|
||||
GITEA_TOKEN: ${{ secrets.KLAATU_TOKEN }}
|
||||
GITEA_URL: https://src.thehellings.com
|
||||
REPO: greg/nixos
|
||||
run: |
|
||||
if git diff --quiet; then
|
||||
echo "No manifest changes, nothing to do"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
BRANCH="auto/update-manifests-$(date +%Y%m%d)"
|
||||
git config user.email "klaatu@thehellings.com"
|
||||
git config user.name "klaatu"
|
||||
git checkout -b "$BRANCH"
|
||||
git add manifests/
|
||||
git commit -m "chore: update manifest chart versions $(date +%Y-%m-%d)"
|
||||
|
||||
git remote set-url origin "https://klaatu:${GITEA_TOKEN}@${GITEA_URL#https://}/${REPO}.git"
|
||||
git push origin "$BRANCH"
|
||||
|
||||
curl -s -X POST \
|
||||
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
"${GITEA_URL}/api/v1/repos/${REPO}/pulls" \
|
||||
-d "{
|
||||
\"title\": \"chore: update manifest chart versions $(date +%Y-%m-%d)\",
|
||||
\"head\": \"$BRANCH\",
|
||||
\"base\": \"main\",
|
||||
\"body\": \"Automated weekly manifest chart version update.\\n\\nGenerated by Gitea Actions.\",
|
||||
\"assignees\": [\"greg\"]
|
||||
}"
|
||||
@@ -1,23 +0,0 @@
|
||||
stages:
|
||||
- eval
|
||||
- build
|
||||
- push
|
||||
|
||||
"Evaluate for builds":
|
||||
stage: eval
|
||||
tags:
|
||||
- kubernetes
|
||||
image: "$CI_REGISTRY/greg/ci-images/builder:latest"
|
||||
artifacts:
|
||||
paths:
|
||||
- gitlab-ci-continue.yml
|
||||
script: nix run ".#gen-build" > gitlab-ci-continue.yml
|
||||
|
||||
"Trigger builds":
|
||||
stage: build
|
||||
trigger:
|
||||
include:
|
||||
- artifact: gitlab-ci-continue.yml
|
||||
job: "Evaluate for builds"
|
||||
variables:
|
||||
PARENT_PIPELINE_ID: $CI_PIPELINE_ID
|
||||
@@ -17,7 +17,7 @@ repos:
|
||||
- id: mixed-line-ending
|
||||
- id: trailing-whitespace
|
||||
- repo: https://github.com/adrienverge/yamllint.git
|
||||
rev: v1.37.1
|
||||
rev: v1.38.0
|
||||
hooks:
|
||||
- id: yamllint
|
||||
args:
|
||||
@@ -30,8 +30,9 @@ repos:
|
||||
comments: false
|
||||
comments-indentation: false
|
||||
document-start: false
|
||||
line-length: false
|
||||
- repo: https://github.com/NixOS/nixfmt
|
||||
rev: v1.1.0
|
||||
rev: v1.2.0
|
||||
hooks:
|
||||
- id: nixfmt-nix
|
||||
- repo: https://github.com/astro/deadnix
|
||||
|
||||
+55
-26
@@ -1,53 +1,82 @@
|
||||
{
|
||||
lib,
|
||||
pkgs,
|
||||
pkgs',
|
||||
top,
|
||||
...
|
||||
}:
|
||||
let
|
||||
builder-config = {
|
||||
darwin-aarch-builder = top.self.nixosConfigurations.builder-aarch;
|
||||
darwin-x86-builder = top.self.nixosConfigurations.builder-x86;
|
||||
system = builtins.replaceStrings [ "darwin" ] [ "linux" ] pkgs.stdenv.hostPlatform.system;
|
||||
builderConfig = top.nixunstable.lib.nixosSystem {
|
||||
inherit system;
|
||||
modules = [
|
||||
"${top.nixunstable}/nixos/modules/profiles/nix-builder-vm.nix"
|
||||
{
|
||||
virtualisation = {
|
||||
host.pkgs = pkgs;
|
||||
darwin-builder = {
|
||||
workingDirectory = "/var/lib/darwin-builder";
|
||||
hostPort = 22;
|
||||
};
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
builder = arch: let
|
||||
b = builder-config."darwin-${arch}-builder";
|
||||
in {
|
||||
command = "${b.config.system.build.macos-builder-installer}/bin/create-builder";
|
||||
builder = {
|
||||
command = "${builderConfig.config.system.build.macos-builder-installer}/bin/create-builder";
|
||||
serviceConfig = {
|
||||
KeepAlive = true;
|
||||
RunAtLoad = true;
|
||||
StandardOutPath = "/var/log/builder-vm-${arch}.log";
|
||||
StandardErrorPath = "/var/log/builder-vm-${arch}.stderr.log";
|
||||
StandardOutPath = "/var/log/builder-vm-${system}.log";
|
||||
StandardErrorPath = "/var/log/builder-vm-${system}.stderr.log";
|
||||
};
|
||||
};
|
||||
in
|
||||
{
|
||||
environment.systemPackages = with pkgs; [
|
||||
hms
|
||||
];
|
||||
environment = {
|
||||
launchDaemons = {
|
||||
"limit.maxfiles.plist" = {
|
||||
enable = true;
|
||||
text = ''
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>limit.maxfiles</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>launchctl</string>
|
||||
<string>limit</string>
|
||||
<string>maxfiles</string>
|
||||
<string>524288</string>
|
||||
<string>524288</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
'';
|
||||
};
|
||||
};
|
||||
systemPackages = with pkgs; [
|
||||
agenix
|
||||
pkgs'.hms
|
||||
procps # Includes tools like `watch`, `kill`, and `ps`
|
||||
];
|
||||
};
|
||||
|
||||
fonts.packages = with pkgs; [
|
||||
dejavu_fonts
|
||||
nerd-fonts.hack
|
||||
];
|
||||
|
||||
launchd.daemons = lib.genAttrs' [ "x86" "aarch" ] (arch: lib.nameValuePair "builder-${arch}-machine" (builder arch));
|
||||
#launchd.daemons.darwin-builder = builder;
|
||||
|
||||
nix = {
|
||||
#buildMachines = [ { systems = ["aarch64-linux"]; sshUser = "builder"; sshKey = "/etc/nix/builder_ed25519"; hostName = "localhost:31022"; protocol = "ssh-ng"; }];
|
||||
enable = true;
|
||||
buildMachines = [
|
||||
{
|
||||
hostName = "ssh-ng://builder@localhost";
|
||||
system = "aarch64-linux";
|
||||
maxJobs = 4;
|
||||
supportedFeatures = [
|
||||
"kvm"
|
||||
"benchmarch"
|
||||
"big-parallel"
|
||||
];
|
||||
}
|
||||
];
|
||||
gc.interval.Hour = 3;
|
||||
#linux-builder.enable = true;
|
||||
settings.auto-optimise-store = false; # Darwin bugs?
|
||||
};
|
||||
|
||||
|
||||
+2
-4
@@ -19,6 +19,7 @@ let
|
||||
specialArgs = {
|
||||
inherit metadata top;
|
||||
inherit (top) self;
|
||||
pkgs' = top.self.packages.${system};
|
||||
};
|
||||
modules = [
|
||||
{
|
||||
@@ -37,7 +38,4 @@ let
|
||||
++ lib.optionals (builtins.pathExists ./hosts/${name}) [ ./hosts/${name} ];
|
||||
};
|
||||
in
|
||||
{
|
||||
"MacBook-Pro" = mac { name = "ivr"; };
|
||||
"MacBook-Prolocal" = mac { name = "ivr"; };
|
||||
}
|
||||
(lib.genAttrs (builtins.attrNames (builtins.readDir ./hosts)) (name: mac { inherit name; }))
|
||||
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
gregory
|
||||
+1
@@ -0,0 +1 @@
|
||||
gregory
|
||||
@@ -31,6 +31,7 @@ in
|
||||
"bitwarden"
|
||||
"bruno"
|
||||
"chromium"
|
||||
"claude"
|
||||
"dbeaver-community"
|
||||
"ghostty"
|
||||
"firefox"
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
gregory/
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
lithic/
|
||||
@@ -0,0 +1,53 @@
|
||||
{ ... }:
|
||||
let
|
||||
username = "greg";
|
||||
in
|
||||
{
|
||||
greg = {
|
||||
nix.cache = false;
|
||||
};
|
||||
|
||||
homebrew = {
|
||||
enable = true;
|
||||
brews = [
|
||||
"bitwarden-cli"
|
||||
"colima"
|
||||
"direnv"
|
||||
"github-mcp-server"
|
||||
{
|
||||
name = "libvirt";
|
||||
restart_service = true;
|
||||
}
|
||||
"mcp-atlassian"
|
||||
"notion-mcp-server"
|
||||
"nushell"
|
||||
"qemu"
|
||||
"slack-mcp-server"
|
||||
"zlib"
|
||||
];
|
||||
casks = [
|
||||
"alt-tab"
|
||||
"audacity"
|
||||
"bitwarden"
|
||||
"bruno"
|
||||
"chromium"
|
||||
"claude-code"
|
||||
"dbeaver-community"
|
||||
"ghostty"
|
||||
"firefox"
|
||||
"notion"
|
||||
"notunes"
|
||||
"onlyoffice"
|
||||
"tabby"
|
||||
"zed"
|
||||
];
|
||||
user = username;
|
||||
};
|
||||
|
||||
system.primaryUser = username;
|
||||
|
||||
users.users."${username}" = {
|
||||
name = username;
|
||||
home = "/Users/${username}";
|
||||
};
|
||||
}
|
||||
Generated
+290
-191
@@ -25,19 +25,17 @@
|
||||
},
|
||||
"buildbot": {
|
||||
"inputs": {
|
||||
"flake-parts": "flake-parts",
|
||||
"hercules-ci-effects": "hercules-ci-effects",
|
||||
"nixpkgs": [
|
||||
"nixunstable"
|
||||
],
|
||||
"treefmt-nix": "treefmt-nix"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772467670,
|
||||
"narHash": "sha256-DF/1VCg7Qmw5iaFhBeKBysOSTDCxZlKJHdbJc7Q2e1k=",
|
||||
"lastModified": 1783833875,
|
||||
"narHash": "sha256-G+hRtNJ/Nnr6VFMQp2UZdx/ckJDR/RJoK0Fy/yx1/YY=",
|
||||
"owner": "nix-community",
|
||||
"repo": "buildbot-nix",
|
||||
"rev": "f927795b97474875738ac134525af560b2d4a8a5",
|
||||
"rev": "147af587241e2af85399402da60a4f44fdb1e5d7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -46,44 +44,20 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"charts": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"haumea": "haumea",
|
||||
"nix-kube-generators": "nix-kube-generators",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"pyproject-build-systems": "pyproject-build-systems",
|
||||
"pyproject-nix": "pyproject-nix",
|
||||
"uv2nix": "uv2nix"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772676442,
|
||||
"narHash": "sha256-bPxUBXS2mdT4BjMAmTap5TkXnUX807qo4Uho2oVb2Fg=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixhelm",
|
||||
"rev": "19cdbb3a03554059165a25a18b32bd253e62c883",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "nixhelm",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"colmena": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat",
|
||||
"flake-utils": "flake-utils_2",
|
||||
"flake-utils": "flake-utils",
|
||||
"nix-github-actions": "nix-github-actions",
|
||||
"nixpkgs": "nixpkgs_2",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"stable": "stable"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1762034856,
|
||||
"narHash": "sha256-QVey3iP3UEoiFVXgypyjTvCrsIlA4ecx6Acaz5C8/PQ=",
|
||||
"lastModified": 1783909498,
|
||||
"narHash": "sha256-T9OfLPLuh1Bf1xojlpWXwooJ6IXapxvb8GM0p3YNy8g=",
|
||||
"owner": "zhaofengli",
|
||||
"repo": "colmena",
|
||||
"rev": "349b035a5027f23d88eeb3bc41085d7ee29f18ed",
|
||||
"rev": "76ba0daa542880b730faec81f4e87efcaa63bc57",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -121,11 +95,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772379624,
|
||||
"narHash": "sha256-NG9LLTWlz4YiaTAiRGChbrzbVxBfX+Auq4Ab/SWmk4A=",
|
||||
"lastModified": 1784362797,
|
||||
"narHash": "sha256-EP9b9b+OXDxHBPefFwMYCIaLq0fn3UkmrbfzbLUT7kQ=",
|
||||
"owner": "lnl7",
|
||||
"repo": "nix-darwin",
|
||||
"rev": "52d061516108769656a8bd9c6e811c677ec5b462",
|
||||
"rev": "b4cccbd4bc299c1f71ae185b79c3cf99aa82805c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -138,11 +112,11 @@
|
||||
"flake-compat": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1650374568,
|
||||
"narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
|
||||
"lastModified": 1767039857,
|
||||
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"rev": "b4a34015c698c7793d592d66adbab377907a2be8",
|
||||
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -152,6 +126,22 @@
|
||||
}
|
||||
},
|
||||
"flake-compat_2": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1747046372,
|
||||
"narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=",
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-compat_3": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1767039857,
|
||||
@@ -169,17 +159,14 @@
|
||||
},
|
||||
"flake-parts": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": [
|
||||
"buildbot",
|
||||
"nixpkgs"
|
||||
]
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1769996383,
|
||||
"narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=",
|
||||
"lastModified": 1782949081,
|
||||
"narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "57928607ea566b5db3ad13af0e57e921e6b12381",
|
||||
"rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -190,7 +177,10 @@
|
||||
},
|
||||
"flake-parts_2": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
"nixpkgs-lib": [
|
||||
"hermes",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772408722,
|
||||
@@ -214,11 +204,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1769996383,
|
||||
"narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=",
|
||||
"lastModified": 1782949081,
|
||||
"narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "57928607ea566b5db3ad13af0e57e921e6b12381",
|
||||
"rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -266,65 +256,28 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils_2": {
|
||||
"locked": {
|
||||
"lastModified": 1659877975,
|
||||
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"haumea": {
|
||||
"hermes": {
|
||||
"inputs": {
|
||||
"flake-parts": "flake-parts_2",
|
||||
"nixpkgs": [
|
||||
"charts",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1685133229,
|
||||
"narHash": "sha256-FePm/Gi9PBSNwiDFq3N+DWdfxFq0UKsVVTJS3cQPn94=",
|
||||
"owner": "nix-community",
|
||||
"repo": "haumea",
|
||||
"rev": "34dd58385092a23018748b50f9b23de6266dffc2",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"ref": "v0.2.2",
|
||||
"repo": "haumea",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hercules-ci-effects": {
|
||||
"inputs": {
|
||||
"flake-parts": [
|
||||
"buildbot",
|
||||
"flake-parts"
|
||||
"nixunstable"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"buildbot",
|
||||
"nixpkgs"
|
||||
]
|
||||
"npm-lockfile-fix": "npm-lockfile-fix",
|
||||
"pyproject-build-systems": "pyproject-build-systems",
|
||||
"pyproject-nix": "pyproject-nix",
|
||||
"uv2nix": "uv2nix"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1771131391,
|
||||
"narHash": "sha256-HPBNYf7HiKtBVy7/69vKpLYHX6wTcUxndxmybzDlXP8=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "hercules-ci-effects",
|
||||
"rev": "0b152e0f7c5cc265a529cd63374b80e2771b207b",
|
||||
"lastModified": 1784663791,
|
||||
"narHash": "sha256-bPip7Rk/5n5idLvedBXWjzuRw6cc30XGxCRJewlwwUE=",
|
||||
"owner": "nousresearch",
|
||||
"repo": "hermes-agent",
|
||||
"rev": "e2e8823f1d2de2aa95c8147d0abd105539d5daff",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "hercules-ci-effects",
|
||||
"owner": "nousresearch",
|
||||
"repo": "hermes-agent",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
@@ -335,11 +288,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772633327,
|
||||
"narHash": "sha256-jl+DJB2DUx7EbWLRng+6HNWW/1/VQOnf0NsQB4PlA7I=",
|
||||
"lastModified": 1784407317,
|
||||
"narHash": "sha256-iZrxHToDJWnvt+5LGAtvuQMTy1NZYlNEKbKaVtBJNcc=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "5a75730e6f21ee624cbf86f4915c6e7489c74acc",
|
||||
"rev": "39411a8e12a5526d992e65bc7e3dc9a4414d6713",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -370,6 +323,45 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"minecraft": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat_2",
|
||||
"nixpkgs": "nixpkgs_2",
|
||||
"systems": "systems_3"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1784344393,
|
||||
"narHash": "sha256-yAo2ZzSIdeBZg7cOKUpQxwflL+DRYN+1DMObZk2lP2Q=",
|
||||
"owner": "Infinidoge",
|
||||
"repo": "nix-minecraft",
|
||||
"rev": "7297d14c52ec8ef39c6aeff2c1818541fd030473",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "Infinidoge",
|
||||
"repo": "nix-minecraft",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"niks3": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs_3",
|
||||
"treefmt-nix": "treefmt-nix_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1784016977,
|
||||
"narHash": "sha256-TydDba3YD2u15uS0L+PDs7lMqPopnzWggljTKDqOCSw=",
|
||||
"owner": "Mic92",
|
||||
"repo": "niks3",
|
||||
"rev": "b306808bf381e7e66e33de1e9446a1be0935f4e3",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "Mic92",
|
||||
"repo": "niks3",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix-github-actions": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
@@ -378,11 +370,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1729742964,
|
||||
"narHash": "sha256-B4mzTcQ0FZHdpeWcpDYPERtyjJd/NIuaQ9+BV1h+MpA=",
|
||||
"lastModified": 1737420293,
|
||||
"narHash": "sha256-F1G5ifvqTpJq7fdkT34e/Jy9VCyzd5XfJ9TO8fHhJWE=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nix-github-actions",
|
||||
"rev": "e04df33f62cdcf93d73e9a04142464753a16db67",
|
||||
"rev": "f4158fa080ef4503c8f4c820967d946c2af31ec9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -392,12 +384,15 @@
|
||||
}
|
||||
},
|
||||
"nix-hardware": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs_4"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1771969195,
|
||||
"narHash": "sha256-qwcDBtrRvJbrrnv1lf/pREQi8t2hWZxVAyeMo7/E9sw=",
|
||||
"lastModified": 1784310968,
|
||||
"narHash": "sha256-rkSPTePrKqs4dg+i7ZFCq93+HrClac6oSwXX927SVjA=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixos-hardware",
|
||||
"rev": "41c6b421bdc301b2624486e11905c9af7b8ec68e",
|
||||
"rev": "779c32a00155994c86cde8213a8dd4df139d4355",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -406,28 +401,13 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix-kube-generators": {
|
||||
"locked": {
|
||||
"lastModified": 1762437901,
|
||||
"narHash": "sha256-5yuJODagAq+aMXQAT2c0gfXKLqapmA6eUHR33jKNHuU=",
|
||||
"owner": "farcaller",
|
||||
"repo": "nix-kube-generators",
|
||||
"rev": "810dcf792081790648ba9ae705b9a2286115ace8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "farcaller",
|
||||
"repo": "nix-kube-generators",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1767767207,
|
||||
"narHash": "sha256-Mj3d3PfwltLmukFal5i3fFt27L6NiKXdBezC1EBuZs4=",
|
||||
"lastModified": 1783224372,
|
||||
"narHash": "sha256-8i/87eeoqiGE4yOTjwSA3Eh/ziJRQEmd/unYU+K27sk=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "5912c1772a44e31bf1c63c0390b90501e5026886",
|
||||
"rev": "d407951447dcd00442e97087bf374aad70c04cea",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -439,11 +419,26 @@
|
||||
},
|
||||
"nixpkgs-lib": {
|
||||
"locked": {
|
||||
"lastModified": 1772328832,
|
||||
"narHash": "sha256-e+/T/pmEkLP6BHhYjx6GmwP5ivonQQn0bJdH9YrRB+Q=",
|
||||
"lastModified": 1782614948,
|
||||
"narHash": "sha256-ePjCwr1sNm9NYUqywL7QfK3JnlS015msC+eBu2zKlp8=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"rev": "c185c7a5e5dd8f9add5b2f8ebeff00888b070742",
|
||||
"rev": "db3f255737b94216eb71cce308e2912cf6bc2d7c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-lib_2": {
|
||||
"locked": {
|
||||
"lastModified": 1783821755,
|
||||
"narHash": "sha256-eMPX9S6MKPyUnaOgeRfrG7OKUiAlc1AlcRinMbSB0WA=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"rev": "228ab8523d81526e57a6ca342e1a919fb6d246a8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -454,15 +449,15 @@
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1750134718,
|
||||
"narHash": "sha256-v263g4GbxXv87hMXMCpjkIxd/viIF7p3JpJrwgKdNiI=",
|
||||
"owner": "NixOS",
|
||||
"lastModified": 1769461804,
|
||||
"narHash": "sha256-msG8SU5WsBUfVVa/9RPLaymvi5bI8edTavbIq3vRlhI=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "9e83b64f727c88a7711a2c463a7b16eedb69a84c",
|
||||
"rev": "bfc1b8a4574108ceef22f02bafcf6611380c100d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
@@ -470,11 +465,56 @@
|
||||
},
|
||||
"nixpkgs_3": {
|
||||
"locked": {
|
||||
"lastModified": 1772624091,
|
||||
"narHash": "sha256-QKyJ0QGWBn6r0invrMAK8dmJoBYWoOWy7lN+UHzW1jc=",
|
||||
"lastModified": 1783978241,
|
||||
"narHash": "sha256-7kK0Y/fIV2NTKArkd/eZGaFg+dEmgP8KDRsGK2vB5M4=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "a8b81d3cc8d35af7bc98694696bea61ad4f8fca7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable-small",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_4": {
|
||||
"locked": {
|
||||
"lastModified": 1767892417,
|
||||
"narHash": "sha256-8bW3q88CEg2u4hSP66Vf4lpbLonHz7hqDNBMcCY7E9U=",
|
||||
"rev": "3497aa5c9457a9d88d71fa93a4a8368816fbeeba",
|
||||
"type": "tarball",
|
||||
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre924538.3497aa5c9457/nixexprs.tar.xz"
|
||||
},
|
||||
"original": {
|
||||
"type": "tarball",
|
||||
"url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz"
|
||||
}
|
||||
},
|
||||
"nixpkgs_5": {
|
||||
"locked": {
|
||||
"lastModified": 1783915482,
|
||||
"narHash": "sha256-FmieJB8/OUvNxbkboi7+IGfIuSXY3nF/hZQm8kD0r50=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "6cdc7fc76e8bf7fde9fa43a849fcaaa70e230dee",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_6": {
|
||||
"locked": {
|
||||
"lastModified": 1784356753,
|
||||
"narHash": "sha256-12KrbMiWLcf8m7pCvAtZh1ZrgF85ZXDXvfR/fWTKy84=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "80bdc1e5ce51f56b19791b52b2901187931f5353",
|
||||
"rev": "61b7c44c4073f0b827768aff0049561b5110ea5a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -484,29 +524,29 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_4": {
|
||||
"nixpkgs_7": {
|
||||
"locked": {
|
||||
"lastModified": 1766025857,
|
||||
"narHash": "sha256-Lav5jJazCW4mdg1iHcROpuXqmM94BWJvabLFWaJVJp0=",
|
||||
"lastModified": 1777207419,
|
||||
"narHash": "sha256-V3bmPWAajDiC+1ClDOp55gianW2EyRJSJOyu1RUQibc=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "def3da69945bbe338c373fddad5a1bb49cf199ce",
|
||||
"rev": "a7ecea3deccfbdbf22945a89984fcc5a169da8aa",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "def3da69945bbe338c373fddad5a1bb49cf199ce",
|
||||
"rev": "a7ecea3deccfbdbf22945a89984fcc5a169da8aa",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixunstable": {
|
||||
"locked": {
|
||||
"lastModified": 1772963539,
|
||||
"narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=",
|
||||
"lastModified": 1784356753,
|
||||
"narHash": "sha256-12KrbMiWLcf8m7pCvAtZh1ZrgF85ZXDXvfR/fWTKy84=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "9dcb002ca1690658be4a04645215baea8b95f31d",
|
||||
"rev": "61b7c44c4073f0b827768aff0049561b5110ea5a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -519,17 +559,15 @@
|
||||
"nixvimunstable": {
|
||||
"inputs": {
|
||||
"flake-parts": "flake-parts_3",
|
||||
"nixpkgs": [
|
||||
"nixunstable"
|
||||
],
|
||||
"systems": "systems_3"
|
||||
"nixpkgs": "nixpkgs_5",
|
||||
"systems": "systems_4"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772402258,
|
||||
"narHash": "sha256-3DmCFOdmbkFML1/G9gj8Wb+rCCZFPOQtNoMCpqOF8SA=",
|
||||
"lastModified": 1784057377,
|
||||
"narHash": "sha256-yycNej5//EsRbV10moBoh+/63vXEwZD1ZFEiRm6C9rQ=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixvim",
|
||||
"rev": "21ae25e13b01d3b4cdc750b5f9e7bad68b150c10",
|
||||
"rev": "07180a087e4a00720dc0731cbcd8dec796974381",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -539,17 +577,38 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"npm-lockfile-fix": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"hermes",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1775903712,
|
||||
"narHash": "sha256-2GV79U6iVH4gKAPWYrxUReB0S41ty/Y3dBLquU8AlaA=",
|
||||
"owner": "jeslie0",
|
||||
"repo": "npm-lockfile-fix",
|
||||
"rev": "c6093acb0c0548e0f9b8b3d82918823721930fe8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "jeslie0",
|
||||
"repo": "npm-lockfile-fix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nurpkgs": {
|
||||
"inputs": {
|
||||
"flake-parts": "flake-parts_4",
|
||||
"nixpkgs": "nixpkgs_3"
|
||||
"nixpkgs": "nixpkgs_6"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772717146,
|
||||
"narHash": "sha256-x2nJlzpiHWHLkGDBvaiO1ysLhaxjQCLsG3XieRueJ/c=",
|
||||
"lastModified": 1784417922,
|
||||
"narHash": "sha256-19XZ56wJXArMKxjY25pKXkNp/FrYHGoo+HuQtW6teSM=",
|
||||
"owner": "nix-community",
|
||||
"repo": "NUR",
|
||||
"rev": "2e1bffbdde931c4300a59418d0150c7457022f2d",
|
||||
"rev": "2c806d314605495dd7fd75b5950003a062e2b47a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -561,24 +620,24 @@
|
||||
"pyproject-build-systems": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"charts",
|
||||
"hermes",
|
||||
"nixpkgs"
|
||||
],
|
||||
"pyproject-nix": [
|
||||
"charts",
|
||||
"hermes",
|
||||
"pyproject-nix"
|
||||
],
|
||||
"uv2nix": [
|
||||
"charts",
|
||||
"hermes",
|
||||
"uv2nix"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1763662255,
|
||||
"narHash": "sha256-4bocaOyLa3AfiS8KrWjZQYu+IAta05u3gYZzZ6zXbT0=",
|
||||
"lastModified": 1772555609,
|
||||
"narHash": "sha256-3BA3HnUvJSbHJAlJj6XSy0Jmu7RyP2gyB/0fL7XuEDo=",
|
||||
"owner": "pyproject-nix",
|
||||
"repo": "build-system-pkgs",
|
||||
"rev": "042904167604c681a090c07eb6967b4dd4dae88c",
|
||||
"rev": "c37f66a953535c394244888598947679af231863",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -590,16 +649,16 @@
|
||||
"pyproject-nix": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"charts",
|
||||
"hermes",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1764134915,
|
||||
"narHash": "sha256-xaKvtPx6YAnA3HQVp5LwyYG1MaN4LLehpQI8xEdBvBY=",
|
||||
"lastModified": 1772865871,
|
||||
"narHash": "sha256-/ZTSg97aouL0SlPHaokA4r3iuH9QzHVuWPACD2CUCFY=",
|
||||
"owner": "pyproject-nix",
|
||||
"repo": "pyproject.nix",
|
||||
"rev": "2c8df1383b32e5443c921f61224b198a2282a657",
|
||||
"rev": "e537db02e72d553cea470976b9733581bcf5b3ed",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -612,12 +671,15 @@
|
||||
"inputs": {
|
||||
"agenix": "agenix",
|
||||
"buildbot": "buildbot",
|
||||
"charts": "charts",
|
||||
"colmena": "colmena",
|
||||
"darwin": "darwin_2",
|
||||
"flake-parts": "flake-parts_2",
|
||||
"flake-parts": "flake-parts",
|
||||
"hermes": "hermes",
|
||||
"hmunstable": "hmunstable",
|
||||
"minecraft": "minecraft",
|
||||
"niks3": "niks3",
|
||||
"nix-hardware": "nix-hardware",
|
||||
"nixpkgs-lib": "nixpkgs-lib_2",
|
||||
"nixunstable": "nixunstable",
|
||||
"nixvimunstable": "nixvimunstable",
|
||||
"nurpkgs": "nurpkgs",
|
||||
@@ -627,16 +689,16 @@
|
||||
},
|
||||
"stable": {
|
||||
"locked": {
|
||||
"lastModified": 1750133334,
|
||||
"narHash": "sha256-urV51uWH7fVnhIvsZIELIYalMYsyr2FCalvlRTzqWRw=",
|
||||
"lastModified": 1783625654,
|
||||
"narHash": "sha256-pI1244/PJfTyKhlAr2QYQC55vR6UQdnGA0rJUgtO2IQ=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "36ab78dab7da2e4e27911007033713bab534187b",
|
||||
"rev": "a0230bd8d5cbd13893b2263918d396a2c7dd0407",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-25.05",
|
||||
"ref": "release-26.05",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
@@ -686,6 +748,22 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_4": {
|
||||
"locked": {
|
||||
"lastModified": 1774449309,
|
||||
"narHash": "sha256-brhZ8DmuGtzkCYHJg4HEd602amKm89Y9ytsFZ5uWD1w=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "c29398b59d2048c4ab79345812849c9bd15e9150",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"ref": "future-26.11",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"treefmt-nix": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
@@ -694,11 +772,32 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1770228511,
|
||||
"narHash": "sha256-wQ6NJSuFqAEmIg2VMnLdCnUc0b7vslUohqqGGD+Fyxk=",
|
||||
"lastModified": 1780220602,
|
||||
"narHash": "sha256-eynAfOmbmxJnkp7YewvCEbShNnnYJ9gLLqkzsYtBPeM=",
|
||||
"owner": "numtide",
|
||||
"repo": "treefmt-nix",
|
||||
"rev": "337a4fe074be1042a35086f15481d763b8ddc0e7",
|
||||
"rev": "db947814a175b7ca6ded66e21383d938df01c227",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "treefmt-nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"treefmt-nix_2": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"niks3",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1780220602,
|
||||
"narHash": "sha256-eynAfOmbmxJnkp7YewvCEbShNnnYJ9gLLqkzsYtBPeM=",
|
||||
"owner": "numtide",
|
||||
"repo": "treefmt-nix",
|
||||
"rev": "db947814a175b7ca6ded66e21383d938df01c227",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -710,20 +809,20 @@
|
||||
"uv2nix": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"charts",
|
||||
"hermes",
|
||||
"nixpkgs"
|
||||
],
|
||||
"pyproject-nix": [
|
||||
"charts",
|
||||
"hermes",
|
||||
"pyproject-nix"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1767701098,
|
||||
"narHash": "sha256-CJhKZnWb3gumR9oTRjFvCg/6lYTGbZRU7xtvcyWIRwU=",
|
||||
"lastModified": 1773039484,
|
||||
"narHash": "sha256-+boo33KYkJDw9KItpeEXXv8+65f7hHv/earxpcyzQ0I=",
|
||||
"owner": "pyproject-nix",
|
||||
"repo": "uv2nix",
|
||||
"rev": "9d357f0d2ce6f5f35ec7959d7e704452352eb4da",
|
||||
"rev": "b68be7cfeacbed9a3fa38a2b5adc0cfb81d9bb1f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -734,14 +833,14 @@
|
||||
},
|
||||
"vsext": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs_4"
|
||||
"nixpkgs": "nixpkgs_7"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772678592,
|
||||
"narHash": "sha256-1VZ1hg1YHW+WyBXIOfrQ9Oq+qLL0w93lkdKAiRRHEuI=",
|
||||
"lastModified": 1784343266,
|
||||
"narHash": "sha256-EGkegdTz2n6ESyih8s3dUuPyJQWlYfPp7U41J05g8PY=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nix-vscode-extensions",
|
||||
"rev": "5521856f37c3d2654fe9b20b03331a6594f855c6",
|
||||
"rev": "472a3e862c76c64ac3ad75a24d332cb5cdd5f1bb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -752,17 +851,17 @@
|
||||
},
|
||||
"wsl": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat_2",
|
||||
"flake-compat": "flake-compat_3",
|
||||
"nixpkgs": [
|
||||
"nixunstable"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772386632,
|
||||
"narHash": "sha256-sm6OpWZuoDwR53KNlsY482YOoHFWlWYwt0wHmqLkRGE=",
|
||||
"lastModified": 1784058842,
|
||||
"narHash": "sha256-3u3tvbCIAid3Mv7RrJx13jusIEQC/HeKYhO/SUSxR3A=",
|
||||
"owner": "nix-community",
|
||||
"repo": "NixOS-WSL",
|
||||
"rev": "be894604b2aa2184c0b3d3b44995acd0da14dc0c",
|
||||
"rev": "24c8dc8e0f2170e1a377be24dfadc7d9d21dc1ad",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
||||
@@ -13,24 +13,25 @@
|
||||
url = "github:nix-community/buildbot-nix";
|
||||
inputs.nixpkgs.follows = "nixunstable";
|
||||
};
|
||||
charts = {
|
||||
url = "github:nix-community/nixhelm";
|
||||
};
|
||||
colmena.url = "github:zhaofengli/colmena";
|
||||
darwin = {
|
||||
url = "github:lnl7/nix-darwin/master";
|
||||
inputs.nixpkgs.follows = "nixunstable";
|
||||
};
|
||||
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||
hermes = {
|
||||
url = "github:nousresearch/hermes-agent";
|
||||
inputs.nixpkgs.follows = "nixunstable";
|
||||
};
|
||||
hmunstable = {
|
||||
url = "github:nix-community/home-manager/master";
|
||||
inputs.nixpkgs.follows = "nixunstable";
|
||||
};
|
||||
minecraft.url = "github:Infinidoge/nix-minecraft";
|
||||
niks3.url = "github:Mic92/niks3";
|
||||
nix-hardware.url = "github:nixos/nixos-hardware";
|
||||
nixvimunstable = {
|
||||
url = "github:nix-community/nixvim/main";
|
||||
inputs.nixpkgs.follows = "nixunstable";
|
||||
};
|
||||
nixpkgs-lib.url = "github:nix-community/nixpkgs.lib";
|
||||
nixvimunstable.url = "github:nix-community/nixvim/main";
|
||||
nixunstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
nurpkgs.url = "github:nix-community/NUR";
|
||||
vsext.url = "github:nix-community/nix-vscode-extensions";
|
||||
@@ -50,6 +51,7 @@
|
||||
top.nixvimunstable.overlays.default
|
||||
top.nurpkgs.overlays.default
|
||||
top.vsext.overlays.default
|
||||
top.minecraft.overlay
|
||||
];
|
||||
metadata = builtins.fromJSON (builtins.readFile ./network.json);
|
||||
systems = [
|
||||
@@ -64,10 +66,14 @@
|
||||
config = {
|
||||
allowUnfree = true;
|
||||
allowUnfreePredicate = _: true;
|
||||
permittedInsecurePackages = [ "ventoy-1.1.05" ];
|
||||
permittedInsecurePackages = [
|
||||
"ventoy-1.1.05"
|
||||
"electron-39.8.10"
|
||||
];
|
||||
};
|
||||
}
|
||||
);
|
||||
lib' = import ./lib { inherit (top.nixunstable) lib; };
|
||||
in
|
||||
top.flake-parts.lib.mkFlake { inputs = top; } {
|
||||
inherit systems;
|
||||
@@ -79,10 +85,12 @@
|
||||
nixpkgs = imported_packages.x86_64-linux;
|
||||
specialArgs = {
|
||||
inherit
|
||||
lib'
|
||||
metadata
|
||||
self
|
||||
top
|
||||
;
|
||||
pkgs' = top.self.packages.x86_64-linux;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -96,7 +104,7 @@
|
||||
{
|
||||
deployment = {
|
||||
inherit (v) tags;
|
||||
targetHost = v.ts;
|
||||
targetHost = if (v ? "nebulaIp") then v.nebulaIp else v.ts;
|
||||
targetUser = "greg";
|
||||
};
|
||||
}
|
||||
@@ -115,7 +123,7 @@
|
||||
|
||||
nixosConfigurations = (
|
||||
import ./hosts {
|
||||
inherit top metadata;
|
||||
inherit top metadata lib';
|
||||
nixpkgs = imported_packages;
|
||||
}
|
||||
);
|
||||
@@ -144,16 +152,17 @@
|
||||
pkgs = imported_packages.${system};
|
||||
};
|
||||
|
||||
packages = (import ./pkgs { inherit pkgs; });
|
||||
packages = (import ./pkgs { inherit pkgs top; });
|
||||
|
||||
checks = import ./checks.nix {
|
||||
inherit system top self';
|
||||
inherit (pkgs) lib;
|
||||
inherit (top.nixpkgs-lib) lib;
|
||||
};
|
||||
|
||||
devShells = import ./shells.nix {
|
||||
inherit pkgs;
|
||||
inherit (top) colmena;
|
||||
inherit (self') packages;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
+22
-22
@@ -1,23 +1,23 @@
|
||||
builds:
|
||||
exclude:
|
||||
- "homeConfigurations.*"
|
||||
- "nixosConfigurations.*"
|
||||
- "packages.*"
|
||||
# bitwarden-cli package is broken on aarch64-darwin
|
||||
- "packages.aarch64-darwin.img-bitwarden"
|
||||
# kmod-31 is not a thing on Darwin
|
||||
- "packages.aarch64-darwin.qemu-hook"
|
||||
- "packages.aarch64-darwin.vfio_shutdown"
|
||||
- "packages.aarch64-darwin.vfio_startup"
|
||||
# This one is a bit of a beast and shouldn't take up Garnix time
|
||||
- "packages.aarch64-darwin.zim"
|
||||
# These are just images which I will build when
|
||||
# I feel like it
|
||||
- "devShells.*"
|
||||
include:
|
||||
- "packages.aarch64-darwin.*"
|
||||
- homeConfigurations.exodus
|
||||
- darwinConfigurations.MacBook-Pro
|
||||
- darwinConfigurations.MacBook-Prolocal
|
||||
- nixosConfigurations.builder-x86
|
||||
- nixosConfigurations.builder-aarch
|
||||
# Exclude most things, as I locally build x86_64-linux and aarch64-linux
|
||||
- exclude:
|
||||
- "homeConfigurations.*"
|
||||
- "nixosConfigurations.*"
|
||||
- "packages.*"
|
||||
# These are just images which I will build when
|
||||
# I feel like it
|
||||
- "devShells.*"
|
||||
include:
|
||||
- "packages.aarch64-darwin.*"
|
||||
- darwinConfigurations.MacBook-Pro
|
||||
- darwinConfigurations.MacBook-Prolocal
|
||||
- darwinConfigurations.li
|
||||
# Some specific includes which are not specific enough to override the rules
|
||||
# above, due to the intrepretation of the glob excludes, but which I still
|
||||
# need included
|
||||
- include:
|
||||
# These are Mac homeConfigurations, which I do not have the infra
|
||||
# to build at home
|
||||
- homeConfigurations."gregory.hellings-mbp"
|
||||
- homeConfigurations.gregs-MacBook-Pro-16-inch-Nov-2024
|
||||
- homeConfigurations.ivr
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# vim: set filetype=nushell :
|
||||
let servers = [isaiah jeremiah zeke genesis vm-gitlab]
|
||||
let servers = [isaiah jeremiah zeke genesis hosea]
|
||||
|
||||
def par-map [ items: list, c: closure ] {
|
||||
let results = $items | par-each -k $c
|
||||
@@ -12,15 +12,19 @@ def --env unlock [] {
|
||||
}
|
||||
}
|
||||
|
||||
def rebuild [] {
|
||||
def nebulaIps [] {
|
||||
open ../../network.json | get hosts | items { |h, e| $e.nebulaIp? } | filter { |e| $e != null } | sort
|
||||
}
|
||||
|
||||
def rebuild [ $target: string = "switch" ] {
|
||||
if (uname | get operating-system) == "Darwin" {
|
||||
sudo darwin-rebuild switch
|
||||
sudo darwin-rebuild $target
|
||||
} else {
|
||||
let hostname = uname | get nodename
|
||||
let build = ^nom build --keep-going $"/etc/nixos#nixosConfigurations.($hostname).config.system.build.toplevel"
|
||||
if $env.LAST_EXIT_CODE == 0 {
|
||||
nvd diff /run/current-system result
|
||||
run0 result/bin/switch-to-configuration switch
|
||||
run0 result/bin/switch-to-configuration $target
|
||||
} else {
|
||||
print "Error during build"
|
||||
}
|
||||
@@ -72,3 +76,4 @@ def dc [ $cmd: string = "sh" ] {
|
||||
if ("/usr/local/bin" | path exists) {
|
||||
$env.PATH = $env.PATH | append "/usr/local/bin"
|
||||
}
|
||||
$env.PATH = $env.PATH | prepend "~/.local/bin"
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
nixcopy = "nix copy --to \"s3://binary-cache/?profile=default&endpoint=nas.home%3A9000&scheme=http\"";
|
||||
r = "run0";
|
||||
updateScript = "nix-shell maintainers/scripts/update.nix --argstr package";
|
||||
p = "${lib.getExe pkgs.podman-tui}";
|
||||
|
||||
# General
|
||||
k = "kubectl";
|
||||
|
||||
+27
-26
@@ -5,7 +5,7 @@
|
||||
# This allows things like SSH in distrobox to read the config file just fine
|
||||
home.file.".ssh/config" = {
|
||||
target = ".ssh/config_source";
|
||||
onChange = ''cat ~/.ssh/config_source > ~/.ssh/config && chmod 600 ~/.ssh/config'';
|
||||
onChange = "cat ~/.ssh/config_source > ~/.ssh/config && chmod 600 ~/.ssh/config";
|
||||
};
|
||||
programs.ssh = {
|
||||
enable = true;
|
||||
@@ -13,24 +13,25 @@
|
||||
includes = [ "config.local" ];
|
||||
enableDefaultConfig = false;
|
||||
|
||||
matchBlocks =
|
||||
settings =
|
||||
let
|
||||
nas = {
|
||||
user = "admin";
|
||||
User = "admin";
|
||||
};
|
||||
owned = {
|
||||
user = "greg";
|
||||
User = "greg";
|
||||
};
|
||||
in
|
||||
{
|
||||
inherit nas;
|
||||
|
||||
"*" = {
|
||||
dynamicForwards = [ { port = 10240; } ];
|
||||
serverAliveInterval = 60;
|
||||
extraOptions = {
|
||||
LogLevel = "error";
|
||||
SetEnv = "TERM=xterm-256color";
|
||||
DynamicForward = [ "10240" ];
|
||||
ForwardAgent = "yes";
|
||||
LogLevel = "error";
|
||||
ServerAliveInterval = 60;
|
||||
SetEnv = {
|
||||
TERM = "xterm-256color";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -41,46 +42,46 @@
|
||||
"chronicles.thehellings.lan" = lib.hm.dag.entryBefore [ "*.thehellings.lan" ] nas;
|
||||
|
||||
gh = {
|
||||
user = "git";
|
||||
hostname = "github.com";
|
||||
User = "git";
|
||||
Hostname = "github.com";
|
||||
};
|
||||
"src" = {
|
||||
user = "git";
|
||||
hostname = "jeremiah.shire-zebra.ts.net";
|
||||
port = 32222;
|
||||
User = "git";
|
||||
Hostname = "jeremiah.shire-zebra.ts.net";
|
||||
Port = 32222;
|
||||
};
|
||||
srcpub = {
|
||||
user = "git";
|
||||
hostname = "src.thehellings.com";
|
||||
port = 2222;
|
||||
User = "git";
|
||||
Hostname = "src.thehellings.com";
|
||||
Port = 2222;
|
||||
};
|
||||
ivr = {
|
||||
user = "git";
|
||||
hostname = "gitlab.com";
|
||||
User = "git";
|
||||
Hostname = "gitlab.com";
|
||||
};
|
||||
|
||||
"ivr.thehellings.lan" = lib.hm.dag.entryBefore [ "ivr" ] {
|
||||
user = "gregory.hellings";
|
||||
User = "gregory.hellings";
|
||||
};
|
||||
|
||||
"*.thehellings.lan" = owned;
|
||||
"10.42.*" = owned;
|
||||
|
||||
"host.crosswire.org crosswire" = {
|
||||
hostname = "host.crosswire.org";
|
||||
user = "ghellings";
|
||||
Hostname = "host.crosswire.org";
|
||||
User = "ghellings";
|
||||
};
|
||||
|
||||
fedpeople = {
|
||||
hostname = "fedorapeople.org";
|
||||
user = "greghellings";
|
||||
Hostname = "fedorapeople.org";
|
||||
User = "greghellings";
|
||||
};
|
||||
|
||||
"src.fedoraproject.org pkgs.fedoraproject.org" = {
|
||||
user = "greghellings";
|
||||
User = "greghellings";
|
||||
};
|
||||
|
||||
"127.*".extraOptions = {
|
||||
"127.*" = {
|
||||
PubkeyAcceptedAlgorithms = "+ssh-rsa";
|
||||
HostkeyAlgorithms = "+ssh-rsa";
|
||||
};
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
dig
|
||||
jqp
|
||||
kubernetes-helm
|
||||
iamb
|
||||
#iamb
|
||||
lazyssh
|
||||
rainfrog
|
||||
tenere
|
||||
|
||||
@@ -38,11 +38,6 @@ def _ivr2(args):
|
||||
vpn("gregory_hellings@ra.ivrtechnology.com", "IVR Technology")
|
||||
aliases['ivr2'] = _ivr2
|
||||
|
||||
def _glrestart(args):
|
||||
sudo nixos-container run gitlab -- systemctl restart gitlab
|
||||
sudo nixos-container run gitlab -- systemctl restart nginx
|
||||
aliases['glrestart'] = _glrestart
|
||||
|
||||
def _aws_creds(args):
|
||||
$AWS_ACCESS_KEY_ID=$(bw get username "AWS Access Key")
|
||||
$AWS_SECRET_ACCESS_KEY=$(bw get password "AWS Access Key")
|
||||
|
||||
+7
-16
@@ -4,11 +4,15 @@
|
||||
top,
|
||||
}:
|
||||
let
|
||||
inherit (top.nixunstable) lib;
|
||||
user =
|
||||
host: username:
|
||||
host:
|
||||
let
|
||||
inherit (metadata.hosts.${host}) system;
|
||||
pkgs = nixpkgs.${system};
|
||||
pkgs' = top.self.packages.${system};
|
||||
username =
|
||||
if builtins.hasAttr "user" metadata.hosts.${host} then metadata.hosts.${host}.user else "greg";
|
||||
in
|
||||
top.hmunstable.lib.homeManagerConfiguration {
|
||||
inherit pkgs;
|
||||
@@ -22,25 +26,12 @@ let
|
||||
host
|
||||
username
|
||||
metadata
|
||||
pkgs'
|
||||
;
|
||||
nixvim = top.nixvimunstable;
|
||||
gui = false;
|
||||
gnome = false;
|
||||
};
|
||||
};
|
||||
greg = host: (user host "greg");
|
||||
in
|
||||
{
|
||||
"MacBook-Pro.local" = user "ivr" "gregory.hellings";
|
||||
"MacBook-Prolocal.local" = user "ivr" "gregory.hellings";
|
||||
"MacBook-Pro.thehellings.lan" = user "ivr" "gregory.hellings";
|
||||
"gregory.hellings-mbp" = user "ivr" "gregory.hellings";
|
||||
genesis = greg "genesis";
|
||||
exodus = greg "exodus";
|
||||
zeke = greg "zeke";
|
||||
isaiah = greg "isaiah";
|
||||
jeremiah = greg "jeremiah";
|
||||
linode = greg "linode";
|
||||
hosea = greg "hosea";
|
||||
gitlab = greg "gitlab";
|
||||
}
|
||||
(lib.genAttrs (builtins.attrNames (builtins.readDir ./hosts)) user)
|
||||
|
||||
+9
-3
@@ -1,5 +1,6 @@
|
||||
{
|
||||
pkgs,
|
||||
pkgs',
|
||||
lib,
|
||||
host ? "most",
|
||||
top,
|
||||
@@ -19,9 +20,14 @@ in
|
||||
imports = [
|
||||
top.nixvimunstable.homeModules.nixvim
|
||||
top.self.modules.homeManagerModule
|
||||
top.agenix.homeManagerModules.default
|
||||
./baseline
|
||||
]
|
||||
++ lib.optionals (builtins.pathExists ./hosts/${host}) [ ./hosts/${host} ];
|
||||
++ lib.optionals (builtins.pathExists ./hosts/${host}/default.nix) [ ./hosts/${host} ];
|
||||
|
||||
age = {
|
||||
identityPaths = [ "${homeDirectory}/.ssh/id_ed25519" ];
|
||||
};
|
||||
|
||||
home = {
|
||||
inherit homeDirectory username;
|
||||
@@ -33,7 +39,7 @@ in
|
||||
gh
|
||||
git
|
||||
gnupatch
|
||||
hms
|
||||
pkgs'.hms
|
||||
btop
|
||||
inetutils
|
||||
jq
|
||||
@@ -41,7 +47,7 @@ in
|
||||
nix-prefetch
|
||||
nmap
|
||||
openssl
|
||||
setup-ssh
|
||||
pkgs'.setup-ssh
|
||||
tmux
|
||||
tree
|
||||
unzip
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{...}: {}
|
||||
@@ -1,4 +1,4 @@
|
||||
{ pkgs, ... }:
|
||||
{ lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
greg = {
|
||||
@@ -21,11 +21,31 @@
|
||||
kubectl
|
||||
kubectl-cnpg
|
||||
mattermost-desktop
|
||||
minio-client
|
||||
mumble
|
||||
nebula
|
||||
nix-index
|
||||
pre-commit
|
||||
prismlauncher
|
||||
rclone
|
||||
restic
|
||||
restic-browser
|
||||
tea
|
||||
wineWow64Packages.stable
|
||||
];
|
||||
programs = {
|
||||
discord = {
|
||||
enable = true;
|
||||
settings.SKIP_HOST_UPDATE = true;
|
||||
};
|
||||
};
|
||||
xdg.desktopEntries = {
|
||||
prismlauncher = {
|
||||
name = "Prism Launcher - Minecraft";
|
||||
actions.minecraft = {
|
||||
name = "Minecraft";
|
||||
exec = lib.getExe pkgs.prismlauncher;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,21 +1,10 @@
|
||||
{
|
||||
pkgs,
|
||||
pkgs',
|
||||
lib,
|
||||
username,
|
||||
...
|
||||
}:
|
||||
let
|
||||
username = "gregory.hellings";
|
||||
x = pkgs.xonsh.override {
|
||||
extraPackages = (
|
||||
ps: [
|
||||
pkgs.nur.repos.xonsh-xontribs.xonsh-direnv
|
||||
pkgs.nur.repos.xonsh-xontribs.xontrib-vox
|
||||
ps.xonsh-apipenv
|
||||
pkgs.pipenv-ivr
|
||||
]
|
||||
);
|
||||
};
|
||||
in
|
||||
{
|
||||
# Disables hitting local cache
|
||||
_module.args.cache = lib.mkForce false;
|
||||
@@ -28,43 +17,43 @@ in
|
||||
|
||||
home = {
|
||||
packages = with pkgs; [
|
||||
aacs
|
||||
ansible
|
||||
claude-code
|
||||
direnv
|
||||
home-manager
|
||||
pkgs'.dockerCompat
|
||||
python3Packages.ipython
|
||||
just
|
||||
glab
|
||||
go
|
||||
gopls
|
||||
k9s
|
||||
kubectl
|
||||
mariadb
|
||||
minikube
|
||||
mise
|
||||
nil
|
||||
nixVersions.stable
|
||||
pipenv-ivr
|
||||
pre-commit
|
||||
python311
|
||||
python3Packages.flake8
|
||||
skaffold
|
||||
twine
|
||||
x
|
||||
];
|
||||
file = {
|
||||
".pip/pip.conf".text = ''
|
||||
[global]
|
||||
retries = 1
|
||||
index-url = https://pypi.python.org/simple
|
||||
index-url = https://pypi.python.org/
|
||||
extra-index-url =
|
||||
https://pypidev.ivrtechnology.com/simple/
|
||||
https://pypidev.ivrtechnology.com/
|
||||
'';
|
||||
".config/uv/uv.toml".text = ''
|
||||
index-strategy = "unsafe-first-match"
|
||||
[[index]]
|
||||
url = "https://pypidev.ivrtechnology.com/simple/"
|
||||
url = "https://pypidev.ivrtechnology.com/"
|
||||
name = "pypidev"
|
||||
ignore-error-codes = [403]
|
||||
'';
|
||||
};
|
||||
sessionVariables = {
|
||||
BW_GITLAB_ITEM = "7d3da4e9-5f9a-49d0-8e14-b39c010a4001";
|
||||
BW_ANTHROPIC_ITEM = "e122fd08-3506-4f21-9c6a-b42b00fe5be1";
|
||||
};
|
||||
username = username;
|
||||
homeDirectory = "/Users/${username}";
|
||||
};
|
||||
@@ -108,6 +97,5 @@ in
|
||||
"web4"
|
||||
]
|
||||
);
|
||||
tmux.shell = (lib.getExe x);
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
lithic/
|
||||
@@ -0,0 +1 @@
|
||||
{...}: {}
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
gregory.hellings-mbp/
|
||||
@@ -0,0 +1,80 @@
|
||||
{
|
||||
pkgs,
|
||||
pkgs',
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
let
|
||||
python = pkgs.python312.withPackages (
|
||||
p: with p; [
|
||||
ipython
|
||||
]
|
||||
);
|
||||
in
|
||||
{
|
||||
# Disables hitting local cache
|
||||
_module.args.cache = lib.mkForce false;
|
||||
|
||||
greg = {
|
||||
development = true;
|
||||
gui = true;
|
||||
nix.cache = false;
|
||||
zed = true;
|
||||
};
|
||||
|
||||
home = {
|
||||
packages = with pkgs; [
|
||||
ansible
|
||||
awscli2
|
||||
cargo
|
||||
clippy
|
||||
direnv
|
||||
docker
|
||||
docker-compose
|
||||
docker-buildx
|
||||
go
|
||||
home-manager
|
||||
just
|
||||
mcp-grafana
|
||||
nil
|
||||
nixVersions.stable
|
||||
poetry
|
||||
pre-commit
|
||||
(pulumi.withPackages (
|
||||
p: with p; [
|
||||
pulumi-aws-native
|
||||
pulumi-command
|
||||
pulumi-go
|
||||
pulumi-nodejs
|
||||
pulumi-python
|
||||
]
|
||||
))
|
||||
python
|
||||
rustc
|
||||
rustfmt
|
||||
terraform
|
||||
];
|
||||
};
|
||||
|
||||
programs = {
|
||||
direnv = {
|
||||
enable = true;
|
||||
enableNushellIntegration = true;
|
||||
};
|
||||
nushell = {
|
||||
enable = true;
|
||||
};
|
||||
starship = {
|
||||
enable = true;
|
||||
enableNushellIntegration = true;
|
||||
settings = {
|
||||
directory = {
|
||||
home_symbol = "~";
|
||||
truncate_to_repo = false;
|
||||
truncation_length = 0;
|
||||
use_os_path_sep = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{ pkgs, ... }:
|
||||
|
||||
{
|
||||
greg.vscodium.enable = false;
|
||||
|
||||
home.packages = with pkgs; [ brew ];
|
||||
}
|
||||
+44
-12
@@ -3,19 +3,24 @@
|
||||
lib,
|
||||
metadata,
|
||||
pkgs,
|
||||
top,
|
||||
...
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
../modules/nix-conf.nix
|
||||
top.niks3.nixosModules.niks3-auto-upload
|
||||
];
|
||||
|
||||
age.secrets.niks3-api-token.file = ../secrets/niks3/api_token.age;
|
||||
|
||||
console = {
|
||||
font = "Lat2-Terminus16";
|
||||
keyMap = "us";
|
||||
};
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
top.niks3.packages.${pkgs.stdenv.hostPlatform.system}.niks3
|
||||
agenix
|
||||
bitwarden-cli
|
||||
bmon
|
||||
@@ -26,10 +31,9 @@
|
||||
efibootmgr
|
||||
findutils
|
||||
file
|
||||
gcc-tune
|
||||
git
|
||||
gnupatch
|
||||
hms # My own home manager switcher
|
||||
top.self.packages.${pkgs.stdenv.hostPlatform.system}.hms # My own home manager switcher
|
||||
iperf
|
||||
killall
|
||||
nano
|
||||
@@ -53,9 +57,25 @@
|
||||
|
||||
# Network Manager pulls in too many deps
|
||||
networking = {
|
||||
extraHosts =
|
||||
let
|
||||
onNetwork =
|
||||
attr: _k: v:
|
||||
(builtins.hasAttr attr v) && v.${attr} != null;
|
||||
getIPs =
|
||||
attr: domain:
|
||||
(lib.mapAttrsToList (host: v: "${builtins.getAttr attr v} ${host}.${domain}") (
|
||||
lib.filterAttrs (onNetwork attr) metadata.hosts
|
||||
));
|
||||
in
|
||||
builtins.concatStringsSep "\n" (
|
||||
(getIPs "ts" "shire-zebra.ts.net")
|
||||
++ (getIPs "nebulaIp" "nebula.thehellings.com")
|
||||
++ (getIPs "nebulaIp" "nebula")
|
||||
++ (getIPs "ip" "thehellings.lan")
|
||||
);
|
||||
search = [
|
||||
"thehellings.lan"
|
||||
"home"
|
||||
"nebula.thehellings.com"
|
||||
];
|
||||
networkmanager.enable = false;
|
||||
};
|
||||
@@ -81,6 +101,12 @@
|
||||
# Enable the OpenSSH daemon for remote control
|
||||
services = {
|
||||
locate.enable = true;
|
||||
niks3-auto-upload = {
|
||||
enable = config.greg.nix.cache;
|
||||
authTokenFile = config.age.secrets.niks3-api-token.path;
|
||||
serverUrl = "http://hosea.nebula.thehellings.com:5751";
|
||||
verifyS3Integrity = true;
|
||||
};
|
||||
openssh = {
|
||||
enable = true;
|
||||
settings.X11Forwarding = true;
|
||||
@@ -114,17 +140,23 @@
|
||||
};
|
||||
};
|
||||
|
||||
security.sudo.extraRules = [
|
||||
{
|
||||
users = [ "greg" ];
|
||||
commands = [
|
||||
security = {
|
||||
sudo-rs = {
|
||||
enable = true;
|
||||
extraRules = [
|
||||
{
|
||||
command = "ALL";
|
||||
options = [ "NOPASSWD" ];
|
||||
users = [ "greg" ];
|
||||
commands = [
|
||||
{
|
||||
command = "ALL";
|
||||
options = [ "NOPASSWD" ];
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
};
|
||||
sudo.enable = false;
|
||||
};
|
||||
|
||||
# Define a user account. Don't forget to set a password with ‘passwd’.
|
||||
users.users.greg = {
|
||||
|
||||
+9
-33
@@ -1,5 +1,6 @@
|
||||
{
|
||||
top,
|
||||
lib',
|
||||
metadata,
|
||||
nixpkgs,
|
||||
}:
|
||||
@@ -14,15 +15,22 @@ let
|
||||
}:
|
||||
let
|
||||
inherit (metadata.hosts.${name}) system;
|
||||
pkgs' = top.self.packages.${system};
|
||||
in
|
||||
channel.lib.nixosSystem {
|
||||
pkgs = nixpkgs.${system};
|
||||
specialArgs = {
|
||||
inherit metadata top;
|
||||
inherit
|
||||
metadata
|
||||
top
|
||||
lib'
|
||||
pkgs'
|
||||
;
|
||||
};
|
||||
modules = [
|
||||
{
|
||||
nixpkgs.hostPlatform = system;
|
||||
networking.hostName = name;
|
||||
}
|
||||
# Imported ones
|
||||
top.agenix.nixosModules.default
|
||||
@@ -44,16 +52,6 @@ in
|
||||
})
|
||||
)
|
||||
)
|
||||
// (lib.genAttrs
|
||||
(builtins.attrNames (lib.filterAttrs (_: v: v == "directory") (builtins.readDir ./vm)))
|
||||
(
|
||||
name:
|
||||
(unstable {
|
||||
inherit name;
|
||||
extraMods = [ ./vm/${name} ];
|
||||
})
|
||||
)
|
||||
)
|
||||
// {
|
||||
# nix build '.#nixosConfigurations.wsl.config.system.build.installer'
|
||||
#nixos = wsl { name = "wsl"; };
|
||||
@@ -62,26 +60,4 @@ in
|
||||
# name = "wsl";
|
||||
# system = "aarch64-linux";
|
||||
#};
|
||||
|
||||
builder-aarch = lib.nixosSystem {
|
||||
system = "aarch64-linux";
|
||||
modules = [
|
||||
"${top.nixunstable}/nixos/modules/profiles/nix-builder-vm.nix"
|
||||
{
|
||||
virtualisation.host.pkgs = import top.nixunstable { system = "aarch64-darwin"; };
|
||||
boot.loader.grub.devices = [ "/dev/vda" ];
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
builder-x86 = lib.nixosSystem {
|
||||
system = "x86_64-linux";
|
||||
modules = [
|
||||
"${top.nixunstable}/nixos/modules/profiles/nix-builder-vm.nix"
|
||||
{
|
||||
virtualisation.host.pkgs = import top.nixunstable { system = "aarch64-darwin"; };
|
||||
boot.loader.grub.devices = [ "/dev/vda" ];
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
{ config, modulesPath, pkgs, lib, ... }:
|
||||
{
|
||||
imports = [ (modulesPath + "/virtualisation/proxmox-lxc.nix") ];
|
||||
nix.settings = { sandbox = false; };
|
||||
proxmoxLXC = {
|
||||
manageNetwork = false;
|
||||
privileged = true;
|
||||
};
|
||||
services.fstrim.enable = false; # Let Proxmox host handle fstrim
|
||||
services.openssh = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
settings = {
|
||||
PermitRootLogin = "yes";
|
||||
PasswordAuthentication = true;
|
||||
PermitEmptyPasswords = "yes";
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -18,7 +18,11 @@
|
||||
|
||||
boot = {
|
||||
loader = {
|
||||
systemd-boot.enable = true;
|
||||
systemd-boot = {
|
||||
enable = true;
|
||||
memtest86.enable = true;
|
||||
netbootxyz.enable = true;
|
||||
};
|
||||
efi.canTouchEfiVariables = true;
|
||||
};
|
||||
binfmt.emulatedSystems = [
|
||||
@@ -30,16 +34,15 @@
|
||||
greg = {
|
||||
home = true;
|
||||
gnome.enable = true;
|
||||
nebula = {
|
||||
enable = true;
|
||||
};
|
||||
podman.enable = true;
|
||||
print.enable = true;
|
||||
tailscale = {
|
||||
enable = true;
|
||||
tags = [ "mobile" ];
|
||||
};
|
||||
runner = {
|
||||
enable = true;
|
||||
qemu = true;
|
||||
};
|
||||
};
|
||||
|
||||
hardware = {
|
||||
|
||||
@@ -2,34 +2,18 @@
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ lib, pkgs, ... }:
|
||||
|
||||
let
|
||||
adblockUpdate = pkgs.writeShellApplication {
|
||||
name = "adblock-update";
|
||||
runtimeInputs = with pkgs; [
|
||||
curl
|
||||
gnused
|
||||
systemd
|
||||
];
|
||||
text = ''
|
||||
curl -s https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | sed '1,33d' > /etc/adblock_hosts
|
||||
curl -s https://adaway.org/hosts.txt | sed '1,24d' | sed 's/127.0.0.1/0.0.0.0/' >> /etc/adblock_hosts
|
||||
|
||||
# Custom domains that I need to preserve for some reason
|
||||
for f in "segment.com" "segment.io" "branch.io" "dev.visualwebsiteoptimizer.com"; do
|
||||
sed -i -e "/''${f}/d" /etc/adblock_hosts # Blocks Trelly content for house investors
|
||||
done
|
||||
|
||||
systemctl restart dnsmasq
|
||||
'';
|
||||
};
|
||||
in
|
||||
{
|
||||
top,
|
||||
pkgs,
|
||||
pkgs',
|
||||
...
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
# Include the results of the hardware scan.
|
||||
./hardware-configuration.nix
|
||||
./networking.nix
|
||||
top.minecraft.nixosModules.minecraft-servers
|
||||
];
|
||||
|
||||
greg = {
|
||||
@@ -52,26 +36,121 @@ in
|
||||
};
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
create_ssl
|
||||
pkgs'.create_ssl
|
||||
step-ca
|
||||
];
|
||||
|
||||
networking.hostName = "genesis"; # Define your hostname.
|
||||
|
||||
systemd = {
|
||||
services.adblock-update = {
|
||||
after = [ "network-online.target" ];
|
||||
requires = [ "network-online.target" ];
|
||||
script = lib.getExe adblockUpdate;
|
||||
serviceConfig.Type = "oneshot";
|
||||
};
|
||||
timers.adblock-update = {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "network-online.target" ];
|
||||
requires = [ "network-online.target" ];
|
||||
timerConfig = {
|
||||
OnCalendar = "daily";
|
||||
Unit = "adblock-update.service";
|
||||
services = {
|
||||
minecraft-servers = {
|
||||
enable = true;
|
||||
eula = true;
|
||||
openFirewall = true;
|
||||
|
||||
servers = {
|
||||
maya = {
|
||||
enable = true;
|
||||
operators = {
|
||||
Almec = {
|
||||
bypassesPlayerLimit = true;
|
||||
uuid = "7884dc5a-ae21-43d5-9506-a934d59be19a";
|
||||
};
|
||||
};
|
||||
package = pkgs.fabricServers.fabric.override { jre_headless = pkgs.openjdk25_headless; };
|
||||
|
||||
serverProperties = {
|
||||
allow-flight = true;
|
||||
motd = "Maya's Minecraft World";
|
||||
online-mode = true;
|
||||
};
|
||||
whitelist = { };
|
||||
|
||||
jvmOpts = "-Xms4092M -Xmx4092M";
|
||||
|
||||
symlinks = {
|
||||
mods = pkgs.linkFarmFromDrvs "mods" (
|
||||
builtins.attrValues {
|
||||
# Health info
|
||||
appleskin = pkgs.fetchurl {
|
||||
url = "https://cdn.modrinth.com/data/EsAfCjCV/versions/HwaLJe3v/appleskin-fabric-mc26.1-3.0.9.jar";
|
||||
hash = "sha256-iNCycR/oxqFpbPGfIcfgfWOm7PzPiIu5AmBWb8asTb4=";
|
||||
};
|
||||
# Needed by survivalfly
|
||||
balm = pkgs.fetchurl {
|
||||
url = "https://mediafilez.forgecdn.net/files/7959/843/balm-fabric-26.1.2-26.1.2.4.jar";
|
||||
hash = "sha256-zDtDxkxOftpW0wUIap7l6abGCjXNczwrF2wLZDztyA0=";
|
||||
};
|
||||
# Adds more diverse biomes
|
||||
# https://www.curseforge.com/minecraft/mc-mods/biomes-o-plenty
|
||||
biomes = pkgs.fetchurl {
|
||||
url = "https://mediafilez.forgecdn.net/files/7977/180/BiomesOPlenty-fabric-26.1.2-26.1.2.0.3.jar";
|
||||
hash = "sha256-0aPtsRep0ftbkKqbp69PgUnNJyOBLY9vcPsB1mhOy/M=";
|
||||
};
|
||||
# Automation engines
|
||||
# https://www.curseforge.com/minecraft/mc-mods/create
|
||||
#create = pkgs.fetchurl {
|
||||
# url = "https://mediafilez.forgecdn.net/files/7963/363/create-1.21.1-6.0.10.jar";
|
||||
# hash = "sha256-74f+Vwnxuh9bi7IKKSW1r7RmnheP1ti/EMFndZ7v43o=";
|
||||
#};
|
||||
fabric_api = pkgs.fetchurl {
|
||||
url = "https://cdn.modrinth.com/data/P7dR8mSH/versions/tnmuHGZA/fabric-api-0.146.1%2B26.1.2.jar";
|
||||
hash = "sha256-8Jy/xmxRtw4z4GJ+38wwbXHVn4NGYp4w/mFvW9cmvKg=";
|
||||
};
|
||||
# Required by biomes-o-plenty
|
||||
# https://www.curseforge.com/minecraft/mc-mods/glitchcore
|
||||
glitchcore = pkgs.fetchurl {
|
||||
url = "https://mediafilez.forgecdn.net/files/7975/608/GlitchCore-fabric-26.1.2-26.1.2.0.0.jar";
|
||||
hash = "sha256-IDz+TblWvgt4UxFg3L3DhFMEESoX7y5cTOvXhyccQm8=";
|
||||
};
|
||||
# Tooltips
|
||||
# https://www.curseforge.com/minecraft/mc-mods/jade/
|
||||
jade = pkgs.fetchurl {
|
||||
url = "https://mediafilez.forgecdn.net/files/7886/518/Jade-mc26.1-Fabric-26.0.8.jar";
|
||||
hash = "sha256-Pc3R5eO4Jf+94mNMPtY/vvpbomp+S+qnAUAVbQk1r2Y=";
|
||||
};
|
||||
# Gives info on crafting recipes
|
||||
# https://www.curseforge.com/minecraft/mc-mods/jei
|
||||
jei = pkgs.fetchurl {
|
||||
url = "https://mediafilez.forgecdn.net/files/7920/925/jei-26.1.2-fabric-29.5.0.26.jar";
|
||||
hash = "sha256-7nF7fXYPIg9the/mxi6pUYEmKtosZO6yL2b0Dgf8+fI=";
|
||||
};
|
||||
# Machines
|
||||
# https://www.curseforge.com/minecraft/mc-mods/mekanism
|
||||
#mekanism = pkgs.fetchurl {
|
||||
# url = "https://mediafilez.forgecdn.net/files/7904/58/Mekanism-1.21.1-10.7.19.85.jar";
|
||||
# hash = "sha256-AE28nzEG9NGSrqoe4RkN0W7JyoBZ7T0JO4ADT0xXT0M=";
|
||||
#};
|
||||
# Shows installed mods
|
||||
modmenu = pkgs.fetchurl {
|
||||
url = "https://cdn.modrinth.com/data/mOgUt4GM/versions/jvjwXH6l/modmenu-18.0.0-alpha.8.jar";
|
||||
hash = "sha256-u0gtCOVAnNxyHcslo+y9l/jCGsFb+U/Y8soiUilhZDA=";
|
||||
};
|
||||
# Better storage engines
|
||||
# https://www.curseforge.com/minecraft/mc-mods/refined-storage
|
||||
refined-storage = pkgs.fetchurl {
|
||||
url = "https://mediafilez.forgecdn.net/files/8086/588/refinedstorage-fabric-3.0.0.jar";
|
||||
hash = "sha256-LuOF0aYQon78AQeD5fQ8OXHCnekfa+PNKpH7cqimFNs=";
|
||||
};
|
||||
# https://www.curseforge.com/minecraft/mc-mods/storage-drawers
|
||||
#storagedrawers = pkgs.fetchurl {
|
||||
#url = "https://mediafilez.forgecdn.net/files/7352/799/StorageDrawers-fabric-1.21.11-20.0.0.jar";
|
||||
#hash = "sha256-eBKCmAtjAhdAjOyLMRneu/NZnNt+orIezxPy6V8g/S8=";
|
||||
#};
|
||||
survivalfly = pkgs.fetchurl {
|
||||
url = "https://mediafilez.forgecdn.net/files/7870/312/survivalfly-1.3_fabric-mc26.1.1.jar";
|
||||
hash = "sha256-Kai4wSxckpXbs1yLp8wJ4BmmjNkdDbeqerqWGIz3+Zk=";
|
||||
};
|
||||
# Also needed by biomes
|
||||
# https://www.curseforge.com/minecraft/mc-mods/terrablender-fabric
|
||||
terrablender = pkgs.fetchurl {
|
||||
url = "https://mediafilez.forgecdn.net/files/7933/873/TerraBlender-fabric-26.1.2-26.1.2.0.1.jar";
|
||||
hash = "sha256-lUrkmMIod54Qj78H0rzT4EYoEeiBG7w6sVOJlRvsnQ4=";
|
||||
};
|
||||
}
|
||||
);
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
10.42.1.5 genesis genesis.thehellings.lan dns dns.thehellings.lan smart smart.thehellings.lan speedtest.thehellings.lan nixcache.thehellings.lan gitcache.thehellings.lan
|
||||
10.42.1.6 isaiah isaiah.thehellings.lan minio-01.thehellings.lan
|
||||
10.42.1.7 hosea hosea.thehellings.lan jellyfin jellyfin.thehellings.lan grafana grafana.thehellings.lan
|
||||
10.42.1.8 jeremiah jeremiah.thehellings.lan minio-02.thehellings.lan
|
||||
10.42.1.8 jeremiah jeremiah.thehellings.lan minio-02.thehellings.lan buildbot.thehellings.lan
|
||||
10.42.1.9 ivr ivr.thehellings.lan
|
||||
# 10 - monitor
|
||||
# 11 - old jude
|
||||
@@ -22,8 +22,6 @@
|
||||
|
||||
# VMs
|
||||
10.42.4.1 matrix matrix.thehellings.lan
|
||||
#10.42.4.2 vm-jellyfin vm-jellyfin.thehellings.lan
|
||||
10.42.4.3 git gitlab git.thehellings.lan gitlab.thehellings.lan
|
||||
|
||||
# VIP
|
||||
10.42.5.1 longhorn.cluster matrix.cluster pgadmin.cluter postgres.cluster immich.cluster
|
||||
@@ -35,14 +33,13 @@
|
||||
# Tailscale hosts
|
||||
100.119.228.115 nas.home chronicles.shire-zebra.ts.net
|
||||
100.88.91.27 dns.home
|
||||
100.80.99.48 exodus.home
|
||||
100.96.198.104 genesis.home smart.home zwave.home nixcache.home gitcache.home dashy.home uptime.home speed.home
|
||||
100.117.28.111 gitlab.home gitlab.shire-zebra.ts.net gitlab.thehellings.lan registry.thehellings.lan git.thehellings.lan
|
||||
100.70.99.91 exodus.home exodus.shire-zebra.ts.net
|
||||
100.96.198.104 genesis.home genesis.shire-zebra.ts.net smart.home zwave.home nixcache.home gitcache.home dashy.home uptime.home speed.home
|
||||
100.68.203.1 hosea.home hosea.shire-zebra.ts.net grafana.home
|
||||
100.84.183.79 isaiah.home isaiah.shire-zebra.ts.net pgadmin.kubernetes longhorn.kubernetes
|
||||
100.102.186.39 jeremiah.home jeremiah.shire-zebra.ts.net matrix.kubernetes immich.kubernetes postgres.kubernetes
|
||||
100.90.74.19 zeke.home
|
||||
100.115.57.8 linode.home
|
||||
100.102.186.39 jeremiah.home jeremiah.shire-zebra.ts.net matrix.kubernetes immich.kubernetes postgres.kubernetes buildbot.home
|
||||
100.90.74.19 zeke.home zeke.shire-zebra.ts.net
|
||||
100.109.86.8 linode.home linode.shire-zebra.ts.net
|
||||
100.65.5.38 matrix.home matrix.shire-zebra.ts.net
|
||||
#100.127.55.22 jellyfin.home
|
||||
100.114.187.61 nas1.home nas1.shire-zebra.ts.net
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
lib',
|
||||
metadata,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
@@ -9,7 +11,6 @@ let
|
||||
lanIP = metadata.hosts.${config.networking.hostName}.ip;
|
||||
iot = "enp2s0";
|
||||
iotIP = "192.168.66.250";
|
||||
routerIP = metadata.infra.gw;
|
||||
extraHosts = builtins.readFile ./net/hosts;
|
||||
|
||||
proxyPort = 3128;
|
||||
@@ -21,12 +22,24 @@ let
|
||||
#"1.0.0.1" # Cloudflare
|
||||
#"149.112.112.112" # Quad 9
|
||||
metadata.infra.gw # Currently using our UniFi router for DNS as well
|
||||
"100.100.100.100"
|
||||
];
|
||||
in
|
||||
{
|
||||
greg.tailscale = {
|
||||
enable = true;
|
||||
tags = [ "home" ];
|
||||
greg = {
|
||||
nebula = {
|
||||
enable = true;
|
||||
# genesis IS the routing node for the home LAN — it does not route through itself.
|
||||
# Override the module default (which points at genesis) to avoid a routing loop.
|
||||
unsafeRoutes = [ ];
|
||||
# genesis routes the home LAN (10.42.0.0/16) into the Nebula overlay.
|
||||
# Sign genesis's cert with -subnets '10.42.0.0/16' (see secrets/nebula/README.md).
|
||||
routesSubnet = "10.42.0.0/16";
|
||||
};
|
||||
tailscale = {
|
||||
enable = true;
|
||||
tags = [ "home" ];
|
||||
};
|
||||
};
|
||||
|
||||
# Really, why do I still have to force-disable this crap?
|
||||
@@ -81,49 +94,51 @@ in
|
||||
environment.etc."hosts.d/local".text = extraHosts;
|
||||
|
||||
services = {
|
||||
kea = {
|
||||
dhcp4 = (
|
||||
import ./networking/dhcp.nix {
|
||||
inherit
|
||||
iot
|
||||
lan
|
||||
lanIP
|
||||
routerIP
|
||||
;
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
#########
|
||||
# dnsmasq config
|
||||
########
|
||||
dnsmasq = {
|
||||
bind = {
|
||||
enable = true;
|
||||
settings = {
|
||||
domain = "thehellings.lan";
|
||||
expand-hosts = true;
|
||||
log-queries = true;
|
||||
no-hosts = true; # Do not read /etc/hosts, which makes genesis resolve to 127.0.0.2
|
||||
addn-hosts = "/etc/adblock_hosts";
|
||||
hostsdir = "/etc/hosts.d/";
|
||||
server = dnsServers;
|
||||
};
|
||||
};
|
||||
|
||||
prometheus.exporters = {
|
||||
dnsmasq.enable = true;
|
||||
blackbox = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
configFile = pkgs.writeText "blackbox.yml" ''
|
||||
modules:
|
||||
icmp:
|
||||
prober: icmp
|
||||
timeout: 5s
|
||||
icmp:
|
||||
preferred_ip_protocol: ip4
|
||||
'';
|
||||
};
|
||||
cacheNetworks = [
|
||||
metadata.infra.lan
|
||||
metadata.infra.tailscale
|
||||
metadata.infra.nebula
|
||||
"127.0.0.0/8"
|
||||
];
|
||||
zones =
|
||||
let
|
||||
makeZoneFile =
|
||||
hosts: domain:
|
||||
let
|
||||
preamble = [
|
||||
"$ORIGIN\t${domain}."
|
||||
"$TTL\t1h"
|
||||
"@\tIN\tSOA\t${config.networking.hostName}\tgreg@thehellings.com (1 1m 1m 1m 1m)"
|
||||
"\tIN\tNS\t${config.networking.hostName}"
|
||||
];
|
||||
makeHost =
|
||||
host:
|
||||
[ "${host.name}\tIN\tA\t${host.address}" ]
|
||||
++ lib.map (a: "${a}\tIN\tA\t${host.address}") (
|
||||
if builtins.hasAttr "aliases" host then host.aliases else [ ]
|
||||
);
|
||||
in
|
||||
pkgs.writeText "${domain}" (
|
||||
builtins.concatStringsSep "\n" (preamble ++ (lib.flatten (lib.map makeHost hosts)) ++ [ "" ])
|
||||
);
|
||||
in
|
||||
lib.mapAttrs
|
||||
(domain: net: {
|
||||
master = true;
|
||||
file = makeZoneFile (lib'.hostsByNet net metadata.hosts) domain;
|
||||
})
|
||||
{
|
||||
"shire-zebra.ts.net" = "tailscale";
|
||||
"nebula.thehellings.com" = "nebula";
|
||||
nebula = "nebula";
|
||||
"thehellings.lan" = "lan";
|
||||
lan = "lan";
|
||||
};
|
||||
};
|
||||
}; # End of services configuration
|
||||
|
||||
|
||||
@@ -0,0 +1,161 @@
|
||||
{
|
||||
config,
|
||||
modulesPath,
|
||||
lib,
|
||||
top,
|
||||
...
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
(modulesPath + "/virtualisation/proxmox-lxc.nix")
|
||||
top.hermes.nixosModules.default
|
||||
];
|
||||
age.secrets.hermes = {
|
||||
file = ../../../secrets/hermes.age;
|
||||
owner = "hermes";
|
||||
};
|
||||
greg = {
|
||||
nebula = {
|
||||
enable = true;
|
||||
nebulaIp = "10.157.0.8";
|
||||
};
|
||||
nix.cache = false;
|
||||
proxies = lib.genAttrs' [ "thehellings.lan" "nebula.thehellings.com" "shire-zebra.ts.net" ] (
|
||||
name:
|
||||
(lib.nameValuePair "${config.networking.hostName}.${name}" { target = "http://127.0.0.1:9119"; })
|
||||
);
|
||||
};
|
||||
nix.settings = {
|
||||
sandbox = false;
|
||||
};
|
||||
proxmoxLXC = {
|
||||
manageHostName = true;
|
||||
manageNetwork = false;
|
||||
privileged = true;
|
||||
};
|
||||
services = {
|
||||
fstrim.enable = false;
|
||||
hermes-agent = {
|
||||
enable = true;
|
||||
addToSystemPackages = true;
|
||||
environment = {
|
||||
MATRIX_HOMESERVER = "https://thehellings.com";
|
||||
};
|
||||
environmentFiles = [
|
||||
config.age.secrets.hermes.path
|
||||
];
|
||||
settings = {
|
||||
agent = {
|
||||
reasoning_effort = "medium";
|
||||
reasoning_overrides = {
|
||||
claude-fable = "xhigh";
|
||||
claude-opus = "high";
|
||||
};
|
||||
tool_loop_guardrails = {
|
||||
hard_stop_enabled = true;
|
||||
warnings_enabled = true;
|
||||
};
|
||||
tool_use_enforcement = "auto";
|
||||
};
|
||||
code_execution = {
|
||||
mode = "strict";
|
||||
timeout = 300;
|
||||
};
|
||||
compression = {
|
||||
enabled = true;
|
||||
protect_first_n = 3;
|
||||
protect_last_n = 5;
|
||||
target_ratio = 0.25;
|
||||
threshold = 0.75;
|
||||
};
|
||||
context_file_max_chars = 25000;
|
||||
file_read_max_chars = 100000;
|
||||
goals = {
|
||||
max_turns = 20; # Number of times Hermes tells the model to keep working towards the goal
|
||||
};
|
||||
matrix = {
|
||||
allowed_users = [
|
||||
"@greg:thehellings.com"
|
||||
];
|
||||
allowed_rooms = [
|
||||
"!agents:thehellings.com"
|
||||
];
|
||||
free_response_rooms = [
|
||||
"!agents:thehellings.com"
|
||||
];
|
||||
require_mention = true;
|
||||
};
|
||||
memory = {
|
||||
memory_enabled = true;
|
||||
user_profile_enabled = true;
|
||||
write_approval = true;
|
||||
};
|
||||
model.default = "anthropic/claude-opus-4.8";
|
||||
quick_commands = {
|
||||
disk = {
|
||||
type = "exec";
|
||||
command = "df -h";
|
||||
};
|
||||
free = {
|
||||
type = "exec";
|
||||
command = "free -h";
|
||||
};
|
||||
restart = {
|
||||
type = "alias";
|
||||
target = "/gateway restart";
|
||||
};
|
||||
};
|
||||
skills = {
|
||||
guard_agent_created = true;
|
||||
write_approval = true;
|
||||
};
|
||||
stt = {
|
||||
enabled = true;
|
||||
echo_transcripts = true;
|
||||
provider = "local";
|
||||
local.model = "medium";
|
||||
};
|
||||
terminal = {
|
||||
backend = "local";
|
||||
};
|
||||
tool_output = {
|
||||
max_bytes = 50000;
|
||||
max_lines = 2000;
|
||||
max_line_length = 2000;
|
||||
};
|
||||
toolsets = [ "all" ];
|
||||
worktree = true; # Enable multiple agents in the same repo
|
||||
};
|
||||
};
|
||||
nebula.networks."nebula.thehellings.com" = {
|
||||
tun.disable = true;
|
||||
};
|
||||
openssh = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
settings = {
|
||||
PermitRootLogin = "yes";
|
||||
PasswordAuthentication = true;
|
||||
PermitEmptyPasswords = "yes";
|
||||
};
|
||||
};
|
||||
wyoming.faster-whisper.servers.medium = {
|
||||
enable = true;
|
||||
device = "cpu";
|
||||
initialPrompt = ''
|
||||
The user's name is 'Greg Hellings'. The street he lives on is 'Kardinal Court'
|
||||
in 'Midlothian'. Keep these in mind as they are often misspelled.
|
||||
'';
|
||||
language = "en";
|
||||
model = "medium";
|
||||
uri = "tcp://127.0.0.1:10300";
|
||||
sttLibrary = "faster-whisper";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.suppressedSystemUnits = [
|
||||
"dev-mqueue.mount"
|
||||
"sys-kernel-debug.mount"
|
||||
"sys-fs-fuse-connections.mount"
|
||||
];
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
metadata,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
ips = lib.filterAttrs (_k: v: v ? "ip" && v.ip != null) metadata.hosts;
|
||||
tps = lib.filterAttrs (_k: v: v ? "ts" && v.ts != null) metadata.hosts;
|
||||
get = field: set: lib.mapAttrsToList (_k: v: v.${field}) set;
|
||||
getTS = get "ts" tps;
|
||||
getIP = get "ip" ips;
|
||||
whitelists = builtins.concatStringsSep "," (
|
||||
[
|
||||
"localhost"
|
||||
"127.0.0.1"
|
||||
]
|
||||
++ getTS
|
||||
++ getIP
|
||||
);
|
||||
in
|
||||
{
|
||||
services = {
|
||||
prowlarr = {
|
||||
enable = true;
|
||||
dataDir = "/arr/prowlarr";
|
||||
openFirewall = true;
|
||||
};
|
||||
radarr = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
};
|
||||
transmission = {
|
||||
enable = true;
|
||||
openPeerPorts = true;
|
||||
openRPCPort = true;
|
||||
package = pkgs.transmission_4;
|
||||
settings = {
|
||||
download-dir = "/arr/transmission/downloads";
|
||||
rpc-bind-address = "0.0.0.0";
|
||||
rpc-host-whitelist = whitelists;
|
||||
rpc-host-whitelist-enabled = false;
|
||||
rpc-whitelist = whitelists;
|
||||
rpc-whitelist-enabled = false;
|
||||
watch-dir-enabled = true;
|
||||
watch-dir = "/arr/transmission/incoming";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
systemd.mounts =
|
||||
let
|
||||
nfs = name: {
|
||||
what = "nas1.shire-zebra.ts.net:/mnt/all/${name}";
|
||||
type = "nfs";
|
||||
name = "${name}.mount";
|
||||
where = "/${name}";
|
||||
requires = [ "tailscaled-autoconnect.service" ];
|
||||
after = [ "tailscaled-autoconnect.service" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
mountConfig.Options = "_netdev,noexec,timeo=50,retrans=5,soft";
|
||||
};
|
||||
in
|
||||
[
|
||||
(nfs "arr")
|
||||
(nfs "music")
|
||||
(nfs "photos")
|
||||
(nfs "video")
|
||||
];
|
||||
}
|
||||
@@ -6,6 +6,7 @@
|
||||
config,
|
||||
metadata,
|
||||
pkgs,
|
||||
top,
|
||||
...
|
||||
}:
|
||||
let
|
||||
@@ -17,13 +18,31 @@ in
|
||||
{
|
||||
imports = [
|
||||
# Include the results of the hardware scan.
|
||||
./arr.nix
|
||||
./hardware-configuration.nix
|
||||
top.niks3.nixosModules.niks3
|
||||
];
|
||||
|
||||
age.secrets.grafana-secret-key = {
|
||||
file = ../../../secrets/grafana-secret-key.age;
|
||||
owner = "grafana";
|
||||
age.secrets = {
|
||||
cache-private-key = {
|
||||
file = ../../../secrets/cache-private-key.age;
|
||||
owner = "niks3";
|
||||
};
|
||||
grafana-secret-key = {
|
||||
file = ../../../secrets/grafana-secret-key.age;
|
||||
owner = "grafana";
|
||||
};
|
||||
niks3-access-key-id = {
|
||||
file = ../../../secrets/niks3/access_key_id.age;
|
||||
owner = "niks3";
|
||||
};
|
||||
niks3-api-token = {
|
||||
file = ../../../secrets/niks3/api_token.age;
|
||||
owner = "niks3";
|
||||
};
|
||||
niks3-secret-access-key = {
|
||||
file = ../../../secrets/niks3/secret_access_key.age;
|
||||
owner = "niks3";
|
||||
};
|
||||
};
|
||||
|
||||
# Bootloader
|
||||
@@ -49,6 +68,7 @@ in
|
||||
|
||||
greg = {
|
||||
home = true;
|
||||
nebula.enable = true;
|
||||
proxies = {
|
||||
"jellyfin.home".target = "http://localhost:8096/";
|
||||
"jellyfin.thehellings.lan".target = "http://localhost:8096/";
|
||||
@@ -59,6 +79,12 @@ in
|
||||
enable = true;
|
||||
tags = [ "home" ];
|
||||
};
|
||||
backup.jobs.albyhub = {
|
||||
src = "/chain/alby";
|
||||
dest = "albyhub";
|
||||
pre = "systemctl stop albyhub || true";
|
||||
post = "systemctl start albyhub";
|
||||
};
|
||||
};
|
||||
|
||||
hardware = {
|
||||
@@ -91,6 +117,7 @@ in
|
||||
];
|
||||
};
|
||||
};
|
||||
firewall.interfaces.nebula0.allowedTCPPorts = [ 5751 ];
|
||||
nameservers = [ metadata.infra.dns ];
|
||||
};
|
||||
|
||||
@@ -143,6 +170,27 @@ in
|
||||
analytics.reporting_enabled = false;
|
||||
};
|
||||
};
|
||||
niks3 = {
|
||||
enable = true;
|
||||
|
||||
apiTokenFile = config.age.secrets.niks3-api-token.path;
|
||||
gc.enable = false;
|
||||
httpAddr = "${metadata.hosts.hosea.nebulaIp}:5751";
|
||||
nginx = {
|
||||
enable = true;
|
||||
domain = "hosea.nebula";
|
||||
enableACME = false;
|
||||
forceSSL = false;
|
||||
};
|
||||
s3 = {
|
||||
accessKeyFile = config.age.secrets.niks3-access-key-id.path;
|
||||
bucket = "niks3";
|
||||
endpoint = "nas1.shire-zebra.ts.net:30188";
|
||||
secretKeyFile = config.age.secrets.niks3-secret-access-key.path;
|
||||
useSSL = false;
|
||||
};
|
||||
signKeyFiles = [ config.age.secrets.cache-private-key.path ];
|
||||
};
|
||||
prometheus.exporters.graphite.enable = true;
|
||||
# Configure keymap
|
||||
xserver.xkb = {
|
||||
@@ -151,6 +199,25 @@ in
|
||||
};
|
||||
};
|
||||
|
||||
systemd.mounts =
|
||||
let
|
||||
nfs = name: {
|
||||
what = "nas1.shire-zebra.ts.net:/mnt/all/${name}";
|
||||
type = "nfs";
|
||||
name = "${name}.mount";
|
||||
where = "/${name}";
|
||||
requires = [ "tailscaled-autoconnect.service" ];
|
||||
after = [ "tailscaled-autoconnect.service" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
mountConfig.Options = "_netdev,noexec,timeo=50,retrans=5,soft";
|
||||
};
|
||||
in
|
||||
[
|
||||
(nfs "music")
|
||||
(nfs "photos")
|
||||
(nfs "video")
|
||||
];
|
||||
|
||||
# After first deploy: create a Grafana service account + API token for Klaatu
|
||||
# via the Grafana UI, then encrypt it: agenix -e secrets/grafana-api-token.age
|
||||
age.secrets.grafana-api-token = {
|
||||
@@ -285,7 +352,7 @@ in
|
||||
"uid": "kubernetes-overview",
|
||||
"title": "Kubernetes Overview",
|
||||
"schemaVersion": 38,
|
||||
"version": 2,
|
||||
"version": 3,
|
||||
"refresh": "30s",
|
||||
"time": {"from": "now-3h", "to": "now"},
|
||||
"panels": [
|
||||
@@ -390,6 +457,41 @@ in
|
||||
"title": "Node Memory Usage %",
|
||||
"gridPos": {"x": 12, "y": 38, "w": 12, "h": 8},
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100", "refId": "A"}]
|
||||
},
|
||||
{
|
||||
"id": 12,
|
||||
"type": "bargauge",
|
||||
"title": "Top 5 Fullest PersistentVolumes",
|
||||
"gridPos": {"x": 0, "y": 46, "w": 24, "h": 8},
|
||||
"targets": [
|
||||
{
|
||||
"datasource": {"type": "prometheus", "uid": "prometheus"},
|
||||
"expr": "topk(5, kubelet_volume_stats_used_bytes / kubelet_volume_stats_capacity_bytes * 100)",
|
||||
"legendFormat": "{{namespace}}/{{persistentvolumeclaim}}",
|
||||
"refId": "A",
|
||||
"instant": true
|
||||
}
|
||||
],
|
||||
"options": {
|
||||
"reduceOptions": {"calcs": ["lastNotNull"]},
|
||||
"orientation": "horizontal",
|
||||
"displayMode": "gradient"
|
||||
},
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"unit": "percent",
|
||||
"min": 0,
|
||||
"max": 100,
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{"color": "green", "value": null},
|
||||
{"color": "yellow", "value": 70},
|
||||
{"color": "red", "value": 90}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -400,44 +502,44 @@ in
|
||||
"uid": "network-overview",
|
||||
"title": "Network & UniFi",
|
||||
"schemaVersion": 38,
|
||||
"version": 2,
|
||||
"version": 3,
|
||||
"refresh": "30s",
|
||||
"time": {"from": "now-3h", "to": "now"},
|
||||
"panels": [
|
||||
{
|
||||
"id": 1,
|
||||
"type": "stat",
|
||||
"title": "DNS Queries/s",
|
||||
"type": "timeseries",
|
||||
"title": "DNS Queries",
|
||||
"gridPos": {"x": 0, "y": 0, "w": 6, "h": 4},
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "rate(dnsmasq_queries_total[5m]) or vector(0)", "refId": "A"}]
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "rate(dnsmasq_servers_queries[5m]) or vector(0)", "refId": "A"}]
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"type": "stat",
|
||||
"title": "UniFi Devices",
|
||||
"gridPos": {"x": 6, "y": 0, "w": 6, "h": 4},
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "count(unifipoller_device_uptime_seconds) or vector(0)", "refId": "A"}]
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "count(unpoller_device_uptime_seconds) or vector(0)", "refId": "A"}]
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"type": "stat",
|
||||
"title": "WiFi Clients",
|
||||
"gridPos": {"x": 12, "y": 0, "w": 6, "h": 4},
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "count(unifipoller_client_wifi_tx_rate_bps) or vector(0)", "refId": "A"}]
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "count(unpoller_client_uptime_seconds{wired=\"false\"}) or vector(0)", "refId": "A"}]
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"type": "stat",
|
||||
"title": "Wired Clients",
|
||||
"gridPos": {"x": 18, "y": 0, "w": 6, "h": 4},
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "count(unifipoller_client_wired_tx_rate_bps) or vector(0)", "refId": "A"}]
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "count(unpoller_client_uptime_seconds{wired=\"true\"}) or vector(0)", "refId": "A"}]
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"type": "timeseries",
|
||||
"title": "WAN RX (bytes/s)",
|
||||
"gridPos": {"x": 0, "y": 4, "w": 12, "h": 8},
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "rate(unifipoller_device_wan_receive_bytes_total[5m])", "legendFormat": "{{name}}", "refId": "A"}],
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "unpoller_device_wan_receive_rate_bytes", "legendFormat": "{{name}}", "refId": "A"}],
|
||||
"fieldConfig": {"defaults": {"unit": "Bps"}}
|
||||
},
|
||||
{
|
||||
@@ -445,7 +547,7 @@ in
|
||||
"type": "timeseries",
|
||||
"title": "WAN TX (bytes/s)",
|
||||
"gridPos": {"x": 12, "y": 4, "w": 12, "h": 8},
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "rate(unifipoller_device_wan_transmit_bytes_total[5m])", "legendFormat": "{{name}}", "refId": "A"}],
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "unpoller_device_wan_transmit_rate_bytes", "legendFormat": "{{name}}", "refId": "A"}],
|
||||
"fieldConfig": {"defaults": {"unit": "Bps"}}
|
||||
},
|
||||
{
|
||||
@@ -453,21 +555,23 @@ in
|
||||
"type": "timeseries",
|
||||
"title": "UniFi Port RX (bytes/s)",
|
||||
"gridPos": {"x": 0, "y": 12, "w": 12, "h": 8},
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "rate(unifipoller_port_receive_bytes_total[5m])", "legendFormat": "{{port_id}} {{name}}", "refId": "A"}]
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "rate(unpoller_device_port_receive_bytes_total[5m])", "legendFormat": "{{port_id}} {{name}}", "refId": "A"}],
|
||||
"fieldConfig": {"defaults": {"unit": "Bps"}}
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"type": "timeseries",
|
||||
"title": "UniFi Port TX (bytes/s)",
|
||||
"gridPos": {"x": 12, "y": 12, "w": 12, "h": 8},
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "rate(unifipoller_port_transmit_bytes_total[5m])", "legendFormat": "{{port_id}} {{name}}", "refId": "A"}]
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "rate(unpoller_device_port_transmit_bytes_total[5m])", "legendFormat": "{{port_id}} {{name}}", "refId": "A"}],
|
||||
"fieldConfig": {"defaults": {"unit": "Bps"}}
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"type": "timeseries",
|
||||
"title": "Top Client Throughput (bytes/s)",
|
||||
"gridPos": {"x": 0, "y": 20, "w": 24, "h": 8},
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "topk(10, rate(unifipoller_client_receive_bytes_total[5m]) + rate(unifipoller_client_transmit_bytes_total[5m]))", "legendFormat": "{{name}} {{ip}}", "refId": "A"}],
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "topk(10, rate(unpoller_client_receive_bytes_total[5m]) + rate(unpoller_client_transmit_bytes_total[5m]))", "legendFormat": "{{name}} {{ip}}", "refId": "A"}],
|
||||
"fieldConfig": {"defaults": {"unit": "Bps"}}
|
||||
},
|
||||
{
|
||||
@@ -482,7 +586,7 @@ in
|
||||
"type": "table",
|
||||
"title": "Device Status",
|
||||
"gridPos": {"x": 12, "y": 28, "w": 12, "h": 8},
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "unifipoller_device_uptime_seconds", "instant": true, "refId": "A"}],
|
||||
"targets": [{"datasource": {"type": "prometheus", "uid": "prometheus"}, "expr": "unpoller_device_uptime_seconds", "instant": true, "refId": "A"}],
|
||||
"fieldConfig": {"defaults": {"unit": "s"}}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -9,12 +9,6 @@
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
|
||||
age.secrets = {
|
||||
gitea-runner-isaiah-podman.file = ../../../secrets/gitea/runner-isaiah-podman.age;
|
||||
gitea-workerPassword.file = ../../../secrets/gitea/workerPassword.age;
|
||||
runner-reg.file = ../../../secrets/gitlab/kubernetes-k3s-local.age;
|
||||
};
|
||||
|
||||
boot = {
|
||||
binfmt.emulatedSystems = [ "aarch64-linux" ];
|
||||
extraModprobeConfig = "options kvm_amd nested=1";
|
||||
@@ -42,15 +36,16 @@
|
||||
vip = metadata.hosts.${config.networking.hostName}.ip;
|
||||
priority = 255;
|
||||
};
|
||||
nebula.enable = true;
|
||||
podman.enable = true;
|
||||
tailscale = {
|
||||
enable = true;
|
||||
tags = [ "home" ];
|
||||
};
|
||||
remote-builder.enable = true;
|
||||
runner = {
|
||||
gitea-runner = {
|
||||
enable = true;
|
||||
qemu = true;
|
||||
extraLabels = [ "bare-metal:host" ];
|
||||
};
|
||||
};
|
||||
|
||||
@@ -66,41 +61,6 @@
|
||||
};
|
||||
|
||||
services = {
|
||||
gitea-actions-runner.instances.podman = {
|
||||
enable = true;
|
||||
labels = [
|
||||
"debian-latest:docker://node:25-trixie"
|
||||
|
||||
"ubuntu-latest:docker://docker.gitea.com/runner-images:ubuntu-latest"
|
||||
"ubuntu-24.04:docker://docker.gitea.com/runner-images:ubuntu-24.04"
|
||||
"ubuntu-22.04:docker://docker.gitea.com/runner-images:ubuntu-22.04"
|
||||
|
||||
"ubuntu-full-latest:docker://ghcr.io/catthehacker/ubuntu:full-latest"
|
||||
"ubuntu-full-24.04:docker://ghcr.io/catthehacker/ubuntu:full-24.04"
|
||||
"ubuntu-full-22.04:docker://ghcr.io/catthehacker/ubuntu:full-22.04"
|
||||
|
||||
"ubuntu-act-latest:docker://ghcr.io/catthehacker/ubuntu:act-latest"
|
||||
"ubuntu-act-24.04:docker://ghcr.io/catthehacker/ubuntu:act-24.04"
|
||||
"ubuntu-act-22.04:docker://ghcr.io/catthehacker/ubuntu:act-22.04"
|
||||
|
||||
"ubuntu-runner-latest:docker://ghcr.io/catthehacker/ubuntu:runner-latest"
|
||||
"ubuntu-runner-24.04:docker://ghcr.io/catthehacker/ubuntu:runner-24.04"
|
||||
"ubuntu-runner-22.04:docker://ghcr.io/catthehacker/ubuntu:runner-22.04"
|
||||
|
||||
"ubuntu-rust-latest:docker://ghcr.io/catthehacker/ubuntu:rust-latest"
|
||||
"ubuntu-rust-24.04:docker://ghcr.io/catthehacker/ubuntu:rust-24.04"
|
||||
"ubuntu-rust-22.04:docker://ghcr.io/catthehacker/ubuntu:rust-22.04"
|
||||
|
||||
"nix-latest:docker://src.thehellings.com/greg/builder:latest"
|
||||
];
|
||||
name = "isaiah-podman";
|
||||
settings = {
|
||||
container.force_pull = true;
|
||||
runner.capacity = 7;
|
||||
};
|
||||
tokenFile = config.age.secrets.gitea-runner-isaiah-podman.path;
|
||||
url = "https://gitea.shire-zebra.ts.net";
|
||||
};
|
||||
k3s.clusterInit = true; # This is the first node in the cluster
|
||||
openssh = {
|
||||
enable = true;
|
||||
|
||||
@@ -22,8 +22,6 @@ in
|
||||
];
|
||||
|
||||
age.secrets = {
|
||||
runner-reg.file = ../../../secrets/gitlab/nixos-qemu-shell.age;
|
||||
|
||||
gitea-buildbotWorkersFile = mk ../../../secrets/gitea/buildbotWorkersFile.age;
|
||||
gitea-oauthToken = mk ../../../secrets/gitea/oauthToken.age;
|
||||
gitea-oauthSecret = mk ../../../secrets/gitea/oauthSecret.age;
|
||||
@@ -78,6 +76,10 @@ in
|
||||
};
|
||||
|
||||
greg = {
|
||||
gitea-runner = {
|
||||
enable = true;
|
||||
extraLabels = [ "bare-metal:host" ];
|
||||
};
|
||||
home = true;
|
||||
kubernetes = {
|
||||
enable = true;
|
||||
@@ -85,16 +87,12 @@ in
|
||||
vip = ip;
|
||||
priority = 254;
|
||||
};
|
||||
nebula.enable = true;
|
||||
tailscale = {
|
||||
enable = true;
|
||||
tags = [ "home" ];
|
||||
};
|
||||
remote-builder.enable = true;
|
||||
runner = {
|
||||
enable = true;
|
||||
threads = 3;
|
||||
qemu = true;
|
||||
};
|
||||
};
|
||||
|
||||
hardware = {
|
||||
@@ -115,6 +113,7 @@ in
|
||||
interface = "br0";
|
||||
};
|
||||
firewall.allowedTCPPorts = [
|
||||
8010
|
||||
3389
|
||||
9989 # buildbot communications port
|
||||
];
|
||||
@@ -148,7 +147,7 @@ in
|
||||
evalWorkerCount = 4;
|
||||
gitea = {
|
||||
enable = true;
|
||||
instanceUrl = "https://src.thehellings.com";
|
||||
instanceUrl = "https://gitea.shire-zebra.ts.net";
|
||||
oauthId = "7ec9107d-379b-47c8-870f-1191956d0500";
|
||||
oauthSecretFile = config.age.secrets.gitea-oauthSecret.path;
|
||||
tokenFile = config.age.secrets.gitea-oauthToken.path;
|
||||
|
||||
@@ -24,8 +24,19 @@
|
||||
];
|
||||
|
||||
greg = {
|
||||
gitea-runner = {
|
||||
enable = true;
|
||||
extraLabels = [
|
||||
"vps:host"
|
||||
"blog:host"
|
||||
];
|
||||
};
|
||||
home = false;
|
||||
linode.enable = true;
|
||||
nebula = {
|
||||
enable = true;
|
||||
isLighthouse = true;
|
||||
};
|
||||
proxies."immich.thehellings.com" = {
|
||||
genAliases = false;
|
||||
target = "http://localhost:${builtins.toString config.services.immich-public-proxy.port}";
|
||||
@@ -55,20 +66,4 @@
|
||||
immichUrl = "https://immich.shire-zebra.ts.net";
|
||||
};
|
||||
};
|
||||
|
||||
security.sudo.extraRules = [
|
||||
{
|
||||
users = [ "gitlab-runner" ];
|
||||
commands = [
|
||||
{
|
||||
command = "/run/current-system/sw/bin/systemctl";
|
||||
options = [ "NOPASSWD" ];
|
||||
}
|
||||
{
|
||||
command = "/run/current-system/sw/bin/podman";
|
||||
options = [ "NOPASSWD" ];
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{ ... }:
|
||||
{ config, ... }:
|
||||
|
||||
let
|
||||
srcDomain = "src.thehellings.com";
|
||||
@@ -6,15 +6,23 @@ let
|
||||
in
|
||||
{
|
||||
greg.proxies."${srcDomain}" = {
|
||||
target = "https://gitea.shire-zebra.ts.net";
|
||||
target = "http://unix:${config.services.anubis.instances.git.settings.BIND}";
|
||||
ssl = true;
|
||||
genAliases = false;
|
||||
extraConfig = ''
|
||||
proxy_ssl_verify off;
|
||||
proxy_ssl_server_name on;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Ssl on;
|
||||
#proxy_ssl_verify off;
|
||||
#proxy_ssl_server_name on;
|
||||
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Http-Version $server_protocol;
|
||||
proxy_set_header User-Agent $http_user_agent;
|
||||
client_max_body_size 100000m;
|
||||
|
||||
#proxy_set_header Host $host;
|
||||
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
#proxy_set_header X-Forwarded-Proto $scheme;
|
||||
#proxy_set_header X-Forwarded-Ssl on;
|
||||
|
||||
# Ultimate AI Block List v1.7 20250924
|
||||
# https://perishablepress.com/ultimate-ai-block-list/
|
||||
|
||||
@@ -87,6 +95,44 @@ in
|
||||
|
||||
networking.firewall.allowedTCPPorts = [ sshPort ];
|
||||
|
||||
services = {
|
||||
anubis = {
|
||||
instances = {
|
||||
git = {
|
||||
enable = true;
|
||||
settings = {
|
||||
BIND = "/run/anubis/anubis-git/anubis.sock";
|
||||
COOKIE_DOMAIN = "thehellings.com";
|
||||
SERVE_ROBOTS_TXT = true;
|
||||
TARGET = "https://gitea.shire-zebra.ts.net/";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
haproxy = {
|
||||
enable = true;
|
||||
config = ''
|
||||
global
|
||||
daemon
|
||||
maxconn 20
|
||||
|
||||
defaults
|
||||
timeout connect 500s
|
||||
timeout client 500s
|
||||
timeout server 1h
|
||||
|
||||
listen gitsshd
|
||||
bind *:${toString sshPort}
|
||||
timeout client 1h
|
||||
mode tcp
|
||||
server git-isaiah isaiah.shire-zebra.ts.net:32222
|
||||
server git-jeremiah jeremiah.shire-zebra.ts.net:32222
|
||||
server git-zeke zeke.shire-zebra.ts.net:32222
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
systemd.services = {
|
||||
haproxy = {
|
||||
after = [
|
||||
@@ -98,25 +144,5 @@ in
|
||||
};
|
||||
};
|
||||
|
||||
services.haproxy = {
|
||||
enable = true;
|
||||
config = ''
|
||||
global
|
||||
daemon
|
||||
maxconn 20
|
||||
|
||||
defaults
|
||||
timeout connect 500s
|
||||
timeout client 500s
|
||||
timeout server 1h
|
||||
|
||||
listen gitsshd
|
||||
bind *:${toString sshPort}
|
||||
timeout client 1h
|
||||
mode tcp
|
||||
server git-isaiah isaiah.shire-zebra.ts.net:32222
|
||||
server git-jeremiah jeremiah.shire-zebra.ts.net:32222
|
||||
server git-zeke zeke.shire-zebra.ts.net:32222
|
||||
'';
|
||||
};
|
||||
users.users.nginx.extraGroups = [ config.users.groups.anubis.name ];
|
||||
}
|
||||
|
||||
@@ -2,12 +2,24 @@
|
||||
# them by the following commands:
|
||||
# nix run nixpkgs.matrix-synapse
|
||||
# register_new_matrix_user -k "B9EoPr2WV9hzwc7uL2Sx1JmvCeKDEOGCpB0uginQcQtEH4wzRtkSIdo7lltrjSQa" http://localhost:8448
|
||||
{ config, lib, ... }:
|
||||
{ config, ... }:
|
||||
let
|
||||
domain = "${config.networking.domain}";
|
||||
fqdn = "matrix.${domain}";
|
||||
in
|
||||
{
|
||||
greg.proxies."${fqdn}" = {
|
||||
extraConfig = ''
|
||||
error_log /var/log/nginx/debug.log debug;
|
||||
proxy_ssl_verify off;
|
||||
proxy_ssl_server_name on;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Ssl on;
|
||||
'';
|
||||
genAliases = false;
|
||||
ssl = true;
|
||||
target = "https://matrix.shire-zebra.ts.net";
|
||||
};
|
||||
services.nginx = {
|
||||
virtualHosts = {
|
||||
# Server the '.well-known' files to find the Matrix API server
|
||||
@@ -44,36 +56,6 @@ in
|
||||
return 200 '${builtins.toJSON client}';
|
||||
'';
|
||||
};
|
||||
|
||||
# Reverse proxy in front of the actual Matrix server
|
||||
"${fqdn}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
|
||||
extraConfig = ''
|
||||
error_log /var/log/nginx/debug.log debug;
|
||||
'';
|
||||
|
||||
# Not the appropriate place for the chat client
|
||||
locations =
|
||||
(builtins.listToAttrs (
|
||||
builtins.map
|
||||
(
|
||||
val:
|
||||
lib.nameValuePair "/_${val}" {
|
||||
proxyPass = "http://matrix.kubernetes";
|
||||
}
|
||||
)
|
||||
[
|
||||
"matrix"
|
||||
"synapse"
|
||||
"dendrite"
|
||||
]
|
||||
))
|
||||
// {
|
||||
"/".extraConfig = "return 404;";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
services.nextcloud = {
|
||||
enable = true;
|
||||
package = pkgs.nextcloud32;
|
||||
package = pkgs.nextcloud33;
|
||||
appstoreEnable = true;
|
||||
hostName = "next.${config.networking.domain}";
|
||||
https = true;
|
||||
|
||||
@@ -24,7 +24,6 @@ in
|
||||
virtualisation.oci-containers = {
|
||||
backend = "podman";
|
||||
containers."homepage" = {
|
||||
# needs explicit port to match what gitlab-runner sees when pulling
|
||||
image = "registry.thehellings.com:443/greg/homepage/gregs-homepage:latest";
|
||||
ports = [ "${homepage}:80" ];
|
||||
};
|
||||
@@ -35,10 +34,5 @@ in
|
||||
ssl = true;
|
||||
genAliases = false;
|
||||
};
|
||||
"doubles.thehellings.com" = {
|
||||
target = "http://localhost:8081";
|
||||
ssl = true;
|
||||
genAliases = false;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
pkgs',
|
||||
...
|
||||
}:
|
||||
|
||||
{
|
||||
environment.systemPackages = [ pkgs.upgrade-pg-cluster ];
|
||||
environment.systemPackages = [ pkgs'.upgrade-pg-cluster ];
|
||||
|
||||
services.postgresql = {
|
||||
enable = true;
|
||||
|
||||
@@ -14,23 +14,20 @@
|
||||
top.nix-hardware.nixosModules.system76
|
||||
];
|
||||
|
||||
age.secrets = {
|
||||
gitea-workerPassword.file = ../../../secrets/gitea/workerPassword.age;
|
||||
};
|
||||
|
||||
boot.extraModulePackages = [ config.boot.kernelPackages.v4l2loopback ];
|
||||
|
||||
greg = {
|
||||
gitea-runner = {
|
||||
enable = true;
|
||||
extraLabels = [ "bare-metal:host" ];
|
||||
};
|
||||
kubernetes = {
|
||||
enable = true;
|
||||
vipInterface = "enp12s0";
|
||||
priority = 253;
|
||||
};
|
||||
nebula.enable = true;
|
||||
remote-builder.enable = true;
|
||||
runner = {
|
||||
enable = true;
|
||||
vbox = false;
|
||||
};
|
||||
tailscale = {
|
||||
enable = true;
|
||||
tags = [ "home" ];
|
||||
|
||||
@@ -35,10 +35,11 @@
|
||||
device = "/dev/nvme0n1p1";
|
||||
fsType = "auto";
|
||||
};
|
||||
#"/mnt/disk1" = {
|
||||
#device = "/dev/disk/by-uuid/0bb64e76-8811-499a-b60e-cc97808f2b0e";
|
||||
#fsType = "btrfs";
|
||||
#};
|
||||
"/mnt/disk1" = {
|
||||
device = "/dev/disk/by-uuid/bd04e868-034e-46e8-84ae-cd7347448bbd";
|
||||
fsType = "xfs";
|
||||
options = [ "nofail" ];
|
||||
};
|
||||
};
|
||||
|
||||
swapDevices = [ ];
|
||||
|
||||
@@ -1,273 +0,0 @@
|
||||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
|
||||
let
|
||||
registryPort = 5000;
|
||||
vpnIp = "100.117.28.111";
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
|
||||
age.secrets =
|
||||
let
|
||||
cfg = n: {
|
||||
file = ../../../secrets/gitlab/${n}.age;
|
||||
owner = "gitlab";
|
||||
group = "gitlab";
|
||||
mode = "0444";
|
||||
};
|
||||
in
|
||||
{
|
||||
gitlab-secret = cfg "secret";
|
||||
gitlab-otp = cfg "otp";
|
||||
gitlab-db = cfg "db";
|
||||
gitlab-db-password = cfg "db-password";
|
||||
gitlab-jws = cfg "jws";
|
||||
gitlab-key = cfg "key";
|
||||
gitlab-cert = cfg "cert";
|
||||
gitlab-salt = cfg "salt";
|
||||
gitlab-primary-key = cfg "primary-key";
|
||||
gitlab-deterministic-key = cfg "deterministic-key";
|
||||
|
||||
minio_access_key_id = {
|
||||
file = ../../../secrets/minio_access_key_id.age;
|
||||
owner = "gitlab";
|
||||
group = "gitlab";
|
||||
mode = "0444";
|
||||
};
|
||||
minio_secret_access_key = {
|
||||
file = ../../../secrets/minio_secret_access_key.age;
|
||||
owner = "gitlab";
|
||||
group = "gitlab";
|
||||
mode = "0444";
|
||||
};
|
||||
};
|
||||
|
||||
greg = {
|
||||
backup.jobs.nas-backup = {
|
||||
src = "/var/gitlab/state/backup/";
|
||||
dest = "gitlab";
|
||||
};
|
||||
home = true;
|
||||
tailscale = {
|
||||
enable = true;
|
||||
tags = [ "home" ];
|
||||
};
|
||||
};
|
||||
|
||||
networking = {
|
||||
hostName = "gitlab"; # Define your hostname.
|
||||
firewall.allowedTCPPorts = [
|
||||
80
|
||||
registryPort
|
||||
];
|
||||
};
|
||||
|
||||
services = {
|
||||
gitlab = {
|
||||
enable = true;
|
||||
backup = {
|
||||
keepTime = 288;
|
||||
startAt = [ "03:00" ];
|
||||
};
|
||||
databaseHost = "postgres.kubernetes";
|
||||
databaseName = "gitlab";
|
||||
databaseUsername = "gitlab";
|
||||
databasePasswordFile = config.age.secrets.gitlab-db-password.path;
|
||||
databaseCreateLocally = false;
|
||||
extraConfig = {
|
||||
registry.port = null;
|
||||
gitlab = {
|
||||
trustedProxies = [
|
||||
"${vpnIp}/32" # The system itself
|
||||
"100.109.86.8/32" # Public server's IP
|
||||
];
|
||||
};
|
||||
object_store = {
|
||||
enabled = true;
|
||||
proxy_download = true; # Tell them to reach out to object storage themselves!
|
||||
connection = {
|
||||
provider = "AWS";
|
||||
endpoint = "http://s3.thehellings.lan:9000";
|
||||
region = "us-east-1";
|
||||
aws_access_key_id = {
|
||||
_secret = config.age.secrets.minio_access_key_id.path;
|
||||
};
|
||||
aws_secret_access_key = {
|
||||
_secret = config.age.secrets.minio_secret_access_key.path;
|
||||
};
|
||||
path_style = true; # True for MinIO
|
||||
aws_signature_version = 2;
|
||||
};
|
||||
#storage_options = ...;
|
||||
objects = builtins.listToAttrs (
|
||||
builtins.map
|
||||
(
|
||||
x: lib.attrsets.nameValuePair x { bucket = "gitlab-${builtins.replaceStrings [ "_" ] [ "-" ] x}"; }
|
||||
)
|
||||
[
|
||||
"artifacts"
|
||||
"ci_secure_files"
|
||||
"dependency_proxy"
|
||||
"external_diffs"
|
||||
"lfs"
|
||||
"packages"
|
||||
"pages"
|
||||
"terraform_state"
|
||||
"uploads"
|
||||
]
|
||||
);
|
||||
};
|
||||
};
|
||||
host = "src.thehellings.com";
|
||||
https = true;
|
||||
initialRootEmail = "greg@thehellings.com";
|
||||
initialRootPasswordFile = pkgs.writeText "initialRootPassword" "root_password";
|
||||
pages = {
|
||||
enable = true;
|
||||
settings.pages-domain = "pages.thehellings.com";
|
||||
};
|
||||
port = 443;
|
||||
puma = {
|
||||
threadsMax = 6;
|
||||
threadsMin = 2;
|
||||
workers = 6;
|
||||
};
|
||||
redisUrl = "unix:${config.services.redis.servers.gitlab.unixSocket}";
|
||||
registry = {
|
||||
enable = true;
|
||||
certFile = config.age.secrets.gitlab-cert.path;
|
||||
keyFile = config.age.secrets.gitlab-key.path;
|
||||
externalAddress = "registry.thehellings.com";
|
||||
externalPort = 443;
|
||||
};
|
||||
secrets = {
|
||||
activeRecordDeterministicKeyFile = config.age.secrets.gitlab-deterministic-key.path;
|
||||
activeRecordPrimaryKeyFile = config.age.secrets.gitlab-primary-key.path;
|
||||
activeRecordSaltFile = config.age.secrets.gitlab-salt.path;
|
||||
dbFile = config.age.secrets.gitlab-db.path;
|
||||
jwsFile = config.age.secrets.gitlab-jws.path;
|
||||
otpFile = config.age.secrets.gitlab-otp.path;
|
||||
secretFile = config.age.secrets.gitlab-secret.path;
|
||||
};
|
||||
};
|
||||
|
||||
nginx = {
|
||||
enable = true;
|
||||
clientMaxBodySize = "25000m";
|
||||
virtualHosts = {
|
||||
"vm-gitlab.shire-zebra.ts.net" = {
|
||||
listen = [
|
||||
{
|
||||
addr = "0.0.0.0";
|
||||
port = 443;
|
||||
ssl = true;
|
||||
}
|
||||
];
|
||||
locations."/" = {
|
||||
proxyPass = "http://unix:/run/gitlab/gitlab-workhorse.socket";
|
||||
recommendedProxySettings = true;
|
||||
};
|
||||
extraConfig = ''
|
||||
ssl_certificate /etc/certs/vm-gitlab.shire-zebra.ts.net.crt ;
|
||||
ssl_certificate_key /etc/certs/vm-gitlab.shire-zebra.ts.net.key ;
|
||||
client_max_body_size 10000m ;
|
||||
'';
|
||||
};
|
||||
"registry" = {
|
||||
listen = [
|
||||
{
|
||||
addr = "0.0.0.0";
|
||||
port = registryPort;
|
||||
ssl = true;
|
||||
}
|
||||
];
|
||||
locations."/" = {
|
||||
proxyPass = "http://127.0.0.1:4567/";
|
||||
recommendedProxySettings = true;
|
||||
};
|
||||
extraConfig = ''
|
||||
ssl_certificate /etc/certs/vm-gitlab.shire-zebra.ts.net.crt ;
|
||||
ssl_certificate_key /etc/certs/vm-gitlab.shire-zebra.ts.net.key ;
|
||||
client_max_body_size 25000m ;
|
||||
'';
|
||||
serverAliases = [
|
||||
"vm-gitlab.shire-zebra.ts.net"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
openssh.enable = true;
|
||||
|
||||
postgresql.enable = true;
|
||||
|
||||
qemuGuest.enable = true;
|
||||
|
||||
redis.servers.gitlab = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
#resolved.enable = true;
|
||||
};
|
||||
|
||||
# Do not start nginx until we have tailscaled up and running, so it can bind
|
||||
# to the 100.* addresses
|
||||
systemd = {
|
||||
services = {
|
||||
certRefresh =
|
||||
let
|
||||
script = pkgs.writeShellApplication {
|
||||
name = "cert-refresh";
|
||||
runtimeInputs = [ pkgs.tailscale ];
|
||||
|
||||
text = ''
|
||||
cd /etc/certs
|
||||
tailscale cert vm-gitlab.shire-zebra.ts.net
|
||||
chown nginx ./*
|
||||
systemctl reload nginx
|
||||
'';
|
||||
};
|
||||
in
|
||||
{
|
||||
script = lib.getExe script;
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
User = "root";
|
||||
};
|
||||
};
|
||||
|
||||
nginx = rec {
|
||||
after = [ "network-online.target" ];
|
||||
requires = [ "network-online.target" ];
|
||||
wants = after;
|
||||
serviceConfig = {
|
||||
RestartMaxDelaySec = "30s";
|
||||
RestartSteps = "5";
|
||||
};
|
||||
};
|
||||
tailscaled.partOf = [ "network-online.target" ];
|
||||
};
|
||||
|
||||
timers = {
|
||||
"cert-refresh" = {
|
||||
wantedBy = [ "cert-refresh.service" ];
|
||||
timerConfig = {
|
||||
OnCalendar = "monthly";
|
||||
Persistent = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
system.stateVersion = lib.mkForce "24.11";
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{
|
||||
lib,
|
||||
modulesPath,
|
||||
...
|
||||
}:
|
||||
|
||||
{
|
||||
imports = [
|
||||
(modulesPath + "/profiles/qemu-guest.nix")
|
||||
];
|
||||
|
||||
# Bootloader.
|
||||
boot = {
|
||||
extraModulePackages = [ ];
|
||||
initrd = {
|
||||
availableKernelModules = [
|
||||
"uhci_hcd"
|
||||
"ehci_pci"
|
||||
"ahci"
|
||||
"virtio_pci"
|
||||
"virtio_scsi"
|
||||
"sd_mod"
|
||||
"sr_mod"
|
||||
];
|
||||
kernelModules = [ ];
|
||||
};
|
||||
loader = {
|
||||
efi.canTouchEfiVariables = true;
|
||||
systemd-boot.enable = true;
|
||||
};
|
||||
};
|
||||
|
||||
fileSystems."/" = {
|
||||
device = lib.mkDefault "/dev/disk/by-uuid/1fdbe86e-ce6f-4af3-a876-aec35731adab";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot" = {
|
||||
device = "/dev/disk/by-uuid/1E6A-C3BB";
|
||||
fsType = "vfat";
|
||||
options = [
|
||||
"fmask=0077"
|
||||
"dmask=0077"
|
||||
];
|
||||
};
|
||||
|
||||
swapDevices = [ ];
|
||||
|
||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||
# still possible to use this option, but it's recommended to use it in conjunction
|
||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.enp6s18.useDHCP = lib.mkDefault true;
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{ lib, ... }:
|
||||
{
|
||||
hostsByNet =
|
||||
net: hosts:
|
||||
let
|
||||
netAttr =
|
||||
{
|
||||
lan = "ip";
|
||||
nebula = "nebulaIp";
|
||||
tailscale = "ts";
|
||||
}
|
||||
.${net};
|
||||
in
|
||||
lib.mapAttrsToList
|
||||
(name: value: {
|
||||
inherit name;
|
||||
address = builtins.getAttr netAttr value;
|
||||
aliases = lib.optionals (builtins.hasAttr "aliases" value) (builtins.getAttr "aliases" value);
|
||||
})
|
||||
(
|
||||
lib.filterAttrs (
|
||||
_host: settings: (builtins.hasAttr netAttr settings) && (builtins.getAttr netAttr settings) != null
|
||||
) hosts
|
||||
);
|
||||
}
|
||||
@@ -40,7 +40,7 @@ metadata:
|
||||
},
|
||||
{
|
||||
"path": "/mnt/disk1",
|
||||
"allowScheduling": false,
|
||||
"allowScheduling": true,
|
||||
"tags": ["hdd", "large"]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -21,9 +21,6 @@ spec:
|
||||
spec:
|
||||
containers:
|
||||
- name: bitwarden-cli
|
||||
# Since my gitlab instance depends on the database hosted in k3s, and
|
||||
# the database depends on this image, I need a way to bootstrap the
|
||||
# system if # I am doing disaster recovery. And this is it.
|
||||
image: "ghcr.io/greg-hellings/nixos-config/img-bitwarden:latest"
|
||||
#image: >-
|
||||
# registry.thehellings.com/greg/nixos-config/img-bitwarden:latest
|
||||
|
||||
@@ -1,32 +1,21 @@
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: kubernetes-dashboard
|
||||
name: headlamp
|
||||
spec:
|
||||
url: https://kubernetes.github.io/dashboard/
|
||||
url: "https://kubernetes-sigs.github.io/headlamp/"
|
||||
interval: "24h"
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: kubernetes-dashboard
|
||||
name: headlamp
|
||||
spec:
|
||||
interval: "24h"
|
||||
chart:
|
||||
spec:
|
||||
chart: kubernetes-dashboard
|
||||
chart: headlamp
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: kubernetes-dashboard
|
||||
name: headlamp
|
||||
interval: "24h"
|
||||
values:
|
||||
app:
|
||||
settings:
|
||||
global:
|
||||
clusterName: Hellings Home
|
||||
itemsPerPage: 25
|
||||
ingress:
|
||||
enabled: true
|
||||
hosts:
|
||||
- dashboard.shire-zebra.ts.net
|
||||
ingressClassName: tailscale
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: dashboard-tailscale
|
||||
spec:
|
||||
ingressClassName: tailscale
|
||||
defaultBackend:
|
||||
service:
|
||||
name: headlamp
|
||||
port:
|
||||
number: 3001
|
||||
tls:
|
||||
- hosts:
|
||||
- headlamp
|
||||
@@ -4,3 +4,4 @@ resources:
|
||||
- namespace.yaml
|
||||
- chart.yaml
|
||||
- user.yaml
|
||||
- ingress.yaml
|
||||
|
||||
@@ -1,89 +0,0 @@
|
||||
apiVersion: postgresql.cnpg.io/v1
|
||||
kind: Cluster
|
||||
metadata:
|
||||
name: immich
|
||||
spec:
|
||||
imageName: "ghcr.io/corentingiraud/cnpg-pgvector-vectorchord:16-migration"
|
||||
#imageName: "ghcr.io/tensorchord/cloudnative-pgvecto.rs:16-v0.3.0"
|
||||
#postgresUID: 1
|
||||
instances: 1
|
||||
storage:
|
||||
size: 60Gi
|
||||
primaryUpdateStrategy: unsupervised
|
||||
postgresql:
|
||||
shared_preload_libraries:
|
||||
- vectors.so
|
||||
- vchord.so
|
||||
|
||||
bootstrap:
|
||||
recovery:
|
||||
source: origin
|
||||
# initdb:
|
||||
# database: immich
|
||||
# owner: immich
|
||||
# secret:
|
||||
# name: postgres-user-immich
|
||||
# dataChecksums: true
|
||||
# postInitApplicationSQL:
|
||||
# - ALTER SYSTEM SET search_path TO "$user", public, vectors;
|
||||
# - SET search_path TO "$user", public, vectors;
|
||||
# - CREATE EXTENSION IF NOT EXISTS "cube";
|
||||
# - CREATE EXTENSION IF NOT EXISTS "earthdistance";
|
||||
# - GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "immich";
|
||||
|
||||
externalClusters:
|
||||
- name: origin
|
||||
plugin:
|
||||
name: barman-cloud.cloudnative-pg.io
|
||||
parameters:
|
||||
barmanObjectName: k3sbackup-objectstore
|
||||
serverName: pgvector
|
||||
|
||||
managed:
|
||||
roles:
|
||||
- name: immich
|
||||
ensure: present
|
||||
comment: Immich DB user
|
||||
login: true
|
||||
superuser: true
|
||||
passwordSecret:
|
||||
name: postgres-user-immich
|
||||
|
||||
plugins:
|
||||
- name: barman-cloud.cloudnative-pg.io
|
||||
isWALArchiver: true
|
||||
parameters:
|
||||
barmanObjectName: k3sbackup-objectstore
|
||||
---
|
||||
apiVersion: postgresql.cnpg.io/v1
|
||||
kind: Database
|
||||
metadata:
|
||||
name: database-immich
|
||||
spec:
|
||||
name: immich
|
||||
owner: immich
|
||||
cluster:
|
||||
name: immich
|
||||
extensions:
|
||||
- name: vectors
|
||||
ensure: present
|
||||
- name: vectorchord
|
||||
ensure: present
|
||||
- name: cube
|
||||
ensure: present
|
||||
- name: earthdistance
|
||||
ensure: present
|
||||
---
|
||||
apiVersion: postgresql.cnpg.io/v1
|
||||
kind: ScheduledBackup
|
||||
metadata:
|
||||
name: immich-backup
|
||||
spec:
|
||||
immediate: true # Create one when this is added to the cluster
|
||||
schedule: "0 2 0 * * *" # 1AM, nightly
|
||||
backupOwnerReference: self
|
||||
cluster:
|
||||
name: immich
|
||||
method: plugin
|
||||
pluginConfiguration:
|
||||
name: barman-cloud.cloudnative-pg.io
|
||||
@@ -14,14 +14,12 @@ spec:
|
||||
- 100.88.91.27 # dns?
|
||||
- 100.80.99.48 # exodus
|
||||
- 100.88.91.27 # genesis
|
||||
- 100.117.28.111 # gitlab
|
||||
- 100.68.203.1 # hosea
|
||||
- 100.84.183.79 # isaiah
|
||||
- 100.102.186.39 # jeremiah
|
||||
- 100.90.74.19 # zeke
|
||||
- 100.115.57.8 # linode
|
||||
- 100.65.5.38 # matrix
|
||||
#- 100.127.55.22 # jellyfin
|
||||
---
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: IngressRouteTCP
|
||||
|
||||
@@ -4,8 +4,6 @@ resources:
|
||||
- namespace.yaml
|
||||
- secrets.yaml
|
||||
- postgres-cluster.yaml
|
||||
- postgres-gitlab.yaml
|
||||
- postgres-pgadmin.yaml
|
||||
- postgres-matrix.yaml
|
||||
- immich.yaml
|
||||
- ingress.yaml
|
||||
|
||||
@@ -11,13 +11,6 @@ spec:
|
||||
|
||||
managed:
|
||||
roles:
|
||||
- name: gitlab
|
||||
ensure: present
|
||||
comment: Gitlab user
|
||||
login: true
|
||||
superuser: false
|
||||
passwordSecret:
|
||||
name: postgres-user-gitlab
|
||||
- name: pgadmin
|
||||
ensure: present
|
||||
comment: PG Admin user
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
apiVersion: postgresql.cnpg.io/v1
|
||||
kind: Database
|
||||
metadata:
|
||||
name: database-gitlab
|
||||
spec:
|
||||
name: gitlab
|
||||
owner: gitlab
|
||||
cluster:
|
||||
name: postgres
|
||||
@@ -1,39 +1,5 @@
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: postgres-user-gitlab
|
||||
namespace: db
|
||||
spec:
|
||||
target:
|
||||
name: postgres-user-gitlab
|
||||
deletionPolicy: Delete
|
||||
template:
|
||||
type: Opaque
|
||||
data:
|
||||
username: |-
|
||||
{{ .username }}
|
||||
password: |-
|
||||
{{ .password }}
|
||||
data:
|
||||
- secretKey: username
|
||||
sourceRef:
|
||||
storeRef:
|
||||
name: bitwarden-login
|
||||
kind: ClusterSecretStore
|
||||
remoteRef:
|
||||
key: 5282ad16-c2dc-49d3-8fb3-b2e9012bab57
|
||||
property: username
|
||||
- secretKey: password
|
||||
sourceRef:
|
||||
storeRef:
|
||||
name: bitwarden-login
|
||||
kind: ClusterSecretStore
|
||||
remoteRef:
|
||||
key: 5282ad16-c2dc-49d3-8fb3-b2e9012bab57
|
||||
property: password
|
||||
---
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: postgres-user-matrix
|
||||
namespace: db
|
||||
@@ -133,37 +99,3 @@ spec:
|
||||
remoteRef:
|
||||
key: 685b29c6-9264-4e60-ba4a-b2ea005a5d7b
|
||||
property: password
|
||||
---
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: postgres-user-immich
|
||||
namespace: db
|
||||
spec:
|
||||
target:
|
||||
name: postgres-user-immich
|
||||
deletionPolicy: Delete
|
||||
template:
|
||||
type: Opaque
|
||||
data:
|
||||
username: |-
|
||||
{{ .username }}
|
||||
password: |-
|
||||
{{ .password }}
|
||||
data:
|
||||
- secretKey: username
|
||||
sourceRef:
|
||||
storeRef:
|
||||
name: bitwarden-login
|
||||
kind: ClusterSecretStore
|
||||
remoteRef:
|
||||
key: 5ce63e26-dd7f-46d4-b7ed-b310002ef93f
|
||||
property: username
|
||||
- secretKey: password
|
||||
sourceRef:
|
||||
storeRef:
|
||||
name: bitwarden-login
|
||||
kind: ClusterSecretStore
|
||||
remoteRef:
|
||||
key: 5ce63e26-dd7f-46d4-b7ed-b310002ef93f
|
||||
property: password
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: gitea
|
||||
spec:
|
||||
interval: "24h"
|
||||
url: https://dl.gitea.com/charts/
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: gitea-runner
|
||||
namespace: gitea-runner
|
||||
spec:
|
||||
interval: 10m
|
||||
chart:
|
||||
spec:
|
||||
chart: actions
|
||||
version: "0.0.4"
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: gitea
|
||||
interval: "1h"
|
||||
values:
|
||||
rbac:
|
||||
create: true
|
||||
serviceAccount:
|
||||
create: true
|
||||
gitea:
|
||||
instanceURL: https://src.thehellings.com
|
||||
runnerToken:
|
||||
existingSecret: gitea-runner
|
||||
existingSecretKey: token
|
||||
imagePullSecrets:
|
||||
- name: image-pull-secrets
|
||||
config:
|
||||
runner:
|
||||
labels:
|
||||
# Ubuntu
|
||||
- "ubuntu-22.04:docker://ubuntu:22.04"
|
||||
- "ubuntu-24.04:docker://ubuntu:24.04"
|
||||
- "ubuntu-24.10:docker://ubuntu:24.10"
|
||||
# Fedora
|
||||
- "fedora-41:docker://fedora:41"
|
||||
- "fedora-42:docker://fedora:42"
|
||||
# CentOS Stream
|
||||
- "centos-stream-9:docker://quay.io/centos/centos:stream9"
|
||||
- "centos-stream-10:docker://quay.io/centos/centos:stream10"
|
||||
# Nix
|
||||
- "nix:docker://nixos/nix:latest"
|
||||
# ci-images (internal registry: src.thehellings.com/greg)
|
||||
- "ci-builder:docker://src.thehellings.com/greg/builder:latest"
|
||||
- "ci-vm-test:docker://src.thehellings.com/greg/vm-test:latest"
|
||||
- "ci-sword:docker://src.thehellings.com/greg/sword-container-builder:latest"
|
||||
- "ci-bitwarden:docker://src.thehellings.com/greg/bitwarden:latest"
|
||||
- "ci-immich:docker://src.thehellings.com/greg/immich:latest"
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
namespace: gitlab-runner
|
||||
namespace: gitea-runner
|
||||
|
||||
resources:
|
||||
- namespace.yaml
|
||||
@@ -1,4 +1,4 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: gitlab-runner
|
||||
name: gitea-runner
|
||||
@@ -0,0 +1,18 @@
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: gitea-runner
|
||||
namespace: gitea-runner
|
||||
spec:
|
||||
refreshInterval: 1h
|
||||
secretStoreRef:
|
||||
name: bitwarden-login
|
||||
kind: ClusterSecretStore
|
||||
target:
|
||||
name: gitea-runner
|
||||
creationPolicy: Owner
|
||||
data:
|
||||
- secretKey: token
|
||||
remoteRef:
|
||||
key: 11419680-5338-4f19-bdd9-b422007046af
|
||||
property: password
|
||||
@@ -15,7 +15,7 @@ spec:
|
||||
chart:
|
||||
spec:
|
||||
chart: gitea
|
||||
version: "12.5.0"
|
||||
version: "12.6.0"
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: gitea-repository
|
||||
@@ -35,7 +35,7 @@ spec:
|
||||
storageClass: longhorn-default
|
||||
|
||||
image:
|
||||
tag: "1.25.4"
|
||||
tag: "1.26.2"
|
||||
|
||||
replicaCount: 1
|
||||
|
||||
@@ -66,8 +66,8 @@ spec:
|
||||
APP_NAME: "Gitea: Greg's Cup of Git"
|
||||
RUN_MODE: dev
|
||||
server:
|
||||
DOMAIN: "thehellings.com"
|
||||
ROOT_URL: "https://src.thehellings.com"
|
||||
DOMAIN: "shire-zebra.ts.net"
|
||||
ROOT_URL: "https://gitea.shire-zebra.ts.net"
|
||||
SSH_PORT: "2222"
|
||||
database:
|
||||
DB_TYPE: postgres
|
||||
@@ -92,6 +92,8 @@ spec:
|
||||
# MINIO_SECRET_ACCESS_KEY: ""
|
||||
MINIO_USE_SSL: "false"
|
||||
MINIO_INSECURE_SKIP_VERIFY: "true"
|
||||
webhook:
|
||||
ALLOWED_HOST_LIST: loopback,private,*.shire-zebra.ts.net
|
||||
|
||||
metrics:
|
||||
enabled: false
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
apiVersion: batch/v1
|
||||
kind: CronJob
|
||||
metadata:
|
||||
name: gitea-dump
|
||||
spec:
|
||||
schedule: "0 3 * * *"
|
||||
successfulJobsHistoryLimit: 3
|
||||
failedJobsHistoryLimit: 3
|
||||
jobTemplate:
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
restartPolicy: Never
|
||||
securityContext:
|
||||
runAsUser: 1000
|
||||
runAsGroup: 1000
|
||||
fsGroup: 1000
|
||||
volumes:
|
||||
- name: gitea-data
|
||||
persistentVolumeClaim:
|
||||
claimName: gitea-shared-storage
|
||||
- name: dump-staging
|
||||
emptyDir: {}
|
||||
initContainers:
|
||||
- name: gitea-dump
|
||||
image: "gitea/gitea:1.25.4"
|
||||
command:
|
||||
- /bin/sh
|
||||
- "-c"
|
||||
- |
|
||||
set -e
|
||||
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
|
||||
OUTFILE="/dump-staging/gitea-dump-${TIMESTAMP}.zip"
|
||||
gitea dump \
|
||||
--config /data/gitea/conf/app.ini \
|
||||
--file "${OUTFILE}" \
|
||||
--type zip
|
||||
echo "Dump written to ${OUTFILE}"
|
||||
volumeMounts:
|
||||
- name: gitea-data
|
||||
mountPath: /data
|
||||
readOnly: true
|
||||
- name: dump-staging
|
||||
mountPath: /dump-staging
|
||||
containers:
|
||||
- name: upload-to-s3
|
||||
image: "minio/mc:latest"
|
||||
command:
|
||||
- /bin/sh
|
||||
- "-c"
|
||||
- |
|
||||
set -e
|
||||
# Configure mc alias for MinIO
|
||||
mc alias set nas1 http://nas1.shire-zebra.ts.net:9000 \
|
||||
"${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}"
|
||||
# Upload dump to backup-gitea bucket
|
||||
DUMP_FILE=$(ls /dump-staging/gitea-dump-*.zip | head -1)
|
||||
mc cp "${DUMP_FILE}" "nas1/backup-gitea/$(basename ${DUMP_FILE})"
|
||||
echo "Uploaded $(basename ${DUMP_FILE}) to backup-gitea"
|
||||
# Set 30-day lifecycle on the bucket (idempotent)
|
||||
mc ilm rule add --expire-days 30 nas1/backup-gitea 2>/dev/null || true
|
||||
volumeMounts:
|
||||
- name: dump-staging
|
||||
mountPath: /dump-staging
|
||||
readOnly: true
|
||||
env:
|
||||
- name: MC_CONFIG_DIR
|
||||
value: /tmp/.mc
|
||||
- name: MINIO_ACCESS_KEY
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: gitea-config
|
||||
key: minio_key
|
||||
- name: MINIO_SECRET_KEY
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: gitea-config
|
||||
key: minio_secret
|
||||
@@ -6,3 +6,4 @@ resources:
|
||||
- chart.yaml
|
||||
- ingress.yaml
|
||||
- secrets.yaml
|
||||
- dump-cronjob.yaml
|
||||
|
||||
@@ -13,8 +13,10 @@ spec:
|
||||
USER={{ .dbuser }}
|
||||
PASSWD="""{{ .dbpass }}"""
|
||||
storage: |-
|
||||
MINIO_ACCESS_KEY_ID={{ .minio_key }}
|
||||
MINIO_SECRET_ACCESS_KEY={{ .minio_secret }}
|
||||
MINIO_ACCESS_KEY_ID={{ .minio_nas1_key }}
|
||||
MINIO_SECRET_ACCESS_KEY={{ .minio_nas1_secret }}
|
||||
#minio_key: "{{ .minio_nas1_key }}"
|
||||
#minio_secret: "{{ .minio_nas1_secret }}"
|
||||
secretStoreRef:
|
||||
name: bitwarden-login
|
||||
kind: ClusterSecretStore
|
||||
@@ -28,6 +30,15 @@ spec:
|
||||
remoteRef:
|
||||
key: dcbcf704-7dce-48d7-bbd1-b3a801875b3d
|
||||
property: password
|
||||
# MinIO credentials for NAS1
|
||||
- secretKey: minio_nas1_key
|
||||
remoteRef:
|
||||
key: c4c66ab3-2ade-4086-9c0d-b3a80172b1ba
|
||||
property: username
|
||||
- secretKey: minio_nas1_secret
|
||||
remoteRef:
|
||||
key: c4c66ab3-2ade-4086-9c0d-b3a80172b1ba
|
||||
property: password
|
||||
# Postgres credentials
|
||||
- secretKey: dbuser
|
||||
remoteRef:
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: gitlab-runner
|
||||
spec:
|
||||
interval: "24h"
|
||||
url: https://charts.gitlab.io
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: gitlab-runner
|
||||
spec:
|
||||
interval: 10m
|
||||
chart:
|
||||
spec:
|
||||
chart: gitlab-runner
|
||||
version: "0.83.1"
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: gitlab-runner
|
||||
interval: "1h"
|
||||
dependsOn:
|
||||
- name: external-secrets
|
||||
namespace: external-secrets
|
||||
- name: tailscae
|
||||
namespace: tailscale
|
||||
values:
|
||||
crds:
|
||||
create: true
|
||||
includeCRDs: true
|
||||
gitlabUrl: https://src.thehellings.com
|
||||
runners:
|
||||
secret: gitlab-runner
|
||||
imagePullSecrets:
|
||||
- name: image-pull-secrets
|
||||
rbac:
|
||||
create: true
|
||||
serviceAccount:
|
||||
create: true
|
||||
metrics:
|
||||
enabled: true
|
||||
extraEnv:
|
||||
CACHE_TYPE: s3
|
||||
CACHE_SHARED: "true"
|
||||
CACHE_S3_BUCKET_NAME: gitlab-runner-cache
|
||||
CACHE_S3_INSECURE: "true"
|
||||
extraEnvFrom:
|
||||
PACKER_GITHUB_API_TOKEN:
|
||||
secretKeyRef:
|
||||
name: gitlab-runner
|
||||
key: PACKER_GITHUB_API_TOKEN
|
||||
CACHE_S3_SERVER_ADDRESS:
|
||||
secretKeyRef:
|
||||
name: gitlab-runner
|
||||
key: CACHE_S3_SERVER_ADDRESS
|
||||
CACHE_S3_ACCESS_KEY:
|
||||
secretKeyRef:
|
||||
name: s3-access
|
||||
key: username
|
||||
CACHE_S3_SECRET_KEY:
|
||||
secretKeyRef:
|
||||
name: s3-access
|
||||
key: password
|
||||
@@ -1,101 +0,0 @@
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: gitlab-runner
|
||||
namespace: gitlab-runner
|
||||
spec:
|
||||
secretStoreRef:
|
||||
name: bitwarden-fields
|
||||
kind: ClusterSecretStore
|
||||
target:
|
||||
name: gitlab-runner
|
||||
deletionPolicy: Delete
|
||||
template:
|
||||
type: Opaque
|
||||
data:
|
||||
runner-registration-token: ""
|
||||
runner-token: "{{ .runnerToken }}"
|
||||
PACKER_GITHUB_API_TOKEN: "{{ .PACKER_GITHUB_API_TOKEN }}"
|
||||
CACHE_S3_SERVER_ADDRESS: "{{ .CACHE_S3_SERVER_ADDRESS }}"
|
||||
data:
|
||||
- secretKey: runnerToken
|
||||
remoteRef:
|
||||
key: &key 53719920-b100-4355-8c80-b2f9002fad22
|
||||
property: CI_SERVER_TOKEN
|
||||
- secretKey: PACKER_GITHUB_API_TOKEN
|
||||
remoteRef:
|
||||
key: *key
|
||||
property: PACKER_GITHUB_API_TOKEN
|
||||
- secretKey: CACHE_S3_SERVER_ADDRESS
|
||||
remoteRef:
|
||||
key: *key
|
||||
property: CACHE_S3_SERVER_ADDRESS
|
||||
# Includes
|
||||
# CI_SERVER_TOKEN
|
||||
# PACKER_GITHUB_API_TOKEN
|
||||
# CACHE_S3_SERVER_ADDRESS
|
||||
---
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: s3-access
|
||||
namespace: gitlab-runner
|
||||
spec:
|
||||
secretStoreRef:
|
||||
name: bitwarden-login
|
||||
kind: ClusterSecretStore
|
||||
target:
|
||||
name: s3-access
|
||||
deletionPolicy: Delete
|
||||
data:
|
||||
- secretKey: username
|
||||
remoteRef:
|
||||
key: &key 04dd39c2-268d-4a33-aa4c-b1550166139f
|
||||
property: username
|
||||
- secretKey: password
|
||||
remoteRef:
|
||||
key: *key
|
||||
property: password
|
||||
---
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: image-pull-secrets
|
||||
namespace: gitlab-runner
|
||||
spec:
|
||||
secretStoreRef:
|
||||
name: bitwarden-login
|
||||
kind: ClusterSecretStore
|
||||
target:
|
||||
deletionPolicy: Delete
|
||||
template:
|
||||
type: kubernetes.io/dockerconfigjson
|
||||
data:
|
||||
.dockerconfigjson: >-
|
||||
{
|
||||
"auths": {
|
||||
"https://index.docker.io/v1/": {
|
||||
"username": "{{ .user }}",
|
||||
"password": "{{ .password }}",
|
||||
"email": "greg.hellings@gmail.com",
|
||||
"auth": "{{ .auth }}"
|
||||
}
|
||||
}
|
||||
}
|
||||
data:
|
||||
- secretKey: user
|
||||
remoteRef:
|
||||
key: &key f560ae38-368c-4e58-898c-aeb90012d597
|
||||
property: username
|
||||
- secretKey: password
|
||||
remoteRef:
|
||||
key: *key
|
||||
property: password
|
||||
- secretKey: auth
|
||||
sourceRef:
|
||||
storeRef:
|
||||
name: bitwarden-fields
|
||||
kind: ClusterSecretStore
|
||||
remoteRef:
|
||||
key: *key
|
||||
property: auth
|
||||
@@ -0,0 +1,36 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: external-secrets
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: external-secrets
|
||||
namespace: external-secrets
|
||||
spec:
|
||||
interval: "24h"
|
||||
url: "https://charts.external-secrets.io/"
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: external-secrets
|
||||
namespace: external-secrets
|
||||
spec:
|
||||
interval: 10m
|
||||
chart:
|
||||
spec:
|
||||
chart: external-secrets
|
||||
version: "2.3.0"
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: external-secrets
|
||||
interval: "1h"
|
||||
values:
|
||||
crds:
|
||||
create: true
|
||||
includeCRDs: true
|
||||
webhook:
|
||||
certManager:
|
||||
enable: true
|
||||
@@ -1,3 +1,6 @@
|
||||
resources:
|
||||
- kyverno.yaml
|
||||
- external-secrets.yaml
|
||||
- tailscale.yaml
|
||||
- longhorn.yaml # Needed for storage
|
||||
- traefik.yaml
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: kyverno-system
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: kyverno
|
||||
namespace: kyverno-system
|
||||
spec:
|
||||
interval: "24h"
|
||||
url: "https://kyverno.github.io/kyverno/"
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: kyverno
|
||||
namespace: kyverno-system
|
||||
spec:
|
||||
interval: 10m
|
||||
chart:
|
||||
spec:
|
||||
chart: kyverno
|
||||
version: "3.7.1"
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: kyverno
|
||||
interval: "1h"
|
||||
values:
|
||||
admissionController:
|
||||
replicas: 3
|
||||
backgroundController:
|
||||
replicas: 3
|
||||
cleanupController:
|
||||
replicas: 2
|
||||
reportsController:
|
||||
replicas: 2
|
||||
crds:
|
||||
install: true
|
||||
@@ -19,10 +19,15 @@ metadata:
|
||||
namespace: longhorn-system
|
||||
spec:
|
||||
interval: 10m
|
||||
dependsOn:
|
||||
- name: tailscale
|
||||
namespace: tailscale
|
||||
- name: kyverno
|
||||
namespace: kyverno-system
|
||||
chart:
|
||||
spec:
|
||||
chart: longhorn
|
||||
version: "1.10.2"
|
||||
version: "1.11.2"
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: longhorn
|
||||
|
||||
@@ -1,3 +1,36 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: tailscale
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: tailscale
|
||||
namespace: tailscale
|
||||
spec:
|
||||
interval: "24h"
|
||||
url: "https://pkgs.tailscale.com/helmcharts"
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: tailscale
|
||||
namespace: tailscale
|
||||
spec:
|
||||
interval: 10m
|
||||
dependsOn:
|
||||
- name: external-secrets
|
||||
namespace: external-secrets
|
||||
chart:
|
||||
spec:
|
||||
chart: tailscale-operator
|
||||
version: "1.96.5"
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: tailscale
|
||||
interval: "1h"
|
||||
---
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
@@ -19,23 +19,76 @@ spec:
|
||||
key: "dd0de40c-9ad6-4034-9d5c-b311016ebf19"
|
||||
property: apikey
|
||||
---
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: immich-minio-creds
|
||||
spec:
|
||||
target:
|
||||
name: immich-minio-creds
|
||||
deletionPolicy: Delete
|
||||
template:
|
||||
type: Opaque
|
||||
data:
|
||||
access-key: "{{ .minio_key }}"
|
||||
secret-key: "{{ .minio_secret }}"
|
||||
rclone.conf: |
|
||||
[nas1minio]
|
||||
type = s3
|
||||
provider = Minio
|
||||
endpoint = http://nas1.shire-zebra.ts.net:9000
|
||||
access_key_id = {{ .minio_key }}
|
||||
secret_access_key = {{ .minio_secret }}
|
||||
region = us-east-1
|
||||
secretStoreRef:
|
||||
name: bitwarden-login
|
||||
kind: ClusterSecretStore
|
||||
data:
|
||||
- secretKey: minio_key
|
||||
remoteRef:
|
||||
key: c4c66ab3-2ade-4086-9c0d-b3a80172b1ba
|
||||
property: username
|
||||
- secretKey: minio_secret
|
||||
remoteRef:
|
||||
key: c4c66ab3-2ade-4086-9c0d-b3a80172b1ba
|
||||
property: password
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: immich-backup-staging
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
storageClassName: longhorn-default
|
||||
resources:
|
||||
requests:
|
||||
storage: 400Gi
|
||||
---
|
||||
apiVersion: batch/v1
|
||||
kind: CronJob
|
||||
metadata:
|
||||
name: backup
|
||||
spec:
|
||||
schedule: "0 4 * * *" # At 4am each day
|
||||
successfulJobsHistoryLimit: 3
|
||||
failedJobsHistoryLimit: 3
|
||||
jobTemplate:
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
restartPolicy: Never
|
||||
volumes:
|
||||
- name: nas1
|
||||
nfs:
|
||||
path: /mnt/all/backups/immich
|
||||
server: nas1.shire-zebra.ts.net
|
||||
containers:
|
||||
- name: staging
|
||||
persistentVolumeClaim:
|
||||
claimName: immich-backup-staging
|
||||
- name: rclone-config
|
||||
secret:
|
||||
secretName: immich-minio-creds
|
||||
items:
|
||||
- key: rclone.conf
|
||||
path: rclone.conf
|
||||
initContainers:
|
||||
- name: immich-go
|
||||
image: "src.thehellings.com/greg/immich:latest"
|
||||
imagePullPolicy: "Always"
|
||||
@@ -43,21 +96,42 @@ spec:
|
||||
- /bin/sh
|
||||
- "-c"
|
||||
- >-
|
||||
rm -r /staging/*;
|
||||
immich-go
|
||||
archive
|
||||
"--write-to-folder"
|
||||
/nas1
|
||||
/staging
|
||||
from-immich
|
||||
"--from-api-key"
|
||||
"$IMMICH_API_KEY"
|
||||
"--from-server"
|
||||
"http://immich-server:2283"
|
||||
volumeMounts:
|
||||
- name: nas1
|
||||
mountPath: /nas1
|
||||
- name: staging
|
||||
mountPath: /staging
|
||||
env:
|
||||
- name: IMMICH_API_KEY
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: immich-login
|
||||
key: apikey
|
||||
containers:
|
||||
- name: rclone-sync
|
||||
image: "rclone/rclone:1.68"
|
||||
command:
|
||||
- /bin/sh
|
||||
- "-c"
|
||||
- |
|
||||
rclone sync \
|
||||
--config /rclone-config/rclone.conf \
|
||||
--checksum \
|
||||
--progress \
|
||||
--transfers 4 \
|
||||
--checkers 8 \
|
||||
/staging nas1minio:immich
|
||||
volumeMounts:
|
||||
- name: staging
|
||||
mountPath: /staging
|
||||
- name: rclone-config
|
||||
mountPath: /rclone-config
|
||||
readOnly: true
|
||||
|
||||
@@ -32,9 +32,9 @@ spec:
|
||||
containers:
|
||||
main:
|
||||
image:
|
||||
tag: v2.4.1
|
||||
tag: v2.7.5
|
||||
env:
|
||||
DB_HOSTNAME: immich-rw.db.svc.cluster.local
|
||||
DB_HOSTNAME: immich-rw
|
||||
DB_DATABASE_NAME: immich
|
||||
DB_USERNAME:
|
||||
valueFrom:
|
||||
|
||||
@@ -0,0 +1,161 @@
|
||||
apiVersion: postgresql.cnpg.io/v1
|
||||
kind: Cluster
|
||||
metadata:
|
||||
name: immich
|
||||
spec:
|
||||
imageName: "ghcr.io/tensorchord/cloudnative-vectorchord:18"
|
||||
#postgresUID: 1
|
||||
instances: 1
|
||||
storage:
|
||||
size: 60Gi
|
||||
primaryUpdateStrategy: unsupervised
|
||||
postgresql:
|
||||
shared_preload_libraries:
|
||||
- vchord.so
|
||||
|
||||
bootstrap:
|
||||
# Use these with the name "immich-1" to restore from the backups
|
||||
recovery:
|
||||
source: origin
|
||||
# Use these two lines in order to restore from the other database,
|
||||
# once it has restored from the WALs
|
||||
#pg_basebackup:
|
||||
# source: restore
|
||||
# Use this block to bootstrap the cluster, if you don't have backups.
|
||||
# What are you doing without backups, you chump?!
|
||||
# initdb:
|
||||
# database: immich
|
||||
# owner: immich
|
||||
# secret:
|
||||
# name: postgres-user-immich
|
||||
# dataChecksums: true
|
||||
# postInitApplicationSQL:
|
||||
# - ALTER SYSTEM SET search_path TO "$user", public, vectors;
|
||||
# - SET search_path TO "$user", public, vectors;
|
||||
# - CREATE EXTENSION IF NOT EXISTS "cube";
|
||||
# - CREATE EXTENSION IF NOT EXISTS "earthdistance";
|
||||
# - GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "immich";
|
||||
|
||||
externalClusters:
|
||||
- name: origin
|
||||
plugin:
|
||||
name: barman-cloud.cloudnative-pg.io
|
||||
parameters:
|
||||
barmanObjectName: k3sbackup-objectstore
|
||||
serverName: immich
|
||||
- name: restore
|
||||
connectionParameters:
|
||||
host: immich-1-rw
|
||||
user: streaming_replica
|
||||
sslmode: verify-full
|
||||
sslCert:
|
||||
name: immich-1-replication
|
||||
key: tls.crt
|
||||
sslKey:
|
||||
name: immich-1-replication
|
||||
key: tls.key
|
||||
sslRootCert:
|
||||
name: immich-1-ca
|
||||
key: ca.crt
|
||||
|
||||
managed:
|
||||
roles:
|
||||
- name: immich
|
||||
ensure: present
|
||||
comment: Immich DB user
|
||||
login: true
|
||||
superuser: true
|
||||
passwordSecret:
|
||||
name: postgres-user-immich
|
||||
|
||||
plugins:
|
||||
- name: barman-cloud.cloudnative-pg.io
|
||||
isWALArchiver: true
|
||||
parameters:
|
||||
barmanObjectName: k3sbackup-objectstore
|
||||
---
|
||||
apiVersion: postgresql.cnpg.io/v1
|
||||
kind: Database
|
||||
metadata:
|
||||
name: database-immich
|
||||
spec:
|
||||
name: immich
|
||||
owner: immich
|
||||
cluster:
|
||||
name: immich
|
||||
extensions:
|
||||
- name: vectors
|
||||
ensure: present
|
||||
- name: vectorchord
|
||||
ensure: present
|
||||
- name: cube
|
||||
ensure: present
|
||||
- name: earthdistance
|
||||
ensure: present
|
||||
---
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: k3sbackup-externalsecret
|
||||
spec:
|
||||
target:
|
||||
name: k3sbackup-secret
|
||||
deletionPolicy: Delete
|
||||
template:
|
||||
type: Opaque
|
||||
data:
|
||||
username: |-
|
||||
{{ .username }}
|
||||
password: |-
|
||||
{{ .password }}
|
||||
data:
|
||||
- secretKey: username
|
||||
sourceRef:
|
||||
storeRef:
|
||||
name: bitwarden-login
|
||||
kind: ClusterSecretStore
|
||||
remoteRef:
|
||||
key: 685b29c6-9264-4e60-ba4a-b2ea005a5d7b
|
||||
property: username
|
||||
- secretKey: password
|
||||
sourceRef:
|
||||
storeRef:
|
||||
name: bitwarden-login
|
||||
kind: ClusterSecretStore
|
||||
remoteRef:
|
||||
key: 685b29c6-9264-4e60-ba4a-b2ea005a5d7b
|
||||
property: password
|
||||
|
||||
---
|
||||
apiVersion: barmancloud.cnpg.io/v1
|
||||
kind: ObjectStore
|
||||
metadata:
|
||||
name: k3sbackup-objectstore
|
||||
spec:
|
||||
configuration:
|
||||
destinationPath: "s3://k3sbackup/postgres"
|
||||
endpointURL: "http://chronicles.thehellings.lan:9000/"
|
||||
s3Credentials:
|
||||
accessKeyId:
|
||||
name: k3sbackup-secret
|
||||
key: username
|
||||
secretAccessKey:
|
||||
name: k3sbackup-secret
|
||||
key: password
|
||||
wal:
|
||||
compression: gzip
|
||||
retentionPolicy: "30d"
|
||||
---
|
||||
apiVersion: postgresql.cnpg.io/v1
|
||||
kind: ScheduledBackup
|
||||
metadata:
|
||||
name: immich-backup
|
||||
spec:
|
||||
immediate: false # Create one when this is added to the cluster
|
||||
schedule: "0 2 0 * * *" # 1AM, nightly
|
||||
backupOwnerReference: self
|
||||
cluster:
|
||||
name: immich
|
||||
method: plugin
|
||||
pluginConfiguration:
|
||||
name: barman-cloud.cloudnative-pg.io
|
||||
@@ -2,8 +2,9 @@ namespace: immich
|
||||
|
||||
resources:
|
||||
- namespace.yaml
|
||||
- chart.yaml
|
||||
- postgres-user-secret.yaml
|
||||
- database.yaml
|
||||
- chart.yaml
|
||||
- pvc.yaml
|
||||
- ingress.yaml
|
||||
- backup.yaml
|
||||
|
||||
@@ -7,7 +7,6 @@ resources:
|
||||
- mariadb-operator
|
||||
- databases
|
||||
- matrix
|
||||
#- gitlab-runner
|
||||
- immich
|
||||
- monitoring
|
||||
- pinchflat
|
||||
|
||||
@@ -19,6 +19,7 @@ spec:
|
||||
kind: HelmRepository
|
||||
name: mariadb-operator
|
||||
interval: "1h"
|
||||
version: "26.3.0"
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
@@ -33,6 +34,7 @@ spec:
|
||||
kind: HelmRepository
|
||||
name: mariadb-operator
|
||||
interval: "1h"
|
||||
version: "26.3.0"
|
||||
dependsOn:
|
||||
- name: mariadb-operator-crds
|
||||
- name: longhorn
|
||||
|
||||
@@ -11,6 +11,7 @@ spec:
|
||||
kind: HelmRepository
|
||||
name: mariadb-operator
|
||||
interval: "1h"
|
||||
version: "26.3.0"
|
||||
dependsOn:
|
||||
- name: mariadb-operator-crds
|
||||
- name: mariadb-operator
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
apiVersion: external-secrets.io/v1beta1
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: restic-credentials
|
||||
|
||||
@@ -77,6 +77,7 @@ in
|
||||
|
||||
programs.firefox = {
|
||||
enable = true; # (!pkgs.stdenv.hostPlatform.isDarwin);
|
||||
configPath = if pkgs.stdenv.hostPlatform.isDarwin then "${config.home.homeDirectory}/Library/Application Support/Firefox" else "${config.xdg.configHome}/mozilla/firefox";
|
||||
package = pkgs.firefox-bin;
|
||||
policies = {
|
||||
DisableAppUpdate = true;
|
||||
@@ -158,6 +159,8 @@ in
|
||||
"https://thehellings.com"
|
||||
else
|
||||
"https://kuma.shire-zebra.ts.net/";
|
||||
"devtools.debugger.remote-enabled" = true;
|
||||
"devtools.debugger.remote-port" = 9222;
|
||||
"doh-rollout.doorhanger-decision" = "UIDisabled";
|
||||
"doh-rollout.doneFirstRun" = true;
|
||||
"signon.rememberSignons" = false;
|
||||
|
||||
@@ -35,6 +35,23 @@
|
||||
}
|
||||
];
|
||||
}
|
||||
{
|
||||
name = "Lithic";
|
||||
bookmarks = [
|
||||
{
|
||||
name = "Okta";
|
||||
url = "https://privacy.okta.com";
|
||||
}
|
||||
{
|
||||
name = "Jira";
|
||||
url = "https://lithichq.atlassian.net";
|
||||
}
|
||||
{
|
||||
name = "Notion";
|
||||
url = "https://www.notion.so/lithichq/";
|
||||
}
|
||||
];
|
||||
}
|
||||
{
|
||||
name = "IVR";
|
||||
bookmarks = [
|
||||
@@ -299,6 +316,26 @@
|
||||
name = "Buildbot";
|
||||
url = "http://jeremiah.shire-zebra.ts.net:8010/";
|
||||
}
|
||||
{
|
||||
name = "Garage WebUI";
|
||||
url = "http://nas1.shire-zebra.ts.net:30186/";
|
||||
}
|
||||
{
|
||||
name = "Garage RPC";
|
||||
url = "http://nas1.shire-zebra.ts.net:30187/";
|
||||
}
|
||||
{
|
||||
name = "Garage S3 API";
|
||||
url = "http://nas1.shire-zebra.ts.net:30188/";
|
||||
}
|
||||
{
|
||||
name = "Garage S3 Web";
|
||||
url = "http://nas1.shire-zebra.ts.net:30189/";
|
||||
}
|
||||
{
|
||||
name = "Garage Admin";
|
||||
url = "http://nas1.shire-zebra.ts.net:30190/";
|
||||
}
|
||||
];
|
||||
}
|
||||
{
|
||||
@@ -351,6 +388,15 @@
|
||||
}
|
||||
];
|
||||
}
|
||||
{
|
||||
name = "Jurisdictions";
|
||||
bookmarks = [
|
||||
{
|
||||
name = "Weatherford";
|
||||
url = "https://weatherfordtx.gov/3062/Development-Services";
|
||||
}
|
||||
];
|
||||
}
|
||||
{
|
||||
name = "Door Loop";
|
||||
url = "https://btrgpm.app.doorloop.com/home";
|
||||
@@ -359,22 +405,47 @@
|
||||
name = "HELOC payoff calculator";
|
||||
url = "https://acceleratedstrategies.com/free-calculator/";
|
||||
}
|
||||
{
|
||||
name = "Odoo";
|
||||
url = "http://10.42.2.57:8069/odoo/crm";
|
||||
}
|
||||
{
|
||||
name = "Mattermost";
|
||||
url = "http://10.42.2.89:8065/login";
|
||||
}
|
||||
];
|
||||
}
|
||||
{
|
||||
name = "Media";
|
||||
bookmarks = [
|
||||
{
|
||||
name = "Prowlarr";
|
||||
url = "https://hosea.shire-zebra.ts.net:9696/";
|
||||
name = "Flaresolverr";
|
||||
url = "http://nas1.shire-zebra.ts.net:30098";
|
||||
}
|
||||
{
|
||||
name = "Transmission";
|
||||
url = "https://hosea.shire-zebra.ts.net:9091/";
|
||||
name = "Prowlarr";
|
||||
url = "http://nas1.shire-zebra.ts.net:30050/";
|
||||
}
|
||||
{
|
||||
name = "Sonarr (TV)";
|
||||
url = "http://nas1.shire-zebra.ts.net:30113/";
|
||||
}
|
||||
{
|
||||
name = "Radarr (Movies)";
|
||||
url = "https://hosea.shire-zebra.ts.net:7878/";
|
||||
url = "http://nas1.shire-zebra.ts.net:30025/";
|
||||
}
|
||||
{
|
||||
name = "Deluge";
|
||||
url = "http://nas1.shire-zebra.ts.net:30038/";
|
||||
}
|
||||
];
|
||||
}
|
||||
{
|
||||
name = "Home";
|
||||
bookmarks = [
|
||||
{
|
||||
name = "Home Assistant";
|
||||
url = "http://10.42.2.155:8123/config/dashboard";
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
+15
-7
@@ -9,6 +9,7 @@
|
||||
let
|
||||
builderHosts = lib.filterAttrs (_n: v: (builtins.hasAttr "builder" v) && v.builder) metadata.hosts;
|
||||
cfg = config.greg.nix;
|
||||
hostname = x: if cfg.cache then "${x}.shire-zebra.ts.net" else "${x}.thehellings.lan";
|
||||
in
|
||||
{
|
||||
options.greg.nix = {
|
||||
@@ -22,7 +23,7 @@ in
|
||||
programs.ssh.extraConfig = builtins.concatStringsSep "\n" (
|
||||
lib.map (x: ''
|
||||
Host ${x}-builder
|
||||
Hostname ${x}.shire-zebra.ts.net
|
||||
Hostname ${hostname x}
|
||||
User remote-builder-user
|
||||
'') (lib.attrNames builderHosts)
|
||||
);
|
||||
@@ -57,12 +58,18 @@ in
|
||||
"gregory.hellings"
|
||||
]; # For home and for work machines
|
||||
substituters =
|
||||
(if cfg.cache then [
|
||||
#"http://chronicles.shire-zebra.ts.net:9000/binary-cache/"
|
||||
"http://nas1.shire-zebra.ts.net:8080/default"
|
||||
] else [
|
||||
"http://nas1.thehellings.lan:8080/default"
|
||||
])
|
||||
(
|
||||
if cfg.cache then
|
||||
[
|
||||
#"http://chronicles.shire-zebra.ts.net:9000/binary-cache/"
|
||||
"http://niks3.nas1.shire-zebra.ts.net:30189/"
|
||||
#"http://nas1.shire-zebra.ts.net:8080/default"
|
||||
]
|
||||
else
|
||||
[
|
||||
"http://niks3.nas1.thehellings.lan:30189/"
|
||||
]
|
||||
)
|
||||
++ [
|
||||
"https://ai.cachix.org"
|
||||
"https://nixpkgs-python.cachix.org"
|
||||
@@ -72,6 +79,7 @@ in
|
||||
"https://nixhelm.cachix.org"
|
||||
];
|
||||
trusted-public-keys = [
|
||||
"niks3:8iztr/NACwYEK5O7JJtGFGuv+ho/cmwql8NeoCiXNto="
|
||||
#"chronicles.shire-zebra.ts.net:0qWYHn3gGllXChhAaaxKlNZtRy6yG/XJs1RFSqV3nW8="
|
||||
"default:DTGxNijw2D8FrZJPT1pFTWcLqbt60tovL+9Z+VW0HRY="
|
||||
"ai.cachix.org-1:N9dzRK+alWwoKXQlnn0H6aUx0lU/mspIoz8hMvGvbbc="
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.greg.adblockUpdate;
|
||||
in
|
||||
{
|
||||
|
||||
options.greg.adblockUpdate = {
|
||||
enable = lib.mkEnableOption "Enable auto-update of block list";
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
systemd = {
|
||||
services.adblock-update = {
|
||||
after = [ "network-online.target" ];
|
||||
requires = [ "network-online.target" ];
|
||||
script = lib.getExe pkgs.adblockUpdate;
|
||||
serviceConfig.Type = "oneshot";
|
||||
};
|
||||
timers.adblock-update = {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "network-online.target" ];
|
||||
requires = [ "network-online.target" ];
|
||||
timerConfig = {
|
||||
OnCalendar = "daily";
|
||||
Unit = "adblock-update.service";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -4,11 +4,12 @@
|
||||
|
||||
{
|
||||
imports = [
|
||||
./adblock-update.nix
|
||||
./albyhub.nix
|
||||
./backup.nix
|
||||
./ceph.nix
|
||||
./db.nix
|
||||
./gitlab-runner.nix
|
||||
./gitea-runner.nix
|
||||
./gnome.nix
|
||||
./home.nix
|
||||
./kde.nix
|
||||
@@ -22,6 +23,7 @@
|
||||
./router.nix
|
||||
./rpi4.nix
|
||||
./syncthing.nix
|
||||
./nebula.nix
|
||||
./tailscale.nix
|
||||
./vmdev.nix
|
||||
];
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.greg.gitea-runner;
|
||||
host = config.networking.hostName;
|
||||
labels = cfg.labels ++ cfg.extraLabels;
|
||||
in
|
||||
{
|
||||
options.greg.gitea-runner = {
|
||||
enable = lib.mkEnableOption "Enable Gitea act_runner (shell mode)";
|
||||
|
||||
instanceURL = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "https://src.thehellings.com";
|
||||
description = "URL of the Gitea instance to connect to";
|
||||
};
|
||||
|
||||
name = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = config.networking.hostName;
|
||||
description = "Name of the runner (defaults to hostname)";
|
||||
};
|
||||
|
||||
capacity = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
default = 5;
|
||||
description = "Number of concurrent jobs the runner can handle";
|
||||
};
|
||||
|
||||
extraLabels = lib.mkOption {
|
||||
type = lib.types.listOf lib.types.str;
|
||||
default = [ ];
|
||||
};
|
||||
|
||||
labels = lib.mkOption {
|
||||
type = lib.types.listOf lib.types.str;
|
||||
default = [
|
||||
"self-hosted:host"
|
||||
"nixos-${host}:host"
|
||||
|
||||
"debian-latest:docker://node:25-trixie"
|
||||
|
||||
"ubuntu-latest:docker://docker.gitea.com/runner-images:ubuntu-latest"
|
||||
"ubuntu-26.04:docker://docker.gitea.com/runner-images:ubuntu-26.04"
|
||||
"ubuntu-24.04:docker://docker.gitea.com/runner-images:ubuntu-24.04"
|
||||
"ubuntu-22.04:docker://docker.gitea.com/runner-images:ubuntu-22.04"
|
||||
|
||||
"ubuntu-full-latest:docker://ghcr.io/catthehacker/ubuntu:full-latest"
|
||||
"ubuntu-full-26.04:docker://ghcr.io/catthehacker/ubuntu:full-26.04"
|
||||
"ubuntu-full-24.04:docker://ghcr.io/catthehacker/ubuntu:full-24.04"
|
||||
"ubuntu-full-22.04:docker://ghcr.io/catthehacker/ubuntu:full-22.04"
|
||||
|
||||
"ubuntu-act-latest:docker://ghcr.io/catthehacker/ubuntu:act-latest"
|
||||
"ubuntu-act-26.04:docker://ghcr.io/catthehacker/ubuntu:act-26.04"
|
||||
"ubuntu-act-24.04:docker://ghcr.io/catthehacker/ubuntu:act-24.04"
|
||||
"ubuntu-act-22.04:docker://ghcr.io/catthehacker/ubuntu:act-22.04"
|
||||
|
||||
"ubuntu-runner-latest:docker://ghcr.io/catthehacker/ubuntu:runner-latest"
|
||||
"ubuntu-runner-26.04:docker://ghcr.io/catthehacker/ubuntu:runner-26.04"
|
||||
"ubuntu-runner-24.04:docker://ghcr.io/catthehacker/ubuntu:runner-24.04"
|
||||
"ubuntu-runner-22.04:docker://ghcr.io/catthehacker/ubuntu:runner-22.04"
|
||||
|
||||
"ubuntu-rust-latest:docker://ghcr.io/catthehacker/ubuntu:rust-latest"
|
||||
"ubuntu-rust-26.04:docker://ghcr.io/catthehacker/ubuntu:rust-26.04"
|
||||
"ubuntu-rust-24.04:docker://ghcr.io/catthehacker/ubuntu:rust-24.04"
|
||||
"ubuntu-rust-22.04:docker://ghcr.io/catthehacker/ubuntu:rust-22.04"
|
||||
|
||||
"nix-latest:docker://src.thehellings.com/greg/builder:latest"
|
||||
];
|
||||
description = "Labels to assign to this runner";
|
||||
};
|
||||
|
||||
tokenFile = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
description = "Path to a file containing the runner registration token (from agenix)";
|
||||
default = ../../secrets/gitea/runner-isaiah-podman.age;
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
age.secrets."gitea-runner-${host}-podman".file = cfg.tokenFile;
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
bash
|
||||
git
|
||||
nodejs
|
||||
];
|
||||
|
||||
greg.podman.enable = true;
|
||||
|
||||
services.gitea-actions-runner = {
|
||||
package = pkgs.gitea-actions-runner;
|
||||
instances.${cfg.name} = {
|
||||
inherit labels;
|
||||
inherit (cfg) name;
|
||||
enable = true;
|
||||
url = cfg.instanceURL;
|
||||
tokenFile = config.age.secrets."gitea-runner-${host}-podman".path;
|
||||
settings = {
|
||||
container.force_pull = true;
|
||||
runner.capacity = cfg.capacity;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.greg.runner;
|
||||
environmentVariables = {
|
||||
EFI_DIR = "${pkgs.OVMF.fd}/FV/";
|
||||
STORAGE_URL = "s3.thehellings.lan:9000";
|
||||
};
|
||||
runnerCfg = file: {
|
||||
inherit environmentVariables;
|
||||
authenticationTokenConfigFile = file;
|
||||
executor = "shell";
|
||||
limit = cfg.threads;
|
||||
};
|
||||
in
|
||||
# We want exactly one of these to be true, but not both. Neither can both be false
|
||||
{
|
||||
options.greg.runner = {
|
||||
enable = lib.mkEnableOption "Enable as a gitlab-runner with both libvirt and virtualbox";
|
||||
|
||||
threads = lib.mkOption {
|
||||
default = 5;
|
||||
type = lib.types.int;
|
||||
description = "The maximum number of concurrent jobs";
|
||||
};
|
||||
|
||||
qemu = lib.mkEnableOption "Enable the qemu host (mutually exclusive with vbox)";
|
||||
vbox = lib.mkEnableOption "Enable the vbox host (mutually exclusive with qemu)";
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable ({
|
||||
# assertions = [
|
||||
# {
|
||||
# assertion = cfg.qemu || cfg.vbox && (cfg.qemu != cfg.vbox);
|
||||
# message = "You must enable exactly one of qemu or vbox";
|
||||
# }
|
||||
# ];
|
||||
# Shared configurations
|
||||
age.secrets = {
|
||||
qemu.file = ../../secrets/gitlab/nixos-qemu-shell.age;
|
||||
vbox.file = ../../secrets/gitlab/nixos-vbox-shell.age;
|
||||
};
|
||||
|
||||
services.gitlab-runner = {
|
||||
enable = false;
|
||||
settings.concurrent = cfg.threads;
|
||||
services = {
|
||||
qemu = lib.mkIf cfg.qemu (runnerCfg config.age.secrets.qemu.path);
|
||||
vbox = lib.mkIf cfg.vbox (runnerCfg config.age.secrets.vbox.path);
|
||||
};
|
||||
};
|
||||
|
||||
systemd.services.gitlab-runner = {
|
||||
serviceConfig = {
|
||||
DevicePolicy = lib.mkForce "auto";
|
||||
User = "root";
|
||||
DynamicUser = lib.mkForce false;
|
||||
};
|
||||
};
|
||||
|
||||
users.extraGroups.vboxusers.members = lib.optional cfg.vbox "greg";
|
||||
|
||||
virtualisation = {
|
||||
libvirtd = lib.mkIf cfg.qemu {
|
||||
enable = true;
|
||||
allowedBridges = [
|
||||
"br0"
|
||||
"virbr0"
|
||||
];
|
||||
onBoot = "ignore"; # only restart VMs labeled 'autostart'
|
||||
};
|
||||
virtualbox.host = lib.mkIf cfg.vbox {
|
||||
enable = true;
|
||||
enableExtensionPack = true;
|
||||
};
|
||||
};
|
||||
});
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
|
||||
@@ -18,35 +17,9 @@ with lib;
|
||||
};
|
||||
|
||||
config = mkIf cfg {
|
||||
age.secrets.attic.file = ../../secrets/attic.age;
|
||||
networking.domain = "thehellings.lan";
|
||||
time.timeZone = "America/Chicago";
|
||||
|
||||
systemd.services.attic-client = {
|
||||
enable = true;
|
||||
description = "Attic client watch-store service";
|
||||
after = [ "network.target" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
serviceConfig = {
|
||||
Type = "simple";
|
||||
Restart = "on-failure";
|
||||
RestartSec = "5s";
|
||||
};
|
||||
preStart = ''
|
||||
set -x
|
||||
mkdir -p $XDG_CONFIG_HOME/attic
|
||||
cp ${config.age.secrets.attic.path} $XDG_CONFIG_HOME/attic/config.toml
|
||||
'';
|
||||
script = "${pkgs.attic-client}/bin/attic watch-store --ignore-upstream-cache-filter default";
|
||||
environment = {
|
||||
XDG_CONFIG_HOME = "/var/lib/attic-client";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.tmpfiles.rules = [
|
||||
"d /var/lib/attic-client 0755 root root -"
|
||||
];
|
||||
|
||||
# Open Prometheus exporter ports on LAN-connected hosts only.
|
||||
# NOT in baseline.nix to avoid exposing these on internet-facing hosts (e.g. linode).
|
||||
networking.firewall.allowedTCPPorts = [
|
||||
|
||||
@@ -2,19 +2,19 @@
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
top,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.greg.kubernetes;
|
||||
cert-manager = pkgs.fetchurl {
|
||||
url = "https://github.com/cert-manager/cert-manager/releases/download/v1.18.2/cert-manager.yaml";
|
||||
sha256 = "0vx1nfyhl0rzb6psfxplq8pfp18mrrdk83n8rj2ph8q6r15vcih5";
|
||||
url = "https://github.com/cert-manager/cert-manager/releases/download/v1.20.2/cert-manager.yaml";
|
||||
sha256 = "sha256-HOEcrpEq3sxp5rtiNDX6/J7SFQX57/+YvXHXuA8B2x8=";
|
||||
};
|
||||
flux = pkgs.fetchurl {
|
||||
url = "https://github.com/fluxcd/flux2/releases/download/v2.7.2/install.yaml";
|
||||
sha256 = "sha256-Qs1qJmgZm8q9xZsORjT/N/wzpbWVVODXtzDpjnAYMuQ=";
|
||||
};
|
||||
keepaliveIp = "10.42.5.1";
|
||||
in
|
||||
{
|
||||
options.greg = {
|
||||
@@ -67,6 +67,9 @@ in
|
||||
443
|
||||
5432
|
||||
6443
|
||||
8080
|
||||
8443
|
||||
10250
|
||||
]
|
||||
++ (
|
||||
if cfg.agentOnly then
|
||||
@@ -83,43 +86,6 @@ in
|
||||
services = {
|
||||
k3s = {
|
||||
enable = true;
|
||||
autoDeployCharts = {
|
||||
external-secrets = {
|
||||
inherit (top.charts.chartsMetadata.external-secrets.external-secrets) repo version;
|
||||
enable = true;
|
||||
name = top.charts.chartsMetadata.external-secrets.external-secrets.chart;
|
||||
hash = "sha256-dPuUWthwN6L0jdAKRpkDtDedGyDUxUlJrwkvUNwLsrU=";
|
||||
createNamespace = true;
|
||||
targetNamespace = "external-secrets";
|
||||
values = {
|
||||
crds.create = true;
|
||||
includeCRDs = true;
|
||||
};
|
||||
};
|
||||
kyverno = {
|
||||
inherit (top.charts.chartsMetadata.kyverno.kyverno) repo version;
|
||||
enable = true;
|
||||
name = top.charts.chartsMetadata.kyverno.kyverno.chart;
|
||||
hash = "sha256-sNdFEupwfnYSo2iGqKwTadPtXfcbyM1kuisavpiGUyU=";
|
||||
createNamespace = true;
|
||||
targetNamespace = "kyverno-system";
|
||||
values = {
|
||||
admissionController.replicas = 3;
|
||||
backgroundController.replicas = 3;
|
||||
cleanupController.replicas = 2;
|
||||
reportsController.replicas = 2;
|
||||
crds.install = true;
|
||||
};
|
||||
};
|
||||
tailscale = {
|
||||
inherit (top.charts.chartsMetadata.tailscale.tailscale-operator) repo version;
|
||||
enable = true;
|
||||
name = top.charts.chartsMetadata.tailscale.tailscale-operator.chart;
|
||||
hash = "sha256-BtZ24mCT2GMHE9iR+2xuIkB+4m1r2OC3WLkY3jC3i3I=";
|
||||
createNamespace = true;
|
||||
targetNamespace = "tailscale";
|
||||
};
|
||||
};
|
||||
extraFlags = [
|
||||
"--cluster-cidr=10.211.0.0/16"
|
||||
"--service-cidr=10.221.0.0/16"
|
||||
@@ -130,12 +96,12 @@ in
|
||||
"--supervisor-metrics=true"
|
||||
"--tls-san ${config.networking.hostName}.thehellings.lan"
|
||||
"--tls-san ${config.networking.hostName}.shire-zebra.ts.net"
|
||||
"--tls-san ${keepaliveIp}"
|
||||
];
|
||||
manifests = {
|
||||
cert-manager.source = cert-manager;
|
||||
flux.source = flux;
|
||||
node-annotations.source = ../../manifests/auto/nodes.yaml;
|
||||
operator-oauth.source = ../../manifests/auto/operator-oauth.yaml;
|
||||
};
|
||||
role = if cfg.agentOnly then "agent" else "server";
|
||||
serverAddr = lib.mkIf (
|
||||
@@ -152,7 +118,7 @@ in
|
||||
state = if (config.networking.hostName == "isaiah") then "MASTER" else "BACKUP";
|
||||
virtualIps = [
|
||||
{
|
||||
addr = "10.42.5.1/16";
|
||||
addr = "${keepaliveIp}/16";
|
||||
dev = cfg.vipInterface;
|
||||
}
|
||||
];
|
||||
|
||||
@@ -0,0 +1,229 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
metadata,
|
||||
...
|
||||
}:
|
||||
|
||||
# Nebula overlay mesh network module (greg namespace)
|
||||
#
|
||||
# This module configures a Nebula node for the nebula.thehellings.com overlay.
|
||||
# CIDR: 10.157.0.0/16
|
||||
# Lighthouse: linode (public internet, acts as relay too)
|
||||
#
|
||||
# Each host requires:
|
||||
# secrets/nebula/<hostname>.key.age - encrypted private key
|
||||
# secrets/nebula/<hostname>.crt - certificate (public, unencrypted in repo)
|
||||
# secrets/nebula/ca.crt - CA certificate (public, unencrypted in repo)
|
||||
#
|
||||
# The nebula IP for each host must be set in network.json under
|
||||
# hosts.<name>.nebulaIp (e.g. "10.157.0.1")
|
||||
#
|
||||
# Lighthouse address is the public IP/DNS of linode. Update the
|
||||
# `lighthouseAddrs` option below or override per-host if it changes.
|
||||
|
||||
let
|
||||
cfg = config.greg.nebula;
|
||||
nebulaDomain = "nebula.thehellings.com";
|
||||
# Linode's public address — used by all non-lighthouse hosts to reach it.
|
||||
# Override with greg.nebula.lighthouseAddr if the public IP ever changes.
|
||||
defaultLighthouseAddr = "thehellings.com";
|
||||
in
|
||||
{
|
||||
options.greg.nebula = {
|
||||
enable = lib.mkEnableOption "Nebula overlay mesh network";
|
||||
|
||||
isLighthouse = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = "Whether this host is a Nebula lighthouse/relay node";
|
||||
};
|
||||
|
||||
isRelay = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = cfg.isLighthouse;
|
||||
description = "Whether this host acts as a relay (am_relay). Defaults to true when isLighthouse is true.";
|
||||
};
|
||||
|
||||
nebulaIp = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "This host's Nebula overlay IP (e.g. 10.157.0.1)";
|
||||
default =
|
||||
let
|
||||
hostData = metadata.hosts.${config.networking.hostName} or { };
|
||||
in
|
||||
hostData.nebulaIp
|
||||
or (throw "greg.nebula.nebulaIp must be set for host ${config.networking.hostName}");
|
||||
};
|
||||
|
||||
lighthouseAddr = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = defaultLighthouseAddr;
|
||||
description = "Public address (host:port) used to reach the lighthouse from non-lighthouse hosts";
|
||||
};
|
||||
|
||||
lighthouseNebulaIp = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default =
|
||||
let
|
||||
linodeData = metadata.hosts.linode or { };
|
||||
in
|
||||
linodeData.nebulaIp or "10.157.0.1";
|
||||
description = "Nebula overlay IP of the lighthouse host";
|
||||
};
|
||||
|
||||
port = lib.mkOption {
|
||||
type = lib.types.port;
|
||||
default = 4242;
|
||||
description = "UDP port Nebula listens on";
|
||||
};
|
||||
|
||||
# unsafe_routes: allow non-Nebula subnets to be routed through this host.
|
||||
# Used on genesis to expose 10.42.0.0/16 (the home LAN) to the overlay.
|
||||
unsafeRoutes = lib.mkOption {
|
||||
type = lib.types.listOf (
|
||||
lib.types.submodule {
|
||||
options = {
|
||||
route = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "CIDR to route through this host (e.g. 10.42.0.0/16)";
|
||||
};
|
||||
via = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
description = "Nebula overlay IP of the host that provides the route";
|
||||
};
|
||||
};
|
||||
}
|
||||
);
|
||||
# Default: route the home LAN through genesis (the home router node).
|
||||
# Hosts that ARE genesis (or any other routing node) should override this to [].
|
||||
default = [ ];
|
||||
description = ''
|
||||
List of unsafe_routes to configure on this host (for reaching non-Nebula subnets).
|
||||
Defaults to routing the home LAN (10.42.0.0/16) through genesis (10.157.0.2).
|
||||
Override to [] on hosts that are themselves a routing node (e.g. genesis).
|
||||
'';
|
||||
};
|
||||
|
||||
# Whether this host IS the router for an unsafe subnet
|
||||
# (enables IP forwarding + nftables masquerade for the home LAN)
|
||||
routesSubnet = lib.mkOption {
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
default = null;
|
||||
description = ''
|
||||
When set, this host will route traffic from the Nebula overlay
|
||||
to this subnet. Enables IP forwarding and nftables masquerade.
|
||||
Example: "10.42.0.0/16"
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
# agenix: decrypt this host's Nebula private key at boot
|
||||
age.secrets."nebula-${config.networking.hostName}-key" = {
|
||||
file = ../../secrets/nebula/${config.networking.hostName}.key.age;
|
||||
owner = config.systemd.services."nebula@${nebulaDomain}".serviceConfig.User;
|
||||
mode = "0400";
|
||||
};
|
||||
|
||||
services.nebula.networks.${nebulaDomain} = {
|
||||
enable = true;
|
||||
|
||||
# CA certificate (public — lives unencrypted in the repo)
|
||||
ca = ../../secrets/nebula/ca.crt;
|
||||
|
||||
# Host certificate (public — lives unencrypted in the repo)
|
||||
cert = ../../secrets/nebula/${config.networking.hostName}.crt;
|
||||
|
||||
# Private key (agenix-decrypted at runtime)
|
||||
key = config.age.secrets."nebula-${config.networking.hostName}-key".path;
|
||||
|
||||
# Static host map: tell every node where the lighthouse lives
|
||||
staticHostMap = {
|
||||
"${cfg.lighthouseNebulaIp}" = [ "${cfg.lighthouseAddr}:${toString cfg.port}" ];
|
||||
};
|
||||
|
||||
isLighthouse = cfg.isLighthouse;
|
||||
isRelay = cfg.isRelay;
|
||||
|
||||
listen = {
|
||||
host = "0.0.0.0";
|
||||
# Lighthouses and relays need a fixed port; regular nodes use 0 (OS-assigned)
|
||||
port = if (cfg.isLighthouse || cfg.isRelay) then cfg.port else null;
|
||||
};
|
||||
|
||||
lighthouses = lib.optionals (!cfg.isLighthouse) [ cfg.lighthouseNebulaIp ];
|
||||
|
||||
relays = lib.optionals (!cfg.isLighthouse && !cfg.isRelay) [ cfg.lighthouseNebulaIp ];
|
||||
|
||||
tun = {
|
||||
# Interface name
|
||||
device = "nebula0";
|
||||
};
|
||||
|
||||
settings.tun.unsafe_routes = cfg.unsafeRoutes;
|
||||
|
||||
# Firewall: permissive defaults — tighten per-host as desired
|
||||
firewall = {
|
||||
outbound = [
|
||||
{
|
||||
port = "any";
|
||||
proto = "any";
|
||||
host = "any";
|
||||
}
|
||||
];
|
||||
inbound = [
|
||||
# Allow ICMP (ping) from any Nebula peer
|
||||
{
|
||||
port = "any";
|
||||
proto = "icmp";
|
||||
host = "any";
|
||||
}
|
||||
# Allow all traffic from within the Nebula overlay
|
||||
{
|
||||
port = "any";
|
||||
proto = "any";
|
||||
host = "any";
|
||||
}
|
||||
]
|
||||
# When routing an unsafe subnet, allow inbound traffic destined
|
||||
# for that subnet from any Nebula peer (local_cidr scopes it)
|
||||
++ lib.optionals (cfg.routesSubnet != null) [
|
||||
{
|
||||
port = "any";
|
||||
proto = "any";
|
||||
host = "any";
|
||||
local_cidr = cfg.routesSubnet;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
# Open the Nebula UDP port in the firewall
|
||||
networking.firewall.allowedUDPPorts = [ cfg.port ];
|
||||
|
||||
# When this host routes traffic to a non-Nebula subnet, enable IP
|
||||
# forwarding and add nftables masquerade rules (see unsafe_routes guide).
|
||||
boot.kernel.sysctl = lib.mkIf (cfg.routesSubnet != null) {
|
||||
"net.ipv4.ip_forward" = lib.mkDefault "1";
|
||||
};
|
||||
|
||||
networking.nftables.tables = lib.mkIf (cfg.routesSubnet != null) {
|
||||
nebula_routing = {
|
||||
family = "ip";
|
||||
content = ''
|
||||
chain postrouting {
|
||||
type nat hook postrouting priority srcnat; policy accept;
|
||||
ip saddr 10.157.0.0/16 ip daddr ${cfg.routesSubnet} counter masquerade
|
||||
}
|
||||
|
||||
chain forward {
|
||||
type filter hook forward priority filter; policy accept;
|
||||
ct state related,established counter accept
|
||||
iifname "nebula0" ip saddr 10.157.0.0/16 ip daddr ${cfg.routesSubnet} counter accept
|
||||
}
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -54,7 +54,7 @@ with lib;
|
||||
|
||||
target = mkOption {
|
||||
type = types.str;
|
||||
description = ''The destination that is being proxied.'';
|
||||
description = "The destination that is being proxied.";
|
||||
example = "http://localhost:8080";
|
||||
};
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@ with lib;
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBLOqwbp4hFYkiJpokh9i2RToa/6tQcwthDNQH69tyBF root@vm-matrix.thehellings.lan"
|
||||
# Mac
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBT5BFHQz1I5k/zkLQNLjL77EaqfdpRiF2Ci4eS9LMDK gregory.hellings@jude.thehellings.lan"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPVlMoN2pkKRRwKNuMbMczki5ybR34wvjdgDNlgR74Wh greg@gregs-MacBook-Pro-16-inch-Nov-2024"
|
||||
];
|
||||
homeMode = "500";
|
||||
isNormalUser = true;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user