/ 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"]