From 7a3825cfced767eddfaddbe03eeaac918f3f10cd Mon Sep 17 00:00:00 2001 From: hjlarry Date: Sat, 20 Sep 2025 11:15:13 +0800 Subject: [PATCH] fix docker config --- api/app.py | 14 +++++++++++--- api/docker/entrypoint.sh | 4 ++-- api/extensions/ext_socketio.py | 4 +--- api/pyproject.toml | 1 + api/uv.lock | 14 ++++++++++++++ .../collaboration/core/websocket-manager.ts | 2 +- web/docker/entrypoint.sh | 1 + 7 files changed, 31 insertions(+), 9 deletions(-) diff --git a/api/app.py b/api/app.py index 0197b77add..666dba0611 100644 --- a/api/app.py +++ b/api/app.py @@ -9,10 +9,16 @@ def is_db_command(): # create app +celery = None +flask_app = None +socketio_app = None + if is_db_command(): from app_factory import create_migrations_app app = create_migrations_app() + socketio_app = app + flask_app = app else: # It seems that JetBrains Python debugger does not work well with gevent, # so we need to disable gevent in debug mode. @@ -34,13 +40,15 @@ else: from app_factory import create_app - socketio_app, app = create_app() - celery = app.extensions["celery"] + socketio_app, flask_app = create_app() + app = flask_app + celery = flask_app.extensions["celery"] if __name__ == "__main__": from gevent import pywsgi + from geventwebsocket.handler import WebSocketHandler host = os.environ.get("HOST", "0.0.0.0") port = int(os.environ.get("PORT", 5001)) - server = pywsgi.WSGIServer((host, port), socketio_app) + server = pywsgi.WSGIServer((host, port), socketio_app, handler_class=WebSocketHandler) server.serve_forever() diff --git a/api/docker/entrypoint.sh b/api/docker/entrypoint.sh index 60e6b6e39b..ac8fc7008f 100755 --- a/api/docker/entrypoint.sh +++ b/api/docker/entrypoint.sh @@ -44,9 +44,9 @@ else exec gunicorn \ --bind "${DIFY_BIND_ADDRESS:-0.0.0.0}:${DIFY_PORT:-5001}" \ --workers ${SERVER_WORKER_AMOUNT:-1} \ - --worker-class ${SERVER_WORKER_CLASS:-gevent} \ + --worker-class ${SERVER_WORKER_CLASS:-geventwebsocket.gunicorn.workers.GeventWebSocketWorker} \ --worker-connections ${SERVER_WORKER_CONNECTIONS:-10} \ --timeout ${GUNICORN_TIMEOUT:-200} \ - app:app + app:socketio_app fi fi diff --git a/api/extensions/ext_socketio.py b/api/extensions/ext_socketio.py index 470e0b08e2..d898f795b1 100644 --- a/api/extensions/ext_socketio.py +++ b/api/extensions/ext_socketio.py @@ -1,5 +1,3 @@ import socketio -from configs import dify_config - -sio = socketio.Server(async_mode="gevent", cors_allowed_origins=dify_config.CONSOLE_CORS_ALLOW_ORIGINS) +sio = socketio.Server(async_mode="gevent", cors_allowed_origins="*") diff --git a/api/pyproject.toml b/api/pyproject.toml index b65ea49a07..82675abfce 100644 --- a/api/pyproject.toml +++ b/api/pyproject.toml @@ -21,6 +21,7 @@ dependencies = [ "flask-orjson~=2.0.0", "flask-sqlalchemy~=3.1.1", "gevent~=24.11.1", + "gevent-websocket~=0.10.1", "gmpy2~=2.2.1", "google-api-core==2.18.0", "google-api-python-client==2.90.0", diff --git a/api/uv.lock b/api/uv.lock index 167b7b659e..96e8e8e65c 100644 --- a/api/uv.lock +++ b/api/uv.lock @@ -1318,6 +1318,7 @@ dependencies = [ { name = "flask-restx" }, { name = "flask-sqlalchemy" }, { name = "gevent" }, + { name = "gevent-websocket" }, { name = "gmpy2" }, { name = "google-api-core" }, { name = "google-api-python-client" }, @@ -1514,6 +1515,7 @@ requires-dist = [ { name = "flask-restx", specifier = "~=1.3.0" }, { name = "flask-sqlalchemy", specifier = "~=3.1.1" }, { name = "gevent", specifier = "~=24.11.1" }, + { name = "gevent-websocket", specifier = "~=0.10.1" }, { name = "gmpy2", specifier = "~=2.2.1" }, { name = "google-api-core", specifier = "==2.18.0" }, { name = "google-api-python-client", specifier = "==2.90.0" }, @@ -2101,6 +2103,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/11/b2/5d20664ef6a077bec9f27f7a7ee761edc64946d0b1e293726a3d074a9a18/gevent-24.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:68bee86b6e1c041a187347ef84cf03a792f0b6c7238378bf6ba4118af11feaae", size = 1541631 }, ] +[[package]] +name = "gevent-websocket" +version = "0.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gevent" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/d2/6fa19239ff1ab072af40ebf339acd91fb97f34617c2ee625b8e34bf42393/gevent-websocket-0.10.1.tar.gz", hash = "sha256:7eaef32968290c9121f7c35b973e2cc302ffb076d018c9068d2f5ca8b2d85fb0", size = 18366 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/84/2dc373eb6493e00c884cc11e6c059ec97abae2678d42f06bf780570b0193/gevent_websocket-0.10.1-py3-none-any.whl", hash = "sha256:17b67d91282f8f4c973eba0551183fc84f56f1c90c8f6b6b30256f31f66f5242", size = 22987 }, +] + [[package]] name = "geventhttpclient" version = "2.3.4" diff --git a/web/app/components/workflow/collaboration/core/websocket-manager.ts b/web/app/components/workflow/collaboration/core/websocket-manager.ts index e8e579d8a1..b5d63c04d2 100644 --- a/web/app/components/workflow/collaboration/core/websocket-manager.ts +++ b/web/app/components/workflow/collaboration/core/websocket-manager.ts @@ -9,7 +9,7 @@ export class WebSocketClient { constructor(config: WebSocketConfig = {}) { this.config = { - url: config.url || process.env.NEXT_PUBLIC_SOCKET_URL || 'wss://api:5001', + url: config.url || process.env.NEXT_PUBLIC_SOCKET_URL || 'ws://localhost:5001', transports: config.transports || ['websocket'], withCredentials: config.withCredentials !== false, ...config, diff --git a/web/docker/entrypoint.sh b/web/docker/entrypoint.sh index c12ebc0812..5d73a6ed50 100755 --- a/web/docker/entrypoint.sh +++ b/web/docker/entrypoint.sh @@ -19,6 +19,7 @@ export NEXT_PUBLIC_API_PREFIX=${CONSOLE_API_URL}/console/api export NEXT_PUBLIC_PUBLIC_API_PREFIX=${APP_API_URL}/api export NEXT_PUBLIC_MARKETPLACE_API_PREFIX=${MARKETPLACE_API_URL}/api/v1 export NEXT_PUBLIC_MARKETPLACE_URL_PREFIX=${MARKETPLACE_URL} +export NEXT_PUBLIC_SOCKET_URL=${NEXT_PUBLIC_SOCKET_URL} export NEXT_PUBLIC_SENTRY_DSN=${SENTRY_DSN} export NEXT_PUBLIC_SITE_ABOUT=${SITE_ABOUT}