Timothy Jaeryang Baek 4 місяців тому
батько
коміт
c4937cc144

+ 6 - 0
backend/open_webui/config.py

@@ -720,6 +720,12 @@ OPENAI_API_BASE_URL = "https://api.openai.com/v1"
 # WEBUI
 ####################################
 
+
+WEBUI_URL = PersistentConfig(
+    "WEBUI_URL", "webui.url", os.environ.get("WEBUI_URL", "http://localhost:3000")
+)
+
+
 ENABLE_SIGNUP = PersistentConfig(
     "ENABLE_SIGNUP",
     "ui.enable_signup",

+ 0 - 2
backend/open_webui/env.py

@@ -103,8 +103,6 @@ WEBUI_NAME = os.environ.get("WEBUI_NAME", "Open WebUI")
 if WEBUI_NAME != "Open WebUI":
     WEBUI_NAME += " (Open WebUI)"
 
-WEBUI_URL = os.environ.get("WEBUI_URL", "http://localhost:3000")
-
 WEBUI_FAVICON_URL = "https://openwebui.com/favicon.png"
 
 

+ 5 - 4
backend/open_webui/main.py

@@ -239,6 +239,7 @@ from open_webui.config import (
     CORS_ALLOW_ORIGIN,
     DEFAULT_LOCALE,
     OAUTH_PROVIDERS,
+    WEBUI_URL,
     # Admin
     ENABLE_ADMIN_CHAT_ACCESS,
     ENABLE_ADMIN_EXPORT,
@@ -264,7 +265,6 @@ from open_webui.env import (
     SAFE_MODE,
     SRC_LOG_LEVELS,
     VERSION,
-    WEBUI_URL,
     WEBUI_BUILD_HASH,
     WEBUI_SECRET_KEY,
     WEBUI_SESSION_COOKIE_SAME_SITE,
@@ -389,6 +389,7 @@ app.state.OPENAI_MODELS = {}
 #
 ########################################
 
+app.state.config.WEBUI_URL = WEBUI_URL
 app.state.config.ENABLE_SIGNUP = ENABLE_SIGNUP
 app.state.config.ENABLE_LOGIN_FORM = ENABLE_LOGIN_FORM
 app.state.config.ENABLE_API_KEY = ENABLE_API_KEY
@@ -1138,9 +1139,9 @@ async def get_opensearch_xml():
     <ShortName>{WEBUI_NAME}</ShortName>
     <Description>Search {WEBUI_NAME}</Description>
     <InputEncoding>UTF-8</InputEncoding>
-    <Image width="16" height="16" type="image/x-icon">{WEBUI_URL}/static/favicon.png</Image>
-    <Url type="text/html" method="get" template="{WEBUI_URL}/?q={"{searchTerms}"}"/>
-    <moz:SearchForm>{WEBUI_URL}</moz:SearchForm>
+    <Image width="16" height="16" type="image/x-icon">{app.state.config.WEBUI_URL}/static/favicon.png</Image>
+    <Url type="text/html" method="get" template="{app.state.config.WEBUI_URL}/?q={"{searchTerms}"}"/>
+    <moz:SearchForm>{app.state.config.WEBUI_URL}</moz:SearchForm>
     </OpenSearchDescription>
     """
     return Response(content=xml_content, media_type="application/xml")

+ 5 - 0
backend/open_webui/routers/auths.py

@@ -613,6 +613,7 @@ async def get_admin_details(request: Request, user=Depends(get_current_user)):
 async def get_admin_config(request: Request, user=Depends(get_admin_user)):
     return {
         "SHOW_ADMIN_DETAILS": request.app.state.config.SHOW_ADMIN_DETAILS,
+        "WEBUI_URL": request.app.state.config.WEBUI_URL,
         "ENABLE_SIGNUP": request.app.state.config.ENABLE_SIGNUP,
         "ENABLE_API_KEY": request.app.state.config.ENABLE_API_KEY,
         "ENABLE_CHANNELS": request.app.state.config.ENABLE_CHANNELS,
@@ -625,6 +626,7 @@ async def get_admin_config(request: Request, user=Depends(get_admin_user)):
 
 class AdminConfig(BaseModel):
     SHOW_ADMIN_DETAILS: bool
+    WEBUI_URL: str
     ENABLE_SIGNUP: bool
     ENABLE_API_KEY: bool
     ENABLE_CHANNELS: bool
@@ -639,6 +641,7 @@ async def update_admin_config(
     request: Request, form_data: AdminConfig, user=Depends(get_admin_user)
 ):
     request.app.state.config.SHOW_ADMIN_DETAILS = form_data.SHOW_ADMIN_DETAILS
+    request.app.state.config.WEBUI_URL = form_data.WEBUI_URL
     request.app.state.config.ENABLE_SIGNUP = form_data.ENABLE_SIGNUP
     request.app.state.config.ENABLE_API_KEY = form_data.ENABLE_API_KEY
     request.app.state.config.ENABLE_CHANNELS = form_data.ENABLE_CHANNELS
@@ -659,8 +662,10 @@ async def update_admin_config(
 
     return {
         "SHOW_ADMIN_DETAILS": request.app.state.config.SHOW_ADMIN_DETAILS,
+        "WEBUI_URL": request.app.state.config.WEBUI_URL,
         "ENABLE_SIGNUP": request.app.state.config.ENABLE_SIGNUP,
         "ENABLE_API_KEY": request.app.state.config.ENABLE_API_KEY,
+        "ENABLE_CHANNELS": request.app.state.config.ENABLE_CHANNELS,
         "DEFAULT_USER_ROLE": request.app.state.config.DEFAULT_USER_ROLE,
         "JWT_EXPIRES_IN": request.app.state.config.JWT_EXPIRES_IN,
         "ENABLE_COMMUNITY_SHARING": request.app.state.config.ENABLE_COMMUNITY_SHARING,

+ 10 - 5
backend/open_webui/routers/channels.py

@@ -16,7 +16,7 @@ from open_webui.models.messages import Messages, MessageModel, MessageForm
 
 from open_webui.config import ENABLE_ADMIN_CHAT_ACCESS, ENABLE_ADMIN_EXPORT
 from open_webui.constants import ERROR_MESSAGES
-from open_webui.env import SRC_LOG_LEVELS, WEBUI_URL
+from open_webui.env import SRC_LOG_LEVELS
 
 
 from open_webui.utils.auth import get_admin_user, get_verified_user
@@ -181,7 +181,7 @@ async def get_channel_messages(
 ############################
 
 
-async def send_notification(channel, message, active_user_ids):
+async def send_notification(webui_url, channel, message, active_user_ids):
     users = get_users_with_access("read", channel.access_control)
 
     for user in users:
@@ -196,18 +196,19 @@ async def send_notification(channel, message, active_user_ids):
                 if webhook_url:
                     post_webhook(
                         webhook_url,
-                        f"#{channel.name} - {WEBUI_URL}/channels/{channel.id}\n\n{message.content}",
+                        f"#{channel.name} - {webui_url}/channels/{channel.id}\n\n{message.content}",
                         {
                             "action": "channel",
                             "message": message.content,
                             "title": channel.name,
-                            "url": f"{WEBUI_URL}/channels/{channel.id}",
+                            "url": f"{webui_url}/channels/{channel.id}",
                         },
                     )
 
 
 @router.post("/{id}/messages/post", response_model=Optional[MessageModel])
 async def post_new_message(
+    request: Request,
     id: str,
     form_data: MessageForm,
     background_tasks: BackgroundTasks,
@@ -253,7 +254,11 @@ async def post_new_message(
             active_user_ids = get_user_ids_from_room(f"channel:{channel.id}")
 
             background_tasks.add_task(
-                send_notification, channel, message, active_user_ids
+                send_notification,
+                request.app.state.config.WEBUI_URL,
+                channel,
+                message,
+                active_user_ids,
             )
 
         return MessageModel(**message.model_dump())

+ 2 - 3
backend/open_webui/utils/middleware.py

@@ -65,7 +65,6 @@ from open_webui.env import (
     SRC_LOG_LEVELS,
     GLOBAL_LOG_LEVEL,
     BYPASS_MODEL_ACCESS_CONTROL,
-    WEBUI_URL,
 )
 from open_webui.constants import TASKS
 
@@ -859,12 +858,12 @@ async def process_chat_response(
                                 if webhook_url:
                                     post_webhook(
                                         webhook_url,
-                                        f"{title} - {WEBUI_URL}/c/{metadata['chat_id']}\n\n{content}",
+                                        f"{title} - {request.app.state.config.WEBUI_URL}/c/{metadata['chat_id']}\n\n{content}",
                                         {
                                             "action": "chat",
                                             "message": content,
                                             "title": title,
-                                            "url": f"{WEBUI_URL}/c/{metadata['chat_id']}",
+                                            "url": f"{request.app.state.config.WEBUI_URL}/c/{metadata['chat_id']}",
                                         },
                                     )
 

+ 23 - 0
src/lib/components/admin/Settings/General.svelte

@@ -142,6 +142,29 @@
 
 				<hr class=" border-gray-50 dark:border-gray-850 my-2" />
 
+				<div class=" w-full justify-between">
+					<div class="flex w-full justify-between">
+						<div class=" self-center text-xs font-medium">{$i18n.t('WebUI URL')}</div>
+					</div>
+
+					<div class="flex mt-2 space-x-2">
+						<input
+							class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
+							type="text"
+							placeholder={`e.g.) "http://localhost:3000"`}
+							bind:value={adminConfig.WEBUI_URL}
+						/>
+					</div>
+
+					<div class="mt-2 text-xs text-gray-400 dark:text-gray-500">
+						{$i18n.t(
+							'Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.'
+						)}
+					</div>
+				</div>
+
+				<hr class=" border-gray-50 dark:border-gray-850 my-2" />
+
 				<div class=" w-full justify-between">
 					<div class="flex w-full justify-between">
 						<div class=" self-center text-xs font-medium">{$i18n.t('JWT Expiration')}</div>