feat(discord-bridge): dashboard de control si restart, dupa modelul agentului echo
Panou web pe 127.0.0.1:18790, unit systemd separat de al puntii. Server stdlib
(fara dependinte noi), tokenii de design si tiparul de endpoint-uri preluate din
/home/moltbot/echo-core/dashboard (handlers/eco.py) de pe LXC 110.
Arata: starea unitatii (uptime, PID, memoria cgroup, restarturi), firele din
state.json cu tur in zbor si cost, costul zilei fata de plafon, confirmarile
PreToolUse in asteptare (aprobabile direct din pagina), bot.log / infra.log si
opt verificari de diagnostic.
Face: start / stop / restart pe punte, cautarea si curatarea orfanilor prin
cleanup.py, repornirea propriului serviciu.
Garantii, cu teste:
- unitatea controlata e fixa in cod; un {"unit": "ssh.service"} in cerere nu
schimba nimic, altfel panoul ar fi systemctl remote fara parola;
- stop/restart intorc 409 cu lista firelor active si cer force explicit, fiindca
KillMode=control-group taie tururile in desfasurare;
- state.json se citeste fara lock: panoul nu are voie sa blocheze botul;
- diagnosticul pica daca reapare Bash(ssh:*) in deny (regresia de azi).
Uptime-ul se calculeaza din time.monotonic(), nu din /proc/uptime: in LXC acela
e virtualizat de lxcfs si da diferenta negativa fata de monotonic-ul systemd.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B29CApsP1JkSdjYaGaHpE7
This commit is contained in:
@@ -52,3 +52,11 @@ ALERT_RECIPIENT=root
|
||||
# face din Discord sa aiba istoric separat de proiectele reale. `/cd <cale>` il
|
||||
# schimba per fir, oriunde in /workspace.
|
||||
DEFAULT_CWD=/workspace/claude-agent
|
||||
|
||||
# --- dashboard de control (dashboard/api.py) --------------------------------
|
||||
# Token de acces. Generat automat de ops/install.sh daca lipseste.
|
||||
DASHBOARD_TOKEN=
|
||||
# Implicit 127.0.0.1: butoanele opresc un agent cu bypassPermissions si chei SSH
|
||||
# spre tot clusterul, deci accesul se face prin tunel SSH, nu expus in LAN.
|
||||
DASHBOARD_BIND=127.0.0.1
|
||||
DASHBOARD_PORT=18790
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
# 2. env 0600 din ops/env.example (doar daca lipseste)
|
||||
# 3. venv + dependinte din requirements.txt
|
||||
# 4. loginctl enable-linger (serviciul de utilizator trebuie sa supravietuiasca logout-ului)
|
||||
# 5. symlink unit -> ~/.config/systemd/user/claude-discord.service
|
||||
# 5. symlink-uri unit -> ~/.config/systemd/user/ (puntea + dashboard-ul de control)
|
||||
# 6. intrare de crontab pentru logrotate
|
||||
# 7. systemd-analyze verify + enable
|
||||
set -uo pipefail
|
||||
@@ -22,6 +22,7 @@ SRC="$(dirname "$HERE")" # .../discord-bridge
|
||||
STATE_DIR="$HOME/.claude-discord"
|
||||
UNIT_DIR="$HOME/.config/systemd/user"
|
||||
UNIT_NAME="claude-discord.service"
|
||||
DASH_UNIT="claude-discord-dashboard.service"
|
||||
DO_START=0
|
||||
[ "${1:-}" = "--start" ] && DO_START=1
|
||||
|
||||
@@ -95,6 +96,22 @@ ln -sfn "$HERE/$UNIT_NAME" "$UNIT_DIR/$UNIT_NAME"
|
||||
info "unit legat: $UNIT_DIR/$UNIT_NAME -> $HERE/$UNIT_NAME"
|
||||
systemctl --user daemon-reload 2>/dev/null || warn "daemon-reload a esuat (sesiune fara systemd de utilizator?)"
|
||||
|
||||
# Dashboard-ul de control (dashboard/api.py): unit separat, ca o repornire a
|
||||
# puntii sa nu ia si panoul din care ai apasat butonul.
|
||||
ln -sfn "$SRC/dashboard/$DASH_UNIT" "$UNIT_DIR/$DASH_UNIT"
|
||||
info "unit legat: $UNIT_DIR/$DASH_UNIT -> $SRC/dashboard/$DASH_UNIT"
|
||||
|
||||
# Tokenul dashboard-ului: generat o singura data, niciodata rescris.
|
||||
if grep -qE '^DASHBOARD_TOKEN=.+' "$STATE_DIR/env" 2>/dev/null; then
|
||||
info "DASHBOARD_TOKEN exista deja in env"
|
||||
else
|
||||
printf 'DASHBOARD_TOKEN=%s\n' "$(python3 -c 'import secrets;print(secrets.token_urlsafe(24))')" \
|
||||
>> "$STATE_DIR/env"
|
||||
info "DASHBOARD_TOKEN generat si adaugat in $STATE_DIR/env"
|
||||
fi
|
||||
|
||||
systemctl --user daemon-reload 2>/dev/null || true
|
||||
|
||||
if systemd-analyze verify "$UNIT_DIR/$UNIT_NAME" 2>&1 | grep -vE 'Unknown key|^$' | grep -q .; then
|
||||
systemd-analyze verify "$UNIT_DIR/$UNIT_NAME" 2>&1 | sed 's/^/ /'
|
||||
warn "systemd-analyze verify a raportat probleme (vezi mai sus)"
|
||||
@@ -132,6 +149,9 @@ fi
|
||||
systemctl --user enable "$UNIT_NAME" >/dev/null 2>&1 \
|
||||
&& info "serviciu enabled (porneste la boot)" \
|
||||
|| warn "enable a esuat"
|
||||
systemctl --user enable --now "$DASH_UNIT" >/dev/null 2>&1 \
|
||||
&& info "dashboard enabled + pornit pe 127.0.0.1:${DASHBOARD_PORT:-18790}" \
|
||||
|| warn "enable pentru $DASH_UNIT a esuat"
|
||||
|
||||
if [ "$DO_START" -eq 1 ]; then
|
||||
if [ ! -f "$SRC/bot.py" ]; then
|
||||
|
||||
Reference in New Issue
Block a user