Spaces:
Running
Running
File size: 3,766 Bytes
fb29bda |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# Build llama.cpp in a separate stage
FROM cgr.dev/chainguard/wolfi-base:latest AS llama-builder
# Install build dependencies
RUN apk add --update \
build-base \
cmake \
ccache \
git \
curl
# Build llama.cpp server and collect libraries
RUN cd /tmp && \
git clone https://github.com/ggerganov/llama.cpp.git --depth=1 && \
cd llama.cpp && \
cmake -B build -DGGML_NATIVE=OFF -DLLAMA_CURL=OFF && \
cmake --build build --config Release -j --target llama-server && \
mkdir -p /usr/local/lib/llama && \
find build -type f \( -name "libllama.so" -o -name "libggml.so" -o -name "libggml-base.so" -o -name "libggml-cpu.so" \) -exec cp {} /usr/local/lib/llama/ \;
# Use the SearXNG image as the base for final image
FROM searxng/searxng:2025.5.22-861f9c4
# Set the default port to 7860 if not provided
ENV PORT=7860
# Expose the port specified by the PORT environment variable
EXPOSE $PORT
# Copy apk and necessary dependencies from the first stage
COPY --from=llama-builder /sbin/apk /sbin/apk
COPY --from=llama-builder /etc/apk /etc/apk
COPY --from=llama-builder /usr/lib/libapk.so* /usr/lib/
# Install necessary packages
RUN apk add --update \
nodejs \
npm \
git \
build-base \
python3 \
py3-pip \
&& npm --version \
&& node --version
# Install latest npm
RUN npm install -g npm@latest
# Copy llama.cpp artifacts from builder
COPY --from=llama-builder /tmp/llama.cpp/build/bin/llama-server /usr/local/bin/
COPY --from=llama-builder /usr/local/lib/llama/* /usr/local/lib/
RUN ldconfig /usr/local/lib
# Change output format from HTML to JSON in SearXNG configuration
RUN sed -i 's/- html/- json/' /usr/local/searxng/searx/settings.yml
# Set the SearXNG settings folder path
ARG SEARXNG_SETTINGS_FOLDER=/etc/searxng
# Create the SearXNG settings folder and set permissions
RUN mkdir -p ${SEARXNG_SETTINGS_FOLDER} \
&& chmod -R 777 ${SEARXNG_SETTINGS_FOLDER} \
&& chown -R searxng:searxng ${SEARXNG_SETTINGS_FOLDER}
# Set up user and directory structure
ARG USERNAME=user
ARG HOME_DIR=/home/${USERNAME}
ARG APP_DIR=${HOME_DIR}/app
# Create a non-root user and set up the application directory
RUN adduser -D -u 1000 ${USERNAME} \
&& mkdir -p ${APP_DIR} \
&& chown -R ${USERNAME}:${USERNAME} ${HOME_DIR}
# Switch to the non-root user
USER ${USERNAME}
# Set the working directory to the application directory
WORKDIR ${APP_DIR}
# Define environment variables that can be passed to the container during build.
# This approach allows for dynamic configuration without relying on a `.env` file,
# which might not be suitable for all deployment scenarios.
ARG ACCESS_KEYS
ARG ACCESS_KEY_TIMEOUT_HOURS
ARG WEBLLM_DEFAULT_F16_MODEL_ID
ARG WEBLLM_DEFAULT_F32_MODEL_ID
ARG WLLAMA_DEFAULT_MODEL_ID
ARG INTERNAL_OPENAI_COMPATIBLE_API_BASE_URL
ARG INTERNAL_OPENAI_COMPATIBLE_API_KEY
ARG INTERNAL_OPENAI_COMPATIBLE_API_MODEL
ARG INTERNAL_OPENAI_COMPATIBLE_API_NAME
ARG DEFAULT_INFERENCE_TYPE
ARG HOST
ARG HMR_PORT
ARG ALLOWED_HOSTS
# Copy package.json, package-lock.json, and .npmrc files
COPY --chown=${USERNAME}:${USERNAME} ./package.json ./package.json
COPY --chown=${USERNAME}:${USERNAME} ./package-lock.json ./package-lock.json
COPY --chown=${USERNAME}:${USERNAME} ./.npmrc ./.npmrc
# Install Node.js dependencies
RUN npm ci
# Copy the rest of the application files
COPY --chown=${USERNAME}:${USERNAME} . .
# Configure Git to treat the app directory as safe
RUN git config --global --add safe.directory ${APP_DIR}
# Build the application
RUN npm run build
# Set the entrypoint to use a shell
ENTRYPOINT [ "/bin/sh", "-c" ]
# Run SearXNG in the background and start the Node.js application using PM2
CMD [ "(/usr/local/searxng/entrypoint.sh > /dev/null 2>&1) & (npx pm2 start ecosystem.config.cjs && npx pm2 logs)" ]
|