From 9ad8a84fc4c3310fe12245473843d7de15e1ae21 Mon Sep 17 00:00:00 2001 From: viky <112059651+vikyw89@users.noreply.github.com> Date: Wed, 8 Jul 2026 03:02:43 +0800 Subject: [PATCH] feat: add Hermes agent template (#960) Hermes is an open agent runtime from Nous Research. This template runs the supervised gateway with: - web dashboard (9119) behind Traefik, protected by the bundled basic-auth provider (auth-gated mode triggers automatically once reachable off-loopback); username admin, generated 128-char password - OpenAI-compatible gateway API (8642), enabled and bound to 0.0.0.0 with a generated bearer token (both off by default upstream) Image pinned to v2026.6.19. Provider keys are configured from the dashboard after deploy and persist in the hermes_data volume. Co-authored-by: Claude Opus 4.8 (1M context) --- blueprints/hermes/docker-compose.yml | 27 ++++++++++++++++++++++ blueprints/hermes/logo.png | Bin 0 -> 4100 bytes blueprints/hermes/template.toml | 33 +++++++++++++++++++++++++++ meta.json | 18 +++++++++++++++ 4 files changed, 78 insertions(+) create mode 100644 blueprints/hermes/docker-compose.yml create mode 100644 blueprints/hermes/logo.png create mode 100644 blueprints/hermes/template.toml diff --git a/blueprints/hermes/docker-compose.yml b/blueprints/hermes/docker-compose.yml new file mode 100644 index 00000000..6e915e33 --- /dev/null +++ b/blueprints/hermes/docker-compose.yml @@ -0,0 +1,27 @@ +version: "3.8" +services: + hermes: + image: nousresearch/hermes-agent:v2026.6.19 + restart: unless-stopped + command: gateway run + ports: + - 9119 + - 8642 + environment: + - HERMES_DASHBOARD=${HERMES_DASHBOARD} + - HERMES_DASHBOARD_BASIC_AUTH_USERNAME=${HERMES_DASHBOARD_BASIC_AUTH_USERNAME} + - HERMES_DASHBOARD_BASIC_AUTH_PASSWORD=${HERMES_DASHBOARD_BASIC_AUTH_PASSWORD} + - HERMES_DASHBOARD_BASIC_AUTH_SECRET=${HERMES_DASHBOARD_BASIC_AUTH_SECRET} + - API_SERVER_ENABLED=${API_SERVER_ENABLED} + - API_SERVER_HOST=${API_SERVER_HOST} + - API_SERVER_KEY=${API_SERVER_KEY} + volumes: + - hermes_data:/opt/data + deploy: + resources: + limits: + memory: 4G + cpus: "2.0" + +volumes: + hermes_data: diff --git a/blueprints/hermes/logo.png b/blueprints/hermes/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2d629d2f2452f00a7bc5a3252c1c1829c0b476bd GIT binary patch literal 4100 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 128 chars +dashboard_password = "${base64:96}" +dashboard_secret = "${base64:32}" +api_key = "${password:32}" + +[config] +mounts = [] + +# Web dashboard (HERMES_DASHBOARD=1). Exposed behind Traefik, so Hermes' +# auth-gated mode kicks in — protect it with the bundled basic-auth provider. +[[config.domains]] +serviceName = "hermes" +port = 9119 +host = "${dashboard_domain}" + +# OpenAI-compatible gateway API. Disabled and loopback-bound by default, +# so it must be enabled, bound to 0.0.0.0, and given a bearer token. +[[config.domains]] +serviceName = "hermes" +port = 8642 +host = "${gateway_domain}" + +[config.env] +HERMES_DASHBOARD = "1" +HERMES_DASHBOARD_BASIC_AUTH_USERNAME = "admin" +HERMES_DASHBOARD_BASIC_AUTH_PASSWORD = "${dashboard_password}" +HERMES_DASHBOARD_BASIC_AUTH_SECRET = "${dashboard_secret}" +API_SERVER_ENABLED = "true" +API_SERVER_HOST = "0.0.0.0" +API_SERVER_KEY = "${api_key}" diff --git a/meta.json b/meta.json index 06aa27b0..baac068c 100644 --- a/meta.json +++ b/meta.json @@ -2970,6 +2970,24 @@ "self-hosted" ] }, + { + "id": "hermes", + "name": "Hermes", + "version": "v2026.6.19", + "description": "Hermes is an open agent runtime from Nous Research, exposing an OpenAI-compatible gateway API and a supervised web dashboard for building and running AI agents.", + "logo": "logo.png", + "links": { + "github": "https://github.com/NousResearch/hermes-agent", + "website": "https://hermes-agent.nousresearch.com/", + "docs": "https://hermes-agent.nousresearch.com/docs/user-guide/docker" + }, + "tags": [ + "ai", + "agent", + "llm", + "self-hosted" + ] + }, { "id": "heyform", "name": "HeyForm",