fix: resolve Docker file URL networking issue for plugins (#21334)

- Add INTERNAL_FILES_URL config for Docker network communication
- Plugin file access now uses internal Docker service URLs
- User downloads continue using external FILES_URL
- Fixes plugin daemon file access in Docker environments
- Backward compatible with existing configurations
pull/21382/head
krikera 11 months ago
parent 3113350e51
commit 6ed07e7ebe

@ -237,6 +237,13 @@ class FileAccessConfig(BaseSettings):
default="", default="",
) )
INTERNAL_FILES_URL: str = Field(
description="Internal base URL for file access within Docker network,"
" used for plugin daemon and internal service communication."
" Falls back to FILES_URL if not specified.",
default="",
)
FILES_ACCESS_TIMEOUT: int = Field( FILES_ACCESS_TIMEOUT: int = Field(
description="Expiration time in seconds for file access URLs", description="Expiration time in seconds for file access URLs",
default=300, default=300,

@ -21,7 +21,9 @@ def get_signed_file_url(upload_file_id: str) -> str:
def get_signed_file_url_for_plugin(filename: str, mimetype: str, tenant_id: str, user_id: str) -> str: def get_signed_file_url_for_plugin(filename: str, mimetype: str, tenant_id: str, user_id: str) -> str:
url = f"{dify_config.FILES_URL}/files/upload/for-plugin" # Plugin access should use internal URL for Docker network communication
base_url = dify_config.INTERNAL_FILES_URL or dify_config.FILES_URL
url = f"{base_url}/files/upload/for-plugin"
if user_id is None: if user_id is None:
user_id = "DEFAULT-USER" user_id = "DEFAULT-USER"

@ -5,13 +5,12 @@ import os
import time import time
from configs import dify_config from configs import dify_config
def sign_tool_file(tool_file_id: str, extension: str) -> str: def sign_tool_file(tool_file_id: str, extension: str) -> str:
""" """
sign file to get a temporary url sign file to get a temporary url for plugin access
""" """
base_url = dify_config.FILES_URL # Use internal URL for plugin/tool file access in Docker environments
base_url = dify_config.INTERNAL_FILES_URL or dify_config.FILES_URL
file_preview_url = f"{base_url}/files/tools/{tool_file_id}{extension}" file_preview_url = f"{base_url}/files/tools/{tool_file_id}{extension}"
timestamp = str(int(time.time())) timestamp = str(int(time.time()))

@ -19,6 +19,7 @@ from extensions.ext_storage import storage
from models.model import MessageFile from models.model import MessageFile
from models.tools import ToolFile from models.tools import ToolFile
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
from sqlalchemy.engine import Engine from sqlalchemy.engine import Engine
@ -35,9 +36,10 @@ class ToolFileManager:
@staticmethod @staticmethod
def sign_file(tool_file_id: str, extension: str) -> str: def sign_file(tool_file_id: str, extension: str) -> str:
""" """
sign file to get a temporary url sign file to get a temporary url for plugin access
""" """
base_url = dify_config.FILES_URL # Use internal URL for plugin/tool file access in Docker environments
base_url = dify_config.INTERNAL_FILES_URL or dify_config.FILES_URL
file_preview_url = f"{base_url}/files/tools/{tool_file_id}{extension}" file_preview_url = f"{base_url}/files/tools/{tool_file_id}{extension}"
timestamp = str(int(time.time())) timestamp = str(int(time.time()))

Loading…
Cancel
Save