Author SHA1 Message Date
klaatu 68faf6b124 chore: update flake.lock 2026-05-17
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.pkg-gcc-tune Build done.
buildbot/nix-build Build done.
2026-05-17 00:03:17 +00:00
Greg Hellings e5e4a38cf1 chore: begin updating zim updater
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
Update manifest chart versions / update-manifests (push) Successful in 29s
Update flake.lock / update-flake-lock (push) Successful in 2m49s
2026-05-13 11:01:33 -05:00
Greg Hellings 89faa7d97d fix: update SHA hashes 2026-05-13 10:50:26 -05:00
Greg Hellings fc4430e4f1 fix: system build fixes for new package setup 2026-05-13 08:33:48 -05:00
Greg Hellings f735423d98 chore: make zims separate packages
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.hm-exodus Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.hm-icdm-root Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.hm-jeremiah Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-genesis Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.hm-zeke Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-linode Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-darwin.hm-gregs-MacBook-Pro-16-inch-Nov-2024 Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-darwin.hm-ivr Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux."pkg-zim-wikipedia-wikipedia_ht_all_maxi.zim" Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux."pkg-zim-phet-phet_fr_all.zim" Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux."pkg-zim-phet-phet_en_all.zim" Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux."pkg-zim-wikiversity-wikiversity_fr_all_maxi.zim" Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux."pkg-zim-wikibooks-wikibooks_fr_all_maxi.zim" Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux."pkg-zim-wiktionary-wiktionary_fr_all_nopic.zim" Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux."pkg-zim-wikiversity-wikiversity_en_all_maxi.zim" Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux."pkg-zim-wikibooks-wikibooks_en_all_maxi.zim" Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux."pkg-zim-wiktionary-wiktionary_en_all_nopic.zim" Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux."pkg-zim-gutenberg-gutenberg_fr_all.zim" Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux."pkg-zim-wikisource-wikisource_en_all_maxi.zim" Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux."pkg-zim-wikisource-wikisource_fr_all_maxi.zim" Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux."pkg-zim-wikipedia-wikipedia_fr_all_maxi.zim" Build done.
buildbot/nix-build Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux."pkg-zim-wikipedia-wikipedia_en_all_maxi.zim" Build done.
2026-05-13 08:06:57 -05:00
Greg Hellings 985dd927c4 chore: move from attic to niks3
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-05-12 21:25:24 -05:00
Greg Hellings 10d6f85b5e chore: update pre-commit
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Update manifest chart versions / update-manifests (push) Successful in 3s
2026-05-10 01:48:45 -05:00
Greg Hellings 85cdfce6a9 fix: use proper runs-on for updates 2026-05-10 01:47:34 -05:00
Greg Hellings e62757cf1c chore: add Ubuntu 26.04 to matrix 2026-05-10 01:42:28 -05:00
Greg Hellings a1fb195bf4 chore: add podman-tui and other goodies
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Update flake.lock / update-flake-lock (push) Failing after 4s
2026-05-07 08:28:44 -05:00
Greg Hellings 9eb9fdec6c chore: try allowing nix darwin builds
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Update flake.lock / update-flake-lock (push) Failing after 3s
Update manifest chart versions / update-manifests (push) Successful in 4s
2026-04-30 17:18:36 -05:00
Greg Hellings a8323e2396 fix: unstick macOS builds for libdrm missing
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-04-30 16:13:36 -05:00
Greg Hellings 855ab6e277 chore: try forcing build of linux-builder packages
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-04-30 16:08:23 -05:00
Greg Hellings 2932e9e335 chore: remove vm-gitlab which is no longer in use 2026-04-30 16:06:58 -05:00
Greg Hellings 4940550c62 chore: enable linux-builder on Mac
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-04-30 14:42:55 -05:00
Greg Hellings 258934a46b chore: update Claude code usage 2026-04-30 14:42:29 -05:00
Greg Hellings 2476be3799 chore: make builder hostname more accessible
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-04-30 10:09:18 -05:00
Greg Hellings 08111e7a8a chore: add ssh key to remote-builder config 2026-04-30 10:08:57 -05:00
Greg Hellings 99cc8efea0 chore: add builders to darwin baseline
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-04-30 09:43:46 -05:00
Greg Hellings 09198fda28 Merge branch 'main' of srcpub:greg/nixos 2026-04-30 09:40:34 -05:00
Greg Hellings e16886c62c chore: add mcp-grafana to li 2026-04-30 09:40:25 -05:00
Greg Hellings c939d67cb6 chore: allow genesis to use its own DNS
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-04-29 16:11:20 -05:00
Greg Hellings 600aa885d4 chore: add minecraft server 2026-04-29 16:10:31 -05:00
Greg Hellings 8efd97599a chore: remove exodus, which is x86 linux
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-04-29 13:20:04 -05:00
Greg Hellings 686df31049 chore: make garnix builds an array
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-04-29 13:14:55 -05:00
Greg Hellings c3e3ca84a2 chore: cleanup unused packages on Darwin
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-04-29 13:02:12 -05:00
Greg Hellings f8cc47614f chore: remove unused genesis config bits
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-darwin.pkg-adblock_update Build done.
buildbot/nix-build Build done.
Update flake.lock / update-flake-lock (push) Failing after 8s
Update manifest chart versions / update-manifests (push) Successful in 4s
2026-04-24 18:56:10 -05:00
Greg Hellings 904754e059 fix: re-enable scheduling on Zeke disk replacement
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-04-24 06:46:29 -05:00
Greg Hellings 673f9b1f8b chore: expose credentials to Claude
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.pkg-setup-ssh Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.hm-jeremiah Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.hm-icdm-root Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.hm-linode Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.hm-exodus Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.hm-zeke Build done.
buildbot/nix-build Build done.
2026-04-22 21:59:30 -05:00
Greg Hellings 993385f1db chore: update flake pins 2026-04-22 21:59:16 -05:00
Greg Hellings 088c1a0033 chore: add new uuid for zeke
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.pkg-zim Build done.
buildbot/nix-build Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-icdm-root Build done.
2026-04-22 21:01:42 -05:00
Greg Hellings fcba03f3d0 chore: update Gitea to latest.
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.pkg-zim Build done.
buildbot/nix-build Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-icdm-root Build done.
2026-04-22 20:36:03 -05:00
Greg Hellings 8ba503ca5d chore: upgrade Immich db to PG 18 2026-04-21 16:22:21 -05:00
Greg Hellings 3b78dfec41 chore: add printer to network 2026-04-20 16:18:20 -05:00
Greg Hellings 8509fff746 chore: upgrade from dnsmasq to bind 2026-04-19 01:04:41 -05:00
Greg Hellings fb4c6966af chore: upgrade Nextcloud to 33
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.pkg-zim Build done.
buildbot/nix-build Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-icdm-root Build done.
Update manifest chart versions / update-manifests (push) Successful in 20s
Update flake.lock / update-flake-lock (push) Failing after 15s
2026-04-17 16:01:36 -05:00
Greg Hellings ec8c826565 chore: fix building
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.pkg-zim Build done.
buildbot/nix-build Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-icdm-root Build done.
2026-04-17 15:54:48 -05:00
Greg Hellings e84e03cd05 chore: move charts into manifests 2026-04-17 15:43:57 -05:00
Greg Hellings 2a81d137a8 chore: add linode to new home
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-darwin Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-linux Build done.
buildbot/nix-build Build done.
2026-04-17 18:42:41 +00:00
Greg Hellings 70934153ac chore: update lock and links 2026-04-16 13:00:36 -05:00
Greg Hellings db475b232f Merge branch 'main' of srcpub:greg/nixos 2026-04-15 13:56:51 -05:00
Greg Hellings 32a75d84cc chore: update locks and add pulumi plugins
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-linux Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-darwin Build done.
buildbot/nix-build Build done.
2026-04-15 08:53:28 -05:00
Greg Hellings 640552e260 Revert "chore: update flake pins"
This reverts commit 6d1490bd28.
2026-04-13 17:35:21 -05:00
Greg Hellings b37f597eaa chore: fix pathing 2026-04-13 17:35:01 -05:00
Greg Hellings f8954fd200 fix: correct workflow runner
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-linux Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-darwin Build done.
buildbot/nix-build Build done.
2026-04-13 16:08:44 -05:00
Greg Hellings 6d1490bd28 chore: update flake pins 2026-04-13 16:07:23 -05:00
Greg Hellings 234f000756 feat: claude code support 2026-04-13 16:00:26 -05:00
Greg Hellings 14c7f34108 chore: lithic stuff
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-darwin Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-linux Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux Build done.
buildbot/nix-build Build done.
Update manifest chart versions / update-manifests (push) Has been cancelled
Update flake.lock / update-flake-lock (push) Has been cancelled
2026-04-08 08:00:35 -05:00
Greg Hellings f354c3f353 chore: add mcp servers and claude code
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-linux Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-darwin Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux Build done.
buildbot/nix-build Build done.
2026-04-07 08:43:30 -05:00
Greg Hellings c0a0c64425 feat: add ~/.local/bin/ to nushell PATH
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-darwin Build done.
buildbot/nix-build gitea:greg/nixos#checks.aarch64-linux Build done.
buildbot/nix-build Build done.
2026-04-06 16:50:06 -05:00
Greg Hellings 05f3f118ac fix: simplify inject-darwin 2026-04-06 16:24:53 -05:00
Greg Hellings 21dbcb3113 feat: aws-cli and cargo on lithic 2026-04-06 16:23:03 -05:00
Greg Hellings 6b7f54d0a2 feat: pull dynamic names for Darwin/Home 2026-04-06 16:21:02 -05:00
Greg Hellings 0d70a9e018 feat: add li host
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-04-06 08:43:41 -05:00
Greg Hellings aee34e5b86 feat: more bookmarks 2026-04-05 20:03:51 -05:00
Greg Hellings 0460014b75 feat: Add minio-client and Discord to Exodus
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-04-05 19:45:36 -05:00
Greg Hellings 84d050fb0c fix: remove files before re-upload in Immich backup
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Update manifest chart versions / update-manifests (push) Has been cancelled
2026-04-05 16:52:04 -05:00
Greg Hellings 3847c7d92d fix: streamline Gitea runners 2026-04-05 16:51:31 -05:00
klaatu 81936ac524 feat: Gitea Actions shell runners + flake-lock workflow
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-linode Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-isaiah Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-jeremiah Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-zeke Build done.
buildbot/nix-build Build done.
- Add modules/nixos/gitea-runner.nix: NixOS module for act_runner in
  shell mode, with options for enable, instanceURL, name, labels, and
  tokenFile (agenix secret path).
