Compare commits
12 Commits
feat/herme
...
merge-all-
| Author | SHA1 | Date | |
|---|---|---|---|
| 749f9e648c | |||
| 5f67028fb3 | |||
| 36413e2776 | |||
| 3efd30420f | |||
| 604d9107e4 | |||
| d0031e5c57 | |||
| 38f67f1bd6 | |||
|
|
ef9aa6c4cd | ||
|
|
7738269fb3 | ||
|
|
ccdb1c0931 | ||
|
|
d99f1cb0e5 | ||
|
|
b416d72454 |
69
ai/Dockerfile
Normal file
69
ai/Dockerfile
Normal file
@@ -0,0 +1,69 @@
|
||||
FROM ghcr.io/astral-sh/uv:0.11.6-python3.13-trixie@sha256:b3c543b6c4f23a5f2df22866bd7857e5d304b67a564f4feab6ac22044dde719b AS uv_source
|
||||
FROM tianon/gosu:1.19-trixie@sha256:3b176695959c71e123eb390d427efc665eeb561b1540e82679c15e992006b8b9 AS gosu_source
|
||||
FROM debian:13.4
|
||||
|
||||
# Disable Python stdout buffering to ensure logs are printed immediately
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
|
||||
# Store Playwright browsers outside the volume mount so the build-time
|
||||
# install survives the /opt/data volume overlay at runtime.
|
||||
ENV PLAYWRIGHT_BROWSERS_PATH=/opt/hermes/.playwright
|
||||
|
||||
# Install system dependencies in one layer, clear APT cache
|
||||
# tini reaps orphaned zombie processes (MCP stdio subprocesses, git, bun, etc.)
|
||||
# that would otherwise accumulate when hermes runs as PID 1. See #15012.
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
build-essential nodejs npm python3 ripgrep ffmpeg gcc python3-dev libffi-dev procps git openssh-client docker-cli tini \
|
||||
curl poppler-utils imagemagick \
|
||||
chromium xvfb fonts-noto-color-emoji fonts-unifont fonts-liberation fonts-ipafont-gothic fonts-wqy-zenhei fonts-tlwg-loma-otf fonts-freefont-ttf \
|
||||
libasound2t64 libatk-bridge2.0-0t64 libatk1.0-0t64 libatspi2.0-0t64 libcairo2 libcups2t64 libdbus-1-3 libdrm2 libgbm1 libglib2.0-0t64 libnspr4 libnss3 libpango-1.0-0 libx11-6 libxcb1 libxcomposite1 libxdamage1 libxext6 libxfixes3 libxkbcommon0 libxrandr2 \
|
||||
texlive-latex-base texlive-latex-extra texlive-fonts-recommended texlive-xetex texlive-science \
|
||||
qemu-user-static binfmt-support qemu-user-binfmt \
|
||||
emacs-nox && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Non-root user for runtime; UID can be overridden via HERMES_UID at runtime
|
||||
RUN useradd -u 10000 -m -d /opt/data hermes
|
||||
|
||||
COPY --chmod=0755 --from=gosu_source /gosu /usr/local/bin/
|
||||
COPY --chmod=0755 --from=uv_source /usr/local/bin/uv /usr/local/bin/uvx /usr/local/bin/
|
||||
|
||||
WORKDIR /opt/hermes
|
||||
|
||||
# ---------- Layer-cached dependency install ----------
|
||||
# Copy only package manifests first so npm install + Playwright are cached
|
||||
# unless the lockfiles themselves change.
|
||||
COPY package.json package-lock.json ./
|
||||
COPY web/package.json web/package-lock.json web/
|
||||
|
||||
RUN npm install --prefer-offline --no-audit && \
|
||||
npx playwright install --with-deps chromium --only-shell && \
|
||||
(cd web && npm install --prefer-offline --no-audit) && \
|
||||
npm cache clean --force
|
||||
|
||||
# ---------- Source code ----------
|
||||
# .dockerignore excludes node_modules, so the installs above survive.
|
||||
COPY --chown=hermes:hermes . .
|
||||
|
||||
# Build web dashboard (Vite outputs to hermes_cli/web_dist/)
|
||||
RUN cd web && npm run build
|
||||
|
||||
# ---------- Permissions ----------
|
||||
# Make install dir world-readable so any HERMES_UID can read it at runtime.
|
||||
# The venv needs to be traversable too.
|
||||
USER root
|
||||
RUN chmod -R a+rX /opt/hermes
|
||||
# Start as root so the entrypoint can usermod/groupmod + gosu.
|
||||
# If HERMES_UID is unset, the entrypoint drops to the default hermes user (10000).
|
||||
|
||||
# ---------- Python virtualenv ----------
|
||||
RUN uv venv && \
|
||||
uv pip install --no-cache-dir -e ".[all]"
|
||||
|
||||
# ---------- Runtime ----------
|
||||
ENV HERMES_WEB_DIST=/opt/hermes/hermes_cli/web_dist
|
||||
ENV HERMES_HOME=/opt/data
|
||||
ENV PATH="/opt/data/.local/bin:${PATH}"
|
||||
VOLUME [ "/opt/data" ]
|
||||
ENTRYPOINT [ "/usr/bin/tini", "-g", "--", "/opt/hermes/docker/entrypoint.sh" ]
|
||||
@@ -112,7 +112,22 @@ services:
|
||||
- /mnt/HoardingCow_docker_data/Ollama/ollama:/root/.ollama
|
||||
environment:
|
||||
- OLLAMA_VULKAN=0
|
||||
- HSA_OVERRIDE_GFX_VERSION=9.0.6
|
||||
- HCC_AMDGPU_TARGET=gfx906
|
||||
- HIP_VISIBLE_DEVICES=0,1
|
||||
- ROCR_VISIBLE_DEVICES=0,1
|
||||
- HSA_ENABLE_SDMA=0
|
||||
- OLLAMA_HOST=0.0.0.0
|
||||
- OLLAMA_DEBUG=1
|
||||
- OLLAMA_FLASH_ATTENTION=1
|
||||
- OLLAMA_NUM_PARALLEL=2
|
||||
devices:
|
||||
# Map the render nodes and KFD for ROCm to work inside the container
|
||||
- /dev/kfd:/dev/kfd
|
||||
- /dev/dri:/dev/dri
|
||||
group_add:
|
||||
- "303"
|
||||
- "26"
|
||||
|
||||
networks:
|
||||
ai_net:
|
||||
@@ -122,40 +137,47 @@ networks:
|
||||
driver: bridge
|
||||
name: ai_backend
|
||||
|
||||
llama-cpp-hermes:
|
||||
image: llama-cpp:rocm-gfx906
|
||||
container_name: llama-cpp-hermes
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- ai_backend
|
||||
ports:
|
||||
- "127.0.0.1:8300:8080"
|
||||
ipc: host
|
||||
devices:
|
||||
- /dev/kfd:/dev/kfd
|
||||
- /dev/dri:/dev/dri
|
||||
group_add:
|
||||
- "303"
|
||||
- "26"
|
||||
environment:
|
||||
- HSA_OVERRIDE_GFX_VERSION=9.0.6
|
||||
- HSA_ENABLE_SDMA=0
|
||||
- HIP_VISIBLE_DEVICES=0,1
|
||||
- LLAMA_CACHE=/models
|
||||
volumes:
|
||||
- /mnt/HoardingCow_docker_data/Llama_cpp/models:/models
|
||||
- /mnt/HoardingCow_docker_data/Ollama/ollama/models/blobs/sha256-17823599694fa3503ef54bf748d5078c6ce881f4d01616cafa255dc05d215a08:/model.gguf:ro
|
||||
command: >
|
||||
-m /model.gguf
|
||||
--host 0.0.0.0
|
||||
--port 8080
|
||||
--gpu-layers 99
|
||||
--ctx-size 163840
|
||||
-ctk f16 -ctv f16
|
||||
--flash-attn on
|
||||
--split-mode layer
|
||||
--no-mmap
|
||||
--n-predict -1
|
||||
# llama_cpp_devstral:
|
||||
# image: ghcr.io/ggml-org/llama.cpp:server-rocm
|
||||
# container_name: llama_cpp_devstral
|
||||
# restart: unless-stopped
|
||||
# networks:
|
||||
# - ai_backend
|
||||
# ports:
|
||||
# - "8300:8080"
|
||||
# ipc: host
|
||||
# devices:
|
||||
# - "/dev/kfd:/dev/kfd"
|
||||
# - "/dev/dri:/dev/dri"
|
||||
# group_add:
|
||||
# - "303" # video
|
||||
# - "26" # render
|
||||
# environment:
|
||||
# HSA_OVERRIDE_GFX_VERSION: 9.0.6
|
||||
# HIP_VISIBLE_DEVICES: 0,1
|
||||
# LLAMA_CACHE: /models
|
||||
# volumes:
|
||||
# - /mnt/HoardingCow_docker_data/Llama_cpp/models:/models
|
||||
# - /mnt/HoardingCow_docker_data/Llama_cpp/devstral-agent.jinja:/template.jinja
|
||||
# command: >
|
||||
# -hf unsloth/Devstral-Small-2-24B-Instruct-2512-GGUF:Devstral-Small-2-24B-Instruct-2512-Q8_0.gguf
|
||||
# -a devstral-2-small-llama_cpp
|
||||
# --chat-template-file /template.jinja
|
||||
# --host 0.0.0.0
|
||||
# --port 8080
|
||||
# --n-gpu-layers 99
|
||||
# --ctx-size 163840
|
||||
# --batch-size 4096
|
||||
# --ubatch-size 4096
|
||||
# --cache-type-k f16
|
||||
# --cache-type-v f16
|
||||
# --cache-reuse 256
|
||||
# --flash-attn on
|
||||
# --context-shift
|
||||
# --split-mode layer
|
||||
# --no-mmap
|
||||
# --n-predict -1
|
||||
# --parallel 2
|
||||
|
||||
# vllm:
|
||||
# image: nalanzeyu/vllm-gfx906:v0.9.0-rocm6.3
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
# llama-cpp-rocm6/Dockerfile
|
||||
# Custom llama.cpp server with ROCm 6.1 + gfx906 (MI50) support.
|
||||
# Build: docker build -t llama-cpp:rocm-gfx906 .
|
||||
|
||||
FROM rocm/dev-ubuntu-22.04:6.1.2-complete AS builder
|
||||
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y curl git build-essential pkg-config cmake make && rm -rf /var/lib/apt/lists/*
|
||||
ARG LLAMACPP_VERSION=b9596
|
||||
RUN git clone --depth 1 --branch ${LLAMACPP_VERSION} https://github.com/ggml-org/llama.cpp.git /build
|
||||
WORKDIR /build
|
||||
ENV HIP_PATH=/opt/rocm ROCM_PATH=/opt/rocm PATH=/opt/rocm/bin:/opt/rocm/llvm/bin:${PATH} CMAKE_PREFIX_PATH=/opt/rocm
|
||||
RUN mkdir build && cd build && \
|
||||
cmake .. -DGGML_HIP=ON -DCMAKE_BUILD_TYPE=Release \
|
||||
-DAMDGPU_TARGETS="gfx906:xnack-" \
|
||||
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
|
||||
-DGGML_CUDA=OFF -DGGML_VULKAN=OFF -DGGML_METAL=OFF \
|
||||
-DBUILD_SHARED_LIBS=OFF && \
|
||||
cmake --build . --target llama-server -- -j $(nproc)
|
||||
|
||||
FROM ubuntu:24.04
|
||||
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
|
||||
ca-certificates curl libstdc++6 libgomp1 libopenblas0 \
|
||||
libnuma1 libelf1 libdrm2 libdrm-amdgpu1 \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
COPY --from=builder /opt/rocm/lib/ /opt/rocm/lib/
|
||||
COPY --from=builder /opt/rocm/share/ /opt/rocm/share/
|
||||
COPY --from=builder /build/build/bin/llama-server /usr/local/bin/llama-server
|
||||
RUN echo /opt/rocm/lib > /etc/ld.so.conf.d/rocm.conf && ldconfig
|
||||
ENV HSA_OVERRIDE_GFX_VERSION=9.0.6 HCC_AMDGPU_TARGET=gfx906 HSA_ENABLE_SDMA=0
|
||||
EXPOSE 8080
|
||||
ENTRYPOINT ["/usr/local/bin/llama-server"]
|
||||
26
env/.env.example.paperclip
vendored
Normal file
26
env/.env.example.paperclip
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
# Paperclip Environment Variables
|
||||
# Copy this file to your .env (at the compose root or docker-compose working directory)
|
||||
# and fill in the secrets.
|
||||
#
|
||||
# cp env/.env.example.paperclip .env
|
||||
#
|
||||
# Then reference it from compose.yml:
|
||||
# env_file:
|
||||
# - path: .env
|
||||
# required: true
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Database
|
||||
# ---------------------------------------------------------------------------
|
||||
# PostgreSQL password for the paperclip-db service.
|
||||
# Generate a strong random password:
|
||||
# openssl rand -base64 32
|
||||
PAPERCLIP_DB_PASSWORD=change_me_to_a_strong_random_password
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Authentication
|
||||
# ---------------------------------------------------------------------------
|
||||
# Secret key used by Better Auth for signing and verifying tokens.
|
||||
# Generate a strong random secret:
|
||||
# openssl rand -base64 32
|
||||
PAPERCLIP_AUTH_SECRET=change_me_to_a_strong_random_secret
|
||||
Reference in New Issue
Block a user