heather: add pi-web service + Caddy vhost pi.iscg.dev with basicauth

pi-web (agegr/pi-web, npm @agegr/pi-web) — web UI для pi coding agent.
systemd service на 127.0.0.1:30141, Caddy pi.iscg.dev терминирует TLS +
basicauth (bcrypt, пароль в pass iscg.dev/pi-web/auth).
nodejs в systemPackages; pi и pi-web ставятся в ~/.npm-global вручную.
This commit is contained in:
mikl 2026-07-13 13:21:34 +03:00
commit 87faa84104
3 changed files with 63 additions and 0 deletions

48
hosts/heather/pi-web.nix Normal file
View file

@ -0,0 +1,48 @@
# heather — pi-web (web UI для pi coding agent).
#
# https://github.com/agegr/pi-web, npm-пакет @agegr/pi-web
# Next.js 16 + lobehub-ui. Читает ~/.pi/agent/sessions/*.jsonl напрямую,
# общается с pi через RPC (spawn бинаря pi). НЕ демон — запускается как
# systemd-сервис, который держит next-server на 127.0.0.1.
#
# Слушает 127.0.0.1:30141 → Caddy pi.iscg.dev терминирует TLS + basicauth
# (см. caddy.nix, piBasicAuth). Auth-пароль в pass iscg.dev/pi-web/auth.
#
# Установка pi и pi-web — ручная (npm global в ~/.npm-global, НЕ в nix store):
# npm config set prefix ~/.npm-global
# npm i -g @earendil-works/pi-coding-agent @agegr/pi-web
# Это разовая операция на хосте (как tuwunel-admin бинарник вне nix-store).
# nodejs ставим через systemPackages — нужен и для npm, и для next-server.
{ config, pkgs, lib, ... }:
{
# Node.js: нужен для pi-web (next-server) и для spawn'а pi из pi-web.
environment.systemPackages = [ pkgs.nodejs ];
systemd.services.pi-web = {
description = "pi-web (web UI for pi coding agent)";
after = [ "network-online.target" ];
wants = [ "network-online.target" ];
wantedBy = [ "multi-user.target" ];
# PATH: nodejs (node/npm) + ~/.npm-global/bin (где лежат pi и pi-web).
path = [ pkgs.nodejs "/home/mikl/.npm-global/bin" ];
environment = {
# Где pi-web ищет sessions/pi-конфиг. Совпадает с ~/.pi/agent на heather.
PI_CODING_AGENT_DIR = "/home/mikl/.pi/agent";
HOME = "/home/mikl";
NODE_ENV = "production";
};
serviceConfig = {
Type = "simple";
User = "mikl";
Group = "users";
ExecStart = "/home/mikl/.npm-global/bin/pi-web --hostname 127.0.0.1 --port 30141";
WorkingDirectory = "/home/mikl";
Restart = "on-failure";
RestartSec = 5;
};
};
}