- Deploy gitea-runner to jeremiah, isaiah, zeke, and linode with
  appropriate labels. Agenix secret placeholders left with TODOs.
- Add .gitea/workflows/update-flake-lock.yaml: weekly workflow (Sunday
  midnight) that runs nix flake update and opens a PR if flake.lock
  changed, using GITEA_TOKEN secret for authentication.

Closes part of #15 (NixOS shell runners + flake-lock workflow).
2026-04-05 04:58:27 -05:00
Greg Hellings 45d8154a04 Merge remote-tracking branch 'origin/feat/gitea-actions'
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Update flake.lock / update-flake-lock (push) Has been cancelled
2026-04-04 14:18:22 -05:00
Greg Hellings 03400f1c93 fix: pull correct secrets 2026-04-04 14:14:23 -05:00
greg 603598a3f9 Merge branch 'main' into feat/gitea-actions
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
2026-04-04 19:13:31 +00:00
klaatu 757b07c22f fix: replace placeholder Secret with ExternalSecret via bitwarden-login
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
2026-04-04 19:05:17 +00:00
klaatu b7fba0e151 fix: chart name act_runner -> actions, version 0.2.5 -> 0.0.4 2026-04-04 19:05:06 +00:00
greg 75278cdb6a Merge pull request 'fix: set MC_CONFIG_DIR to /tmp/.mc so mc can write config as non-root' (#20) from klaatu/nixos:fix/mc-config-dir into main
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Reviewed-on: https://src.thehellings.com/greg/nixos/pulls/20
Reviewed-by: greg <gitea@local.domain>
2026-04-04 18:23:42 +00:00
klaatu 67f12856e1 fix: set MC_CONFIG_DIR to /tmp/.mc so mc can write config as non-root
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
2026-04-04 18:18:43 +00:00
Greg Hellings 475c0eda64 fix: minio secrets exposed
buildbot/nix-effects Build done.
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
2026-04-04 13:11:31 -05:00
greg 828d61d818 Merge pull request 'feat: backup improvements — AlbyHub Restic, Gitea dump CronJob, Immich → MinIO' (#17) from klaatu/nixos:feature/backup-improvements into main
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Reviewed-on: https://src.thehellings.com/greg/nixos/pulls/17
Reviewed-by: greg <gitea@local.domain>
2026-04-04 18:00:16 +00:00
klaatu 0218447008 fix: address review feedback on backup improvements
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
- manifests/gitea/dump-cronjob.yaml: Remove --skip-log, --skip-custom-dir,
  --skip-db flags to make backup complete
- manifests/gitea/dump-cronjob.yaml: Replace NFS volume + cleanup container
  with S3 upload to backup-gitea bucket using MinIO client (mc).
  30-day lifecycle set via mc ilm. Uses minio_key/minio_secret from
  existing gitea-config secret.
- hosts/unstable/hosea/default.nix: Replace raw services.restic.backups.albyhub
  block with greg.backup.jobs.albyhub using the greg.backup module.
  Remove manual age.secrets.restic-env and age.secrets.restic-pw entries
  since the greg.backup module declares them.
2026-04-04 02:05:03 -05:00
klaatu 2741be72c7 feat: add update-manifests workflow
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
2026-04-04 06:18:14 +00:00
klaatu e8beb7f2a9 feat: add update-flake-lock workflow 2026-04-04 06:18:12 +00:00
klaatu b2728bf1de feat: add gitea-runner NixOS module 2026-04-04 06:18:10 +00:00
klaatu d65dcb51a3 feat: add gitea-runner secret placeholder 2026-04-04 06:18:07 +00:00
klaatu 87bc9a21d9 feat: add gitea-runner kustomization 2026-04-04 06:18:04 +00:00
klaatu ca25dde780 feat: add gitea-runner FluxCD HelmRelease 2026-04-04 06:18:01 +00:00
klaatu c61900f9e6 feat: add gitea-runner namespace manifest 2026-04-04 06:17:59 +00:00
klaatu 1077d357ca feat(immich): switch backup to rclone sync → MinIO immich bucket on nas1 2026-04-04 06:13:43 +00:00
klaatu 6b84824a53 feat(gitea): add dump-cronjob to kustomization 2026-04-04 06:13:00 +00:00
klaatu c74d647ec3 feat(gitea): add daily dump CronJob writing to NAS1 NFS 2026-04-04 06:12:56 +00:00
klaatu 58a5c95c32 feat(hosea): add Restic backup for AlbyHub /chain/alby 2026-04-04 06:12:31 +00:00
Greg Hellings 9a26c75884 chore: allow outgoing webhooks
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-04-03 23:49:27 -05:00
Greg Hellings 276b939252 fix: expose buildbot 2026-04-03 23:49:12 -05:00
greg 3eb44f2958 Merge pull request 'feat: expose Buildbot via nginx proxy on LAN' (#13) from klaatu/nixos:feat/buildbot-proxy into main
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Reviewed-on: https://src.thehellings.com/greg/nixos/pulls/13
2026-04-04 03:45:51 +00:00
klaatu 9bbdb74f85 fix: merge conflict — keep both nebula.enable and buildbot proxies
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
2026-04-03 22:18:17 -05:00
greg 35b6058c09 Merge pull request 'feat: Nebula mesh network overlay' (#12) from klaatu/nixos:feat/nebula-mesh into main
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Reviewed-on: https://src.thehellings.com/greg/nixos/pulls/12
2026-04-04 03:03:53 +00:00
Greg Hellings 88d9234332 fix: no default routes 2026-04-02 08:11:32 -05:00
root eabead05ab feat: expose Buildbot via nginx proxy on LAN
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
Add greg.proxies entries on jeremiah for buildbot.home and
buildbot.thehellings.lan, both proxying to http://localhost:8010/.
Nginx handles auth passthrough - Buildbot's own Gitea OAuth applies.

Add DNS aliases in genesis hosts file:
- buildbot.thehellings.lan → 10.42.1.8 (LAN)
- buildbot.home → 100.102.186.39 (Tailscale)
2026-04-01 17:31:38 -05:00
Greg Hellings a1bef073cf fix: generate linode certs
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
2026-04-01 17:20:46 -05:00
root f35e8c755c fix: only set listen.port on lighthouse/relay nodes (regular nodes use OS-assigned port 0)
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-linode Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-proxmoxtemplate Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-zeke Build done.
buildbot/nix-build Build done.
2026-04-01 17:14:12 -05:00
root 71ae25a58c fix: move unsafe_routes to settings.tun.unsafe_routes (correct NixOS nebula option path)
buildbot/nix-eval Build done.
2026-04-01 17:13:37 -05:00
root 0e61efe5b5 fix: rename tun.dev to tun.device (correct NixOS option name)
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-exodus Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-genesis Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-isaiah Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-zeke Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-jeremiah Build done.
buildbot/nix-build Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-hosea Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-linode Build done.
2026-04-01 17:07:47 -05:00
root 84e4c68f0e fix: move unsafeRoutes to module default, genesis overrides to []
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-genesis Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-exodus Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-hosea Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-isaiah Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-jeremiah Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-linode Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-zeke Build done.
buildbot/nix-build Build done.
Per review feedback:
- nebula module now defaults unsafeRoutes to [{route=10.42.0.0/16 via=10.157.0.2}]
  so all regular nodes get home LAN routing automatically
- genesis overrides unsafeRoutes=[] since it IS the routing node (avoids loop)
- exodus and all k3s nodes (hosea, isaiah, jeremiah, zeke) simplified to
  nebula.enable = true only, relying on the new default
2026-04-01 16:45:59 -05:00
greg 559155d411 Merge branch 'main' into feat/nebula-mesh
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-jeremiah Build done.
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-exodus Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-isaiah Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-genesis Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-linode Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-zeke Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-hosea Build done.
buildbot/nix-build Build done.
2026-04-01 21:36:08 +00:00
Greg Hellings 2bb0177ffa chore: add encrypted keys and unencrypted certs
buildbot/nix-eval Build done.
buildbot/nix-build Build started.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-exodus Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.hm-exodus Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-genesis Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-isaiah Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-jeremiah Build done.
2026-04-01 16:33:59 -05:00
Greg Hellings 15ed4ae5f7 chore: allow click.discord.com
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-04-01 15:49:32 -05:00
root 792217f640 feat: add Nebula mesh network overlay
buildbot/nix-eval Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-exodus Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-isaiah Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-genesis Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-linode Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-jeremiah Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-zeke Build done.
buildbot/nix-build gitea:greg/nixos#checks.x86_64-linux.nixos-hosea Build done.
buildbot/nix-build Build done.
Introduces a greg.nebula NixOS module and enables it across all managed
hosts for the nebula.thehellings.com overlay (CIDR: 10.157.0.0/16).

Architecture:
- linode: lighthouse + relay (public internet, UDP 4242)
- genesis: regular node + unsafe_routes router for 10.42.0.0/16 (home LAN)
- hosea, isaiah, jeremiah, zeke, exodus: regular nodes with unsafe_routes
  pointing to genesis to reach the home LAN

Changes:
- modules/nixos/nebula.nix: new greg.nebula module
  - isLighthouse / isRelay options
  - unsafeRoutes option (tun.unsafe_routes)
  - routesSubnet option: enables IP forwarding + nftables masquerade NAT
    on the gateway host (genesis) so Nebula peers reach 10.42.0.0/16
  - agenix secret reference per-host (secrets/nebula/<name>.key.age)
  - opens UDP/4242 in the firewall
- modules/nixos/default.nix: import nebula.nix
- hosts/unstable/linode/default.nix: greg.nebula.isLighthouse = true
- hosts/unstable/genesis/default.nix: greg.nebula.routesSubnet = "10.42.0.0/16"
- hosts/unstable/{hosea,isaiah,jeremiah,zeke,exodus}/default.nix:
  greg.nebula.enable = true with unsafeRoutes via genesis
- network.json: add nebulaIp field for each managed host
- secrets/secrets.nix: declare nebula/<host>.key.age entries
- secrets/nebula/README.md: full PKI bootstrap guide (CA, certs, agenix)
2026-03-28 23:24:52 -05:00
greg ba1914e48c Merge pull request 'feat: add top-5 fullest PVs panel to Kubernetes dashboard' (#11) from klaatu/nixos:feat/k8s-volume-dashboard into main
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Reviewed-on: https://src.thehellings.com/greg/nixos/pulls/11
2026-03-27 15:25:44 +00:00
root 07b3601206 feat: add top-5 fullest PVs panel to Kubernetes dashboard
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
Add a horizontal bar gauge showing the disk usage % of the 5 most-full
PersistentVolumes in the cluster, using kubelet volume stats already
scraped by Prometheus:

  topk(5, kubelet_volume_stats_used_bytes
           / kubelet_volume_stats_capacity_bytes * 100)

Labels show namespace/PVC name. Color thresholds: green <70%, yellow
70–90%, red >90%. Placed at the bottom of the dashboard (y=46).

Bump dashboard version to 3.
2026-03-27 09:06:19 -05:00
Greg Hellings 93458eb6d4 chore: slight updates to Network dashboard
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-03-27 09:03:07 -05:00
greg 6f7b3c238e Merge pull request 'fix: correct unpoller metric names in Network & UniFi dashboard' (#10) from klaatu/nixos:fix/network-dashboard-metrics into main
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Reviewed-on: https://src.thehellings.com/greg/nixos/pulls/10
Reviewed-by: greg <gitea@local.domain>
2026-03-27 13:51:18 +00:00
root de0b8fb07e fix: correct unpoller metric names in network dashboard
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
All metrics had wrong prefix (unifipoller_ → unpoller_) and several
had incorrect names entirely. Corrected against unpoller master source
(pkg/promunifi/):

- unifipoller_device_uptime_seconds → unpoller_device_uptime_seconds
- unifipoller_port_receive_bytes_total → unpoller_device_port_receive_bytes_total
  (port metrics live under device_ namespace: unpoller_device_port_*)
- unifipoller_port_transmit_bytes_total → unpoller_device_port_transmit_bytes_total
- unifipoller_device_wan_receive_bytes_total → unpoller_wan_max_rx_bytes_rate
  (no per-device WAN bytes total counter; WAN ns is unpoller_wan_*;
   rate metrics are already instantaneous gauges, no rate() wrapper)
- unifipoller_device_wan_transmit_bytes_total → unpoller_wan_max_tx_bytes_rate
- unifipoller_client_wifi_tx_rate_bps → count(unpoller_client_uptime_seconds{wired="false"})
  (no wifi-specific rate metric; wired label distinguishes client types)
- unifipoller_client_wired_tx_rate_bps → count(unpoller_client_uptime_seconds{wired="true"})
- unifipoller_client_receive_bytes_total → unpoller_client_receive_bytes_total
- unifipoller_client_transmit_bytes_total → unpoller_client_transmit_bytes_total

Bump dashboard version to 3.
2026-03-27 08:44:12 -05:00
greg 3111548c99 Merge pull request 'feat: kube-state-metrics, Restic ExternalSecret, updated dashboards' (#9) from klaatu/nixos:fix/observability-complete into main
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Reviewed-on: https://src.thehellings.com/greg/nixos/pulls/9
Reviewed-by: greg <gitea@local.domain>
2026-03-27 13:27:30 +00:00
Greg Hellings 841224b20f fix: update external-secrets apiVersion
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
2026-03-27 08:27:03 -05:00
171 changed files with 3166 additions and 2511 deletions
+51
View File
@@ -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\"]
}"
+58
View File
@@ -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\"]
}"
-23
View File
@@ -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
+3 -2
View File
@@ -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
+22 -23
View File
@@ -1,28 +1,38 @@
{
lib,
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; [
agenix
hms
];
@@ -31,23 +41,12 @@ in
nerd-fonts.hack
];
launchd.daemons = lib.genAttrs' [ "x86" "aarch" ] (arch: lib.nameValuePair "builder-${arch}-machine" (builder arch));
launchd.daemons.darwin-builder = builder;
nix = {
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?
};
+1 -4
View File
@@ -37,7 +37,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; }))
+1
View File
@@ -0,0 +1 @@
gregory
+1
View File
@@ -0,0 +1 @@
gregory
@@ -31,6 +31,7 @@ in
"bitwarden"
"bruno"
"chromium"
"claude"
"dbeaver-community"
"ghostty"
"firefox"
+1
View File
@@ -0,0 +1 @@
gregory/
+1
View File
@@ -0,0 +1 @@
lithic/
+53
View File
@@ -0,0 +1,53 @@
{ ... }:
let
username = "greg";
in
{
greg = {
nix.cache = false;
};
homebrew = {
enable = true;
brews = [
"bitwarden-cli"
"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"
"podman-desktop"
"tabby"
"zed"
];
user = username;
};
system.primaryUser = username;
users.users."${username}" = {
name = username;
home = "/Users/${username}";
};
}
Generated
+186 -279
View File
@@ -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": 1778391342,
"narHash": "sha256-7FVIfUHdQEB6HM+gUPLJVaL7ABrqlnMxS/pO+vNvjd8=",
"owner": "nix-community",
"repo": "buildbot-nix",
"rev": "f927795b97474875738ac134525af560b2d4a8a5",
"rev": "0bedd1aafd1653858d5f1e0f08eba3d7ec397dff",
"type": "github"
},
"original": {
@@ -46,36 +44,12 @@
"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": {
@@ -121,11 +95,11 @@
]
},
"locked": {
"lastModified": 1772379624,
"narHash": "sha256-NG9LLTWlz4YiaTAiRGChbrzbVxBfX+Auq4Ab/SWmk4A=",
"lastModified": 1777780666,
"narHash": "sha256-8wURyQMdDkGUarSTKOGdCuFfYiwa3HbzwscUfn3STDE=",
"owner": "lnl7",
"repo": "nix-darwin",
"rev": "52d061516108769656a8bd9c6e811c677ec5b462",
"rev": "8c62fba0854ba15c8917aed18894dbccb48a3777",
"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": 1778716662,
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "57928607ea566b5db3ad13af0e57e921e6b12381",
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
"type": "github"
},
"original": {
@@ -190,14 +177,17 @@
},
"flake-parts_2": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
"nixpkgs-lib": [
"nixvimunstable",
"nixpkgs"
]
},
"locked": {
"lastModified": 1772408722,
"narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=",
"lastModified": 1778716662,
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3",
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
"type": "github"
},
"original": {
@@ -207,27 +197,6 @@
}
},
"flake-parts_3": {
"inputs": {
"nixpkgs-lib": [
"nixvimunstable",
"nixpkgs"
]
},
"locked": {
"lastModified": 1769996383,
"narHash": "sha256-AnYjnFWgS49RlqX7LrC4uA+sCCDBj0Ry/WOJ5XWAsa0=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "57928607ea566b5db3ad13af0e57e921e6b12381",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-parts_4": {
"inputs": {
"nixpkgs-lib": [
"nurpkgs",
@@ -249,24 +218,6 @@
}
},
"flake-utils": {
"inputs": {
"systems": "systems_2"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_2": {
"locked": {
"lastModified": 1659877975,
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
@@ -281,53 +232,6 @@
"type": "github"
}
},
"haumea": {
"inputs": {
"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"
],
"nixpkgs": [
"buildbot",
"nixpkgs"
]
},
"locked": {
"lastModified": 1771131391,
"narHash": "sha256-HPBNYf7HiKtBVy7/69vKpLYHX6wTcUxndxmybzDlXP8=",
"owner": "hercules-ci",
"repo": "hercules-ci-effects",
"rev": "0b152e0f7c5cc265a529cd63374b80e2771b207b",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "hercules-ci-effects",
"type": "github"
}
},
"hmunstable": {
"inputs": {
"nixpkgs": [
@@ -335,11 +239,11 @@
]
},
"locked": {
"lastModified": 1772633327,
"narHash": "sha256-jl+DJB2DUx7EbWLRng+6HNWW/1/VQOnf0NsQB4PlA7I=",
"lastModified": 1778954430,
"narHash": "sha256-oaNyOr05lblaQdtbkbN1wO0b2KLIL2O1LkmwDgdQp4I=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "5a75730e6f21ee624cbf86f4915c6e7489c74acc",
"rev": "26aaab785b0bab4af60a2c42b22760fa906ef22a",
"type": "github"
},
"original": {
@@ -370,6 +274,45 @@
"type": "github"
}
},
"minecraft": {
"inputs": {
"flake-compat": "flake-compat_2",
"nixpkgs": "nixpkgs_2",
"systems": "systems_2"
},
"locked": {
"lastModified": 1778039471,
"narHash": "sha256-Arjg44jFcpSqOKK05EIxbKIjhfjou/EGF12COFU+9QA=",
"owner": "Infinidoge",
"repo": "nix-minecraft",
"rev": "87611ef4788116de05f851920c5958f0c37d5b05",
"type": "github"
},
"original": {
"owner": "Infinidoge",
"repo": "nix-minecraft",
"type": "github"
}
},
"niks3": {
"inputs": {
"nixpkgs": "nixpkgs_3",
"treefmt-nix": "treefmt-nix_2"
},
"locked": {
"lastModified": 1778839878,
"narHash": "sha256-S2nSP6YWUz8I2uRZuAY93FoAAUa9TiZetLzjBv1n5vk=",
"owner": "Mic92",
"repo": "niks3",
"rev": "c29f3641de064545d75f00318cd45bea2b4ea1d0",
"type": "github"
},
"original": {
"owner": "Mic92",
"repo": "niks3",
"type": "github"
}
},
"nix-github-actions": {
"inputs": {
"nixpkgs": [
@@ -393,11 +336,11 @@
},
"nix-hardware": {
"locked": {
"lastModified": 1771969195,
"narHash": "sha256-qwcDBtrRvJbrrnv1lf/pREQi8t2hWZxVAyeMo7/E9sw=",
"lastModified": 1778945272,
"narHash": "sha256-Aipz0UiBhE2a1FYJrNc2y+5vKWo5QVkhmaIJk3/ls+g=",
"owner": "nixos",
"repo": "nixos-hardware",
"rev": "41c6b421bdc301b2624486e11905c9af7b8ec68e",
"rev": "379c1f274f0fa354d012f0600806de54e79f29b5",
"type": "github"
},
"original": {
@@ -406,53 +349,7 @@
"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=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "5912c1772a44e31bf1c63c0390b90501e5026886",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1772328832,
"narHash": "sha256-e+/T/pmEkLP6BHhYjx6GmwP5ivonQQn0bJdH9YrRB+Q=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "c185c7a5e5dd8f9add5b2f8ebeff00888b070742",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixpkgs.lib",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1750134718,
"narHash": "sha256-v263g4GbxXv87hMXMCpjkIxd/viIF7p3JpJrwgKdNiI=",
@@ -468,13 +365,43 @@
"type": "github"
}
},
"nixpkgs_3": {
"nixpkgs-lib": {
"locked": {
"lastModified": 1772624091,
"narHash": "sha256-QKyJ0QGWBn6r0invrMAK8dmJoBYWoOWy7lN+UHzW1jc=",
"lastModified": 1777168982,
"narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixpkgs.lib",
"type": "github"
}
},
"nixpkgs-lib_2": {
"locked": {
"lastModified": 1778379128,
"narHash": "sha256-+yjPmoKsTqe/FQHriXzIfI0ELuEt3+1LXc0BE8nU/Yc=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "e361b0ff94723bc94283566dc2a13a46f07eaf5c",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixpkgs.lib",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1769461804,
"narHash": "sha256-msG8SU5WsBUfVVa/9RPLaymvi5bI8edTavbIq3vRlhI=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "80bdc1e5ce51f56b19791b52b2901187931f5353",
"rev": "bfc1b8a4574108ceef22f02bafcf6611380c100d",
"type": "github"
},
"original": {
@@ -484,29 +411,61 @@
"type": "github"
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1778491576,
"narHash": "sha256-9YOHDS9ANGbRmf3DSQ9UCvas3CyYNIBwBkKGQZTLXGY=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "1174f92bf37f1a5914be77e1b44482d6fbc75ecc",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable-small",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_4": {
"locked": {
"lastModified": 1766025857,
"narHash": "sha256-Lav5jJazCW4mdg1iHcROpuXqmM94BWJvabLFWaJVJp0=",
"lastModified": 1778869304,
"narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "def3da69945bbe338c373fddad5a1bb49cf199ce",
"rev": "d233902339c02a9c334e7e593de68855ad26c4cb",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_5": {
"locked": {
"lastModified": 1777207419,
"narHash": "sha256-V3bmPWAajDiC+1ClDOp55gianW2EyRJSJOyu1RUQibc=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "a7ecea3deccfbdbf22945a89984fcc5a169da8aa",
"type": "github"
},
"original": {
"owner": "nixos",
"repo": "nixpkgs",
"rev": "def3da69945bbe338c373fddad5a1bb49cf199ce",
"rev": "a7ecea3deccfbdbf22945a89984fcc5a169da8aa",
"type": "github"
}
},
"nixunstable": {
"locked": {
"lastModified": 1772963539,
"narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=",
"lastModified": 1778869304,
"narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "9dcb002ca1690658be4a04645215baea8b95f31d",
"rev": "d233902339c02a9c334e7e593de68855ad26c4cb",
"type": "github"
},
"original": {
@@ -518,18 +477,18 @@
},
"nixvimunstable": {
"inputs": {
"flake-parts": "flake-parts_3",
"flake-parts": "flake-parts_2",
"nixpkgs": [
"nixunstable"
],
"systems": "systems_3"
},
"locked": {
"lastModified": 1772402258,
"narHash": "sha256-3DmCFOdmbkFML1/G9gj8Wb+rCCZFPOQtNoMCpqOF8SA=",
"lastModified": 1778906310,
"narHash": "sha256-LqASEJRtLuKRBJd9051T1KMAEaYvsVrc6m64jhD6xbw=",
"owner": "nix-community",
"repo": "nixvim",
"rev": "21ae25e13b01d3b4cdc750b5f9e7bad68b150c10",
"rev": "06cace835d7ee727852ac789e3dcd42fc2fd360e",
"type": "github"
},
"original": {
@@ -541,15 +500,15 @@
},
"nurpkgs": {
"inputs": {
"flake-parts": "flake-parts_4",
"nixpkgs": "nixpkgs_3"
"flake-parts": "flake-parts_3",
"nixpkgs": "nixpkgs_4"
},
"locked": {
"lastModified": 1772717146,
"narHash": "sha256-x2nJlzpiHWHLkGDBvaiO1ysLhaxjQCLsG3XieRueJ/c=",
"lastModified": 1778975705,
"narHash": "sha256-DweZZ/JO7AxbQ9+caW8Jt8L5MtjMvVWpKDS+MAiWN8E=",
"owner": "nix-community",
"repo": "NUR",
"rev": "2e1bffbdde931c4300a59418d0150c7457022f2d",
"rev": "25081c3d50352c88e7502e2a1c76fda8560b2b41",
"type": "github"
},
"original": {
@@ -558,66 +517,18 @@
"type": "github"
}
},
"pyproject-build-systems": {
"inputs": {
"nixpkgs": [
"charts",
"nixpkgs"
],
"pyproject-nix": [
"charts",
"pyproject-nix"
],
"uv2nix": [
"charts",
"uv2nix"
]
},
"locked": {
"lastModified": 1763662255,
"narHash": "sha256-4bocaOyLa3AfiS8KrWjZQYu+IAta05u3gYZzZ6zXbT0=",
"owner": "pyproject-nix",
"repo": "build-system-pkgs",
"rev": "042904167604c681a090c07eb6967b4dd4dae88c",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "build-system-pkgs",
"type": "github"
}
},
"pyproject-nix": {
"inputs": {
"nixpkgs": [
"charts",
"nixpkgs"
]
},
"locked": {
"lastModified": 1764134915,
"narHash": "sha256-xaKvtPx6YAnA3HQVp5LwyYG1MaN4LLehpQI8xEdBvBY=",
"owner": "pyproject-nix",
"repo": "pyproject.nix",
"rev": "2c8df1383b32e5443c921f61224b198a2282a657",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "pyproject.nix",
"type": "github"
}
},
"root": {
"inputs": {
"agenix": "agenix",
"buildbot": "buildbot",
"charts": "charts",
"colmena": "colmena",
"darwin": "darwin_2",
"flake-parts": "flake-parts_2",
"flake-parts": "flake-parts",
"hmunstable": "hmunstable",
"minecraft": "minecraft",
"niks3": "niks3",
"nix-hardware": "nix-hardware",
"nixpkgs-lib": "nixpkgs-lib_2",
"nixunstable": "nixunstable",
"nixvimunstable": "nixvimunstable",
"nurpkgs": "nurpkgs",
@@ -694,11 +605,11 @@
]
},
"locked": {
"lastModified": 1770228511,
"narHash": "sha256-wQ6NJSuFqAEmIg2VMnLdCnUc0b7vslUohqqGGD+Fyxk=",
"lastModified": 1775636079,
"narHash": "sha256-pc20NRoMdiar8oPQceQT47UUZMBTiMdUuWrYu2obUP0=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "337a4fe074be1042a35086f15481d763b8ddc0e7",
"rev": "790751ff7fd3801feeaf96d7dc416a8d581265ba",
"type": "github"
},
"original": {
@@ -707,41 +618,37 @@
"type": "github"
}
},
"uv2nix": {
"treefmt-nix_2": {
"inputs": {
"nixpkgs": [
"charts",
"niks3",
"nixpkgs"
],
"pyproject-nix": [
"charts",
"pyproject-nix"
]
},
"locked": {
"lastModified": 1767701098,
"narHash": "sha256-CJhKZnWb3gumR9oTRjFvCg/6lYTGbZRU7xtvcyWIRwU=",
"owner": "pyproject-nix",
"repo": "uv2nix",
"rev": "9d357f0d2ce6f5f35ec7959d7e704452352eb4da",
"lastModified": 1775636079,
"narHash": "sha256-pc20NRoMdiar8oPQceQT47UUZMBTiMdUuWrYu2obUP0=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "790751ff7fd3801feeaf96d7dc416a8d581265ba",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "uv2nix",
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
},
"vsext": {
"inputs": {
"nixpkgs": "nixpkgs_4"
"nixpkgs": "nixpkgs_5"
},
"locked": {
"lastModified": 1772678592,
"narHash": "sha256-1VZ1hg1YHW+WyBXIOfrQ9Oq+qLL0w93lkdKAiRRHEuI=",
"lastModified": 1778902753,
"narHash": "sha256-4tgJmu6sc6F6y+igJfh+kG0t2U1T2cDwfhz5hC0W2Tg=",
"owner": "nix-community",
"repo": "nix-vscode-extensions",
"rev": "5521856f37c3d2654fe9b20b03331a6594f855c6",
"rev": "5df06838c483ad33aa5fb1448b9ba9de665930a1",
"type": "github"
},
"original": {
@@ -752,17 +659,17 @@
},
"wsl": {
"inputs": {
"flake-compat": "flake-compat_2",
"flake-compat": "flake-compat_3",
"nixpkgs": [
"nixunstable"
]
},
"locked": {
"lastModified": 1772386632,
"narHash": "sha256-sm6OpWZuoDwR53KNlsY482YOoHFWlWYwt0wHmqLkRGE=",
"lastModified": 1777732699,
"narHash": "sha256-2uX/XtOWZ/oy2rerRynVhqVA//ZXZ3Fo60PikLHEPQc=",
"owner": "nix-community",
"repo": "NixOS-WSL",
"rev": "be894604b2aa2184c0b3d3b44995acd0da14dc0c",
"rev": "5482f113fd31ebac131d1ebeb2ae90bf0d5e41f5",
"type": "github"
},
"original": {
+10 -6
View File
@@ -13,9 +13,6 @@
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";
@@ -26,7 +23,10 @@
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";
nixpkgs-lib.url = "github:nix-community/nixpkgs.lib";
nixvimunstable = {
url = "github:nix-community/nixvim/main";
inputs.nixpkgs.follows = "nixunstable";
@@ -50,6 +50,7 @@
top.nixvimunstable.overlays.default
top.nurpkgs.overlays.default
top.vsext.overlays.default
top.minecraft.overlay
];
metadata = builtins.fromJSON (builtins.readFile ./network.json);
systems = [
@@ -68,6 +69,7 @@
};
}
);
lib' = import ./lib { inherit (top.nixunstable) lib; };
in
top.flake-parts.lib.mkFlake { inputs = top; } {
inherit systems;
@@ -79,6 +81,7 @@
nixpkgs = imported_packages.x86_64-linux;
specialArgs = {
inherit
lib'
metadata
self
top
@@ -115,7 +118,7 @@
nixosConfigurations = (
import ./hosts {
inherit top metadata;
inherit top metadata lib';
nixpkgs = imported_packages;
}
);
@@ -144,16 +147,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;
};
};
};
+21 -22
View File
@@ -1,23 +1,22 @@
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
+9 -1
View File
@@ -1,5 +1,5 @@
# vim: set filetype=nushell :
let servers = [isaiah jeremiah zeke genesis vm-gitlab]
let servers = [isaiah jeremiah zeke genesis]
def par-map [ items: list, c: closure ] {
let results = $items | par-each -k $c
@@ -69,6 +69,14 @@ def dc [ $cmd: string = "sh" ] {
}
}
def claude [ ] {
unlock
$env.GITLAB_TOKEN = ^bw get item 7d3da4e9-5f9a-49d0-8e14-b39c010a4001 | from json | get fields | find claudeapi | get value
#$env.ANTHROPIC_API_KEY = ^bw get item e122fd08-3506-4f21-9c6a-b42b00fe5be1 | from json | get login.password
^claude
}
if ("/usr/local/bin" | path exists) {
$env.PATH = $env.PATH | append "/usr/local/bin"
}
$env.PATH = $env.PATH | prepend "~/.local/bin"
+1
View File
@@ -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";
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -12,7 +12,7 @@
dig
jqp
kubernetes-helm
iamb
#iamb
lazyssh
rainfrog
tenere
-5
View File
@@ -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
View File
@@ -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
View File
@@ -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
+8
View File
@@ -21,11 +21,19 @@
kubectl
kubectl-cnpg
mattermost-desktop
minio-client
mumble
pre-commit
prismlauncher
restic
restic-browser
tea
wineWow64Packages.stable
];
programs = {
discord = {
enable = true;
settings.SKIP_HOST_UPDATE = true;
};
};
}
@@ -1,21 +1,9 @@
{
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,28 +16,21 @@ in
home = {
packages = with pkgs; [
aacs
ansible
claude-code
direnv
home-manager
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 = ''
@@ -60,9 +41,11 @@ in
https://pypidev.ivrtechnology.com/simple/
'';
".config/uv/uv.toml".text = ''
index-strategy = "unsafe-first-match"
[[index]]
url = "https://pypidev.ivrtechnology.com/simple/"
name = "pypidev"
ignore-error-codes = [403]
'';
};
username = username;
@@ -108,6 +91,5 @@ in
"web4"
]
);
tmux.shell = (lib.getExe x);
};
}
+1
View File
@@ -0,0 +1 @@
lithic/
+1
View File
@@ -0,0 +1 @@
gregory.hellings-mbp/
View File
+73
View File
@@ -0,0 +1,73 @@
{
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
direnv
home-manager
just
mcp-grafana
nixVersions.stable
podman
poetry
pre-commit
(pulumi.withPackages (
p: with p; [
pulumi-aws-native
pulumi-command
pulumi-go
pulumi-nodejs
pulumi-python
]
))
python
rustc
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;
};
};
};
};
}
-7
View File
@@ -1,7 +0,0 @@
{ pkgs, ... }:
{
greg.vscodium.enable = false;
home.packages = with pkgs; [ brew ];
}
+44 -12
View File
@@ -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 = {
+8 -33
View File
@@ -1,5 +1,6 @@
{
top,
lib',
metadata,
nixpkgs,
}:
@@ -14,11 +15,17 @@ 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 = [
{
@@ -44,16 +51,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 +59,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" ];
}
];
};
}
+8 -5
View File
@@ -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 = {
+116 -38
View File
@@ -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,120 @@ 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";
};
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/8032/790/refinedstorage-fabric-3.0.0-beta.8.jar";
hash = "sha256-XY5I+sw5JlWnKK/hPUOJsk2gnmqH4Iygq+aooN27NJY=";
};
# 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=";
};
}
);
};
};
};
};
};
+2 -5
View File
@@ -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
@@ -37,10 +35,9 @@
100.88.91.27 dns.home
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.117.28.111 gitlab.home gitlab.shire-zebra.ts.net gitlab.thehellings.lan registry.thehellings.lan git.thehellings.lan
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.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
+53 -31
View File
@@ -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;
@@ -24,9 +25,20 @@ let
];
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?
@@ -84,33 +96,43 @@ in
#########
# 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}";
in
pkgs.writeText "${domain}" (
builtins.concatStringsSep "\n" (preamble ++ (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
+103 -17
View File
@@ -6,6 +6,7 @@
config,
metadata,
pkgs,
top,
...
}:
let
@@ -19,11 +20,30 @@ in
# 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 +69,7 @@ in
greg = {
home = true;
nebula.enable = true;
proxies = {
"jellyfin.home".target = "http://localhost:8096/";
"jellyfin.thehellings.lan".target = "http://localhost:8096/";
@@ -59,6 +80,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 +118,7 @@ in
];
};
};
firewall.interfaces.nebula0.allowedTCPPorts = [ 5751 ];
nameservers = [ metadata.infra.dns ];
};
@@ -143,6 +171,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:9000";
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 = {
@@ -285,7 +334,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 +439,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 +484,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 +529,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 +537,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 +568,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"}}
}
]
+3 -43
View File
@@ -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;
+7 -8
View File
@@ -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
];
@@ -143,7 +142,7 @@ in
updateOutputs = false;
};
};
domain = "${config.networking.hostName}.shire-zebra.ts.net:8010";
domain = "${config.networking.hostName}.shire-zebra.ts.net";
evalMaxMemorySize = 8192;
evalWorkerCount = 4;
gitea = {
+11 -16
View File
@@ -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 -1
View File
@@ -61,7 +61,7 @@ in
(
val:
lib.nameValuePair "/_${val}" {
proxyPass = "http://matrix.kubernetes";
proxyPass = "https://matrix.shire-zebra.ts.net";
}
)
[
+1 -1
View File
@@ -13,7 +13,7 @@
services.nextcloud = {
enable = true;
package = pkgs.nextcloud32;
package = pkgs.nextcloud33;
appstoreEnable = true;
hostName = "next.${config.networking.domain}";
https = true;
-1
View File
@@ -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" ];
};
+7 -2
View File
@@ -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;
+5 -8
View File
@@ -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 = [ ];
-273
View File
@@ -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;
}
+24
View File
@@ -0,0 +1,24 @@
{ 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;
})
(
lib.filterAttrs (
_host: settings: (builtins.hasAttr netAttr settings) && (builtins.getAttr netAttr settings) != null
) hosts
);
}
+1 -1
View File
@@ -40,7 +40,7 @@ metadata:
},
{
"path": "/mnt/disk1",
"allowScheduling": false,
"allowScheduling": true,
"tags": ["hdd", "large"]
}
]
-3
View File
@@ -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
+5 -16
View File
@@ -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
+14
View File
@@ -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
+1
View File
@@ -4,3 +4,4 @@ resources:
- namespace.yaml
- chart.yaml
- user.yaml
- ingress.yaml
-89
View File
@@ -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
-2
View File
@@ -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
-2
View File
@@ -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
-9
View File
@@ -1,9 +0,0 @@
apiVersion: postgresql.cnpg.io/v1
kind: Database
metadata:
name: database-gitlab
spec:
name: gitlab
owner: gitlab
cluster:
name: postgres
-68
View File
@@ -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
+56
View File
@@ -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,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
+18
View File
@@ -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
+4 -2
View File
@@ -15,7 +15,7 @@ spec:
chart:
spec:
chart: gitea
version: "12.5.0"
version: "12.5.3"
sourceRef:
kind: HelmRepository
name: gitea-repository
@@ -35,7 +35,7 @@ spec:
storageClass: longhorn-default
image:
tag: "1.25.4"
tag: "1.25.5"
replicaCount: 1
@@ -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
+78
View File
@@ -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
+1
View File
@@ -6,3 +6,4 @@ resources:
- chart.yaml
- ingress.yaml
- secrets.yaml
- dump-cronjob.yaml
+13 -2
View File
@@ -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:
-64
View File
@@ -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
-101
View File
@@ -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
+36
View File
@@ -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
+3
View File
@@ -1,3 +1,6 @@
resources:
- kyverno.yaml
- external-secrets.yaml
- tailscale.yaml
- longhorn.yaml # Needed for storage
- traefik.yaml
+40
View File
@@ -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
+6 -1
View File
@@ -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.1"
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:
+82 -8
View File
@@ -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
+2 -2
View File
@@ -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:
+161
View File
@@ -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 -1
View File
@@ -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
-1
View File
@@ -7,7 +7,6 @@ resources:
- mariadb-operator
- databases
- matrix
#- gitlab-runner
- immich
- monitoring
- pinchflat
+1 -1
View File
@@ -1,4 +1,4 @@
apiVersion: external-secrets.io/v1beta1
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: restic-credentials
+2
View File
@@ -158,6 +158,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;
+43
View File
@@ -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 = [
@@ -351,6 +368,15 @@
}
];
}
{
name = "Jurisdictions";
bookmarks = [
{
name = "Weatherford";
url = "https://weatherfordtx.gov/3062/Development-Services";
}
];
}
{
name = "Door Loop";
url = "https://btrgpm.app.doorloop.com/home";
@@ -359,6 +385,14 @@
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";
}
];
}
{
@@ -378,6 +412,15 @@
}
];
}
{
name = "Home";
bookmarks = [
{
name = "Home Assistant";
url = "http://10.42.2.155:8123/config/dashboard";
}
];
}
];
}
]
+15 -7
View File
@@ -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://nas1.shire-zebra.ts.net:9000/niks3"
#"http://nas1.shire-zebra.ts.net:8080/default"
]
else
[
"http://nas1.thehellings.lan:8080/default"
]
)
++ [
"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="
+35
View File
@@ -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";
};
};
};
};
}
+3 -1
View File
@@ -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
];
+110
View File
@@ -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;
};
};
};
};
}
-82
View File
@@ -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;
};
};
});
}
+2 -41
View File
@@ -2,14 +2,13 @@
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";
@@ -86,43 +85,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"
@@ -138,7 +100,6 @@ in
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 (
+229
View File
@@ -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
}
'';
};
};
};
}
+1 -1
View File
@@ -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";
};
+1
View File
@@ -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;
-1
View File
@@ -18,7 +18,6 @@ with lib;
devices = {
chronicles.id = "7FI6Y3M-C7YQEDI-IB345L6-RKLXMB6-AEIV57Y-3J2RCXQ-MK6QRNK-EINPXAE";
genesis.id = "YDTH4SD-GUAC5AA-SSYWYPZ-YMJW5LK-LE7PZKJ-GV2UJFZ-CU7LZAD-GTYWCQK";
gitlab.id = "GKNOZWI-CNC2Q2F-R5GGGDX-RYFGHK4-CCC37LC-GVOEMJI-46QPC6G-AWFEOQE";
linode.id = "IJMMXPR-WNALZBD-FMJH5W5-WV7XGJY-HLJTKGT-5TKHJIH-75LT56D-UUZCYQE";
};
options = {
+39 -15
View File
@@ -2,8 +2,11 @@
"infra": {
"dns": "10.42.1.5",
"gw": "10.42.1.1",
"lan": "10.42.0.0/16",
"netmask": "255.255.0.0",
"prefix": "16"
"nebula": "10.157.0.0/16",
"prefix": "16",
"tailscale": "100.64.0.0/10"
},
"hosts": {
"chronicles": {
@@ -16,21 +19,24 @@
"ip": null,
"pubkey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFxmnCj2E9DxcnefPW+n4yCuLShxqr0p024riogdeXA3",
"ts": "100.70.99.91",
"system": "x86_64-linux"
"system": "x86_64-linux",
"nebulaIp": "10.157.0.7"
},
"genesis": {
"ip": "10.42.1.5",
"pubkey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO/CGE2rqlL2Qr0TJkwQMsHFSDkhGWlrUlvfcvcylO1n",
"ts": "100.96.198.104",
"system": "x86_64-linux",
"tags": ["router", "server"]
"tags": ["router", "server"],
"nebulaIp": "10.157.0.2"
},
"hosea": {
"ip": "10.42.1.7",
"pubkey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKLIwkTTXA56sUlUjEulXXZRvZy5H4a5ZwgKWLlpkQDz",
"ts": "100.68.203.1",
"system": "x86_64-linux",
"tags": ["server"]
"tags": ["server"],
"nebulaIp": "10.157.0.3"
},
"icdm-root": {
"external": true,
@@ -43,15 +49,17 @@
"ts": "100.84.183.79",
"system": "x86_64-linux",
"systems": ["x86_64-linux", "aarch64-linux"],
"tags": ["builder", "kube", "server"]
"tags": ["builder", "kube", "server"],
"nebulaIp": "10.157.0.4"
},
"iso": {
"external": true,
"system": "x86_64-linux"
},
"ivr": {
"gregory.hellings-mbp": {
"external": true,
"system": "aarch64-darwin"
"system": "aarch64-darwin",
"user": "gregory.hellings"
},
"jeremiah": {
"builder": true,
@@ -60,27 +68,41 @@
"ts": "100.102.186.39",
"system": "x86_64-linux",
"systems": ["x86_64-linux", "aarch64-linux"],
"tags": ["builder", "kube", "server"]
"tags": ["builder", "kube", "server"],
"nebulaIp": "10.157.0.5"
},
"joel": {
"external": true,
"ip": "10.42.0.4",
"ts": null
},
"gregs-MacBook-Pro-16-inch-Nov-2024": {
"external": true,
"system": "aarch64-darwin"
},
"lithic": {
"external": true,
"system": "aarch64-darwin"
},
"linode": {
"ip": null,
"pubkey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMv9Zud3kZOl86gtmkn+uj3D4kiXWDPtyUL02VVLNR4Q",
"ts": "100.109.86.8",
"system": "x86_64-linux",
"tags": ["public", "server"]
"tags": ["public", "server"],
"nebulaIp": "10.157.0.1"
},
"ivr": {
"external": true,
"system": "aarch64-darwin"
},
"MacBook-Pro.local": {
"external": true,
"system": "aarc64-darwin"
"system": "aarch64-darwin"
},
"MacBook-Prolocal.local": {
"external": true,
"system": "aarc64-darwin"
"system": "aarch64-darwin"
},
"nas1": {
"external": true,
@@ -91,13 +113,14 @@
"external": true,
"system": "x86_64-linux"
},
"printer": {
"external": true,
"ip": "10.42.1.3"
},
"proxmoxtemplate": {
"external": true,
"system": "x86_64-linux"
},
"gitlab": {
"system": "x86_64-linux"
},
"wsl": {
"external": true,
"system": "aarch64-linux"
@@ -109,7 +132,8 @@
"ts": "100.90.74.19",
"system": "x86_64-linux",
"systems": ["x86_64-linux", "aarch64-linux"],
"tags": ["builder", "kube", "server"]
"tags": ["builder", "kube", "server"],
"nebulaIp": "10.157.0.6"
}
}
}
-3
View File
@@ -10,7 +10,6 @@ final: prev:
in
{
daikinone = cp ./daikinone.nix { };
xonsh-apipenv = cp ./xonsh-apipenv.nix { };
}
)
];
@@ -25,11 +24,9 @@ final: prev:
withBDplus = true;
};
handbrake = prev.handbrake.override { libbluray = final.libbluray-custom; };
pipenv-ivr = prev.callPackage ./pipenv.nix { };
OVMFFull = prev.OVMFFull.override {
secureBoot = true;
msVarsTemplate = true;
tpmSupport = true;
};
}
// (import ../pkgs { pkgs = prev; })
-92
View File
@@ -1,92 +0,0 @@
{
lib,
stdenv,
python3,
fetchFromGitHub,
installShellFiles,
}:
let
runtimeDeps =
ps:
with ps;
[
certifi
pysocks
setuptools
(pip.overridePythonAttrs {
dependencies = [ ps.pysocks ];
})
virtualenv
virtualenv-clone
]
++ lib.optionals stdenv.hostPlatform.isAndroid [ pyjnius ];
pythonEnv = python3.withPackages runtimeDeps;
in
python3.pkgs.buildPythonApplication rec {
pname = "pipenv";
version = "2023.11.15";
format = "pyproject";
src = fetchFromGitHub {
owner = "pypa";
repo = "pipenv";
rev = "refs/tags/v${version}";
hash = "sha256-kxwyws22xJkqBy/hXXcAPHZR2NgZHbmwZr9vYqce434=";
};
env.LC_ALL = "en_US.UTF-8";
nativeBuildInputs = with python3.pkgs; [
installShellFiles
setuptools
wheel
];
postPatch = ''
# pipenv invokes python in a subprocess to create a virtualenv
# and to call setup.py.
# It would use sys.executable, which in our case points to a python that
# does not have the required dependencies.
substituteInPlace pipenv/utils/virtualenv.py \
--replace "sys.executable" "'${pythonEnv.interpreter}'"
'';
propagatedBuildInputs = runtimeDeps python3.pkgs;
preCheck = ''
export HOME="$TMPDIR"
'';
nativeCheckInputs = with python3.pkgs; [
mock
pytestCheckHook
pytest-xdist
pytz
requests
];
disabledTests = [
"test_convert_deps_to_pip"
"test_download_file"
];
disabledTestPaths = [ "tests/integration" ];
postInstall = ''
installShellCompletion --cmd pipenv \
--bash <(_PIPENV_COMPLETE=bash_source $out/bin/pipenv) \
--zsh <(_PIPENV_COMPLETE=zsh_source $out/bin/pipenv) \
--fish <(_PIPENV_COMPLETE=fish_source $out/bin/pipenv)
'';
meta = with lib; {
description = "Python Development Workflow for Humans";
license = licenses.mit;
platforms = platforms.all;
maintainers = with maintainers; [ berdario ];
};
}
-31
View File
@@ -1,31 +0,0 @@
{
lib,
buildPythonPackage,
fetchFromGitHub,
toPythonModule,
pipenv,
setuptools,
}:
buildPythonPackage rec {
pname = "xonsh-apipenv";
version = "0.6.0";
pyproject = true;
src = fetchFromGitHub {
owner = "greg-hellings";
repo = "xontrib-apipenv";
rev = version;
hash = "sha256-Wa8iev0ow1oh95tPCv5tAJUMBYiStWms8I31WbVcOok=";
};
dependencies = [ (toPythonModule pipenv) ];
build-system = [ setuptools ];
meta = with lib; {
description = "Auto pipenv support for Xonsh";
homepage = "https://github.com/greg-hellings/xontrib-apipenv";
license = licenses.mit;
maintainers = [ ];
};
}
+21
View File
@@ -0,0 +1,21 @@
{
writeShellApplication,
curl,
gnused,
}:
writeShellApplication {
name = "adblock-update";
runtimeInputs = [
curl
gnused
];
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" "click.discord.com"; do
sed -i -e "/''${f}/d" /etc/adblock_hosts # Blocks Trelly content for house investors
done
'';
}
+29 -27
View File
@@ -1,35 +1,37 @@
{
pkgs,
system ? pkgs.stdenv.hostPlatform.system,
top,
...
}:
let
c = pkgs.callPackage;
c = pkgs.newScope packages;
packages = if system == "x86_64-linux" then (allSys // x86Linux) else allSys;
allSys = {
#default = iso;
#iso = top.self.nixosConfigurations.iso.config.system.build.isoImage;
#iso-beta = self.nixosConfigurations.iso-beta.config.system.build.isoImage;
aacs = c ./aacs.nix { };
adblock_update = c ./adblock_update.nix { };
brew = c ./homebrew.nix { };
create_ssl = c ./create_ssl.nix { };
gcc-tune = c ./gcc-tune.nix { };
#gen-build = c ./gen-build { };
hms = c ./hms { };
inject-darwin = c ./inject-darwin.nix { };
inject = c ./inject.nix { };
setup-ssh = c ./setup-ssh { };
upgrade-pg-cluster = c ./upgrade-pg-cluster.nix { };
};
x86Linux = {
qemu-hook = c ./qemu-hook.nix { };
vfio_startup = c ./vfio_startup.nix { };
vfio_shutdown = c ./vfio_shutdown.nix { };
}
// (import ./zim {
inherit (top.nixpkgs-lib) lib;
inherit pkgs;
});
in
{
#default = iso;
#iso = top.self.nixosConfigurations.iso.config.system.build.isoImage;
#iso-beta = self.nixosConfigurations.iso-beta.config.system.build.isoImage;
aacs = c ./aacs.nix { };
brew = c ./homebrew.nix { };
create_ssl = c ./create_ssl.nix { };
gcc-tune = c ./gcc-tune.nix { };
#gen-build = c ./gen-build { };
hms = c ./hms { };
inject-darwin = c ./inject-darwin.nix { };
inject = c ./inject.nix { };
setup-ssh = c ./setup-ssh { };
upgrade-pg-cluster = c ./upgrade-pg-cluster.nix { };
}
// (
if system == "x86_64-linux" then
{
qemu-hook = c ./qemu-hook.nix { };
vfio_startup = c ./vfio_startup.nix { };
vfio_shutdown = c ./vfio_shutdown.nix { };
zim = c ./zim.nix { };
}
else
{ }
)
packages
+7 -16
View File
@@ -3,6 +3,7 @@
coreutils,
curl,
gnutar,
inetutils,
nix,
...
}:
@@ -12,27 +13,17 @@ writeShellApplication {
coreutils
curl
gnutar
inetutils
nix
];
text = ''
dir="$(mktemp -d)"
cd "''${dir}"
# Install nix-darwin
nix-build https://github.com/LnL7/nix-darwin/archive/master.tar.gz -A installer
./result/bin/darwin-installer
# Get my configuration
mkdir -p ~/.config/darwin
cd ~/.config/darwin
curl -O -L https://github.com/greg-hellings/nixos-config/archive/refs/heads/main.tar.gz
tar xvzf main.tar.gz --strip-components 1
cd /etc/nix-darwin
# Build NixOS for this system
pushd "''${dir}"
nix build "''${HOME}/.config/darwin#darwinConfigurations.$(hostname -s).system"
./result/sw/bin/darwin-rebuild switch --flake ~/.config/darwin
popd
rm -r "''${dir}"
nix --extra-experimental-features "nix-command flakes" build ".#darwinConfigurations.$(hostname -s).system"
sudo mv /etc/bashrc /etc/bashrc.before-nix-darwin
sudo mv /etc/zshrc /etc/zshrc.before-nix-darwin
sudo ./result/sw/bin/darwin-rebuild switch --flake .
'';
}
+48 -32
View File
@@ -1,72 +1,88 @@
{
"en": {
"gutenberg": {
"name": "gutenberg_en_all_2023-08.zim",
"hash": "sha256-wWi0vTyMD/Es0w/jk9uyg4DN94080thPfT5uphEqbUc="
"name": "gutenberg_en_all",
"version": "2023-08",
"hash": "sha256-OXmdHdsLZcW4nCUQsy7sMpUssS8NV7ztkCgS/nsISuw="
},
"phet": {
"name": "phet_en_all_2025-03.zim",
"hash": "sha256-HT/gVNydkOitny6oUl2A+JvbFDGAIeb0h+xbMeQ2Rqs="
"name": "phet_en_all",
"version": "2025-03",
"hash": "sha256-ARuUzU2o17J2/ZedHc2acXl33dtHCbQJEb72UQUEm1Y="
},
"wikibooks": {
"name": "wikibooks_en_all_maxi_2025-10.zim",
"hash": "sha256-zmcvrvGO+LEHt7x8/SoguBDODUyRXy9x5LUGAkS+fF8="
"name": "wikibooks_en_all_maxi",
"version": "2025-10",
"hash": "sha256-ONBh/ze1Fv2Ffm5b9vDzYS/i2cWSa4pM4MLZnozr2n8="
},
"wikipedia": {
"name": "wikipedia_en_all_maxi_2025-08.zim",
"hash": "sha256-r7Cd0vjEb84Ftw+EwZSlqb8qhqm8WA3LAPdHAav7wrg="
"name": "wikipedia_en_all_maxi",
"version": "2026-02",
"hash": "sha256-vwhTv5TtjFNSTl7mcoi8SJiBm8nUlq8rP4UrZYir3Sc="
},
"wikisource": {
"name": "wikisource_en_all_maxi_2025-11.zim",
"hash": "sha256-jPHh/C20PARN6K7aPNw3k9fFHhpwzsREi/1o1DIISS4="
"name": "wikisource_en_all_maxi",
"version": "2025-11",
"hash": "sha256-p1Jio+PMTZVSLIDIOBeMG3acXJg83CwQM7zIWDUyozM="
},
"wikiversity": {
"name": "wikiversity_en_all_maxi_2025-11.zim",
"hash": "sha256-0DaE2EUdHvaX3XqD3f0lwurSAaDZ4hEKtrMEutL5xt0="
"name": "wikiversity_en_all_maxi",
"version": "2025-11",
"hash": "sha256-IG/gAUdc/vHRrIWGHhw8vMJdLWwqrNbfh+SiclQRIAI="
},
"wiktionary": {
"name": "wiktionary_en_all_nopic_2025-09.zim",
"hash": "sha256-EzrrruJQWY/3pP93WCTeCCfaPvpshqdkR0TFxVz7bEI="
"name": "wiktionary_en_all_nopic",
"version": "2025-09",
"hash": "sha256-Ghcb60qeGaSJtTKQkJoMx/XucX7Lt1XY145lD3gHlMg="
}
},
"fr": {
"gutenberg": {
"name": "gutenberg_fr_all_2025-10.zim",
"hash": "sha256-1gU7v//LYX/2LyIRjO02A1fWPQz9Y7Qt5ftgeazd3G8="
"name": "gutenberg_fr_all",
"version": "2025-10",
"hash": "sha256-gLHxLXJNwwcxM/mZHtoJ8ojbGQ1fugxgni/+RXccwhU="
},
"phet": {
"name": "phet_fr_all_2025-03.zim",
"hash": "sha256-K56i55WPu5EMQHIrnnqhgJ32WozZ6oYD9X3IBytGA0A="
"name": "phet_fr_all",
"version": "2025-03",
"hash": "sha256-CSboZNTIowLLhp1u9wkxH8xmu3LvQNx5q493AOYJRIc="
},
"wikibooks": {
"name": "wikibooks_fr_all_maxi_2025-09.zim",
"hash": "sha256-PQSdPbBHwK3IfFPH5GsKaxkNGTlZVJNJEI8gNioBl1U="
"name": "wikibooks_fr_all_maxi",
"version": "2025-09",
"hash": "sha256-KHCc/73L5Bd9iZ47SRV6vpI8fVM1v9hk1TpEvTro2uo="
},
"wikipedia": {
"name": "wikipedia_fr_all_maxi_2025-06.zim",
"hash": "sha256-zzDhITMd1nRMYTUlvn56l4VBnpFuhiNrhhYMcrrBuOQ="
"name": "wikipedia_fr_all_maxi",
"version": "2025-06",
"hash": "sha256-ve7Mbh96/ObNbV/KVNYZpfLN+HdWlJ7C5LItEdVkRH0="
},
"wikisource": {
"name": "wikisource_fr_all_maxi_2025-09.zim",
"hash": "sha256-2gEY5nTBecrmg61VJerxO4/oV7dZJmRgzLkqrcocW/0="
"name": "wikisource_fr_all_maxi",
"version": "2025-09",
"hash": "sha256-FdLYCjoT6Yk34AZKFND/NaBHNe+GzW9Ibpd6mVPWlxI="
},
"wikiversity": {
"name": "wikiversity_fr_all_maxi_2025-09.zim",
"hash": "sha256-4vOxYiX3TYht7ARY+PeCJ0ArVZZn9TeGtwCieqn3xUw="
"name": "wikiversity_fr_all_maxi",
"version": "2025-09",
"hash": "sha256-55fdtw/cRezq6nkRp6wuwkukBiqsQKdwh9QWVAgFcBI="
},
"wiktionary": {
"name": "wiktionary_fr_all_nopic_2025-11.zim",
"hash": "sha256-oQS8DzKioceCER1p1oAvaS1gRooMLJLYnCqy1aLARi4="
"name": "wiktionary_fr_all_nopic",
"version": "2025-11",
"hash": "sha256-P0CJptee5rDzccxyRDBzyRLuuFOcaLsJYi6DkBFUfIc="
}
},
"ht": {
"phet": {
"name": "phet_ht_all_2025-03.zim",
"hash": "sha256-UjC0REJ5d5wIKccutZADX74IxvZuF+CD/caVzZfHg9s="
"name": "phet_ht_all",
"version": "2025-03",
"hash": "sha256-bHrPzE8H7ptrP6r5wPlXSsXNlTiKxJ9KatABC4kwx+s="
},
"wikipedia": {
"name": "wikipedia_ht_all_maxi_2025-09.zim",
"hash": "sha256-spT7EFXLnI0FWT9Vlvp7QEP0urntmQ2C+fQB5bVLoLE="
"name": "wikipedia_ht_all_maxi",
"version": "2026-04",
"hash": "sha256-qUX0pKxIyNsWX4V6kNIsP4Z9nc6TDhwdDR0MmpDOQFs="
}
}
}

Some files were not shown because too many files have changed in this diff Show More