This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

superconfig / 2configs / kannix.nix
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}