This repository has no description
2.6 kB
100 lines
1{
2 self,
3 config,
4 pkgs,
5 ...
6}:
7let
8 vibe-kanban-base = self.inputs.llm-agents.packages.${pkgs.system}.vibe-kanban;
9 # HACK: binary-patch pinned claude-code version for claude 4.6 support
10 # TODO: fork upstream and bump properly, then submit PR
11 vibe-kanban = vibe-kanban-base.overrideAttrs (old: {
12 postInstall = (old.postInstall or "") + ''
13 ${pkgs.gnused}/bin/sed -i 's|@anthropic-ai/claude-code@2\.1\.45|@anthropic-ai/claude-code@2.1.71|g' $out/bin/vibe-kanban
14 '';
15 });
16 port = 4242;
17in
18{
19 users.users.kanban = {
20 isNormalUser = true;
21 home = "/var/lib/vibe-kanban";
22 createHome = true;
23 group = "users";
24 useDefaultShell = true;
25 openssh.authorizedKeys.keys = [
26 self.keys.ssh.barnacle.public
27 self.keys.ssh.yubi_pgp.public
28 self.keys.ssh.yubi1.public
29 self.keys.ssh.yubi2.public
30 self.keys.ssh.solo2.public
31 self.keys.ssh.xerxes.public
32 self.keys.ssh.massulus.public
33 ];
34 };
35
36 clan.core.vars.generators.vibe-kanban = {
37 files."htpasswd" = {
38 owner = "root";
39 group = "nginx";
40 mode = "0640";
41 };
42 files."password" = { };
43 runtimeInputs = with pkgs; [
44 apacheHttpd
45 coreutils
46 ];
47 script = ''
48 password=$(head -c 32 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9' | head -c 24)
49 echo "$password" > "$out/password"
50 htpasswd -nbB kanban "$password" > "$out/htpasswd"
51 '';
52 };
53
54 systemd.services.vibe-kanban = {
55 description = "Vibe Kanban Board";
56 wantedBy = [ "multi-user.target" ];
57 after = [ "network-online.target" ];
58 wants = [ "network-online.target" ];
59
60 path = [
61 pkgs.nodejs
62 pkgs.git
63 pkgs.bash
64 pkgs.coreutils
65 pkgs.nix
66 ];
67
68 environment = {
69 HOST = "127.0.0.1";
70 PORT = toString port;
71 };
72
73 serviceConfig = {
74 ExecStart = "${vibe-kanban}/bin/vibe-kanban";
75 Restart = "on-failure";
76 RestartSec = 10;
77 User = "kanban";
78 Group = "users";
79 WorkingDirectory = "/var/lib/vibe-kanban";
80 };
81 };
82
83 services.nginx.virtualHosts."kanban.lassul.us" = {
84 enableACME = true;
85 forceSSL = true;
86 locations."/" = {
87 proxyPass = "http://127.0.0.1:${toString port}";
88 proxyWebsockets = true;
89 extraConfig = ''
90 auth_basic "Vibe Kanban";
91 auth_basic_user_file ${config.clan.core.vars.generators.vibe-kanban.files."htpasswd".path};
92 proxy_set_header Host $host;
93 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
94 proxy_set_header X-Forwarded-Proto $scheme;
95 proxy_read_timeout 300s;
96 proxy_send_timeout 300s;
97 '';
98 };
99 };
100}