diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 48c623bef..e6e66f34a 100644 --- a/backend/open_webui/config.py +++ b/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", diff --git a/backend/open_webui/env.py b/backend/open_webui/env.py index 0fd6080de..a5f848b62 100644 --- a/backend/open_webui/env.py +++ b/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" diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 56e967ae4..190102041 100644 --- a/backend/open_webui/main.py +++ b/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(): {WEBUI_NAME} Search {WEBUI_NAME} UTF-8 - {WEBUI_URL}/static/favicon.png - - {WEBUI_URL} + {app.state.config.WEBUI_URL}/static/favicon.png + + {app.state.config.WEBUI_URL} """ return Response(content=xml_content, media_type="application/xml") diff --git a/backend/open_webui/routers/auths.py b/backend/open_webui/routers/auths.py index e8739a12c..d7cd8de2c 100644 --- a/backend/open_webui/routers/auths.py +++ b/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, diff --git a/backend/open_webui/routers/channels.py b/backend/open_webui/routers/channels.py index 5272bd59d..292f33e78 100644 --- a/backend/open_webui/routers/channels.py +++ b/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()) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index c055eea21..b818fe540 100644 --- a/backend/open_webui/utils/middleware.py +++ b/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']}", }, ) diff --git a/src/lib/components/admin/Settings/General.svelte b/src/lib/components/admin/Settings/General.svelte index ce3cfec26..231ddc95d 100644 --- a/src/lib/components/admin/Settings/General.svelte +++ b/src/lib/components/admin/Settings/General.svelte @@ -142,6 +142,29 @@
+
+
+
{$i18n.t('WebUI URL')}
+
+ +
+ +
+ +
+ {$i18n.t( + 'Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.' + )} +
+
+ +
+
{$i18n.t('JWT Expiration')}