forked from
lass.pds.lassul.us/superconfig
This repository has no description
4.2 kB
164 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 pythonEnv = pkgs.python3.withPackages (
14 ps: with ps; [
15 fastapi
16 uvicorn
17 jinja2
18 python-multipart
19 bcrypt
20 websockets
21 ]
22 );
23
24 configFile = pkgs.writeText "kannix.json" (
25 builtins.toJSON {
26 columns = [
27 "backlog"
28 "planning"
29 "doing"
30 "review"
31 "done"
32 ];
33 server = {
34 host = "127.0.0.1";
35 inherit port;
36 };
37 repos_dir = "${stateDir}/repos";
38 worktree_dir = "${stateDir}/worktrees";
39 }
40 );
41
42 vendorDir = pkgs.runCommand "kannix-vendor" { } ''
43 mkdir -p $out
44 cp ${pkgs.fetchurl {
45 url = "https://cdn.jsdelivr.net/npm/diff2html@3.4.56/bundles/css/diff2html.min.css";
46 hash = "sha256-0+zA6bKx5chGbBneKb7QUv0IY0ddJYKezIWERu/e03I=";
47 }} $out/diff2html.min.css
48 cp ${pkgs.fetchurl {
49 url = "https://cdn.jsdelivr.net/npm/diff2html@3.4.56/bundles/js/diff2html-ui.min.js";
50 hash = "sha256-mXoOqduEwKvM41xkFZr+RtMNz9/SQ0FWGdmz6BAXE4s=";
51 }} $out/diff2html-ui.min.js
52 '';
53
54 kannixDevScript = pkgs.writeShellScript "kannix-dev" ''
55 export KANNIX_CONFIG=${configFile}
56 export KANNIX_STATE_DIR=${stateDir}
57 export PYTHONPATH=${srcDir}/src
58 export PATH=${
59 lib.makeBinPath [
60 pkgs.tmux
61 pkgs.git
62 ]
63 }:$PATH
64 cd ${srcDir}
65
66 # Symlink vendor files
67 mkdir -p src/kannix/static/vendor
68 ln -sf ${vendorDir}/diff2html.min.css src/kannix/static/vendor/diff2html.min.css
69 ln -sf ${vendorDir}/diff2html-ui.min.js src/kannix/static/vendor/diff2html-ui.min.js
70
71 exec ${pythonEnv}/bin/python -m uvicorn \
72 kannix.main:create_dev_app \
73 --factory \
74 --host 127.0.0.1 \
75 --port ${toString port} \
76 --reload \
77 --reload-dir ${srcDir}/src
78 '';
79in
80{
81 users.users.kannix = {
82 isNormalUser = true;
83 home = stateDir;
84 createHome = true;
85 group = "users";
86 shell = pkgs.bashInteractive;
87 linger = true;
88 openssh.authorizedKeys.keys = [
89 self.keys.ssh.barnacle.public
90 self.keys.ssh.yubi_pgp.public
91 self.keys.ssh.yubi1.public
92 self.keys.ssh.yubi2.public
93 self.keys.ssh.solo2.public
94 self.keys.ssh.xerxes.public
95 self.keys.ssh.massulus.public
96 ];
97 packages = [
98 pythonEnv
99 pkgs.tmux
100 pkgs.git
101 self.packages.${pkgs.system}.s
102 (pkgs.writeShellScriptBin "kannix-ctl" ''
103 export PYTHONPATH=${srcDir}/src
104 exec ${pythonEnv}/bin/python -m kannix.ctl "$@"
105 '')
106 ];
107 };
108
109 systemd.tmpfiles.rules = [
110 "d ${stateDir}/repos 0755 kannix users -"
111 "d ${stateDir}/worktrees 0755 kannix users -"
112 "d ${stateDir}/checkout 0755 kannix users -"
113 ];
114
115 systemd.services.kannix-checkout = {
116 description = "Create kannix worktree from bare repo";
117 wantedBy = [ "multi-user.target" ];
118 unitConfig.ConditionPathExists = "!${srcDir}/.git";
119 serviceConfig = {
120 Type = "oneshot";
121 User = "kannix";
122 Group = "users";
123 ExecStart = toString (
124 pkgs.writeShellScript "kannix-checkout" ''
125 ${pkgs.git}/bin/git --git-dir=${bareRepo} worktree add ${srcDir} main
126 ''
127 );
128 };
129 };
130
131 systemd.user.services.kannix = {
132 description = "Kannix dev server";
133 wantedBy = [ "default.target" ];
134 after = [ "network.target" ];
135 path = [
136 pkgs.tmux
137 pkgs.git
138 pythonEnv
139 ];
140 serviceConfig = {
141 Type = "simple";
142 ExecStart = toString kannixDevScript;
143 Restart = "on-failure";
144 RestartSec = 5;
145 WorkingDirectory = srcDir;
146 };
147 };
148
149 services.nginx.virtualHosts."kannix.lassul.us" = {
150 enableACME = true;
151 forceSSL = true;
152 locations."/" = {
153 proxyPass = "http://127.0.0.1:${toString port}";
154 proxyWebsockets = true;
155 extraConfig = ''
156 proxy_set_header Host $host;
157 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
158 proxy_set_header X-Forwarded-Proto $scheme;
159 proxy_read_timeout 3600s;
160 proxy_send_timeout 3600s;
161 '';
162 };
163 };
164}