Compare commits
429 Commits
old-master
...
32d3d26abd
| Author | SHA1 | Date | |
|---|---|---|---|
| 32d3d26abd | |||
| f587b5cb69 | |||
| a5ace9b663 | |||
| eccefeac10 | |||
| 51f54a7821 | |||
| fc8f7b7a6d | |||
| 6abfdee535 | |||
| 60acbeddcd | |||
| 29a67a6822 | |||
| bb79a44202 | |||
| 5ce012ab8c | |||
| d5b6199b82 | |||
| e259b6cd2a | |||
| 6ad78795d6 | |||
| 333e24d80b | |||
| 8ebc51b33e | |||
| 11d389f5c3 | |||
| 064e57d53f | |||
| 871abab0eb | |||
| 6f10e0ca89 | |||
| 0315616af8 | |||
| b0fb3c7be3 | |||
| 9912348c74 | |||
| e19694fae2 | |||
| 6c0010e100 | |||
| 1f74cf2482 | |||
| 5a51b28268 | |||
| 46ef8f8aea | |||
| f0f5712cd0 | |||
| d5d065772f | |||
| 076684b97f | |||
| 3d99e9282a | |||
| b043d21161 | |||
| 8c89093e40 | |||
| 06496a3b06 | |||
| a1fd57b67d | |||
| c48e261b41 | |||
| 3e0156d7a0 | |||
| ef28582bd8 | |||
| 91fd1756e8 | |||
| f7bf8e632d | |||
| c57aaef2ce | |||
| df9cec496a | |||
| 348ebb5053 | |||
| af0f87ccd2 | |||
| 1145dc28a4 | |||
| 31c4fab9a0 | |||
| 4c9e197a27 | |||
| b77fc54e8a | |||
| 16f1a65d33 | |||
| 4fd103a489 | |||
| 1a4411d529 | |||
| 00a2da0ede | |||
| 1285a47b68 | |||
| 6479c667ba | |||
| 77a9e5f4be | |||
| 4a951d14ef | |||
| c20aba8580 | |||
| 65cda794be | |||
| b4762b2470 | |||
| 10adc7cbed | |||
| d80fe93e88 | |||
| 46bbcf7fac | |||
| 847709b209 | |||
| 6551dce813 | |||
| b8561dbc44 | |||
| 298028c803 | |||
| 983336b6f6 | |||
| 2649ef4c0d | |||
| 9ae2c79202 | |||
| 4fcdcd064d | |||
| 598cd43520 | |||
| 0c8e2ed8f8 | |||
| 6ed558877c | |||
| 247fd56571 | |||
| cb05eb36e6 | |||
| 70da31ed03 | |||
| 3672c04980 | |||
| 1511a0a739 | |||
| 23fa1bf52c | |||
| e59e89c6f1 | |||
| 41962ba34f | |||
| 70c9338076 | |||
| 3db4bd811c | |||
| a6b532a6d9 | |||
| 7771717d1e | |||
| c931e0f9bb | |||
| 1f9b48cc9a | |||
| 20bc2612fa | |||
| da02c4290c | |||
| 3a25d7e798 | |||
| f7db23eaee | |||
| 892489a02f | |||
| b1e93332fc | |||
| fbc4cac562 | |||
| dcfade24dd | |||
| 2af536fd52 | |||
| b532c023a0 | |||
| 6ef63735da | |||
| 8d9f970b4f | |||
| 95c47a6cd8 | |||
| 4405a4feff | |||
| 5116b82318 | |||
| 0df728c733 | |||
| 29a7475140 | |||
| a7d687010e | |||
| 090613bd31 | |||
| 404e690a3c | |||
| c79d0b59e7 | |||
| ce35461509 | |||
| 3dacd598d6 | |||
| 8065fbe10d | |||
| b795328af2 | |||
| 1e7f1365cd | |||
| 4b868c0136 | |||
| f997735e44 | |||
| 3e02850b1f | |||
| 2b875a54f7 | |||
| 52c9d8ce3d | |||
| 0e58847a21 | |||
| 399fc93e44 | |||
| 5a05993f50 | |||
| 8805a2f25d | |||
| 3c5f8a745c | |||
| 96e689c997 | |||
| 260df31854 | |||
| 40a4743b88 | |||
| 40b5156bd0 | |||
| 77f716277e | |||
| d6d62497ab | |||
| f2d8bfe0b3 | |||
| 308ef0958d | |||
| 0dd417fd82 | |||
| d30da1451c | |||
| e64cb07658 | |||
| 8d8d32e9ae | |||
| 3e103c6e9c | |||
| 2690bf6602 | |||
| 93d60f9e3d | |||
| 87313b5c6e | |||
| 485c1f1305 | |||
| c5fb3f3e22 | |||
| 64d38e44e0 | |||
| 99ecfb50e5 | |||
| a369391598 | |||
| e371284cbd | |||
| f4dac10c5b | |||
| b9fd104cc6 | |||
| 95ec6962f0 | |||
| fe016f3443 | |||
| 624e4b8481 | |||
| 3708388667 | |||
| 0118cfaead | |||
| 27636dc66e | |||
| a912b76ab4 | |||
| afd3aa112d | |||
| 226d52271c | |||
| 5801406bc6 | |||
| e37266c4dc | |||
| aef34f8ba0 | |||
| cf722cbf0d | |||
| d27312fdac | |||
| d25b9a3c51 | |||
| 9533cb008c | |||
| 07f8a1763f | |||
| c57802ec54 | |||
| ea1d93c058 | |||
| 2e5379b9bf | |||
| a808dd8a84 | |||
| 364f05e7af | |||
| 4f0e00f8cc | |||
| aa6f475947 | |||
| 2c67258753 | |||
| 3045ab578e | |||
| 7fd7781479 | |||
| 539a72aad6 | |||
| 3988339d84 | |||
| 5a1744c28d | |||
| de8716deaa | |||
| 80fb0fe3e5 | |||
| 6ed625fe62 | |||
| c2e88b0573 | |||
| a194dbdd5a | |||
| 348582cdf0 | |||
| 68e2f95844 | |||
| e6dc87ad82 | |||
| fb506460ba | |||
| 0824de661d | |||
| fb38a8cbef | |||
| 574f2bdc4f | |||
| 935553431e | |||
| 4489eac910 | |||
| 3f195b6e74 | |||
| 77afdc1883 | |||
| 2182d117a8 | |||
| 60af22125b | |||
| fed20a536b | |||
| 123598cd03 | |||
| 368a0a7637 | |||
| 1e67cc4d12 | |||
| 0b6f2e21b6 | |||
| 1187f40f30 | |||
| 6527afb1b2 | |||
| 37866a94f4 | |||
| 706b9049fa | |||
| aa330aaf63 | |||
| 857196efb7 | |||
| cf0a41cbc4 | |||
| e81f66d0c4 | |||
| dfa27a9cf2 | |||
| b25d378960 | |||
| 75b11e5373 | |||
| 383941ada9 | |||
| d93914f91d | |||
| c80433c2a7 | |||
| f74ec2bce1 | |||
| ededd2083b | |||
| 114d3aa1af | |||
| 45f8d4bd6c | |||
| 5210197ca4 | |||
| 494a52e752 | |||
| aac0f79afc | |||
| 43810ebdc5 | |||
| 7c63c034b8 | |||
| 1aa51a816c | |||
| f90172ab77 | |||
| 067919c135 | |||
| 8652b7403c | |||
| f5c69a7233 | |||
| 59c34a946c | |||
| cd65b3b8a0 | |||
| 54e09ef5b8 | |||
| 35b4a30f2e | |||
| bfc5555caf | |||
| f88ad644c6 | |||
| 5003139e8e | |||
| 845adfc937 | |||
| 52b4cba900 | |||
| 7b22865a1e | |||
| 6ed2d2e089 | |||
| d557158c3f | |||
| 4e0fc52927 | |||
| 34628c0e39 | |||
| 2703cd456d | |||
| 9325c203fb | |||
| 5d1f008199 | |||
| f9622b19ef | |||
| f2d26fd2e2 | |||
| bf8f0ac583 | |||
| 4e333dca21 | |||
| 33c1da6c40 | |||
| 5dc41a86e5 | |||
| 697c3d884e | |||
| 5a537c7478 | |||
| c06b706e49 | |||
| 270cff123d | |||
| b219badaaf | |||
| f4fcb7c72c | |||
| b4ede66387 | |||
| ec351a157c | |||
| 63d63fd39a | |||
| beae9d240e | |||
| e925b00489 | |||
| 5594e3615d | |||
| 384c4ee766 | |||
| 87871de141 | |||
| c5a058f96a | |||
| 79077477e1 | |||
| f5a6055f21 | |||
| 0333b57851 | |||
| 00068cb11c | |||
| a992b266bb | |||
| c26cff7bdb | |||
| 1b5469af13 | |||
| 78c883a274 | |||
| 3385252f5f | |||
| 241b888a7c | |||
| b7aba3d15c | |||
| e35b51cd00 | |||
| 2e460f49bd | |||
| a13a2caf57 | |||
| ac3817d99b | |||
| c1d9b01ed1 | |||
| e7aa2d3fe3 | |||
| d2860ce437 | |||
| 1f199c73f1 | |||
| 657a1b328a | |||
| 875e6fe6c7 | |||
| 7abee55da4 | |||
| 758ddc71cb | |||
| 224bafd20d | |||
| 8b1fa938ea | |||
| 94b110dc57 | |||
| 0c5207bd2d | |||
| 4200e6162d | |||
| c0ae33fbb5 | |||
| 1ec4942794 | |||
| ff00c2be8d | |||
| 32d5adf900 | |||
| ad491140f4 | |||
| eac4c60e1a | |||
| 6ada09fe91 | |||
| 9f71aae1ff | |||
| 0db43352ac | |||
| 27ae97c4d7 | |||
| 7bb16f858e | |||
| cb76e7afa3 | |||
| 9cd45365ec | |||
| f12665022e | |||
| a48ae143cc | |||
| 637b48752e | |||
| 5f2fe97cd4 | |||
| a21b95fd8b | |||
| d49bf2f802 | |||
| 4a40098459 | |||
| c360937d52 | |||
| fa230307d8 | |||
| 1a9f2a72f2 | |||
| e952e716bf | |||
| aa6140411a | |||
| 48027edd73 | |||
| b5c061be41 | |||
| 33cc03eb34 | |||
| ac1783c516 | |||
| 71000731c0 | |||
| e320e9ced4 | |||
| 479d63f842 | |||
| 503a63539c | |||
| 3adaea0fdd | |||
| 54083c60cd | |||
| 072917288c | |||
| 49153acfbd | |||
| 04c2974a8e | |||
| 8cb7cf087c | |||
| f04719d31d | |||
| 5e3470f3bf | |||
| d92e06d7b7 | |||
| 1a732e601a | |||
| a096a386a0 | |||
| 5717b9b7fa | |||
| b30f2bfdd7 | |||
| 0055460417 | |||
| 6162a71edc | |||
| fdb8d098bc | |||
| 9097811cc0 | |||
| 83acd40880 | |||
| ba75bf8249 | |||
| e9845cc76a | |||
| d5951483ee | |||
| 937d8a7637 | |||
| 798e01f9e6 | |||
| 2ca7e7383e | |||
| b610f12133 | |||
| b6aaeb8158 | |||
| 3d0f86ac07 | |||
| 221ccef956 | |||
| 9f03799d34 | |||
| 3a9615fce4 | |||
| 45d7b31c0a | |||
| 73b33c4d6c | |||
| bae3c75222 | |||
| f51e910aff | |||
| 8b7ffc914a | |||
| afb2bea1c9 | |||
| 7bbc526671 | |||
| 4afe3121e6 | |||
| 39f15a1b4f | |||
| 3fab341dc8 | |||
| 6ec7353a27 | |||
| d679fd6314 | |||
| 218acd6848 | |||
| 68805b337d | |||
| eae7ed4e10 | |||
| eb9b5e570f | |||
| 0c4b85be3b | |||
| 49ccf0a3f3 | |||
| 459b29924c | |||
| 0d1a7e59ee | |||
| b959c72979 | |||
| 68f7c02555 | |||
| 26caa390cb | |||
| f0af9d87a0 | |||
| 038340c5d2 | |||
| 471d44f013 | |||
| af03554610 | |||
| 35898c68e7 | |||
| 769317c5a7 | |||
| a9f9a1e8e5 | |||
| 0a8097231d | |||
| be90239bbc | |||
| f2fc2af77a | |||
| 7828d616fc | |||
| 61ea1af68b | |||
| 81243cbc95 | |||
| 847d516d6d | |||
| a6c060a25b | |||
| 70d2255634 | |||
| 7b176a3780 | |||
| e7bfba54bc | |||
| 30a12729f1 | |||
| 8851dbe212 | |||
| b7d52423c9 | |||
| 32b84a5add | |||
| 9267ca51fa | |||
| 5c9f5e845f | |||
| 2d204c5cc0 | |||
| 99481e6203 | |||
| 8b4dda98af | |||
| 0c296c1825 | |||
| 513c182d24 | |||
| a2fe4b552a | |||
| 1b030ab76d | |||
| f0abbac1c7 | |||
| 6f80ebb483 | |||
| ce00282704 | |||
| 7829ba7509 | |||
| a476b1758b | |||
| 51a77b5213 | |||
| 020ce58efd | |||
| ab978758ba | |||
| 774350f288 | |||
| b739c96882 | |||
| 32d782be96 | |||
| 1432a26fba | |||
| f5fa915e09 | |||
| d6a7a87207 | |||
| 13f72753a5 | |||
| fa757aaaab | |||
| 15906e5818 |
BIN
doc/bsc-ssf.pdf
46
doc/trim.sh
@@ -1,46 +0,0 @@
|
|||||||
#!/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
|
|
||||||
25
keys.nix
@@ -2,22 +2,21 @@
|
|||||||
# here all the public keys
|
# here all the public keys
|
||||||
rec {
|
rec {
|
||||||
hosts = {
|
hosts = {
|
||||||
hut = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICO7jIp6JRnRWTMDsTB/aiaICJCl4x8qmKMPSs4lCqP1 hut";
|
hut = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICO7jIp6JRnRWTMDsTB/aiaICJCl4x8qmKMPSs4lCqP1 hut";
|
||||||
owl1 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMqMEXO0ApVsBA6yjmb0xP2kWyoPDIWxBB0Q3+QbHVhv owl1";
|
owl1 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMqMEXO0ApVsBA6yjmb0xP2kWyoPDIWxBB0Q3+QbHVhv owl1";
|
||||||
owl2 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHurEYpQzNHqWYF6B9Pd7W8UPgF3BxEg0BvSbsA7BAdK owl2";
|
owl2 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHurEYpQzNHqWYF6B9Pd7W8UPgF3BxEg0BvSbsA7BAdK owl2";
|
||||||
eudy = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL+WYPRRvZupqLAG0USKmd/juEPmisyyJaP8hAgYwXsG eudy";
|
eudy = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL+WYPRRvZupqLAG0USKmd/juEPmisyyJaP8hAgYwXsG eudy";
|
||||||
koro = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIImiTFDbxyUYPumvm8C4mEnHfuvtBY1H8undtd6oDd67 koro";
|
koro = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIImiTFDbxyUYPumvm8C4mEnHfuvtBY1H8undtd6oDd67 koro";
|
||||||
bay = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICvGBzpRQKuQYHdlUQeAk6jmdbkrhmdLwTBqf3el7IgU bay";
|
bay = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICvGBzpRQKuQYHdlUQeAk6jmdbkrhmdLwTBqf3el7IgU bay";
|
||||||
lake2 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINo66//S1yatpQHE/BuYD/Gfq64TY7ZN5XOGXmNchiO0 lake2";
|
lake2 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINo66//S1yatpQHE/BuYD/Gfq64TY7ZN5XOGXmNchiO0 lake2";
|
||||||
fox = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDwItIk5uOJcQEVPoy/CVGRzfmE1ojrdDcI06FrU4NFT fox";
|
fox = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDwItIk5uOJcQEVPoy/CVGRzfmE1ojrdDcI06FrU4NFT fox";
|
||||||
tent = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFAtTpHtdYoelbknD/IcfBlThwLKJv/dSmylOgpg3FRM tent";
|
tent = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFAtTpHtdYoelbknD/IcfBlThwLKJv/dSmylOgpg3FRM tent";
|
||||||
apex = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBvUFjSfoxXnKwXhEFXx5ckRKJ0oewJ82mRitSMNMKjh apex";
|
apex = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBvUFjSfoxXnKwXhEFXx5ckRKJ0oewJ82mRitSMNMKjh apex";
|
||||||
weasel = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFLJrQ8BF6KcweQV8pLkSbFT+tbDxSG9qxrdQE65zJZp weasel";
|
weasel = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFLJrQ8BF6KcweQV8pLkSbFT+tbDxSG9qxrdQE65zJZp weasel";
|
||||||
raccoon = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGNQttFvL0dNEyy7klIhLoK4xXOeM2/K9R7lPMTG3qvK raccoon";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
hostGroup = with hosts; rec {
|
hostGroup = with hosts; rec {
|
||||||
compute = [ owl1 owl2 fox raccoon ];
|
compute = [ owl1 owl2 fox ];
|
||||||
playground = [ eudy koro weasel ];
|
playground = [ eudy koro weasel ];
|
||||||
storage = [ bay lake2 ];
|
storage = [ bay lake2 ];
|
||||||
monitor = [ hut ];
|
monitor = [ hut ];
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
../common/xeon.nix
|
../common/xeon.nix
|
||||||
../common/ssf/hosts.nix
|
../common/ssf/hosts.nix
|
||||||
../module/ceph.nix
|
../module/ceph.nix
|
||||||
../module/hut-substituter.nix
|
|
||||||
../module/slurm-server.nix
|
../module/slurm-server.nix
|
||||||
./nfs.nix
|
./nfs.nix
|
||||||
./wireguard.nix
|
./wireguard.nix
|
||||||
@@ -57,6 +56,17 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Use SSH tunnel to reach internal hosts
|
||||||
|
programs.ssh.extraConfig = ''
|
||||||
|
Host bscpm04.bsc.es gitlab-internal.bsc.es knights3.bsc.es
|
||||||
|
ProxyCommand nc -X connect -x localhost:23080 %h %p
|
||||||
|
Host raccoon
|
||||||
|
HostName knights3.bsc.es
|
||||||
|
ProxyCommand nc -X connect -x localhost:23080 %h %p
|
||||||
|
Host tent
|
||||||
|
ProxyJump raccoon
|
||||||
|
'';
|
||||||
|
|
||||||
networking.firewall = {
|
networking.firewall = {
|
||||||
extraCommands = ''
|
extraCommands = ''
|
||||||
# Blackhole BSC vulnerability scanner (OpenVAS) as it is spamming our
|
# Blackhole BSC vulnerability scanner (OpenVAS) as it is spamming our
|
||||||
@@ -66,4 +76,10 @@
|
|||||||
iptables -I nixos-fw 2 -p tcp -s 84.88.52.176 -j nixos-fw-refuse
|
iptables -I nixos-fw 2 -p tcp -s 84.88.52.176 -j nixos-fw-refuse
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Use tent for cache
|
||||||
|
nix.settings = {
|
||||||
|
extra-substituters = [ "https://jungle.bsc.es/cache" ];
|
||||||
|
extra-trusted-public-keys = [ "jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0=" ];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,23 +20,16 @@
|
|||||||
{
|
{
|
||||||
name = "fox";
|
name = "fox";
|
||||||
publicKey = "VfMPBQLQTKeyXJSwv8wBhc6OV0j2qAxUpX3kLHunK2Y=";
|
publicKey = "VfMPBQLQTKeyXJSwv8wBhc6OV0j2qAxUpX3kLHunK2Y=";
|
||||||
allowedIPs = [ "10.106.0.1/32" ];
|
allowedIPs = [ "10.106.0.0/24" ];
|
||||||
endpoint = "fox.ac.upc.edu:666";
|
endpoint = "fox.ac.upc.edu:666";
|
||||||
# Send keepalives every 25 seconds. Important to keep NAT tables alive.
|
# Send keepalives every 25 seconds. Important to keep NAT tables alive.
|
||||||
persistentKeepalive = 25;
|
persistentKeepalive = 25;
|
||||||
}
|
}
|
||||||
{
|
|
||||||
name = "raccoon";
|
|
||||||
publicKey = "QUfnGXSMEgu2bviglsaSdCjidB51oEDBFpnSFcKGfDI=";
|
|
||||||
allowedIPs = [ "10.106.0.236/32" "192.168.0.0/16" "10.0.44.0/24" ];
|
|
||||||
}
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
networking.hosts = {
|
networking.hosts = {
|
||||||
"10.106.0.1" = [ "fox" ];
|
"10.106.0.1" = [ "fox" ];
|
||||||
"10.106.0.236" = [ "raccoon" ];
|
|
||||||
"10.0.44.4" = [ "tent" ];
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
../common/ssf.nix
|
../common/ssf.nix
|
||||||
../module/hut-substituter.nix
|
|
||||||
../module/monitoring.nix
|
../module/monitoring.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -15,9 +15,8 @@
|
|||||||
|
|
||||||
hosts = {
|
hosts = {
|
||||||
"84.88.53.236" = [ "ssfhead.bsc.es" "ssfhead" ];
|
"84.88.53.236" = [ "ssfhead.bsc.es" "ssfhead" ];
|
||||||
|
"84.88.51.152" = [ "raccoon" ];
|
||||||
"84.88.51.142" = [ "raccoon-ipmi" ];
|
"84.88.51.142" = [ "raccoon-ipmi" ];
|
||||||
"192.168.11.12" = [ "bscpm04.bsc.es" ];
|
|
||||||
"192.168.11.15" = [ "gitlab-internal.bsc.es" ];
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -156,30 +156,18 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
csiringo = {
|
csiringo = {
|
||||||
|
# Arbitrary UID but large so it doesn't collide with other users on ssfhead.
|
||||||
uid = 9653;
|
uid = 9653;
|
||||||
isNormalUser = true;
|
isNormalUser = true;
|
||||||
home = "/home/Computational/csiringo";
|
home = "/home/Computational/csiringo";
|
||||||
description = "Cesare Siringo";
|
description = "Cesare Siringo";
|
||||||
group = "Computational";
|
group = "Computational";
|
||||||
hosts = [ ];
|
hosts = [ "apex" "weasel" ];
|
||||||
hashedPassword = "$6$0IsZlju8jFukLlAw$VKm0FUXbS.mVmPm3rcJeizTNU4IM5Nmmy21BvzFL.cQwvlGwFI1YWRQm6gsbd4nbg47mPDvYkr/ar0SlgF6GO1";
|
hashedPassword = "$6$0IsZlju8jFukLlAw$VKm0FUXbS.mVmPm3rcJeizTNU4IM5Nmmy21BvzFL.cQwvlGwFI1YWRQm6gsbd4nbg47mPDvYkr/ar0SlgF6GO1";
|
||||||
openssh.authorizedKeys.keys = [
|
openssh.authorizedKeys.keys = [
|
||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHA65zvvG50iuFEMf+guRwZB65jlGXfGLF4HO+THFaed csiringo@bsc.es"
|
"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 = {
|
groups = {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
./xeon.nix
|
./xeon.nix
|
||||||
./ssf/fs.nix
|
./ssf/fs.nix
|
||||||
./ssf/hosts.nix
|
./ssf/hosts.nix
|
||||||
./ssf/hosts-remote.nix
|
|
||||||
./ssf/net.nix
|
./ssf/net.nix
|
||||||
|
./ssf/ssh.nix
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
{ pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
|
||||||
networking.hosts = {
|
|
||||||
# Remote hosts visible from compute nodes
|
|
||||||
"10.106.0.236" = [ "raccoon" ];
|
|
||||||
"10.0.44.4" = [ "tent" ];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
16
m/common/ssf/ssh.nix
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
# Use SSH tunnel to apex to reach internal hosts
|
||||||
|
programs.ssh.extraConfig = ''
|
||||||
|
Host tent
|
||||||
|
ProxyJump raccoon
|
||||||
|
|
||||||
|
# Access raccoon via the HTTP proxy
|
||||||
|
Host raccoon knights3.bsc.es
|
||||||
|
HostName knights3.bsc.es
|
||||||
|
ProxyCommand=ssh apex 'nc -X connect -x localhost:23080 %h %p'
|
||||||
|
|
||||||
|
# Make sure we can reach gitlab even if we don't have SSH access to raccoon
|
||||||
|
Host bscpm04.bsc.es gitlab-internal.bsc.es
|
||||||
|
ProxyCommand=ssh apex 'nc -X connect -x localhost:23080 %h %p'
|
||||||
|
'';
|
||||||
|
}
|
||||||
@@ -9,7 +9,6 @@
|
|||||||
./cpufreq.nix
|
./cpufreq.nix
|
||||||
./fs.nix
|
./fs.nix
|
||||||
./users.nix
|
./users.nix
|
||||||
../module/hut-substituter.nix
|
|
||||||
../module/debuginfod.nix
|
../module/debuginfod.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
../module/emulation.nix
|
../module/emulation.nix
|
||||||
../module/nvidia.nix
|
../module/nvidia.nix
|
||||||
../module/slurm-client.nix
|
../module/slurm-client.nix
|
||||||
../module/hut-substituter.nix
|
|
||||||
./wireguard.nix
|
./wireguard.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -46,6 +45,16 @@
|
|||||||
|
|
||||||
services.fail2ban.enable = true;
|
services.fail2ban.enable = true;
|
||||||
|
|
||||||
|
# Use SSH tunnel to reach internal hosts
|
||||||
|
programs.ssh.extraConfig = ''
|
||||||
|
Host bscpm04.bsc.es gitlab-internal.bsc.es tent
|
||||||
|
ProxyJump raccoon
|
||||||
|
Host raccoon
|
||||||
|
ProxyJump apex
|
||||||
|
HostName 127.0.0.1
|
||||||
|
Port 22022
|
||||||
|
'';
|
||||||
|
|
||||||
networking = {
|
networking = {
|
||||||
timeServers = [ "ntp1.upc.edu" "ntp2.upc.edu" ];
|
timeServers = [ "ntp1.upc.edu" "ntp2.upc.edu" ];
|
||||||
hostName = "fox";
|
hostName = "fox";
|
||||||
@@ -63,6 +72,12 @@
|
|||||||
interfaces.enp1s0f0np0.useDHCP = true;
|
interfaces.enp1s0f0np0.useDHCP = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Use hut for cache
|
||||||
|
nix.settings = {
|
||||||
|
extra-substituters = [ "https://jungle.bsc.es/cache" ];
|
||||||
|
extra-trusted-public-keys = [ "jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0=" ];
|
||||||
|
};
|
||||||
|
|
||||||
# Recommended for new graphics cards
|
# Recommended for new graphics cards
|
||||||
hardware.nvidia.open = true;
|
hardware.nvidia.open = true;
|
||||||
|
|
||||||
|
|||||||
@@ -29,19 +29,12 @@
|
|||||||
# List of IPs assigned to this peer within the tunnel subnet. Used to configure routing.
|
# List of IPs assigned to this peer within the tunnel subnet. Used to configure routing.
|
||||||
allowedIPs = [ "10.106.0.30/32" ];
|
allowedIPs = [ "10.106.0.30/32" ];
|
||||||
}
|
}
|
||||||
{
|
|
||||||
name = "raccoon";
|
|
||||||
publicKey = "QUfnGXSMEgu2bviglsaSdCjidB51oEDBFpnSFcKGfDI=";
|
|
||||||
allowedIPs = [ "10.106.0.236/32" "192.168.0.0/16" "10.0.44.0/24" ];
|
|
||||||
}
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
networking.hosts = {
|
networking.hosts = {
|
||||||
"10.106.0.30" = [ "apex" ];
|
"10.106.0.30" = [ "apex" ];
|
||||||
"10.106.0.236" = [ "raccoon" ];
|
|
||||||
"10.0.44.4" = [ "tent" ];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
networking.firewall = {
|
networking.firewall = {
|
||||||
|
|||||||
@@ -2,13 +2,10 @@
|
|||||||
let
|
let
|
||||||
website = pkgs.stdenv.mkDerivation {
|
website = pkgs.stdenv.mkDerivation {
|
||||||
name = "jungle-web";
|
name = "jungle-web";
|
||||||
src = pkgs.fetchgit {
|
src = theFlake;
|
||||||
url = "https://jungle.bsc.es/git/rarias/jungle-website.git";
|
|
||||||
rev = "739bf0175a7f05380fe7ad7023ff1d60db1710e1";
|
|
||||||
hash = "sha256-ea5DzhYTzZ9TmqD+x95rdNdLbxPnBluqlYH2NmBYmc4=";
|
|
||||||
};
|
|
||||||
buildInputs = [ pkgs.hugo ];
|
buildInputs = [ pkgs.hugo ];
|
||||||
buildPhase = ''
|
buildPhase = ''
|
||||||
|
cd web
|
||||||
rm -rf public/
|
rm -rf public/
|
||||||
hugo
|
hugo
|
||||||
'';
|
'';
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
imports = [
|
imports = [
|
||||||
../common/ssf.nix
|
../common/ssf.nix
|
||||||
../module/monitoring.nix
|
../module/monitoring.nix
|
||||||
../module/hut-substituter.nix
|
|
||||||
];
|
];
|
||||||
|
|
||||||
boot.loader.grub.device = "/dev/disk/by-id/wwn-0x55cd2e414d53563a";
|
boot.loader.grub.device = "/dev/disk/by-id/wwn-0x55cd2e414d53563a";
|
||||||
|
|||||||
@@ -6,8 +6,5 @@
|
|||||||
{
|
{
|
||||||
extra-substituters = [ "http://hut/cache" ];
|
extra-substituters = [ "http://hut/cache" ];
|
||||||
extra-trusted-public-keys = [ "jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0=" ];
|
extra-trusted-public-keys = [ "jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0=" ];
|
||||||
|
|
||||||
# Set a low timeout in case hut is down
|
|
||||||
connect-timeout = 3; # seconds
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,12 +12,6 @@
|
|||||||
# https://github.com/NixOS/nixpkgs/commit/ae93ed0f0d4e7be0a286d1fca86446318c0c6ffb
|
# https://github.com/NixOS/nixpkgs/commit/ae93ed0f0d4e7be0a286d1fca86446318c0c6ffb
|
||||||
# https://bugs.schedmd.com/show_bug.cgi?id=2095#c24
|
# https://bugs.schedmd.com/show_bug.cgi?id=2095#c24
|
||||||
KillMode = lib.mkForce "control-group";
|
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;
|
services.slurm.client.enable = true;
|
||||||
|
|||||||
8
m/module/ssh-hut-extern.nix
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
programs.ssh.extraConfig = ''
|
||||||
|
Host apex ssfhead
|
||||||
|
HostName ssflogin.bsc.es
|
||||||
|
Host hut
|
||||||
|
ProxyJump apex
|
||||||
|
'';
|
||||||
|
}
|
||||||
@@ -3,13 +3,11 @@
|
|||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
../common/base.nix
|
../common/base.nix
|
||||||
../common/ssf/hosts.nix
|
|
||||||
../module/emulation.nix
|
../module/emulation.nix
|
||||||
../module/debuginfod.nix
|
../module/debuginfod.nix
|
||||||
|
../module/ssh-hut-extern.nix
|
||||||
../module/nvidia.nix
|
../module/nvidia.nix
|
||||||
../eudy/kernel/perf.nix
|
../eudy/kernel/perf.nix
|
||||||
./wireguard.nix
|
|
||||||
../module/hut-substituter.nix
|
|
||||||
];
|
];
|
||||||
|
|
||||||
# Don't install Grub on the disk yet
|
# Don't install Grub on the disk yet
|
||||||
@@ -45,11 +43,9 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
# Mount the NFS home
|
nix.settings = {
|
||||||
fileSystems."/nfs/home" = {
|
extra-substituters = [ "https://jungle.bsc.es/cache" ];
|
||||||
device = "10.106.0.30:/home";
|
extra-trusted-public-keys = [ "jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0=" ];
|
||||||
fsType = "nfs";
|
|
||||||
options = [ "nfsvers=3" "rsize=1024" "wsize=1024" "cto" "nofail" ];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
# Enable performance governor
|
# Enable performance governor
|
||||||
|
|||||||
@@ -1,48 +0,0 @@
|
|||||||
{ 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" ];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -3,9 +3,9 @@
|
|||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
../common/xeon.nix
|
../common/xeon.nix
|
||||||
../common/ssf/hosts.nix
|
|
||||||
../module/emulation.nix
|
../module/emulation.nix
|
||||||
../module/debuginfod.nix
|
../module/debuginfod.nix
|
||||||
|
../module/ssh-hut-extern.nix
|
||||||
./monitoring.nix
|
./monitoring.nix
|
||||||
./nginx.nix
|
./nginx.nix
|
||||||
./nix-serve.nix
|
./nix-serve.nix
|
||||||
@@ -15,7 +15,6 @@
|
|||||||
../hut/msmtp.nix
|
../hut/msmtp.nix
|
||||||
../module/p.nix
|
../module/p.nix
|
||||||
../module/vpn-dac.nix
|
../module/vpn-dac.nix
|
||||||
../module/hut-substituter.nix
|
|
||||||
];
|
];
|
||||||
|
|
||||||
# Select the this using the ID to avoid mismatches
|
# Select the this using the ID to avoid mismatches
|
||||||
@@ -36,7 +35,6 @@
|
|||||||
defaultGateway = "10.0.44.1";
|
defaultGateway = "10.0.44.1";
|
||||||
hosts = {
|
hosts = {
|
||||||
"84.88.53.236" = [ "apex" ];
|
"84.88.53.236" = [ "apex" ];
|
||||||
"10.0.44.1" = [ "raccoon" ];
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,10 @@
|
|||||||
let
|
let
|
||||||
website = pkgs.stdenv.mkDerivation {
|
website = pkgs.stdenv.mkDerivation {
|
||||||
name = "jungle-web";
|
name = "jungle-web";
|
||||||
src = pkgs.fetchgit {
|
src = theFlake;
|
||||||
url = "https://jungle.bsc.es/git/rarias/jungle-website.git";
|
|
||||||
rev = "739bf0175a7f05380fe7ad7023ff1d60db1710e1";
|
|
||||||
hash = "sha256-ea5DzhYTzZ9TmqD+x95rdNdLbxPnBluqlYH2NmBYmc4=";
|
|
||||||
};
|
|
||||||
buildInputs = [ pkgs.hugo ];
|
buildInputs = [ pkgs.hugo ];
|
||||||
buildPhase = ''
|
buildPhase = ''
|
||||||
|
cd web
|
||||||
rm -rf public/
|
rm -rf public/
|
||||||
hugo
|
hugo
|
||||||
'';
|
'';
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
../common/ssf.nix
|
../common/ssf.nix
|
||||||
../module/hut-substituter.nix
|
|
||||||
];
|
];
|
||||||
|
|
||||||
# Select this using the ID to avoid mismatches
|
# Select this using the ID to avoid mismatches
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ let
|
|||||||
hut = [ keys.hosts.hut ] ++ adminsKeys;
|
hut = [ keys.hosts.hut ] ++ adminsKeys;
|
||||||
fox = [ keys.hosts.fox ] ++ adminsKeys;
|
fox = [ keys.hosts.fox ] ++ adminsKeys;
|
||||||
apex = [ keys.hosts.apex ] ++ adminsKeys;
|
apex = [ keys.hosts.apex ] ++ adminsKeys;
|
||||||
raccoon = [ keys.hosts.raccoon ] ++ adminsKeys;
|
|
||||||
mon = [ keys.hosts.hut keys.hosts.tent ] ++ adminsKeys;
|
mon = [ keys.hosts.hut keys.hosts.tent ] ++ adminsKeys;
|
||||||
tent = [ keys.hosts.tent ] ++ adminsKeys;
|
tent = [ keys.hosts.tent ] ++ adminsKeys;
|
||||||
# Only expose ceph keys to safe nodes and admins
|
# Only expose ceph keys to safe nodes and admins
|
||||||
@@ -30,5 +29,4 @@ in
|
|||||||
|
|
||||||
"wg-fox.age".publicKeys = fox;
|
"wg-fox.age".publicKeys = fox;
|
||||||
"wg-apex.age".publicKeys = apex;
|
"wg-apex.age".publicKeys = apex;
|
||||||
"wg-raccoon.age".publicKeys = raccoon;
|
|
||||||
}
|
}
|
||||||
|
|||||||
1
web/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
./public
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
---
|
|
||||||
title: "{{ replace .Name "-" " " | title }}"
|
|
||||||
date: {{ .Date }}
|
|
||||||
draft: true
|
|
||||||
---
|
|
||||||
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||

|
|
||||||
|
|
||||||
Welcome to the jungle, a set of machines with no imposed rules that are fully
|
|
||||||
controlled and maintained by their users.
|
|
||||||
|
|
||||||
The configuration of all the machines is written in a centralized [git
|
|
||||||
repository][config] using the Nix language for NixOS. Changes in the
|
|
||||||
configuration of the machines are introduced by merge requests and pass a review
|
|
||||||
step before being deployed.
|
|
||||||
|
|
||||||
[config]: https://pm.bsc.es/gitlab/rarias/jungle
|
|
||||||
|
|
||||||
The machines have access to the large list of packages available in
|
|
||||||
[Nixpkgs][nixpkgs] and a custom set of packages named [bscpkgs][bscpkgs],
|
|
||||||
specifically tailored to our needs for HPC machines. Users can install their own
|
|
||||||
packages and made them system-wide available by opening a merge request.
|
|
||||||
|
|
||||||
[nixpkgs]: https://github.com/NixOS/nixpkgs
|
|
||||||
[bscpkgs]: https://pm.bsc.es/gitlab/rarias/bscpkgs
|
|
||||||
|
|
||||||
We have put a lot of effort to guarantee very good reproducibility properties in
|
|
||||||
the configuration of the machines and the software they use.
|
|
||||||
|
|
||||||
To enter the jungle machines follow the [instructions](access) to submit a
|
|
||||||
request.
|
|
||||||
|
Before Width: | Height: | Size: 470 KiB |
@@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Enter the jungle"
|
|
||||||
description: "Request access to the machines"
|
|
||||||
---
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
To request access to the machines we will need some information:
|
|
||||||
|
|
||||||
1. Which machines you want access to ([hut](/hut), [fox](/fox), owl1, owl2, eudy, koro...)
|
|
||||||
1. Your user name (make sure it matches the one you use for the BSC intranet)
|
|
||||||
1. Your real name and surname (for identification purposes)
|
|
||||||
1. The salted hash of your login password, generated with `mkpasswd -m sha-512`
|
|
||||||
1. An SSH public key of type Ed25519 (can be generated with `ssh-keygen -t ed25519`)
|
|
||||||
|
|
||||||
Send an email to <jungle@bsc.es> with the details.
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Docs"
|
|
||||||
description: "Documentation for users of jungle machines"
|
|
||||||
date: 2023-09-15
|
|
||||||
---
|
|
||||||
|
|
||||||
If this is the first time you use any of the jungle machines with NixOS, follow
|
|
||||||
the [quick start guide](quickstart).
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,234 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Quick start"
|
|
||||||
date: 2023-09-15
|
|
||||||
---
|
|
||||||
|
|
||||||
This documentation will guide you on how to build custom packages of software
|
|
||||||
and use them in the jungle machines. It has been designed to reduce the friction
|
|
||||||
from users coming from module systems.
|
|
||||||
|
|
||||||
You should be able to access the jungle machines, otherwise [request
|
|
||||||
access](/access).
|
|
||||||
|
|
||||||
## Changes from other HPC machines
|
|
||||||
|
|
||||||
Users of other machines have been using the Lmod tool (module load ...) to add
|
|
||||||
or remove programs from their environment, as well as manually building their
|
|
||||||
own software for too many years.
|
|
||||||
|
|
||||||
While we cannot prevent users from continuing to use this tedious mechanism, we
|
|
||||||
have designed the jungle machines to be much easier to operate by using the nix
|
|
||||||
package manager.
|
|
||||||
|
|
||||||
### Freedom to install packages
|
|
||||||
|
|
||||||
When a user wanted to install a package, it was forced to either do it on its
|
|
||||||
own directory, or request a system administrator to install it in a shared
|
|
||||||
directory, so other users can also use that package.
|
|
||||||
|
|
||||||
This situation is gone, each user can install any package of software by
|
|
||||||
themselves, without requiring any other authorization. When two users request
|
|
||||||
the same package, the same copy will be provided.
|
|
||||||
|
|
||||||
A new package will be downloaded if it is available (someone already built it)
|
|
||||||
or will be built from source on demand.
|
|
||||||
|
|
||||||
### No changes over time
|
|
||||||
|
|
||||||
All users retain the same versions of the packages they request until they
|
|
||||||
decide to update them.
|
|
||||||
|
|
||||||
## Using nix to manage packages
|
|
||||||
|
|
||||||
In this chapter we show how to install packages and enter a development shell to
|
|
||||||
build new programs from source. The examples are done from the hut machine,
|
|
||||||
read [this page](/access) to request access.
|
|
||||||
|
|
||||||
### Installing binaries
|
|
||||||
|
|
||||||
To temporarily install new packages, use:
|
|
||||||
|
|
||||||
```text
|
|
||||||
hut% nix shell jungle#gcc jungle#cowsay jungle#ovni
|
|
||||||
```
|
|
||||||
|
|
||||||
Notice that the packages are described as two parts divided by the `#` symbol.
|
|
||||||
The first part defines where to take the package from and the second part is
|
|
||||||
the name of the package. For now we will use `jungle#<package>`. You can find
|
|
||||||
many more packages here:
|
|
||||||
|
|
||||||
<https://search.nixos.org/packages>
|
|
||||||
|
|
||||||
You will now enter a new shell, where those requested package **binaries are
|
|
||||||
available in $PATH**:
|
|
||||||
|
|
||||||
```text
|
|
||||||
hut% cowsay hello world
|
|
||||||
_____________
|
|
||||||
< hello world >
|
|
||||||
-------------
|
|
||||||
\ ^__^
|
|
||||||
\ (oo)\_______
|
|
||||||
(__)\ )\/\
|
|
||||||
||----w |
|
|
||||||
|| ||
|
|
||||||
|
|
||||||
hut% ovniver
|
|
||||||
LD_LIBRARY_PATH not set
|
|
||||||
libovni: build v1.11.0 (a7103f8), dynamic v1.11.0 (a7103f8)
|
|
||||||
|
|
||||||
hut% gcc --version
|
|
||||||
gcc (GCC) 13.3.0
|
|
||||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
|
||||||
This is free software; see the source for copying conditions. There is NO
|
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
```
|
|
||||||
|
|
||||||
### Building programs
|
|
||||||
|
|
||||||
The above method only loads new binaries in the `$PATH`. If we try to build a
|
|
||||||
program that includes headers or links with a library, it will fail to find
|
|
||||||
them:
|
|
||||||
|
|
||||||
```text
|
|
||||||
hut$ cat test.c
|
|
||||||
#include <ovni.h>
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
ovni_version_check();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
hut% gcc test.c -lovni -o test
|
|
||||||
test.c:1:10: fatal error: ovni.h: No such file or directory
|
|
||||||
1 | #include <ovni.h>
|
|
||||||
| ^~~~~~~~
|
|
||||||
compilation terminated.
|
|
||||||
```
|
|
||||||
|
|
||||||
We could manually add the full path to the ovni include directory with `-I` and
|
|
||||||
the libraries with `-L`, but there is a tool that already perform these steps
|
|
||||||
automatically for us, `nix develop`.
|
|
||||||
|
|
||||||
Let's go back to our original shell first, where those packages are not
|
|
||||||
available anymore:
|
|
||||||
|
|
||||||
```
|
|
||||||
hut% ps
|
|
||||||
PID TTY TIME CMD
|
|
||||||
2356260 pts/1 00:00:01 zsh
|
|
||||||
2457268 pts/1 00:00:00 zsh
|
|
||||||
2457297 pts/1 00:00:00 ps
|
|
||||||
hut% exit
|
|
||||||
hut% ovniver
|
|
||||||
ovniver: command not found
|
|
||||||
```
|
|
||||||
|
|
||||||
### Creating a flake.nix
|
|
||||||
|
|
||||||
To define which packages we want, we will write a small file that list them, a
|
|
||||||
flake.nix file.
|
|
||||||
|
|
||||||
First, we will create a new directory where we are going to be working:
|
|
||||||
|
|
||||||
```
|
|
||||||
hut% mkdir example
|
|
||||||
hut% cd exmple
|
|
||||||
```
|
|
||||||
|
|
||||||
Then place this flake.nix file:
|
|
||||||
|
|
||||||
```nix
|
|
||||||
{
|
|
||||||
inputs.jungle.url = "jungle";
|
|
||||||
outputs = { self, jungle }:
|
|
||||||
let
|
|
||||||
pkgs = jungle.outputs.packages.x86_64-linux;
|
|
||||||
in {
|
|
||||||
devShells.x86_64-linux.default = pkgs.mkShell {
|
|
||||||
pname = "devshell";
|
|
||||||
buildInputs = with pkgs; [
|
|
||||||
ovni gcc cowsay # more packages here...
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
Now enter the shell with:
|
|
||||||
|
|
||||||
```
|
|
||||||
hut% nix develop
|
|
||||||
warning: creating lock file '/home/Computational/rarias/example/flake.lock':
|
|
||||||
• Added input 'jungle':
|
|
||||||
'path:/nix/store/27srv8haj6vv4ywrbmw0a8vds561m8rq-source?lastModified=1739479441&narHash=sha256-Kgjs8SO1w9NbPBu8ghwzCxYJ9kvWpoQOT%2BXwPvA9DcU%3D&rev=76396c0d67ef0cf32377d5c1894bb695293bca9d' (2025-02-13)
|
|
||||||
• Added input 'jungle/agenix':
|
|
||||||
'github:ryantm/agenix/f6291c5935fdc4e0bef208cfc0dcab7e3f7a1c41?narHash=sha256-b%2Buqzj%2BWa6xgMS9aNbX4I%2BsXeb5biPDi39VgvSFqFvU%3D' (2024-08-10)
|
|
||||||
• Added input 'jungle/agenix/darwin':
|
|
||||||
'github:lnl7/nix-darwin/4b9b83d5a92e8c1fbfd8eb27eda375908c11ec4d?narHash=sha256-gzGLZSiOhf155FW7262kdHo2YDeugp3VuIFb4/GGng0%3D' (2023-11-24)
|
|
||||||
• Added input 'jungle/agenix/darwin/nixpkgs':
|
|
||||||
follows 'jungle/agenix/nixpkgs'
|
|
||||||
• Added input 'jungle/agenix/home-manager':
|
|
||||||
'github:nix-community/home-manager/3bfaacf46133c037bb356193bd2f1765d9dc82c1?narHash=sha256-7ulcXOk63TIT2lVDSExj7XzFx09LpdSAPtvgtM7yQPE%3D' (2023-12-20)
|
|
||||||
• Added input 'jungle/agenix/home-manager/nixpkgs':
|
|
||||||
follows 'jungle/agenix/nixpkgs'
|
|
||||||
• Added input 'jungle/agenix/nixpkgs':
|
|
||||||
follows 'jungle/nixpkgs'
|
|
||||||
• Added input 'jungle/agenix/systems':
|
|
||||||
'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e?narHash=sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768%3D' (2023-04-09)
|
|
||||||
• Added input 'jungle/bscpkgs':
|
|
||||||
'git+https://git.sr.ht/~rodarima/bscpkgs?ref=refs/heads/master&rev=6782fc6c5b5a29e84a7f2c2d1064f4bcb1288c0f' (2024-11-29)
|
|
||||||
• Added input 'jungle/bscpkgs/nixpkgs':
|
|
||||||
follows 'jungle/nixpkgs'
|
|
||||||
• Added input 'jungle/nixpkgs':
|
|
||||||
'github:NixOS/nixpkgs/9c6b49aeac36e2ed73a8c472f1546f6d9cf1addc?narHash=sha256-i/UJ5I7HoqmFMwZEH6vAvBxOrjjOJNU739lnZnhUln8%3D' (2025-01-14)
|
|
||||||
|
|
||||||
hut$
|
|
||||||
```
|
|
||||||
|
|
||||||
Notice that long list of messages is Nix creating a new flake.lock file with the
|
|
||||||
current state of the packages. Next invocations will use the same packages as
|
|
||||||
described by the lock file.
|
|
||||||
|
|
||||||
### Building a program from nix develop
|
|
||||||
|
|
||||||
Now let's try again building our test program:
|
|
||||||
|
|
||||||
```text
|
|
||||||
hut$ cat test.c
|
|
||||||
#include <ovni.h>
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
ovni_version_check();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
hut$ gcc test.c -o test -lovni
|
|
||||||
hut$ ldd test
|
|
||||||
linux-vdso.so.1 (0x00007ffff7fc4000)
|
|
||||||
libovni.so.1 => /nix/store/sqk972akjv0q8dchn8ccjln2llzyyfd0-ovni-1.11.0/lib/libovni.so.1 (0x00007ffff7fab000)
|
|
||||||
libc.so.6 => /nix/store/nqb2ns2d1lahnd5ncwmn6k84qfd7vx2k-glibc-2.40-36/lib/libc.so.6 (0x00007ffff7db2000)
|
|
||||||
/nix/store/nqb2ns2d1lahnd5ncwmn6k84qfd7vx2k-glibc-2.40-36/lib/ld-linux-x86-64.so.2 => /nix/store/nqb2ns2d1lahnd5ncwmn6k84qfd7vx2k-glibc-2.40-36/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fc6000)
|
|
||||||
hut$ ./test
|
|
||||||
```
|
|
||||||
|
|
||||||
Now the ovni.h header and the libovni library are found and the program is
|
|
||||||
successfully built, linked and executed.
|
|
||||||
|
|
||||||
You can add more packages as needed in your flake.nix:
|
|
||||||
|
|
||||||
```nix
|
|
||||||
buildInputs = with pkgs; [
|
|
||||||
ovni gcc cowsay # more packages here...
|
|
||||||
];
|
|
||||||
```
|
|
||||||
|
|
||||||
Make sure you exit the develop shell first, and then enter again with `nix
|
|
||||||
develop`.
|
|
||||||
|
|
||||||
## Remember
|
|
||||||
|
|
||||||
- `nix shell` places binaries in the `$PATH`.
|
|
||||||
- `nix develop` enters a development shell where both binaries and the libraries
|
|
||||||
and includes are available so you can build new programs.
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Eudy"
|
|
||||||
description: "Linux kernel experiments"
|
|
||||||
---
|
|
||||||
|
|
||||||
[](https://commons.wikimedia.org/w/index.php?curid=5817408)
|
|
||||||
|
|
||||||
The *eudy* machine is destined as a playground for Linux kernel experiments. The
|
|
||||||
name is a shorthand of the Eudyptula species of little penguins found the New
|
|
||||||
Zealand and Australia.
|
|
||||||
|
Before Width: | Height: | Size: 210 KiB |
@@ -1,117 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Fox"
|
|
||||||
description: "AMD Genoa 9684X with 2 NVIDIA RTX4000 GPUs"
|
|
||||||
date: 2025-02-12
|
|
||||||
---
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Picture by [Joanne Redwood](https://web.archive.org/web/20191109175146/https://www.inaturalist.org/photos/6568074),
|
|
||||||
[CC0](http://creativecommons.org/publicdomain/zero/1.0/deed.en).
|
|
||||||
|
|
||||||
The *fox* machine is a big GPU server that is configured to run heavy workloads.
|
|
||||||
It has two fast AMD CPUs with large cache and 2 reasonable NVIDIA GPUs. Here are
|
|
||||||
the detailed specifications:
|
|
||||||
|
|
||||||
- 2x AMD GENOA X 9684X DP/UP 96C/192T 2.55G 1,150M 400W SP5 3D V-cach
|
|
||||||
- 24x 32GB DDR5-4800 ECC RDIMM (total 768 GiB of RAM)
|
|
||||||
- 1x 2.5" SSD SATA3 MICRON 5400 MAX 480GB
|
|
||||||
- 2x 2.5" KIOXIA CM7-R 1.92TB NVMe GEN5 PCIe 5x4
|
|
||||||
- 2x NVIDIA RTX4000 ADA Gen 20GB GDDR6 PCIe 4.0
|
|
||||||
|
|
||||||
## Access
|
|
||||||
|
|
||||||
To access the machine, request a SLURM session from [apex](/apex) using the `fox`
|
|
||||||
partition. If you need the machine for performance measurements, use an
|
|
||||||
exclusive reservation:
|
|
||||||
|
|
||||||
apex% salloc -p fox --exclusive
|
|
||||||
|
|
||||||
Otherwise, specify the CPUs that you need so other users can also use the node
|
|
||||||
at the same time:
|
|
||||||
|
|
||||||
apex% salloc -p fox -c 8
|
|
||||||
|
|
||||||
Then use srun to execute an interactive shell:
|
|
||||||
|
|
||||||
apex% srun --pty $SHELL
|
|
||||||
fox%
|
|
||||||
|
|
||||||
Make sure you get all CPUs you expect:
|
|
||||||
|
|
||||||
fox% grep Cpus_allowed_list /proc/self/status
|
|
||||||
Cpus_allowed_list: 0-191
|
|
||||||
|
|
||||||
Follow [these steps](/access) if you don't have access to apex or fox.
|
|
||||||
|
|
||||||
## CUDA
|
|
||||||
|
|
||||||
To use CUDA, you can use the following `flake.nix` placed in a new directory to
|
|
||||||
load all the required dependencies:
|
|
||||||
|
|
||||||
```nix
|
|
||||||
{
|
|
||||||
inputs.jungle.url = "jungle";
|
|
||||||
|
|
||||||
outputs = { jungle, ... }: {
|
|
||||||
devShell.x86_64-linux = let
|
|
||||||
pkgs = jungle.nixosConfigurations.fox.pkgs;
|
|
||||||
in pkgs.mkShell {
|
|
||||||
name = "cuda-env-shell";
|
|
||||||
buildInputs = with pkgs; [
|
|
||||||
git gitRepo gnupg autoconf curl
|
|
||||||
procps gnumake util-linux m4 gperf unzip
|
|
||||||
|
|
||||||
# Cuda packages (more at https://search.nixos.org/packages)
|
|
||||||
cudatoolkit linuxPackages.nvidia_x11
|
|
||||||
cudaPackages.cuda_cudart.static
|
|
||||||
cudaPackages.libcusparse
|
|
||||||
|
|
||||||
libGLU libGL
|
|
||||||
xorg.libXi xorg.libXmu freeglut
|
|
||||||
xorg.libXext xorg.libX11 xorg.libXv xorg.libXrandr zlib
|
|
||||||
ncurses5 stdenv.cc binutils
|
|
||||||
];
|
|
||||||
shellHook = ''
|
|
||||||
export CUDA_PATH=${pkgs.cudatoolkit}
|
|
||||||
export LD_LIBRARY_PATH=/var/run/opengl-driver/lib
|
|
||||||
export SMS=50
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Then just run `nix develop` from the same directory:
|
|
||||||
|
|
||||||
% mkdir cuda
|
|
||||||
% cd cuda
|
|
||||||
% vim flake.nix
|
|
||||||
[...]
|
|
||||||
% nix develop
|
|
||||||
$ nvcc -V
|
|
||||||
nvcc: NVIDIA (R) Cuda compiler driver
|
|
||||||
Copyright (c) 2005-2024 NVIDIA Corporation
|
|
||||||
Built on Tue_Feb_27_16:19:38_PST_2024
|
|
||||||
Cuda compilation tools, release 12.4, V12.4.99
|
|
||||||
Build cuda_12.4.r12.4/compiler.33961263_0
|
|
||||||
|
|
||||||
## AMD uProf
|
|
||||||
|
|
||||||
The [AMD uProf](https://www.amd.com/en/developer/uprof.html) performance
|
|
||||||
analysis tool-suite is installed and ready to use.
|
|
||||||
|
|
||||||
See the [AMD uProf user guide](https://docs.amd.com/r/en-US/57368-uProf-user-guide)
|
|
||||||
([PDF backup for v5.1](https://jungle.bsc.es/pub/57368-uprof-user-guide.pdf))
|
|
||||||
for more details on how to use the tools. To use the GUI make sure that you
|
|
||||||
connect to fox using X11 forwarding.
|
|
||||||
|
|
||||||
## Filesystems
|
|
||||||
|
|
||||||
The machine has several file systems available.
|
|
||||||
|
|
||||||
- `/nfs/home`: The `/home` from apex via NFS, which is also shared with other
|
|
||||||
xeon machines. It has about 2 ms of latency, so not suitable for quick random
|
|
||||||
access.
|
|
||||||
- `/nvme{0,1}/$USER`: The two local NVME disks, very fast and large capacity.
|
|
||||||
- `/tmp`: tmpfs, fast but not backed by a disk. Will be erased on reboot.
|
|
||||||
|
Before Width: | Height: | Size: 126 KiB |
@@ -1,6 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Git"
|
|
||||||
description: "Gitea instance"
|
|
||||||
---
|
|
||||||
|
|
||||||
If you are reading this page, the proxy to the Gitea service is not working.
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Grafana"
|
|
||||||
description: "Monitor metrics"
|
|
||||||
---
|
|
||||||
|
|
||||||
If you are reading this page, the proxy to the Grafana service is not working.
|
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Hut"
|
|
||||||
description: "Control node"
|
|
||||||
date: 2023-06-13T19:36:57+02:00
|
|
||||||
---
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
From the hut we monitor and control other nodes. It consist of one node only,
|
|
||||||
which is available at `hut` or `xeon07`. It runs the following services:
|
|
||||||
|
|
||||||
- Prometheus: to store the monitoring data.
|
|
||||||
- Grafana: to plot the data in the web browser.
|
|
||||||
- Slurmctld: to manage the SLURM nodes.
|
|
||||||
- Gitlab runner: to run CI jobs from Gitlab.
|
|
||||||
- Nix binary cache: to serve cached nix builds
|
|
||||||
|
|
||||||
This node is prone to interruptions from all the services it runs, so it is not
|
|
||||||
a good candidate for low noise executions.
|
|
||||||
|
|
||||||
# Binary cache
|
|
||||||
|
|
||||||
We provide a binary cache in `hut`, with the aim of avoiding unnecessary
|
|
||||||
recompilation of packages.
|
|
||||||
|
|
||||||
The cache should contain common packages from bscpkgs, but we don't provide
|
|
||||||
any guarantee that of what will be available in the cache, or for how long.
|
|
||||||
We recommend following the latest version of the `jungle` flake to avoid cache
|
|
||||||
misses.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
### From NixOS
|
|
||||||
|
|
||||||
In NixOS, we can add the cache through the `nix.settings` option, which will
|
|
||||||
enable it for all builds in the system.
|
|
||||||
|
|
||||||
```nix
|
|
||||||
{ ... }: {
|
|
||||||
nix.settings = {
|
|
||||||
extra-substituters = [ "https://jungle.bsc.es/cache" ];
|
|
||||||
extra-trusted-public-keys = [ "jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0=" ];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Interactively
|
|
||||||
|
|
||||||
The cache can also be specified in a per-command basis through the flags
|
|
||||||
`--substituters` and `--trusted-public-keys`:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
nix build --substituters "https://jungle.bsc.es/cache" --trusted-public-keys "jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0=" <...>
|
|
||||||
```
|
|
||||||
|
|
||||||
Note: you'll have to be a trusted user.
|
|
||||||
|
|
||||||
### Nix configuration file (non-nixos)
|
|
||||||
|
|
||||||
If using nix outside of NixOS, you'll have to update `/etc/nix/nix.conf`
|
|
||||||
|
|
||||||
```
|
|
||||||
# echo "extra-substituters = https://jungle.bsc.es/cache" >> /etc/nix/nix.conf
|
|
||||||
# echo "extra-trusted-public-keys = jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0=" >> /etc/nix/nix.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
### Hint in flakes
|
|
||||||
|
|
||||||
By adding the configuration below to a `flake.nix`, when someone uses the flake,
|
|
||||||
`nix` will interactively ask to trust and use the provided binary cache:
|
|
||||||
|
|
||||||
```nix
|
|
||||||
{
|
|
||||||
nixConfig = {
|
|
||||||
extra-substituters = [
|
|
||||||
"https://jungle.bsc.es/cache"
|
|
||||||
];
|
|
||||||
extra-trusted-public-keys = [
|
|
||||||
"jungle.bsc.es:pEc7MlAT0HEwLQYPtpkPLwRsGf80ZI26aj29zMw/HH0="
|
|
||||||
];
|
|
||||||
};
|
|
||||||
outputs = { ... }: {
|
|
||||||
...
|
|
||||||
};
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Querying the cache
|
|
||||||
|
|
||||||
Check if the cache is available:
|
|
||||||
```sh
|
|
||||||
$ curl https://jungle.bsc.es/cache/nix-cache-info
|
|
||||||
StoreDir: /nix/store
|
|
||||||
WantMassQuery: 1
|
|
||||||
Priority: 30
|
|
||||||
```
|
|
||||||
|
|
||||||
Prevent nix from building locally:
|
|
||||||
```bash
|
|
||||||
nix build --max-jobs 0 <...>
|
|
||||||
```
|
|
||||||
|
|
||||||
Check if a package is in cache:
|
|
||||||
```bash
|
|
||||||
# Do a raw eval on the <package>.outPath (this should not build the package)
|
|
||||||
$ nix eval --raw jungle#openmp.outPath
|
|
||||||
/nix/store/dwnn4dgm1m4184l4xbi0qfrprji9wjmi-openmp-2024.11
|
|
||||||
# Take the hash (everything from / to - in the basename) and curl <hash>.narinfo
|
|
||||||
# if it exists in the cache, it will return HTTP 200 and some information
|
|
||||||
# if not, it will return 404
|
|
||||||
$ curl https://jungle.bsc.es/cache/dwnn4dgm1m4184l4xbi0qfrprji9wjmi.narinfo
|
|
||||||
StorePath: /nix/store/dwnn4dgm1m4184l4xbi0qfrprji9wjmi-openmp-2024.11
|
|
||||||
URL: nar/dwnn4dgm1m4184l4xbi0qfrprji9wjmi-17imkdfqzmnb013d14dx234bx17bnvws8baf3ii1xra5qi2y1wiz.nar
|
|
||||||
Compression: none
|
|
||||||
NarHash: sha256:17imkdfqzmnb013d14dx234bx17bnvws8baf3ii1xra5qi2y1wiz
|
|
||||||
NarSize: 1519328
|
|
||||||
References: 4gk773fqcsv4fh2rfkhs9bgfih86fdq8-gcc-13.3.0-lib nqb2ns2d1lahnd5ncwmn6k84qfd7vx2k-glibc-2.40-36
|
|
||||||
Deriver: vcn0x8hikc4mvxdkvrdxp61bwa5r7lr6-openmp-2024.11.drv
|
|
||||||
Sig: jungle.bsc.es:GDTOUEs1jl91wpLbb+gcKsAZjpKdARO9j5IQqb3micBeqzX2M/NDtKvgCS1YyiudOUdcjwa3j+hyzV2njokcCA==
|
|
||||||
# In oneline:
|
|
||||||
$ curl "https://jungle.bsc.es/cache/$(nix eval --raw jungle#<package>.outPath | cut -d '/' -f4 | cut -d '-' -f1).narinfo"
|
|
||||||
```
|
|
||||||
|
|
||||||
#### References
|
|
||||||
|
|
||||||
- https://nix.dev/guides/recipes/add-binary-cache.html
|
|
||||||
- https://nixos.wiki/wiki/Binary_Cache
|
|
||||||
|
Before Width: | Height: | Size: 178 KiB |
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Lake"
|
|
||||||
description: "Data storage"
|
|
||||||
date: 2023-06-13T19:36:57+02:00
|
|
||||||
draft: true
|
|
||||||
---
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Data storage
|
|
||||||
|
Before Width: | Height: | Size: 144 KiB |
@@ -1,6 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Lists"
|
|
||||||
description: "Mailing lists"
|
|
||||||
---
|
|
||||||
|
|
||||||
If you are reading this page, the proxy to the public-inbox service is not working.
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Owl"
|
|
||||||
description: "Low system noise"
|
|
||||||
---
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Much like the silent flight of an owl at night, these nodes are configured to
|
|
||||||
minimize the system noise and let programs run undisturbed. The list of nodes is
|
|
||||||
`owl[1-2]` and are available for jobs with SLURM.
|
|
||||||
|
|
||||||
The contents of the nix store of the hut node is made available in the owl nodes
|
|
||||||
when a job is running. This allows jobs to access the same paths that are on hut
|
|
||||||
to load dependencies.
|
|
||||||
|
|
||||||
For now, only the hut node can be used to build new derivations so that they
|
|
||||||
appear in the compute nodes. This applies to the `nix build`, `nix develop` and
|
|
||||||
`nix shell` commands.
|
|
||||||
|
Before Width: | Height: | Size: 49 KiB |
@@ -1,68 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Paste"
|
|
||||||
description: "Paste service"
|
|
||||||
author: "Rodrigo Arias Mallo"
|
|
||||||
date: 2024-09-20
|
|
||||||
---
|
|
||||||
|
|
||||||
The tent machine provides a paste service using the program `p` (as in paste).
|
|
||||||
|
|
||||||
You can use it directly from the tent machine or remotely if you have [SSH
|
|
||||||
access](/access) to tent using the following alias:
|
|
||||||
|
|
||||||
```
|
|
||||||
alias p="ssh tent p"
|
|
||||||
```
|
|
||||||
|
|
||||||
You can add it to bashrc or zshrc for persistent installation.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
The `p` command reads from the standard input, uploads the content to a file
|
|
||||||
in the local filesystem and prints the URL to access it. It only accepts an
|
|
||||||
optional argument, which is the extension of the file that will be stored on
|
|
||||||
disk (without the dot). By default it uses the `txt` extension, so plain text
|
|
||||||
can be read in the browser directly.
|
|
||||||
|
|
||||||
```
|
|
||||||
p [extension]
|
|
||||||
```
|
|
||||||
|
|
||||||
To remove files, go to `/var/lib/p/$USER` and remove them manually.
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
Share a text file, in this case the source of p itself:
|
|
||||||
|
|
||||||
```
|
|
||||||
tent% p < m/tent/p.nix
|
|
||||||
https://jungle.bsc.es/p/rarias/okbtG130.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
Paste the last dmesg lines directly from a pipe:
|
|
||||||
|
|
||||||
```
|
|
||||||
tent% dmesg | tail -5 | p
|
|
||||||
https://jungle.bsc.es/p/rarias/luX4STm9.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
Upload a PNG picture from a file:
|
|
||||||
|
|
||||||
```
|
|
||||||
hop% p png < mark-api-cpu.png
|
|
||||||
https://jungle.bsc.es/p/rarias/oSRAMVsE.png
|
|
||||||
```
|
|
||||||
|
|
||||||
Take an screenshot and upload it as a PNG file:
|
|
||||||
|
|
||||||
```
|
|
||||||
hop% scrot -s - | p png
|
|
||||||
https://jungle.bsc.es/p/rarias/SOgK5EV0.png
|
|
||||||
```
|
|
||||||
|
|
||||||
Upload a directory by creating a tar.gz file on the fly:
|
|
||||||
|
|
||||||
```
|
|
||||||
hop% tar c ovni | gzip | p tar.gz
|
|
||||||
https://jungle.bsc.es/p/rarias/tkwROcTR.tar.gz
|
|
||||||
```
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Update 2023-09-12"
|
|
||||||
author: "Rodrigo Arias Mallo"
|
|
||||||
date: 2023-09-12
|
|
||||||
---
|
|
||||||
|
|
||||||
This is a summary of notable changes introduced in the jungle cluster in the
|
|
||||||
last months.
|
|
||||||
|
|
||||||
### New Ceph filesystem available
|
|
||||||
|
|
||||||
We have installed the latest [Ceph filesystem][1] (18.2.0) which stores three
|
|
||||||
redundant copies of the data so a failure in one disk doesn't cause data loss.
|
|
||||||
It is mounted in /ceph and available for use in the owl1, owl2 and hut
|
|
||||||
nodes. For now it provides 2.8 TiB of space and it is expected to
|
|
||||||
increase when the last storage node is installed.
|
|
||||||
|
|
||||||
[1]: https://en.wikipedia.org/wiki/Ceph_(software)
|
|
||||||
|
|
||||||
The throughput is limited by the 1 Gigabit Ethernet speed, but should be
|
|
||||||
reasonably fast for most workloads. Here is a test with dd which reaches the
|
|
||||||
network limit:
|
|
||||||
|
|
||||||
```txt
|
|
||||||
hut% dd if=/dev/urandom of=/ceph/rarias/urandom bs=1M count=1024
|
|
||||||
1024+0 records in
|
|
||||||
1024+0 records out
|
|
||||||
1073741824 bytes (1,1 GB, 1,0 GiB) copied, 8,98544 s, 119 MB/s
|
|
||||||
```
|
|
||||||
|
|
||||||
### SLURM power save
|
|
||||||
|
|
||||||
The SLURM daemon has been configured to power down the nodes after one hour of
|
|
||||||
idling. When a new job is allocated to a node that is powered off, it is
|
|
||||||
automatically turned on and as soon as it becomes available it will execute the
|
|
||||||
job. Here is an example with two nodes that boot and execute a simple job that
|
|
||||||
shows the date.
|
|
||||||
|
|
||||||
```txt
|
|
||||||
hut% date; srun -N 2 date
|
|
||||||
2023-09-12T17:36:09 CEST
|
|
||||||
2023-09-12T17:38:26 CEST
|
|
||||||
2023-09-12T17:38:18 CEST
|
|
||||||
```
|
|
||||||
|
|
||||||
You can expect a similar delay (around 2-3 min) while the nodes are starting.
|
|
||||||
Notice that while the nodes are kept on, the delay is not noticeable:
|
|
||||||
|
|
||||||
```txt
|
|
||||||
hut% date; srun -N 2 date
|
|
||||||
2023-09-12T17:40:04 CEST
|
|
||||||
2023-09-12T17:40:04 CEST
|
|
||||||
2023-09-12T17:40:04 CEST
|
|
||||||
```
|
|
||||||
|
|
||||||
### Power and temperature monitoring
|
|
||||||
|
|
||||||
In the cluster, we monitor the temperature and the power draw of all nodes. This
|
|
||||||
allows us to understand which machines are not being used and turn them off to
|
|
||||||
save energy that otherwise would be wasted. Here is an example where some nodes
|
|
||||||
are powered off to save energy:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
We also configured the nodes to work at low CPU frequencies, so the temperature
|
|
||||||
is kept low to increase the lifespan of the node components. Towards these
|
|
||||||
goals, we have configured two alerts that trigger when the CPUs of a node
|
|
||||||
exceeds the limit temperature of 80 °C or when the power draw exceeds 350 W.
|
|
||||||
|
|
||||||
By keeping the power consumption and temperatures controlled, we can safely
|
|
||||||
incorporate more machines that will only be used on demand.
|
|
||||||
|
Before Width: | Height: | Size: 58 KiB |
@@ -1,49 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Update 2025-09-26"
|
|
||||||
author: "Rodrigo Arias Mallo"
|
|
||||||
date: 2025-09-26
|
|
||||||
---
|
|
||||||
|
|
||||||
This is a summary of notable changes introduced in the last two years. We
|
|
||||||
continue to maintain all machines updated to the last NixOS release (currently
|
|
||||||
NixOS 25.05).
|
|
||||||
|
|
||||||
### New compute node: fox
|
|
||||||
|
|
||||||
We have a new [fox machine](/fox), with two AMD Genoa 9684X CPUs and two NVIDIA
|
|
||||||
RTX4000 GPUs. During the last months we have been doing some tests and it seems
|
|
||||||
that most of the components work well. We have configured CUDA to use the NVIDIA
|
|
||||||
GPUs, as well as AMD uProf to trace performance and energy counters from the
|
|
||||||
CPUs.
|
|
||||||
|
|
||||||
### Upgraded login node: apex
|
|
||||||
|
|
||||||
We have upgraded the operating system on the login node to NixOS, which now runs
|
|
||||||
Linux 6.15.6. During the upgrade, we have detected a problem with the storage
|
|
||||||
disks. The `/` and `/home` partitions sit on a
|
|
||||||
[RAID 5](https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_5),
|
|
||||||
transparently handled by a RAID hardware controller which starts its own
|
|
||||||
firmware before passing the control to the BIOS to continue the boot sequence. A
|
|
||||||
problem during the startup of the firmware prevented the node to even reach the
|
|
||||||
BIOS screen.
|
|
||||||
|
|
||||||
After a long debugging session, we detected that the flash memory that stores
|
|
||||||
the firmware of the hardware controller was likely to be the issue, since
|
|
||||||
[memory cells](https://en.wikipedia.org/wiki/Flash_memory#Principles_of_operation)
|
|
||||||
may lose charge over time and can end up corrupting the content. We flashed
|
|
||||||
the latest firmware so the memory cells are charged again with the new bits and
|
|
||||||
that fixed the problem. Hopefully we will be able to use it for some more years.
|
|
||||||
|
|
||||||
The SLURM server has been moved to apex which allows users to also submit jobs
|
|
||||||
to fox.
|
|
||||||
|
|
||||||
### Migrated machines to BSC building
|
|
||||||
|
|
||||||
The server room had a temperature issue that had been affecting our machines
|
|
||||||
since the end of February of 2025. As the summer approached, the temperature
|
|
||||||
exceeded the safe limits for our hardware, so we had to shutdown the cluster.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Since then, we have moved the cluster to BSC premises, where it now rests at a
|
|
||||||
stable temperature, so hopefully we won't have more unscheduled downtime.
|
|
||||||
|
Before Width: | Height: | Size: 97 KiB |
@@ -1,40 +0,0 @@
|
|||||||
baseURL = 'https://jungle.bsc.es/'
|
|
||||||
languageCode = 'en-us'
|
|
||||||
title = 'The jungle'
|
|
||||||
theme = 'PaperMod'
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
identifier = "doc"
|
|
||||||
name = "Docs"
|
|
||||||
url = "/doc/"
|
|
||||||
weight = 10
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
identifier = "grafana"
|
|
||||||
name = "Grafana"
|
|
||||||
url = "/grafana/"
|
|
||||||
weight = 20
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
identifier = "Git"
|
|
||||||
name = "Git"
|
|
||||||
url = "/git/"
|
|
||||||
weight = 30
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
identifier = "Lists"
|
|
||||||
name = "Lists"
|
|
||||||
url = "/lists/"
|
|
||||||
weight = 40
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
identifier = "Paste"
|
|
||||||
name = "Paste"
|
|
||||||
url = "/paste/"
|
|
||||||
weight = 50
|
|
||||||
|
|
||||||
[[menu.main]]
|
|
||||||
identifier = "Posts"
|
|
||||||
name = "Posts"
|
|
||||||
url = "/posts/"
|
|
||||||
weight = 60
|
|
||||||
|
Before Width: | Height: | Size: 226 KiB |
|
Before Width: | Height: | Size: 325 KiB |
|
Before Width: | Height: | Size: 424 KiB |
|
Before Width: | Height: | Size: 87 KiB |
@@ -1,50 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Create a report to help us improve
|
|
||||||
title: "[BUG]"
|
|
||||||
labels: bug
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
## READ BEFORE OPENING ISSUES
|
|
||||||
|
|
||||||
Please fill the template below
|
|
||||||
- **DO NOT** ask for instructions.
|
|
||||||
- Use Discussions section if you need help
|
|
||||||
- See project wiki https://github.com/adityatelange/hugo-PaperMod/wiki
|
|
||||||
- Read FAQs section https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs
|
|
||||||
- Search for previous issues/ pull requests
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
<!-- A clear and concise description of what the bug is. -->
|
|
||||||
|
|
||||||
- Device/Os: [e.g. Android 10]
|
|
||||||
- Type: [e.g. Desktop/Mobile]
|
|
||||||
- Browser and version [e.g. Chrome 86.0]:
|
|
||||||
- Hugo Version [ >=0.97.1 expected]:
|
|
||||||
- Theme Version [e.g. v4.0, master, or commit-id ]:
|
|
||||||
|
|
||||||
**Steps to reproduce the behavior:**
|
|
||||||
<!--
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '....'
|
|
||||||
3. Scroll down to '....'
|
|
||||||
4. See error
|
|
||||||
-->
|
|
||||||
|
|
||||||
**Expected behavior**:
|
|
||||||
<!-- A clear and concise description of what you expected to happen. -->
|
|
||||||
|
|
||||||
**Repo/Source where this issue can be reproduced**:
|
|
||||||
<!-- Please link source code of website where the said issue can be reproduced -->
|
|
||||||
|
|
||||||
**Screenshots**
|
|
||||||
<!-- If applicable, add screenshots to help explain your problem. -->
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
<!--Add any other context about the problem here. -->
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
blank_issues_enabled: false
|
|
||||||
contact_links:
|
|
||||||
- name: PaperMod Discussions
|
|
||||||
url: https://github.com/adityatelange/hugo-PaperMod/discussions
|
|
||||||
about: Please ask and answer questions/doubts here, do not open an issue for questions.
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
name: New Blank Issue
|
|
||||||
about: Anything other than bug report
|
|
||||||
title: ""
|
|
||||||
labels: ""
|
|
||||||
assignees: ""
|
|
||||||
---
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
<!--
|
|
||||||
|
|
||||||
## READ BEFORE OPENING A PR
|
|
||||||
|
|
||||||
Thank you for contributing to hugo-PaperMod!
|
|
||||||
Please fill out the following questions to make it easier for us to review your
|
|
||||||
changes. You do not need to check all the boxes below.
|
|
||||||
|
|
||||||
**NOTE**: PaperMod does not have any external dependencies fetched from 3rd party
|
|
||||||
CDN servers. However we do have custom Head/Footer extender templates which you can use
|
|
||||||
to add those to your website.
|
|
||||||
https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#custom-head--footer
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
**What does this PR change? What problem does it solve?**
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Describe the changes and their purpose here, as detailed as and if needed.
|
|
||||||
|
|
||||||
Please do not add 2 unrelated changes in a single PR as it is difficult to track/revert those in future.
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
**Was the change discussed in an issue or in the Discussions before?**
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Link issues and relevant Discussions posts here.
|
|
||||||
|
|
||||||
If this PR resolves an issue on GitHub, use "Closes #1234" so that the issue
|
|
||||||
is closed automatically when this PR is merged.
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
## PR Checklist
|
|
||||||
|
|
||||||
- [ ] This change adds/updates translations and I have used the [template present here](https://github.com/adityatelange/hugo-PaperMod/wiki/Translations#want-to-add-your-language-).
|
|
||||||
- [ ] I have enabled [maintainer edits for this PR](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork).
|
|
||||||
- [ ] I have verified that the code works as described/as intended.
|
|
||||||
- [ ] This change adds a Social Icon which has a permissive license to use it.
|
|
||||||
- [ ] This change **does not** include any CDN resources/links.
|
|
||||||
- [ ] This change **does not** include any unrelated scripts such as bash and python scripts.
|
|
||||||
- [ ] This change updates the overridden internal templates from HUGO's repository.
|
|
||||||
17
web/themes/PaperMod/.github/stale.yml
vendored
@@ -1,17 +0,0 @@
|
|||||||
# Number of days of inactivity before an issue becomes stale
|
|
||||||
daysUntilStale: 7
|
|
||||||
# Number of days of inactivity before a stale issue is closed
|
|
||||||
daysUntilClose: 3
|
|
||||||
# Issues with these labels will never be considered stale
|
|
||||||
exemptLabels:
|
|
||||||
- pinned
|
|
||||||
- keep
|
|
||||||
# Label to use when marking an issue as stale
|
|
||||||
staleLabel: stale
|
|
||||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
|
||||||
markComment: >
|
|
||||||
This issue has been automatically marked as stale because it has not had
|
|
||||||
recent activity. It will be closed if no further activity occurs. Thank you
|
|
||||||
for your contributions.
|
|
||||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
|
||||||
closeComment: false
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
name: Deploy Hugo PaperMod Demo to Pages
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths-ignore:
|
|
||||||
- "images/**"
|
|
||||||
- "LICENSE"
|
|
||||||
- "README.md"
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- exampleSite
|
|
||||||
workflow_dispatch:
|
|
||||||
# manual run
|
|
||||||
inputs:
|
|
||||||
hugoVersion:
|
|
||||||
description: "Hugo Version"
|
|
||||||
required: false
|
|
||||||
default: "0.97.1"
|
|
||||||
|
|
||||||
# Allow one concurrent deployment
|
|
||||||
concurrency:
|
|
||||||
group: "pages"
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
# Default to bash
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
pages: write
|
|
||||||
id-token: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# Build job
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
HUGO_VERSION: "0.97.1"
|
|
||||||
steps:
|
|
||||||
- name: Check version
|
|
||||||
if: ${{ github.event.inputs.hugoVersion }}
|
|
||||||
run: export HUGO_VERSION="${{ github.event.inputs.hugoVersion }}"
|
|
||||||
- name: Install Hugo CLI
|
|
||||||
run: |
|
|
||||||
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_Linux-64bit.deb \
|
|
||||||
&& sudo dpkg -i ${{ runner.temp }}/hugo.deb
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
ref: exampleSite
|
|
||||||
- name: Setup Pages
|
|
||||||
id: pages
|
|
||||||
uses: actions/configure-pages@v1
|
|
||||||
- name: Get Theme
|
|
||||||
run: git submodule update --init --recursive
|
|
||||||
- name: Update theme to Latest commit
|
|
||||||
run: git submodule update --remote --merge
|
|
||||||
- name: Build with Hugo
|
|
||||||
run: |
|
|
||||||
hugo \
|
|
||||||
--buildDrafts --gc --verbose \
|
|
||||||
--baseURL ${{ steps.pages.outputs.base_url }}
|
|
||||||
- name: Upload artifact
|
|
||||||
uses: actions/upload-pages-artifact@v1
|
|
||||||
with:
|
|
||||||
path: ./public
|
|
||||||
# Deployment job
|
|
||||||
deploy:
|
|
||||||
environment:
|
|
||||||
name: github-pages
|
|
||||||
url: ${{ steps.deployment.outputs.page_url }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: build
|
|
||||||
steps:
|
|
||||||
- name: Deploy to GitHub Pages
|
|
||||||
id: deployment
|
|
||||||
uses: actions/deploy-pages@v1
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2020 nanxiaobei and adityatelange
|
|
||||||
Copyright (c) 2021-2023 adityatelange
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
<h1 align=center>Hugo PaperMod | <a href="https://adityatelange.github.io/hugo-PaperMod/" rel="nofollow">Demo</a></h1>
|
|
||||||
|
|
||||||
<h4 align=center>☄️ Fast | ☁️ Fluent | 🌙 Smooth | 📱 Responsive</h4>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
> Hugo PaperMod is a theme based on [hugo-paper](https://github.com/nanxiaobei/hugo-paper).
|
|
||||||
> The goal of this project is to add more features and customization to the og theme.
|
|
||||||
|
|
||||||
**Documentation** can be found here: [**📚 Wiki**](https://github.com/adityatelange/hugo-PaperMod/wiki)
|
|
||||||
|
|
||||||
**ExampleSite** can be found here: [**exampleSite**](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite). Demo is built up with [exampleSite](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite) as source.
|
|
||||||
|
|
||||||
[](https://themes.gohugo.io/themes/hugo-papermod/)
|
|
||||||
[](https://github.com/gohugoio/hugo/releases/tag/v0.97.1)
|
|
||||||
[](https://discord.gg/ahpmTvhVmp)
|
|
||||||
[](https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE)
|
|
||||||

|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<kbd><img src="https://user-images.githubusercontent.com/21258296/114303440-bfc0ae80-9aeb-11eb-8cfa-48a4bb385a6d.png" alt="Mockup image" title="Mockup"/></kbd>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Features/Mods 💥
|
|
||||||
|
|
||||||
- Uses Hugo's asset generator with pipelining, fingerprinting, bundling and minification by default.
|
|
||||||
- 3 Modes:
|
|
||||||
- [Regular Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#regular-mode-default-mode)
|
|
||||||
- [Home-Info Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#home-info-mode)
|
|
||||||
- [Profile Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#profile-mode)
|
|
||||||
- Table of Content Generation (newer implementation).
|
|
||||||
- Archive of posts.
|
|
||||||
- Social Icons (home-info and profile-mode)
|
|
||||||
- Social-Media Share buttons on posts.
|
|
||||||
- Menu location indicator.
|
|
||||||
- Multilingual support. (with language selector)
|
|
||||||
- Taxonomies
|
|
||||||
- Cover image for each post (with Responsive image support).
|
|
||||||
- Light/Dark theme (automatic theme switch a/c to browser theme and theme-switch button).
|
|
||||||
- SEO Friendly.
|
|
||||||
- Multiple Author support.
|
|
||||||
- Search Page with Fuse.js
|
|
||||||
- Other Posts suggestion below a post
|
|
||||||
- Breadcrumb Navigation
|
|
||||||
- Code Block Copy buttons
|
|
||||||
- No webpack, nodejs and other dependencies are required to edit the theme.
|
|
||||||
|
|
||||||
Read Wiki For More Details => **[PaperMod - Features](https://github.com/adityatelange/hugo-PaperMod/wiki/Features)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Install/Update 📥
|
|
||||||
|
|
||||||
Read Wiki For More Details => **[PaperMod - Installation](https://github.com/adityatelange/hugo-PaperMod/wiki/Installation)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## FAQs / How To's Guide 🙋
|
|
||||||
|
|
||||||
Read Wiki For More Details => **[PaperMod-FAQs](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Social-Icons/Share-Icons 🖼️
|
|
||||||
|
|
||||||
Read Wiki For More Details => **[PaperMod-Icons](https://github.com/adityatelange/hugo-PaperMod/wiki/Icons)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Release Changelog 📃
|
|
||||||
|
|
||||||
Release ChangeLog has info about stuff added: **[Releases](https://github.com/adityatelange/hugo-PaperMod/releases)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## [Pagespeed Insights (100% ?)](https://pagespeed.web.dev/report?url=https://adityatelange.github.io/hugo-PaperMod/) 👀
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Support 🫶
|
|
||||||
|
|
||||||
- Star 🌟 this repository.
|
|
||||||
- Help spread the word about PaperMod by sharing it on social media and recommending it to your friends. 🗣️
|
|
||||||
- You can also sponsor 🏅 on [Github Sponsors](https://github.com/sponsors/adityatelange) / [Ko-Fi](https://ko-fi.com/adityatelange).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Special Thanks 🌟
|
|
||||||
|
|
||||||
- [**Highlight.js**](https://github.com/highlightjs/highlight.js)
|
|
||||||
- [**Fuse.js**](https://github.com/krisk/fuse)
|
|
||||||
- [**Feather Icons**](https://github.com/feathericons/feather)
|
|
||||||
- [**Simple Icons**](https://github.com/simple-icons/simple-icons)
|
|
||||||
- **All Contributors and Supporters**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Stargazers over time 📈
|
|
||||||
|
|
||||||
<kbd>[](https://starchart.cc/adityatelange/hugo-PaperMod)</kbd>
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
.not-found {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
height: 80%;
|
|
||||||
font-size: 160px;
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
.archive-posts {
|
|
||||||
width: 100%;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-year {
|
|
||||||
margin-top: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-year:not(:last-of-type) {
|
|
||||||
border-bottom: 2px solid var(--border);
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-month {
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-start;
|
|
||||||
padding: 10px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-month-header {
|
|
||||||
margin: 25px 0;
|
|
||||||
width: 200px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-month:not(:last-of-type) {
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-entry {
|
|
||||||
position: relative;
|
|
||||||
padding: 5px;
|
|
||||||
margin: 10px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-entry-title {
|
|
||||||
margin: 5px 0;
|
|
||||||
font-weight: 400;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-count,
|
|
||||||
.archive-meta {
|
|
||||||
color: var(--secondary);
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
.footer,
|
|
||||||
.top-link {
|
|
||||||
font-size: 12px;
|
|
||||||
color: var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer {
|
|
||||||
max-width: calc(var(--main-width) + var(--gap) * 2);
|
|
||||||
margin: auto;
|
|
||||||
padding: calc((var(--footer-height) - var(--gap)) / 2) var(--gap);
|
|
||||||
text-align: center;
|
|
||||||
line-height: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer span {
|
|
||||||
margin-inline-start: 1px;
|
|
||||||
margin-inline-end: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer span:last-child {
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer a {
|
|
||||||
color: inherit;
|
|
||||||
border-bottom: 1px solid var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer a:hover {
|
|
||||||
border-bottom: 1px solid var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-link {
|
|
||||||
visibility: hidden;
|
|
||||||
position: fixed;
|
|
||||||
bottom: 60px;
|
|
||||||
right: 30px;
|
|
||||||
z-index: 99;
|
|
||||||
background: var(--tertiary);
|
|
||||||
width: 42px;
|
|
||||||
height: 42px;
|
|
||||||
padding: 12px;
|
|
||||||
border-radius: 64px;
|
|
||||||
transition: visibility 0.5s, opacity 0.8s linear;
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-link,
|
|
||||||
.top-link svg {
|
|
||||||
filter: drop-shadow(0px 0px 0px var(--theme));
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer a:hover,
|
|
||||||
.top-link:hover {
|
|
||||||
color: var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-link:focus,
|
|
||||||
#theme-toggle:focus {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
.nav {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: space-between;
|
|
||||||
max-width: calc(var(--nav-width) + var(--gap) * 2);
|
|
||||||
margin-inline-start: auto;
|
|
||||||
margin-inline-end: auto;
|
|
||||||
line-height: var(--header-height);
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav a {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo,
|
|
||||||
#menu {
|
|
||||||
display: flex;
|
|
||||||
margin: auto var(--gap);
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo {
|
|
||||||
flex-wrap: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo a {
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo a img, .logo a svg {
|
|
||||||
display: inline;
|
|
||||||
vertical-align: middle;
|
|
||||||
pointer-events: none;
|
|
||||||
transform: translate(0, -10%);
|
|
||||||
border-radius: 6px;
|
|
||||||
margin-inline-end: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
button#theme-toggle {
|
|
||||||
font-size: 26px;
|
|
||||||
margin: auto 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
body.dark #moon {
|
|
||||||
vertical-align: middle;
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
body:not(.dark) #sun {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu {
|
|
||||||
list-style: none;
|
|
||||||
word-break: keep-all;
|
|
||||||
overflow-x: auto;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu li + li {
|
|
||||||
margin-inline-start: var(--gap);
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu a {
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu .active {
|
|
||||||
font-weight: 500;
|
|
||||||
border-bottom: 2px solid currentColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lang-switch li,
|
|
||||||
.lang-switch ul,
|
|
||||||
.logo-switches {
|
|
||||||
display: inline-flex;
|
|
||||||
margin: auto 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lang-switch {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lang-switch a {
|
|
||||||
margin: auto 3px;
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo-switches {
|
|
||||||
flex-wrap: inherit;
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
.main {
|
|
||||||
position: relative;
|
|
||||||
min-height: calc(100vh - var(--header-height) - var(--footer-height));
|
|
||||||
max-width: calc(var(--main-width) + var(--gap) * 2);
|
|
||||||
margin: auto;
|
|
||||||
padding: var(--gap);
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-header h1 {
|
|
||||||
font-size: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination a {
|
|
||||||
color: var(--theme);
|
|
||||||
font-size: 13px;
|
|
||||||
line-height: 36px;
|
|
||||||
background: var(--primary);
|
|
||||||
border-radius: calc(36px / 2);
|
|
||||||
padding: 0 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination .next {
|
|
||||||
margin-inline-start: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.social-icons {
|
|
||||||
padding: 12px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.social-icons a:not(:last-of-type) {
|
|
||||||
margin-inline-end: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.social-icons a svg {
|
|
||||||
height: 26px;
|
|
||||||
width: 26px;
|
|
||||||
}
|
|
||||||
|
|
||||||
code {
|
|
||||||
direction: ltr;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.highlight,
|
|
||||||
pre {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.copy-code {
|
|
||||||
display: none;
|
|
||||||
position: absolute;
|
|
||||||
top: 4px;
|
|
||||||
right: 4px;
|
|
||||||
color: rgba(255, 255, 255, 0.8);
|
|
||||||
background: rgba(78, 78, 78, 0.8);
|
|
||||||
border-radius: var(--radius);
|
|
||||||
padding: 0 5px;
|
|
||||||
font-size: 14px;
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.highlight:hover .copy-code,
|
|
||||||
pre:hover .copy-code {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
.first-entry {
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
min-height: 320px;
|
|
||||||
margin: var(--gap) 0 calc(var(--gap) * 2) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.first-entry .entry-header {
|
|
||||||
overflow: hidden;
|
|
||||||
display: -webkit-box;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
-webkit-line-clamp: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.first-entry .entry-header h1 {
|
|
||||||
font-size: 34px;
|
|
||||||
line-height: 1.3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.first-entry .entry-content {
|
|
||||||
margin: 14px 0;
|
|
||||||
font-size: 16px;
|
|
||||||
-webkit-line-clamp: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.first-entry .entry-footer {
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.home-info .entry-content {
|
|
||||||
-webkit-line-clamp: unset;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-entry {
|
|
||||||
position: relative;
|
|
||||||
margin-bottom: var(--gap);
|
|
||||||
padding: var(--gap);
|
|
||||||
background: var(--entry);
|
|
||||||
border-radius: var(--radius);
|
|
||||||
transition: transform 0.1s;
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-entry:active {
|
|
||||||
transform: scale(0.96);
|
|
||||||
}
|
|
||||||
|
|
||||||
.tag-entry .entry-cover {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-header h2 {
|
|
||||||
font-size: 24px;
|
|
||||||
line-height: 1.3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-content {
|
|
||||||
margin: 8px 0;
|
|
||||||
color: var(--secondary);
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 1.6;
|
|
||||||
overflow: hidden;
|
|
||||||
display: -webkit-box;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
-webkit-line-clamp: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-footer {
|
|
||||||
color: var(--secondary);
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-link {
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-cover,
|
|
||||||
.entry-isdraft {
|
|
||||||
font-size: 14px;
|
|
||||||
color: var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-cover {
|
|
||||||
margin-bottom: var(--gap);
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-cover img {
|
|
||||||
border-radius: var(--radius);
|
|
||||||
pointer-events: none;
|
|
||||||
width: 100%;
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry-cover a {
|
|
||||||
color: var(--secondary);
|
|
||||||
box-shadow: 0 1px 0 var(--primary);
|
|
||||||
}
|
|
||||||
@@ -1,402 +0,0 @@
|
|||||||
.page-header,
|
|
||||||
.post-header {
|
|
||||||
margin: 24px auto var(--content-gap) auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-title {
|
|
||||||
margin-bottom: 2px;
|
|
||||||
font-size: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-description {
|
|
||||||
margin-top: 10px;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-meta,
|
|
||||||
.breadcrumbs {
|
|
||||||
color: var(--secondary);
|
|
||||||
font-size: 14px;
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-meta .i18n_list li {
|
|
||||||
display: inline-flex;
|
|
||||||
list-style: none;
|
|
||||||
margin: auto 3px;
|
|
||||||
box-shadow: 0 1px 0 var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.breadcrumbs a {
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content {
|
|
||||||
color: var(--content);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content h3,
|
|
||||||
.post-content h4,
|
|
||||||
.post-content h5,
|
|
||||||
.post-content h6 {
|
|
||||||
margin: 24px 0 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content h1 {
|
|
||||||
margin: 40px auto 32px;
|
|
||||||
font-size: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content h2 {
|
|
||||||
margin: 32px auto 24px;
|
|
||||||
font-size: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content h3 {
|
|
||||||
font-size: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content h4 {
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content h5 {
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content h6 {
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content a,
|
|
||||||
.toc a:hover {
|
|
||||||
box-shadow: 0 1px 0;
|
|
||||||
box-decoration-break: clone;
|
|
||||||
-webkit-box-decoration-break: clone;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content a code {
|
|
||||||
margin: auto 0;
|
|
||||||
border-radius: 0;
|
|
||||||
box-shadow: 0 -1px 0 var(--primary) inset;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content del {
|
|
||||||
text-decoration: line-through;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content dl,
|
|
||||||
.post-content ol,
|
|
||||||
.post-content p,
|
|
||||||
.post-content figure,
|
|
||||||
.post-content ul {
|
|
||||||
margin-bottom: var(--content-gap);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content ol,
|
|
||||||
.post-content ul {
|
|
||||||
padding-inline-start: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content li {
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content li p {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content dl {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content dt {
|
|
||||||
width: 25%;
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content dd {
|
|
||||||
width: 75%;
|
|
||||||
margin-inline-start: 0;
|
|
||||||
padding-inline-start: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content dd ~ dd,
|
|
||||||
.post-content dt ~ dt {
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content table {
|
|
||||||
margin-bottom: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content table th,
|
|
||||||
.post-content table:not(.highlighttable, .highlight table, .gist .highlight) td {
|
|
||||||
min-width: 80px;
|
|
||||||
padding: 12px 8px;
|
|
||||||
line-height: 1.5;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content table th {
|
|
||||||
font-size: 14px;
|
|
||||||
text-align: start;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content table:not(.highlighttable) td code:only-child {
|
|
||||||
margin: auto 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content .highlight table {
|
|
||||||
border-radius: var(--radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content .highlight:not(table) {
|
|
||||||
margin: 10px auto;
|
|
||||||
background: var(--hljs-bg) !important;
|
|
||||||
border-radius: var(--radius);
|
|
||||||
direction: ltr;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content li > .highlight {
|
|
||||||
margin-inline-end: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content ul pre {
|
|
||||||
margin-inline-start: calc(var(--gap) * -2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content .highlight pre {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content .highlighttable {
|
|
||||||
table-layout: fixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content .highlighttable td:first-child {
|
|
||||||
width: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content .highlighttable td .linenodiv {
|
|
||||||
padding-inline-end: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content .highlighttable td .highlight,
|
|
||||||
.post-content .highlighttable td .linenodiv pre {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content code {
|
|
||||||
margin: auto 4px;
|
|
||||||
padding: 4px 6px;
|
|
||||||
font-size: 0.78em;
|
|
||||||
line-height: 1.5;
|
|
||||||
background: var(--code-bg);
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content pre code {
|
|
||||||
display: block;
|
|
||||||
margin: auto 0;
|
|
||||||
padding: 10px;
|
|
||||||
color: rgb(213, 213, 214);
|
|
||||||
background: var(--hljs-bg) !important;
|
|
||||||
border-radius: var(--radius);
|
|
||||||
overflow-x: auto;
|
|
||||||
word-break: break-all;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content blockquote {
|
|
||||||
margin: 20px 0;
|
|
||||||
padding: 0 14px;
|
|
||||||
border-inline-start: 3px solid var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content hr {
|
|
||||||
margin: 30px 0;
|
|
||||||
height: 2px;
|
|
||||||
background: var(--tertiary);
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content iframe {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content img {
|
|
||||||
border-radius: 4px;
|
|
||||||
margin: 1rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content img[src*="#center"] {
|
|
||||||
margin: 1rem auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content figure.align-center {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content figure > figcaption {
|
|
||||||
color: var(--primary);
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: bold;
|
|
||||||
margin: 8px 0 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content figure > figcaption > p {
|
|
||||||
color: var(--secondary);
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc {
|
|
||||||
margin: 0 2px 40px 2px;
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
background: var(--code-bg);
|
|
||||||
border-radius: var(--radius);
|
|
||||||
padding: 0.4em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dark .toc {
|
|
||||||
background: var(--entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc details summary {
|
|
||||||
cursor: zoom-in;
|
|
||||||
margin-inline-start: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc details[open] summary {
|
|
||||||
cursor: zoom-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc .details {
|
|
||||||
display: inline;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc .inner {
|
|
||||||
margin: 0 20px;
|
|
||||||
padding: 10px 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc li ul {
|
|
||||||
margin-inline-start: var(--gap);
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc summary:focus {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-footer {
|
|
||||||
margin-top: 56px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-tags li {
|
|
||||||
display: inline-block;
|
|
||||||
margin-inline-end: 3px;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-tags a,
|
|
||||||
.share-buttons,
|
|
||||||
.paginav {
|
|
||||||
border-radius: var(--radius);
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-tags a {
|
|
||||||
display: block;
|
|
||||||
padding-inline-start: 14px;
|
|
||||||
padding-inline-end: 14px;
|
|
||||||
color: var(--secondary);
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 34px;
|
|
||||||
background: var(--code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-tags a:hover,
|
|
||||||
.paginav a:hover {
|
|
||||||
background: var(--border);
|
|
||||||
}
|
|
||||||
|
|
||||||
.share-buttons {
|
|
||||||
margin: 14px 0;
|
|
||||||
padding-inline-start: var(--radius);
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
overflow-x: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.share-buttons a {
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.share-buttons a:not(:last-of-type) {
|
|
||||||
margin-inline-end: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1:hover .anchor,
|
|
||||||
h2:hover .anchor,
|
|
||||||
h3:hover .anchor,
|
|
||||||
h4:hover .anchor,
|
|
||||||
h5:hover .anchor,
|
|
||||||
h6:hover .anchor {
|
|
||||||
display: inline-flex;
|
|
||||||
color: var(--secondary);
|
|
||||||
margin-inline-start: 8px;
|
|
||||||
font-weight: 500;
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.paginav {
|
|
||||||
margin: 10px 0;
|
|
||||||
display: flex;
|
|
||||||
line-height: 30px;
|
|
||||||
border-radius: var(--radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
.paginav a {
|
|
||||||
padding-inline-start: 14px;
|
|
||||||
padding-inline-end: 14px;
|
|
||||||
border-radius: var(--radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
.paginav .title {
|
|
||||||
letter-spacing: 1px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-size: small;
|
|
||||||
color: var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.paginav .prev,
|
|
||||||
.paginav .next {
|
|
||||||
width: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.paginav span:hover:not(.title) {
|
|
||||||
box-shadow: 0 1px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.paginav .next {
|
|
||||||
margin-inline-start: auto;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
[dir="rtl"] .paginav .next {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1>a>svg {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
img.in-text {
|
|
||||||
display: inline;
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
.buttons,
|
|
||||||
.main .profile {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main .profile {
|
|
||||||
align-items: center;
|
|
||||||
min-height: calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.profile .profile_inner h1 {
|
|
||||||
padding: 12px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.profile img {
|
|
||||||
display: inline-table;
|
|
||||||
border-radius: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.buttons {
|
|
||||||
flex-wrap: wrap;
|
|
||||||
max-width: 400px;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button {
|
|
||||||
background: var(--tertiary);
|
|
||||||
border-radius: var(--radius);
|
|
||||||
margin: 8px;
|
|
||||||
padding: 6px;
|
|
||||||
transition: transform 0.1s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button-inner {
|
|
||||||
padding: 0 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button:active {
|
|
||||||
transform: scale(0.96);
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
#searchbox input {
|
|
||||||
padding: 4px 10px;
|
|
||||||
width: 100%;
|
|
||||||
color: var(--primary);
|
|
||||||
font-weight: bold;
|
|
||||||
border: 2px solid var(--tertiary);
|
|
||||||
border-radius: var(--radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchbox input:focus {
|
|
||||||
border-color: var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchResults li {
|
|
||||||
list-style: none;
|
|
||||||
border-radius: var(--radius);
|
|
||||||
padding: 10px;
|
|
||||||
margin: 10px 0;
|
|
||||||
position: relative;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchResults {
|
|
||||||
margin: 10px 0;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchResults li:active {
|
|
||||||
transition: transform 0.1s;
|
|
||||||
transform: scale(0.98);
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchResults a {
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
top: 0px;
|
|
||||||
left: 0px;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#searchResults .focus {
|
|
||||||
transform: scale(0.98);
|
|
||||||
border: 2px solid var(--tertiary);
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
.terms-tags li {
|
|
||||||
display: inline-block;
|
|
||||||
margin: 10px;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
.terms-tags a {
|
|
||||||
display: block;
|
|
||||||
padding: 3px 10px;
|
|
||||||
background: var(--tertiary);
|
|
||||||
border-radius: 6px;
|
|
||||||
transition: transform 0.1s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.terms-tags a:active {
|
|
||||||
background: var(--tertiary);
|
|
||||||
transform: scale(0.96);
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
/*
|
|
||||||
PaperMod v7
|
|
||||||
License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE
|
|
||||||
Copyright (c) 2020 nanxiaobei and adityatelange
|
|
||||||
Copyright (c) 2021-2023 adityatelange
|
|
||||||
*/
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
*,
|
|
||||||
::after,
|
|
||||||
::before {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
html {
|
|
||||||
-webkit-tap-highlight-color: transparent;
|
|
||||||
overflow-y: scroll;
|
|
||||||
}
|
|
||||||
|
|
||||||
a,
|
|
||||||
button,
|
|
||||||
body,
|
|
||||||
h1,
|
|
||||||
h2,
|
|
||||||
h3,
|
|
||||||
h4,
|
|
||||||
h5,
|
|
||||||
h6 {
|
|
||||||
color: var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
|
||||||
font-size: 18px;
|
|
||||||
line-height: 1.6;
|
|
||||||
word-break: break-word;
|
|
||||||
background: var(--theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
article,
|
|
||||||
aside,
|
|
||||||
figcaption,
|
|
||||||
figure,
|
|
||||||
footer,
|
|
||||||
header,
|
|
||||||
hgroup,
|
|
||||||
main,
|
|
||||||
nav,
|
|
||||||
section,
|
|
||||||
table {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1,
|
|
||||||
h2,
|
|
||||||
h3,
|
|
||||||
h4,
|
|
||||||
h5,
|
|
||||||
h6 {
|
|
||||||
line-height: 1.2;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1,
|
|
||||||
h2,
|
|
||||||
h3,
|
|
||||||
h4,
|
|
||||||
h5,
|
|
||||||
h6,
|
|
||||||
p {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
body,
|
|
||||||
figure,
|
|
||||||
ul {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
table {
|
|
||||||
width: 100%;
|
|
||||||
border-collapse: collapse;
|
|
||||||
border-spacing: 0;
|
|
||||||
overflow-x: auto;
|
|
||||||
word-break: keep-all;
|
|
||||||
}
|
|
||||||
|
|
||||||
button,
|
|
||||||
input,
|
|
||||||
textarea {
|
|
||||||
padding: 0;
|
|
||||||
font: inherit;
|
|
||||||
background: 0 0;
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
input,
|
|
||||||
textarea {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
button,
|
|
||||||
input[type=button],
|
|
||||||
input[type=submit] {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
input:-webkit-autofill,
|
|
||||||
textarea:-webkit-autofill {
|
|
||||||
box-shadow: 0 0 0 50px var(--theme) inset;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
display: block;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
:root {
|
|
||||||
--gap: 24px;
|
|
||||||
--content-gap: 20px;
|
|
||||||
--nav-width: 1024px;
|
|
||||||
--main-width: 720px;
|
|
||||||
--header-height: 60px;
|
|
||||||
--footer-height: 60px;
|
|
||||||
--radius: 8px;
|
|
||||||
--theme: rgb(255, 255, 255);
|
|
||||||
--entry: rgb(255, 255, 255);
|
|
||||||
--primary: rgb(30, 30, 30);
|
|
||||||
--secondary: rgb(108, 108, 108);
|
|
||||||
--tertiary: rgb(214, 214, 214);
|
|
||||||
--content: rgb(31, 31, 31);
|
|
||||||
--hljs-bg: rgb(28, 29, 33);
|
|
||||||
--code-bg: rgb(245, 245, 245);
|
|
||||||
--border: rgb(238, 238, 238);
|
|
||||||
}
|
|
||||||
|
|
||||||
.dark {
|
|
||||||
--theme: rgb(29, 30, 32);
|
|
||||||
--entry: rgb(46, 46, 51);
|
|
||||||
--primary: rgb(218, 218, 219);
|
|
||||||
--secondary: rgb(155, 156, 157);
|
|
||||||
--tertiary: rgb(65, 66, 68);
|
|
||||||
--content: rgb(196, 196, 197);
|
|
||||||
--hljs-bg: rgb(46, 46, 51);
|
|
||||||
--code-bg: rgb(55, 56, 62);
|
|
||||||
--border: rgb(51, 51, 51);
|
|
||||||
}
|
|
||||||
|
|
||||||
.list {
|
|
||||||
background: var(--code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.dark.list {
|
|
||||||
background: var(--theme);
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
@media screen and (max-width: 768px) {
|
|
||||||
/* theme-vars */
|
|
||||||
:root {
|
|
||||||
--gap: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* profile-mode */
|
|
||||||
.profile img {
|
|
||||||
transform: scale(0.85);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* post-entry */
|
|
||||||
.first-entry {
|
|
||||||
min-height: 260px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* archive */
|
|
||||||
.archive-month {
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-year {
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* footer */
|
|
||||||
.footer {
|
|
||||||
padding: calc((var(--footer-height) - var(--gap) - 10px) / 2) var(--gap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* footer */
|
|
||||||
@media screen and (max-width: 900px) {
|
|
||||||
.list .top-link {
|
|
||||||
transform: translateY(-5rem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-reduced-motion) {
|
|
||||||
/* terms; profile-mode; post-single; post-entry; post-entry; search; search */
|
|
||||||
.terms-tags a:active,
|
|
||||||
.button:active,
|
|
||||||
.post-entry:active,
|
|
||||||
.top-link,
|
|
||||||
#searchResults .focus,
|
|
||||||
#searchResults li:active {
|
|
||||||
transform: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
/*
|
|
||||||
This is just a placeholder blank stylesheet so as to support adding custom styles budled with theme's default styles
|
|
||||||
|
|
||||||
Read https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#bundling-custom-css-with-themes-assets for more info
|
|
||||||
*/
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
.hljs-comment,
|
|
||||||
.hljs-quote {
|
|
||||||
color: #b6b18b;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-deletion,
|
|
||||||
.hljs-name,
|
|
||||||
.hljs-regexp,
|
|
||||||
.hljs-selector-class,
|
|
||||||
.hljs-selector-id,
|
|
||||||
.hljs-tag,
|
|
||||||
.hljs-template-variable,
|
|
||||||
.hljs-variable {
|
|
||||||
color: #eb3c54;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-built_in,
|
|
||||||
.hljs-builtin-name,
|
|
||||||
.hljs-link,
|
|
||||||
.hljs-literal,
|
|
||||||
.hljs-meta,
|
|
||||||
.hljs-number,
|
|
||||||
.hljs-params,
|
|
||||||
.hljs-type {
|
|
||||||
color: #e7ce56;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-attribute {
|
|
||||||
color: #ee7c2b;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-addition,
|
|
||||||
.hljs-bullet,
|
|
||||||
.hljs-string,
|
|
||||||
.hljs-symbol {
|
|
||||||
color: #4fb4d7;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-section,
|
|
||||||
.hljs-title {
|
|
||||||
color: #78bb65;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-keyword,
|
|
||||||
.hljs-selector-tag {
|
|
||||||
color: #b45ea4;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs {
|
|
||||||
display: block;
|
|
||||||
overflow-x: auto;
|
|
||||||
background: #1c1d21;
|
|
||||||
color: #c0c5ce;
|
|
||||||
padding: .5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-emphasis {
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hljs-strong {
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
/* from reset */
|
|
||||||
::-webkit-scrollbar-track {
|
|
||||||
background: 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.list:not(.dark)::-webkit-scrollbar-track {
|
|
||||||
background: var(--code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb {
|
|
||||||
background: var(--tertiary);
|
|
||||||
border: 5px solid var(--theme);
|
|
||||||
border-radius: var(--radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
.list:not(.dark)::-webkit-scrollbar-thumb {
|
|
||||||
border: 5px solid var(--code-bg);
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb:hover {
|
|
||||||
background: var(--secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar:not(.highlighttable, .highlight table, .gist .highlight) {
|
|
||||||
background: var(--theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* from post-single */
|
|
||||||
.post-content .highlighttable td .highlight pre code::-webkit-scrollbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content :not(table) ::-webkit-scrollbar-thumb {
|
|
||||||
border: 2px solid var(--hljs-bg);
|
|
||||||
background: rgb(113, 113, 117);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content :not(table) ::-webkit-scrollbar-thumb:hover {
|
|
||||||
background: rgb(163, 163, 165);
|
|
||||||
}
|
|
||||||
|
|
||||||
.gist table::-webkit-scrollbar-thumb {
|
|
||||||
border: 2px solid rgb(255, 255, 255);
|
|
||||||
background: rgb(173, 173, 173);
|
|
||||||
}
|
|
||||||
|
|
||||||
.gist table::-webkit-scrollbar-thumb:hover {
|
|
||||||
background: rgb(112, 112, 112);
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-content table::-webkit-scrollbar-thumb {
|
|
||||||
border-width: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* from zmedia */
|
|
||||||
@media screen and (min-width: 768px) {
|
|
||||||
|
|
||||||
/* reset */
|
|
||||||
::-webkit-scrollbar {
|
|
||||||
width: 19px;
|
|
||||||
height: 11px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,147 +0,0 @@
|
|||||||
import * as params from '@params';
|
|
||||||
|
|
||||||
let fuse; // holds our search engine
|
|
||||||
let resList = document.getElementById('searchResults');
|
|
||||||
let sInput = document.getElementById('searchInput');
|
|
||||||
let first, last, current_elem = null
|
|
||||||
let resultsAvailable = false;
|
|
||||||
|
|
||||||
// load our search index
|
|
||||||
window.onload = function () {
|
|
||||||
let xhr = new XMLHttpRequest();
|
|
||||||
xhr.onreadystatechange = function () {
|
|
||||||
if (xhr.readyState === 4) {
|
|
||||||
if (xhr.status === 200) {
|
|
||||||
let data = JSON.parse(xhr.responseText);
|
|
||||||
if (data) {
|
|
||||||
// fuse.js options; check fuse.js website for details
|
|
||||||
let options = {
|
|
||||||
distance: 100,
|
|
||||||
threshold: 0.4,
|
|
||||||
ignoreLocation: true,
|
|
||||||
keys: [
|
|
||||||
'title',
|
|
||||||
'permalink',
|
|
||||||
'summary',
|
|
||||||
'content'
|
|
||||||
]
|
|
||||||
};
|
|
||||||
if (params.fuseOpts) {
|
|
||||||
options = {
|
|
||||||
isCaseSensitive: params.fuseOpts.iscasesensitive ?? false,
|
|
||||||
includeScore: params.fuseOpts.includescore ?? false,
|
|
||||||
includeMatches: params.fuseOpts.includematches ?? false,
|
|
||||||
minMatchCharLength: params.fuseOpts.minmatchcharlength ?? 1,
|
|
||||||
shouldSort: params.fuseOpts.shouldsort ?? true,
|
|
||||||
findAllMatches: params.fuseOpts.findallmatches ?? false,
|
|
||||||
keys: params.fuseOpts.keys ?? ['title', 'permalink', 'summary', 'content'],
|
|
||||||
location: params.fuseOpts.location ?? 0,
|
|
||||||
threshold: params.fuseOpts.threshold ?? 0.4,
|
|
||||||
distance: params.fuseOpts.distance ?? 100,
|
|
||||||
ignoreLocation: params.fuseOpts.ignorelocation ?? true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fuse = new Fuse(data, options); // build the index from the json file
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
console.log(xhr.responseText);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
xhr.open('GET', "../index.json");
|
|
||||||
xhr.send();
|
|
||||||
}
|
|
||||||
|
|
||||||
function activeToggle(ae) {
|
|
||||||
document.querySelectorAll('.focus').forEach(function (element) {
|
|
||||||
// rm focus class
|
|
||||||
element.classList.remove("focus")
|
|
||||||
});
|
|
||||||
if (ae) {
|
|
||||||
ae.focus()
|
|
||||||
document.activeElement = current_elem = ae;
|
|
||||||
ae.parentElement.classList.add("focus")
|
|
||||||
} else {
|
|
||||||
document.activeElement.parentElement.classList.add("focus")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function reset() {
|
|
||||||
resultsAvailable = false;
|
|
||||||
resList.innerHTML = sInput.value = ''; // clear inputbox and searchResults
|
|
||||||
sInput.focus(); // shift focus to input box
|
|
||||||
}
|
|
||||||
|
|
||||||
// execute search as each character is typed
|
|
||||||
sInput.onkeyup = function (e) {
|
|
||||||
// run a search query (for "term") every time a letter is typed
|
|
||||||
// in the search box
|
|
||||||
if (fuse) {
|
|
||||||
const results = fuse.search(this.value.trim()); // the actual query being run using fuse.js
|
|
||||||
if (results.length !== 0) {
|
|
||||||
// build our html if result exists
|
|
||||||
let resultSet = ''; // our results bucket
|
|
||||||
|
|
||||||
for (let item in results) {
|
|
||||||
resultSet += `<li class="post-entry"><header class="entry-header">${results[item].item.title} »</header>` +
|
|
||||||
`<a href="${results[item].item.permalink}" aria-label="${results[item].item.title}"></a></li>`
|
|
||||||
}
|
|
||||||
|
|
||||||
resList.innerHTML = resultSet;
|
|
||||||
resultsAvailable = true;
|
|
||||||
first = resList.firstChild;
|
|
||||||
last = resList.lastChild;
|
|
||||||
} else {
|
|
||||||
resultsAvailable = false;
|
|
||||||
resList.innerHTML = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sInput.addEventListener('search', function (e) {
|
|
||||||
// clicked on x
|
|
||||||
if (!this.value) reset()
|
|
||||||
})
|
|
||||||
|
|
||||||
// kb bindings
|
|
||||||
document.onkeydown = function (e) {
|
|
||||||
let key = e.key;
|
|
||||||
let ae = document.activeElement;
|
|
||||||
|
|
||||||
let inbox = document.getElementById("searchbox").contains(ae)
|
|
||||||
|
|
||||||
if (ae === sInput) {
|
|
||||||
let elements = document.getElementsByClassName('focus');
|
|
||||||
while (elements.length > 0) {
|
|
||||||
elements[0].classList.remove('focus');
|
|
||||||
}
|
|
||||||
} else if (current_elem) ae = current_elem;
|
|
||||||
|
|
||||||
if (key === "Escape") {
|
|
||||||
reset()
|
|
||||||
} else if (!resultsAvailable || !inbox) {
|
|
||||||
return
|
|
||||||
} else if (key === "ArrowDown") {
|
|
||||||
e.preventDefault();
|
|
||||||
if (ae == sInput) {
|
|
||||||
// if the currently focused element is the search input, focus the <a> of first <li>
|
|
||||||
activeToggle(resList.firstChild.lastChild);
|
|
||||||
} else if (ae.parentElement != last) {
|
|
||||||
// if the currently focused element's parent is last, do nothing
|
|
||||||
// otherwise select the next search result
|
|
||||||
activeToggle(ae.parentElement.nextSibling.lastChild);
|
|
||||||
}
|
|
||||||
} else if (key === "ArrowUp") {
|
|
||||||
e.preventDefault();
|
|
||||||
if (ae.parentElement == first) {
|
|
||||||
// if the currently focused element is first item, go to input box
|
|
||||||
activeToggle(sInput);
|
|
||||||
} else if (ae != sInput) {
|
|
||||||
// if the currently focused element is input box, do nothing
|
|
||||||
// otherwise select the previous search result
|
|
||||||
activeToggle(ae.parentElement.previousSibling.lastChild);
|
|
||||||
}
|
|
||||||
} else if (key === "ArrowRight") {
|
|
||||||
ae.click(); // click on active link
|
|
||||||
}
|
|
||||||
}
|
|
||||||
44
web/themes/PaperMod/assets/js/highlight.min.js
vendored
@@ -1,6 +0,0 @@
|
|||||||
/*
|
|
||||||
PaperMod v7
|
|
||||||
License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE
|
|
||||||
Copyright (c) 2020 nanxiaobei and adityatelange
|
|
||||||
Copyright (c) 2021-2023 adityatelange
|
|
||||||
*/
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
module github.com/adityatelange/hugo-PaperMod
|
|
||||||
|
|
||||||
go 1.12
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "السابق"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "التالي"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "دقيقة واحدة"
|
|
||||||
two: "دقيقتان"
|
|
||||||
few: "بضع ثوان"
|
|
||||||
zero: "الآن"
|
|
||||||
other: "دقائق {{ .Count }}"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "فهرس المحتوى"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "ترجمات أخرى"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "الصفحة الرئيسية"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "تم النسخ!"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "نسخ الكود"
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Папярэдняя"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Наступная"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
zero: "0 хвілін"
|
|
||||||
one: "1 хвіліна"
|
|
||||||
few: "{{ .Count }} хвіліны"
|
|
||||||
many: "{{ .Count }} хвілін"
|
|
||||||
other: "{{ .Count }} хвілін"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
zero: "няма слоў"
|
|
||||||
one: "1 слова"
|
|
||||||
few: "{{ .Count }} слова"
|
|
||||||
many: "{{ .Count }} слоў"
|
|
||||||
other: "{{ .Count }} слова"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Змест"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Пераклады"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Галоўная"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Рэдагаваць"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "капіяваць"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "скапіявана!"
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Предишна страница"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Следваща страница"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 мин"
|
|
||||||
other: "{{ .Count }} мин"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Съдържание"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Преводи"
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "পূর্ববর্তী"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "পরবর্তী"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "১ মিনিট"
|
|
||||||
other: "{{ .Count }} মিনিট"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "১ টি শব্দ"
|
|
||||||
other: "{{ .Count }} টি শব্দ"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "সূচিপত্র"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "অনুবাদসমূহ"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "হোম"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "সম্পাদনা করুন"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "কপি করুন"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "কপি হয়েছে!"
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Pàgina anterior"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Pàgina següent"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 min"
|
|
||||||
other: "{{ .Count }} min"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Taula de Continguts"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Traduccions"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Inici"
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "پەڕەی پێشتر"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "پەڕەی دواتر"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 خولەک"
|
|
||||||
other: "{{ .Count }} خولەک"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "پێڕست"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "وەرگێڕانەکان"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "ماڵەوە"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "لەبەری بگرەوە"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "لەبەر گیرایەوە!"
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Forrige Side"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Næste Side"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "1 min"
|
|
||||||
other: "{{ .Count }} min"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Indholdsfortegnelse"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Oversættelser"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Start"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Rediger"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "kopier"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "kopieret!"
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Vorherige"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Nächste"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "1 Minute"
|
|
||||||
other: "{{ .Count }} Minuten"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "Wort"
|
|
||||||
other: "{{ .Count }} Wörter"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Inhaltsverzeichnis"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Übersetzungen"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Home"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Bearbeiten"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "Kopieren"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "Kopiert!"
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Προηγούμενο"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Επόμενο"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one: "1 λεπτό"
|
|
||||||
other: "{{ .Count }} λεπτά"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one: "λέξη"
|
|
||||||
other: "{{ .Count }} λέξεις"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Πίνακας Περιεχομένων"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Μεταφράσεις"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Αρχική"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Επεξεργασία"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "αντιγραφή"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "αντιγράφηκε!"
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "Prev"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "Next"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 min"
|
|
||||||
other: "{{ .Count }} min"
|
|
||||||
|
|
||||||
- id: words
|
|
||||||
translation:
|
|
||||||
one : "word"
|
|
||||||
other: "{{ .Count }} words"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Table of Contents"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "Translations"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "Home"
|
|
||||||
|
|
||||||
- id: edit_post
|
|
||||||
translation: "Edit"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "copy"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "copied!"
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
- id: prev_page
|
|
||||||
translation: "antaŭa paĝo"
|
|
||||||
|
|
||||||
- id: next_page
|
|
||||||
translation: "sekva paĝo"
|
|
||||||
|
|
||||||
- id: read_time
|
|
||||||
translation:
|
|
||||||
one : "1 min"
|
|
||||||
other: "{{ .Count }} min"
|
|
||||||
|
|
||||||
- id: toc
|
|
||||||
translation: "Enhavo"
|
|
||||||
|
|
||||||
- id: translations
|
|
||||||
translation: "tradukoj"
|
|
||||||
|
|
||||||
- id: home
|
|
||||||
translation: "ĉefpaĝo"
|
|
||||||
|
|
||||||
- id: code_copy
|
|
||||||
translation: "kopii"
|
|
||||||
|
|
||||||
- id: code_copied
|
|
||||||
translation: "kopiite!"
|
|
||||||