grace/dots
dotfiles/nix configs
git clone https://git.gae.moe/grace/dots
44ae0ad
wafrn-testing
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 root",restrict u:root 165command=" ${ pkgs . gitolite } /bin/gitolite-shell grace-read",restrict u:grace 166'' ; 167}; 168 169environment . etc . "ssh/git-authorized-keys" = { 170mode = "0644" ; 171user = "root" ; 172group = "root" ; 173 174text = gitoliteAuthorizedKeys + "\n" ; 175}; 176 177services . openssh = { 178enable = true ; 179extraConfig = '' 180Match User git 181TrustedUserCAKeys /etc/ssh/git-user-ca.pub 182AuthorizedPrincipalsFile /etc/ssh/git-principals 183AuthorizedKeysFile /etc/ssh/git-authorized-keys 184 185PubkeyAuthentication yes 186PasswordAuthentication no 187KbdInteractiveAuthentication no 188 189DisableForwarding yes 190PermitTTY no 191PermitUserRC no 192X11Forwarding no 193'' ; 194}; 195 196services . fcgiwrap . instances = { 197cgit-public = { 198process = { 199user = "git" ; 200group = "git" ; 201}; 202 203socket = { 204user = "caddy" ; 205group = "caddy" ; 206mode = "0600" ; 207}; 208}; 209 210cgit-private = { 211process = { 212user = "git" ; 213group = "git" ; 214}; 215 216socket = { 217user = "caddy" ; 218group = "caddy" ; 219mode = "0600" ; 220}; 221}; 222}; 223 224services . caddy = { 225enable = true ; 226 227virtualHosts . "beta.git.gae.moe" . extraConfig = '' 228@cgitStatic path \ 229/cgit.css \ 230/cgit.js \ 231/cgit.png \ 232/favicon.ico \ 233/robots.txt 234 235handle @cgitStatic { 236root * ${ pkgs . cgit } /cgit 237file_server 238} 239 240handle { 241reverse_proxy unix/ ${ config . services . fcgiwrap . instances . cgit-public . socket . address } { 242transport fastcgi { 243env SCRIPT_FILENAME ${ pkgs . cgit } /cgit/cgit.cgi 244env SCRIPT_NAME / 245env PATH_INFO {http.request.uri.path} 246env CGIT_CONFIG ${ publicCgitrc } 247capture_stderr 248} 249} 250} 251'' ; 252 253virtualHosts . "git.k.gae.moe" . extraConfig = '' 254@notTailscale { 255not remote_ip 100.64.0.0/10 fd7a:115c:a1e0::/48 256} 257 258abort @notTailscale 259 260@cgitStatic path \ 261/cgit.css \ 262/cgit.js \ 263/cgit.png \ 264/favicon.ico \ 265/robots.txt 266 267handle @cgitStatic { 268root * ${ pkgs . cgit } /cgit 269file_server 270} 271 272handle { 273reverse_proxy unix/ ${ config . services . fcgiwrap . instances . cgit-private . socket . address } { 274transport fastcgi { 275env SCRIPT_FILENAME ${ pkgs . cgit } /cgit/cgit.cgi 276env SCRIPT_NAME / 277env PATH_INFO {http.request.uri.path} 278env CGIT_CONFIG ${ privateCgitrc } 279capture_stderr 280} 281} 282} 283'' ; 284}; 285 286systemd . tmpfiles . rules = [ 287"d ${ gitDir } 0750 git git -" 288"d ${ gitDir } /.ssh 0700 git git -" 289 290"d ${ cgitPub } 0755 git git -" 291"d ${ cgitPriv } 0755 git git -" 292 293"L+ ${ cgitPub } /grace - - - - ${ gitDir } /repositories/grace" 294# "L+ ${cgitPub}/person - - - - ${gitDir}/repositories/person" 295 296"L+ ${ cgitPriv } /private - - - - ${ gitDir } /repositories/private" 297"L+ ${ cgitPriv } /classes - - - - ${ gitDir } /repositories/classes" 298 299]; 300 301}