Compare commits

..

643 Commits

Author SHA1 Message Date
a-kenji
8e1a0a0c5a init 2024-05-24 22:59:33 +02:00
clan-bot
fdacfb8ecf Merge pull request 'documenation: use monospace font for code blocks' (#1425) from a-kenji-fix-monospace into main 2024-05-24 11:11:02 +00:00
a-kenji
508a26d68d documenation: use monospace font for code blocks
Use monospace font for code blocks.

Fixes: #1337
2024-05-24 13:08:00 +02:00
clan-bot
8055c21984 Merge pull request 'clan machines list: reduce noise' (#1418) from a-kenji-fix/output-noisy/1115 into main 2024-05-24 10:58:13 +00:00
a-kenji
9bb6ed313f clan machines list: reduce noise
Don't log nix error output by default on `clan machines list`.
Log it, if `--debug` is passed.

Fixes #1115
2024-05-24 12:55:14 +02:00
clan-bot
8c36df77cc Merge pull request 'documentation: improve legibility of command output' (#1423) from a-kenji-fix/lsblk into main 2024-05-24 10:40:34 +00:00
a-kenji
2284b060be documentation: improve legibility of command output
Improve legibility of command output.
2024-05-24 12:37:27 +02:00
clan-bot
491b5d28f2 Merge pull request 'documenation: fix flake-parts what's next section' (#1422) from a-kenji-fix/docs/flake-parts into main 2024-05-24 10:14:55 +00:00
a-kenji
bf212ce9c4 documenation: fix flake-parts what's next section 2024-05-24 12:11:42 +02:00
clan-bot
35be09feaa Merge pull request 'impure-checks: unset CLAN_DIR' (#1420) from a-kenji-fix/env into main 2024-05-24 10:06:10 +00:00
a-kenji
4ee90b4b9f impure-checks: unset CLAN_DIR
Unset `CLAN_DIR` in the impure checks, so that it won't reference the
users configuration.

Fixes #1419
2024-05-24 12:03:11 +02:00
clan-bot
cab69935ef Merge pull request 'lib.jsonschema: parse some more types' (#1417) from DavHau-dave into main 2024-05-23 14:17:56 +00:00
DavHau
54fcfda43e lib.jsonschema: parse some more types 2024-05-23 16:12:49 +02:00
clan-bot
d137342243 Merge pull request 'modules: init trusted-nix-cache module' (#1414) from a-kenji-add/cache-module into main 2024-05-23 07:32:36 +00:00
a-kenji
3eba6e85cc modules: init trusted-nix-cache module 2024-05-23 09:29:31 +02:00
clan-bot
d395e2abf3 Merge pull request 'flake.nix: change disko back to nix-community' (#1409) from change_disko_input into main 2024-05-22 19:17:48 +00:00
Qubasa
b971156df1 flake.nix: change disko back to nix-community 2024-05-22 21:14:30 +02:00
clan-bot
c885a3fec8 Merge pull request 'Revert "Merge pull request 'add pre-commit-check' (#1369) from fricklerhandwerk/clan-core:add-pre-commit into main"' (#1408) from Qubasa-revert_hooks into main 2024-05-22 12:36:23 +00:00
Qubasa
ae7794dddd Revert "Merge pull request 'add pre-commit-check' (#1369) from fricklerhandwerk/clan-core:add-pre-commit into main"
This reverts commit acaa69e2bf, reversing
changes made to a78f5b2bec.
2024-05-22 14:31:53 +02:00
Luis Hebendanz
acaa69e2bf Merge pull request 'add pre-commit-check' (#1369) from fricklerhandwerk/clan-core:add-pre-commit into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1369
2024-05-22 11:49:57 +00:00
Valentin Gagarin
e37f7e2760 use a custom installer for pre-commit hooks 2024-05-22 11:49:57 +00:00
Valentin Gagarin
245b615209 add pre-commit check
make sure things are sane before they hit CI.
this re-purposes the existing treefmt configuration.
2024-05-22 11:49:57 +00:00
clan-bot
a78f5b2bec Merge pull request 'zerotier-static-peers: init module' (#1400) from a-kenji-modules/init/static-zerotier-hosts into main 2024-05-22 10:40:41 +00:00
a-kenji
396caeff39 zerotier-static-peers: init module
Init zerotertier-static-peers module.
This module automatically configures the networkId.
It will automatically accept peers based on their zerotier-ips in the
clan flake.
2024-05-22 12:37:13 +02:00
clan-bot
d5a639104d Merge pull request 'user-password: set prompt to true by default' (#1399) from a-kenji-user-password/on-by-default into main 2024-05-22 10:19:04 +00:00
a-kenji
fb1b428c12 user-password: set prompt to true by default 2024-05-22 12:15:26 +02:00
clan-bot
bfe37c2457 Merge pull request 'modules: static hosts filter nonexistent ip' (#1398) from a-kenji-fix/path-loading into main 2024-05-21 15:28:52 +00:00
a-kenji
39b34d9ff3 modules: static hosts filter nonexistent ip 2024-05-21 17:24:14 +02:00
clan-bot
fd29ed4693 Merge pull request 'zerotier-members: fix joining by member ip' (#1397) from a-kenji-fix/by-ip into main 2024-05-21 14:42:35 +00:00
a-kenji
9db4e5cf2f zerotier-members: fix joining by member ip 2024-05-21 16:39:28 +02:00
clan-bot
e28a02ec73 Merge pull request 'clan ui: setup typed api method' (#1391) from hsjobeki-main into main 2024-05-21 14:06:45 +00:00
Johannes Kirschbauer
c1e7e25641 api: fix typing issues 2024-05-21 16:01:57 +02:00
Johannes Kirschbauer
21104a0465 webview: replace dream2nix by buildNpm from nixpkgs to save inputs 2024-05-21 15:52:20 +02:00
clan-bot
0f53475499 Merge pull request 'documentation: remove references to Icons for introductory material' (#1392) from a-kenji-rm/icon into main 2024-05-21 09:19:51 +00:00
a-kenji
7aa85d8aaf documentation: remove references to Icons for introductory material
The icons are not yet used in this path.
This is unneccessary overhead for new users, with no payoff yet.
2024-05-21 11:16:12 +02:00
Johannes Kirschbauer
e9b0ce6a78 clan ui: add check to build script 2024-05-21 10:09:05 +02:00
Johannes Kirschbauer
d174fbd445 clan ui: move print into log.debug statements 2024-05-20 19:59:50 +02:00
Johannes Kirschbauer
8687801cee clan ui: setup typed api method 2024-05-20 19:34:49 +02:00
clan-bot
6ebfd29c87 Merge pull request 'clanModule.sshd: Deactivate password auth. Change flake template to every machine having its own disko.nix file.' (#1389) from Qubasa-main into main 2024-05-20 17:14:24 +00:00
Qubasa
c8456f7d68 clanModule.sshd: Deactivate password auth. Change flake template to every machine having its own disko.nix file. 2024-05-20 19:11:12 +02:00
clan-bot
6b03645f7a Merge pull request 'clan-ui: rollback default view until webview is ready' (#1388) from feat/ui into main 2024-05-20 09:11:35 +00:00
Johannes Kirschbauer
2cb7adb377 clan-ui: rollback default view until webview is ready 2024-05-20 11:08:14 +02:00
clan-bot
78ab7ebc7f Merge pull request 'Automatic flake update - 2024-05-20T00:00+00:00' (#1387) from flake-update-2024-05-20 into main 2024-05-20 00:03:44 +00:00
Clan Merge Bot
82a4ecf82b update flake lock - 2024-05-20T00:00+00:00
Flake lock file updates:

• Updated input 'dream2nix':
    'github:nix-community/dream2nix/995e831dac8c2c843f1289d15dfec526cb84afdd' (2024-05-14)
  → 'github:nix-community/dream2nix/f28d1cc6898532ac331a1625628090dc7c5b02e2' (2024-05-19)
• Updated input 'flake-parts':
    'github:hercules-ci/flake-parts/e5d10a24b66c3ea8f150e47dfdb0416ab7c3390e' (2024-05-02)
  → 'github:hercules-ci/flake-parts/8dc45382d5206bd292f9c2768b8058a8fd8311d9' (2024-05-16)
• Updated input 'nixos-generators':
    'github:nix-community/nixos-generators/722b512eb7e6915882f39fff0e4c9dd44f42b77e' (2024-04-22)
  → 'github:nix-community/nixos-generators/a63e0c83dd83fe28cc571b97129e13373436bd82' (2024-05-19)
• Updated input 'nixos-images':
    'github:nix-community/nixos-images/81e709ca1da9c5c31b65cc8f82a97181f78ec076' (2024-05-13)
  → 'github:nix-community/nixos-images/8c9cab8c44434c12dafc465fbf61a710c5bceb08' (2024-05-19)
• Updated input 'nixos-images/nixos-2311':
    'github:NixOS/nixpkgs/6eccabe980dcb2048aab7f97f862fb6d79b98abe' (2024-05-12)
  → 'github:NixOS/nixpkgs/95742536dc6debb5a8b8b78b27001c38f369f1e7' (2024-05-16)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/c029b7f004009923bbfc90bbc31263cd4b08759f' (2024-05-15)
  → 'github:NixOS/nixpkgs/8a2555763c48e2410054de3f52f7310ce3241ec5' (2024-05-19)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/b6cb5de2ce57acb10ecdaaf9bbd62a5ff24fa02e' (2024-05-12)
  → 'github:Mic92/sops-nix/0bf1808e70ce80046b0cff821c019df2b19aabf5' (2024-05-19)
• Updated input 'treefmt-nix':
    'github:numtide/treefmt-nix/c6aaf729f34a36c445618580a9f95a48f5e4e03f' (2024-04-25)
  → 'github:numtide/treefmt-nix/2fba33a182602b9d49f0b2440513e5ee091d838b' (2024-05-17)
2024-05-20 00:00:21 +00:00
clan-bot
43b56e21b2 Merge pull request 'zerotier-members: allow joining by zerotier ip' (#1386) from a-kenji-main into main 2024-05-19 21:16:24 +00:00
a-kenji
a47c2f3e69 zerotier-members: allow joining by zerotier ip 2024-05-19 23:13:26 +02:00
clan-bot
a34fa4f69b Merge pull request 'init: static-hosts module' (#1385) from a-kenji-init/statix-hosts-module into main 2024-05-19 11:09:54 +00:00
clan-bot
e13217b1c9 Merge pull request 'user-password: fix module path' (#1384) from a-kenji-fix/user-passord-module into main 2024-05-19 11:08:42 +00:00
a-kenji
1e4a3a3eee user-password: fix module path
Fixes #1381
2024-05-19 13:03:47 +02:00
a-kenji
e39d8cb909 init: static-hosts module 2024-05-19 13:01:37 +02:00
clan-bot
7c48730bbb Merge pull request 'clan flash: Use latest kernel with zfs support. bcachefs supported too.' (#1379) from Qubasa-main into main 2024-05-18 21:50:26 +00:00
Qubasa
da5f363bee clan flash: Use latest kernel with zfs support. bcachefs supported too. 2024-05-18 23:47:17 +02:00
clan-bot
24ec74ae37 Merge pull request 'Add bcachefs support. Fix clan flash docu.' (#1378) from Qubasa-main into main 2024-05-18 21:21:14 +00:00
Qubasa
64a98281f0 Add bcachefs support. Fix clan flash docu. 2024-05-18 23:18:02 +02:00
hsjobeki
5863ddca0e Merge pull request 'init webview: add webview ui and list machine as api example' (#1365) from feat/ui into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1365
2024-05-18 14:14:12 +00:00
Johannes Kirschbauer
5de3ab88e9 devShell: fallback for darwin 2024-05-18 14:14:12 +00:00
Johannes Kirschbauer
4cfc335e2c fix: segfault gtk when using webkit 2024-05-18 14:14:12 +00:00
Johannes Kirschbauer
e25bd69c68 clan ui: override webkitgtk unbroken on darwin. 2024-05-18 14:14:12 +00:00
Johannes Kirschbauer
fe17f9e1a1 clan ui: integrate webview ui into clan-mananger-gtk 2024-05-18 14:14:12 +00:00
Johannes Kirschbauer
7980f13bed add webview threaded api 2024-05-18 14:14:12 +00:00
Johannes Kirschbauer
fef16a84a9 init webview: add webview ui and list machine as api example 2024-05-18 14:14:12 +00:00
clan-bot
97a1d8b52a Merge pull request 'Change favicon. Add socials. Add RSS link.' (#1372) from Qubasa-main into main 2024-05-17 14:10:22 +00:00
Qubasa
f9b32cbd09 Change favicon. Add socials. Add RSS link. 2024-05-17 16:07:14 +02:00
clan-bot
4d66f2a14c Merge pull request 'readme: Update matrix link' (#1371) from Qubasa-main into main 2024-05-16 18:42:35 +00:00
Qubasa
473c236214 Fix rss plugin warning 2024-05-16 20:39:39 +02:00
Qubasa
eeaf1c84a9 Add profile picture for W 2024-05-16 19:43:55 +02:00
Qubasa
f6efd11eae Working dark theme switcher 2024-05-16 19:32:05 +02:00
Qubasa
8762ee4420 Migrated blog to mkdocs 2024-05-16 15:08:24 +02:00
Qubasa
0568608be6 readme: Update matrix link 2024-05-15 23:00:08 +02:00
clan-bot
a0194f34d2 Merge pull request 'ssh-flash & documentation' (#1350) from ssh-flash into main 2024-05-15 20:58:02 +00:00
Qubasa
b3297532ad nix flake update & disable checks.flash-installer 2024-05-15 22:54:38 +02:00
Qubasa
cd915e171f template: Throw error on missing ssh pub key 2024-05-14 18:29:04 +02:00
Qubasa
1e94bf02da Add nix flake check remark to docu 2024-05-14 18:20:56 +02:00
Qubasa
1c2781267b Add clan flash documentation. 2024-05-14 16:13:50 +02:00
Qubasa
ac8162a08d Fix doc build error 2024-05-14 15:41:15 +02:00
Qubasa
1476619515 Renamed machines.md to deploy.md 2024-05-14 15:41:15 +02:00
Qubasa
8288048682 Renamed machines.md to deploy.md 2024-05-14 15:41:15 +02:00
Qubasa
fd41badbc6 Add --no-reboot flag to clan machine install 2024-05-14 15:41:15 +02:00
Qubasa
d574faf253 Heavily improve documentation and flake template 2024-05-14 15:41:15 +02:00
Qubasa
81522c96e5 Fix missing efi and x64 support in template 2024-05-14 15:41:15 +02:00
Qubasa
e668a7f536 Fix build error 2024-05-14 15:41:15 +02:00
Qubasa
3293ac0c14 fix get_keymap_and_locale 2024-05-14 15:41:15 +02:00
Qubasa
be841cdec2 Removed ssh password login 2024-05-14 15:41:15 +02:00
Qubasa
49e39ec505 Add keymap and language detection 2024-05-14 15:41:15 +02:00
Qubasa
c25f7934ba clan flash: Copied network-status from nixos-images into installer 2024-05-14 15:41:15 +02:00
Qubasa
4f6d25160f Add --ssh-pubkey FILE argument 2024-05-14 15:41:15 +02:00
clan-bot
0bf9a566eb Merge pull request 'clan-cli(docs): modularize in preparation for manpage generation' (#1361) from a-kenji-docs/modularize into main 2024-05-14 10:21:44 +00:00
a-kenji
148a0c90cc clan-cli(docs): modularize in preparation for manpage generation 2024-05-14 12:18:37 +02:00
clan-bot
789bf3d0c8 Merge pull request 'docs: remove linenums from every code block' (#1360) from a-kenji-docs-patch-8 into main 2024-05-14 09:39:14 +00:00
a-kenji
59c558ffc6 docs: remove linenums from every code block
Remove linenums from every single code block.
Makes site considerably less busy and easier to read.
2024-05-14 11:32:30 +02:00
clan-bot
c5e62074a6 Merge pull request 'docs: user-password add admonition' (#1359) from a-kenji-docs/fix into main 2024-05-14 09:31:53 +00:00
a-kenji
9999379f81 docs: user-password add admonition 2024-05-14 11:29:07 +02:00
clan-bot
dd1cfe3834 Merge pull request 'modules: init user-password' (#1358) from a-kenji-modules/init/user-password into main 2024-05-14 08:58:37 +00:00
a-kenji
cd0b360b49 modules: init user-password
Init a user-password module, that allows setting the password for a
single user.

fixes #1351
2024-05-14 10:55:43 +02:00
clan-bot
8c0fb90c1a Merge pull request 'Reorder getting started documentation' (#1345) from Qubasa-main into main 2024-05-10 21:02:33 +00:00
Qubasa
86ae7cbbfb Reorder getting started documentation 2024-05-10 22:59:45 +02:00
clan-bot
fdf63fd605 Merge pull request 'Fix template. Improve docu. Add disko as default imported module.' (#1342) from Qubasa-main into main 2024-05-10 13:42:12 +00:00
Qubasa
82fa89b57e Fix template. Improve docu. Add disko as default imported module. 2024-05-10 15:39:46 +02:00
clan-bot
cad492e830 Merge pull request 'fix docs .envrc watch_file' (#1339) from Qubasa-main into main 2024-05-09 13:05:34 +00:00
Qubasa
2abd5bbe37 fix docs .envrc watch_file 2024-05-09 15:00:03 +02:00
clan-bot
aad130166f Merge pull request 'hsjobeki-main' (#1332) from hsjobeki-main into main 2024-05-08 10:30:16 +00:00
Johannes Kirschbauer
3e9a1ea68f vm-manager: hide hidden vm log info 2024-05-08 12:27:16 +02:00
Johannes Kirschbauer
2acd06c9fa docs: add faq page 2024-05-08 12:23:04 +02:00
clan-bot
f45d3385c2 Merge pull request 'template: fix disko devices' (#1328) from a-kenji-docs-patch-7 into main 2024-05-07 20:48:50 +00:00
a-kenji
23c9291912 template: fix disko devices 2024-05-07 22:46:15 +02:00
clan-bot
1893ebef19 Merge pull request 'docs: simplify hardware-configuration' (#1326) from a-kenji-docs-patch-5 into main 2024-05-07 19:40:06 +00:00
a-kenji
fd00a941dc docs: simplify hardware-configuration 2024-05-07 21:37:25 +02:00
clan-bot
9ab5a9507d Merge pull request 'docs: add tip for wlan configuration' (#1325) from a-kenji-docs-patch-4 into main 2024-05-07 19:29:11 +00:00
a-kenji
1a4c20e49e add: tip 2024-05-07 21:26:15 +02:00
clan-bot
f138e59da8 Merge pull request 'docs: add reference to the help page' (#1324) from a-kenji-docs-patch-3 into main 2024-05-07 18:47:50 +00:00
a-kenji
ddd9318ea1 docs: add reference to the help page 2024-05-07 20:45:09 +02:00
clan-bot
aee2fdcffa Merge pull request 'docs: improve getting started prerequisite docs' (#1322) from a-kenji-docs-patch-2 into main 2024-05-07 13:48:22 +00:00
a-kenji
d1b810dfad docs: improve getting started prerequisite docs 2024-05-07 15:45:38 +02:00
clan-bot
4dede0ee5c Merge pull request 'docs: add link to cli reference' (#1321) from a-kenji-improve/docs into main 2024-05-07 13:37:40 +00:00
a-kenji
3506d6ba0d docs: add link to cli reference 2024-05-07 15:34:56 +02:00
clan-bot
f2a3415e2c Merge pull request 'clan-cli: add --json and --png flags to machine install' (#1320) from a-kenji-feat/clan-install-json into main 2024-05-07 12:52:21 +00:00
a-kenji
2e821c4525 clan-cli: add --json and --png flags to machine install
Allow using `clan machines [machine] install` in conjunction with the
`--json` and `--png` flags.

Fixes #1180
2024-05-07 14:47:13 +02:00
clan-bot
bbba7e9087 Merge pull request 'disko module: add default for singleDiskExt4' (#1300) from hsjobeki-main into main 2024-05-07 11:29:19 +00:00
Johannes Kirschbauer
15dd4ea25f cli-docs: add automatic markdown cli docs 2024-05-07 13:26:33 +02:00
Johannes Kirschbauer
5a6eeda125 disko module: add default for singleDiskExt4 2024-05-07 13:11:04 +02:00
clan-bot
f8e08a610e Merge pull request 'Add jsonschema test case' (#1309) from Qubasa-main into main 2024-05-04 12:14:07 +00:00
Qubasa
fc7f544199 Fix invalid jsonschema testcase 2024-05-04 14:11:28 +02:00
Luis Hebendanz
8aaa95737a Merge pull request 'ci: Change from deploy on pull_request to deploy on main push' (#1313) from Qubasa-autodeploy into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1313
2024-05-04 11:42:45 +00:00
Qubasa
7dedae9920 ci: Change from deploy on pull_request to deploy on main push 2024-05-04 13:42:16 +02:00
clan-bot
01e5b02633 Merge pull request 'ci: Change from deploy on pull_request to deploy on main push' (#1312) from Qubasa-autodeploy into main 2024-05-04 11:40:49 +00:00
Qubasa
f4de3ac83d ci: Change from deploy on pull_request to deploy on main push 2024-05-04 13:37:56 +02:00
clan-bot
9e65cf2b5b Merge pull request 'gitea_action: Add docs.clan.lol auto deploy' (#1311) from Qubasa-autodeploy into main 2024-05-04 11:34:28 +00:00
Qubasa
8134583641 Remove print of priv key in ci 2024-05-04 13:31:30 +02:00
Qubasa
5d8ee29ed4 Merge branch 'fix_secrets' into autodeploy 2024-05-04 13:12:17 +02:00
Qubasa
d9ce211d1a secrets: Fix test failure through flake update 2024-05-04 13:11:37 +02:00
Qubasa
9ec8b71765 moonlight-sunshine-accept: Fix formatting error 2024-05-03 20:38:53 +02:00
Qubasa
4fef9c3652 gitea_action: Add docs.clan.lol auto deploy 2024-05-03 20:34:27 +02:00
Qubasa
393ed517e2 jsonschema: Filter out 'invisible' options, that are there to throw errors on define 2024-05-03 19:40:42 +02:00
Qubasa
159198b81a Add jsonschema test case 2024-05-03 19:40:42 +02:00
Clan Merge Bot
83ea2312a1 update flake lock - 2024-04-29T00:00+00:00
Flake lock file updates:

• Updated input 'disko':
    'github:nix-community/disko/0a17298c0d96190ef3be729d594ba202b9c53beb' (2024-04-05)
  → 'github:nix-community/disko/285e26465a0bae510897ca04da26ce6307c652b4' (2024-04-26)
• Updated input 'nixos-generators':
    'github:nix-community/nixos-generators/0c15e76bed5432d7775a22e8d22059511f59d23a' (2024-04-04)
  → 'github:nix-community/nixos-generators/722b512eb7e6915882f39fff0e4c9dd44f42b77e' (2024-04-22)
• Updated input 'nixos-generators/nixlib':
    'github:nix-community/nixpkgs.lib/90b1a963ff84dc532db92f678296ff2499a60a87' (2024-03-31)
  → 'github:nix-community/nixpkgs.lib/3c62b6a12571c9a7f65ab037173ee153d539905f' (2024-04-07)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/298edc8f1e0dfffce67f50375c9f5952e04a6d02' (2024-04-07)
  → 'github:NixOS/nixpkgs/30ddacc06345a478f9528fa29e2c8857b90381b2' (2024-04-28)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/39191e8e6265b106c9a2ba0cfd3a4dafe98a31c6' (2024-04-07)
  → 'github:Mic92/sops-nix/f1b0adc27265274e3b0c9b872a8f476a098679bd' (2024-04-23)
• Updated input 'treefmt-nix':
    'github:numtide/treefmt-nix/49dc4a92b02b8e68798abd99184f228243b6e3ac' (2024-04-01)
  → 'github:numtide/treefmt-nix/c6aaf729f34a36c445618580a9f95a48f5e4e03f' (2024-04-25)
2024-05-03 10:31:23 +00:00
Mic92
022a55639f Merge pull request 'rename everything to Clan' (#1301) from ci into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1301
2024-05-03 09:47:55 +00:00
Jörg Thalheim
6f2430b191 deprecate gitea nix builds 2024-05-03 11:45:02 +02:00
Jörg Thalheim
6236defde6 rename everything to Clan 2024-05-03 11:45:02 +02:00
clan-bot
9a8a5f4c00 Merge pull request 'Throw error on missing clanModule description or if description too long. Add xfce description.' (#1306) from Qubasa-main into main 2024-05-02 16:00:32 +00:00
Qubasa
6908527ebd Throw error on missing clanModule description or if description too long. Add xfce description. 2024-05-02 17:53:27 +02:00
clan-bot
d013ef20da Merge pull request 'Require README.md for every clan module' (#1302) from Qubasa-main into main 2024-05-02 15:03:59 +00:00
Qubasa
570f04ecdc Fix zt-tcp-relay 2024-05-02 16:59:17 +02:00
Qubasa
3a9a7eedf9 Remove unreferenced clan modules 2024-05-02 16:34:25 +02:00
Qubasa
ee552d3020 Move vm clanModules to lib 2024-05-02 16:34:25 +02:00
Qubasa
b95d95554a Add description field to function-schema 2024-05-02 16:34:25 +02:00
Qubasa
a09e680fa0 Require README.md for every clan module 2024-05-02 16:34:25 +02:00
clan-bot
853d8221c0 Merge pull request 'qga: add argument 'check'' (#1303) from DavHau-dave into main 2024-05-02 13:13:12 +00:00
DavHau
43c799c3d0 qga: add argument 'check' 2024-05-02 15:03:22 +02:00
clan-bot
f231f1e0c7 Merge pull request 'check jsonschema comaptibility for all clan modules' (#1280) from schema into main 2024-05-01 21:18:33 +00:00
Qubasa
a48df5b993 Add package function-schema and module-schema. Add check for module jsonschema. 2024-05-01 23:16:17 +02:00
clan-bot
e08342a6f3 Merge pull request 'template: remove invalid enable option for zerotier' (#1299) from hsjobeki-main into main 2024-04-30 17:41:46 +00:00
Johannes Kirschbauer
e0f56c3c6b template: remove invalid enable option for zerotier 2024-04-30 19:37:03 +02:00
clan-bot
64c5a81f74 Merge pull request 'template: use disko module direcly' (#1298) from hsjobeki-main into main 2024-04-30 17:23:08 +00:00
Johannes Kirschbauer
56fad0fd4a template: use disko module direcly 2024-04-30 19:16:13 +02:00
clan-bot
3dce5d2f95 Merge pull request 'add cli docs generator' (#1297) from hsjobeki-main into main 2024-04-30 17:11:37 +00:00
Johannes Kirschbauer
bfe4f2c8f4 add cli docs generator 2024-04-30 19:01:53 +02:00
Johannes Kirschbauer
1051367ca4 add cli docs generator 2024-04-30 18:53:00 +02:00
Mic92
480bb396ed Merge pull request 'Fix reading secret from pipe' (#1296) from error-handling into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1296
2024-04-30 14:54:24 +00:00
Jörg Thalheim
b5653c169b sops: fix setting secret from pipe 2024-04-30 14:04:49 +02:00
Jörg Thalheim
5606101ce8 sops: also log content type on error 2024-04-30 13:56:07 +02:00
clan-bot
3da4117702 Merge pull request 'clan-cli: add CLAN_DIR environment variable' (#1283) from a-kenji-feat/clan-dir into main 2024-04-30 10:08:13 +00:00
a-kenji
f383c6f82d clan-cli: add CLAN_DIR environment variable
Add the `CLAN_DIR` environment variable.
With this the user can specify the location of the clan.
2024-04-30 12:00:47 +02:00
clan-bot
af86980192 Merge pull request 'clanCore: remove repl-flake as it is now stable' (#1278) from lassulus-HEAD into main 2024-04-27 14:37:25 +00:00
lassulus
c681cc0998 clanCore: remove repl-flake as it is now stable 2024-04-27 16:28:23 +02:00
clan-bot
0804e5e415 Merge pull request 'clan(help): standardise on machine capitalisation' (#1276) from a-kenji-clan-help/standardize into main 2024-04-26 10:14:35 +00:00
a-kenji
95f93d8800 clan(help): standardise on machine capitalisation 2024-04-26 12:07:09 +02:00
clan-bot
4602c06835 Merge pull request 'clan(help): improve install description' (#1274) from a-kenji-improve-clan-help into main 2024-04-26 09:49:50 +00:00
a-kenji
a3f6996d69 clan(help): improve install description 2024-04-26 11:42:18 +02:00
clan-bot
7f424c862b Merge pull request 'docs: improve docs' (#1273) from hsjobeki-main into main 2024-04-26 09:27:24 +00:00
Johannes Kirschbauer
94449a02d5 docs: improve docs 2024-04-26 11:20:43 +02:00
clan-bot
ed14f3e827 Merge pull request 'dos: improve docs' (#1272) from hsjobeki-main into main 2024-04-26 09:14:23 +00:00
Johannes Kirschbauer
152a908dc9 docs: improve docs 2024-04-26 11:07:33 +02:00
clan-bot
ac0cb620cf Merge pull request 'init c4 uml & refactor secrets with some diagrams' (#1255) from hsjobeki-main into main 2024-04-26 08:49:00 +00:00
Johannes Kirschbauer
6a484fef66 docs: improve secrets documentation 2024-04-26 10:44:14 +02:00
Johannes Kirschbauer
fc1bf17b9c docs: init c4 diagrams 2024-04-24 16:35:27 +02:00
clan-bot
39d6edc673 Merge pull request 'vm-manager: move signals to emitter' (#1271) from hsjobeki-vm-manager/empty-splash into main 2024-04-24 12:50:34 +00:00
Johannes Kirschbauer
4a66cdffaf vm-manager: move signals to emitter 2024-04-24 14:41:53 +02:00
clan-bot
216c560830 Merge pull request 'secrets: ensure all added/deleted files get committed' (#1253) from DavHau-dave into main 2024-04-24 10:42:50 +00:00
DavHau
cf67de2f69 secrets: ensure all added/deleted files get committed 2024-04-24 17:26:32 +07:00
clan-bot
b702ca686e Merge pull request 'add: cd command' (#1265) from a-kenji-docs-patch-1 into main 2024-04-23 18:57:09 +00:00
a-kenji
acdb0a9b27 add: cd command 2024-04-23 20:52:41 +02:00
clan-bot
70ed0757a3 Merge pull request 'vm-manager: add empty list screen' (#1264) from hsjobeki-vm-manager/empty-splash into main 2024-04-23 14:22:47 +00:00
Johannes Kirschbauer
9778c432c2 vm-manager: add empty list screen 2024-04-23 16:18:10 +02:00
Johannes Kirschbauer
1da6a0c5a2 vm-manager: add empty list screen 2024-04-23 16:17:09 +02:00
Johannes Kirschbauer
5f5155023c vm-manager: add empty list screen 2024-04-23 16:16:48 +02:00
Johannes Kirschbauer
1366d0bcf6 WIP 2024-04-23 11:16:33 +02:00
clan-bot
351571a655 Merge pull request 'installer: fix qr code again' (#1260) from lassulus-HEAD into main 2024-04-22 19:10:59 +00:00
lassulus
3c02453705 installer: fix qr code again 2024-04-22 21:04:41 +02:00
clan-bot
7a74c86c70 Merge pull request 'clan-cli ssh: --json can be file or str' (#1259) from lassulus-HEAD into main 2024-04-22 18:56:19 +00:00
lassulus
4ae5b24d24 installer: make qrcode compatible with nixos-images 2024-04-22 20:49:35 +02:00
clan-bot
05b510230f Merge pull request 'clan-cli ssh: --json can be file or str' (#1258) from lassulus-HEAD into main 2024-04-22 18:27:35 +00:00
lassulus
9cb23b807c clan-cli ssh: fix qr code format 2024-04-22 20:21:44 +02:00
lassulus
0a1cc29abf clan-cli ssh: --json can be file or str 2024-04-22 20:13:17 +02:00
clan-bot
1a87df646d Merge pull request 'facts password-store: take path from variable' (#1256) from lassulus-HEAD into main 2024-04-21 17:16:32 +00:00
lassulus
4964415d34 facts password-store: take path from variable 2024-04-21 19:09:46 +02:00
clan-bot
9ac0839bd5 Merge pull request 'clan: clan machines install use verbose flag' (#1252) from a-kenji-clan/install into main 2024-04-19 14:45:29 +00:00
a-kenji
6becce81cb clan: clan machines install use verbose flag 2024-04-19 16:38:39 +02:00
clan-bot
8b1eae8c27 Merge pull request 'fix actual installer' (#1251) from image into main 2024-04-19 12:18:06 +00:00
Jörg Thalheim
5cfc9f7db4 fix actual installer 2024-04-19 14:13:02 +02:00
Jörg Thalheim
2c96e467fa deploy-docs: fix undefined variable 2024-04-19 13:59:39 +02:00
Mic92
3db2ecece6 Merge pull request 'deploy-docs: fix undefined variable' (#1250) from image into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1250
2024-04-19 11:59:35 +00:00
Jörg Thalheim
8d74983103 deploy-docs: fix undefined variable 2024-04-19 11:59:35 +00:00
clan-bot
81f7237a41 Merge pull request 'Change iso to nixos-images version' (#1249) from image into main 2024-04-19 11:49:51 +00:00
Jörg Thalheim
3ebc2e8be9 Change iso to nixos-images version 2024-04-19 13:43:40 +02:00
clan-bot
a810e96a20 Merge pull request 'docs: clan core ref' (#1246) from hsjobeki-main into main 2024-04-18 11:12:28 +00:00
Johannes Kirschbauer
1a99e033eb docs: clan core ref 2024-04-18 13:05:58 +02:00
clan-bot
6d2ec12cca Merge pull request 'clan: clan ssh fix password login' (#1245) from a-kenji-clan-cli/fix-ssh-passowrd into main 2024-04-17 19:52:00 +00:00
a-kenji
e81a7415d8 clan: clan ssh fix password login 2024-04-17 21:45:14 +02:00
clan-bot
d2dffe30a3 Merge pull request 'docs: add clan modules readme support' (#1244) from hsjobeki-main into main 2024-04-17 16:31:17 +00:00
Johannes Kirschbauer
a2074bb82b docs: init synthing & deltachat 2024-04-17 18:26:37 +02:00
clan-bot
f964304224 Merge pull request 'clan: clan ssh fix for new installer image' (#1243) from a-kenji-clan/fix-ssh into main 2024-04-17 16:25:38 +00:00
a-kenji
72811d0828 clan: clan ssh fix for new installer image 2024-04-17 18:20:40 +02:00
clan-bot
22b767466c Merge pull request 'pkgs: add metadata' (#1238) from a-kenji-pkgs/add-metadata into main 2024-04-17 11:35:19 +00:00
a-kenji
9f808b1bdb pkgs: add metadata
Closes #1151
2024-04-17 13:32:50 +02:00
clan-bot
ed9d65a91c Merge pull request 'docs: add clan modules readme support' (#1237) from hsjobeki-main into main 2024-04-17 10:58:17 +00:00
Johannes Kirschbauer
87559613ed docs: add clan modules readme support 2024-04-17 12:52:04 +02:00
kenji
0bae84b1ae Merge pull request 'clan-cli: fix clan ssh --json and --png' (#1234) from clan/ssh into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1234
2024-04-17 10:12:37 +00:00
a-kenji
498d29cca1 clan-cli: fix clan ssh --json and --png
This fixes `clan ssh` with the `--json` and `--png` flags.

It will now correctly use the actual fields that are present in the
generated json.

- probes if the ports are accessible
- if accessible will attempt a single ssh connection with the provided
password, in order to not spam ssh attempts

Fixes #1177
2024-04-17 10:12:37 +00:00
clan-bot
a33a76ecd2 Merge pull request 'rework multicast support' (#1236) from parallelism into main 2024-04-17 09:05:05 +00:00
Jörg Thalheim
8658e1694a rework multicast support 2024-04-17 10:57:17 +02:00
clan-bot
0dde758296 Merge pull request 'docs: split clan-core options into sub-pages' (#1235) from hsjobeki-main into main 2024-04-17 07:45:54 +00:00
Johannes Kirschbauer
5e33a0b3b8 docs: split clan-core options into sub-pages 2024-04-17 09:39:40 +02:00
clan-bot
c57cc5204c Merge pull request 'docs: generate api docs' (#1233) from hsjobeki-tutorials into main 2024-04-16 17:13:38 +00:00
Johannes Kirschbauer
9a3f27ea08 docs: generate api docs 2024-04-16 19:07:28 +02:00
clan-bot
b7f5e98db0 Merge pull request 'documentation: convert note to admonition' (#1227) from a-kenji-docs/set-target-host into main 2024-04-16 10:34:38 +00:00
a-kenji
1db0ace17b documentation: convert note to admonition 2024-04-16 12:28:32 +02:00
clan-bot
059e4efcdc Merge pull request 'docs: improve flake-parts configuration' (#1226) from hsjobeki-tutorials into main 2024-04-16 10:08:54 +00:00
Johannes Kirschbauer
581b48b518 docs: improve flake-parts configuration 2024-04-16 12:02:44 +02:00
clan-bot
f8b881c41e Merge pull request 'refactor facts command to regenerate facts for all machines' (#1223) from parallelism into main 2024-04-15 20:35:22 +00:00
Jörg Thalheim
dcad0d0d79 include machine name when generating secrets 2024-04-15 22:17:53 +02:00
Jörg Thalheim
a4b15d2ca2 flake-parts: fix merging of all-machines-json 2024-04-15 22:14:54 +02:00
Jörg Thalheim
f385e0e037 refactor facts command to regenerate facts for all machines 2024-04-15 22:14:54 +02:00
clan-bot
060e3baa08 Merge pull request 'documentation: improve presentation' (#1222) from a-kenji-docs/improve into main 2024-04-15 10:03:34 +00:00
a-kenji
2d42af3675 documentation: improve presentation 2024-04-15 11:57:23 +02:00
kenji
ca0c109b76 Merge pull request 'broken links replaced (and linking to doc pages (mkdocs rendered pages))' (#1220) from vater/clan-core:main into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1220
2024-04-15 09:49:14 +00:00
vater
8ffe5a562f broken links removed (and linking to doc pages (mkdocs rendered pages)) 2024-04-14 22:38:05 +00:00
clan-bot
997b9d5426 Merge pull request 'documentation: add contribution standards' (#1219) from a-kenji-documentation/standards into main 2024-04-14 15:00:44 +00:00
a-kenji
8322d5dc27 documentation: add contribution standards 2024-04-14 16:54:23 +02:00
clan-bot
419936d1b4 Merge pull request 'documentation: small admonition nit' (#1216) from a-kenji-documentation/nits into main 2024-04-14 13:24:29 +00:00
a-kenji
a81da72ec4 documentation: small admonition nit 2024-04-14 15:18:16 +02:00
clan-bot
4ae5840078 Merge pull request 'documentation: improve configuration' (#1215) from a-kenji-docs/configuration into main 2024-04-14 13:05:18 +00:00
a-kenji
5b846c7c6f documentation: improve configuration 2024-04-14 15:00:41 +02:00
clan-bot
03c109c7f5 Merge pull request 'documenation: improve flake-parts' (#1214) from a-kenji-documentation/improve/flake-parts into main 2024-04-14 12:27:34 +00:00
a-kenji
a1f5024fde documenation: improve flake-parts 2024-04-14 14:23:11 +02:00
clan-bot
09a5fd31a6 Merge pull request 'docs: fix contributing casing' (#1213) from a-kenji-docs/fix-contrib into main 2024-04-14 11:29:15 +00:00
a-kenji
933401eb62 docs: fix contributing casing 2024-04-14 13:22:51 +02:00
clan-bot
b1c0b90fb0 Merge pull request 'documentation: improve secrets page' (#1212) from a-kenji-docs/secrets into main 2024-04-14 11:19:49 +00:00
a-kenji
4442ba777a documentation: improve secrets page 2024-04-14 13:15:26 +02:00
clan-bot
bc7c3ad782 Merge pull request 'documentation: improve networking section' (#1211) from a-kenji-docs/improve-networking into main 2024-04-14 10:49:36 +00:00
a-kenji
062de6866e documentation: improve networking section 2024-04-14 12:43:09 +02:00
clan-bot
1140a847ad Merge pull request 'documenation: improve styling' (#1210) from a-kenji-docs/installer-style into main 2024-04-14 10:35:15 +00:00
a-kenji
711d5d4319 documenation: improve styling 2024-04-14 12:30:56 +02:00
clan-bot
f8675949b9 Merge pull request 'documentation: improve installer wording' (#1209) from a-kenji-docs/installer-wording into main 2024-04-14 10:26:43 +00:00
a-kenji
18a961332e documentation: improve installer wording 2024-04-14 12:20:30 +02:00
clan-bot
d1457c424a Merge pull request 'documentation: improve templates section' (#1208) from a-kenji-docs/update-template into main 2024-04-14 09:58:50 +00:00
clan-bot
d717d9e90d Merge pull request 'documentation: fix typo' (#1207) from a-kenji-fix/typ into main 2024-04-14 09:56:20 +00:00
clan-bot
1bec39cfc6 Merge pull request 'documentation: disable copy for outputs' (#1206) from a-kenji-docs/outputs into main 2024-04-14 09:52:01 +00:00
a-kenji
3d0d124b8a documentation: improve templates section 2024-04-14 11:51:43 +02:00
a-kenji
6cfe735c69 documentation: fix typo 2024-04-14 11:46:53 +02:00
a-kenji
b28d7e45d3 documentation: disable copy for outputs 2024-04-14 11:45:20 +02:00
clan-bot
d7feff104e Merge pull request 'docs: fix migrated build directory' (#1205) from hsjobeki-tutorials into main 2024-04-13 17:45:24 +00:00
Johannes Kirschbauer
10ad6da359 docs: fix migrated build directory 2024-04-13 19:40:28 +02:00
clan-bot
57791ef52a Merge pull request 'docs: decompose configuration guide' (#1204) from hsjobeki-tutorials into main 2024-04-13 15:52:29 +00:00
Johannes Kirschbauer
3a9c84cb45 docs: decompose configuration guide 2024-04-13 15:46:38 +00:00
clan-bot
d2b7bd593b Merge pull request 'documentation: standardize on bash doccomments' (#1203) from a-kenji-docs/standardize-bash into main 2024-04-13 14:41:20 +00:00
a-kenji
7f89740d1b documentation: standardize on bash doccomments 2024-04-13 16:35:16 +02:00
clan-bot
b8d863240c Merge pull request 'docs: improve template' (#1201) from hsjobeki-tutorials into main 2024-04-13 14:33:28 +00:00
Johannes Kirschbauer
b2a1f8571c format 2024-04-13 16:29:24 +02:00
Johannes Kirschbauer
d021b2fb34 template: remove system 2024-04-13 16:00:01 +02:00
Johannes Kirschbauer
fa5058bce4 docs: reword 2024-04-13 15:55:15 +02:00
Johannes Kirschbauer
1978aae39f docs: improve template 2024-04-13 15:53:45 +02:00
clan-bot
6212492c89 Merge pull request 'documentation: make lsblk command copyable' (#1200) from a-kenji-docs/impr into main 2024-04-13 13:21:59 +00:00
a-kenji
4874500b8f documentation: make lsblk command copyable 2024-04-13 15:16:05 +02:00
clan-bot
579994aea6 Merge pull request 'hsjobeki-tutorials' (#1199) from hsjobeki-tutorials into main 2024-04-13 12:57:33 +00:00
Johannes Kirschbauer
2207fd8961 docs: add success block 2024-04-13 14:53:18 +02:00
Johannes Kirschbauer
ff99b10616 docs: rephrase tabs 2024-04-13 14:48:26 +02:00
Johannes Kirschbauer
babf7e3d12 docs: clean up directory structure 2024-04-13 14:48:26 +02:00
clan-bot
7d543da8c2 Merge pull request 'documentation: fix wording' (#1198) from a-kenji-docs/wording into main 2024-04-13 12:19:10 +00:00
a-kenji
f464eafe6c documentation: fix wording 2024-04-13 14:12:47 +02:00
clan-bot
a9347f4ed9 Merge pull request 'docs: move hardware / cloud computers behind tab selection' (#1197) from hsjobeki-tutorials into main 2024-04-13 12:03:57 +00:00
Johannes Kirschbauer
8de732239d docs: move hardware / cloud computers behind tab selection 2024-04-13 13:59:48 +02:00
clan-bot
e52a9f3a16 Merge pull request 'documentation: allow code content to be copied' (#1196) from a-kenji-documentation/impl/copy into main 2024-04-13 11:55:52 +00:00
clan-bot
579b800755 Merge pull request 'docs: remove custom css' (#1195) from hsjobeki-tutorials into main 2024-04-13 11:50:12 +00:00
a-kenji
92de72427e documentation: allow code content to be copied
Allow code content to be copied.

Fixes #1179
2024-04-13 13:48:25 +02:00
Johannes Kirschbauer
e74d0aa3d2 docs: remove custom css 2024-04-13 11:44:32 +00:00
clan-bot
1f11c67e23 Merge pull request 'documentation: improve wifi' (#1194) from a-kenji-docs/improve into main 2024-04-13 11:36:58 +00:00
a-kenji
077598b3ac documentation: improve wifi 2024-04-13 13:32:54 +02:00
clan-bot
35a5131b24 Merge pull request 'vm-manager: fix typos in error message' (#1193) from a-kenji-vm-manager/fix into main 2024-04-13 10:28:54 +00:00
clan-bot
1b77f746bc Merge pull request 'documentation: fix wording' (#1192) from a-kenji-docs/fix into main 2024-04-13 10:25:30 +00:00
clan-bot
275b61925a Merge pull request 'documentation: fix wording' (#1191) from a-kenji-docs/wording into main 2024-04-13 10:22:59 +00:00
clan-bot
e8e37bfb6c Merge pull request 'documentation: add missing character' (#1190) from a-kenji-docs/missing into main 2024-04-13 10:19:05 +00:00
a-kenji
b474de8137 vm-manager: fix typos in error message 2024-04-13 12:18:58 +02:00
clan-bot
57096ae0f4 Merge pull request 'documentation: add correct nix-shell invocation' (#1189) from a-kenji-docs/add-clan-cli into main 2024-04-13 10:14:45 +00:00
a-kenji
b5746906fb documentation: fix wording 2024-04-13 12:14:20 +02:00
a-kenji
ff035d34ed documentation: fix wording 2024-04-13 12:11:13 +02:00
clan-bot
9747d77461 Merge pull request 'docs: fix wording' (#1188) from a-kenji-docs/install into main 2024-04-13 10:10:51 +00:00
a-kenji
e58204a5a7 documentation: add missing character 2024-04-13 12:09:40 +02:00
a-kenji
985deb27a9 documentation: add correct nix-shell invocation 2024-04-13 12:08:35 +02:00
a-kenji
1c690c2a66 docs: fix wording 2024-04-13 12:06:29 +02:00
clan-bot
136b317def Merge pull request 'clan-vm-manager: fix wording in toast' (#1187) from a-kenji-clan-vm-manager/fix/toast into main 2024-04-13 10:02:03 +00:00
a-kenji
9f3fcaf68e clan-vm-manager: fix wording in toast 2024-04-13 11:55:58 +02:00
clan-bot
c4ef4b1950 Merge pull request 'docs: fix wording and typo' (#1185) from a-kenji-doc/fix/wording into main 2024-04-13 09:53:15 +00:00
a-kenji
42e653a647 docs: fix wording and typo 2024-04-13 11:41:00 +02:00
clan-bot
8d6659e60b Merge pull request 'clan-cli: fix typos' (#1183) from a-kenji-clan-cli/fix/typos into main 2024-04-12 15:47:32 +00:00
a-kenji
fff810ed43 clan-cli: fix typos 2024-04-12 17:40:54 +02:00
hsjobeki
2df2787989 Merge pull request 'docs: self host documentation with mkDocs' (#1176) from hsjobeki-tutorials into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1176
2024-04-12 15:14:43 +00:00
Johannes Kirschbauer
70cdf23875 docs: add theming 2024-04-12 17:13:11 +02:00
Jörg Thalheim
4d75feea65 deploy-docs: fail on error 2024-04-12 17:13:11 +02:00
Jörg Thalheim
c3f2c548a6 add deploy script for homepage 2024-04-12 17:13:11 +02:00
Jörg Thalheim
30663d563d fix build on macos 2024-04-12 17:13:11 +02:00
Johannes Kirschbauer
43102906aa disable module docs until migrated 2024-04-12 17:13:11 +02:00
Johannes Kirschbauer
445d547814 remove checks 2024-04-12 17:13:11 +02:00
Johannes Kirschbauer
28773725ec docs: fix links 2024-04-12 17:13:11 +02:00
Johannes Kirschbauer
ecd48df496 worklow: disable link checking, this is done by mkDocs 2024-04-12 17:13:11 +02:00
Valentin Gagarin
d4f10c34c4 fix up title 2024-04-12 17:13:11 +02:00
Valentin Gagarin
e04e4e4fdb make "Getting Started" the start page 2024-04-12 17:13:11 +02:00
Valentin Gagarin
60f2bf54c3 add instructions to live reload docs 2024-04-12 17:13:11 +02:00
Johannes Kirschbauer
1e08a454fb docs: self host documentation with mkDocs 2024-04-12 17:13:11 +02:00
clan-bot
f61a78a1cf Merge pull request 'docs: fix diskLayouts' (#1182) from a-kenji-documentation/fix/docs into main 2024-04-12 14:54:54 +00:00
a-kenji
f76e6cfd1e docs: fix diskLayouts 2024-04-12 16:44:00 +02:00
kenji
ae8e15dc5e Merge pull request 'fix installer' (#1175) from docs into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1175
2024-04-12 14:00:25 +00:00
a-kenji
26c71d9720 installer: add zstd compression 2024-04-12 14:00:25 +00:00
Jörg Thalheim
088e0d3eee fix installer 2024-04-12 14:00:25 +00:00
clan-bot
cb20f62486 Merge pull request 'docs: fix iso location' (#1174) from a-kenji-fix/docss into main 2024-04-12 13:15:29 +00:00
clan-bot
828d61fef5 Merge pull request 'docs: remove superfluous heading' (#1173) from a-kenji-fix/docs into main 2024-04-12 13:11:25 +00:00
a-kenji
75fc8fd35a docs: fix iso location 2024-04-12 15:06:01 +02:00
a-kenji
684cadebc3 docs: remove superfluous heading 2024-04-12 14:55:59 +02:00
Mic92
6ddd70e2be Merge pull request 'fix case when secrets are regenerated during update/install' (#1172) from docs into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1172
2024-04-12 12:51:27 +00:00
Jörg Thalheim
b3522b73aa fix case when secrets are regenerated during update/install 2024-04-12 14:46:51 +02:00
Mic92
573a462aee Merge pull request 'Rework and fix root-password module' (#1171) from docs into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1171
2024-04-12 12:00:43 +00:00
Jörg Thalheim
3f8ab35a19 rework root-password module 2024-04-12 12:00:43 +00:00
clan-bot
895f6fbc8a Merge pull request 'sops/compat: fix name reference' (#1170) from docs into main 2024-04-12 11:29:32 +00:00
Jörg Thalheim
6958da2d57 sops/compat: fix name reference 2024-04-12 13:23:52 +02:00
clan-bot
2e6e9b175e Merge pull request 'sops: fix secret path generation' (#1168) from docs into main 2024-04-12 11:19:56 +00:00
Jörg Thalheim
58446db110 sops: fix secret path generation 2024-04-12 13:12:31 +02:00
Mic92
396071a925 Merge pull request 'quickstart: fix link' (#1162) from docs into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1162
2024-04-12 10:09:28 +00:00
Jörg Thalheim
439714a242 quickstart: fix link 2024-04-12 10:09:28 +00:00
clan-bot
13e1aefb65 Merge pull request 'clan-vm-manager: Add install-desktop.sh' (#1161) from Qubasa-main into main 2024-04-12 09:54:09 +00:00
Qubasa
057d0defee clan-vm-manager: Add install-desktop.sh. Fix incorrect doku link 2024-04-12 11:47:18 +02:00
hsjobeki
7dcadd3025 Merge pull request 'docs: fix unsupported languages' (#1157) from hsjobeki-tutorials into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1157
2024-04-10 16:50:07 +00:00
Johannes Kirschbauer
d292f2de98 docs: fix unsupported languages 2024-04-10 18:40:51 +02:00
hsjobeki
6aec3ac73d Merge pull request 'docs: improve tutorials' (#1156) from hsjobeki-tutorials into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1156
2024-04-10 16:25:18 +00:00
Johannes Kirschbauer
e6acbadae6 docs: improve template & secrets 2024-04-10 16:25:18 +00:00
Mic92
00558923a5 Merge pull request 'factstore: secret backends now can return the path to a secret dynamically' (#1143) from networkd into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1143
2024-04-10 15:14:30 +00:00
Jörg Thalheim
82aafc287e also enable LLMNR 2024-04-10 15:14:30 +00:00
Jörg Thalheim
0d4e1f870b factstore: secret backends now can return the path to a secret dynamically
try to move path function out
2024-04-10 15:14:30 +00:00
Jörg Thalheim
faaf6649c5 fix multicast dns for ethernet 2024-04-10 15:14:30 +00:00
clan-bot
f33c3ece3d Merge pull request 'don't hard-code page weight' (#1118) from fricklerhandwerk/clan-core:doc-contributing into main 2024-04-10 13:35:50 +00:00
clan-bot
a5586d27f0 Merge pull request 'build iso with nixos-generators' (#1155) from lassulus-generators-iso into main 2024-04-10 13:20:00 +00:00
lassulus
70282b8d77 build iso with nixos-generators 2024-04-10 15:03:55 +02:00
clan-bot
6d050c0c10 Merge pull request 'docs: improve tutorials' (#1154) from hsjobeki-tutorials into main 2024-04-10 13:01:21 +00:00
Johannes Kirschbauer
87eb38a2c9 docs: move install stick into sperate docs 2024-04-10 14:54:41 +02:00
clan-bot
388c9c94e4 Merge pull request 'tutorials' (#1149) from tutorials into main 2024-04-10 11:43:07 +00:00
Johannes Kirschbauer
960e560d84 docs: fix links 2024-04-10 13:37:54 +02:00
Johannes Kirschbauer
d951c570f0 docs: improve getting started 2024-04-10 13:33:47 +02:00
Johannes Kirschbauer
adfdc96b64 docs: improve tutorials 2024-04-10 13:33:47 +02:00
clan-bot
f7a29ebaf8 Merge pull request 'templates: makes template working' (#1148) from hsjobeki-main into main 2024-04-10 10:38:56 +00:00
Johannes Kirschbauer
996fdd6c9c templates: makes template working 2024-04-10 12:28:41 +02:00
clan-bot
d3e42a3ad2 Merge pull request 'add root-password module' (#1147) from hsjobeki-main into main 2024-04-10 09:36:16 +00:00
Johannes Kirschbauer
292ac97067 add root-password module 2024-04-10 11:23:39 +02:00
Mic92
84f527fc39 Merge pull request 'docs: improve tutorials' (#1126) from tutorials into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1126
2024-04-10 09:14:03 +00:00
Johannes Kirschbauer
c4c843ba18 docs: improve tutorials 2024-04-10 09:14:03 +00:00
Mic92
915864f637 Merge pull request 'fix quickstart instructions' (#1146) from alejandrosame/clan-core:fix/quickstart into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1146
2024-04-10 09:13:13 +00:00
Alejandro Sanchez Medina
8ab9021c3d fix quickstart instructions
The guide instructs the reader to look for the PTUUID (partition ID) to fill
disk ID in the disklayout. This leads to an error as the partition gets deleted
and the UUID is no longer valid. The ID-LINK field is a unique ID provided by
the hardware manufacturer.
2024-04-09 20:57:36 +02:00
Mic92
36ce43bfcf Merge pull request 'enable multicast fore default dhcp network' (#1141) from networkd into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1141
2024-04-09 13:35:51 +00:00
Jörg Thalheim
a8718b92d4 enable multicast fore default dhcp network 2024-04-09 13:35:51 +00:00
clan-bot
5dac575be8 Merge pull request 'Set networking.hostName to clanCore.machineName' (#1140) from networkd into main 2024-04-09 13:14:44 +00:00
Jörg Thalheim
19a62817f2 sops: strip out clanCore.machineName instead of networking.hostName 2024-04-09 15:10:27 +02:00
Jörg Thalheim
1ac982fbdb set networking.hostName to clanCore.machineName 2024-04-09 15:10:08 +02:00
clan-bot
26146edbc5 Merge pull request 'drop custom systemd-networkd unit' (#1132) from networkd into main 2024-04-09 10:37:51 +00:00
Jörg Thalheim
e8ebfb2e2a drop custom systemd-networkd unit
We no longer use multicast dns. This one doesn't
conflict with nixos-generate-config.
2024-04-09 12:31:57 +02:00
clan-bot
3480b7d089 Merge pull request 'vms/run.py: refactor use kwargs instead of dataclass for function args' (#1125) from DavHau-dave into main 2024-04-09 07:36:02 +00:00
DavHau
fc73301ed9 vms/run.py: refactor use kwargs instead of dataclass for function args 2024-04-09 14:30:46 +07:00
clan-bot
30db1039d1 Merge pull request 'Automatic flake update - 2024-04-08T00:00+00:00' (#1124) from flake-update-2024-04-08 into main 2024-04-08 00:13:31 +00:00
Clan Merge Bot
8429ccccb3 update flake lock - 2024-04-08T00:00+00:00
Flake lock file updates:

• Updated input 'disko':
    'github:nix-community/disko/502241afa3de2a24865ddcbe4c122f4546e32092' (2024-03-28)
  → 'github:nix-community/disko/0a17298c0d96190ef3be729d594ba202b9c53beb' (2024-04-05)
• Updated input 'flake-parts':
    'github:hercules-ci/flake-parts/f7b3c975cf067e56e7cda6cb098ebe3fb4d74ca2' (2024-03-01)
  → 'github:hercules-ci/flake-parts/9126214d0a59633752a136528f5f3b9aa8565b7d' (2024-04-01)
• Updated input 'nixos-generators':
    'github:nix-community/nixos-generators/63194fceafbfe583a9eb7d16ab499adc0a6c0bc2' (2024-03-28)
  → 'github:nix-community/nixos-generators/0c15e76bed5432d7775a22e8d22059511f59d23a' (2024-04-04)
• Updated input 'nixos-generators/nixlib':
    'github:nix-community/nixpkgs.lib/b2a1eeef8c185f6bd27432b053ff09d773244cbc' (2024-03-24)
  → 'github:nix-community/nixpkgs.lib/90b1a963ff84dc532db92f678296ff2499a60a87' (2024-03-31)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/cd1c70d941d69d8d6425984ff8aefca9b28e861a' (2024-03-31)
  → 'github:NixOS/nixpkgs/298edc8f1e0dfffce67f50375c9f5952e04a6d02' (2024-04-07)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/99b1e37f9fc0960d064a7862eb7adfb92e64fa10' (2024-03-31)
  → 'github:Mic92/sops-nix/39191e8e6265b106c9a2ba0cfd3a4dafe98a31c6' (2024-04-07)
• Updated input 'treefmt-nix':
    'github:numtide/treefmt-nix/1810d51a015c1730f2fe05a255258649799df416' (2024-03-30)
  → 'github:numtide/treefmt-nix/49dc4a92b02b8e68798abd99184f228243b6e3ac' (2024-04-01)
2024-04-08 00:00:15 +00:00
clan-bot
d89edef9a1 Merge pull request 'improve starter template' (#1123) from Qubasa-better-template into main 2024-04-07 19:12:02 +00:00
Qubasa
1e0d73e8a9 Improve documentation 2024-04-07 21:07:02 +02:00
Qubasa
4faba7c8e1 template: Reverted systemd-boot in installer. EF02 partition on wrong second place 2024-04-07 17:09:44 +02:00
Qubasa
83346eeff5 template: Fixed incorrect nix code 2024-04-07 15:59:33 +02:00
Johannes Kirschbauer
55f3878e67 machine.md: clean up guide 2024-04-07 14:32:23 +02:00
Johannes Kirschbauer
49d83fd659 migrate.md: make docs more approachable 2024-04-07 12:53:15 +02:00
Qubasa
6a610c7a0b Improve documentation 2024-04-06 13:35:17 +02:00
Qubasa
033f7c67f4 Improve documentation 2024-04-06 13:34:40 +02:00
Qubasa
6d8d211968 Improve documentation 2024-04-06 12:34:49 +02:00
Qubasa
91dddc2281 Fix merge issue 2024-04-06 11:56:06 +02:00
Qubasa
a520116584 Improve documentation 2024-04-06 11:54:34 +02:00
Valentin Gagarin
0681f6bf7c docs: don't set page weight
since currently the web site simply dumps these pages, this makes it
impossible to control the item order
2024-04-05 21:52:56 +02:00
Jörg Thalheim
e68eba914e improve starter template 2024-04-05 18:55:14 +02:00
Mic92
fa74d1c0b3 Merge pull request 'flash-fixes' (#1116) from flash-fixes into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1116
2024-04-05 16:54:31 +00:00
Jörg Thalheim
1fd28f2f4c flake-parts: fixup type for specialArgs 2024-04-05 18:48:37 +02:00
Jörg Thalheim
818cc4d135 flash: expose mode option 2024-04-05 18:48:37 +02:00
Jörg Thalheim
c5e5a7edc7 grub: enable efi support by default 2024-04-05 18:47:11 +02:00
Qubasa
2e29c031ef Improved docs 2024-04-05 18:03:14 +02:00
Qubasa
f2ff815aa7 Add machines/my-machine/settings.json 2024-04-05 16:25:05 +02:00
Jörg Thalheim
1fc4739ee3 improve starter template 2024-04-05 13:08:32 +02:00
clan-bot
cb103c7772 Merge pull request 'add flake parts tutorial' (#1106) from flake-parts into main 2024-04-04 13:09:52 +00:00
Jörg Thalheim
7b230e2308 add flake parts tutorial 2024-04-04 15:05:08 +02:00
clan-bot
e78d0da30f Merge pull request 'flake-parts: fix clan-core reference' (#1105) from flake-parts into main 2024-04-04 11:42:32 +00:00
Jörg Thalheim
28e8af60cf flake-parts: fix clan-core reference 2024-04-04 13:38:15 +02:00
Mic92
2bc027cece Merge pull request 'Add flake-parts module' (#1104) from flake-parts into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1104
2024-04-04 11:08:08 +00:00
Jörg Thalheim
5ffae2070d drop unused test_backup_client machine 2024-04-04 11:24:30 +02:00
Jörg Thalheim
3212410704 add flake-parts module for clan 2024-04-03 16:45:06 +02:00
Jörg Thalheim
f7077e3540 flash: improve prompt if no disk is specified 2024-04-03 12:00:02 +02:00
Jörg Thalheim
1c1c143b8d docs: replace hashedPassword with initialHashedPassword 2024-04-03 12:00:02 +02:00
clan-bot
6e4786d08e Merge pull request 'Clan Manager: connect events with feedback system' (#1103) from hsjobeki-main into main 2024-04-03 09:41:03 +00:00
Johannes Kirschbauer
de91938760 Clan VM Manager: connect feedback with events 2024-04-03 11:36:33 +02:00
clan-bot
a6ba73c4a0 Merge pull request 'fix: readme typo' (#1102) from hsjobeki-main into main 2024-04-03 07:51:04 +00:00
Johannes Kirschbauer
a6f8f3fb58 fix: readme typo 2024-04-03 09:43:24 +02:00
clan-bot
69aa46a1d5 Merge pull request 'sops: fix decrypte path on machine' (#1091) from fact_refactor2 into main 2024-04-02 11:55:53 +00:00
Jörg Thalheim
8b4dbc60b5 clan/install: drop -t flag from nixos-anywhere 2024-04-02 13:50:24 +02:00
Jörg Thalheim
5b838c0d9c sops: fix decrypte path on machine 2024-04-02 13:50:24 +02:00
clan-bot
b342e3f991 Merge pull request 'syncthing: fix conflicting definition of fs.inotify.max_user_watches' (#1090) from DavHau-dave into main 2024-04-02 11:00:26 +00:00
DavHau
dd0dbbd29f syncthing: fix conflicting definition of fs.inotify.max_user_watches 2024-04-02 17:56:07 +07:00
clan-bot
7de7e25e78 Merge pull request 'flatpak: add gitignore' (#1089) from a-kenji-gi/flatpak into main 2024-04-02 10:54:34 +00:00
a-kenji
97be9f1c4d flatpak: add gitignore 2024-04-02 12:48:19 +02:00
clan-bot
439293a079 Merge pull request 'clan-cli: add a check for the flatpak sandbox' (#1088) from a-kenji-clan-cli/check/flatpak-sandbox into main 2024-04-02 10:24:49 +00:00
a-kenji
9bb4c8d094 clan-cli: add a check for the flatpak sandbox
Allows for differentiation between sandbox and non sandbox usage.
2024-04-02 12:19:48 +02:00
clan-bot
44d897e89f Merge pull request 'modules: add ergochat' (#1078) from a-kenji-add/ergo into main 2024-04-02 09:36:55 +00:00
a-kenji
1a40ce0a8f modules: add ergochat 2024-04-02 11:30:22 +02:00
clan-bot
ff0e66512f Merge pull request 'buildClan: add clan-core to specialArgs' (#1076) from DavHau-dave into main 2024-04-02 09:15:37 +00:00
clan-bot
78259ad61e Merge pull request 'modules: add thelounge' (#1075) from a-kenji-init/ergochat into main 2024-04-02 09:07:18 +00:00
DavHau
6f9216d3b6 buildClan: add clan-core to specialArgs 2024-04-02 16:03:45 +07:00
a-kenji
3bdface3db modules: add thelounge 2024-04-02 11:01:00 +02:00
clan-bot
388eff3baa Merge pull request 'cli/secrets: show hint in --help on how to retrieve a key' (#1074) from DavHau-dave into main 2024-04-02 07:40:54 +00:00
DavHau
16ae51105e cli/secrets: show hint in --help on how to retrieve a key 2024-04-02 14:36:01 +07:00
clan-bot
3428b76dcb Merge pull request 'moonlight: fix facts declaration' (#1072) from DavHau-dave into main 2024-04-01 10:48:25 +00:00
DavHau
1a3d5e1ad6 moonlight: fix facts declaration 2024-04-01 17:44:22 +07:00
clan-bot
d075b18653 Merge pull request 'Automatic flake update - 2024-04-01T00:00+00:00' (#1070) from flake-update-2024-04-01 into main 2024-04-01 00:11:28 +00:00
Clan Merge Bot
c9108d5460 update flake lock - 2024-04-01T00:00+00:00
Flake lock file updates:

• Updated input 'disko':
    'github:nix-community/disko/5d2d3e421ade554b19b4dbb0d11a04023378a330' (2024-03-24)
  → 'github:nix-community/disko/502241afa3de2a24865ddcbe4c122f4546e32092' (2024-03-28)
• Updated input 'nixos-generators':
    'github:nix-community/nixos-generators/2b3720c7af2271be8cee713cd2f69c5127b0a8e4' (2024-03-25)
  → 'github:nix-community/nixos-generators/63194fceafbfe583a9eb7d16ab499adc0a6c0bc2' (2024-03-28)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/57e6b3a9e4ebec5aa121188301f04a6b8c354c9b' (2024-03-25)
  → 'github:NixOS/nixpkgs/cd1c70d941d69d8d6425984ff8aefca9b28e861a' (2024-03-31)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/405987a66cce9a4a82f321f11b205982a7127c88' (2024-03-24)
  → 'github:Mic92/sops-nix/99b1e37f9fc0960d064a7862eb7adfb92e64fa10' (2024-03-31)
• Updated input 'treefmt-nix':
    'github:numtide/treefmt-nix/7ee5aaac63c30d3c97a8c56efe89f3b2aa9ae564' (2024-03-18)
  → 'github:numtide/treefmt-nix/1810d51a015c1730f2fe05a255258649799df416' (2024-03-30)
2024-04-01 00:00:15 +00:00
clan-bot
eeb703985e Merge pull request 'docs: render zola pages in clan-core flake' (#1069) from DavHau-dave into main 2024-03-31 05:37:36 +00:00
DavHau
492256ec54 docs: render zola pages in clan-core flake
This integrates the generated options docs part of our website into the clan-core project. This is better than having it in a separate repos because we want to lear about breakages as early as possible.

Changes which break the documentation should be blocked by this early on
2024-03-31 12:33:31 +07:00
clan-bot
62f201696d Merge pull request 'docs: render module options docs' (#1068) from DavHau-dave into main 2024-03-30 17:31:34 +00:00
DavHau
e0bdf1ce39 docs: render module options docs
fix errors while rendering some modules
2024-03-31 00:26:08 +07:00
clan-bot
ec105d8ef8 Merge pull request 'secrets: improve description of generator script' (#1067) from DavHau-dave into main 2024-03-30 10:22:40 +00:00
DavHau
72cc85cd2f secrets: improve description of generator script 2024-03-30 17:16:26 +07:00
clan-bot
0f73a6e1cf Merge pull request 'migrate secrets to new api' (#1064) from fact_refactor2 into main 2024-03-28 10:17:24 +00:00
Jörg Thalheim
65d116ec28 migrate secrets to new api 2024-03-28 11:02:14 +01:00
clan-bot
b10c4f5846 Merge pull request 'refactor clanCore.secrets -> clanCore.facts' (#1040) from facts_refactor2 into main 2024-03-27 15:20:21 +00:00
lassulus
a8d35d37e7 refactor clanCore.secrets -> clanCore.facts 2024-03-27 16:03:16 +01:00
clan-bot
8950c8d3bd Merge pull request 'clan-cli: Fix tmpdir leak and fix tests/temporary_dir inconsistencies' (#1063) from Qubasa-fix_tmpdir_leak2 into main 2024-03-27 14:58:20 +00:00
Qubasa
e6ad0cfbc1 clan-cli: Fix tmpdir leak and fix tests/temporary_dir inconsistencies 2024-03-27 15:51:52 +01:00
clan-bot
0676bf7283 Merge pull request 'checks: add check for rendering docs' (#1058) from DavHau-dave into main 2024-03-27 10:03:38 +00:00
DavHau
3771be2110 checks: add check for rendering docs 2024-03-27 16:59:42 +07:00
clan-bot
d59673e89a Merge pull request 'Improved README' (#1057) from Qubasa-improv_readme3 into main 2024-03-26 18:29:50 +00:00
Qubasa
946f026c23 Improved README 2024-03-26 19:20:00 +01:00
clan-bot
8715c3ef88 Merge pull request 'rewrite backups documentation' (#1055) from Mic92-main into main 2024-03-26 16:29:32 +00:00
Jörg Thalheim
0c21fcf2eb rewrite backups documentation 2024-03-26 17:21:06 +01:00
clan-bot
9a82f8cc8b Merge pull request 'localbackup: also create mountpoints' (#1053) from Mic92-main into main 2024-03-26 14:59:11 +00:00
Jörg Thalheim
e27e6e6102 localbackup: also create mountpoints 2024-03-26 15:53:13 +01:00
clan-bot
4ff262fd60 Merge pull request 'localbackup: rename mountHook/umountHook to preMountHook/postUnmountHook' (#1050) from Mic92-main into main 2024-03-26 14:02:40 +00:00
Jörg Thalheim
74b5f6c61a localbackup: rename mountHook/umountHook to preMountHook/postUnmountHook 2024-03-26 14:58:37 +01:00
clan-bot
553b8b8476 Merge pull request 'cli/ssh: allocate tty by default' (#1043) from Mic92-main into main 2024-03-26 12:18:27 +00:00
Jörg Thalheim
80abeef994 Revert "ssh: add interactive flag"
This reverts commit c5db14dea8.
2024-03-26 13:13:35 +01:00
Jörg Thalheim
7b8a49bf6c ssh: default tty to False
nix behaves weird when the terminal is interactive because
we are also do line buffering.
2024-03-26 13:05:11 +01:00
Jörg Thalheim
54f0526c5b update nixos-generators 2024-03-26 12:52:00 +01:00
Jörg Thalheim
10a12eb85c ruff: switch to check subcommand 2024-03-26 12:52:00 +01:00
Jörg Thalheim
c5db14dea8 ssh: add interactive flag 2024-03-26 12:51:46 +01:00
Jörg Thalheim
0e2cb172e6 cli/ssh: allocate tty by default
-t is only enabled when the local ssh command is also connected to a tty,
so it seems to be enabled by default.
2024-03-26 12:07:15 +01:00
clan-bot
a21f731536 Merge pull request 'localbackup: add missing config arg to submodule' (#1042) from Mic92-main into main 2024-03-26 10:47:35 +00:00
Jörg Thalheim
bd989085ac localbackup: add missing config arg to submodule 2024-03-26 11:41:03 +01:00
clan-bot
dca1eee3a3 Merge pull request 'documentation: fix grammer' (#1041) from a-kenji-fix/grammar into main 2024-03-25 15:10:10 +00:00
a-kenji
92b1f86b7e documentation: fix grammer 2024-03-25 16:03:18 +01:00
clan-bot
6055dbe123 Merge pull request 'documentation fixes for facts generate command' (#1038) from facts-generate into main 2024-03-25 14:38:30 +00:00
Jörg Thalheim
68ac6321ee docs/backup: update command needed to regenerate backups 2024-03-25 15:33:57 +01:00
Jörg Thalheim
270f906412 fix casing in facts generate logs 2024-03-25 15:33:57 +01:00
clan-bot
ffa1d9ca6c Merge pull request 'waypipe: fix the waypipe module' (#1037) from a-kenji-modules/waypipe/fix into main 2024-03-25 14:27:14 +00:00
a-kenji
187bebae47 waypipe: fix the waypipe module 2024-03-25 15:21:16 +01:00
clan-bot
a6f1fede97 Merge pull request 'localbackup: add regression test' (#1035) from localbackup into main 2024-03-25 13:00:14 +00:00
Mic92
e3c608c16d Merge pull request 'switch back to upstream waypipe' (#1025) from waypipe into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1025
2024-03-25 12:54:16 +00:00
Jörg Thalheim
fee37dc1db bump nixpkgs 2024-03-25 13:36:30 +01:00
Jörg Thalheim
a886fd9b2d switch back to upstream waypipe 2024-03-25 13:34:02 +01:00
Jörg Thalheim
d291b1db63 localbackup: integrate into regression test 2024-03-25 13:26:42 +01:00
Jörg Thalheim
45212e2ba5 localbackup: add mounthooks 2024-03-25 13:26:42 +01:00
Jörg Thalheim
916e37eb26 localbackup: add pre/post exec hooks 2024-03-25 12:42:59 +01:00
Jörg Thalheim
58ae9d9cd0 localbackup: default to empty target list 2024-03-25 12:42:59 +01:00
clan-bot
62bef16092 Merge pull request 'Re-encrypt secrets after rotating users/machines keys' (#1034) from yubikey-support into main 2024-03-25 11:40:32 +00:00
Jörg Thalheim
0fa36252c2 re-encrypt secrets after rotating users/machines keys 2024-03-25 12:34:29 +01:00
Jörg Thalheim
b6d5f8a6ce docs/backup: extend documentation 2024-03-25 11:07:09 +01:00
Jörg Thalheim
cd9db02db0 add hint to use --force when a key already exists 2024-03-25 11:06:20 +01:00
clan-bot
bc75c637ef Merge pull request 'clanCore/packages.nix: add gitMinimal' (#1031) from DavHau-dave into main 2024-03-25 04:54:00 +00:00
DavHau
4b8b1107ba clanCore/packages.nix: add gitMinimal
WIthout this, deployment via `clan machines update` will fail on the remote machine if the flake.nix has a git input
2024-03-25 11:47:32 +07:00
clan-bot
644c85866e Merge pull request 'Automatic flake update - 2024-03-25T00:00+00:00' (#1030) from flake-update-2024-03-25 into main 2024-03-25 00:22:15 +00:00
Clan Merge Bot
7cdb18331d update flake lock - 2024-03-25T00:00+00:00
Flake lock file updates:

• Updated input 'disko':
    'github:nix-community/disko/21d89b333ca300bef82c928c856d48b94a9f997c' (2024-03-14)
  → 'github:nix-community/disko/5d2d3e421ade554b19b4dbb0d11a04023378a330' (2024-03-24)
• Updated input 'nixos-generators':
    'github:nix-community/nixos-generators/efd4e38532b5abfaa5c9fc95c5a913157dc20ccb' (2024-03-14)
  → 'github:nix-community/nixos-generators/417a857dfb824e60930881a254dd67d6796f5884' (2024-03-22)
• Updated input 'nixos-generators/nixlib':
    'github:nix-community/nixpkgs.lib/630ebdc047ca96d8126e16bb664c7730dc52f6e6' (2024-03-10)
  → 'github:nix-community/nixpkgs.lib/fa827dda806c5aa98f454da4c567991ab8ce422c' (2024-03-17)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/f471be9644f3ab2f3cb868de1787ab70a537b0e7' (2024-03-17)
  → 'github:NixOS/nixpkgs/3d41d1087707826b3a90685ab69147f8dc8145d5' (2024-03-24)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/83b68a0e8c94b72cdd0a6e547a14ca7eb1c03616' (2024-03-17)
  → 'github:Mic92/sops-nix/405987a66cce9a4a82f321f11b205982a7127c88' (2024-03-24)
• Updated input 'treefmt-nix':
    'github:numtide/treefmt-nix/35791f76524086ab4b785a33e4abbedfda64bd22' (2024-03-12)
  → 'github:numtide/treefmt-nix/7ee5aaac63c30d3c97a8c56efe89f3b2aa9ae564' (2024-03-18)
2024-03-25 00:00:15 +00:00
clan-bot
b07490ca60 Merge pull request 'select-shell: Fix breakage with previous shell.nix change' (#1029) from Qubasa-main into main 2024-03-24 23:37:57 +00:00
Qubasa
e26d1052b6 select-shell: Fix breakage with previous shell.nix change 2024-03-25 00:32:03 +01:00
clan-bot
f7866d264d Merge pull request 'clan-vm-manager: devshell doesn't require clan-cli derivation' (#1028) from Qubasa-main into main 2024-03-24 22:57:52 +00:00
Qubasa
9dbc71e446 clan-vm-manager: devshell doesn't require clan-cli derivation 2024-03-24 23:52:30 +01:00
clan-bot
5fd4a63e17 Merge pull request 'clan-vm-manager: Basic pytest framework established' (#1026) from Qubasa-main into main 2024-03-24 22:41:07 +00:00
Qubasa
8ab9d20342 clan-vm-manager: Working pytest skeleton. clan-cli: Fixing devshell depending on itself 2024-03-24 23:36:00 +01:00
clan-bot
a185ad0c59 Merge pull request 'refactor secrets & facts into secret_facts & public_facts' (#1027) from facts_refactor into main 2024-03-24 10:10:45 +00:00
lassulus
f16667e25a refactor secrets & facts -> secret_facts & public_facts 2024-03-23 05:46:54 +01:00
Qubasa
0ee8dceee2 clan-vm-manager: Basic pytest framework established 2024-03-22 19:08:35 +01:00
Mic92
ddc28f53df Merge pull request 'backup docs' (#949) from docs into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/949
2024-03-22 14:56:22 +00:00
Jörg Thalheim
0b6e03b3d5 backup docs 2024-03-22 14:56:22 +00:00
clan-bot
1d6cc49da5 Merge pull request 'clanModules: init matrix-synapse' (#1017) from matrix-synapse into main 2024-03-22 11:39:50 +00:00
lassulus
786a4586a6 checks/matrix-synapse: init 2024-03-22 12:26:37 +01:00
lassulus
ba772c201d clanModules: init matrix-synapse 2024-03-22 12:26:37 +01:00
clan-bot
ae50796e1d Merge pull request 'sunshine: improve launching of pairing' (#1021) from a-kenji-sunshine/improve-accept into main 2024-03-20 09:00:58 +00:00
a-kenji
f0b00b7360 sunshine: improve launching of pairing 2024-03-20 09:55:25 +01:00
clan-bot
1b8ae090b8 Merge pull request 'localbackup' (#1020) from localbackup into main 2024-03-20 08:49:07 +00:00
Jörg Thalheim
350593ccde backups: add test for pre and post restore command 2024-03-20 09:32:01 +01:00
Jörg Thalheim
82507a975a backups: fix name extraction for borgbackup restore 2024-03-20 09:32:01 +01:00
Jörg Thalheim
539df08706 backups: skip preRestore and postRestore if not specified by a service 2024-03-20 09:32:01 +01:00
Jörg Thalheim
aa659bcc17 backups: no longer interpret backup interface as bash commands 2024-03-20 09:32:01 +01:00
Jörg Thalheim
92ac151292 rework backup interface to no longer need to list backups to restore them 2024-03-20 09:32:01 +01:00
Jörg Thalheim
f5d32d0b22 add localbackup provider 2024-03-20 09:32:01 +01:00
Mic92
691d2ca3e9 Merge pull request 'make backup provider more generic' (#1019) from backup into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/1019
2024-03-20 08:29:05 +00:00
Jörg Thalheim
2560eef424 backups: don't export all local environment over ssh 2024-03-20 08:29:05 +00:00
Jörg Thalheim
5f9d3b514b fix case when we have multiple backup destinations 2024-03-20 08:29:05 +00:00
Jörg Thalheim
9383e41d68 make backup provider more generic 2024-03-20 08:29:05 +00:00
clan-bot
7c4c6c07af Merge pull request 'refactor backup test to be just a single machine' (#1016) from Mic92-openssh into main 2024-03-19 13:38:10 +00:00
Jörg Thalheim
65b6ae8bb7 refactor backup test to be just a single machine 2024-03-19 14:32:11 +01:00
clan-bot
f8a8a92e39 Merge pull request 'moonlight: drop libnotify' (#1012) from a-kenji-moonlight/libnotify into main 2024-03-19 12:21:29 +00:00
a-kenji
f98d39cdeb moonlight: drop libnotify 2024-03-19 13:14:04 +01:00
clan-bot
7c378fced6 Merge pull request 'sunshine: drop unused files' (#1003) from a-kenji-drop/sunshine into main 2024-03-19 11:59:41 +00:00
a-kenji
626a9af638 sunshine: drop unused files 2024-03-19 12:53:28 +01:00
clan-bot
ceb1c95817 Merge pull request 'init: sunshine-moonlight-accept module' (#1002) from a-kenji-init/sunshine-accept into main 2024-03-19 11:50:15 +00:00
a-kenji
83efb33eb7 fmt 2024-03-19 12:40:58 +01:00
a-kenji
0695e2c0fc Merge branch 'main' into init/sunshine-accept 2024-03-19 12:33:45 +01:00
a-kenji
91ed6549a7 fmt: module 2024-03-19 12:30:40 +01:00
a-kenji
32d0f1ccd4 init: sunshine-moonlight-accept module 2024-03-19 12:11:09 +01:00
clan-bot
9f81f75f8c Merge pull request 'devshell: remove dependency on clan-cli derivation' (#1000) from DavHau-dave into main 2024-03-19 06:05:15 +00:00
DavHau
580010581c devshell: remove dependency on clan-cli derivation
The devShell depended on clan-cli due to it being included as a dependency in the treefmt config. This is not optimal because this makes the devshell rebuild unnecessary often and also lead to build failures of the dev-shell if the clan-cli code is in a broken state (git rebasing, or during development etc.)
2024-03-19 13:00:59 +07:00
clan-bot
b2b94b269a Merge pull request 'Automatic flake update - 2024-03-18T00:00+00:00' (#998) from flake-update-2024-03-18 into main 2024-03-18 00:11:00 +00:00
Clan Merge Bot
9300ecbfe2 update flake lock - 2024-03-18T00:00+00:00
Flake lock file updates:

• Updated input 'disko':
    'github:nix-community/disko/fe064a639319ed61cdf12b8f6eded9523abcc498' (2024-03-11)
  → 'github:nix-community/disko/21d89b333ca300bef82c928c856d48b94a9f997c' (2024-03-14)
• Updated input 'nixos-generators':
    'github:nix-community/nixos-generators/1d9c8cd24eba7942955f92fdcefba5a6a7543bc6' (2024-03-11)
  → 'github:nix-community/nixos-generators/efd4e38532b5abfaa5c9fc95c5a913157dc20ccb' (2024-03-14)
• Updated input 'nixos-generators/nixlib':
    'github:nix-community/nixpkgs.lib/7873d84a89ae6e4841528ff7f5697ddcb5bdfe6c' (2024-03-03)
  → 'github:nix-community/nixpkgs.lib/630ebdc047ca96d8126e16bb664c7730dc52f6e6' (2024-03-10)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/e4e2121b151e492fd15d4bdb034e793738fdc120' (2024-03-12)
  → 'github:NixOS/nixpkgs/f471be9644f3ab2f3cb868de1787ab70a537b0e7' (2024-03-17)
• Updated input 'sops-nix':
    'github:Mic92/sops-nix/e52d8117b330f690382f1d16d81ae43daeb4b880' (2024-03-11)
  → 'github:Mic92/sops-nix/83b68a0e8c94b72cdd0a6e547a14ca7eb1c03616' (2024-03-17)
• Updated input 'treefmt-nix':
    'github:numtide/treefmt-nix/720322c5352d7b7bd2cb3601a9176b0e91d1de7d' (2024-03-10)
  → 'github:numtide/treefmt-nix/35791f76524086ab4b785a33e4abbedfda64bd22' (2024-03-12)
2024-03-18 00:00:14 +00:00
clan-bot
4a5b9cf0f4 Merge pull request 'nixos-install: also respect port' (#997) from Mic92-openssh into main 2024-03-17 21:23:24 +00:00
Jörg Thalheim
5ff36a2cd8 nixos-install: also respect port 2024-03-17 22:18:22 +01:00
clan-bot
d50eeb8f89 Merge pull request 'drop secret store logging from install command' (#996) from Mic92-openssh into main 2024-03-17 20:41:39 +00:00
Jörg Thalheim
9f25f47298 allow to debug nixos-anywhere 2024-03-17 21:36:22 +01:00
Jörg Thalheim
dd0ad2683b drop secret store logging from install command 2024-03-17 21:32:23 +01:00
Mic92
3555001c0d Merge pull request 'change from nixpkgs-fmt to rfc style formatter' (#995) from openssh into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/995
2024-03-17 18:53:59 +00:00
Jörg Thalheim
e296a3019d re-format with nixfmt 2024-03-17 19:48:49 +01:00
Jörg Thalheim
916e4dff84 change from nixpkgs-fmt to rfc style formatter 2024-03-17 19:44:57 +01:00
clan-bot
50aa98c53a Merge pull request 'make installer nixos module stand-alone' (#994) from openssh into main 2024-03-17 18:42:55 +00:00
Jörg Thalheim
77c0e6b31a make installer nixos module stand-alone 2024-03-17 19:38:50 +01:00
clan-bot
915ce52355 Merge pull request 'installer: also match qemu and serial consoles for prompting qrcode' (#993) from openssh into main 2024-03-17 18:23:07 +00:00
Jörg Thalheim
2dcdcd98e9 installer: also match qemu and serial consoles for prompting qrcode 2024-03-17 19:14:24 +01:00
clan-bot
ee9be35dcb Merge pull request 'add nix to devShell' (#992) from openssh into main 2024-03-17 17:36:00 +00:00
Jörg Thalheim
d7939e3cba add nix to devShell
It's important for some tests that package manager used inside NixOS vms is the same as outside
2024-03-17 18:31:16 +01:00
clan-bot
c727d87213 Merge pull request 'sshd: module fix impurity' (#987) from openssh into main 2024-03-17 17:20:10 +00:00
Jörg Thalheim
c15043c4f1 fix evaluation of backup module 2024-03-17 18:16:08 +01:00
Jörg Thalheim
a6c3e15aca don't use impure builtins.storePath 2024-03-17 18:10:23 +01:00
Jörg Thalheim
377302ff6c change facts path to be reachable as a store path 2024-03-17 18:10:23 +01:00
clan-bot
91a51e837e Merge pull request 'clan-vm-manager: init log view with current state of log' (#990) from hsjobeki-main into main 2024-03-17 14:03:49 +00:00
Johannes Kirschbauer
e4f4680206 clan-vm-manager: init log view with current state of log 2024-03-17 14:57:32 +01:00
clan-bot
9a2549ddb8 Merge pull request 'clan-vm-manager: connect log view to build state of machines' (#989) from hsjobeki-main into main 2024-03-17 13:14:49 +00:00
Johannes Kirschbauer
b44cbf5c76 clan-vm-manager: connect log view to build state of machines 2024-03-17 14:08:39 +01:00
clan-bot
b322b3071b Merge pull request 'dev-shell: make python shell load fast' (#985) from DavHau-dave into main 2024-03-14 10:23:53 +00:00
DavHau
f4b8133037 dev-shell: make python shell load fast
- Add caching for editable installs
- Remove sleep statement in GUI code
2024-03-14 17:19:08 +07:00
DavHau
7537af3943 merge-after-ci: fix bug 2024-03-14 12:46:17 +07:00
clan-bot
3476945fff Merge pull request 'openssh fixes' (#983) from openssh into main 2024-03-13 14:04:25 +00:00
Jörg Thalheim
a6d52a669d fix openssh secrets
change facts path to be the full path

sshd: fixup store path
2024-03-13 14:59:46 +01:00
Mic92
08e8027347 Merge pull request 'fix openssh secrets' (#982) from openssh into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/982
2024-03-13 13:27:10 +00:00
Jörg Thalheim
59cb2b2a29 fix openssh secrets 2024-03-13 13:27:10 +00:00
clan-bot
e67ac52a33 Merge pull request 'merge-after-ci: set labels correctly' (#981) from DavHau-dave into main 2024-03-13 12:20:20 +00:00
DavHau
a9dbd92ff3 merge-after-ci: set labels correctly 2024-03-13 19:11:12 +07:00
clan-bot
be1bd8f252 Merge pull request 'secrets-improvements' (#948) from secrets-improvements into main 2024-03-13 10:23:27 +00:00
Jörg Thalheim
a9fc8de2d0 allow multi-line interactive secrets 2024-03-13 11:18:56 +01:00
Jörg Thalheim
c2e43a4e65 allow fact-only secrets 2024-03-13 11:08:36 +01:00
Jörg Thalheim
8ab6fcd4c0 add sshd module 2024-03-13 11:08:36 +01:00
clan-bot
5b02dda003 Merge pull request 'sunshine: add path' (#947) from a-kenji-sunshine/add-path into main 2024-03-12 22:06:37 +00:00
a-kenji
bcf26682c3 sunshine: add path 2024-03-12 23:01:02 +01:00
clan-bot
2dd7304b57 Merge pull request 'sunshine: add apps, improve uaccess rules' (#946) from a-kenji-imp/sunshine into main 2024-03-12 21:23:06 +00:00
a-kenji
71cd46b0e9 sunshine: add apps, improve uaccess rules 2024-03-12 22:17:08 +01:00
clan-bot
a23a64d0f9 Merge pull request 'sunshine: improve module' (#945) from a-kenji-imp/sunshine into main 2024-03-12 19:59:09 +00:00
a-kenji
8a3250b1c9 sunshine: improve module 2024-03-12 20:53:04 +01:00
clan-bot
d01ea573f9 Merge pull request 'vm: improve xfce and vm-user module' (#944) from a-kenji-fix/vm into main 2024-03-12 18:59:19 +00:00
a-kenji
df1729a841 vm: improve xfce and vm-user module 2024-03-12 19:53:11 +01:00
clan-bot
64ec958014 Merge pull request 'clan-modules: add xfce-vm module' (#943) from a-kenji-init/vm-module into main 2024-03-12 18:42:19 +00:00
clan-bot
9b51dc7b4d Merge pull request 'fix: typo' (#942) from a-kenji-fix/devshell into main 2024-03-12 18:37:21 +00:00
a-kenji
c15d762dc7 clan-modules: add xfce-vm module
A specific module for vm's that don't (yet) support the waypipe module.
2024-03-12 19:36:11 +01:00
a-kenji
4044e42e58 fix: typo 2024-03-12 17:37:19 +01:00
clan-bot
29012304c0 Merge pull request 'clan-modules: add vm-user module' (#932) from a-kenji-add/vm-user into main 2024-03-12 16:36:24 +00:00
Mic92
c8ba2e9721 Merge pull request 'reduce eval worker' (#941) from ci into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/941
2024-03-12 16:34:24 +00:00
Jörg Thalheim
c4642ad041 reduce eval worker 2024-03-12 17:34:07 +01:00
Mic92
e654b7fe95 Merge branch 'main' into a-kenji-add/vm-user 2024-03-12 16:32:03 +00:00
clan-bot
7bcbe67f4d Merge pull request 'clan_vm_manager: Fix mypy errors for clan_cli types' (#938) from Qubasa-main into main 2024-03-12 16:31:48 +00:00
Qubasa
4e5d051847 clan_vm_manager: Fix mypy errors for clan_cli types 2024-03-12 23:27:20 +07:00
Mic92
7c2e22de72 Merge pull request 'Revert "workaround gitea bug"' (#940) from ci into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/940
2024-03-12 16:26:50 +00:00
Jörg Thalheim
0c688a0919 Revert "workaround gitea bug"
This reverts commit 38190adfb1.
2024-03-12 17:23:12 +01:00
a-kenji
b5433beef9 clan-modules: add vm-user module 2024-03-12 17:20:02 +01:00
Mic92
422b3f096e Merge pull request 'ci' (#935) from ci into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/935
2024-03-12 16:10:54 +00:00
Jörg Thalheim
38190adfb1 workaround gitea bug 2024-03-12 16:10:54 +00:00
Jörg Thalheim
934cf6e57a mypy: fix clan-cli import in vm-manager 2024-03-12 16:10:54 +00:00
kenji
4ef513de58 Merge pull request 'enable: spice-vdagent if xserver is enable' (#931) from a-kenji-add/spice-vm-profile into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/931
2024-03-12 16:00:54 +00:00
a-kenji
5d5f504013 enable: spice-vdagent if xserver is enable 2024-03-12 16:00:54 +00:00
Mic92
acf1dace5c Merge pull request 'clan.borgbackup: drop enable option' (#918) from Mic92-main into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/918
2024-03-12 15:50:33 +00:00
Jörg Thalheim
823b5e67ed fix backup not beeing activated 2024-03-12 13:17:04 +01:00
Jörg Thalheim
349d3b379c update flake 2024-03-12 13:06:12 +01:00
Jörg Thalheim
b1897530c8 clan.borgbackup: drop enable option 2024-03-12 11:21:10 +01:00
clan-bot
6d76a724c0 Merge pull request 'clan-vm-manager: add log view' (#927) from hsjobeki-main into main 2024-03-10 13:14:54 +00:00
Johannes Kirschbauer
4687c816ab clan-vm-manager: add log view 2024-03-10 14:10:59 +01:00
Johannes Kirschbauer
ee8fa1da0a vm-manager: add toast overlay to main window 2024-03-10 10:40:00 +01:00
clan-bot
bfa6ff6085 Merge pull request 'clan-cli: Add py.typed to make mypy work when used as library in clan-vm-manager' (#923) from Qubasa-main into main 2024-03-10 09:10:21 +00:00
Qubasa
129a1516f6 clan-cli: Readd mypy ignore clan_cli because of treefmt complaining 2024-03-10 16:06:03 +07:00
Qubasa
167f7f4eb3 clan-cli: Add py.typed to make mypy work when used as library in clan-vm-manager 2024-03-10 15:18:18 +07:00
clan-bot
d9f5e050d8 Merge pull request 'clan-vm-manager: Add library for mypy pygobject types' (#921) from Qubasa-main into main 2024-03-09 16:55:54 +00:00
Qubasa
14900a702b clan-vm-manager: Readd ignore for clan_cli because nix fmt fails in CI. But why \? 2024-03-09 23:51:59 +07:00
Qubasa
5c8343d943 clan-vm-manager: Remove mypy ignore clan_cli types 2024-03-09 23:17:00 +07:00
Qubasa
01351ff5a1 clan-vm-manager: Add library for mypy pygobject types 2024-03-09 23:15:32 +07:00
clan-bot
b985215cd6 Merge pull request 'docs: improve readme for better onboarding' (#920) from hsjobeki-main into main 2024-03-09 10:28:52 +00:00
Johannes Kirschbauer
59de33b68a docs: improve start command 2024-03-09 11:25:11 +01:00
Johannes Kirschbauer
11cfc49d27 docs: improve readme for better onboarding 2024-03-09 10:58:12 +01:00
clan-bot
79e4cb344f Merge pull request 'clan-vm-manager: Fix ClanUrl not pickable' (#919) from Qubasa-main into main 2024-03-08 16:51:45 +00:00
Qubasa
372e212c0c clan_cli: Renamed ClanUrl to FlakeId 2024-03-08 23:47:27 +07:00
Qubasa
f4f3176374 clan-vm-manager: Fix ClanUrl not pickable 2024-03-08 23:23:18 +07:00
clan-bot
1e7f63fb05 Merge pull request 'clan_vm_manager: Starting rewrite of Machine class' (#917) from Qubasa-main into main 2024-03-08 15:06:19 +00:00
Qubasa
e4896814f2 clan_cli: Add TimeTable class to cmd.py. Fix bugs in Machine rewrite 2024-03-08 22:01:54 +07:00
Qubasa
068f89e453 clan_vm_manager: Rewrite of Machine Class Part 1 2024-03-08 15:32:12 +07:00
clan-bot
2532c780ab Merge pull request 'add flash command and tests' (#916) from Mic92-main into main 2024-03-07 16:29:11 +00:00
Jörg Thalheim
4dfe4ecfa6 fix building installer iso 2024-03-07 17:24:57 +01:00
Jörg Thalheim
3cc97ebc56 fix container tests 2024-03-07 14:13:11 +01:00
Jörg Thalheim
26dd962799 treefmt 2024-03-07 14:13:11 +01:00
Jörg Thalheim
93afd06bcb fix install test 2024-03-07 14:13:11 +01:00
Jörg Thalheim
f599243cbd add flash command 2024-03-07 14:13:11 +01:00
Jörg Thalheim
dd73406a92 installer: switch to systemd-boot
grub is not able to boot from the disks that we flash for weird reasons.
Since BIOS-boot is on life-support, we may as well just use systemd-boot.
2024-03-07 14:13:11 +01:00
Jörg Thalheim
ab2defa9e4 add confirmation prompt when installing 2024-03-07 14:13:11 +01:00
clan-bot
1cc5dc98d3 Merge pull request 'clan_cli: Rewrite ClanURI' (#915) from Qubasa-main into main 2024-03-07 12:12:28 +00:00
Qubasa
a17eb3e8a3 clan_vm_manager: Fix broken vm start 2024-03-07 19:09:01 +07:00
clan-bot
718c0a06e2 Merge pull request 'clan_cli: Rewrite ClanURI' (#914) from Qubasa-main into main 2024-03-07 12:08:16 +00:00
Qubasa
442e5b45ba clan_cli: Simplify ClanURI 2024-03-07 19:04:48 +07:00
Qubasa
93c868a3b7 clan_cli: Rewrite ClanURI 2024-03-07 16:41:37 +07:00
clan-bot
9f632e90c5 Merge pull request 'fix: typos' (#913) from a-kenji-fix/typos into main 2024-03-06 12:15:23 +00:00
a-kenji
94caea382f fix: typos 2024-03-06 13:11:49 +01:00
clan-bot
8d72a36298 Merge pull request 'clan_cli,clan_vm_manager: Moved profiler to clan_cli. Add cmd timer to see how long run commands take' (#912) from Qubasa-main into main 2024-03-06 10:15:37 +00:00
Qubasa
a6f652bdfc clan_cli,clan_vm_manager: Moved profiler to clan_cli. Add cmd timer to see how long run commands take 2024-03-06 17:12:20 +07:00
clan-bot
dcf7f2f733 Merge pull request 'clan_vm_manager: Fix switch desync when pressed too fast. Secrets folder shared between build and run. clan_cli: run_vm now can have custom tmpdir location' (#910) from Qubasa-main into main 2024-03-06 09:35:38 +00:00
Qubasa
0e8622c491 clan_vm_manager: Fix switch desync when pressed too fast. Secrets folder shared between build and run. clan_cli: run_vm now can have custom tmpdir location 2024-03-06 16:32:19 +07:00
clan-bot
ff8d08e4e4 Merge pull request 'drop meshnamed from repository' (#909) from Mic92-main into main 2024-03-06 09:05:41 +00:00
Jörg Thalheim
0481746198 drop meshnamed from repository
It's not super useful and we can always add it back later if we need it.
2024-03-06 10:02:21 +01:00
Jörg Thalheim
cb564059e2 bump disko 2024-03-06 09:51:02 +01:00
clan-bot
cee9beb8a9 Merge pull request 'clan-cli sops: accept bytes' (#891) from sops_bytes into main 2024-03-06 08:45:44 +00:00
clan-bot
c4c4cd3ba8 Merge pull request 'clan-vm-manager: Add register_on_change to GKVStore. Improve overall signal typing.' (#908) from Qubasa-main into main 2024-03-06 08:07:53 +00:00
Qubasa
fb21a7378d clan-vm-manager: Add register_on_change to GKVStore. Improve overall signal typing. 2024-03-06 15:05:10 +07:00
clan-bot
b9ae911246 Merge pull request 'clan_vm_manager: Fix incorrect detection of vm already in list' (#907) from Qubasa-main into main 2024-03-05 17:35:09 +00:00
Qubasa
6f590ce389 clan_vm_manager: Fix switch <-> vm status desync 2024-03-06 00:32:22 +07:00
Qubasa
cd5afa1329 clan_vm_manager: Fix join list not rerendering correctly when updating clan_store 2024-03-06 00:18:42 +07:00
Qubasa
0840fffe26 clan_vm_manager: Fix incorrect detection of vm already in list 2024-03-06 00:18:42 +07:00
clan-bot
1986ecc564 Merge pull request 'clan_vm_manager: Fix vms not shutting down after closing GTK app. Sync JoinList with ClanStore' (#906) from Qubasa-main into main 2024-03-05 16:13:26 +00:00
Qubasa
580c63e760 clan_vm_manager: Fix vms not shutting down after closing GTK app. Sync JoinList with ClanStore 2024-03-05 23:10:30 +07:00
clan-bot
06bc425797 Merge pull request 'secrets: fix typo' (#905) from a-kenji-fix-typo into main 2024-03-05 11:02:59 +00:00
a-kenji
603893872e secrets: fix typo 2024-03-05 11:59:55 +01:00
lassulus
11bf0b8b9e clan-cli sops: accept bytes 2024-03-03 09:25:40 +01:00
356 changed files with 17848 additions and 4542 deletions

1
.env
View File

@@ -1 +0,0 @@
export OPENAI_API_KEY=$(rbw get openai-api-key)

View File

@@ -1 +0,0 @@
export OPENAI_API_KEY=$(rbw get openai-api-key)

6
.envrc
View File

@@ -2,11 +2,7 @@ if ! has nix_direnv_version || ! nix_direnv_version 3.0.4; then
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.4/direnvrc" "sha256-DzlYZ33mWF/Gs8DDeyjr8mnVmQGx7ASYqA5WlxwvBG4="
fi
watch_file .direnv/selected-shell
if [ -e .env ]; then
source .env
fi
watch_file .direnv/selected-shell
if [ -e .direnv/selected-shell ]; then
use flake .#$(cat .direnv/selected-shell)

View File

@@ -5,16 +5,6 @@ on:
branches:
- main
jobs:
checks:
runs-on: nix
steps:
- uses: actions/checkout@v3
- run: nix run --refresh github:Mic92/nix-fast-build -- --no-nom --eval-workers 20
check-links:
runs-on: nix
steps:
- uses: actions/checkout@v3
- run: nix run --refresh --inputs-from .# nixpkgs#lychee .
checks-impure:
runs-on: nix
steps:

View File

@@ -0,0 +1,13 @@
name: deploy
on:
push:
branches:
- main
jobs:
deploy-docs:
runs-on: nix
steps:
- uses: actions/checkout@v3
- run: nix run .#deploy-docs
env:
SSH_HOMEPAGE_KEY: ${{ secrets.SSH_HOMEPAGE_KEY }}

17
.gitignore vendored
View File

@@ -9,9 +9,12 @@ example_clan
result*
/pkgs/clan-cli/clan_cli/nixpkgs
/pkgs/clan-cli/clan_cli/webui/assets
/machines
nixos.qcow2
**/*.glade~
/docs/out
# dream2nix
.dream2nix
# python
__pycache__
@@ -21,3 +24,15 @@ __pycache__
.reports
.ruff_cache
htmlcov
# flatpak
.flatpak-builder
build
build-dir
repo
.env
# node
node_modules
dist
.webui

21
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,21 @@
# Contributing to cLAN
## Live-reloading documentation
Enter the `docs` directory:
```shell-session
cd docs
```
Enter the development shell or enable `direnv`:
```shell-session
direnv allow
```
Run a local server:
```shell-session
mkdocs serve
```

View File

@@ -1,28 +1,45 @@
# cLAN Core Repository
# Clan Core Repository
Welcome to the cLAN Core Repository, the heart of the [clan.lol](https://clan.lol/) project! This monorepo houses all the essential packages, NixOS modules, CLI tools, and tests you need to contribute and work with the cLAN project.
Welcome to the Clan Core Repository, the heart of the [clan.lol](https://clan.lol/) project! This monorepo is the foundation of Clan, a revolutionary open-source project aimed at restoring fun, freedom, and functionality to computing. Here, you'll find all the essential packages, NixOS modules, CLI tools, and tests needed to contribute to and work with the cLAN project. Clan leverages the Nix system to ensure reliability, security, and seamless management of digital environments, putting the power back into the hands of users.
## Getting Started
## Why Clan?
If you're new to cLAN and eager to dive in, start with our quickstart guide:
Our mission is simple: to democratize computing by providing tools that empower users, foster innovation, and challenge outdated paradigms. Clan represents our contribution to a future where technology serves humanity, not the other way around. By participating in Clan, you're joining a movement dedicated to creating a secure, user-empowered digital future.
- **Quickstart Guide**: Check out [quickstart.md](docs/admins/quickstart.md) to get up and running with cLAN in no time.
## Features of Clan
## Managing Secrets
- **Full-Stack System Deployment:** Utilize Clans toolkit alongside Nix's reliability to build and manage systems effortlessly.
- **Overlay Networks:** Secure, private communication channels between devices.
- **Virtual Machine Integration:** Seamless operation of VM applications within the main operating system.
- **Robust Backup Management:** Long-term, self-hosted data preservation.
- **Intuitive Secret Management:** Simplified encryption and password management processes.
Security is paramount, and cLAN provides guidelines for handling secrets effectively:
## Getting Started with Clan
- **Secrets Management**: Learn how to manage secrets securely by reading [secrets-management.md](docs/admins/secrets-management.md).
If you're new to Clan and eager to dive in, start with our quickstart guide and explore the core functionalities that Clan offers:
## Contributing to cLAN
- **Quickstart Guide**: Check out [getting started](https://docs.clan.lol/#starting-with-a-new-clan-project)<!-- [docs/site/index.md](docs/site/index.md) --> to get up and running with Clan in no time.
We welcome contributions from the community, and we've prepared a comprehensive guide to help you get started:
### Managing Secrets
- **Contribution Guidelines**: Find out how to contribute and make a meaningful impact on the cLAN project by reading [contributing.md](docs/contributing/contributing.md).
In the Clan ecosystem, security is paramount. Learn how to handle secrets effectively:
Whether you're a newcomer or a seasoned developer, we look forward to your contributions and collaboration on the cLAN project. Let's build amazing things together!
- **Secrets Management**: Securely manage secrets by consulting [secrets](https://docs.clan.lol/getting-started/secrets/)<!-- [secrets.md](docs/site/getting-started/secrets.md) -->.
### Contributing to Clan
The Clan project thrives on community contributions. We welcome everyone to contribute and collaborate:
- **Contribution Guidelines**: Make a meaningful impact by following the steps in [contributing](https://docs.clan.lol/contributing/contributing/)<!-- [contributing.md](docs/CONTRIBUTING.md) -->.
## Join the Revolution
Clan is more than a tool; it's a movement towards a better digital future. By contributing to the Clan project, you're part of changing technology for the better, together.
### Community and Support
Connect with us and the Clan community for support and discussion:
- [Matrix channel](https://matrix.to/#/#clan:lassul.us) for live discussions.
- IRC bridges (coming soon) for real-time chat support.
### development environment
Setup `direnv` and `nix-direnv` and execute `dienv allow`.
To switch between different dev environments execute `select-shell`.

View File

@@ -1,53 +1,58 @@
{ self, ... }:
let
clan = self.lib.buildClan {
clanName = "testclan";
directory = ../..;
machines = {
test_backup_client = {
clan.networking.targetHost = "client";
imports = [ self.nixosModules.test_backup_client ];
fileSystems."/".device = "/dev/null";
boot.loader.grub.device = "/dev/null";
};
};
};
in
{
flake.nixosConfigurations = { inherit (clan.nixosConfigurations) test_backup_client; };
flake.clanInternals = clan.clanInternals;
clan.machines.test-backup = {
imports = [ self.nixosModules.test-backup ];
fileSystems."/".device = "/dev/null";
boot.loader.grub.device = "/dev/null";
};
flake.nixosModules = {
test_backup_server = { ... }: {
imports = [
self.clanModules.borgbackup
];
services.sshd.enable = true;
services.borgbackup.repos.testrepo = {
authorizedKeys = [
(builtins.readFile ../lib/ssh/pubkey)
];
};
};
test_backup_client = { pkgs, lib, config, ... }:
test-backup =
{
pkgs,
lib,
config,
...
}:
let
dependencies = [
self
pkgs.stdenv.drvPath
clan.clanInternals.machines.x86_64-linux.test_backup_client.config.system.clan.deployment.file
self.clanInternals.machines.${pkgs.hostPlatform.system}.test-backup.config.system.clan.deployment.file
] ++ builtins.map (i: i.outPath) (builtins.attrValues self.inputs);
closureInfo = pkgs.closureInfo { rootPaths = dependencies; };
in
{
imports = [
self.clanModules.borgbackup
self.clanModules.localbackup
self.clanModules.sshd
];
networking.hostName = "client";
services.sshd.enable = true;
users.users.root.openssh.authorizedKeys.keyFiles = [
../lib/ssh/pubkey
];
clan.networking.targetHost = "machine";
networking.hostName = "machine";
services.openssh.settings.UseDns = false;
programs.ssh.knownHosts = {
machine.hostNames = [ "machine" ];
machine.publicKey = builtins.readFile ../lib/ssh/pubkey;
};
users.users.root.openssh.authorizedKeys.keyFiles = [ ../lib/ssh/pubkey ];
systemd.tmpfiles.settings."vmsecrets" = {
"/root/.ssh/id_ed25519" = {
C.argument = "${../lib/ssh/privkey}";
z = {
mode = "0400";
user = "root";
};
};
"/etc/secrets/ssh.id_ed25519" = {
C.argument = "${../lib/ssh/privkey}";
z = {
mode = "0400";
user = "root";
};
};
"/etc/secrets/borgbackup.ssh" = {
C.argument = "${../lib/ssh/privkey}";
z = {
@@ -63,10 +68,18 @@ in
};
};
};
clanCore.secretStore = "vm";
clanCore.facts.secretStore = "vm";
environment.systemPackages = [ self.packages.${pkgs.system}.clan-cli ];
environment.etc."install-closure".source = "${closureInfo}/store-paths";
environment.systemPackages = [
self.packages.${pkgs.system}.clan-cli
(pkgs.writeShellScriptBin "pre-restore-command" ''
touch /var/test-service/pre-restore-command
'')
(pkgs.writeShellScriptBin "post-restore-command" ''
touch /var/test-service/post-restore-command
'')
];
environment.etc.install-closure.source = "${closureInfo}/store-paths";
nix.settings = {
substituters = lib.mkForce [ ];
hashed-mirrors = null;
@@ -75,71 +88,91 @@ in
};
system.extraDependencies = dependencies;
clanCore.state.test-backups.folders = [ "/var/test-backups" ];
clan.borgbackup = {
enable = true;
destinations.test_backup_server.repo = "borg@server:.";
clanCore.state.test-service = {
preRestoreCommand = "pre-restore-command";
postRestoreCommand = "post-restore-command";
folders = [ "/var/test-service" ];
};
clan.borgbackup.destinations.test-backup.repo = "borg@machine:.";
fileSystems."/mnt/external-disk" = {
device = "/dev/vdb"; # created in tests with virtualisation.emptyDisks
autoFormat = true;
fsType = "ext4";
options = [
"defaults"
"noauto"
];
};
clan.localbackup.targets.hdd = {
directory = "/mnt/external-disk";
preMountHook = ''
touch /run/mount-external-disk
'';
postUnmountHook = ''
touch /run/unmount-external-disk
'';
};
services.borgbackup.repos.test-backups = {
path = "/var/lib/borgbackup/test-backups";
authorizedKeys = [ (builtins.readFile ../lib/ssh/pubkey) ];
};
};
};
perSystem = { nodes, pkgs, ... }: {
checks = pkgs.lib.mkIf (pkgs.stdenv.isLinux) {
test-backups =
(import ../lib/test-base.nix)
{
name = "test-backups";
nodes.server = {
imports = [
self.nixosModules.test_backup_server
self.nixosModules.clanCore
{
clanCore.machineName = "server";
clanCore.clanDir = ../..;
}
];
};
nodes.client = {
imports = [
self.nixosModules.test_backup_client
self.nixosModules.clanCore
{
clanCore.machineName = "client";
clanCore.clanDir = ../..;
}
];
};
perSystem =
{ nodes, pkgs, ... }:
{
checks = pkgs.lib.mkIf (pkgs.stdenv.isLinux) {
test-backups = (import ../lib/test-base.nix) {
name = "test-backups";
nodes.machine = {
imports = [
self.nixosModules.clanCore
self.nixosModules.test-backup
];
virtualisation.emptyDiskImages = [ 256 ];
};
testScript = ''
import json
start_all()
testScript = ''
import json
start_all()
# setup
client.succeed("mkdir -m 700 /root/.ssh")
client.succeed(
"cat ${../lib/ssh/privkey} > /root/.ssh/id_ed25519"
)
client.succeed("chmod 600 /root/.ssh/id_ed25519")
client.wait_for_unit("sshd", timeout=30)
client.succeed("ssh -o StrictHostKeyChecking=accept-new root@client hostname")
# dummy data
machine.succeed("mkdir -p /var/test-backups /var/test-service")
machine.succeed("echo testing > /var/test-backups/somefile")
# dummy data
client.succeed("mkdir /var/test-backups")
client.succeed("echo testing > /var/test-backups/somefile")
# create
machine.succeed("clan --debug --flake ${self} backups create test-backup")
machine.wait_until_succeeds("! systemctl is-active borgbackup-job-test-backup >&2")
machine.succeed("test -f /run/mount-external-disk")
machine.succeed("test -f /run/unmount-external-disk")
# create
client.succeed("clan --debug --flake ${../..} backups create test_backup_client")
client.wait_until_succeeds("! systemctl is-active borgbackup-job-test_backup_server")
# list
backup_id = json.loads(machine.succeed("borg-job-test-backup list --json"))["archives"][0]["archive"]
out = machine.succeed("clan --debug --flake ${self} backups list test-backup").strip()
print(out)
assert backup_id in out, f"backup {backup_id} not found in {out}"
localbackup_id = "hdd::/mnt/external-disk/snapshot.0"
assert localbackup_id in out, "localbackup not found in {out}"
# list
backup_id = json.loads(client.succeed("borg-job-test_backup_server list --json"))["archives"][0]["archive"]
assert(backup_id in client.succeed("clan --debug --flake ${../..} backups list test_backup_client"))
## borgbackup restore
machine.succeed("rm -f /var/test-backups/somefile")
machine.succeed(f"clan --debug --flake ${self} backups restore test-backup borgbackup 'test-backup::borg@machine:.::{backup_id}' >&2")
assert machine.succeed("cat /var/test-backups/somefile").strip() == "testing", "restore failed"
machine.succeed("test -f /var/test-service/pre-restore-command")
machine.succeed("test -f /var/test-service/post-restore-command")
# restore
client.succeed("rm -f /var/test-backups/somefile")
client.succeed(f"clan --debug --flake ${../..} backups restore test_backup_client borgbackup {backup_id}")
assert(client.succeed("cat /var/test-backups/somefile").strip() == "testing")
'';
}
{ inherit pkgs self; };
## localbackup restore
machine.succeed("rm -f /var/test-backups/somefile /var/test-service/{pre,post}-restore-command")
machine.succeed(f"clan --debug --flake ${self} backups restore test-backup localbackup '{localbackup_id}' >&2")
assert machine.succeed("cat /var/test-backups/somefile").strip() == "testing", "restore failed"
machine.succeed("test -f /var/test-service/pre-restore-command")
machine.succeed("test -f /var/test-service/post-restore-command")
'';
} { inherit pkgs self; };
};
};
};
}

View File

@@ -1,51 +1,51 @@
(import ../lib/test-base.nix) ({ ... }: {
name = "borgbackup";
(import ../lib/test-base.nix) (
{ ... }:
{
name = "borgbackup";
nodes.machine = { self, pkgs, ... }: {
imports = [
self.clanModules.borgbackup
self.nixosModules.clanCore
nodes.machine =
{ self, pkgs, ... }:
{
services.openssh.enable = true;
services.borgbackup.repos.testrepo = {
authorizedKeys = [
(builtins.readFile ../lib/ssh/pubkey)
];
};
}
{
clanCore.machineName = "machine";
clanCore.clanDir = ./.;
clanCore.state.testState.folders = [ "/etc/state" ];
environment.etc.state.text = "hello world";
systemd.tmpfiles.settings."vmsecrets" = {
"/etc/secrets/borgbackup.ssh" = {
C.argument = "${../lib/ssh/privkey}";
z = {
mode = "0400";
user = "root";
imports = [
self.clanModules.borgbackup
self.nixosModules.clanCore
{
services.openssh.enable = true;
services.borgbackup.repos.testrepo = {
authorizedKeys = [ (builtins.readFile ../lib/ssh/pubkey) ];
};
};
"/etc/secrets/borgbackup.repokey" = {
C.argument = builtins.toString (pkgs.writeText "repokey" "repokey12345");
z = {
mode = "0400";
user = "root";
}
{
clanCore.machineName = "machine";
clanCore.clanDir = ./.;
clanCore.state.testState.folders = [ "/etc/state" ];
environment.etc.state.text = "hello world";
systemd.tmpfiles.settings."vmsecrets" = {
"/etc/secrets/borgbackup.ssh" = {
C.argument = "${../lib/ssh/privkey}";
z = {
mode = "0400";
user = "root";
};
};
"/etc/secrets/borgbackup.repokey" = {
C.argument = builtins.toString (pkgs.writeText "repokey" "repokey12345");
z = {
mode = "0400";
user = "root";
};
};
};
};
};
clanCore.secretStore = "vm";
clanCore.facts.secretStore = "vm";
clan.borgbackup = {
enable = true;
destinations.test.repo = "borg@localhost:.";
};
}
];
};
testScript = ''
start_all()
machine.systemctl("start --wait borgbackup-job-test.service")
assert "machine-test" in machine.succeed("BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes /run/current-system/sw/bin/borg-job-test list")
'';
})
clan.borgbackup.destinations.test.repo = "borg@localhost:.";
}
];
};
testScript = ''
start_all()
machine.systemctl("start --wait borgbackup-job-test.service")
assert "machine-test" in machine.succeed("BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes /run/current-system/sw/bin/borg-job-test list")
'';
}
)

View File

@@ -1,14 +1,19 @@
(import ../lib/container-test.nix) ({ ... }: {
name = "secrets";
(import ../lib/container-test.nix) (
{ ... }:
{
name = "secrets";
nodes.machine = { ... }: {
networking.hostName = "machine";
services.openssh.enable = true;
services.openssh.startWhenNeeded = false;
};
testScript = ''
start_all()
machine.succeed("systemctl status sshd")
machine.wait_for_unit("sshd")
'';
})
nodes.machine =
{ ... }:
{
networking.hostName = "machine";
services.openssh.enable = true;
services.openssh.startWhenNeeded = false;
};
testScript = ''
start_all()
machine.succeed("systemctl status sshd")
machine.wait_for_unit("sshd")
'';
}
)

View File

@@ -1,24 +1,29 @@
(import ../lib/container-test.nix) ({ pkgs, ... }: {
name = "secrets";
(import ../lib/container-test.nix) (
{ pkgs, ... }:
{
name = "secrets";
nodes.machine = { self, ... }: {
imports = [
self.clanModules.deltachat
self.nixosModules.clanCore
nodes.machine =
{ self, ... }:
{
clanCore.machineName = "machine";
clanCore.clanDir = ./.;
}
];
};
testScript = ''
start_all()
machine.wait_for_unit("maddy")
# imap
machine.succeed("${pkgs.netcat}/bin/nc -z -v ::1 143")
# smtp submission
machine.succeed("${pkgs.netcat}/bin/nc -z -v ::1 587")
# smtp
machine.succeed("${pkgs.netcat}/bin/nc -z -v ::1 25")
'';
})
imports = [
self.clanModules.deltachat
self.nixosModules.clanCore
{
clanCore.machineName = "machine";
clanCore.clanDir = ./.;
}
];
};
testScript = ''
start_all()
machine.wait_for_unit("maddy")
# imap
machine.succeed("${pkgs.netcat}/bin/nc -z -v ::1 143")
# smtp submission
machine.succeed("${pkgs.netcat}/bin/nc -z -v ::1 587")
# smtp
machine.succeed("${pkgs.netcat}/bin/nc -z -v ::1 25")
'';
}
)

View File

@@ -1,54 +1,78 @@
{ self, ... }: {
{ self, ... }:
{
imports = [
./impure/flake-module.nix
./backups/flake-module.nix
./installation/flake-module.nix
./flash/flake-module.nix
];
perSystem = { pkgs, lib, self', ... }: {
checks =
let
nixosTestArgs = {
# reference to nixpkgs for the current system
inherit pkgs;
# this gives us a reference to our flake but also all flake inputs
inherit self;
};
nixosTests = lib.optionalAttrs (pkgs.stdenv.isLinux) {
# import our test
secrets = import ./secrets nixosTestArgs;
container = import ./container nixosTestArgs;
deltachat = import ./deltachat nixosTestArgs;
meshnamed = import ./meshnamed nixosTestArgs;
zt-tcp-relay = import ./zt-tcp-relay nixosTestArgs;
borgbackup = import ./borgbackup nixosTestArgs;
syncthing = import ./syncthing nixosTestArgs;
wayland-proxy-virtwl = import ./wayland-proxy-virtwl nixosTestArgs;
};
schemaTests = pkgs.callPackages ./schemas.nix {
inherit self;
};
flakeOutputs = lib.mapAttrs' (name: config: lib.nameValuePair "nixos-${name}" config.config.system.build.toplevel) self.nixosConfigurations
// lib.mapAttrs' (n: lib.nameValuePair "package-${n}") self'.packages
// lib.mapAttrs' (n: lib.nameValuePair "devShell-${n}") self'.devShells
// lib.mapAttrs' (name: config: lib.nameValuePair "home-manager-${name}" config.activation-script) (self'.legacyPackages.homeConfigurations or { });
in
nixosTests // schemaTests // flakeOutputs;
legacyPackages = {
nixosTests =
perSystem =
{
pkgs,
lib,
self',
...
}:
{
checks =
let
# ensure all options can be rendered after importing clan into nixos
renderClanOptions =
let
docs = pkgs.nixosOptionsDoc {
options =
(pkgs.nixos {
imports = [ self.nixosModules.clanCore ];
clanCore.clanDir = ./.;
}).options;
warningsAreErrors = false;
};
in
docs.optionsJSON;
nixosTestArgs = {
# reference to nixpkgs for the current system
inherit pkgs;
# this gives us a reference to our flake but also all flake inputs
inherit self;
};
nixosTests = lib.optionalAttrs (pkgs.stdenv.isLinux) {
# import our test
secrets = import ./secrets nixosTestArgs;
container = import ./container nixosTestArgs;
deltachat = import ./deltachat nixosTestArgs;
matrix-synapse = import ./matrix-synapse nixosTestArgs;
zt-tcp-relay = import ./zt-tcp-relay nixosTestArgs;
borgbackup = import ./borgbackup nixosTestArgs;
syncthing = import ./syncthing nixosTestArgs;
wayland-proxy-virtwl = import ./wayland-proxy-virtwl nixosTestArgs;
};
flakeOutputs =
lib.mapAttrs' (
name: config: lib.nameValuePair "nixos-${name}" config.config.system.build.toplevel
) self.nixosConfigurations
// lib.mapAttrs' (n: lib.nameValuePair "package-${n}") self'.packages
// lib.mapAttrs' (n: lib.nameValuePair "devShell-${n}") self'.devShells
// lib.mapAttrs' (name: config: lib.nameValuePair "home-manager-${name}" config.activation-script) (
self'.legacyPackages.homeConfigurations or { }
);
in
lib.optionalAttrs (pkgs.stdenv.isLinux) {
# import our test
secrets = import ./secrets nixosTestArgs;
container = import ./container nixosTestArgs;
};
{ inherit renderClanOptions; } // nixosTests // flakeOutputs;
legacyPackages = {
nixosTests =
let
nixosTestArgs = {
# reference to nixpkgs for the current system
inherit pkgs;
# this gives us a reference to our flake but also all flake inputs
inherit self;
};
in
lib.optionalAttrs (pkgs.stdenv.isLinux) {
# import our test
secrets = import ./secrets nixosTestArgs;
container = import ./container nixosTestArgs;
};
};
};
};
}

View File

@@ -0,0 +1,33 @@
{ ... }:
{
perSystem =
{ ... }:
{
# checks = pkgs.lib.mkIf (pkgs.stdenv.isLinux) {
# flash = (import ../lib/test-base.nix) {
# name = "flash";
# nodes.target = {
# virtualisation.emptyDiskImages = [ 4096 ];
# virtualisation.memorySize = 3000;
# environment.systemPackages = [ self.packages.${pkgs.system}.clan-cli ];
# environment.etc."install-closure".source = "${closureInfo}/store-paths";
# nix.settings = {
# substituters = lib.mkForce [ ];
# hashed-mirrors = null;
# connect-timeout = lib.mkForce 3;
# flake-registry = pkgs.writeText "flake-registry" ''{"flakes":[],"version":2}'';
# experimental-features = [
# "nix-command"
# "flakes"
# ];
# };
# };
# testScript = ''
# start_all()
# machine.succeed("clan --debug --flake ${../..} flash --yes --disk main /dev/vdb test_install_machine")
# '';
# } { inherit pkgs self; };
# };
};
}

View File

@@ -1,18 +1,24 @@
{
perSystem = { pkgs, lib, ... }: {
# a script that executes all other checks
packages.impure-checks = pkgs.writeShellScriptBin "impure-checks" ''
#!${pkgs.bash}/bin/bash
set -euo pipefail
perSystem =
{ pkgs, lib, ... }:
{
# a script that executes all other checks
packages.impure-checks = pkgs.writeShellScriptBin "impure-checks" ''
#!${pkgs.bash}/bin/bash
set -euo pipefail
export PATH="${lib.makeBinPath [
pkgs.gitMinimal
pkgs.nix
pkgs.rsync # needed to have rsync installed on the dummy ssh server
]}"
ROOT=$(git rev-parse --show-toplevel)
cd "$ROOT/pkgs/clan-cli"
nix develop "$ROOT#clan-cli" -c bash -c "TMPDIR=/tmp python -m pytest -s -m impure ./tests $@"
'';
};
unset CLAN_DIR
export PATH="${
lib.makeBinPath [
pkgs.gitMinimal
pkgs.nix
pkgs.rsync # needed to have rsync installed on the dummy ssh server
]
}"
ROOT=$(git rev-parse --show-toplevel)
cd "$ROOT/pkgs/clan-cli"
nix develop "$ROOT#clan-cli" -c bash -c "TMPDIR=/tmp python -m pytest -s -m impure ./tests $@"
'';
};
}

View File

@@ -1,124 +1,114 @@
{ self, ... }:
let
clan = self.lib.buildClan {
clanName = "testclan";
directory = ../..;
machines = {
test_install_machine = {
clan.networking.targetHost = "test_install_machine";
imports = [ self.nixosModules.test_install_machine ];
};
};
};
in
{ self, lib, ... }:
{
flake.nixosConfigurations = { inherit (clan.nixosConfigurations) test_install_machine; };
flake.clanInternals = clan.clanInternals;
flake.nixosModules = {
test_install_machine = { lib, modulesPath, ... }: {
imports = [
self.clanModules.diskLayouts
(modulesPath + "/testing/test-instrumentation.nix") # we need these 2 modules always to be able to run the tests
(modulesPath + "/profiles/qemu-guest.nix")
];
fileSystems."/nix/store" = lib.mkForce {
device = "nix-store";
fsType = "9p";
neededForBoot = true;
options = [ "trans=virtio" "version=9p2000.L" "cache=loose" ];
};
clan.diskLayouts.singleDiskExt4.device = "/dev/vdb";
clan.machines.test_install_machine = {
clan.networking.targetHost = "test_install_machine";
fileSystems."/".device = lib.mkDefault "/dev/null";
boot.loader.grub.device = lib.mkDefault "/dev/null";
environment.etc."install-successful".text = "ok";
boot.consoleLogLevel = lib.mkForce 100;
boot.kernelParams = [
"boot.shell_on_fail"
];
};
imports = [ self.nixosModules.test_install_machine ];
};
perSystem = { nodes, pkgs, lib, ... }:
flake.nixosModules = {
test_install_machine =
{ lib, modulesPath, ... }:
{
imports = [
self.clanModules.disk-layouts
(modulesPath + "/testing/test-instrumentation.nix") # we need these 2 modules always to be able to run the tests
(modulesPath + "/profiles/qemu-guest.nix")
];
clan.disk-layouts.singleDiskExt4.device = "/dev/vdb";
environment.etc."install-successful".text = "ok";
boot.consoleLogLevel = lib.mkForce 100;
boot.kernelParams = [ "boot.shell_on_fail" ];
};
};
perSystem =
{
nodes,
pkgs,
lib,
...
}:
let
dependencies = [
self
self.nixosConfigurations.test_install_machine.config.system.build.toplevel
self.nixosConfigurations.test_install_machine.config.system.build.diskoScript
self.nixosConfigurations.test_install_machine.config.system.clan.deployment.file
pkgs.stdenv.drvPath
clan.clanInternals.machines.x86_64-linux.test_install_machine.config.system.build.toplevel
clan.clanInternals.machines.x86_64-linux.test_install_machine.config.system.build.diskoScript
clan.clanInternals.machines.x86_64-linux.test_install_machine.config.system.clan.deployment.file
pkgs.nixos-anywhere
] ++ builtins.map (i: i.outPath) (builtins.attrValues self.inputs);
closureInfo = pkgs.closureInfo { rootPaths = dependencies; };
in
{
checks = pkgs.lib.mkIf (pkgs.stdenv.isLinux) {
test-installation =
(import ../lib/test-base.nix)
{
name = "test-installation";
nodes.target = {
services.openssh.enable = true;
users.users.root.openssh.authorizedKeys.keyFiles = [
../lib/ssh/pubkey
];
system.nixos.variant_id = "installer";
virtualisation.emptyDiskImages = [ 4096 ];
nix.settings = {
substituters = lib.mkForce [ ];
hashed-mirrors = null;
connect-timeout = lib.mkForce 3;
flake-registry = pkgs.writeText "flake-registry" ''{"flakes":[],"version":2}'';
experimental-features = [
"nix-command"
"flakes"
];
};
};
nodes.client = {
environment.systemPackages = [ self.packages.${pkgs.system}.clan-cli ];
environment.etc."install-closure".source = "${closureInfo}/store-paths";
virtualisation.memorySize = 2048;
nix.settings = {
substituters = lib.mkForce [ ];
hashed-mirrors = null;
connect-timeout = lib.mkForce 3;
flake-registry = pkgs.writeText "flake-registry" ''{"flakes":[],"version":2}'';
experimental-features = [
"nix-command"
"flakes"
];
};
system.extraDependencies = dependencies;
};
test-installation = (import ../lib/test-base.nix) {
name = "test-installation";
nodes.target = {
services.openssh.enable = true;
users.users.root.openssh.authorizedKeys.keyFiles = [ ../lib/ssh/pubkey ];
system.nixos.variant_id = "installer";
virtualisation.emptyDiskImages = [ 4096 ];
nix.settings = {
substituters = lib.mkForce [ ];
hashed-mirrors = null;
connect-timeout = lib.mkForce 3;
flake-registry = pkgs.writeText "flake-registry" ''{"flakes":[],"version":2}'';
experimental-features = [
"nix-command"
"flakes"
];
};
};
nodes.client = {
environment.systemPackages = [
self.packages.${pkgs.system}.clan-cli
] ++ self.packages.${pkgs.system}.clan-cli.runtimeDependencies;
environment.etc."install-closure".source = "${closureInfo}/store-paths";
virtualisation.memorySize = 2048;
nix.settings = {
substituters = lib.mkForce [ ];
hashed-mirrors = null;
connect-timeout = lib.mkForce 3;
flake-registry = pkgs.writeText "flake-registry" ''{"flakes":[],"version":2}'';
experimental-features = [
"nix-command"
"flakes"
];
};
system.extraDependencies = dependencies;
};
testScript = ''
def create_test_machine(oldmachine=None, args={}): # taken from <nixpkgs/nixos/tests/installer.nix>
machine = create_machine({
"qemuFlags":
'-cpu max -m 1024 -virtfs local,path=/nix/store,security_model=none,mount_tag=nix-store,'
f' -drive file={oldmachine.state_dir}/empty0.qcow2,id=drive1,if=none,index=1,werror=report'
f' -device virtio-blk-pci,drive=drive1',
} | args)
driver.machines.append(machine)
return machine
testScript = ''
def create_test_machine(oldmachine=None, args={}): # taken from <nixpkgs/nixos/tests/installer.nix>
startCommand = "${pkgs.qemu_test}/bin/qemu-kvm"
startCommand += " -cpu max -m 1024 -virtfs local,path=/nix/store,security_model=none,mount_tag=nix-store"
startCommand += f' -drive file={oldmachine.state_dir}/empty0.qcow2,id=drive1,if=none,index=1,werror=report'
startCommand += ' -device virtio-blk-pci,drive=drive1'
machine = create_machine({
"startCommand": startCommand,
} | args)
driver.machines.append(machine)
return machine
start_all()
start_all()
client.succeed("${pkgs.coreutils}/bin/install -Dm 600 ${../lib/ssh/privkey} /root/.ssh/id_ed25519")
client.wait_until_succeeds("ssh -o StrictHostKeyChecking=accept-new -v root@target hostname")
client.succeed("${pkgs.coreutils}/bin/install -Dm 600 ${../lib/ssh/privkey} /root/.ssh/id_ed25519")
client.wait_until_succeeds("ssh -o StrictHostKeyChecking=accept-new -v root@target hostname")
client.succeed("clan --debug --flake ${../..} machines install --yes test_install_machine root@target >&2")
try:
target.shutdown()
except BrokenPipeError:
# qemu has already exited
pass
client.succeed("clan --debug --flake ${../..} machines install test_install_machine root@target >&2")
try:
target.shutdown()
except BrokenPipeError:
# qemu has already exited
pass
new_machine = create_test_machine(oldmachine=target, args={ "name": "new_machine" })
assert(new_machine.succeed("cat /etc/install-successful").strip() == "ok")
'';
}
{ inherit pkgs self; };
new_machine = create_test_machine(oldmachine=target, args={ "name": "new_machine" })
assert(new_machine.succeed("cat /etc/install-successful").strip() == "ok")
'';
} { inherit pkgs self; };
};
};
}

View File

@@ -1,17 +1,23 @@
{ hostPkgs, lib, config, ... }:
{
hostPkgs,
lib,
config,
...
}:
let
testDriver = hostPkgs.python3.pkgs.callPackage ./package.nix {
inherit (config) extraPythonPackages;
inherit (hostPkgs.pkgs) util-linux systemd;
};
containers = map (m: m.system.build.toplevel) (lib.attrValues config.nodes);
pythonizeName = name:
pythonizeName =
name:
let
head = lib.substring 0 1 name;
tail = lib.substring 1 (-1) name;
in
(if builtins.match "[A-z_]" head == null then "_" else head) +
lib.stringAsChars (c: if builtins.match "[A-z0-9_]" c == null then "_" else c) tail;
(if builtins.match "[A-z_]" head == null then "_" else head)
+ lib.stringAsChars (c: if builtins.match "[A-z0-9_]" c == null then "_" else c) tail;
nodeHostNames =
let
nodesList = map (c: c.system.name) (lib.attrValues config.nodes);
@@ -21,68 +27,72 @@ let
pythonizedNames = map pythonizeName nodeHostNames;
in
{
driver = lib.mkForce (hostPkgs.runCommand "nixos-test-driver-${config.name}"
{
nativeBuildInputs = [
hostPkgs.makeWrapper
] ++ lib.optionals (!config.skipTypeCheck) [ hostPkgs.mypy ];
buildInputs = [ testDriver ];
testScript = config.testScriptString;
preferLocalBuild = true;
passthru = config.passthru;
meta = config.meta // {
mainProgram = "nixos-test-driver";
driver = lib.mkForce (
hostPkgs.runCommand "nixos-test-driver-${config.name}"
{
nativeBuildInputs = [
hostPkgs.makeWrapper
] ++ lib.optionals (!config.skipTypeCheck) [ hostPkgs.mypy ];
buildInputs = [ testDriver ];
testScript = config.testScriptString;
preferLocalBuild = true;
passthru = config.passthru;
meta = config.meta // {
mainProgram = "nixos-test-driver";
};
}
''
mkdir -p $out/bin
containers=(${toString containers})
${lib.optionalString (!config.skipTypeCheck) ''
# prepend type hints so the test script can be type checked with mypy
cat "${./test-script-prepend.py}" >> testScriptWithTypes
echo "${builtins.toString machineNames}" >> testScriptWithTypes
echo -n "$testScript" >> testScriptWithTypes
echo "Running type check (enable/disable: config.skipTypeCheck)"
echo "See https://nixos.org/manual/nixos/stable/#test-opt-skipTypeCheck"
mypy --no-implicit-optional \
--pretty \
--no-color-output \
testScriptWithTypes
''}
echo -n "$testScript" >> $out/test-script
ln -s ${testDriver}/bin/nixos-test-driver $out/bin/nixos-test-driver
wrapProgram $out/bin/nixos-test-driver \
${lib.concatStringsSep " " (map (name: "--add-flags '--container ${name}'") containers)} \
--add-flags "--test-script '$out/test-script'"
''
);
test = lib.mkForce (
lib.lazyDerivation {
# lazyDerivation improves performance when only passthru items and/or meta are used.
derivation = hostPkgs.stdenv.mkDerivation {
name = "vm-test-run-${config.name}";
requiredSystemFeatures = [ "uid-range" ];
buildCommand = ''
mkdir -p $out
# effectively mute the XMLLogger
export LOGFILE=/dev/null
${config.driver}/bin/nixos-test-driver -o $out
'';
passthru = config.passthru;
meta = config.meta;
};
inherit (config) passthru meta;
}
''
mkdir -p $out/bin
containers=(${toString containers})
${lib.optionalString (!config.skipTypeCheck) ''
# prepend type hints so the test script can be type checked with mypy
cat "${./test-script-prepend.py}" >> testScriptWithTypes
echo "${builtins.toString machineNames}" >> testScriptWithTypes
echo -n "$testScript" >> testScriptWithTypes
echo "Running type check (enable/disable: config.skipTypeCheck)"
echo "See https://nixos.org/manual/nixos/stable/#test-opt-skipTypeCheck"
mypy --no-implicit-optional \
--pretty \
--no-color-output \
testScriptWithTypes
''}
echo -n "$testScript" >> $out/test-script
ln -s ${testDriver}/bin/nixos-test-driver $out/bin/nixos-test-driver
wrapProgram $out/bin/nixos-test-driver \
${lib.concatStringsSep " " (map (name: "--add-flags '--container ${name}'") containers)} \
--add-flags "--test-script '$out/test-script'"
'');
test = lib.mkForce (lib.lazyDerivation {
# lazyDerivation improves performance when only passthru items and/or meta are used.
derivation = hostPkgs.stdenv.mkDerivation {
name = "vm-test-run-${config.name}";
requiredSystemFeatures = [ "uid-range" ];
buildCommand = ''
mkdir -p $out
# effectively mute the XMLLogger
export LOGFILE=/dev/null
${config.driver}/bin/nixos-test-driver -o $out
'';
passthru = config.passthru;
meta = config.meta;
};
inherit (config) passthru meta;
});
);
}

View File

@@ -1,8 +1,18 @@
{ extraPythonPackages, python3Packages, buildPythonApplication, setuptools, util-linux, systemd }:
{
extraPythonPackages,
python3Packages,
buildPythonApplication,
setuptools,
util-linux,
systemd,
}:
buildPythonApplication {
pname = "test-driver";
version = "0.0.1";
propagatedBuildInputs = [ util-linux systemd ] ++ extraPythonPackages python3Packages;
propagatedBuildInputs = [
util-linux
systemd
] ++ extraPythonPackages python3Packages;
nativeBuildInputs = [ setuptools ];
format = "pyproject";
src = ./.;

View File

@@ -258,7 +258,7 @@ class Driver:
self.machines = []
for container in containers:
name_match = re.match(r".*-nixos-system-(.+)-\d.+", container.name)
name_match = re.match(r".*-nixos-system-(.+)-(.+)", container.name)
if not name_match:
raise ValueError(f"Unable to extract hostname from {container.name}")
name = name_match.group(1)

View File

@@ -1,33 +1,33 @@
test:
{ pkgs
, self
, ...
}:
{ pkgs, self, ... }:
let
inherit (pkgs) lib;
nixos-lib = import (pkgs.path + "/nixos/lib") { };
in
(nixos-lib.runTest ({ hostPkgs, ... }: {
hostPkgs = pkgs;
# speed-up evaluation
defaults = {
documentation.enable = lib.mkDefault false;
boot.isContainer = true;
(nixos-lib.runTest (
{ hostPkgs, ... }:
{
hostPkgs = pkgs;
# speed-up evaluation
defaults = {
documentation.enable = lib.mkDefault false;
boot.isContainer = true;
# undo qemu stuff
system.build.initialRamdisk = "";
virtualisation.sharedDirectories = lib.mkForce { };
networking.useDHCP = false;
# undo qemu stuff
system.build.initialRamdisk = "";
virtualisation.sharedDirectories = lib.mkForce { };
networking.useDHCP = false;
# we have not private networking so far
networking.interfaces = lib.mkForce { };
#networking.primaryIPAddress = lib.mkForce null;
systemd.services.backdoor.enable = false;
};
# to accept external dependencies such as disko
node.specialArgs.self = self;
imports = [
test
./container-driver/module.nix
];
})).config.result
# we have not private networking so far
networking.interfaces = lib.mkForce { };
#networking.primaryIPAddress = lib.mkForce null;
systemd.services.backdoor.enable = false;
};
# to accept external dependencies such as disko
node.specialArgs.self = self;
imports = [
test
./container-driver/module.nix
];
}
)).config.result

View File

@@ -1,8 +1,5 @@
test:
{ pkgs
, self
, ...
}:
{ pkgs, self, ... }:
let
inherit (pkgs) lib;
nixos-lib = import (pkgs.path + "/nixos/lib") { };

View File

@@ -0,0 +1,37 @@
(import ../lib/container-test.nix) (
{ pkgs, ... }:
{
name = "matrix-synapse";
nodes.machine =
{ self, lib, ... }:
{
imports = [
self.clanModules.matrix-synapse
self.nixosModules.clanCore
{
clanCore.machineName = "machine";
clanCore.clanDir = ./.;
clan.matrix-synapse = {
enable = true;
domain = "clan.test";
};
}
{
# secret override
clanCore.facts.services.matrix-synapse.secret.synapse-registration_shared_secret.path = "${./synapse-registration_shared_secret}";
services.nginx.virtualHosts."matrix.clan.test" = {
enableACME = lib.mkForce false;
forceSSL = lib.mkForce false;
};
}
];
};
testScript = ''
start_all()
machine.wait_for_unit("matrix-synapse")
machine.succeed("${pkgs.netcat}/bin/nc -z -v ::1 8008")
machine.succeed("${pkgs.curl}/bin/curl -Ssf -L http://localhost/_matrix/static/ -H 'Host: matrix.clan.test'")
'';
}
)

View File

@@ -0,0 +1 @@
registration_shared_secret: supersecret

View File

@@ -1,21 +0,0 @@
(import ../lib/container-test.nix) ({ pkgs, ... }: {
name = "meshnamed";
nodes.machine = { self, ... }: {
imports = [
self.nixosModules.clanCore
{
clanCore.machineName = "machine";
clan.networking.meshnamed.networks.vpn.subnet = "fd43:7def:4b50:28d0:4e99:9347:3035:17ef/88";
clanCore.clanDir = ./.;
}
];
};
testScript = ''
start_all()
machine.wait_for_unit("meshnamed")
out = machine.succeed("${pkgs.dnsutils}/bin/dig AAAA foo.7vbx332lkaunatuzsndtanix54.vpn @meshnamed +short")
print(out)
assert out.strip() == "fd43:7def:4b50:28d0:4e99:9347:3035:17ef"
'';
})

View File

@@ -1,35 +0,0 @@
{ self, runCommand, check-jsonschema, pkgs, lib, ... }:
let
clanModules.clanCore = self.nixosModules.clanCore;
baseModule = {
imports =
(import (pkgs.path + "/nixos/modules/module-list.nix"))
++ [{
nixpkgs.hostPlatform = "x86_64-linux";
clanCore.clanName = "dummy";
}];
};
optionsFromModule = module:
let
evaled = lib.evalModules {
modules = [ module baseModule ];
};
in
evaled.options.clan;
clanModuleSchemas = lib.mapAttrs (_: module: self.lib.jsonschema.parseOptions (optionsFromModule module)) clanModules;
mkTest = name: schema: runCommand "schema-${name}" { } ''
${check-jsonschema}/bin/check-jsonschema \
--check-metaschema ${builtins.toFile "schema-${name}" (builtins.toJSON schema)}
touch $out
'';
in
lib.mapAttrs'
(name: schema: {
name = "schema-${name}";
value = mkTest name schema;
})
clanModuleSchemas

View File

@@ -1,19 +1,20 @@
(import ../lib/test-base.nix) {
name = "secrets";
nodes.machine = { self, config, ... }: {
imports = [
(self.nixosModules.clanCore)
];
environment.etc."secret".source = config.sops.secrets.secret.path;
environment.etc."group-secret".source = config.sops.secrets.group-secret.path;
sops.age.keyFile = ./key.age;
nodes.machine =
{ self, config, ... }:
{
environment.etc."privkey.age".source = ./key.age;
imports = [ (self.nixosModules.clanCore) ];
environment.etc."secret".source = config.sops.secrets.secret.path;
environment.etc."group-secret".source = config.sops.secrets.group-secret.path;
sops.age.keyFile = "/etc/privkey.age";
clanCore.clanDir = "${./.}";
clanCore.machineName = "machine";
clanCore.clanDir = "${./.}";
clanCore.machineName = "machine";
networking.hostName = "machine";
};
networking.hostName = "machine";
};
testScript = ''
machine.succeed("cat /etc/secret >&2")
machine.succeed("cat /etc/group-secret >&2")

View File

@@ -19,7 +19,7 @@
"syncthing.key".source = ./introducer/introducer_test_key;
"syncthing.api".source = ./introducer/introducer_test_api;
};
clanCore.secrets.syncthing.secrets."syncthing.api".path = "/etc/syncthing.api";
clanCore.facts.services.syncthing.secret."syncthing.api".path = "/etc/syncthing.api";
services.syncthing.cert = "/etc/syncthing.pam";
services.syncthing.key = "/etc/syncthing.key";
# Doesn't test zerotier!

View File

@@ -1,25 +1,35 @@
import ../lib/test-base.nix ({ config, pkgs, lib, ... }: {
name = "wayland-proxy-virtwl";
import ../lib/test-base.nix (
{
config,
pkgs,
lib,
...
}:
{
name = "wayland-proxy-virtwl";
nodes.machine = { self, ... }: {
imports = [
self.nixosModules.clanCore
nodes.machine =
{ self, ... }:
{
clanCore.machineName = "machine";
clanCore.clanDir = ./.;
}
];
services.wayland-proxy-virtwl.enable = true;
imports = [
self.nixosModules.clanCore
{
clanCore.machineName = "machine";
clanCore.clanDir = ./.;
}
];
services.wayland-proxy-virtwl.enable = true;
virtualisation.qemu.options = [
"-vga none -device virtio-gpu-rutabaga,cross-domain=on,hostmem=4G,wsi=headless"
];
virtualisation.qemu.options = [
"-vga none -device virtio-gpu-rutabaga,cross-domain=on,hostmem=4G,wsi=headless"
];
virtualisation.qemu.package = lib.mkForce pkgs.qemu_kvm;
};
testScript = ''
start_all()
# use machinectl
machine.succeed("machinectl shell .host ${config.nodes.machine.systemd.package}/bin/systemctl --user start wayland-proxy-virtwl >&2")
'';
})
virtualisation.qemu.package = lib.mkForce pkgs.qemu_kvm;
};
testScript = ''
start_all()
# use machinectl
machine.succeed("machinectl shell .host ${config.nodes.machine.systemd.package}/bin/systemctl --user start wayland-proxy-virtwl >&2")
'';
}
)

View File

@@ -1,20 +1,25 @@
(import ../lib/container-test.nix) ({ pkgs, ... }: {
name = "zt-tcp-relay";
(import ../lib/container-test.nix) (
{ pkgs, ... }:
{
name = "zt-tcp-relay";
nodes.machine = { self, ... }: {
imports = [
self.nixosModules.clanCore
self.clanModules.zt-tcp-relay
nodes.machine =
{ self, ... }:
{
clanCore.machineName = "machine";
clanCore.clanDir = ./.;
}
];
};
testScript = ''
start_all()
machine.wait_for_unit("zt-tcp-relay.service")
out = machine.succeed("${pkgs.netcat}/bin/nc -z -v localhost 4443")
print(out)
'';
})
imports = [
self.nixosModules.clanCore
self.clanModules.zt-tcp-relay
{
clanCore.machineName = "machine";
clanCore.clanDir = ./.;
}
];
};
testScript = ''
start_all()
machine.wait_for_unit("zt-tcp-relay.service")
out = machine.succeed("${pkgs.netcat}/bin/nc -z -v localhost 4443")
print(out)
'';
}
)

View File

@@ -1,94 +0,0 @@
{ config, lib, pkgs, ... }:
let
cfg = config.clan.borgbackup;
in
{
options.clan.borgbackup = {
enable = lib.mkEnableOption "backups with borgbackup";
destinations = lib.mkOption {
type = lib.types.attrsOf (lib.types.submodule ({ name, ... }: {
options = {
name = lib.mkOption {
type = lib.types.str;
default = name;
description = "the name of the backup job";
};
repo = lib.mkOption {
type = lib.types.str;
description = "the borgbackup repository to backup to";
};
rsh = lib.mkOption {
type = lib.types.str;
default = "ssh -i ${config.clanCore.secrets.borgbackup.secrets."borgbackup.ssh".path} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null";
description = "the rsh to use for the backup";
};
};
}));
description = ''
destinations where the machine should be backuped to
'';
};
};
config = lib.mkIf cfg.enable {
services.borgbackup.jobs = lib.mapAttrs
(_: dest: {
paths = lib.flatten (map (state: state.folders) (lib.attrValues config.clanCore.state));
exclude = [ "*.pyc" ];
repo = dest.repo;
environment.BORG_RSH = dest.rsh;
compression = "auto,zstd";
startAt = "*-*-* 01:00:00";
persistentTimer = true;
preHook = ''
set -x
'';
encryption = {
mode = "repokey";
passCommand = "cat ${config.clanCore.secrets.borgbackup.secrets."borgbackup.repokey".path}";
};
prune.keep = {
within = "1d"; # Keep all archives from the last day
daily = 7;
weekly = 4;
monthly = 0;
};
})
cfg.destinations;
clanCore.secrets.borgbackup = {
facts."borgbackup.ssh.pub" = { };
secrets."borgbackup.ssh" = { };
secrets."borgbackup.repokey" = { };
generator.path = [ pkgs.openssh pkgs.coreutils pkgs.xkcdpass ];
generator.script = ''
ssh-keygen -t ed25519 -N "" -f "$secrets"/borgbackup.ssh
mv "$secrets"/borgbackup.ssh.pub "$facts"/borgbackup.ssh.pub
xkcdpass -n 4 -d - > "$secrets"/borgbackup.repokey
'';
};
clanCore.backups.providers.borgbackup = {
# TODO list needs to run locally or on the remote machine
list = ''
# we need yes here to skip the changed url verification
${lib.concatMapStringsSep "\n" (dest: ''yes y | borg-job-${dest.name} list --json | jq -r '. + {"job-name": "${dest.name}"}' '')
(lib.attrValues cfg.destinations)}
'';
create = ''
${lib.concatMapStringsSep "\n" (dest: ''
systemctl start borgbackup-job-${dest.name}
'') (lib.attrValues cfg.destinations)}
'';
restore = ''
set -efu
cd /
IFS=';' read -ra FOLDER <<< "$FOLDERS"
yes y | borg-job-"$JOB" extract --list "$LOCATION"::"$ARCHIVE_ID" "''${FOLDER[@]}"
'';
};
};
}

View File

@@ -0,0 +1,2 @@
Efficient, deduplicating backup program with optional compression and secure encryption.
---

View File

@@ -0,0 +1,131 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.clan.borgbackup;
in
{
options.clan.borgbackup.destinations = lib.mkOption {
type = lib.types.attrsOf (
lib.types.submodule (
{ name, ... }:
{
options = {
name = lib.mkOption {
type = lib.types.strMatching "^[a-zA-Z0-9._-]+$";
default = name;
description = "the name of the backup job";
};
repo = lib.mkOption {
type = lib.types.str;
description = "the borgbackup repository to backup to";
};
rsh = lib.mkOption {
type = lib.types.str;
default = "ssh -i ${
config.clanCore.facts.services.borgbackup.secret."borgbackup.ssh".path
} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null";
defaultText = "ssh -i \${config.clanCore.facts.services.borgbackup.secret.\"borgbackup.ssh\".path} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null";
description = "the rsh to use for the backup";
};
};
}
)
);
default = { };
description = ''
destinations where the machine should be backuped to
'';
};
imports = [
(lib.mkRemovedOptionModule [
"clan"
"borgbackup"
"enable"
] "Just define clan.borgbackup.destinations to enable it")
];
config = lib.mkIf (cfg.destinations != { }) {
services.borgbackup.jobs = lib.mapAttrs (_: dest: {
paths = lib.flatten (map (state: state.folders) (lib.attrValues config.clanCore.state));
exclude = [ "*.pyc" ];
repo = dest.repo;
environment.BORG_RSH = dest.rsh;
compression = "auto,zstd";
startAt = "*-*-* 01:00:00";
persistentTimer = true;
preHook = ''
set -x
'';
encryption = {
mode = "repokey";
passCommand = "cat ${config.clanCore.facts.services.borgbackup.secret."borgbackup.repokey".path}";
};
prune.keep = {
within = "1d"; # Keep all archives from the last day
daily = 7;
weekly = 4;
monthly = 0;
};
}) cfg.destinations;
clanCore.facts.services.borgbackup = {
public."borgbackup.ssh.pub" = { };
secret."borgbackup.ssh" = { };
secret."borgbackup.repokey" = { };
generator.path = [
pkgs.openssh
pkgs.coreutils
pkgs.xkcdpass
];
generator.script = ''
ssh-keygen -t ed25519 -N "" -f "$secrets"/borgbackup.ssh
mv "$secrets"/borgbackup.ssh.pub "$facts"/borgbackup.ssh.pub
xkcdpass -n 4 -d - > "$secrets"/borgbackup.repokey
'';
};
environment.systemPackages = [
(pkgs.writeShellScriptBin "borgbackup-create" ''
set -efu -o pipefail
${lib.concatMapStringsSep "\n" (dest: ''
systemctl start borgbackup-job-${dest.name}
'') (lib.attrValues cfg.destinations)}
'')
(pkgs.writeShellScriptBin "borgbackup-list" ''
set -efu
(${
lib.concatMapStringsSep "\n" (
dest:
# we need yes here to skip the changed url verification
''yes y | borg-job-${dest.name} list --json | jq '[.archives[] | {"name": ("${dest.name}::${dest.repo}::" + .name)}]' ''
) (lib.attrValues cfg.destinations)
}) | ${pkgs.jq}/bin/jq -s 'add'
'')
(pkgs.writeShellScriptBin "borgbackup-restore" ''
set -efux
cd /
IFS=';' read -ra FOLDER <<< "$FOLDERS"
job_name=$(echo "$NAME" | ${pkgs.gawk}/bin/awk -F'::' '{print $1}')
backup_name=''${NAME#"$job_name"::}
if ! command -v borg-job-"$job_name" &> /dev/null; then
echo "borg-job-$job_name not found: Backup name is invalid" >&2
exit 1
fi
yes y | borg-job-"$job_name" extract --list "$backup_name" "''${FOLDER[@]}"
'')
];
clanCore.backups.providers.borgbackup = {
list = "borgbackup-list";
create = "borgbackup-create";
restore = "borgbackup-restore";
};
};
}

View File

@@ -0,0 +1,16 @@
Email-based instant messaging for Desktop.
---
!!! warning "Under construction"
!!! info
This module will automatically configure an email server on the machine for handling the e-mail messaging seamlessly.
## Features
- [x] **Email-based**: Uses any email account as its backend.
- [x] **End-to-End Encryption**: Supports Autocrypt to automatically encrypt messages.
- [x] **No Phone Number Required**: Uses your email address instead of a phone number.
- [x] **Cross-Platform**: Available on desktop and mobile platforms.
- [x] **Automatic Server Setup**: Includes your own DeltaChat server for enhanced control and privacy.
- [ ] **Bake a cake**: This module cannot cake a bake.

View File

@@ -1,12 +1,11 @@
{ config, pkgs, ... }: {
{ config, pkgs, ... }:
{
networking.firewall.interfaces."zt+".allowedTCPPorts = [ 25 ]; # smtp with other hosts
environment.systemPackages = [ pkgs.deltachat-desktop ];
services.maddy =
let
# FIXME move this to public setting
meshname = config.clanCore.secrets.zerotier.facts.zerotier-meshname.value or null;
domain = if meshname == null then "${config.clanCore.machineName}.local" else "${meshname}.vpn";
domain = "${config.clanCore.machineName}.local";
in
{
enable = true;
@@ -136,9 +135,7 @@
storage &local_mailboxes
}
'';
ensureAccounts = [
"user@${domain}"
];
ensureAccounts = [ "user@${domain}" ];
ensureCredentials = {
"user@${domain}".passwordFile = pkgs.writeText "dummy" "foobar";
};

View File

@@ -0,0 +1,2 @@
Automatically format a disk drive on clan installation
---

View File

@@ -0,0 +1,48 @@
{ config, lib, ... }:
{
options.clan.disk-layouts.singleDiskExt4 = {
device = lib.mkOption {
type = lib.types.str;
example = "/dev/disk/by-id/ata-Samsung_SSD_850_EVO_250GB_S21PNXAGB12345";
};
};
config = {
boot.loader.grub.efiSupport = lib.mkDefault true;
boot.loader.grub.efiInstallAsRemovable = lib.mkDefault true;
disko.devices = {
disk = {
main = {
type = "disk";
device = config.clan.disk-layouts.singleDiskExt4.device;
content = {
type = "gpt";
partitions = {
boot = {
size = "1M";
type = "EF02"; # for grub MBR
priority = 1;
};
ESP = {
size = "512M";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
};
};
root = {
size = "100%";
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/";
};
};
};
};
};
};
};
};
}

View File

@@ -0,0 +1,2 @@
A modern IRC server
---

View File

@@ -0,0 +1,14 @@
_: {
services.ergochat = {
enable = true;
settings = {
datastore = {
autoupgrade = true;
path = "/var/lib/ergo/ircd.db";
};
};
};
clanCore.state.ergochat.folders = [ "/var/lib/ergo" ];
}

View File

@@ -1,19 +1,26 @@
{ inputs, ... }: {
{ ... }:
{
flake.clanModules = {
diskLayouts = {
imports = [
./diskLayouts.nix
inputs.disko.nixosModules.default
];
disk-layouts = {
imports = [ ./disk-layouts ];
};
borgbackup = ./borgbackup.nix;
deltachat = ./deltachat.nix;
moonlight = ./moonlight.nix;
sunshine = ./sunshine.nix;
syncthing = ./syncthing.nix;
xfce = ./xfce.nix;
zt-tcp-relay = ./zt-tcp-relay.nix;
localsend = ./localsend.nix;
waypipe = ./waypipe.nix;
borgbackup = ./borgbackup;
deltachat = ./deltachat;
ergochat = ./ergochat;
localbackup = ./localbackup;
localsend = ./localsend;
matrix-synapse = ./matrix-synapse;
moonlight = ./moonlight;
root-password = ./root-password;
sshd = ./sshd;
sunshine = ./sunshine;
static-hosts = ./static-hosts;
syncthing = ./syncthing;
thelounge = ./thelounge;
trusted-nix-caches = ./trusted-nix-caches;
user-password = ./user-password;
xfce = ./xfce;
zerotier-static-peers = ./zerotier-static-peers;
zt-tcp-relay = ./zt-tcp-relay;
};
}

View File

@@ -0,0 +1,2 @@
Automatically backups current machine to local directory.
---

View File

@@ -0,0 +1,223 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.clan.localbackup;
rsnapshotConfig = target: states: ''
config_version 1.2
snapshot_root ${target.directory}
sync_first 1
cmd_cp ${pkgs.coreutils}/bin/cp
cmd_rm ${pkgs.coreutils}/bin/rm
cmd_rsync ${pkgs.rsync}/bin/rsync
cmd_ssh ${pkgs.openssh}/bin/ssh
cmd_logger ${pkgs.inetutils}/bin/logger
cmd_du ${pkgs.coreutils}/bin/du
cmd_rsnapshot_diff ${pkgs.rsnapshot}/bin/rsnapshot-diff
${lib.optionalString (target.preBackupHook != null) ''
cmd_preexec ${pkgs.writeShellScript "preexec.sh" ''
set -efu -o pipefail
${target.preBackupHook}
''}
''}
${lib.optionalString (target.postBackupHook != null) ''
cmd_postexec ${pkgs.writeShellScript "postexec.sh" ''
set -efu -o pipefail
${target.postBackupHook}
''}
''}
retain snapshot ${builtins.toString config.clan.localbackup.snapshots}
${lib.concatMapStringsSep "\n" (state: ''
${lib.concatMapStringsSep "\n" (folder: ''
backup ${folder} ${config.networking.hostName}/
'') state.folders}
'') states}
'';
in
{
options.clan.localbackup = {
targets = lib.mkOption {
type = lib.types.attrsOf (
lib.types.submodule (
{ name, ... }:
{
options = {
name = lib.mkOption {
type = lib.types.strMatching "^[a-zA-Z0-9._-]+$";
default = name;
description = "the name of the backup job";
};
directory = lib.mkOption {
type = lib.types.str;
description = "the directory to backup";
};
mountpoint = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = "mountpoint of the directory to backup. If set, the directory will be mounted before the backup and unmounted afterwards";
};
preMountHook = lib.mkOption {
type = lib.types.nullOr lib.types.lines;
default = null;
description = "Shell commands to run before the directory is mounted";
};
postMountHook = lib.mkOption {
type = lib.types.nullOr lib.types.lines;
default = null;
description = "Shell commands to run after the directory is mounted";
};
preUnmountHook = lib.mkOption {
type = lib.types.nullOr lib.types.lines;
default = null;
description = "Shell commands to run before the directory is unmounted";
};
postUnmountHook = lib.mkOption {
type = lib.types.nullOr lib.types.lines;
default = null;
description = "Shell commands to run after the directory is unmounted";
};
preBackupHook = lib.mkOption {
type = lib.types.nullOr lib.types.lines;
default = null;
description = "Shell commands to run before the backup";
};
postBackupHook = lib.mkOption {
type = lib.types.nullOr lib.types.lines;
default = null;
description = "Shell commands to run after the backup";
};
};
}
)
);
default = { };
description = "List of directories where backups are stored";
};
snapshots = lib.mkOption {
type = lib.types.int;
default = 20;
description = "Number of snapshots to keep";
};
};
config =
let
mountHook = target: ''
if [[ -x /run/current-system/sw/bin/localbackup-mount-${target.name} ]]; then
/run/current-system/sw/bin/localbackup-mount-${target.name}
fi
if [[ -x /run/current-system/sw/bin/localbackup-unmount-${target.name} ]]; then
trap "/run/current-system/sw/bin/localbackup-unmount-${target.name}" EXIT
fi
'';
in
lib.mkIf (cfg.targets != { }) {
environment.systemPackages =
[
(pkgs.writeShellScriptBin "localbackup-create" ''
set -efu -o pipefail
export PATH=${
lib.makeBinPath [
pkgs.rsnapshot
pkgs.coreutils
pkgs.util-linux
]
}
${lib.concatMapStringsSep "\n" (target: ''
(
${mountHook target}
echo "Creating backup '${target.name}'"
rsnapshot -c "${pkgs.writeText "rsnapshot.conf" (rsnapshotConfig target (lib.attrValues config.clanCore.state))}" sync
rsnapshot -c "${pkgs.writeText "rsnapshot.conf" (rsnapshotConfig target (lib.attrValues config.clanCore.state))}" snapshot
)
'') (builtins.attrValues cfg.targets)}
'')
(pkgs.writeShellScriptBin "localbackup-list" ''
set -efu -o pipefail
export PATH=${
lib.makeBinPath [
pkgs.jq
pkgs.findutils
pkgs.coreutils
pkgs.util-linux
]
}
(${
lib.concatMapStringsSep "\n" (target: ''
(
${mountHook target}
find ${lib.escapeShellArg target.directory} -mindepth 1 -maxdepth 1 -name "snapshot.*" -print0 -type d \
| jq -Rs 'split("\u0000") | .[] | select(. != "") | { "name": ("${target.name}::" + .)}'
)
'') (builtins.attrValues cfg.targets)
}) | jq -s .
'')
(pkgs.writeShellScriptBin "localbackup-restore" ''
set -efu -o pipefail
export PATH=${
lib.makeBinPath [
pkgs.rsync
pkgs.coreutils
pkgs.util-linux
pkgs.gawk
]
}
name=$(awk -F'::' '{print $1}' <<< $NAME)
backupname=''${NAME#$name::}
if command -v localbackup-mount-$name; then
localbackup-mount-$name
fi
if command -v localbackup-unmount-$name; then
trap "localbackup-unmount-$name" EXIT
fi
if [[ ! -d $backupname ]]; then
echo "No backup found $backupname"
exit 1
fi
IFS=';' read -ra FOLDER <<< "$FOLDERS"
for folder in "''${FOLDER[@]}"; do
rsync -a "$backupname/${config.networking.hostName}$folder/" "$folder"
done
'')
]
++ (lib.mapAttrsToList (
name: target:
pkgs.writeShellScriptBin ("localbackup-mount-" + name) ''
set -efu -o pipefail
${lib.optionalString (target.preMountHook != null) target.preMountHook}
${lib.optionalString (target.mountpoint != null) ''
if ! ${pkgs.util-linux}/bin/mountpoint -q ${lib.escapeShellArg target.mountpoint}; then
${pkgs.util-linux}/bin/mount -o X-mount.mkdir ${lib.escapeShellArg target.mountpoint}
fi
''}
${lib.optionalString (target.postMountHook != null) target.postMountHook}
''
) cfg.targets)
++ lib.mapAttrsToList (
name: target:
pkgs.writeShellScriptBin ("localbackup-unmount-" + name) ''
set -efu -o pipefail
${lib.optionalString (target.preUnmountHook != null) target.preUnmountHook}
${lib.optionalString (
target.mountpoint != null
) "${pkgs.util-linux}/bin/umount ${lib.escapeShellArg target.mountpoint}"}
${lib.optionalString (target.postUnmountHook != null) target.postUnmountHook}
''
) cfg.targets;
clanCore.backups.providers.localbackup = {
# TODO list needs to run locally or on the remote machine
list = "localbackup-list";
create = "localbackup-create";
restore = "localbackup-restore";
};
};
}

View File

@@ -1,43 +0,0 @@
{ config
, pkgs
, lib
, ...
}:
{
# Integration can be improved, if the following issues get implemented:
# - cli frontend: https://github.com/localsend/localsend/issues/11
# - ipv6 support: https://github.com/localsend/localsend/issues/549
options.clan.localsend = {
enable = lib.mkEnableOption (lib.mdDoc "enable the localsend module");
defaultLocation = lib.mkOption {
type = lib.types.str;
description = "The default download location";
};
package = lib.mkPackageOption pkgs "localsend" { };
};
imports =
if config.clan.localsend.enable then
[
{
clanCore.state.localsend.folders = [
"/var/localsend"
config.clan.localsend.defaultLocation
];
environment.systemPackages = [ config.clan.localsend.package ];
networking.firewall.interfaces."zt+".allowedTCPPorts = [ 53317 ];
networking.firewall.interfaces."zt+".allowedUDPPorts = [ 53317 ];
#TODO: This is currently needed because there is no ipv6 multicasting support yet
#
systemd.network.networks."09-zerotier" = {
networkConfig = {
Address = "192.168.56.2/24";
};
};
}
]
else
[ ];
}

View File

@@ -0,0 +1,2 @@
Securely sharing files and messages over a local network without internet connectivity.
---

View File

@@ -0,0 +1,38 @@
{
config,
pkgs,
lib,
...
}:
{
# Integration can be improved, if the following issues get implemented:
# - cli frontend: https://github.com/localsend/localsend/issues/11
# - ipv6 support: https://github.com/localsend/localsend/issues/549
options.clan.localsend = {
enable = lib.mkEnableOption (lib.mdDoc "enable the localsend module");
defaultLocation = lib.mkOption {
type = lib.types.str;
description = "The default download location";
};
package = lib.mkPackageOption pkgs "localsend" { };
};
config = lib.mkIf config.clan.localsend.enable {
clanCore.state.localsend.folders = [
"/var/localsend"
config.clan.localsend.defaultLocation
];
environment.systemPackages = [ config.clan.localsend.package ];
networking.firewall.interfaces."zt+".allowedTCPPorts = [ 53317 ];
networking.firewall.interfaces."zt+".allowedUDPPorts = [ 53317 ];
#TODO: This is currently needed because there is no ipv6 multicasting support yet
#
systemd.network.networks."09-zerotier" = {
networkConfig = {
Address = "192.168.56.2/24";
};
};
};
}

View File

@@ -0,0 +1,2 @@
A federated messaging server with end-to-end encryption.
---

View File

@@ -0,0 +1,127 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.clan.matrix-synapse;
in
{
options.clan.matrix-synapse = {
enable = lib.mkEnableOption "Enable matrix-synapse";
domain = lib.mkOption {
type = lib.types.str;
description = "The domain name of the matrix server";
};
};
config = lib.mkIf cfg.enable {
services.matrix-synapse = {
enable = true;
settings = {
server_name = cfg.domain;
database = {
args.user = "matrix-synapse";
args.database = "matrix-synapse";
name = "psycopg2";
};
turn_uris = [
"turn:turn.matrix.org?transport=udp"
"turn:turn.matrix.org?transport=tcp"
];
listeners = [
{
port = 8008;
bind_addresses = [ "::1" ];
type = "http";
tls = false;
x_forwarded = true;
resources = [
{
names = [ "client" ];
compress = true;
}
{
names = [ "federation" ];
compress = false;
}
];
}
];
};
extraConfigFiles = [ "/var/lib/matrix-synapse/registration_shared_secret.yaml" ];
};
systemd.services.matrix-synapse.serviceConfig.ExecStartPre = [
"+${pkgs.writeScript "copy_registration_shared_secret" ''
#!/bin/sh
cp ${config.clanCore.facts.services.matrix-synapse.secret.synapse-registration_shared_secret.path} /var/lib/matrix-synapse/registration_shared_secret.yaml
chown matrix-synapse:matrix-synapse /var/lib/matrix-synapse/registration_shared_secret.yaml
chmod 600 /var/lib/matrix-synapse/registration_shared_secret.yaml
''}"
];
clanCore.facts.services."matrix-synapse" = {
secret."synapse-registration_shared_secret" = { };
generator.path = with pkgs; [
coreutils
pwgen
];
generator.script = ''
echo "registration_shared_secret: $(pwgen -s 32 1)" > "$secrets"/synapse-registration_shared_secret
'';
};
services.postgresql.enable = true;
# we need to use both ensusureDatabases and initialScript, because the former runs everytime but with the wrong collation
services.postgresql = {
ensureDatabases = [ "matrix-synapse" ];
ensureUsers = [
{
name = "matrix-synapse";
ensureDBOwnership = true;
}
];
initialScript = pkgs.writeText "synapse-init.sql" ''
CREATE DATABASE "matrix-synapse"
TEMPLATE template0
LC_COLLATE = "C"
LC_CTYPE = "C";
'';
};
services.nginx = {
enable = true;
virtualHosts = {
${cfg.domain} = {
locations."= /.well-known/matrix/server".extraConfig = ''
add_header Content-Type application/json;
return 200 '${builtins.toJSON { "m.server" = "matrix.${cfg.domain}:443"; }}';
'';
locations."= /.well-known/matrix/client".extraConfig = ''
add_header Content-Type application/json;
add_header Access-Control-Allow-Origin *;
return 200 '${
builtins.toJSON {
"m.homeserver" = {
"base_url" = "https://matrix.${cfg.domain}";
};
"m.identity_server" = {
"base_url" = "https://vector.im";
};
}
}';
'';
};
"matrix.${cfg.domain}" = {
forceSSL = true;
enableACME = true;
locations."/_matrix" = {
proxyPass = "http://localhost:8008";
};
locations."/test".extraConfig = ''
return 200 "Hello, world!";
'';
};
};
};
};
}

View File

@@ -1,4 +0,0 @@
{ pkgs, ... }: {
hardware.opengl.enable = true;
environment.systemPackages = [ pkgs.moonlight-qt ];
}

View File

@@ -0,0 +1,2 @@
A desktop streaming client optimized for remote gaming and synchronized movie viewing.
---

View File

@@ -0,0 +1,86 @@
{ pkgs, config, ... }:
let
ms-accept = pkgs.callPackage ../pkgs/moonlight-sunshine-accept { };
defaultPort = 48011;
in
{
hardware.opengl.enable = true;
environment.systemPackages = [
pkgs.moonlight-qt
ms-accept
];
systemd.tmpfiles.rules = [
"d '/var/lib/moonlight' 0770 'user' 'users' - -"
"C '/var/lib/moonlight/moonlight.cert' 0644 'user' 'users' - ${
config.clanCore.facts.services.moonlight.secret."moonlight.cert".path or ""
}"
"C '/var/lib/moonlight/moonlight.key' 0644 'user' 'users' - ${
config.clanCore.facts.services.moonlight.secret."moonlight.key".path or ""
}"
];
systemd.user.services.init-moonlight = {
enable = false;
description = "Initializes moonlight";
wantedBy = [ "graphical-session.target" ];
script = ''
${ms-accept}/bin/moonlight-sunshine-accept moonlight init-config --key /var/lib/moonlight/moonlight.key --cert /var/lib/moonlight/moonlight.cert
'';
serviceConfig = {
user = "user";
Type = "oneshot";
WorkingDirectory = "/home/user/";
RunTimeDirectory = "moonlight";
TimeoutSec = "infinity";
Restart = "on-failure";
RemainAfterExit = true;
ReadOnlyPaths = [
"/var/lib/moonlight/moonlight.key"
"/var/lib/moonlight/moonlight.cert"
];
};
};
systemd.user.services.moonlight-join = {
description = "Join sunshine hosts";
script = ''${ms-accept}/bin/moonlight-sunshine-accept moonlight join --port ${builtins.toString defaultPort} --cert '${
config.clanCore.facts.services.moonlight.public."moonlight.cert".value or ""
}' --host fd2e:25da:6035:c98f:cd99:93e0:b9b8:9ca1'';
serviceConfig = {
Type = "oneshot";
TimeoutSec = "infinity";
Restart = "on-failure";
ReadOnlyPaths = [
"/var/lib/moonlight/moonlight.key"
"/var/lib/moonlight/moonlight.cert"
];
};
};
systemd.user.timers.moonlight-join = {
description = "Join sunshine hosts";
wantedBy = [ "timers.target" ];
timerConfig = {
OnUnitActiveSec = "5min";
OnBootSec = "0min";
Persistent = true;
Unit = "moonlight-join.service";
};
};
clanCore.facts.services.moonlight = {
secret."moonlight.key" = { };
secret."moonlight.cert" = { };
public."moonlight.cert" = { };
generator.path = [
pkgs.coreutils
ms-accept
];
generator.script = ''
moonlight-sunshine-accept moonlight init
mv credentials/cakey.pem "$secrets"/moonlight.key
cp credentials/cacert.pem "$secrets"/moonlight.cert
mv credentials/cacert.pem "$facts"/moonlight.cert
'';
};
}

View File

@@ -0,0 +1,11 @@
Automatically generates and configures a password for the root user.
---
After the system was installed/deployed the following command can be used to display the root-password:
```bash
clan secrets get {machine_name}-password
```
See also: [Facts / Secrets](../../getting-started/secrets.md)

View File

@@ -0,0 +1,20 @@
{ pkgs, config, ... }:
{
users.mutableUsers = false;
users.users.root.hashedPasswordFile =
config.clanCore.facts.services.root-password.secret.password-hash.path;
sops.secrets."${config.clanCore.machineName}-password-hash".neededForUsers = true;
clanCore.facts.services.root-password = {
secret.password = { };
secret.password-hash = { };
generator.path = with pkgs; [
coreutils
xkcdpass
mkpasswd
];
generator.script = ''
xkcdpass --numwords 3 --delimiter - --count 1 > $secrets/password
cat $secrets/password | mkpasswd -s -m sha-512 > $secrets/password-hash
'';
};
}

View File

@@ -0,0 +1,2 @@
Enables secure remote access to the machine over ssh
---

View File

@@ -0,0 +1,25 @@
{ config, pkgs, ... }:
{
services.openssh.enable = true;
services.openssh.settings.PasswordAuthentication = false;
services.openssh.hostKeys = [
{
path = config.clanCore.facts.services.openssh.secret."ssh.id_ed25519".path;
type = "ed25519";
}
];
clanCore.facts.services.openssh = {
secret."ssh.id_ed25519" = { };
public."ssh.id_ed25519.pub" = { };
generator.path = [
pkgs.coreutils
pkgs.openssh
];
generator.script = ''
ssh-keygen -t ed25519 -N "" -f $secrets/ssh.id_ed25519
mv $secrets/ssh.id_ed25519.pub $facts/ssh.id_ed25519.pub
'';
};
}

View File

@@ -0,0 +1,2 @@
Statically configure the host names of machines based on their respective zerotier-ip.
---

View File

@@ -0,0 +1,30 @@
{ lib, config, ... }:
{
options.clan.static-hosts = {
excludeHosts = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ config.clanCore.machineName ];
description = "Hosts that should be excluded";
};
};
config.networking.hosts =
let
clanDir = config.clanCore.clanDir;
machineDir = clanDir + "/machines/";
zerotierIpMachinePath = machines: machineDir + machines + "/facts/zerotier-ip";
machines = builtins.readDir machineDir;
filteredMachines = lib.filterAttrs (
name: _: !(lib.elem name config.clan.static-hosts.excludeHosts)
) machines;
in
lib.filterAttrs (_: value: value != null) (
lib.mapAttrs' (
machine: _:
let
path = zerotierIpMachinePath machine;
in
if builtins.pathExists path then lib.nameValuePair (builtins.readFile path) [ machine ] else null
) filteredMachines
);
}

View File

@@ -1,109 +0,0 @@
{ pkgs, config, ... }:
{
networking.firewall = {
allowedTCPPorts = [
47984
47989
47990
48010
];
allowedUDPPorts = [
47998
47999
48000
48002
48010
];
};
networking.firewall.allowedTCPPortRanges = [
{
from = 47984;
to = 48010;
}
];
networking.firewall.allowedUDPPortRanges = [
{
from = 47998;
to = 48010;
}
];
environment.systemPackages = [
pkgs.sunshine
pkgs.avahi
# Convenience script, until we find a better UX
(pkgs.writers.writeDashBin "sun" ''
${pkgs.sunshine}/bin/sunshine -1 ${
pkgs.writeText "sunshine.conf" ''
address_family = both
''
} "$@"
'')
# Create a dummy account, for easier setup,
# don't use this account in actual production yet.
(pkgs.writers.writeDashBin "init-sun" ''
${pkgs.sunshine}/bin/sunshine \
--creds "sun" "sun"
'')
];
# Required to simulate input
boot.kernelModules = [ "uinput" ];
security.rtkit.enable = true;
# services.udev.extraRules = ''
# KERNEL=="uinput", SUBSYSTEM=="misc", OPTIONS+="static_node=uinput", TAG+="uaccess"
# '';
services.udev.extraRules = ''
KERNEL=="uinput", GROUP="input", MODE="0660" OPTIONS+="static_node=uinput"
'';
security.wrappers.sunshine = {
owner = "root";
group = "root";
capabilities = "cap_sys_admin+p";
source = "${pkgs.sunshine}/bin/sunshine";
};
systemd.user.services.sunshine = {
description = "sunshine";
wantedBy = [ "graphical-session.target" ];
environment = {
DISPLAY = ":0";
};
serviceConfig = {
ExecStart = "${config.security.wrapperDir}/sunshine";
};
};
# xdg.configFile."sunshine/apps.json".text = builtins.toJSON {
# env = "/run/current-system/sw/bin";
# apps = [
# {
# name = "Steam";
# output = "steam.txt";
# detached = [
# "${pkgs.util-linux}/bin/setsid ${pkgs.steam}/bin/steam steam://open/bigpicture"
# ];
# image-path = "steam.png";
# }
# ];
# };
services = {
avahi = {
enable = true;
reflector = true;
nssmdns = true;
publish = {
enable = true;
addresses = true;
userServices = true;
workstation = true;
};
};
};
}

View File

@@ -0,0 +1,2 @@
A desktop streaming server optimized for remote gaming and synchronized movie viewing.
---

View File

@@ -0,0 +1,207 @@
{
pkgs,
config,
lib,
...
}:
let
ms-accept = pkgs.callPackage ../pkgs/moonlight-sunshine-accept { };
sunshineConfiguration = pkgs.writeText "sunshine.conf" ''
address_family = both
channels = 5
pkey = /var/lib/sunshine/sunshine.key
cert = /var/lib/sunshine/sunshine.cert
file_state = /var/lib/sunshine/state.json
credentials_file = /var/lib/sunshine/credentials.json
'';
listenPort = 48011;
in
{
networking.firewall = {
allowedTCPPorts = [
47984
47989
47990
48010
48011
];
allowedUDPPorts = [
47998
47999
48000
48002
48010
];
};
networking.firewall.allowedTCPPortRanges = [
{
from = 47984;
to = 48010;
}
];
networking.firewall.allowedUDPPortRanges = [
{
from = 47998;
to = 48010;
}
];
networking.firewall.interfaces."zt+".allowedTCPPorts = [
47984
47989
47990
48010
listenPort
];
networking.firewall.interfaces."zt+".allowedUDPPortRanges = [
{
from = 47998;
to = 48010;
}
];
environment.systemPackages = [
ms-accept
pkgs.sunshine
pkgs.avahi
# Convenience script, until we find a better UX
(pkgs.writers.writeDashBin "sun" ''
${pkgs.sunshine}/bin/sunshine -0 ${sunshineConfiguration} "$@"
'')
# Create a dummy account, for easier setup,
# don't use this account in actual production yet.
(pkgs.writers.writeDashBin "init-sun" ''
${pkgs.sunshine}/bin/sunshine \
--creds "sunshine" "sunshine"
'')
];
# Required to simulate input
boot.kernelModules = [ "uinput" ];
services.udev.extraRules = ''
KERNEL=="uinput", SUBSYSTEM=="misc", OPTIONS+="static_node=uinput", TAG+="uaccess"
'';
security = {
rtkit.enable = true;
wrappers.sunshine = {
owner = "root";
group = "root";
capabilities = "cap_sys_admin+p";
source = "${pkgs.sunshine}/bin/sunshine";
};
};
systemd.tmpfiles.rules = [
"d '/var/lib/sunshine' 0770 'user' 'users' - -"
"C '/var/lib/sunshine/sunshine.cert' 0644 'user' 'users' - ${
config.clanCore.facts.services.sunshine.secret."sunshine.cert".path or ""
}"
"C '/var/lib/sunshine/sunshine.key' 0644 'user' 'users' - ${
config.clanCore.facts.services.sunshine.secret."sunshine.key".path or ""
}"
];
hardware.opengl.enable = true;
systemd.user.services.sunshine = {
enable = true;
description = "Sunshine self-hosted game stream host for Moonlight";
startLimitBurst = 5;
startLimitIntervalSec = 500;
script = "/run/current-system/sw/bin/env /run/wrappers/bin/sunshine ${sunshineConfiguration}";
serviceConfig = {
Restart = "on-failure";
RestartSec = "5s";
ReadWritePaths = [ "/var/lib/sunshine" ];
ReadOnlyPaths = [
(config.clanCore.facts.services.sunshine.secret."sunshine.key".path or "")
(config.clanCore.facts.services.sunshine.secret."sunshine.cert".path or "")
];
};
wantedBy = [ "graphical-session.target" ];
partOf = [ "graphical-session.target" ];
wants = [ "graphical-session.target" ];
after = [
"sunshine-init-state.service"
"sunshine-init-credentials.service"
];
};
systemd.user.services.sunshine-init-state = {
enable = true;
description = "Sunshine self-hosted game stream host for Moonlight";
startLimitBurst = 5;
startLimitIntervalSec = 500;
script = ''
${ms-accept}/bin/moonlight-sunshine-accept sunshine init-state --uuid ${
config.clanCore.facts.services.sunshine.public.sunshine-uuid.value or null
} --state-file /var/lib/sunshine/state.json
'';
serviceConfig = {
Restart = "on-failure";
RestartSec = "5s";
Type = "oneshot";
ReadWritePaths = [ "/var/lib/sunshine" ];
};
wantedBy = [ "graphical-session.target" ];
};
systemd.user.services.sunshine-init-credentials = {
enable = true;
description = "Sunshine self-hosted game stream host for Moonlight";
startLimitBurst = 5;
startLimitIntervalSec = 500;
script = ''
${lib.getExe pkgs.sunshine} ${sunshineConfiguration} --creds sunshine sunshine
'';
serviceConfig = {
Restart = "on-failure";
RestartSec = "5s";
Type = "oneshot";
ReadWritePaths = [ "/var/lib/sunshine" ];
};
wantedBy = [ "graphical-session.target" ];
};
systemd.user.services.sunshine-listener = {
enable = true;
description = "Sunshine self-hosted game stream host for Moonlight";
startLimitBurst = 5;
startLimitIntervalSec = 500;
script = ''
${ms-accept}/bin/moonlight-sunshine-accept sunshine listen --port ${builtins.toString listenPort} --uuid ${
config.clanCore.facts.services.sunshine.public.sunshine-uuid.value or null
} --state /var/lib/sunshine/state.json --cert '${
config.clanCore.facts.services.sunshine.public."sunshine.cert".value or null
}'
'';
serviceConfig = {
# );
Restart = "on-failure";
RestartSec = 5;
ReadWritePaths = [ "/var/lib/sunshine" ];
};
wantedBy = [ "graphical-session.target" ];
};
clanCore.facts.services.ergochat = {
secret."sunshine.key" = { };
secret."sunshine.cert" = { };
public."sunshine-uuid" = { };
public."sunshine.cert" = { };
generator.path = [
pkgs.coreutils
ms-accept
];
generator.script = ''
moonlight-sunshine-accept sunshine init
mv credentials/cakey.pem "$secrets"/sunshine.key
cp credentials/cacert.pem "$secrets"/sunshine.cert
mv credentials/cacert.pem "$facts"/sunshine.cert
mv uuid "$facts"/sunshine-uuid
'';
};
}

View File

@@ -0,0 +1,32 @@
A secure, file synchronization app for devices over networks, offering a private alternative to cloud services.
---
## Usage
We recommend configuring this module as an sync-service through the provided options. Although it provides a Web GUI through which more usage scenarios are supported.
## Features
- **Private and Secure**: Syncthing uses TLS encryption to secure data transfer between devices, ensuring that only the intended devices can read your data.
- **Decentralized**: No central server is involved in the data transfer. Each device communicates directly with others.
- **Open Source**: The source code is openly available for audit and contribution, fostering trust and continuous improvement.
- **Cross-Platform**: Syncthing supports multiple platforms including Windows, macOS, Linux, BSD, and Android.
- **Real-time Synchronization**: Changes made to files are synchronized in real-time across all connected devices.
- **Web GUI**: It includes a user-friendly web interface for managing devices and configurations. (`127.0.0.1:8384`)
## Configuration
- **Share Folders**: Select folders to share with connected devices and configure permissions and synchronization parameters.
!!! info
Clan automatically discovers other devices. Automatic discovery requires one machine to be an [introducer](#clan.syncthing.introducer)
If that is not the case you can add the other device by its Device ID manually.
You can find and share Device IDs under the "Add Device" button in the Web GUI. (`127.0.0.1:8384`)
## Troubleshooting
- **Sync Conflicts**: Resolve synchronization conflicts manually by reviewing file versions and modification times in the Web GUI (`127.0.0.1:8384`).
## Support
- **Documentation**: Extensive documentation is available on the [Syncthing website](https://docs.syncthing.net/).

View File

@@ -1,14 +1,16 @@
{ config
, pkgs
, lib
, ...
{
config,
pkgs,
lib,
...
}:
{
options.clan.syncthing = {
id = lib.mkOption {
type = lib.types.nullOr lib.types.str;
example = "BABNJY4-G2ICDLF-QQEG7DD-N3OBNGF-BCCOFK6-MV3K7QJ-2WUZHXS-7DTW4AS";
default = config.clanCore.secrets.syncthing.facts."syncthing.pub".value or null;
default = config.clanCore.facts.services.syncthing.public."syncthing.pub".value or null;
defaultText = "config.clanCore.facts.services.syncthing.public.\"syncthing.pub\".value";
};
introducer = lib.mkOption {
description = ''
@@ -32,6 +34,10 @@
'';
type = lib.types.listOf lib.types.str;
default = [ ];
example = [
"folder1"
"folder2"
];
};
};
@@ -53,17 +59,19 @@
assertions = [
{
assertion =
lib.all (attr: builtins.hasAttr attr config.services.syncthing.settings.folders)
config.clan.syncthing.autoShares;
assertion = lib.all (
attr: builtins.hasAttr attr config.services.syncthing.settings.folders
) config.clan.syncthing.autoShares;
message = ''
Syncthing: If you want to AutoShare a folder, you need to have it configured on the sharing device.
'';
}
];
# Activates inofify compatibilty on syncthing
boot.kernel.sysctl."fs.inotify.max_user_watches" = lib.mkDefault 524288;
# Activates inotify compatibility on syncthing
# use mkOverride 900 here as it otherwise would collide with the default of the
# upstream nixos xserver.nix
boot.kernel.sysctl."fs.inotify.max_user_watches" = lib.mkOverride 900 524288;
services.syncthing = {
enable = true;
@@ -80,12 +88,8 @@
group = "syncthing";
key =
lib.mkDefault
config.clan.secrets.syncthing.secrets."syncthing.key".path or null;
cert =
lib.mkDefault
config.clan.secrets.syncthing.secrets."syncthing.cert".path or null;
key = lib.mkDefault config.clan.secrets.syncthing.secrets."syncthing.key".path or null;
cert = lib.mkDefault config.clan.secrets.syncthing.secrets."syncthing.cert".path or null;
settings = {
options = {
@@ -115,7 +119,7 @@
getPendingDevices = "/rest/cluster/pending/devices";
postNewDevice = "/rest/config/devices";
SharedFolderById = "/rest/config/folders/";
apiKey = config.clanCore.secrets.syncthing.secrets."syncthing.api".path or null;
apiKey = config.clanCore.facts.services.syncthing.secret."syncthing.api".path or null;
in
lib.mkIf config.clan.syncthing.autoAcceptDevices {
description = "Syncthing auto accept devices";
@@ -127,51 +131,37 @@
set -x
# query pending deviceID's
APIKEY=$(cat ${apiKey})
PENDING=$(${
lib.getExe pkgs.curl
} -X GET -H "X-API-Key: $APIKEY" ${baseAddress}${getPendingDevices})
PENDING=$(${lib.getExe pkgs.curl} -X GET -H "X-API-Key: $APIKEY" ${baseAddress}${getPendingDevices})
PENDING=$(echo $PENDING | ${lib.getExe pkgs.jq} keys[])
# accept pending deviceID's
for ID in $PENDING;do
${
lib.getExe pkgs.curl
} -X POST -d "{\"deviceId\": $ID}" -H "Content-Type: application/json" -H "X-API-Key: $APIKEY" ${baseAddress}${postNewDevice}
${lib.getExe pkgs.curl} -X POST -d "{\"deviceId\": $ID}" -H "Content-Type: application/json" -H "X-API-Key: $APIKEY" ${baseAddress}${postNewDevice}
# get all shared folders by their ID
for folder in ${builtins.toString config.clan.syncthing.autoShares}; do
SHARED_IDS=$(${
lib.getExe pkgs.curl
} -X GET -H "X-API-Key: $APIKEY" ${baseAddress}${SharedFolderById}"$folder" | ${
lib.getExe pkgs.jq
} ."devices")
PATCHED_IDS=$(echo $SHARED_IDS | ${
lib.getExe pkgs.jq
} ".+= [{\"deviceID\": $ID, \"introducedBy\": \"\", \"encryptionPassword\": \"\"}]")
${
lib.getExe pkgs.curl
} -X PATCH -d "{\"devices\": $PATCHED_IDS}" -H "X-API-Key: $APIKEY" ${baseAddress}${SharedFolderById}"$folder"
SHARED_IDS=$(${lib.getExe pkgs.curl} -X GET -H "X-API-Key: $APIKEY" ${baseAddress}${SharedFolderById}"$folder" | ${lib.getExe pkgs.jq} ."devices")
PATCHED_IDS=$(echo $SHARED_IDS | ${lib.getExe pkgs.jq} ".+= [{\"deviceID\": $ID, \"introducedBy\": \"\", \"encryptionPassword\": \"\"}]")
${lib.getExe pkgs.curl} -X PATCH -d "{\"devices\": $PATCHED_IDS}" -H "X-API-Key: $APIKEY" ${baseAddress}${SharedFolderById}"$folder"
done
done
'';
};
systemd.timers.syncthing-auto-accept =
lib.mkIf config.clan.syncthing.autoAcceptDevices
{
description = "Syncthing Auto Accept";
systemd.timers.syncthing-auto-accept = lib.mkIf config.clan.syncthing.autoAcceptDevices {
description = "Syncthing Auto Accept";
wantedBy = [ "syncthing-auto-accept.service" ];
wantedBy = [ "syncthing-auto-accept.service" ];
timerConfig = {
OnActiveSec = lib.mkDefault 60;
OnUnitActiveSec = lib.mkDefault 60;
};
};
timerConfig = {
OnActiveSec = lib.mkDefault 60;
OnUnitActiveSec = lib.mkDefault 60;
};
};
systemd.services.syncthing-init-api-key =
let
apiKey = config.clanCore.secrets.syncthing.secrets."syncthing.api".path or null;
apiKey = config.clanCore.facts.services.syncthing.secret."syncthing.api".path or null;
in
lib.mkIf config.clan.syncthing.autoAcceptDevices {
description = "Set the api key";
@@ -182,9 +172,7 @@
set -efu pipefail
APIKEY=$(cat ${apiKey})
${
lib.getExe pkgs.gnused
} -i "s/<apikey>.*<\/apikey>/<apikey>$APIKEY<\/apikey>/" /var/lib/syncthing/config.xml
${lib.getExe pkgs.gnused} -i "s/<apikey>.*<\/apikey>/<apikey>$APIKEY<\/apikey>/" /var/lib/syncthing/config.xml
# sudo systemctl restart syncthing.service
systemctl restart syncthing.service
'';
@@ -195,11 +183,11 @@
};
};
clanCore.secrets.syncthing = {
secrets."syncthing.key" = { };
secrets."syncthing.cert" = { };
secrets."syncthing.api" = { };
facts."syncthing.pub" = { };
clanCore.facts.services.syncthing = {
secret."syncthing.key" = { };
secret."syncthing.cert" = { };
secret."syncthing.api" = { };
public."syncthing.pub" = { };
generator.path = [
pkgs.coreutils
pkgs.gnugrep

View File

@@ -0,0 +1,2 @@
Modern web IRC client
---

View File

@@ -0,0 +1,15 @@
_: {
services.thelounge = {
enable = true;
public = true;
extraConfig = {
prefetch = true;
defaults = {
port = 6667;
tls = false;
};
};
};
clanCore.state.thelounde.folders = [ "/var/lib/thelounge" ];
}

View File

@@ -0,0 +1,2 @@
This module sets the `clan.lol` and `nix-community` cache up as a trusted cache.
----

View File

@@ -0,0 +1,10 @@
{
nix.settings.trusted-substituters = [
"https://cache.clan.lol"
"https://nix-community.cachix.org"
];
nix.settings.trusted-public-keys = [
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
"cache.clan.lol-1:3KztgSAB5R1M+Dz7vzkBGzXdodizbgLXGXKXlcQLA28="
];
}

View File

@@ -0,0 +1,18 @@
Automatically generates and configures a password for the specified user account.
---
If setting the option prompt to true, the user will be prompted to type in their desired password.
!!! Note
This module will set `mutableUsers` to `false`, meaning you can not manage user passwords through `passwd` anymore.
After the system was installed/deployed the following command can be used to display the user-password:
```bash
clan secrets get {machine_name}-user-password
```
See also: [Facts / Secrets](../../getting-started/secrets.md)
To regenerate the password, delete the password files in the clan directory and redeploy the machine.

View File

@@ -0,0 +1,49 @@
{
pkgs,
config,
lib,
...
}:
{
options.clan.user-password = {
user = lib.mkOption {
type = lib.types.str;
example = "alice";
description = "The user the password should be generated for.";
};
prompt = lib.mkOption {
type = lib.types.bool;
default = true;
example = false;
description = "Whether the user should be prompted.";
};
};
config = {
users.mutableUsers = false;
users.users.${config.clan.user-password.user}.hashedPasswordFile =
config.clanCore.facts.services.user-password.secret.user-password-hash.path;
sops.secrets."${config.clanCore.machineName}-user-password-hash".neededForUsers = true;
clanCore.facts.services.user-password = {
secret.user-password = { };
secret.user-password-hash = { };
generator.prompt = (
lib.mkIf config.clan.user-password.prompt "Set the password for your $user: ${config.clan.user-password.user}.
You can autogenerate a password, if you leave this prompt blank."
);
generator.path = with pkgs; [
coreutils
xkcdpass
mkpasswd
];
generator.script = ''
if [[ -n $prompt_value ]]; then
echo $prompt_value > $secrets/user-password
else
xkcdpass --numwords 3 --delimiter - --count 1 > $secrets/user-password
fi
cat $secrets/user-password | mkpasswd -s -m sha-512 > $secrets/user-password-hash
'';
};
};
}

View File

@@ -0,0 +1,2 @@
A lightweight desktop manager
---

View File

@@ -0,0 +1,5 @@
Statically configure the `zerotier` peers of a clan network.
---
Statically configure the `zerotier` peers of a clan network.
Requires a machine, that is the zerotier controller configured in the network.

View File

@@ -0,0 +1,71 @@
{
lib,
config,
pkgs,
inputs,
...
}:
let
clanDir = config.clanCore.clanDir;
machineDir = clanDir + "/machines/";
machinesFileSet = builtins.readDir machineDir;
machines = lib.mapAttrsToList (name: _: name) machinesFileSet;
zerotierNetworkIdPath = machines: machineDir + machines + "/facts/zerotier-network-id";
networkIdsUnchecked = builtins.map (
machine:
let
fullPath = zerotierNetworkIdPath machine;
in
if builtins.pathExists fullPath then builtins.readFile fullPath else null
) machines;
networkIds = lib.filter (machine: machine != null) networkIdsUnchecked;
networkId = builtins.elemAt networkIds 0;
in
#TODO:trace on multiple found network-ids
#TODO:trace on no single found networkId
{
options.clan.zerotier-static-peers = {
excludeHosts = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ config.clanCore.machineName ];
description = "Hosts that should be excluded";
};
};
config.systemd.services.zerotier-static-peers-autoaccept =
let
machines = builtins.readDir machineDir;
zerotierIpMachinePath = machines: machineDir + machines + "/facts/zerotier-ip";
filteredMachines = lib.filterAttrs (
name: _: !(lib.elem name config.clan.static-hosts.excludeHosts)
) machines;
hosts = lib.mapAttrsToList (host: _: host) (
lib.mapAttrs' (
machine: _:
let
fullPath = zerotierIpMachinePath machine;
in
if builtins.pathExists fullPath then
lib.nameValuePair (builtins.readFile fullPath) [ machine ]
else
null
) filteredMachines
);
in
lib.mkIf (config.clan.networking.zerotier.controller.enable) {
wantedBy = [ "multi-user.target" ];
after = [ "zerotierone.service" ];
path = [ pkgs.zerotierone ];
serviceConfig.ExecStart = pkgs.writeScript "static-zerotier-peers-autoaccept" ''
#!/bin/sh
${lib.concatMapStringsSep "\n" (host: ''
${
inputs.clan-core.packages.${pkgs.system}.zerotier-members
}/bin/zerotier-members allow --member-ip ${host}
'') hosts}
'';
};
config.clan.networking.zerotier.networkId = lib.mkDefault networkId;
}

View File

@@ -0,0 +1,2 @@
Enable ZeroTier VPN over TCP for networks where UDP is blocked.
---

View File

@@ -1,4 +1,10 @@
{ pkgs, lib, config, ... }: {
{
pkgs,
lib,
config,
...
}:
{
options.clan.zt-tcp-relay = {
port = lib.mkOption {
type = lib.types.port;
@@ -13,7 +19,9 @@
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
serviceConfig = {
ExecStart = "${pkgs.callPackage ../pkgs/zt-tcp-relay {}}/bin/zt-tcp-relay --listen [::]:${builtins.toString config.clan.zt-tcp-relay.port}";
ExecStart = "${
pkgs.callPackage ../../pkgs/zt-tcp-relay { }
}/bin/zt-tcp-relay --listen [::]:${builtins.toString config.clan.zt-tcp-relay.port}";
Restart = "always";
RestartSec = "5";
dynamicUsers = true;

View File

@@ -1,106 +0,0 @@
{
perSystem =
{ pkgs
, self'
, lib
, ...
}:
let
python3 = pkgs.python3;
pypkgs = python3.pkgs;
clan-cli = self'.packages.clan-cli;
clan-vm-manager = self'.packages.clan-vm-manager;
pythonWithDeps = python3.withPackages (
ps:
clan-cli.propagatedBuildInputs
++ clan-cli.devDependencies
++ [
ps.pip
# clan-vm-manager deps
ps.pygobject3
]
);
linuxOnlyPackages = lib.optionals pkgs.stdenv.isLinux [
pkgs.xdg-utils
];
in
{
devShells.python = pkgs.mkShell {
inputsFrom = [ self'.devShells.default ];
packages =
[
pythonWithDeps
pypkgs.mypy
pypkgs.ipdb
pkgs.desktop-file-utils
pkgs.gtk4.dev
pkgs.ruff
pkgs.libadwaita.devdoc # has the demo called 'adwaita-1-demo'
]
++ linuxOnlyPackages
++ clan-vm-manager.nativeBuildInputs
++ clan-vm-manager.buildInputs
++ clan-cli.nativeBuildInputs;
PYTHONBREAKPOINT = "ipdb.set_trace";
shellHook = ''
ln -sfT ${clan-cli.nixpkgs} ./pkgs/clan-cli/clan_cli/nixpkgs
## PYTHON
tmp_path=$(realpath ./.direnv)
repo_root=$(realpath .)
mkdir -p "$tmp_path/python/${pythonWithDeps.sitePackages}"
# local dependencies
localPackages=(
$repo_root/pkgs/clan-cli
$repo_root/pkgs/clan-vm-manager
)
# Install the package in editable mode
# This allows executing `clan` from within the dev-shell using the current
# version of the code and its dependencies.
# TODO: this is slow. get rid of pip or add better caching
echo "==== Installing local python packages in editable mode ===="
for package in "''${localPackages[@]}"; do
${pythonWithDeps}/bin/pip install \
--quiet \
--disable-pip-version-check \
--no-index \
--no-build-isolation \
--prefix "$tmp_path/python" \
--editable "$package"
done
export PATH="$tmp_path/python/bin:$PATH"
export PYTHONPATH="''${PYTHONPATH:+$PYTHONPATH:}$tmp_path/python/${pythonWithDeps.sitePackages}"
for package in "''${localPackages[@]}"; do
export PYTHONPATH="$package:$PYTHONPATH"
done
if ! command -v xdg-mime &> /dev/null; then
echo "Warning: 'xdg-mime' is not available. The desktop file cannot be installed."
fi
# install desktop file
set -eou pipefail
DESKTOP_FILE_NAME=org.clan.vm-manager.desktop
DESKTOP_DST=~/.local/share/applications/$DESKTOP_FILE_NAME
DESKTOP_SRC=${clan-vm-manager.desktop-file}/share/applications/$DESKTOP_FILE_NAME
UI_BIN="clan-vm-manager"
cp -f $DESKTOP_SRC $DESKTOP_DST
sleep 2
sed -i "s|Exec=.*clan-vm-manager|Exec=$UI_BIN|" $DESKTOP_DST
xdg-mime default $DESKTOP_FILE_NAME x-scheme-handler/clan
echo "==== Validating desktop file installation ===="
set -x
desktop-file-validate $DESKTOP_DST
set +xeou pipefail
'';
};
};
}

View File

@@ -1,9 +1,10 @@
{
perSystem =
{ pkgs
, self'
, config
, ...
{
pkgs,
self',
config,
...
}:
let
writers = pkgs.callPackage ./pkgs/builders/script-writers.nix { };
@@ -16,16 +17,16 @@
# A python program to switch between dev-shells
# usage: select-shell shell-name
# the currently enabled dev-shell gets stored in ./.direnv/selected-shell
select-shell = writers.writePython3Bin "select-shell"
{
flakeIgnore = [ "E501" ];
} ./pkgs/scripts/select-shell.py;
select-shell = writers.writePython3Bin "select-shell" {
flakeIgnore = [ "E501" ];
} ./pkgs/scripts/select-shell.py;
in
{
devShells.default = pkgs.mkShell {
packages = [
select-shell
pkgs.tea
pkgs.nix
self'.packages.tea-create-pr
self'.packages.merge-after-ci
self'.packages.pending-reviews

6
docs/.envrc Normal file
View File

@@ -0,0 +1,6 @@
source_up
watch_file $(find ./nix -name "*.nix" -printf '%p ')
# Because we depend on nixpkgs sources, uploading to builders takes a long time
use flake .#docs --builders ''

1
docs/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/site/reference

View File

@@ -153,3 +153,9 @@ If you need to inspect the Nix sandbox while running tests, follow these steps:
cntr exec -w your_sandbox_name
psgrep -a -x your_python_process_name
```
# Standards
Every new module name should be in kebab-case.
Every fact definition, where possible should be in kebab-case.

View File

@@ -1,10 +0,0 @@
+++
title = "Admin Documentation"
description = "Documentation administrators creating or managing cLANs"
date = 2025-05-01T19:00:00+00:00
updated = 2021-05-01T19:00:00+00:00
template = "docs/section.html"
weight = 15
sort_by = "title"
draft = false
+++

View File

@@ -1,69 +0,0 @@
# cLAN config
`clan config` allows you to manage your nixos configuration via the terminal.
Similar as how `git config` reads and sets git options, `clan config` does the same with your nixos options
It also supports auto completion making it easy to find the right options.
## Set up clan-config
Add the clan tool to your flake inputs:
```
clan.url = "git+https://git.clan.lol/clan/clan-core";
```
and inside the mkFlake:
```
imports = [
inputs.clan.flakeModules.clan-config
];
```
Add an empty config file and add it to git
```command
echo "{}" > ./clan-settings.json
git add ./clan-settings.json
```
Import the clan-config module into your nixos configuration:
```nix
{
imports = [
# clan-settings.json is located in the same directory as your flake.
# Adapt the path if necessary.
(builtins.fromJSON (builtins.readFile ./clan-settings.json))
];
}
```
Make sure your nixos configuration is set a default
```nix
{self, ...}: {
flake.nixosConfigurations.default = self.nixosConfigurations.my-machine;
}
```
Use all inputs provided by the clan-config devShell in your own devShell:
```nix
{ ... }: {
perSystem = { pkgs, self', ... }: {
devShells.default = pkgs.mkShell {
inputsFrom = [ self'.devShells.clan-config ];
# ...
};
};
}
```
re-load your dev-shell to make the clan tool available.
```command
clan config --help
```

View File

@@ -1,138 +0,0 @@
# Managing NixOS Machines
## Add Your First Machine
To start managing a new machine, use the following commands to create and then list your machines:
```shellSession
$ clan machines create my-machine
$ clan machines list
my-machine
```
## Configure Your Machine
In the example below, we demonstrate how to add a new user named `my-user` and set a password. This user will be configured to log in to the machine `my-machine`.
### Creating a New User
```shellSession
# Add a new user
$ clan config --machine my-machine users.users.my-user.isNormalUser true
# Set a password for the user
$ clan config --machine my-machine users.users.my-user.hashedPassword $(mkpasswd)
```
_Note: The `$(mkpasswd)` command generates a hashed password. Ensure you have the `mkpasswd` utility installed or use an alternative method to generate a secure hashed password._
## Test Your Machine Configuration Inside a VM
Before deploying your configuration to a live environment, you can run a virtual machine (VM) to test the settings:
```shellSession
$ clan vms run my-machine
```
This command run a VM based on the configuration of `my-machine`, allowing you to verify changes in a controlled environment.
## Installing a New Machine
Clan CLI, in conjunction with [nixos-anywhere](https://github.com/nix-community/nixos-anywhere), provides a seamless method for installing NixOS on various machines.
This process involves preparing a suitable hardware and disk partitioning configuration and ensuring the target machine is accessible via SSH.
### Prerequisites
- A running Linux system with SSH on the target machine is required. This is typically pre-configured for many server providers.
- For installations on physical hardware, create a NixOS installer image and transfer it to a bootable USB drive as described below.
## Creating a Bootable USB Drive on Linux
To create a bootable USB flash drive with the NixOS installer:
1. **Build the Installer Image**:
```shellSession
$ nix build git+https://git.clan.lol/clan/clan-core.git#install-iso
```
2. **Prepare the USB Flash Drive**:
- Insert your USB flash drive into your computer.
- Identify your flash drive with `lsblk`. Look for the device with a matching size.
- Ensure all partitions on the drive are unmounted. Replace `sdX` in the command below with your device identifier (like `sdb`, etc.):
```shellSession
sudo umount /dev/sdX*
```
3. **Write the Image to the USB Drive**:
- Use the `dd` utility to write the NixOS installer image to your USB drive:
```shellSession
sudo dd bs=4M conv=fsync oflag=direct status=progress if=./result/stick.raw of=/dev/sdX
```
4. **Boot and Connect**:
- After writing the installer to the USB drive, use it to boot the target machine.
- The installer will display an IP address and a root password, which you can use to connect via SSH.
### Finishing the installation
With the target machine running Linux and accessible via SSH, execute the following command to install NixOS on the target machine, replacing `<target_host>` with the machine's hostname or IP address:
```shellSession
$ clan machines install my-machine <target_host>
```
## Update Your Machines
Clan CLI enables you to remotely update your machines over SSH. This requires setting up a target address for each target machine.
### Setting the Target Host
Replace `host_or_ip` with the actual hostname or IP address of your target machine:
```shellSession
$ clan config --machine my-machine clan.networking.targetHost root@host_or_ip
```
_Note: The use of `root@` in the target address implies SSH access as the root user.
Ensure that the root login is secured and only used when necessary._
### Updating Machine Configurations
Execute the following command to update the specified machine:
```shellSession
$ clan machines update my-machine
```
You can also update all configured machines simultaneously by omitting the machine name:
```shellSession
$ clan machines update
```
### Setting a Build Host
If the machine does not have enough resources to run the NixOS evaluation or build itself,
it is also possible to specify a build host instead.
During an update, the cli will ssh into the build host and run `nixos-rebuild` from there.
```shellSession
$ clan config --machine my-machine clan.networking.buildHost root@host_or_ip
```
### Excluding a machine from `clan machine update`
To exclude machines from beeing updated when running `clan machines update` without any machines specified,
one can set the `clan.deployment.requireExplicitUpdate` option to true:
```shellSession
$ clan config --machine my-machine clan.deployment.requireExplicitUpdate true
```
This is useful for machines that are not always online or are not part of the regular update cycle.

View File

@@ -1,135 +0,0 @@
# Initializing a New Clan Project
## Create a new flake
1. To start a new project, execute the following command to add the clan cli to your shell:
```shellSession
$ nix shell git+https://git.clan.lol/clan/clan-core
```
2. Then use the following commands to initialize a new clan-flake:
```shellSession
$ clan flake create my-clan
```
This action will generate two primary files: `flake.nix` and `.clan-flake`.
```shellSession
$ ls -la
drwx------ joerg users 5 B a minute ago ./
drwxrwxrwt root root 139 B 12 seconds ago ../
.rw-r--r-- joerg users 77 B a minute ago .clan-flake
.rw-r--r-- joerg users 4.8 KB a minute ago flake.lock
.rw-r--r-- joerg users 242 B a minute ago flake.nix
```
### Understanding the .clan-flake Marker File
The `.clan-flake` marker file serves an optional purpose: it helps the `clan-cli` utility locate the project's root directory.
If `.clan-flake` is missing, `clan-cli` will instead search for other indicators like `.git`, `.hg`, `.svn`, or `flake.nix` to identify the project root.
## What's next
After creating your flake, you can check out how to add [new machines](./machines.md)
---
# Migrating Existing NixOS Configuration Flake
Absolutely, let's break down the migration step by step, explaining each action in detail:
#### Before You Begin
1. **Backup Your Current Configuration**: Always start by making a backup of your current NixOS configuration to ensure you can revert if needed.
```shellSession
$ cp -r /etc/nixos ~/nixos-backup
```
2. **Update Flake Inputs**: Add a new input for the `clan-core` dependency:
```nix
inputs.clan-core = {
url = "git+https://git.clan.lol/clan/clan-core";
# Don't do this if your machines are on nixpkgs stable.
inputs.nixpkgs.follows = "nixpkgs";
};
```
- `url`: Specifies the Git repository URL for Clan Core.
- `inputs.nixpkgs.follows`: Tells Nix to use the same `nixpkgs` input as your main input (in this case, it follows `nixpkgs`).
3. **Update Outputs**: Then modify the `outputs` section of your `flake.nix` to adapt to Clan Core's new provisioning method. The key changes are as follows:
Add `clan-core` to the output
```diff
- outputs = { self, nixpkgs, }:
+ outputs = { self, nixpkgs, clan-core }:
```
Previous configuration:
```nix
{
nixosConfigurations.example-desktop = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./configuration.nix
];
[...]
};
}
```
After change:
```nix
let clan = clan-core.lib.buildClan {
# this needs to point at the repository root
directory = self;
specialArgs = {};
clanName = "NEEDS_TO_BE_UNIQUE"; # TODO: Changeme
machines = {
example-desktop = {
nixpkgs.hostPlatform = "x86_64-linux";
imports = [
./configuration.nix
];
};
};
};
in { inherit (clan) nixosConfigurations clanInternals; }
```
- `nixosConfigurations`: Defines NixOS configurations, using Clan Cores `buildClan` function to manage the machines.
- Inside `machines`, a new machine configuration is defined (in this case, `example-desktop`).
- Inside `example-desktop` which is the target machine hostname, `nixpkgs.hostPlatform` specifies the host platform as `x86_64-linux`.
- `clanInternals`: Is required to enable evaluation of the secret generation/upload script on every architecture
- `clanName`: Is required and needs to be globally unique, as else we have a cLAN name clash
4. **Rebuild and Switch**: Rebuild your NixOS configuration using the updated flake:
```shellSession
$ sudo nixos-rebuild switch --flake .
```
- This command rebuilds and switches to the new configuration. Make sure to include the `--flake .` argument to use the current directory as the flake source.
5. **Test Configuration**: Before rebooting, verify that your new configuration builds without errors or warnings.
6. **Reboot**: If everything is fine, you can reboot your system to apply the changes:
```shellSession
$ sudo reboot
```
7. **Verify**: After the reboot, confirm that your system is running with the new configuration, and all services and applications are functioning as expected.
By following these steps, you've successfully migrated your NixOS Flake configuration to include the `clan-core` input and adapted the `outputs` section to work with Clan Core's new machine provisioning method.
## What's next
After creating your flake, you can check out how to add [new machines](./machines.md)

View File

@@ -1,173 +0,0 @@
# Managing Secrets with Clan
Clan enables encryption of secrets within a Clan flake, ensuring secure sharing among users.
This documentation will guide you through managing secrets with the Clan CLI,
which utilizes the [sops](https://github.com/getsops/sops) format and
integrates with [sops-nix](https://github.com/Mic92/sops-nix) on NixOS machines.
## 1. Generating Keys and Creating Secrets
To begin, generate a key pair:
```shellSession
$ clan secrets key generate
```
**Output**:
```
Public key: age1wkth7uhpkl555g40t8hjsysr20drq286netu8zptw50lmqz7j95sw2t3l7
Generated age private key at '/home/joerg/.config/sops/age/keys.txt' for your user.
Generated age private key at '/home/joerg/.config/sops/age/keys.txt' for your user. Please back it up on a secure location or you will lose access to your secrets.
Also add your age public key to the repository with 'clan secrets users add youruser age1wkth7uhpkl555g40t8hjsysr20drq286netu8zptw50lmqz7j95sw2t3l7' (replace you
user with your user name)
```
⚠️ **Important**: Backup the generated private key securely, or risk losing access to your secrets.
Next, add your public key to the Clan flake repository:
```shellSession
$ clan secrets users add <your_username> <your_public_key>
```
Doing so creates this structure in your Clan flake:
```
sops/
└── users/
└── <your_username>/
└── key.json
```
Now, to set your first secret:
```shellSession
$ clan secrets set mysecret
Paste your secret:
```
Note: As you type your secret, keypresses won't be displayed. Press Enter to save the secret.
Retrieve the stored secret:
```shellSession
$ clan secrets get mysecret
```
And list all secrets like this:
```shellSession
$ clan secrets list
```
Secrets in the repository follow this structure:
```
sops/
├── secrets/
│ └── <secret_name>/
│ ├── secret
│ └── users/
│ └── <your_username>/
```
The content of the secret is stored encrypted inside the `secret` file under `mysecret`.
By default, secrets are encrypted with your key to ensure readability.
## 2. Adding Machine Keys
New machines in Clan come with age keys stored in `./sops/machines/<machine_name>`. To list these machines:
```shellSession
$ clan secrets machines list
```
For existing machines, add their keys:
```shellSession
$ clan secrets machines add <machine_name> <age_key>
```
To fetch an age key from an SSH host key:
```shellSession
$ ssh-keyscan <domain_name> | nix shell nixpkgs#ssh-to-age -c ssh-to-age
```
## 3. Assigning Access
By default, secrets are encrypted for your key. To specify which users and machines can access a secret:
```shellSession
$ clan secrets set --machine <machine1> --machine <machine2> --user <user1> --user <user2> <secret_name>
```
You can add machines/users to existing secrets without modifying the secret:
```shellSession
$ clan secrets machines add-secret <machine_name> <secret_name>
```
## 4. Utilizing Groups
For convenience, Clan CLI allows group creation to simplify access management. Here's how:
1. **Creating Groups**:
Assign users to a new group, e.g., `admins`:
```shellSession
$ clan secrets groups add admins <username>
```
2. **Listing Groups**:
```shellSession
$ clan secrets groups list
```
3. **Assigning Secrets to Groups**:
```shellSession
$ clan secrets groups add-secret <group_name> <secret_name>
```
# NixOS integration
A NixOS machine will automatically import all secrets that are encrypted for the
current machine. At runtime it will use the host key to decrypt all secrets into
a in-memory, non-persistent filesystem using
[sops-nix](https://github.com/Mic92/sops-nix). In your nixos configuration you
can get a path to secrets like this `config.sops.secrets.<name>.path`. Example:
```nix
{ config, ...}: {
sops.secrets.my-password.neededForUsers = true;
users.users.mic92 = {
isNormalUser = true;
passwordFile = config.sops.secrets.my-password.path;
};
}
```
See the [readme](https://github.com/Mic92/sops-nix) of sops-nix for more
examples.
# Importing existing sops-based keys / sops-nix
`clan secrets` stores each secrets in a single file, whereas [sops](https://github.com/Mic92/sops-nix)
commonly allows to put all secrets in a yaml or json documents.
If you already happend to use sops-nix, you can migrate by using the `clan secrets import-sops` command by importing these documents:
```shellSession
% clan secrets import-sops --prefix matchbox- --group admins --machine matchbox nixos/matchbox/secrets/secrets.yaml
```
This will create secrets for each secret found in `nixos/matchbox/secrets/secrets.yaml` in a ./sops folder of your repository.
Each member of the group `admins` will be able
Since our clan secret module will auto-import secrets that are encrypted for a particular nixos machine,
you can now remove `sops.secrets.<secrets> = { };` unless you need to specify more options for the secret like owner/group of the secret file.

View File

@@ -1,69 +0,0 @@
# ZeroTier Configuration with NixOS in Clan
This guide provides detailed instructions for configuring
[ZeroTier VPN](https://zerotier.com) within Clan. Follow the
outlined steps to set up a machine as a VPN controller (`<CONTROLLER>`) and to
include a new machine into the VPN.
## 1. Setting Up the VPN Controller
The VPN controller is initially essential for providing configuration to new
peers. Post the address allocation, the controller's continuous operation is not
crucial.
### Instructions:
1. **Designate a Machine**: Label a machine as the VPN controller in the clan,
referred to as `<CONTROLLER>` henceforth in this guide.
2. **Add Configuration**: Input the below configuration to the NixOS
configuration of the controller machine:
```nix
clan.networking.zerotier.controller = {
enable = true;
public = true;
};
```
3. **Update the Controller Machine**: Execute the following:
```console
$ clan machines update <CONTROLLER>
```
Your machine is now operational as the VPN controller.
## 2. Integrating a New Machine to the VPN
To introduce a new machine to the VPN, adhere to the following steps:
### Instructions:
1. **Update Configuration**: On the new machine, incorporate the below to its
configuration, substituting `<CONTROLLER>` with the controller machine name:
```nix
{ config, ... }: {
clan.networking.zerotier.networkId = builtins.readFile (config.clanCore.clanDir + "/machines/<CONTROLLER>/facts/zerotier-network-id");
}
```
2. **Update the New Machine**: Execute:
```console
$ clan machines update <NEW_MACHINE>
```
Replace `<NEW_MACHINE>` with the designated new machine name.
3. **Retrieve the ZeroTier ID**: On the `new_machine`, execute:
```console
$ sudo zerotier-cli info
```
Example Output: `200 info d2c71971db 1.12.1 OFFLINE`, where `d2c71971db` is
the ZeroTier ID.
4. **Authorize the New Machine on Controller**: On the controller machine,
execute:
```console
$ sudo zerotier-members allow <ID>
```
Substitute `<ID>` with the ZeroTier ID obtained previously.
5. **Verify Connection**: On the `new_machine`, re-execute:
```console
$ sudo zerotier-cli info
```
The status should now be "ONLINE" e.g., `200 info 47303517ef 1.12.1 ONLINE`.
Congratulations! The new machine is now part of the VPN, and the ZeroTier
configuration on NixOS within the Clan project is complete.

30
docs/main.py Normal file
View File

@@ -0,0 +1,30 @@
from typing import Any
def define_env(env: Any) -> None:
static_dir = "/static/"
video_dir = "https://clan.lol/" + "videos/"
asciinema_dir = static_dir + "asciinema-player/"
@env.macro
def video(name: str) -> str:
return f"""<video loop muted autoplay id="{name}">
<source src={video_dir + name} type="video/webm">
Your browser does not support the video tag.
</video>"""
@env.macro
def asciinema(name: str) -> str:
return f"""<div id="{name}">
<script src="{asciinema_dir}/asciinema-player.min.js"></script>
<script>
AsciinemaPlayer.create('{video_dir + name}',
document.getElementById("{name}"), {{
loop: true,
autoPlay: true,
controls: false,
speed: 1.5,
theme: "solarized-light"
}});
</script>
</div>"""

160
docs/mkdocs.yml Normal file
View File

@@ -0,0 +1,160 @@
site_name: Clan Docs
site_url: https://docs.clan.lol
repo_url: https://git.clan.lol/clan/clan-core/
repo_name: clan-core
edit_uri: _edit/main/docs/docs/
validation:
omitted_files: warn
absolute_links: warn
unrecognized_links: warn
markdown_extensions:
- admonition
- attr_list
- footnotes
- md_in_html
- meta
- plantuml_markdown
- pymdownx.emoji:
emoji_index: !!python/name:material.extensions.emoji.twemoji
emoji_generator: !!python/name:material.extensions.emoji.to_svg
- pymdownx.tasklist:
custom_checkbox: true
- pymdownx.superfences
- pymdownx.tabbed:
alternate_style: true
- pymdownx.details
- pymdownx.highlight:
use_pygments: true
anchor_linenums: true
- toc:
title: On this page
exclude_docs: |
.*
!templates/
/drafts/
nav:
- Blog:
- blog/index.md
- Getting started:
- index.md
- Installer: getting-started/installer.md
- Configure: getting-started/configure.md
- Secrets & Facts: getting-started/secrets.md
- Deploy Machine: getting-started/deploy.md
- Mesh VPN: getting-started/mesh-vpn.md
- Backup & Restore: getting-started/backups.md
- Flake-parts: getting-started/flake-parts.md
- Modules:
- Clan Modules:
- reference/clanModules/borgbackup.md
- reference/clanModules/deltachat.md
- reference/clanModules/disk-layouts.md
- reference/clanModules/ergochat.md
- reference/clanModules/localbackup.md
- reference/clanModules/localsend.md
- reference/clanModules/matrix-synapse.md
- reference/clanModules/moonlight.md
- reference/clanModules/root-password.md
- reference/clanModules/sshd.md
- reference/clanModules/sunshine.md
- reference/clanModules/syncthing.md
- reference/clanModules/static-hosts.md
- reference/clanModules/thelounge.md
- reference/clanModules/trusted-nix-caches.md
- reference/clanModules/user-password.md
- reference/clanModules/xfce.md
- reference/clanModules/zerotier-static-peers.md
- reference/clanModules/zt-tcp-relay.md
- CLI:
- reference/cli/index.md
- reference/cli/backups.md
- reference/cli/config.md
- reference/cli/facts.md
- reference/cli/flakes.md
- reference/cli/flash.md
- reference/cli/history.md
- reference/cli/machines.md
- reference/cli/secrets.md
- reference/cli/ssh.md
- reference/cli/vms.md
- Clan Core:
- reference/clan-core/index.md
- reference/clan-core/backups.md
- reference/clan-core/facts.md
- reference/clan-core/sops.md
- reference/clan-core/state.md
- Contributing: contributing/contributing.md
docs_dir: site
site_dir: out
theme:
logo: static/clan-white.png
favicon: static/clan-dark.png
name: material
features:
- navigation.instant
- navigation.tabs
- content.code.annotate
- content.code.copy
- content.tabs.link
icon:
repo: fontawesome/brands/git
font:
code: Roboto Mono
palette:
# Palette toggle for light mode
- media: "(prefers-color-scheme: light)"
scheme: default
primary: teal
accent: deep purple
toggle:
icon: material/weather-night
name: Switch to dark mode
# Palette toggle for dark mode
- media: "(prefers-color-scheme: dark)"
primary: teal
accent: deep purple
scheme: slate
toggle:
icon: material/weather-sunny
name: Switch to light mode
extra_css:
- static/asciinema-player/custom-theme.css
- static/asciinema-player/asciinema-player.css
extra:
social:
- icon: fontawesome/regular/comment
link: https://matrix.to/#/#clan:lassul.us
- icon: fontawesome/brands/gitlab
link: https://git.clan.lol/clan/clan-core
- icon: fontawesome/brands/github
link: https://github.com/clan-lol/clan-core
- icon: fontawesome/solid/rss
link: /feed_rss_created.xml
plugins:
- search
- blog
- macros
- rss:
match_path: blog/posts/.*
use_git: false
date_from_meta:
as_creation: "date"
as_update: "date"
datetime_format: "%Y-%m-%d %H:%M"
default_timezone: Europe/Paris
default_time: "17:18"
categories:
- categories
- tags

40
docs/nix/default.nix Normal file
View File

@@ -0,0 +1,40 @@
{
pkgs,
module-docs,
clan-cli-docs,
...
}:
let
uml-c4 = pkgs.python3Packages.plantuml-markdown.override { plantuml = pkgs.plantuml-c4; };
in
pkgs.stdenv.mkDerivation {
name = "clan-documentation";
src = ../.;
nativeBuildInputs =
[
pkgs.python3
uml-c4
]
++ (with pkgs.python3Packages; [
mkdocs
mkdocs-material
mkdocs-rss-plugin
mkdocs-macros
]);
configurePhase = ''
mkdir -p ./site/reference/cli
cp -af ${module-docs}/* ./site/reference/
cp -af ${clan-cli-docs}/* ./site/reference/cli/
'';
buildPhase = ''
mkdocs build --strict
ls -la .
'';
installPhase = ''
cp -a out/ $out/
'';
}

49
docs/nix/deploy-docs.nix Normal file
View File

@@ -0,0 +1,49 @@
{
writeShellScriptBin,
coreutils,
openssh,
rsync,
lib,
docs,
}:
writeShellScriptBin "deploy-docs" ''
set -eu -o pipefail
export PATH="${
lib.makeBinPath [
coreutils
openssh
rsync
]
}"
#########################################
# #
# DO NOT PRINT THE SSH KEY TO THE LOGS #
# #
#########################################
set +x
if [ -n "''${SSH_HOMEPAGE_KEY:-}" ]; then
echo "$SSH_HOMEPAGE_KEY" > ./ssh_key
chmod 600 ./ssh_key
sshExtraArgs="-i ./ssh_key"
else
sshExtraArgs=
fi
set -x
###########################
# #
# END OF DANGER ZONE #
# #
###########################
rsync \
-e "ssh -o StrictHostKeyChecking=no $sshExtraArgs" \
-a ${docs}/ \
www@clan.lol:/var/www/docs.clan.lol
if [ -e ./ssh_key ]; then
rm ./ssh_key
fi
''

70
docs/nix/flake-module.nix Normal file
View File

@@ -0,0 +1,70 @@
{ inputs, self, ... }:
{
perSystem =
{
config,
self',
pkgs,
...
}:
let
# Simply evaluated options (JSON)
# { clanCore = «derivation JSON»; clanModules = { ${name} = «derivation JSON» }; }
jsonDocs = import ./get-module-docs.nix {
inherit (inputs) nixpkgs;
inherit pkgs self;
inherit (self.nixosModules) clanCore;
inherit (self) clanModules;
};
clanModulesFileInfo = pkgs.writeText "info.json" (builtins.toJSON jsonDocs.clanModules);
clanModulesReadmes = pkgs.writeText "info.json" (builtins.toJSON jsonDocs.clanModulesReadmes);
# Simply evaluated options (JSON)
renderOptions =
pkgs.runCommand "renderOptions.py"
{
# TODO: ruff does not splice properly in nativeBuildInputs
depsBuildBuild = [ pkgs.ruff ];
nativeBuildInputs = [
pkgs.python3
pkgs.mypy
];
}
''
install ${./scripts/renderOptions.py} $out
patchShebangs --build $out
ruff format --check --diff $out
ruff --line-length 88 $out
mypy --strict $out
'';
module-docs = pkgs.runCommand "rendered" { nativeBuildInputs = [ pkgs.python3 ]; } ''
export CLAN_CORE=${jsonDocs.clanCore}/share/doc/nixos/options.json
# A file that contains the links to all clanModule docs
export CLAN_MODULES=${clanModulesFileInfo}
export CLAN_MODULES_READMES=${clanModulesReadmes}
mkdir $out
# The python script will place mkDocs files in the output directory
python3 ${renderOptions}
'';
in
{
devShells.docs = pkgs.callPackage ./shell.nix {
inherit (self'.packages) docs clan-cli-docs;
inherit module-docs;
};
packages = {
docs = pkgs.python3.pkgs.callPackage ./default.nix {
inherit (self'.packages) clan-cli-docs;
inherit (inputs) nixpkgs;
inherit module-docs;
};
deploy-docs = pkgs.callPackage ./deploy-docs.nix { inherit (config.packages) docs; };
inherit module-docs;
};
};
}

View File

@@ -0,0 +1,51 @@
{
nixpkgs,
pkgs,
clanCore,
clanModules,
self,
}:
let
allNixosModules = (import "${nixpkgs}/nixos/modules/module-list.nix") ++ [
"${nixpkgs}/nixos/modules/misc/assertions.nix"
{ nixpkgs.hostPlatform = "x86_64-linux"; }
];
clanCoreNixosModules = [
clanCore
{ clanCore.clanDir = ./.; }
] ++ allNixosModules;
# TODO: optimally we would not have to evaluate all nixos modules for every page
# but some of our module options secretly depend on nixos modules.
# We would have to get rid of these implicit dependencies and make them explicit
clanCoreNixos = pkgs.nixos { imports = clanCoreNixosModules; };
# using extendModules here instead of re-evaluating nixos every time
# improves eval performance slightly (10%)
getOptions = modules: (clanCoreNixos.extendModules { inherit modules; }).options;
evalDocs =
options:
pkgs.nixosOptionsDoc {
options = options;
warningsAreErrors = false;
};
# clanModules docs
clanModulesDocs = builtins.mapAttrs (
name: module: (evalDocs ((getOptions [ module ]).clan.${name} or { })).optionsJSON
) clanModules;
clanModulesReadmes = builtins.mapAttrs (
module_name: _module: self.lib.modules.getReadme module_name
) clanModules;
# clanCore docs
clanCoreDocs = (evalDocs (getOptions [ ]).clanCore).optionsJSON;
in
{
inherit clanModulesReadmes;
clanCore = clanCoreDocs;
clanModules = clanModulesDocs;
}

View File

@@ -0,0 +1,235 @@
# Options are available in the following format:
# https://github.com/nixos/nixpkgs/blob/master/nixos/lib/make-options-doc/default.nix
#
# ```json
# {
# ...
# "fileSystems.<name>.options": {
# "declarations": ["nixos/modules/tasks/filesystems.nix"],
# "default": {
# "_type": "literalExpression",
# "text": "[\n \"defaults\"\n]"
# },
# "description": "Options used to mount the file system.",
# "example": {
# "_type": "literalExpression",
# "text": "[\n \"data=journal\"\n]"
# },
# "loc": ["fileSystems", "<name>", "options"],
# "readOnly": false,
# "type": "non-empty (list of string (with check: non-empty))"
# "relatedPackages": "- [`pkgs.tmux`](\n https://search.nixos.org/packages?show=tmux&sort=relevance&query=tmux\n )\n",
# }
# }
# ```
import json
import os
from pathlib import Path
from typing import Any
# Get environment variables
CLAN_CORE = os.getenv("CLAN_CORE")
CLAN_MODULES = os.environ.get("CLAN_MODULES")
CLAN_MODULES_READMES = os.environ.get("CLAN_MODULES_READMES")
OUT = os.environ.get("out")
def sanitize(text: str) -> str:
return text.replace(">", "\\>")
def replace_store_path(text: str) -> Path:
res = text
if text.startswith("/nix/store/"):
res = "https://git.clan.lol/clan/clan-core/src/branch/main/" + str(
Path(*Path(text).parts[4:])
)
return Path(res)
def render_option_header(name: str) -> str:
return f"# {name}\n"
def join_lines_with_indentation(lines: list[str], indent: int = 4) -> str:
"""
Joins multiple lines with a specified number of whitespace characters as indentation.
Args:
lines (list of str): The lines of text to join.
indent (int): The number of whitespace characters to use as indentation for each line.
Returns:
str: The indented and concatenated string.
"""
# Create the indentation string (e.g., four spaces)
indent_str = " " * indent
# Join each line with the indentation added at the beginning
return "\n".join(indent_str + line for line in lines)
def render_option(name: str, option: dict[str, Any], level: int = 3) -> str:
read_only = option.get("readOnly")
res = f"""
{"#" * level} {sanitize(name)}
{"Readonly" if read_only else ""}
{option.get("description", "No description available.")}
**Type**: `{option["type"]}`
"""
if option.get("default"):
res += f"""
**Default**:
```nix
{option["default"]["text"] if option.get("default") else "No default set."}
```
"""
example = option.get("example", {}).get("text")
if example:
example_indented = join_lines_with_indentation(example.split("\n"))
res += f"""
???+ example
```nix
{example_indented}
```
"""
if option.get("relatedPackages"):
res += f"""
### Related Packages
{option["relatedPackages"]}
"""
decls = option.get("declarations", [])
source_path = replace_store_path(decls[0])
res += f"""
:simple-git: [{source_path.name}]({source_path})
"""
res += "\n"
return res
def module_header(module_name: str) -> str:
return f"# {module_name}\n"
def module_usage(module_name: str) -> str:
return f"""## Usage
To use this module, import it like this:
```nix
{{config, lib, inputs, ...}}: {{
imports = [ inputs.clan-core.clanModules.{module_name} ];
# ...
}}
```
"""
clan_core_descr = """ClanCore delivers all the essential features for every clan.
It's always included in your setup, and you can customize your clan's behavior with the configuration [options](#module-options) provided below.
"""
options_head = "\n## Module Options\n"
def produce_clan_core_docs() -> None:
if not CLAN_CORE:
raise ValueError(
f"Environment variables are not set correctly: $CLAN_CORE={CLAN_CORE}"
)
if not OUT:
raise ValueError(f"Environment variables are not set correctly: $out={OUT}")
# A mapping of output file to content
core_outputs: dict[str, str] = {}
with open(CLAN_CORE) as f:
options: dict[str, dict[str, Any]] = json.load(f)
module_name = "clan-core"
for option_name, info in options.items():
outfile = f"{module_name}/index.md"
# Create seperate files for nested options
if len(option_name.split(".")) <= 2:
# i.e. clan-core.clanDir
output = core_outputs.get(
outfile,
module_header(module_name) + clan_core_descr + options_head,
)
output += render_option(option_name, info)
# Update the content
core_outputs[outfile] = output
else:
# Clan sub-options
[_, sub] = option_name.split(".")[0:2]
outfile = f"{module_name}/{sub}.md"
# Get the content or write the header
output = core_outputs.get(outfile, render_option_header(sub))
output += render_option(option_name, info)
# Update the content
core_outputs[outfile] = output
for outfile, output in core_outputs.items():
(Path(OUT) / outfile).parent.mkdir(parents=True, exist_ok=True)
with open(Path(OUT) / outfile, "w") as of:
of.write(output)
def produce_clan_modules_docs() -> None:
if not CLAN_MODULES:
raise ValueError(
f"Environment variables are not set correctly: $CLAN_MODULES={CLAN_MODULES}"
)
if not CLAN_MODULES_READMES:
raise ValueError(
f"Environment variables are not set correctly: $CLAN_MODULES_READMES={CLAN_MODULES_READMES}"
)
if not OUT:
raise ValueError(f"Environment variables are not set correctly: $out={OUT}")
with open(CLAN_MODULES) as f:
links: dict[str, str] = json.load(f)
with open(CLAN_MODULES_READMES) as readme:
readme_map: dict[str, str] = json.load(readme)
# {'borgbackup': '/nix/store/hi17dwgy7963ddd4ijh81fv0c9sbh8sw-options.json', ... }
for module_name, options_file in links.items():
with open(Path(options_file) / "share/doc/nixos/options.json") as f:
options: dict[str, dict[str, Any]] = json.load(f)
print(f"Rendering options for {module_name}...")
output = module_header(module_name)
if readme_map.get(module_name, None):
output += f"{readme_map[module_name]}\n"
output += module_usage(module_name)
output += options_head if len(options.items()) else ""
for option_name, info in options.items():
output += render_option(option_name, info)
outfile = Path(OUT) / f"clanModules/{module_name}.md"
outfile.parent.mkdir(
parents=True,
exist_ok=True,
)
with open(outfile, "w") as of:
of.write(output)
if __name__ == "__main__":
produce_clan_core_docs()
produce_clan_modules_docs()

18
docs/nix/shell.nix Normal file
View File

@@ -0,0 +1,18 @@
{
docs,
pkgs,
module-docs,
clan-cli-docs,
...
}:
pkgs.mkShell {
inputsFrom = [ docs ];
shellHook = ''
mkdir -p ./site/reference/cli
cp -af ${module-docs}/* ./site/reference/
cp -af ${clan-cli-docs}/* ./site/reference/cli/
chmod +w ./site/reference/*
echo "Generated API documentation in './site/reference/' "
'';
}

View File

@@ -0,0 +1,21 @@
authors:
Lassulus:
name: "Lassulus"
description: "Contributor to Clan"
avatar: "https://avatars.githubusercontent.com/u/621759?v=4"
url: "https://http://lassul.us/"
Mic92:
name: "Mic92"
description: "Contributor to Clan"
avatar: "https://avatars.githubusercontent.com/u/96200?v=4"
url: "https://thalheim.io"
W:
name: "W"
description: "Founder of Clan"
avatar: "/static/w_profile.webp"
url: ""
Qubasa:
name: "Qubasa"
description: "Contributor to Clan"
avatar: "https://avatars.githubusercontent.com/u/22085373?v=4"
url: "https://github.com/Qubasa"

2
docs/site/blog/index.md Normal file
View File

@@ -0,0 +1,2 @@
# Blog

View File

@@ -0,0 +1,72 @@
---
title: "Introducing Clan: Full-Stack Computing Redefined"
description: "Introducing Clan, a new model for a decentralized network, designed to provide families, smaller groups, and small businesses a platform thats private, secure, and user-friendly."
authors:
- W
- Qubasa
date: 2024-03-19
---
In a digital age where users are guided increasingly toward submission and dependence, Clan reclaims computing and networking from the ground up.
Clan enables users to build any system from a git repository, automate secret handling, and join devices in a secure darknet. This control extends beyond applications to communication protocols and the operating system itself, putting you fully in charge of your own digital environment.
## Why We're Building Clan
Our mission is simple: to restore fun, freedom, and functionality to computing as an open source project. We believe in building tools that empower users, foster innovation, and challenge the limitations imposed by outdated paradigms. Clan, in its essence, is an open source endeavor; it's our contribution to a future where technology serves humanity, not the other way around.
## How Clan Changes the Game
Clan embodies a new philosophy in system, application, and network design. It enables seamless, secure communication across devices, simplifies software distribution and updates, and offers both public and private network configurations. Here are some of the ways it accomplishes this:
- **Nix as a Foundation:** Imagine a safety net for your computer's operating system, one that lets you make changes or updates without the fear of causing a crash or losing data. Nix simplifies the complexities of system design, ensuring that updates are safe and systems are more reliable.
- **Simplified System Deployment:** Building and managing a computer system, from the operating system to the software you use, often feels like putting together a complex puzzle. With Clan, the puzzle pieces are replaced by a set of building blocks. Leveraging the power of Nix and Clan's innovative toolkit, anyone from tech-savvy administrators to everyday users can create and maintain what we call "full-stack systems" (everything your computer needs to run smoothly).
- **A Leap in Connectivity:** Imagine if you could create private, secure pathways between your devices, bypassing the noisy and often insecure internet. Clan makes this possible through something called "overlay networks." These networks are like private tunnels, allowing your devices to talk to each other securely and directly. With Clan's built-in overlay networks and automatically configured services, connecting your devices becomes seamless, secure, and hassle-free.
- **Security Through Separation:** Clan employs sandboxing and virtual machines, a technology that runs code in isolated environments - so even if you explore new Clans, your system remains protected from potential threats.
- **Reliable:** With Clan, your data and services are preserved for the long haul. We focus on self-hosted backups and integration with the [Fediverse](https://de.wikipedia.org/wiki/Fediverse), a network of interconnected, independent online communities, so your digital life remains uninterrupted and under your control.
## A Glimpse at Clan's Features
- **Social Scaling:** Choose between creating a private sanctuary for your closest contacts, a dynamic space for a self-contained community, or embracing the open web with public Clans anyone can join.
{{ video(name="show_join.webm")}}
- **Seamless VM Integration:** Applications running in virtual machines can appear and behave as if they're part of your main operating system — a blend of power and simplicity.
{{ video(name="show_run.webm")}}
- **Robust Backup Management:** Keep your data safe _forever_ - never worry about cloud services disappearing in 10 years.
{{ asciinema(name="backups.cast") }}
- **Intuitive Secret Management:** Clan simplifies digital security by automating the creation and management of encryption keys and passwords for your services.
{{ asciinema(name="secrets.cast") }}
- **Remote Install:** Set up and manage Clan systems anywhere in the world with just a QR scan or SSH access, making remote installations as easy as snapping a photo or sharing a link.
{{ asciinema(name="nixos-install.cast") }}
## Who Stands to Benefit?
Clan is for anyone and everyone who believes in the power of open source technology to connect, empower, and protect. From system administrators to less tech-savvy individuals, small business owners to privacy-conscious users, Clan offers something for everyone — a way to reclaim control and redefine how we interact with technology.
## Join the Revolution
Ready to control your digital world? Clan is more than a tool—it's a movement. Secure your data, manage your systems easily, or connect with others how you like. Start with Clan for a better digital future.
Connect with us on our [Matrix channel at clan.lol](https://matrix.to/#/#clan:lassul.us) or through our IRC bridges (coming soon).
Want to see the code? Check it out [on our Gitea](https://git.clan.lol/clan/clan-core) or [on GitHub](https://github.com/clan-lol/clan-core).
Or follow our [RSS feed](https://docs.clan.lol/feed_rss_created.xml)!
Join us and be part of changing technology for the better, together.

View File

@@ -0,0 +1,13 @@
---
title: "New documentation site and weekly new meetup"
authors:
- Lassulus
- Mic92
date: 2024-04-16
---
Last week, we added a new documentation hub for clan at [docs.clan.lol](https://docs.clan.lol).
We are still working on improving the installation procedures, so stay tuned.
We now have weekly office hours where people are invited to hangout and ask questions.
They are every Wednesday 15:30 UTC (17:30 CEST) in our [jitsi](https://jitsi.lassul.us/clan.lol).
Otherwise drop by in our [matrix channel](https://matrix.to/#/#clan:lassul.us).

View File

@@ -0,0 +1 @@
../../CONTRIBUTING.md

View File

@@ -0,0 +1,146 @@
# Hardware Installation
For installations on physical hardware, create a NixOS installer image and transfer it to a bootable USB drive as described below.
## Creating a Bootable USB Drive on Linux
To create a bootable USB flash drive with the NixOS installer:
### Download the install iso
Either with wget:
```shellSession
wget https://github.com/nix-community/nixos-images/releases/download/nixos-unstable/nixos-installer-x86_64-linux.iso
```
or with curl:
```shellSession
curl -L https://github.com/nix-community/nixos-images/releases/download/nixos-unstable/nixos-installer-x86_64-linux.iso -o nixos-installer-x86_64-linux.iso
```
### Prepare the USB Flash Drive
1. Insert your USB flash drive into your computer.
2. Identify your flash drive with `lsblk`.
```shellSession
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:0 1 117,2G 0 disk
└─sdb1 8:1 1 117,2G 0 part /run/media/qubasa/INTENSO
nvme0n1 259:0 0 1,8T 0 disk
├─nvme0n1p1 259:1 0 512M 0 part /boot
└─nvme0n1p2 259:2 0 1,8T 0 part
└─luks-f7600028-9d83-4967-84bc-dd2f498bc486 254:0 0 1,8T 0 crypt /nix/store
```
In this case it's `sdb`
3. Ensure all partitions on the drive are unmounted. Replace `sdX` in the command below with your device identifier (like `sdb`, etc.):
```shellSession
sudo umount /dev/sdb1
```
### Write the Image to the USB Drive
Use the `dd` utility to write the NixOS installer image to your USB drive:
```shellSession
sudo dd bs=4M conv=fsync oflag=direct status=progress if=./nixos-installer-x86_64-linux.iso of=/dev/sd<X>
```
In this case, the USB device is `sdb` use `of=/dev/sdb`
### Boot and Connect
After writing the installer to the USB drive, use it to boot the target machine.
1. For this secure boot needs to be disabled. Go into your UEFI / Bios settings by pressing one of the keys outlined below while booting:
- **Dell**: F2/Del (BIOS Setup)
- **HP**: Esc (Startup Menu)
- **Lenovo**: F2/Fn+F2/Novo Button (IdeaPad Boot Menu/BIOS Setup)
- **Acer**: F2/Del (BIOS Setup)
- **Asus**: F2/Del (BIOS Setup)
- **Toshiba**: Esc then F12 (Alternate Method)
- **Sony**: F11
- **Samsung**: F2 (BIOS Setup)
- **MSI**: Del (BIOS Setup)
- **Apple**: Option (Alt) Key (Boot Menu for Mac)
- If your hardware was not listed read the manufacturers instructions how to enter the boot Menu/BIOS Setup.
2. Inside the UEFI/Bios Menu go to `Security->Secure Boot` and disable secure boot
3. Save your settings. Put in the USB stick and reboot.
4. Press one of keys outlined below to go into the Boot Menu
- **Dell**: F12 (Boot Menu)
- **HP**: F9 (Boot Menu)
- **Lenovo**: F12 (ThinkPad Boot Menu)
- **Acer**: F12 (Boot Menu)
- **Asus**: F8/Esc (Boot Menu)
- **Toshiba**: F12/F2 (Boot Menu)
- **Sony**: F11
- **Samsung**: F2/F12/Esc (Boot Menu)
- **MSI**: F11
- **Apple**: Option (Alt) Key (Boot Menu for Mac)
- If your hardware was not listed read the manufacturers instructions how to enter the boot Menu/BIOS Setup.
5. Select `NixOS` to boot into the clan installer
6. The installer will display an IP address and a root password, which you can use to connect via SSH.
Alternatively you can also use the displayed QR code.
7. Set your keyboard language (i.e. `de` for German keyboards, default is English). Important for writing passwords correctly.
```shellSession
loadkeys de
```
8. If you only have Wifi available, execute:
1. Bring up the `iwd` shell
```shellSession
iwctl
```
2. List available networks. Double press tab after station for autocompleting your wlan device. In this case `wlan0`
```shellSession
[iwd] station wlan0 get-networks
```
3. Connect to a Wifi network. Replace `SSID` with the wlan network name.
```shellSession
[iwd] station wlan0 connect SSID
```
9. Now that you have internet re-execute the init script by pressing `Ctrl+D` or by executing:
```shellSession
bash
```
10. Connect to the machine over ssh
```shellSession
ssh-copy-id -o PreferredAuthentications=password root@<ip>
```
Use the root password displayed on your screen as login.
---
# Whats next?
- Deploy a clan machine-configuration on your prepared machine
---

View File

@@ -0,0 +1,324 @@
## Secrets (CLI Reference)
#### Adding Secrets (set)
```bash
clan secrets set mysecret
> Paste your secret:
```
!!! note
As you type your secret won't be displayed. Press Enter to save the secret.
#### List all Secrets (list)
```bash
clan secrets list
```
#### Assigning Access (set)
By default, secrets are encrypted for your key. To specify which users and machines can access a secret:
```bash
clan secrets set --machine <machine1> --machine <machine2> --user <user1> --user <user2> <secret_name>
```
#### Displaying Secrets (get)
```bash
clan secrets get mysecret
```
#### Rename
TODO
#### Remove
TODO
#### import-sops
TODO
### Users (Reference)
Learn how to manage users and allowing access to existing secrets.
#### list user
Lists all added users
```bash
clan secrets user list
```
``` {.console, title="Example output", .no-copy}
jon
sara
```
!!! Question "Who can execute this command?"
Everyone - completely public.
#### add user
add a user
```bash
clan secrets users add {username} {public-key}
```
!!! Note
Changes can be trusted by maintainer review in version control.
#### get user
get a user public key
```bash
clan secrets users get {username}
```
``` {.console, title="Example output", .no-copy}
age1zk8uzrte55wkg9lkqxu5x6twsj2ja4lehegks0cw4mkg6jv37d9qsjpt44
```
#### remove user
remove a user
```bash
clan secrets users remove {username}
```
!!! Note
Changes can be trusted by maintainer review in version control.
#### add-secret user
Grants the user (`username`) access to the secret (`secret_name`)
```bash
clan secrets users add-secret {username} {secret_name}
```
!!! Note
Requires the executor of the command to have access to the secret (`secret_name`).
#### remove-secret user
remove the user (`username`) from accessing the secret (`secret_name`)
!!! Danger "Make sure at least one person has access."
It might still be possible for the machine to access the secret. (See [machines](#machines))
We highly recommend to use version control such as `git` which allows you to rollback secrets in case anything gets messed up.
```bash
clan secrets users remove-secret {username} {secret_name}
```
!!! Question "Who can execute this command?"
Requires the executor of the command to have access to the secret (`secret_name`).
### Machines (Reference)
- [list](): list machines
- [add](): add a machine
- [get](): get a machine public key
- [remove](): remove a machine
- [add-secret](): allow a machine to access a secret
- [remove-secret](): remove a machine's access to a secret
#### List machine
New machines in Clan come with age keys stored in `./sops/machines/<machine_name>`. To list these machines:
```bash
clan secrets machines list
```
#### Add machine
For clan machines the machine key is generated automatically on demand if none exists.
```bash
clan secrets machines add <machine_name> <age_key>
```
If you already have a device key and want to add it manually, see: [How to obtain a remote key](#obtain-remote-keys-manually)
#### get machine
TODO
#### remove machine
TODO
#### add-secret machine
TODO
#### remove-secret machine
TODO
### Groups (Reference)
The Clan-CLI makes it easy to manage access by allowing you to create groups.
- [list](): list groups
- [add-user](): add a user to group
- [remove-user](): remove a user from group
- [add-machine](): add a machine to group
- [remove-machine](): remove a machine from group
- [add-secret](): allow a user to access a secret
- [remove-secret](): remove a group's access to a secret
#### List Groups
```bash
clan secrets groups list
```
#### add-user
Assign users to a new group, e.g., `admins`:
```bash
clan secrets groups add-user admins <username>
```
!!! info
The group is created if no such group existed before.
The user must exist in beforehand (See: [users](#users-reference))
```{.console, .no-copy}
.
├── flake.nix
. ...
└── sops
├── groups
│ └── admins
│ └── users
│ └── <username> -> ../../../users/<username>
```
#### remove-user
TODO
#### add-machine
TODO
#### remove-machine
TODO
#### add-secret
```bash
clan secrets groups add-secret <group_name> <secret_name>
```
#### remove-secret
TODO
### Key (Reference)
- [generate]() generate age key
- [show]() show age public key
- [update]() re-encrypt all secrets with current keys (useful when changing keys)
#### generate
TODO
#### show
TODO
#### update
TODO
## Further
Secrets in the repository follow this structure:
```{.console, .no-copy}
sops/
├── secrets/
│ └── <secret_name>/
│ ├── secret
│ └── users/
│ └── <your_username>/
```
The content of the secret is stored encrypted inside the `secret` file under `mysecret`.
By default, secrets are encrypted with your key to ensure readability.
### Obtain remote keys manually
To fetch a **SSH host key** from a preinstalled system:
```bash
ssh-keyscan <domain_name> | nix shell nixpkgs#ssh-to-age -c ssh-to-age
```
!!! Success
This command converts the SSH key into an age key on the fly. Since this is the format used by the clan secrets backend.
Once added the **SSH host key** enables seamless integration of existing machines with clan.
Then add the key by executing:
```bash
clan secrets machines add <machine_name> <age_key>
```
See also: [Machine reference](#machines-reference)
### NixOS integration
A NixOS machine will automatically import all secrets that are encrypted for the
current machine. At runtime it will use the host key to decrypt all secrets into
an in-memory, non-persistent filesystem using [sops-nix](https://github.com/Mic92/sops-nix).
In your nixos configuration you can get a path to secrets like this `config.sops.secrets.<name>.path`. For example:
```nix
{ config, ...}: {
sops.secrets.my-password.neededForUsers = true;
users.users.mic92 = {
isNormalUser = true;
passwordFile = config.sops.secrets.my-password.path;
};
}
```
See the [readme](https://github.com/Mic92/sops-nix) of sops-nix for more
examples.
### Migration: Importing existing sops-based keys / sops-nix
`clan secrets` stores each secret in a single file, whereas [sops](https://github.com/Mic92/sops-nix) commonly allows to put all secrets in a yaml or json document.
If you already happened to use sops-nix, you can migrate by using the `clan secrets import-sops` command by importing these files:
```bash
% clan secrets import-sops --prefix matchbox- --group admins --machine matchbox nixos/matchbox/secrets/secrets.yaml
```
This will create secrets for each secret found in `nixos/matchbox/secrets/secrets.yaml` in a `./sops` folder of your repository.
Each member of the group `admins` in this case will be able to decrypt the secrets with their respective key.
Since our clan secret module will auto-import secrets that are encrypted for a particular nixos machine,
you can now remove `sops.secrets.<secrets> = { };` unless you need to specify more options for the secret like owner/group of the secret file.

View File

@@ -0,0 +1,149 @@
# Backups
## Introduction to Backups
When you're managing your own services, creating regular backups is crucial to ensure your data's safety.
This guide introduces you to Clan's built-in backup functionalities.
Clan supports backing up your data to both local storage devices (like USB drives) and remote servers, using well-known tools like borgbackup and rsnapshot.
We might add more options in the future, but for now, let's dive into how you can secure your data.
## Backing Up Locally with Localbackup
### What is Localbackup?
Localbackup lets you backup your data onto physical storage devices connected to your computer,
such as USB hard drives or network-attached storage. It uses a tool called rsnapshot for this purpose.
### Setting Up Localbackup
1. **Identify Your Backup Device:**
First, figure out which device you'll use for backups. You can see all connected devices by running this command in your terminal:
```bash
lsblk --output NAME,PTUUID,FSTYPE,SIZE,MOUNTPOINT
```
Look for the device you intend to use for backups and note its details.
2. **Configure Your Backup Device:**
Once you've identified your device, you'll need to add it to your configuration.
Here's an example NixOS configuration for a device located at `/dev/sda2` with an `ext4` filesystem:
```nix
{
fileSystems."/mnt/hdd" = {
device = "/dev/sda2";
fsType = "ext4";
options = [ "defaults" "noauto" ];
};
}
```
Replace `/dev/sda2` with your device and `/mnt/hdd` with your preferred mount point.
3. **Set Backup Targets:** Next, define where on your device you'd like the backups to be stored:
```nix
{
clan.localbackup.targets.hdd = {
directory = "/mnt/hdd/backup";
mountpoint = "/mnt/hdd";
};
}
```
Change `/mnt/hdd` to the actual mount point you're using.
4. **Create Backups:** To create a backup, run:
```bash
clan backups create mymachine
```
This command saves snapshots of your data onto the backup device.
5. **Listing Backups:** To see available backups, run:
```bash
clan backups list mymachine
```
## Remote Backups with Borgbackup
### Overview of Borgbackup
Borgbackup splits the backup process into two parts: a backup client that sends data to a backup server.
The server stores the backups.
### Setting Up the Borgbackup Client
1. **Specify Backup Server:**
Start by indicating where your backup data should be sent. Replace `hostname` with your server's address:
```nix
{
clan.borgbackup.destinations = {
myhostname = {
repo = "borg@backuphost:/var/lib/borgbackup/myhostname";
};
};
}
```
2. **Select Folders to Backup:**
Decide which folders you want to back up. For example, to backup your home and root directories:
```nix
{ clanCore.state.userdata.folders = [ "/home" "/root" ]; }
```
3. **Generate Backup Credentials:**
Run `clan facts generate <yourmachine>` to prepare your machine for backup, creating necessary SSH keys and credentials.
### Setting Up the Borgbackup Server
1. **Configure Backup Repository:**
On the server where backups will be stored, enable the SSH daemon and set up a repository for each client:
```nix
{
services.borgbackup.repos.myhostname = {
path = "/var/lib/borgbackup/myhostname";
authorizedKeys = [
(builtins.readFile ./machines/myhostname/facts/borgbackup.ssh.pub)
];
};
}
```
Ensure the path to the public key is correct.
2. **Update Your Systems:** Apply your changes by running `clan machines update` to both the server and your client
### Managing Backups
- **Scheduled Backups:**
Backups are automatically performed nightly. To check the next scheduled backup, use:
```bash
systemctl list-timers | grep -E 'NEXT|borg'
```
- **Listing Backups:** To see available backups, run:
```bash
clan backups list mymachine
```
- **Manual Backups:** You can also initiate a backup manually:
```bash
clan backups create mymachine
```

View File

@@ -0,0 +1,187 @@
# Configuration - How to configure clan with your own machines
## Global configuration
In the `flake.nix` file:
- [x] set a unique `clanName`.
=== "**buildClan**"
```nix title="clan-core.lib.buildClan"
buildClan {
# Set a unique name
clanName = "Lobsters";
# Should usually point to the directory of flake.nix
directory = ./.;
machines = {
jon = {
# ...
};
# ...
}
}
```
=== "**flakeParts**"
!!! info "See [Clan with flake-parts](./flake-parts.md) for help migrating to flake-parts."
```nix title="clan-core.flakeModules.default"
clan = {
# Set a unique name
clanName = "Lobsters";
machines = {
jon = {
# ...
};
# ...
}
};
```
## Machine configuration
Adding or configuring a new machine requires two simple steps:
### Step 1. Identify Target Disk-ID
1. Find the remote disk id by executing:
```bash title="setup computer"
ssh root@flash-installer.local lsblk --output NAME,ID-LINK,FSTYPE,SIZE,MOUNTPOINT
```
!!! Note
Replace `flash-installer.local` with the IP address of the machine if you don't have the avahi service running which resolves mDNS local domains.
Which should show something like:
```{.shellSession hl_lines="6" .no-copy}
NAME ID-LINK FSTYPE SIZE MOUNTPOINT
sda usb-ST_16GB_AA6271026J1000000509-0:0 14.9G
├─sda1 usb-ST_16GB_AA6271026J1000000509-0:0-part1 1M
├─sda2 usb-ST_16GB_AA6271026J1000000509-0:0-part2 vfat 100M /boot
└─sda3 usb-ST_16GB_AA6271026J1000000509-0:0-part3 ext4 2.9G /
nvme0n1 nvme-eui.e8238fa6bf530001001b448b4aec2929 476.9G
├─nvme0n1p1 nvme-eui.e8238fa6bf530001001b448b4aec2929-part1 vfat 512M
├─nvme0n1p2 nvme-eui.e8238fa6bf530001001b448b4aec2929-part2 ext4 459.6G
└─nvme0n1p3 nvme-eui.e8238fa6bf530001001b448b4aec2929-part3 swap 16.8G
```
1. Edit the following fields inside the `flake.nix`
=== "**buildClan**"
```nix title="clan-core.lib.buildClan" hl_lines="18 23"
buildClan {
# ...
machines = {
"jon" = {
imports = [
# ...
./modules/disko.nix
./machines/jon/configuration.nix
];
# ...
# Change this to the correct ip-address or hostname
# The hostname is the machine name by default
clan.networking.targetHost = pkgs.lib.mkDefault "root@jon"
# Change this to the ID-LINK of the desired disk shown by 'lsblk'
disko.devices.disk.main = {
device = "/dev/disk/by-id/__CHANGE_ME__";
}
# e.g. > cat ~/.ssh/id_ed25519.pub
users.users.root.openssh.authorizedKeys.keys = [
"<YOUR SSH_KEY>"
];
# ...
};
};
}
```
=== "**flakeParts**"
```nix title="clan-core.flakeModules.default" hl_lines="18 23"
clan = {
# ...
machines = {
"jon" = {
imports = [
# ...
./modules/disko.nix
./machines/jon/configuration.nix
];
# ...
# Change this to the correct ip-address or hostname
# The hostname is the machine name by default
clan.networking.targetHost = pkgs.lib.mkDefault "root@jon"
# Change this to the ID-LINK of the desired disk shown by 'lsblk'
disko.devices.disk.main = {
device = "/dev/disk/by-id/__CHANGE_ME__";
}
# e.g. > cat ~/.ssh/id_ed25519.pub
users.users.root.openssh.authorizedKeys.keys = [
"__YOUR_SSH_KEY__"
];
# ...
};
};
};
```
!!! Info "Replace `__CHANGE_ME__` with the appropriate identifier, such as `nvme-eui.e8238fa6bf530001001b448b4aec2929`"
!!! Info "Replace `__YOUR_SSH_KEY__` with your personal key, like `ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILoMI0NC5eT9pHlQExrvR5ASV3iW9+BXwhfchq0smXUJ jon@jon-desktop`"
These steps will allow you to update your machine later.
### Step 2: Detect Drivers
Generate the `hardware-configuration.nix` file for your machine by executing the following command:
```bash
ssh root@flash-installer.local nixos-generate-config --no-filesystems --show-hardware-config > machines/jon/hardware-configuration.nix
```
This command connects to `flash-installer.local` as `root`, runs `nixos-generate-config` to detect hardware configurations (excluding filesystems), and writes them to `machines/jon/hardware-configuration.nix`.
### Step 3: Custom Disk Formatting
In `./modules/disko.nix`, a simple `ext4` disk partitioning scheme is defined for the Disko module. For more complex disk partitioning setups, refer to the [Disko examples](https://github.com/nix-community/disko/tree/master/example).
### Step 4: Custom Configuration
Modify `./machines/jon/configuration.nix` to personalize the system settings according to your requirements.
### Step 5: Check Configuration
Validate your configuration by running:
```bash
nix flake check
```
This command helps ensure that your system configuration is correct and free from errors.
!!! Note
Integrate this step into your [Continuous Integration](https://en.wikipedia.org/wiki/Continuous_integration) workflow to ensure that only valid Nix configurations are merged into your codebase. This practice helps maintain system stability and reduces integration issues.
---
## Whats next?
- [Secrets & Facts](secrets.md): Setting up secrets with nix-sops
---

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