feat(discord-bridge): punte Discord -> Claude Code pe LXC 171
Implementeaza planul claude-master-plan-discord-bridge-20260830 (15 taskuri, 3 lane-uri paralele) — un bot subtire discord.py peste CLI-ul `claude`, cu proces persistent per fir alimentat pe stdin cu --input-format stream-json. Nucleu: runner (proces persistent + reaper 20min + respawn --resume), stream (parser tolerant), session_store (scriere atomica, lock per fir, detectare PID reuse, recovery), limits (max 4 procese, timeout tur, rate per user, plafon cost pe zi), render (un loop de editare per canal, interval adaptiv). Adaptor: allowlist guild/canal/user fail-closed cu respingerea webhook-urilor, comenzi !new/!cd/!model/!status/!stop/!cleanup, cost si model in subsolul fiecarui raspuns. Mesajul sosit in timpul unui tur devine steering, nu tur nou. Securitate: hook PreToolUse fail-closed care cere confirmare in Discord pentru operatiuni ireversibile, wrapper `infra` cu lista explicita de hosturi. Deny rules raman strat cosmetic, nu bariera (verificat: /usr/bin/ssh trece pe langa). Ops: alerte email pe conventia repo-ului, !cleanup pentru orfani, unit systemd user cu KillMode=control-group si limite de memorie, install.sh idempotent. Verificat: 275 teste fara retea/Discord/API (10.8s), identic cu si fara discord.py instalat; e2e pe CLI real confirma steering-ul mid-tur (mesaj la 6s intr-un tool call de 25s schimba raspunsul final). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B29CApsP1JkSdjYaGaHpE7
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
# Unit systemd de UTILIZATOR pentru puntea Discord -> Claude Code (LXC 171).
|
||||
#
|
||||
# Se instaleaza in ~/.config/systemd/user/claude-discord.service (vezi install.sh).
|
||||
# Rulare ca utilizatorul `claude`, NU ca root: puntea are exact accesul pe care il
|
||||
# are omul la terminal — decizie de arhitectura, nu scapare (vezi README, Securitate).
|
||||
#
|
||||
# systemctl --user daemon-reload
|
||||
# systemctl --user enable --now claude-discord
|
||||
# systemctl --user status claude-discord
|
||||
# journalctl --user -u claude-discord -f
|
||||
|
||||
[Unit]
|
||||
Description=Punte Discord -> Claude Code (LXC 171 claude-agent)
|
||||
Documentation=file:///workspace/romfastsql/proxmox/lxc171-claude-agent/discord-bridge/README.md
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
# Crash loop: dupa 5 porniri esuate in 300s systemd renunta si lasa unitul in
|
||||
# `failed`, in loc sa se invarta la nesfarsit. Botul trimite alerta pe email
|
||||
# inainte sa moara (alerts.alert_crash_loop).
|
||||
StartLimitIntervalSec=300
|
||||
StartLimitBurst=5
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=%h/.claude-discord
|
||||
|
||||
# Token-ul Discord si allowlist-ul stau in fisier 0600, nu in unit.
|
||||
EnvironmentFile=%h/.claude-discord/env
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
# CLI-ul `claude` e instalat prin nvm; PATH-ul unui unit de utilizator nu-l contine.
|
||||
Environment=PATH=%h/.nvm/versions/node/v20.19.6/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
ExecStartPre=/bin/mkdir -p %h/.claude-discord/logs
|
||||
ExecStart=%h/.claude-discord/venv/bin/python /workspace/romfastsql/proxmox/lxc171-claude-agent/discord-bridge/bot.py
|
||||
|
||||
# ESENTIAL: la stop/restart omoara TOT cgroup-ul, nu doar procesul principal.
|
||||
# Fara asta procesele `claude` (406 MB RSS masurat) raman in urma si umplu
|
||||
# containerul. Nu prinde totusi ce s-a desprins din cgroup — pentru aia exista
|
||||
# comanda `!cleanup` (cleanup.py).
|
||||
KillMode=control-group
|
||||
KillSignal=SIGTERM
|
||||
TimeoutStopSec=30
|
||||
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
# Backoff exponential: 5s, 10s, 20s, ... plafonat la 120s (systemd >= 254).
|
||||
RestartSteps=5
|
||||
RestartMaxDelaySec=120
|
||||
|
||||
# Containerul are istoric de OOM (incident 2026-06-24). MemoryHigh strange
|
||||
# procesul prin reclaim inainte sa se ajunga la OOM-kill la MemoryMax.
|
||||
MemoryHigh=3G
|
||||
MemoryMax=6G
|
||||
|
||||
StandardOutput=append:%h/.claude-discord/logs/bot.log
|
||||
StandardError=append:%h/.claude-discord/logs/bot.log
|
||||
SyslogIdentifier=claude-discord
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
Reference in New Issue
Block a user