grace/dots
dotfiles/nix configs
git clone https://git.gae.moe/grace/dots
4db52e6
idk
1{ 2config , 3pkgs , 4lib , 5 ... 6} : 7 8let 9# TODO: make this use the home manager in nix-path? set in system.nix 10home-manager = builtins . fetchTarball "https://github.com/nix-community/home-manager/archive/master.tar.gz" ; 11 12gitDir = "/mnt/ext/git" ; 13cgitPriv = " ${ gitDir } /cgitpriv" ; 14cgitPub = " ${ gitDir } /cgitpub" ; 15gitoliteKeys = { 16gitolite-admin = [ 17"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIA6Eq2yVsZrCH8so7f3ygH0UWp6WkOxbhLNFC9QewKwoAAAABHNzaDo= grace_yoder@outlook.com" 18# "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINySDE+jaYpuAWUdPQf/JcAWETeHgmh+T5Y4GUa7MfeM grace@turing" 19]; 20 21grace = [ ]; 22grace-read = [ ]; 23}; 24 25mkGitoliteKey = 26user :key : 27''command=" ${ pkgs . gitolite } /bin/gitolite-shell ${ user } ",restrict ${ key } '' ; 28 29gitoliteAuthorizedKeys = 30lib . concatStringsSep "\n" ( 31lib . flatten ( 32lib . mapAttrsToList ( 33user :keys : 34map ( mkGitoliteKey user ) keys 35) gitoliteKeys 36) 37); 38 39fixGitolitePermissions = pkgs . writeShellScript "fix-gitolite-permissions" '' 40set -eu 41 42${ pkgs . coreutils } /bin/mkdir -p ${ gitDir } /.ssh 43 44${ pkgs . coreutils } /bin/chown git:git ${ gitDir } 45${ pkgs . coreutils } /bin/chmod 0750 ${ gitDir } 46 47${ pkgs . coreutils } /bin/chown git:git ${ gitDir } /.ssh 48${ pkgs . coreutils } /bin/chmod 0700 ${ gitDir } /.ssh 49 50if [ -e ${ gitDir } /.ssh/authorized_keys ]; then 51${ pkgs . coreutils } /bin/chown git:git \ 52${ gitDir } /.ssh/authorized_keys 53 54${ pkgs . coreutils } /bin/chmod 0600 \ 55${ gitDir } /.ssh/authorized_keys 56fi 57'' ; 58publicCgitrc = pkgs . writeText "cgit-public.rc" '' 59virtual-root=/ 60 61css=/cgit.css 62logo=/cgit.png 63favicon=/favicon.ico 64 65root-title=git.gae.moe 66remove-suffix=1 67 68enable-git-config=1 69 70readme=:README.md 71readme=:README 72about-filter= ${ pkgs . writeShellScript "cgit-about-filter" '' 73case " $ 1 " in 74*.md) 75exec ${ pkgs . pandoc } /bin/pandoc \ 76--from=gfm \ 77--to=html 78;; 79*) 80exec ${ pkgs . coreutils } /bin/cat 81;; 82esac 83'' } 84 85scan-path= ${ cgitPub } 86'' ; 87privateCgitrc = pkgs . writeText "cgit-private.rc" '' 88virtual-root=/ 89 90css=/cgit.css 91logo=/cgit.png 92favicon=/favicon.ico 93 94root-title=Private repositories 95remove-suffix=1 96 97enable-git-config=1 98 99readme=:README.md 100readme=:README 101about-filter= ${ pkgs . writeShellScript "cgit-about-filter" '' 102case " $ 1 " in 103*.md) 104exec ${ pkgs . pandoc } /bin/pandoc \ 105--from=gfm \ 106--to=html 107;; 108*) 109exec ${ pkgs . coreutils } /bin/cat 110;; 111esac 112'' } 113 114scan-path= ${ cgitPriv } 115'' ; 116in 117{ 118services . gitolite = { 119enable = true ; 120 121user = "git" ; 122group = "git" ; 123 124dataDir = " ${ gitDir } " ; 125 126adminPubkey = 127"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIA6Eq2yVsZrCH8so7f3ygH0UWp6WkOxbhLNFC9QewKwoAAAABHNzaDo= grace_yoder@outlook.com" ; 128extraGitoliteRc = '' 129$RC{GIT_CONFIG_KEYS} = 'gitweb\.owner gitweb\.description gitweb\.category'; 130'' ; 131}; 132# home-manager.users.git.home.stateVersion = "26.11"; 133# home-manager.users.git.programs.git = { 134# lfs.enable = true; 135# # TODO: set repos. can use wildcards? 136# maintenance.enable = true; 137# settings.init.defaultBranch = "main"; 138# }; 139programs . git = { 140enable = true ; 141142 config . init . defaultBranch = "main" ; 143}; 144 145 146 147environment . etc . "ssh/git-user-ca.pub" = { 148mode = "0644" ; 149user = "root" ; 150group = "root" ; 151 152text = '' 153ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEuc4HCdyEMu4uiYhlokSXmu+68hkm7j6CqVwjDkCeSj grace.pink 154'' ; 155}; 156 157environment . etc . "ssh/git-principals" = { 158mode = "0644" ; 159user = "root" ; 160group = "root" ; 161 162text = '' 163command=" ${ pkgs . gitolite } /bin/gitolite-shell grace",restrict t:dev 164command=" ${ pkgs . gitolite } /bin/gitolite-shell grace-read",restrict u:grace 165'' ; 166}; 167 168environment . etc . "ssh/git-authorized-keys" = { 169mode = "0644" ; 170user = "root" ; 171group = "root" ; 172 173text = gitoliteAuthorizedKeys + "\n" ; 174}; 175 176services . openssh = { 177enable = true ; 178extraConfig = '' 179Match User git 180TrustedUserCAKeys /etc/ssh/git-user-ca.pub 181AuthorizedPrincipalsFile /etc/ssh/git-principals 182AuthorizedKeysFile /etc/ssh/git-authorized-keys 183 184PubkeyAuthentication yes 185PasswordAuthentication no 186KbdInteractiveAuthentication no 187 188DisableForwarding yes 189PermitTTY no 190PermitUserRC no 191X11Forwarding no 192'' ; 193}; 194 195services . fcgiwrap . instances = { 196cgit-public = { 197process = { 198user = "git" ; 199group = "git" ; 200}; 201 202socket = { 203user = "caddy" ; 204group = "caddy" ; 205mode = "0600" ; 206}; 207}; 208 209cgit-private = { 210process = { 211user = "git" ; 212group = "git" ; 213}; 214 215socket = { 216user = "caddy" ; 217group = "caddy" ; 218mode = "0600" ; 219}; 220}; 221}; 222 223services . caddy = { 224enable = true ; 225 226virtualHosts . "beta.git.gae.moe" . extraConfig = '' 227@cgitStatic path \ 228/cgit.css \ 229/cgit.js \ 230/cgit.png \ 231/favicon.ico \ 232/robots.txt 233 234handle @cgitStatic { 235root * ${ pkgs . cgit } /cgit 236file_server 237} 238 239handle { 240reverse_proxy unix/ ${ config . services . fcgiwrap . instances . cgit-public . socket . address } { 241transport fastcgi { 242env SCRIPT_FILENAME ${ pkgs . cgit } /cgit/cgit.cgi 243env SCRIPT_NAME / 244env PATH_INFO {http.request.uri.path} 245env CGIT_CONFIG ${ publicCgitrc } 246capture_stderr 247} 248} 249} 250'' ; 251 252virtualHosts . "git.k.gae.moe" . extraConfig = '' 253@notTailscale { 254not remote_ip 100.64.0.0/10 fd7a:115c:a1e0::/48 255} 256 257abort @notTailscale 258 259@cgitStatic path \ 260/cgit.css \ 261/cgit.js \ 262/cgit.png \ 263/favicon.ico \ 264/robots.txt 265 266handle @cgitStatic { 267root * ${ pkgs . cgit } /cgit 268file_server 269} 270 271handle { 272reverse_proxy unix/ ${ config . services . fcgiwrap . instances . cgit-private . socket . address } { 273transport fastcgi { 274env SCRIPT_FILENAME ${ pkgs . cgit } /cgit/cgit.cgi 275env SCRIPT_NAME / 276env PATH_INFO {http.request.uri.path} 277env CGIT_CONFIG ${ privateCgitrc } 278capture_stderr 279} 280} 281} 282'' ; 283}; 284 285systemd . tmpfiles . rules = [ 286"d ${ gitDir } 0750 git git -" 287"d ${ gitDir } /.ssh 0700 git git -" 288 289"d ${ cgitPub } 0755 git git -" 290"d ${ cgitPriv } 0755 git git -" 291 292"L+ ${ cgitPub } /grace - - - - ${ gitDir } /repositories/grace" 293# "L+ ${cgitPub}/person - - - - ${gitDir}/repositories/person" 294 295"L+ ${ cgitPriv } /private - - - - ${ gitDir } /repositories/private" 296"L+ ${ cgitPriv } /classes - - - - ${ gitDir } /repositories/classes" 297 298]; 299 300}