diff --git a/Dockerfile b/Dockerfile index 39dfbf9..77d69e5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,29 +13,8 @@ USER root WORKDIR /ragflow -# Set UV HTTP timeout to handle large package downloads (e.g., nvidia-cusolver-cu12) -# Default is 30s, increase to 600s (10 minutes) for large packages -ENV UV_HTTP_TIMEOUT=600 - -# install dependencies from pyproject.toml -COPY pyproject.toml ./ -# https://github.com/astral-sh/uv/issues/10462 -# uv records index url into uv.lock but doesn't failover among multiple indexes -# Generate uv.lock from pyproject.toml and install dependencies with cache -RUN --mount=type=cache,id=ragflow_uv,target=/root/.cache/uv,sharing=locked \ - if [ "$NEED_MIRROR" == "1" ]; then \ - uv lock --index-url https://mirrors.aliyun.com/pypi/simple; \ - sed -i 's|pypi.org|mirrors.aliyun.com/pypi|g' uv.lock; \ - else \ - uv lock; \ - sed -i 's|mirrors.aliyun.com/pypi|pypi.org|g' uv.lock; \ - fi; \ - if [ "$LIGHTEN" == "1" ]; then \ - uv sync --python 3.10 --frozen; \ - else \ - uv sync --python 3.10 --frozen --all-extras; \ - fi - +# Python dependencies are already installed in base image +# Build web application COPY web web COPY docs docs RUN --mount=type=cache,id=ragflow_npm,target=/root/.npm,sharing=locked \ @@ -58,11 +37,7 @@ USER root WORKDIR /ragflow -# Copy Python environment and packages -ENV VIRTUAL_ENV=/ragflow/.venv -COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV} -ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" - +# Python environment is already set up in base image ENV PYTHONPATH=/ragflow/ COPY web web diff --git a/Dockerfile.base b/Dockerfile.base index 819d96c..ee5baf7 100644 --- a/Dockerfile.base +++ b/Dockerfile.base @@ -137,3 +137,31 @@ RUN --mount=type=bind,from=infiniflow/ragflow_deps:latest,source=/,target=/deps dpkg -i /deps/libssl1.1_1.1.1f-1ubuntu2_arm64.deb; \ fi +# Install Python dependencies from pyproject.toml +# This is done in base image since dependencies don't change frequently +COPY pyproject.toml ./ +# https://github.com/astral-sh/uv/issues/10462 +# uv records index url into uv.lock but doesn't failover among multiple indexes +# Generate uv.lock from pyproject.toml and install dependencies with cache +# Set UV HTTP timeout based on mirror usage: +# - With mirror (NEED_MIRROR=1): 600s for potentially slower mirror connections +# - Without mirror (abroad): 300s should be sufficient for PyPI with good network +RUN --mount=type=cache,id=ragflow_uv,target=/root/.cache/uv,sharing=locked \ + export UV_HTTP_TIMEOUT=$([ "$NEED_MIRROR" == "1" ] && echo "600" || echo "300") && \ + if [ "$NEED_MIRROR" == "1" ]; then \ + uv lock --index-url https://mirrors.aliyun.com/pypi/simple; \ + sed -i 's|pypi.org|mirrors.aliyun.com/pypi|g' uv.lock; \ + else \ + uv lock; \ + sed -i 's|mirrors.aliyun.com/pypi|pypi.org|g' uv.lock; \ + fi && \ + if [ "$LIGHTEN" == "1" ]; then \ + uv sync --python 3.10 --frozen; \ + else \ + uv sync --python 3.10 --frozen --all-extras; \ + fi + +# Set Python environment variables +ENV VIRTUAL_ENV=/ragflow/.venv +ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" + diff --git a/docker/docker-compose-base.yml b/docker/docker-compose-base.yml index d7aa601..3e34a09 100644 --- a/docker/docker-compose-base.yml +++ b/docker/docker-compose-base.yml @@ -4,7 +4,7 @@ services: container_name: ragflow-opensearch-01 profiles: - opensearch - image: hub.icert.top/opensearchproject/opensearch:2.19.1 + image: hub.icert.top/opensearchproject/opensearch:3.3.2 volumes: - osdata01:/usr/share/opensearch/data ports: @@ -38,6 +38,61 @@ services: - ragflow restart: on-failure + opensearch-dashboards: + container_name: ragflow-opensearch-dashboards + profiles: + - opensearch + image: opensearchproject/opensearch-dashboards:3.3.0 + env_file: .env + environment: + - OPENSEARCH_HOSTS=["http://opensearch01:9201"] + - OPENSEARCH_USERNAME=admin + - OPENSEARCH_PASSWORD=${OPENSEARCH_PASSWORD} + - TZ=${TIMEZONE} + ports: + - 5601:5601 + depends_on: + - opensearch01 + networks: + - ragflow + restart: on-failure + + es01: + container_name: ragflow-es-01 + profiles: + - elasticsearch + image: elasticsearch:${STACK_VERSION} + volumes: + - esdata01:/usr/share/elasticsearch/data + ports: + - ${ES_PORT}:9200 + env_file: .env + environment: + - node.name=es01 + - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} + - bootstrap.memory_lock=false + - discovery.type=single-node + - xpack.security.enabled=true + - xpack.security.http.ssl.enabled=false + - xpack.security.transport.ssl.enabled=false + - cluster.routing.allocation.disk.watermark.low=5gb + - cluster.routing.allocation.disk.watermark.high=3gb + - cluster.routing.allocation.disk.watermark.flood_stage=2gb + - TZ=${TIMEZONE} + mem_limit: ${MEM_LIMIT} + ulimits: + memlock: + soft: -1 + hard: -1 + healthcheck: + test: ["CMD-SHELL", "curl http://localhost:9200"] + interval: 10s + timeout: 10s + retries: 120 + networks: + - ragflow + restart: on-failure + postgres: image: postgres:15