diff --git a/Dockerfile b/Dockerfile
index fdc5f4c4bba..9b7b6398b2e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,7 +8,7 @@ ARG NEED_MIRROR=0
WORKDIR /ragflow
# copy models downloaded via download_deps.py
-RUN mkdir -p /ragflow/rag/res/deepdoc /root/.ragflow
+RUN mkdir -p /ragflow/rag/res/deepdoc /opt/ragflow_home
RUN --mount=type=bind,from=infiniflow/ragflow_deps:latest,source=/huggingface.co,target=/huggingface.co \
tar --exclude='.*' -cf - \
/huggingface.co/InfiniFlow/text_concat_xgb_v1.0 \
@@ -18,12 +18,15 @@ RUN --mount=type=bind,from=infiniflow/ragflow_deps:latest,source=/huggingface.co
# https://github.com/chrismattmann/tika-python
# This is the only way to run python-tika without internet access. Without this set, the default is to check the tika version and pull latest every time from Apache.
RUN --mount=type=bind,from=infiniflow/ragflow_deps:latest,source=/,target=/deps \
- cp -r /deps/nltk_data /root/ && \
+ mkdir -p /opt/nltk_data && \
+ cp -r /deps/nltk_data/* /opt/nltk_data/ && \
cp /deps/tika-server-standard-3.3.0.jar /deps/tika-server-standard-3.3.0.jar.md5 /ragflow/ && \
cp /deps/cl100k_base.tiktoken /ragflow/9b5ad71b2ce5302211f9c61530b329a4922fc6a4
+ENV TIKTOKEN_CACHE_DIR=/ragflow
ENV TIKA_SERVER_JAR="file:///ragflow/tika-server-standard-3.3.0.jar"
ENV DEBIAN_FRONTEND=noninteractive
+ENV NLTK_DATA=/opt/nltk_data
# Setup apt
# Python package and implicit dependencies:
@@ -35,15 +38,30 @@ RUN --mount=type=cache,id=ragflow_apt,target=/var/cache/apt,sharing=locked \
apt update && \
apt --no-install-recommends install -y ca-certificates; \
if [ "$NEED_MIRROR" == "1" ]; then \
- sed -i 's|http://archive.ubuntu.com/ubuntu|https://mirrors.aliyun.com/ubuntu|g' /etc/apt/sources.list.d/ubuntu.sources; \
- sed -i 's|http://security.ubuntu.com/ubuntu|https://mirrors.aliyun.com/ubuntu|g' /etc/apt/sources.list.d/ubuntu.sources; \
+ sed -i 's|http://archive.ubuntu.com/ubuntu|https://mirrors.tuna.tsinghua.edu.cn/ubuntu|g' /etc/apt/sources.list.d/ubuntu.sources; \
+ sed -i 's|http://security.ubuntu.com/ubuntu|https://mirrors.tuna.tsinghua.edu.cn/ubuntu|g' /etc/apt/sources.list.d/ubuntu.sources; \
fi; \
rm -f /etc/apt/apt.conf.d/docker-clean && \
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache && \
chmod 1777 /tmp && \
apt update && \
- apt install -y \
- build-essential libglib2.0-0 libglx-mesa0 libgl1 pkg-config libicu-dev libgdiplus default-jdk libatk-bridge2.0-0 libpython3-dev libgtk-4-1 libnss3 xdg-utils libgbm-dev libjemalloc-dev gnupg unzip curl wget git vim less ghostscript pandoc texlive texlive-latex-extra texlive-xetex texlive-lang-chinese fonts-freefont-ttf fonts-noto-cjk postgresql-client
+ apt install -y build-essential && \
+ apt install -y libglib2.0-0 libglx-mesa0 libgl1 && \
+ apt install -y pkg-config libicu-dev libgdiplus && \
+ apt install -y default-jdk && \
+ apt install -y libatk-bridge2.0-0 && \
+ apt install -y libpython3-dev libgtk-4-1 libnss3 xdg-utils libgbm-dev && \
+ apt install -y libjemalloc-dev && \
+ apt install -y gnupg unzip curl wget git vim less && \
+ apt install -y ghostscript && \
+ apt install -y pandoc && \
+ apt install -y texlive && \
+ apt install -y fonts-freefont-ttf fonts-noto-cjk && \
+ apt install -y postgresql-client
+
+RUN wget -q -O /ragflow/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 \
+ https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken && \
+ echo "tiktoken cl100k_base encoding cached successfully"
# Download resource from GitHub to /usr/share/infinity
RUN mkdir -p /usr/share/infinity/resource && \
@@ -77,13 +95,16 @@ RUN --mount=type=bind,from=infiniflow/ragflow_deps:latest,source=/,target=/deps
if [ "$arch" = "x86_64" ]; then uv_arch="x86_64"; else uv_arch="aarch64"; fi; \
tar xzf "/deps/uv-${uv_arch}-unknown-linux-gnu.tar.gz" \
&& cp "uv-${uv_arch}-unknown-linux-gnu/"* /usr/local/bin/ \
- && rm -rf "uv-${uv_arch}-unknown-linux-gnu" \
- && uv python install 3.12
+ && rm -rf "uv-${uv_arch}-unknown-linux-gnu"
+
+
+
+ENV UV_PYTHON_INSTALL_DIR=/opt/uv/python
+RUN uv python install 3.12
ENV PYTHONDONTWRITEBYTECODE=1 DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 \
UV_HTTP_TIMEOUT=200 \
UV_HTTP_RETRIES=3
-ENV PATH=/root/.local/bin:$PATH
# nodejs 12.22 on Ubuntu 22.04 is too old
RUN --mount=type=cache,id=ragflow_apt,target=/var/cache/apt,sharing=locked \
@@ -148,14 +169,21 @@ RUN --mount=type=cache,id=ragflow_uv,target=/root/.cache/uv,sharing=locked \
sed -i 's|mirrors.aliyun.com/pypi|pypi.org|g' uv.lock; \
fi; \
uv sync --python 3.12 --frozen && \
- # Ensure pip is available in the venv for runtime package installation (fixes #12651)
.venv/bin/python3 -m ensurepip --upgrade
+ # Ensure pip is available in the venv for runtime package installation (fixes #12651)
+
+# Pre-install docling at build time (runtime install impossible in airgapped environments)
+ARG DOCLING_VERSION=2.71.0
+RUN --mount=type=cache,id=ragflow_uv,target=/root/.cache/uv,sharing=locked \
+ uv pip install --no-cache-dir "docling==${DOCLING_VERSION}" easyocr
+
+RUN .venv/bin/docling-tools models download --all -o /ragflow/docling_models
COPY web web
COPY docs docs
RUN --mount=type=cache,id=ragflow_npm,target=/root/.npm,sharing=locked \
- cd web && NODE_OPTIONS="--max-old-space-size=8192" npm install && \
- NODE_OPTIONS="--max-old-space-size=8192" VITE_BUILD_SOURCEMAP=false VITE_MINIFY=esbuild npm run build
+ export NODE_OPTIONS="--max-old-space-size=4096" && \
+ cd web && npm install && npm run build
COPY .git /ragflow/.git
@@ -173,7 +201,9 @@ 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}"
+COPY --from=builder /ragflow/docling_models /ragflow/docling_models
+ENV DOCLING_ARTIFACTS_PATH="/ragflow/docling_models"
+ENV PATH="${VIRTUAL_ENV}/bin:/usr/local/bin:/usr/bin:/bin"
ENV PYTHONPATH=/ragflow/
@@ -205,4 +235,48 @@ RUN mv /etc/nginx/ragflow.conf.golang /etc/nginx/conf.d/ragflow.conf.golang && \
COPY --from=builder /ragflow/web/dist /ragflow/web/dist
COPY --from=builder /ragflow/VERSION /ragflow/VERSION
+
+# =============================================================================
+# OPENSHIFT RESTRICTED-V2 COMPATIBILITY
+# =============================================================================
+
+RUN rm -rf /root/nltk_data /root/.ragflow 2>/dev/null || true
+
+# 2. Configure nginx for non-root:
+RUN sed -i -E 's/listen\s+80(\s|;)/listen 8080\1/g' /etc/nginx/conf.d/*.conf* /etc/nginx/conf.d/* 2>/dev/null || true && \
+ sed -i 's|pid\s\+/var/run/nginx.pid|pid /tmp/nginx.pid|g' /etc/nginx/nginx.conf && \
+ grep -q '^\s*pid ' /etc/nginx/nginx.conf || sed -i '1i pid /tmp/nginx.pid;' /etc/nginx/nginx.conf && \
+ echo 'client_body_temp_path /tmp/nginx_client_body;' > /etc/nginx/conf.d/00-temp-paths.conf && \
+ echo 'proxy_temp_path /tmp/nginx_proxy;' >> /etc/nginx/conf.d/00-temp-paths.conf && \
+ echo 'fastcgi_temp_path /tmp/nginx_fastcgi;' >> /etc/nginx/conf.d/00-temp-paths.conf && \
+ echo 'uwsgi_temp_path /tmp/nginx_uwsgi;' >> /etc/nginx/conf.d/00-temp-paths.conf && \
+ echo 'scgi_temp_path /tmp/nginx_scgi;' >> /etc/nginx/conf.d/00-temp-paths.conf
+
+# 3. Set HOME to /tmp
+ENV HOME=/tmp
+
+# 4. Set group ownership to GID 0 and mirror permissions
+RUN chgrp -R 0 /ragflow \
+ /opt/nltk_data \
+ /opt/ragflow_home \
+ /opt/chrome \
+ /opt/uv \
+ /var/log/nginx \
+ /var/cache/nginx \
+ /var/run \
+ /etc/nginx \
+ && chmod -R g=u /ragflow \
+ /opt/nltk_data \
+ /opt/ragflow_home \
+ /opt/chrome \
+ /opt/uv \
+ /var/log/nginx \
+ /var/cache/nginx \
+ /var/run \
+ /etc/nginx \
+ && chmod -R g=u /tmp
+
+# 5. Set non-root user
+USER 1000
+
ENTRYPOINT ["./entrypoint.sh"]
diff --git a/docker/.env b/docker/.env
index ff5b781cbc3..797c7e8fa09 100644
--- a/docker/.env
+++ b/docker/.env
@@ -192,7 +192,7 @@ TEI_HOST=tei
TEI_PORT=6380
# The local time zone.
-TZ=Asia/Shanghai
+TZ=${TZ:-Europe/Berlin}
# Uncomment the following line if you have limited access to huggingface.co:
# HF_ENDPOINT=https://hf-mirror.com
@@ -237,7 +237,7 @@ EMBEDDING_BATCH_SIZE=${EMBEDDING_BATCH_SIZE:-16}
# A user registration switch:
# - Enable registration: 1
# - Disable registration: 0
-REGISTER_ENABLED=1
+REGISTER_ENABLED=${REGISTER_ENABLED:-0}
# Important: To enable sandbox, you need to uncomment following two lines:
# SANDBOX_ENABLED=1
@@ -267,7 +267,7 @@ SANDBOX_ARTIFACT_BUCKET=sandbox-artifacts
SANDBOX_ARTIFACT_EXPIRE_DAYS=7
# Enable DocLing
-USE_DOCLING=false
+USE_DOCLING=${USE_DOCLING:-true}
# Enable Mineru
# Uncommenting these lines will automatically add MinerU to the model provider whenever possible.
diff --git a/helm/templates/_helpers.tpl b/helm/templates/_helpers.tpl
index c751d8f9092..bb1602541d4 100644
--- a/helm/templates/_helpers.tpl
+++ b/helm/templates/_helpers.tpl
@@ -84,4 +84,4 @@ Create the name of the service account to use
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
-{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/helm/templates/elasticsearch.yaml b/helm/templates/elasticsearch.yaml
index df9fe10ee52..27ab77fe3a4 100644
--- a/helm/templates/elasticsearch.yaml
+++ b/helm/templates/elasticsearch.yaml
@@ -53,28 +53,6 @@ spec:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- end }}
- initContainers:
- - name: fix-data-volume-permissions
- image: {{ include "ragflow.imageRepo" (dict "root" . "repo" .Values.elasticsearch.initContainers.alpine.repository) }}:{{ .Values.elasticsearch.initContainers.alpine.tag }}
- {{- with .Values.elasticsearch.initContainers.alpine.pullPolicy }}
- imagePullPolicy: {{ . }}
- {{- end }}
- command:
- - sh
- - -c
- - "chown -R 1000:0 /usr/share/elasticsearch/data"
- volumeMounts:
- - mountPath: /usr/share/elasticsearch/data
- name: es-data
- - name: sysctl
- image: {{ include "ragflow.imageRepo" (dict "root" . "repo" .Values.elasticsearch.initContainers.busybox.repository) }}:{{ .Values.elasticsearch.initContainers.busybox.tag }}
- {{- with .Values.elasticsearch.initContainers.busybox.pullPolicy }}
- imagePullPolicy: {{ . }}
- {{- end }}
- securityContext:
- privileged: true
- runAsUser: 0
- command: ["sysctl", "-w", "vm.max_map_count=262144"]
containers:
- name: elasticsearch
image: {{ include "ragflow.imageRepo" (dict "root" . "repo" .Values.elasticsearch.image.repository) }}:{{ .Values.elasticsearch.image.tag }}
@@ -98,15 +76,6 @@ spec:
resources:
{{- . | toYaml | nindent 10 }}
{{- end }}
- securityContext:
- capabilities:
- add:
- - "IPC_LOCK"
- runAsUser: 1000
- # NOTE: fsGroup doesn't seem to
- # work so use init container instead
- # fsGroup: 1000
- allowPrivilegeEscalation: false
volumes:
- name: es-data
persistentVolumeClaim:
diff --git a/helm/templates/env.yaml b/helm/templates/env.yaml
index 4121a39ee8d..ea65e518baa 100644
--- a/helm/templates/env.yaml
+++ b/helm/templates/env.yaml
@@ -1,11 +1,7 @@
-{{- /*
-TODO: Split env vars into separate secrets so that each pod
- only gets passed the secrets it really needs.
-*/}}
apiVersion: v1
kind: Secret
metadata:
- name: {{ include "ragflow.fullname" . }}-env-config
+ name: {{ include "ragflow.fullname" . }}
type: Opaque
stringData:
{{- range $key, $val := .Values.env }}
@@ -13,39 +9,29 @@ stringData:
{{ $key }}: {{ quote $val }}
{{- end }}
{{- end }}
- {{- /*
- Use host names derived from internal cluster DNS
- */}}
{{- if .Values.redis.enabled }}
- REDIS_HOST: {{ printf "%s-redis.%s.svc" (include "ragflow.fullname" .) .Release.Namespace }}
+ REDIS_HOST: {{ printf "%s" .Values.env.REDIS_HOST }}
REDIS_PORT: "6379"
{{- else }}
- REDIS_HOST: {{ required "env.REDIS_HOST is required when redis.enabled=false" .Values.env.REDIS_HOST | quote }}
+ REDIS_HOST: {{ printf "%s" .Values.env.REDIS_HOST }}
REDIS_PORT: {{ default "6379" .Values.env.REDIS_PORT | quote }}
{{- end }}
{{- if .Values.mysql.enabled }}
- MYSQL_HOST: {{ printf "%s-mysql.%s.svc" (include "ragflow.fullname" .) .Release.Namespace }}
+ MYSQL_HOST: {{ printf "%s" .Values.env.MYSQL_HOST }}
MYSQL_PORT: "3306"
{{- else }}
- MYSQL_HOST: {{ required "env.MYSQL_HOST is required when mysql.enabled=false" .Values.env.MYSQL_HOST | quote }}
+ MYSQL_HOST: {{ printf "%s" .Values.env.MYSQL_HOST }}
MYSQL_PORT: {{ default "3306" .Values.env.MYSQL_PORT | quote }}
MYSQL_USER: {{ default "root" .Values.env.MYSQL_USER | quote }}
{{- end }}
{{- if .Values.minio.enabled }}
- MINIO_HOST: {{ printf "%s-minio.%s.svc" (include "ragflow.fullname" .) .Release.Namespace }}
+ MINIO_HOST: {{ printf "%s" .Values.env.MINIO_HOST }}
MINIO_PORT: "9000"
{{- else }}
- MINIO_HOST: {{ default "" .Values.env.MINIO_HOST | quote }}
+ MINIO_HOST: {{ printf "%s" .Values.env.MINIO_HOST }}
MINIO_PORT: {{ default "9000" .Values.env.MINIO_PORT | quote }}
{{- end }}
- {{- /*
- Fail if passwords are not provided in release values
- */}}
REDIS_PASSWORD: {{ default "" .Values.env.REDIS_PASSWORD }}
- {{- /*
- NOTE: MySQL uses MYSQL_ROOT_PASSWORD env var but Ragflow container expects
- MYSQL_PASSWORD so we need to define both as the same value here.
- */}}
{{- with .Values.env.MYSQL_PASSWORD | required "MYSQL_PASSWORD is required" }}
MYSQL_PASSWORD: {{ . }}
MYSQL_ROOT_PASSWORD: {{ . }}
@@ -53,11 +39,8 @@ stringData:
{{- $minioPass := default "" .Values.env.MINIO_PASSWORD }}
MINIO_PASSWORD: {{ $minioPass }}
MINIO_ROOT_PASSWORD: {{ $minioPass }}
- {{- /*
- Only provide env vars for enabled doc engine
- */}}
{{- if eq .Values.env.DOC_ENGINE "elasticsearch" }}
- ES_HOST: {{ printf "%s-es.%s.svc" (include "ragflow.fullname" .) .Release.Namespace }}
+ ES_HOST: {{ printf "%s" .Values.env.ES_HOST }}
ELASTIC_PASSWORD: {{ .Values.env.ELASTIC_PASSWORD | required "ELASTIC_PASSWORD is required" }}
{{- else if eq .Values.env.DOC_ENGINE "infinity" }}
INFINITY_HOST: {{ printf "%s-infinity.%s.svc" (include "ragflow.fullname" .) .Release.Namespace }}
diff --git a/helm/templates/infinity.yaml b/helm/templates/infinity.yaml
index dcf38c904af..f7183efd5e7 100644
--- a/helm/templates/infinity.yaml
+++ b/helm/templates/infinity.yaml
@@ -60,7 +60,7 @@ spec:
{{- end }}
envFrom:
- secretRef:
- name: {{ include "ragflow.fullname" . }}-env-config
+ name: {{ include "ragflow.fullname" . }}
ports:
- containerPort: 23817
name: thrift
diff --git a/helm/templates/minio.yaml b/helm/templates/minio.yaml
index 01170dce7b1..ea861e15371 100644
--- a/helm/templates/minio.yaml
+++ b/helm/templates/minio.yaml
@@ -61,7 +61,7 @@ spec:
{{- end }}
envFrom:
- secretRef:
- name: {{ include "ragflow.fullname" . }}-env-config
+ name: {{ include "ragflow.fullname" . }}
args:
- server
- "--console-address=:9001"
diff --git a/helm/templates/mysql.yaml b/helm/templates/mysql.yaml
index a35b2aa048d..18779d65cec 100644
--- a/helm/templates/mysql.yaml
+++ b/helm/templates/mysql.yaml
@@ -27,6 +27,7 @@ metadata:
{{- include "ragflow.labels" . | nindent 4 }}
app.kubernetes.io/component: mysql
spec:
+ serviceName: {{ include "ragflow.fullname" . }}-mysql
replicas: 1
selector:
matchLabels:
@@ -62,15 +63,15 @@ spec:
{{- end }}
envFrom:
- secretRef:
- name: {{ include "ragflow.fullname" . }}-env-config
+ name: {{ include "ragflow.fullname" . }}
args:
- --max_connections=1000
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
- - --default-authentication-plugin=mysql_native_password
+ - --authentication_policy=caching_sha2_password
- --tls_version=TLSv1.2,TLSv1.3
- - --init-file=/data/application/init.sql
- --disable-log-bin
+ - --host_cache_size=0
ports:
- containerPort: 3306
name: mysql
@@ -81,7 +82,8 @@ spec:
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-data
- - mountPath: /data/application/init.sql
+ subPath: data
+ - mountPath: /docker-entrypoint-initdb.d/init.sql
subPath: init.sql
readOnly: true
name: init-script-volume
@@ -108,5 +110,5 @@ spec:
- protocol: TCP
port: 3306
targetPort: mysql
- type: {{ .Values.mysql.service.type }}
+ type: {{ .Values.mysql.service.type | default "ClusterIP" }}
{{- end }}
diff --git a/helm/templates/opensearch.yaml b/helm/templates/opensearch.yaml
index 1c504804af5..a748cda38ec 100644
--- a/helm/templates/opensearch.yaml
+++ b/helm/templates/opensearch.yaml
@@ -83,7 +83,7 @@ spec:
{{- end }}
envFrom:
- secretRef:
- name: {{ include "ragflow.fullname" . }}-env-config
+ name: {{ include "ragflow.fullname" . }}
- configMapRef:
name: {{ include "ragflow.fullname" . }}-opensearch-config
ports:
diff --git a/helm/templates/ragflow.yaml b/helm/templates/ragflow.yaml
index 62f3242fefa..6ccd4c0ec0f 100644
--- a/helm/templates/ragflow.yaml
+++ b/helm/templates/ragflow.yaml
@@ -46,7 +46,7 @@ spec:
- "--enable-adminserver"
{{- end }}
ports:
- - containerPort: 80
+ - containerPort: 8080
name: http
- containerPort: 9380
name: http-api
@@ -55,7 +55,7 @@ spec:
name: admin
{{- end }}
volumeMounts:
- - mountPath: /etc/nginx/conf.d/ragflow.conf
+ - mountPath: /etc/nginx/ragflow-helm.conf
subPath: ragflow.conf
name: nginx-config-volume
- mountPath: /etc/nginx/proxy.conf
diff --git a/helm/templates/ragflow_config.yaml b/helm/templates/ragflow_config.yaml
index 01f94937612..222bfb96af0 100644
--- a/helm/templates/ragflow_config.yaml
+++ b/helm/templates/ragflow_config.yaml
@@ -20,7 +20,7 @@ metadata:
data:
ragflow.conf: |
server {
- listen 80;
+ listen 8080;
server_name _;
root /ragflow/web/dist;
@@ -62,17 +62,22 @@ data:
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
nginx.conf: |
- user root;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
- pid /var/run/nginx.pid;
+ pid /tmp/nginx.pid;
events {
worker_connections 1024;
}
http {
+ client_body_temp_path /tmp/nginx_client_body;
+ proxy_temp_path /tmp/nginx_proxy;
+ fastcgi_temp_path /tmp/nginx_fastcgi;
+ uwsgi_temp_path /tmp/nginx_uwsgi;
+ scgi_temp_path /tmp/nginx_scgi;
+
include /etc/nginx/mime.types;
default_type application/octet-stream;
@@ -90,5 +95,5 @@ data:
#gzip on;
client_max_body_size 128M;
- include /etc/nginx/conf.d/ragflow.conf;
+ include /etc/nginx/ragflow-helm.conf;
}
diff --git a/helm/templates/redis.yaml b/helm/templates/redis.yaml
index 6ca77ab6a11..cc1c58ac98d 100644
--- a/helm/templates/redis.yaml
+++ b/helm/templates/redis.yaml
@@ -63,7 +63,7 @@ spec:
- "exec redis-server --requirepass ${REDIS_PASSWORD} --maxmemory 128mb --maxmemory-policy allkeys-lru"
envFrom:
- secretRef:
- name: {{ include "ragflow.fullname" . }}-env-config
+ name: {{ include "ragflow.fullname" . }}
ports:
- containerPort: 6379
name: redis
diff --git a/helm/values.yaml b/helm/values.yaml
index af90af59caf..a9c6ae11fdb 100644
--- a/helm/values.yaml
+++ b/helm/values.yaml
@@ -11,20 +11,23 @@ global:
imagePullSecrets: []
env:
+ SSL_CERT_FILE: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
# The type of doc engine to use.
# Available options:
# - `elasticsearch` (default)
# - `infinity` (https://github.com/infiniflow/infinity)
# - `opensearch` (https://github.com/opensearch-project/OpenSearch)
# DOC_ENGINE: elasticsearch
- DOC_ENGINE: infinity
+ DOC_ENGINE: elasticsearch
# DOC_ENGINE: opensearch
# The version of Elasticsearch.
STACK_VERSION: "8.11.3"
-
+ USE_DOCLING: true
+ REGISTER_ENABLED: "0"
# The password for Elasticsearch
ELASTIC_PASSWORD: infini_rag_flow_helm
+ ES_HOST: "ragflow-es.ragflow.svc.cluster.local"
# The password for OpenSearch.
# At least one uppercase letter, one lowercase letter, one digit, and one special character
@@ -35,7 +38,7 @@ env:
# The database of the MySQL service to use
MYSQL_DBNAME: rag_flow
# External MySQL host (only required when mysql.enabled=false)
- # MYSQL_HOST: ""
+ MYSQL_HOST: "ragflow-mysql.ragflow.svc.cluster.local"
# External MySQL port (defaults to 3306 if not set)
# MYSQL_PORT: "3306"
# External MySQL user (only when mysql.enabled=false), default is root if omitted
@@ -46,19 +49,19 @@ env:
# The password for MinIO
MINIO_PASSWORD: infini_rag_flow_helm
# External MinIO host
- # MINIO_HOST: ""
+ MINIO_HOST: "ragflow-minio.ragflow.svc.cluster.local"
# External MinIO port (defaults to 9000 if not set)
# MINIO_PORT: "9000"
# The password for Redis
REDIS_PASSWORD: infini_rag_flow_helm
# External Redis host (only required when redis.enabled=false)
- # REDIS_HOST: ""
+ REDIS_HOST: "ragflow-redis-svc.ragflow.svc.cluster.local"
# External Redis port (defaults to 6379 if not set)
# REDIS_PORT: "6379"
# The local time zone.
- TZ: "Asia/Shanghai"
+ TZ: "Europe/Berlin"
# Uncomment the following line if you have limited access to huggingface.co:
# HF_ENDPOINT: https://hf-mirror.com
@@ -69,15 +72,15 @@ env:
# After making the change, ensure you update `client_max_body_size` in nginx/nginx.conf correspondingly.
# The number of document chunks processed in a single batch during document parsing.
- DOC_BULK_SIZE: 4
+ DOC_BULK_SIZE: 64
# The number of text chunks processed in a single batch during embedding vectorization.
- EMBEDDING_BATCH_SIZE: 16
+ EMBEDDING_BATCH_SIZE: 128
ragflow:
image:
- repository: infiniflow/ragflow
- tag: v0.24.0
+ repository: quay-etaps.registry.intern/dap/kira
+ tag: testv24.3
pullPolicy: IfNotPresent
pullSecrets: []
# Optional service configuration overrides
@@ -123,8 +126,8 @@ ragflow:
infinity:
image:
- repository: infiniflow/infinity
- tag: v0.7.0-dev5
+ repository: quay-etaps.registry.intern/dap/infiniflow/infinity
+ tag: v0.7.0-dev2
pullPolicy: IfNotPresent
pullSecrets: []
storage:
@@ -138,17 +141,17 @@ infinity:
elasticsearch:
image:
- repository: elasticsearch
- tag: "8.11.3"
+ repository: quay-etaps.registry.intern/dap/elasticsearch
+ tag: 8.11.3
pullPolicy: IfNotPresent
pullSecrets: []
initContainers:
alpine:
- repository: alpine
+ repository: quay-etaps.registry.intern/dap/alpine
tag: latest
pullPolicy: IfNotPresent
busybox:
- repository: busybox
+ repository: quay-etaps.registry.intern/dap/busybox
tag: latest
pullPolicy: IfNotPresent
storage:
@@ -158,24 +161,24 @@ elasticsearch:
strategy:
resources:
requests:
- cpu: "4"
- memory: "16Gi"
+ cpu: "8"
+ memory: "32Gi"
service:
type: ClusterIP
opensearch:
image:
- repository: opensearchproject/opensearch
+ repository: quay-etaps.registry.intern/dap/opensearch
tag: 2.19.1
pullPolicy: IfNotPresent
pullSecrets: []
initContainers:
alpine:
- repository: alpine
+ repository: quay-etaps.registry.intern/dap/alpine
tag: latest
pullPolicy: IfNotPresent
busybox:
- repository: busybox
+ repository: quay-etaps.registry.intern/dap/busybox
tag: latest
pullPolicy: IfNotPresent
storage:
@@ -193,7 +196,7 @@ opensearch:
minio:
enabled: true
image:
- repository: quay.io/minio/minio
+ repository: quay-etaps.registry.intern/dap/minio
tag: RELEASE.2023-12-20T01-00-02Z
pullPolicy: IfNotPresent
pullSecrets: []
@@ -209,7 +212,7 @@ minio:
mysql:
enabled: true
image:
- repository: mysql
+ repository: quay-etaps.registry.intern/dap/mysql
tag: 8.0.39
pullPolicy: IfNotPresent
pullSecrets: []
@@ -225,7 +228,7 @@ mysql:
redis:
enabled: true
image:
- repository: valkey/valkey
+ repository: quay-etaps.registry.intern/dap/valkey
tag: 8
pullPolicy: IfNotPresent
pullSecrets: []
@@ -249,17 +252,17 @@ redis:
# This block is for setting up web service ingress. For more information, see:
# https://kubernetes.io/docs/concepts/services-networking/ingress/
ingress:
- enabled: false
+ enabled: true
className: ""
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- - host: chart-example.local
+ - host: kira-ragflow.apps.ocmtdx05.dyn.mtd.openshift.intern
paths:
- path: /
pathType: ImplementationSpecific
tls: []
# - secretName: chart-example-tls
# hosts:
- # - chart-example.local
+ # - chart-example.local
\ No newline at end of file
diff --git a/web/index.html b/web/index.html
index 5aea7c664b7..003776d7337 100644
--- a/web/index.html
+++ b/web/index.html
@@ -4,7 +4,7 @@
-
RAGFlow
+ KIRA
diff --git a/web/public/fonts/SparBd.ttf b/web/public/fonts/SparBd.ttf
new file mode 100644
index 00000000000..4726d6282e4
Binary files /dev/null and b/web/public/fonts/SparBd.ttf differ
diff --git a/web/public/fonts/SparRg.ttf b/web/public/fonts/SparRg.ttf
new file mode 100644
index 00000000000..a72982c434e
Binary files /dev/null and b/web/public/fonts/SparRg.ttf differ
diff --git a/web/public/logo.svg b/web/public/logo.svg
index 54167d2fb3f..965b62d5ed6 100644
--- a/web/public/logo.svg
+++ b/web/public/logo.svg
@@ -1,29 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/web/src/components/floating-chat-widget.tsx b/web/src/components/floating-chat-widget.tsx
index 30f548c8a9a..211a2d82504 100644
--- a/web/src/components/floating-chat-widget.tsx
+++ b/web/src/components/floating-chat-widget.tsx
@@ -4,10 +4,10 @@ import { MessageType, SharedFrom } from '@/constants/chat';
import { useFetchExternalAgentInputs } from '@/hooks/use-agent-request';
import { useFetchExternalChatInfo } from '@/hooks/use-chat-request';
import i18n, { changeLanguageAsync } from '@/locales/config';
-import { useTranslation } from 'react-i18next';
import { useSendNextSharedMessage } from '@/pages/agent/hooks/use-send-shared-message';
import { MessageCircle, Minimize2, Send, X } from 'lucide-react';
import React, { useCallback, useEffect, useRef, useState } from 'react';
+import { useTranslation } from 'react-i18next';
import {
useGetSharedChatSearchParams,
useSendSharedMessage,
diff --git a/web/src/components/ragflow-avatar.tsx b/web/src/components/ragflow-avatar.tsx
index 0141a99666d..62966abe655 100644
--- a/web/src/components/ragflow-avatar.tsx
+++ b/web/src/components/ragflow-avatar.tsx
@@ -3,12 +3,7 @@ import * as AvatarPrimitive from '@radix-ui/react-avatar';
import { forwardRef, memo, useMemo } from 'react';
import { Avatar, AvatarFallback, AvatarImage } from './ui/avatar';
-const PREDEFINED_COLORS = [
- { from: '#4F6DEE', to: '#67BDF9' },
- { from: '#38A04D', to: '#93DCA2' },
- { from: '#C35F2B', to: '#EDB395' },
- { from: '#633897', to: '#CBA1FF' },
-];
+const PREDEFINED_COLORS = [{ from: '#9B348E', to: '#ee0000' }];
const getStringHash = (str: string): number => {
if (typeof str !== 'string') return 0;
@@ -54,8 +49,8 @@ export const RAGFlowAvatar = memo(
const { initials, from, to } = useMemo(
() => ({
initials: getInitials(name),
- from: 'hsl(0, 0%, 30%)',
- to: 'hsl(0, 0%, 80%)',
+ from: 'hsl(0, 100%, 46.7%)',
+ to: 'hsl(308, 49.8%, 40.6%)',
...(name ? getColorForName(name) : {}),
}),
[name],
diff --git a/web/src/global.less b/web/src/global.less
index ddf5a1d893e..2e3a8fc8391 100644
--- a/web/src/global.less
+++ b/web/src/global.less
@@ -1,26 +1,23 @@
@import url(./inter.less);
-:root {
- --font-sans: 'Inter';
+html {
+ height: 100%;
+ overflow: hidden; // The content of the DatasetSettings page is too high, which will cause scroll bars to appear on the html tags. Setting the maximum height in DatasetSettings does not work either. I don't understand.
}
-@supports (font-variation-settings: normal) {
- :root {
- --font-sans: 'InterVariable';
- }
+body {
+ font-family: 'Spar', sans-serif;
+ margin: 0;
+ height: 100%;
}
-html,
-body,
#root {
- width: 100vw;
- width: 100dvw;
- height: 100vh;
- height: 100dvh;
- overflow: hidden;
+ height: 100%;
+}
- margin: 0;
- padding: 0;
+.ant-app {
+ height: 100%;
+ width: 100%;
}
.vue-office-excel {
diff --git a/web/src/inter.less b/web/src/inter.less
index aa8e2f33112..8253d91446a 100644
--- a/web/src/inter.less
+++ b/web/src/inter.less
@@ -4,270 +4,16 @@
:root { font-family: "InterVariable", sans-serif; font-optical-sizing: auto; }
} */
@font-face {
- font-family: InterVariable;
+ font-family: 'Spar';
font-style: normal;
- font-weight: 100 900;
- font-display: swap;
- src: url('@/assets/inter/InterVariable.woff2') format('woff2');
-}
-@font-face {
- font-family: InterVariable;
- font-style: italic;
- font-weight: 100 900;
- font-display: swap;
- src: url('@/assets/inter/InterVariable-Italic.woff2') format('woff2');
-}
-
-/* static fonts */
-@font-face {
- font-family: 'Inter';
- font-style: normal;
- font-weight: 100;
- font-display: swap;
- src: url('@/assets/inter/Inter-Thin.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: italic;
- font-weight: 100;
- font-display: swap;
- src: url('@/assets/inter/Inter-ThinItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: normal;
- font-weight: 200;
- font-display: swap;
- src: url('@/assets/inter/Inter-ExtraLight.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: italic;
- font-weight: 200;
- font-display: swap;
- src: url('@/assets/inter/Inter-ExtraLightItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: normal;
- font-weight: 300;
- font-display: swap;
- src: url('@/assets/inter/Inter-Light.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: italic;
- font-weight: 300;
- font-display: swap;
- src: url('@/assets/inter/Inter-LightItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: normal;
- font-weight: 400;
- font-display: swap;
- src: url('@/assets/inter/Inter-Regular.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: italic;
font-weight: 400;
font-display: swap;
- src: url('@/assets/inter/Inter-Italic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: normal;
- font-weight: 500;
- font-display: swap;
- src: url('@/assets/inter/Inter-Medium.woff2') format('woff2');
+ src: url('/fonts/SparRg.ttf') format('truetype');
}
@font-face {
- font-family: 'Inter';
- font-style: italic;
- font-weight: 500;
- font-display: swap;
- src: url('@/assets/inter/Inter-MediumItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
+ font-family: 'Spar';
font-style: normal;
- font-weight: 600;
- font-display: swap;
- src: url('@/assets/inter/Inter-SemiBold.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: italic;
- font-weight: 600;
- font-display: swap;
- src: url('@/assets/inter/Inter-SemiBoldItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: normal;
- font-weight: 700;
- font-display: swap;
- src: url('@/assets/inter/Inter-Bold.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: italic;
font-weight: 700;
font-display: swap;
- src: url('@/assets/inter/Inter-BoldItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: normal;
- font-weight: 800;
- font-display: swap;
- src: url('@/assets/inter/Inter-ExtraBold.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: italic;
- font-weight: 800;
- font-display: swap;
- src: url('@/assets/inter/Inter-ExtraBoldItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: normal;
- font-weight: 900;
- font-display: swap;
- src: url('@/assets/inter/Inter-Black.woff2') format('woff2');
-}
-@font-face {
- font-family: 'Inter';
- font-style: italic;
- font-weight: 900;
- font-display: swap;
- src: url('@/assets/inter/Inter-BlackItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: normal;
- font-weight: 100;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-Thin.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: italic;
- font-weight: 100;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-ThinItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: normal;
- font-weight: 200;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-ExtraLight.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: italic;
- font-weight: 200;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-ExtraLightItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: normal;
- font-weight: 300;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-Light.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: italic;
- font-weight: 300;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-LightItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: normal;
- font-weight: 400;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-Regular.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: italic;
- font-weight: 400;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-Italic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: normal;
- font-weight: 500;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-Medium.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: italic;
- font-weight: 500;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-MediumItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: normal;
- font-weight: 600;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-SemiBold.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: italic;
- font-weight: 600;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-SemiBoldItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: normal;
- font-weight: 700;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-Bold.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: italic;
- font-weight: 700;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-BoldItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: normal;
- font-weight: 800;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-ExtraBold.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: italic;
- font-weight: 800;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-ExtraBoldItalic.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: normal;
- font-weight: 900;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-Black.woff2') format('woff2');
-}
-@font-face {
- font-family: 'InterDisplay';
- font-style: italic;
- font-weight: 900;
- font-display: swap;
- src: url('@/assets/inter/InterDisplay-BlackItalic.woff2') format('woff2');
+ src: url('/fonts/SparBd.ttf') format('truetype');
}
diff --git a/web/src/layouts/components/global-navbar.tsx b/web/src/layouts/components/global-navbar.tsx
index f52ed492870..6839f3cc9a5 100644
--- a/web/src/layouts/components/global-navbar.tsx
+++ b/web/src/layouts/components/global-navbar.tsx
@@ -30,11 +30,6 @@ const menuItems = [
name: 'header.search',
/* icon: Search, */ 'data-testid': 'nav-search',
},
- {
- path: Routes.Agents,
- name: 'header.flow',
- /* icon: Cpu, */ 'data-testid': 'nav-agent',
- },
{ path: Routes.Memories, name: 'header.memories' /* icon: Cpu, */ },
{ path: Routes.Files, name: 'header.fileManager' /* icon: File, */ },
];
diff --git a/web/src/layouts/components/header.tsx b/web/src/layouts/components/header.tsx
index 0db9ad138d3..c182d24524b 100644
--- a/web/src/layouts/components/header.tsx
+++ b/web/src/layouts/components/header.tsx
@@ -1,4 +1,3 @@
-import { IconFontFill } from '@/components/icon-font';
import { RAGFlowAvatar } from '@/components/ragflow-avatar';
import { Button } from '@/components/ui/button';
import {
@@ -73,24 +72,6 @@ export function Header({
className="flex items-center justify-end gap-4 text-text-badge"
data-testid="auth-status"
>
-
-
-
-
-
-
-
-