diff --git a/ct/headers/hermesagent b/ct/headers/hermesagent new file mode 100644 index 00000000..671ec9d1 --- /dev/null +++ b/ct/headers/hermesagent @@ -0,0 +1,6 @@ + __ __ ___ __ + / / / /__ _________ ___ ___ _____ / | ____ ____ ____ / /_ + / /_/ / _ \/ ___/ __ `__ \/ _ \/ ___/ / /| |/ __ `/ _ \/ __ \/ __/ + / __ / __/ / / / / / / / __(__ ) / ___ / /_/ / __/ / / / /_ +/_/ /_/\___/_/ /_/ /_/ /_/\___/____/ /_/ |_\__, /\___/_/ /_/\__/ + /____/ diff --git a/ct/hermesagent.sh b/ct/hermesagent.sh new file mode 100644 index 00000000..a2382a34 --- /dev/null +++ b/ct/hermesagent.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 community-scripts ORG +# Author: Stephen Chin (steveonjava) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://hermes-agent.nousresearch.com/ + +APP="Hermes Agent" +var_tags="${var_tags:-ai;automation;agent}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-4096}" +var_disk="${var_disk:-20}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -x /home/hermes/.local/bin/hermes ]]; then + msg_error "No Hermes Agent Installation Found!" + exit + fi + + msg_warn "WARNING: This script will run an external installer from a third-party source (https://hermes-agent.nousresearch.com/)." + msg_warn "The following code is NOT maintained or audited by our repository." + msg_warn "If you have any doubts or concerns, please review the installer code before proceeding:" + msg_custom "${TAB3}${GATEWAY}${BGN}${CL}" "\e[1;34m" "→ hermes update (https://hermes-agent.nousresearch.com/)" + echo + read -r -p "${TAB3}Do you want to continue? [y/N]: " CONFIRM + if [[ ! "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then + msg_error "Aborted by user. No changes have been made." + exit 10 + fi + + msg_info "Stopping Services" + systemctl stop hermes-dashboard + msg_ok "Stopped Services" + + msg_info "Updating Hermes Agent" + $STD setsid --wait bash -c ' + set -a; source /etc/default/hermes; set +a + /home/hermes/.local/bin/hermes update --yes + ' + chown -R hermes:hermes /home/hermes + msg_ok "Updated Hermes Agent" + + msg_info "Starting Services" + systemctl start hermes-dashboard + msg_ok "Started Services" + msg_ok "Updated successfully!" + exit +} + +start +build_container +description + +msg_ok "Completed successfully!\n" +echo -e "${CREATING}${GN}Hermes Agent setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Configure your model provider and gateway server inside the container:${CL}" +echo -e "${TAB}${BGN}su - hermes${CL}" +echo -e "${TAB}${BGN}hermes setup${CL}" +echo -e "${INFO}${YW}Key for Hermes API Server stored in:${CL}" +echo -e "${TAB}${BGN}/home/hermes/.hermes/.env${CL}" diff --git a/install/hermesagent-install.sh b/install/hermesagent-install.sh new file mode 100644 index 00000000..28f6f85e --- /dev/null +++ b/install/hermesagent-install.sh @@ -0,0 +1,106 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: Stephen Chin (steveonjava) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://hermes-agent.nousresearch.com/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt install -y git +msg_ok "Installed Dependencies" + +NODE_VERSION="22" setup_nodejs + +msg_info "Creating Hermes User" +useradd -m -s /bin/bash hermes +loginctl enable-linger hermes +echo 'export XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"' >>/home/hermes/.profile +msg_ok "Created Hermes User" + +msg_info "Configuring Service Environment" +cat </etc/default/hermes +HOME=/home/hermes +PATH=/home/hermes/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +NODE_OPTIONS=${NODE_OPTIONS} +EOF +msg_ok "Configured Service Environment" + +msg_warn "WARNING: This script will run an external installer from a third-party source (https://hermes-agent.nousresearch.com/)." +msg_warn "The following code is NOT maintained or audited by our repository." +msg_warn "If you have any doubts or concerns, please review the installer code before proceeding:" +msg_custom "${TAB3}${GATEWAY}${BGN}${CL}" "\e[1;34m" "→ https://hermes-agent.nousresearch.com/install.sh" +echo +read -r -p "${TAB3}Do you want to continue? [y/N]: " CONFIRM +if [[ ! "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then + msg_error "Aborted by user. No changes have been made." + exit 10 +fi + +msg_info "Installing Hermes Agent" +$STD setsid --wait bash -c ' + set -a; source /etc/default/hermes; set +a + bash <(curl -fsSL https://hermes-agent.nousresearch.com/install.sh) --skip-setup --hermes-home /home/hermes/.hermes --dir /home/hermes/.hermes/hermes-agent +' +chown -R hermes:hermes /home/hermes +chmod 750 /home/hermes +chmod 700 /home/hermes/.hermes +git config --system --add safe.directory /home/hermes/.hermes/hermes-agent 2>/dev/null || true +msg_ok "Installed Hermes Agent" + +msg_info "Configuring API Server" +API_SERVER_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32) +mkdir -p /home/hermes/.hermes +cat </home/hermes/.hermes/.env +API_SERVER_ENABLED=true +API_SERVER_HOST=0.0.0.0 +API_SERVER_PORT=8642 +API_SERVER_KEY=${API_SERVER_KEY} +EOF +chmod 600 /home/hermes/.hermes/.env +msg_ok "Configured API Server" + +msg_info "Creating Dashboard Service" +cat </etc/systemd/system/hermes-dashboard.service +[Unit] +Description=Hermes Agent Web Dashboard +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +User=hermes +Group=hermes +UMask=0077 +WorkingDirectory=/home/hermes +ExecStart=/home/hermes/.local/bin/hermes dashboard --host 127.0.0.1 --port 9119 --no-open +EnvironmentFile=/etc/default/hermes +Restart=on-failure +RestartSec=5 +ProtectProc=invisible +ProcSubset=pid + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now hermes-dashboard +msg_ok "Created Dashboard Service" + +msg_info "Configuring Login Hints" +cat <<'HINT' >/etc/profile.d/hermes-hint.sh +if [[ "$(id -u)" -eq 0 ]]; then + echo " Use 'su - hermes' to switch to the hermes user for running Hermes Agent." +fi +HINT +msg_ok "Configured Login Hints" + +motd_ssh +customize +cleanup_lxc diff --git a/json/hermesagent.json b/json/hermesagent.json new file mode 100644 index 00000000..123151a7 --- /dev/null +++ b/json/hermesagent.json @@ -0,0 +1,56 @@ +{ + "name": "Hermes Agent", + "slug": "hermesagent", + "categories": [ + 20 + ], + "date_created": "2026-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://hermes-agent.nousresearch.com/docs", + "website": "https://hermes-agent.nousresearch.com", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/hermes.webp", + "description": "Self-improving AI agent by Nous Research. Connects to 15+ LLM providers, executes terminal commands, browses the web, and learns from experience. Supports 16 messaging platforms (Telegram, Discord, Slack, WhatsApp, Signal, Matrix, and more) with persistent memory and autonomous skill creation.", + "install_methods": [ + { + "type": "default", + "script": "ct/hermesagent.sh", + "config_path": "/home/hermes/.hermes/.env", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 20, + "os": "debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + }, + { + "text": "Hermes can execute terminal commands. The agent runs as a dedicated 'hermes' service user for isolation.", + "type": "warning" + }, + { + "text": "After container startup, login, switch to the hermes user (su - hermes) and run 'hermes setup' to configure your model provider and gateway server.", + "type": "info" + }, + { + "text": "OpenAI-compatible API server available at http://:8642/v1. API key is stored in /home/hermes/.hermes/.env.", + "type": "info" + }, + { + "text": "Access the web dashboard via SSH tunnel: ssh -fNL 9119:localhost:9119 root@, then open http://localhost:9119", + "type": "info" + } + ] +}