From fccf6561344a5d50304322c7e26e5a0b6ec56f00 Mon Sep 17 00:00:00 2001
From: arch3rPro <30855883+arch3rPro@users.noreply.github.com>
Date: Fri, 1 Aug 2025 11:12:10 +0800
Subject: [PATCH] feat: add app Flowise
---
README.md | 9 ++
apps/flowise/3.0.4/.env.example | 165 +++++++++++++++++++++++++
apps/flowise/3.0.4/data.yml | 92 ++++++++++++++
apps/flowise/3.0.4/docker-compose.yml | 144 +++++++++++++++++++++
apps/flowise/README.md | 45 +++++++
apps/flowise/README_en.md | 44 +++++++
apps/flowise/data.yml | 29 +++++
apps/flowise/latest/.env.example | 165 +++++++++++++++++++++++++
apps/flowise/latest/data.yml | 92 ++++++++++++++
apps/flowise/latest/docker-compose.yml | 144 +++++++++++++++++++++
apps/flowise/logo.png | Bin 0 -> 32033 bytes
11 files changed, 929 insertions(+)
create mode 100644 apps/flowise/3.0.4/.env.example
create mode 100644 apps/flowise/3.0.4/data.yml
create mode 100644 apps/flowise/3.0.4/docker-compose.yml
create mode 100644 apps/flowise/README.md
create mode 100644 apps/flowise/README_en.md
create mode 100644 apps/flowise/data.yml
create mode 100644 apps/flowise/latest/.env.example
create mode 100644 apps/flowise/latest/data.yml
create mode 100644 apps/flowise/latest/docker-compose.yml
create mode 100644 apps/flowise/logo.png
diff --git a/README.md b/README.md
index 8b380ec..8a38d12 100644
--- a/README.md
+++ b/README.md
@@ -474,6 +474,15 @@ AI驱动的开源代码知识库与文档协作平台,支持多模型、多数
+
+
+ Flowise
+
+
+🔮 开源可视化AI工作流构建平台,拖拽式设计LLM应用
+
+3.0.4 • [官网链接](https://github.com/FlowiseAI/Flowise)
+
|
diff --git a/apps/flowise/3.0.4/.env.example b/apps/flowise/3.0.4/.env.example
new file mode 100644
index 0000000..7e72923
--- /dev/null
+++ b/apps/flowise/3.0.4/.env.example
@@ -0,0 +1,165 @@
+PORT=3000
+
+# APIKEY_PATH=/your_apikey_path/.flowise # (will be deprecated by end of 2025)
+
+############################################################################################################
+############################################## DATABASE ####################################################
+############################################################################################################
+
+DATABASE_PATH=/root/.flowise
+# DATABASE_TYPE=postgres
+# DATABASE_PORT=5432
+# DATABASE_HOST=""
+# DATABASE_NAME=flowise
+# DATABASE_USER=root
+# DATABASE_PASSWORD=mypassword
+# DATABASE_SSL=true
+# DATABASE_SSL_KEY_BASE64=
+
+
+############################################################################################################
+############################################## SECRET KEYS #################################################
+############################################################################################################
+
+# SECRETKEY_STORAGE_TYPE=local #(local | aws)
+SECRETKEY_PATH=/root/.flowise
+# FLOWISE_SECRETKEY_OVERWRITE=myencryptionkey # (if you want to overwrite the secret key)
+# SECRETKEY_AWS_ACCESS_KEY=
+# SECRETKEY_AWS_SECRET_KEY=
+# SECRETKEY_AWS_REGION=us-west-2
+# SECRETKEY_AWS_NAME=FlowiseEncryptionKey
+
+
+############################################################################################################
+############################################## LOGGING #####################################################
+############################################################################################################
+
+# DEBUG=true
+LOG_PATH=/root/.flowise/logs
+# LOG_LEVEL=info #(error | warn | info | verbose | debug)
+# TOOL_FUNCTION_BUILTIN_DEP=crypto,fs
+# TOOL_FUNCTION_EXTERNAL_DEP=moment,lodash
+
+
+############################################################################################################
+############################################## STORAGE #####################################################
+############################################################################################################
+
+# STORAGE_TYPE=local (local | s3 | gcs)
+BLOB_STORAGE_PATH=/root/.flowise/storage
+# S3_STORAGE_BUCKET_NAME=flowise
+# S3_STORAGE_ACCESS_KEY_ID=
+# S3_STORAGE_SECRET_ACCESS_KEY=
+# S3_STORAGE_REGION=us-west-2
+# S3_ENDPOINT_URL=
+# S3_FORCE_PATH_STYLE=false
+# GOOGLE_CLOUD_STORAGE_CREDENTIAL=/the/keyfilename/path
+# GOOGLE_CLOUD_STORAGE_PROJ_ID=
+# GOOGLE_CLOUD_STORAGE_BUCKET_NAME=
+# GOOGLE_CLOUD_UNIFORM_BUCKET_ACCESS=true
+
+
+############################################################################################################
+############################################## SETTINGS ####################################################
+############################################################################################################
+
+# NUMBER_OF_PROXIES= 1
+# CORS_ORIGINS=*
+# IFRAME_ORIGINS=*
+# FLOWISE_FILE_SIZE_LIMIT=50mb
+# SHOW_COMMUNITY_NODES=true
+# DISABLE_FLOWISE_TELEMETRY=true
+# DISABLED_NODES=bufferMemory,chatOpenAI (comma separated list of node names to disable)
+# Uncomment the following line to enable model list config, load the list of models from your local config file
+# see https://raw.githubusercontent.com/FlowiseAI/Flowise/main/packages/components/models.json for the format
+# MODEL_LIST_CONFIG_JSON=/your_model_list_config_file_path
+
+
+############################################################################################################
+############################################ AUTH PARAMETERS ###############################################
+############################################################################################################
+
+# APP_URL=http://localhost:3000
+
+# SMTP_HOST=smtp.host.com
+# SMTP_PORT=465
+# SMTP_USER=smtp_user
+# SMTP_PASSWORD=smtp_password
+# SMTP_SECURE=true
+# ALLOW_UNAUTHORIZED_CERTS=false
+# SENDER_EMAIL=team@example.com
+
+JWT_AUTH_TOKEN_SECRET='AABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD'
+JWT_REFRESH_TOKEN_SECRET='AABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD'
+JWT_ISSUER='ISSUER'
+JWT_AUDIENCE='AUDIENCE'
+JWT_TOKEN_EXPIRY_IN_MINUTES=360
+JWT_REFRESH_TOKEN_EXPIRY_IN_MINUTES=43200
+# EXPIRE_AUTH_TOKENS_ON_RESTART=true # (if you need to expire all tokens on app restart)
+# EXPRESS_SESSION_SECRET=flowise
+
+# INVITE_TOKEN_EXPIRY_IN_HOURS=24
+# PASSWORD_RESET_TOKEN_EXPIRY_IN_MINS=15
+# PASSWORD_SALT_HASH_ROUNDS=10
+# TOKEN_HASH_SECRET='popcorn'
+
+# WORKSPACE_INVITE_TEMPLATE_PATH=/path/to/custom/workspace_invite.hbs
+
+
+############################################################################################################
+############################################# ENTERPRISE ###################################################
+############################################################################################################
+
+# LICENSE_URL=
+# FLOWISE_EE_LICENSE_KEY=
+# OFFLINE=
+
+
+############################################################################################################
+########################################### METRICS COLLECTION #############################################
+############################################################################################################
+
+# POSTHOG_PUBLIC_API_KEY=your_posthog_public_api_key
+
+# ENABLE_METRICS=false
+# METRICS_PROVIDER=prometheus # prometheus | open_telemetry
+# METRICS_INCLUDE_NODE_METRICS=true # default is true
+# METRICS_SERVICE_NAME=FlowiseAI
+
+# ONLY NEEDED if METRICS_PROVIDER=open_telemetry
+# METRICS_OPEN_TELEMETRY_METRIC_ENDPOINT=http://localhost:4318/v1/metrics
+# METRICS_OPEN_TELEMETRY_PROTOCOL=http # http | grpc | proto (default is http)
+# METRICS_OPEN_TELEMETRY_DEBUG=true # default is false
+
+
+############################################################################################################
+############################################### PROXY ######################################################
+############################################################################################################
+
+# Uncomment the following lines to enable global agent proxy, see https://www.npmjs.com/package/global-agent for more details
+# GLOBAL_AGENT_HTTP_PROXY=CorporateHttpProxyUrl
+# GLOBAL_AGENT_HTTPS_PROXY=CorporateHttpsProxyUrl
+# GLOBAL_AGENT_NO_PROXY=ExceptionHostsToBypassProxyIfNeeded
+
+
+############################################################################################################
+########################################### QUEUE CONFIGURATION ############################################
+############################################################################################################
+
+# MODE=queue #(queue | main)
+# QUEUE_NAME=flowise-queue
+# QUEUE_REDIS_EVENT_STREAM_MAX_LEN=100000
+# WORKER_CONCURRENCY=100000
+# REMOVE_ON_AGE=86400
+# REMOVE_ON_COUNT=10000
+# REDIS_URL=
+# REDIS_HOST=localhost
+# REDIS_PORT=6379
+# REDIS_USERNAME=
+# REDIS_PASSWORD=
+# REDIS_TLS=
+# REDIS_CERT=
+# REDIS_KEY=
+# REDIS_CA=
+# REDIS_KEEP_ALIVE=
+# ENABLE_BULLMQ_DASHBOARD=
\ No newline at end of file
diff --git a/apps/flowise/3.0.4/data.yml b/apps/flowise/3.0.4/data.yml
new file mode 100644
index 0000000..b7e86bc
--- /dev/null
+++ b/apps/flowise/3.0.4/data.yml
@@ -0,0 +1,92 @@
+additionalProperties:
+ formFields:
+ - default: "3000"
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: Port
+ labelZh: 端口
+ required: true
+ rule: paramPort
+ type: number
+ - default: "/root/flowise"
+ edit: true
+ envKey: DATABASE_PATH
+ labelEn: Database Path
+ labelZh: 数据库路径
+ required: true
+ rule: paramPath
+ type: text
+ - default: "/root/flowise"
+ edit: true
+ envKey: SECRETKEY_PATH
+ labelEn: Secret Key Path
+ labelZh: 密钥路径
+ required: true
+ rule: paramPath
+ type: text
+ - default: "/root/flowise/logs"
+ edit: true
+ envKey: LOG_PATH
+ labelEn: Log Path
+ labelZh: 日志路径
+ required: true
+ rule: paramPath
+ type: text
+ - default: "/root/flowise/storage"
+ edit: true
+ envKey: BLOB_STORAGE_PATH
+ labelEn: Storage Path
+ labelZh: 存储路径
+ required: true
+ rule: paramPath
+ type: text
+ - default: "AABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD"
+ edit: true
+ envKey: JWT_AUTH_TOKEN_SECRET
+ labelEn: JWT Auth Token Secret
+ labelZh: JWT认证密钥
+ random: true
+ required: true
+ rule: paramComplexity
+ type: password
+ - default: "AABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD"
+ edit: true
+ envKey: JWT_REFRESH_TOKEN_SECRET
+ labelEn: JWT Refresh Token Secret
+ labelZh: JWT刷新密钥
+ random: true
+ required: true
+ rule: paramComplexity
+ type: password
+ - default: "ISSUER"
+ edit: true
+ envKey: JWT_ISSUER
+ labelEn: JWT Issuer
+ labelZh: JWT发行者
+ required: true
+ rule: paramCommon
+ type: text
+ - default: "AUDIENCE"
+ edit: true
+ envKey: JWT_AUDIENCE
+ labelEn: JWT Audience
+ labelZh: JWT受众
+ required: true
+ rule: paramCommon
+ type: text
+ - default: "360"
+ edit: true
+ envKey: JWT_TOKEN_EXPIRY_IN_MINUTES
+ labelEn: JWT Token Expiry (minutes)
+ labelZh: JWT令牌过期时间(分钟)
+ required: true
+ rule: paramCommon
+ type: number
+ - default: "43200"
+ edit: true
+ envKey: JWT_REFRESH_TOKEN_EXPIRY_IN_MINUTES
+ labelEn: JWT Refresh Token Expiry (minutes)
+ labelZh: JWT刷新令牌过期时间(分钟)
+ required: true
+ rule: paramCommon
+ type: number
diff --git a/apps/flowise/3.0.4/docker-compose.yml b/apps/flowise/3.0.4/docker-compose.yml
new file mode 100644
index 0000000..e9d42a3
--- /dev/null
+++ b/apps/flowise/3.0.4/docker-compose.yml
@@ -0,0 +1,144 @@
+services:
+ flowise:
+ image: flowiseai/flowise:3.0.4
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ networks:
+ - 1panel-network
+ ports:
+ - "${PANEL_APP_PORT_HTTP}:${PANEL_APP_PORT_HTTP}"
+ environment:
+ - PORT=${PANEL_APP_PORT_HTTP}
+ # DATABASE
+ - DATABASE_PATH=${DATABASE_PATH}
+ # - DATABASE_TYPE=${DATABASE_TYPE}
+ # - DATABASE_PORT=${DATABASE_PORT}
+ # - DATABASE_HOST=${DATABASE_HOST}
+ # - DATABASE_NAME=${DATABASE_NAME}
+ # - DATABASE_USER=${DATABASE_USER}
+ # - DATABASE_PASSWORD=${DATABASE_PASSWORD}
+ # - DATABASE_SSL=${DATABASE_SSL}
+ # - DATABASE_SSL_KEY_BASE64=${DATABASE_SSL_KEY_BASE64}
+
+ # SECRET KEYS
+ # - SECRETKEY_STORAGE_TYPE=${SECRETKEY_STORAGE_TYPE}
+ - SECRETKEY_PATH=${SECRETKEY_PATH}
+ # - FLOWISE_SECRETKEY_OVERWRITE=${FLOWISE_SECRETKEY_OVERWRITE}
+ # - SECRETKEY_AWS_ACCESS_KEY=${SECRETKEY_AWS_ACCESS_KEY}
+ # - SECRETKEY_AWS_SECRET_KEY=${SECRETKEY_AWS_SECRET_KEY}
+ # - SECRETKEY_AWS_REGION=${SECRETKEY_AWS_REGION}
+ # - SECRETKEY_AWS_NAME=${SECRETKEY_AWS_NAME}
+
+ # LOGGING
+ # - DEBUG=${DEBUG}
+ - LOG_PATH=${LOG_PATH}
+ # - LOG_LEVEL=${LOG_LEVEL}
+
+ # CUSTOM TOOL DEPENDENCIES
+ # - TOOL_FUNCTION_BUILTIN_DEP=${TOOL_FUNCTION_BUILTIN_DEP}
+ # - TOOL_FUNCTION_EXTERNAL_DEP=${TOOL_FUNCTION_EXTERNAL_DEP}
+
+ # STORAGE
+ # - STORAGE_TYPE=${STORAGE_TYPE}
+ - BLOB_STORAGE_PATH=${BLOB_STORAGE_PATH}
+ # - S3_STORAGE_BUCKET_NAME=${S3_STORAGE_BUCKET_NAME}
+ # - S3_STORAGE_ACCESS_KEY_ID=${S3_STORAGE_ACCESS_KEY_ID}
+ # - S3_STORAGE_SECRET_ACCESS_KEY=${S3_STORAGE_SECRET_ACCESS_KEY}
+ # - S3_STORAGE_REGION=${S3_STORAGE_REGION}
+ # - S3_ENDPOINT_URL=${S3_ENDPOINT_URL}
+ # - S3_FORCE_PATH_STYLE=${S3_FORCE_PATH_STYLE}
+ # - GOOGLE_CLOUD_STORAGE_CREDENTIAL=${GOOGLE_CLOUD_STORAGE_CREDENTIAL}
+ # - GOOGLE_CLOUD_STORAGE_PROJ_ID=${GOOGLE_CLOUD_STORAGE_PROJ_ID}
+ # - GOOGLE_CLOUD_STORAGE_BUCKET_NAME=${GOOGLE_CLOUD_STORAGE_BUCKET_NAME}
+ # - GOOGLE_CLOUD_UNIFORM_BUCKET_ACCESS=${GOOGLE_CLOUD_UNIFORM_BUCKET_ACCESS}
+
+ # SETTINGS
+ # - NUMBER_OF_PROXIES=${NUMBER_OF_PROXIES}
+ # - CORS_ORIGINS=${CORS_ORIGINS}
+ # - IFRAME_ORIGINS=${IFRAME_ORIGINS}
+ # - FLOWISE_FILE_SIZE_LIMIT=${FLOWISE_FILE_SIZE_LIMIT}
+ # - SHOW_COMMUNITY_NODES=${SHOW_COMMUNITY_NODES}
+ # - DISABLE_FLOWISE_TELEMETRY=${DISABLE_FLOWISE_TELEMETRY}
+ # - DISABLED_NODES=${DISABLED_NODES}
+ # - MODEL_LIST_CONFIG_JSON=${MODEL_LIST_CONFIG_JSON}
+
+ # AUTH PARAMETERS
+ # - APP_URL=${APP_URL}
+ - JWT_AUTH_TOKEN_SECRET=${JWT_AUTH_TOKEN_SECRET}
+ - JWT_REFRESH_TOKEN_SECRET=${JWT_REFRESH_TOKEN_SECRET}
+ - JWT_ISSUER=${JWT_ISSUER}
+ - JWT_AUDIENCE=${JWT_AUDIENCE}
+ - JWT_TOKEN_EXPIRY_IN_MINUTES=${JWT_TOKEN_EXPIRY_IN_MINUTES}
+ - JWT_REFRESH_TOKEN_EXPIRY_IN_MINUTES=${JWT_REFRESH_TOKEN_EXPIRY_IN_MINUTES}
+ # - EXPIRE_AUTH_TOKENS_ON_RESTART=${EXPIRE_AUTH_TOKENS_ON_RESTART}
+ # - EXPRESS_SESSION_SECRET=${EXPRESS_SESSION_SECRET}
+ # - PASSWORD_RESET_TOKEN_EXPIRY_IN_MINS=${PASSWORD_RESET_TOKEN_EXPIRY_IN_MINS}
+ # - PASSWORD_SALT_HASH_ROUNDS=${PASSWORD_SALT_HASH_ROUNDS}
+ # - TOKEN_HASH_SECRET=${TOKEN_HASH_SECRET}
+
+ # EMAIL
+ # - SMTP_HOST=${SMTP_HOST}
+ # - SMTP_PORT=${SMTP_PORT}
+ # - SMTP_USER=${SMTP_USER}
+ # - SMTP_PASSWORD=${SMTP_PASSWORD}
+ # - SMTP_SECURE=${SMTP_SECURE}
+ # - ALLOW_UNAUTHORIZED_CERTS=${ALLOW_UNAUTHORIZED_CERTS}
+ # - SENDER_EMAIL=${SENDER_EMAIL}
+
+ # ENTERPRISE
+ # - LICENSE_URL=${LICENSE_URL}
+ # - FLOWISE_EE_LICENSE_KEY=${FLOWISE_EE_LICENSE_KEY}
+ # - OFFLINE=${OFFLINE}
+ # - INVITE_TOKEN_EXPIRY_IN_HOURS=${INVITE_TOKEN_EXPIRY_IN_HOURS}
+ # - WORKSPACE_INVITE_TEMPLATE_PATH=${WORKSPACE_INVITE_TEMPLATE_PATH}
+
+ # METRICS COLLECTION
+ # - POSTHOG_PUBLIC_API_KEY=${POSTHOG_PUBLIC_API_KEY}
+ # - ENABLE_METRICS=${ENABLE_METRICS}
+ # - METRICS_PROVIDER=${METRICS_PROVIDER}
+ # - METRICS_INCLUDE_NODE_METRICS=${METRICS_INCLUDE_NODE_METRICS}
+ # - METRICS_SERVICE_NAME=${METRICS_SERVICE_NAME}
+ # - METRICS_OPEN_TELEMETRY_METRIC_ENDPOINT=${METRICS_OPEN_TELEMETRY_METRIC_ENDPOINT}
+ # - METRICS_OPEN_TELEMETRY_PROTOCOL=${METRICS_OPEN_TELEMETRY_PROTOCOL}
+ # - METRICS_OPEN_TELEMETRY_DEBUG=${METRICS_OPEN_TELEMETRY_DEBUG}
+
+ # PROXY
+ # - GLOBAL_AGENT_HTTP_PROXY=${GLOBAL_AGENT_HTTP_PROXY}
+ # - GLOBAL_AGENT_HTTPS_PROXY=${GLOBAL_AGENT_HTTPS_PROXY}
+ # - GLOBAL_AGENT_NO_PROXY=${GLOBAL_AGENT_NO_PROXY}
+
+ # QUEUE CONFIGURATION
+ # - MODE=${MODE}
+ # - QUEUE_NAME=${QUEUE_NAME}
+ # - QUEUE_REDIS_EVENT_STREAM_MAX_LEN=${QUEUE_REDIS_EVENT_STREAM_MAX_LEN}
+ # - WORKER_CONCURRENCY=${WORKER_CONCURRENCY}
+ # - REMOVE_ON_AGE=${REMOVE_ON_AGE}
+ # - REMOVE_ON_COUNT=${REMOVE_ON_COUNT}
+ # - REDIS_URL=${REDIS_URL}
+ # - REDIS_HOST=${REDIS_HOST}
+ # - REDIS_PORT=${REDIS_PORT}
+ # - REDIS_USERNAME=${REDIS_USERNAME}
+ # - REDIS_PASSWORD=${REDIS_PASSWORD}
+ # - REDIS_TLS=${REDIS_TLS}
+ # - REDIS_CERT=${REDIS_CERT}
+ # - REDIS_KEY=${REDIS_KEY}
+ # - REDIS_CA=${REDIS_CA}
+ # - REDIS_KEEP_ALIVE=${REDIS_KEEP_ALIVE}
+ # - ENABLE_BULLMQ_DASHBOARD=${ENABLE_BULLMQ_DASHBOARD}
+ volumes:
+ - flowise_data:${DATABASE_PATH}
+ healthcheck:
+ test: ['CMD', 'curl', '-f', "http://localhost:${PANEL_APP_PORT_HTTP}/api/v1/ping"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+ start_period: 30s
+ labels:
+ createdBy: "Apps"
+
+networks:
+ 1panel-network:
+ external: true
+
+volumes:
+ flowise_data:
\ No newline at end of file
diff --git a/apps/flowise/README.md b/apps/flowise/README.md
new file mode 100644
index 0000000..becebc0
--- /dev/null
+++ b/apps/flowise/README.md
@@ -0,0 +1,45 @@
+# Flowise
+
+✨ 可视化构建AI/LLM流程 ✨
+一个开源的可视化工具,用于构建和部署LLM应用程序和AI代理
+
+
+
+
+
+
+## 简介
+
+**Flowise** 是一个开源的可视化工具,允许用户通过拖放式界面创建自定义的LLM(大型语言模型)流程。它简化了AI应用程序的构建过程,无需深入编码即可创建复杂的AI工作流。
+
+## 主要功能:
+
+- **可视化流程构建**:通过直观的拖放界面设计和构建LLM工作流,无需编写复杂代码
+- **多种模型支持**:集成多种流行的语言模型,如OpenAI、Anthropic、Google等
+- **组件化设计**:提供丰富的预构建组件,包括聊天模型、向量存储、记忆系统等
+- **API生成**:自动为创建的流程生成API端点,便于集成到其他应用中
+- **自定义代理**:构建自定义AI代理,能够执行特定任务和解决复杂问题
+- **向量数据库集成**:支持多种向量数据库,实现高效的知识检索和管理
+- **工作流共享**:导出和导入工作流配置,便于团队协作和流程共享
+- **多种部署选项**:支持本地部署、Docker容器化以及云服务部署
+
+## 使用场景:
+
+- 构建自定义聊天机器人和虚拟助手
+- 创建基于特定知识库的问答系统
+- 开发自动化文档处理和分析工具
+- 设计智能客户服务和支持系统
+- 实现复杂的多步骤AI工作流
+- 构建能够执行特定任务的AI代理
+
+## 默认信息
+
+- 默认用户名:无(首次使用需要注册)
+- 默认访问地址:http://IP:3000
+- 默认数据目录:~/.flowise
+
+## 更多信息
+
+- [官方网站](https://flowiseai.com/)
+- [官方文档](https://docs.flowiseai.com/)
+- [GitHub仓库](https://github.com/FlowiseAI/Flowise)
\ No newline at end of file
diff --git a/apps/flowise/README_en.md b/apps/flowise/README_en.md
new file mode 100644
index 0000000..e079c68
--- /dev/null
+++ b/apps/flowise/README_en.md
@@ -0,0 +1,44 @@
+# Flowise
+
+✨ Build AI/LLM Flows Visually ✨
+An open-source tool to build and deploy LLM applications and AI agents visually
+
+
+
+
+
+## Introduction
+
+**Flowise** is an open-source visual tool that allows users to create custom LLM (Large Language Model) flows through a drag-and-drop interface. It simplifies the process of building AI applications without requiring deep coding knowledge to create complex AI workflows.
+
+## Key Features:
+
+- **Visual Flow Building**: Design and build LLM workflows through an intuitive drag-and-drop interface without writing complex code
+- **Multiple Model Support**: Integration with various popular language models such as OpenAI, Anthropic, Google, and more
+- **Component-Based Design**: Rich pre-built components including chat models, vector stores, memory systems, and more
+- **API Generation**: Automatically generates API endpoints for created flows for easy integration with other applications
+- **Custom Agents**: Build custom AI agents capable of performing specific tasks and solving complex problems
+- **Vector Database Integration**: Support for multiple vector databases for efficient knowledge retrieval and management
+- **Workflow Sharing**: Export and import workflow configurations for team collaboration and process sharing
+- **Multiple Deployment Options**: Support for local deployment, Docker containerization, and cloud service deployment
+
+## Use Cases:
+
+- Building custom chatbots and virtual assistants
+- Creating question-answering systems based on specific knowledge bases
+- Developing automated document processing and analysis tools
+- Designing intelligent customer service and support systems
+- Implementing complex multi-step AI workflows
+- Building AI agents capable of performing specific tasks
+
+## Default Information
+
+- Default username: None (Registration required for first use)
+- Default access address: http://IP:3000
+- Default data directory: ~/.flowise
+
+## More Information
+
+- [Official Website](https://flowiseai.com/)
+- [Official Documentation](https://docs.flowiseai.com/)
+- [GitHub Repository](https://github.com/FlowiseAI/Flowise)
\ No newline at end of file
diff --git a/apps/flowise/data.yml b/apps/flowise/data.yml
new file mode 100644
index 0000000..d756fcf
--- /dev/null
+++ b/apps/flowise/data.yml
@@ -0,0 +1,29 @@
+name: Flowise
+tags:
+ - AI工具
+title: 可视化构建AI/LLM流程
+description: Flowise是一个可视化工具,用于构建和部署LLM应用程序和AI代理
+additionalProperties:
+ key: flowise
+ name: Flowise
+ tags:
+ - AI
+ shortDescZh: 可视化构建AI/LLM流程
+ shortDescEn: Visually Build AI/LLM Flows
+ type: website
+ crossVersionUpdate: true
+ limit: 0
+ recommend: 0
+ website: https://flowiseai.com/
+ github: https://github.com/FlowiseAI/Flowise
+ document: https://docs.flowiseai.com/
+ description:
+ en: Flowise is a visual tool for building and deploying LLM applications and AI agents
+ zh: Flowise是一个可视化工具,用于构建和部署LLM应用程序和AI代理
+ zh-Hant: Flowise是一個可視化工具,用於構建和部署LLM應用程序和AI代理
+ ja: FlowiseはLLMアプリケーションとAIエージェントを構築・デプロイするためのビジュアルツールです
+ ko: Flowise는 LLM 애플리케이션 및 AI 에이전트를 구축하고 배포하기 위한 시각적 도구입니다
+ memoryRequired: 1024
+ architectures:
+ - amd64
+ - arm64
\ No newline at end of file
diff --git a/apps/flowise/latest/.env.example b/apps/flowise/latest/.env.example
new file mode 100644
index 0000000..7e72923
--- /dev/null
+++ b/apps/flowise/latest/.env.example
@@ -0,0 +1,165 @@
+PORT=3000
+
+# APIKEY_PATH=/your_apikey_path/.flowise # (will be deprecated by end of 2025)
+
+############################################################################################################
+############################################## DATABASE ####################################################
+############################################################################################################
+
+DATABASE_PATH=/root/.flowise
+# DATABASE_TYPE=postgres
+# DATABASE_PORT=5432
+# DATABASE_HOST=""
+# DATABASE_NAME=flowise
+# DATABASE_USER=root
+# DATABASE_PASSWORD=mypassword
+# DATABASE_SSL=true
+# DATABASE_SSL_KEY_BASE64=
+
+
+############################################################################################################
+############################################## SECRET KEYS #################################################
+############################################################################################################
+
+# SECRETKEY_STORAGE_TYPE=local #(local | aws)
+SECRETKEY_PATH=/root/.flowise
+# FLOWISE_SECRETKEY_OVERWRITE=myencryptionkey # (if you want to overwrite the secret key)
+# SECRETKEY_AWS_ACCESS_KEY=
+# SECRETKEY_AWS_SECRET_KEY=
+# SECRETKEY_AWS_REGION=us-west-2
+# SECRETKEY_AWS_NAME=FlowiseEncryptionKey
+
+
+############################################################################################################
+############################################## LOGGING #####################################################
+############################################################################################################
+
+# DEBUG=true
+LOG_PATH=/root/.flowise/logs
+# LOG_LEVEL=info #(error | warn | info | verbose | debug)
+# TOOL_FUNCTION_BUILTIN_DEP=crypto,fs
+# TOOL_FUNCTION_EXTERNAL_DEP=moment,lodash
+
+
+############################################################################################################
+############################################## STORAGE #####################################################
+############################################################################################################
+
+# STORAGE_TYPE=local (local | s3 | gcs)
+BLOB_STORAGE_PATH=/root/.flowise/storage
+# S3_STORAGE_BUCKET_NAME=flowise
+# S3_STORAGE_ACCESS_KEY_ID=
+# S3_STORAGE_SECRET_ACCESS_KEY=
+# S3_STORAGE_REGION=us-west-2
+# S3_ENDPOINT_URL=
+# S3_FORCE_PATH_STYLE=false
+# GOOGLE_CLOUD_STORAGE_CREDENTIAL=/the/keyfilename/path
+# GOOGLE_CLOUD_STORAGE_PROJ_ID=
+# GOOGLE_CLOUD_STORAGE_BUCKET_NAME=
+# GOOGLE_CLOUD_UNIFORM_BUCKET_ACCESS=true
+
+
+############################################################################################################
+############################################## SETTINGS ####################################################
+############################################################################################################
+
+# NUMBER_OF_PROXIES= 1
+# CORS_ORIGINS=*
+# IFRAME_ORIGINS=*
+# FLOWISE_FILE_SIZE_LIMIT=50mb
+# SHOW_COMMUNITY_NODES=true
+# DISABLE_FLOWISE_TELEMETRY=true
+# DISABLED_NODES=bufferMemory,chatOpenAI (comma separated list of node names to disable)
+# Uncomment the following line to enable model list config, load the list of models from your local config file
+# see https://raw.githubusercontent.com/FlowiseAI/Flowise/main/packages/components/models.json for the format
+# MODEL_LIST_CONFIG_JSON=/your_model_list_config_file_path
+
+
+############################################################################################################
+############################################ AUTH PARAMETERS ###############################################
+############################################################################################################
+
+# APP_URL=http://localhost:3000
+
+# SMTP_HOST=smtp.host.com
+# SMTP_PORT=465
+# SMTP_USER=smtp_user
+# SMTP_PASSWORD=smtp_password
+# SMTP_SECURE=true
+# ALLOW_UNAUTHORIZED_CERTS=false
+# SENDER_EMAIL=team@example.com
+
+JWT_AUTH_TOKEN_SECRET='AABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD'
+JWT_REFRESH_TOKEN_SECRET='AABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD'
+JWT_ISSUER='ISSUER'
+JWT_AUDIENCE='AUDIENCE'
+JWT_TOKEN_EXPIRY_IN_MINUTES=360
+JWT_REFRESH_TOKEN_EXPIRY_IN_MINUTES=43200
+# EXPIRE_AUTH_TOKENS_ON_RESTART=true # (if you need to expire all tokens on app restart)
+# EXPRESS_SESSION_SECRET=flowise
+
+# INVITE_TOKEN_EXPIRY_IN_HOURS=24
+# PASSWORD_RESET_TOKEN_EXPIRY_IN_MINS=15
+# PASSWORD_SALT_HASH_ROUNDS=10
+# TOKEN_HASH_SECRET='popcorn'
+
+# WORKSPACE_INVITE_TEMPLATE_PATH=/path/to/custom/workspace_invite.hbs
+
+
+############################################################################################################
+############################################# ENTERPRISE ###################################################
+############################################################################################################
+
+# LICENSE_URL=
+# FLOWISE_EE_LICENSE_KEY=
+# OFFLINE=
+
+
+############################################################################################################
+########################################### METRICS COLLECTION #############################################
+############################################################################################################
+
+# POSTHOG_PUBLIC_API_KEY=your_posthog_public_api_key
+
+# ENABLE_METRICS=false
+# METRICS_PROVIDER=prometheus # prometheus | open_telemetry
+# METRICS_INCLUDE_NODE_METRICS=true # default is true
+# METRICS_SERVICE_NAME=FlowiseAI
+
+# ONLY NEEDED if METRICS_PROVIDER=open_telemetry
+# METRICS_OPEN_TELEMETRY_METRIC_ENDPOINT=http://localhost:4318/v1/metrics
+# METRICS_OPEN_TELEMETRY_PROTOCOL=http # http | grpc | proto (default is http)
+# METRICS_OPEN_TELEMETRY_DEBUG=true # default is false
+
+
+############################################################################################################
+############################################### PROXY ######################################################
+############################################################################################################
+
+# Uncomment the following lines to enable global agent proxy, see https://www.npmjs.com/package/global-agent for more details
+# GLOBAL_AGENT_HTTP_PROXY=CorporateHttpProxyUrl
+# GLOBAL_AGENT_HTTPS_PROXY=CorporateHttpsProxyUrl
+# GLOBAL_AGENT_NO_PROXY=ExceptionHostsToBypassProxyIfNeeded
+
+
+############################################################################################################
+########################################### QUEUE CONFIGURATION ############################################
+############################################################################################################
+
+# MODE=queue #(queue | main)
+# QUEUE_NAME=flowise-queue
+# QUEUE_REDIS_EVENT_STREAM_MAX_LEN=100000
+# WORKER_CONCURRENCY=100000
+# REMOVE_ON_AGE=86400
+# REMOVE_ON_COUNT=10000
+# REDIS_URL=
+# REDIS_HOST=localhost
+# REDIS_PORT=6379
+# REDIS_USERNAME=
+# REDIS_PASSWORD=
+# REDIS_TLS=
+# REDIS_CERT=
+# REDIS_KEY=
+# REDIS_CA=
+# REDIS_KEEP_ALIVE=
+# ENABLE_BULLMQ_DASHBOARD=
\ No newline at end of file
diff --git a/apps/flowise/latest/data.yml b/apps/flowise/latest/data.yml
new file mode 100644
index 0000000..b7e86bc
--- /dev/null
+++ b/apps/flowise/latest/data.yml
@@ -0,0 +1,92 @@
+additionalProperties:
+ formFields:
+ - default: "3000"
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: Port
+ labelZh: 端口
+ required: true
+ rule: paramPort
+ type: number
+ - default: "/root/flowise"
+ edit: true
+ envKey: DATABASE_PATH
+ labelEn: Database Path
+ labelZh: 数据库路径
+ required: true
+ rule: paramPath
+ type: text
+ - default: "/root/flowise"
+ edit: true
+ envKey: SECRETKEY_PATH
+ labelEn: Secret Key Path
+ labelZh: 密钥路径
+ required: true
+ rule: paramPath
+ type: text
+ - default: "/root/flowise/logs"
+ edit: true
+ envKey: LOG_PATH
+ labelEn: Log Path
+ labelZh: 日志路径
+ required: true
+ rule: paramPath
+ type: text
+ - default: "/root/flowise/storage"
+ edit: true
+ envKey: BLOB_STORAGE_PATH
+ labelEn: Storage Path
+ labelZh: 存储路径
+ required: true
+ rule: paramPath
+ type: text
+ - default: "AABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD"
+ edit: true
+ envKey: JWT_AUTH_TOKEN_SECRET
+ labelEn: JWT Auth Token Secret
+ labelZh: JWT认证密钥
+ random: true
+ required: true
+ rule: paramComplexity
+ type: password
+ - default: "AABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD"
+ edit: true
+ envKey: JWT_REFRESH_TOKEN_SECRET
+ labelEn: JWT Refresh Token Secret
+ labelZh: JWT刷新密钥
+ random: true
+ required: true
+ rule: paramComplexity
+ type: password
+ - default: "ISSUER"
+ edit: true
+ envKey: JWT_ISSUER
+ labelEn: JWT Issuer
+ labelZh: JWT发行者
+ required: true
+ rule: paramCommon
+ type: text
+ - default: "AUDIENCE"
+ edit: true
+ envKey: JWT_AUDIENCE
+ labelEn: JWT Audience
+ labelZh: JWT受众
+ required: true
+ rule: paramCommon
+ type: text
+ - default: "360"
+ edit: true
+ envKey: JWT_TOKEN_EXPIRY_IN_MINUTES
+ labelEn: JWT Token Expiry (minutes)
+ labelZh: JWT令牌过期时间(分钟)
+ required: true
+ rule: paramCommon
+ type: number
+ - default: "43200"
+ edit: true
+ envKey: JWT_REFRESH_TOKEN_EXPIRY_IN_MINUTES
+ labelEn: JWT Refresh Token Expiry (minutes)
+ labelZh: JWT刷新令牌过期时间(分钟)
+ required: true
+ rule: paramCommon
+ type: number
diff --git a/apps/flowise/latest/docker-compose.yml b/apps/flowise/latest/docker-compose.yml
new file mode 100644
index 0000000..03437b6
--- /dev/null
+++ b/apps/flowise/latest/docker-compose.yml
@@ -0,0 +1,144 @@
+services:
+ flowise:
+ image: flowiseai/flowise:latest
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ networks:
+ - 1panel-network
+ ports:
+ - "${PANEL_APP_PORT_HTTP}:${PANEL_APP_PORT_HTTP}"
+ environment:
+ - PORT=${PANEL_APP_PORT_HTTP}
+ # DATABASE
+ - DATABASE_PATH=${DATABASE_PATH}
+ # - DATABASE_TYPE=${DATABASE_TYPE}
+ # - DATABASE_PORT=${DATABASE_PORT}
+ # - DATABASE_HOST=${DATABASE_HOST}
+ # - DATABASE_NAME=${DATABASE_NAME}
+ # - DATABASE_USER=${DATABASE_USER}
+ # - DATABASE_PASSWORD=${DATABASE_PASSWORD}
+ # - DATABASE_SSL=${DATABASE_SSL}
+ # - DATABASE_SSL_KEY_BASE64=${DATABASE_SSL_KEY_BASE64}
+
+ # SECRET KEYS
+ # - SECRETKEY_STORAGE_TYPE=${SECRETKEY_STORAGE_TYPE}
+ - SECRETKEY_PATH=${SECRETKEY_PATH}
+ # - FLOWISE_SECRETKEY_OVERWRITE=${FLOWISE_SECRETKEY_OVERWRITE}
+ # - SECRETKEY_AWS_ACCESS_KEY=${SECRETKEY_AWS_ACCESS_KEY}
+ # - SECRETKEY_AWS_SECRET_KEY=${SECRETKEY_AWS_SECRET_KEY}
+ # - SECRETKEY_AWS_REGION=${SECRETKEY_AWS_REGION}
+ # - SECRETKEY_AWS_NAME=${SECRETKEY_AWS_NAME}
+
+ # LOGGING
+ # - DEBUG=${DEBUG}
+ - LOG_PATH=${LOG_PATH}
+ # - LOG_LEVEL=${LOG_LEVEL}
+
+ # CUSTOM TOOL DEPENDENCIES
+ # - TOOL_FUNCTION_BUILTIN_DEP=${TOOL_FUNCTION_BUILTIN_DEP}
+ # - TOOL_FUNCTION_EXTERNAL_DEP=${TOOL_FUNCTION_EXTERNAL_DEP}
+
+ # STORAGE
+ # - STORAGE_TYPE=${STORAGE_TYPE}
+ - BLOB_STORAGE_PATH=${BLOB_STORAGE_PATH}
+ # - S3_STORAGE_BUCKET_NAME=${S3_STORAGE_BUCKET_NAME}
+ # - S3_STORAGE_ACCESS_KEY_ID=${S3_STORAGE_ACCESS_KEY_ID}
+ # - S3_STORAGE_SECRET_ACCESS_KEY=${S3_STORAGE_SECRET_ACCESS_KEY}
+ # - S3_STORAGE_REGION=${S3_STORAGE_REGION}
+ # - S3_ENDPOINT_URL=${S3_ENDPOINT_URL}
+ # - S3_FORCE_PATH_STYLE=${S3_FORCE_PATH_STYLE}
+ # - GOOGLE_CLOUD_STORAGE_CREDENTIAL=${GOOGLE_CLOUD_STORAGE_CREDENTIAL}
+ # - GOOGLE_CLOUD_STORAGE_PROJ_ID=${GOOGLE_CLOUD_STORAGE_PROJ_ID}
+ # - GOOGLE_CLOUD_STORAGE_BUCKET_NAME=${GOOGLE_CLOUD_STORAGE_BUCKET_NAME}
+ # - GOOGLE_CLOUD_UNIFORM_BUCKET_ACCESS=${GOOGLE_CLOUD_UNIFORM_BUCKET_ACCESS}
+
+ # SETTINGS
+ # - NUMBER_OF_PROXIES=${NUMBER_OF_PROXIES}
+ # - CORS_ORIGINS=${CORS_ORIGINS}
+ # - IFRAME_ORIGINS=${IFRAME_ORIGINS}
+ # - FLOWISE_FILE_SIZE_LIMIT=${FLOWISE_FILE_SIZE_LIMIT}
+ # - SHOW_COMMUNITY_NODES=${SHOW_COMMUNITY_NODES}
+ # - DISABLE_FLOWISE_TELEMETRY=${DISABLE_FLOWISE_TELEMETRY}
+ # - DISABLED_NODES=${DISABLED_NODES}
+ # - MODEL_LIST_CONFIG_JSON=${MODEL_LIST_CONFIG_JSON}
+
+ # AUTH PARAMETERS
+ # - APP_URL=${APP_URL}
+ - JWT_AUTH_TOKEN_SECRET=${JWT_AUTH_TOKEN_SECRET}
+ - JWT_REFRESH_TOKEN_SECRET=${JWT_REFRESH_TOKEN_SECRET}
+ - JWT_ISSUER=${JWT_ISSUER}
+ - JWT_AUDIENCE=${JWT_AUDIENCE}
+ - JWT_TOKEN_EXPIRY_IN_MINUTES=${JWT_TOKEN_EXPIRY_IN_MINUTES}
+ - JWT_REFRESH_TOKEN_EXPIRY_IN_MINUTES=${JWT_REFRESH_TOKEN_EXPIRY_IN_MINUTES}
+ # - EXPIRE_AUTH_TOKENS_ON_RESTART=${EXPIRE_AUTH_TOKENS_ON_RESTART}
+ # - EXPRESS_SESSION_SECRET=${EXPRESS_SESSION_SECRET}
+ # - PASSWORD_RESET_TOKEN_EXPIRY_IN_MINS=${PASSWORD_RESET_TOKEN_EXPIRY_IN_MINS}
+ # - PASSWORD_SALT_HASH_ROUNDS=${PASSWORD_SALT_HASH_ROUNDS}
+ # - TOKEN_HASH_SECRET=${TOKEN_HASH_SECRET}
+
+ # EMAIL
+ # - SMTP_HOST=${SMTP_HOST}
+ # - SMTP_PORT=${SMTP_PORT}
+ # - SMTP_USER=${SMTP_USER}
+ # - SMTP_PASSWORD=${SMTP_PASSWORD}
+ # - SMTP_SECURE=${SMTP_SECURE}
+ # - ALLOW_UNAUTHORIZED_CERTS=${ALLOW_UNAUTHORIZED_CERTS}
+ # - SENDER_EMAIL=${SENDER_EMAIL}
+
+ # ENTERPRISE
+ # - LICENSE_URL=${LICENSE_URL}
+ # - FLOWISE_EE_LICENSE_KEY=${FLOWISE_EE_LICENSE_KEY}
+ # - OFFLINE=${OFFLINE}
+ # - INVITE_TOKEN_EXPIRY_IN_HOURS=${INVITE_TOKEN_EXPIRY_IN_HOURS}
+ # - WORKSPACE_INVITE_TEMPLATE_PATH=${WORKSPACE_INVITE_TEMPLATE_PATH}
+
+ # METRICS COLLECTION
+ # - POSTHOG_PUBLIC_API_KEY=${POSTHOG_PUBLIC_API_KEY}
+ # - ENABLE_METRICS=${ENABLE_METRICS}
+ # - METRICS_PROVIDER=${METRICS_PROVIDER}
+ # - METRICS_INCLUDE_NODE_METRICS=${METRICS_INCLUDE_NODE_METRICS}
+ # - METRICS_SERVICE_NAME=${METRICS_SERVICE_NAME}
+ # - METRICS_OPEN_TELEMETRY_METRIC_ENDPOINT=${METRICS_OPEN_TELEMETRY_METRIC_ENDPOINT}
+ # - METRICS_OPEN_TELEMETRY_PROTOCOL=${METRICS_OPEN_TELEMETRY_PROTOCOL}
+ # - METRICS_OPEN_TELEMETRY_DEBUG=${METRICS_OPEN_TELEMETRY_DEBUG}
+
+ # PROXY
+ # - GLOBAL_AGENT_HTTP_PROXY=${GLOBAL_AGENT_HTTP_PROXY}
+ # - GLOBAL_AGENT_HTTPS_PROXY=${GLOBAL_AGENT_HTTPS_PROXY}
+ # - GLOBAL_AGENT_NO_PROXY=${GLOBAL_AGENT_NO_PROXY}
+
+ # QUEUE CONFIGURATION
+ # - MODE=${MODE}
+ # - QUEUE_NAME=${QUEUE_NAME}
+ # - QUEUE_REDIS_EVENT_STREAM_MAX_LEN=${QUEUE_REDIS_EVENT_STREAM_MAX_LEN}
+ # - WORKER_CONCURRENCY=${WORKER_CONCURRENCY}
+ # - REMOVE_ON_AGE=${REMOVE_ON_AGE}
+ # - REMOVE_ON_COUNT=${REMOVE_ON_COUNT}
+ # - REDIS_URL=${REDIS_URL}
+ # - REDIS_HOST=${REDIS_HOST}
+ # - REDIS_PORT=${REDIS_PORT}
+ # - REDIS_USERNAME=${REDIS_USERNAME}
+ # - REDIS_PASSWORD=${REDIS_PASSWORD}
+ # - REDIS_TLS=${REDIS_TLS}
+ # - REDIS_CERT=${REDIS_CERT}
+ # - REDIS_KEY=${REDIS_KEY}
+ # - REDIS_CA=${REDIS_CA}
+ # - REDIS_KEEP_ALIVE=${REDIS_KEEP_ALIVE}
+ # - ENABLE_BULLMQ_DASHBOARD=${ENABLE_BULLMQ_DASHBOARD}
+ volumes:
+ - flowise_data:${DATABASE_PATH}
+ healthcheck:
+ test: ['CMD', 'curl', '-f', "http://localhost:${PANEL_APP_PORT_HTTP}/api/v1/ping"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+ start_period: 30s
+ labels:
+ createdBy: "Apps"
+
+networks:
+ 1panel-network:
+ external: true
+
+volumes:
+ flowise_data:
\ No newline at end of file
diff --git a/apps/flowise/logo.png b/apps/flowise/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a992a2fa475dc9b80e8cd099b7da1f77e068dd6
GIT binary patch
literal 32033
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
Q)&Kwi07*qoM6N<$f<