cfg/host/roam/git.nix
2026-01-31 12:56:47 +01:00

83 lines
1.8 KiB
Nix

{
pkgs,
var,
lib,
...
}:
let
gitpath = "/git";
git-config = pkgs.writeText "git-git-config" ''
[init]
defaultBranch = main
'';
git-shell-commands = {
"create" = ''
#!/bin/sh
REPO_NAME="$1"
if [ -z "$REPO_NAME" ]; then
echo "Usage: $0 <repo-name>"
exit 1
fi
REPO_PATH="${gitpath}/$REPO_NAME.git"
if [ -d "$REPO_PATH" ]; then
echo "Repository '$REPO_NAME' already exists."
exit 1
fi
git init --bare "$REPO_PATH"
echo "Created bare repository: $REPO_PATH"
'';
};
git-shell-commands-dir = pkgs.stdenv.mkDerivation {
name = "git-shell-commands-dir";
version = "0.0.1";
src = null;
dontUnpack = true;
buildPhase = "";
installPhase = lib.concatStringsSep "\n" (
lib.mapAttrsToList (name: script: ''
mkdir -p $out
cat <<'EOF' > $out/${name}
${script}
EOF
chmod +x $out/${name}
'') git-shell-commands
);
};
in
{
programs.git.enable = true;
users.groups.git = { };
users.users.git = {
isSystemUser = true;
home = gitpath;
homeMode = "755";
createHome = true;
group = "git";
shell = "${pkgs.git}/bin/git-shell";
openssh.authorizedKeys.keys = var.ssh-keys.hd;
hashedPassword = "!";
packages = [ pkgs.git ];
};
systemd.tmpfiles.rules = [
"L+ ${gitpath}/git-shell-commands - - - - ${git-shell-commands-dir}"
"L+ ${gitpath}/.gitconfig - - - - ${git-config}"
];
services =
let
cgit-host = "git.lan";
in
{
nginx = {
privateVirtualHosts.${cgit-host} = { };
};
cgit."git" = {
group = "git";
enable = true;
scanPath = gitpath;
nginx.virtualHost = cgit-host;
gitHttpBackend.checkExportOkFiles = false;
};
};
}