heather: add paseo daemon (systemd + caddy vhost paseo.iscg.dev, dual auth)

This commit is contained in:
mikl 2026-09-09 20:15:28 +03:00
commit fc27c08fa8
9 changed files with 125 additions and 26 deletions

View file

@ -33,6 +33,15 @@ let
}
'';
# paseo basicauth — внешний слой. Внутренний: парольная auth самого демона
# (PASEO_PASSWORD, /var/lib/paseo-secrets/paseo.env). Пароли в pass:
# iscg.dev/paseo/basicauth (caddy) и iscg.dev/paseo/daemon (paseo daemon).
paseoBasicAuth = ''
basicauth {
mikl $2a$14$4ZfTWjquFPOoKyq9NA.IJeX9y3lxQO1l0J7iXSnr/.8oqJoblM8jy
}
'';
in {
services.caddy = {
enable = true;
@ -125,6 +134,12 @@ Allow: /" 200
reverse_proxy 127.0.0.1:30141
'';
# paseo (self-hosted web UI для CLI-агентов, systemd paseo.service)
# Два слоя auth: basicauth (здесь) + парольная auth демона (PASEO_PASSWORD).
"paseo.iscg.dev".extraConfig = paseoBasicAuth + ''
reverse_proxy 127.0.0.1:6767
'';
# File explorer (directory listing) для раздачи файлов через браузер.
# browse включает Caddy's built-in directory listing. Корень /var/www/pub.
# Без auth — класть только публичные файлы.

View file

@ -21,6 +21,7 @@
./syncthing.nix # sync + relay
./tuwunel-admin.nix # matrix admin web UI (systemd, статический бинарник)
./pi-web.nix # pi-web (web UI для pi coding agent, systemd + npm global)
./paseo.nix # paseo daemon (web UI для CLI-агентов, systemd + npm global)
./mesh-clients.nix # Sol-style client pool (wg-clients1)
./mesh-egress.nix # Sol-style selected-destination egress policy
];

50
hosts/heather/paseo.nix Normal file
View file

@ -0,0 +1,50 @@
# heather — paseo daemon (self-hosted web UI для CLI-агентов: pi, codex и др.).
#
# https://github.com/getpaseo/paseo, npm-пакет @getpaseo/cli
# Daemon управляет агентами как дочерними процессами (provider = CLI на хосте,
# со своими кредами). Слушает 127.0.0.1:6767 → Caddy paseo.iscg.dev терминирует
# TLS + basicauth (внешний слой, см. caddy.nix paseoBasicAuth).
#
# Auth два слоя:
# 1) встроенная парольная auth демона (bcrypt, Bearer header + WS subprotocol,
# без пароля — 401). Пароль: PASEO_PASSWORD из EnvironmentFile
# /var/lib/paseo-secrets/paseo.env (mikl:users 600), plaintext в
# pass iscg.dev/paseo/daemon.
# 2) Caddy basicauth, пароль в pass iscg.dev/paseo/basicauth.
#
# Конфиг демона: ~/.paseo/config.json (hostnames: paseo.iscg.dev — DNS rebinding
# protection, webUi enabled, relay off, dictation/voice off — не качать
# speech-модели). Хост-allowlist проверен: чужой Host → 403.
#
# Установка @getpaseo/cli — ручная (npm global в ~/.npm-global, как pi-web):
# npm i -g @getpaseo/cli # node-pty собирается без тулчейна (prebuilds)
# Провайдеры: pi уже стоит (~/.local/bin/pi).
{ config, pkgs, lib, ... }:
{
systemd.services.paseo = {
description = "paseo daemon (self-hosted web UI for CLI coding agents)";
after = [ "network-online.target" ];
wants = [ "network-online.target" ];
wantedBy = [ "multi-user.target" ];
# PATH: nodejs (node/npm) + ~/.npm-global/bin (paseo) + ~/.local/bin (pi).
path = [ pkgs.nodejs "/home/mikl/.npm-global/bin" "/home/mikl/.local/bin" ];
environment = {
PASEO_HOME = "/home/mikl/.paseo";
HOME = "/home/mikl";
};
serviceConfig = {
Type = "simple";
User = "mikl";
Group = "users";
ExecStart = "/home/mikl/.npm-global/bin/paseo daemon start --foreground --web-ui --no-relay";
EnvironmentFile = "/var/lib/paseo-secrets/paseo.env";
WorkingDirectory = "/home/mikl";
Restart = "on-failure";
RestartSec = 5;
};
};
}

View file

@ -37,6 +37,7 @@
"element"
"prismlauncher"
"losslesscut" # lossless-нарезка/remux видео (GUI на базе ffmpeg)
"obs" # запись экрана и окон
];
};