Publish deployment and backup scripts
This commit is contained in:
134
deploy-docker-hermes.sh
Executable file
134
deploy-docker-hermes.sh
Executable file
@@ -0,0 +1,134 @@
|
||||
#!/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" <<DOTENV
|
||||
# Generated by deploy-docker-hermes.sh on $(date -Iseconds)
|
||||
DOTENV
|
||||
chmod 600 "${BASE_DIR}/.env"
|
||||
fi
|
||||
|
||||
# --- Generate docker-compose.yml ---
|
||||
cat > "${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 ""
|
||||
Reference in New Issue
Block a user