Compare commits
	
		
			473 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| bb5f98647a | |||
| 44cc60fcd8 | |||
| ca48ce556c | |||
| e8ac9dfb64 | |||
| 188ba6df0a | |||
| b1a37ae1fe | |||
| 63822bb054 | |||
| b94a1493d5 | |||
| 826d6a28ef | |||
| ae6b0ae161 | |||
| 01986c376b | |||
| e42058f08b | |||
| f3bfe89f27 | |||
| ee6f981006 | |||
| b040bebd1d | |||
| f69629d2da | |||
| 0668f0db74 | |||
| 5fcd57a061 | |||
| ad1544759f | |||
| e1c950a530 | |||
| f9632c37f8 | |||
| 1f0cb4ae76 | |||
| d49d078bed | |||
| e98fdb89ab | |||
| 6afe05b5fd | |||
| 7d5aebf882 | |||
| 94cbfd38a6 | |||
| 4da7780472 | |||
| a6dfc267fd | |||
| d6126501ba | |||
| ac0deb47b6 | |||
| f7d676de77 | |||
| cf1db201b2 | |||
| e6e4846529 | |||
| 084d556c56 | |||
| ff0fc18d0a | |||
| 19c7e32678 | |||
| 017c19e7d0 | |||
| a36eff8749 | |||
| df17b11458 | |||
| 0dc7b7eb3d | |||
| dff6eaf587 | |||
| 4b6b67b587 | |||
| 20e7d244d1 | |||
| c5d3b8e7f0 | |||
| 6bbfb0d124 | |||
| 46d03d5ca7 | |||
| e366e6ce87 | |||
| e415f70bbb | |||
| 200c727bbf | |||
| 7413021440 | |||
| 20b4805335 | |||
| f7dff9deab | |||
| f569933732 | |||
| ee895d2e4f | |||
| 5ee8623af2 | |||
| a0e4b209b0 | |||
| ce25867421 | |||
| f89bba35a6 | |||
| d591721a61 | |||
| 343b4f155e | |||
| 39a211a846 | |||
| 142985c505 | |||
| 3f3dc2d037 | |||
| 3269d763aa | |||
| f2d8ee8552 | |||
| 8d984a0672 | |||
| f3733418b2 | |||
| ce8b05b142 | |||
| 4a5787e0c6 | |||
| 6c11093033 | |||
| 750504744f | |||
| c26ec1b6f1 | |||
| 2ef32f773c | |||
| fc9fcd602a | |||
| 0e37ab5fe1 | |||
| a1b387e454 | |||
| 380abe9957 | |||
| 37c12783bb | |||
| 7379e84e79 | |||
| b802f88df9 | |||
| bd94c4ad00 | |||
| 570c6e175d | |||
| 96661dd0d4 | |||
| 28db7799ea | |||
| 508059c99e | |||
| b9f9cc7d7a | |||
| eae0c7cb59 | |||
| 2280635cd6 | |||
| 16ada09600 | |||
| 0d291d715c | |||
| 66001f76f7 | |||
| 1e3b85067d | |||
| 36ee1f3adc | |||
| 25e9c071b0 | |||
| 80cee2dbd0 | |||
| ee92934c74 | |||
| db0f3fed91 | |||
| adeaa0484d | |||
| 815810830e | |||
| 7a52e1907c | |||
| 22a2e1b9e8 | |||
| f29461ae32 | |||
| 208197f099 | |||
| 479ca1b671 | |||
| 40529fbdcb | |||
| 9b0d3fb21e | |||
| d8444131d8 | |||
| af540456a6 | |||
| 42d6734da8 | |||
| 071a8084a0 | |||
| 24a0c58592 | |||
| 810a6dfcec | |||
| 47ad89dee1 | |||
| 8af1b259f5 | |||
| 560003d4fd | |||
| 68ff45075c | |||
| fc68d16197 | |||
| f6ec1293f4 | |||
| 4feeff978c | |||
| 7b19292912 | |||
| 0627db0eb9 | |||
| ae2f6dde41 | |||
| 3bf70656dc | |||
| 1cf989d727 | |||
| 19f734e622 | |||
| d6e3d9626c | |||
| 9c32e42dcc | |||
| 61e6d3232b | |||
| d0fd8cde46 | |||
| 5223ea53f6 | |||
| 253426ce00 | |||
| df67b6cd26 | |||
| 766da21097 | |||
| 18461c0d59 | |||
| 028b151c78 | |||
| 7176b066bb | |||
| c3c3614f63 | |||
| e13288fc29 | |||
| e9e3704b67 | |||
| 7d3c7342ae | |||
| 8f80ed2cce | |||
| d00f996f59 | |||
| e40fd24f26 | |||
| 83efd6c876 | |||
| f0c4206ab8 | |||
| 8b43a6ffb6 | |||
| 2bca10b0e4 | |||
| eec3e27d66 | |||
| e51ef52721 | |||
| 9dc67d402f | |||
| 62ec4e014a | |||
| 4d03842f7c | |||
| 8fedc5518e | |||
| 43dc336638 | |||
| 2b08fcd21a | |||
| 557618d43f | |||
| e8ac6cf0f3 | |||
| f8fc391cae | |||
| 6c1afa3fd8 | |||
| 008584b465 | |||
| a22c862192 | |||
| cd0c070439 | |||
| 201ff64b25 | |||
| 9bee145e25 | |||
| 4528b7c2a6 | |||
| 1eac0fcad8 | |||
| dd15f9c943 | |||
| 4048b3327a | |||
| f4229e34f6 | |||
| 5208a3483b | |||
| 92eacfad20 | |||
| 80309d107b | |||
| d0f151595f | |||
| 93f8d3aa89 | |||
| d84645f3e1 | |||
| 55b71d6901 | |||
| 89c65ea578 | |||
| 129273e8d8 | |||
| fdac196c6c | |||
| 3f4b4fb810 | |||
| 2c7211ffa3 | |||
| 18f25307ab | |||
| 7c55d10ceb | |||
| 5c549faaa8 | |||
| 9fd35a9ce4 | |||
| 5487a93972 | |||
| fe16ea373f | |||
| 163434af09 | |||
| 71164400d4 | |||
| f887dacdea | |||
| 4f5c8dbbaf | |||
| 14b192b1d9 | |||
| 2b04812320 | |||
| 2f6f6ba703 | |||
| 371b0c7e76 | |||
| ae34eacf4a | |||
| dab6f08d89 | |||
| 8190523c30 | |||
| d335d69ba6 | |||
| cec49eb5fc | |||
| 22db38c98f | |||
| 0d4eebbb59 | |||
| 025f6a0c0c | |||
| abc74c5445 | |||
| 6942f09f69 | |||
| 56f6855af7 | |||
| 81c822e68e | |||
| 53e80b1f19 | |||
| 21feb01e7b | |||
| 9ea7b2b475 | |||
| fce4d89e1d | |||
| 6b282375f8 | |||
| 260986b9f2 | |||
| 15afbe94bd | |||
| efd35a9cd1 | |||
| 50ad1d637c | |||
| c299d53146 | |||
| 152b71e718 | |||
| 0911d5b92a | |||
| 5ddae068af | |||
| d17be714ec | |||
| 28ce15d74d | |||
| 504f9bb570 | |||
| f158cb63e8 | |||
| 8860f76cad | |||
| b86798cd69 | |||
| 7ed74931cf | |||
| 6e9d33b483 | |||
| 58abaefbc4 | |||
| 5ea7827a8a | |||
| b17e4a13f9 | |||
| 9c4e60c2c2 | |||
| e7376917bd | |||
| 130e191d37 | |||
| 349f69e30a | |||
| 59ab6405c5 | |||
| a0dab66aa5 | |||
| 525cad4117 | |||
| 24ee74d614 | |||
| 15b4b28d2c | |||
| b1ce302e4b | |||
| b8b85f55cd | |||
| 1189626a6f | |||
| dbd95dd7b8 | |||
| 81b680a7d2 | |||
| ba60e121df | |||
| 432e6c8521 | |||
| c8160122b3 | |||
| 3863fc25a5 | |||
| 2b26cd2f46 | |||
| 30f2079f0b | |||
| 366436b6d3 | |||
| 9f1cd02144 | |||
| 82ccae1315 | |||
| 1df80460d2 | |||
| 7f17fe8874 | |||
| 5880a6e5f6 | |||
| ecbb45d6ac | |||
| c564d945d4 | |||
| ed887b0412 | |||
| fe1d3fbb80 | |||
| 5234ca32fd | |||
| cfe0c0e6e6 | |||
| 7afe7344ac | |||
| bd83ca53ab | |||
| 0d9c99a24e | |||
| db98b1f698 | |||
| 84c4b6b81c | |||
| 19e195b894 | |||
| 54c2bd119f | |||
| e5d85c1b38 | |||
| f1486b84c1 | |||
| 472f4b0334 | |||
| 425dca3e00 | |||
| e4080cf931 | |||
| fc9285f89d | |||
| fbe238f5b6 | |||
| 9874da566d | |||
| ebc5c4d84f | |||
| 8634a9e133 | |||
| 0ce79ed79e | |||
| 5f492ee1d7 | |||
| 9071a4de8b | |||
| 3040a803b2 | |||
| 70a9e855cf | |||
| aa64e9ef24 | |||
| ba2b74fd5a | |||
| 1ae5d9e25e | |||
| ff98ba47c4 | |||
| 599b23ef52 | |||
| 8dbee06d1d | |||
| d522113cb9 | |||
| 7bfd786c01 | |||
| 5a5f4672cd | |||
| 2646ad4b70 | |||
| b120a7ca85 | |||
| 2a0254b684 | |||
| e3e6e7662d | |||
| 868f825e26 | |||
| f231dc81f1 | |||
| a758eef354 | |||
| 9c9c41fb57 | |||
| 1a1708f16f | |||
| efe1b7e399 | |||
| eb9876aff6 | |||
| 8d31c552f5 | |||
| 68f4d54dd1 | |||
| 2042d58b72 | |||
| 2c8c90e6e4 | |||
| 208dcb7dde | |||
| e2f82a6383 | |||
| d704816de9 | |||
| 74ec4eb22a | |||
| 0a5f9b55f5 | |||
| 900de39e2f | |||
| 1e466d07df | |||
| 13807c5e8f | |||
| d8d6d6d421 | |||
| a242ddd39c | |||
| a2c5fe1f5e | |||
| 2c52ef9ff0 | |||
| acb91695ac | |||
| 9d93760e6f | |||
| aad67b9d99 | |||
| e1d406023d | |||
| db6bb90af8 | |||
| 1266c8f04e | |||
| 2b7823788c | |||
| 86eacdd3e5 | |||
| 4fa074f893 | |||
| a260a1bc1b | |||
| 8912d2b9bc | |||
| b4015ded86 | |||
| 0f54d63a46 | |||
| 6c656182f1 | |||
| be4187de3c | |||
| 0b22a1b8a4 | |||
| f18f1937ae | |||
| 4b78ec9134 | |||
| 6c0c26b3aa | |||
| fb1744306d | |||
| 394c7ecd7b | |||
| 3276f54e86 | |||
| 4c806b8ae9 | |||
| 832866cbfa | |||
| 9fc393bb6a | |||
| d81d9d58e1 | |||
| d54dcc8d8f | |||
| a5fae4a289 | |||
| a355926cf0 | |||
| d7a4420205 | |||
| 0b55ce3d02 | |||
| 0ce574800e | |||
| a7e09e55df | |||
| 1622b3e7fc | |||
| 3424cac761 | |||
| f98af9aeef | |||
| 8c14b75e44 | |||
| e497e1b88b | |||
| 07411beb49 | |||
| e8bab9928d | |||
| 544d5a3d69 | |||
| 312f2cb368 | |||
| 45ac6e95e9 | |||
| e6bb6e735d | |||
| cfbfcdbe8c | |||
| c31bfd6b4d | |||
| d20fa359d9 | |||
| 9be15fdad2 | |||
| 13e365002c | |||
| a38072762f | |||
| adf1ff29a7 | |||
| 1ec8d7a625 | |||
| f78f4f5822 | |||
| 67a57cb3e5 | |||
| 85896f8546 | |||
| 5e728773c3 | |||
| 0a06cf564b | |||
| db26b2ae37 | |||
| f7d00dec25 | |||
| 2053ec82b7 | |||
| f2434a17c2 | |||
| 1f7045fcfe | |||
| 0c4a1efa27 | |||
| 530958496b | |||
| df378a2933 | |||
| 2a0fe5a137 | |||
| dfbeafa2b2 | |||
| 7d4281a5c1 | |||
| dfea0be2d9 | |||
| df91da8c34 | |||
| 30c21155af | |||
| a43016ebee | |||
| 801bb4ba3c | |||
| a9d740e95a | |||
| 08eaf312f2 | |||
| 0b57bbc6e3 | |||
| 6558a6ab77 | |||
| 0d196af473 | |||
| d35becb663 | |||
| 5421eab09a | |||
| 1c7de2f7c9 | |||
| c7692995f4 | |||
| 0af185afd8 | |||
| 470b3d2512 | |||
| 1bf6747b3a | |||
| 59bf51dfde | |||
| b72d9936a2 | |||
| 5ebb57deff | |||
| 5b82a72647 | |||
| a5c7205481 | |||
| fd1b467a60 | |||
| 882161b21e | |||
| 5e8ff50c98 | |||
| cdb0688ec1 | |||
| ebb5e94416 | |||
| 89049d0b1f | |||
| 6d16772d07 | |||
| e37f9e2b0f | |||
| 9767238c76 | |||
| a5a0fd9b6f | |||
| be69070f61 | |||
| 53f6dcec8d | |||
| 87c4521de3 | |||
| 461d6d2f34 | |||
| ef2ffa61c3 | |||
| c0b23ad450 | |||
| f12ba9f8b0 | |||
| a211e9ebee | |||
| 5dbbb27c43 | |||
| 69bb2128db | |||
| de7cae6208 | |||
| de4ac8cbd6 | |||
| e1dcad50d0 | |||
| 0120be66fb | |||
| 6cb079a44e | |||
| a5449067a7 | |||
| 1009736d81 | |||
| a94765e8ae | |||
| 9630b23ce2 | |||
| ed158ee87f | |||
| 480dd95d9b | |||
| f7b18098b1 | |||
| c580254dde | |||
| 7e6c395ff8 | |||
| 6978677cb5 | |||
| f5b4580dae | |||
| 035becd018 | |||
| a7fb69ab92 | |||
| 733eb93f23 | |||
| b60e821eaa | |||
| f43d549294 | |||
| 848efdcb2d | |||
| 0f7a0c3ac2 | |||
| 40d0a16736 | |||
| 59b8ba0e76 | |||
| b5153009ea | |||
| 93a37b8353 | |||
| 0ca649b715 | |||
| 1b5e227095 | |||
| 9310a7b0b9 | |||
| 40b9beb86b | |||
| 72f9659430 | |||
| 8fe301203c | |||
| a813ea6561 | |||
| 5d8b4e96b2 | |||
| 60ff89b7cc | |||
| e6c35604bb | |||
| d0dfba5c03 | |||
| ccee2339a3 | |||
| df371c950f | |||
| 52eed708f0 | 
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,3 +1,3 @@ | |||||||
| source |  | ||||||
| result |  | ||||||
| **.swp | **.swp | ||||||
|  | /result | ||||||
|  | /misc | ||||||
|  | |||||||
| @ -3,4 +3,4 @@ build:bsc-ci.all: | |||||||
|   tags: |   tags: | ||||||
|     - nix |     - nix | ||||||
|   script: |   script: | ||||||
|     - nix build -L "jungle#bsc-ci.all" --override-input bscpkgs . -v --show-trace |     - nix build -L --no-link --print-out-paths .#bsc-ci.all | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								COPYING
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								COPYING
									
									
									
									
									
								
							| @ -1,4 +1,4 @@ | |||||||
| Copyright (c) 2020-2021 Barcelona Supercomputing Center | Copyright (c) 2020-2025 Barcelona Supercomputing Center | ||||||
| Copyright (c) 2003-2020 Eelco Dolstra and the Nixpkgs/NixOS contributors | Copyright (c) 2003-2020 Eelco Dolstra and the Nixpkgs/NixOS contributors | ||||||
| 
 | 
 | ||||||
| Permission is hereby granted, free of charge, to any person obtaining | Permission is hereby granted, free of charge, to any person obtaining | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								README.md
									
									
									
									
									
								
							| @ -1 +1,9 @@ | |||||||
| Nix overlay with BSC packages. | # Jungle | ||||||
|  | 
 | ||||||
|  | This repository provides two components that can be used independently: | ||||||
|  | 
 | ||||||
|  | - A Nix overlay with packages used at BSC (formerly known as bscpkgs). Access | ||||||
|  |   them directly with `nix shell .#<pkgname>`. | ||||||
|  | 
 | ||||||
|  | - NixOS configurations for jungle machines. Use `nixos-rebuild switch --flake .` | ||||||
|  |   to upgrade the current machine. | ||||||
|  | |||||||
							
								
								
									
										176
									
								
								doc/install.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								doc/install.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,176 @@ | |||||||
|  | # Installing NixOS in a new node | ||||||
|  | 
 | ||||||
|  | This article shows the steps to install NixOS in a node following the | ||||||
|  | configuration of the repo. | ||||||
|  | 
 | ||||||
|  | ## Enable the serial console | ||||||
|  | 
 | ||||||
|  | By default, the nodes have the serial console disabled in the GRUB and also boot | ||||||
|  | without the serial enabled. | ||||||
|  | 
 | ||||||
|  | To enable the serial console in the GRUB, set in /etc/default/grub the following | ||||||
|  | lines: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | GRUB_TERMINAL="console serial" | ||||||
|  | GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1" | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | To boot Linux with the serial enabled, so you can see the boot log and login via | ||||||
|  | serial set: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | GRUB_CMDLINE_LINUX="console=ttyS0,115200n8 console=tty0" | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Then update the grub config: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # grub2-mkconfig -o /boot/grub2/grub.cfg | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | And reboot. | ||||||
|  | 
 | ||||||
|  | ## Prepare the disk | ||||||
|  | 
 | ||||||
|  | Create a main partition and label it `nixos` following [the manual][1]. | ||||||
|  | 
 | ||||||
