This repository has no description
3.5 kB
144 lines
1{
2 self,
3 pkgs,
4 lib,
5 ...
6}:
7let
8 port = 4243;
9 stateDir = "/var/lib/kannix";
10 bareRepo = "${stateDir}/repos/kannix.git";
11 srcDir = "${stateDir}/checkout/kannix";
12
13 configFile = pkgs.writeText "kannix.json" (
14 builtins.toJSON {
15 columns = [
16 "backlog"
17 "planning"
18 "doing"
19 "review"
20 "done"
21 ];
22 server = {
23 host = "127.0.0.1";
24 inherit port;
25 };
26 repos_dir = "${stateDir}/repos";
27 worktree_dir = "${stateDir}/worktrees";
28 }
29 );
30
31 kannixScript = pkgs.writeShellScript "kannix-run" ''
32 export KANNIX_CONFIG=${configFile}
33 export KANNIX_STATE_DIR=${stateDir}
34 export PATH=${
35 lib.makeBinPath [
36 pkgs.tmux
37 pkgs.git
38 pkgs.nix
39 pkgs.inotify-tools
40 pkgs.coreutils
41 ]
42 }:$PATH
43 cd ${srcDir}
44
45 while true; do
46 nix run .# -- \
47 --host 127.0.0.1 \
48 --port ${toString port} &
49 PID=$!
50
51 inotifywait -r -e modify,create,delete,move \
52 --exclude '(__pycache__|\.pyc|\.git/|result)' \
53 ${srcDir}/src ${srcDir}/flake.nix ${srcDir}/flake.lock ${srcDir}/package.nix ${srcDir}/pyproject.toml
54
55 echo "Change detected, restarting..."
56 kill $PID 2>/dev/null
57 wait $PID 2>/dev/null
58 sleep 1
59 done
60 '';
61in
62{
63 users.users.kannix = {
64 isNormalUser = true;
65 home = stateDir;
66 createHome = true;
67 group = "users";
68 shell = pkgs.bashInteractive;
69 linger = true;
70 openssh.authorizedKeys.keys = [
71 self.keys.ssh.barnacle.public
72 self.keys.ssh.yubi_pgp.public
73 self.keys.ssh.yubi1.public
74 self.keys.ssh.yubi2.public
75 self.keys.ssh.solo2.public
76 self.keys.ssh.xerxes.public
77 self.keys.ssh.massulus.public
78 ];
79 packages = [
80 pkgs.tmux
81 pkgs.git
82 (pkgs.writeShellScriptBin "kannix-ctl" ''
83 cd ${srcDir}
84 exec "$(nix build .# --no-link --print-out-paths)/bin/kannix-ctl" "$@"
85 '')
86 ];
87 };
88
89 systemd.tmpfiles.rules = [
90 "d ${stateDir}/repos 0755 kannix users -"
91 "d ${stateDir}/worktrees 0755 kannix users -"
92 "d ${stateDir}/checkout 0755 kannix users -"
93 ];
94
95 systemd.services.kannix-checkout = {
96 description = "Create kannix worktree from bare repo";
97 wantedBy = [ "multi-user.target" ];
98 unitConfig.ConditionPathExists = "!${srcDir}/.git";
99 serviceConfig = {
100 Type = "oneshot";
101 User = "kannix";
102 Group = "users";
103 ExecStart = toString (
104 pkgs.writeShellScript "kannix-checkout" ''
105 ${pkgs.git}/bin/git --git-dir=${bareRepo} worktree add ${srcDir} main
106 ''
107 );
108 };
109 };
110
111 systemd.user.services.kannix = {
112 description = "Kannix kanban server";
113 wantedBy = [ "default.target" ];
114 after = [ "network.target" ];
115 path = [
116 pkgs.tmux
117 pkgs.git
118 pkgs.nix
119 ];
120 serviceConfig = {
121 Type = "simple";
122 ExecStart = toString kannixScript;
123 Restart = "on-failure";
124 RestartSec = 5;
125 WorkingDirectory = srcDir;
126 };
127 };
128
129 services.nginx.virtualHosts."kannix.lassul.us" = {
130 enableACME = true;
131 forceSSL = true;
132 locations."/" = {
133 proxyPass = "http://127.0.0.1:${toString port}";
134 proxyWebsockets = true;
135 extraConfig = ''
136 proxy_set_header Host $host;
137 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
138 proxy_set_header X-Forwarded-Proto $scheme;
139 proxy_read_timeout 3600s;
140 proxy_send_timeout 3600s;
141 '';
142 };
143 };
144}