95 lines
2.7 KiB
Docker
95 lines
2.7 KiB
Docker
|
|
# Build stage: clone and install Hermes Agent + WebUI dependencies
|
||
|
|
FROM python:3.12-slim AS builder
|
||
|
|
|
||
|
|
WORKDIR /build
|
||
|
|
|
||
|
|
# hadolint ignore=DL3008
|
||
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||
|
|
ca-certificates \
|
||
|
|
curl \
|
||
|
|
git \
|
||
|
|
&& rm -rf /var/lib/apt/lists/*
|
||
|
|
|
||
|
|
# Install uv system-wide
|
||
|
|
# hadolint ignore=DL4006
|
||
|
|
RUN curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/bin sh
|
||
|
|
|
||
|
|
# Clone Hermes Agent at a pinned commit
|
||
|
|
ARG HERMES_AGENT_VERSION=v2026.6.5
|
||
|
|
RUN git clone --depth 1 --branch ${HERMES_AGENT_VERSION} \
|
||
|
|
https://github.com/NousResearch/hermes-agent.git /build/hermes-agent
|
||
|
|
|
||
|
|
# Clone Hermes WebUI at a pinned commit
|
||
|
|
ARG HERMES_WEBUI_VERSION=v0.51.350
|
||
|
|
RUN git clone --depth 1 --branch ${HERMES_WEBUI_VERSION} \
|
||
|
|
https://github.com/nesquena/hermes-webui.git /build/hermes-webui
|
||
|
|
|
||
|
|
# Create a shared venv and install both projects
|
||
|
|
# hadolint ignore=DL3059
|
||
|
|
RUN uv venv /build/venv
|
||
|
|
ENV VIRTUAL_ENV=/build/venv
|
||
|
|
ENV PATH="/build/venv/bin:$PATH"
|
||
|
|
|
||
|
|
# Install hermes-agent with all extras (includes ML/agent deps)
|
||
|
|
# hadolint ignore=DL3013,DL3059
|
||
|
|
RUN uv pip install \
|
||
|
|
"/build/hermes-agent[all]"
|
||
|
|
|
||
|
|
# Install hermes-webui deps (pyyaml + cryptography)
|
||
|
|
# hadolint ignore=DL3059
|
||
|
|
RUN uv pip install \
|
||
|
|
-r /build/hermes-webui/requirements.txt
|
||
|
|
|
||
|
|
# Install uv in the venv so the webui server can use it for profile/skill management
|
||
|
|
# hadolint ignore=DL3059
|
||
|
|
RUN uv pip install \
|
||
|
|
"uv>=0.6.0"
|
||
|
|
|
||
|
|
# Runtime stage
|
||
|
|
FROM python:3.12-slim
|
||
|
|
|
||
|
|
WORKDIR /app
|
||
|
|
|
||
|
|
# hadolint ignore=DL3008
|
||
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||
|
|
ca-certificates \
|
||
|
|
curl \
|
||
|
|
git \
|
||
|
|
openssh-client \
|
||
|
|
&& rm -rf /var/lib/apt/lists/*
|
||
|
|
|
||
|
|
# Copy the virtual environment and source trees from builder
|
||
|
|
COPY --from=builder /build/venv /opt/venv
|
||
|
|
COPY --from=builder /build/hermes-agent /opt/hermes-agent
|
||
|
|
COPY --from=builder /build/hermes-webui /app
|
||
|
|
|
||
|
|
# Set environment
|
||
|
|
ENV PATH="/opt/venv/bin:$PATH" \
|
||
|
|
VIRTUAL_ENV=/opt/venv \
|
||
|
|
PYTHONDONTWRITEBYTECODE=1 \
|
||
|
|
PYTHONUNBUFFERED=1 \
|
||
|
|
PYTHONIOENCODING=utf-8
|
||
|
|
|
||
|
|
# Tell the WebUI where to find the agent
|
||
|
|
ENV HERMES_WEBUI_AGENT_DIR=/opt/hermes-agent \
|
||
|
|
HERMES_WEBUI_HOST=0.0.0.0 \
|
||
|
|
HERMES_WEBUI_PORT=8787 \
|
||
|
|
HERMES_WEBUI_STATE_DIR=/home/hermes/.hermes/webui \
|
||
|
|
HERMES_WEBUI_DEFAULT_WORKSPACE=/workspace \
|
||
|
|
HERMES_HOME=/home/hermes/.hermes
|
||
|
|
|
||
|
|
# Create non-root user
|
||
|
|
RUN useradd --create-home --shell /bin/bash hermes \
|
||
|
|
&& mkdir -p /workspace \
|
||
|
|
&& chown -R hermes:hermes /app /opt/venv /opt/hermes-agent /workspace /home/hermes
|
||
|
|
|
||
|
|
USER hermes
|
||
|
|
|
||
|
|
EXPOSE 8787
|
||
|
|
|
||
|
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
|
||
|
|
CMD curl -f http://localhost:8787/health || exit 1
|
||
|
|
|
||
|
|
# Run the WebUI server (which runs Hermes Agent in-process)
|
||
|
|
CMD ["python", "/app/server.py"]
|