From 3c41159d264c48794a4539efbbd4f04fa48bcdce Mon Sep 17 00:00:00 2001 From: FoolFu <162613064+FoolFu@users.noreply.github.com> Date: Mon, 24 Nov 2025 10:21:06 +0800 Subject: [PATCH 1/7] Update logging for auto-generated SECRET_KEY (#11458) Remove the code that exposes the generated key in the log, as it poses a security risk. image --------- Co-authored-by: Kevin Hu --- common/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/settings.py b/common/settings.py index ac2b13e00..9df0c0cd2 100644 --- a/common/settings.py +++ b/common/settings.py @@ -139,7 +139,7 @@ def _get_or_create_secret_key(): import logging new_key = secrets.token_hex(32) - logging.warning(f"SECURITY WARNING: Using auto-generated SECRET_KEY. Generated key: {new_key}") + logging.warning("SECURITY WARNING: Using auto-generated SECRET_KEY.") return new_key class StorageFactory: From 01817478810a5bd53af7a11a53691e8b9930c658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20L=C3=B3pez=20Carrascal?= Date: Mon, 24 Nov 2025 03:21:27 +0100 Subject: [PATCH 2/7] Fix nginx startup failure in HTTPS mode (host not found) (#11455) ### Description This PR fixes a bug where Nginx fails to start when using the `ragflow.https.conf` configuration. The upstream host `ragflow` was not resolving correctly inside the container context, causing an `[emerg] host not found` error. ### Changes - Updated `docker/nginx/ragflow.https.conf`: Changed upstream host from `ragflow` to `localhost` for both the admin API and the main API. ### Related Issue Fixes #11453 ### Testing - [x] Enabled HTTPS config in Docker. - [x] Verified Nginx starts successfully without "host not found" errors. - [x] Verified API accessibility. --- docker/nginx/ragflow.https.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/nginx/ragflow.https.conf b/docker/nginx/ragflow.https.conf index 71cd241e7..2ef4cd005 100644 --- a/docker/nginx/ragflow.https.conf +++ b/docker/nginx/ragflow.https.conf @@ -23,12 +23,12 @@ server { gzip_disable "MSIE [1-6]\."; location ~ ^/api/v1/admin { - proxy_pass http://ragflow:9381; + proxy_pass http://localhost:9381; include proxy.conf; } location ~ ^/(v1|api) { - proxy_pass http://ragflow:9380; + proxy_pass http://localhost:9380; include proxy.conf; } From 7140950e933aa7f86a182892ecbb4dba8e72e47f Mon Sep 17 00:00:00 2001 From: Hu Hao <92927055+Zwanan-github@users.noreply.github.com> Date: Mon, 24 Nov 2025 10:27:22 +0800 Subject: [PATCH 3/7] =?UTF-8?q?Feat:=20Implement=20temporary=20conversatio?= =?UTF-8?q?n=20removal=20logic=20in=20ConversationD=E2=80=A6=20(#11454)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### What problem does this PR solve? Implement temporary conversation removal logic in ConversationDropDown Before modification: 图片 After modification: 图片 图片 ### Type of change - [x] Bug Fix (non-breaking change which fixes an issue) - [x] New Feature (non-breaking change which adds functionality) --------- Co-authored-by: Kevin Hu --- .../next-chats/chat/conversation-dropdown.tsx | 16 ++++++++++++++-- web/src/pages/next-chats/chat/sessions.tsx | 6 +++++- .../hooks/use-select-conversation-list.ts | 9 +++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/web/src/pages/next-chats/chat/conversation-dropdown.tsx b/web/src/pages/next-chats/chat/conversation-dropdown.tsx index 83193f57c..27bed0a7e 100644 --- a/web/src/pages/next-chats/chat/conversation-dropdown.tsx +++ b/web/src/pages/next-chats/chat/conversation-dropdown.tsx @@ -14,16 +14,28 @@ import { useTranslation } from 'react-i18next'; export function ConversationDropdown({ children, conversation, + removeTemporaryConversation, }: PropsWithChildren & { conversation: IConversation; + removeTemporaryConversation?: (conversationId: string) => void; }) { const { t } = useTranslation(); const { removeConversation } = useRemoveConversation(); const handleDelete: MouseEventHandler = useCallback(() => { - removeConversation([conversation.id]); - }, [conversation.id, removeConversation]); + if (conversation.is_new && removeTemporaryConversation) { + removeTemporaryConversation(conversation.id); + removeConversation([]); + } else { + removeConversation([conversation.id]); + } + }, [ + conversation.id, + conversation.is_new, + removeConversation, + removeTemporaryConversation, + ]); return ( diff --git a/web/src/pages/next-chats/chat/sessions.tsx b/web/src/pages/next-chats/chat/sessions.tsx index 98b707374..15433b38d 100644 --- a/web/src/pages/next-chats/chat/sessions.tsx +++ b/web/src/pages/next-chats/chat/sessions.tsx @@ -29,6 +29,7 @@ export function Sessions({ const { list: conversationList, addTemporaryConversation, + removeTemporaryConversation, handleInputChange, searchString, } = useSelectDerivedConversationList(); @@ -97,7 +98,10 @@ export function Sessions({ >
{x.name}
- +
diff --git a/web/src/pages/next-chats/hooks/use-select-conversation-list.ts b/web/src/pages/next-chats/hooks/use-select-conversation-list.ts index a40c57a0c..a37d3078b 100644 --- a/web/src/pages/next-chats/hooks/use-select-conversation-list.ts +++ b/web/src/pages/next-chats/hooks/use-select-conversation-list.ts @@ -80,6 +80,14 @@ export const useSelectDerivedConversationList = () => { }); }, [conversationList, dialogId, prologue, t, setNewConversationRouteParams]); + const removeTemporaryConversation = useCallback((conversationId: string) => { + setList((prevList) => { + return prevList.filter( + (conversation) => conversation.id !== conversationId, + ); + }); + }, []); + // When you first enter the page, select the top conversation card useEffect(() => { @@ -89,6 +97,7 @@ export const useSelectDerivedConversationList = () => { return { list, addTemporaryConversation, + removeTemporaryConversation, loading, handleInputChange, searchString, From 8fe782f4ea4e3e6724f4d667ec9ced5eac502c90 Mon Sep 17 00:00:00 2001 From: chanx <1243304602@qq.com> Date: Mon, 24 Nov 2025 12:20:48 +0800 Subject: [PATCH 4/7] Fix:Modify the personal center style #10703 (#11470) ### What problem does this PR solve? Fix:Modify the personal center style #10703 - All form-label font styles are no longer bold - Menus are not highlighted on first visit to the personal center ### Type of change - [x] Bug Fix (non-breaking change which fixes an issue) --- .../components/originui/select-with-search.tsx | 9 +++++++-- web/src/components/ui/label.tsx | 2 +- web/src/hooks/common-hooks.tsx | 15 +++++++++++---- web/src/locales/en.ts | 5 ++++- web/src/locales/zh.ts | 2 ++ .../components/user-setting-header/index.tsx | 2 +- .../data-source/data-source-detail-page/index.tsx | 8 +++++--- web/src/pages/user-setting/data-source/index.tsx | 9 +++++++-- .../setting-model/components/system-setting.tsx | 1 + web/src/pages/user-setting/sidebar/hooks.tsx | 13 ++++++++++--- 10 files changed, 49 insertions(+), 17 deletions(-) diff --git a/web/src/components/originui/select-with-search.tsx b/web/src/components/originui/select-with-search.tsx index e3cec6240..4b87792d7 100644 --- a/web/src/components/originui/select-with-search.tsx +++ b/web/src/components/originui/select-with-search.tsx @@ -47,6 +47,7 @@ export type SelectWithSearchFlagProps = { allowClear?: boolean; disabled?: boolean; placeholder?: string; + emptyData?: string; }; function findLabelWithoutOptions( @@ -78,6 +79,7 @@ export const SelectWithSearch = forwardRef< allowClear = false, disabled = false, placeholder = t('common.selectPlaceholder'), + emptyData = t('common.noDataFound'), }, ref, ) => { @@ -183,8 +185,8 @@ export const SelectWithSearch = forwardRef< className=" placeholder:text-text-disabled" /> )} - - {t('common.noDataFound')} + + {emptyData} {options.map((group, idx) => { if (group.options) { return ( @@ -196,6 +198,9 @@ export const SelectWithSearch = forwardRef< value={option.value} disabled={option.disabled} onSelect={handleSelect} + className={ + value === option.value ? 'bg-bg-card' : '' + } > {option.label} diff --git a/web/src/components/ui/label.tsx b/web/src/components/ui/label.tsx index 64a56584c..ce1e55565 100644 --- a/web/src/components/ui/label.tsx +++ b/web/src/components/ui/label.tsx @@ -7,7 +7,7 @@ import * as React from 'react'; import { cn } from '@/lib/utils'; const labelVariants = cva( - 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 text-text-secondary', + 'text-sm font-normal leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 text-text-secondary', ); const Label = React.forwardRef< diff --git a/web/src/hooks/common-hooks.tsx b/web/src/hooks/common-hooks.tsx index 1d8ca4c42..7f7729ade 100644 --- a/web/src/hooks/common-hooks.tsx +++ b/web/src/hooks/common-hooks.tsx @@ -88,18 +88,18 @@ export const useShowDeleteConfirm = () => { ({ title, content, onOk, onCancel }: IProps): Promise => { return new Promise((resolve, reject) => { Modal.show({ - title: title ?? t('common.deleteModalTitle'), + // title: title ?? t('common.deleteModalTitle'), + closable: false, visible: true, onVisibleChange: () => { Modal.hide(); }, footer: null, - closable: true, maskClosable: false, okText: t('common.yes'), cancelText: t('common.no'), style: { - width: '400px', + width: '450px', }, okButtonClassName: 'bg-state-error text-white hover:bg-state-error hover:text-white', @@ -116,7 +116,14 @@ export const useShowDeleteConfirm = () => { onCancel?.(); Modal.hide(); }, - children: content, + children: ( +
+
+ {title ?? t('common.deleteModalTitle')} +
+
{content}
+
+ ), }); }); }, diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts index 01271b677..44eff8144 100644 --- a/web/src/locales/en.ts +++ b/web/src/locales/en.ts @@ -696,6 +696,9 @@ This auto-tagging feature enhances retrieval by adding another layer of domain-s tocEnhanceTip: ` During the parsing of the document, table of contents information was generated (see the 'Enable Table of Contents Extraction' option in the General method). This allows the large model to return table of contents items relevant to the user's query, thereby using these items to retrieve related chunks and apply weighting to these chunks during the sorting process. This approach is derived from mimicking the behavioral logic of how humans search for knowledge in books.`, }, setting: { + modelEmptyTip: + 'No models available. Please add models from the panel on the right.', + sourceEmptyTip: 'No data sources added yet. Select one below to connect.', seconds: 'seconds', minutes: 'minutes', edit: 'Edit', @@ -716,7 +719,7 @@ Example: https://fsn1.your-objectstorage.com`, deleteSourceModalTitle: 'Delete data source', deleteSourceModalContent: `

Are you sure you want to delete this data source link?

`, - deleteSourceModalConfirmText: 'Comfirm', + deleteSourceModalConfirmText: 'Confirm', errorMsg: 'Error message', newDocs: 'New Docs', timeStarted: 'Time started', diff --git a/web/src/locales/zh.ts b/web/src/locales/zh.ts index 70a78c825..d2f4b1d16 100644 --- a/web/src/locales/zh.ts +++ b/web/src/locales/zh.ts @@ -685,6 +685,8 @@ General:实体和关系提取提示来自 GitHub - microsoft/graphrag:基于 tocEnhanceTip: `解析文档时生成了目录信息(见General方法的‘启用目录抽取’),让大模型返回和用户问题相关的目录项,从而利用目录项拿到相关chunk,对这些chunk在排序中进行加权。这种方法来源于模仿人类查询书本中知识的行为逻辑`, }, setting: { + modelEmptyTip: '暂无可用模型,请先在右侧面板添加模型。', + sourceEmptyTip: '暂未添加任何数据源,请从下方选择一个进行连接。', seconds: '秒', minutes: '分', edit: '编辑', diff --git a/web/src/pages/user-setting/components/user-setting-header/index.tsx b/web/src/pages/user-setting/components/user-setting-header/index.tsx index 931e2681d..d54e57769 100644 --- a/web/src/pages/user-setting/components/user-setting-header/index.tsx +++ b/web/src/pages/user-setting/components/user-setting-header/index.tsx @@ -10,7 +10,7 @@ export const UserSettingHeader = ({ }) => { return ( <> -
+
{name}
{description && (
{description}
diff --git a/web/src/pages/user-setting/data-source/data-source-detail-page/index.tsx b/web/src/pages/user-setting/data-source/data-source-detail-page/index.tsx index 1962cf07c..fe54dda64 100644 --- a/web/src/pages/user-setting/data-source/data-source-detail-page/index.tsx +++ b/web/src/pages/user-setting/data-source/data-source-detail-page/index.tsx @@ -170,7 +170,7 @@ const SourceDetailPage = () => { - +
{ defaultValues={defaultValues} />
-
-
{t('setting.log')}
+
+
+ {t('setting.log')} +
diff --git a/web/src/pages/user-setting/data-source/index.tsx b/web/src/pages/user-setting/data-source/index.tsx index a738ce447..2ba7cecd0 100644 --- a/web/src/pages/user-setting/data-source/index.tsx +++ b/web/src/pages/user-setting/data-source/index.tsx @@ -120,6 +120,11 @@ const DataSource = () => {
+ {categorizedList?.length <= 0 && ( +
+ {t('setting.sourceEmptyTip')} +
+ )} {categorizedList.map((item, index) => ( ))} @@ -127,9 +132,9 @@ const DataSource = () => {
{/* */} - + {t('setting.availableSources')} -
+
{t('setting.availableSourcesDescription')}
diff --git a/web/src/pages/user-setting/setting-model/components/system-setting.tsx b/web/src/pages/user-setting/setting-model/components/system-setting.tsx index a8714b998..97906a421 100644 --- a/web/src/pages/user-setting/setting-model/components/system-setting.tsx +++ b/web/src/pages/user-setting/setting-model/components/system-setting.tsx @@ -161,6 +161,7 @@ const SystemSetting = ({ onOk, loading }: IProps) => { options={options} onChange={(value) => handleFieldChange(id, value)} placeholder={t('selectModelPlaceholder')} + emptyData={t('modelEmptyTip')} />
); diff --git a/web/src/pages/user-setting/sidebar/hooks.tsx b/web/src/pages/user-setting/sidebar/hooks.tsx index fcfedcfca..47415a4ea 100644 --- a/web/src/pages/user-setting/sidebar/hooks.tsx +++ b/web/src/pages/user-setting/sidebar/hooks.tsx @@ -1,12 +1,19 @@ import { useLogout } from '@/hooks/login-hooks'; import { Routes } from '@/routes'; -import { useCallback, useState } from 'react'; -import { useNavigate } from 'umi'; +import { useCallback, useEffect, useState } from 'react'; +import { useLocation, useNavigate } from 'umi'; export const useHandleMenuClick = () => { const navigate = useNavigate(); const [active, setActive] = useState(); const { logout } = useLogout(); + const location = useLocation(); + useEffect(() => { + const path = (location.pathname.split('/')?.[2] || '') as Routes; + if (path) { + setActive(('/' + path) as Routes); + } + }, [location]); const handleMenuClick = useCallback( (key: Routes) => () => { @@ -20,5 +27,5 @@ export const useHandleMenuClick = () => { [logout, navigate], ); - return { handleMenuClick, active }; + return { handleMenuClick, active, setActive }; }; From 10098198019db58c73b0830c751ff56ea86eb747 Mon Sep 17 00:00:00 2001 From: Billy Bao Date: Mon, 24 Nov 2025 12:21:33 +0800 Subject: [PATCH 5/7] Fix: coroutine object has no attribute get (#11472) ### What problem does this PR solve? Fix: coroutine object has no attribute get ### Type of change - [x] Bug Fix (non-breaking change which fixes an issue) --- api/apps/file_app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/apps/file_app.py b/api/apps/file_app.py index 8b5383a66..e262b3d7b 100644 --- a/api/apps/file_app.py +++ b/api/apps/file_app.py @@ -125,8 +125,8 @@ async def upload(): @validate_request("name") async def create(): req = await request.json - pf_id = await request.json.get("parent_id") - input_file_type = await request.json.get("type") + pf_id = req.get("parent_id") + input_file_type = req.get("type") if not pf_id: root_folder = FileService.get_root_folder(current_user.id) pf_id = root_folder["id"] From 4d8698624c9bb65ff590685ff4c2c5a55cc6f48d Mon Sep 17 00:00:00 2001 From: writinwaters <93570324+writinwaters@users.noreply.github.com> Date: Mon, 24 Nov 2025 17:38:04 +0800 Subject: [PATCH 6/7] Docs: Updated use_kg and toc_enhance switch descriptions (#11485) ### What problem does this PR solve? ### Type of change - [x] Documentation Update --- docs/references/http_api_reference.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/references/http_api_reference.md b/docs/references/http_api_reference.md index 253745432..3c73cf58c 100644 --- a/docs/references/http_api_reference.md +++ b/docs/references/http_api_reference.md @@ -2122,9 +2122,9 @@ curl --request POST \ - `"top_k"`: (*Body parameter*), `integer` The number of chunks engaged in vector cosine computation. Defaults to `1024`. - `"use_kg"`: (*Body parameter*), `boolean` - The search includes text chunks related to the knowledge graph of the selected dataset to handle complex multi-hop queries. Defaults to `False`. + Whether to search chunks related to the generated knowledge graph for multi-hop queries. Defaults to `False`. Before enabling this, ensure you have successfully constructed a knowledge graph for the specified datasets. See [here](https://ragflow.io/docs/dev/construct_knowledge_graph) for details. - `"toc_enhance"`: (*Body parameter*), `boolean` - The search includes table of content enhancement in order to boost rank of relevant chunks. Files parsed with `TOC Enhance` enabled is prerequisite. Defaults to `False`. + Whether to search chunks with extracted table of content. Defaults to `False`. Before enabling this, ensure you have enabled `TOC_Enhance` and successfully extracted table of contents for the specified datasets. See [here](https://ragflow.io/docs/dev/enable_table_of_contents) for details. - `"rerank_id"`: (*Body parameter*), `integer` The ID of the rerank model. - `"keyword"`: (*Body parameter*), `boolean` @@ -2140,8 +2140,8 @@ curl --request POST \ - `"metadata_condition"`: (*Body parameter*), `object` The metadata condition used for filtering chunks: - `"logic"`: (*Body parameter*), `string` - - `"and"` Intersection of the result from each condition (default). - - `"or"` union of the result from each condition. + - `"and"`: Return only results that satisfy *every* condition (default). + - `"or"`: Return results that satisfy *any* condition. - `"conditions"`: (*Body parameter*), `array` A list of metadata filter conditions. - `"name"`: `string` - The metadata field name to filter by, e.g., `"author"`, `"company"`, `"url"`. Ensure this parameter before use. See [Set metadata](../guides/dataset/set_metadata.md) for details. From d5f85482005ce5d798609ef228a782e5361c24cb Mon Sep 17 00:00:00 2001 From: zhipeng <5310853+Ox0400@users.noreply.github.com> Date: Mon, 24 Nov 2025 19:02:08 +0800 Subject: [PATCH 7/7] Allow create super user when start rag server. (#10634) ### What problem does this PR solve? New options for rag server scripts to create the super admin user when start server. ### Type of change - [x] New Feature (non-breaking change which adds functionality) --------- Co-authored-by: Zhichang Yu Co-authored-by: Jin Hai --- api/db/init_data.py | 15 +++++++++------ api/ragflow_server.py | 7 ++++++- docker/entrypoint.sh | 9 ++++++++- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/api/db/init_data.py b/api/db/init_data.py index 4a9ad067a..d4873d332 100644 --- a/api/db/init_data.py +++ b/api/db/init_data.py @@ -34,14 +34,17 @@ from common.file_utils import get_project_base_directory from common import settings from api.common.base64 import encode_to_base64 +DEFAULT_SUPERUSER_NICKNAME = os.getenv("DEFAULT_SUPERUSER_NICKNAME", "admin") +DEFAULT_SUPERUSER_EMAIL = os.getenv("DEFAULT_SUPERUSER_EMAIL", "admin@ragflow.io") +DEFAULT_SUPERUSER_PASSWORD = os.getenv("DEFAULT_SUPERUSER_PASSWORD", "admin") -def init_superuser(): +def init_superuser(nickname=DEFAULT_SUPERUSER_NICKNAME, email=DEFAULT_SUPERUSER_EMAIL, password=DEFAULT_SUPERUSER_PASSWORD, role=UserTenantRole.OWNER): user_info = { "id": uuid.uuid1().hex, - "password": encode_to_base64("admin"), - "nickname": "admin", + "password": encode_to_base64(password), + "nickname": nickname, "is_superuser": True, - "email": "admin@ragflow.io", + "email": email, "creator": "system", "status": "1", } @@ -58,7 +61,7 @@ def init_superuser(): "tenant_id": user_info["id"], "user_id": user_info["id"], "invited_by": user_info["id"], - "role": UserTenantRole.OWNER + "role": role } tenant_llm = get_init_tenant_llm(user_info["id"]) @@ -70,7 +73,7 @@ def init_superuser(): UserTenantService.insert(**usr_tenant) TenantLLMService.insert_many(tenant_llm) logging.info( - "Super user initialized. email: admin@ragflow.io, password: admin. Changing the password after login is strongly recommended.") + f"Super user initialized. email: {email}, password: {password}. Changing the password after login is strongly recommended.") chat_mdl = LLMBundle(tenant["id"], LLMType.CHAT, tenant["llm_id"]) msg = chat_mdl.chat(system="", history=[ diff --git a/api/ragflow_server.py b/api/ragflow_server.py index 852372d0b..a2d9d6a6e 100644 --- a/api/ragflow_server.py +++ b/api/ragflow_server.py @@ -37,7 +37,7 @@ from api.db.services.document_service import DocumentService from common.file_utils import get_project_base_directory from common import settings from api.db.db_models import init_database_tables as init_web_db -from api.db.init_data import init_web_data +from api.db.init_data import init_web_data, init_superuser from common.versions import get_ragflow_version from common.config_utils import show_configs from common.mcp_tool_call_conn import shutdown_all_mcp_sessions @@ -109,11 +109,16 @@ if __name__ == '__main__': parser.add_argument( "--debug", default=False, help="debug mode", action="store_true" ) + parser.add_argument( + "--init-superuser", default=False, help="init superuser", action="store_true" + ) args = parser.parse_args() if args.version: print(get_ragflow_version()) sys.exit(0) + if args.init_superuser: + init_superuser() RuntimeConfig.DEBUG = args.debug if RuntimeConfig.DEBUG: logging.info("run on debug mode") diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index cfde08d0c..a5942c5b8 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -13,6 +13,7 @@ function usage() { echo " --disable-datasync Disables synchronization of datasource workers." echo " --enable-mcpserver Enables the MCP server." echo " --enable-adminserver Enables the Admin server." + echo " --init-superuser Initializes the superuser." echo " --consumer-no-beg= Start range for consumers (if using range-based)." echo " --consumer-no-end= End range for consumers (if using range-based)." echo " --workers= Number of task executors to run (if range is not used)." @@ -24,6 +25,7 @@ function usage() { echo " $0 --disable-webserver --workers=2 --host-id=myhost123" echo " $0 --enable-mcpserver" echo " $0 --enable-adminserver" + echo " $0 --init-superuser" exit 1 } @@ -32,6 +34,7 @@ ENABLE_TASKEXECUTOR=1 # Default to enable task executor ENABLE_DATASYNC=1 ENABLE_MCP_SERVER=0 ENABLE_ADMIN_SERVER=0 # Default close admin server +INIT_SUPERUSER_ARGS="" # Default to not initialize superuser CONSUMER_NO_BEG=0 CONSUMER_NO_END=0 WORKERS=1 @@ -83,6 +86,10 @@ for arg in "$@"; do ENABLE_ADMIN_SERVER=1 shift ;; + --init-superuser) + INIT_SUPERUSER_ARGS="--init-superuser" + shift + ;; --mcp-host=*) MCP_HOST="${arg#*=}" shift @@ -240,7 +247,7 @@ if [[ "${ENABLE_WEBSERVER}" -eq 1 ]]; then echo "Starting ragflow_server..." while true; do - "$PY" api/ragflow_server.py & + "$PY" api/ragflow_server.py ${INIT_SUPERUSER_ARGS} & wait; sleep 1; done &