From 317a5b23af348c21042d754a292a0f9ff2be8d10 Mon Sep 17 00:00:00 2001 From: Hermes Date: Sun, 24 May 2026 19:47:08 -0400 Subject: [PATCH] feat: drop fork, use official image + plugin URL build arg --- ai/compose.yml | 4 ++-- ai/hermes/Dockerfile | 45 +++++++++++++++++++------------------------- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/ai/compose.yml b/ai/compose.yml index 89dceca..b5910a7 100755 --- a/ai/compose.yml +++ b/ai/compose.yml @@ -28,8 +28,8 @@ services: hermes: build: context: ./hermes - ssh: - - default + args: + HERMES_PLUGIN_URLS: "" container_name: hermes entrypoint: ["/bin/bash", "-c", "bash /opt/data/hermes-tools/install.sh && bash /usr/local/bin/run-multi-gateways.sh && exec /usr/bin/tini -g -- /opt/hermes/docker/entrypoint.sh \"$@\"", diff --git a/ai/hermes/Dockerfile b/ai/hermes/Dockerfile index dd044f9..eac4d47 100644 --- a/ai/hermes/Dockerfile +++ b/ai/hermes/Dockerfile @@ -1,33 +1,15 @@ # syntax=docker/dockerfile:1 -# Hermes Agent -- custom fork build -# Builds on top of official image + overlays our forked source from Gitea. -# Requires Docker BuildKit. Pass SSH agent for git clone: +# Hermes Agent -- official image + custom plugins layered on top. +# No fork needed — customizations are pip-installable plugins from Gitea. # docker compose build hermes # Or manually: -# DOCKER_BUILDKIT=1 docker build --ssh default -t hermes-agent:custom . +# DOCKER_BUILDKIT=1 docker build --build-arg HERMES_PLUGIN_URLS="url1 url2" -t hermes-agent:custom . # ---------- Base: official Hermes image (system deps, npm, uv, Playwright) ---------- FROM nousresearch/hermes-agent:latest -# ---------- Overlay our forked source ---------- -# Uses SSH agent forwarding from the build host (no key baked into image). -# --exclude node_modules/.venv keeps the base image's pre-built layers intact. -# Only the Python source, web UI source, and config change. -RUN --mount=type=ssh \ - mkdir -p /root/.ssh && \ - ssh-keyscan -p 2222 code.lazyworkhorse.net >> /root/.ssh/known_hosts 2>/dev/null && \ - cd /tmp && \ - GIT_SSH_COMMAND='ssh -p 2222 -o StrictHostKeyChecking=no' \ - git clone --depth 1 --branch main \ - git@code.lazyworkhorse.net:gortium/hermes-agent.git fork && \ - rm -rf fork/node_modules fork/.venv fork/.git && \ - cp -a fork/. /opt/hermes/ && \ - rm -rf /tmp/fork /root/.ssh/ - -# ---------- Reinstall Python package (editable) ---------- -# Picks up source changes from our fork. -RUN . /opt/hermes/.venv/bin/activate && \ - uv pip install --no-cache-dir --no-deps -e /opt/hermes +# ---------- Plugin URLs (semicolon-separated, set via compose.yml build args) ---------- +ARG HERMES_PLUGIN_URLS="" # ---------- Extra system deps ---------- USER root @@ -44,8 +26,6 @@ RUN apt-get update && \ COPY --chmod=0755 --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/ # ---------- Matrix bridge + extra pip deps ---------- -# Previously installed inline at container startup and persisted via volume mount. -# Now baked into the image so the fragile venv volume mount can be removed. RUN . /opt/hermes/.venv/bin/activate && \ uv pip install --no-cache-dir 'mautrix[encryption]' openai @@ -76,6 +56,19 @@ os.remove(tgz) print('himalaya v1.2.0 installed') PYEOF +# ---------- Install custom plugins from URLs ---------- +# HERMES_PLUGIN_URLS is a semicolon-separated list of pip-installable +# package URLs (e.g. git+https:// or direct .tar.gz archives from Gitea). +# Each plugin is installed into the Hermes venv. +RUN if [ -n "$HERMES_PLUGIN_URLS" ]; then \ + . /opt/hermes/.venv/bin/activate && \ + IFS=';' read -ra URLS <<< "$HERMES_PLUGIN_URLS" && \ + for url in "${URLS[@]}"; do \ + echo "Installing plugin: $url" && \ + uv pip install --no-cache-dir "$url"; \ + done; \ + fi + # ---------- Install multi-gateway launcher ---------- # Launches one gateway process per profile (HERMES_PROFILES env var) COPY --chmod=0755 run-multi-gateways.sh /usr/local/bin/run-multi-gateways.sh @@ -92,4 +85,4 @@ ENV CHROME_EXECUTABLE=/opt/hermes/.playwright/chromium/chrome-linux/chrome USER root RUN chown -R hermes:hermes /opt/hermes/tools /opt/hermes/toolsets.py -VOLUME [ "/opt/data" ] \ No newline at end of file +VOLUME [ "/opt/data" ]