/ prod.Dockerfile
prod.Dockerfile
 1  # syntax=docker/dockerfile:1
 2  FROM ubuntu:jammy AS base
 3  LABEL homepage="https://khoj.dev"
 4  LABEL repository="https://github.com/khoj-ai/khoj"
 5  LABEL org.opencontainers.image.source="https://github.com/khoj-ai/khoj"
 6  LABEL org.opencontainers.image.description="Your second brain, containerized for multi-user, cloud deployment"
 7  
 8  # Install System Dependencies
 9  RUN apt update -y && apt -y install \
10      python3-pip \
11      libsqlite3-0 \
12      ffmpeg \
13      libsm6 \
14      libxext6 \
15      swig \
16      curl \
17      # Required by llama-cpp-python pre-built wheels. See #1628
18      musl-dev && \
19      ln -s /usr/lib/x86_64-linux-musl/libc.so /lib/libc.musl-x86_64.so.1 && \
20      # Clean up
21      apt clean && rm -rf /var/lib/apt/lists/*
22  
23  # Build Server
24  FROM base AS server-deps
25  WORKDIR /app
26  COPY pyproject.toml .
27  COPY README.md .
28  ARG VERSION=0.0.0
29  # use the pre-built llama-cpp-python, torch cpu wheel
30  ENV PIP_EXTRA_INDEX_URL="https://download.pytorch.org/whl/cpu https://abetlen.github.io/llama-cpp-python/whl/cpu"
31  # avoid downloading unused cuda specific python packages
32  ENV CUDA_VISIBLE_DEVICES=""
33  RUN sed -i "s/dynamic = \\[\"version\"\\]/version = \"$VERSION\"/" pyproject.toml && \
34      pip install --no-cache-dir -e .[prod]
35  
36  # Build Web App
37  FROM oven/bun:1-alpine AS web-app
38  # Set build optimization env vars
39  ENV NODE_ENV=production
40  ENV NEXT_TELEMETRY_DISABLED=1
41  WORKDIR /app/src/interface/web
42  # Install dependencies first (cache layer)
43  COPY src/interface/web/package.json src/interface/web/bun.lock ./
44  RUN bun install --frozen-lockfile
45  # Copy source and build
46  COPY src/interface/web/. ./
47  RUN bun run build
48  
49  # Merge the Server and Web App into a Single Image
50  FROM base
51  ENV PYTHONPATH=/app/src:$PYTHONPATH
52  WORKDIR /app
53  COPY --from=server-deps /usr/local/lib/python3.10/dist-packages /usr/local/lib/python3.10/dist-packages
54  COPY --from=server-deps /usr/local/bin /usr/local/bin
55  COPY --from=web-app /app/src/interface/web/out ./src/khoj/interface/built
56  COPY . .
57  RUN cd src && python3 khoj/manage.py collectstatic --noinput
58  
59  # Run the Application
60  # There are more arguments required for the application to run,
61  # but those should be passed in through the docker-compose.yml file.
62  ARG PORT
63  EXPOSE ${PORT}
64  ENTRYPOINT ["gunicorn", "-c", "gunicorn-config.py", "src.khoj.main:app"]