#!/bin/sh # Hermes Agent HF Spaces - Production Entrypoint ts() { date -u +"%H:%M:%S"; } log() { echo "[$(ts)] [entrypoint] $*"; } warn() { echo "[$(ts)] [entrypoint] WARN: $*"; } log "=== Hermes Agent + WebUI starting ===" # 1. Storage bucket HERMES_HOME=/data RETRIES=5 i=0 while [ $i -lt $RETRIES ]; do if [ -d /data ] && touch /data/.write-test 2>/dev/null; then rm -f /data/.write-test log "Storage bucket /data writable - using persistent storage" break fi i=$((i+1)) [ $i -lt $RETRIES ] && log "Waiting for /data... ($i/$RETRIES)" && sleep 1 done if ! touch /data/.write-test 2>/dev/null; then warn "/data not writable - using ephemeral /tmp/.hermes" HERMES_HOME=/tmp/.hermes mkdir -p "$HERMES_HOME" fi rm -f /data/.write-test 2>/dev/null export HERMES_HOME export HERMES_WEBUI_STATE_DIR="${HERMES_HOME}/webui" log "HERMES_HOME=$HERMES_HOME" # 2. Export API keys for VAR in $(env | cut -d= -f1); do case "$VAR" in *_API_KEY|*_BOT_TOKEN|*_SECRET_KEY) ;; *) continue ;; esac VAL=$(printenv "$VAR" 2>/dev/null || true) [ -n "$VAL" ] && export "$VAR" && log "exported: $VAR" done # 3. Setup log "Running setup..." timeout 60 sh /app/setup-hermes.sh || warn "Setup failed or timed out" log "Setup done." # 4. Hermes gateway (Telegram) - optional TG_TOKEN=$(printenv TELEGRAM_BOT_TOKEN 2>/dev/null || true) if [ -n "$TG_TOKEN" ]; then log "Starting hermes gateway (Telegram)..." ( cd /opt/hermes && HERMES_HOME="$HERMES_HOME" hermes gateway run >> /tmp/hermes-gateway.log 2>&1 ) & GATEWAY_PID=$! log "Gateway PID: $GATEWAY_PID" sleep 3 else log "No TELEGRAM_BOT_TOKEN - WebUI-only mode" fi # 5. hermes-webui log "Starting hermes-webui on :8787..." mkdir -p "${HERMES_HOME}/webui" PASS="${HERMES_WEBUI_PASSWORD:-}" [ -n "$PASS" ] && log "WebUI password: ENABLED" || log "WebUI password: DISABLED" ( cd /opt/hermes-webui HERMES_HOME="$HERMES_HOME" \ HERMES_WEBUI_HOST=127.0.0.1 \ HERMES_WEBUI_PORT=8787 \ HERMES_WEBUI_STATE_DIR="${HERMES_HOME}/webui" \ HERMES_WEBUI_AGENT_DIR=/opt/hermes \ HERMES_WEBUI_PASSWORD="$PASS" \ ${HERMES_WEBUI_PYTHON:-python3} server.py >> /tmp/hermes-webui.log 2>&1 ) & WEBUI_PID=$! log "WebUI PID: $WEBUI_PID" # Wait for webui ready WAITED=0 while [ $WAITED -lt 30 ]; do nc -z 127.0.0.1 8787 2>/dev/null && log "WebUI ready after ${WAITED}s" && break sleep 2; WAITED=$((WAITED+2)) done [ $WAITED -ge 30 ] && warn "WebUI slow to start - check /tmp/hermes-webui.log" # 6. nginx on 7860 log "Starting nginx on :7860..." nginx -g "daemon off;" & NGINX_PID=$! log "nginx PID: $NGINX_PID" log "=== All services started ===" log " Access: https://.hf.space" log " Logs : /tmp/hermes-webui.log /tmp/hermes-gateway.log" # 7. Watcher loop while true; do sleep 15 if ! kill -0 $WEBUI_PID 2>/dev/null; then warn "WebUI died - restarting..." ( cd /opt/hermes-webui HERMES_HOME="$HERMES_HOME" \ HERMES_WEBUI_HOST=127.0.0.1 \ HERMES_WEBUI_PORT=8787 \ HERMES_WEBUI_STATE_DIR="${HERMES_HOME}/webui" \ HERMES_WEBUI_AGENT_DIR=/opt/hermes \ HERMES_WEBUI_PASSWORD="$PASS" \ ${HERMES_WEBUI_PYTHON:-python3} server.py >> /tmp/hermes-webui.log 2>&1 ) & WEBUI_PID=$! log "WebUI restarted PID: $WEBUI_PID" fi if ! kill -0 $NGINX_PID 2>/dev/null; then warn "nginx died - exiting" exit 1 fi done