#!/usr/bin/env bash # ============================================================================== # Hermes Agent Deployment Script (Docker — Gateway Mode) # ============================================================================== # Deploys Hermes Agent as a gateway connecting to Telegram/Discord/Slack/WhatsApp. # No web UI — does NOT use Traefik. # # First run requires interactive setup for API keys: # docker run -it --rm -v /opt/hermes/data:/opt/data nousresearch/hermes-agent setup # # Usage: deploy-docker-hermes.sh # deploy-docker-hermes.sh --remove [--purge] [--yes] # ============================================================================== set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" # --- Parse arguments --- parse_args "$@" # --- Service config --- SERVICE_NAME="hermes" BASE_DIR="/opt/${SERVICE_NAME}" CONFIG_NAME="" # No Traefik UNIT_NAME="${SERVICE_NAME}-docker" # --- Handle --remove --- if [[ "$ARG_REMOVE" == "1" ]]; then require_root do_remove "$SERVICE_NAME" "$CONFIG_NAME" "$UNIT_NAME" "$BASE_DIR" exit 0 fi # --- Detect current state for banner --- install_mode="Fresh install" if [[ -f "${BASE_DIR}/.env" ]]; then install_mode="Re-run (preserving data)" fi # --- Print deployment plan --- echo "" echo -e "${CYAN}══════════════════════════════════════════════${NC}" echo -e "${CYAN} Deploying Hermes Agent (Docker/Gateway)${NC}" echo -e "${CYAN}══════════════════════════════════════════════${NC}" echo -e " Data: ${BASE_DIR}/data/" echo -e " Traefik: Not used (no web UI)" echo -e " Mode: ${install_mode}" echo -e "${CYAN}══════════════════════════════════════════════${NC}" echo "" # --- Check if already deployed and running --- if [[ -f "${BASE_DIR}/docker-compose.yml" ]] && \ docker ps --format '{{.Names}}' 2>/dev/null | grep -q '^hermes$'; then echo -e "${GREEN} Hermes is already running — nothing to do.${NC}" echo "" echo -e " Logs: docker logs -f hermes" echo -e " Backup: ${SCRIPT_DIR}/backup-hermes.sh" echo -e " Remove: $0 --remove [--purge]" echo "" exit 0 fi # --- Infrastructure (Docker only, no Traefik) --- require_root detect_os install_prerequisites ensure_docker_network # --- Backup restore check --- if check_and_restore_backup "$SERVICE_NAME"; then ok "Backup restored." else # --- Fresh install --- mkdir -p "${BASE_DIR}/data" if [[ ! -f "${BASE_DIR}/.env" ]]; then cat > "${BASE_DIR}/.env" < "${BASE_DIR}/docker-compose.yml" <<'COMPOSE' services: hermes: image: nousresearch/hermes-agent:latest container_name: hermes restart: unless-stopped command: gateway run security_opt: - no-new-privileges:true mem_limit: 4G shm_size: 1g volumes: - ./data:/opt/data logging: driver: json-file options: max-size: "50m" max-file: "5" COMPOSE ok "docker-compose.yml written." fi # --- Start --- install_systemd_unit "$UNIT_NAME" "$BASE_DIR" (cd "$BASE_DIR" && docker compose up -d) # Health check — hermes doesn't have HTTP, use version command info "Checking Hermes is running..." sleep 5 if docker exec hermes hermes version > /dev/null 2>&1; then ok "Hermes is running." else warn "Hermes container started but 'hermes version' failed. May need initial setup." fi # --- Summary --- echo "" echo -e "${GREEN}══════════════════════════════════════════════${NC}" echo -e "${GREEN} Hermes Agent deployed successfully${NC}" echo -e "${GREEN}══════════════════════════════════════════════${NC}" echo -e " Data: ${BASE_DIR}/data/" echo -e " Systemd: systemctl status ${UNIT_NAME}" echo -e " Logs: docker logs -f hermes" echo "" echo -e " ${YELLOW}First run? Set up API keys:${NC}" echo -e " docker run -it --rm -v ${BASE_DIR}/data:/opt/data nousresearch/hermes-agent setup" echo -e " Then: cd ${BASE_DIR} && docker compose restart" echo -e "${GREEN}══════════════════════════════════════════════${NC}" echo ""