Resume-Matcher Docker & Self-Hosted Deployment

GitHub

The #1 AI Harness for Building Resumes, PDFs, Cover Letters & more, locally with 100+ LLMs support.

RAW Compose
1. Pull Image (GHCR) docker pull ghcr.io/srbhr/resume-matcher
2. Docker Run (1-Click Launch) docker run -d --name resume-matcher -p 3000:3000 --restart always ghcr.io/srbhr/resume-matcher
3. Podman Run podman run -d --name resume-matcher -p 3000:3000 --restart always ghcr.io/srbhr/resume-matcher
4. Skopeo Inspect (Zero-Pull Manifest) skopeo inspect docker://ghcr.io/srbhr/resume-matcher
5. ORAS Pull (OCI Artifact) oras pull ghcr.io/srbhr/resume-matcher
6. Compose Deployment docker compose up -d
docker-compose.yml
Download .yml
services:
  resume-matcher:
    image: ghcr.io/srbhr/resume-matcher
    build:
      context: .
      # Optional, for slow networks (empty by default = no change):
      #   DEBIAN_MIRROR=https://mirrors.edge.kernel.org/debian docker compose build
      args:
        - DEBIAN_MIRROR=${DEBIAN_MIRROR:-}
        - DEBIAN_SECURITY_MIRROR=${DEBIAN_SECURITY_MIRROR:-}
        - PIP_INDEX_URL=${PIP_INDEX_URL:-}
        - PLAYWRIGHT_DOWNLOAD_HOST=${PLAYWRIGHT_DOWNLOAD_HOST:-}
    container_name: resume-matcher
    ports:
      - "${PORT:-3000}:3000"
    volumes:
      - resume-data:/app/backend/data
    #secrets:
    #  - llm_api_key
    environment:
      # domain in reverse proxy
      - FRONTEND_BASE_URL=${FRONTEND_BASE_URL:-http://localhost:3000}
      # Logging configuration: DEBUG, INFO, WARNING, ERROR
      - LOG_LEVEL=${LOG_LEVEL:-INFO}
      #- LOG_LEVEL_FILE=${LOG_LEVEL_FILE:-}
      # Debug level for LiteLLM: DEBUG, INFO, WARNING, ERROR
      - LOG_LLM=${LOG_LLM:-WARNING}
      #- LOG_LLM_FILE=${LOG_LLM_FILE:-}
      # LLM Configuration - configure via Settings UI or set env vars for explicit overrides
      # Supported providers: openai, anthropic, openrouter, gemini, deepseek, ollama
      # Defaults are defined in apps/backend/app/config.py
      - LLM_PROVIDER=${LLM_PROVIDER:-openai}
      - LLM_MODEL=${LLM_MODEL:-}
      # Optional Docker Secret file path (same behavior as Postgres-style *_FILE)
      #- LLM_API_KEY_FILE=${LLM_API_KEY_FILE:-/run/secrets/llm_api_key}
      - LLM_API_KEY=${LLM_API_KEY:-}
      # For Ollama running on host machine, use host.docker.internal:
      # - LLM_API_BASE=http://host.docker.internal:11434
      - LLM_API_BASE=${LLM_API_BASE:-}
      # CORS origins (JSON array format). FRONTEND_BASE_URL is auto-included.
      #- CORS_ORIGINS=["http://localhost:3000","http://127.0.0.1:3000"]
    restart: unless-stopped
    # Fast iteration: `docker compose watch` (Compose 2.22+). Backend code is synced into
    # the running container and the app restarts; no image rebuild. Frontend, dependency
    # and image changes rebuild the image (Chromium and Python deps stay cached).
    # Plain `docker compose up` ignores this block.
    develop:
      watch:
        - action: sync+restart
          path: ./apps/backend/app
          target: /app/backend/app
          ignore:
            - __pycache__/
        - action: rebuild
          path: ./apps/frontend
          ignore:
            - node_modules/
            - .next/
        - action: rebuild
          path: ./apps/backend/pyproject.toml
        - action: rebuild
          path: ./Dockerfile
        - action: rebuild
          path: ./docker

#secrets:
#  llm_api_key:
#    file: ./secrets/llm_api_key

volumes:
  resume-data:
    driver: local