@avcodes/harbor
Advanced tools
| --- | ||
| description: 'This agent can drive implementation of a new service in Harbor.' | ||
| tools: ['vscode', 'execute', 'read', 'edit', 'search', 'web', 'chromedevtools/chrome-devtools-mcp/*', 'context7/*', 'deepwiki-mcp/*', 'agent', 'todo'] | ||
| --- | ||
| Agent carefully reads and follows the instructions in the file [.github/copilot-new-service.md] to create a new service in Harbor. | ||
| ### Agent Workflow | ||
| - Read the instructions in [.github/copilot-new-service.md] thoroughly. | ||
| - Research information about the new service that was provided by the user. | ||
| - Use Plan agent to plan the implementation | ||
| - Orchestrate the implementation of the new service by breaking down the tasks into manageable steps. | ||
| - Delegate writing a documentation to a dedicated sub-agent thread, ensure to refer it to the [./.github/copilot-new-service.md] guide. Ensure that the agent will follow example from 2.3.52 in terms of format and structure. | ||
| - Test the implementation based on the service type: CLI - via terminal, Web - via Chrome Automation. | ||
| services: | ||
| drawio: | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.drawio | ||
| image: ${HARBOR_DRAWIO_IMAGE}:${HARBOR_DRAWIO_VERSION} | ||
| env_file: | ||
| - ./.env | ||
| - ./drawio/override.env | ||
| ports: | ||
| - ${HARBOR_DRAWIO_HOST_PORT}:3000 | ||
| environment: | ||
| - AI_PROVIDER=${HARBOR_DRAWIO_AI_PROVIDER} | ||
| - AI_MODEL=${HARBOR_DRAWIO_AI_MODEL} | ||
| - TEMPERATURE=${HARBOR_DRAWIO_TEMPERATURE} | ||
| - ACCESS_CODE_LIST=${HARBOR_DRAWIO_ACCESS_CODE} | ||
| - OPENAI_API_KEY=${HARBOR_OPENAI_KEY} | ||
| - ANTHROPIC_API_KEY=${HARBOR_ANTHROPIC_KEY} | ||
| - GOOGLE_GENERATIVE_AI_API_KEY=${HARBOR_GOOGLE_KEY} | ||
| - DEEPSEEK_API_KEY=${HARBOR_DEEPSEEK_API_KEY} | ||
| networks: | ||
| - harbor-network |
| services: | ||
| karakeep: | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.karakeep | ||
| image: ${HARBOR_KARAKEEP_IMAGE}:${HARBOR_KARAKEEP_VERSION} | ||
| restart: unless-stopped | ||
| env_file: | ||
| - ./.env | ||
| - ./karakeep/override.env | ||
| depends_on: | ||
| - karakeep-chrome | ||
| - karakeep-meilisearch | ||
| ports: | ||
| - ${HARBOR_KARAKEEP_HOST_PORT}:3000 | ||
| volumes: | ||
| - ${HARBOR_KARAKEEP_WORKSPACE}:/data | ||
| environment: | ||
| - NEXTAUTH_SECRET=${HARBOR_KARAKEEP_NEXTAUTH_SECRET} | ||
| - NEXTAUTH_URL=http://localhost:${HARBOR_KARAKEEP_HOST_PORT} | ||
| - MEILI_ADDR=http://karakeep-meilisearch:7700 | ||
| - MEILI_MASTER_KEY=${HARBOR_KARAKEEP_MEILI_MASTER_KEY} | ||
| - BROWSER_WEB_URL=http://karakeep-chrome:9222 | ||
| - DATA_DIR=/data | ||
| - OPENAI_API_KEY=${HARBOR_OPENAI_KEY:-} | ||
| - INFERENCE_TEXT_MODEL=${HARBOR_KARAKEEP_INFERENCE_TEXT_MODEL:-} | ||
| - INFERENCE_IMAGE_MODEL=${HARBOR_KARAKEEP_INFERENCE_IMAGE_MODEL:-} | ||
| - INFERENCE_CONTEXT_LENGTH=${HARBOR_KARAKEEP_INFERENCE_CONTEXT_LENGTH:-8192} | ||
| networks: | ||
| - harbor-network | ||
| karakeep-chrome: | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.karakeep-chrome | ||
| image: ${HARBOR_KARAKEEP_CHROME_IMAGE}:${HARBOR_KARAKEEP_CHROME_VERSION} | ||
| restart: unless-stopped | ||
| env_file: | ||
| - ./.env | ||
| - ./karakeep/override.env | ||
| command: | ||
| - --no-sandbox | ||
| - --disable-gpu | ||
| - --disable-dev-shm-usage | ||
| - --remote-debugging-address=0.0.0.0 | ||
| - --remote-debugging-port=9222 | ||
| - --hide-scrollbars | ||
| networks: | ||
| - harbor-network | ||
| karakeep-meilisearch: | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.karakeep-meilisearch | ||
| image: ${HARBOR_KARAKEEP_MEILI_IMAGE}:${HARBOR_KARAKEEP_MEILI_VERSION} | ||
| restart: unless-stopped | ||
| env_file: | ||
| - ./.env | ||
| - ./karakeep/override.env | ||
| environment: | ||
| - MEILI_MASTER_KEY=${HARBOR_KARAKEEP_MEILI_MASTER_KEY} | ||
| - MEILI_NO_ANALYTICS=true | ||
| volumes: | ||
| - ${HARBOR_KARAKEEP_WORKSPACE}/meilisearch:/meili_data | ||
| networks: | ||
| - harbor-network |
| services: | ||
| mindsdb: | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.mindsdb | ||
| image: ${HARBOR_MINDSDB_IMAGE}:${HARBOR_MINDSDB_VERSION} | ||
| env_file: | ||
| - ./.env | ||
| - ./mindsdb/override.env | ||
| volumes: | ||
| - ${HARBOR_MINDSDB_WORKSPACE}:/root/mdb_storage | ||
| ports: | ||
| - ${HARBOR_MINDSDB_HOST_PORT}:47334 | ||
| - ${HARBOR_MINDSDB_MYSQL_HOST_PORT}:47335 | ||
| environment: | ||
| - MINDSDB_APIS=${HARBOR_MINDSDB_APIS} | ||
| - MINDSDB_USERNAME=${HARBOR_MINDSDB_USERNAME} | ||
| - MINDSDB_PASSWORD=${HARBOR_MINDSDB_PASSWORD} | ||
| - MKL_SERVICE_FORCE_INTEL=1 | ||
| healthcheck: | ||
| test: ["CMD", "curl", "-f", "http://localhost:47334/api/status"] | ||
| interval: 30s | ||
| timeout: 10s | ||
| retries: 3 | ||
| start_period: 60s | ||
| networks: | ||
| - harbor-network |
| services: | ||
| netdata: | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.netdata | ||
| image: ${HARBOR_NETDATA_IMAGE}:${HARBOR_NETDATA_VERSION} | ||
| env_file: | ||
| - ./.env | ||
| - ./netdata/override.env | ||
| ports: | ||
| - ${HARBOR_NETDATA_HOST_PORT}:19999 | ||
| pid: host | ||
| restart: unless-stopped | ||
| cap_add: | ||
| - SYS_PTRACE | ||
| - SYS_ADMIN | ||
| security_opt: | ||
| - apparmor:unconfined | ||
| volumes: | ||
| - ${HARBOR_NETDATA_WORKSPACE}/config:/etc/netdata | ||
| - ${HARBOR_NETDATA_WORKSPACE}/lib:/var/lib/netdata | ||
| - ${HARBOR_NETDATA_WORKSPACE}/cache:/var/cache/netdata | ||
| - /:/host/root:ro,rslave | ||
| - /etc/passwd:/host/etc/passwd:ro | ||
| - /etc/group:/host/etc/group:ro | ||
| - /etc/localtime:/etc/localtime:ro | ||
| - /proc:/host/proc:ro | ||
| - /sys:/host/sys:ro | ||
| - /etc/os-release:/host/etc/os-release:ro | ||
| - /var/log:/host/var/log:ro | ||
| - /var/run/docker.sock:/var/run/docker.sock:ro | ||
| networks: | ||
| - harbor-network |
+181
| services: | ||
| onyx: | ||
| image: nginx:1.25.5-alpine | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.onyx | ||
| env_file: | ||
| - ./.env | ||
| - ./onyx/override.env | ||
| volumes: | ||
| - ./onyx/nginx/app.conf.template:/etc/nginx/conf.d/app.conf.template:ro | ||
| - ./onyx/nginx/run-nginx.sh:/docker-entrypoint-mount.sh:ro | ||
| entrypoint: ["sh", "-c", "cp /docker-entrypoint-mount.sh /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh"] | ||
| environment: | ||
| ONYX_BACKEND_API_HOST: onyx-api | ||
| ONYX_WEB_SERVER_HOST: onyx-web | ||
| depends_on: | ||
| - onyx-api | ||
| - onyx-web | ||
| ports: | ||
| - ${HARBOR_ONYX_HOST_PORT}:80 | ||
| networks: | ||
| - harbor-network | ||
| restart: unless-stopped | ||
| onyx-web: | ||
| image: onyxdotapp/onyx-web-server:${HARBOR_ONYX_VERSION} | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.onyx.web | ||
| env_file: | ||
| - ./.env | ||
| - ./onyx/override.env | ||
| environment: | ||
| INTERNAL_URL: http://onyx-api:8080 | ||
| NEXT_PUBLIC_DISABLE_STREAMING: ${HARBOR_ONYX_DISABLE_STREAMING:-false} | ||
| NEXT_TELEMETRY_DISABLED: 1 | ||
| depends_on: | ||
| - onyx-api | ||
| networks: | ||
| - harbor-network | ||
| restart: unless-stopped | ||
| onyx-api: | ||
| image: onyxdotapp/onyx-backend:${HARBOR_ONYX_VERSION} | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.onyx.api | ||
| command: > | ||
| /bin/sh -c " | ||
| alembic upgrade head && | ||
| echo 'Starting Onyx API Server' && | ||
| uvicorn onyx.main:app --host 0.0.0.0 --port 8080" | ||
| env_file: | ||
| - ./.env | ||
| - ./onyx/override.env | ||
| environment: | ||
| AUTH_TYPE: ${HARBOR_ONYX_AUTH_TYPE:-disabled} | ||
| POSTGRES_HOST: onyx-db | ||
| POSTGRES_USER: ${HARBOR_ONYX_DB_USER:-postgres} | ||
| POSTGRES_PASSWORD: ${HARBOR_ONYX_DB_PASSWORD:-onyx} | ||
| POSTGRES_DB: ${HARBOR_ONYX_DB_NAME:-onyx} | ||
| VESPA_HOST: onyx-index | ||
| REDIS_HOST: onyx-cache | ||
| MODEL_SERVER_HOST: ${HARBOR_ONYX_MODEL_SERVER_HOST:-} | ||
| MODEL_SERVER_PORT: ${HARBOR_ONYX_MODEL_SERVER_PORT:-11434} | ||
| DISABLE_MODEL_SERVER: ${HARBOR_ONYX_DISABLE_MODEL_SERVER:-true} | ||
| S3_ENDPOINT_URL: http://onyx-minio:9000 | ||
| S3_AWS_ACCESS_KEY_ID: ${HARBOR_ONYX_MINIO_USER:-minioadmin} | ||
| S3_AWS_SECRET_ACCESS_KEY: ${HARBOR_ONYX_MINIO_PASSWORD:-minioadmin} | ||
| DO_NOT_TRACK: "true" | ||
| DANSWER_RUNNING_IN_DOCKER: "true" | ||
| ENV_SEED_CONFIGURATION: '{"llms":[{"name":"Harbor Ollama","provider":"ollama_chat","api_base":"http://ollama:11434","default_model_name":"${HARBOR_ONYX_DEFAULT_MODEL:-llama3.2:3b}","fast_default_model_name":"${HARBOR_ONYX_FAST_MODEL:-llama3.2:3b}","is_public":true,"api_key_changed":true,"model_configurations":[]}]}' | ||
| volumes: | ||
| - ${HARBOR_ONYX_WORKSPACE}/api_logs:/var/log/onyx | ||
| depends_on: | ||
| onyx-db: | ||
| condition: service_healthy | ||
| onyx-index: | ||
| condition: service_started | ||
| onyx-cache: | ||
| condition: service_started | ||
| onyx-minio: | ||
| condition: service_started | ||
| extra_hosts: | ||
| - "host.docker.internal:host-gateway" | ||
| networks: | ||
| - harbor-network | ||
| restart: unless-stopped | ||
| onyx-background: | ||
| image: onyxdotapp/onyx-backend:${HARBOR_ONYX_VERSION} | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.onyx.background | ||
| command: > | ||
| /bin/sh -c "/app/scripts/supervisord_entrypoint.sh" | ||
| env_file: | ||
| - ./.env | ||
| - ./onyx/override.env | ||
| environment: | ||
| USE_LIGHTWEIGHT_BACKGROUND_WORKER: "true" | ||
| AUTH_TYPE: ${HARBOR_ONYX_AUTH_TYPE:-disabled} | ||
| POSTGRES_HOST: onyx-db | ||
| POSTGRES_USER: ${HARBOR_ONYX_DB_USER:-postgres} | ||
| POSTGRES_PASSWORD: ${HARBOR_ONYX_DB_PASSWORD:-onyx} | ||
| POSTGRES_DB: ${HARBOR_ONYX_DB_NAME:-onyx} | ||
| VESPA_HOST: onyx-index | ||
| REDIS_HOST: onyx-cache | ||
| MODEL_SERVER_HOST: ${HARBOR_ONYX_MODEL_SERVER_HOST:-} | ||
| MODEL_SERVER_PORT: ${HARBOR_ONYX_MODEL_SERVER_PORT:-11434} | ||
| INDEXING_MODEL_SERVER_HOST: ${HARBOR_ONYX_MODEL_SERVER_HOST:-} | ||
| DISABLE_MODEL_SERVER: ${HARBOR_ONYX_DISABLE_MODEL_SERVER:-true} | ||
| S3_ENDPOINT_URL: http://onyx-minio:9000 | ||
| S3_AWS_ACCESS_KEY_ID: ${HARBOR_ONYX_MINIO_USER:-minioadmin} | ||
| S3_AWS_SECRET_ACCESS_KEY: ${HARBOR_ONYX_MINIO_PASSWORD:-minioadmin} | ||
| DO_NOT_TRACK: "true" | ||
| DANSWER_RUNNING_IN_DOCKER: "true" | ||
| ENV_SEED_CONFIGURATION: '{"llms":[{"name":"Harbor Ollama","provider":"ollama_chat","api_base":"http://ollama:11434","default_model_name":"${HARBOR_ONYX_DEFAULT_MODEL:-llama3.2:3b}","fast_default_model_name":"${HARBOR_ONYX_FAST_MODEL:-llama3.2:3b}","is_public":true,"api_key_changed":true,"model_configurations":[]}]}' | ||
| volumes: | ||
| - ${HARBOR_ONYX_WORKSPACE}/background_logs:/var/log/onyx | ||
| depends_on: | ||
| onyx-db: | ||
| condition: service_healthy | ||
| onyx-index: | ||
| condition: service_started | ||
| onyx-cache: | ||
| condition: service_started | ||
| extra_hosts: | ||
| - "host.docker.internal:host-gateway" | ||
| networks: | ||
| - harbor-network | ||
| restart: unless-stopped | ||
| onyx-db: | ||
| image: postgres:15.2-alpine | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.onyx.db | ||
| env_file: | ||
| - ./.env | ||
| - ./onyx/override.env | ||
| environment: | ||
| POSTGRES_USER: ${HARBOR_ONYX_DB_USER:-postgres} | ||
| POSTGRES_PASSWORD: ${HARBOR_ONYX_DB_PASSWORD:-onyx} | ||
| POSTGRES_DB: ${HARBOR_ONYX_DB_NAME:-onyx} | ||
| command: -c max_connections=250 | ||
| volumes: | ||
| - ${HARBOR_ONYX_WORKSPACE}/db:/var/lib/postgresql/data | ||
| healthcheck: | ||
| test: ["CMD-SHELL", "pg_isready -U ${HARBOR_ONYX_DB_USER:-postgres}"] | ||
| interval: 5s | ||
| timeout: 5s | ||
| retries: 5 | ||
| networks: | ||
| - harbor-network | ||
| restart: unless-stopped | ||
| onyx-cache: | ||
| image: redis:7.4-alpine | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.onyx.cache | ||
| command: redis-server --save "" --appendonly no | ||
| tmpfs: | ||
| - /data | ||
| networks: | ||
| - harbor-network | ||
| restart: unless-stopped | ||
| onyx-index: | ||
| image: vespaengine/vespa:${HARBOR_ONYX_VESPA_VERSION} | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.onyx.index | ||
| environment: | ||
| VESPA_SKIP_UPGRADE_CHECK: "true" | ||
| volumes: | ||
| - ${HARBOR_ONYX_WORKSPACE}/vespa:/opt/vespa/var | ||
| networks: | ||
| - harbor-network | ||
| restart: unless-stopped | ||
| onyx-minio: | ||
| image: minio/minio:${HARBOR_ONYX_MINIO_VERSION} | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.onyx.minio | ||
| command: server /data --console-address ":9001" | ||
| environment: | ||
| MINIO_ROOT_USER: ${HARBOR_ONYX_MINIO_USER:-minioadmin} | ||
| MINIO_ROOT_PASSWORD: ${HARBOR_ONYX_MINIO_PASSWORD:-minioadmin} | ||
| volumes: | ||
| - ${HARBOR_ONYX_WORKSPACE}/minio:/data | ||
| networks: | ||
| - harbor-network | ||
| restart: unless-stopped |
| services: | ||
| presenton: | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.presenton | ||
| image: ${HARBOR_PRESENTON_IMAGE}:${HARBOR_PRESENTON_VERSION} | ||
| ports: | ||
| - ${HARBOR_PRESENTON_HOST_PORT}:80 | ||
| volumes: | ||
| - ./presenton/app_data:/app_data | ||
| - ${HARBOR_OLLAMA_CACHE}:/root/.ollama | ||
| - ${HARBOR_HF_CACHE}:/app/models | ||
| - ${HARBOR_LLAMACPP_CACHE}:/root/.cache/llama.cpp | ||
| env_file: | ||
| - ./.env | ||
| - ./presenton/override.env | ||
| environment: | ||
| - CAN_CHANGE_KEYS=${HARBOR_PRESENTON_CAN_CHANGE_KEYS} | ||
| - LLM=${HARBOR_PRESENTON_LLM} | ||
| - OPENAI_API_KEY=${HARBOR_PRESENTON_OPENAI_API_KEY} | ||
| - OPENAI_MODEL=${HARBOR_PRESENTON_OPENAI_MODEL} | ||
| - GOOGLE_API_KEY=${HARBOR_PRESENTON_GOOGLE_API_KEY} | ||
| - GOOGLE_MODEL=${HARBOR_PRESENTON_GOOGLE_MODEL} | ||
| - ANTHROPIC_API_KEY=${HARBOR_PRESENTON_ANTHROPIC_API_KEY} | ||
| - ANTHROPIC_MODEL=${HARBOR_PRESENTON_ANTHROPIC_MODEL} | ||
| - OLLAMA_URL=${HARBOR_PRESENTON_OLLAMA_URL} | ||
| - OLLAMA_MODEL=${HARBOR_PRESENTON_OLLAMA_MODEL} | ||
| - CUSTOM_LLM_URL=${HARBOR_PRESENTON_CUSTOM_LLM_URL} | ||
| - CUSTOM_LLM_API_KEY=${HARBOR_PRESENTON_CUSTOM_LLM_API_KEY} | ||
| - CUSTOM_MODEL=${HARBOR_PRESENTON_CUSTOM_MODEL} | ||
| - IMAGE_PROVIDER=${HARBOR_PRESENTON_IMAGE_PROVIDER} | ||
| - PEXELS_API_KEY=${HARBOR_PRESENTON_PEXELS_API_KEY} | ||
| - EXTENDED_REASONING=${HARBOR_PRESENTON_EXTENDED_REASONING} | ||
| - WEB_GROUNDING=${HARBOR_PRESENTON_WEB_GROUNDING} | ||
| - TOOL_CALLS=${HARBOR_PRESENTON_TOOL_CALLS} | ||
| - DISABLE_THINKING=${HARBOR_PRESENTON_DISABLE_THINKING} | ||
| - DATABASE_URL=${HARBOR_PRESENTON_DATABASE_URL} | ||
| - DISABLE_ANONYMOUS_TRACKING=${HARBOR_PRESENTON_DISABLE_ANONYMOUS_TRACKING} | ||
| networks: | ||
| - harbor-network |
| services: | ||
| resume-matcher-backend: | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.resume-matcher-backend | ||
| build: | ||
| context: ${HARBOR_RESUME_MATCHER_GIT_REF} | ||
| dockerfile_inline: | | ||
| FROM python:3.12-slim AS base | ||
| ENV PYTHONDONTWRITEBYTECODE=1 | ||
| ENV PYTHONUNBUFFERED=1 | ||
| ENV UV_CACHE_DIR=/tmp/uv-cache | ||
| RUN apt-get update && apt-get install -y --no-install-recommends curl build-essential && rm -rf /var/lib/apt/lists/* | ||
| RUN pip install --no-cache-dir uv | ||
| WORKDIR /app | ||
| COPY apps/backend/ . | ||
| RUN sed -i 's/==[0-9.]*//g' pyproject.toml && rm -f uv.lock | ||
| RUN uv lock && uv sync | ||
| RUN if [ ! -f .env ] && [ -f .env.sample ]; then cp .env.sample .env; fi | ||
| EXPOSE 8000 | ||
| HEALTHCHECK --interval=30s --timeout=10s --retries=3 --start-period=30s CMD curl -f http://localhost:8000/ping || exit 1 | ||
| CMD ["uv", "run", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--timeout-keep-alive", "300"] | ||
| ports: | ||
| - ${HARBOR_RESUME_MATCHER_BACKEND_HOST_PORT}:8000 | ||
| env_file: | ||
| - ./.env | ||
| - ./resume-matcher/override.env | ||
| environment: | ||
| - SESSION_SECRET_KEY=${HARBOR_RESUME_MATCHER_SESSION_SECRET} | ||
| - SYNC_DATABASE_URL=sqlite:///./app.db | ||
| - ASYNC_DATABASE_URL=sqlite+aiosqlite:///./app.db | ||
| - LLM_PROVIDER=${HARBOR_RESUME_MATCHER_LLM_PROVIDER} | ||
| - LL_MODEL=${HARBOR_RESUME_MATCHER_LLM_MODEL} | ||
| - EMBEDDING_PROVIDER=${HARBOR_RESUME_MATCHER_EMBEDDING_PROVIDER} | ||
| - EMBEDDING_MODEL=${HARBOR_RESUME_MATCHER_EMBEDDING_MODEL} | ||
| - ALLOWED_ORIGINS=["http://localhost:${HARBOR_RESUME_MATCHER_HOST_PORT}", "http://localhost:3000", "http://resume-matcher:3000"] | ||
| volumes: | ||
| - ${HARBOR_RESUME_MATCHER_WORKSPACE}/data:/app/data | ||
| networks: | ||
| - harbor-network | ||
| healthcheck: | ||
| test: ["CMD", "curl", "-f", "http://localhost:8000/ping"] | ||
| interval: 30s | ||
| timeout: 10s | ||
| retries: 5 | ||
| start_period: 30s | ||
| resume-matcher: | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.resume-matcher | ||
| build: | ||
| context: ${HARBOR_RESUME_MATCHER_GIT_REF} | ||
| dockerfile_inline: | | ||
| FROM node:18-alpine AS deps | ||
| RUN apk add --no-cache libc6-compat | ||
| WORKDIR /app | ||
| COPY apps/frontend/package*.json ./ | ||
| RUN npm ci | ||
| FROM node:18-alpine AS builder | ||
| WORKDIR /app | ||
| COPY --from=deps /app/node_modules ./node_modules | ||
| COPY apps/frontend/ . | ||
| ARG NEXT_PUBLIC_API_URL | ||
| ENV NEXT_PUBLIC_API_URL=$$NEXT_PUBLIC_API_URL | ||
| ENV NEXT_TELEMETRY_DISABLED=1 | ||
| RUN printf "import type { NextConfig } from 'next';\nconst nextConfig: NextConfig = {\n output: 'standalone',\n eslint: { ignoreDuringBuilds: true },\n typescript: { ignoreBuildErrors: true },\n};\nexport default nextConfig;\n" > next.config.ts | ||
| RUN find . -name 'layout.tsx' -path '*/app/*' -exec sh -c 'grep -L "export const dynamic" "$$1" && echo "export const dynamic = \"force-dynamic\";" >> "$$1"' _ {} \; 2>/dev/null || true | ||
| RUN npm run build | ||
| FROM node:18-alpine AS runner | ||
| WORKDIR /app | ||
| ENV NODE_ENV=production | ||
| RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 nextjs | ||
| COPY --from=builder /app/public ./public | ||
| RUN mkdir .next && chown nextjs:nodejs .next | ||
| COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ | ||
| COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static | ||
| USER nextjs | ||
| EXPOSE 3000 | ||
| ENV PORT=3000 | ||
| ENV HOSTNAME="0.0.0.0" | ||
| CMD ["node", "server.js"] | ||
| args: | ||
| - NEXT_PUBLIC_API_URL=http://localhost:${HARBOR_RESUME_MATCHER_BACKEND_HOST_PORT} | ||
| ports: | ||
| - ${HARBOR_RESUME_MATCHER_HOST_PORT}:3000 | ||
| env_file: | ||
| - ./.env | ||
| - ./resume-matcher/override.env | ||
| environment: | ||
| - NODE_ENV=production | ||
| - NEXT_PUBLIC_API_URL=http://localhost:${HARBOR_RESUME_MATCHER_BACKEND_HOST_PORT} | ||
| depends_on: | ||
| resume-matcher-backend: | ||
| condition: service_healthy | ||
| networks: | ||
| - harbor-network | ||
| healthcheck: | ||
| test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3000"] | ||
| interval: 30s | ||
| timeout: 10s | ||
| retries: 5 | ||
| start_period: 60s |
+109
| services: | ||
| sim: | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.sim | ||
| image: ${HARBOR_SIM_IMAGE}:${HARBOR_SIM_VERSION} | ||
| restart: unless-stopped | ||
| extra_hosts: | ||
| - "host.docker.internal:host-gateway" | ||
| ports: | ||
| - ${HARBOR_SIM_HOST_PORT}:3000 | ||
| deploy: | ||
| resources: | ||
| limits: | ||
| memory: 8G | ||
| environment: | ||
| - NODE_ENV=production | ||
| - DATABASE_URL=postgresql://${HARBOR_SIM_DB_USER}:${HARBOR_SIM_DB_PASSWORD}@sim-postgres:5432/${HARBOR_SIM_DB_NAME} | ||
| - BETTER_AUTH_URL=http://host.docker.internal:${HARBOR_SIM_HOST_PORT} | ||
| - NEXT_PUBLIC_APP_URL=http://host.docker.internal:${HARBOR_SIM_HOST_PORT} | ||
| - BETTER_AUTH_SECRET=${HARBOR_SIM_AUTH_SECRET} | ||
| - ENCRYPTION_KEY=${HARBOR_SIM_ENCRYPTION_KEY} | ||
| - INTERNAL_API_SECRET=${HARBOR_SIM_INTERNAL_API_SECRET} | ||
| - OLLAMA_URL=${HARBOR_SIM_OLLAMA_URL:-http://host.docker.internal:11434} | ||
| - SOCKET_SERVER_URL=http://sim-realtime:3002 | ||
| - NEXT_PUBLIC_SOCKET_URL=http://host.docker.internal:${HARBOR_SIM_REALTIME_HOST_PORT} | ||
| env_file: | ||
| - ./.env | ||
| - ./sim/override.env | ||
| depends_on: | ||
| sim-postgres: | ||
| condition: service_healthy | ||
| sim-migrations: | ||
| condition: service_completed_successfully | ||
| sim-realtime: | ||
| condition: service_healthy | ||
| healthcheck: | ||
| test: ['CMD', 'wget', '--spider', '--quiet', 'http://127.0.0.1:3000'] | ||
| interval: 90s | ||
| timeout: 5s | ||
| retries: 3 | ||
| start_period: 10s | ||
| networks: | ||
| - harbor-network | ||
| sim-realtime: | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.sim-realtime | ||
| image: ${HARBOR_SIM_REALTIME_IMAGE}:${HARBOR_SIM_VERSION} | ||
| restart: unless-stopped | ||
| ports: | ||
| - ${HARBOR_SIM_REALTIME_HOST_PORT}:3002 | ||
| deploy: | ||
| resources: | ||
| limits: | ||
| memory: 8G | ||
| environment: | ||
| - DATABASE_URL=postgresql://${HARBOR_SIM_DB_USER}:${HARBOR_SIM_DB_PASSWORD}@sim-postgres:5432/${HARBOR_SIM_DB_NAME} | ||
| - NEXT_PUBLIC_APP_URL=http://localhost:${HARBOR_SIM_HOST_PORT} | ||
| - BETTER_AUTH_URL=http://localhost:${HARBOR_SIM_HOST_PORT} | ||
| - BETTER_AUTH_SECRET=${HARBOR_SIM_AUTH_SECRET} | ||
| env_file: | ||
| - ./.env | ||
| - ./sim/override.env | ||
| depends_on: | ||
| sim-postgres: | ||
| condition: service_healthy | ||
| healthcheck: | ||
| test: ['CMD', 'wget', '--spider', '--quiet', 'http://127.0.0.1:3002/health'] | ||
| interval: 90s | ||
| timeout: 5s | ||
| retries: 3 | ||
| start_period: 10s | ||
| networks: | ||
| - harbor-network | ||
| sim-migrations: | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.sim-migrations | ||
| image: ${HARBOR_SIM_MIGRATIONS_IMAGE}:${HARBOR_SIM_VERSION} | ||
| working_dir: /app/packages/db | ||
| environment: | ||
| - DATABASE_URL=postgresql://${HARBOR_SIM_DB_USER}:${HARBOR_SIM_DB_PASSWORD}@sim-postgres:5432/${HARBOR_SIM_DB_NAME} | ||
| env_file: | ||
| - ./.env | ||
| - ./sim/override.env | ||
| depends_on: | ||
| sim-postgres: | ||
| condition: service_healthy | ||
| command: ['bun', 'run', 'db:migrate'] | ||
| restart: 'no' | ||
| networks: | ||
| - harbor-network | ||
| sim-postgres: | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.sim-postgres | ||
| image: ${HARBOR_SIM_DB_IMAGE}:${HARBOR_SIM_DB_VERSION} | ||
| restart: unless-stopped | ||
| ports: | ||
| - ${HARBOR_SIM_DB_HOST_PORT}:5432 | ||
| environment: | ||
| - POSTGRES_USER=${HARBOR_SIM_DB_USER} | ||
| - POSTGRES_PASSWORD=${HARBOR_SIM_DB_PASSWORD} | ||
| - POSTGRES_DB=${HARBOR_SIM_DB_NAME} | ||
| volumes: | ||
| - ${HARBOR_SIM_WORKSPACE}/postgres:/var/lib/postgresql/data | ||
| healthcheck: | ||
| test: ['CMD-SHELL', 'pg_isready -U ${HARBOR_SIM_DB_USER}'] | ||
| interval: 5s | ||
| timeout: 5s | ||
| retries: 5 | ||
| networks: | ||
| - harbor-network |
| services: | ||
| drawio: | ||
| environment: | ||
| - AI_PROVIDER=ollama | ||
| - OLLAMA_BASE_URL=${HARBOR_OLLAMA_INTERNAL_URL}/v1 |
| services: | ||
| karakeep: | ||
| environment: | ||
| - OLLAMA_BASE_URL=${HARBOR_OLLAMA_INTERNAL_URL} |
| services: | ||
| mindsdb: | ||
| environment: | ||
| - LLM_FUNCTION_BASE_URL=http://llamacpp:8080/v1 | ||
| - OPENAI_API_KEY=sk-llamacpp |
| services: | ||
| mindsdb: | ||
| environment: | ||
| - LLM_FUNCTION_BASE_URL=${HARBOR_OLLAMA_INTERNAL_URL}/v1 | ||
| - LLM_FUNCTION_MODEL=${HARBOR_MINDSDB_OLLAMA_MODEL} | ||
| - OPENAI_API_KEY=sk-ollama |
| services: | ||
| mindsdb: | ||
| environment: | ||
| - LLM_FUNCTION_BASE_URL=http://vllm:8000/v1 | ||
| - OPENAI_API_KEY=sk-vllm |
| # This file is generated by seed-cdi.ts script, | ||
| # any updates will be overwritten. | ||
| services: | ||
| presenton: | ||
| deploy: | ||
| resources: | ||
| reservations: | ||
| devices: | ||
| - driver: cdi | ||
| capabilities: [gpu] | ||
| device_ids: | ||
| - nvidia.com/gpu=all |
| services: | ||
| presenton: | ||
| deploy: | ||
| resources: | ||
| reservations: | ||
| devices: | ||
| - driver: nvidia | ||
| count: 1 | ||
| capabilities: [gpu] |
| services: | ||
| presenton: | ||
| environment: | ||
| - LLM=ollama | ||
| - OLLAMA_URL=http://localhost:33821 | ||
| - OLLAMA_MODEL=${HARBOR_PRESENTON_OLLAMA_MODEL:-llama3.1:8b} |
| services: | ||
| resume-matcher-backend: | ||
| environment: | ||
| - OLLAMA_HOST=${HARBOR_OLLAMA_INTERNAL_URL} | ||
| - LLM_PROVIDER=ollama | ||
| - LLM_BASE_URL=${HARBOR_OLLAMA_INTERNAL_URL} | ||
| - EMBEDDING_PROVIDER=ollama | ||
| - EMBEDDING_BASE_URL=${HARBOR_OLLAMA_INTERNAL_URL} |
| services: | ||
| sim: | ||
| environment: | ||
| - OLLAMA_URL=${HARBOR_OLLAMA_INTERNAL_URL} |
| # This file is generated by seed-traefik.ts script, | ||
| # any updates will be overwritten. | ||
| services: | ||
| drawio: | ||
| labels: | ||
| - "traefik.enable=true" | ||
| - "traefik.http.routers.drawio.rule=Host(`drawio.${HARBOR_TRAEFIK_DOMAIN}`)" | ||
| - "traefik.http.services.drawio.loadbalancer.server.port=3000" | ||
| - "traefik.http.routers.drawio.entrypoints=websecure" | ||
| - "traefik.http.routers.drawio.tls=true" | ||
| - "traefik.http.routers.drawio.service=drawio" | ||
| networks: | ||
| - traefik-public |
| # This file is generated by seed-traefik.ts script, | ||
| # any updates will be overwritten. | ||
| services: | ||
| karakeep: | ||
| labels: | ||
| - "traefik.enable=true" | ||
| - "traefik.http.routers.karakeep.rule=Host(`karakeep.${HARBOR_TRAEFIK_DOMAIN}`)" | ||
| - "traefik.http.services.karakeep.loadbalancer.server.port=3000" | ||
| - "traefik.http.routers.karakeep.entrypoints=websecure" | ||
| - "traefik.http.routers.karakeep.tls=true" | ||
| - "traefik.http.routers.karakeep.service=karakeep" | ||
| networks: | ||
| - traefik-public |
| # This file is generated by seed-traefik.ts script, | ||
| # any updates will be overwritten. | ||
| services: | ||
| mindsdb: | ||
| labels: | ||
| - "traefik.enable=true" | ||
| - "traefik.http.routers.mindsdb.rule=Host(`mindsdb.${HARBOR_TRAEFIK_DOMAIN}`)" | ||
| - "traefik.http.services.mindsdb.loadbalancer.server.port=47334" | ||
| - "traefik.http.routers.mindsdb.entrypoints=websecure" | ||
| - "traefik.http.routers.mindsdb.tls=true" | ||
| - "traefik.http.routers.mindsdb.service=mindsdb" | ||
| networks: | ||
| - traefik-public |
| # This file is generated by seed-traefik.ts script, | ||
| # any updates will be overwritten. | ||
| services: | ||
| netdata: | ||
| labels: | ||
| - "traefik.enable=true" | ||
| - "traefik.http.routers.netdata.rule=Host(`netdata.${HARBOR_TRAEFIK_DOMAIN}`)" | ||
| - "traefik.http.services.netdata.loadbalancer.server.port=19999" | ||
| - "traefik.http.routers.netdata.entrypoints=websecure" | ||
| - "traefik.http.routers.netdata.tls=true" | ||
| - "traefik.http.routers.netdata.service=netdata" | ||
| networks: | ||
| - traefik-public |
| # This file is generated by seed-traefik.ts script, | ||
| # any updates will be overwritten. | ||
| services: | ||
| onyx: | ||
| labels: | ||
| - "traefik.enable=true" | ||
| - "traefik.http.routers.onyx.rule=Host(`onyx.${HARBOR_TRAEFIK_DOMAIN}`)" | ||
| - "traefik.http.services.onyx.loadbalancer.server.port=80" | ||
| - "traefik.http.routers.onyx.entrypoints=websecure" | ||
| - "traefik.http.routers.onyx.tls=true" | ||
| - "traefik.http.routers.onyx.service=onyx" | ||
| networks: | ||
| - traefik-public |
| # This file is generated by seed-traefik.ts script, | ||
| # any updates will be overwritten. | ||
| services: | ||
| presenton: | ||
| labels: | ||
| - "traefik.enable=true" | ||
| - "traefik.http.routers.presenton.rule=Host(`presenton.${HARBOR_TRAEFIK_DOMAIN}`)" | ||
| - "traefik.http.services.presenton.loadbalancer.server.port=80" | ||
| - "traefik.http.routers.presenton.entrypoints=websecure" | ||
| - "traefik.http.routers.presenton.tls=true" | ||
| - "traefik.http.routers.presenton.service=presenton" | ||
| networks: | ||
| - traefik-public |
| # This file is generated by seed-traefik.ts script, | ||
| # any updates will be overwritten. | ||
| services: | ||
| resume-matcher: | ||
| labels: | ||
| - "traefik.enable=true" | ||
| - "traefik.http.routers.resume-matcher.rule=Host(`resume-matcher.${HARBOR_TRAEFIK_DOMAIN}`)" | ||
| - "traefik.http.services.resume-matcher.loadbalancer.server.port=3000" | ||
| - "traefik.http.routers.resume-matcher.entrypoints=websecure" | ||
| - "traefik.http.routers.resume-matcher.tls=true" | ||
| - "traefik.http.routers.resume-matcher.service=resume-matcher" | ||
| networks: | ||
| - traefik-public |
| # This file is generated by seed-traefik.ts script, | ||
| # any updates will be overwritten. | ||
| services: | ||
| sim: | ||
| labels: | ||
| - "traefik.enable=true" | ||
| - "traefik.http.routers.sim.rule=Host(`sim.${HARBOR_TRAEFIK_DOMAIN}`)" | ||
| - "traefik.http.services.sim.loadbalancer.server.port=3000" | ||
| - "traefik.http.routers.sim.entrypoints=websecure" | ||
| - "traefik.http.routers.sim.tls=true" | ||
| - "traefik.http.routers.sim.service=sim" | ||
| networks: | ||
| - traefik-public |
| ### [Presenton](https://github.com/presenton/presenton) | ||
| > Handle: `presenton`<br/> | ||
| > URL: [http://localhost:34531](http://localhost:34531) | ||
|  | ||
|  | ||
|  | ||
|  | ||
|  | ||
|  | ||
| Presenton is an open-source AI presentation generator that creates professional presentations from text prompts or documents. It's a self-hosted alternative to Gamma.ai, Beautiful.ai, and Decktopus. | ||
| **Key Features:** | ||
| - 🎨 **Custom Templates & Themes** - Create unlimited presentation designs with HTML and Tailwind CSS | ||
| - 🤖 **AI Template Generation** - Generate templates from existing PowerPoint documents | ||
| - 📝 **Flexible Generation** - Build presentations from prompts or uploaded documents | ||
| - 💾 **Export Ready** - Save as PowerPoint (PPTX) and PDF with professional formatting | ||
| - 🔌 **Built-In MCP Server** - Generate presentations over Model Context Protocol | ||
| - 🔑 **Bring Your Own Key** - Use your own API keys for OpenAI, Google Gemini, Anthropic Claude, or any compatible provider | ||
| - 🦙 **Ollama Integration** - Run open-source models locally with full privacy | ||
| - 🔗 **OpenAI API Compatible** - Connect to any OpenAI-compatible endpoint | ||
| - 🎨 **Multi-Provider Support** - Mix and match text and image generation providers | ||
| - 🖼️ **Versatile Image Generation** - Choose from DALL-E 3, Gemini Flash, Pexels, or Pixabay | ||
| - 🌐 **Runs Locally** - All processing happens on your device, no cloud dependencies | ||
| ## Starting | ||
| ```bash | ||
| # [Optional] Pre-pull the image | ||
| # might take a while as it bundles Ollama + GPU support | ||
| harbor pull presenton | ||
| # Start the service with web UI | ||
| harbor up presenton --open | ||
| # Or start with Ollama for local inference | ||
| harbor up presenton ollama --open | ||
| ``` | ||
| ## Usage | ||
| - By default, Harbor will connect Presenton to included Ollama instance | ||
| - When connecting to other included backends - you may use `custom` LLM option | ||
| - Since Presenton runs from within Browser - ensure to use public URLs for the services, e.g. `harbor url ollama`, `harbor url llamacpp`, etc. | ||
| - Harbor shares Ollama/LlamaCPP/HuggingFace Cache with Presenton | ||
| ## Configuration | ||
| ### Environment Variables | ||
| Following options can be set via [`harbor config`](./3.-Harbor-CLI-Reference.md#harbor-config): | ||
| ```bash | ||
| # The port on the host where Presenton will be available | ||
| HARBOR_PRESENTON_HOST_PORT=34531 | ||
| # Docker image and version | ||
| HARBOR_PRESENTON_IMAGE="ghcr.io/presenton/presenton" | ||
| HARBOR_PRESENTON_VERSION="latest" | ||
| # Allow users to change API keys in the UI | ||
| HARBOR_PRESENTON_CAN_CHANGE_KEYS="true" | ||
| # LLM Provider Configuration | ||
| # Options: "openai", "google", "anthropic", "ollama", "custom" | ||
| HARBOR_PRESENTON_LLM="" | ||
| # OpenAI Configuration | ||
| HARBOR_PRESENTON_OPENAI_API_KEY="" | ||
| HARBOR_PRESENTON_OPENAI_MODEL="" | ||
| # Google Gemini Configuration | ||
| HARBOR_PRESENTON_GOOGLE_API_KEY="" | ||
| HARBOR_PRESENTON_GOOGLE_MODEL="" | ||
| # Anthropic Claude Configuration | ||
| HARBOR_PRESENTON_ANTHROPIC_API_KEY="" | ||
| HARBOR_PRESENTON_ANTHROPIC_MODEL="" | ||
| # Ollama Configuration (auto-configured when running with Ollama) | ||
| HARBOR_PRESENTON_OLLAMA_URL="" | ||
| HARBOR_PRESENTON_OLLAMA_MODEL="" | ||
| # Custom OpenAI-compatible API | ||
| HARBOR_PRESENTON_CUSTOM_LLM_URL="" | ||
| HARBOR_PRESENTON_CUSTOM_LLM_API_KEY="" | ||
| HARBOR_PRESENTON_CUSTOM_MODEL="" | ||
| # Image Provider Configuration | ||
| # Options: "pexels", "pixabay", "dalle", "gemini" | ||
| HARBOR_PRESENTON_IMAGE_PROVIDER="pexels" | ||
| HARBOR_PRESENTON_PEXELS_API_KEY="" | ||
| # Feature Flags | ||
| HARBOR_PRESENTON_EXTENDED_REASONING="false" | ||
| HARBOR_PRESENTON_WEB_GROUNDING="false" | ||
| HARBOR_PRESENTON_TOOL_CALLS="false" | ||
| HARBOR_PRESENTON_DISABLE_THINKING="false" | ||
| # Database URL (optional, for external database) | ||
| HARBOR_PRESENTON_DATABASE_URL="" | ||
| # Privacy | ||
| HARBOR_PRESENTON_DISABLE_ANONYMOUS_TRACKING="true" | ||
| ``` | ||
| ### Using with OpenAI | ||
| ```bash | ||
| # Configure OpenAI | ||
| harbor config set presenton.llm openai | ||
| harbor config set presenton.openai_api_key sk-your-key | ||
| harbor config set presenton.openai_model gpt-4 | ||
| # Start Presenton | ||
| harbor up presenton --open | ||
| ``` | ||
| ### Using with Ollama (Local Models) | ||
| When running Presenton with Ollama, Harbor automatically configures the connection: | ||
| ```bash | ||
| # Start both services together | ||
| harbor up presenton ollama --open | ||
| # Ollama URL and default model are automatically configured | ||
| # You can change the model in the UI or via config: | ||
| harbor config set presenton.ollama_model llama3.1:8b | ||
| ``` | ||
| ### Using with Google Gemini | ||
| ```bash | ||
| # Configure Google Gemini | ||
| harbor config set presenton.llm google | ||
| harbor config set presenton.google_api_key your-api-key | ||
| harbor config set presenton.google_model gemini-pro | ||
| harbor up presenton --open | ||
| ``` | ||
| ### Using with Anthropic Claude | ||
| ```bash | ||
| # Configure Anthropic | ||
| harbor config set presenton.llm anthropic | ||
| harbor config set presenton.anthropic_api_key sk-ant-your-key | ||
| harbor config set presenton.anthropic_model claude-3-sonnet-20240229 | ||
| harbor up presenton --open | ||
| ``` | ||
| ### Using with Custom OpenAI-Compatible APIs | ||
| ```bash | ||
| # Configure custom endpoint (e.g., vLLM, TabbyAPI, etc.) | ||
| harbor config set presenton.llm custom | ||
| harbor config set presenton.custom_llm_url http://your-api:8000/v1 | ||
| harbor config set presenton.custom_llm_api_key your-key | ||
| harbor config set presenton.custom_model your-model-name | ||
| harbor up presenton --open | ||
| ``` | ||
| ### Image Generation | ||
| Presenton can use various image providers: | ||
| ```bash | ||
| # Using Pexels (free, no API key required for basic use) | ||
| harbor config set presenton.image_provider pexels | ||
| harbor config set presenton.pexels_api_key your-pexels-key | ||
| # Using DALL-E (requires OpenAI API key) | ||
| harbor config set presenton.image_provider dalle | ||
| # Using Gemini Flash (requires Google API key) | ||
| harbor config set presenton.image_provider gemini | ||
| # Using Pixabay | ||
| harbor config set presenton.image_provider pixabay | ||
| ``` | ||
| ## Troubleshooting | ||
| ### Service won't start | ||
| - Check if port 34531 is available: `lsof -i :34531` | ||
| - Check logs: `harbor logs presenton` | ||
| - Ensure you have an LLM provider configured | ||
| ### No LLM provider configured | ||
| - Configure at least one LLM provider (OpenAI, Gemini, Anthropic, Ollama, or custom) | ||
| - Or start with Ollama: `harbor up presenton ollama` | ||
| ### Images not generating | ||
| - Ensure you have an image provider configured | ||
| - For Pexels, get a free API key at https://www.pexels.com/api/ | ||
| - Or disable image generation in the UI | ||
| ### Presentations not persisting | ||
| - Check that `./presenton/app_data` directory exists and is writable | ||
| - Verify volume mount in `harbor logs presenton` | ||
| ## See Also | ||
| - [Official Presenton Documentation](https://docs.presenton.ai) | ||
| - [Ollama Backend](./2.2.1-Backend:-Ollama.md) | ||
| - [Harbor Config Reference](./3.-Harbor-CLI-Reference.md#harbor-config) |
| ### [Onyx](https://github.com/onyx-dot-app/onyx) | ||
| > Handle: `onyx`<br/> | ||
| > URL: [http://localhost:34601](http://localhost:34601) | ||
|  | ||
| Onyx (formerly Danswer) is an open-source AI platform that combines a Chat UI with powerful RAG capabilities. It's a self-hostable alternative to enterprise knowledge management and AI assistant platforms. | ||
| **Key Features:** | ||
| - **40+ connectors**: Slack, Google Drive, Notion, Confluence, GitHub, and more | ||
| - **Chat UI**: Full-featured chat interface with conversation history | ||
| - **RAG**: Retrieval-augmented generation with Vespa search engine | ||
| - **MCP support**: Model Context Protocol for tool integration | ||
| - **Multi-user**: Authentication and user management | ||
| - **OpenAI-compatible**: Works with any OpenAI API-compatible backend | ||
| ## Starting | ||
| ```bash | ||
| # Pull the images | ||
| harbor pull onyx | ||
| # Start Onyx with Ollama | ||
| harbor up ollama onyx --open | ||
| ``` | ||
| - First startup takes several minutes while Vespa initializes its search indices | ||
| - Onyx comes pre-configured to use Harbor's Ollama as the LLM backend | ||
| - Monitor Vespa initialization with `harbor logs onyx-index` | ||
| ## Configuration | ||
| ### Environment Variables | ||
| Following options can be set via [`harbor config`](./3.-Harbor-CLI-Reference.md#harbor-config): | ||
| ```bash | ||
| # Main UI port (nginx reverse proxy) | ||
| HARBOR_ONYX_HOST_PORT 34601 | ||
| # Persistent data directory | ||
| HARBOR_ONYX_WORKSPACE ./onyx/data | ||
| # Image versions | ||
| HARBOR_ONYX_VERSION latest | ||
| HARBOR_ONYX_VESPA_VERSION 8.277.17 | ||
| HARBOR_ONYX_MINIO_VERSION latest | ||
| # Authentication (disabled, basic, google_oauth, oidc) | ||
| HARBOR_ONYX_AUTH_TYPE disabled | ||
| # Database configuration | ||
| HARBOR_ONYX_DB_USER postgres | ||
| HARBOR_ONYX_DB_PASSWORD harbor_onyx_db_password | ||
| HARBOR_ONYX_DB_NAME onyx | ||
| # MinIO storage | ||
| HARBOR_ONYX_MINIO_USER minioadmin | ||
| HARBOR_ONYX_MINIO_PASSWORD harbor_onyx_minio_password | ||
| # LLM configuration (seeded on first start) | ||
| HARBOR_ONYX_DEFAULT_MODEL llama3.2:3b | ||
| HARBOR_ONYX_FAST_MODEL llama3.2:3b | ||
| ``` | ||
| ### Volumes | ||
| Onyx persists data in the following directories: | ||
| - `onyx/data/db/` - PostgreSQL database | ||
| - `onyx/data/vespa/` - Vespa search indices | ||
| - `onyx/data/minio/` - MinIO object storage | ||
| ## Integration with Harbor | ||
| Onyx comes **pre-configured to use Harbor's Ollama** as the default LLM backend: | ||
| ```bash | ||
| # Start both services - ready to chat immediately | ||
| harbor up ollama onyx | ||
| ``` | ||
| To change the default model: | ||
| ```bash | ||
| # Set a different default model | ||
| harbor config set onyx.default_model qwen2.5:7b | ||
| # Pull the model in Ollama | ||
| harbor ollama pull qwen2.5:7b | ||
| # Restart with fresh database to apply seed config | ||
| harbor down onyx && rm -rf onyx/data/db && harbor up onyx | ||
| ``` | ||
| > **Note:** Seed configuration is only applied on fresh database initialization. After initial setup, configure models via the Onyx Admin UI under **Configuration → LLM**. | ||
| ## Troubleshooting | ||
| ### Check Logs | ||
| ```bash | ||
| # All services | ||
| harbor logs onyx | ||
| # Specific service | ||
| harbor logs onyx-api | ||
| harbor logs onyx-background | ||
| harbor logs onyx-index | ||
| ``` | ||
| ### Database Issues | ||
| If migrations fail or database is corrupted: | ||
| ```bash | ||
| # Stop services | ||
| harbor down onyx | ||
| # Remove database (WARNING: destroys all data) | ||
| rm -rf onyx/data/db | ||
| # Restart | ||
| harbor up onyx | ||
| ``` | ||
| ### Memory Issues | ||
| Vespa search engine requires significant memory. Recommended minimum **8GB RAM** for the host system. If containers crash due to OOM, check available memory. | ||
| ## Links | ||
| - [Official Documentation](https://docs.onyx.app/) | ||
| - [GitHub Repository](https://github.com/onyx-dot-app/onyx) | ||
| - [Connector List](https://docs.onyx.app/connectors/overview) |
| ### [Karakeep](https://github.com/karakeep-app/karakeep) | ||
| > Handle: `karakeep`<br/> | ||
| > URL: [http://localhost:34541](http://localhost:34541) | ||
|  | ||
| Karakeep is an open-source, self-hosted bookmark manager with AI-powered automatic tagging. Save and organize links, notes, images, and PDFs with full-text search powered by Meilisearch. | ||
| #### Starting | ||
| ```bash | ||
| # Start the service | ||
| harbor up karakeep | ||
| # Open in browser | ||
| harbor open karakeep | ||
| # With Ollama for AI tagging | ||
| harbor up karakeep ollama | ||
| ``` | ||
| #### Configuration | ||
| ##### Environment Variables | ||
| The following options can be set via [`harbor config`](./3.-Harbor-CLI-Reference.md#harbor-config) or in `karakeep/override.env`: | ||
| ```bash | ||
| # Host port (default: 34541) | ||
| HARBOR_KARAKEEP_HOST_PORT | ||
| # Docker image settings | ||
| HARBOR_KARAKEEP_IMAGE # default: ghcr.io/karakeep-app/karakeep | ||
| HARBOR_KARAKEEP_VERSION # default: release (or pin to specific version like 0.29.0) | ||
| # Chrome container for web crawling | ||
| HARBOR_KARAKEEP_CHROME_IMAGE # default: gcr.io/zenika-hub/alpine-chrome | ||
| HARBOR_KARAKEEP_CHROME_VERSION # default: 124 | ||
| # Meilisearch for full-text search | ||
| HARBOR_KARAKEEP_MEILI_IMAGE # default: getmeili/meilisearch | ||
| HARBOR_KARAKEEP_MEILI_VERSION # default: v1.13.3 | ||
| # Security keys (change these!) | ||
| HARBOR_KARAKEEP_NEXTAUTH_SECRET # JWT signing secret | ||
| HARBOR_KARAKEEP_MEILI_MASTER_KEY # Meilisearch authentication key | ||
| # Data directory | ||
| HARBOR_KARAKEEP_WORKSPACE # default: ./karakeep/data | ||
| ``` | ||
| ##### AI Tagging with Ollama | ||
| When running with Ollama, Karakeep will automatically use it for AI-powered tagging: | ||
| ```bash | ||
| harbor up karakeep ollama | ||
| ``` | ||
| You can configure the inference models in `karakeep/override.env`: | ||
| ```bash | ||
| # Text model for tagging (must support chat completion) | ||
| INFERENCE_TEXT_MODEL=qwen3-vl:8b | ||
| # Image model for visual content (must support vision) | ||
| INFERENCE_IMAGE_MODEL=qwen3-vl:8b | ||
| ``` | ||
| Or set them via Harbor CLI: | ||
| ```bash | ||
| harbor config set karakeep.inference_text_model qwen3-vl:8b | ||
| harbor config set karakeep.inference_image_model qwen3-vl:8b | ||
| ``` | ||
| ##### AI Tagging with OpenAI | ||
| Set your OpenAI API key via Harbor: | ||
| ```bash | ||
| harbor config set openai.key <your-api-key> | ||
| ``` | ||
| ##### Additional Configuration | ||
| For more configuration options (OCR, crawling, webhooks, etc.), see the [Karakeep Configuration Docs](https://docs.karakeep.app/configuration). | ||
| #### Volumes | ||
| - `./karakeep/data` - Bookmark data, assets, and database | ||
| - `./karakeep/data/meilisearch` - Search index data |
| ### [Netdata](https://github.com/netdata/netdata) | ||
| > Handle: `netdata`<br/> | ||
| > URL: [http://localhost:34551](http://localhost:34551) | ||
|  | ||
| Real-time infrastructure monitoring and troubleshooting. Netdata collects thousands of metrics from systems, hardware, containers, and applications with zero configuration. It provides beautiful, interactive, real-time dashboards with per-second granularity. | ||
| ## Starting | ||
| ```bash | ||
| # [Optional] Pre-pull the Netdata image | ||
| harbor pull netdata | ||
| # Start the service | ||
| harbor up netdata --open | ||
| ``` | ||
| ## Configuration | ||
| ### Environment Variables | ||
| Following options can be set via [`harbor config`](./3.-Harbor-CLI-Reference.md#harbor-config): | ||
| ```bash | ||
| # Port for Netdata web UI | ||
| HARBOR_NETDATA_HOST_PORT 34551 | ||
| # Docker image | ||
| HARBOR_NETDATA_IMAGE netdata/netdata | ||
| HARBOR_NETDATA_VERSION stable | ||
| # Workspace for persistent data | ||
| HARBOR_NETDATA_WORKSPACE ./netdata | ||
| ``` | ||
| ### Volumes | ||
| Netdata requires extensive access to host resources for monitoring: | ||
| | Path | Purpose | | ||
| |------|---------| | ||
| | `./netdata/config` | Netdata configuration files | | ||
| | `./netdata/lib` | Persistent library data | | ||
| | `./netdata/cache` | Cache for metrics | | ||
| | `/` | Host filesystem (read-only, for disk monitoring) | | ||
| | `/proc` | Process information | | ||
| | `/sys` | System information | | ||
| | `/var/log` | Log files | | ||
| | `/var/run/docker.sock` | Docker container monitoring | | ||
| ### Security Notes | ||
| Netdata runs with elevated privileges for comprehensive monitoring: | ||
| - **`pid: host`** - Access to host PID namespace for process monitoring | ||
| - **`SYS_PTRACE`** - Required for process tracing | ||
| - **`SYS_ADMIN`** - Required for cgroup and network monitoring | ||
| - **`apparmor:unconfined`** - Disabled AppArmor for full access | ||
| These capabilities are required for Netdata's core functionality. If you need a more restricted setup, consider running Netdata directly on the host instead. | ||
| ## Customizing Netdata | ||
| After starting the service, you can edit the configuration by: | ||
| 1) Placing custom config files in `$(harbor home)/netdata/config/netdata.conf` | ||
| 2) Using built-in `edit-config` script inside the container: | ||
| ```bash | ||
| # Access the container | ||
| harbor exec netdata bash | ||
| # Edit configuration | ||
| cd /etc/netdata | ||
| ./edit-config netdata.conf | ||
| # After editing, restart the service | ||
| harbor restart netdata | ||
| ``` | ||
| ## Docker Tags | ||
| | Tag | Description | | ||
| |-----|-------------| | ||
| | `stable` | Most recently published stable build | | ||
| | `edge` | Most recently published nightly build | | ||
| | `latest` | Most recent build (stable or nightly) | | ||
| | `vX.Y.Z` | Specific version (e.g., v1.40.0) | |
| ### [Resume Matcher](https://github.com/srbhr/Resume-Matcher) | ||
| > Handle: `resume-matcher`<br/> | ||
| > URL: [http://localhost:34561](http://localhost:34561) | ||
|  | ||
| Resume Matcher is an AI-powered tool for comparing resumes against job descriptions. It analyzes resumes in PDF/DOCX format, extracts keywords, compares them with job descriptions, and provides improvement suggestions using local LLMs via Ollama. | ||
| **Key Features:** | ||
| - **Resume Analysis**: Upload resumes in PDF or DOCX format for automated parsing | ||
| - **Keyword Extraction**: Identifies key skills and qualifications from resumes and job descriptions | ||
| - **Match Scoring**: Compares resume content against job requirements | ||
| - **AI Suggestions**: Provides improvement recommendations using local LLMs | ||
| - **Local Processing**: All data stays on your machine with Ollama-powered inference | ||
| **Architecture:** | ||
| - FastAPI backend (Python 3.12, uv package manager) on port 34562 | ||
| - Next.js frontend (Node.js 18) on port 34561 | ||
| - SQLite database for persistent storage | ||
| - Ollama integration for LLM and embeddings | ||
| ## Starting | ||
| ```bash | ||
| # Start Resume Matcher with Ollama | ||
| harbor up resume-matcher ollama | ||
| # Open in browser | ||
| harbor open resume-matcher | ||
| ``` | ||
| The first startup will: | ||
| 1. Build both frontend and backend containers | ||
| 2. Pull the required Ollama models (`gemma3:4b` for LLM, `bge-m3` for embeddings) | ||
| See [troubleshooting guide](./1.-Harbor-User-Guide#troubleshooting) if you encounter any issues. | ||
| ## Configuration | ||
| ### Environment Variables | ||
| Following options can be set via [`harbor config`](./3.-Harbor-CLI-Reference.md#harbor-config): | ||
| ```bash | ||
| # Frontend UI port | ||
| HARBOR_RESUME_MATCHER_HOST_PORT 34561 | ||
| # Backend API port | ||
| HARBOR_RESUME_MATCHER_BACKEND_HOST_PORT 34562 | ||
| # Git reference for building | ||
| HARBOR_RESUME_MATCHER_GIT_REF "https://github.com/srbhr/Resume-Matcher.git#main" | ||
| # Workspace directory for data persistence | ||
| HARBOR_RESUME_MATCHER_WORKSPACE "./resume-matcher" | ||
| # Session secret (change in production) | ||
| HARBOR_RESUME_MATCHER_SESSION_SECRET "harbor_resume_matcher_secret_change_me" | ||
| # LLM configuration | ||
| HARBOR_RESUME_MATCHER_LLM_PROVIDER "ollama" | ||
| HARBOR_RESUME_MATCHER_LLM_MODEL "gemma3:4b" | ||
| # Embedding configuration | ||
| HARBOR_RESUME_MATCHER_EMBEDDING_PROVIDER "ollama" | ||
| HARBOR_RESUME_MATCHER_EMBEDDING_MODEL "bge-m3:latest" | ||
| ``` | ||
| ### Volumes | ||
| Resume Matcher persists data in the following directories: | ||
| - `resume-matcher/data/` - Uploaded resumes, job descriptions, and SQLite database | ||
| ### Ollama Integration | ||
| When running with Ollama, Harbor automatically configures the connection between Resume Matcher and Ollama. Ensure the required models are available: | ||
| ```bash | ||
| # Pull the LLM model | ||
| harbor pull gemma3:4b | ||
| harbor ollama pull gemma3:4b | ||
| # Pull the embedding model | ||
| harbor ollama pull bge-m3:latest | ||
| ``` | ||
| You can customize the models via configuration: | ||
| ```bash | ||
| # Use a different LLM | ||
| harbor config set resume-matcher.llm.model llama3.2:3b | ||
| # Use a different embedding model | ||
| harbor config set resume-matcher.embedding.model nomic-embed-text:latest | ||
| ``` |
| ### [Next AI Draw.io](https://github.com/DayuanJiang/next-ai-draw-io) | ||
| > Handle: `drawio`<br/> | ||
| > URL: [http://localhost:34571](http://localhost:34571) | ||
|  | ||
| Next AI Draw.io is an AI-powered diagram creation tool that integrates with draw.io. It lets you create, modify, and enhance diagrams through natural language commands and AI-assisted visualization. | ||
| **Key Features:** | ||
| - **Natural Language Diagrams**: Create diagrams by describing them in plain English | ||
| - **Image Replication**: Upload an image and let AI replicate it as an editable diagram | ||
| - **File Upload Support**: Import PDFs and text files to generate diagrams from content | ||
| - **Cloud Architecture**: Create AWS, GCP, and Azure architecture diagrams with AI assistance | ||
| - **Multi-Provider AI**: Works with Ollama, OpenAI, Anthropic, Google, and DeepSeek | ||
| - **Animated Connectors**: Add animated connections between diagram elements | ||
| ## Starting | ||
| ```bash | ||
| # [Optional] Pull the image | ||
| harbor pull drawio | ||
| # Start with Ollama (default configuration) | ||
| harbor up drawio ollama | ||
| # Open in browser | ||
| harbor open drawio | ||
| ``` | ||
| - When running with Ollama, Harbor automatically configures the connection via `compose.x.drawio.ollama.yml`. | ||
| - Despite Harbor sets configuration variables as required per service documentation, they might still reset in the UI, in that instance, please re-enter them.<br/> | ||
| <img src="./harbor-drawio-settings.png" alt="Settings" width="200"> | ||
| - ⚠️ The smallest model that was able to generate simple diagrams was `qwen3:30b` | ||
| ## Configuration | ||
| ### Environment Variables | ||
| Following options can be set via [`harbor config`](./3.-Harbor-CLI-Reference.md#harbor-config): | ||
| ```bash | ||
| # Main UI port | ||
| HARBOR_DRAWIO_HOST_PORT 34571 | ||
| # Docker image | ||
| HARBOR_DRAWIO_IMAGE ghcr.io/dayuanjiang/next-ai-draw-io | ||
| HARBOR_DRAWIO_VERSION latest | ||
| # AI provider: ollama, openai, anthropic, google, deepseek | ||
| HARBOR_DRAWIO_AI_PROVIDER ollama | ||
| # Model to use for diagram generation | ||
| HARBOR_DRAWIO_AI_MODEL gemma3:4b | ||
| # Temperature for AI responses (leave empty for default) | ||
| HARBOR_DRAWIO_TEMPERATURE | ||
| # Optional access code to protect the UI | ||
| HARBOR_DRAWIO_ACCESS_CODE | ||
| ``` | ||
| ### API Keys | ||
| Drawio uses the common Harbor API keys for external providers: | ||
| ```bash | ||
| # OpenAI | ||
| HARBOR_OPENAI_KEY | ||
| # Anthropic | ||
| HARBOR_ANTHROPIC_KEY | ||
| HARBOR_GOOGLE_KEY | ||
| # DeepSeek | ||
| HARBOR_DEEPSEEK_API_KEY | ||
| ``` | ||
| Set these globally to use across multiple Harbor services. | ||
| ### Using with Harbor Ollama | ||
| The default configuration uses Ollama with `llama3.2:latest`. When started alongside Ollama, Harbor automatically configures the Ollama URL: | ||
| ```bash | ||
| # Start with Ollama | ||
| harbor up drawio ollama | ||
| # Pull the model if needed | ||
| harbor ollama pull llama3.2:latest | ||
| ``` | ||
| To use a different model: | ||
| ```bash | ||
| harbor config set drawio.ai.model mistral:latest | ||
| ``` | ||
| ### Using with OpenAI | ||
| ```bash | ||
| # Set provider and common API key | ||
| harbor config set drawio.ai.provider openai | ||
| harbor config set openai.key sk-your-api-key | ||
| # Optionally set a specific model | ||
| harbor config set drawio.ai.model gpt-4o | ||
| # Start without Ollama | ||
| harbor up drawio | ||
| ``` | ||
| ### Using with Anthropic | ||
| ```bash | ||
| # Set provider and common API key | ||
| harbor config set drawio.ai.provider anthropic | ||
| harbor config set anthropic.key sk-ant-your-api-key | ||
| # Optionally set a specific model | ||
| harbor config set drawio.ai.model claude-sonnet-4-20250514 | ||
| # Start | ||
| harbor up drawio | ||
| ``` | ||
| ## Notes | ||
| **Model Recommendations:** | ||
| - For general diagrams: `llama3.2:latest` or similar models work well | ||
| - For cloud architecture diagrams (AWS, GCP, Azure): Claude Sonnet models are recommended for better accuracy with complex infrastructure patterns | ||
| **Access Protection:** | ||
| - Set `HARBOR_DRAWIO_ACCESS_CODE` to require a code before accessing the UI | ||
| - Useful when exposing the service externally |
| ### [MindsDB](https://github.com/mindsdb/mindsdb) | ||
| > Handle: `mindsdb`<br/> | ||
| > URL: [http://localhost:34581](http://localhost:34581) | ||
|  | ||
| MindsDB is an AI platform that enables querying AI models using SQL. Harbor integrates MindsDB with local LLM backends (Ollama, llama.cpp, vLLM) so you can build AI-powered applications without external API dependencies. | ||
| ## Starting | ||
| ```bash | ||
| # Start MindsDB with Ollama | ||
| harbor up mindsdb ollama | ||
| # Or with other backends | ||
| harbor up mindsdb llamacpp | ||
| harbor up mindsdb vllm | ||
| ``` | ||
| ## Configuration | ||
| Following options can be set via [`harbor config`](./3.-Harbor-CLI-Reference.md#harbor-config): | ||
| ```bash | ||
| # Ports | ||
| HARBOR_MINDSDB_HOST_PORT 34581 | ||
| HARBOR_MINDSDB_MYSQL_HOST_PORT 34582 | ||
| # Docker image | ||
| HARBOR_MINDSDB_IMAGE mindsdb/mindsdb | ||
| HARBOR_MINDSDB_VERSION latest | ||
| # Persistent storage | ||
| HARBOR_MINDSDB_WORKSPACE ./mindsdb/data | ||
| # APIs to expose (http, mysql, postgres) | ||
| HARBOR_MINDSDB_APIS http,mysql | ||
| # Authentication (optional) | ||
| HARBOR_MINDSDB_USERNAME "" | ||
| HARBOR_MINDSDB_PASSWORD "" | ||
| # Default Ollama model for LLM() function | ||
| HARBOR_MINDSDB_OLLAMA_MODEL llama3.1:8b | ||
| ``` | ||
| ## LLM Integration | ||
| When running MindsDB with a Harbor LLM backend, the `LLM()` function is automatically configured: | ||
| | Backend | Base URL | Model | API Key | | ||
| |---------|----------|-------|---------| | ||
| | Ollama | `http://ollama:11434/v1` | `HARBOR_MINDSDB_OLLAMA_MODEL` | `sk-ollama` | | ||
| | llama.cpp | `http://llamacpp:8080/v1` | (loaded model) | `sk-llamacpp` | | ||
| | vLLM | `http://vllm:8000/v1` | (loaded model) | `sk-vllm` | | ||
| ### Using LLM() Function | ||
| ```sql | ||
| -- Text generation | ||
| SELECT LLM('What is the capital of France?'); | ||
| -- Process data | ||
| SELECT LLM('Summarize: ' || content) FROM articles; | ||
| ``` | ||
| ### Creating Agents | ||
| Agents query data sources using natural language. Specify the Harbor backend configuration: | ||
| ```sql | ||
| CREATE AGENT mindsdb.my_agent | ||
| USING | ||
| model = { | ||
| "provider": "ollama", | ||
| "model_name": "llama3.1:8b", | ||
| "api_key": "sk-ollama", | ||
| "base_url": "http://ollama:11434" | ||
| }, | ||
| data = { | ||
| "tables": ["my_database.my_table"] | ||
| }; | ||
| ``` | ||
| ### Creating ML Engines | ||
| Create ML engines to use Harbor backends in models: | ||
| ```sql | ||
| -- Ollama engine | ||
| CREATE ML_ENGINE ollama_engine | ||
| FROM ollama | ||
| USING | ||
| ollama_serve_url = 'http://ollama:11434'; | ||
| -- llama.cpp (OpenAI-compatible) | ||
| CREATE ML_ENGINE llamacpp_engine | ||
| FROM openai | ||
| USING | ||
| openai_api_base = 'http://llamacpp:8080/v1', | ||
| openai_api_key = 'sk-llamacpp'; | ||
| -- vLLM (OpenAI-compatible) | ||
| CREATE ML_ENGINE vllm_engine | ||
| FROM openai | ||
| USING | ||
| openai_api_base = 'http://vllm:8000/v1', | ||
| openai_api_key = 'sk-vllm'; | ||
| ``` | ||
| > **Note**: The `LLM()` function configuration is separate from the "Default MindsDB Configuration" UI settings. UI settings (Settings → Models) are for agents/knowledge bases and persist in `./mindsdb/data`. | ||
| ## Connecting to Harbor Services | ||
| Use Docker network hostnames to connect MindsDB to other Harbor services: | ||
| ```sql | ||
| -- Connect to a database running in Harbor | ||
| CREATE DATABASE harbor_postgres | ||
| WITH ENGINE = 'postgres', | ||
| PARAMETERS = { | ||
| "host": "postgres", | ||
| "port": "5432", | ||
| "database": "mydb", | ||
| "user": "user", | ||
| "password": "password" | ||
| }; | ||
| ``` | ||
| ## MySQL API | ||
| Connect to MindsDB using MySQL clients for BI tools and integrations: | ||
| ```bash | ||
| mysql -h 127.0.0.1 -P 34582 | ||
| ``` |
| ### [Sim Studio](https://github.com/simstudioai/sim) | ||
| > Handle: `sim`<br/> | ||
| > URL: [http://localhost:34591](http://localhost:34591) | ||
|  | ||
| Sim Studio is an open-source platform for building and deploying AI agent workflows. It provides a visual canvas editor where you can connect agents, tools, and blocks to create complex AI pipelines. The platform includes an AI Copilot that helps generate nodes and fix errors, plus support for vector databases enabling document uploads and RAG capabilities. | ||
| **Key Features:** | ||
| - **Visual Canvas Editor**: Drag-and-drop interface to connect agents, tools, and blocks | ||
| - **Vector Database Support**: Upload documents and enable RAG capabilities with pgvector | ||
| - **Real-time WebSocket**: Live updates and streaming responses | ||
| - **Extensible Blocks**: Connect various AI providers and tools | ||
| ## Starting | ||
| ```bash | ||
| # Start Sim Studio | ||
| harbor up sim | ||
| # With Ollama for local models | ||
| harbor up sim ollama | ||
| ``` | ||
| - Open the Sim Studio interface at [http://localhost:34591](http://localhost:34591) | ||
| - On first start, you'll need to create an account | ||
| - Harbor connects Sim Studio to Ollama automatically if both are running together, so local Ollama's models should be visible in LLM nodes in Sim Studio | ||
| - ⚠️ Unfortunately Sim Studio Copilot (to help authoring workflows) requires their cloud service and cannot be self-hosted | ||
| ## Configuration | ||
| ### Environment Variables | ||
| Following options can be set via [`harbor config`](./3.-Harbor-CLI-Reference.md#harbor-config): | ||
| ```bash | ||
| # Main application port | ||
| HARBOR_SIM_HOST_PORT 34591 | ||
| # WebSocket server port | ||
| HARBOR_SIM_REALTIME_HOST_PORT 34592 | ||
| # PostgreSQL database port | ||
| HARBOR_SIM_DB_HOST_PORT 34593 | ||
| # Workspace directory for persistent data | ||
| HARBOR_SIM_WORKSPACE ./sim | ||
| # Main application image | ||
| HARBOR_SIM_IMAGE ghcr.io/simstudioai/simstudio | ||
| HARBOR_SIM_VERSION latest | ||
| # WebSocket server image | ||
| HARBOR_SIM_REALTIME_IMAGE ghcr.io/simstudioai/realtime | ||
| # Database migrations image | ||
| HARBOR_SIM_MIGRATIONS_IMAGE ghcr.io/simstudioai/migrations | ||
| # Database configuration | ||
| HARBOR_SIM_DB_IMAGE pgvector/pgvector | ||
| HARBOR_SIM_DB_VERSION pg17 | ||
| HARBOR_SIM_DB_NAME simstudio | ||
| HARBOR_SIM_DB_USER postgres | ||
| HARBOR_SIM_DB_PASSWORD harbor_sim_postgres_password | ||
| # Security (auto-generated if not set) | ||
| HARBOR_SIM_AUTH_SECRET # Authentication secret (32 characters) | ||
| HARBOR_SIM_ENCRYPTION_KEY # Encryption key (32 characters) | ||
| # Ollama integration (auto-configured when running with Ollama) | ||
| HARBOR_SIM_OLLAMA_URL # Ollama API URL for local models | ||
| ``` | ||
| ### Volumes | ||
| Sim Studio persists data in the following directories: | ||
| - `sim/db/` - PostgreSQL database with pgvector | ||
| ## Integration with Harbor | ||
| Sim Studio can integrate with other Harbor services: | ||
| - Use Ollama for local model inference in agent workflows | ||
| - Access other Harbor LLM backends via API calls | ||
| - Connect to Harbor services via internal network | ||
| When running Sim Studio together with Ollama, Harbor automatically configures the connection: | ||
| ```bash | ||
| harbor up sim ollama | ||
| ``` | ||
| This sets `HARBOR_SIM_OLLAMA_URL` to point to the Ollama service. | ||
| ## Troubleshooting | ||
| ### Check Logs | ||
| ```bash | ||
| # All services | ||
| harbor logs sim | ||
| # Specific service | ||
| docker logs harbor.sim | ||
| docker logs harbor.sim-realtime | ||
| ``` | ||
| ### Database Issues | ||
| If migrations fail or database is corrupted: | ||
| ```bash | ||
| # Stop services | ||
| harbor down sim | ||
| # Remove database (WARNING: destroys all data) | ||
| rm -rf sim/db | ||
| # Restart | ||
| harbor up sim | ||
| ``` | ||
| ## Links | ||
| - [GitHub Repository](https://github.com/simstudioai/sim) | ||
| - [Website](https://sim.ai) |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
| # This file can be used for additional environment variables | ||
| # specifically for the 'drawio' service. | ||
| # You can also use the "harbor env" command to set these variables. |
| # This file can be used for additional environment variables | ||
| # specifically for the 'karakeep' service. | ||
| # You can also use the "harbor env" command to set these variables. |
| # MindsDB service environment variables | ||
| # Configure APIs to expose (http, mysql, postgres) | ||
| # MINDSDB_APIS=http,mysql | ||
| # Optional authentication | ||
| # MINDSDB_USERNAME=admin | ||
| # MINDSDB_PASSWORD= |
| # This file can be used for additional environment variables | ||
| # specifically for the 'netdata' service. | ||
| # You can also use the "harbor env" command to set these variables. |
Sorry, the diff of this file is not supported yet
| #!/bin/sh | ||
| set -e | ||
| export ONYX_BACKEND_API_HOST="${ONYX_BACKEND_API_HOST:-onyx-api}" | ||
| export ONYX_WEB_SERVER_HOST="${ONYX_WEB_SERVER_HOST:-onyx-web}" | ||
| echo "Using API server host: $ONYX_BACKEND_API_HOST" | ||
| echo "Using web server host: $ONYX_WEB_SERVER_HOST" | ||
| envsubst '$ONYX_BACKEND_API_HOST $ONYX_WEB_SERVER_HOST' < /etc/nginx/conf.d/app.conf.template > /etc/nginx/conf.d/default.conf | ||
| echo "Waiting for API server to be ready..." | ||
| max_attempts=120 | ||
| attempt=1 | ||
| while [ $attempt -le $max_attempts ]; do | ||
| if wget -q --spider "http://${ONYX_BACKEND_API_HOST}:8080/health" 2>/dev/null; then | ||
| echo "API server is ready!" | ||
| break | ||
| fi | ||
| echo "Attempt $attempt/$max_attempts: API server not ready yet..." | ||
| sleep 5 | ||
| attempt=$((attempt + 1)) | ||
| done | ||
| if [ $attempt -gt $max_attempts ]; then | ||
| echo "Warning: API server did not become ready in time, starting nginx anyway..." | ||
| fi | ||
| echo "Starting nginx..." | ||
| exec nginx -g "daemon off;" |
| # Onyx Service Configuration | ||
| # -------------------------- | ||
| # These variables are already set in Harbor's default profile. | ||
| # You can override them here for service-specific configuration. | ||
| # Onyx-specific environment variables can be set here. | ||
| # See https://github.com/onyx-dot-app/onyx for full documentation. | ||
| # Example overrides (uncomment to use): | ||
| # GEN_AI_MODEL_PROVIDER=ollama | ||
| # GEN_AI_MODEL_VERSION=llama3.1 |
| # This file can be used for additional environment variables | ||
| # specifically for the 'presenton' service. | ||
| # You can also use the "harbor env" command to set these variables. |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
| # Resume Matcher backend configuration | ||
| SESSION_SECRET_KEY=${HARBOR_RESUME_MATCHER_SESSION_SECRET} | ||
| SYNC_DATABASE_URL=sqlite:///./app.db | ||
| ASYNC_DATABASE_URL=sqlite+aiosqlite:///./app.db | ||
| PYTHONDONTWRITEBYTECODE=1 | ||
| # LLM Configuration (populated by Ollama cross-file or manual config) | ||
| LLM_PROVIDER=${HARBOR_RESUME_MATCHER_LLM_PROVIDER:-ollama} | ||
| LL_MODEL=${HARBOR_RESUME_MATCHER_LLM_MODEL:-gemma3:4b} | ||
| EMBEDDING_PROVIDER=${HARBOR_RESUME_MATCHER_EMBEDDING_PROVIDER:-ollama} | ||
| EMBEDDING_MODEL=${HARBOR_RESUME_MATCHER_EMBEDDING_MODEL:-bge-m3:latest} |
| # This file can be used for additional environment variables | ||
| # specifically for the 'sim' service. | ||
| # You can also use the "harbor env" command to set these variables. | ||
| # Optional: Copilot API key for AI-assisted workflow building | ||
| # Get your key from https://sim.ai → Settings → Copilot | ||
| COPILOT_API_KEY= | ||
| # Optional: Additional AI provider API keys | ||
| OPENAI_API_KEY= | ||
| ANTHROPIC_API_KEY= |
@@ -195,3 +195,9 @@ # Adding new service | ||
| \`\`\`bash | ||
| List all HARBOR_${HANDLE}_* variables with descriptions. | ||
| List all HARBOR_${HANDLE}_* variables with descriptions. Example: | ||
| # Main UI port | ||
| HARBOR_SERVICE_HOST_PORT 00000 | ||
| # Workspace directory for persistent data | ||
| HARBOR_SERVICE_WORKSPACE ./service | ||
| \`\`\` | ||
@@ -203,2 +209,6 @@ | ||
| **Validation:** | ||
| - Documentation explains how to start the service, refers to troubleshooting guide | ||
| - Documentation refers to Harbor CLI commands, not Docker commands | ||
| ### Step 8: Add to .gitignore (if needed) | ||
@@ -205,0 +215,0 @@ |
@@ -13,2 +13,9 @@ #!/usr/bin/env bash | ||
| # cd to wiki and push the docs | ||
| cd ../harbor.wiki | ||
| git add . | ||
| git commit -m "chore: docs" | ||
| git push origin master | ||
| cd ../harbor | ||
| # echo "NPM Publish..." | ||
@@ -15,0 +22,0 @@ # npm publish --access public |
+1
-1
@@ -9,3 +9,3 @@ // deno run -A ./.scripts/seed.ts | ||
| const VERSION = "0.3.22"; | ||
| const VERSION = "0.3.28"; | ||
@@ -12,0 +12,0 @@ type ValueSeed = { |
+22
-1
@@ -15,2 +15,3 @@ You will not confuse this project with the Harbor container registry. This is a different project with the same name. | ||
| - `/.scripts` - scripts for development tasks, written in Deno and Bash | ||
| - `/profiles/default.env` - default harbor config that will be distributed to the users | ||
@@ -21,2 +22,3 @@ The CLI is already installed globally for your tests, you may run `harbor <command>` directly. | ||
| harbor help | ||
| harbor ps # list running services | ||
| harbor build <service> | ||
@@ -28,2 +30,21 @@ harbor logs <service> # tails by default | ||
| Refer to [CLI Reference](./docs/3.-Harbor-CLI-Reference.md) for more details. | ||
| Refer to [CLI Reference](./docs/3.-Harbor-CLI-Reference.md) for more details. | ||
| ### Running dev scripts | ||
| You will always use `harbor` CLI to run project dev scripts, for example: | ||
| ```bash | ||
| harbor dev scaffold <service_name> | ||
| harbor dev docs | ||
| harbor dev seeed | ||
| ``` | ||
| This means that you're not allowed to run those scripts with `deno run` directly. | ||
| ### Updating default profile | ||
| When you make changes to the `default.env`, you then need to update the current profile with: | ||
| ```bash | ||
| harbor config update | ||
| ``` |
+1
-1
| { | ||
| "name": "@avcodes/harbor-app", | ||
| "private": true, | ||
| "version": "0.3.22", | ||
| "version": "0.3.28", | ||
| "type": "module", | ||
@@ -6,0 +6,0 @@ "scripts": { |
| [package] | ||
| name = "harbor-app" | ||
| version = "0.3.22" | ||
| version = "0.3.28" | ||
| description = "A companion app for Harbor LLM toolkit" | ||
@@ -6,0 +6,0 @@ authors = ["av"] |
| { | ||
| "$schema": "https://schema.tauri.app/config/2.4.0", | ||
| "productName": "Harbor", | ||
| "version": "0.3.22", | ||
| "version": "0.3.28", | ||
| "identifier": "com.harbor.app", | ||
@@ -6,0 +6,0 @@ "build": { |
@@ -568,2 +568,50 @@ | ||
| }, | ||
| presenton: { | ||
| name: 'Presenton', | ||
| tags: [HST.frontend], | ||
| wikiUrl: `${wikiUrl}/2.1.13-Frontend-Presenton`, | ||
| tooltip: 'Open-source AI presentation generator with custom layouts, multi-model support, and PDF/PPTX export.' | ||
| }, | ||
| karakeep: { | ||
| name: 'Karakeep', | ||
| tags: [HST.satellite], | ||
| wikiUrl: `${wikiUrl}/2.3.53-Satellite-Karakeep`, | ||
| tooltip: 'Self-hosted bookmark manager with AI-powered automatic tagging via OpenAI or Ollama.' | ||
| }, | ||
| netdata: { | ||
| name: 'Netdata', | ||
| tags: [HST.satellite], | ||
| wikiUrl: `${wikiUrl}/2.3.54-Satellite-Netdata`, | ||
| tooltip: 'Real-time infrastructure monitoring with per-second metrics for systems, containers, and applications.' | ||
| }, | ||
| 'resume-matcher': { | ||
| name: 'Resume Matcher', | ||
| tags: [HST.satellite], | ||
| wikiUrl: `${wikiUrl}/2.3.55-Satellite-Resume-Matcher`, | ||
| tooltip: 'AI-powered tool for comparing resumes against job descriptions using local LLMs via Ollama.' | ||
| }, | ||
| drawio: { | ||
| name: 'Drawio', | ||
| tags: [HST.satellite], | ||
| wikiUrl: `${wikiUrl}/2.3.56-Satellite-Drawio`, | ||
| tooltip: 'AI-powered diagram creation tool - generate draw.io diagrams from natural language.' | ||
| }, | ||
| mindsdb: { | ||
| name: 'MindsDB', | ||
| tags: [HST.satellite, HST.api], | ||
| wikiUrl: `${wikiUrl}/2.3.57-Satellite-MindsDB`, | ||
| tooltip: 'AI platform for integrating ML models with data sources via HTTP and MySQL APIs.', | ||
| }, | ||
| sim: { | ||
| name: 'Sim Studio', | ||
| tags: [HST.satellite, HST.workflows], | ||
| wikiUrl: `${wikiUrl}/2.3.58-Satellite-Sim-Studio`, | ||
| tooltip: 'Open-source platform to build and deploy AI agent workflows with visual canvas editor.', | ||
| }, | ||
| onyx: { | ||
| name: 'Onyx', | ||
| tags: [HST.frontend, HST.workflows, HST.tools], | ||
| wikiUrl: `${wikiUrl}/2.1.14-Frontend-Onyx`, | ||
| tooltip: 'Open Source AI Platform with Chat UI, RAG, MCP support, and 40+ document connectors.', | ||
| }, | ||
| }; |
@@ -8,2 +8,2 @@ | ||
| dependencies = ["fastapi==0.111.0","uvicorn[standard]==0.30.6","requests==2.32.3","aiohttp==3.10.5","litellm==1.65.7","mcp==1.6.0","cachetools==5.5.2","asyncache==0.3.1","openai","websockets==15.0.1"] | ||
| version = "0.3.22" | ||
| version = "0.3.28" |
@@ -32,2 +32,7 @@ # klmbr - Kalambur | ||
| - `remove_vowel` - removes vowels from the input | ||
| - `invert_180` - inverts characters 180 degrees | ||
| - `unicode_lookalike` - replaces characters with Unicode lookalikes from other scripts | ||
| - `homoglyph` - replaces characters with visually identical homoglyphs | ||
| - `zero_width` - inserts zero-width characters after the character | ||
| - `zalgo` - adds multiple combining marks to create zalgo text effect | ||
| - `strat` - strategy for selection of the messages to rewrite. Default is `match` | ||
@@ -59,2 +64,7 @@ - `all` - match all messages | ||
| harbor boost klmbr mods add remove_vowel | ||
| harbor boost klmbr mods add invert_180 | ||
| harbor boost klmbr mods add unicode_lookalike | ||
| harbor boost klmbr mods add homoglyph | ||
| harbor boost klmbr mods add zero_width | ||
| harbor boost klmbr mods add zalgo | ||
@@ -142,2 +152,80 @@ # Change the selection strategy | ||
| unicode_lookalike_map = { | ||
| 'a': 'а', # Cyrillic | ||
| 'c': 'с', # Cyrillic | ||
| 'e': 'е', # Cyrillic | ||
| 'o': 'ο', # Greek omicron | ||
| 'p': 'р', # Cyrillic | ||
| 'x': 'х', # Cyrillic | ||
| 'y': 'у', # Cyrillic | ||
| 'A': 'А', # Cyrillic | ||
| 'B': 'В', # Cyrillic | ||
| 'C': 'С', # Cyrillic | ||
| 'E': 'Ε', # Greek | ||
| 'H': 'Η', # Greek | ||
| 'I': 'Ι', # Greek | ||
| 'K': 'Κ', # Greek | ||
| 'M': 'Μ', # Greek | ||
| 'N': 'Ν', # Greek | ||
| 'O': 'Ο', # Greek | ||
| 'P': 'Ρ', # Greek | ||
| 'T': 'Τ', # Greek | ||
| 'X': 'Χ', # Greek | ||
| 'Y': 'Υ', # Greek | ||
| 'Z': 'Ζ', # Greek | ||
| } | ||
| homoglyph_map = { | ||
| 'a': 'а', # Cyrillic a | ||
| 'e': 'е', # Cyrillic e | ||
| 'o': 'о', # Cyrillic o | ||
| 'p': 'р', # Cyrillic r | ||
| 'c': 'с', # Cyrillic s | ||
| 'y': 'у', # Cyrillic u | ||
| 'x': 'х', # Cyrillic h | ||
| 'i': 'і', # Cyrillic i | ||
| 'j': 'ј', # Cyrillic j | ||
| 's': 'ѕ', # Cyrillic dze | ||
| 'A': 'А', # Cyrillic A | ||
| 'B': 'В', # Cyrillic V | ||
| 'C': 'С', # Cyrillic S | ||
| 'E': 'Е', # Cyrillic E | ||
| 'H': 'Н', # Cyrillic N | ||
| 'I': 'І', # Cyrillic I | ||
| 'J': 'Ј', # Cyrillic J | ||
| 'K': 'К', # Cyrillic K | ||
| 'M': 'М', # Cyrillic M | ||
| 'O': 'О', # Cyrillic O | ||
| 'P': 'Р', # Cyrillic P | ||
| 'S': 'Ѕ', # Cyrillic S | ||
| 'T': 'Т', # Cyrillic T | ||
| 'X': 'Х', # Cyrillic Kh | ||
| 'Y': 'Υ', # Greek Upsilon | ||
| } | ||
| zero_width_chars = [ | ||
| '\u200B', # Zero Width Space | ||
| '\u200C', # Zero Width Non-Joiner | ||
| '\u200D', # Zero Width Joiner | ||
| '\uFEFF', # Zero Width No-Break Space | ||
| ] | ||
| zalgo_marks = [ | ||
| # Combining marks above | ||
| '\u0300', '\u0301', '\u0302', '\u0303', '\u0304', '\u0305', '\u0306', | ||
| '\u0307', '\u0308', '\u0309', '\u030A', '\u030B', '\u030C', '\u030D', | ||
| '\u030E', '\u030F', '\u0310', '\u0311', '\u0312', '\u0313', '\u0314', | ||
| '\u0315', '\u031A', '\u031B', '\u033D', '\u033E', '\u033F', '\u0340', | ||
| '\u0341', '\u0342', '\u0343', '\u0344', '\u0346', | ||
| # Combining marks below | ||
| '\u0316', '\u0317', '\u0318', '\u0319', '\u031C', '\u031D', '\u031E', | ||
| '\u031F', '\u0320', '\u0321', '\u0322', '\u0323', '\u0324', '\u0325', | ||
| '\u0326', '\u0327', '\u0328', '\u0329', '\u032A', '\u032B', '\u032C', | ||
| '\u032D', '\u032E', '\u032F', '\u0330', '\u0331', '\u0332', '\u0333', | ||
| '\u0339', '\u033A', '\u033B', '\u033C', '\u0345', '\u0347', '\u0348', | ||
| '\u0349', '\u034D', '\u034E', | ||
| # Combining marks through | ||
| '\u0335', '\u0336', '\u0337', '\u0338', | ||
| ] | ||
| punctuation = ".,!?;:" | ||
@@ -190,2 +278,28 @@ | ||
| def unicode_lookalike(chars, idx): | ||
| if is_standalone_vowel(chars, idx): | ||
| return chars[idx] | ||
| return unicode_lookalike_map.get(chars[idx], chars[idx]) | ||
| def homoglyph(chars, idx): | ||
| if is_standalone_vowel(chars, idx): | ||
| return chars[idx] | ||
| return homoglyph_map.get(chars[idx], chars[idx]) | ||
| def zero_width(chars, idx): | ||
| return chars[idx] + random.choice(zero_width_chars) | ||
| def zalgo(chars, idx): | ||
| if chars[idx].isalpha(): | ||
| num_marks = random.randint(1, 3) | ||
| marks = ''.join(random.choice(zalgo_marks) for _ in range(num_marks)) | ||
| return chars[idx] + marks | ||
| return chars[idx] | ||
| mods = { | ||
@@ -197,2 +311,6 @@ "capitalize": capitalize, | ||
| "invert_180": invert_180, | ||
| "unicode_lookalike": unicode_lookalike, | ||
| "homoglyph": homoglyph, | ||
| "zero_width": zero_width, | ||
| "zalgo": zalgo, | ||
| } | ||
@@ -273,1 +391,25 @@ | ||
| await llm.stream_final_completion(chat=chat) | ||
| if __name__ == "__main__": | ||
| sample = "Which company created Hacker News?" | ||
| print("Original:", sample) | ||
| print() | ||
| # Test with all mods | ||
| modified, mapping = modify_text(text=sample, percentage=30, mods=[ | ||
| "all", | ||
| # "diacritic", | ||
| # "remove_vowel", | ||
| # "invert_180", | ||
| # "unicode_lookalike", | ||
| # "homoglyph", | ||
| # "zero_width", | ||
| # "zalgo", | ||
| ]) | ||
| double_modified, _ = modify_text( | ||
| text=modified, percentage=30, mods=["all"] | ||
| ) | ||
| print() | ||
| print("All mods (100%):", modified) | ||
| print("Double modified:", double_modified) |
@@ -0,7 +1,9 @@ | ||
| from typing import TYPE_CHECKING | ||
| import random | ||
| import re | ||
| from chat import Chat | ||
| if TYPE_CHECKING: | ||
| from chat import Chat | ||
| def percentage(chat: Chat, **kwargs): | ||
| def percentage(chat: 'Chat', **kwargs): | ||
| percentage = kwargs.get("percentage", 50) | ||
@@ -14,3 +16,3 @@ nodes = chat.plain() | ||
| def match(chat: Chat, **kwargs): | ||
| def match(chat: 'Chat', **kwargs): | ||
| substring = kwargs.get("substring", "") | ||
@@ -34,19 +36,19 @@ role = kwargs.get("role", "") | ||
| def user(chat: Chat): | ||
| def user(chat: 'Chat'): | ||
| return match(chat, role="user") | ||
| def all(chat: Chat): | ||
| def all(chat: 'Chat'): | ||
| return chat.plain() | ||
| def first(chat: Chat): | ||
| def first(chat: 'Chat'): | ||
| return match(chat, index=0) | ||
| def last(chat: Chat): | ||
| def last(chat: 'Chat'): | ||
| return match(chat, index=-1) | ||
| def any(chat: Chat): | ||
| def any(chat: 'Chat'): | ||
| return [random.choice(chat.plain())] | ||
@@ -66,3 +68,3 @@ | ||
| def apply_strategy(chat: Chat, strategy: str, params: dict): | ||
| def apply_strategy(chat: 'Chat', strategy: str, params: dict): | ||
| return selection_strategies[strategy](chat, **params) | ||
@@ -69,0 +71,0 @@ |
| services: | ||
| llamacpp: | ||
| image: ghcr.io/ggerganov/llama.cpp:full | ||
| image: ${HARBOR_LLAMACPP_IMAGE}:server | ||
| container_name: ${HARBOR_CONTAINER_PREFIX}.llamacpp | ||
@@ -15,3 +15,2 @@ env_file: | ||
| command: > | ||
| --server | ||
| ${HARBOR_LLAMACPP_MODEL_SPECIFIER} | ||
@@ -18,0 +17,0 @@ ${HARBOR_LLAMACPP_EXTRA_ARGS} |
| services: | ||
| llamacpp: | ||
| image: ghcr.io/ggerganov/llama.cpp:full-cuda | ||
| image: ${HARBOR_LLAMACPP_IMAGE}:server-cuda | ||
| deploy: | ||
@@ -5,0 +5,0 @@ resources: |
@@ -281,2 +281,23 @@  | ||
| ### Custom Cache Locations | ||
| By default, Harbor stores service caches in standard locations (e.g., `~/.ollama`, `~/.cache/huggingface`). You can customize these paths, for example to keep everything relative to your Harbor installation: | ||
| ```bash | ||
| harbor config set hf.cache $(harbor home)/__cache/hf | ||
| harbor config set llamacpp.cache $(harbor home)/__cache/llamacpp | ||
| harbor config set ollama.cache $(harbor home)/__cache/ollama | ||
| harbor config set vllm.cache $(harbor home)/__cache/vllm | ||
| harbor config set txtai.cache $(harbor home)/__cache/txtai | ||
| harbor config set parllama.cache $(harbor home)/__cache/parllama | ||
| harbor config set lmeval.cache $(harbor home)/__cache/lmeval | ||
| ``` | ||
| This is useful when you want a self-contained Harbor installation or need to manage disk space on specific volumes. | ||
| > [!TIP] | ||
| > See all available cache options with `harbor config ls | grep CACHE` | ||
| For more details, see [`harbor home`](./3.-Harbor-CLI-Reference#harbor-home) and [`harbor config`](./3.-Harbor-CLI-Reference#harbor-config) in the CLI Reference. | ||
| ## Harbor Profiles | ||
@@ -283,0 +304,0 @@ |
@@ -1,168 +0,715 @@ | ||
| ## Installation | ||
| ## Installing Harbor | ||
| Harbor lets you run local LLMs and 50+ AI services with simple commands. Get Open WebUI + Ollama running in minutes. | ||
| > [!NOTE] | ||
| > Harbor is still a young project (hence the 0.x.x versioning), installation and some features might not work as expected. Please report any issues you encounter. | ||
| > Harbor is in active development (v0.x). Join our [Discord](https://discord.gg/8nDRphrhSF) for support. | ||
| - [Preparing your system](#preparing-your-system) | ||
| - [Harbor CLI](#harbor-cli) | ||
| - [Unsafe install](#unsafe-install) | ||
| - [Manual install](#manual-install) | ||
| - [Harbor App](#harbor-app) | ||
| - [Prerequisites](#prerequisites) | ||
| - [Install Harbor App](#install-harbor-app) | ||
| - [Linux](#linux) | ||
| - [MacOS](#macos) | ||
| - [MacOS Installation Issue](#macos-installation-issue) | ||
| ### At a Glance | ||
| ### Preparing your system | ||
| | Path | Time | Prerequisites | Best For | | ||
| |------|------|---------------|----------| | ||
| | [Quick Start](#quick-start) | 5 min | Docker + Git | Docker users | | ||
| | [Complete Install](#complete-installation-guide) | 15-30 min | Just a computer | New to Docker | | ||
| | [GPU Setup](#gpu-acceleration-optional) | +10 min | NVIDIA GPU | Optional boost | | ||
| Harbor is a containerized toolkit that runs on top of Docker. This approach is what enables Harbor to support such a wide range of services and platforms. The drawback is that you'll need to have Docker installed and configured on your system. Please go through below checklist line-by-line to ensure that your system is ready for Harbor. | ||
| --- | ||
| - All Platforms | ||
| - Ensure you have at least 10GB of free disk space. Harbor is lightweight, but the services it runs in Docker typically might come with a multi-GB image size (especially ones with CUDA). | ||
| - On Windows - [enable WSL2](https://learn.microsoft.com/en-us/windows/wsl/install) | ||
| - All Platforms - [install git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) | ||
| - All Platforms - [install Docker](https://docs.docker.com/engine/install/) | ||
| - On Linux - complete post-install for [`docker` without `sudo`](httpws://docs.docker.com/engine/install/linux-postinstall/) | ||
| - On Windows - [enable Docker in WSL2](https://docs.docker.com/desktop/wsl/#enabling-docker-support-in-wsl-2-distros) | ||
| - With Nvidia GPU - [install NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installation) | ||
| - Enables GPU pass-through for supported services | ||
| - On Windows - install the Container Toolkit under WSL2 following Linux instructions | ||
| - All Platforms - [install Docker Compose plugin](https://docs.docker.com/compose/install/) | ||
| - Harbor requires Docker Compose [2.23.1](https://docs.docker.com/compose/releases/release-notes/#2231) or newer | ||
| - All Platforms - Bash-compatible shell 3.2 or newer | ||
| - Should be available on WSL2, MacOS and Linux platforms out of the box | ||
| - Harbor sometimes uses features from newer Bash - please report any issues you encounter | ||
| ## Table of Contents | ||
| - [Quick Start](#quick-start) | ||
| - [Complete Installation Guide](#complete-installation-guide) | ||
| - [Windows](#-windows-installation) | ||
| - [macOS](#-macos-installation) | ||
| - [Linux](#-linux-installation) | ||
| - [GPU Acceleration (Optional)](#gpu-acceleration-optional) | ||
| - [Harbor CLI Installation Methods](#harbor-cli-installation-methods) | ||
| - [Quick Install Script](#quick-install-script-recommended) | ||
| - [Package Managers](#via-package-manager) | ||
| - [Manual Install](#manual-install) | ||
| - [Harbor App (GUI)](#harbor-app-gui) | ||
| - [Troubleshooting](#troubleshooting) | ||
| --- | ||
| ## Quick Start | ||
| **For users who already have Docker and Git installed.** | ||
| ### Prerequisites Check | ||
| - [ ] Docker installed and running (`docker --version`) | ||
| - [ ] Docker Compose 2.23.1+ installed (`docker compose version`) | ||
| - [ ] Git installed (`git --version`) | ||
| - [ ] 10GB+ free disk space | ||
| ### Install Harbor | ||
| Choose your preferred method: | ||
| **Quick Install Script (Recommended)** | ||
| ```bash | ||
| curl https://av.codes/get-harbor.sh | bash | ||
| ``` | ||
| **Or via Package Manager** | ||
| ```bash | ||
| npm install -g @avcodes/harbor # Node.js users | ||
| pipx install llm-harbor # Python users | ||
| ``` | ||
| ### Verify Installation | ||
| ```bash | ||
| harbor --version | ||
| harbor doctor # Check system compatibility | ||
| ``` | ||
| ### Start Using Harbor | ||
| ```bash | ||
| harbor up # Start default services (Ollama + Open WebUI) | ||
| harbor open # Open in browser | ||
| ``` | ||
| > [!TIP] | ||
| > First launch requires creating a local admin account for Open WebUI. | ||
| **✓ Done! What's next?** | ||
| - [Harbor User Guide](./1.-Harbor-User-Guide) | ||
| - [Available Services](./2.-Services) | ||
| - [CLI Reference](./3.-Harbor-CLI-Reference) | ||
| --- | ||
| ## Complete Installation Guide | ||
| **New to Docker?** No problem. Choose your platform below for step-by-step instructions. | ||
| Harbor is a containerized toolkit that runs on top of Docker. This enables Harbor to support so many services and work across platforms. The sections below guide you through setting up Docker and all prerequisites. | ||
| <details> | ||
| <summary><b>🪟 Windows Installation</b></summary> | ||
| ### Windows Installation (15-25 minutes) | ||
| **What you'll need:** | ||
| - Windows 10/11 (64-bit) | ||
| - 20GB free disk space | ||
| - Administrator access | ||
| **Why WSL2?** Harbor uses WSL2 (Windows Subsystem for Linux) to run Docker on Windows. Think of it as a lightweight Linux environment inside Windows. | ||
| #### Step 1: Install WSL2 (5 minutes) | ||
| Open PowerShell as Administrator and run: | ||
| ```powershell | ||
| wsl --install | ||
| ``` | ||
| Restart your computer when prompted. | ||
| **Verify:** | ||
| ```bash | ||
| wsl --version | ||
| ``` | ||
| You should see WSL version information ✓ | ||
| #### Step 2: Install Docker Desktop (10 minutes) | ||
| - [ ] Download [Docker Desktop for Windows](https://docs.docker.com/desktop/install/windows-install/) | ||
| - [ ] Run the installer | ||
| - [ ] During installation, ensure "Use WSL 2 instead of Hyper-V" is checked | ||
| - [ ] Restart your computer | ||
| - [ ] Launch Docker Desktop | ||
| - [ ] In Docker Desktop settings, go to Resources → WSL Integration | ||
| - [ ] Enable integration with your default WSL distro | ||
| **Verify** (in WSL2 terminal): | ||
| ```bash | ||
| docker --version | ||
| docker compose version | ||
| docker run hello-world | ||
| ``` | ||
| You should see "Hello from Docker!" ✓ | ||
| #### Step 3: Install Git (2 minutes) | ||
| In your WSL2 terminal: | ||
| ```bash | ||
| sudo apt update && sudo apt install git -y | ||
| ``` | ||
| **Verify:** | ||
| ```bash | ||
| git --version | ||
| ``` | ||
| #### Step 4: Install Harbor (5 minutes) | ||
| Follow the [Harbor CLI installation methods](#harbor-cli-installation-methods) below. | ||
| **✓ Success! What's next?** | ||
| - Run `harbor doctor` to verify everything is working | ||
| - Try `harbor up` to start default services | ||
| - [Learn more about Harbor](./1.-Harbor-User-Guide) | ||
| **Common Issues:** | ||
| - **Docker Desktop not starting?** Ensure virtualization is enabled in BIOS | ||
| - **WSL not installing?** You may need to enable Windows features manually | ||
| - **Permission issues?** Ensure Docker integration is enabled for your WSL distro | ||
| </details> | ||
| <details> | ||
| <summary><b>🍎 macOS Installation</b></summary> | ||
| ### macOS Installation (15-20 minutes) | ||
| **What you'll need:** | ||
| - macOS 11 (Big Sur) or newer | ||
| - 20GB free disk space | ||
| - Administrator access | ||
| > [!NOTE] | ||
| > MacOS: some services do not ship ARM64 images. GPU pass-through is not supported on MacOS. | ||
| > **ARM64 Limitation:** Some services don't ship ARM64 images (Apple Silicon). GPU pass-through is not supported on macOS. | ||
| Once the CLI is installed, you can also use [`harbor doctor`](./3.-Harbor-CLI-Reference#harbor-doctor) command to troubleshoot installation issues. | ||
| #### Step 1: Install Docker Desktop (10 minutes) | ||
| ### Harbor CLI | ||
| - [ ] Download [Docker Desktop for Mac](https://docs.docker.com/desktop/install/mac-install/) | ||
| - Choose Apple Silicon or Intel based on your Mac | ||
| - [ ] Open the `.dmg` file and drag Docker to Applications | ||
| - [ ] Launch Docker from Applications | ||
| - [ ] Follow the setup wizard | ||
| - [ ] Grant the requested permissions | ||
| #### Installation methods | ||
| **Verify** (in Terminal): | ||
| ```bash | ||
| docker --version | ||
| docker compose version | ||
| docker run hello-world | ||
| ``` | ||
| Harbor CLI can be installed in multiple ways that are listed below. | ||
| You should see "Hello from Docker!" ✓ | ||
| - [Unsafe one-liner](#unsafe-one-liner) | ||
| - [Package Managers](#package-managers) | ||
| - On Windows - ensure to install within WSL2 | ||
| - [Manual install](#manual-install) | ||
| #### Step 2: Install Git (2 minutes) | ||
| #### Unsafe one-liner | ||
| Git typically comes pre-installed on macOS. Verify: | ||
| ```bash | ||
| git --version | ||
| ``` | ||
| - Runs the install script directly from the internet (make sure you understand the risks) | ||
| - Will clone the Harbor repository to your home directory | ||
| - Will write to your shell profile to add bin folder to the path | ||
| If not installed, macOS will prompt you to install Command Line Tools. | ||
| Or install via Homebrew: | ||
| ```bash | ||
| brew install git | ||
| ``` | ||
| #### Step 3: Install Harbor (5 minutes) | ||
| Follow the [Harbor CLI installation methods](#harbor-cli-installation-methods) below. | ||
| **✓ Success! What's next?** | ||
| - Run `harbor doctor` to verify everything is working | ||
| - Try `harbor up` to start default services | ||
| - [Learn more about Harbor](./1.-Harbor-User-Guide) | ||
| **Common Issues:** | ||
| - **Docker Desktop not starting?** Check System Preferences → Privacy & Security | ||
| - **Permission errors?** Grant Full Disk Access to Docker in System Preferences | ||
| - **ARM64 service not available?** Check [available services](./2.-Services) for ARM64 support | ||
| </details> | ||
| <details> | ||
| <summary><b>🐧 Linux Installation</b></summary> | ||
| ### Linux Installation (15-20 minutes) | ||
| **What you'll need:** | ||
| - Ubuntu 20.04+, Debian 11+, Fedora 35+, or similar | ||
| - 20GB free disk space | ||
| - Sudo access | ||
| #### Step 1: Install Docker (10 minutes) | ||
| **Ubuntu/Debian:** | ||
| ```bash | ||
| # Add Docker's official GPG key | ||
| sudo apt-get update | ||
| sudo apt-get install ca-certificates curl | ||
| sudo install -m 0755 -d /etc/apt/keyrings | ||
| sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc | ||
| sudo chmod a+r /etc/apt/keyrings/docker.asc | ||
| # Add repository | ||
| echo \ | ||
| "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ | ||
| $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ | ||
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null | ||
| # Install Docker | ||
| sudo apt-get update | ||
| sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y | ||
| ``` | ||
| **Fedora:** | ||
| ```bash | ||
| sudo dnf -y install dnf-plugins-core | ||
| sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo | ||
| sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y | ||
| sudo systemctl start docker | ||
| sudo systemctl enable docker | ||
| ``` | ||
| **Configure Docker to run without sudo:** | ||
| ```bash | ||
| sudo groupadd docker | ||
| sudo usermod -aG docker $USER | ||
| newgrp docker | ||
| ``` | ||
| **Verify:** | ||
| ```bash | ||
| docker --version | ||
| docker compose version | ||
| docker run hello-world | ||
| ``` | ||
| You should see "Hello from Docker!" ✓ | ||
| #### Step 2: Install Git (2 minutes) | ||
| **Ubuntu/Debian:** | ||
| ```bash | ||
| sudo apt-get install git -y | ||
| ``` | ||
| **Fedora:** | ||
| ```bash | ||
| sudo dnf install git -y | ||
| ``` | ||
| **Verify:** | ||
| ```bash | ||
| git --version | ||
| ``` | ||
| #### Step 3: Install Harbor (5 minutes) | ||
| Follow the [Harbor CLI installation methods](#harbor-cli-installation-methods) below. | ||
| **✓ Success! What's next?** | ||
| - Run `harbor doctor` to verify everything is working | ||
| - Try `harbor up` to start default services | ||
| - [Learn more about Harbor](./1.-Harbor-User-Guide) | ||
| **Common Issues:** | ||
| - **Permission denied?** Ensure you've added your user to the docker group and logged out/in | ||
| - **Docker service not starting?** Try `sudo systemctl status docker` | ||
| - **Old Docker version?** Ensure Docker Compose 2.23.1+ is installed | ||
| </details> | ||
| --- | ||
| ## GPU Acceleration (Optional) | ||
| **Should you set this up?** | ||
| - ✓ You have an NVIDIA GPU | ||
| - ✓ You want 3-10x faster inference for local LLMs | ||
| ### Installing NVIDIA Container Toolkit | ||
| **Linux:** | ||
| ```bash | ||
| # Add NVIDIA Container Toolkit repository | ||
| distribution=$(. /etc/os-release;echo $ID$VERSION_ID) | ||
| curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg | ||
| curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \ | ||
| sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ | ||
| sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list | ||
| # Install | ||
| sudo apt-get update | ||
| sudo apt-get install -y nvidia-container-toolkit | ||
| sudo systemctl restart docker | ||
| ``` | ||
| **Windows (WSL2):** | ||
| Follow the Linux instructions above inside your WSL2 terminal. | ||
| **Verify:** | ||
| ```bash | ||
| docker run --rm --gpus all nvidia/cuda:12.0.0-base-ubuntu22.04 nvidia-smi | ||
| ``` | ||
| You should see your GPU information ✓ | ||
| **✓ GPU Enabled!** Harbor will automatically use GPU for supported services when available. | ||
| --- | ||
| ## Harbor CLI Installation Methods | ||
| Choose your preferred installation method. All methods work equally well. | ||
| ### Quick Install Script (Recommended) | ||
| This automated script: | ||
| - Clones Harbor to `~/.harbor` | ||
| - Adds Harbor to your PATH | ||
| - Works on Linux, macOS, and Windows (WSL2) | ||
| ```bash | ||
| curl https://av.codes/get-harbor.sh | bash | ||
| ``` | ||
| #### Package Managers | ||
| > [!TIP] | ||
| > Want to review the script first? `curl https://av.codes/get-harbor.sh | less` | ||
| Please note that installation via package managers is _experimental_ and might differ from the "native" installation via the script or manual method. | ||
| > [!TIP] | ||
| > Need a custom install location? See [Manual Install](#manual-install) below. | ||
| **NPM** | ||
| **On Windows:** Run this inside your WSL2 terminal, not PowerShell. | ||
| --- | ||
| ### Via Package Manager | ||
| **NPM** (for Node.js developers) | ||
| ```bash | ||
| # Note the "global" flag | ||
| npm install -g @avcodes/harbor | ||
| ``` | ||
| **PyPI** | ||
| **PyPI** (for Python developers) | ||
| ```bash | ||
| # Use pipx as harbor is a CLI tool | ||
| pipx install llm-harbor | ||
| ``` | ||
| #### Manual install | ||
| > [!NOTE] | ||
| > Package versions may lag slightly behind the latest git releases. | ||
| Same as above, just done by you. | ||
| **On Windows:** Install within WSL2 environment. | ||
| --- | ||
| ### Manual Install | ||
| Same as the quick install script, but manual. You can install Harbor to any location: | ||
| ```bash | ||
| git clone https://github.com/av/harbor.git && cd harbor | ||
| # Default location | ||
| git clone https://github.com/av/harbor.git ~/.harbor | ||
| cd ~/.harbor | ||
| # [Optional] make Harbor CLI available globally | ||
| # Otherwise, call this .sh file instead of `harbor` | ||
| # Or a custom location | ||
| git clone https://github.com/av/harbor.git /path/to/harbor | ||
| cd /path/to/harbor | ||
| # Make Harbor CLI available globally | ||
| ./harbor.sh ln | ||
| # Verify installation | ||
| harbor --version | ||
| ``` | ||
| #### Verify | ||
| The `harbor update` command works the same way regardless of install location. | ||
| > [!TIP] | ||
| > Use [`harbor home`](./3.-Harbor-CLI-Reference#harbor-home) to reference the install path in scripts and commands. | ||
| **Troubleshooting:** | ||
| - If `harbor` command not found after install, restart your shell | ||
| - On some systems, you may need to manually add `~/.harbor/bin` to PATH | ||
| --- | ||
| ### Verify Your Installation | ||
| After installing via any method: | ||
| ```bash | ||
| # Check the installation | ||
| # Check Harbor version | ||
| harbor --version | ||
| harbor --help | ||
| # Run doctor script to | ||
| # check if all requirements are met | ||
| # Check system compatibility | ||
| harbor doctor | ||
| # [Optional] Start default services | ||
| # Initial download of the docker images might take a while | ||
| # If you have container toolkit installed, GPU will | ||
| # be automatically used for supported services. | ||
| # View available commands | ||
| harbor --help | ||
| ``` | ||
| **Expected output from `harbor doctor`:** | ||
| - ✓ Docker installed and running | ||
| - ✓ Docker Compose 2.23.1 or newer | ||
| - ✓ Git installed | ||
| - ✓ Sufficient disk space | ||
| **✓ Installation Complete!** | ||
| **Next steps:** | ||
| ```bash | ||
| # Start default services (Ollama + Open WebUI) | ||
| harbor up | ||
| # [Optional] open Webui in the browser | ||
| # Open in browser | ||
| harbor open | ||
| # Browse available services | ||
| harbor services | ||
| ``` | ||
| > [!NOTE] | ||
| > First launch of the [Open WebUI](./2.1.1-Frontend:-Open-WebUI) will require you to create a local admin account. Harbor keeps such auth requirements on by default because it also supports [exposing your local stack to the internet](./3.-Harbor-CLI-Reference#harbor-tunnels). | ||
| > [!TIP] | ||
| > First launch requires creating a local admin account for Open WebUI. This is required because Harbor supports [exposing your services to the internet](./3.-Harbor-CLI-Reference#harbor-tunnels). | ||
| #### Next Steps | ||
| **Learn more:** | ||
| - [Harbor User Guide](./1.-Harbor-User-Guide) - How to use Harbor | ||
| - [Available Services](./2.-Services) - Browse 50+ services | ||
| - [CLI Reference](./3.-Harbor-CLI-Reference) - Complete command reference | ||
| - [Harbor User Guide](./1.-Harbor-User-Guide) | ||
| - [Harbor CLI Reference](./3.-Harbor-CLI-Reference) | ||
| - [Harbor Services](./2.-Services) | ||
| --- | ||
| ### Harbor App | ||
| ## Troubleshooting | ||
| > [!NOTE] | ||
| > Harbor App is even younger than the CLI and might have more issues. Please report any issues you encounter. | ||
| ### harbor doctor | ||
| #### Prerequisites | ||
| The `harbor doctor` command checks your system for common issues: | ||
| ```bash | ||
| harbor doctor | ||
| ``` | ||
| This will verify: | ||
| - Docker installation and daemon status | ||
| - Docker Compose version compatibility | ||
| - Git installation | ||
| - Disk space availability | ||
| - File permissions | ||
| - Bash version | ||
| ### Common Issues | ||
| **"docker: command not found"** | ||
| - Docker is not installed or not in PATH | ||
| - On Windows: Make sure you're running commands in WSL2, not PowerShell | ||
| - Solution: Follow the [Complete Installation Guide](#complete-installation-guide) for your platform | ||
| **"Cannot connect to the Docker daemon"** | ||
| - Docker Desktop is not running | ||
| - Solution: Start Docker Desktop and wait for it to fully initialize | ||
| **"docker compose: command not found" or version too old** | ||
| - Docker Compose plugin not installed or outdated | ||
| - Solution: Install/update Docker Compose plugin (minimum version 2.23.1) | ||
| - Check version: `docker compose version` | ||
| **"Permission denied" when running docker commands** | ||
| - On Linux: User not in docker group | ||
| - Solution: `sudo usermod -aG docker $USER` then log out and back in | ||
| - On Windows/macOS: Docker Desktop permissions issue | ||
| **Services fail to start with GPU errors** | ||
| - NVIDIA Container Toolkit not properly installed | ||
| - Solution: See [GPU Acceleration](#gpu-acceleration-optional) section | ||
| - Or skip GPU: Harbor works great on CPU | ||
| **"harbor: command not found" after installation** | ||
| - PATH not updated or shell not restarted | ||
| - Solution: Restart your terminal or run `source ~/.bashrc` (or `~/.zshrc`) | ||
| - Manual fix: Add `~/.harbor/bin` to your PATH | ||
| **Services download slowly or fail** | ||
| - Large Docker images (especially with CUDA) | ||
| - Solution: Be patient, first download can take 10-30 minutes depending on your internet | ||
| - Retry: `harbor down && harbor up` | ||
| **Need more help?** | ||
| - Join our [Discord community](https://discord.gg/8nDRphrhSF) | ||
| - Check [GitHub Issues](https://github.com/av/harbor/issues) | ||
| - Read the [CLI Reference](./3.-Harbor-CLI-Reference) | ||
| --- | ||
| ## Harbor App (GUI) | ||
| **Alternative to the command-line interface.** | ||
| Harbor App provides a graphical interface for managing Harbor services. It's built on top of the Harbor CLI. | ||
| > [!NOTE] | ||
| > As for the moment, Harbor App is available but not tested on Windows. Contributions are welcome! You can still use the Harbor CLI with WSL2. | ||
| > Harbor App is in beta. The CLI is more stable and feature-complete. Windows support is untested. | ||
| - [Harbor CLI v0.2.0 or newer](#harbor-cli), installed and available globally | ||
| ### When to Use Harbor App | ||
| #### Install Harbor App | ||
| **Use Harbor App if you:** | ||
| - Prefer graphical interfaces over command-line | ||
| - Want visual service management | ||
| - Are comfortable with beta software | ||
| #### Linux | ||
| **Use Harbor CLI if you:** | ||
| - Comfortable with terminal commands | ||
| - Want the most stable experience | ||
| - Need all features and latest updates | ||
| - Are on Windows (CLI works great in WSL2) | ||
| Depending on your distribution, download the latest `.deb` or `.AppImage` package from the [latest release](https://github.com/av/harbor/releases/latest) and install it. | ||
| ### Prerequisites | ||
| #### MacOS | ||
| - [ ] Harbor CLI v0.2.0+ installed and available globally | ||
| - [ ] Harbor CLI working correctly (`harbor doctor` passes) | ||
| - [ ] macOS or Linux (Windows support untested) | ||
| I don't have an Apple developer account and consequently can't sign apps. As a result - to run the app, you'dd need to bypass the quarantine after downloading it. | ||
| ### Installation by Platform | ||
| - Download the `Harbor_aarch64.app.tar.gz` from the [releases page](https://github.com/av/harbor/releases) | ||
| - Run the `.tar.gz` file - it'll be extracted in-place, you'll see the `Harbor.app` file in the same directory | ||
| - Open the terminal in the same directory and run the following command | ||
| <details> | ||
| <summary><b>🐧 Linux</b></summary> | ||
| Download the package for your distribution from the [latest release](https://github.com/av/harbor/releases/latest): | ||
| **Debian/Ubuntu (.deb)** | ||
| ```bash | ||
| # Download the .deb file from releases | ||
| sudo dpkg -i Harbor_*.deb | ||
| # If dependencies missing: | ||
| sudo apt-get install -f | ||
| ``` | ||
| **AppImage (Universal)** | ||
| ```bash | ||
| # Download the .AppImage file from releases | ||
| chmod +x Harbor_*.AppImage | ||
| ./Harbor_*.AppImage | ||
| ``` | ||
| **✓ Launch Harbor App from your applications menu or run the AppImage.** | ||
| </details> | ||
| <details> | ||
| <summary><b>🍎 macOS</b></summary> | ||
| **Important:** Harbor App is not code-signed. You'll need to bypass macOS security. | ||
| #### Installation Steps | ||
| 1. Download `Harbor_aarch64.app.tar.gz` from [releases page](https://github.com/av/harbor/releases/latest) | ||
| 2. Extract the archive (double-click the `.tar.gz` file) | ||
| 3. You'll see `Harbor.app` in the same directory | ||
| 4. Open Terminal in that directory and run: | ||
| ```bash | ||
| sudo xattr -d com.apple.quarantine ./Harbor.app | ||
| ``` | ||
| You'll be prompted for your system password. After that, you can run the app from the file. Optionally, you might also copy it to your "Applications" folder for easier access. | ||
| 5. Enter your system password when prompted | ||
| 6. Launch Harbor.app by double-clicking it | ||
| 7. (Optional) Move to Applications folder for easier access | ||
| After these actions, you should have the Harbor App running on your system. | ||
| **✓ Harbor App is now ready to use!** | ||
|  | ||
|  | ||
| #### Windows | ||
| **Troubleshooting:** | ||
| - **"damaged and can't be opened":** Run the `xattr` command above | ||
| - **App opens but shows nothing:** Run `harbor doctor` to check CLI installation | ||
| - **Can't find Harbor.app:** Make sure you extracted the .tar.gz file | ||
| > [!NOTE] Harbor App requires Harbor CLI installed and configured to function | ||
| </details> | ||
| Download `.msi` or `setup.exe` and run the installer. The app should be available in the start menu after installation. If the App opens but nothing is displayed, please check [`harbor doctor`](./3.-Harbor-CLI-Reference#harbor-doctor) to troubleshoot the issue. | ||
| <details> | ||
| <summary><b>🪟 Windows</b></summary> | ||
| #### Next Steps | ||
| > [!WARNING] | ||
| > Harbor App on Windows is untested. We recommend using Harbor CLI in WSL2 instead. | ||
| - [Harbor App](./1.1-Harbor-App) | ||
| - [Harbor Services](./2.-Services) | ||
| If you want to try the Windows app: | ||
| 1. Download `.msi` or `setup.exe` from [releases page](https://github.com/av/harbor/releases/latest) | ||
| 2. Run the installer | ||
| 3. Launch from Start Menu | ||
| **Requirements:** | ||
| - Harbor CLI must be installed in WSL2 | ||
| - Docker Desktop must be running | ||
| **If the app opens but shows nothing:** | ||
| - Run `harbor doctor` in WSL2 to verify CLI installation | ||
| - Check that Docker Desktop is running | ||
| - Check Windows-WSL2 networking | ||
| **Having issues?** Use Harbor CLI in WSL2 for the best Windows experience. | ||
| </details> | ||
| --- | ||
| ### Next Steps with Harbor App | ||
| After installation: | ||
| 1. **Launch the app** - Should detect your Harbor CLI installation | ||
| 2. **Browse services** - See all 50+ available services | ||
| 3. **Start services** - Click to start Ollama, Open WebUI, or any service | ||
| 4. **Monitor status** - View running services and their logs | ||
| **Learn more:** | ||
| - [Harbor App Guide](./1.1-Harbor-App) | ||
| - [Available Services](./2.-Services) | ||
| --- | ||
| ## Additional Resources | ||
| ### System Requirements Summary | ||
| **Minimum:** | ||
| - 10GB free disk space (more recommended for multiple services) | ||
| - 8GB RAM (16GB+ recommended for LLMs) | ||
| - Docker 20.10+ | ||
| - Docker Compose 2.23.1+ | ||
| - Bash 3.2+ | ||
| **Recommended:** | ||
| - 50GB+ free disk space | ||
| - 16GB+ RAM | ||
| - NVIDIA GPU (optional, for faster inference) | ||
| - SSD storage (for better performance) | ||
| ### Bash Version Check | ||
| Harbor requires Bash 3.2 or newer (available by default on most systems): | ||
| ```bash | ||
| bash --version | ||
| ``` | ||
| If you encounter Bash-related issues, please [report them](https://github.com/av/harbor/issues). | ||
| ### Getting Help | ||
| - **Discord:** Join our [community server](https://discord.gg/8nDRphrhSF) for live support | ||
| - **GitHub Issues:** Report bugs or request features at [github.com/av/harbor/issues](https://github.com/av/harbor/issues) | ||
| - **Documentation:** Browse the [Harbor Wiki](https://github.com/av/harbor/wiki) | ||
| - **CLI Reference:** See all commands in [Harbor CLI Reference](./3.-Harbor-CLI-Reference) | ||
| ### What's Next? | ||
| Now that Harbor is installed: | ||
| 1. **Learn the basics:** [Harbor User Guide](./1.-Harbor-User-Guide) | ||
| 2. **Explore services:** [Browse 50+ services](./2.-Services) | ||
| 3. **Master the CLI:** [Complete CLI Reference](./3.-Harbor-CLI-Reference) | ||
| 4. **Join the community:** [Discord](https://discord.gg/8nDRphrhSF) | ||
| **Popular first services to try:** | ||
| - [Open WebUI](./2.1.1-Frontend:-Open-WebUI) - ChatGPT-like interface | ||
| - [Ollama](./2.2.1-Backend:-Ollama) - Run local LLMs | ||
| - [ComfyUI](./2.-Services) - Image generation | ||
| - [n8n](./2.-Services) - Workflow automation | ||
| Welcome to Harbor! 🚢 |
+24
-0
@@ -44,2 +44,5 @@ | ||
| - [Onyx](https://github.com/av/harbor/wiki/2.1.14-Frontend-Onyx) <span style="opacity: 0.5;">`Frontend`, `Workflows`, `Tools`</span><br/> | ||
| Open Source AI Platform with Chat UI, RAG, MCP support, and 40+ document connectors. | ||
| - [Open WebUI](https://github.com/av/harbor/wiki/2.1.1-Frontend:-Open-WebUI) <span style="opacity: 0.5;">`Frontend`</span><br/> | ||
@@ -54,2 +57,5 @@ widely adopted and feature rich web interface for interacting with LLMs. Supports OpenAI-compatible and Ollama backends, multi-users, multi-model chats, custom prompts, TTS, Web RAG, RAG, and much much more. | ||
| - [Presenton](https://github.com/av/harbor/wiki/2.1.13-Frontend-Presenton) <span style="opacity: 0.5;">`Frontend`</span><br/> | ||
| Open-source AI presentation generator with custom layouts, multi-model support, and PDF/PPTX export. | ||
| # Backends | ||
@@ -150,2 +156,5 @@ | ||
| - [Drawio](https://github.com/av/harbor/wiki/2.3.56-Satellite-Drawio) <span style="opacity: 0.5;">`Satellite`</span><br/> | ||
| AI-powered diagram creation tool - generate draw.io diagrams from natural language. | ||
| - [Fabric](https://github.com/av/harbor/wiki/2.3.10-Satellite:-fabric) <span style="opacity: 0.5;">`Satellite`, `CLI`</span><br/> | ||
@@ -172,2 +181,5 @@ LLM-driven processing of the text data in the terminal. | ||
| - [Karakeep](https://github.com/av/harbor/wiki/2.3.53-Satellite-Karakeep) <span style="opacity: 0.5;">`Satellite`</span><br/> | ||
| Self-hosted bookmark manager with AI-powered automatic tagging via OpenAI or Ollama. | ||
| - [KoboldCpp](https://github.com/av/harbor/wiki/2.2.16-Backend:-KoboldCpp) <span style="opacity: 0.5;">`Satellite`, `Frontend`, `Backend`</span><br/> | ||
@@ -212,2 +224,5 @@ KoboldCpp is an easy-to-use AI text-generation software for GGML and GGUF models. | ||
| - [MindsDB](https://github.com/av/harbor/wiki/2.3.57-Satellite-MindsDB) <span style="opacity: 0.5;">`Satellite`, `API`</span><br/> | ||
| AI platform for integrating ML models with data sources via HTTP and MySQL APIs. | ||
| - [Morphic](https://github.com/av/harbor/wiki/2.3.34-Satellite-Morphic) <span style="opacity: 0.5;">`Satellite`</span><br/> | ||
@@ -219,2 +234,5 @@ An AI-powered search engine with a generative UI, similar to Perplexity and Perplexica. | ||
| - [Netdata](https://github.com/av/harbor/wiki/2.3.54-Satellite-Netdata) <span style="opacity: 0.5;">`Satellite`</span><br/> | ||
| Real-time infrastructure monitoring with per-second metrics for systems, containers, and applications. | ||
| - [OmniParser](https://github.com/av/harbor/wiki/2.3.30-Satellite:-OmniParser) <span style="opacity: 0.5;">`Satellite`</span><br/> | ||
@@ -253,5 +271,11 @@ A simple screen parsing tool towards pure vision based GUI agent. | ||
| - [Resume Matcher](https://github.com/av/harbor/wiki/2.3.55-Satellite-Resume-Matcher) <span style="opacity: 0.5;">`Satellite`</span><br/> | ||
| AI-powered tool for comparing resumes against job descriptions using local LLMs via Ollama. | ||
| - [SearXNG](https://github.com/av/harbor/wiki/2.3.1-Satellite:-SearXNG) <span style="opacity: 0.5;">`Satellite`</span><br/> | ||
| A privacy-respecting, hackable metasearch engine. Highly configurable and can be used for Web RAG use-cases. | ||
| - [Sim Studio](https://github.com/av/harbor/wiki/2.3.58-Satellite-Sim-Studio) <span style="opacity: 0.5;">`Satellite`, `Workflows`</span><br/> | ||
| Open-source platform to build and deploy AI agent workflows with visual canvas editor. | ||
| - [SQL Chat](https://github.com/av/harbor/wiki/2.3.35-Satellite-SQL-Chat) <span style="opacity: 0.5;">`Satellite`</span><br/> | ||
@@ -258,0 +282,0 @@ Chat-based SQL client, which uses natural language to communicate with the database. |
@@ -105,4 +105,4 @@ ### [Windmill](https://github.com/windmill-labs/windmill) | ||
| # Specific service | ||
| docker logs harbor.windmill-server | ||
| docker logs harbor.windmill-worker | ||
| harbor logs windmill-server | ||
| harbor logs windmill-worker | ||
| ``` | ||
@@ -109,0 +109,0 @@ |
@@ -225,2 +225,7 @@ # Harbor Boost Modules | ||
| - `remove_vowel` - removes vowels from the input | ||
| - `invert_180` - inverts characters 180 degrees | ||
| - `unicode_lookalike` - replaces characters with Unicode lookalikes from other scripts | ||
| - `homoglyph` - replaces characters with visually identical homoglyphs | ||
| - `zero_width` - inserts zero-width characters after the character | ||
| - `zalgo` - adds multiple combining marks to create zalgo text effect | ||
| - `strat` - strategy for selection of the messages to rewrite. Default is `match` | ||
@@ -252,2 +257,7 @@ - `all` - match all messages | ||
| harbor boost klmbr mods add remove_vowel | ||
| harbor boost klmbr mods add invert_180 | ||
| harbor boost klmbr mods add unicode_lookalike | ||
| harbor boost klmbr mods add homoglyph | ||
| harbor boost klmbr mods add zero_width | ||
| harbor boost klmbr mods add zalgo | ||
@@ -254,0 +264,0 @@ # Change the selection strategy |
+1
-1
| { | ||
| "name": "@avcodes/harbor", | ||
| "version": "0.3.22", | ||
| "version": "0.3.28", | ||
| "description": "Effortlessly run LLM backends, APIs, frontends, and services with one command.", | ||
@@ -5,0 +5,0 @@ "private": false, |
+120
-1
@@ -123,2 +123,3 @@ # ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ | ||
| HARBOR_LLAMACPP_HOST_PORT=33831 | ||
| HARBOR_LLAMACPP_IMAGE="ghcr.io/ggml-org/llama.cpp" | ||
| HARBOR_LLAMACPP_GGUF="" | ||
@@ -677,3 +678,2 @@ HARBOR_LLAMACPP_MODEL="https://huggingface.co/microsoft/Phi-3.5-mini-instruct-gguf/blob/main/Phi-3-mini-4k-instruct-q4.gguf" | ||
| HARBOR_BROWSERUSE_VNC_PASSWORD="youvncpassword" | ||
| HARBOR_BROWSERUSE_OPEN_URL="http://localhost:34501" | ||
| HARBOR_BROWSERUSE_API_KEY="" | ||
@@ -709,2 +709,120 @@ HARBOR_BROWSERUSE_ANTHROPIC_API_KEY="" | ||
| # Presenton | ||
| HARBOR_PRESENTON_HOST_PORT=34531 | ||
| HARBOR_PRESENTON_IMAGE="ghcr.io/presenton/presenton" | ||
| HARBOR_PRESENTON_VERSION="latest" | ||
| HARBOR_PRESENTON_CAN_CHANGE_KEYS="true" | ||
| HARBOR_PRESENTON_LLM="ollama" | ||
| HARBOR_PRESENTON_OLLAMA_URL="" | ||
| HARBOR_PRESENTON_OLLAMA_MODEL="" | ||
| HARBOR_PRESENTON_OPENAI_API_KEY="" | ||
| HARBOR_PRESENTON_OPENAI_MODEL="" | ||
| HARBOR_PRESENTON_GOOGLE_API_KEY="" | ||
| HARBOR_PRESENTON_GOOGLE_MODEL="" | ||
| HARBOR_PRESENTON_ANTHROPIC_API_KEY="" | ||
| HARBOR_PRESENTON_ANTHROPIC_MODEL="" | ||
| HARBOR_PRESENTON_CUSTOM_LLM_URL="" | ||
| HARBOR_PRESENTON_CUSTOM_LLM_API_KEY="" | ||
| HARBOR_PRESENTON_CUSTOM_MODEL="" | ||
| HARBOR_PRESENTON_IMAGE_PROVIDER="pexels" | ||
| HARBOR_PRESENTON_PEXELS_API_KEY="" | ||
| HARBOR_PRESENTON_EXTENDED_REASONING="false" | ||
| HARBOR_PRESENTON_WEB_GROUNDING="false" | ||
| HARBOR_PRESENTON_TOOL_CALLS="true" | ||
| HARBOR_PRESENTON_DISABLE_THINKING="false" | ||
| HARBOR_PRESENTON_DATABASE_URL="" | ||
| HARBOR_PRESENTON_DISABLE_ANONYMOUS_TRACKING="true" | ||
| # Karakeep | ||
| HARBOR_KARAKEEP_HOST_PORT=34541 | ||
| HARBOR_KARAKEEP_IMAGE="ghcr.io/karakeep-app/karakeep" | ||
| HARBOR_KARAKEEP_VERSION="release" | ||
| HARBOR_KARAKEEP_CHROME_IMAGE="gcr.io/zenika-hub/alpine-chrome" | ||
| HARBOR_KARAKEEP_CHROME_VERSION="124" | ||
| HARBOR_KARAKEEP_MEILI_IMAGE="getmeili/meilisearch" | ||
| HARBOR_KARAKEEP_MEILI_VERSION="v1.13.3" | ||
| HARBOR_KARAKEEP_NEXTAUTH_SECRET="harbor_karakeep_secret_change_me" | ||
| HARBOR_KARAKEEP_MEILI_MASTER_KEY="harbor_karakeep_meili_key_change_me" | ||
| HARBOR_KARAKEEP_WORKSPACE="./karakeep/data" | ||
| HARBOR_KARAKEEP_INFERENCE_TEXT_MODEL="" | ||
| HARBOR_KARAKEEP_INFERENCE_IMAGE_MODEL="" | ||
| HARBOR_KARAKEEP_INFERENCE_CONTEXT_LENGTH=8192 | ||
| # Netdata | ||
| HARBOR_NETDATA_HOST_PORT=34551 | ||
| HARBOR_NETDATA_IMAGE="netdata/netdata" | ||
| HARBOR_NETDATA_VERSION="stable" | ||
| HARBOR_NETDATA_WORKSPACE="./netdata" | ||
| # Skip the new splash screen | ||
| HARBOR_NETDATA_OPEN_URL="http://localhost:34551/v3" | ||
| # Resume Matcher | ||
| HARBOR_RESUME_MATCHER_HOST_PORT=34561 | ||
| HARBOR_RESUME_MATCHER_BACKEND_HOST_PORT=34562 | ||
| HARBOR_RESUME_MATCHER_GIT_REF="https://github.com/srbhr/Resume-Matcher.git#main" | ||
| HARBOR_RESUME_MATCHER_WORKSPACE="./resume-matcher" | ||
| HARBOR_RESUME_MATCHER_SESSION_SECRET="harbor_resume_matcher_secret_change_me" | ||
| HARBOR_RESUME_MATCHER_LLM_PROVIDER="ollama" | ||
| HARBOR_RESUME_MATCHER_LLM_MODEL="gemma3:4b" | ||
| HARBOR_RESUME_MATCHER_EMBEDDING_PROVIDER="ollama" | ||
| HARBOR_RESUME_MATCHER_EMBEDDING_MODEL="bge-m3:latest" | ||
| # Drawio | ||
| HARBOR_DRAWIO_HOST_PORT=34571 | ||
| HARBOR_DRAWIO_IMAGE="ghcr.io/dayuanjiang/next-ai-draw-io" | ||
| HARBOR_DRAWIO_VERSION="latest" | ||
| HARBOR_DRAWIO_AI_PROVIDER="ollama" | ||
| HARBOR_DRAWIO_AI_MODEL="qwen3:30b" | ||
| HARBOR_DRAWIO_TEMPERATURE="" | ||
| HARBOR_DRAWIO_ACCESS_CODE="" | ||
| # MindsDB | ||
| HARBOR_MINDSDB_HOST_PORT=34581 | ||
| HARBOR_MINDSDB_MYSQL_HOST_PORT=34582 | ||
| HARBOR_MINDSDB_IMAGE="mindsdb/mindsdb" | ||
| HARBOR_MINDSDB_VERSION="latest" | ||
| HARBOR_MINDSDB_WORKSPACE="./mindsdb/data" | ||
| HARBOR_MINDSDB_APIS="http,mysql" | ||
| HARBOR_MINDSDB_USERNAME="" | ||
| HARBOR_MINDSDB_PASSWORD="" | ||
| HARBOR_MINDSDB_OLLAMA_MODEL="llama3.1:8b" | ||
| # Sim Studio | ||
| HARBOR_SIM_HOST_PORT=34591 | ||
| HARBOR_SIM_REALTIME_HOST_PORT=34592 | ||
| HARBOR_SIM_DB_HOST_PORT=34593 | ||
| HARBOR_SIM_IMAGE="ghcr.io/simstudioai/simstudio" | ||
| HARBOR_SIM_REALTIME_IMAGE="ghcr.io/simstudioai/realtime" | ||
| HARBOR_SIM_MIGRATIONS_IMAGE="ghcr.io/simstudioai/migrations" | ||
| HARBOR_SIM_VERSION="latest" | ||
| HARBOR_SIM_DB_IMAGE="pgvector/pgvector" | ||
| HARBOR_SIM_DB_VERSION="pg17" | ||
| HARBOR_SIM_WORKSPACE="./sim" | ||
| HARBOR_SIM_DB_NAME="simstudio" | ||
| HARBOR_SIM_DB_USER="postgres" | ||
| HARBOR_SIM_DB_PASSWORD="harbor_sim_postgres_password" | ||
| HARBOR_SIM_AUTH_SECRET="harbor_sim_auth_secret_change_me_32chars" | ||
| HARBOR_SIM_ENCRYPTION_KEY="harbor_sim_encryption_key_change_me_32ch" | ||
| HARBOR_SIM_INTERNAL_API_SECRET="harbor_sim_internal_api_secret_32char" | ||
| HARBOR_SIM_OLLAMA_URL="" | ||
| # Onyx (RAG Platform) | ||
| HARBOR_ONYX_HOST_PORT=34601 | ||
| HARBOR_ONYX_VERSION="latest" | ||
| HARBOR_ONYX_VESPA_VERSION="8.277.17" | ||
| HARBOR_ONYX_MINIO_VERSION="latest" | ||
| HARBOR_ONYX_WORKSPACE="./onyx/data" | ||
| HARBOR_ONYX_AUTH_TYPE="disabled" | ||
| HARBOR_ONYX_DB_USER="postgres" | ||
| HARBOR_ONYX_DB_PASSWORD="harbor_onyx_db_password" | ||
| HARBOR_ONYX_DB_NAME="onyx" | ||
| HARBOR_ONYX_MINIO_USER="minioadmin" | ||
| HARBOR_ONYX_MINIO_PASSWORD="harbor_onyx_minio_password" | ||
| HARBOR_ONYX_MODEL_SERVER_HOST="" | ||
| HARBOR_ONYX_MODEL_SERVER_PORT=11434 | ||
| HARBOR_ONYX_DISABLE_MODEL_SERVER="true" | ||
| HARBOR_ONYX_DISABLE_STREAMING="false" | ||
| HARBOR_ONYX_DEFAULT_MODEL="llama3.2:3b" | ||
| HARBOR_ONYX_FAST_MODEL="llama3.2:3b" | ||
| # ============================================ | ||
@@ -721,2 +839,3 @@ # Service Configuration. | ||
| ANONYMIZED_TELEMETRY=false | ||
| DISABLE_ANONYMOUS_TRACKING=true | ||
@@ -723,0 +842,0 @@ # Open WebUI |
+2
-2
| [tool.poetry] | ||
| name = "llm-harbor" | ||
| version = "0.3.22" | ||
| version = "0.3.28" | ||
| description = "Effortlessly run LLM backends, APIs, frontends, and services with one command." | ||
@@ -12,3 +12,3 @@ repository = "https://github.com/av/harbor" | ||
| classifiers = ["Topic :: Utilities","Topic :: Scientific/Engineering :: Artificial Intelligence","Environment :: Console","License :: OSI Approved :: Apache Software License"] | ||
| include = [".aider.chat.history.md",".editorconfig",".github/FUNDING.yml",".github/copilot-new-service.md",".github/workflows/app-release.yml",".github/workflows/bench-docker.yml",".github/workflows/boost-docker.yml",".gitignore",".scripts/app.ts",".scripts/comment.ts",".scripts/deno.json",".scripts/deno.lock",".scripts/docs-to-app.ts",".scripts/docs.ts",".scripts/fluid.sh",".scripts/inliner.ts",".scripts/nbs.sh",".scripts/promx.sh",".scripts/release.sh",".scripts/scaffold.ts",".scripts/seed-cdi.ts",".scripts/seed-traefik.ts",".scripts/seed.ts",".scripts/terser.sh",".style.yapf",".vscode/settings.json","AGENTS.md","LICENSE","README.md","RELEASE.md","agent/.gitignore","agent/Dockerfile","agent/docker/services.d/agent.sh","agent/override.env","agent/requirements.txt","agent/src/agent.py","agent/src/chat.py","agent/src/chat_node.py","agent/src/config.py","agent/src/format.py","agent/src/llm.py","agent/src/log.py","agent/src/main.py","agent/src/tasks/chat_to_goal.py","agent/src/tasks/direct.py","agent/src/tasks/next_step.py","agent/src/tasks/plan.py","agent/src/tasks/refine.py","agentzero/.gitignore","agentzero/override.env","aichat/Dockerfile","aichat/configs/aichat.airllm.yml","aichat/configs/aichat.aphrodite.yml","aichat/configs/aichat.config.yml","aichat/configs/aichat.dify.yml","aichat/configs/aichat.ktransformers.yml","aichat/configs/aichat.litellm.yml","aichat/configs/aichat.llamacpp.yml","aichat/configs/aichat.mistralrs.yml","aichat/configs/aichat.ollama.yml","aichat/configs/aichat.sglang.yml","aichat/configs/aichat.tabbyapi.yml","aichat/configs/aichat.vllm.yml","aichat/override.env","aichat/start_aichat.sh","aider/configs/aider.airllm.yml","aider/configs/aider.aphrodite.yml","aider/configs/aider.config.yml","aider/configs/aider.dify.yml","aider/configs/aider.ktransformers.yml","aider/configs/aider.litellm.yml","aider/configs/aider.llamacpp.yml","aider/configs/aider.mistralrs.yml","aider/configs/aider.ollama.yml","aider/configs/aider.sglang.yml","aider/configs/aider.tabbyapi.yml","aider/configs/aider.vllm.yml","aider/override.env","aider/start_aider.sh","airllm/Dockerfile","airllm/override.env","airllm/server.py","airweave/.gitignore","airweave/override.env","anythingllm/override.env","aphrodite/override.env","app/.editorconfig","app/.gitignore","app/README.md","app/app-icon.png","app/bun.lockb","app/index.html","app/package.json","app/postcss.config.js","app/public/tauri.svg","app/public/vite.svg","app/src-tauri/.gitignore","app/src-tauri/Cargo.lock","app/src-tauri/Cargo.toml","app/src-tauri/build.rs","app/src-tauri/capabilities/default.json","app/src-tauri/capabilities/desktop.json","app/src-tauri/icons/128x128.png","app/src-tauri/icons/128x128@2x.png","app/src-tauri/icons/32x32.png","app/src-tauri/icons/Square107x107Logo.png","app/src-tauri/icons/Square142x142Logo.png","app/src-tauri/icons/Square150x150Logo.png","app/src-tauri/icons/Square284x284Logo.png","app/src-tauri/icons/Square30x30Logo.png","app/src-tauri/icons/Square310x310Logo.png","app/src-tauri/icons/Square44x44Logo.png","app/src-tauri/icons/Square71x71Logo.png","app/src-tauri/icons/Square89x89Logo.png","app/src-tauri/icons/StoreLogo.png","app/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png","app/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png","app/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png","app/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png","app/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png","app/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png","app/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png","app/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png","app/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png","app/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png","app/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png","app/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png","app/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png","app/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png","app/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png","app/src-tauri/icons/icon.icns","app/src-tauri/icons/icon.ico","app/src-tauri/icons/icon.png","app/src-tauri/icons/ios/AppIcon-20x20@1x.png","app/src-tauri/icons/ios/AppIcon-20x20@2x-1.png","app/src-tauri/icons/ios/AppIcon-20x20@2x.png","app/src-tauri/icons/ios/AppIcon-20x20@3x.png","app/src-tauri/icons/ios/AppIcon-29x29@1x.png","app/src-tauri/icons/ios/AppIcon-29x29@2x-1.png","app/src-tauri/icons/ios/AppIcon-29x29@2x.png","app/src-tauri/icons/ios/AppIcon-29x29@3x.png","app/src-tauri/icons/ios/AppIcon-40x40@1x.png","app/src-tauri/icons/ios/AppIcon-40x40@2x-1.png","app/src-tauri/icons/ios/AppIcon-40x40@2x.png","app/src-tauri/icons/ios/AppIcon-40x40@3x.png","app/src-tauri/icons/ios/AppIcon-512@2x.png","app/src-tauri/icons/ios/AppIcon-60x60@2x.png","app/src-tauri/icons/ios/AppIcon-60x60@3x.png","app/src-tauri/icons/ios/AppIcon-76x76@1x.png","app/src-tauri/icons/ios/AppIcon-76x76@2x.png","app/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png","app/src-tauri/src/lib.rs","app/src-tauri/src/main.rs","app/src-tauri/src/tray.rs","app/src-tauri/tauri.conf.json","app/src/.gitignore","app/src/App.tsx","app/src/AppContent.tsx","app/src/AppRoutes.tsx","app/src/AppSidebar.tsx","app/src/BackButton.tsx","app/src/Button.tsx","app/src/ConfirmModal.tsx","app/src/DataClass.tsx","app/src/HarborLogo.tsx","app/src/IconButton.tsx","app/src/Icons.tsx","app/src/Loading.tsx","app/src/LostSquirrel.tsx","app/src/Modal.tsx","app/src/OverlayContext.tsx","app/src/ScrollToTop.tsx","app/src/SearchInput.tsx","app/src/Section.tsx","app/src/ServiceTags.tsx","app/src/assets/font/Inter-Black.woff2","app/src/assets/font/Inter-BlackItalic.woff2","app/src/assets/font/Inter-Bold.woff2","app/src/assets/font/Inter-BoldItalic.woff2","app/src/assets/font/Inter-ExtraBold.woff2","app/src/assets/font/Inter-ExtraBoldItalic.woff2","app/src/assets/font/Inter-ExtraLight.woff2","app/src/assets/font/Inter-ExtraLightItalic.woff2","app/src/assets/font/Inter-Italic.woff2","app/src/assets/font/Inter-Light.woff2","app/src/assets/font/Inter-LightItalic.woff2","app/src/assets/font/Inter-Medium.woff2","app/src/assets/font/Inter-MediumItalic.woff2","app/src/assets/font/Inter-Regular.woff2","app/src/assets/font/Inter-SemiBold.woff2","app/src/assets/font/Inter-SemiBoldItalic.woff2","app/src/assets/font/Inter-Thin.woff2","app/src/assets/font/Inter-ThinItalic.woff2","app/src/assets/font/InterDisplay-Black.woff2","app/src/assets/font/InterDisplay-BlackItalic.woff2","app/src/assets/font/InterDisplay-Bold.woff2","app/src/assets/font/InterDisplay-BoldItalic.woff2","app/src/assets/font/InterDisplay-ExtraBold.woff2","app/src/assets/font/InterDisplay-ExtraBoldItalic.woff2","app/src/assets/font/InterDisplay-ExtraLight.woff2","app/src/assets/font/InterDisplay-ExtraLightItalic.woff2","app/src/assets/font/InterDisplay-Italic.woff2","app/src/assets/font/InterDisplay-Light.woff2","app/src/assets/font/InterDisplay-LightItalic.woff2","app/src/assets/font/InterDisplay-Medium.woff2","app/src/assets/font/InterDisplay-MediumItalic.woff2","app/src/assets/font/InterDisplay-Regular.woff2","app/src/assets/font/InterDisplay-SemiBold.woff2","app/src/assets/font/InterDisplay-SemiBoldItalic.woff2","app/src/assets/font/InterDisplay-Thin.woff2","app/src/assets/font/InterDisplay-ThinItalic.woff2","app/src/assets/font/InterVariable-Italic.woff2","app/src/assets/font/InterVariable.woff2","app/src/cli/CLI.tsx","app/src/config/Config.tsx","app/src/config/ConfigNameModal.tsx","app/src/config/HarborConfig.ts","app/src/config/HarborConfigEditor.tsx","app/src/config/HarborConfigEntryEditor.tsx","app/src/config/HarborConfigSectionEditor.tsx","app/src/config/useHarborConfig.ts","app/src/configMetadata.tsx","app/src/font.css","app/src/home/Doctor.tsx","app/src/home/Home.tsx","app/src/home/ServiceCard.tsx","app/src/home/ServiceList.tsx","app/src/home/Version.tsx","app/src/home/useServiceList.tsx","app/src/localStorage.ts","app/src/main.css","app/src/main.tsx","app/src/service/ServiceActions.tsx","app/src/service/ServiceDescription.tsx","app/src/service/ServiceDetails.tsx","app/src/service/ServiceDocs.tsx","app/src/service/ServiceHandle.tsx","app/src/service/ServiceName.tsx","app/src/service/useCurrentService.ts","app/src/serviceActions.tsx","app/src/serviceMetadata.ts","app/src/settings/ProfileSelector.tsx","app/src/settings/Settings.tsx","app/src/squirrel.css","app/src/tags.css","app/src/theme.tsx","app/src/useArrayState.ts","app/src/useAutostart.tsx","app/src/useCalled.tsx","app/src/useDebounceCallback.tsx","app/src/useGlobalKeydown.tsx","app/src/useHarbor.tsx","app/src/useInvoke.tsx","app/src/useOpen.tsx","app/src/useSearch.tsx","app/src/useSelectedProfile.tsx","app/src/useSharedState.tsx","app/src/useStoredState.tsx","app/src/useUnmount.ts","app/src/utils.tsx","app/src/vite-env.d.ts","app/tailwind.config.js","app/tsconfig.json","app/tsconfig.node.json","app/vite.config.ts","autogpt/backends/autogpt.ollama.yml","autogpt/override.env","bench/Dockerfile","bench/defaultTasks.yml","bench/override.env","bench/src/bench.ts","bench/src/config.ts","bench/src/deps.ts","bench/src/judge.ts","bench/src/llm.ts","bench/src/log.ts","bench/src/report.ts","bench/src/run.ts","bench/src/runner.ts","bench/src/task.ts","bench/src/tasks.ts","bench/src/tsconfig.json","bench/src/utils.ts","bionicgpt/override.env","bionicgpt/start_envoy.sh","bolt/.env.local","bolt/Dockerfile","bolt/model.ts","bolt/override.env","boost/.dockerignore","boost/.python-version","boost/Dockerfile","boost/README.md","boost/override.env","boost/pyproject.toml","boost/src/chat.py","boost/src/chat_node.py","boost/src/config.py","boost/src/custom_modules/.gitkeep","boost/src/custom_modules/3t.py","boost/src/custom_modules/ambi.py","boost/src/custom_modules/artifacts/dnd.html","boost/src/custom_modules/artifacts/dnd_mini.html","boost/src/custom_modules/artifacts/dot.html","boost/src/custom_modules/artifacts/dot_mini.html","boost/src/custom_modules/artifacts/fluid.html","boost/src/custom_modules/artifacts/fluid/.gitignore","boost/src/custom_modules/artifacts/fluid/color.ts","boost/src/custom_modules/artifacts/fluid/config.ts","boost/src/custom_modules/artifacts/fluid/fluid.ts","boost/src/custom_modules/artifacts/fluid/graph.ts","boost/src/custom_modules/artifacts/fluid/index.pug","boost/src/custom_modules/artifacts/fluid/index.ts","boost/src/custom_modules/artifacts/fluid/listener.ts","boost/src/custom_modules/artifacts/fluid/package-lock.json","boost/src/custom_modules/artifacts/fluid/package.json","boost/src/custom_modules/artifacts/fluid/pointer.ts","boost/src/custom_modules/artifacts/fluid/utils.ts","boost/src/custom_modules/artifacts/fluid/viewport.ts","boost/src/custom_modules/artifacts/fluid/visualisation.ts","boost/src/custom_modules/artifacts/fluid/webgl.ts","boost/src/custom_modules/artifacts/fluid_mini.html","boost/src/custom_modules/artifacts/graph.html","boost/src/custom_modules/artifacts/graph_mini.html","boost/src/custom_modules/artifacts/nbs.html","boost/src/custom_modules/artifacts/nbs_mini.html","boost/src/custom_modules/artifacts/ponder.html","boost/src/custom_modules/artifacts/ponder_mini.html","boost/src/custom_modules/artifacts/promx/.gitignore","boost/src/custom_modules/artifacts/promx/index.css","boost/src/custom_modules/artifacts/promx/index.pug","boost/src/custom_modules/artifacts/promx/index.ts","boost/src/custom_modules/artifacts/promx/listener.ts","boost/src/custom_modules/artifacts/promx/package.json","boost/src/custom_modules/artifacts/promx/utils.ts","boost/src/custom_modules/artifacts/promx_mini.html","boost/src/custom_modules/artifacts/tokens.html","boost/src/custom_modules/artifacts/tokens_mini.html","boost/src/custom_modules/cea.py","boost/src/custom_modules/cex.py","boost/src/custom_modules/clarity.py","boost/src/custom_modules/crystal.py","boost/src/custom_modules/cssv.py","boost/src/custom_modules/discussurl.py","boost/src/custom_modules/example.py","boost/src/custom_modules/fml.py","boost/src/custom_modules/gact.py","boost/src/custom_modules/grug.py","boost/src/custom_modules/l33t.py","boost/src/custom_modules/meow.py","boost/src/custom_modules/ow.py","boost/src/custom_modules/pad.py","boost/src/custom_modules/pdsv.py","boost/src/custom_modules/polyglot.py","boost/src/custom_modules/recpl.py","boost/src/custom_modules/stcl.py","boost/src/custom_modules/tmsv.py","boost/src/custom_modules/tri.py","boost/src/custom_modules/unstable.py","boost/src/custom_modules/usv.py","boost/src/custom_modules/webui_artifact.py","boost/src/custom_modules/wswp.py","boost/src/debouncer.py","boost/src/events.py","boost/src/format.py","boost/src/llm.py","boost/src/llm_registry.py","boost/src/log.py","boost/src/main.py","boost/src/mapper.py","boost/src/middleware/request_id.py","boost/src/middleware/request_state.py","boost/src/mods.py","boost/src/modules/autotemp.py","boost/src/modules/concept.py","boost/src/modules/dnd.py","boost/src/modules/dot.py","boost/src/modules/eli5.py","boost/src/modules/g1.py","boost/src/modules/klmbr.py","boost/src/modules/markov.py","boost/src/modules/mcts.py","boost/src/modules/nbs.py","boost/src/modules/ponder.py","boost/src/modules/promx.py","boost/src/modules/r0.py","boost/src/modules/rcn.py","boost/src/modules/supersummer.py","boost/src/selection.py","boost/src/state.py","boost/src/tools/registry.py","boost/tests/protocol.http","boost/tests/variables.http","boost/uv.lock","browseruse/.dockerignore","browseruse/Dockerfile","browseruse/override.env","chatnio/.gitignore","chatnio/Dockerfile","chatnio/config/config.base.yml","chatnio/config/config.ollama.yml","chatnio/config/config.override.yml","chatnio/config/config.searxng.yml","chatnio/override.env","chatnio/start_chatnio.sh","chatui/configs/chatui.airllm.yml","chatui/configs/chatui.aphrodite.yml","chatui/configs/chatui.config.yml","chatui/configs/chatui.dify.yml","chatui/configs/chatui.litellm.yml","chatui/configs/chatui.llamacpp.yml","chatui/configs/chatui.mistralrs.yml","chatui/configs/chatui.ollama.yml","chatui/configs/chatui.searxng.yml","chatui/configs/chatui.tabbyapi.yml","chatui/configs/chatui.vllm.yml","chatui/envify.js","chatui/override.env","chatui/start_chatui.sh","cmdh/Dockerfile","cmdh/harbor.prompt","cmdh/ollama.ts","cmdh/override.env","cmdh/system.prompt","comfyui/.gitignore","comfyui/.gitkeep","comfyui/default-workflow.json","comfyui/override.env","comfyui/provisioning.sh","compose.agent.yml","compose.agentzero.yml","compose.aichat.yml","compose.aider.yml","compose.airllm.yml","compose.airweave.yml","compose.anythingllm.yml","compose.aphrodite.yml","compose.autogpt.yml","compose.bench.yml","compose.bionicgpt.yml","compose.bolt.yml","compose.boost.yml","compose.browseruse.yml","compose.cfd.yml","compose.chatnio.yml","compose.chatui.yml","compose.cmdh.yml","compose.comfyui.yml","compose.dify.yml","compose.docling.yml","compose.fabric.yml","compose.flowise.yml","compose.gptme.yml","compose.gum.yml","compose.hf.yml","compose.hfdownloader.yml","compose.hollama.yml","compose.jupyter.yml","compose.k6.yml","compose.kobold.yml","compose.ktransformers.yml","compose.langflow.yml","compose.langfuse.yml","compose.latentscope.yml","compose.ldr.yml","compose.librechat.yml","compose.libretranslate.yml","compose.litellm.yml","compose.litlytics.yml","compose.llamacpp.yml","compose.llamaswap.yml","compose.lmdeploy.yml","compose.lmeval.yml","compose.lobechat.yml","compose.localai.yml","compose.mcp-inspector.yml","compose.mcpo.yml","compose.metamcp.yml","compose.mikupad.yml","compose.mistralrs.yml","compose.modularmax.yml","compose.morphic.yml","compose.n8n.yml","compose.nexa.yml","compose.ol1.yml","compose.ollama.yml","compose.omnichain.yml","compose.omniparser.yml","compose.openhands.yml","compose.opint.yml","compose.optillm.yml","compose.oterm.yml","compose.parler.yml","compose.parllama.yml","compose.perplexica.yml","compose.perplexideez.yml","compose.pipelines.yml","compose.plandex.yml","compose.promptfoo.yml","compose.qdrant.yml","compose.qrgen.yml","compose.raglite.yml","compose.repopack.yml","compose.searxng.morphic.yml","compose.sglang.yml","compose.speaches.yml","compose.sqlchat.yml","compose.stt.yml","compose.supergateway.yml","compose.tabbyapi.yml","compose.textgrad.yml","compose.tgi.yml","compose.traefik.yml","compose.tts.yml","compose.txtairag.yml","compose.unsloth.yml","compose.vllm.yml","compose.webtop.yml","compose.webui.yml","compose.windmill.yml","compose.x.agentzero.ollama.yml","compose.x.aichat.ktransformers.yml","compose.x.aichat.ollama.yml","compose.x.aider.airllm.yml","compose.x.aider.aphrodite.yml","compose.x.aider.cdi.yml","compose.x.aider.dify.yml","compose.x.aider.ktransformers.yml","compose.x.aider.litellm.yml","compose.x.aider.llamacpp.yml","compose.x.aider.mistralrs.yml","compose.x.aider.nvidia.yml","compose.x.aider.ollama.yml","compose.x.aider.sglang.yml","compose.x.aider.tabbyapi.yml","compose.x.aider.vllm.yml","compose.x.anythingllm.llamacpp.yml","compose.x.anythingllm.ollama.yml","compose.x.anythingllm.searxng.yml","compose.x.aphrodite.cdi.yml","compose.x.aphrodite.nvidia.yml","compose.x.boost.airllm.yml","compose.x.boost.aphrodite.yml","compose.x.boost.dify.yml","compose.x.boost.ktransformers.yml","compose.x.boost.litellm.yml","compose.x.boost.llamacpp.yml","compose.x.boost.mistralrs.yml","compose.x.boost.ollama.yml","compose.x.boost.omnichain.yml","compose.x.boost.sglang.yml","compose.x.boost.tabbyapi.yml","compose.x.boost.vllm.yml","compose.x.browseruse.ollama.yml","compose.x.chatnio.ollama.yml","compose.x.chatnio.searxng.yml","compose.x.chatui.airllm.yml","compose.x.chatui.aphrodite.yml","compose.x.chatui.dify.yml","compose.x.chatui.litellm.yml","compose.x.chatui.llamacpp.yml","compose.x.chatui.mistralrs.yml","compose.x.chatui.ollama.yml","compose.x.chatui.searxng.yml","compose.x.chatui.tabbyapi.yml","compose.x.chatui.vllm.yml","compose.x.cmdh.harbor.yml","compose.x.cmdh.llamacpp.yml","compose.x.cmdh.ollama.yml","compose.x.cmdh.tgi.yml","compose.x.comfyui.cdi.yml","compose.x.comfyui.nvidia.yml","compose.x.docling.cdi.yml","compose.x.docling.nvidia.yml","compose.x.fabric.ollama.yml","compose.x.gptme.ollama.yml","compose.x.jupyter.cdi.yml","compose.x.jupyter.nvidia.yml","compose.x.kobold.cdi.yml","compose.x.kobold.nvidia.yml","compose.x.ktransformers.cdi.yml","compose.x.ktransformers.nvidia.yml","compose.x.langflow.litellm.yml","compose.x.ldr.ollama.yml","compose.x.ldr.searxng.yml","compose.x.litellm.langfuse.yml","compose.x.litellm.optillm.yml","compose.x.litellm.tgi.yml","compose.x.litellm.vllm.yml","compose.x.llamacpp.cdi.yml","compose.x.llamacpp.nvidia.yml","compose.x.llamaswap.cdi.yml","compose.x.llamaswap.nvidia.yml","compose.x.lmdeploy.cdi.yml","compose.x.lmdeploy.nvidia.yml","compose.x.lmeval.cdi.yml","compose.x.lmeval.nvidia.yml","compose.x.lobechat.ollama.yml","compose.x.localai.cdi.yml","compose.x.localai.nvidia.yml","compose.x.localai.rocm.yml","compose.x.mcpo.mcp-server-time.yml","compose.x.mcpo.metamcp.yml","compose.x.mistralrs.cdi.yml","compose.x.mistralrs.nvidia.yml","compose.x.morphic.ollama.yml","compose.x.nexa.cdi.yml","compose.x.nexa.nvidia.yml","compose.x.ollama.cdi.yml","compose.x.ollama.nvidia.yml","compose.x.ollama.rocm.yml","compose.x.ollama.webui.yml","compose.x.openhands.ollama.yml","compose.x.opint.aphrodite.yml","compose.x.opint.litellm.yml","compose.x.opint.llamacpp.yml","compose.x.opint.mistralrs.yml","compose.x.opint.ollama.yml","compose.x.opint.tabbyapi.yml","compose.x.opint.vllm.yml","compose.x.optillm.airllm.yml","compose.x.optillm.aphrodite.yml","compose.x.optillm.boost.yml","compose.x.optillm.cdi.yml","compose.x.optillm.dify.yml","compose.x.optillm.ktransformers.yml","compose.x.optillm.litellm.yml","compose.x.optillm.llamacpp.yml","compose.x.optillm.mistralrs.yml","compose.x.optillm.nexa.yml","compose.x.optillm.nvidia.yml","compose.x.optillm.ollama.yml","compose.x.optillm.omnichain.yml","compose.x.optillm.pipelines.yml","compose.x.optillm.sglang.yml","compose.x.optillm.tabbyapi.yml","compose.x.optillm.vllm.yml","compose.x.oterm.ollama.yml","compose.x.parler.cdi.yml","compose.x.parler.nvidia.yml","compose.x.parllama.ollama.yml","compose.x.perplexica.ollama.yml","compose.x.perplexica.searxng.yml","compose.x.perplexideez.mdc.yml","compose.x.perplexideez.ollama.yml","compose.x.perplexideez.searxng.yml","compose.x.plandex.litellm.yml","compose.x.plandex.llamacpp.yml","compose.x.plandex.ollama.yml","compose.x.promptfoo.ollama.yml","compose.x.raglite.ollama.yml","compose.x.raglite.vllm.yml","compose.x.sglang.cdi.yml","compose.x.sglang.nvidia.yml","compose.x.speaches.cdi.yml","compose.x.speaches.nvidia.yml","compose.x.sqlchat.ollama.yml","compose.x.stt.cdi.yml","compose.x.stt.nvidia.yml","compose.x.tabbyapi.cdi.yml","compose.x.tabbyapi.nvidia.yml","compose.x.textgrad.cdi.yml","compose.x.textgrad.nvidia.yml","compose.x.tgi.cdi.yml","compose.x.tgi.nvidia.yml","compose.x.traefik.agent.yml","compose.x.traefik.agentzero.yml","compose.x.traefik.aichat.yml","compose.x.traefik.aider.yml","compose.x.traefik.airllm.yml","compose.x.traefik.airweave.yml","compose.x.traefik.anythingllm.yml","compose.x.traefik.aphrodite.yml","compose.x.traefik.autogpt.yml","compose.x.traefik.bionicgpt.yml","compose.x.traefik.bolt.yml","compose.x.traefik.boost.yml","compose.x.traefik.browseruse.yml","compose.x.traefik.chatnio.yml","compose.x.traefik.chatui.yml","compose.x.traefik.comfyui.yml","compose.x.traefik.dify.yml","compose.x.traefik.docling.yml","compose.x.traefik.flowise.yml","compose.x.traefik.hollama.yml","compose.x.traefik.jupyter.yml","compose.x.traefik.k6.yml","compose.x.traefik.kobold.yml","compose.x.traefik.ktransformers.yml","compose.x.traefik.langflow.yml","compose.x.traefik.langfuse.yml","compose.x.traefik.latentscope.yml","compose.x.traefik.ldr.yml","compose.x.traefik.librechat.yml","compose.x.traefik.libretranslate.yml","compose.x.traefik.litellm.yml","compose.x.traefik.litlytics.yml","compose.x.traefik.llamacpp.yml","compose.x.traefik.llamaswap.yml","compose.x.traefik.lmdeploy.yml","compose.x.traefik.lobechat.yml","compose.x.traefik.localai.yml","compose.x.traefik.mcp-inspector.yml","compose.x.traefik.mcpo.yml","compose.x.traefik.metamcp.yml","compose.x.traefik.mikupad.yml","compose.x.traefik.mistralrs.yml","compose.x.traefik.modularmax.yml","compose.x.traefik.morphic.yml","compose.x.traefik.n8n.yml","compose.x.traefik.nexa.yml","compose.x.traefik.ol1.yml","compose.x.traefik.ollama.yml","compose.x.traefik.omnichain.yml","compose.x.traefik.omniparser.yml","compose.x.traefik.openhands.yml","compose.x.traefik.optillm.yml","compose.x.traefik.parler.yml","compose.x.traefik.perplexica.yml","compose.x.traefik.perplexideez.yml","compose.x.traefik.pipelines.yml","compose.x.traefik.plandex.yml","compose.x.traefik.promptfoo.yml","compose.x.traefik.qdrant.yml","compose.x.traefik.raglite.yml","compose.x.traefik.sglang.yml","compose.x.traefik.speaches.yml","compose.x.traefik.sqlchat.yml","compose.x.traefik.stt.yml","compose.x.traefik.tabbyapi.yml","compose.x.traefik.textgrad.yml","compose.x.traefik.tgi.yml","compose.x.traefik.tts.yml","compose.x.traefik.txtairag.yml","compose.x.traefik.unsloth.yml","compose.x.traefik.vllm.yml","compose.x.traefik.webtop.yml","compose.x.traefik.webui.yml","compose.x.tts.cdi.yml","compose.x.tts.nvidia.yml","compose.x.txtairag.cdi.yml","compose.x.txtairag.nvidia.yml","compose.x.txtairag.ollama.yml","compose.x.unsloth.cdi.yml","compose.x.unsloth.nvidia.yml","compose.x.vllm.cdi.yml","compose.x.vllm.nvidia.yml","compose.x.webui.agent.yml","compose.x.webui.airllm.yml","compose.x.webui.aphrodite.yml","compose.x.webui.boost.yml","compose.x.webui.comfyui.yml","compose.x.webui.dify.yml","compose.x.webui.kobold.yml","compose.x.webui.ktransformers.yml","compose.x.webui.litellm.yml","compose.x.webui.llamacpp.yml","compose.x.webui.llamaswap.yml","compose.x.webui.mcpo.metamcp.yml","compose.x.webui.mistralrs.yml","compose.x.webui.modularmax.yml","compose.x.webui.nexa.yml","compose.x.webui.ollama.yml","compose.x.webui.omnichain.yml","compose.x.webui.optillm.yml","compose.x.webui.parler.yml","compose.x.webui.pipelines.yml","compose.x.webui.searxng.ollama.yml","compose.x.webui.searxng.yml","compose.x.webui.sglang.yml","compose.x.webui.speaches.yml","compose.x.webui.stt.yml","compose.x.webui.tabbyapi.yml","compose.x.webui.tts.yml","compose.x.webui.vllm.yml","compose.yml","deno.lock","dify/certbot/README.md","dify/certbot/docker-entrypoint.sh","dify/certbot/update-cert.template.txt","dify/nginx/conf.d/default.conf.template","dify/nginx/docker-entrypoint.sh","dify/nginx/https.conf.template","dify/nginx/nginx.conf.template","dify/nginx/proxy.conf.template","dify/nginx/ssl/.gitkeep","dify/openai/Dockerfile","dify/openai/app.js","dify/openai/package.json","dify/override.env","dify/ssrf_proxy/docker-entrypoint.sh","dify/ssrf_proxy/squid.conf.template","docling/override.env","docs/1.-Harbor-User-Guide.md","docs/1.0.-Installing-Harbor.md","docs/1.1-Harbor-App.md","docs/1.2-Tools.md","docs/2.-Services.md","docs/2.1.1-Frontend&colon-Open-WebUI.md","docs/2.1.10-Frontend&colon-Chat-Nio.md","docs/2.1.11-Frontend&colon-Mikupad.md","docs/2.1.12-Frontend-oterm.md","docs/2.1.2-Frontend&colon-ComfyUI.md","docs/2.1.3-Frontend&colon-LibreChat.md","docs/2.1.4-Frontend&colon-ChatUI.md","docs/2.1.5-Frontend&colon-Lobe-Chat.md","docs/2.1.6-Frontend&colon-hollama.md","docs/2.1.7-Frontend&colon-parllama.md","docs/2.1.8-Frontend&colon-BionicGPT.md","docs/2.1.9-Frontend&colon-AnythingLLM.md","docs/2.2.1-Backend&colon-Ollama.md","docs/2.2.10-Backend&colon-lmdeploy.md","docs/2.2.11-Backend&colon-AirLLM.md","docs/2.2.12-Backend&colon-SGLang.md","docs/2.2.13-Backend&colon-KTransformers.md","docs/2.2.14-Backend&colon-Speaches.md","docs/2.2.15-Backend&colon-Nexa-SDK.md","docs/2.2.16-Backend&colon-KoboldCpp.md","docs/2.2.17-Backend-Modular-MAX.md","docs/2.2.2-Backend&colon-llama.cpp.md","docs/2.2.3-Backend&colon-vLLM.md","docs/2.2.4-Backend&colon-TabbyAPI.md","docs/2.2.5-Backend&colon-Aphrodite-Engine.md","docs/2.2.6-Backend&colon-mistral.rs.md","docs/2.2.7-Backend&colon-openedai-speech.md","docs/2.2.8-Backend&colon-Parler.md","docs/2.2.9-Backend&colon-text-generation-inference.md","docs/2.3.1-Satellite&colon-SearXNG.md","docs/2.3.10-Satellite&colon-fabric.md","docs/2.3.11-Satellite&colon-txtai-RAG.md","docs/2.3.12-Satellite&colon-TextGrad.md","docs/2.3.13-Satellite&colon-aider.md","docs/2.3.14-Satellite&colon-aichat.md","docs/2.3.15-Satellite&colon-AutoGPT.md","docs/2.3.16-Satellite&colon-omnichain.md","docs/2.3.17-Satellite&colon-lm-evaluation-harness.md","docs/2.3.18-Satellite&colon-JupyterLab.md","docs/2.3.19-Satellite&colon-ol1.md","docs/2.3.2-Satellite&colon-Perplexica.md","docs/2.3.20-Satellite&colon-OpenHands.md","docs/2.3.21-Satellite&colon-LitLytics.md","docs/2.3.22-Satellite&colon-Repopack.md","docs/2.3.23-Satellite&colon-n8n.md","docs/2.3.24-Satellite&colon-Bolt.new.md","docs/2.3.25-Satellite&colon-Open-WebUI-Pipelines.md","docs/2.3.26-Satellite&colon-Qdrant.md","docs/2.3.27-Satellite&colon-K6.md","docs/2.3.28-Satellite&colon-Promptfoo.md","docs/2.3.29-Satellite&colon-Webtop.md","docs/2.3.3-Satellite&colon-Dify.md","docs/2.3.30-Satellite&colon-OmniParser.md","docs/2.3.31-Satellite&colon-Flowise.md","docs/2.3.32-Satellite&colon-LangFlow.md","docs/2.3.33-Satellite&colon-OptiLLM.md","docs/2.3.34-Satellite-Morphic.md","docs/2.3.35-Satellite-SQL-Chat.md","docs/2.3.36-Satellite-gptme.md","docs/2.3.37-Satellite-traefik.md","docs/2.3.38-Satellite-Latent-Scope.md","docs/2.3.39-Satellite-RAGLite.md","docs/2.3.4-Satellite&colon-Plandex.md","docs/2.3.40-Satellite-llamaswap.md","docs/2.3.41-Satellite-libretranslate.md","docs/2.3.42-Satellite-metamcp.md","docs/2.3.43-Satellite-mcpo.md","docs/2.3.44-Satellite-supergateway.md","docs/2.3.45-Satellite-Local-Deep-Research.md","docs/2.3.46-Satellite-LocalAI.md","docs/2.3.47-Satellite-Agent-Zero.md","docs/2.3.48-Satellite-Airweave.md","docs/2.3.49-Satellite-Docling.md","docs/2.3.5-Satellite&colon-LiteLLM.md","docs/2.3.50-Satellite-Browser-Use.md","docs/2.3.51-Satellite-Unsloth.md","docs/2.3.52-Satellite-Windmill.md","docs/2.3.6-Satellite&colon-langfuse.md","docs/2.3.7-Satellite&colon-Open-Interpreter.md","docs/2.3.8-Satellite&colon-cloudflared.md","docs/2.3.9-Satellite&colon-cmdh.md","docs/3.-Harbor-CLI-Reference.md","docs/4.-Compatibility.md","docs/5.1.-Harbor-Bench.md","docs/5.2.-Harbor-Boost.md","docs/5.2.1.-Harbor-Boost-Custom-Modules.md","docs/5.2.2-Harbor-Boost-Configuration.md","docs/5.2.3-Harbor-Boost-Modules.md","docs/6.-Harbor-Compose-Setup.md","docs/7.-Adding-A-New-Service.md","docs/README.md","docs/_Footer.md","docs/anythingllm.png","docs/bench-report.png","docs/bench-superset.png","docs/bionicgpt.png","docs/bolt-local-qwen.png","docs/bolt-openailike.png","docs/boost-autotemp.png","docs/boost-behavior.png","docs/boost-concept.png","docs/boost-custom-example.png","docs/boost-dnd.png","docs/boost-dot.png","docs/boost-klmbr.png","docs/boost-markov.png","docs/boost-nbs.png","docs/boost-ponder.png","docs/boost-promx.png","docs/boost-r0.png","docs/boost-unstable.png","docs/boost.png","docs/chatnio-searxng.png","docs/chatui-searxng.png","docs/dify-harbor.png","docs/dify-ollama.png","docs/dify-sample-webllama.yml","docs/dify-sample-webrag.yml","docs/dify-searxng.png","docs/dify-webui.png","docs/flowise.png","docs/g1-reasoning.png","docs/gptme.png","docs/harbor-2.png","docs/harbor-agentzero.png","docs/harbor-airllm.png","docs/harbor-airweave.png","docs/harbor-app-2.png","docs/harbor-app-3.png","docs/harbor-app-4.png","docs/harbor-app-5.png","docs/harbor-app-6.png","docs/harbor-app-7.png","docs/harbor-app-8.png","docs/harbor-app-macos.png","docs/harbor-app.png","docs/harbor-arch-diag.png","docs/harbor-boost.png","docs/harbor-browseruse.gif","docs/harbor-comfyui-update.png","docs/harbor-docling.png","docs/harbor-history.gif","docs/harbor-k6.png","docs/harbor-latentscope.png","docs/harbor-ldr.png","docs/harbor-libretranslate.png","docs/harbor-metamcp.png","docs/harbor-morphic.png","docs/harbor-ollama-models.png","docs/harbor-oterm.png","docs/harbor-raglite.png","docs/harbor-tools.png","docs/harbor-top.png","docs/harbor-traefik.png","docs/harbor-unsloth.png","docs/harbor-webtop.png","docs/harbor-webui-json.png","docs/harbor-windmill.png","docs/image.png","docs/ktransformers-webui.png","docs/langflow.png","docs/langfuse.png","docs/litlytics-config.png","docs/litlytics.png","docs/mcp-inspector.png","docs/mcpo.png","docs/mikupad.png","docs/nexa-webui-error.png","docs/nexa-webui-workaround.png","docs/ol1.png","docs/omnichain-import.png","docs/omnichain.png","docs/omniparser.png","docs/openhands-config.png","docs/optillm.png","docs/parllama.png","docs/plandex-exec.png","docs/promptfoo-2.png","docs/promptfoo.png","docs/qr.png","docs/seaxng-webrag.png","docs/sqlchat.png","docs/tunnels.png","docs/txtairag.png","docs/webui-boost-status.png","docs/webui-pipelines-2.png","docs/webui-pipelines.png","fabric/override.env","flowise/.gitignore","flowise/override.env","gptme/Dockerfile","gptme/config.toml","gptme/override.env","gum/Dockerfile","harbor.sh","harbor/__init__.py","hf/Dockerfile","hf/override.env","hfdownloader/Dockerfile","hfdownloader/override.env","http-catalog/agent.http","http-catalog/airllm.http","http-catalog/aphrodite.http","http-catalog/boost.http","http-catalog/comfyui.http","http-catalog/dify.http","http-catalog/hf.http","http-catalog/kobold.http","http-catalog/ktransformers.http","http-catalog/langfuse.http","http-catalog/litellm.http","http-catalog/llamacpp.http","http-catalog/llamaswap.http","http-catalog/mistral.http","http-catalog/mistralrs.http","http-catalog/modularmax.http","http-catalog/nexa.http","http-catalog/ollama.http","http-catalog/ollama/completions.http","http-catalog/omnichain.http","http-catalog/optillm.http","http-catalog/parler.http","http-catalog/perplexideez.http","http-catalog/plandex.http","http-catalog/sglang.http","http-catalog/speaches.http","http-catalog/stt.http","http-catalog/tabbyapi.http","http-catalog/tgi.http","http-catalog/tts.http","http-catalog/vllm.http","http-catalog/webui.http","install.sh","jupyter/Dockerfile","jupyter/override.env","jupyter/workspace/000-sample.ipynb","k6/.gitignore","k6/dashboards/k6-load-testing-results_rev3.json","k6/dashboards/k6-openai-tokens_rev1.json","k6/docker-compose.yaml","k6/grafana-dashboard.yaml","k6/grafana-datasource.yaml","k6/override.env","k6/scripts/concurrent-prefix-caching.js","k6/scripts/example.js","k6/scripts/helpers/config.js","k6/scripts/helpers/http.js","k6/scripts/helpers/ollamaHttp.js","k6/scripts/helpers/openaiGeneric.js","k6/scripts/helpers/utils.js","k6/scripts/ollama.js","k6/scripts/openai-api-throughput.js","k6/scripts/payloads/completions.js","k6/scripts/payloads/ollama.js","kobold/.gitignore","kobold/override.env","ktransformers/Dockerfile","ktransformers/chat.py","ktransformers/override.env","langflow/.gitignore","langflow/override.env","langfuse/.gitignore","langfuse/.gitkeep","langfuse/override.env","latentscope/.gitignore","latentscope/Dockerfile","latentscope/override.env","ldr/.gitignore","ldr/override.env","librechat/.env","librechat/.gitignore","librechat/.gitkeep","librechat/librechat.yml","librechat/override.env","librechat/start_librechat.sh","libretranslate/.gitignore","libretranslate/override.env","litellm/litellm.config.yaml","litellm/litellm.langfuse.yaml","litellm/litellm.optillm.yaml","litellm/litellm.tgi.yaml","litellm/litellm.vllm.yaml","litellm/override.env","litellm/start_litellm.sh","litlytics/override.env","llamacpp/data/templates/tars.jinja","llamacpp/override.env","llamaswap/config.yaml","llamaswap/override.env","lmeval/Dockerfile","lmeval/override.env","lobechat/override.env","localai/.gitignore","localai/override.env","mcp/.gitignore","mcp/inspector-entrypoint.sh","mcp/override.env","mcpo/configs/mcpo.mcp-server-fetch.json","mcpo/configs/mcpo.mcp-server-time.json","mcpo/configs/mcpo.metamcp.json","mcpo/configs/mcpo.override.json","mcpo/override.env","mcpo/start_mcpo.sh","metamcp/.gitignore","metamcp/override.env","metamcp/start-sse.mjs","mikupad/override.env","modularmax/override.env","morphic/.gitignore","morphic/override.env","n8n/.gitignore","n8n/backup/credentials/9LdDQI9lblNjIGIZ.json","n8n/backup/workflows/6K7zSSBeRa0z1hi6.json","n8n/override.env","nexa/Dockerfile","nexa/nvidia.sh","nexa/override.env","nexa/proxy.Dockerfile","nexa/proxy_server.py","ol1/Dockerfile","ol1/README.md","ol1/app.py","ol1/override.env","ollama/.gitkeep","ollama/init_entrypoint.sh","ollama/modelfiles/README.md","ollama/modelfiles/flowaicom-flow-judge.Modelfile","ollama/modelfiles/gemma3-qat-tools.Modelfile","ollama/modelfiles/hargent.Modelfile","ollama/modelfiles/llama3.1_8b.Modelfile","ollama/modelfiles/llama3.1_q6k_48k.Modelfile","ollama/modelfiles/qwen2.5_7b_q8_32k.Modelfile","ollama/modelfiles/qwen2.5_7b_q8_48k.Modelfile","ollama/modelfiles/qwen2.5_q6k_32k.Modelfile","ollama/modelfiles/tars.Modelfile","ollama/override.env","omnichain/Dockerfile","omnichain/custom_nodes/example/example.maker.js","omnichain/entrypoint.sh","omnichain/examples/HarborChat.json","omnichain/files/harbor.prompt","omnichain/openai.ts","omnichain/override.env","omniparser/Dockerfile","omniparser/override.env","open-webui/configs/config.agent.json","open-webui/configs/config.airllm.json","open-webui/configs/config.aphrodite.json","open-webui/configs/config.boost.json","open-webui/configs/config.comfyui.json","open-webui/configs/config.dify.json","open-webui/configs/config.json","open-webui/configs/config.kobold.json","open-webui/configs/config.ktransformers.json","open-webui/configs/config.litellm.json","open-webui/configs/config.llamacpp.json","open-webui/configs/config.llamaswap.json","open-webui/configs/config.mistralrs.json","open-webui/configs/config.modularmax.json","open-webui/configs/config.nexa.json","open-webui/configs/config.ollama.json","open-webui/configs/config.omnichain.json","open-webui/configs/config.optillm.json","open-webui/configs/config.override.json","open-webui/configs/config.parler.json","open-webui/configs/config.pipelines.json","open-webui/configs/config.searxng.json","open-webui/configs/config.sglang.json","open-webui/configs/config.speaches.json","open-webui/configs/config.stt.json","open-webui/configs/config.tabbyapi.json","open-webui/configs/config.tts.json","open-webui/configs/config.vllm.json","open-webui/configs/config.x.mcpo.metamcp.json","open-webui/configs/config.x.searxng.ollama.json","open-webui/extras/artifact.py","open-webui/extras/mcts.py","open-webui/override.env","open-webui/start_webui.sh","openhands/.gitignore","openhands/override.env","openinterpreter/Dockerfile","openinterpreter/override.env","optillm/.gitignore","optillm/override.env","oterm/.gitignore","oterm/Dockerfile","oterm/override.env","package.json","parler/main.py","parler/override.env","parllama/Dockerfile","parllama/override.env","perplexica/override.env","perplexica/source.config.toml","perplexideez/.gitignore","perplexideez/override.env","pipelines/override.env","plandex/Dockerfile","plandex/override.env","poetry.lock","profiles/default.env","promptfoo/.gitignore","promptfoo/README.md","promptfoo/evals/hf/README.md","promptfoo/evals/hf/deno.json","promptfoo/evals/hf/deno.lock","promptfoo/evals/hf/generate.ts","promptfoo/evals/hf/promptfoo-errors.log","promptfoo/evals/hf/promptfooconfig.yaml","promptfoo/evals/hf/queries.ts","promptfoo/evals/hf/tests/category_sample.yaml","promptfoo/evals/hf/tests/challenge.yaml","promptfoo/evals/hf/tests/gpqa_diamond.yaml","promptfoo/evals/hf/tests/validate.yaml","promptfoo/evals/mini-mmlu-pro/generate.ts","promptfoo/examples/bias/README.md","promptfoo/examples/bias/promptfooconfig.yaml","promptfoo/examples/hello-promptfoo/README.md","promptfoo/examples/hello-promptfoo/promptfooconfig.yaml","promptfoo/examples/misguided/README.md","promptfoo/examples/misguided/promptfooconfig.yaml","promptfoo/examples/temp-test/README.md","promptfoo/examples/temp-test/promptfooconfig.yaml","promptfoo/override.env","pyproject.toml","qdrant/override.env","qrgen/Dockerfile","qrgen/gen.ts","raglite/.gitignore","raglite/Dockerfile","raglite/override.env","repopack/Dockerfile","repopack/override.env","requirements.sh","routines/.vscode/settings.json","routines/config.ts","routines/deno.json","routines/deno.lock","routines/docker.ts","routines/envManager.ts","routines/manageTools.ts","routines/mergeComposeFiles.ts","routines/paths.ts","routines/tsconfig.json","routines/types.ts","routines/utils.ts","searxng/override.env","searxng/settings.yml","searxng/settings.yml.new","searxng/uwsgi.ini","searxng/uwsgi.ini.new","shared/README.md","shared/harbor_entrypoint.sh","shared/json_config_merger.py","shared/proxy_user.sh","shared/yaml_config_merger.js","shared/yaml_config_merger.py","speaches/init_entrypoint.ts","speaches/override.env","sqlchat/override.env","stt/override.env","supergateway/override.env","tabbyapi/api_tokens.yml","tabbyapi/config.yml","tabbyapi/override.env","tabbyapi/start_tabbyapi.sh","textgrad/Dockerfile","textgrad/override.env","textgrad/workspace/000-sample.ipynb","tgi/override.env","tools/config.yaml","traefik/acme.json","traefik/override.env","traefik/traefik.yml","tts/config/pre_process_map.yaml","tts/config/voice_to_speaker.yaml","tts/override.env","txtairag/rag.py","unsloth/.gitignore","unsloth/override.env","vllm/Dockerfile","vllm/override.env","webtop/.gitignore","webtop/Dockerfile","webtop/init/create_symlink.sh","webtop/init/fix_desktop_app.sh","webtop/init/provision_docker_groups.sh","webtop/override.env","windmill/.gitignore","windmill/Caddyfile","windmill/override.env","yarn.lock"] | ||
| include = [".aider.chat.history.md",".editorconfig",".github/FUNDING.yml",".github/agents/new-service.agent.md",".github/copilot-new-service.md",".github/workflows/app-release.yml",".github/workflows/bench-docker.yml",".github/workflows/boost-docker.yml",".gitignore",".scripts/app.ts",".scripts/comment.ts",".scripts/deno.json",".scripts/deno.lock",".scripts/docs-to-app.ts",".scripts/docs.ts",".scripts/fluid.sh",".scripts/inliner.ts",".scripts/nbs.sh",".scripts/promx.sh",".scripts/release.sh",".scripts/scaffold.ts",".scripts/seed-cdi.ts",".scripts/seed-traefik.ts",".scripts/seed.ts",".scripts/terser.sh",".style.yapf",".vscode/settings.json","AGENTS.md","LICENSE","README.md","RELEASE.md","agent/.gitignore","agent/Dockerfile","agent/docker/services.d/agent.sh","agent/override.env","agent/requirements.txt","agent/src/agent.py","agent/src/chat.py","agent/src/chat_node.py","agent/src/config.py","agent/src/format.py","agent/src/llm.py","agent/src/log.py","agent/src/main.py","agent/src/tasks/chat_to_goal.py","agent/src/tasks/direct.py","agent/src/tasks/next_step.py","agent/src/tasks/plan.py","agent/src/tasks/refine.py","agentzero/.gitignore","agentzero/override.env","aichat/Dockerfile","aichat/configs/aichat.airllm.yml","aichat/configs/aichat.aphrodite.yml","aichat/configs/aichat.config.yml","aichat/configs/aichat.dify.yml","aichat/configs/aichat.ktransformers.yml","aichat/configs/aichat.litellm.yml","aichat/configs/aichat.llamacpp.yml","aichat/configs/aichat.mistralrs.yml","aichat/configs/aichat.ollama.yml","aichat/configs/aichat.sglang.yml","aichat/configs/aichat.tabbyapi.yml","aichat/configs/aichat.vllm.yml","aichat/override.env","aichat/start_aichat.sh","aider/configs/aider.airllm.yml","aider/configs/aider.aphrodite.yml","aider/configs/aider.config.yml","aider/configs/aider.dify.yml","aider/configs/aider.ktransformers.yml","aider/configs/aider.litellm.yml","aider/configs/aider.llamacpp.yml","aider/configs/aider.mistralrs.yml","aider/configs/aider.ollama.yml","aider/configs/aider.sglang.yml","aider/configs/aider.tabbyapi.yml","aider/configs/aider.vllm.yml","aider/override.env","aider/start_aider.sh","airllm/Dockerfile","airllm/override.env","airllm/server.py","airweave/.gitignore","airweave/override.env","anythingllm/override.env","aphrodite/override.env","app/.editorconfig","app/.gitignore","app/README.md","app/app-icon.png","app/bun.lockb","app/index.html","app/package.json","app/postcss.config.js","app/public/tauri.svg","app/public/vite.svg","app/src-tauri/.gitignore","app/src-tauri/Cargo.lock","app/src-tauri/Cargo.toml","app/src-tauri/build.rs","app/src-tauri/capabilities/default.json","app/src-tauri/capabilities/desktop.json","app/src-tauri/icons/128x128.png","app/src-tauri/icons/128x128@2x.png","app/src-tauri/icons/32x32.png","app/src-tauri/icons/Square107x107Logo.png","app/src-tauri/icons/Square142x142Logo.png","app/src-tauri/icons/Square150x150Logo.png","app/src-tauri/icons/Square284x284Logo.png","app/src-tauri/icons/Square30x30Logo.png","app/src-tauri/icons/Square310x310Logo.png","app/src-tauri/icons/Square44x44Logo.png","app/src-tauri/icons/Square71x71Logo.png","app/src-tauri/icons/Square89x89Logo.png","app/src-tauri/icons/StoreLogo.png","app/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png","app/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png","app/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png","app/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png","app/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png","app/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png","app/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png","app/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png","app/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png","app/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png","app/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png","app/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png","app/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png","app/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png","app/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png","app/src-tauri/icons/icon.icns","app/src-tauri/icons/icon.ico","app/src-tauri/icons/icon.png","app/src-tauri/icons/ios/AppIcon-20x20@1x.png","app/src-tauri/icons/ios/AppIcon-20x20@2x-1.png","app/src-tauri/icons/ios/AppIcon-20x20@2x.png","app/src-tauri/icons/ios/AppIcon-20x20@3x.png","app/src-tauri/icons/ios/AppIcon-29x29@1x.png","app/src-tauri/icons/ios/AppIcon-29x29@2x-1.png","app/src-tauri/icons/ios/AppIcon-29x29@2x.png","app/src-tauri/icons/ios/AppIcon-29x29@3x.png","app/src-tauri/icons/ios/AppIcon-40x40@1x.png","app/src-tauri/icons/ios/AppIcon-40x40@2x-1.png","app/src-tauri/icons/ios/AppIcon-40x40@2x.png","app/src-tauri/icons/ios/AppIcon-40x40@3x.png","app/src-tauri/icons/ios/AppIcon-512@2x.png","app/src-tauri/icons/ios/AppIcon-60x60@2x.png","app/src-tauri/icons/ios/AppIcon-60x60@3x.png","app/src-tauri/icons/ios/AppIcon-76x76@1x.png","app/src-tauri/icons/ios/AppIcon-76x76@2x.png","app/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png","app/src-tauri/src/lib.rs","app/src-tauri/src/main.rs","app/src-tauri/src/tray.rs","app/src-tauri/tauri.conf.json","app/src/.gitignore","app/src/App.tsx","app/src/AppContent.tsx","app/src/AppRoutes.tsx","app/src/AppSidebar.tsx","app/src/BackButton.tsx","app/src/Button.tsx","app/src/ConfirmModal.tsx","app/src/DataClass.tsx","app/src/HarborLogo.tsx","app/src/IconButton.tsx","app/src/Icons.tsx","app/src/Loading.tsx","app/src/LostSquirrel.tsx","app/src/Modal.tsx","app/src/OverlayContext.tsx","app/src/ScrollToTop.tsx","app/src/SearchInput.tsx","app/src/Section.tsx","app/src/ServiceTags.tsx","app/src/assets/font/Inter-Black.woff2","app/src/assets/font/Inter-BlackItalic.woff2","app/src/assets/font/Inter-Bold.woff2","app/src/assets/font/Inter-BoldItalic.woff2","app/src/assets/font/Inter-ExtraBold.woff2","app/src/assets/font/Inter-ExtraBoldItalic.woff2","app/src/assets/font/Inter-ExtraLight.woff2","app/src/assets/font/Inter-ExtraLightItalic.woff2","app/src/assets/font/Inter-Italic.woff2","app/src/assets/font/Inter-Light.woff2","app/src/assets/font/Inter-LightItalic.woff2","app/src/assets/font/Inter-Medium.woff2","app/src/assets/font/Inter-MediumItalic.woff2","app/src/assets/font/Inter-Regular.woff2","app/src/assets/font/Inter-SemiBold.woff2","app/src/assets/font/Inter-SemiBoldItalic.woff2","app/src/assets/font/Inter-Thin.woff2","app/src/assets/font/Inter-ThinItalic.woff2","app/src/assets/font/InterDisplay-Black.woff2","app/src/assets/font/InterDisplay-BlackItalic.woff2","app/src/assets/font/InterDisplay-Bold.woff2","app/src/assets/font/InterDisplay-BoldItalic.woff2","app/src/assets/font/InterDisplay-ExtraBold.woff2","app/src/assets/font/InterDisplay-ExtraBoldItalic.woff2","app/src/assets/font/InterDisplay-ExtraLight.woff2","app/src/assets/font/InterDisplay-ExtraLightItalic.woff2","app/src/assets/font/InterDisplay-Italic.woff2","app/src/assets/font/InterDisplay-Light.woff2","app/src/assets/font/InterDisplay-LightItalic.woff2","app/src/assets/font/InterDisplay-Medium.woff2","app/src/assets/font/InterDisplay-MediumItalic.woff2","app/src/assets/font/InterDisplay-Regular.woff2","app/src/assets/font/InterDisplay-SemiBold.woff2","app/src/assets/font/InterDisplay-SemiBoldItalic.woff2","app/src/assets/font/InterDisplay-Thin.woff2","app/src/assets/font/InterDisplay-ThinItalic.woff2","app/src/assets/font/InterVariable-Italic.woff2","app/src/assets/font/InterVariable.woff2","app/src/cli/CLI.tsx","app/src/config/Config.tsx","app/src/config/ConfigNameModal.tsx","app/src/config/HarborConfig.ts","app/src/config/HarborConfigEditor.tsx","app/src/config/HarborConfigEntryEditor.tsx","app/src/config/HarborConfigSectionEditor.tsx","app/src/config/useHarborConfig.ts","app/src/configMetadata.tsx","app/src/font.css","app/src/home/Doctor.tsx","app/src/home/Home.tsx","app/src/home/ServiceCard.tsx","app/src/home/ServiceList.tsx","app/src/home/Version.tsx","app/src/home/useServiceList.tsx","app/src/localStorage.ts","app/src/main.css","app/src/main.tsx","app/src/service/ServiceActions.tsx","app/src/service/ServiceDescription.tsx","app/src/service/ServiceDetails.tsx","app/src/service/ServiceDocs.tsx","app/src/service/ServiceHandle.tsx","app/src/service/ServiceName.tsx","app/src/service/useCurrentService.ts","app/src/serviceActions.tsx","app/src/serviceMetadata.ts","app/src/settings/ProfileSelector.tsx","app/src/settings/Settings.tsx","app/src/squirrel.css","app/src/tags.css","app/src/theme.tsx","app/src/useArrayState.ts","app/src/useAutostart.tsx","app/src/useCalled.tsx","app/src/useDebounceCallback.tsx","app/src/useGlobalKeydown.tsx","app/src/useHarbor.tsx","app/src/useInvoke.tsx","app/src/useOpen.tsx","app/src/useSearch.tsx","app/src/useSelectedProfile.tsx","app/src/useSharedState.tsx","app/src/useStoredState.tsx","app/src/useUnmount.ts","app/src/utils.tsx","app/src/vite-env.d.ts","app/tailwind.config.js","app/tsconfig.json","app/tsconfig.node.json","app/vite.config.ts","autogpt/backends/autogpt.ollama.yml","autogpt/override.env","bench/Dockerfile","bench/defaultTasks.yml","bench/override.env","bench/src/bench.ts","bench/src/config.ts","bench/src/deps.ts","bench/src/judge.ts","bench/src/llm.ts","bench/src/log.ts","bench/src/report.ts","bench/src/run.ts","bench/src/runner.ts","bench/src/task.ts","bench/src/tasks.ts","bench/src/tsconfig.json","bench/src/utils.ts","bionicgpt/override.env","bionicgpt/start_envoy.sh","bolt/.env.local","bolt/Dockerfile","bolt/model.ts","bolt/override.env","boost/.dockerignore","boost/.python-version","boost/Dockerfile","boost/README.md","boost/override.env","boost/pyproject.toml","boost/src/chat.py","boost/src/chat_node.py","boost/src/config.py","boost/src/custom_modules/.gitkeep","boost/src/custom_modules/3t.py","boost/src/custom_modules/ambi.py","boost/src/custom_modules/artifacts/dnd.html","boost/src/custom_modules/artifacts/dnd_mini.html","boost/src/custom_modules/artifacts/dot.html","boost/src/custom_modules/artifacts/dot_mini.html","boost/src/custom_modules/artifacts/fluid.html","boost/src/custom_modules/artifacts/fluid/.gitignore","boost/src/custom_modules/artifacts/fluid/color.ts","boost/src/custom_modules/artifacts/fluid/config.ts","boost/src/custom_modules/artifacts/fluid/fluid.ts","boost/src/custom_modules/artifacts/fluid/graph.ts","boost/src/custom_modules/artifacts/fluid/index.pug","boost/src/custom_modules/artifacts/fluid/index.ts","boost/src/custom_modules/artifacts/fluid/listener.ts","boost/src/custom_modules/artifacts/fluid/package-lock.json","boost/src/custom_modules/artifacts/fluid/package.json","boost/src/custom_modules/artifacts/fluid/pointer.ts","boost/src/custom_modules/artifacts/fluid/utils.ts","boost/src/custom_modules/artifacts/fluid/viewport.ts","boost/src/custom_modules/artifacts/fluid/visualisation.ts","boost/src/custom_modules/artifacts/fluid/webgl.ts","boost/src/custom_modules/artifacts/fluid_mini.html","boost/src/custom_modules/artifacts/graph.html","boost/src/custom_modules/artifacts/graph_mini.html","boost/src/custom_modules/artifacts/nbs.html","boost/src/custom_modules/artifacts/nbs_mini.html","boost/src/custom_modules/artifacts/ponder.html","boost/src/custom_modules/artifacts/ponder_mini.html","boost/src/custom_modules/artifacts/promx/.gitignore","boost/src/custom_modules/artifacts/promx/index.css","boost/src/custom_modules/artifacts/promx/index.pug","boost/src/custom_modules/artifacts/promx/index.ts","boost/src/custom_modules/artifacts/promx/listener.ts","boost/src/custom_modules/artifacts/promx/package.json","boost/src/custom_modules/artifacts/promx/utils.ts","boost/src/custom_modules/artifacts/promx_mini.html","boost/src/custom_modules/artifacts/tokens.html","boost/src/custom_modules/artifacts/tokens_mini.html","boost/src/custom_modules/cea.py","boost/src/custom_modules/cex.py","boost/src/custom_modules/clarity.py","boost/src/custom_modules/crystal.py","boost/src/custom_modules/cssv.py","boost/src/custom_modules/discussurl.py","boost/src/custom_modules/example.py","boost/src/custom_modules/fml.py","boost/src/custom_modules/gact.py","boost/src/custom_modules/grug.py","boost/src/custom_modules/l33t.py","boost/src/custom_modules/meow.py","boost/src/custom_modules/ow.py","boost/src/custom_modules/pad.py","boost/src/custom_modules/pdsv.py","boost/src/custom_modules/polyglot.py","boost/src/custom_modules/recpl.py","boost/src/custom_modules/stcl.py","boost/src/custom_modules/tmsv.py","boost/src/custom_modules/tri.py","boost/src/custom_modules/unstable.py","boost/src/custom_modules/usv.py","boost/src/custom_modules/webui_artifact.py","boost/src/custom_modules/wswp.py","boost/src/debouncer.py","boost/src/events.py","boost/src/format.py","boost/src/llm.py","boost/src/llm_registry.py","boost/src/log.py","boost/src/main.py","boost/src/mapper.py","boost/src/middleware/request_id.py","boost/src/middleware/request_state.py","boost/src/mods.py","boost/src/modules/autotemp.py","boost/src/modules/concept.py","boost/src/modules/dnd.py","boost/src/modules/dot.py","boost/src/modules/eli5.py","boost/src/modules/g1.py","boost/src/modules/klmbr.py","boost/src/modules/markov.py","boost/src/modules/mcts.py","boost/src/modules/nbs.py","boost/src/modules/ponder.py","boost/src/modules/promx.py","boost/src/modules/r0.py","boost/src/modules/rcn.py","boost/src/modules/supersummer.py","boost/src/selection.py","boost/src/state.py","boost/src/tools/registry.py","boost/tests/protocol.http","boost/tests/variables.http","boost/uv.lock","browseruse/.dockerignore","browseruse/Dockerfile","browseruse/override.env","chatnio/.gitignore","chatnio/Dockerfile","chatnio/config/config.base.yml","chatnio/config/config.ollama.yml","chatnio/config/config.override.yml","chatnio/config/config.searxng.yml","chatnio/override.env","chatnio/start_chatnio.sh","chatui/configs/chatui.airllm.yml","chatui/configs/chatui.aphrodite.yml","chatui/configs/chatui.config.yml","chatui/configs/chatui.dify.yml","chatui/configs/chatui.litellm.yml","chatui/configs/chatui.llamacpp.yml","chatui/configs/chatui.mistralrs.yml","chatui/configs/chatui.ollama.yml","chatui/configs/chatui.searxng.yml","chatui/configs/chatui.tabbyapi.yml","chatui/configs/chatui.vllm.yml","chatui/envify.js","chatui/override.env","chatui/start_chatui.sh","cmdh/Dockerfile","cmdh/harbor.prompt","cmdh/ollama.ts","cmdh/override.env","cmdh/system.prompt","comfyui/.gitignore","comfyui/.gitkeep","comfyui/default-workflow.json","comfyui/override.env","comfyui/provisioning.sh","compose.agent.yml","compose.agentzero.yml","compose.aichat.yml","compose.aider.yml","compose.airllm.yml","compose.airweave.yml","compose.anythingllm.yml","compose.aphrodite.yml","compose.autogpt.yml","compose.bench.yml","compose.bionicgpt.yml","compose.bolt.yml","compose.boost.yml","compose.browseruse.yml","compose.cfd.yml","compose.chatnio.yml","compose.chatui.yml","compose.cmdh.yml","compose.comfyui.yml","compose.dify.yml","compose.docling.yml","compose.drawio.yml","compose.fabric.yml","compose.flowise.yml","compose.gptme.yml","compose.gum.yml","compose.hf.yml","compose.hfdownloader.yml","compose.hollama.yml","compose.jupyter.yml","compose.k6.yml","compose.karakeep.yml","compose.kobold.yml","compose.ktransformers.yml","compose.langflow.yml","compose.langfuse.yml","compose.latentscope.yml","compose.ldr.yml","compose.librechat.yml","compose.libretranslate.yml","compose.litellm.yml","compose.litlytics.yml","compose.llamacpp.yml","compose.llamaswap.yml","compose.lmdeploy.yml","compose.lmeval.yml","compose.lobechat.yml","compose.localai.yml","compose.mcp-inspector.yml","compose.mcpo.yml","compose.metamcp.yml","compose.mikupad.yml","compose.mindsdb.yml","compose.mistralrs.yml","compose.modularmax.yml","compose.morphic.yml","compose.n8n.yml","compose.netdata.yml","compose.nexa.yml","compose.ol1.yml","compose.ollama.yml","compose.omnichain.yml","compose.omniparser.yml","compose.onyx.yml","compose.openhands.yml","compose.opint.yml","compose.optillm.yml","compose.oterm.yml","compose.parler.yml","compose.parllama.yml","compose.perplexica.yml","compose.perplexideez.yml","compose.pipelines.yml","compose.plandex.yml","compose.presenton.yml","compose.promptfoo.yml","compose.qdrant.yml","compose.qrgen.yml","compose.raglite.yml","compose.repopack.yml","compose.resume-matcher.yml","compose.searxng.morphic.yml","compose.sglang.yml","compose.sim.yml","compose.speaches.yml","compose.sqlchat.yml","compose.stt.yml","compose.supergateway.yml","compose.tabbyapi.yml","compose.textgrad.yml","compose.tgi.yml","compose.traefik.yml","compose.tts.yml","compose.txtairag.yml","compose.unsloth.yml","compose.vllm.yml","compose.webtop.yml","compose.webui.yml","compose.windmill.yml","compose.x.agentzero.ollama.yml","compose.x.aichat.ktransformers.yml","compose.x.aichat.ollama.yml","compose.x.aider.airllm.yml","compose.x.aider.aphrodite.yml","compose.x.aider.cdi.yml","compose.x.aider.dify.yml","compose.x.aider.ktransformers.yml","compose.x.aider.litellm.yml","compose.x.aider.llamacpp.yml","compose.x.aider.mistralrs.yml","compose.x.aider.nvidia.yml","compose.x.aider.ollama.yml","compose.x.aider.sglang.yml","compose.x.aider.tabbyapi.yml","compose.x.aider.vllm.yml","compose.x.anythingllm.llamacpp.yml","compose.x.anythingllm.ollama.yml","compose.x.anythingllm.searxng.yml","compose.x.aphrodite.cdi.yml","compose.x.aphrodite.nvidia.yml","compose.x.boost.airllm.yml","compose.x.boost.aphrodite.yml","compose.x.boost.dify.yml","compose.x.boost.ktransformers.yml","compose.x.boost.litellm.yml","compose.x.boost.llamacpp.yml","compose.x.boost.mistralrs.yml","compose.x.boost.ollama.yml","compose.x.boost.omnichain.yml","compose.x.boost.sglang.yml","compose.x.boost.tabbyapi.yml","compose.x.boost.vllm.yml","compose.x.browseruse.ollama.yml","compose.x.chatnio.ollama.yml","compose.x.chatnio.searxng.yml","compose.x.chatui.airllm.yml","compose.x.chatui.aphrodite.yml","compose.x.chatui.dify.yml","compose.x.chatui.litellm.yml","compose.x.chatui.llamacpp.yml","compose.x.chatui.mistralrs.yml","compose.x.chatui.ollama.yml","compose.x.chatui.searxng.yml","compose.x.chatui.tabbyapi.yml","compose.x.chatui.vllm.yml","compose.x.cmdh.harbor.yml","compose.x.cmdh.llamacpp.yml","compose.x.cmdh.ollama.yml","compose.x.cmdh.tgi.yml","compose.x.comfyui.cdi.yml","compose.x.comfyui.nvidia.yml","compose.x.docling.cdi.yml","compose.x.docling.nvidia.yml","compose.x.drawio.ollama.yml","compose.x.fabric.ollama.yml","compose.x.gptme.ollama.yml","compose.x.jupyter.cdi.yml","compose.x.jupyter.nvidia.yml","compose.x.karakeep.ollama.yml","compose.x.kobold.cdi.yml","compose.x.kobold.nvidia.yml","compose.x.ktransformers.cdi.yml","compose.x.ktransformers.nvidia.yml","compose.x.langflow.litellm.yml","compose.x.ldr.ollama.yml","compose.x.ldr.searxng.yml","compose.x.litellm.langfuse.yml","compose.x.litellm.optillm.yml","compose.x.litellm.tgi.yml","compose.x.litellm.vllm.yml","compose.x.llamacpp.cdi.yml","compose.x.llamacpp.nvidia.yml","compose.x.llamaswap.cdi.yml","compose.x.llamaswap.nvidia.yml","compose.x.lmdeploy.cdi.yml","compose.x.lmdeploy.nvidia.yml","compose.x.lmeval.cdi.yml","compose.x.lmeval.nvidia.yml","compose.x.lobechat.ollama.yml","compose.x.localai.cdi.yml","compose.x.localai.nvidia.yml","compose.x.localai.rocm.yml","compose.x.mcpo.mcp-server-time.yml","compose.x.mcpo.metamcp.yml","compose.x.mindsdb.llamacpp.yml","compose.x.mindsdb.ollama.yml","compose.x.mindsdb.vllm.yml","compose.x.mistralrs.cdi.yml","compose.x.mistralrs.nvidia.yml","compose.x.morphic.ollama.yml","compose.x.nexa.cdi.yml","compose.x.nexa.nvidia.yml","compose.x.ollama.cdi.yml","compose.x.ollama.nvidia.yml","compose.x.ollama.rocm.yml","compose.x.ollama.webui.yml","compose.x.openhands.ollama.yml","compose.x.opint.aphrodite.yml","compose.x.opint.litellm.yml","compose.x.opint.llamacpp.yml","compose.x.opint.mistralrs.yml","compose.x.opint.ollama.yml","compose.x.opint.tabbyapi.yml","compose.x.opint.vllm.yml","compose.x.optillm.airllm.yml","compose.x.optillm.aphrodite.yml","compose.x.optillm.boost.yml","compose.x.optillm.cdi.yml","compose.x.optillm.dify.yml","compose.x.optillm.ktransformers.yml","compose.x.optillm.litellm.yml","compose.x.optillm.llamacpp.yml","compose.x.optillm.mistralrs.yml","compose.x.optillm.nexa.yml","compose.x.optillm.nvidia.yml","compose.x.optillm.ollama.yml","compose.x.optillm.omnichain.yml","compose.x.optillm.pipelines.yml","compose.x.optillm.sglang.yml","compose.x.optillm.tabbyapi.yml","compose.x.optillm.vllm.yml","compose.x.oterm.ollama.yml","compose.x.parler.cdi.yml","compose.x.parler.nvidia.yml","compose.x.parllama.ollama.yml","compose.x.perplexica.ollama.yml","compose.x.perplexica.searxng.yml","compose.x.perplexideez.mdc.yml","compose.x.perplexideez.ollama.yml","compose.x.perplexideez.searxng.yml","compose.x.plandex.litellm.yml","compose.x.plandex.llamacpp.yml","compose.x.plandex.ollama.yml","compose.x.presenton.cdi.yml","compose.x.presenton.nvidia.yml","compose.x.presenton.ollama.yml","compose.x.promptfoo.ollama.yml","compose.x.raglite.ollama.yml","compose.x.raglite.vllm.yml","compose.x.resume-matcher.ollama.yml","compose.x.sglang.cdi.yml","compose.x.sglang.nvidia.yml","compose.x.sim.ollama.yml","compose.x.speaches.cdi.yml","compose.x.speaches.nvidia.yml","compose.x.sqlchat.ollama.yml","compose.x.stt.cdi.yml","compose.x.stt.nvidia.yml","compose.x.tabbyapi.cdi.yml","compose.x.tabbyapi.nvidia.yml","compose.x.textgrad.cdi.yml","compose.x.textgrad.nvidia.yml","compose.x.tgi.cdi.yml","compose.x.tgi.nvidia.yml","compose.x.traefik.agent.yml","compose.x.traefik.agentzero.yml","compose.x.traefik.aichat.yml","compose.x.traefik.aider.yml","compose.x.traefik.airllm.yml","compose.x.traefik.airweave.yml","compose.x.traefik.anythingllm.yml","compose.x.traefik.aphrodite.yml","compose.x.traefik.autogpt.yml","compose.x.traefik.bionicgpt.yml","compose.x.traefik.bolt.yml","compose.x.traefik.boost.yml","compose.x.traefik.browseruse.yml","compose.x.traefik.chatnio.yml","compose.x.traefik.chatui.yml","compose.x.traefik.comfyui.yml","compose.x.traefik.dify.yml","compose.x.traefik.docling.yml","compose.x.traefik.drawio.yml","compose.x.traefik.flowise.yml","compose.x.traefik.hollama.yml","compose.x.traefik.jupyter.yml","compose.x.traefik.k6.yml","compose.x.traefik.karakeep.yml","compose.x.traefik.kobold.yml","compose.x.traefik.ktransformers.yml","compose.x.traefik.langflow.yml","compose.x.traefik.langfuse.yml","compose.x.traefik.latentscope.yml","compose.x.traefik.ldr.yml","compose.x.traefik.librechat.yml","compose.x.traefik.libretranslate.yml","compose.x.traefik.litellm.yml","compose.x.traefik.litlytics.yml","compose.x.traefik.llamacpp.yml","compose.x.traefik.llamaswap.yml","compose.x.traefik.lmdeploy.yml","compose.x.traefik.lobechat.yml","compose.x.traefik.localai.yml","compose.x.traefik.mcp-inspector.yml","compose.x.traefik.mcpo.yml","compose.x.traefik.metamcp.yml","compose.x.traefik.mikupad.yml","compose.x.traefik.mindsdb.yml","compose.x.traefik.mistralrs.yml","compose.x.traefik.modularmax.yml","compose.x.traefik.morphic.yml","compose.x.traefik.n8n.yml","compose.x.traefik.netdata.yml","compose.x.traefik.nexa.yml","compose.x.traefik.ol1.yml","compose.x.traefik.ollama.yml","compose.x.traefik.omnichain.yml","compose.x.traefik.omniparser.yml","compose.x.traefik.openhands.yml","compose.x.traefik.optillm.yml","compose.x.traefik.parler.yml","compose.x.traefik.perplexica.yml","compose.x.traefik.perplexideez.yml","compose.x.traefik.pipelines.yml","compose.x.traefik.plandex.yml","compose.x.traefik.presenton.yml","compose.x.traefik.promptfoo.yml","compose.x.traefik.qdrant.yml","compose.x.traefik.raglite.yml","compose.x.traefik.resume-matcher.yml","compose.x.traefik.sglang.yml","compose.x.traefik.sim.yml","compose.x.traefik.speaches.yml","compose.x.traefik.sqlchat.yml","compose.x.traefik.stt.yml","compose.x.traefik.tabbyapi.yml","compose.x.traefik.textgrad.yml","compose.x.traefik.tgi.yml","compose.x.traefik.tts.yml","compose.x.traefik.txtairag.yml","compose.x.traefik.unsloth.yml","compose.x.traefik.vllm.yml","compose.x.traefik.webtop.yml","compose.x.traefik.webui.yml","compose.x.traefik.windmill.yml","compose.x.tts.cdi.yml","compose.x.tts.nvidia.yml","compose.x.txtairag.cdi.yml","compose.x.txtairag.nvidia.yml","compose.x.txtairag.ollama.yml","compose.x.unsloth.cdi.yml","compose.x.unsloth.nvidia.yml","compose.x.vllm.cdi.yml","compose.x.vllm.nvidia.yml","compose.x.webui.agent.yml","compose.x.webui.airllm.yml","compose.x.webui.aphrodite.yml","compose.x.webui.boost.yml","compose.x.webui.comfyui.yml","compose.x.webui.dify.yml","compose.x.webui.kobold.yml","compose.x.webui.ktransformers.yml","compose.x.webui.litellm.yml","compose.x.webui.llamacpp.yml","compose.x.webui.llamaswap.yml","compose.x.webui.mcpo.metamcp.yml","compose.x.webui.mistralrs.yml","compose.x.webui.modularmax.yml","compose.x.webui.nexa.yml","compose.x.webui.ollama.yml","compose.x.webui.omnichain.yml","compose.x.webui.optillm.yml","compose.x.webui.parler.yml","compose.x.webui.pipelines.yml","compose.x.webui.searxng.ollama.yml","compose.x.webui.searxng.yml","compose.x.webui.sglang.yml","compose.x.webui.speaches.yml","compose.x.webui.stt.yml","compose.x.webui.tabbyapi.yml","compose.x.webui.tts.yml","compose.x.webui.vllm.yml","compose.yml","deno.lock","dify/certbot/README.md","dify/certbot/docker-entrypoint.sh","dify/certbot/update-cert.template.txt","dify/nginx/conf.d/default.conf.template","dify/nginx/docker-entrypoint.sh","dify/nginx/https.conf.template","dify/nginx/nginx.conf.template","dify/nginx/proxy.conf.template","dify/nginx/ssl/.gitkeep","dify/openai/Dockerfile","dify/openai/app.js","dify/openai/package.json","dify/override.env","dify/ssrf_proxy/docker-entrypoint.sh","dify/ssrf_proxy/squid.conf.template","docling/override.env","docs/1.-Harbor-User-Guide.md","docs/1.0.-Installing-Harbor.md","docs/1.1-Harbor-App.md","docs/1.2-Tools.md","docs/2.-Services.md","docs/2.1.1-Frontend&colon-Open-WebUI.md","docs/2.1.10-Frontend&colon-Chat-Nio.md","docs/2.1.11-Frontend&colon-Mikupad.md","docs/2.1.12-Frontend-oterm.md","docs/2.1.13-Frontend-Presenton.md","docs/2.1.14-Frontend-Onyx.md","docs/2.1.2-Frontend&colon-ComfyUI.md","docs/2.1.3-Frontend&colon-LibreChat.md","docs/2.1.4-Frontend&colon-ChatUI.md","docs/2.1.5-Frontend&colon-Lobe-Chat.md","docs/2.1.6-Frontend&colon-hollama.md","docs/2.1.7-Frontend&colon-parllama.md","docs/2.1.8-Frontend&colon-BionicGPT.md","docs/2.1.9-Frontend&colon-AnythingLLM.md","docs/2.2.1-Backend&colon-Ollama.md","docs/2.2.10-Backend&colon-lmdeploy.md","docs/2.2.11-Backend&colon-AirLLM.md","docs/2.2.12-Backend&colon-SGLang.md","docs/2.2.13-Backend&colon-KTransformers.md","docs/2.2.14-Backend&colon-Speaches.md","docs/2.2.15-Backend&colon-Nexa-SDK.md","docs/2.2.16-Backend&colon-KoboldCpp.md","docs/2.2.17-Backend-Modular-MAX.md","docs/2.2.2-Backend&colon-llama.cpp.md","docs/2.2.3-Backend&colon-vLLM.md","docs/2.2.4-Backend&colon-TabbyAPI.md","docs/2.2.5-Backend&colon-Aphrodite-Engine.md","docs/2.2.6-Backend&colon-mistral.rs.md","docs/2.2.7-Backend&colon-openedai-speech.md","docs/2.2.8-Backend&colon-Parler.md","docs/2.2.9-Backend&colon-text-generation-inference.md","docs/2.3.1-Satellite&colon-SearXNG.md","docs/2.3.10-Satellite&colon-fabric.md","docs/2.3.11-Satellite&colon-txtai-RAG.md","docs/2.3.12-Satellite&colon-TextGrad.md","docs/2.3.13-Satellite&colon-aider.md","docs/2.3.14-Satellite&colon-aichat.md","docs/2.3.15-Satellite&colon-AutoGPT.md","docs/2.3.16-Satellite&colon-omnichain.md","docs/2.3.17-Satellite&colon-lm-evaluation-harness.md","docs/2.3.18-Satellite&colon-JupyterLab.md","docs/2.3.19-Satellite&colon-ol1.md","docs/2.3.2-Satellite&colon-Perplexica.md","docs/2.3.20-Satellite&colon-OpenHands.md","docs/2.3.21-Satellite&colon-LitLytics.md","docs/2.3.22-Satellite&colon-Repopack.md","docs/2.3.23-Satellite&colon-n8n.md","docs/2.3.24-Satellite&colon-Bolt.new.md","docs/2.3.25-Satellite&colon-Open-WebUI-Pipelines.md","docs/2.3.26-Satellite&colon-Qdrant.md","docs/2.3.27-Satellite&colon-K6.md","docs/2.3.28-Satellite&colon-Promptfoo.md","docs/2.3.29-Satellite&colon-Webtop.md","docs/2.3.3-Satellite&colon-Dify.md","docs/2.3.30-Satellite&colon-OmniParser.md","docs/2.3.31-Satellite&colon-Flowise.md","docs/2.3.32-Satellite&colon-LangFlow.md","docs/2.3.33-Satellite&colon-OptiLLM.md","docs/2.3.34-Satellite-Morphic.md","docs/2.3.35-Satellite-SQL-Chat.md","docs/2.3.36-Satellite-gptme.md","docs/2.3.37-Satellite-traefik.md","docs/2.3.38-Satellite-Latent-Scope.md","docs/2.3.39-Satellite-RAGLite.md","docs/2.3.4-Satellite&colon-Plandex.md","docs/2.3.40-Satellite-llamaswap.md","docs/2.3.41-Satellite-libretranslate.md","docs/2.3.42-Satellite-metamcp.md","docs/2.3.43-Satellite-mcpo.md","docs/2.3.44-Satellite-supergateway.md","docs/2.3.45-Satellite-Local-Deep-Research.md","docs/2.3.46-Satellite-LocalAI.md","docs/2.3.47-Satellite-Agent-Zero.md","docs/2.3.48-Satellite-Airweave.md","docs/2.3.49-Satellite-Docling.md","docs/2.3.5-Satellite&colon-LiteLLM.md","docs/2.3.50-Satellite-Browser-Use.md","docs/2.3.51-Satellite-Unsloth.md","docs/2.3.52-Satellite-Windmill.md","docs/2.3.53-Satellite-Karakeep.md","docs/2.3.54-Satellite-Netdata.md","docs/2.3.55-Satellite-Resume-Matcher.md","docs/2.3.56-Satellite-Drawio.md","docs/2.3.57-Satellite-MindsDB.md","docs/2.3.58-Satellite-Sim-Studio.md","docs/2.3.6-Satellite&colon-langfuse.md","docs/2.3.7-Satellite&colon-Open-Interpreter.md","docs/2.3.8-Satellite&colon-cloudflared.md","docs/2.3.9-Satellite&colon-cmdh.md","docs/3.-Harbor-CLI-Reference.md","docs/4.-Compatibility.md","docs/5.1.-Harbor-Bench.md","docs/5.2.-Harbor-Boost.md","docs/5.2.1.-Harbor-Boost-Custom-Modules.md","docs/5.2.2-Harbor-Boost-Configuration.md","docs/5.2.3-Harbor-Boost-Modules.md","docs/6.-Harbor-Compose-Setup.md","docs/7.-Adding-A-New-Service.md","docs/README.md","docs/_Footer.md","docs/anythingllm.png","docs/bench-report.png","docs/bench-superset.png","docs/bionicgpt.png","docs/bolt-local-qwen.png","docs/bolt-openailike.png","docs/boost-autotemp.png","docs/boost-behavior.png","docs/boost-concept.png","docs/boost-custom-example.png","docs/boost-dnd.png","docs/boost-dot.png","docs/boost-klmbr.png","docs/boost-markov.png","docs/boost-nbs.png","docs/boost-ponder.png","docs/boost-promx.png","docs/boost-r0.png","docs/boost-unstable.png","docs/boost.png","docs/chatnio-searxng.png","docs/chatui-searxng.png","docs/dify-harbor.png","docs/dify-ollama.png","docs/dify-sample-webllama.yml","docs/dify-sample-webrag.yml","docs/dify-searxng.png","docs/dify-webui.png","docs/flowise.png","docs/g1-reasoning.png","docs/gptme.png","docs/harbor-2.png","docs/harbor-agentzero.png","docs/harbor-airllm.png","docs/harbor-airweave.png","docs/harbor-app-2.png","docs/harbor-app-3.png","docs/harbor-app-4.png","docs/harbor-app-5.png","docs/harbor-app-6.png","docs/harbor-app-7.png","docs/harbor-app-8.png","docs/harbor-app-macos.png","docs/harbor-app.png","docs/harbor-arch-diag.png","docs/harbor-boost.png","docs/harbor-browseruse.gif","docs/harbor-comfyui-update.png","docs/harbor-docling.png","docs/harbor-drawio-settings.png","docs/harbor-drawio.png","docs/harbor-history.gif","docs/harbor-k6.png","docs/harbor-karakeep.png","docs/harbor-latentscope.png","docs/harbor-ldr.png","docs/harbor-libretranslate.png","docs/harbor-metamcp.png","docs/harbor-mindsdb.png","docs/harbor-morphic.png","docs/harbor-netdata.png","docs/harbor-ollama-models.png","docs/harbor-onyx.png","docs/harbor-oterm.png","docs/harbor-presenton.png","docs/harbor-raglite.png","docs/harbor-resume-matcher.png","docs/harbor-sim.png","docs/harbor-tools.png","docs/harbor-top.png","docs/harbor-traefik.png","docs/harbor-unsloth.png","docs/harbor-webtop.png","docs/harbor-webui-json.png","docs/harbor-windmill.png","docs/image.png","docs/ktransformers-webui.png","docs/langflow.png","docs/langfuse.png","docs/litlytics-config.png","docs/litlytics.png","docs/mcp-inspector.png","docs/mcpo.png","docs/mikupad.png","docs/nexa-webui-error.png","docs/nexa-webui-workaround.png","docs/ol1.png","docs/omnichain-import.png","docs/omnichain.png","docs/omniparser.png","docs/openhands-config.png","docs/optillm.png","docs/parllama.png","docs/plandex-exec.png","docs/promptfoo-2.png","docs/promptfoo.png","docs/qr.png","docs/seaxng-webrag.png","docs/sqlchat.png","docs/tunnels.png","docs/txtairag.png","docs/webui-boost-status.png","docs/webui-pipelines-2.png","docs/webui-pipelines.png","drawio/override.env","fabric/override.env","flowise/.gitignore","flowise/override.env","gptme/Dockerfile","gptme/config.toml","gptme/override.env","gum/Dockerfile","harbor.sh","harbor/__init__.py","hf/Dockerfile","hf/override.env","hfdownloader/Dockerfile","hfdownloader/override.env","http-catalog/agent.http","http-catalog/airllm.http","http-catalog/aphrodite.http","http-catalog/boost.http","http-catalog/comfyui.http","http-catalog/dify.http","http-catalog/hf.http","http-catalog/kobold.http","http-catalog/ktransformers.http","http-catalog/langfuse.http","http-catalog/litellm.http","http-catalog/llamacpp.http","http-catalog/llamaswap.http","http-catalog/mistral.http","http-catalog/mistralrs.http","http-catalog/modularmax.http","http-catalog/nexa.http","http-catalog/ollama.http","http-catalog/ollama/completions.http","http-catalog/omnichain.http","http-catalog/optillm.http","http-catalog/parler.http","http-catalog/perplexideez.http","http-catalog/plandex.http","http-catalog/sglang.http","http-catalog/speaches.http","http-catalog/stt.http","http-catalog/tabbyapi.http","http-catalog/tgi.http","http-catalog/tts.http","http-catalog/vllm.http","http-catalog/webui.http","install.sh","jupyter/Dockerfile","jupyter/override.env","jupyter/workspace/000-sample.ipynb","k6/.gitignore","k6/dashboards/k6-load-testing-results_rev3.json","k6/dashboards/k6-openai-tokens_rev1.json","k6/docker-compose.yaml","k6/grafana-dashboard.yaml","k6/grafana-datasource.yaml","k6/override.env","k6/scripts/concurrent-prefix-caching.js","k6/scripts/example.js","k6/scripts/helpers/config.js","k6/scripts/helpers/http.js","k6/scripts/helpers/ollamaHttp.js","k6/scripts/helpers/openaiGeneric.js","k6/scripts/helpers/utils.js","k6/scripts/ollama.js","k6/scripts/openai-api-throughput.js","k6/scripts/payloads/completions.js","k6/scripts/payloads/ollama.js","karakeep/.gitignore","karakeep/override.env","kobold/.gitignore","kobold/override.env","ktransformers/Dockerfile","ktransformers/chat.py","ktransformers/override.env","langflow/.gitignore","langflow/override.env","langfuse/.gitignore","langfuse/.gitkeep","langfuse/override.env","latentscope/.gitignore","latentscope/Dockerfile","latentscope/override.env","ldr/.gitignore","ldr/override.env","librechat/.env","librechat/.gitignore","librechat/.gitkeep","librechat/librechat.yml","librechat/override.env","librechat/start_librechat.sh","libretranslate/.gitignore","libretranslate/override.env","litellm/litellm.config.yaml","litellm/litellm.langfuse.yaml","litellm/litellm.optillm.yaml","litellm/litellm.tgi.yaml","litellm/litellm.vllm.yaml","litellm/override.env","litellm/start_litellm.sh","litlytics/override.env","llamacpp/data/templates/tars.jinja","llamacpp/override.env","llamaswap/config.yaml","llamaswap/override.env","lmeval/Dockerfile","lmeval/override.env","lobechat/override.env","localai/.gitignore","localai/override.env","mcp/.gitignore","mcp/inspector-entrypoint.sh","mcp/override.env","mcpo/configs/mcpo.mcp-server-fetch.json","mcpo/configs/mcpo.mcp-server-time.json","mcpo/configs/mcpo.metamcp.json","mcpo/configs/mcpo.override.json","mcpo/override.env","mcpo/start_mcpo.sh","metamcp/.gitignore","metamcp/override.env","metamcp/start-sse.mjs","mikupad/override.env","mindsdb/.gitignore","mindsdb/override.env","modularmax/override.env","morphic/.gitignore","morphic/override.env","n8n/.gitignore","n8n/backup/credentials/9LdDQI9lblNjIGIZ.json","n8n/backup/workflows/6K7zSSBeRa0z1hi6.json","n8n/override.env","netdata/.gitignore","netdata/override.env","nexa/Dockerfile","nexa/nvidia.sh","nexa/override.env","nexa/proxy.Dockerfile","nexa/proxy_server.py","ol1/Dockerfile","ol1/README.md","ol1/app.py","ol1/override.env","ollama/.gitkeep","ollama/init_entrypoint.sh","ollama/modelfiles/README.md","ollama/modelfiles/flowaicom-flow-judge.Modelfile","ollama/modelfiles/gemma3-qat-tools.Modelfile","ollama/modelfiles/hargent.Modelfile","ollama/modelfiles/llama3.1_8b.Modelfile","ollama/modelfiles/llama3.1_q6k_48k.Modelfile","ollama/modelfiles/qwen2.5_7b_q8_32k.Modelfile","ollama/modelfiles/qwen2.5_7b_q8_48k.Modelfile","ollama/modelfiles/qwen2.5_q6k_32k.Modelfile","ollama/modelfiles/tars.Modelfile","ollama/override.env","omnichain/Dockerfile","omnichain/custom_nodes/example/example.maker.js","omnichain/entrypoint.sh","omnichain/examples/HarborChat.json","omnichain/files/harbor.prompt","omnichain/openai.ts","omnichain/override.env","omniparser/Dockerfile","omniparser/override.env","onyx/.gitignore","onyx/nginx/app.conf.template","onyx/nginx/run-nginx.sh","onyx/override.env","open-webui/configs/config.agent.json","open-webui/configs/config.airllm.json","open-webui/configs/config.aphrodite.json","open-webui/configs/config.boost.json","open-webui/configs/config.comfyui.json","open-webui/configs/config.dify.json","open-webui/configs/config.json","open-webui/configs/config.kobold.json","open-webui/configs/config.ktransformers.json","open-webui/configs/config.litellm.json","open-webui/configs/config.llamacpp.json","open-webui/configs/config.llamaswap.json","open-webui/configs/config.mistralrs.json","open-webui/configs/config.modularmax.json","open-webui/configs/config.nexa.json","open-webui/configs/config.ollama.json","open-webui/configs/config.omnichain.json","open-webui/configs/config.optillm.json","open-webui/configs/config.override.json","open-webui/configs/config.parler.json","open-webui/configs/config.pipelines.json","open-webui/configs/config.searxng.json","open-webui/configs/config.sglang.json","open-webui/configs/config.speaches.json","open-webui/configs/config.stt.json","open-webui/configs/config.tabbyapi.json","open-webui/configs/config.tts.json","open-webui/configs/config.vllm.json","open-webui/configs/config.x.mcpo.metamcp.json","open-webui/configs/config.x.searxng.ollama.json","open-webui/extras/artifact.py","open-webui/extras/mcts.py","open-webui/override.env","open-webui/start_webui.sh","openhands/.gitignore","openhands/override.env","openinterpreter/Dockerfile","openinterpreter/override.env","optillm/.gitignore","optillm/override.env","oterm/.gitignore","oterm/Dockerfile","oterm/override.env","package.json","parler/main.py","parler/override.env","parllama/Dockerfile","parllama/override.env","perplexica/override.env","perplexica/source.config.toml","perplexideez/.gitignore","perplexideez/override.env","pipelines/override.env","plandex/Dockerfile","plandex/override.env","poetry.lock","presenton/.gitignore","presenton/override.env","profiles/default.env","promptfoo/.gitignore","promptfoo/README.md","promptfoo/evals/hf/README.md","promptfoo/evals/hf/deno.json","promptfoo/evals/hf/deno.lock","promptfoo/evals/hf/generate.ts","promptfoo/evals/hf/promptfoo-errors.log","promptfoo/evals/hf/promptfooconfig.yaml","promptfoo/evals/hf/queries.ts","promptfoo/evals/hf/tests/category_sample.yaml","promptfoo/evals/hf/tests/challenge.yaml","promptfoo/evals/hf/tests/gpqa_diamond.yaml","promptfoo/evals/hf/tests/validate.yaml","promptfoo/evals/mini-mmlu-pro/generate.ts","promptfoo/examples/bias/README.md","promptfoo/examples/bias/promptfooconfig.yaml","promptfoo/examples/hello-promptfoo/README.md","promptfoo/examples/hello-promptfoo/promptfooconfig.yaml","promptfoo/examples/misguided/README.md","promptfoo/examples/misguided/promptfooconfig.yaml","promptfoo/examples/temp-test/README.md","promptfoo/examples/temp-test/promptfooconfig.yaml","promptfoo/override.env","pyproject.toml","qdrant/override.env","qrgen/Dockerfile","qrgen/gen.ts","raglite/.gitignore","raglite/Dockerfile","raglite/override.env","repopack/Dockerfile","repopack/override.env","requirements.sh","resume-matcher/.gitignore","resume-matcher/Dockerfile.backend","resume-matcher/Dockerfile.frontend","resume-matcher/override.env","routines/.vscode/settings.json","routines/config.ts","routines/deno.json","routines/deno.lock","routines/docker.ts","routines/envManager.ts","routines/manageTools.ts","routines/mergeComposeFiles.ts","routines/paths.ts","routines/tsconfig.json","routines/types.ts","routines/utils.ts","searxng/override.env","searxng/settings.yml","searxng/settings.yml.new","searxng/uwsgi.ini","searxng/uwsgi.ini.new","shared/README.md","shared/harbor_entrypoint.sh","shared/json_config_merger.py","shared/proxy_user.sh","shared/yaml_config_merger.js","shared/yaml_config_merger.py","sim/.gitignore","sim/override.env","speaches/init_entrypoint.ts","speaches/override.env","sqlchat/override.env","stt/override.env","supergateway/override.env","tabbyapi/api_tokens.yml","tabbyapi/config.yml","tabbyapi/override.env","tabbyapi/start_tabbyapi.sh","textgrad/Dockerfile","textgrad/override.env","textgrad/workspace/000-sample.ipynb","tgi/override.env","tools/config.yaml","traefik/acme.json","traefik/override.env","traefik/traefik.yml","tts/config/pre_process_map.yaml","tts/config/voice_to_speaker.yaml","tts/override.env","txtairag/rag.py","unsloth/.gitignore","unsloth/override.env","vllm/Dockerfile","vllm/override.env","webtop/.gitignore","webtop/Dockerfile","webtop/init/create_symlink.sh","webtop/init/fix_desktop_app.sh","webtop/init/provision_docker_groups.sh","webtop/override.env","windmill/.gitignore","windmill/Caddyfile","windmill/override.env","yarn.lock"] | ||
@@ -15,0 +15,0 @@ [[tool.poetry.packages]] |
+1
-1
@@ -23,3 +23,3 @@  | ||
| Harbor is a containerized LLM toolkit that allows you to run LLM backends, frontends and related useful services. It consists of a CLI and a companion App. | ||
| Harbor is a CLI and companion app that lets you spin up a complete local LLM stack—backends like Ollama, llama.cpp, or vLLM, frontends like Open WebUI, plus supporting services like SearXNG for web search, Speaches for voice chat, and ComfyUI for image generation—all pre-wired to work together with a single `harbor up` command. No manual setup: just pick the services you want and Harbor handles the Docker Compose orchestration, configuration, and cross-service connectivity so you can focus on actually using your models. | ||
@@ -26,0 +26,0 @@  |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Network access
Supply chain riskThis module accesses the network.
Found 5 instances in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 15 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 3 instances in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 5 instances in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 15 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 3 instances in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
37851893
10.36%1310
4.47%29378
0.6%