|  | [1]: https://nixos.org/manual/nixos/stable/index.html#sec-installation-manual-partitioning. | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # disk=/dev/sdX | ||||||
|  | # parted $disk -- mklabel msdos | ||||||
|  | # parted $disk -- mkpart primary 1MB -8GB | ||||||
|  | # parted $disk -- mkpart primary linux-swap -8GB 100% | ||||||
|  | # parted $disk -- set 1 boot on | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Then create an etx4 filesystem, labeled `nixos` where the system will be | ||||||
|  | installed. **Ensure that no other partition has the same label.** | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # mkfs.ext4 -L nixos "${disk}1" | ||||||
|  | # mkswap -L swap "${disk}2" | ||||||
|  | # mount ${disk}1 /mnt | ||||||
|  | # lsblk -f $disk | ||||||
|  | NAME   FSTYPE LABEL UUID                                 MOUNTPOINT | ||||||
|  | sdX | ||||||
|  | `-sdX1 ext4   nixos 10d73b75-809c-4fa3-b99d-4fab2f0d0d8e /mnt | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Prepare nix and nixos-install | ||||||
|  | 
 | ||||||
|  | Mount the nix store from the hut node in read-only /nix. | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # mkdir /nix | ||||||
|  | # mount -o ro hut:/nix /nix | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Get the nix binary and nixos-install tool from hut: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # ssh hut 'readlink -f $(which nix)' | ||||||
|  | /nix/store/0sxbaj71c4c4n43qhdxm31f56gjalksw-nix-2.13.3/bin/nix | ||||||
|  | # ssh hut 'readlink -f $(which nixos-install)' | ||||||
|  | /nix/store/9yq8ps06ysr2pfiwiij39ny56yk3pdcs-nixos-install/bin/nixos-install | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | And add them to the PATH: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # export PATH=$PATH:/nix/store/0sxbaj71c4c4n43qhdxm31f56gjalksw-nix-2.13.3/bin | ||||||
|  | # export PATH=$PATH:/nix/store/9yq8ps06ysr2pfiwiij39ny56yk3pdcs-nixos-install/bin/ | ||||||
|  | # nix --version | ||||||
|  | nix (Nix) 2.13.3 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Adapt owl configuration | ||||||
|  | 
 | ||||||
|  | Clone owl repo: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | $ git clone git@bscpm03.bsc.es:rarias/owl.git | ||||||
|  | $ cd owl | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Edit the configuration to your needs. | ||||||
|  | 
 | ||||||
|  | ## Install from another Linux OS | ||||||
|  | 
 | ||||||
|  | Install nixOS into the storage drive. | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # nixos-install --flake --root /mnt .#xeon0X | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | At this point, the nixOS grub has been installed into the nixos device, which | ||||||
|  | is not the default boot device. To keep both the old Linux and NixOS grubs, add | ||||||
|  | an entry into the old Linux grub to jump into the new grub. | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # echo " | ||||||
|  | 
 | ||||||
|  | menuentry 'NixOS' { | ||||||
|  |     insmod chain | ||||||
|  |     search --no-floppy --label nixos --set root | ||||||
|  |     configfile /boot/grub/grub.cfg | ||||||
|  | } " >> /etc/grub.d/40_custom | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Rebuild grub config. | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # grub2-mkconfig -o /boot/grub/grub.cfg | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | To boot into NixOS manually, reboot and select NixOS in the grub menu to boot | ||||||
|  | into NixOS. | ||||||
|  | 
 | ||||||
|  | To temporarily boot into NixOS only on the next reboot run: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # grub2-reboot 'NixOS' | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | To permanently boot into NixOS as the default boot OS, edit `/etc/default/grub/`: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | GRUB_DEFAULT='NixOS' | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | And update grub. | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # grub2-mkconfig -o /boot/grub/grub.cfg | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Build the nixos kexec image | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | # nix build .#nixosConfigurations.xeon02.config.system.build.kexecTree -v | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Chain NixOS in same disk with other systems | ||||||
|  | 
 | ||||||
|  | To install NixOS on a partition along another system which controls the GRUB, | ||||||
|  | first disable the grub device, so the GRUB is not installed in the disk by | ||||||
|  | NixOS (only the /boot files will be generated): | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | boot.loader.grub.device = "nodev"; | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Then add the following entry to the old GRUB configuration: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | menuentry 'NixOS' { | ||||||
|  |         insmod chain | ||||||
|  |         search --no-floppy --label nixos --set root | ||||||
|  |         configfile /boot/grub/grub.cfg | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | The partition with NixOS must have the label "nixos" for it to be found. New | ||||||
|  | system configuration entries will be stored in the GRUB configuration managed | ||||||
|  | by NixOS, so there is no need to change the old GRUB settings. | ||||||
							
								
								
									
										46
									
								
								doc/trim.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										46
									
								
								doc/trim.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,46 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | 
 | ||||||
|  | # Trims the jungle repository by moving the website to its own repository and | ||||||
|  | # removing it from jungle. It also removes big pdf files and kernel | ||||||
|  | # configurations so the jungle repository is small. | ||||||
|  | 
 | ||||||
|  | set -e | ||||||
|  | 
 | ||||||
|  | if [ -e oldjungle -o -e newjungle -o -e website ]; then | ||||||
|  |   echo "remove oldjungle/, newjungle/ and website/ first" | ||||||
|  |   exit 1 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Clone the old jungle repo | ||||||
|  | git clone gitea@tent:rarias/jungle.git oldjungle | ||||||
|  | 
 | ||||||
|  | # First split the website into a new repository | ||||||
|  | mkdir website && git -C website init -b master | ||||||
|  | git-filter-repo \ | ||||||
|  |   --path web \ | ||||||
|  |   --subdirectory-filter web \ | ||||||
|  |   --source oldjungle \ | ||||||
|  |   --target website | ||||||
|  | 
 | ||||||
|  | # Then remove the website, pdf files and big kernel configs | ||||||
|  | mkdir newjungle && git -C newjungle init -b master | ||||||
|  | git-filter-repo \ | ||||||
|  |   --invert-paths \ | ||||||
|  |   --path web \ | ||||||
|  |   --path-glob 'doc*.pdf' \ | ||||||
|  |   --path-glob '**/kernel/configs/lockdep' \ | ||||||
|  |   --path-glob '**/kernel/configs/defconfig' \ | ||||||
|  |   --source oldjungle \ | ||||||
|  |   --target newjungle | ||||||
|  | 
 | ||||||
|  | set -x | ||||||
|  | 
 | ||||||
|  | du -sh oldjungle newjungle website | ||||||
|  | #  57M  oldjungle | ||||||
|  | # 2,3M  newjungle | ||||||
|  | # 6,4M  website | ||||||
|  | 
 | ||||||
|  | du -sh --exclude=.git oldjungle newjungle website | ||||||
|  | #  30M  oldjungle | ||||||
|  | # 700K  newjungle | ||||||
|  | # 3,5M  website | ||||||
							
								
								
									
										93
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										93
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							| @ -1,22 +1,107 @@ | |||||||
| { | { | ||||||
|   "nodes": { |   "nodes": { | ||||||
|  |     "agenix": { | ||||||
|  |       "inputs": { | ||||||
|  |         "darwin": "darwin", | ||||||
|  |         "home-manager": "home-manager", | ||||||
|  |         "nixpkgs": [ | ||||||
|  |           "nixpkgs" | ||||||
|  |         ], | ||||||
|  |         "systems": "systems" | ||||||
|  |       }, | ||||||
|  |       "locked": { | ||||||
|  |         "lastModified": 1750173260, | ||||||
|  |         "narHash": "sha256-9P1FziAwl5+3edkfFcr5HeGtQUtrSdk/MksX39GieoA=", | ||||||
|  |         "owner": "ryantm", | ||||||
|  |         "repo": "agenix", | ||||||
|  |         "rev": "531beac616433bac6f9e2a19feb8e99a22a66baf", | ||||||
|  |         "type": "github" | ||||||
|  |       }, | ||||||
|  |       "original": { | ||||||
|  |         "owner": "ryantm", | ||||||
|  |         "repo": "agenix", | ||||||
|  |         "type": "github" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "darwin": { | ||||||
|  |       "inputs": { | ||||||
|  |         "nixpkgs": [ | ||||||
|  |           "agenix", | ||||||
|  |           "nixpkgs" | ||||||
|  |         ] | ||||||
|  |       }, | ||||||
|  |       "locked": { | ||||||
|  |         "lastModified": 1744478979, | ||||||
|  |         "narHash": "sha256-dyN+teG9G82G+m+PX/aSAagkC+vUv0SgUw3XkPhQodQ=", | ||||||
|  |         "owner": "lnl7", | ||||||
|  |         "repo": "nix-darwin", | ||||||
|  |         "rev": "43975d782b418ebf4969e9ccba82466728c2851b", | ||||||
|  |         "type": "github" | ||||||
|  |       }, | ||||||
|  |       "original": { | ||||||
|  |         "owner": "lnl7", | ||||||
|  |         "ref": "master", | ||||||
|  |         "repo": "nix-darwin", | ||||||
|  |         "type": "github" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "home-manager": { | ||||||
|  |       "inputs": { | ||||||
|  |         "nixpkgs": [ | ||||||
|  |           "agenix", | ||||||
|  |           "nixpkgs" | ||||||
|  |         ] | ||||||
|  |       }, | ||||||
|  |       "locked": { | ||||||
|  |         "lastModified": 1745494811, | ||||||
|  |         "narHash": "sha256-YZCh2o9Ua1n9uCvrvi5pRxtuVNml8X2a03qIFfRKpFs=", | ||||||
|  |         "owner": "nix-community", | ||||||
|  |         "repo": "home-manager", | ||||||
|  |         "rev": "abfad3d2958c9e6300a883bd443512c55dfeb1be", | ||||||
|  |         "type": "github" | ||||||
|  |       }, | ||||||
|  |       "original": { | ||||||
|  |         "owner": "nix-community", | ||||||
|  |         "repo": "home-manager", | ||||||
|  |         "type": "github" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "nixpkgs": { |     "nixpkgs": { | ||||||
|       "locked": { |       "locked": { | ||||||
|         "lastModified": 1752436162, |         "lastModified": 1752436162, | ||||||
|         "narHash": "sha256-Kt1UIPi7kZqkSc5HVj6UY5YLHHEzPBkgpNUByuyxtlw=", |         "narHash": "sha256-Kt1UIPi7kZqkSc5HVj6UY5YLHHEzPBkgpNUByuyxtlw=", | ||||||
|         "path": "/nix/store/zk8v61cpk1wprp9ld5ayc1g5fq4pdkwv-source", |         "owner": "NixOS", | ||||||
|  |         "repo": "nixpkgs", | ||||||
|         "rev": "dfcd5b901dbab46c9c6e80b265648481aafb01f8", |         "rev": "dfcd5b901dbab46c9c6e80b265648481aafb01f8", | ||||||
|         "type": "path" |         "type": "github" | ||||||
|       }, |       }, | ||||||
|       "original": { |       "original": { | ||||||
|         "id": "nixpkgs", |         "owner": "NixOS", | ||||||
|         "type": "indirect" |         "ref": "nixos-25.05", | ||||||
|  |         "repo": "nixpkgs", | ||||||
|  |         "type": "github" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "root": { |     "root": { | ||||||
|       "inputs": { |       "inputs": { | ||||||
|  |         "agenix": "agenix", | ||||||
|         "nixpkgs": "nixpkgs" |         "nixpkgs": "nixpkgs" | ||||||
|       } |       } | ||||||
|  |     }, | ||||||
|  |     "systems": { | ||||||
|  |       "locked": { | ||||||
|  |         "lastModified": 1681028828, | ||||||
|  |         "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", | ||||||
|  |         "owner": "nix-systems", | ||||||
|  |         "repo": "default", | ||||||
|  |         "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", | ||||||
|  |         "type": "github" | ||||||
|  |       }, | ||||||
|  |       "original": { | ||||||
|  |         "owner": "nix-systems", | ||||||
|  |         "repo": "default", | ||||||
|  |         "type": "github" | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   "root": "root", |   "root": "root", | ||||||
|  | |||||||
							
								
								
									
										70
									
								
								flake.nix
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								flake.nix
									
									
									
									
									
								
							| @ -1,26 +1,52 @@ | |||||||
| { | { | ||||||
|   inputs.nixpkgs.url = "nixpkgs"; |   inputs = { | ||||||
|  |     nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; | ||||||
|  |     agenix.url = "github:ryantm/agenix"; | ||||||
|  |     agenix.inputs.nixpkgs.follows = "nixpkgs"; | ||||||
|  |   }; | ||||||
| 
 | 
 | ||||||
|   outputs = { self, nixpkgs, ...}: |   outputs = { self, nixpkgs, agenix, ... }: | ||||||
|     let | let | ||||||
|       # For now we only support x86 |   mkConf = name: nixpkgs.lib.nixosSystem { | ||||||
|       system = "x86_64-linux"; |     system = "x86_64-linux"; | ||||||
|       pkgs = import nixpkgs { |     specialArgs = { inherit nixpkgs agenix; theFlake = self; }; | ||||||
|         inherit system; |     modules = [ "${self.outPath}/m/${name}/configuration.nix" ]; | ||||||
|         overlays = [ self.overlays.default ]; |   }; | ||||||
|       }; |   # For now we only support x86 | ||||||
|     in |   system = "x86_64-linux"; | ||||||
|     { |   pkgs = import nixpkgs { | ||||||
|       bscOverlay = import ./overlay.nix; |     inherit system; | ||||||
|       overlays.default = self.bscOverlay; |     overlays = [ self.overlays.default ]; | ||||||
|       # full nixpkgs with our overlay applied |     config.allowUnfree = true; | ||||||
|       legacyPackages.${system} = pkgs; |   }; | ||||||
| 
 | in | ||||||
|       hydraJobs = { |   { | ||||||
|         inherit (self.legacyPackages.${system}.bsc-ci) tests pkgs cross; |     nixosConfigurations = { | ||||||
|       }; |       hut     = mkConf "hut"; | ||||||
| 
 |       tent    = mkConf "tent"; | ||||||
|       # propagate nixpkgs lib, so we can do bscpkgs.lib |       owl1    = mkConf "owl1"; | ||||||
|       inherit (nixpkgs) lib; |       owl2    = mkConf "owl2"; | ||||||
|  |       eudy    = mkConf "eudy"; | ||||||
|  |       koro    = mkConf "koro"; | ||||||
|  |       bay     = mkConf "bay"; | ||||||
|  |       lake2   = mkConf "lake2"; | ||||||
|  |       raccoon = mkConf "raccoon"; | ||||||
|  |       fox     = mkConf "fox"; | ||||||
|  |       apex    = mkConf "apex"; | ||||||
|  |       weasel  = mkConf "weasel"; | ||||||
|     }; |     }; | ||||||
|  | 
 | ||||||
|  |     bscOverlay = import ./overlay.nix; | ||||||
|  |     overlays.default = self.bscOverlay; | ||||||
|  | 
 | ||||||
|  |     # full nixpkgs with our overlay applied | ||||||
|  |     legacyPackages.${system} = pkgs; | ||||||
|  | 
 | ||||||
|  |     hydraJobs = { | ||||||
|  |       inherit (self.legacyPackages.${system}.bsc-ci) tests pkgs cross; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     # propagate nixpkgs lib, so we can do bscpkgs.lib | ||||||
|  |     inherit (nixpkgs) lib; | ||||||
|  |   }; | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										37
									
								
								keys.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								keys.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | # As agenix needs to parse the secrets from a standalone .nix file, we describe | ||||||
|  | # here all the public keys | ||||||
|  | rec { | ||||||
|  |   hosts = { | ||||||
|  |     hut     = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICO7jIp6JRnRWTMDsTB/aiaICJCl4x8qmKMPSs4lCqP1 hut"; | ||||||
|  |     owl1    = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMqMEXO0ApVsBA6yjmb0xP2kWyoPDIWxBB0Q3+QbHVhv owl1"; | ||||||
|  |     owl2    = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHurEYpQzNHqWYF6B9Pd7W8UPgF3BxEg0BvSbsA7BAdK owl2"; | ||||||
|  |     eudy    = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL+WYPRRvZupqLAG0USKmd/juEPmisyyJaP8hAgYwXsG eudy"; | ||||||
|  |     koro    = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIImiTFDbxyUYPumvm8C4mEnHfuvtBY1H8undtd6oDd67 koro"; | ||||||
|  |     bay     = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICvGBzpRQKuQYHdlUQeAk6jmdbkrhmdLwTBqf3el7IgU bay"; | ||||||
|  |     lake2   = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINo66//S1yatpQHE/BuYD/Gfq64TY7ZN5XOGXmNchiO0 lake2"; | ||||||
|  |     fox     = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDwItIk5uOJcQEVPoy/CVGRzfmE1ojrdDcI06FrU4NFT fox"; | ||||||
|  |     tent    = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFAtTpHtdYoelbknD/IcfBlThwLKJv/dSmylOgpg3FRM tent"; | ||||||
|  |     apex    = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBvUFjSfoxXnKwXhEFXx5ckRKJ0oewJ82mRitSMNMKjh apex"; | ||||||
|  |     weasel  = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFLJrQ8BF6KcweQV8pLkSbFT+tbDxSG9qxrdQE65zJZp weasel"; | ||||||
|  |     raccoon = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGNQttFvL0dNEyy7klIhLoK4xXOeM2/K9R7lPMTG3qvK raccoon"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   hostGroup = with hosts; rec { | ||||||
|  |     compute    = [ owl1 owl2 fox raccoon ]; | ||||||
|  |     playground = [ eudy koro weasel ]; | ||||||
|  |     storage    = [ bay lake2 ]; | ||||||
|  |     monitor    = [ hut ]; | ||||||
|  |     login      = [ apex ]; | ||||||
|  | 
 | ||||||
|  |     system     = storage ++ monitor ++ login; | ||||||
|  |     safe       = system ++ compute; | ||||||
|  |     all        = safe ++ playground; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   admins = { | ||||||
|  |     "rarias@hut"  = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE1oZTPtlEXdGt0Ak+upeCIiBdaDQtcmuWoTUCVuSVIR rarias@hut"; | ||||||
|  |     "rarias@tent" = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIwlWSBTZi74WTz5xn6gBvTmCoVltmtIAeM3RMmkh4QZ rarias@tent"; | ||||||
|  |     "rarias@fox"  = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDSbw3REAKECV7E2c/e2XJITudJQWq2qDSe2N1JHqHZd rarias@fox"; | ||||||
|  |     root          = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIII/1TNArcwA6D47mgW4TArwlxQRpwmIGiZDysah40Gb root@hut"; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										69
									
								
								m/apex/configuration.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								m/apex/configuration.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,69 @@ | |||||||
|  | { lib, config, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../common/xeon.nix | ||||||
|  |     ../common/ssf/hosts.nix | ||||||
|  |     ../module/ceph.nix | ||||||
|  |     ../module/hut-substituter.nix | ||||||
|  |     ../module/slurm-server.nix | ||||||
|  |     ./nfs.nix | ||||||
|  |     ./wireguard.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Don't install grub MBR for now | ||||||
|  |   boot.loader.grub.device = "nodev"; | ||||||
|  | 
 | ||||||
|  |   boot.initrd.kernelModules = [ | ||||||
|  |     "megaraid_sas" # For HW RAID | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     storcli # To manage HW RAID | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   fileSystems."/home" = { | ||||||
|  |     device = "/dev/disk/by-label/home"; | ||||||
|  |     fsType = "ext4"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # No swap, there is plenty of RAM | ||||||
|  |   swapDevices = lib.mkForce []; | ||||||
|  | 
 | ||||||
|  |   networking = { | ||||||
|  |     hostName = "apex"; | ||||||
|  |     defaultGateway = "84.88.53.233"; | ||||||
|  |     nameservers = [ "8.8.8.8" ]; | ||||||
|  | 
 | ||||||
|  |     # Public facing interface | ||||||
|  |     interfaces.eno1.ipv4.addresses = [ { | ||||||
|  |       address = "84.88.53.236"; | ||||||
|  |       prefixLength = 29; | ||||||
|  |     } ]; | ||||||
|  | 
 | ||||||
|  |     # Internal LAN to our Ethernet switch | ||||||
|  |     interfaces.eno2.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.40.30"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  | 
 | ||||||
|  |     # Infiniband over Omnipath switch (disconnected for now) | ||||||
|  |     # interfaces.ibp5s0 = {}; | ||||||
|  | 
 | ||||||
|  |     nat = { | ||||||
|  |       enable = true; | ||||||
|  |       internalInterfaces = [ "eno2" ]; | ||||||
|  |       externalInterface = "eno1"; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   networking.firewall = { | ||||||
|  |     extraCommands = '' | ||||||
|  |       # Blackhole BSC vulnerability scanner (OpenVAS) as it is spamming our | ||||||
|  |       # logs. Insert as first position so we also protect SSH. | ||||||
|  |       iptables -I nixos-fw 1 -p tcp -s 192.168.8.16 -j nixos-fw-refuse | ||||||
|  |       # Same with opsmonweb01.bsc.es which seems to be trying to access via SSH | ||||||
|  |       iptables -I nixos-fw 2 -p tcp -s 84.88.52.176 -j nixos-fw-refuse | ||||||
|  |     ''; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										48
									
								
								m/apex/nfs.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								m/apex/nfs.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | |||||||
|  | { ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   services.nfs.server = { | ||||||
|  |     enable = true; | ||||||
|  |     lockdPort = 4001; | ||||||
|  |     mountdPort = 4002; | ||||||
|  |     statdPort = 4000; | ||||||
|  |     exports = '' | ||||||
|  |       /home 10.0.40.0/24(rw,async,no_subtree_check,no_root_squash) | ||||||
|  |       /home 10.106.0.0/24(rw,async,no_subtree_check,no_root_squash) | ||||||
|  |     ''; | ||||||
|  |   }; | ||||||
|  |   networking.firewall = { | ||||||
|  |     # Check with `rpcinfo -p` | ||||||
|  |     extraCommands = '' | ||||||
|  |       # Accept NFS traffic from compute nodes but not from the outside | ||||||
|  |       iptables -A nixos-fw -p tcp -s 10.0.40.0/24 --dport 111   -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p tcp -s 10.0.40.0/24 --dport 2049  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p tcp -s 10.0.40.0/24 --dport 4000  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p tcp -s 10.0.40.0/24 --dport 4001  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p tcp -s 10.0.40.0/24 --dport 4002  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p tcp -s 10.0.40.0/24 --dport 20048 -j nixos-fw-accept | ||||||
|  |       # Same but UDP | ||||||
|  |       iptables -A nixos-fw -p udp -s 10.0.40.0/24 --dport 111   -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p udp -s 10.0.40.0/24 --dport 2049  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p udp -s 10.0.40.0/24 --dport 4000  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p udp -s 10.0.40.0/24 --dport 4001  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p udp -s 10.0.40.0/24 --dport 4002  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p udp -s 10.0.40.0/24 --dport 20048 -j nixos-fw-accept | ||||||
|  | 
 | ||||||
|  |       # Accept NFS traffic from wg0 | ||||||
|  |       iptables -A nixos-fw -p tcp -i wg0 -s 10.106.0.0/24 --dport 111   -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p tcp -i wg0 -s 10.106.0.0/24 --dport 2049  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p tcp -i wg0 -s 10.106.0.0/24 --dport 4000  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p tcp -i wg0 -s 10.106.0.0/24 --dport 4001  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p tcp -i wg0 -s 10.106.0.0/24 --dport 4002  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p tcp -i wg0 -s 10.106.0.0/24 --dport 20048 -j nixos-fw-accept | ||||||
|  |       # Same but UDP | ||||||
|  |       iptables -A nixos-fw -p udp -i wg0 -s 10.106.0.0/24 --dport 111   -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p udp -i wg0 -s 10.106.0.0/24 --dport 2049  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p udp -i wg0 -s 10.106.0.0/24 --dport 4000  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p udp -i wg0 -s 10.106.0.0/24 --dport 4001  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p udp -i wg0 -s 10.106.0.0/24 --dport 4002  -j nixos-fw-accept | ||||||
|  |       iptables -A nixos-fw -p udp -i wg0 -s 10.106.0.0/24 --dport 20048 -j nixos-fw-accept | ||||||
|  |     ''; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										42
									
								
								m/apex/wireguard.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								m/apex/wireguard.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | |||||||
|  | { config, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   networking.firewall = { | ||||||
|  |     allowedUDPPorts = [ 666 ]; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   age.secrets.wgApex.file = ../../secrets/wg-apex.age; | ||||||
|  | 
 | ||||||
|  |   # Enable WireGuard | ||||||
|  |   networking.wireguard.enable = true; | ||||||
|  |   networking.wireguard.interfaces = { | ||||||
|  |     # "wg0" is the network interface name. You can name the interface arbitrarily. | ||||||
|  |     wg0 = { | ||||||
|  |       ips = [ "10.106.0.30/24" ]; | ||||||
|  |       listenPort = 666; | ||||||
|  |       privateKeyFile = config.age.secrets.wgApex.path; | ||||||
|  |       # Public key: VwhcN8vSOzdJEotQTpmPHBC52x3Hbv1lkFIyKubrnUA= | ||||||
|  |       peers = [ | ||||||
|  |         { | ||||||
|  |           name = "fox"; | ||||||
|  |           publicKey = "VfMPBQLQTKeyXJSwv8wBhc6OV0j2qAxUpX3kLHunK2Y="; | ||||||
|  |           allowedIPs = [ "10.106.0.1/32" ]; | ||||||
|  |           endpoint = "fox.ac.upc.edu:666"; | ||||||
|  |           # Send keepalives every 25 seconds. Important to keep NAT tables alive. | ||||||
|  |           persistentKeepalive = 25; | ||||||
|  |         } | ||||||
|  |         { | ||||||
|  |           name = "raccoon"; | ||||||
|  |           publicKey = "QUfnGXSMEgu2bviglsaSdCjidB51oEDBFpnSFcKGfDI="; | ||||||
|  |           allowedIPs = [ "10.106.0.236/32" "192.168.0.0/16" "10.0.44.0/24" ]; | ||||||
|  |         } | ||||||
|  |       ]; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   networking.hosts = { | ||||||
|  |     "10.106.0.1" = [ "fox" ]; | ||||||
|  |     "10.106.0.236" = [ "raccoon" ]; | ||||||
|  |     "10.0.44.4" = [ "tent" ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										108
									
								
								m/bay/configuration.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								m/bay/configuration.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,108 @@ | |||||||
|  | { config, pkgs, lib, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../common/ssf.nix | ||||||
|  |     ../module/hut-substituter.nix | ||||||
|  |     ../module/monitoring.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Select the this using the ID to avoid mismatches | ||||||
|  |   boot.loader.grub.device = "/dev/disk/by-id/wwn-0x55cd2e414d53562d"; | ||||||
|  | 
 | ||||||
|  |   boot.kernel.sysctl = { | ||||||
|  |     "kernel.yama.ptrace_scope" = lib.mkForce "1"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     ceph | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   networking = { | ||||||
|  |     hostName = "bay"; | ||||||
|  |     interfaces.eno1.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.40.40"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |     interfaces.ibp5s0.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.42.40"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |     firewall = { | ||||||
|  |       extraCommands = '' | ||||||
|  |         # Accept all incoming TCP traffic from lake2 | ||||||
|  |         iptables -A nixos-fw -p tcp -s lake2 -j nixos-fw-accept | ||||||
|  |         # Accept monitoring requests from hut | ||||||
|  |         iptables -A nixos-fw -p tcp -s hut -m multiport --dport 9283,9002 -j nixos-fw-accept | ||||||
|  |         # Accept all Ceph traffic from the local network | ||||||
|  |         iptables -A nixos-fw -p tcp -s 10.0.40.0/24 -m multiport --dport 3300,6789,6800:7568 -j nixos-fw-accept | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   services.ceph = { | ||||||
|  |     enable = true; | ||||||
|  |     global = { | ||||||
|  |       fsid = "9c8d06e0-485f-4aaf-b16b-06d6daf1232b"; | ||||||
|  |       monHost = "10.0.40.40"; | ||||||
|  |       monInitialMembers = "bay"; | ||||||
|  |       clusterNetwork = "10.0.40.40/24"; # Use Ethernet only | ||||||
|  |     }; | ||||||
|  |     extraConfig = { | ||||||
|  |       # Only log to stderr so it appears in the journal | ||||||
|  |       "log_file" = "/dev/null"; | ||||||
|  |       "mon_cluster_log_file" = "/dev/null"; | ||||||
|  |       "log_to_stderr" = "true"; | ||||||
|  |       "err_to_stderr" = "true"; | ||||||
|  |       "log_to_file" = "false"; | ||||||
|  |     }; | ||||||
|  |     mds = { | ||||||
|  |       enable = true; | ||||||
|  |       daemons = [ "mds0" "mds1" ]; | ||||||
|  |       extraConfig = { | ||||||
|  |         "host" = "bay"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |     mgr = { | ||||||
|  |       enable = true; | ||||||
|  |       daemons = [ "bay" ]; | ||||||
|  |     }; | ||||||
|  |     mon = { | ||||||
|  |       enable = true; | ||||||
|  |       daemons = [ "bay" ]; | ||||||
|  |     }; | ||||||
|  |     osd = { | ||||||
|  |       enable = true; | ||||||
|  |       # One daemon per NVME disk | ||||||
|  |       daemons = [ "0" "1" "2" "3" ]; | ||||||
|  |       extraConfig = { | ||||||
|  |         "osd crush chooseleaf type" = "0"; | ||||||
|  |         "osd journal size" = "10000"; | ||||||
|  |         "osd pool default min size" = "2"; | ||||||
|  |         "osd pool default pg num" = "200"; | ||||||
|  |         "osd pool default pgp num" = "200"; | ||||||
|  |         "osd pool default size" = "3"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Missing service for volumes, see: | ||||||
|  |   # https://www.reddit.com/r/ceph/comments/14otjyo/comment/jrd69vt/ | ||||||
|  |   systemd.services.ceph-volume = { | ||||||
|  |     enable = true; | ||||||
|  |     description = "Ceph Volume activation"; | ||||||
|  |     unitConfig = { | ||||||
|  |       Type = "oneshot"; | ||||||
|  |       After = "local-fs.target"; | ||||||
|  |       Wants = "local-fs.target"; | ||||||
|  |     }; | ||||||
|  |     path = [ pkgs.ceph pkgs.util-linux pkgs.lvm2 pkgs.cryptsetup ]; | ||||||
|  |     serviceConfig = { | ||||||
|  |       KillMode = "none"; | ||||||
|  |       Environment = "CEPH_VOLUME_TIMEOUT=10000"; | ||||||
|  |       ExecStart = "/bin/sh -c 'timeout $CEPH_VOLUME_TIMEOUT ${pkgs.ceph}/bin/ceph-volume lvm activate --all --no-systemd'"; | ||||||
|  |       TimeoutSec = "0"; | ||||||
|  |     }; | ||||||
|  |     wantedBy = [ "multi-user.target" ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										21
									
								
								m/common/base.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								m/common/base.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | { | ||||||
|  |   # All machines should include this profile. | ||||||
|  |   # Includes the basic configuration for an Intel server. | ||||||
|  |   imports = [ | ||||||
|  |     ./base/agenix.nix | ||||||
|  |     ./base/always-power-on.nix | ||||||
|  |     ./base/august-shutdown.nix | ||||||
|  |     ./base/boot.nix | ||||||
|  |     ./base/env.nix | ||||||
|  |     ./base/fs.nix | ||||||
|  |     ./base/hw.nix | ||||||
|  |     ./base/net.nix | ||||||
|  |     ./base/nix.nix | ||||||
|  |     ./base/ntp.nix | ||||||
|  |     ./base/rev.nix | ||||||
|  |     ./base/ssh.nix | ||||||
|  |     ./base/users.nix | ||||||
|  |     ./base/watchdog.nix | ||||||
|  |     ./base/zsh.nix | ||||||
|  |   ]; | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								m/common/base/agenix.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								m/common/base/agenix.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | { agenix, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ agenix.nixosModules.default ]; | ||||||
|  | 
 | ||||||
|  |   environment.systemPackages = [ | ||||||
|  |     agenix.packages.x86_64-linux.default | ||||||
|  |   ]; | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								m/common/base/always-power-on.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								m/common/base/always-power-on.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../../module/power-policy.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Turn on as soon as we have power | ||||||
|  |   power.policy = "always-on"; | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								m/common/base/august-shutdown.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								m/common/base/august-shutdown.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | { | ||||||
|  |   # Shutdown all machines on August 3rd at 22:00, so we can protect the | ||||||
|  |   # hardware from spurious electrical peaks on the yearly electrical cut for | ||||||
|  |   # manteinance that starts on August 4th. | ||||||
|  |   systemd.timers.august-shutdown = { | ||||||
|  |     description = "Shutdown on August 3rd for maintenance"; | ||||||
|  |     wantedBy = [ "timers.target" ]; | ||||||
|  |     timerConfig = { | ||||||
|  |       OnCalendar = "*-08-03 22:00:00"; | ||||||
|  |       RandomizedDelaySec = "10min"; | ||||||
|  |       Unit = "systemd-poweroff.service"; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								m/common/base/boot.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								m/common/base/boot.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | { lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   # Use the GRUB 2 boot loader. | ||||||
|  |   boot.loader.grub.enable = true; | ||||||
|  | 
 | ||||||
|  |   # Enable GRUB2 serial console | ||||||
|  |   boot.loader.grub.extraConfig = '' | ||||||
|  |     serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1 | ||||||
|  |     terminal_input --append serial | ||||||
|  |     terminal_output --append serial | ||||||
|  |   ''; | ||||||
|  | 
 | ||||||
|  |   boot.kernel.sysctl = { | ||||||
|  |     "kernel.perf_event_paranoid" = lib.mkDefault "-1"; | ||||||
|  | 
 | ||||||
|  |     # Allow ptracing (i.e. attach with GDB) any process of the same user, see: | ||||||
|  |     # https://www.kernel.org/doc/Documentation/security/Yama.txt | ||||||
|  |     "kernel.yama.ptrace_scope" = "0"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   boot.kernelPackages = pkgs.linuxPackages_latest; | ||||||
|  | 
 | ||||||
|  |   #boot.kernelPatches = lib.singleton { | ||||||
|  |   #  name = "osnoise-tracer"; | ||||||
|  |   #  patch = null; | ||||||
|  |   #  extraStructuredConfig = with lib.kernel; { | ||||||
|  |   #    OSNOISE_TRACER = yes; | ||||||
|  |   #    HWLAT_TRACER = yes; | ||||||
|  |   #  }; | ||||||
|  |   #}; | ||||||
|  | 
 | ||||||
|  |   boot.initrd.availableKernelModules = [ "ahci" "xhci_pci" "ehci_pci" "nvme" "usbhid" "sd_mod" ]; | ||||||
|  |   boot.initrd.kernelModules = [ ]; | ||||||
|  |   boot.kernelModules = [ "kvm-intel" ]; | ||||||
|  |   boot.extraModulePackages = [ ]; | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								m/common/base/env.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								m/common/base/env.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | { pkgs, config, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     vim wget git htop tmux pciutils tcpdump ripgrep nix-index nixos-option | ||||||
|  |     nix-diff ipmitool freeipmi ethtool lm_sensors cmake gnumake file tree | ||||||
|  |     ncdu config.boot.kernelPackages.perf ldns pv | ||||||
|  |     # From bsckgs overlay | ||||||
|  |     osumb | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   programs.direnv.enable = true; | ||||||
|  | 
 | ||||||
|  |   # Increase limits | ||||||
|  |   security.pam.loginLimits = [ | ||||||
|  |     { | ||||||
|  |       domain = "*"; | ||||||
|  |       type = "-"; | ||||||
|  |       item = "memlock"; | ||||||
|  |       value = "1048576"; # 1 GiB of mem locked | ||||||
|  |     } | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   environment.enableAllTerminfo = true; | ||||||
|  | 
 | ||||||
|  |   environment.variables = { | ||||||
|  |     EDITOR = "vim"; | ||||||
|  |     VISUAL = "vim"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   programs.bash.promptInit = '' | ||||||
|  |     PS1="\h\\$ " | ||||||
|  |   ''; | ||||||
|  | 
 | ||||||
|  |   time.timeZone = "Europe/Madrid"; | ||||||
|  |   i18n.defaultLocale = "en_DK.UTF-8"; | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								m/common/base/fs.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								m/common/base/fs.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | { ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   fileSystems."/" = | ||||||
|  |     { device = "/dev/disk/by-label/nixos"; | ||||||
|  |       fsType = "ext4"; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |   # Trim unused blocks weekly | ||||||
|  |   services.fstrim.enable = true; | ||||||
|  | 
 | ||||||
|  |   swapDevices = | ||||||
|  |     [ { device = "/dev/disk/by-label/swap"; } | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |   # Tracing | ||||||
|  |   fileSystems."/sys/kernel/tracing" = { | ||||||
|  |     device = "none"; | ||||||
|  |     fsType = "tracefs"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Mount a tmpfs into /tmp | ||||||
|  |   boot.tmp.useTmpfs = true; | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								m/common/base/hw.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								m/common/base/hw.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | # Do not modify this file!  It was generated by ‘nixos-generate-config’ | ||||||
|  | # and may be overwritten by future invocations.  Please make changes | ||||||
|  | # to /etc/nixos/configuration.nix instead. | ||||||
|  | { config, lib, pkgs, modulesPath, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = | ||||||
|  |     [ (modulesPath + "/installer/scan/not-detected.nix") | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |   nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; | ||||||
|  |   powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; | ||||||
|  |   hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								m/common/base/net.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								m/common/base/net.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | { pkgs, lib, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   networking = { | ||||||
|  |     enableIPv6 = false; | ||||||
|  |     useDHCP = false; | ||||||
|  | 
 | ||||||
|  |     firewall = { | ||||||
|  |       enable = true; | ||||||
|  |       allowedTCPPorts = [ 22 ]; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     # Make sure we use iptables | ||||||
|  |     nftables.enable = lib.mkForce false; | ||||||
|  | 
 | ||||||
|  |     hosts = { | ||||||
|  |       "84.88.53.236" = [ "ssfhead.bsc.es" "ssfhead" ]; | ||||||
|  |       "84.88.51.142" = [ "raccoon-ipmi" ]; | ||||||
|  |       "192.168.11.12" = [ "bscpm04.bsc.es" ]; | ||||||
|  |       "192.168.11.15" = [ "gitlab-internal.bsc.es" ]; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										59
									
								
								m/common/base/nix.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								m/common/base/nix.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,59 @@ | |||||||
|  | { pkgs, nixpkgs, theFlake,  ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   nixpkgs.overlays = [ | ||||||
|  |     (import ../../../overlay.nix) | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   nixpkgs.config.allowUnfree = true; | ||||||
|  | 
 | ||||||
|  |   nix = { | ||||||
|  |     nixPath = [ | ||||||
|  |       "nixpkgs=${nixpkgs}" | ||||||
|  |       "jungle=${theFlake.outPath}" | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |     registry = { | ||||||
|  |       nixpkgs.flake = nixpkgs; | ||||||
|  |       jungle.flake = theFlake; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     settings = { | ||||||
|  |       experimental-features = [ "nix-command" "flakes" ]; | ||||||
|  |       sandbox = "relaxed"; | ||||||
|  |       trusted-users = [ "@wheel" ]; | ||||||
|  |       flake-registry = pkgs.writeText "global-registry.json" | ||||||
|  |         ''{"flakes":[],"version":2}''; | ||||||
|  |       keep-outputs = true; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     gc = { | ||||||
|  |       automatic = true; | ||||||
|  |       dates = "weekly"; | ||||||
|  |       options = "--delete-older-than 30d"; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # The nix-gc.service can begin its execution *before* /home is mounted, | ||||||
|  |   # causing it to remove all gcroots considering them as stale, as it cannot | ||||||
|  |   # access the symlink. To prevent this problem, we force the service to wait | ||||||
|  |   # until /home is mounted as well as other remote FS like /ceph. | ||||||
|  |   systemd.services.nix-gc = { | ||||||
|  |     # Start remote-fs.target if not already being started and fail if it fails | ||||||
|  |     # to start. It will also be stopped if the remote-fs.target fails after | ||||||
|  |     # starting successfully. | ||||||
|  |     bindsTo = [ "remote-fs.target" ]; | ||||||
|  |     # Wait until remote-fs.target fully starts before starting this one. | ||||||
|  |     after = [ "remote-fs.target"]; | ||||||
|  |     # Ensure we can access a remote path inside /home | ||||||
|  |     unitConfig.ConditionPathExists = "/home/Computational"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # This value determines the NixOS release from which the default | ||||||
|  |   # settings for stateful data, like file locations and database versions | ||||||
|  |   # on your system were taken. It‘s perfectly fine and recommended to leave | ||||||
|  |   # this value at the release version of the first install of this system. | ||||||
|  |   # Before changing this value read the documentation for this option | ||||||
|  |   # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). | ||||||
|  |   system.stateVersion = "22.11"; # Did you read the comment? | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								m/common/base/ntp.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								m/common/base/ntp.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | { pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   services.ntp.enable = true; | ||||||
|  | 
 | ||||||
|  |   # Use the NTP server at BSC, as we don't have direct access | ||||||
|  |   # to the outside world | ||||||
|  |   networking.timeServers = [ "84.88.52.36" ]; | ||||||
|  | } | ||||||
							
								
								
									
										21
									
								
								m/common/base/rev.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								m/common/base/rev.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | { theFlake, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   # Prevent building a configuration without revision | ||||||
|  |   rev = if theFlake ? rev then theFlake.rev | ||||||
|  |     else throw ("Refusing to build from a dirty Git tree!"); | ||||||
|  | in { | ||||||
|  |   # Save the commit of the config in /etc/configrev | ||||||
|  |   environment.etc.configrev.text = rev + "\n"; | ||||||
|  | 
 | ||||||
|  |   # Keep a log with the config over time | ||||||
|  |   system.activationScripts.configRevLog.text = '' | ||||||
|  |     BOOTED=$(cat /run/booted-system/etc/configrev 2>/dev/null || echo unknown) | ||||||
|  |     CURRENT=$(cat /run/current-system/etc/configrev 2>/dev/null || echo unknown) | ||||||
|  |     NEXT=${rev} | ||||||
|  |     DATENOW=$(date --iso-8601=seconds) | ||||||
|  |     echo "$DATENOW booted=$BOOTED current=$CURRENT next=$NEXT" >> /var/configrev.log | ||||||
|  |   ''; | ||||||
|  | 
 | ||||||
|  |   system.configurationRevision = rev; | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								m/common/base/ssh.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								m/common/base/ssh.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | |||||||
|  | { lib, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   keys = import ../../../keys.nix; | ||||||
|  |   hostsKeys = lib.mapAttrs (name: value: { publicKey = value; }) keys.hosts; | ||||||
|  | in | ||||||
|  | { | ||||||
|  |   # Enable the OpenSSH daemon. | ||||||
|  |   services.openssh.enable = true; | ||||||
|  | 
 | ||||||
|  |   programs.ssh.knownHosts = hostsKeys // { | ||||||
|  |     "gitlab-internal.bsc.es".publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF9arsAOSRB06hdy71oTvJHG2Mg8zfebADxpvc37lZo3"; | ||||||
|  |     "bscpm03.bsc.es".publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM2NuSUPsEhqz1j5b4Gqd+MWFnRqyqY57+xMvBUqHYUS"; | ||||||
|  |     "bscpm04.bsc.es".publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPx4mC0etyyjYUT2Ztc/bs4ZXSbVMrogs1ZTP924PDgT"; | ||||||
|  |     "glogin1.bsc.es".publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFsHsZGCrzpd4QDVn5xoDOtrNBkb0ylxKGlyBt6l9qCz"; | ||||||
|  |     "glogin2.bsc.es".publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFsHsZGCrzpd4QDVn5xoDOtrNBkb0ylxKGlyBt6l9qCz"; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										190
									
								
								m/common/base/users.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								m/common/base/users.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,190 @@ | |||||||
|  | { pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../../module/jungle-users.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   users = { | ||||||
|  |     mutableUsers = false; | ||||||
|  |     users = { | ||||||
|  |       # Generate hashedPassword with `mkpasswd -m sha-512` | ||||||
|  | 
 | ||||||
|  |       root.openssh.authorizedKeys.keys = [ | ||||||
|  |         "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKBOf4r4lzQfyO0bx5BaREePREw8Zw5+xYgZhXwOZoBO ram@hop" | ||||||
|  |         "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINa0tvnNgwkc5xOwd6xTtaIdFi5jv0j2FrE7jl5MTLoE ram@mio" | ||||||
|  |         "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF3zeB5KSimMBAjvzsp1GCkepVaquVZGPYwRIzyzaCba aleix@bsc" | ||||||
|  |         "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIII/1TNArcwA6D47mgW4TArwlxQRpwmIGiZDysah40Gb root@hut" | ||||||
|  |       ]; | ||||||
|  | 
 | ||||||
|  |       rarias = { | ||||||
|  |         uid = 1880; | ||||||
|  |         isNormalUser = true; | ||||||
|  |         linger = true; | ||||||
|  |         home = "/home/Computational/rarias"; | ||||||
|  |         description = "Rodrigo Arias"; | ||||||
|  |         group = "Computational"; | ||||||
|  |         extraGroups = [ "wheel" ]; | ||||||
|  |         hashedPassword = "$6$u06tkCy13enReBsb$xiI.twRvvTfH4jdS3s68NZ7U9PSbGKs5.LXU/UgoawSwNWhZo2hRAjNL5qG0/lAckzcho2LjD0r3NfVPvthY6/"; | ||||||
|  |         openssh.authorizedKeys.keys = [ | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKBOf4r4lzQfyO0bx5BaREePREw8Zw5+xYgZhXwOZoBO ram@hop" | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINa0tvnNgwkc5xOwd6xTtaIdFi5jv0j2FrE7jl5MTLoE ram@mio" | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGYcXIxe0poOEGLpk8NjiRozls7fMRX0N3j3Ar94U+Gl rarias@hal" | ||||||
|  |         ]; | ||||||
|  |         shell = pkgs.zsh; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       arocanon = { | ||||||
|  |         uid = 1042; | ||||||
|  |         isNormalUser = true; | ||||||
|  |         home = "/home/Computational/arocanon"; | ||||||
|  |         description = "Aleix Roca"; | ||||||
|  |         group = "Computational"; | ||||||
|  |         extraGroups = [ "wheel" "tracing" ]; | ||||||
|  |         hashedPassword = "$6$hliZiW4tULC/tH7p$pqZarwJkNZ7vS0G5llWQKx08UFG9DxDYgad7jplMD8WkZh5k58i4dfPoWtnEShfjTO6JHiIin05ny5lmSXzGM/"; | ||||||
|  |         openssh.authorizedKeys.keys = [ | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF3zeB5KSimMBAjvzsp1GCkepVaquVZGPYwRIzyzaCba aleix@bsc" | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGdphWxLAEekicZ/WBrvP7phMyxKSSuLAZBovNX+hZXQ aleix@kerneland" | ||||||
|  |         ]; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     jungleUsers = { | ||||||
|  |       rpenacob = { | ||||||
|  |         uid = 2761; | ||||||
|  |         isNormalUser = true; | ||||||
|  |         home = "/home/Computational/rpenacob"; | ||||||
|  |         description = "Raúl Peñacoba"; | ||||||
|  |         group = "Computational"; | ||||||
|  |         hosts = [ "apex" "owl1" "owl2" "hut" "tent" "fox" ]; | ||||||
|  |         hashedPassword = "$6$TZm3bDIFyPrMhj1E$uEDXoYYd1z2Wd5mMPfh3DZAjP7ztVjJ4ezIcn82C0ImqafPA.AnTmcVftHEzLB3tbe2O4SxDyPSDEQgJ4GOtj/"; | ||||||
|  |         openssh.authorizedKeys.keys = [ | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFYfXg37mauGeurqsLpedgA2XQ9d4Nm0ZGo/hI1f7wwH rpenacob@bsc" | ||||||
|  |         ]; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       anavarro = { | ||||||
|  |         uid = 1037; | ||||||
|  |         isNormalUser = true; | ||||||
|  |         home = "/home/Computational/anavarro"; | ||||||
|  |         description = "Antoni Navarro"; | ||||||
|  |         group = "Computational"; | ||||||
|  |         hosts = [ "apex" "hut" "tent" "raccoon" "fox" "weasel" ]; | ||||||
|  |         hashedPassword = "$6$EgturvVYXlKgP43g$gTN78LLHIhaF8hsrCXD.O6mKnZSASWSJmCyndTX8QBWT6wTlUhcWVAKz65lFJPXjlJA4u7G1ydYQ0GG6Wk07b1"; | ||||||
|  |         openssh.authorizedKeys.keys = [ | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMsbM21uepnJwPrRe6jYFz8zrZ6AYMtSEvvt4c9spmFP toni@delltoni" | ||||||
|  |         ]; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       abonerib = { | ||||||
|  |         uid = 4541; | ||||||
|  |         isNormalUser = true; | ||||||
|  |         home = "/home/Computational/abonerib"; | ||||||
|  |         description = "Aleix Boné"; | ||||||
|  |         group = "Computational"; | ||||||
|  |         hosts = [ "apex" "owl1" "owl2" "hut" "tent" "raccoon" "fox" "weasel" ]; | ||||||
|  |         hashedPassword = "$6$V1EQWJr474whv7XJ$OfJ0wueM2l.dgiJiiah0Tip9ITcJ7S7qDvtSycsiQ43QBFyP4lU0e0HaXWps85nqB4TypttYR4hNLoz3bz662/"; | ||||||
|  |         openssh.authorizedKeys.keys = [ | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIIFiqXqt88VuUfyANkZyLJNiuroIITaGlOOTMhVDKjf abonerib@bsc" | ||||||
|  |         ]; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       vlopez = { | ||||||
|  |         uid = 4334; | ||||||
|  |         isNormalUser = true; | ||||||
|  |         home = "/home/Computational/vlopez"; | ||||||
|  |         description = "Victor López"; | ||||||
|  |         group = "Computational"; | ||||||
|  |         hosts = [ "apex" "koro" ]; | ||||||
|  |         hashedPassword = "$6$0ZBkgIYE/renVqtt$1uWlJsb0FEezRVNoETTzZMx4X2SvWiOsKvi0ppWCRqI66S6TqMBXBdP4fcQyvRRBt0e4Z7opZIvvITBsEtO0f0"; | ||||||
|  |         openssh.authorizedKeys.keys = [ | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGMwlUZRf9jfG666Qa5Sb+KtEhXqkiMlBV2su3x/dXHq victor@arch" | ||||||
|  |         ]; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       dbautist = { | ||||||
|  |         uid = 5649; | ||||||
|  |         isNormalUser = true; | ||||||
|  |         home = "/home/Computational/dbautist"; | ||||||
|  |         description = "Dylan Bautista Cases"; | ||||||
|  |         group = "Computational"; | ||||||
|  |         hosts = [ "apex" "hut" "tent" "raccoon" ]; | ||||||
|  |         hashedPassword = "$6$a2lpzMRVkG9nSgIm$12G6.ka0sFX1YimqJkBAjbvhRKZ.Hl090B27pdbnQOW0wzyxVWySWhyDDCILjQELky.HKYl9gqOeVXW49nW7q/"; | ||||||
|  |         openssh.authorizedKeys.keys = [ | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAb+EQBoS98zrCwnGKkHKwMLdYABMTqv7q9E0+T0QmkS dbautist@bsc-848818791" | ||||||
|  |         ]; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       dalvare1 = { | ||||||
|  |         uid = 2758; | ||||||
|  |         isNormalUser = true; | ||||||
|  |         home = "/home/Computational/dalvare1"; | ||||||
|  |         description = "David Álvarez"; | ||||||
|  |         group = "Computational"; | ||||||
|  |         hosts = [ "apex" "hut" "tent" "fox" ]; | ||||||
|  |         hashedPassword = "$6$mpyIsV3mdq.rK8$FvfZdRH5OcEkUt5PnIUijWyUYZvB1SgeqxpJ2p91TTe.3eQIDTcLEQ5rxeg.e5IEXAZHHQ/aMsR5kPEujEghx0"; | ||||||
|  |         openssh.authorizedKeys.keys = [ | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGEfy6F4rF80r4Cpo2H5xaWqhuUZzUsVsILSKGJzt5jF dalvare1@ssfhead" | ||||||
|  |         ]; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       varcila = { | ||||||
|  |         uid = 5650; | ||||||
|  |         isNormalUser = true; | ||||||
|  |         home = "/home/Computational/varcila"; | ||||||
|  |         description = "Vincent Arcila"; | ||||||
|  |         group = "Computational"; | ||||||
|  |         hosts = [ "apex" "hut" "tent" "fox" ]; | ||||||
|  |         hashedPassword = "$6$oB0Tcn99DcM4Ch$Vn1A0ulLTn/8B2oFPi9wWl/NOsJzaFAWjqekwcuC9sMC7cgxEVb.Nk5XSzQ2xzYcNe5MLtmzkVYnRS1CqP39Y0"; | ||||||
|  |         openssh.authorizedKeys.keys = [ | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKGt0ESYxekBiHJQowmKpfdouw0hVm3N7tUMtAaeLejK vincent@varch" | ||||||
|  |         ]; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       pmartin1 = { | ||||||
|  |         # Arbitrary UID but large so it doesn't collide with other users on ssfhead. | ||||||
|  |         uid = 9652; | ||||||
|  |         isNormalUser = true; | ||||||
|  |         home = "/home/Computational/pmartin1"; | ||||||
|  |         description = "Pedro J. Martinez-Ferrer"; | ||||||
|  |         group = "Computational"; | ||||||
|  |         hosts = [ "fox" ]; | ||||||
|  |         hashedPassword = "$6$nIgDMGnt4YIZl3G.$.JQ2jXLtDPRKsbsJfJAXdSvjDIzRrg7tNNjPkLPq3KJQhMjfDXRUvzagUHUU2TrE2hHM8/6uq8ex0UdxQ0ysl."; | ||||||
|  |         openssh.authorizedKeys.keys = [ | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIV5LEAII5rfe1hYqDYIIrhb1gOw7RcS1p2mhOTqG+zc pedro@pedro-ThinkPad-P14s-Gen-2a" | ||||||
|  |         ]; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       csiringo = { | ||||||
|  |         uid = 9653; | ||||||
|  |         isNormalUser = true; | ||||||
|  |         home = "/home/Computational/csiringo"; | ||||||
|  |         description = "Cesare Siringo"; | ||||||
|  |         group = "Computational"; | ||||||
|  |         hosts = [ ]; | ||||||
|  |         hashedPassword = "$6$0IsZlju8jFukLlAw$VKm0FUXbS.mVmPm3rcJeizTNU4IM5Nmmy21BvzFL.cQwvlGwFI1YWRQm6gsbd4nbg47mPDvYkr/ar0SlgF6GO1"; | ||||||
|  |         openssh.authorizedKeys.keys = [ | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHA65zvvG50iuFEMf+guRwZB65jlGXfGLF4HO+THFaed csiringo@bsc.es" | ||||||
|  |         ]; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       acinca = { | ||||||
|  |         uid = 9654; | ||||||
|  |         isNormalUser = true; | ||||||
|  |         home = "/home/Computational/acinca"; | ||||||
|  |         description = "Arnau Cinca"; | ||||||
|  |         group = "Computational"; | ||||||
|  |         hosts = [ "apex" "hut" "fox" "owl1" "owl2" ]; | ||||||
|  |         hashedPassword = "$6$S6PUeRpdzYlidxzI$szyvWejQ4hEN76yBYhp1diVO5ew1FFg.cz4lKiXt2Idy4XdpifwrFTCIzLTs5dvYlR62m7ekA5MrhcVxR5F/q/"; | ||||||
|  |         openssh.authorizedKeys.keys = [ | ||||||
|  |           "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFmMqKqPg4uocNOr3O41kLbZMOMJn3m2ZdN1JvTR96z3 bsccns@arnau-bsc" | ||||||
|  |         ]; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     groups = { | ||||||
|  |       Computational = { gid = 564; }; | ||||||
|  |       tracing = { }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								m/common/base/watchdog.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								m/common/base/watchdog.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | { ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   # The boards have a BMC watchdog controlled by IPMI | ||||||
|  |   boot.kernelModules = [ "ipmi_watchdog" ]; | ||||||
|  | 
 | ||||||
|  |   # Enable systemd watchdog with 30 s interval | ||||||
|  |   systemd.watchdog.runtimeTime = "30s"; | ||||||
|  | } | ||||||
							
								
								
									
										91
									
								
								m/common/base/zsh.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								m/common/base/zsh.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,91 @@ | |||||||
|  | { pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     zsh-completions | ||||||
|  |     nix-zsh-completions | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   programs.zsh = { | ||||||
|  |     enable = true; | ||||||
|  |     histSize = 1000000; | ||||||
|  | 
 | ||||||
|  |     shellInit = '' | ||||||
|  |       # Disable new user prompt | ||||||
|  |       if [ ! -e ~/.zshrc ]; then | ||||||
|  |         touch ~/.zshrc | ||||||
|  |       fi | ||||||
|  |     ''; | ||||||
|  | 
 | ||||||
|  |     promptInit = '' | ||||||
|  |       # Note that to manually override this in ~/.zshrc you should run `prompt off` | ||||||
|  |       # before setting your PS1 and etc. Otherwise this will likely to interact with | ||||||
|  |       # your ~/.zshrc configuration in unexpected ways as the default prompt sets | ||||||
|  |       # a lot of different prompt variables. | ||||||
|  |       autoload -U promptinit && promptinit && prompt default && setopt prompt_sp | ||||||
|  |     ''; | ||||||
|  | 
 | ||||||
|  |     # Taken from Ulli Kehrle config: | ||||||
|  |     # https://git.hrnz.li/Ulli/nixos/src/commit/2e203b8d8d671f4e3ced0f1744a51d5c6ee19846/profiles/shell.nix#L199-L205 | ||||||
|  |     interactiveShellInit = '' | ||||||
|  |       source "${pkgs.zsh-history-substring-search}/share/zsh-history-substring-search/zsh-history-substring-search.zsh" | ||||||
|  | 
 | ||||||
|  |       # Save history immediately, but only load it when the shell starts | ||||||
|  |       setopt inc_append_history | ||||||
|  | 
 | ||||||
|  |       # dircolors doesn't support alacritty: | ||||||
|  |       # https://lists.gnu.org/archive/html/bug-coreutils/2019-05/msg00029.html | ||||||
|  |       export LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.swp=00;90:*.tmp=00;90:*.dpkg-dist=00;90:*.dpkg-old=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90:'; | ||||||
|  | 
 | ||||||
|  |       # From Arch Linux and GRML | ||||||
|  |       bindkey "^R" history-incremental-pattern-search-backward | ||||||
|  |       bindkey "^S" history-incremental-pattern-search-forward | ||||||
|  | 
 | ||||||
|  |       # Auto rehash for new binaries | ||||||
|  |       zstyle ':completion:*' rehash true | ||||||
|  |       # show a nice menu with the matches | ||||||
|  |       zstyle ':completion:*' menu yes select | ||||||
|  | 
 | ||||||
|  |       bindkey '^[OA' history-substring-search-up   # Up | ||||||
|  |       bindkey '^[[A' history-substring-search-up   # Up | ||||||
|  | 
 | ||||||
|  |       bindkey '^[OB' history-substring-search-down # Down | ||||||
|  |       bindkey '^[[B' history-substring-search-down # Down | ||||||
|  | 
 | ||||||
|  |       bindkey '\e[1~' beginning-of-line            # Home | ||||||
|  |       bindkey '\e[7~' beginning-of-line            # Home | ||||||
|  |       bindkey '\e[H'  beginning-of-line            # Home | ||||||
|  |       bindkey '\eOH'  beginning-of-line            # Home | ||||||
|  | 
 | ||||||
|  |       bindkey '\e[4~' end-of-line                  # End | ||||||
|  |       bindkey '\e[8~' end-of-line                  # End | ||||||
|  |       bindkey '\e[F ' end-of-line                  # End | ||||||
|  |       bindkey '\eOF'  end-of-line                  # End | ||||||
|  | 
 | ||||||
|  |       bindkey '^?'    backward-delete-char         # Backspace | ||||||
|  |       bindkey '\e[3~' delete-char                  # Del | ||||||
|  |       # bindkey '\e[3;5~' delete-char                # sometimes Del, sometimes C-Del | ||||||
|  |       bindkey '\e[2~' overwrite-mode               # Ins | ||||||
|  | 
 | ||||||
|  |       bindkey '^H'      backward-kill-word         # C-Backspace | ||||||
|  | 
 | ||||||
|  |       bindkey '5~'      kill-word                  # C-Del | ||||||
|  |       bindkey '^[[3;5~' kill-word                  # C-Del | ||||||
|  |       bindkey '^[[3^'   kill-word                  # C-Del | ||||||
|  | 
 | ||||||
|  |       bindkey "^[[1;5H" backward-kill-line         # C-Home | ||||||
|  |       bindkey "^[[7^"   backward-kill-line         # C-Home | ||||||
|  | 
 | ||||||
|  |       bindkey "^[[1;5F" kill-line                  # C-End | ||||||
|  |       bindkey "^[[8^"   kill-line                  # C-End | ||||||
|  | 
 | ||||||
|  |       bindkey '^[[1;5C' forward-word               # C-Right | ||||||
|  |       bindkey '^[0c'    forward-word               # C-Right | ||||||
|  |       bindkey '^[[5C'   forward-word               # C-Right | ||||||
|  | 
 | ||||||
|  |       bindkey '^[[1;5D' backward-word              # C-Left | ||||||
|  |       bindkey '^[0d'    backward-word              # C-Left | ||||||
|  |       bindkey '^[[5D'   backward-word              # C-Left | ||||||
|  |     ''; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								m/common/ssf.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								m/common/ssf.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | { | ||||||
|  |   # Provides the base system for a xeon node in the SSF rack. | ||||||
|  |   imports = [ | ||||||
|  |     ./xeon.nix | ||||||
|  |     ./ssf/fs.nix | ||||||
|  |     ./ssf/hosts.nix | ||||||
|  |     ./ssf/hosts-remote.nix | ||||||
|  |     ./ssf/net.nix | ||||||
|  |   ]; | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								m/common/ssf/fs.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								m/common/ssf/fs.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | { | ||||||
|  |   # Mount the home via NFS | ||||||
|  |   fileSystems."/home" = { | ||||||
|  |     device = "10.0.40.30:/home"; | ||||||
|  |     fsType = "nfs"; | ||||||
|  |     options = [ "nfsvers=3" "rsize=1024" "wsize=1024" "cto" "nofail" ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								m/common/ssf/hosts-remote.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								m/common/ssf/hosts-remote.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | { pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   networking.hosts = { | ||||||
|  |     # Remote hosts visible from compute nodes | ||||||
|  |     "10.106.0.236" = [ "raccoon" ]; | ||||||
|  |     "10.0.44.4" = [ "tent" ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								m/common/ssf/hosts.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								m/common/ssf/hosts.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | { pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   networking.hosts = { | ||||||
|  |     # Login | ||||||
|  |     "10.0.40.30" = [ "apex" ]; | ||||||
|  | 
 | ||||||
|  |     # Storage | ||||||
|  |     "10.0.40.40" = [ "bay" ];   "10.0.42.40" = [ "bay-ib" ];    "10.0.40.141" = [ "bay-ipmi" ]; | ||||||
|  |     "10.0.40.41" = [ "oss01" ]; "10.0.42.41" = [ "oss01-ib0" ]; "10.0.40.142" = [ "oss01-ipmi" ]; | ||||||
|  |     "10.0.40.42" = [ "lake2" ]; "10.0.42.42" = [ "lake2-ib" ];  "10.0.40.143" = [ "lake2-ipmi" ]; | ||||||
|  | 
 | ||||||
|  |     # Xeon compute | ||||||
|  |     "10.0.40.1" = [ "owl1" ];   "10.0.42.1" = [ "owl1-ib" ];   "10.0.40.101" = [ "owl1-ipmi" ]; | ||||||
|  |     "10.0.40.2" = [ "owl2" ];   "10.0.42.2" = [ "owl2-ib" ];   "10.0.40.102" = [ "owl2-ipmi" ]; | ||||||
|  |     "10.0.40.3" = [ "xeon03" ]; "10.0.42.3" = [ "xeon03-ib" ]; "10.0.40.103" = [ "xeon03-ipmi" ]; | ||||||
|  |     #"10.0.40.4" = [ "tent" ];   "10.0.42.4" = [ "tent-ib" ];   "10.0.40.104" = [ "tent-ipmi" ]; | ||||||
|  |     "10.0.40.5" = [ "koro" ];   "10.0.42.5" = [ "koro-ib" ];   "10.0.40.105" = [ "koro-ipmi" ]; | ||||||
|  |     "10.0.40.6" = [ "weasel" ]; "10.0.42.6" = [ "weasel-ib" ]; "10.0.40.106" = [ "weasel-ipmi" ]; | ||||||
|  |     "10.0.40.7" = [ "hut" ];    "10.0.42.7" = [ "hut-ib" ];    "10.0.40.107" = [ "hut-ipmi" ]; | ||||||
|  |     "10.0.40.8" = [ "eudy" ];   "10.0.42.8" = [ "eudy-ib" ];   "10.0.40.108" = [ "eudy-ipmi" ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								m/common/ssf/net.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								m/common/ssf/net.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | { pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   # Infiniband (IPoIB) | ||||||
|  |   environment.systemPackages = [ pkgs.rdma-core ]; | ||||||
|  |   boot.kernelModules = [ "ib_umad" "ib_ipoib" ]; | ||||||
|  | 
 | ||||||
|  |   networking = { | ||||||
|  |     defaultGateway = "10.0.40.30"; | ||||||
|  |     nameservers = ["8.8.8.8"]; | ||||||
|  | 
 | ||||||
|  |     firewall = { | ||||||
|  |       extraCommands = '' | ||||||
|  |         # Prevent ssfhead from contacting our slurmd daemon | ||||||
|  |         iptables -A nixos-fw -p tcp -s ssfhead --dport 6817:6819 -j nixos-fw-refuse | ||||||
|  |         # But accept traffic to slurm ports from any other node in the subnet | ||||||
|  |         iptables -A nixos-fw -p tcp -s 10.0.40.0/24 --dport 6817:6819 -j nixos-fw-accept | ||||||
|  |         # We also need to open the srun port range | ||||||
|  |         iptables -A nixos-fw -p tcp -s 10.0.40.0/24 --dport 60000:61000 -j nixos-fw-accept | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										7
									
								
								m/common/xeon.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								m/common/xeon.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | { | ||||||
|  |   # Provides the base system for a xeon node, not necessarily in the SSF rack. | ||||||
|  |   imports = [ | ||||||
|  |     ./base.nix | ||||||
|  |     ./xeon/console.nix | ||||||
|  |   ]; | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								m/common/xeon/console.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								m/common/xeon/console.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | { | ||||||
|  |   # Restart the serial console | ||||||
|  |   systemd.services."serial-getty@ttyS0" = { | ||||||
|  |     enable = true; | ||||||
|  |     wantedBy = [ "getty.target" ]; | ||||||
|  |     serviceConfig.Restart = "always"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Enable serial console | ||||||
|  |   boot.kernelParams = [ | ||||||
|  |     "console=tty1" | ||||||
|  |     "console=ttyS0,115200" | ||||||
|  |   ]; | ||||||
|  | } | ||||||
							
								
								
									
										38
									
								
								m/eudy/configuration.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								m/eudy/configuration.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | |||||||
|  | { config, pkgs, lib, modulesPath, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../common/ssf.nix | ||||||
|  |     #(modulesPath + "/installer/netboot/netboot-minimal.nix") | ||||||
|  | 
 | ||||||
|  |     ./kernel/kernel.nix | ||||||
|  |     ./cpufreq.nix | ||||||
|  |     ./fs.nix | ||||||
|  |     ./users.nix | ||||||
|  |     ../module/hut-substituter.nix | ||||||
|  |     ../module/debuginfod.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Select this using the ID to avoid mismatches | ||||||
|  |   boot.loader.grub.device = "/dev/disk/by-id/wwn-0x55cd2e414d53564b"; | ||||||
|  | 
 | ||||||
|  |   # disable automatic garbage collector | ||||||
|  |   nix.gc.automatic = lib.mkForce false; | ||||||
|  | 
 | ||||||
|  |   # members of the tracing group can use the lttng-provided kernel events | ||||||
|  |   # without root permissions | ||||||
|  |   users.groups.tracing.members = [ "arocanon" ]; | ||||||
|  | 
 | ||||||
|  |   # set up both ethernet and infiniband ips | ||||||
|  |   networking = { | ||||||
|  |     hostName = "eudy"; | ||||||
|  |     interfaces.eno1.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.40.8"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |     interfaces.ibp5s0.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.42.8"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										40
									
								
								m/eudy/cpufreq.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								m/eudy/cpufreq.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | |||||||
|  | { lib, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   # Disable frequency boost by default. Use the intel_pstate driver instead of | ||||||
|  |   # acpi_cpufreq driver because the acpi_cpufreq driver does not read the | ||||||
|  |   # complete range of P-States [1]. Use the intel_pstate passive mode [2] to | ||||||
|  |   # disable HWP, which allows a core to "select P-states by itself". Also, this | ||||||
|  |   # disables intel governors, which confusingly, have the same names as the | ||||||
|  |   # generic ones but behave differently [3]. | ||||||
|  | 
 | ||||||
|  |   # Essentially, we use the generic governors, but use the intel driver to read | ||||||
|  |   # the P-state list. | ||||||
|  | 
 | ||||||
|  |   # [1] - https://www.kernel.org/doc/html/latest/admin-guide/pm/intel_pstate.html#intel-pstate-vs-acpi-cpufreq | ||||||
|  |   # [2] - https://www.kernel.org/doc/html/latest/admin-guide/pm/intel_pstate.html#passive-mode | ||||||
|  |   # [3] - https://www.kernel.org/doc/html/latest/admin-guide/pm/intel_pstate.html#active-mode | ||||||
|  |   # https://www.kernel.org/doc/html/latest/admin-guide/pm/cpufreq.html | ||||||
|  | 
 | ||||||
|  |   # set intel_pstate to passive mode | ||||||
|  |   boot.kernelParams = [ | ||||||
|  |     "intel_pstate=passive" | ||||||
|  |   ]; | ||||||
|  |   # Disable frequency boost | ||||||
|  |   system.activationScripts = { | ||||||
|  |     disableFrequencyBoost.text = '' | ||||||
|  |       echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo | ||||||
|  |     ''; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   ## disable intel_pstate | ||||||
|  |   #boot.kernelParams = [ | ||||||
|  |   #  "intel_pstate=disable" | ||||||
|  |   #]; | ||||||
|  |   ## Disable frequency boost | ||||||
|  |   #system.activationScripts = { | ||||||
|  |   #  disableFrequencyBoost.text = '' | ||||||
|  |   #    echo 0 > /sys/devices/system/cpu/cpufreq/boost | ||||||
|  |   #  ''; | ||||||
|  |   #}; | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								m/eudy/fs.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								m/eudy/fs.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | { ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   fileSystems."/nix" = { | ||||||
|  |     device = "/dev/disk/by-label/optane"; | ||||||
|  |     fsType = "ext4"; | ||||||
|  |     neededForBoot = true; | ||||||
|  |   }; | ||||||
|  |   fileSystems."/mnt/data" = { | ||||||
|  |     device = "/dev/disk/by-label/data"; | ||||||
|  |     fsType = "ext4"; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										70
									
								
								m/eudy/kernel/kernel.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								m/eudy/kernel/kernel.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | |||||||
|  | { pkgs, lib, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   #fcs-devel = pkgs.linuxPackages_custom { | ||||||
|  |   #   version = "6.2.8"; | ||||||
|  |   #   src = /mnt/data/kernel/fcs/kernel/src; | ||||||
|  |   #   configfile = /mnt/data/kernel/fcs/kernel/configs/defconfig; | ||||||
|  |   #}; | ||||||
|  | 
 | ||||||
|  |   #fcsv1 = fcs-kernel "bc11660676d3d68ce2459b9fb5d5e654e3f413be" false; | ||||||
|  |   #fcsv2 = fcs-kernel "db0f2eca0cd57a58bf456d7d2c7d5d8fdb25dfb1" false; | ||||||
|  |   #fcsv1-lockdep = fcs-kernel "bc11660676d3d68ce2459b9fb5d5e654e3f413be" true; | ||||||
|  |   #fcsv2-lockdep = fcs-kernel "db0f2eca0cd57a58bf456d7d2c7d5d8fdb25dfb1" true; | ||||||
|  |   #fcs-kernel = gitCommit: lockdep: pkgs.linuxPackages_custom { | ||||||
|  |   #   version = "6.2.8"; | ||||||
|  |   #   src = builtins.fetchGit { | ||||||
|  |   #     url = "git@bscpm03.bsc.es:ompss-kernel/linux.git"; | ||||||
|  |   #     rev = gitCommit; | ||||||
|  |   #     ref = "fcs"; | ||||||
|  |   #   }; | ||||||
|  |   #   configfile = if lockdep then ./configs/lockdep else ./configs/defconfig; | ||||||
|  |   #}; | ||||||
|  | 
 | ||||||
|  |   kernel = nixos-fcs; | ||||||
|  | 
 | ||||||
|  |   nixos-fcs-kernel = lib.makeOverridable ({gitCommit, lockStat ? false, preempt ? false, branch ? "fcs"}: pkgs.linuxPackagesFor (pkgs.buildLinux rec { | ||||||
|  |     version = "6.2.8"; | ||||||
|  |     src = builtins.fetchGit { | ||||||
|  |       url = "git@bscpm03.bsc.es:ompss-kernel/linux.git"; | ||||||
|  |       rev = gitCommit; | ||||||
|  |       ref = branch; | ||||||
|  |     }; | ||||||
|  |     structuredExtraConfig = with lib.kernel; { | ||||||
|  |       # add general custom kernel options here | ||||||
|  |     } // lib.optionalAttrs lockStat { | ||||||
|  |       LOCK_STAT = yes; | ||||||
|  |     } // lib.optionalAttrs preempt { | ||||||
|  |       PREEMPT = lib.mkForce yes; | ||||||
|  |       PREEMPT_VOLUNTARY = lib.mkForce no; | ||||||
|  |     }; | ||||||
|  |     kernelPatches = []; | ||||||
|  |     extraMeta.branch = lib.versions.majorMinor version; | ||||||
|  |   })); | ||||||
|  | 
 | ||||||
|  |   nixos-fcs = nixos-fcs-kernel {gitCommit = "8a09822dfcc8f0626b209d6d2aec8b5da459dfee";}; | ||||||
|  |   nixos-fcs-lockstat = nixos-fcs.override { | ||||||
|  |     lockStat = true; | ||||||
|  |   }; | ||||||
|  |   nixos-fcs-lockstat-preempt = nixos-fcs.override { | ||||||
|  |     lockStat = true; | ||||||
|  |     preempt = true; | ||||||
|  |   }; | ||||||
|  |   latest = pkgs.linuxPackages_latest; | ||||||
|  | 
 | ||||||
|  | in { | ||||||
|  |   imports = [ | ||||||
|  |     ./lttng.nix | ||||||
|  |     ./perf.nix | ||||||
|  |   ]; | ||||||
|  |   boot.kernelPackages = lib.mkForce kernel; | ||||||
|  | 
 | ||||||
|  |   # disable all cpu mitigations | ||||||
|  |   boot.kernelParams = [ | ||||||
|  |     "mitigations=off" | ||||||
|  |   ]; | ||||||
|  |    | ||||||
|  |   # enable memory overcommit, needed to build a taglibc system using nix after | ||||||
|  |   # increasing the openblas memory footprint | ||||||
|  |   boot.kernel.sysctl."vm.overcommit_memory" = 1; | ||||||
|  | } | ||||||
							
								
								
									
										43
									
								
								m/eudy/kernel/lttng.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								m/eudy/kernel/lttng.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,43 @@ | |||||||
|  | { config, pkgs, lib, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  | 
 | ||||||
|  |   # The lttng btrfs probe crashes at compile time because of an undefined | ||||||
|  |   # function. This disables the btrfs tracepoints to avoid the issue. | ||||||
|  | 
 | ||||||
|  |   # Also enable lockdep tracepoints, this is disabled by default because it | ||||||
|  |   # does not work well on architectures other than x86_64 (i think that arm) as | ||||||
|  |   # I was told on the mailing list. | ||||||
|  |   lttng-modules-fixed = config.boot.kernelPackages.lttng-modules.overrideAttrs (finalAttrs: previousAttrs: { | ||||||
|  |     patchPhase = (lib.optionalString (previousAttrs ? patchPhase) previousAttrs.patchPhase) + '' | ||||||
|  |       # disable btrfs | ||||||
|  |       substituteInPlace src/probes/Kbuild \ | ||||||
|  |         --replace "  obj-\$(CONFIG_LTTNG) += lttng-probe-btrfs.o" "  #obj-\$(CONFIG_LTTNG) += lttng-probe-btrfs.o" | ||||||
|  | 
 | ||||||
|  |       # enable lockdep tracepoints | ||||||
|  |       substituteInPlace src/probes/Kbuild \ | ||||||
|  |         --replace "#ifneq (\$(CONFIG_LOCKDEP),)"                  "ifneq (\$(CONFIG_LOCKDEP),)" \ | ||||||
|  |         --replace "#  obj-\$(CONFIG_LTTNG) += lttng-probe-lock.o" "  obj-\$(CONFIG_LTTNG) += lttng-probe-lock.o" \ | ||||||
|  |         --replace "#endif # CONFIG_LOCKDEP"                       "endif # CONFIG_LOCKDEP" | ||||||
|  |     ''; | ||||||
|  |   }); | ||||||
|  | in { | ||||||
|  | 
 | ||||||
|  |   # add the lttng tools and modules to the system environment | ||||||
|  |   boot.extraModulePackages = [ lttng-modules-fixed ]; | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     lttng-tools lttng-ust babeltrace | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # start the lttng root daemon to manage kernel events | ||||||
|  |   systemd.services.lttng-sessiond = { | ||||||
|  |     wantedBy = [ "multi-user.target" ]; | ||||||
|  |     description = "LTTng session daemon for the root user"; | ||||||
|  |     serviceConfig = { | ||||||
|  |       User = "root"; | ||||||
|  |       ExecStart = '' | ||||||
|  |         ${pkgs.lttng-tools}/bin/lttng-sessiond | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										22
									
								
								m/eudy/kernel/perf.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								m/eudy/kernel/perf.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | { config, pkgs, lib, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   # add the perf tool | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     config.boot.kernelPackages.perf | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # allow non-root users to read tracing data from the kernel | ||||||
|  |   boot.kernel.sysctl."kernel.perf_event_paranoid" = -2; | ||||||
|  |   boot.kernel.sysctl."kernel.kptr_restrict" = 0; | ||||||
|  | 
 | ||||||
|  |   # specify additionl options to the tracefs directory to allow members of the | ||||||
|  |   # tracing group to access tracefs. | ||||||
|  |   fileSystems."/sys/kernel/tracing" = { | ||||||
|  |     options = [ | ||||||
|  |       "mode=755" | ||||||
|  |       "gid=tracing" | ||||||
|  |     ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										11
									
								
								m/eudy/users.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								m/eudy/users.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | { ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   security.sudo.extraRules= [{ | ||||||
|  |     users = [ "arocanon" ]; | ||||||
|  |     commands = [{ | ||||||
|  |       command = "ALL" ; | ||||||
|  |       options= [ "NOPASSWD" ]; # "SETENV" # Adding the following could be a good idea | ||||||
|  |     }]; | ||||||
|  |   }]; | ||||||
|  | } | ||||||
							
								
								
									
										112
									
								
								m/fox/configuration.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								m/fox/configuration.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,112 @@ | |||||||
|  | { lib, config, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../common/base.nix | ||||||
|  |     ../common/xeon/console.nix | ||||||
|  |     ../module/amd-uprof.nix | ||||||
|  |     ../module/emulation.nix | ||||||
|  |     ../module/nvidia.nix | ||||||
|  |     ../module/slurm-client.nix | ||||||
|  |     ../module/hut-substituter.nix | ||||||
|  |     ./wireguard.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Don't turn off on August as UPC has different dates. | ||||||
|  |   # Fox works fine on power cuts. | ||||||
|  |   systemd.timers.august-shutdown.enable = false; | ||||||
|  | 
 | ||||||
|  |   # Select the this using the ID to avoid mismatches | ||||||
|  |   boot.loader.grub.device = "/dev/disk/by-id/wwn-0x500a07514b0c1103"; | ||||||
|  | 
 | ||||||
|  |   # No swap, there is plenty of RAM | ||||||
|  |   swapDevices = lib.mkForce []; | ||||||
|  | 
 | ||||||
|  |   boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ]; | ||||||
|  |   boot.kernelModules = [ "kvm-amd" "amd_uncore" "amd_hsmp" ]; | ||||||
|  | 
 | ||||||
|  |   hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; | ||||||
|  |   hardware.cpu.intel.updateMicrocode = lib.mkForce false; | ||||||
|  | 
 | ||||||
|  |   # Use performance for benchmarks | ||||||
|  |   powerManagement.cpuFreqGovernor = "performance"; | ||||||
|  | 
 | ||||||
|  |   services.amd-uprof.enable = true; | ||||||
|  | 
 | ||||||
|  |   # Disable NUMA balancing | ||||||
|  |   boot.kernel.sysctl."kernel.numa_balancing" = 0; | ||||||
|  | 
 | ||||||
|  |   # Expose kernel addresses | ||||||
|  |   boot.kernel.sysctl."kernel.kptr_restrict" = 0; | ||||||
|  | 
 | ||||||
|  |   # Disable NMI watchdog to save one hw counter (for AMD uProf) | ||||||
|  |   boot.kernel.sysctl."kernel.nmi_watchdog" = 0; | ||||||
|  | 
 | ||||||
|  |   services.openssh.settings.X11Forwarding = true; | ||||||
|  | 
 | ||||||
|  |   services.fail2ban.enable = true; | ||||||
|  | 
 | ||||||
|  |   networking = { | ||||||
|  |     timeServers = [ "ntp1.upc.edu" "ntp2.upc.edu" ]; | ||||||
|  |     hostName = "fox"; | ||||||
|  |     # UPC network (may change over time, use DHCP) | ||||||
|  |     # Public IP configuration: | ||||||
|  |     # - Hostname: fox.ac.upc.edu | ||||||
|  |     # - IP: 147.83.30.141 | ||||||
|  |     # - Gateway: 147.83.30.130 | ||||||
|  |     # - NetMask: 255.255.255.192 | ||||||
|  |     # Private IP configuration for BMC: | ||||||
|  |     # - Hostname: fox-ipmi.ac.upc.edu | ||||||
|  |     # - IP: 147.83.35.27 | ||||||
|  |     # - Gateway: 147.83.35.2 | ||||||
|  |     # - NetMask: 255.255.255.0 | ||||||
|  |     interfaces.enp1s0f0np0.useDHCP = true; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Recommended for new graphics cards | ||||||
|  |   hardware.nvidia.open = true; | ||||||
|  | 
 | ||||||
|  |   # Mount NVME disks | ||||||
|  |   fileSystems."/nvme0" = { device = "/dev/disk/by-label/nvme0"; fsType = "ext4"; }; | ||||||
|  |   fileSystems."/nvme1" = { device = "/dev/disk/by-label/nvme1"; fsType = "ext4"; }; | ||||||
|  | 
 | ||||||
|  |   # Mount the NFS home | ||||||
|  |   fileSystems."/nfs/home" = { | ||||||
|  |     device = "10.106.0.30:/home"; | ||||||
|  |     fsType = "nfs"; | ||||||
|  |     options = [ "nfsvers=3" "rsize=1024" "wsize=1024" "cto" "nofail" ]; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Make a /nvme{0,1}/$USER directory for each user. | ||||||
|  |   systemd.services.create-nvme-dirs = let | ||||||
|  |     # Take only normal users in fox | ||||||
|  |     users = lib.filterAttrs (_: v: v.isNormalUser) config.users.users; | ||||||
|  |     commands = lib.concatLists (lib.mapAttrsToList | ||||||
|  |       (_: user: [ | ||||||
|  |         "install -d -o ${user.name} -g ${user.group} -m 0755 /nvme{0,1}/${user.name}" | ||||||
|  |       ]) users); | ||||||
|  |     script = pkgs.writeShellScript "create-nvme-dirs.sh" (lib.concatLines commands); | ||||||
|  |   in { | ||||||
|  |     enable = true; | ||||||
|  |     wants = [ "local-fs.target" ]; | ||||||
|  |     after = [ "local-fs.target" ]; | ||||||
|  |     wantedBy = [ "multi-user.target" ]; | ||||||
|  |     serviceConfig.ExecStart = script; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Only allow SSH connections from users who have a SLURM allocation | ||||||
|  |   # See: https://slurm.schedmd.com/pam_slurm_adopt.html | ||||||
|  |   security.pam.services.sshd.rules.account.slurm = { | ||||||
|  |     control = "required"; | ||||||
|  |     enable = true; | ||||||
|  |     modulePath = "${pkgs.slurm}/lib/security/pam_slurm_adopt.so"; | ||||||
|  |     args = [ "log_level=debug5" ]; | ||||||
|  |     order = 999999; # Make it last one | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Disable systemd session (pam_systemd.so) as it will conflict with the | ||||||
|  |   # pam_slurm_adopt.so module. What happens is that the shell is first adopted | ||||||
|  |   # into the slurmstepd task and then into the systemd session, which is not | ||||||
|  |   # what we want, otherwise it will linger even if all jobs are gone. | ||||||
|  |   security.pam.services.sshd.startSession = lib.mkForce false; | ||||||
|  | } | ||||||
							
								
								
									
										54
									
								
								m/fox/wireguard.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								m/fox/wireguard.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | |||||||
|  | { config, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   networking.firewall = { | ||||||
|  |     allowedUDPPorts = [ 666 ]; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   age.secrets.wgFox.file = ../../secrets/wg-fox.age; | ||||||
|  | 
 | ||||||
|  |   networking.wireguard.enable = true; | ||||||
|  |   networking.wireguard.interfaces = { | ||||||
|  |     # "wg0" is the network interface name. You can name the interface arbitrarily. | ||||||
|  |     wg0 = { | ||||||
|  |       # Determines the IP address and subnet of the server's end of the tunnel interface. | ||||||
|  |       ips = [ "10.106.0.1/24" ]; | ||||||
|  | 
 | ||||||
|  |       # The port that WireGuard listens to. Must be accessible by the client. | ||||||
|  |       listenPort = 666; | ||||||
|  | 
 | ||||||
|  |       # Path to the private key file. | ||||||
|  |       privateKeyFile = config.age.secrets.wgFox.path; | ||||||
|  |       # Public key: VfMPBQLQTKeyXJSwv8wBhc6OV0j2qAxUpX3kLHunK2Y= | ||||||
|  | 
 | ||||||
|  |       peers = [ | ||||||
|  |         # List of allowed peers. | ||||||
|  |         { | ||||||
|  |           name = "apex"; | ||||||
|  |           publicKey = "VwhcN8vSOzdJEotQTpmPHBC52x3Hbv1lkFIyKubrnUA="; | ||||||
|  |           # List of IPs assigned to this peer within the tunnel subnet. Used to configure routing. | ||||||
|  |           allowedIPs = [ "10.106.0.30/32" "10.0.40.7/32" ]; | ||||||
|  |         } | ||||||
|  |         { | ||||||
|  |           name = "raccoon"; | ||||||
|  |           publicKey = "QUfnGXSMEgu2bviglsaSdCjidB51oEDBFpnSFcKGfDI="; | ||||||
|  |           allowedIPs = [ "10.106.0.236/32" "192.168.0.0/16" "10.0.44.0/24" ]; | ||||||
|  |         } | ||||||
|  |       ]; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   networking.hosts = { | ||||||
|  |     "10.106.0.30" = [ "apex" ]; | ||||||
|  |     "10.0.40.7" = [ "hut" ]; | ||||||
|  |     "10.106.0.236" = [ "raccoon" ]; | ||||||
|  |     "10.0.44.4" = [ "tent" ]; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   networking.firewall = { | ||||||
|  |     extraCommands = '' | ||||||
|  |       # Accept slurm connections to slurmd from apex (via wireguard) | ||||||
|  |       iptables -A nixos-fw -p tcp -i wg0 -s 10.106.0.30/32 -d 10.106.0.1/32 --dport 6818 -j nixos-fw-accept | ||||||
|  |     ''; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								m/hut/blackbox.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								m/hut/blackbox.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | modules: | ||||||
|  |   http_2xx: | ||||||
|  |     prober: http | ||||||
|  |     timeout: 5s | ||||||
|  |     http: | ||||||
|  |       follow_redirects: true | ||||||
|  |       preferred_ip_protocol: "ip4" | ||||||
|  |       valid_status_codes: []  # Defaults to 2xx | ||||||
|  |       method: GET | ||||||
|  |   icmp: | ||||||
|  |     prober: icmp | ||||||
|  |     timeout: 5s | ||||||
|  |     icmp: | ||||||
|  |       preferred_ip_protocol: "ip4" | ||||||
							
								
								
									
										67
									
								
								m/hut/configuration.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								m/hut/configuration.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,67 @@ | |||||||
|  | { config, pkgs, lib, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../common/ssf.nix | ||||||
|  | 
 | ||||||
|  |     ../module/ceph.nix | ||||||
|  |     ../module/debuginfod.nix | ||||||
|  |     ../module/emulation.nix | ||||||
|  |     ./gitlab-runner.nix | ||||||
|  |     ./monitoring.nix | ||||||
|  |     ./nfs.nix | ||||||
|  |     ./nix-serve.nix | ||||||
|  |     ./public-inbox.nix | ||||||
|  |     ./gitea.nix | ||||||
|  |     ./msmtp.nix | ||||||
|  |     ./postgresql.nix | ||||||
|  |     ./nginx.nix | ||||||
|  |     ./p.nix | ||||||
|  |     #./pxe.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Select the this using the ID to avoid mismatches | ||||||
|  |   boot.loader.grub.device = "/dev/disk/by-id/wwn-0x55cd2e414d53567f"; | ||||||
|  | 
 | ||||||
|  |   fileSystems = { | ||||||
|  |     "/" = lib.mkForce { | ||||||
|  |       device = "/dev/disk/by-label/nvme"; | ||||||
|  |       fsType = "ext4"; | ||||||
|  |       neededForBoot = true; | ||||||
|  |       options = [ "noatime" ]; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     "/boot" = lib.mkForce { | ||||||
|  |       device = "/dev/disk/by-label/nixos-boot"; | ||||||
|  |       fsType = "ext4"; | ||||||
|  |       neededForBoot = true; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   networking = { | ||||||
|  |     hostName = "hut"; | ||||||
|  |     interfaces.eno1.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.40.7"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |     interfaces.ibp5s0.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.42.7"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |     firewall = { | ||||||
|  |       extraCommands = '' | ||||||
|  |         # Accept all proxy traffic from compute nodes but not the login | ||||||
|  |         iptables -A nixos-fw -p tcp -s 10.0.40.30 --dport 23080 -j nixos-fw-log-refuse | ||||||
|  |         iptables -A nixos-fw -p tcp -s 10.0.40.0/24 --dport 23080 -j nixos-fw-accept | ||||||
|  |       ''; | ||||||
|  |       # Flush all rules and chains on stop so it won't break on start | ||||||
|  |       extraStopCommands = '' | ||||||
|  |         iptables -F | ||||||
|  |         iptables -X | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Allow proxy to bind to the ethernet interface | ||||||
|  |   services.openssh.settings.GatewayPorts = "clientspecified"; | ||||||
|  | } | ||||||
							
								
								
									
										63
									
								
								m/hut/gitea.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								m/hut/gitea.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,63 @@ | |||||||
|  | { config, lib, ... }: | ||||||
|  | { | ||||||
|  |   age.secrets.giteaRunnerToken.file = ../../secrets/gitea-runner-token.age; | ||||||
|  | 
 | ||||||
|  |   services.gitea = { | ||||||
|  |     enable = true; | ||||||
|  |     appName = "Gitea in the jungle"; | ||||||
|  | 
 | ||||||
|  |     settings = { | ||||||
|  |       server = { | ||||||
|  |         ROOT_URL = "https://jungle.bsc.es/git/"; | ||||||
|  |         LOCAL_ROOT_URL = "https://jungle.bsc.es/git/"; | ||||||
|  |         LANDING_PAGE = "explore"; | ||||||
|  |       }; | ||||||
|  |       metrics.ENABLED = true; | ||||||
|  |       service = { | ||||||
|  |         REGISTER_MANUAL_CONFIRM = true; | ||||||
|  |         ENABLE_NOTIFY_MAIL = true; | ||||||
|  |       }; | ||||||
|  |       log.LEVEL = "Warn"; | ||||||
|  | 
 | ||||||
|  |       mailer = { | ||||||
|  |         ENABLED       = true; | ||||||
|  |         FROM          = "jungle-robot@bsc.es"; | ||||||
|  |         PROTOCOL      = "sendmail"; | ||||||
|  |         SENDMAIL_PATH = "/run/wrappers/bin/sendmail"; | ||||||
|  |         SENDMAIL_ARGS = "--"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   services.gitea-actions-runner.instances = { | ||||||
|  |     runrun = { | ||||||
|  |       enable = true; | ||||||
|  |       name = "runrun"; | ||||||
|  |       url = "https://jungle.bsc.es/git/"; | ||||||
|  |       tokenFile = config.age.secrets.giteaRunnerToken.path; | ||||||
|  |       labels = [ "native:host" ]; | ||||||
|  |       settings.runner.capacity = 8; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   systemd.services.gitea-runner-runrun = { | ||||||
|  |     path = [ "/run/current-system/sw" ]; | ||||||
|  |     serviceConfig = { | ||||||
|  |       # DynamicUser doesn't work well with SSH | ||||||
|  |       DynamicUser = lib.mkForce false; | ||||||
|  |       User = "gitea-runner"; | ||||||
|  |       Group = "gitea-runner"; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   users.users.gitea-runner = { | ||||||
|  |     isSystemUser = true; | ||||||
|  |     home = "/var/lib/gitea-runner"; | ||||||
|  |     description = "Gitea Runner"; | ||||||
|  |     group = "gitea-runner"; | ||||||
|  |     extraGroups = [ "docker" ]; | ||||||
|  |     createHome = true; | ||||||
|  |   }; | ||||||
|  |   users.groups.gitea-runner = {}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										126
									
								
								m/hut/gitlab-runner.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								m/hut/gitlab-runner.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,126 @@ | |||||||
|  | { pkgs, lib, config, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   age.secrets.gitlab-pm-shell.file = ../../secrets/gitlab-runner-shell-token.age; | ||||||
|  |   age.secrets.gitlab-pm-docker.file = ../../secrets/gitlab-runner-docker-token.age; | ||||||
|  |   age.secrets.gitlab-bsc-docker.file = ../../secrets/gitlab-bsc-docker-token.age; | ||||||
|  | 
 | ||||||
|  |   services.gitlab-runner = { | ||||||
|  |     enable = true; | ||||||
|  |     settings.concurrent = 5; | ||||||
|  |     services = let | ||||||
|  |       common-shell = { | ||||||
|  |         executor = "shell"; | ||||||
|  |         environmentVariables = { | ||||||
|  |           SHELL = "${pkgs.bash}/bin/bash"; | ||||||
|  |         }; | ||||||
|  |       }; | ||||||
|  |       common-docker = { | ||||||
|  |         executor = "docker"; | ||||||
|  |         dockerImage = "debian:stable"; | ||||||
|  |         registrationFlags = [ | ||||||
|  |           "--docker-network-mode host" | ||||||
|  |         ]; | ||||||
|  |         environmentVariables = { | ||||||
|  |           https_proxy = "http://hut:23080"; | ||||||
|  |           http_proxy = "http://hut:23080"; | ||||||
|  |         }; | ||||||
|  |       }; | ||||||
|  |     in { | ||||||
|  |       # For pm.bsc.es/gitlab | ||||||
|  |       gitlab-pm-shell = common-shell // { | ||||||
|  |         authenticationTokenConfigFile = config.age.secrets.gitlab-pm-shell.path; | ||||||
|  |       }; | ||||||
|  |       gitlab-pm-docker = common-docker // { | ||||||
|  |         authenticationTokenConfigFile = config.age.secrets.gitlab-pm-docker.path; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       gitlab-bsc-docker = { | ||||||
|  |         # gitlab.bsc.es still uses the old token mechanism | ||||||
|  |         registrationConfigFile = config.age.secrets.gitlab-bsc-docker.path; | ||||||
|  |         tagList = [ "docker" "hut" ]; | ||||||
|  |         environmentVariables = { | ||||||
|  |           # We cannot access the hut local interface from docker, so we connect | ||||||
|  |           # to hut directly via the ethernet one. | ||||||
|  |           https_proxy = "http://hut:23080"; | ||||||
|  |           http_proxy = "http://hut:23080"; | ||||||
|  |         }; | ||||||
|  |         executor = "docker"; | ||||||
|  |         dockerImage = "alpine"; | ||||||
|  |         dockerVolumes = [ | ||||||
|  |           "/nix/store:/nix/store:ro" | ||||||
|  |           "/nix/var/nix/db:/nix/var/nix/db:ro" | ||||||
|  |           "/nix/var/nix/daemon-socket:/nix/var/nix/daemon-socket:ro" | ||||||
|  |         ]; | ||||||
|  |         dockerExtraHosts = [ | ||||||
|  |           # Required to pass the proxy via hut | ||||||
|  |           "hut:10.0.40.7" | ||||||
|  |         ]; | ||||||
|  |         dockerDisableCache = true; | ||||||
|  |         registrationFlags = [ | ||||||
|  |           # Increase build log length to 64 MiB | ||||||
|  |           "--output-limit 65536" | ||||||
|  |         ]; | ||||||
|  |         preBuildScript = pkgs.writeScript "setup-container" '' | ||||||
|  |           mkdir -p -m 0755 /nix/var/log/nix/drvs | ||||||
|  |           mkdir -p -m 0755 /nix/var/nix/gcroots | ||||||
|  |           mkdir -p -m 0755 /nix/var/nix/profiles | ||||||
|  |           mkdir -p -m 0755 /nix/var/nix/temproots | ||||||
|  |           mkdir -p -m 0755 /nix/var/nix/userpool | ||||||
|  |           mkdir -p -m 1777 /nix/var/nix/gcroots/per-user | ||||||
|  |           mkdir -p -m 1777 /nix/var/nix/profiles/per-user | ||||||
|  |           mkdir -p -m 0755 /nix/var/nix/profiles/per-user/root | ||||||
|  |           mkdir -p -m 0700 "$HOME/.nix-defexpr" | ||||||
|  |           mkdir -p -m 0700 "$HOME/.ssh" | ||||||
|  |           cat > "$HOME/.ssh/config" << EOF | ||||||
|  |           Host bscpm04.bsc.es gitlab-internal.bsc.es | ||||||
|  |             User git | ||||||
|  |             ProxyCommand nc -X connect -x hut:23080 %h %p | ||||||
|  |           Host amdlogin1.bsc.es armlogin1.bsc.es hualogin1.bsc.es glogin1.bsc.es glogin2.bsc.es fpgalogin1.bsc.es | ||||||
|  |             ProxyCommand nc -X connect -x hut:23080 %h %p | ||||||
|  |           EOF | ||||||
|  |           cat >> "$HOME/.ssh/known_hosts" << EOF | ||||||
|  |           bscpm04.bsc.es ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPx4mC0etyyjYUT2Ztc/bs4ZXSbVMrogs1ZTP924PDgT | ||||||
|  |           gitlab-internal.bsc.es ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF9arsAOSRB06hdy71oTvJHG2Mg8zfebADxpvc37lZo3 | ||||||
|  |           EOF | ||||||
|  |           . ${pkgs.nix}/etc/profile.d/nix-daemon.sh | ||||||
|  |           # Required to load SSL certificate paths | ||||||
|  |           . ${pkgs.cacert}/nix-support/setup-hook | ||||||
|  |         ''; | ||||||
|  |         environmentVariables = { | ||||||
|  |           ENV = "/etc/profile"; | ||||||
|  |           USER = "root"; | ||||||
|  |           NIX_REMOTE = "daemon"; | ||||||
|  |           PATH = "${config.system.path}/bin:/bin:/sbin:/usr/bin:/usr/sbin"; | ||||||
|  |         }; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # DOCKER* chains are useless, override at FORWARD and nixos-fw | ||||||
|  |   networking.firewall.extraCommands = '' | ||||||
|  |     # Don't forward any traffic from docker | ||||||
|  |     iptables -I FORWARD 1 -p all -i docker0 -j nixos-fw-log-refuse | ||||||
|  | 
 | ||||||
|  |     # Allow incoming traffic from docker to 23080 | ||||||
|  |     iptables -A nixos-fw -p tcp -i docker0 -d hut --dport 23080 -j ACCEPT | ||||||
|  |   ''; | ||||||
|  | 
 | ||||||
|  |   #systemd.services.gitlab-runner.serviceConfig.Shell = "${pkgs.bash}/bin/bash"; | ||||||
|  |   systemd.services.gitlab-runner.serviceConfig.DynamicUser = lib.mkForce false; | ||||||
|  |   systemd.services.gitlab-runner.serviceConfig.User = "gitlab-runner"; | ||||||
|  |   systemd.services.gitlab-runner.serviceConfig.Group = "gitlab-runner"; | ||||||
|  |   systemd.services.gitlab-runner.serviceConfig.ExecStart = lib.mkForce | ||||||
|  |     ''${pkgs.gitlab-runner}/bin/gitlab-runner run --config ''${HOME}/.gitlab-runner/config.toml --listen-address "127.0.0.1:9252" --working-directory ''${HOME}''; | ||||||
|  | 
 | ||||||
|  |   users.users.gitlab-runner = { | ||||||
|  |     uid = config.ids.uids.gitlab-runner; | ||||||
|  |     #isNormalUser = true; | ||||||
|  |     home = "/var/lib/gitlab-runner"; | ||||||
|  |     description = "Gitlab Runner"; | ||||||
|  |     group = "gitlab-runner"; | ||||||
|  |     extraGroups = [ "docker" ]; | ||||||
|  |     createHome = true; | ||||||
|  |   }; | ||||||
|  |   users.groups.gitlab-runner.gid = config.ids.gids.gitlab-runner; | ||||||
|  | } | ||||||
							
								
								
									
										31
									
								
								m/hut/gpfs-probe.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								m/hut/gpfs-probe.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | { pkgs, config, lib, ... }: | ||||||
|  | let | ||||||
|  |   gpfs-probe-script = pkgs.runCommand "gpfs-probe.sh" { } | ||||||
|  |     '' | ||||||
|  |       cp ${./gpfs-probe.sh} $out; | ||||||
|  |       chmod +x $out | ||||||
|  |     '' | ||||||
|  |   ; | ||||||
|  | in | ||||||
|  | { | ||||||
|  |   # Use a new user to handle the SSH keys | ||||||
|  |   users.groups.ssh-robot = { }; | ||||||
|  |   users.users.ssh-robot = { | ||||||
|  |     description = "SSH Robot"; | ||||||
|  |     isNormalUser = true; | ||||||
|  |     home = "/var/lib/ssh-robot"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   systemd.services.gpfs-probe = { | ||||||
|  |     description = "Daemon to report GPFS latency via SSH"; | ||||||
|  |     path = [ pkgs.openssh pkgs.netcat ]; | ||||||
|  |     after = [ "network.target" ]; | ||||||
|  |     wantedBy = [ "default.target" ]; | ||||||
|  |     serviceConfig = { | ||||||
|  |       Type = "simple"; | ||||||
|  |       ExecStart = "${pkgs.socat}/bin/socat TCP4-LISTEN:9966,fork EXEC:${gpfs-probe-script}"; | ||||||
|  |       User = "ssh-robot"; | ||||||
|  |       Group = "ssh-robot"; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								m/hut/gpfs-probe.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										18
									
								
								m/hut/gpfs-probe.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,18 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | 
 | ||||||
|  | N=500 | ||||||
|  | 
 | ||||||
|  | t=$(timeout 5 ssh bsc015557@glogin2.bsc.es "timeout 3 command time -f %e touch /gpfs/projects/bsc15/bsc015557/gpfs.{1..$N} 2>&1; rm -f /gpfs/projects/bsc15/bsc015557/gpfs.{1..$N}") | ||||||
|  | 
 | ||||||
|  | if [ -z "$t" ]; then | ||||||
|  |   t="5.00" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | cat <<EOF | ||||||
|  | HTTP/1.1 200 OK | ||||||
|  | Content-Type: text/plain; version=0.0.4; charset=utf-8; escaping=values | ||||||
|  | 
 | ||||||
|  | # HELP gpfs_touch_latency Time to create $N files. | ||||||
|  | # TYPE gpfs_touch_latency gauge | ||||||
|  | gpfs_touch_latency $t | ||||||
|  | EOF | ||||||
							
								
								
									
										272
									
								
								m/hut/monitoring.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								m/hut/monitoring.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,272 @@ | |||||||
|  | { config, lib, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../module/slurm-exporter.nix | ||||||
|  |     ../module/meteocat-exporter.nix | ||||||
|  |     ../module/upc-qaire-exporter.nix | ||||||
|  |     ./gpfs-probe.nix | ||||||
|  |     ../module/nix-daemon-exporter.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   age.secrets.grafanaJungleRobotPassword = { | ||||||
|  |     file = ../../secrets/jungle-robot-password.age; | ||||||
|  |     owner = "grafana"; | ||||||
|  |     mode = "400"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   age.secrets.ipmiYml.file = ../../secrets/ipmi.yml.age; | ||||||
|  | 
 | ||||||
|  |   services.grafana = { | ||||||
|  |     enable = true; | ||||||
|  |     settings = { | ||||||
|  |       server = { | ||||||
|  |         domain = "jungle.bsc.es"; | ||||||
|  |         root_url = "%(protocol)s://%(domain)s/grafana"; | ||||||
|  |         serve_from_sub_path = true; | ||||||
|  |         http_port = 2342; | ||||||
|  |         http_addr = "127.0.0.1"; | ||||||
|  |       }; | ||||||
|  |       smtp = { | ||||||
|  |         enabled = true; | ||||||
|  |         from_address = "jungle-robot@bsc.es"; | ||||||
|  |         user = "jungle-robot"; | ||||||
|  |         # Read the password from a file, which is only readable by grafana user | ||||||
|  |         # https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#file-provider | ||||||
|  |         password = "$__file{${config.age.secrets.grafanaJungleRobotPassword.path}}"; | ||||||
|  |         host = "mail.bsc.es:465"; | ||||||
|  |         startTLS_policy = "NoStartTLS"; | ||||||
|  |       }; | ||||||
|  |       feature_toggles.publicDashboards = true; | ||||||
|  |       "auth.anonymous".enabled = true; | ||||||
|  |       log.level = "warn"; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Make grafana alerts also use the proxy | ||||||
|  |   systemd.services.grafana.environment = config.networking.proxy.envVars; | ||||||
|  | 
 | ||||||
|  |   services.prometheus = { | ||||||
|  |     enable = true; | ||||||
|  |     port = 9001; | ||||||
|  |     retentionTime = "5y"; | ||||||
|  |     listenAddress = "127.0.0.1"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   systemd.services.prometheus-ipmi-exporter.serviceConfig.DynamicUser = lib.mkForce false; | ||||||
|  |   systemd.services.prometheus-ipmi-exporter.serviceConfig.PrivateDevices = lib.mkForce false; | ||||||
|  | 
 | ||||||
|  |   # We need access to the devices to monitor the disk space | ||||||
|  |   systemd.services.prometheus-node-exporter.serviceConfig.PrivateDevices = lib.mkForce false; | ||||||
|  |   systemd.services.prometheus-node-exporter.serviceConfig.ProtectHome = lib.mkForce "read-only"; | ||||||
|  | 
 | ||||||
|  |   virtualisation.docker.daemon.settings = { | ||||||
|  |     metrics-addr = "127.0.0.1:9323"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Required to allow the smartctl exporter to read the nvme0 character device, | ||||||
|  |   # see the commit message on: | ||||||
|  |   # https://github.com/NixOS/nixpkgs/commit/12c26aca1fd55ab99f831bedc865a626eee39f80 | ||||||
|  |   services.udev.extraRules = '' | ||||||
|  |     SUBSYSTEM=="nvme", KERNEL=="nvme[0-9]*", GROUP="disk" | ||||||
|  |   ''; | ||||||
|  | 
 | ||||||
|  |   services.prometheus = { | ||||||
|  | 
 | ||||||
|  |     exporters = { | ||||||
|  |       ipmi = { | ||||||
|  |         enable = true; | ||||||
|  |         group = "root"; | ||||||
|  |         user = "root"; | ||||||
|  |         configFile = config.age.secrets.ipmiYml.path; | ||||||
|  |         # extraFlags = [ "--log.level=debug" ]; | ||||||
|  |         listenAddress = "127.0.0.1"; | ||||||
|  |       }; | ||||||
|  |       node = { | ||||||
|  |         enable = true; | ||||||
|  |         enabledCollectors = [ "systemd" "logind" ]; | ||||||
|  |         port = 9002; | ||||||
|  |         listenAddress = "127.0.0.1"; | ||||||
|  |       }; | ||||||
|  |       smartctl = { | ||||||
|  |         enable = true; | ||||||
|  |         listenAddress = "127.0.0.1"; | ||||||
|  |       }; | ||||||
|  |       blackbox = { | ||||||
|  |         enable = true; | ||||||
|  |         listenAddress = "127.0.0.1"; | ||||||
|  |         configFile = ./blackbox.yml; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     scrapeConfigs = [ | ||||||
|  |       { | ||||||
|  |         job_name = "xeon07"; | ||||||
|  |         static_configs = [{ | ||||||
|  |           targets = [ | ||||||
|  |             "127.0.0.1:${toString config.services.prometheus.exporters.node.port}" | ||||||
|  |             "127.0.0.1:${toString config.services.prometheus.exporters.ipmi.port}" | ||||||
|  |             "127.0.0.1:9323" | ||||||
|  |             "127.0.0.1:9252" | ||||||
|  |             "127.0.0.1:${toString config.services.prometheus.exporters.smartctl.port}" | ||||||
|  |             "127.0.0.1:9341" # Slurm exporter | ||||||
|  |             "127.0.0.1:9966" # GPFS custom exporter | ||||||
|  |             "127.0.0.1:9999" # Nix-daemon custom exporter | ||||||
|  |             "127.0.0.1:9929" # Meteocat custom exporter | ||||||
|  |             "127.0.0.1:9928" # UPC Qaire custom exporter | ||||||
|  |             "127.0.0.1:${toString config.services.prometheus.exporters.blackbox.port}" | ||||||
|  |           ]; | ||||||
|  |         }]; | ||||||
|  |       } | ||||||
|  |       { | ||||||
|  |         job_name = "ceph"; | ||||||
|  |         static_configs = [{ | ||||||
|  |           targets = [ | ||||||
|  |             "10.0.40.40:9283" # Ceph statistics | ||||||
|  |             "10.0.40.40:9002" # Node exporter | ||||||
|  |             "10.0.40.42:9002" # Node exporter | ||||||
|  |           ]; | ||||||
|  |         }]; | ||||||
|  |       } | ||||||
|  |       { | ||||||
|  |         job_name = "blackbox-http"; | ||||||
|  |         metrics_path = "/probe"; | ||||||
|  |         params = { module = [ "http_2xx" ]; }; | ||||||
|  |         static_configs = [{ | ||||||
|  |           targets = [ | ||||||
|  |             "https://www.google.com/robots.txt" | ||||||
|  |             "https://pm.bsc.es/" | ||||||
|  |             "https://pm.bsc.es/gitlab/" | ||||||
|  |             "https://jungle.bsc.es/" | ||||||
|  |             "https://gitlab.bsc.es/" | ||||||
|  |           ]; | ||||||
|  |         }]; | ||||||
|  |         relabel_configs = [ | ||||||
|  |           { | ||||||
|  |             # Takes the address and sets it in the "target=<xyz>" URL parameter | ||||||
|  |             source_labels = [ "__address__" ]; | ||||||
|  |             target_label = "__param_target"; | ||||||
|  |           } | ||||||
|  |           { | ||||||
|  |             # Sets the "instance" label with the remote host we are querying | ||||||
|  |             source_labels = [ "__param_target" ]; | ||||||
|  |             target_label = "instance"; | ||||||
|  |           } | ||||||
|  |           { | ||||||
|  |             # Shows the host target address instead of the blackbox address | ||||||
|  |             target_label = "__address__"; | ||||||
|  |             replacement = "127.0.0.1:${toString config.services.prometheus.exporters.blackbox.port}"; | ||||||
|  |           } | ||||||
|  |         ]; | ||||||
|  |       } | ||||||
|  |       { | ||||||
|  |         job_name = "blackbox-icmp"; | ||||||
|  |         metrics_path = "/probe"; | ||||||
|  |         params = { module = [ "icmp" ]; }; | ||||||
|  |         static_configs = [{ | ||||||
|  |           targets = [ | ||||||
|  |             "1.1.1.1" | ||||||
|  |             "8.8.8.8" | ||||||
|  |             "ssfhead" | ||||||
|  |             "anella-bsc.cesca.cat" | ||||||
|  |             "upc-anella.cesca.cat" | ||||||
|  |             "fox.ac.upc.edu" | ||||||
|  |             "arenys5.ac.upc.edu" | ||||||
|  |           ]; | ||||||
|  |         }]; | ||||||
|  |         relabel_configs = [ | ||||||
|  |           { | ||||||
|  |             # Takes the address and sets it in the "target=<xyz>" URL parameter | ||||||
|  |             source_labels = [ "__address__" ]; | ||||||
|  |             target_label = "__param_target"; | ||||||
|  |           } | ||||||
|  |           { | ||||||
|  |             # Sets the "instance" label with the remote host we are querying | ||||||
|  |             source_labels = [ "__param_target" ]; | ||||||
|  |             target_label = "instance"; | ||||||
|  |           } | ||||||
|  |           { | ||||||
|  |             # Shows the host target address instead of the blackbox address | ||||||
|  |             target_label = "__address__"; | ||||||
|  |             replacement = "127.0.0.1:${toString config.services.prometheus.exporters.blackbox.port}"; | ||||||
|  |           } | ||||||
|  |         ]; | ||||||
|  |       } | ||||||
|  |       { | ||||||
|  |         job_name = "gitea"; | ||||||
|  |         static_configs = [{ targets = [ "127.0.0.1:3000" ]; }]; | ||||||
|  |       } | ||||||
|  |       { | ||||||
|  |         # Scrape the IPMI info of the hosts remotely via LAN | ||||||
|  |         job_name = "ipmi-lan"; | ||||||
|  |         scrape_interval = "1m"; | ||||||
|  |         scrape_timeout = "30s"; | ||||||
|  |         metrics_path = "/ipmi"; | ||||||
|  |         scheme = "http"; | ||||||
|  |         relabel_configs = [ | ||||||
|  |           { | ||||||
|  |             # Takes the address and sets it in the "target=<xyz>" URL parameter | ||||||
|  |             source_labels = [ "__address__" ]; | ||||||
|  |             separator = ";"; | ||||||
|  |             regex = "(.*)(:80)?"; | ||||||
|  |             target_label = "__param_target"; | ||||||
|  |             replacement = "\${1}"; | ||||||
|  |             action = "replace"; | ||||||
|  |           } | ||||||
|  |           { | ||||||
|  |             # Sets the "instance" label with the remote host we are querying | ||||||
|  |             source_labels = [ "__param_target" ]; | ||||||
|  |             separator = ";"; | ||||||
|  |             regex = "(.*)-ipmi"; # Remove "-ipm̀i" at the end | ||||||
|  |             target_label = "instance"; | ||||||
|  |             replacement = "\${1}"; | ||||||
|  |             action = "replace"; | ||||||
|  |           } | ||||||
|  |           { | ||||||
|  |             # Sets the fixed "module=lan" URL param | ||||||
|  |             separator = ";"; | ||||||
|  |             regex = "(.*)"; | ||||||
|  |             target_label = "__param_module"; | ||||||
|  |             replacement = "lan"; | ||||||
|  |             action = "replace"; | ||||||
|  |           } | ||||||
|  |           { | ||||||
|  |             # Sets the target to query as the localhost IPMI exporter | ||||||
|  |             separator = ";"; | ||||||
|  |             regex = ".*"; | ||||||
|  |             target_label = "__address__"; | ||||||
|  |             replacement = "127.0.0.1:9290"; | ||||||
|  |             action = "replace"; | ||||||
|  |           } | ||||||
|  |         ]; | ||||||
|  | 
 | ||||||
|  |         # Load the list of targets from another file | ||||||
|  |         file_sd_configs = [ | ||||||
|  |           { | ||||||
|  |             files = [ "${./targets.yml}" ]; | ||||||
|  |             refresh_interval = "30s"; | ||||||
|  |           } | ||||||
|  |         ]; | ||||||
|  |       } | ||||||
|  |       { | ||||||
|  |         job_name = "ipmi-raccoon"; | ||||||
|  |         metrics_path = "/ipmi"; | ||||||
|  |         static_configs = [ | ||||||
|  |           { targets = [ "127.0.0.1:9291" ]; } | ||||||
|  |         ]; | ||||||
|  |         params = { | ||||||
|  |           target = [ "84.88.51.142" ]; | ||||||
|  |           module = [ "raccoon" ]; | ||||||
|  |         }; | ||||||
|  |       } | ||||||
|  |       { | ||||||
|  |         job_name = "raccoon"; | ||||||
|  |         static_configs = [ | ||||||
|  |           { | ||||||
|  |             targets = [ "127.0.0.1:19002" ]; # Node exporter | ||||||
|  |           } | ||||||
|  |         ]; | ||||||
|  |       } | ||||||
|  |     ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								m/hut/msmtp.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								m/hut/msmtp.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | { config, lib, ... }: | ||||||
|  | { | ||||||
|  |   age.secrets.jungleRobotPassword = { | ||||||
|  |     file = ../../secrets/jungle-robot-password.age; | ||||||
|  |     group = "gitea"; | ||||||
|  |     mode = "440"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   programs.msmtp = { | ||||||
|  |     enable = true; | ||||||
|  |     accounts = { | ||||||
|  |       default = { | ||||||
|  |         auth = true; | ||||||
|  |         tls = true; | ||||||
|  |         tls_starttls = false; | ||||||
|  |         port = 465; | ||||||
|  |         host = "mail.bsc.es"; | ||||||
|  |         user = "jungle-robot"; | ||||||
|  |         passwordeval = "cat ${config.age.secrets.jungleRobotPassword.path}"; | ||||||
|  |         from = "jungle-robot@bsc.es"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								m/hut/nfs.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								m/hut/nfs.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | { ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   services.nfs.server.enable = true; | ||||||
|  |   services.nfs.server.exports = '' | ||||||
|  |     /nix 10.0.40.0/24(ro,sync,no_subtree_check,root_squash) | ||||||
|  |   ''; | ||||||
|  |   networking.firewall.allowedTCPPorts = [ 2049 ]; | ||||||
|  | } | ||||||
							
								
								
									
										76
									
								
								m/hut/nginx.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								m/hut/nginx.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,76 @@ | |||||||
|  | { theFlake, pkgs, ... }: | ||||||
|  | let | ||||||
|  |   website = pkgs.stdenv.mkDerivation { | ||||||
|  |     name = "jungle-web"; | ||||||
|  |     src = pkgs.fetchgit { | ||||||
|  |       url = "https://jungle.bsc.es/git/rarias/jungle-website.git"; | ||||||
|  |       rev = "739bf0175a7f05380fe7ad7023ff1d60db1710e1"; | ||||||
|  |       hash = "sha256-ea5DzhYTzZ9TmqD+x95rdNdLbxPnBluqlYH2NmBYmc4="; | ||||||
|  |     }; | ||||||
|  |     buildInputs = [ pkgs.hugo ]; | ||||||
|  |     buildPhase = '' | ||||||
|  |       rm -rf public/ | ||||||
|  |       hugo | ||||||
|  |     ''; | ||||||
|  |     installPhase = '' | ||||||
|  |       cp -r public $out | ||||||
|  |     ''; | ||||||
|  |     # Don't mess doc/ | ||||||
|  |     dontFixup = true; | ||||||
|  |   }; | ||||||
|  | in | ||||||
|  | { | ||||||
|  |   networking.firewall.allowedTCPPorts = [ 80 ]; | ||||||
|  |   services.nginx = { | ||||||
|  |     enable = true; | ||||||
|  |     virtualHosts."jungle.bsc.es" = { | ||||||
|  |       root = "${website}"; | ||||||
|  |       listen = [ | ||||||
|  |         { | ||||||
|  |           addr = "0.0.0.0"; | ||||||
|  |           port = 80; | ||||||
|  |         } | ||||||
|  |       ]; | ||||||
|  |       extraConfig = '' | ||||||
|  |         set_real_ip_from 127.0.0.1; | ||||||
|  |         set_real_ip_from 84.88.52.107; | ||||||
|  |         real_ip_recursive on; | ||||||
|  |         real_ip_header X-Forwarded-For; | ||||||
|  | 
 | ||||||
|  |         location /git { | ||||||
|  |           rewrite ^/git$ / break; | ||||||
|  |           rewrite ^/git/(.*) /$1 break; | ||||||
|  |           proxy_pass http://127.0.0.1:3000; | ||||||
|  |           proxy_redirect http:// $scheme://; | ||||||
|  |         } | ||||||
|  |         location /cache { | ||||||
|  |           rewrite ^/cache/(.*) /$1 break; | ||||||
|  |           proxy_pass http://127.0.0.1:5000; | ||||||
|  |           proxy_redirect http:// $scheme://; | ||||||
|  |         } | ||||||
|  |         location /lists { | ||||||
|  |           proxy_pass http://127.0.0.1:8081; | ||||||
|  |           proxy_redirect http:// $scheme://; | ||||||
|  |         } | ||||||
|  |         location /grafana { | ||||||
|  |           proxy_pass http://127.0.0.1:2342; | ||||||
|  |           proxy_redirect http:// $scheme://; | ||||||
|  |           proxy_set_header Host $host; | ||||||
|  |           # Websockets | ||||||
|  |           proxy_http_version 1.1; | ||||||
|  |           proxy_set_header Upgrade $http_upgrade; | ||||||
|  |           proxy_set_header Connection "upgrade"; | ||||||
|  |         } | ||||||
|  |         location ~ ^/~(.+?)(/.*)?$ { | ||||||
|  |           alias /ceph/home/$1/public_html$2; | ||||||
|  |           index  index.html index.htm; | ||||||
|  |           autoindex on; | ||||||
|  |           absolute_redirect off; | ||||||
|  |         } | ||||||
|  |         location /p/ { | ||||||
|  |           alias /ceph/p/; | ||||||
|  |         } | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								m/hut/nix-serve.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								m/hut/nix-serve.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | { config, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   age.secrets.nixServe.file = ../../secrets/nix-serve.age; | ||||||
|  | 
 | ||||||
|  |   services.nix-serve = { | ||||||
|  |     enable = true; | ||||||
|  |     # Only listen locally, as we serve it via ssh | ||||||
|  |     bindAddress = "127.0.0.1"; | ||||||
|  |     port = 5000; | ||||||
|  | 
 | ||||||
|  |     secretKeyFile = config.age.secrets.nixServe.path; | ||||||
|  |     # Public key: | ||||||
|  |     # jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0= | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										43
									
								
								m/hut/p.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								m/hut/p.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,43 @@ | |||||||
|  | { pkgs, lib, config, ... }: | ||||||
|  | let | ||||||
|  |   p = pkgs.writeShellScriptBin "p" '' | ||||||
|  |     set -e | ||||||
|  |     cd /ceph | ||||||
|  |     pastedir="p/$USER" | ||||||
|  |     mkdir -p "$pastedir" | ||||||
|  | 
 | ||||||
|  |     ext="txt" | ||||||
|  | 
 | ||||||
|  |     if [ -n "$1" ]; then | ||||||
|  |       ext="$1" | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     out=$(mktemp "$pastedir/XXXXXXXX.$ext") | ||||||
|  | 
 | ||||||
|  |     cat > "$out" | ||||||
|  |     chmod go+r "$out" | ||||||
|  |     echo "https://jungle.bsc.es/$out" | ||||||
|  |   ''; | ||||||
|  | in | ||||||
|  | { | ||||||
|  |   environment.systemPackages = with pkgs; [ p ]; | ||||||
|  | 
 | ||||||
|  |   # Make sure we have a directory per user. We cannot use the nice | ||||||
|  |   # systemd-tmpfiles-setup.service service because this is a remote FS, and it | ||||||
|  |   # may not be mounted when it runs. | ||||||
|  |   systemd.services.create-paste-dirs = let | ||||||
|  |     # Take only normal users in hut | ||||||
|  |     users = lib.filterAttrs (_: v: v.isNormalUser) config.users.users; | ||||||
|  |     commands = lib.concatLists (lib.mapAttrsToList | ||||||
|  |       (_: user: [ | ||||||
|  |         "install -d -o ${user.name} -g ${user.group} -m 0755 /ceph/p/${user.name}" | ||||||
|  |       ]) users); | ||||||
|  |     script = pkgs.writeShellScript "create-paste-dirs.sh" (lib.concatLines commands); | ||||||
|  |   in { | ||||||
|  |     enable = true; | ||||||
|  |     wants = [ "remote-fs.target" ]; | ||||||
|  |     after = [ "remote-fs.target" ]; | ||||||
|  |     wantedBy = [ "multi-user.target" ]; | ||||||
|  |     serviceConfig.ExecStart = script; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										19
									
								
								m/hut/postgresql.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								m/hut/postgresql.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | |||||||
|  | { lib, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   services.postgresql = { | ||||||
|  |     enable = true; | ||||||
|  |     ensureDatabases = [ "perftestsdb" ]; | ||||||
|  |     ensureUsers = [ | ||||||
|  |       { name = "anavarro"; ensureClauses.superuser = true; } | ||||||
|  |       { name = "rarias";   ensureClauses.superuser = true; } | ||||||
|  |       { name = "grafana"; } | ||||||
|  |     ]; | ||||||
|  |     authentication = '' | ||||||
|  |       #type  database     DBuser    auth-method | ||||||
|  |       local  perftestsdb  rarias    trust | ||||||
|  |       local  perftestsdb  anavarro  trust | ||||||
|  |       local  perftestsdb  grafana   trust | ||||||
|  |     ''; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										79
									
								
								m/hut/public-inbox.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								m/hut/public-inbox.css
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,79 @@ | |||||||
|  | /* | ||||||
|  |  * CC0-1.0 <https://creativecommons.org/publicdomain/zero/1.0/legalcode> | ||||||
|  |  * Dark color scheme using 216 web-safe colors, inspired | ||||||
|  |  * somewhat by the default color scheme in mutt. | ||||||
|  |  * It reduces eyestrain for me, and energy usage for all: | ||||||
|  |  * https://en.wikipedia.org/wiki/Light-on-dark_color_scheme | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | * { | ||||||
|  | 	font-size: 14px; | ||||||
|  | 	font-family: monospace; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pre { | ||||||
|  | 	white-space: pre-wrap; | ||||||
|  | 	padding: 10px; | ||||||
|  | 	background: #f5f5f5; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | hr { | ||||||
|  | 	margin: 30px 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | body { | ||||||
|  | 	max-width: 120ex; /* 120 columns wide */ | ||||||
|  | 	margin: 50px auto; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  |  * Underlined links add visual noise which make them hard-to-read. | ||||||
|  |  * Use colors to make them stand out, instead. | ||||||
|  |  */ | ||||||
|  | a:link { | ||||||
|  | 	color: #007; | ||||||
|  | 	text-decoration: none; | ||||||
|  | } | ||||||
|  | a:visited { | ||||||
|  | 	color:#504; | ||||||
|  | } | ||||||
|  | a:hover { | ||||||
|  | 	text-decoration: underline; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* quoted text in emails gets a different color */ | ||||||
|  | *.q { color:gray } | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  |  * these may be used with cgit <https://git.zx2c4.com/cgit/>, too. | ||||||
|  |  * (cgit uses <div>, public-inbox uses <span>) | ||||||
|  |  */ | ||||||
|  | *.add { color:darkgreen } /* diff post-image lines */ | ||||||
|  | *.del { color:darkred } /* diff pre-image lines */ | ||||||
|  | *.head { color:black } /* diff header (metainformation) */ | ||||||
|  | *.hunk { color:gray } /* diff hunk-header */ | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  |  * highlight 3.x colors (tested 3.18) for displaying blobs. | ||||||
|  |  * This doesn't use most of the colors available, as I find too | ||||||
|  |  * many colors overwhelming, so the default is commented out. | ||||||
|  |  */ | ||||||
|  | .hl.num { color:#f30 } /* number */ | ||||||
|  | .hl.esc { color:#f0f } /* escape character */ | ||||||
|  | .hl.str { color:#f30 } /* string */ | ||||||
|  | .hl.ppc { color:#f0f } /* preprocessor */ | ||||||
|  | .hl.pps { color:#f30 } /* preprocessor string */ | ||||||
|  | .hl.slc { color:#09f } /* single-line comment */ | ||||||
|  | .hl.com { color:#09f } /* multi-line comment */ | ||||||
|  | /* .hl.opt { color:#ccc } */ /* operator */ | ||||||
|  | /* .hl.ipl { color:#ccc } */ /* interpolation */ | ||||||
|  | 
 | ||||||
|  | /* keyword groups kw[a-z] */ | ||||||
|  | .hl.kwa { color:#ff0 } | ||||||
|  | .hl.kwb { color:#0f0 } | ||||||
|  | .hl.kwc { color:#ff0 } | ||||||
|  | /* .hl.kwd { color:#ccc } */ | ||||||
|  | 
 | ||||||
|  | /* line-number (unused by public-inbox) */ | ||||||
|  | /* .hl.lin { color:#ccc } */ | ||||||
|  | 
 | ||||||
							
								
								
									
										47
									
								
								m/hut/public-inbox.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								m/hut/public-inbox.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | |||||||
|  | { lib, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   services.public-inbox = { | ||||||
|  |     enable = true; | ||||||
|  |     http = { | ||||||
|  |       enable = true; | ||||||
|  |       port = 8081; | ||||||
|  |       mounts = [ "/lists" ]; | ||||||
|  |     }; | ||||||
|  |     settings.publicinbox = { | ||||||
|  |       css = [ "${./public-inbox.css}" ]; | ||||||
|  |       wwwlisting = "all"; | ||||||
|  |     }; | ||||||
|  |     inboxes = { | ||||||
|  |       bscpkgs = { | ||||||
|  |         url = "https://jungle.bsc.es/lists/bscpkgs"; | ||||||
|  |         address = [ "~rodarima/bscpkgs@lists.sr.ht" ]; | ||||||
|  |         watch = [ "imaps://jungle-robot%40gmx.com@imap.gmx.com/INBOX" ]; | ||||||
|  |         description = "Patches for bscpkgs"; | ||||||
|  |         listid = "~rodarima/bscpkgs.lists.sr.ht"; | ||||||
|  |       }; | ||||||
|  |       jungle = { | ||||||
|  |         url = "https://jungle.bsc.es/lists/jungle"; | ||||||
|  |         address = [ "~rodarima/jungle@lists.sr.ht" ]; | ||||||
|  |         watch = [ "imaps://jungle-robot%40gmx.com@imap.gmx.com/INBOX" ]; | ||||||
|  |         description = "Patches for jungle"; | ||||||
|  |         listid = "~rodarima/jungle.lists.sr.ht"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # We need access to the network for the watch service, as we will fetch the | ||||||
|  |   # emails directly from the IMAP server. | ||||||
|  |   systemd.services.public-inbox-watch.serviceConfig = { | ||||||
|  |     PrivateNetwork = lib.mkForce false; | ||||||
|  |     RestrictAddressFamilies = lib.mkForce [ "AF_UNIX"  "AF_INET" "AF_INET6" ]; | ||||||
|  |     KillSignal = "SIGKILL"; # Avoid slow shutdown | ||||||
|  | 
 | ||||||
|  |     # Required for chmod(..., 02750) on directories by git, from | ||||||
|  |     # systemd.exec(8): | ||||||
|  |     # > Note that this restricts marking of any type of file system object with | ||||||
|  |     # > these bits, including both regular files and directories (where the SGID | ||||||
|  |     # > is a different meaning than for files, see documentation). | ||||||
|  |     RestrictSUIDSGID = lib.mkForce false; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										35
									
								
								m/hut/pxe.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								m/hut/pxe.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | |||||||
|  | { theFlake, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | # This module describes a script that can launch the pixiecore daemon to serve a | ||||||
|  | # NixOS image via PXE to a node to directly boot from there, without requiring a | ||||||
|  | # working disk. | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   # The host config must have the netboot-minimal.nix module too | ||||||
|  |   host = theFlake.nixosConfigurations.lake2; | ||||||
|  |   sys = host.config.system; | ||||||
|  |   build = sys.build; | ||||||
|  |   kernel = "${build.kernel}/bzImage"; | ||||||
|  |   initrd = "${build.netbootRamdisk}/initrd"; | ||||||
|  |   init = "${build.toplevel}/init"; | ||||||
|  | 
 | ||||||
|  |   script = pkgs.writeShellScriptBin "pixiecore-helper" '' | ||||||
|  |     #!/usr/bin/env bash -x | ||||||
|  | 
 | ||||||
|  |     ${pkgs.pixiecore}/bin/pixiecore \ | ||||||
|  |       boot ${kernel} ${initrd} --cmdline "init=${init} loglevel=4" \ | ||||||
|  |       --debug --dhcp-no-bind --port 64172 --status-port 64172 "$@" | ||||||
|  |   ''; | ||||||
|  | in | ||||||
|  | { | ||||||
|  |   ## We need a DHCP server to provide the IP | ||||||
|  |   #services.dnsmasq = { | ||||||
|  |   #  enable = true; | ||||||
|  |   #  settings = { | ||||||
|  |   #    domain-needed = true; | ||||||
|  |   #    dhcp-range = [ "192.168.0.2,192.168.0.254" ]; | ||||||
|  |   #  }; | ||||||
|  |   #}; | ||||||
|  | 
 | ||||||
|  |   environment.systemPackages = [ script ]; | ||||||
|  | } | ||||||
							
								
								
									
										15
									
								
								m/hut/targets.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								m/hut/targets.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | |||||||
|  | - targets: | ||||||
|  |   - owl1-ipmi | ||||||
|  |   - owl2-ipmi | ||||||
|  |   - xeon03-ipmi | ||||||
|  |   - xeon04-ipmi | ||||||
|  |   - koro-ipmi | ||||||
|  |   - weasel-ipmi | ||||||
|  |   - hut-ipmi | ||||||
|  |   - eudy-ipmi | ||||||
|  |   # Storage | ||||||
|  |   - bay-ipmi | ||||||
|  |   - oss01-ipmi | ||||||
|  |   - lake2-ipmi | ||||||
|  |   labels: | ||||||
|  |     job: ipmi-lan | ||||||
							
								
								
									
										35
									
								
								m/koro/configuration.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								m/koro/configuration.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | |||||||
|  | { config, pkgs, lib, modulesPath, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../common/ssf.nix | ||||||
|  |     #(modulesPath + "/installer/netboot/netboot-minimal.nix") | ||||||
|  | 
 | ||||||
|  |     ../eudy/cpufreq.nix | ||||||
|  |     ../eudy/users.nix | ||||||
|  |     ./kernel.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Select this using the ID to avoid mismatches | ||||||
|  |   boot.loader.grub.device = "/dev/disk/by-id/wwn-0x55cd2e414d5376d2"; | ||||||
|  | 
 | ||||||
|  |   # disable automatic garbage collector | ||||||
|  |   nix.gc.automatic = lib.mkForce false; | ||||||
|  | 
 | ||||||
|  |   # members of the tracing group can use the lttng-provided kernel events | ||||||
|  |   # without root permissions | ||||||
|  |   users.groups.tracing.members = [ "arocanon" "vlopez" ]; | ||||||
|  | 
 | ||||||
|  |   # set up both ethernet and infiniband ips | ||||||
|  |   networking = { | ||||||
|  |     hostName = "koro"; | ||||||
|  |     interfaces.eno1.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.40.5"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |     interfaces.ibp5s0.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.42.5"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										70
									
								
								m/koro/kernel.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								m/koro/kernel.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | |||||||
|  | { pkgs, lib, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   #fcs-devel = pkgs.linuxPackages_custom { | ||||||
|  |   #   version = "6.2.8"; | ||||||
|  |   #   src = /mnt/data/kernel/fcs/kernel/src; | ||||||
|  |   #   configfile = /mnt/data/kernel/fcs/kernel/configs/defconfig; | ||||||
|  |   #}; | ||||||
|  | 
 | ||||||
|  |   #fcsv1 = fcs-kernel "bc11660676d3d68ce2459b9fb5d5e654e3f413be" false; | ||||||
|  |   #fcsv2 = fcs-kernel "db0f2eca0cd57a58bf456d7d2c7d5d8fdb25dfb1" false; | ||||||
|  |   #fcsv1-lockdep = fcs-kernel "bc11660676d3d68ce2459b9fb5d5e654e3f413be" true; | ||||||
|  |   #fcsv2-lockdep = fcs-kernel "db0f2eca0cd57a58bf456d7d2c7d5d8fdb25dfb1" true; | ||||||
|  |   #fcs-kernel = gitCommit: lockdep: pkgs.linuxPackages_custom { | ||||||
|  |   #   version = "6.2.8"; | ||||||
|  |   #   src = builtins.fetchGit { | ||||||
|  |   #     url = "git@bscpm03.bsc.es:ompss-kernel/linux.git"; | ||||||
|  |   #     rev = gitCommit; | ||||||
|  |   #     ref = "fcs"; | ||||||
|  |   #   }; | ||||||
|  |   #   configfile = if lockdep then ./configs/lockdep else ./configs/defconfig; | ||||||
|  |   #}; | ||||||
|  | 
 | ||||||
|  |   kernel = nixos-fcs; | ||||||
|  | 
 | ||||||
|  |   nixos-fcs-kernel = lib.makeOverridable ({gitCommit, lockStat ? false, preempt ? false, branch ? "fcs"}: pkgs.linuxPackagesFor (pkgs.buildLinux rec { | ||||||
|  |     version = "6.2.8"; | ||||||
|  |     src = builtins.fetchGit { | ||||||
|  |       url = "git@bscpm03.bsc.es:ompss-kernel/linux.git"; | ||||||
|  |       rev = gitCommit; | ||||||
|  |       ref = branch; | ||||||
|  |     }; | ||||||
|  |     structuredExtraConfig = with lib.kernel; { | ||||||
|  |       # add general custom kernel options here | ||||||
|  |     } // lib.optionalAttrs lockStat { | ||||||
|  |       LOCK_STAT = yes; | ||||||
|  |     } // lib.optionalAttrs preempt { | ||||||
|  |       PREEMPT = lib.mkForce yes; | ||||||
|  |       PREEMPT_VOLUNTARY = lib.mkForce no; | ||||||
|  |     }; | ||||||
|  |     kernelPatches = []; | ||||||
|  |     extraMeta.branch = lib.versions.majorMinor version; | ||||||
|  |   })); | ||||||
|  | 
 | ||||||
|  |   nixos-fcs = nixos-fcs-kernel {gitCommit = "8a09822dfcc8f0626b209d6d2aec8b5da459dfee";}; | ||||||
|  |   nixos-fcs-lockstat = nixos-fcs.override { | ||||||
|  |     lockStat = true; | ||||||
|  |   }; | ||||||
|  |   nixos-fcs-lockstat-preempt = nixos-fcs.override { | ||||||
|  |     lockStat = true; | ||||||
|  |     preempt = true; | ||||||
|  |   }; | ||||||
|  |   latest = pkgs.linuxPackages_latest; | ||||||
|  | 
 | ||||||
|  | in { | ||||||
|  |   imports = [ | ||||||
|  |     ../eudy/kernel/lttng.nix | ||||||
|  |     ../eudy/kernel/perf.nix | ||||||
|  |   ]; | ||||||
|  |   boot.kernelPackages = lib.mkForce kernel; | ||||||
|  | 
 | ||||||
|  |   # disable all cpu mitigations | ||||||
|  |   boot.kernelParams = [ | ||||||
|  |     "mitigations=off" | ||||||
|  |   ]; | ||||||
|  |    | ||||||
|  |   # enable memory overcommit, needed to build a taglibc system using nix after | ||||||
|  |   # increasing the openblas memory footprint | ||||||
|  |   boot.kernel.sysctl."vm.overcommit_memory" = 1; | ||||||
|  | } | ||||||
							
								
								
									
										84
									
								
								m/lake2/configuration.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								m/lake2/configuration.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,84 @@ | |||||||
|  | { config, pkgs, lib, modulesPath, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../common/ssf.nix | ||||||
|  |     ../module/monitoring.nix | ||||||
|  |     ../module/hut-substituter.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   boot.loader.grub.device = "/dev/disk/by-id/wwn-0x55cd2e414d53563a"; | ||||||
|  | 
 | ||||||
|  |   boot.kernel.sysctl = { | ||||||
|  |     "kernel.yama.ptrace_scope" = lib.mkForce "1"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     ceph | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   services.ceph = { | ||||||
|  |     enable = true; | ||||||
|  |     global = { | ||||||
|  |       fsid = "9c8d06e0-485f-4aaf-b16b-06d6daf1232b"; | ||||||
|  |       monHost = "10.0.40.40"; | ||||||
|  |       monInitialMembers = "bay"; | ||||||
|  |       clusterNetwork = "10.0.40.40/24"; # Use Ethernet only | ||||||
|  |     }; | ||||||
|  |     osd = { | ||||||
|  |       enable = true; | ||||||
|  |       # One daemon per NVME disk | ||||||
|  |       daemons = [ "4" "5" "6" "7" ]; | ||||||
|  |       extraConfig = { | ||||||
|  |         "osd crush chooseleaf type" = "0"; | ||||||
|  |         "osd journal size" = "10000"; | ||||||
|  |         "osd pool default min size" = "2"; | ||||||
|  |         "osd pool default pg num" = "200"; | ||||||
|  |         "osd pool default pgp num" = "200"; | ||||||
|  |         "osd pool default size" = "3"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   networking = { | ||||||
|  |     hostName = "lake2"; | ||||||
|  |     interfaces.eno1.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.40.42"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |     interfaces.ibp5s0.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.42.42"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |     firewall = { | ||||||
|  |       extraCommands = '' | ||||||
|  |         # Accept all incoming TCP traffic from bay | ||||||
|  |         iptables -A nixos-fw -p tcp -s bay -j nixos-fw-accept | ||||||
|  |         # Accept monitoring requests from hut | ||||||
|  |         iptables -A nixos-fw -p tcp -s hut --dport 9002 -j nixos-fw-accept | ||||||
|  |         # Accept all Ceph traffic from the local network | ||||||
|  |         iptables -A nixos-fw -p tcp -s 10.0.40.0/24 -m multiport --dport 3300,6789,6800:7568 -j nixos-fw-accept | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Missing service for volumes, see: | ||||||
|  |   # https://www.reddit.com/r/ceph/comments/14otjyo/comment/jrd69vt/ | ||||||
|  |   systemd.services.ceph-volume = { | ||||||
|  |     enable = true; | ||||||
|  |     description = "Ceph Volume activation"; | ||||||
|  |     unitConfig = { | ||||||
|  |       Type = "oneshot"; | ||||||
|  |       After = "local-fs.target"; | ||||||
|  |       Wants = "local-fs.target"; | ||||||
|  |     }; | ||||||
|  |     path = [ pkgs.ceph pkgs.util-linux pkgs.lvm2 pkgs.cryptsetup ]; | ||||||
|  |     serviceConfig = { | ||||||
|  |       KillMode = "none"; | ||||||
|  |       Environment = "CEPH_VOLUME_TIMEOUT=10000"; | ||||||
|  |       ExecStart = "/bin/sh -c 'timeout $CEPH_VOLUME_TIMEOUT ${pkgs.ceph}/bin/ceph-volume lvm activate --all --no-systemd'"; | ||||||
|  |       TimeoutSec = "0"; | ||||||
|  |     }; | ||||||
|  |     wantedBy = [ "multi-user.target" ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										70
									
								
								m/map.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								m/map.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | |||||||
|  | { | ||||||
|  |   # In physical order from top to bottom (see note below) | ||||||
|  |   ssf = { | ||||||
|  |     # Switches for Ethernet and OmniPath | ||||||
|  |     switch-C6-S1A-05 = { pos=42; size=1; model="Dell S3048-ON"; }; | ||||||
|  |     switch-opa = { pos=41; size=1; }; | ||||||
|  | 
 | ||||||
|  |     # SSF login | ||||||
|  |     apex = { pos=39; size=2; label="SSFHEAD"; board="R2208WTTYSR"; contact="rodrigo.arias@bsc.es"; }; | ||||||
|  | 
 | ||||||
|  |     # Storage | ||||||
|  |     bay   = { pos=38; size=1; label="MDS01"; board="S2600WT2R"; sn="BQWL64850303"; contact="rodrigo.arias@bsc.es"; }; | ||||||
|  |     lake1 = { pos=37; size=1; label="OSS01"; board="S2600WT2R"; sn="BQWL64850234"; contact="rodrigo.arias@bsc.es"; }; | ||||||
|  |     lake2 = { pos=36; size=1; label="OSS02"; board="S2600WT2R"; sn="BQWL64850266"; contact="rodrigo.arias@bsc.es"; }; | ||||||
|  | 
 | ||||||
|  |     # Compute xeon | ||||||
|  |     owl1   = { pos=35; size=1; label="SSF-XEON01"; board="S2600WTTR"; sn="BQWL64954172"; contact="rodrigo.arias@bsc.es"; }; | ||||||
|  |     owl2   = { pos=34; size=1; label="SSF-XEON02"; board="S2600WTTR"; sn="BQWL64756560"; contact="rodrigo.arias@bsc.es"; }; | ||||||
|  |     xeon03 = { pos=33; size=1; label="SSF-XEON03"; board="S2600WTTR"; sn="BQWL64750826"; contact="rodrigo.arias@bsc.es"; }; | ||||||
|  |     # Slot 34 empty | ||||||
|  |     koro   = { pos=31; size=1; label="SSF-XEON05"; board="S2600WTTR"; sn="BQWL64954293"; contact="rodrigo.arias@bsc.es"; }; | ||||||
|  |     weasel = { pos=30; size=1; label="SSF-XEON06"; board="S2600WTTR"; sn="BQWL64750846"; contact="antoni.navarro@bsc.es"; }; | ||||||
|  |     hut    = { pos=29; size=1; label="SSF-XEON07"; board="S2600WTTR"; sn="BQWL64751184"; contact="rodrigo.arias@bsc.es"; }; | ||||||
|  |     eudy   = { pos=28; size=1; label="SSF-XEON08"; board="S2600WTTR"; sn="BQWL64756586"; contact="aleix.rocanonell@bsc.es"; }; | ||||||
|  | 
 | ||||||
|  |     # 16 KNL nodes, 4 per chassis | ||||||
|  |     knl01_04 = { pos=26; size=2; label="KNL01..KNL04"; board="HNS7200APX"; }; | ||||||
|  |     knl05_08 = { pos=24; size=2; label="KNL05..KNL18"; board="HNS7200APX"; }; | ||||||
|  |     knl09_12 = { pos=22; size=2; label="KNL09..KNL12"; board="HNS7200APX"; }; | ||||||
|  |     knl13_16 = { pos=20; size=2; label="KNL13..KNL16"; board="HNS7200APX"; }; | ||||||
|  | 
 | ||||||
|  |     # Slot 19 empty | ||||||
|  | 
 | ||||||
|  |     # EPI (hw team, guessed order) | ||||||
|  |     epi01 = { pos=18; size=1; contact="joan.cabre@bsc.es"; }; | ||||||
|  |     epi02 = { pos=17; size=1; contact="joan.cabre@bsc.es"; }; | ||||||
|  |     epi03 = { pos=16; size=1; contact="joan.cabre@bsc.es"; }; | ||||||
|  |     anon  = { pos=14; size=2; }; # Unlabeled machine. Operative | ||||||
|  | 
 | ||||||
|  |     # These are old and decommissioned (off) | ||||||
|  |     power8    = { pos=12; size=2; label="BSCPOWER8N3";   decommissioned=true; }; | ||||||
|  |     powern1   = { pos=8;  size=4; label="BSCPOWERN1";    decommissioned=true; }; | ||||||
|  |     gustafson = { pos=7;  size=1; label="gustafson";     decommissioned=true; }; | ||||||
|  |     odap01    = { pos=3;  size=4; label="ODAP01";        decommissioned=true; }; | ||||||
|  |     amhdal    = { pos=2;  size=1; label="AMHDAL";        decommissioned=true; }; # sic | ||||||
|  |     moore     = { pos=1;  size=1; label="moore (earth)"; decommissioned=true; }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   bsc2218 = { | ||||||
|  |     raccoon = { board="W2600CR"; sn="QSIP22500829"; contact="rodrigo.arias@bsc.es"; }; | ||||||
|  |     tent    = { label="SSF-XEON04"; board="S2600WTTR"; sn="BQWL64751229"; contact="rodrigo.arias@bsc.es"; }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   upc = { | ||||||
|  |     fox = { board="H13DSG-O-CPU"; sn="UM24CS600392"; prod="AS-4125GS-TNRT"; prod_sn="E508839X5103339"; contact="rodrigo.arias@bsc.es"; }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # NOTE: Position is specified in "U" units (44.45 mm) and starts at 1 from the | ||||||
|  |   # bottom. Example: | ||||||
|  |   # | ||||||
|  |   #  |   ...  | - [pos+size] <--- Label in chassis | ||||||
|  |   #  +--------+ | ||||||
|  |   #  |  node  | - [pos+1] | ||||||
|  |   #  |   2U   | - [pos] | ||||||
|  |   #  +------- + | ||||||
|  |   #  |   ...  | - [pos-1] | ||||||
|  |   # | ||||||
|  |   # NOTE: The board and sn refers to the FRU information (Board Product and | ||||||
|  |   # Board Serial) via `ipmitool fru print 0`. | ||||||
|  | } | ||||||
							
								
								
									
										49
									
								
								m/module/amd-uprof.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								m/module/amd-uprof.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   options = { | ||||||
|  |     services.amd-uprof = { | ||||||
|  |       enable = lib.mkOption { | ||||||
|  |         type = lib.types.bool; | ||||||
|  |         default = false; | ||||||
|  |         description = "Whether to enable AMD uProf."; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Only setup amd-uprof if enabled | ||||||
|  |   config = lib.mkIf config.services.amd-uprof.enable { | ||||||
|  | 
 | ||||||
|  |     # First make sure that we add the module to the list of available modules | ||||||
|  |     # in the kernel matching the same kernel version of this configuration. | ||||||
|  |     boot.extraModulePackages = with config.boot.kernelPackages; [ amd-uprof-driver ]; | ||||||
|  |     boot.kernelModules = [ "AMDPowerProfiler" ]; | ||||||
|  | 
 | ||||||
|  |     # Make the userspace tools available in $PATH. | ||||||
|  |     environment.systemPackages = with pkgs; [ amd-uprof ]; | ||||||
|  | 
 | ||||||
|  |     # The AMDPowerProfiler module doesn't create the /dev device nor it emits | ||||||
|  |     # any uevents, so we cannot use udev rules to automatically create the | ||||||
|  |     # device. Instead, we run a systemd unit that does it after loading the | ||||||
|  |     # modules. | ||||||
|  |     systemd.services.amd-uprof-device = { | ||||||
|  |       description = "Create /dev/AMDPowerProfiler device"; | ||||||
|  |       after = [ "systemd-modules-load.service" ]; | ||||||
|  |       wantedBy = [ "multi-user.target" ]; | ||||||
|  |       unitConfig.ConditionPathExists = [ | ||||||
|  |           "/proc/AMDPowerProfiler/device" | ||||||
|  |           "!/dev/AMDPowerProfiler" | ||||||
|  |       ]; | ||||||
|  |       serviceConfig = { | ||||||
|  |         Type = "oneshot"; | ||||||
|  |         RemainAfterExit = true; | ||||||
|  |         ExecStart = pkgs.writeShellScript "add-amd-uprof-dev.sh" '' | ||||||
|  |           mknod /dev/AMDPowerProfiler -m 666 c $(< /proc/AMDPowerProfiler/device) 0 | ||||||
|  |         ''; | ||||||
|  |         ExecStop = pkgs.writeShellScript "remove-amd-uprof-dev.sh" '' | ||||||
|  |           rm -f /dev/AMDPowerProfiler | ||||||
|  |         ''; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								m/module/ceph.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								m/module/ceph.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | { config, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | # Mounts the /ceph filesystem at boot | ||||||
|  | { | ||||||
|  |   environment.systemPackages = with pkgs; [ | ||||||
|  |     ceph-client | ||||||
|  |     fio # For benchmarks | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # We need the ceph module loaded as the mount.ceph binary fails to run the | ||||||
|  |   # modprobe command. | ||||||
|  |   boot.kernelModules = [ "ceph" ]; | ||||||
|  | 
 | ||||||
|  |   age.secrets.cephUser.file = ../../secrets/ceph-user.age; | ||||||
|  | 
 | ||||||
|  |   fileSystems."/ceph" = { | ||||||
|  |     fsType = "ceph"; | ||||||
|  |     device = "user@9c8d06e0-485f-4aaf-b16b-06d6daf1232b.cephfs=/"; | ||||||
|  |     options = [ | ||||||
|  |       "mon_addr=10.0.40.40" | ||||||
|  |       "secretfile=${config.age.secrets.cephUser.path}" | ||||||
|  |     ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										3
									
								
								m/module/debuginfod.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								m/module/debuginfod.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | { | ||||||
|  |   services.nixseparatedebuginfod.enable = true; | ||||||
|  | } | ||||||
							
								
								
									
										3
									
								
								m/module/emulation.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								m/module/emulation.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | { | ||||||
|  |   boot.binfmt.emulatedSystems = [ "armv7l-linux" "aarch64-linux" "powerpc64le-linux" "riscv64-linux" ]; | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								m/module/hut-substituter.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								m/module/hut-substituter.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | { config, ... }: | ||||||
|  | { | ||||||
|  |   nix.settings = | ||||||
|  |     # Don't add hut as a cache to itself | ||||||
|  |     assert config.networking.hostName != "hut"; | ||||||
|  |     { | ||||||
|  |       extra-substituters = [ "http://hut/cache" ]; | ||||||
|  |       extra-trusted-public-keys = [ "jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0=" ]; | ||||||
|  | 
 | ||||||
|  |       # Set a low timeout in case hut is down | ||||||
|  |       connect-timeout = 3; # seconds | ||||||
|  |     }; | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								m/module/jungle-users.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								m/module/jungle-users.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | { config, lib, ... }: | ||||||
|  | 
 | ||||||
|  | with lib; | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   options = { | ||||||
|  |     users.jungleUsers = mkOption { | ||||||
|  |       type = types.attrsOf (types.anything // { check = (x: x ? "hosts"); }); | ||||||
|  |       description = '' | ||||||
|  |         Same as users.users but with the extra `hosts` attribute, which controls | ||||||
|  |         access to the nodes by `networking.hostName`. | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   config = let | ||||||
|  |     allowedUser = host: userConf: builtins.elem host userConf.hosts; | ||||||
|  |     filterUsers = host: users: filterAttrs (n: v: allowedUser host v) users; | ||||||
|  |     removeHosts = users: mapAttrs (n: v: builtins.removeAttrs v [ "hosts" ]) users; | ||||||
|  |     currentHost = config.networking.hostName; | ||||||
|  |   in { | ||||||
|  |     users.users = removeHosts (filterUsers currentHost config.users.jungleUsers); | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								m/module/meteocat-exporter.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								m/module/meteocat-exporter.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | with lib; | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   systemd.services."prometheus-meteocat-exporter" = { | ||||||
|  |     wantedBy = [ "multi-user.target" ]; | ||||||
|  |     after = [ "network.target" ]; | ||||||
|  |     serviceConfig = { | ||||||
|  |       Restart = mkDefault "always"; | ||||||
|  |       PrivateTmp = mkDefault true; | ||||||
|  |       WorkingDirectory = mkDefault "/tmp"; | ||||||
|  |       DynamicUser = mkDefault true; | ||||||
|  |       ExecStart = "${pkgs.meteocat-exporter}/bin/meteocat-exporter"; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								m/module/monitoring.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								m/module/monitoring.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | { config, lib, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   # We need access to the devices to monitor the disk space | ||||||
|  |   systemd.services.prometheus-node-exporter.serviceConfig.PrivateDevices = lib.mkForce false; | ||||||
|  |   systemd.services.prometheus-node-exporter.serviceConfig.ProtectHome = lib.mkForce "read-only"; | ||||||
|  | 
 | ||||||
|  |   # Required to allow the smartctl exporter to read the nvme0 character device, | ||||||
|  |   # see the commit message on: | ||||||
|  |   # https://github.com/NixOS/nixpkgs/commit/12c26aca1fd55ab99f831bedc865a626eee39f80 | ||||||
|  |   services.udev.extraRules = '' | ||||||
|  |     SUBSYSTEM=="nvme", KERNEL=="nvme[0-9]*", GROUP="disk" | ||||||
|  |   ''; | ||||||
|  | 
 | ||||||
|  |   services.prometheus = { | ||||||
|  |     exporters = { | ||||||
|  |       node = { | ||||||
|  |         enable = true; | ||||||
|  |         enabledCollectors = [ "systemd" ]; | ||||||
|  |         port = 9002; | ||||||
|  |       }; | ||||||
|  |       smartctl.enable = true; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								m/module/nix-daemon-builds.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										26
									
								
								m/module/nix-daemon-builds.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | 
 | ||||||
|  | # Locate nix daemon pid | ||||||
|  | nd=$(pgrep -o nix-daemon) | ||||||
|  | 
 | ||||||
|  | # Locate children of nix-daemon | ||||||
|  | pids1=$(tr ' ' '\n' < "/proc/$nd/task/$nd/children") | ||||||
|  | 
 | ||||||
|  | # For each children, locate 2nd level children | ||||||
|  | pids2=$(echo "$pids1" | xargs -I @ /bin/sh -c 'cat /proc/@/task/*/children' | tr ' ' '\n') | ||||||
|  | 
 | ||||||
|  | cat <<EOF | ||||||
|  | HTTP/1.1 200 OK | ||||||
|  | Content-Type: text/plain; version=0.0.4; charset=utf-8; escaping=values | ||||||
|  | 
 | ||||||
|  | # HELP nix_daemon_build Nix daemon derivation build state. | ||||||
|  | # TYPE nix_daemon_build gauge | ||||||
|  | EOF | ||||||
|  | 
 | ||||||
|  | for pid in $pids2; do | ||||||
|  |   name=$(cat /proc/$pid/environ 2>/dev/null | tr '\0' '\n' | rg "^name=(.+)" - --replace '$1' | tr -dc ' [:alnum:]_\-\.') | ||||||
|  |   user=$(ps -o uname= -p "$pid") | ||||||
|  |   if [ -n "$name" -a -n "$user" ]; then | ||||||
|  |     printf 'nix_daemon_build{user="%s",name="%s"} 1\n' "$user" "$name" | ||||||
|  |   fi | ||||||
|  | done | ||||||
							
								
								
									
										23
									
								
								m/module/nix-daemon-exporter.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								m/module/nix-daemon-exporter.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | { pkgs, config, lib, ... }: | ||||||
|  | let | ||||||
|  |   script = pkgs.runCommand "nix-daemon-exporter.sh" { } | ||||||
|  |     '' | ||||||
|  |       cp ${./nix-daemon-builds.sh} $out; | ||||||
|  |       chmod +x $out | ||||||
|  |     '' | ||||||
|  |   ; | ||||||
|  | in | ||||||
|  | { | ||||||
|  |   systemd.services.nix-daemon-exporter = { | ||||||
|  |     description = "Daemon to export nix-daemon metrics"; | ||||||
|  |     path = [ pkgs.procps pkgs.ripgrep ]; | ||||||
|  |     wantedBy = [ "default.target" ]; | ||||||
|  |     serviceConfig = { | ||||||
|  |       Type = "simple"; | ||||||
|  |       ExecStart = "${pkgs.socat}/bin/socat TCP4-LISTEN:9999,fork EXEC:${script}"; | ||||||
|  |       # Needed root to read the environment, potentially unsafe | ||||||
|  |       User = "root"; | ||||||
|  |       Group = "root"; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										20
									
								
								m/module/nvidia.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								m/module/nvidia.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | |||||||
|  | { lib, config, pkgs, ... }: | ||||||
|  | { | ||||||
|  |   # Configure Nvidia driver to use with CUDA | ||||||
|  |   hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.production; | ||||||
|  |   hardware.nvidia.open = lib.mkDefault (builtins.abort "hardware.nvidia.open not set"); | ||||||
|  |   hardware.graphics.enable = true; | ||||||
|  |   nixpkgs.config.nvidia.acceptLicense = true; | ||||||
|  |   services.xserver.videoDrivers = [ "nvidia" ]; | ||||||
|  | 
 | ||||||
|  |   # enable support for derivations which require nvidia-gpu to be available | ||||||
|  |   # > requiredSystemFeatures = [ "cuda" ]; | ||||||
|  |   programs.nix-required-mounts.enable = true; | ||||||
|  |   programs.nix-required-mounts.presets.nvidia-gpu.enable = true; | ||||||
|  |   # They forgot to add the symlink | ||||||
|  |   programs.nix-required-mounts.allowedPatterns.nvidia-gpu.paths = [ | ||||||
|  |     config.systemd.tmpfiles.settings.graphics-driver."/run/opengl-driver"."L+".argument | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   environment.systemPackages = [ pkgs.cudainfo ]; | ||||||
|  | } | ||||||
							
								
								
									
										68
									
								
								m/module/p.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								m/module/p.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,68 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   cfg = config.services.p; | ||||||
|  | in | ||||||
|  | { | ||||||
|  |   options = { | ||||||
|  |     services.p = { | ||||||
|  |       enable = lib.mkOption { | ||||||
|  |         type = lib.types.bool; | ||||||
|  |         default = false; | ||||||
|  |         description = "Whether to enable the p service."; | ||||||
|  |       }; | ||||||
|  |       path = lib.mkOption { | ||||||
|  |         type = lib.types.str; | ||||||
|  |         default = "/var/lib/p"; | ||||||
|  |         description = "Where to save the pasted files on disk."; | ||||||
|  |       }; | ||||||
|  |       url = lib.mkOption { | ||||||
|  |         type = lib.types.str; | ||||||
|  |         default = "https://jungle.bsc.es/p"; | ||||||
|  |         description = "URL prefix for the printed file."; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   config = lib.mkIf cfg.enable { | ||||||
|  |     environment.systemPackages = let  | ||||||
|  |       p = pkgs.writeShellScriptBin "p" '' | ||||||
|  |         set -e | ||||||
|  |         pastedir="${cfg.path}/$USER" | ||||||
|  |         cd "$pastedir" | ||||||
|  | 
 | ||||||
|  |         ext="txt" | ||||||
|  |         if [ -n "$1" ]; then | ||||||
|  |           ext="$1" | ||||||
|  |         fi | ||||||
|  | 
 | ||||||
|  |         out=$(mktemp "XXXXXXXX.$ext") | ||||||
|  |         cat > "$out" | ||||||
|  |         chmod go+r "$out" | ||||||
|  |         echo "${cfg.url}/$USER/$out" | ||||||
|  |       ''; | ||||||
|  |     in [ p ]; | ||||||
|  | 
 | ||||||
|  |     systemd.services.p = let | ||||||
|  |       # Take only normal users | ||||||
|  |       users = lib.filterAttrs (_: v: v.isNormalUser) config.users.users; | ||||||
|  |       # Create a directory for each user | ||||||
|  |       commands = lib.concatLists (lib.mapAttrsToList (_: user: [ | ||||||
|  |         "install -d -o ${user.name} -g ${user.group} -m 0755 ${cfg.path}/${user.name}" | ||||||
|  |       ]) users); | ||||||
|  |     in { | ||||||
|  |       description = "P service setup"; | ||||||
|  |       requires = [ "network-online.target" ]; | ||||||
|  |       #wants = [ "remote-fs.target" ]; | ||||||
|  |       #after = [ "remote-fs.target" ]; | ||||||
|  |       wantedBy = [ "multi-user.target" ]; | ||||||
|  |       serviceConfig = { | ||||||
|  |         ExecStart = pkgs.writeShellScript "p-init.sh" ('' | ||||||
|  | 
 | ||||||
|  |           install -d -o root -g root -m 0755 ${cfg.path} | ||||||
|  | 
 | ||||||
|  |         '' + (lib.concatLines commands)); | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										33
									
								
								m/module/power-policy.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								m/module/power-policy.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | with lib; | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   cfg = config.power.policy; | ||||||
|  | in | ||||||
|  | { | ||||||
|  |   options = { | ||||||
|  |     power.policy = mkOption { | ||||||
|  |       type = types.nullOr (types.enum [ "always-on" "previous" "always-off" ]); | ||||||
|  |       default = null; | ||||||
|  |       description = "Set power policy to use via IPMI."; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   config = mkIf (cfg != null) { | ||||||
|  |     systemd.services."power-policy" = { | ||||||
|  |       description = "Set power policy to use via IPMI"; | ||||||
|  |       wantedBy = [ "multi-user.target" ]; | ||||||
|  |       unitConfig = { | ||||||
|  |         StartLimitBurst = "10"; | ||||||
|  |         StartLimitIntervalSec = "10m"; | ||||||
|  |       }; | ||||||
|  |       serviceConfig = { | ||||||
|  |         ExecStart = "${pkgs.ipmitool}/bin/ipmitool chassis policy ${cfg}"; | ||||||
|  |         Type = "oneshot"; | ||||||
|  |         Restart = "on-failure"; | ||||||
|  |         RestartSec = "5s"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								m/module/slurm-client.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								m/module/slurm-client.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | { lib, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ./slurm-common.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   systemd.services.slurmd.serviceConfig = { | ||||||
|  |     # Kill all processes in the control group on stop/restart. This will kill | ||||||
|  |     # all the jobs running, so ensure that we only upgrade when the nodes are | ||||||
|  |     # not in use. See: | ||||||
|  |     # https://github.com/NixOS/nixpkgs/commit/ae93ed0f0d4e7be0a286d1fca86446318c0c6ffb | ||||||
|  |     # https://bugs.schedmd.com/show_bug.cgi?id=2095#c24 | ||||||
|  |     KillMode = lib.mkForce "control-group"; | ||||||
|  | 
 | ||||||
|  |     # If slurmd fails to contact the control server it will fail, causing the | ||||||
|  |     # node to remain out of service until manually restarted. Always try to | ||||||
|  |     # restart it. | ||||||
|  |     Restart = "always"; | ||||||
|  |     RestartSec = "30s"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   services.slurm.client.enable = true; | ||||||
|  | } | ||||||
							
								
								
									
										115
									
								
								m/module/slurm-common.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								m/module/slurm-common.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,115 @@ | |||||||
|  | { config, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   suspendProgram = pkgs.writeShellScript "suspend.sh" '' | ||||||
|  |     exec 1>>/var/log/power_save.log 2>>/var/log/power_save.log | ||||||
|  |     set -x | ||||||
|  |     export "PATH=/run/current-system/sw/bin:$PATH" | ||||||
|  |     echo "$(date) Suspend invoked $0 $*" >> /var/log/power_save.log | ||||||
|  |     hosts=$(scontrol show hostnames $1) | ||||||
|  |     for host in $hosts; do | ||||||
|  |       echo Shutting down host: $host | ||||||
|  |       ipmitool -I lanplus -H ''${host}-ipmi -P "" -U "" chassis power off | ||||||
|  |     done | ||||||
|  |   ''; | ||||||
|  | 
 | ||||||
|  |   resumeProgram = pkgs.writeShellScript "resume.sh" '' | ||||||
|  |     exec 1>>/var/log/power_save.log 2>>/var/log/power_save.log | ||||||
|  |     set -x | ||||||
|  |     export "PATH=/run/current-system/sw/bin:$PATH" | ||||||
|  |     echo "$(date) Suspend invoked $0 $*" >> /var/log/power_save.log | ||||||
|  |     hosts=$(scontrol show hostnames $1) | ||||||
|  |     for host in $hosts; do | ||||||
|  |       echo Starting host: $host | ||||||
|  |       ipmitool -I lanplus -H ''${host}-ipmi -P "" -U "" chassis power on | ||||||
|  |     done | ||||||
|  |   ''; | ||||||
|  | 
 | ||||||
|  | in { | ||||||
|  |   services.slurm = { | ||||||
|  |     controlMachine = "apex"; | ||||||
|  |     clusterName = "jungle"; | ||||||
|  |     nodeName = [ | ||||||
|  |       "owl[1,2]  Sockets=2 CoresPerSocket=14 ThreadsPerCore=2 Feature=owl" | ||||||
|  |       "fox       Sockets=8 CoresPerSocket=24 ThreadsPerCore=1" | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |     partitionName = [ | ||||||
|  |       "owl Nodes=owl[1-2]     Default=YES DefaultTime=01:00:00 MaxTime=INFINITE State=UP" | ||||||
|  |       "fox Nodes=fox          Default=NO  DefaultTime=01:00:00 MaxTime=INFINITE State=UP" | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |     # See slurm.conf(5) for more details about these options. | ||||||
|  |     extraConfig = '' | ||||||
|  |       # Use PMIx for MPI by default. It works okay with MPICH and OpenMPI, but | ||||||
|  |       # not with Intel MPI. For that use the compatibility shim libpmi.so | ||||||
|  |       # setting I_MPI_PMI_LIBRARY=$pmix/lib/libpmi.so while maintaining the PMIx | ||||||
|  |       # library in SLURM (--mpi=pmix). See more details here: | ||||||
|  |       # https://pm.bsc.es/gitlab/rarias/jungle/-/issues/16 | ||||||
|  |       MpiDefault=pmix | ||||||
|  | 
 | ||||||
|  |       # When a node reboots return that node to the slurm queue as soon as it | ||||||
|  |       # becomes operative again. | ||||||
|  |       ReturnToService=2 | ||||||
|  | 
 | ||||||
|  |       # Track all processes by using a cgroup | ||||||
|  |       ProctrackType=proctrack/cgroup | ||||||
|  | 
 | ||||||
|  |       # Enable task/affinity to allow the jobs to run in a specified subset of | ||||||
|  |       # the resources. Use the task/cgroup plugin to enable process containment. | ||||||
|  |       TaskPlugin=task/affinity,task/cgroup | ||||||
|  | 
 | ||||||
|  |       # Power off unused nodes until they are requested | ||||||
|  |       SuspendProgram=${suspendProgram} | ||||||
|  |       SuspendTimeout=60 | ||||||
|  |       ResumeProgram=${resumeProgram} | ||||||
|  |       ResumeTimeout=300 | ||||||
|  |       SuspendExcNodes=fox | ||||||
|  | 
 | ||||||
|  |       # Turn the nodes off after 1 hour of inactivity | ||||||
|  |       SuspendTime=3600 | ||||||
|  | 
 | ||||||
|  |       # Reduce port range so we can allow only this range in the firewall | ||||||
|  |       SrunPortRange=60000-61000 | ||||||
|  | 
 | ||||||
|  |       # Use cores as consumable resources. In SLURM terms, a core may have | ||||||
|  |       # multiple hardware threads (or CPUs). | ||||||
|  |       SelectType=select/cons_tres | ||||||
|  | 
 | ||||||
|  |       # Ignore memory constraints and only use unused cores to share a node with | ||||||
|  |       # other jobs. | ||||||
|  |       SelectTypeParameters=CR_Core | ||||||
|  | 
 | ||||||
|  |       # Required for pam_slurm_adopt, see https://slurm.schedmd.com/pam_slurm_adopt.html | ||||||
|  |       # This sets up the "extern" step into which ssh-launched processes will be | ||||||
|  |       # adopted. Alloc runs the prolog at job allocation (salloc) rather than | ||||||
|  |       # when a task runs (srun) so we can ssh early. | ||||||
|  |       PrologFlags=Alloc,Contain,X11 | ||||||
|  | 
 | ||||||
|  |       # LaunchParameters=ulimit_pam_adopt will set RLIMIT_RSS in processes | ||||||
|  |       # adopted by the external step, similar to tasks running in regular steps | ||||||
|  |       # LaunchParameters=ulimit_pam_adopt | ||||||
|  |       SlurmdDebug=debug5 | ||||||
|  |       #DebugFlags=Protocol,Cgroup | ||||||
|  |     ''; | ||||||
|  | 
 | ||||||
|  |     extraCgroupConfig = '' | ||||||
|  |       CgroupPlugin=cgroup/v2 | ||||||
|  |       #ConstrainCores=yes | ||||||
|  |     ''; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Place the slurm config in /etc as this will be required by PAM | ||||||
|  |   environment.etc.slurm.source = config.services.slurm.etcSlurm; | ||||||
|  | 
 | ||||||
|  |   age.secrets.mungeKey = { | ||||||
|  |     file = ../../secrets/munge-key.age; | ||||||
|  |     owner = "munge"; | ||||||
|  |     group = "munge"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   services.munge = { | ||||||
|  |     enable = true; | ||||||
|  |     password = config.age.secrets.mungeKey.path; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										28
									
								
								m/module/slurm-exporter.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								m/module/slurm-exporter.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | # See also: https://github.com/NixOS/nixpkgs/pull/112010 | ||||||
|  | # And: https://github.com/NixOS/nixpkgs/pull/115839 | ||||||
|  | 
 | ||||||
|  | with lib; | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   systemd.services."prometheus-slurm-exporter" = { | ||||||
|  |     wantedBy = [ "multi-user.target" ]; | ||||||
|  |     after = [ "network.target" ]; | ||||||
|  |     serviceConfig = { | ||||||
|  |       Restart = mkDefault "always"; | ||||||
|  |       PrivateTmp = mkDefault true; | ||||||
|  |       WorkingDirectory = mkDefault "/tmp"; | ||||||
|  |       DynamicUser = mkDefault true; | ||||||
|  |       ExecStart = '' | ||||||
|  |         ${pkgs.prometheus-slurm-exporter}/bin/prometheus-slurm-exporter --listen-address "127.0.0.1:9341" | ||||||
|  |       ''; | ||||||
|  |       Environment = [ | ||||||
|  |         "PATH=${pkgs.slurm}/bin" | ||||||
|  |         # We need to specify the slurm config to be able to talk to the slurmd | ||||||
|  |         # daemon. | ||||||
|  |         "SLURM_CONF=${config.services.slurm.etcSlurm}/slurm.conf" | ||||||
|  |       ]; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								m/module/slurm-firewall.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								m/module/slurm-firewall.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | { ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   networking.firewall = { | ||||||
|  |     # Required for PMIx in SLURM, we should find a better way | ||||||
|  |     allowedTCPPortRanges = [ { from=1024; to=65535; } ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										19
									
								
								m/module/slurm-hut-nix-store.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								m/module/slurm-hut-nix-store.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | |||||||
|  | { ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   # Mount the hut nix store via NFS | ||||||
|  |   fileSystems."/mnt/hut-nix-store" = { | ||||||
|  |     device = "hut:/nix/store"; | ||||||
|  |     fsType = "nfs"; | ||||||
|  |     options = [ "ro" ]; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   systemd.services.slurmd.serviceConfig = { | ||||||
|  |     # When running a job, bind the hut store in /nix/store so the paths are | ||||||
|  |     # available too. | ||||||
|  |     # FIXME: This doesn't keep the programs in /run/current-system/sw/bin | ||||||
|  |     # available in the store. Ideally they should be merged but the overlay FS | ||||||
|  |     # doesn't work when the underlying directories change. | ||||||
|  |     BindReadOnlyPaths = "/mnt/hut-nix-store:/nix/store"; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								m/module/slurm-server.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								m/module/slurm-server.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | { ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ./slurm-common.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   services.slurm.server.enable = true; | ||||||
|  | 
 | ||||||
|  |   networking.firewall = { | ||||||
|  |     extraCommands = '' | ||||||
|  |       # Accept slurm connections to controller from compute nodes | ||||||
|  |       iptables -A nixos-fw -p tcp -s 10.0.40.0/24 --dport 6817 -j nixos-fw-accept | ||||||
|  |       # Accept slurm connections from compute nodes for srun | ||||||
|  |       iptables -A nixos-fw -p tcp -s 10.0.40.0/24 --dport 60000:61000 -j nixos-fw-accept | ||||||
|  | 
 | ||||||
|  |       # Accept slurm connections to controller from fox (via wireguard) | ||||||
|  |       iptables -A nixos-fw -p tcp -i wg0 -s 10.106.0.1/32 --dport 6817 -j nixos-fw-accept | ||||||
|  |       # Accept slurm connections from fox for srun (via wireguard) | ||||||
|  |       iptables -A nixos-fw -p tcp -i wg0 -s 10.106.0.1/32 --dport 60000:61000 -j nixos-fw-accept | ||||||
|  |     ''; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								m/module/upc-qaire-exporter.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								m/module/upc-qaire-exporter.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | with lib; | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   systemd.services."prometheus-upc-qaire-exporter" = { | ||||||
|  |     wantedBy = [ "multi-user.target" ]; | ||||||
|  |     after = [ "network.target" ]; | ||||||
|  |     serviceConfig = { | ||||||
|  |       Restart = mkDefault "always"; | ||||||
|  |       PrivateTmp = mkDefault true; | ||||||
|  |       WorkingDirectory = mkDefault "/tmp"; | ||||||
|  |       DynamicUser = mkDefault true; | ||||||
|  |       ExecStart = "${pkgs.upc-qaire-exporter}/bin/upc-qaire-exporter"; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										35
									
								
								m/module/vpn-dac.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								m/module/vpn-dac.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | |||||||
|  | {config, ...}: | ||||||
|  | { | ||||||
|  |   age.secrets.vpn-dac-login.file = ../../secrets/vpn-dac-login.age; | ||||||
|  |   age.secrets.vpn-dac-client-key.file = ../../secrets/vpn-dac-client-key.age; | ||||||
|  | 
 | ||||||
|  |   services.openvpn.servers = { | ||||||
|  |     # systemctl status openvpn-dac.service | ||||||
|  |     dac = { | ||||||
|  |       config = '' | ||||||
|  |         client | ||||||
|  |         dev tun | ||||||
|  |         proto tcp | ||||||
|  |         remote vpn.ac.upc.edu 1194 | ||||||
|  |         remote vpn.ac.upc.edu 80 | ||||||
|  |         resolv-retry infinite | ||||||
|  |         nobind | ||||||
|  |         persist-key | ||||||
|  |         persist-tun | ||||||
|  |         ca ${./vpn-dac/ca.crt} | ||||||
|  |         cert ${./vpn-dac/client.crt} | ||||||
|  |         # Only key needs to be secret | ||||||
|  |         key ${config.age.secrets.vpn-dac-client-key.path} | ||||||
|  |         remote-cert-tls server | ||||||
|  |         comp-lzo | ||||||
|  |         verb 3 | ||||||
|  |         auth-user-pass ${config.age.secrets.vpn-dac-login.path} | ||||||
|  |         reneg-sec 0 | ||||||
|  | 
 | ||||||
|  |         # Only route fox-ipmi | ||||||
|  |         pull-filter ignore "route " | ||||||
|  |         route 147.83.35.27 255.255.255.255 | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										31
									
								
								m/module/vpn-dac/ca.crt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								m/module/vpn-dac/ca.crt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | -----BEGIN CERTIFICATE----- | ||||||
|  | MIIFUjCCBDqgAwIBAgIJAJH118PApk5hMA0GCSqGSIb3DQEBCwUAMIHLMQswCQYD | ||||||
|  | VQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx | ||||||
|  | LTArBgNVBAoTJFVuaXZlcnNpdGF0IFBvbGl0ZWNuaWNhIGRlIENhdGFsdW55YTEk | ||||||
|  | MCIGA1UECxMbQXJxdWl0ZWN0dXJhIGRlIENvbXB1dGFkb3JzMRAwDgYDVQQDEwdM | ||||||
|  | Q0FDIENBMQ0wCwYDVQQpEwRMQ0FDMR4wHAYJKoZIhvcNAQkBFg9sY2FjQGFjLnVw | ||||||
|  | Yy5lZHUwHhcNMTYwMTEyMTI0NDIxWhcNNDYwMTEyMTI0NDIxWjCByzELMAkGA1UE | ||||||
|  | BhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS0w | ||||||
|  | KwYDVQQKEyRVbml2ZXJzaXRhdCBQb2xpdGVjbmljYSBkZSBDYXRhbHVueWExJDAi | ||||||
|  | BgNVBAsTG0FycXVpdGVjdHVyYSBkZSBDb21wdXRhZG9yczEQMA4GA1UEAxMHTENB | ||||||
|  | QyBDQTENMAsGA1UEKRMETENBQzEeMBwGCSqGSIb3DQEJARYPbGNhY0BhYy51cGMu | ||||||
|  | ZWR1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0CteSeof7Xwi51kC | ||||||
|  | F0nQ4E9iR5Lq7wtfRuVPn6JJcIxJJ6+F9gr4R/HIHTztW4XAzReE36DYfexupx3D | ||||||
|  | 6UgQIkMLlVyGqRbulNF+RnCx20GosF7Dm4RGBVvOxBP1PGjYq/A+XhaaDAFd0cOF | ||||||
|  | LMNkzuYP7PF0bnBEaHnxmN8bPmuyDyas7fK9AAc3scyWT2jSBPbOVFvCJwPg8MH9 | ||||||
|  | V/h+hKwL/7hRt1MVfVv2qyIuKwTki8mUt0RcVbP7oJoRY5K1+R52phIz/GL/b4Fx | ||||||
|  | L6MKXlQxLi8vzP4QZXgCMyV7oFNdU3VqCEXBA11YIRvsOZ4QS19otIk/ZWU5x+HH | ||||||
|  | LAIJ7wIDAQABo4IBNTCCATEwHQYDVR0OBBYEFNyezX1cH1N4QR14ebBpljqmtE7q | ||||||
|  | MIIBAAYDVR0jBIH4MIH1gBTcns19XB9TeEEdeHmwaZY6prRO6qGB0aSBzjCByzEL | ||||||
|  | MAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs | ||||||
|  | b25hMS0wKwYDVQQKEyRVbml2ZXJzaXRhdCBQb2xpdGVjbmljYSBkZSBDYXRhbHVu | ||||||
|  | eWExJDAiBgNVBAsTG0FycXVpdGVjdHVyYSBkZSBDb21wdXRhZG9yczEQMA4GA1UE | ||||||
|  | AxMHTENBQyBDQTENMAsGA1UEKRMETENBQzEeMBwGCSqGSIb3DQEJARYPbGNhY0Bh | ||||||
|  | Yy51cGMuZWR1ggkAkfXXw8CmTmEwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsF | ||||||
|  | AAOCAQEAUAmOvVXIQrR+aZVO0bOTeugKBHB75eTIZSIHIn2oDUvDbAP5GXIJ56A1 | ||||||
|  | 6mZXxemSMY8/9k+pRcwJhfat3IgvAN159XSqf9kRv0NHgc3FWUI1Qv/BsAn0vJO/ | ||||||
|  | oK0dbmbbRWqt86qNrCN+cUfz5aovvxN73jFfnvfDQFBk/8enj9wXxYfokjjLPR1Q | ||||||
|  | +oTkH8dY68qf71oaUB9MndppPEPSz0K1S6h1XxvJoSu9MVSXOQHiq1cdZdxRazI3 | ||||||
|  | 4f7q9sTCL+khwDAuZxAYzlEYxFFa/NN8PWU6xPw6V+t/aDhOiXUPJQB/O/K7mw3Z | ||||||
|  | TQQx5NqM7B5jjak5fauR3/oRD8XXsA== | ||||||
|  | -----END CERTIFICATE----- | ||||||
							
								
								
									
										100
									
								
								m/module/vpn-dac/client.crt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								m/module/vpn-dac/client.crt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,100 @@ | |||||||
|  | Certificate: | ||||||
|  |     Data: | ||||||
|  |         Version: 3 (0x2) | ||||||
|  |         Serial Number: 2 (0x2) | ||||||
|  |     Signature Algorithm: sha256WithRSAEncryption | ||||||
|  |         Issuer: C=ES, ST=Barcelona, L=Barcelona, O=Universitat Politecnica de Catalunya, OU=Arquitectura de Computadors, CN=LCAC CA/name=LCAC/emailAddress=lcac@ac.upc.edu | ||||||
|  |         Validity | ||||||
|  |             Not Before: Jan 12 12:45:41 2016 GMT | ||||||
|  |             Not After : Jan 12 12:45:41 2046 GMT | ||||||
|  |         Subject: C=ES, ST=Barcelona, L=Barcelona, O=Universitat Politecnica de Catalunya, OU=Arquitectura de Computadors, CN=client/name=LCAC/emailAddress=lcac@ac.upc.edu | ||||||
|  |         Subject Public Key Info: | ||||||
|  |             Public Key Algorithm: rsaEncryption | ||||||
|  |                 Public-Key: (2048 bit) | ||||||
|  |                 Modulus: | ||||||
|  |                     00:97:99:fa:7a:0e:4d:e2:1d:a5:b1:a8:14:18:64: | ||||||
|  |                     c7:66:bf:de:99:1d:92:3b:86:82:4d:95:39:f7:a6: | ||||||
|  |                     56:49:97:14:4f:e3:37:00:6c:f4:d0:1d:56:79:e7: | ||||||
|  |                     19:b5:dd:36:15:8e:1d:57:7b:59:29:d2:11:bf:58: | ||||||
|  |                     48:e0:f7:41:3d:16:64:8d:a2:0b:4a:ac:fa:c6:83: | ||||||
|  |                     dc:10:2a:2c:d9:97:48:ee:11:2a:bc:4b:60:dd:b9: | ||||||
|  |                     2e:8f:45:ca:87:0b:38:65:1c:f8:a2:1d:f9:50:aa: | ||||||
|  |                     6e:60:f9:48:df:57:12:23:e1:e7:0c:81:5c:9f:c5: | ||||||
|  |                     b2:e6:99:99:95:30:6d:57:36:06:8c:fd:fb:f9:4f: | ||||||
|  |                     60:d2:3c:ba:ae:28:56:2f:da:58:5c:e8:c5:7b:ec: | ||||||
|  |                     76:d9:28:6e:fb:8c:07:f9:d7:23:c3:72:76:3c:fa: | ||||||
|  |                     dc:20:67:8f:cc:16:e0:91:07:d5:68:f9:20:4d:7d: | ||||||
|  |                     5c:2d:02:04:16:76:52:f3:53:be:a3:dc:0d:d5:fb: | ||||||
|  |                     6b:55:29:f3:52:35:c8:7d:99:d1:4a:94:be:b1:8e: | ||||||
|  |                     fd:85:18:25:eb:41:e9:56:da:af:62:84:20:0a:00: | ||||||
|  |                     17:94:92:94:91:6a:f8:54:37:17:ee:1e:bb:fb:93: | ||||||
|  |                     71:91:d9:e4:e9:b8:3b:18:7d:6d:7d:4c:ce:58:55: | ||||||
|  |                     f9:41 | ||||||
|  |                 Exponent: 65537 (0x10001) | ||||||
|  |         X509v3 extensions: | ||||||
|  |             X509v3 Basic Constraints:  | ||||||
|  |                 CA:FALSE | ||||||
|  |             Netscape Comment:  | ||||||
|  |                 Easy-RSA Generated Certificate | ||||||
|  |             X509v3 Subject Key Identifier:  | ||||||
|  |                 1B:88:06:D5:33:1D:5C:48:46:B5:DE:78:89:36:96:91:3A:74:43:18 | ||||||
|  |             X509v3 Authority Key Identifier:  | ||||||
|  |                 keyid:DC:9E:CD:7D:5C:1F:53:78:41:1D:78:79:B0:69:96:3A:A6:B4:4E:EA | ||||||
|  |                 DirName:/C=ES/ST=Barcelona/L=Barcelona/O=Universitat Politecnica de Catalunya/OU=Arquitectura de Computadors/CN=LCAC CA/name=LCAC/emailAddress=lcac@ac.upc.edu | ||||||
|  |                 serial:91:F5:D7:C3:C0:A6:4E:61 | ||||||
|  | 
 | ||||||
|  |             X509v3 Extended Key Usage:  | ||||||
|  |                 TLS Web Client Authentication | ||||||
|  |             X509v3 Key Usage:  | ||||||
|  |                 Digital Signature | ||||||
|  |             X509v3 Subject Alternative Name:  | ||||||
|  |                 DNS:client | ||||||
|  |     Signature Algorithm: sha256WithRSAEncryption | ||||||
|  |          42:e8:50:b2:e7:88:75:86:0b:bb:29:e3:aa:c6:0e:4c:e8:ea: | ||||||
|  |          3d:0c:02:31:7f:3b:80:0c:3f:80:af:45:d6:62:27:a0:0e:e7: | ||||||
|  |          26:09:12:97:95:f8:d9:9b:89:b5:ef:56:64:f1:de:82:74:e0: | ||||||
|  |          31:0a:cc:90:0a:bd:50:b8:54:95:0a:ae:3b:40:df:76:b6:d1: | ||||||
|  |          01:2e:f3:96:9f:52:d4:e9:14:6d:b7:14:9d:45:99:33:36:2a: | ||||||
|  |          01:0b:15:1a:ed:55:dc:64:83:65:1a:06:42:d9:c7:dc:97:d4: | ||||||
|  |          02:81:c2:58:2b:ea:e4:b7:ae:84:3a:e4:3f:f1:2e:fa:ec:f3: | ||||||
|  |          40:5d:b8:6a:d5:5e:e1:e8:2f:e2:2f:48:a4:38:a1:4f:22:e3: | ||||||
|  |          4f:66:94:aa:02:78:9a:2b:7a:5d:aa:aa:51:a5:e3:d0:91:e9: | ||||||
|  |          1d:f9:08:ed:8b:51:c9:a6:af:46:85:b5:1c:ed:12:a1:28:33: | ||||||
|  |          75:36:00:d8:5c:14:65:96:c0:28:7d:47:50:a4:89:5f:b0:72: | ||||||
|  |          1a:4b:13:17:26:0f:f0:b8:65:3c:e9:96:36:f9:bf:90:59:33: | ||||||
|  |          87:1f:01:03:25:f8:f0:3a:9b:33:02:d0:0a:43:b5:0a:cf:62: | ||||||
|  |          a1:45:38:37:07:9d:9c:94:0b:31:c6:3c:34:b7:fc:5a:0c:e4: | ||||||
|  |          bf:23:f6:7d | ||||||
|  | -----BEGIN CERTIFICATE----- | ||||||
|  | MIIFqjCCBJKgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCByzELMAkGA1UEBhMCRVMx | ||||||
|  | EjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS0wKwYDVQQK | ||||||
|  | EyRVbml2ZXJzaXRhdCBQb2xpdGVjbmljYSBkZSBDYXRhbHVueWExJDAiBgNVBAsT | ||||||
|  | G0FycXVpdGVjdHVyYSBkZSBDb21wdXRhZG9yczEQMA4GA1UEAxMHTENBQyBDQTEN | ||||||
|  | MAsGA1UEKRMETENBQzEeMBwGCSqGSIb3DQEJARYPbGNhY0BhYy51cGMuZWR1MB4X | ||||||
|  | DTE2MDExMjEyNDU0MVoXDTQ2MDExMjEyNDU0MVowgcoxCzAJBgNVBAYTAkVTMRIw | ||||||
|  | EAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEtMCsGA1UEChMk | ||||||
|  | VW5pdmVyc2l0YXQgUG9saXRlY25pY2EgZGUgQ2F0YWx1bnlhMSQwIgYDVQQLExtB | ||||||
|  | cnF1aXRlY3R1cmEgZGUgQ29tcHV0YWRvcnMxDzANBgNVBAMTBmNsaWVudDENMAsG | ||||||
|  | A1UEKRMETENBQzEeMBwGCSqGSIb3DQEJARYPbGNhY0BhYy51cGMuZWR1MIIBIjAN | ||||||
|  | BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl5n6eg5N4h2lsagUGGTHZr/emR2S | ||||||
|  | O4aCTZU596ZWSZcUT+M3AGz00B1WeecZtd02FY4dV3tZKdIRv1hI4PdBPRZkjaIL | ||||||
|  | Sqz6xoPcECos2ZdI7hEqvEtg3bkuj0XKhws4ZRz4oh35UKpuYPlI31cSI+HnDIFc | ||||||
|  | n8Wy5pmZlTBtVzYGjP37+U9g0jy6rihWL9pYXOjFe+x22Shu+4wH+dcjw3J2PPrc | ||||||
|  | IGePzBbgkQfVaPkgTX1cLQIEFnZS81O+o9wN1ftrVSnzUjXIfZnRSpS+sY79hRgl | ||||||
|  | 60HpVtqvYoQgCgAXlJKUkWr4VDcX7h67+5Nxkdnk6bg7GH1tfUzOWFX5QQIDAQAB | ||||||
|  | o4IBljCCAZIwCQYDVR0TBAIwADAtBglghkgBhvhCAQ0EIBYeRWFzeS1SU0EgR2Vu | ||||||
|  | ZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBQbiAbVMx1cSEa13niJNpaROnRD | ||||||
|  | GDCCAQAGA1UdIwSB+DCB9YAU3J7NfVwfU3hBHXh5sGmWOqa0TuqhgdGkgc4wgcsx | ||||||
|  | CzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNl | ||||||
|  | bG9uYTEtMCsGA1UEChMkVW5pdmVyc2l0YXQgUG9saXRlY25pY2EgZGUgQ2F0YWx1 | ||||||
|  | bnlhMSQwIgYDVQQLExtBcnF1aXRlY3R1cmEgZGUgQ29tcHV0YWRvcnMxEDAOBgNV | ||||||
|  | BAMTB0xDQUMgQ0ExDTALBgNVBCkTBExDQUMxHjAcBgkqhkiG9w0BCQEWD2xjYWNA | ||||||
|  | YWMudXBjLmVkdYIJAJH118PApk5hMBMGA1UdJQQMMAoGCCsGAQUFBwMCMAsGA1Ud | ||||||
|  | DwQEAwIHgDARBgNVHREECjAIggZjbGllbnQwDQYJKoZIhvcNAQELBQADggEBAELo | ||||||
|  | ULLniHWGC7sp46rGDkzo6j0MAjF/O4AMP4CvRdZiJ6AO5yYJEpeV+NmbibXvVmTx | ||||||
|  | 3oJ04DEKzJAKvVC4VJUKrjtA33a20QEu85afUtTpFG23FJ1FmTM2KgELFRrtVdxk | ||||||
|  | g2UaBkLZx9yX1AKBwlgr6uS3roQ65D/xLvrs80BduGrVXuHoL+IvSKQ4oU8i409m | ||||||
|  | lKoCeJorel2qqlGl49CR6R35CO2LUcmmr0aFtRztEqEoM3U2ANhcFGWWwCh9R1Ck | ||||||
|  | iV+wchpLExcmD/C4ZTzpljb5v5BZM4cfAQMl+PA6mzMC0ApDtQrPYqFFODcHnZyU | ||||||
|  | CzHGPDS3/FoM5L8j9n0= | ||||||
|  | -----END CERTIFICATE----- | ||||||
							
								
								
									
										28
									
								
								m/owl1/configuration.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								m/owl1/configuration.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | |||||||
|  | { config, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../common/ssf.nix | ||||||
|  |     ../module/ceph.nix | ||||||
|  |     ../module/emulation.nix | ||||||
|  |     ../module/slurm-client.nix | ||||||
|  |     ../module/slurm-firewall.nix | ||||||
|  |     ../module/debuginfod.nix | ||||||
|  |     ../module/hut-substituter.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Select the this using the ID to avoid mismatches | ||||||
|  |   boot.loader.grub.device = "/dev/disk/by-id/wwn-0x55cd2e414d53566c"; | ||||||
|  | 
 | ||||||
|  |   networking = { | ||||||
|  |     hostName = "owl1"; | ||||||
|  |     interfaces.eno1.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.40.1"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |     interfaces.ibp5s0.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.42.1"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										29
									
								
								m/owl2/configuration.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								m/owl2/configuration.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | { config, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../common/ssf.nix | ||||||
|  |     ../module/ceph.nix | ||||||
|  |     ../module/emulation.nix | ||||||
|  |     ../module/slurm-client.nix | ||||||
|  |     ../module/slurm-firewall.nix | ||||||
|  |     ../module/debuginfod.nix | ||||||
|  |     ../module/hut-substituter.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Select the this using the ID to avoid mismatches | ||||||
|  |   boot.loader.grub.device = "/dev/disk/by-id/wwn-0x55cd2e414d535629"; | ||||||
|  | 
 | ||||||
|  |   networking = { | ||||||
|  |     hostName = "owl2"; | ||||||
|  |     interfaces.eno1.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.40.2"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |     # Watch out! The OmniPath device is not in the same place here: | ||||||
|  |     interfaces.ibp129s0.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.42.2"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										98
									
								
								m/raccoon/configuration.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								m/raccoon/configuration.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,98 @@ | |||||||
|  | { config, pkgs, lib, modulesPath, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../common/base.nix | ||||||
|  |     ../common/ssf/hosts.nix | ||||||
|  |     ../module/emulation.nix | ||||||
|  |     ../module/debuginfod.nix | ||||||
|  |     ../module/nvidia.nix | ||||||
|  |     ../eudy/kernel/perf.nix | ||||||
|  |     ./wireguard.nix | ||||||
|  |     ../module/hut-substituter.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Don't install Grub on the disk yet | ||||||
|  |   boot.loader.grub.device = "nodev"; | ||||||
|  | 
 | ||||||
|  |   # Enable serial console | ||||||
|  |   boot.kernelParams = [ | ||||||
|  |     "console=tty1" | ||||||
|  |     "console=ttyS1,115200" | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   networking = { | ||||||
|  |     hostName = "raccoon"; | ||||||
|  |     # Only BSC DNSs seem to be reachable from the office VLAN | ||||||
|  |     nameservers = [ "84.88.52.35" "84.88.52.36" ]; | ||||||
|  |     defaultGateway = "84.88.51.129"; | ||||||
|  |     interfaces.eno0.ipv4.addresses = [ { | ||||||
|  |       address = "84.88.51.152"; | ||||||
|  |       prefixLength = 25; | ||||||
|  |     } ]; | ||||||
|  |     interfaces.enp5s0f1.ipv4.addresses = [ { | ||||||
|  |       address = "10.0.44.1"; | ||||||
|  |       prefixLength = 24; | ||||||
|  |     } ]; | ||||||
|  |     nat = { | ||||||
|  |       enable = true; | ||||||
|  |       internalInterfaces = [ "enp5s0f1" ]; | ||||||
|  |       externalInterface = "eno0"; | ||||||
|  |     }; | ||||||
|  |     hosts = { | ||||||
|  |       "10.0.44.4" = [ "tent" ]; | ||||||
|  |       "84.88.53.236" = [ "apex" ]; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Mount the NFS home | ||||||
|  |   fileSystems."/nfs/home" = { | ||||||
|  |     device = "10.106.0.30:/home"; | ||||||
|  |     fsType = "nfs"; | ||||||
|  |     options = [ "nfsvers=3" "rsize=1024" "wsize=1024" "cto" "nofail" ]; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Enable performance governor | ||||||
|  |   powerManagement.cpuFreqGovernor = "performance"; | ||||||
|  | 
 | ||||||
|  |   hardware.nvidia.open = false; # Maxwell is older than Turing architecture | ||||||
|  | 
 | ||||||
|  |   services.openssh.settings.X11Forwarding = true; | ||||||
|  | 
 | ||||||
|  |   services.prometheus.exporters.node = { | ||||||
|  |     enable = true; | ||||||
|  |     enabledCollectors = [ "systemd" ]; | ||||||
|  |     port = 9002; | ||||||
|  |     listenAddress = "127.0.0.1"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   users.motd = '' | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⣀⣀⣄⣠⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⢰⠇⡀⠀⠙⠻⡿⣦⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⡎⢰⣧⠀⠀⠀⠁⠈⠛⢿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⡦⠶⠟⠓⠚⠻⡄⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⣧⠀⣱⣀⣰⣧⠀⢀⠀⣘⣿⣿⣦⣶⣄⣠⡀⠀⠀⣀⣀⣤⣴⣄⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⠿⠏⠁⠀⣀⣠⣶⣿⡶⣿⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⣹⣆⠘⣿⣿⣿⣇⢸⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣦⡀⣀⣤⣠⣤⡾⠋⠀⢀⣤⣶⣿⣿⣿⣿⣿⣿⣿⡀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠘⢿⡄⢼⣿⣿⣿⣿⣿⡟⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣵⣾⡾⠙⣋⣩⣽⣿⣿⣿⣿⢋⡼⠁ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⠈⢻⣄⠸⢿⣿⣿⠿⠷⠀⠈⠀⣭⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿⣿⠇⡼⠁⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⠀⢾⣯⡀⠀⢼⡿⠀⠀⠀⢼⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⡿⣿⣿⣿⠿⣿⣯⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢋⡼⠁⠀⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡏⠠⣦⠁⠀⠀⠀⠀⠀⠟⠛⠛⣿⣿⣿⣿⣿⠿⠁⠀⠁⢿⠙⠁⠀⠛⠹⣿⣏⣾⣿⣿⣿⣿⣿⣿⣿⣿⠿⠃⣹⠁⠀⠀⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣘⣧⠀⠙⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⡿⡿⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⠀⢹⣿⠿⢿⣿⣿⣿⣿⣿⠋⢀⡤⠛⠀⠀⠀⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡯⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⢸⣿⣿⣿⠛⠉⠀⣰⠷⠀⠀⠀⠀⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠇⠀⠀⠀⠀⠀⢀⣿⡇⠀⠀⢻⣿⣿⠁⠀⠀⢠⣾⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⠟⢿⣿⣄⡀⢸⣿⡀⠀⠀⠀⠀⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⠀⠀⠀⢰⣿⣿⡛⣿⣿⡄⢠⡺⠿⡍⠁⢀⣤⣿⣿⣿⠿⣷⣮⣉⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⠀⠀⠈⣧⠀⠀⠀⠀⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⠀⢾⠉⠃⠀⣴⣿⣟⠻⣿⣿⣿⡇⢸⣿⣶⠀⢀⣾⣿⣿⣟⠿⣷⣾⣿⣿⣿⣿⣦⣤⣤⡤⠀⠀⠀⠀⠀⠁⠀⠀⠀⣼⠗⠀⠀⠀⠀ | ||||||
|  |     ⠀⠀⠐⢄⡀⠀⠀⠀⢘⡀⠀⢶⣾⣿⣿⣿⣿⡿⠋⠁⠈⠻⠉⠀⠚⠻⣿⣿⣿⣶⣾⣿⣿⣿⣿⣿⣿⣷⣬⣤⣶⣦⡀⣾⣶⣇⠀⠀⠈⢉⣷⠀⠀⠀⠀ | ||||||
|  |     ⠀⠀⠀⠀⠈⠓⠶⢦⡽⠄⣈⣿⣿⣿⣿⣿⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡓⠙⣿⡟⠀⠀⠀⠈⠛⣷⣶⡄⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⢀⣬⠆⢠⣍⣛⠻⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣉⣀⡀⠀⠀⠈⠛⢿⣦⡀ | ||||||
|  |     ⠐⠒⠒⠶⠶⠶⢦⣬⣟⣥⣀⡉⠛⠻⠶⢁⣤⣾⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣟⡛⠿⠭⠭⠭⠭⠭⠿⠿⠿⢿⣿⣟⠃⠀⠀⠀⠹⣟⠓ | ||||||
|  |     ⠀⣀⣠⠤⠤⢤⣤⣾⣤⡄⣉⣉⣙⣓⡂⣿⣿⣭⣹⣿⣿⣿⣿⡰⣂⣀⢀⠀⠻⣿⠛⠻⠟⠡⣶⣾⣿⣿⣿⣿⣿⣿⣿⡖⠒⠒⠒⠛⠷⢤⡀⢰⣴⣿⡆ | ||||||
|  |     ⠀⠀⠀⢀⣠⡴⠾⠟⠻⣟⡉⠉⠉⠉⢁⢿⣿⣿⣿⣿⣿⣿⡿⣱⣿⣭⡌⠤⠀⠀⠐⣶⣌⡻⣶⣭⡻⢿⣿⣿⣿⣿⣿⣯⣥⣤⣦⠀⠠⣴⣶⣶⣿⡟⢿ | ||||||
|  |     ⢀⠔⠊⠉⠀⠀⠀⠀⢸⣯⣤⠀⠀⠠⣼⣮⣟⣿⣿⣿⣻⣭⣾⣿⣿⣷⣶⣦⠶⣚⣾⣿⣿⣷⣜⣿⣿⣶⣝⢿⣿⣿⣿⣿⣷⣦⣄⣰⡄⠈⢿⣿⡿⣇⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⠀⠈⢡⢇⠀⠀⣠⣿⣿⣿⣯⣟⣛⣛⣛⣛⣛⣩⣭⣴⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣻⣿⣧⠀⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠏⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣍⣿⣿⣿⣿⡄⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣾⡁⢈⣾⣿⡿⠛⣛⣿⣿⣿⣿ DO YOU BRING FEEDS? ⣿⣿⣿⣿⣿⣿⡏⠈⠙⠈⠁⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠛⡿⠛⠉⣽⣿⣷⣾⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠷⠌⠛⠉⠀⠁⠀⠀⠀⠀⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠹⠋⠀⢻⣿⣿⣿⣿⠿⢿⣿⣿⣿⣿⣿⣿⠿⣿⣿⣿⣿⠿⠛⠋⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ | ||||||
|  |     ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠁⠀⠀⠀⠀⠀⠈⠉⠉⠀⠀⠈⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀  | ||||||
|  |   ''; | ||||||
|  | } | ||||||
							
								
								
									
										48
									
								
								m/raccoon/wireguard.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								m/raccoon/wireguard.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | |||||||
|  | { config, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   networking.nat = { | ||||||
|  |     enable = true; | ||||||
|  |     enableIPv6 = false; | ||||||
|  |     externalInterface = "eno0"; | ||||||
|  |     internalInterfaces = [ "wg0" ]; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   networking.firewall = { | ||||||
|  |     allowedUDPPorts = [ 666 ]; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   age.secrets.wgRaccoon.file = ../../secrets/wg-raccoon.age; | ||||||
|  | 
 | ||||||
|  |   # Enable WireGuard | ||||||
|  |   networking.wireguard.enable = true; | ||||||
|  |   networking.wireguard.interfaces = { | ||||||
|  |     wg0 = { | ||||||
|  |       ips = [ "10.106.0.236/24" ]; | ||||||
|  |       listenPort = 666; | ||||||
|  |       privateKeyFile = config.age.secrets.wgRaccoon.path; | ||||||
|  |       # Public key: QUfnGXSMEgu2bviglsaSdCjidB51oEDBFpnSFcKGfDI= | ||||||
|  |       peers = [ | ||||||
|  |         { | ||||||
|  |           name = "fox"; | ||||||
|  |           publicKey = "VfMPBQLQTKeyXJSwv8wBhc6OV0j2qAxUpX3kLHunK2Y="; | ||||||
|  |           allowedIPs = [ "10.106.0.1/32" ]; | ||||||
|  |           endpoint = "fox.ac.upc.edu:666"; | ||||||
|  |           persistentKeepalive = 25; | ||||||
|  |         } | ||||||
|  |         { | ||||||
|  |           name = "apex"; | ||||||
|  |           publicKey = "VwhcN8vSOzdJEotQTpmPHBC52x3Hbv1lkFIyKubrnUA="; | ||||||
|  |           allowedIPs = [ "10.106.0.30/32" "10.0.40.0/24" ]; | ||||||
|  |           endpoint = "ssfhead.bsc.es:666"; | ||||||
|  |           persistentKeepalive = 25; | ||||||
|  |         } | ||||||
|  |       ]; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   networking.hosts = { | ||||||
|  |     "10.106.0.1"  = [ "fox.wg" ]; | ||||||
|  |     "10.106.0.30" = [ "apex.wg" ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								m/tent/blackbox.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								m/tent/blackbox.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | modules: | ||||||
|  |   http_2xx: | ||||||
|  |     prober: http | ||||||
|  |     timeout: 5s | ||||||
|  |     http: | ||||||
|  |       preferred_ip_protocol: "ip4" | ||||||
|  |       follow_redirects: true | ||||||
|  |       valid_status_codes: []  # Defaults to 2xx | ||||||
|  |       method: GET | ||||||
|  |   icmp: | ||||||
|  |     prober: icmp | ||||||
|  |     timeout: 5s | ||||||
|  |     icmp: | ||||||
|  |       preferred_ip_protocol: "ip4" | ||||||
							
								
								
									
										85
									
								
								m/tent/configuration.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								m/tent/configuration.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,85 @@ | |||||||
|  | { config, pkgs, lib, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../common/xeon.nix | ||||||
|  |     ../common/ssf/hosts.nix | ||||||
|  |     ../module/emulation.nix | ||||||
|  |     ../module/debuginfod.nix | ||||||
|  |     ./monitoring.nix | ||||||
|  |     ./nginx.nix | ||||||
|  |     ./nix-serve.nix | ||||||
|  |     ./gitlab-runner.nix | ||||||
|  |     ./gitea.nix | ||||||
|  |     ../hut/public-inbox.nix | ||||||
|  |     ../hut/msmtp.nix | ||||||
|  |     ../module/p.nix | ||||||
|  |     ../module/vpn-dac.nix | ||||||
|  |     ../module/hut-substituter.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   # Select the this using the ID to avoid mismatches | ||||||
|  |   boot.loader.grub.device = "/dev/disk/by-id/wwn-0x55cd2e414d537675"; | ||||||
|  | 
 | ||||||
|  |   networking = { | ||||||
|  |     hostName = "tent"; | ||||||
|  |     interfaces.eno1.ipv4.addresses = [ | ||||||
|  |       { | ||||||
|  |         address = "10.0.44.4"; | ||||||
|  |         prefixLength = 24; | ||||||
|  |       } | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |     # Only BSC DNSs seem to be reachable from the office VLAN | ||||||
|  |     nameservers = [ "84.88.52.35" "84.88.52.36" ]; | ||||||
|  |     search = [ "bsc.es" "ac.upc.edu" ]; | ||||||
|  |     defaultGateway = "10.0.44.1"; | ||||||
|  |     hosts = { | ||||||
|  |       "84.88.53.236" = [ "apex" ]; | ||||||
|  |       "10.0.44.1" = [ "raccoon" ]; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   services.p.enable = true; | ||||||
|  | 
 | ||||||
|  |   services.prometheus.exporters.node = { | ||||||
|  |     enable = true; | ||||||
|  |     enabledCollectors = [ "systemd" ]; | ||||||
|  |     port = 9002; | ||||||
|  |     listenAddress = "127.0.0.1"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   boot.swraid = { | ||||||
|  |     enable = true; | ||||||
|  |     mdadmConf = '' | ||||||
|  |       DEVICE partitions | ||||||
|  |       ARRAY /dev/md0 metadata=1.2 UUID=496db1e2:056a92aa:a544543f:40db379d | ||||||
|  |       MAILADDR root | ||||||
|  |     ''; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   fileSystems."/vault" = { | ||||||
|  |     device = "/dev/disk/by-label/vault"; | ||||||
|  |     fsType = "ext4"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Make a /vault/$USER directory for each user. | ||||||
|  |   systemd.services.create-vault-dirs = let | ||||||
|  |     # Take only normal users in tent | ||||||
|  |     users = lib.filterAttrs (_: v: v.isNormalUser) config.users.users; | ||||||
|  |     commands = lib.concatLists (lib.mapAttrsToList | ||||||
|  |       (_: user: [ | ||||||
|  |         "install -d -o ${user.name} -g ${user.group} -m 0711 /vault/home/${user.name}" | ||||||
|  |       ]) users); | ||||||
|  |     script = pkgs.writeShellScript "create-vault-dirs.sh" (lib.concatLines commands); | ||||||
|  |   in { | ||||||
|  |     enable = true; | ||||||
|  |     wants = [ "local-fs.target" ]; | ||||||
|  |     after = [ "local-fs.target" ]; | ||||||
|  |     wantedBy = [ "multi-user.target" ]; | ||||||
|  |     serviceConfig.ExecStart = script; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # disable automatic garbage collector | ||||||
|  |   nix.gc.automatic = lib.mkForce false; | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								m/tent/gitea.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								m/tent/gitea.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | { config, lib, ... }: | ||||||
|  | { | ||||||
|  |   services.gitea = { | ||||||
|  |     enable = true; | ||||||
|  |     appName = "Gitea in the jungle"; | ||||||
|  | 
 | ||||||
|  |     settings = { | ||||||
|  |       server = { | ||||||
|  |         ROOT_URL = "https://jungle.bsc.es/git/"; | ||||||
|  |         LOCAL_ROOT_URL = "https://jungle.bsc.es/git/"; | ||||||
|  |         LANDING_PAGE = "explore"; | ||||||
|  |       }; | ||||||
|  |       metrics.ENABLED = true; | ||||||
|  |       service = { | ||||||
|  |         DISABLE_REGISTRATION = true; | ||||||
|  |         REGISTER_MANUAL_CONFIRM = true; | ||||||
|  |         ENABLE_NOTIFY_MAIL = true; | ||||||
|  |       }; | ||||||
|  |       log.LEVEL = "Warn"; | ||||||
|  | 
 | ||||||
|  |       mailer = { | ||||||
|  |         ENABLED       = true; | ||||||
|  |         FROM          = "jungle-robot@bsc.es"; | ||||||
|  |         PROTOCOL      = "sendmail"; | ||||||
|  |         SENDMAIL_PATH = "/run/wrappers/bin/sendmail"; | ||||||
|  |         SENDMAIL_ARGS = "--"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										93
									
								
								m/tent/gitlab-runner.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								m/tent/gitlab-runner.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,93 @@ | |||||||
|  | { pkgs, lib, config, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   age.secrets.tent-gitlab-runner-pm-shell.file = ../../secrets/tent-gitlab-runner-pm-shell-token.age; | ||||||
|  |   age.secrets.tent-gitlab-runner-pm-docker.file = ../../secrets/tent-gitlab-runner-pm-docker-token.age; | ||||||
|  |   age.secrets.tent-gitlab-runner-bsc-docker.file = ../../secrets/tent-gitlab-runner-bsc-docker-token.age; | ||||||
|  | 
 | ||||||
|  |   services.gitlab-runner = let sec = config.age.secrets; in { | ||||||
|  |     enable = true; | ||||||
|  |     settings.concurrent = 5; | ||||||
|  |     services = { | ||||||
|  |       # For gitlab.pm.bsc.es | ||||||
|  |       gitlab-pm-shell = { | ||||||
|  |         executor = "shell"; | ||||||
|  |         environmentVariables = { | ||||||
|  |           SHELL = "${pkgs.bash}/bin/bash"; | ||||||
|  |         }; | ||||||
|  |         authenticationTokenConfigFile = sec.tent-gitlab-runner-pm-shell.path; | ||||||
|  |         preGetSourcesScript = pkgs.writeScript "setup" '' | ||||||
|  |           echo "This is the preGetSources script running, brace for impact" | ||||||
|  |           env | ||||||
|  |         ''; | ||||||
|  |       }; | ||||||
|  |       gitlab-pm-docker = { | ||||||
|  |         authenticationTokenConfigFile = sec.tent-gitlab-runner-pm-docker.path; | ||||||
|  |         executor = "docker"; | ||||||
|  |         dockerImage = "debian:stable"; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       # For gitlab.bsc.es | ||||||
|  |       gitlab-bsc-docker = { | ||||||
|  |         # gitlab.bsc.es still uses the old token mechanism | ||||||
|  |         registrationConfigFile = sec.tent-gitlab-runner-bsc-docker.path; | ||||||
|  |         tagList = [ "docker" "tent" "nix" ]; | ||||||
|  |         executor = "docker"; | ||||||
|  |         dockerImage = "alpine"; | ||||||
|  |         dockerVolumes = [ | ||||||
|  |           "/nix/store:/nix/store:ro" | ||||||
|  |           "/nix/var/nix/db:/nix/var/nix/db:ro" | ||||||
|  |           "/nix/var/nix/daemon-socket:/nix/var/nix/daemon-socket:ro" | ||||||
|  |         ]; | ||||||
|  |         dockerDisableCache = true; | ||||||
|  |         registrationFlags = [ | ||||||
|  |           # Increase build log length to 64 MiB | ||||||
|  |           "--output-limit 65536" | ||||||
|  |         ]; | ||||||
|  |         preBuildScript = pkgs.writeScript "setup-container" '' | ||||||
|  |           mkdir -p -m 0755 /nix/var/log/nix/drvs | ||||||
|  |           mkdir -p -m 0755 /nix/var/nix/gcroots | ||||||
|  |           mkdir -p -m 0755 /nix/var/nix/profiles | ||||||
|  |           mkdir -p -m 0755 /nix/var/nix/temproots | ||||||
|  |           mkdir -p -m 0755 /nix/var/nix/userpool | ||||||
|  |           mkdir -p -m 1777 /nix/var/nix/gcroots/per-user | ||||||
|  |           mkdir -p -m 1777 /nix/var/nix/profiles/per-user | ||||||
|  |           mkdir -p -m 0755 /nix/var/nix/profiles/per-user/root | ||||||
|  |           mkdir -p -m 0700 "$HOME/.nix-defexpr" | ||||||
|  |           mkdir -p -m 0700 "$HOME/.ssh" | ||||||
|  |           cat >> "$HOME/.ssh/known_hosts" << EOF | ||||||
|  |           bscpm04.bsc.es ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPx4mC0etyyjYUT2Ztc/bs4ZXSbVMrogs1ZTP924PDgT | ||||||
|  |           gitlab-internal.bsc.es ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF9arsAOSRB06hdy71oTvJHG2Mg8zfebADxpvc37lZo3 | ||||||
|  |           EOF | ||||||
|  |           . ${pkgs.nix}/etc/profile.d/nix-daemon.sh | ||||||
|  |           # Required to load SSL certificate paths | ||||||
|  |           . ${pkgs.cacert}/nix-support/setup-hook | ||||||
|  |         ''; | ||||||
|  |         environmentVariables = { | ||||||
|  |           ENV = "/etc/profile"; | ||||||
|  |           USER = "root"; | ||||||
|  |           NIX_REMOTE = "daemon"; | ||||||
|  |           PATH = "${config.system.path}/bin:/bin:/sbin:/usr/bin:/usr/sbin"; | ||||||
|  |         }; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   systemd.services.gitlab-runner.serviceConfig = { | ||||||
|  |     DynamicUser = lib.mkForce false; | ||||||
|  |     User = "gitlab-runner"; | ||||||
|  |     Group = "gitlab-runner"; | ||||||
|  |     ExecStart = lib.mkForce | ||||||
|  |       ''${pkgs.gitlab-runner}/bin/gitlab-runner run --config ''${HOME}/.gitlab-runner/config.toml --listen-address "127.0.0.1:9252" --working-directory ''${HOME}''; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   users.users.gitlab-runner = { | ||||||
|  |     uid = config.ids.uids.gitlab-runner; | ||||||
|  |     home = "/var/lib/gitlab-runner"; | ||||||
|  |     description = "Gitlab Runner"; | ||||||
|  |     group = "gitlab-runner"; | ||||||
|  |     extraGroups = [ "docker" ]; | ||||||
|  |     createHome = true; | ||||||
|  |   }; | ||||||
|  |   users.groups.gitlab-runner.gid = config.ids.gids.gitlab-runner; | ||||||
|  | } | ||||||
							
								
								
									
										217
									
								
								m/tent/monitoring.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								m/tent/monitoring.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,217 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ../module/meteocat-exporter.nix | ||||||
|  |     ../module/upc-qaire-exporter.nix | ||||||
|  |     ../module/nix-daemon-exporter.nix | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   age.secrets.grafanaJungleRobotPassword = { | ||||||
|  |     file = ../../secrets/jungle-robot-password.age; | ||||||
|  |     owner = "grafana"; | ||||||
|  |     mode = "400"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   services.grafana = { | ||||||
|  |     enable = true; | ||||||
|  |     settings = { | ||||||
|  |       server = { | ||||||
|  |         domain = "jungle.bsc.es"; | ||||||
|  |         root_url = "%(protocol)s://%(domain)s/grafana"; | ||||||
|  |         serve_from_sub_path = true; | ||||||
|  |         http_port = 2342; | ||||||
|  |         http_addr = "127.0.0.1"; | ||||||
|  |       }; | ||||||
|  |       smtp = { | ||||||
|  |         enabled = true; | ||||||
|  |         from_address = "jungle-robot@bsc.es"; | ||||||
|  |         user = "jungle-robot"; | ||||||
|  |         # Read the password from a file, which is only readable by grafana user | ||||||
|  |         # https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#file-provider | ||||||
|  |         password = "$__file{${config.age.secrets.grafanaJungleRobotPassword.path}}"; | ||||||
|  |         host = "mail.bsc.es:465"; | ||||||
|  |         startTLS_policy = "NoStartTLS"; | ||||||
|  |       }; | ||||||
|  |       feature_toggles.publicDashboards = true; | ||||||
|  |       "auth.anonymous".enabled = true; | ||||||
|  |       log.level = "warn"; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   services.prometheus = { | ||||||
|  |     enable = true; | ||||||
|  |     port = 9001; | ||||||
|  |     retentionTime = "5y"; | ||||||
|  |     listenAddress = "127.0.0.1"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # We need access to the devices to monitor the disk space | ||||||
|  |   systemd.services.prometheus-node-exporter.serviceConfig.PrivateDevices = lib.mkForce false; | ||||||
|  |   systemd.services.prometheus-node-exporter.serviceConfig.ProtectHome = lib.mkForce "read-only"; | ||||||
|  | 
 | ||||||
|  |   # Credentials for IPMI exporter | ||||||
|  |   age.secrets.ipmiYml = { | ||||||
|  |     file = ../../secrets/ipmi.yml.age; | ||||||
|  |     owner = "ipmi-exporter"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Create an IPMI group and assign the ipmi0 device | ||||||
|  |   users.groups.ipmi = {}; | ||||||
|  |   services.udev.extraRules = '' | ||||||
|  |     SUBSYSTEM=="ipmi", KERNEL=="ipmi0", GROUP="ipmi", MODE="0660" | ||||||
|  |   ''; | ||||||
|  | 
 | ||||||
|  |   # Add a new ipmi-exporter user that can read the ipmi0 device | ||||||
|  |   users.users.ipmi-exporter = { | ||||||
|  |     isSystemUser = true; | ||||||
|  |     group = "ipmi"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Disable dynamic user so we have the ipmi-exporter user available for the credentials | ||||||
|  |   systemd.services.prometheus-ipmi-exporter.serviceConfig = { | ||||||
|  |     DynamicUser = lib.mkForce false; | ||||||
|  |     PrivateDevices = lib.mkForce false; | ||||||
|  |     User = lib.mkForce "ipmi-exporter"; | ||||||
|  |     Group = lib.mkForce "ipmi"; | ||||||
|  |     RestrictNamespaces = lib.mkForce false; | ||||||
|  |     # Fake uid to 0 so it shuts up | ||||||
|  |     ExecStart = let | ||||||
|  |       cfg = config.services.prometheus.exporters.ipmi; | ||||||
|  |     in lib.mkForce (lib.concatStringsSep " " ([ | ||||||
|  |       "${pkgs.util-linux}/bin/unshare --map-user 0" | ||||||
|  |       "${pkgs.prometheus-ipmi-exporter}/bin/ipmi_exporter" | ||||||
|  |       "--web.listen-address ${cfg.listenAddress}:${toString cfg.port}" | ||||||
|  |       "--config.file ${lib.escapeShellArg cfg.configFile}" | ||||||
|  |     ] ++ cfg.extraFlags)); | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   services.prometheus = { | ||||||
|  |     exporters = { | ||||||
|  |       ipmi = { | ||||||
|  |         enable = true; | ||||||
|  |         configFile = config.age.secrets.ipmiYml.path; | ||||||
|  |         #extraFlags = [ "--log.level=debug" ]; | ||||||
|  |         listenAddress = "127.0.0.1"; | ||||||
|  |       }; | ||||||
|  |       node = { | ||||||
|  |         enable = true; | ||||||
|  |         enabledCollectors = [ "logind" ]; | ||||||
|  |         port = 9002; | ||||||
|  |         listenAddress = "127.0.0.1"; | ||||||
|  |       }; | ||||||
|  |       blackbox = { | ||||||
|  |         enable = true; | ||||||
|  |         listenAddress = "127.0.0.1"; | ||||||
|  |         configFile = ./blackbox.yml; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     scrapeConfigs = [ | ||||||
|  |       { | ||||||
|  |         job_name = "local"; | ||||||
|  |         static_configs = [{ | ||||||
|  |           targets = [ | ||||||
|  |             "127.0.0.1:9002" # Node exporter | ||||||
|  |             #"127.0.0.1:9115" # Blackbox exporter | ||||||
|  |             "127.0.0.1:9290" # IPMI exporter for local node | ||||||
|  |             "127.0.0.1:9928" # UPC Qaire custom exporter | ||||||
|  |             "127.0.0.1:9929" # Meteocat custom exporter | ||||||
|  |             "127.0.0.1:9999" # Nix-daemon custom exporter | ||||||
|  |           ]; | ||||||
|  |         }]; | ||||||
|  |       } | ||||||
|  |       { | ||||||
|  |         job_name = "blackbox-http"; | ||||||
|  |         metrics_path = "/probe"; | ||||||
|  |         params = { module = [ "http_2xx" ]; }; | ||||||
|  |         static_configs = [{ | ||||||
|  |           targets = [ | ||||||
|  |             "https://www.google.com/robots.txt" | ||||||
|  |             "https://pm.bsc.es/" | ||||||
|  |             "https://pm.bsc.es/gitlab/" | ||||||
|  |             "https://jungle.bsc.es/" | ||||||
|  |             "https://gitlab.bsc.es/" | ||||||
|  |           ]; | ||||||
|  |         }]; | ||||||
|  |         relabel_configs = [ | ||||||
|  |           { | ||||||
|  |             # Takes the address and sets it in the "target=<xyz>" URL parameter | ||||||
|  |             source_labels = [ "__address__" ]; | ||||||
|  |             target_label = "__param_target"; | ||||||
|  |           } | ||||||
|  |           { | ||||||
|  |             # Sets the "instance" label with the remote host we are querying | ||||||
|  |             source_labels = [ "__param_target" ]; | ||||||
|  |             target_label = "instance"; | ||||||
|  |           } | ||||||
|  |           { | ||||||
|  |             # Shows the host target address instead of the blackbox address | ||||||
|  |             target_label = "__address__"; | ||||||
|  |             replacement = "127.0.0.1:9115"; | ||||||
|  |           } | ||||||
|  |         ]; | ||||||
|  |       } | ||||||
|  |       { | ||||||
|  |         job_name = "blackbox-icmp"; | ||||||
|  |         metrics_path = "/probe"; | ||||||
|  |         params = { module = [ "icmp" ]; }; | ||||||
|  |         static_configs = [{ | ||||||
|  |           targets = [ | ||||||
|  |             "1.1.1.1" | ||||||
|  |             "8.8.8.8" | ||||||
|  |             "ssfhead" | ||||||
|  |             "raccoon" | ||||||
|  |             "anella-bsc.cesca.cat" | ||||||
|  |             "upc-anella.cesca.cat" | ||||||
|  |             "fox.ac.upc.edu" | ||||||
|  |             "fox-ipmi.ac.upc.edu" | ||||||
|  |             "arenys5.ac.upc.edu" | ||||||
|  |             "arenys0-2.ac.upc.edu" | ||||||
|  |             "epi01.bsc.es" | ||||||
|  |             "axle.bsc.es" | ||||||
|  |           ]; | ||||||
|  |         }]; | ||||||
|  |         relabel_configs = [ | ||||||
|  |           { | ||||||
|  |             # Takes the address and sets it in the "target=<xyz>" URL parameter | ||||||
|  |             source_labels = [ "__address__" ]; | ||||||
|  |             target_label = "__param_target"; | ||||||
|  |           } | ||||||
|  |           { | ||||||
|  |             # Sets the "instance" label with the remote host we are querying | ||||||
|  |             source_labels = [ "__param_target" ]; | ||||||
|  |             target_label = "instance"; | ||||||
|  |           } | ||||||
|  |           { | ||||||
|  |             # Shows the host target address instead of the blackbox address | ||||||
|  |             target_label = "__address__"; | ||||||
|  |             replacement = "127.0.0.1:9115"; | ||||||
|  |           } | ||||||
|  |         ]; | ||||||
|  |       } | ||||||
|  |       { | ||||||
|  |         job_name = "ipmi-raccoon"; | ||||||
|  |         metrics_path = "/ipmi"; | ||||||
|  |         static_configs = [ | ||||||
|  |           { targets = [ "127.0.0.1:9290" ]; } | ||||||
|  |         ]; | ||||||
|  |         params = { | ||||||
|  |           target = [ "raccoon-ipmi" ]; | ||||||
|  |           module = [ "raccoon" ]; | ||||||
|  |         }; | ||||||
|  |       } | ||||||
|  |       { | ||||||
|  |         job_name = "ipmi-fox"; | ||||||
|  |         metrics_path = "/ipmi"; | ||||||
|  |         static_configs = [ | ||||||
|  |           { targets = [ "127.0.0.1:9290" ]; } | ||||||
|  |         ]; | ||||||
|  |         params = { | ||||||
|  |           target = [ "fox-ipmi.ac.upc.edu" ]; | ||||||
|  |           module = [ "fox" ]; | ||||||
|  |         }; | ||||||
|  |       } | ||||||
|  |     ]; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										79
									
								
								m/tent/nginx.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								m/tent/nginx.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,79 @@ | |||||||
|  | { theFlake, pkgs, ... }: | ||||||
|  | let | ||||||
|  |   website = pkgs.stdenv.mkDerivation { | ||||||
|  |     name = "jungle-web"; | ||||||
|  |     src = pkgs.fetchgit { | ||||||
|  |       url = "https://jungle.bsc.es/git/rarias/jungle-website.git"; | ||||||
|  |       rev = "739bf0175a7f05380fe7ad7023ff1d60db1710e1"; | ||||||
|  |       hash = "sha256-ea5DzhYTzZ9TmqD+x95rdNdLbxPnBluqlYH2NmBYmc4="; | ||||||
|  |     }; | ||||||
|  |     buildInputs = [ pkgs.hugo ]; | ||||||
|  |     buildPhase = '' | ||||||
|  |       rm -rf public/ | ||||||
|  |       hugo | ||||||
|  |     ''; | ||||||
|  |     installPhase = '' | ||||||
|  |       cp -r public $out | ||||||
|  |     ''; | ||||||
|  |     # Don't mess doc/ | ||||||
|  |     dontFixup = true; | ||||||
|  |   }; | ||||||
|  | in | ||||||
|  | { | ||||||
|  |   networking.firewall.allowedTCPPorts = [ 80 ]; | ||||||
|  |   services.nginx = { | ||||||
|  |     enable = true; | ||||||
|  |     virtualHosts."jungle.bsc.es" = { | ||||||
|  |       root = "${website}"; | ||||||
|  |       listen = [ | ||||||
|  |         { | ||||||
|  |           addr = "0.0.0.0"; | ||||||
|  |           port = 80; | ||||||
|  |         } | ||||||
|  |       ]; | ||||||
|  |       extraConfig = '' | ||||||
|  |         set_real_ip_from 127.0.0.1; | ||||||
|  |         set_real_ip_from 84.88.52.107; | ||||||
|  |         real_ip_recursive on; | ||||||
|  |         real_ip_header X-Forwarded-For; | ||||||
|  | 
 | ||||||
|  |         location /git { | ||||||
|  |           rewrite ^/git$ / break; | ||||||
|  |           rewrite ^/git/(.*) /$1 break; | ||||||
|  |           proxy_pass http://127.0.0.1:3000; | ||||||
|  |           proxy_redirect http:// $scheme://; | ||||||
|  |         } | ||||||
|  |         location /cache { | ||||||
|  |           rewrite ^/cache/(.*) /$1 break; | ||||||
|  |           proxy_pass http://127.0.0.1:5000; | ||||||
|  |           proxy_redirect http:// $scheme://; | ||||||
|  |         } | ||||||
|  |         location /lists { | ||||||
|  |           proxy_pass http://127.0.0.1:8081; | ||||||
|  |           proxy_redirect http:// $scheme://; | ||||||
|  |         } | ||||||
|  |         location /grafana { | ||||||
|  |           proxy_pass http://127.0.0.1:2342; | ||||||
|  |           proxy_redirect http:// $scheme://; | ||||||
|  |           proxy_set_header Host $host; | ||||||
|  |           # Websockets | ||||||
|  |           proxy_http_version 1.1; | ||||||
|  |           proxy_set_header Upgrade $http_upgrade; | ||||||
|  |           proxy_set_header Connection "upgrade"; | ||||||
|  |         } | ||||||
|  |         location ~ ^/~(.+?)(/.*)?$ { | ||||||
|  |           alias /vault/home/$1/public_html$2; | ||||||
|  |           index  index.html index.htm; | ||||||
|  |           autoindex on; | ||||||
|  |           absolute_redirect off; | ||||||
|  |         } | ||||||
|  |         location /p/ { | ||||||
|  |           alias /var/lib/p/; | ||||||
|  |         } | ||||||
|  |         location /pub/ { | ||||||
|  |           alias /vault/pub/; | ||||||
|  |         } | ||||||
|  |       ''; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								m/tent/nix-serve.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								m/tent/nix-serve.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | { config, ... }: | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   age.secrets.nixServe.file = ../../secrets/nix-serve.age; | ||||||
|  | 
 | ||||||
|  |   services.nix-serve = { | ||||||
|  |     enable = true; | ||||||
|  |     # Only listen locally, as we serve it via ssh | ||||||
|  |     bindAddress = "127.0.0.1"; | ||||||
|  |     port = 5000; | ||||||
|  | 
 | ||||||
|  |     secretKeyFile = config.age.secrets.nixServe.path; | ||||||
|  |     # Public key: | ||||||
|  |     # jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0= | ||||||
|  |   }; | ||||||
|  | } | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user