diff --git a/.github/workflows/db-migration-test.yml b/.github/workflows/db-migration-test.yml index 04812ca305..101d973466 100644 --- a/.github/workflows/db-migration-test.yml +++ b/.github/workflows/db-migration-test.yml @@ -84,10 +84,14 @@ jobs: # downgrade uv run --directory api flask db downgrade 'head:base' --sql - - name: Prepare middleware env + - name: Prepare middleware env for MySQL run: | cd docker cp middleware.env.example middleware.env + sed -i 's/DB_TYPE=postgresql/DB_TYPE=mysql/' middleware.env + sed -i 's/DB_HOST=db_postgres/DB_HOST=db_mysql/' middleware.env + sed -i 's/DB_PORT=5432/DB_PORT=3306/' middleware.env + sed -i 's/DB_USERNAME=postgres/DB_USERNAME=mysql/' middleware.env - name: Set up Middlewares uses: hoverkraft-tech/compose-action@v2.0.2 @@ -103,6 +107,8 @@ jobs: cd api cp .env.example .env sed -i 's/DB_TYPE=postgresql/DB_TYPE=mysql/' .env + sed -i 's/DB_PORT=5432/DB_PORT=3306/' .env + sed -i 's/DB_USERNAME=postgres/DB_USERNAME=root/' .env - name: Run DB Migration env: diff --git a/api/.env.example b/api/.env.example index 38371aa510..607f17d7bc 100644 --- a/api/.env.example +++ b/api/.env.example @@ -75,30 +75,11 @@ CELERY_BACKEND=redis # Database configuration DB_TYPE=postgresql - -# PostgreSQL configuration -POSTGRES_USER=postgres -POSTGRES_PASSWORD=difyai123456 -POSTGRES_HOST=localhost -POSTGRES_PORT=5432 -POSTGRES_DATABASE=dify - -# MySQL configuration -MYSQL_USER=mysql -MYSQL_PASSWORD=difyai123456 -MYSQL_HOST=localhost -MYSQL_PORT=3306 -MYSQL_DATABASE=dify - -# OceanBase configuration -OCEANBASE_USER=root@test -OCEANBASE_PASSWORD=difyai123456 -OCEANBASE_HOST=localhost -OCEANBASE_PORT=2881 -OCEANBASE_DATABASE=test -OCEANBASE_MEMORY_LIMIT=6G -OCEANBASE_ENABLE_HYBRID_SEARCH=false -OCEANBASE_FULLTEXT_PARSER=ik +DB_USERNAME=postgres +DB_PASSWORD=difyai123456 +DB_HOST=localhost +DB_PORT=5432 +DB_DATABASE=dify SQLALCHEMY_POOL_PRE_PING=true SQLALCHEMY_POOL_TIMEOUT=30 @@ -187,7 +168,6 @@ COOKIE_DOMAIN= # Vector database configuration # Supported values are `weaviate`, `oceanbase`, `qdrant`, `milvus`, `myscale`, `relyt`, `pgvector`, `pgvecto-rs`, `chroma`, `opensearch`, `oracle`, `tencent`, `elasticsearch`, `elasticsearch-ja`, `analyticdb`, `couchbase`, `vikingdb`, `opengauss`, `tablestore`,`vastbase`,`tidb`,`tidb_on_qdrant`,`baidu`,`lindorm`,`huawei_cloud`,`upstash`, `matrixone`. -# The configuration of the oceanbase is in the Database Configuration column. VECTOR_STORE=weaviate # Prefix used to create collection name in vector database VECTOR_INDEX_NAME_PREFIX=Vector_index @@ -198,6 +178,16 @@ WEAVIATE_API_KEY=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih WEAVIATE_GRPC_ENABLED=false WEAVIATE_BATCH_SIZE=100 +# OceanBase Vector configuration +OCEANBASE_VECTOR_HOST=127.0.0.1 +OCEANBASE_VECTOR_PORT=2881 +OCEANBASE_VECTOR_USER=root@test +OCEANBASE_VECTOR_PASSWORD=difyai123456 +OCEANBASE_VECTOR_DATABASE=test +OCEANBASE_MEMORY_LIMIT=6G +OCEANBASE_ENABLE_HYBRID_SEARCH=false +OCEANBASE_FULLTEXT_PARSER=ik + # Qdrant configuration, use `http://localhost:6333` for local mode or `https://your-qdrant-cluster-url.qdrant.io` for remote mode QDRANT_URL=http://localhost:6333 QDRANT_API_KEY=difyai123456 diff --git a/api/configs/middleware/__init__.py b/api/configs/middleware/__init__.py index 43a9b76b8a..a5e35c99ca 100644 --- a/api/configs/middleware/__init__.py +++ b/api/configs/middleware/__init__.py @@ -111,145 +111,31 @@ class DatabaseConfig(BaseSettings): default="postgresql", ) - # PostgreSQL configuration - POSTGRES_HOST: str = Field( - description="PostgreSQL hostname or IP address.", + DB_HOST: str = Field( + description="Hostname or IP address of the database server.", default="localhost", ) - POSTGRES_PORT: PositiveInt = Field( - description="PostgreSQL port number.", + DB_PORT: PositiveInt = Field( + description="Port number for database connection.", default=5432, ) - POSTGRES_USER: str = Field( - description="PostgreSQL username.", + DB_USERNAME: str = Field( + description="Username for database authentication.", default="postgres", ) - POSTGRES_PASSWORD: str = Field( - description="PostgreSQL password.", - default="difyai123456", + DB_PASSWORD: str = Field( + description="Password for database authentication.", + default="", ) - POSTGRES_DATABASE: str = Field( - description="PostgreSQL database name.", + DB_DATABASE: str = Field( + description="Name of the database to connect to.", default="dify", ) - # MySQL configuration - MYSQL_HOST: str = Field( - description="MySQL hostname or IP address.", - default="localhost", - ) - - MYSQL_PORT: PositiveInt = Field( - description="MySQL port number.", - default=3306, - ) - - MYSQL_USER: str = Field( - description="MySQL username.", - default="root", - ) - - MYSQL_PASSWORD: str = Field( - description="MySQL password.", - default="difyai123456", - ) - - MYSQL_DATABASE: str = Field( - description="MySQL database name.", - default="dify", - ) - - # OceanBase configuration(MySQL-compatible) - OCEANBASE_HOST: str = Field( - description="OceanBase hostname or IP address.", - default="localhost", - ) - - OCEANBASE_PORT: PositiveInt = Field( - description="OceanBase port number.", - default=2881, - ) - - OCEANBASE_USER: str = Field( - description="OceanBase username.", - default="root@test", - ) - - OCEANBASE_PASSWORD: str = Field( - description="OceanBase password.", - default="difyai123456", - ) - - OCEANBASE_DATABASE: str = Field( - description="OceanBase database name.", - default="test", - ) - - # Dynamic properties based on DB_TYPE - @computed_field # type: ignore[prop-decorator] - @property - def DB_HOST(self) -> str: - if self.DB_TYPE == "postgresql": - return self.POSTGRES_HOST - elif self.DB_TYPE == "mysql": - return self.MYSQL_HOST - elif self.DB_TYPE == "oceanbase": - return self.OCEANBASE_HOST - else: - raise ValueError(f"Unsupported DB_TYPE: {self.DB_TYPE}") - - @computed_field # type: ignore[prop-decorator] - @property - def DB_PORT(self) -> int: - if self.DB_TYPE == "postgresql": - return self.POSTGRES_PORT - elif self.DB_TYPE == "mysql": - return self.MYSQL_PORT - elif self.DB_TYPE == "oceanbase": - return self.OCEANBASE_PORT - else: - raise ValueError(f"Unsupported DB_TYPE: {self.DB_TYPE}") - - @computed_field # type: ignore[prop-decorator] - @property - def DB_USERNAME(self) -> str: - if self.DB_TYPE == "postgresql": - return self.POSTGRES_USER - elif self.DB_TYPE == "mysql": - return self.MYSQL_USER - elif self.DB_TYPE == "oceanbase": - return self.OCEANBASE_USER - else: - raise ValueError(f"Unsupported DB_TYPE: {self.DB_TYPE}") - - @computed_field # type: ignore[prop-decorator] - @property - def DB_PASSWORD(self) -> str: - if self.DB_TYPE == "postgresql": - return self.POSTGRES_PASSWORD - elif self.DB_TYPE == "mysql": - return self.MYSQL_PASSWORD - elif self.DB_TYPE == "oceanbase": - return self.OCEANBASE_PASSWORD - else: - raise ValueError(f"Unsupported DB_TYPE: {self.DB_TYPE}") - - @computed_field # type: ignore[prop-decorator] - @property - def DB_DATABASE(self) -> str: - if self.DB_TYPE == "postgresql": - return self.POSTGRES_DATABASE - elif self.DB_TYPE == "mysql": - return self.MYSQL_DATABASE - elif self.DB_TYPE == "oceanbase": - return self.OCEANBASE_DATABASE - else: - raise ValueError(f"Unsupported DB_TYPE: {self.DB_TYPE}") - DB_CHARSET: str = Field( description="Character set for database connection.", default="", diff --git a/api/configs/middleware/vdb/oceanbase_config.py b/api/configs/middleware/vdb/oceanbase_config.py index 2b6b79812d..7c9376f86b 100644 --- a/api/configs/middleware/vdb/oceanbase_config.py +++ b/api/configs/middleware/vdb/oceanbase_config.py @@ -7,29 +7,29 @@ class OceanBaseVectorConfig(BaseSettings): Configuration settings for OceanBase Vector database """ - OCEANBASE_HOST: str = Field( - description="OceanBase hostname or IP address.", - default="localhost", + OCEANBASE_VECTOR_HOST: str | None = Field( + description="Hostname or IP address of the OceanBase Vector server (e.g. 'localhost')", + default=None, ) - OCEANBASE_PORT: PositiveInt = Field( - description="OceanBase port number.", + OCEANBASE_VECTOR_PORT: PositiveInt | None = Field( + description="Port number on which the OceanBase Vector server is listening (default is 2881)", default=2881, ) - OCEANBASE_USER: str = Field( - description="OceanBase username.", - default="root@test", + OCEANBASE_VECTOR_USER: str | None = Field( + description="Username for authenticating with the OceanBase Vector database", + default=None, ) - OCEANBASE_PASSWORD: str = Field( - description="OceanBase password.", - default="difyai123456", + OCEANBASE_VECTOR_PASSWORD: str | None = Field( + description="Password for authenticating with the OceanBase Vector database", + default=None, ) - OCEANBASE_DATABASE: str = Field( - description="OceanBase database name.", - default="test", + OCEANBASE_VECTOR_DATABASE: str | None = Field( + description="Name of the OceanBase Vector database to connect to", + default=None, ) OCEANBASE_ENABLE_HYBRID_SEARCH: bool = Field( diff --git a/api/core/rag/datasource/vdb/oceanbase/oceanbase_vector.py b/api/core/rag/datasource/vdb/oceanbase/oceanbase_vector.py index e85985ad40..b3db7332e8 100644 --- a/api/core/rag/datasource/vdb/oceanbase/oceanbase_vector.py +++ b/api/core/rag/datasource/vdb/oceanbase/oceanbase_vector.py @@ -37,13 +37,13 @@ class OceanBaseVectorConfig(BaseModel): @classmethod def validate_config(cls, values: dict): if not values["host"]: - raise ValueError("config OCEANBASE_HOST is required") + raise ValueError("config OCEANBASE_VECTOR_HOST is required") if not values["port"]: - raise ValueError("config OCEANBASE_PORT is required") + raise ValueError("config OCEANBASE_VECTOR_PORT is required") if not values["user"]: - raise ValueError("config OCEANBASE_USER is required") + raise ValueError("config OCEANBASE_VECTOR_USER is required") if not values["database"]: - raise ValueError("config OCEANBASE_DATABASE is required") + raise ValueError("config OCEANBASE_VECTOR_DATABASE is required") return values @@ -316,11 +316,11 @@ class OceanBaseVectorFactory(AbstractVectorFactory): return OceanBaseVector( collection_name, OceanBaseVectorConfig( - host=dify_config.OCEANBASE_HOST or "", - port=dify_config.OCEANBASE_PORT or 0, - user=dify_config.OCEANBASE_USER or "", - password=(dify_config.OCEANBASE_PASSWORD or ""), - database=dify_config.OCEANBASE_DATABASE or "", + host=dify_config.OCEANBASE_VECTOR_HOST or "", + port=dify_config.OCEANBASE_VECTOR_PORT or 0, + user=dify_config.OCEANBASE_VECTOR_USER or "", + password=(dify_config.OCEANBASE_VECTOR_PASSWORD or ""), + database=dify_config.OCEANBASE_VECTOR_DATABASE or "", enable_hybrid_search=dify_config.OCEANBASE_ENABLE_HYBRID_SEARCH or False, ), ) diff --git a/api/tests/unit_tests/configs/test_dify_config.py b/api/tests/unit_tests/configs/test_dify_config.py index 36e1e6e868..209b6bf59b 100644 --- a/api/tests/unit_tests/configs/test_dify_config.py +++ b/api/tests/unit_tests/configs/test_dify_config.py @@ -16,11 +16,11 @@ def test_dify_config(monkeypatch: pytest.MonkeyPatch): monkeypatch.setenv("CONSOLE_API_URL", "https://example.com") monkeypatch.setenv("CONSOLE_WEB_URL", "https://example.com") monkeypatch.setenv("HTTP_REQUEST_MAX_WRITE_TIMEOUT", "30") # Custom value for testing - monkeypatch.setenv("POSTGRES_USER", "postgres") - monkeypatch.setenv("POSTGRES_PASSWORD", "postgres") - monkeypatch.setenv("POSTGRES_HOST", "localhost") - monkeypatch.setenv("POSTGRES_PORT", "5432") - monkeypatch.setenv("POSTGRES_DATABASE", "dify") + monkeypatch.setenv("DB_USERNAME", "postgres") + monkeypatch.setenv("DB_PASSWORD", "postgres") + monkeypatch.setenv("DB_HOST", "localhost") + monkeypatch.setenv("DB_PORT", "5432") + monkeypatch.setenv("DB_DATABASE", "dify") monkeypatch.setenv("HTTP_REQUEST_MAX_READ_TIMEOUT", "300") # Custom value for testing # load dotenv file with pydantic-settings @@ -51,11 +51,11 @@ def test_http_timeout_defaults(monkeypatch: pytest.MonkeyPatch): os.environ.clear() # Set minimal required env vars - monkeypatch.setenv("POSTGRES_USER", "postgres") - monkeypatch.setenv("POSTGRES_PASSWORD", "postgres") - monkeypatch.setenv("POSTGRES_HOST", "localhost") - monkeypatch.setenv("POSTGRES_PORT", "5432") - monkeypatch.setenv("POSTGRES_DATABASE", "dify") + monkeypatch.setenv("DB_USERNAME", "postgres") + monkeypatch.setenv("DB_PASSWORD", "postgres") + monkeypatch.setenv("DB_HOST", "localhost") + monkeypatch.setenv("DB_PORT", "5432") + monkeypatch.setenv("DB_DATABASE", "dify") config = DifyConfig() @@ -75,11 +75,11 @@ def test_flask_configs(monkeypatch: pytest.MonkeyPatch): # Set environment variables using monkeypatch monkeypatch.setenv("CONSOLE_API_URL", "https://example.com") monkeypatch.setenv("CONSOLE_WEB_URL", "https://example.com") - monkeypatch.setenv("POSTGRES_USER", "postgres") - monkeypatch.setenv("POSTGRES_PASSWORD", "postgres") - monkeypatch.setenv("POSTGRES_HOST", "localhost") - monkeypatch.setenv("POSTGRES_PORT", "5432") - monkeypatch.setenv("POSTGRES_DATABASE", "dify") + monkeypatch.setenv("DB_USERNAME", "postgres") + monkeypatch.setenv("DB_PASSWORD", "postgres") + monkeypatch.setenv("DB_HOST", "localhost") + monkeypatch.setenv("DB_PORT", "5432") + monkeypatch.setenv("DB_DATABASE", "dify") monkeypatch.setenv("WEB_API_CORS_ALLOW_ORIGINS", "http://127.0.0.1:3000,*") monkeypatch.setenv("CODE_EXECUTION_ENDPOINT", "http://127.0.0.1:8194/") @@ -120,78 +120,15 @@ def test_flask_configs(monkeypatch: pytest.MonkeyPatch): assert str(URL(str(config["CODE_EXECUTION_ENDPOINT"])) / "v1") == "http://127.0.0.1:8194/v1" -def test_flask_configs_mysql(monkeypatch: pytest.MonkeyPatch): - """Test Flask configuration with MySQL database type""" - flask_app = Flask("app") - # clear system environment variables - os.environ.clear() - - # Set environment variables using monkeypatch for MySQL - monkeypatch.setenv("CONSOLE_API_URL", "https://example.com") - monkeypatch.setenv("CONSOLE_WEB_URL", "https://example.com") - monkeypatch.setenv("DB_TYPE", "mysql") - monkeypatch.setenv("MYSQL_USER", "root") - monkeypatch.setenv("MYSQL_PASSWORD", "mysql123") - monkeypatch.setenv("MYSQL_HOST", "mysql-host") - monkeypatch.setenv("MYSQL_PORT", "3306") - monkeypatch.setenv("MYSQL_DATABASE", "dify_mysql") - monkeypatch.setenv("WEB_API_CORS_ALLOW_ORIGINS", "http://127.0.0.1:3000,*") - monkeypatch.setenv("CODE_EXECUTION_ENDPOINT", "http://127.0.0.1:8194/") - - flask_app.config.from_mapping(DifyConfig().model_dump()) # pyright: ignore - config = flask_app.config - - # configs read from pydantic-settings - assert config["LOG_LEVEL"] == "INFO" - assert config["COMMIT_SHA"] == "" - assert config["EDITION"] == "SELF_HOSTED" - assert config["API_COMPRESSION_ENABLED"] is False - assert config["SENTRY_TRACES_SAMPLE_RATE"] == 1.0 - - # value from env file - assert config["CONSOLE_API_URL"] == "https://example.com" - # fallback to alias choices value as CONSOLE_API_URL - assert config["FILES_URL"] == "https://example.com" - - # Test MySQL database configuration - assert config["DB_TYPE"] == "mysql" - assert config["SQLALCHEMY_DATABASE_URI"] == "mysql+pymysql://root:mysql123@mysql-host:3306/dify_mysql" - assert config["SQLALCHEMY_DATABASE_URI_SCHEME"] == "mysql+pymysql" - assert config["SQLALCHEMY_ENGINE_OPTIONS"] == { - "connect_args": {}, # MySQL doesn't have PostgreSQL-specific options - "max_overflow": 10, - "pool_pre_ping": False, - "pool_recycle": 3600, - "pool_size": 30, - "pool_use_lifo": False, - "pool_reset_on_return": None, - "pool_timeout": 30, - } - - # Test computed fields for MySQL - assert config["DB_HOST"] == "mysql-host" - assert config["DB_PORT"] == 3306 - assert config["DB_USERNAME"] == "root" - assert config["DB_PASSWORD"] == "mysql123" - assert config["DB_DATABASE"] == "dify_mysql" - - assert config["CONSOLE_WEB_URL"] == "https://example.com" - assert config["CONSOLE_CORS_ALLOW_ORIGINS"] == ["https://example.com"] - assert config["WEB_API_CORS_ALLOW_ORIGINS"] == ["http://127.0.0.1:3000", "*"] - - assert str(config["CODE_EXECUTION_ENDPOINT"]) == "http://127.0.0.1:8194/" - assert str(URL(str(config["CODE_EXECUTION_ENDPOINT"])) / "v1") == "http://127.0.0.1:8194/v1" - - def test_inner_api_config_exist(monkeypatch: pytest.MonkeyPatch): # Set environment variables using monkeypatch monkeypatch.setenv("CONSOLE_API_URL", "https://example.com") monkeypatch.setenv("CONSOLE_WEB_URL", "https://example.com") - monkeypatch.setenv("POSTGRES_USER", "postgres") - monkeypatch.setenv("POSTGRES_PASSWORD", "postgres") - monkeypatch.setenv("POSTGRES_HOST", "localhost") - monkeypatch.setenv("POSTGRES_PORT", "5432") - monkeypatch.setenv("POSTGRES_DATABASE", "dify") + monkeypatch.setenv("DB_USERNAME", "postgres") + monkeypatch.setenv("DB_PASSWORD", "postgres") + monkeypatch.setenv("DB_HOST", "localhost") + monkeypatch.setenv("DB_PORT", "5432") + monkeypatch.setenv("DB_DATABASE", "dify") monkeypatch.setenv("INNER_API_KEY", "test-inner-api-key") config = DifyConfig() @@ -203,11 +140,11 @@ def test_inner_api_config_exist(monkeypatch: pytest.MonkeyPatch): def test_db_extras_options_merging(monkeypatch: pytest.MonkeyPatch): """Test that DB_EXTRAS options are properly merged with default timezone setting""" # Set environment variables - monkeypatch.setenv("POSTGRES_USER", "postgres") - monkeypatch.setenv("POSTGRES_PASSWORD", "postgres") - monkeypatch.setenv("POSTGRES_HOST", "localhost") - monkeypatch.setenv("POSTGRES_PORT", "5432") - monkeypatch.setenv("POSTGRES_DATABASE", "dify") + monkeypatch.setenv("DB_USERNAME", "postgres") + monkeypatch.setenv("DB_PASSWORD", "postgres") + monkeypatch.setenv("DB_HOST", "localhost") + monkeypatch.setenv("DB_PORT", "5432") + monkeypatch.setenv("DB_DATABASE", "dify") monkeypatch.setenv("DB_EXTRAS", "options=-c search_path=myschema") # Create config @@ -262,11 +199,11 @@ def test_celery_broker_url_with_special_chars_password( # Set up basic required environment variables (following existing pattern) monkeypatch.setenv("CONSOLE_API_URL", "https://example.com") monkeypatch.setenv("CONSOLE_WEB_URL", "https://example.com") - monkeypatch.setenv("POSTGRES_USER", "postgres") - monkeypatch.setenv("POSTGRES_PASSWORD", "postgres") - monkeypatch.setenv("POSTGRES_HOST", "localhost") - monkeypatch.setenv("POSTGRES_PORT", "5432") - monkeypatch.setenv("POSTGRES_DATABASE", "dify") + monkeypatch.setenv("DB_USERNAME", "postgres") + monkeypatch.setenv("DB_PASSWORD", "postgres") + monkeypatch.setenv("DB_HOST", "localhost") + monkeypatch.setenv("DB_PORT", "5432") + monkeypatch.setenv("DB_DATABASE", "dify") # Set the CELERY_BROKER_URL to test monkeypatch.setenv("CELERY_BROKER_URL", broker_url) diff --git a/docker/.env.example b/docker/.env.example index 17c533f66c..6075940feb 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -224,22 +224,32 @@ NEXT_PUBLIC_ENABLE_SINGLE_DOLLAR_LATEX=false # ------------------------------ # Database Configuration -# The database uses PostgreSQL,MySQL or OceanBase. Please use the public schema. +# The database uses PostgreSQL or MySQL. Please use the public schema. # It is consistent with the configuration in the databse service below. # ------------------------------ -# Database type, supported values are `postgresql`, `mysql` and `oceanbase` -# According to the `DB_TYPE`, the project will use the corresponding database configuration. + DB_TYPE=postgresql - -# PostgreSQL Default Configuration -POSTGRES_USER=postgres -POSTGRES_PASSWORD=difyai123456 -POSTGRES_HOST=db_postgres -POSTGRES_PORT=5432 -POSTGRES_DATABASE=dify - -# PostgreSQL data directory -PGDATA=/var/lib/postgresql/data/pgdata +DB_USERNAME=postgres +DB_PASSWORD=difyai123456 +DB_HOST=db_postgres +DB_PORT=5432 +DB_DATABASE=dify +# The size of the database connection pool. +# The default is 30 connections, which can be appropriately increased. +SQLALCHEMY_POOL_SIZE=30 +# The default is 10 connections, which allows temporary overflow beyond the pool size. +SQLALCHEMY_MAX_OVERFLOW=10 +# Database connection pool recycling time, the default is 3600 seconds. +SQLALCHEMY_POOL_RECYCLE=3600 +# Whether to print SQL, default is false. +SQLALCHEMY_ECHO=false +# If True, will test connections for liveness upon each checkout +SQLALCHEMY_POOL_PRE_PING=false +# Whether to enable the Last in first out option or use default FIFO queue if is false +SQLALCHEMY_POOL_USE_LIFO=false +# Number of seconds to wait for a connection from the pool before raising a timeout error. +# Default is 30 +SQLALCHEMY_POOL_TIMEOUT=30 # Maximum number of connections to the database # Default is 100 @@ -285,16 +295,6 @@ POSTGRES_STATEMENT_TIMEOUT=0 # A value of 0 prevents the server from terminating idle sessions. POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT=0 - -# MySQL Default Configuration -MYSQL_USER=mysql -MYSQL_PASSWORD=difyai123456 -MYSQL_HOST=db_mysql -MYSQL_PORT=3306 -MYSQL_DATABASE=dify -# MySQL data directory -MYSQL_HOST_VOLUME=./volumes/mysql/data - # MySQL Performance Configuration # Maximum number of connections to MySQL # @@ -318,41 +318,6 @@ MYSQL_INNODB_LOG_FILE_SIZE=128M # Reference: https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT=2 -# For OceanBase metadata database configuration, available when `DB_TYPE` is `oceanbase` -# For OceanBase vector database configuration, available when `VECTOR_STORE` is `oceanbase` -# If you want to use OceanBase as both vector database and metadata database, you need to set both `DB_TYPE` and `VECTOR_STORE` to `oceanbase`. -OCEANBASE_USER=root@test -OCEANBASE_PASSWORD=difyai123456 -OCEANBASE_HOST=oceanbase -OCEANBASE_PORT=2881 -OCEANBASE_DATABASE=test -# The cluster name for the OceanBase database, the default is difyai -OCEANBASE_CLUSTER_NAME=difyai -# The memory limit for the OceanBase database, the default is 6G -OCEANBASE_MEMORY_LIMIT=6G -# Whether to enable hybrid search for the OceanBase database, the default is false -OCEANBASE_ENABLE_HYBRID_SEARCH=false -# For OceanBase vector database, built-in fulltext parsers are `ngram`, `beng`, `space`, `ngram2`, `ik` -# For OceanBase vector database, external fulltext parsers (require plugin installation) are `japanese_ftparser`, `thai_ftparser` -OCEANBASE_FULLTEXT_PARSER=ik - -# The size of the database connection pool. -# The default is 30 connections, which can be appropriately increased. -SQLALCHEMY_POOL_SIZE=30 -# The default is 10 connections, which allows temporary overflow beyond the pool size. -SQLALCHEMY_MAX_OVERFLOW=10 -# Database connection pool recycling time, the default is 3600 seconds. -SQLALCHEMY_POOL_RECYCLE=3600 -# Whether to print SQL, default is false. -SQLALCHEMY_ECHO=false -# If True, will test connections for liveness upon each checkout -SQLALCHEMY_POOL_PRE_PING=false -# Whether to enable the Last in first out option or use default FIFO queue if is false -SQLALCHEMY_POOL_USE_LIFO=false -# Number of seconds to wait for a connection from the pool before raising a timeout error. -# Default is 30 -SQLALCHEMY_POOL_TIMEOUT=30 - # ------------------------------ # Redis Configuration # This Redis configuration is used for caching and for pub/sub during conversation. @@ -549,7 +514,6 @@ SUPABASE_URL=your-server-url # The type of vector store to use. # Supported values are `weaviate`, `oceanbase`, `qdrant`, `milvus`, `myscale`, `relyt`, `pgvector`, `pgvecto-rs`, `chroma`, `opensearch`, `oracle`, `tencent`, `elasticsearch`, `elasticsearch-ja`, `analyticdb`, `couchbase`, `vikingdb`, `opengauss`, `tablestore`,`vastbase`,`tidb`,`tidb_on_qdrant`,`baidu`,`lindorm`,`huawei_cloud`,`upstash`, `matrixone`, `clickzetta`, `alibabacloud_mysql`. -# The configuration of the oceanbase is in the Database Configuration column. VECTOR_STORE=weaviate # Prefix used to create collection name in vector database VECTOR_INDEX_NAME_PREFIX=Vector_index @@ -559,6 +523,21 @@ WEAVIATE_ENDPOINT=http://weaviate:8080 WEAVIATE_API_KEY=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih WEAVIATE_GRPC_ENDPOINT=grpc://weaviate:50051 +# For OceanBase metadata database configuration, available when `DB_TYPE` is `mysql` and `COMPOSE_PROFILES` includes `oceanbase` +# For OceanBase vector database configuration, available when `VECTOR_STORE` is `oceanbase` +# If you want to use OceanBase as both vector database and metadata database, you need to set `DB_TYPE` to `mysql` and `COMPOSE_PROFILES` is `oceanbase`. +OCEANBASE_VECTOR_HOST=oceanbase +OCEANBASE_VECTOR_PORT=2881 +OCEANBASE_VECTOR_USER=root@test +OCEANBASE_VECTOR_PASSWORD=difyai123456 +OCEANBASE_VECTOR_DATABASE=test +OCEANBASE_CLUSTER_NAME=difyai +OCEANBASE_MEMORY_LIMIT=6G +OCEANBASE_ENABLE_HYBRID_SEARCH=false +# For OceanBase vector database, built-in fulltext parsers are `ngram`, `beng`, `space`, `ngram2`, `ik` +# For OceanBase vector database, external fulltext parsers (require plugin installation) are `japanese_ftparser`, `thai_ftparser` +OCEANBASE_FULLTEXT_PARSER=ik + # The Qdrant endpoint URL. Only available when VECTOR_STORE is `qdrant`. QDRANT_URL=http://qdrant:6333 QDRANT_API_KEY=difyai123456 @@ -1086,6 +1065,29 @@ ALLOW_UNSAFE_DATA_SCHEME=false # Maximum number of tree depth in the workflow MAX_TREE_DEPTH=50 +# ------------------------------ +# Environment Variables for database Service +# ------------------------------ + +# The name of the default postgres user. +POSTGRES_USER=${DB_USERNAME} +# The password for the default postgres user. +POSTGRES_PASSWORD=${DB_PASSWORD} +# The name of the default postgres database. +POSTGRES_DB=${DB_DATABASE} +# Postgres data directory +PGDATA=/var/lib/postgresql/data/pgdata + +# MySQL Default Configuration +# The name of the default mysql user. +MYSQL_USERNAME=${DB_USERNAME} +# The password for the default mysql user. +MYSQL_PASSWORD=${DB_PASSWORD} +# The name of the default mysql database. +MYSQL_DATABASE=${DB_DATABASE} +# MySQL data directory +MYSQL_HOST_VOLUME=./volumes/mysql/data + # ------------------------------ # Environment Variables for sandbox Service # ------------------------------ @@ -1249,7 +1251,6 @@ SSRF_POOL_KEEPALIVE_EXPIRY=5.0 # (based on the vector db and metadata db type, the corresponding docker # compose profile will be used) # if you want to use unstructured, add ',unstructured' to the end -# if you want to use mysql as metadata db, change ',postgres' to ',mysql' to the end # ------------------------------ COMPOSE_PROFILES=${VECTOR_STORE:-weaviate},${DB_TYPE:-postgresql} @@ -1419,4 +1420,4 @@ WORKFLOW_SCHEDULE_POLLER_BATCH_SIZE=100 WORKFLOW_SCHEDULE_MAX_DISPATCH_PER_TICK=0 # Tenant isolated task queue configuration -TENANT_ISOLATED_TASK_CONCURRENCY=1 +TENANT_ISOLATED_TASK_CONCURRENCY=1 \ No newline at end of file diff --git a/docker/docker-compose-template.yaml b/docker/docker-compose-template.yaml index 35ba2e7a57..67158c3ef7 100644 --- a/docker/docker-compose-template.yaml +++ b/docker/docker-compose-template.yaml @@ -132,7 +132,7 @@ services: environment: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-difyai123456} - POSTGRES_DB: ${DB_DATABASE:-dify} + POSTGRES_DB: ${POSTGRES_DB:-dify} PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata} command: > postgres -c 'max_connections=${POSTGRES_MAX_CONNECTIONS:-100}' @@ -170,7 +170,7 @@ services: - ./middleware.env environment: MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD:-difyai123456} - MYSQL_DATABASE: ${DB_DATABASE:-dify} + MYSQL_DATABASE: ${MYSQL_DATABASE:-dify} command: > --max_connections=1000 --innodb_buffer_pool_size=${MYSQL_INNODB_BUFFER_POOL_SIZE:-512M} @@ -178,8 +178,6 @@ services: --innodb_flush_log_at_trx_commit=${MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT:-2} volumes: - ${MYSQL_HOST_VOLUME:-./volumes/mysql/data}:/var/lib/mysql - ports: - - "${MYSQL_PORT:-3306}:3306" healthcheck: test: [ @@ -431,19 +429,19 @@ services: - ./volumes/oceanbase/init.d:/root/boot/init.d environment: OB_MEMORY_LIMIT: ${OCEANBASE_MEMORY_LIMIT:-6G} - OB_SYS_PASSWORD: ${OCEANBASE_PASSWORD:-difyai123456} - OB_TENANT_PASSWORD: ${OCEANBASE_PASSWORD:-difyai123456} + OB_SYS_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} + OB_TENANT_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} OB_CLUSTER_NAME: ${OCEANBASE_CLUSTER_NAME:-difyai} OB_SERVER_IP: 127.0.0.1 MODE: mini LANG: en_US.UTF-8 ports: - - "${OCEANBASE_PORT:-2881}:2881" + - "${OCEANBASE_VECTOR_PORT:-2881}:2881" healthcheck: test: [ "CMD-SHELL", - 'obclient -h127.0.0.1 -P2881 -uroot@test -p$${OB_TENANT_PASSWORD} -e "SELECT 1;"', + 'obclient -h127.0.0.1 -P2881 -uroot@test -p${OCEANBASE_VECTOR_PASSWORD} -e "SELECT 1;"', ] interval: 10s retries: 30 diff --git a/docker/docker-compose.middleware.yaml b/docker/docker-compose.middleware.yaml index dc5469eae8..b409e3d26d 100644 --- a/docker/docker-compose.middleware.yaml +++ b/docker/docker-compose.middleware.yaml @@ -30,7 +30,7 @@ services: "CMD", "pg_isready", "-h", - "db-postgres", + "db_postgres", "-U", "${PGUSER:-postgres}", "-d", @@ -49,7 +49,7 @@ services: - ./middleware.env environment: MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD:-difyai123456} - MYSQL_DATABASE: ${MYSQL_DB:-dify} + MYSQL_DATABASE: ${MYSQL_DATABASE:-dify} command: > --max_connections=1000 --innodb_buffer_pool_size=${MYSQL_INNODB_BUFFER_POOL_SIZE:-512M} diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 69e4741fb3..8b73152a89 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -54,38 +54,11 @@ x-shared-env: &shared-api-worker-env ENABLE_WEBSITE_WATERCRAWL: ${ENABLE_WEBSITE_WATERCRAWL:-true} NEXT_PUBLIC_ENABLE_SINGLE_DOLLAR_LATEX: ${NEXT_PUBLIC_ENABLE_SINGLE_DOLLAR_LATEX:-false} DB_TYPE: ${DB_TYPE:-postgresql} - POSTGRES_USER: ${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-difyai123456} - POSTGRES_HOST: ${POSTGRES_HOST:-db_postgres} - POSTGRES_PORT: ${POSTGRES_PORT:-5432} - POSTGRES_DATABASE: ${POSTGRES_DATABASE:-dify} - PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata} - POSTGRES_MAX_CONNECTIONS: ${POSTGRES_MAX_CONNECTIONS:-100} - POSTGRES_SHARED_BUFFERS: ${POSTGRES_SHARED_BUFFERS:-128MB} - POSTGRES_WORK_MEM: ${POSTGRES_WORK_MEM:-4MB} - POSTGRES_MAINTENANCE_WORK_MEM: ${POSTGRES_MAINTENANCE_WORK_MEM:-64MB} - POSTGRES_EFFECTIVE_CACHE_SIZE: ${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB} - POSTGRES_STATEMENT_TIMEOUT: ${POSTGRES_STATEMENT_TIMEOUT:-0} - POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT: ${POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT:-0} - MYSQL_USER: ${MYSQL_USER:-mysql} - MYSQL_PASSWORD: ${MYSQL_PASSWORD:-difyai123456} - MYSQL_HOST: ${MYSQL_HOST:-db_mysql} - MYSQL_PORT: ${MYSQL_PORT:-3306} - MYSQL_DATABASE: ${MYSQL_DATABASE:-dify} - MYSQL_HOST_VOLUME: ${MYSQL_HOST_VOLUME:-./volumes/mysql/data} - MYSQL_MAX_CONNECTIONS: ${MYSQL_MAX_CONNECTIONS:-1000} - MYSQL_INNODB_BUFFER_POOL_SIZE: ${MYSQL_INNODB_BUFFER_POOL_SIZE:-512M} - MYSQL_INNODB_LOG_FILE_SIZE: ${MYSQL_INNODB_LOG_FILE_SIZE:-128M} - MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT: ${MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT:-2} - OCEANBASE_USER: ${OCEANBASE_USER:-root@test} - OCEANBASE_PASSWORD: ${OCEANBASE_PASSWORD:-difyai123456} - OCEANBASE_HOST: ${OCEANBASE_HOST:-oceanbase} - OCEANBASE_PORT: ${OCEANBASE_PORT:-2881} - OCEANBASE_DATABASE: ${OCEANBASE_DATABASE:-test} - OCEANBASE_CLUSTER_NAME: ${OCEANBASE_CLUSTER_NAME:-difyai} - OCEANBASE_MEMORY_LIMIT: ${OCEANBASE_MEMORY_LIMIT:-6G} - OCEANBASE_ENABLE_HYBRID_SEARCH: ${OCEANBASE_ENABLE_HYBRID_SEARCH:-false} - OCEANBASE_FULLTEXT_PARSER: ${OCEANBASE_FULLTEXT_PARSER:-ik} + DB_USERNAME: ${DB_USERNAME:-postgres} + DB_PASSWORD: ${DB_PASSWORD:-difyai123456} + DB_HOST: ${DB_HOST:-db_postgres} + DB_PORT: ${DB_PORT:-5432} + DB_DATABASE: ${DB_DATABASE:-dify} SQLALCHEMY_POOL_SIZE: ${SQLALCHEMY_POOL_SIZE:-30} SQLALCHEMY_MAX_OVERFLOW: ${SQLALCHEMY_MAX_OVERFLOW:-10} SQLALCHEMY_POOL_RECYCLE: ${SQLALCHEMY_POOL_RECYCLE:-3600} @@ -93,6 +66,17 @@ x-shared-env: &shared-api-worker-env SQLALCHEMY_POOL_PRE_PING: ${SQLALCHEMY_POOL_PRE_PING:-false} SQLALCHEMY_POOL_USE_LIFO: ${SQLALCHEMY_POOL_USE_LIFO:-false} SQLALCHEMY_POOL_TIMEOUT: ${SQLALCHEMY_POOL_TIMEOUT:-30} + POSTGRES_MAX_CONNECTIONS: ${POSTGRES_MAX_CONNECTIONS:-100} + POSTGRES_SHARED_BUFFERS: ${POSTGRES_SHARED_BUFFERS:-128MB} + POSTGRES_WORK_MEM: ${POSTGRES_WORK_MEM:-4MB} + POSTGRES_MAINTENANCE_WORK_MEM: ${POSTGRES_MAINTENANCE_WORK_MEM:-64MB} + POSTGRES_EFFECTIVE_CACHE_SIZE: ${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB} + POSTGRES_STATEMENT_TIMEOUT: ${POSTGRES_STATEMENT_TIMEOUT:-0} + POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT: ${POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT:-0} + MYSQL_MAX_CONNECTIONS: ${MYSQL_MAX_CONNECTIONS:-1000} + MYSQL_INNODB_BUFFER_POOL_SIZE: ${MYSQL_INNODB_BUFFER_POOL_SIZE:-512M} + MYSQL_INNODB_LOG_FILE_SIZE: ${MYSQL_INNODB_LOG_FILE_SIZE:-128M} + MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT: ${MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT:-2} REDIS_HOST: ${REDIS_HOST:-redis} REDIS_PORT: ${REDIS_PORT:-6379} REDIS_USERNAME: ${REDIS_USERNAME:-} @@ -180,6 +164,15 @@ x-shared-env: &shared-api-worker-env WEAVIATE_ENDPOINT: ${WEAVIATE_ENDPOINT:-http://weaviate:8080} WEAVIATE_API_KEY: ${WEAVIATE_API_KEY:-WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih} WEAVIATE_GRPC_ENDPOINT: ${WEAVIATE_GRPC_ENDPOINT:-grpc://weaviate:50051} + OCEANBASE_VECTOR_HOST: ${OCEANBASE_VECTOR_HOST:-oceanbase} + OCEANBASE_VECTOR_PORT: ${OCEANBASE_VECTOR_PORT:-2881} + OCEANBASE_VECTOR_USER: ${OCEANBASE_VECTOR_USER:-root@test} + OCEANBASE_VECTOR_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} + OCEANBASE_VECTOR_DATABASE: ${OCEANBASE_VECTOR_DATABASE:-test} + OCEANBASE_CLUSTER_NAME: ${OCEANBASE_CLUSTER_NAME:-difyai} + OCEANBASE_MEMORY_LIMIT: ${OCEANBASE_MEMORY_LIMIT:-6G} + OCEANBASE_ENABLE_HYBRID_SEARCH: ${OCEANBASE_ENABLE_HYBRID_SEARCH:-false} + OCEANBASE_FULLTEXT_PARSER: ${OCEANBASE_FULLTEXT_PARSER:-ik} QDRANT_URL: ${QDRANT_URL:-http://qdrant:6333} QDRANT_API_KEY: ${QDRANT_API_KEY:-difyai123456} QDRANT_CLIENT_TIMEOUT: ${QDRANT_CLIENT_TIMEOUT:-20} @@ -459,6 +452,14 @@ x-shared-env: &shared-api-worker-env TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000} ALLOW_UNSAFE_DATA_SCHEME: ${ALLOW_UNSAFE_DATA_SCHEME:-false} MAX_TREE_DEPTH: ${MAX_TREE_DEPTH:-50} + POSTGRES_USER: ${POSTGRES_USER:-${DB_USERNAME}} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-${DB_PASSWORD}} + POSTGRES_DB: ${POSTGRES_DB:-${DB_DATABASE}} + PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata} + MYSQL_USERNAME: ${MYSQL_USERNAME:-${DB_USERNAME}} + MYSQL_PASSWORD: ${MYSQL_PASSWORD:-${DB_PASSWORD}} + MYSQL_DATABASE: ${MYSQL_DATABASE:-${DB_DATABASE}} + MYSQL_HOST_VOLUME: ${MYSQL_HOST_VOLUME:-./volumes/mysql/data} SANDBOX_API_KEY: ${SANDBOX_API_KEY:-dify-sandbox} SANDBOX_GIN_MODE: ${SANDBOX_GIN_MODE:-release} SANDBOX_WORKER_TIMEOUT: ${SANDBOX_WORKER_TIMEOUT:-15} @@ -763,7 +764,7 @@ services: environment: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-difyai123456} - POSTGRES_DB: ${DB_DATABASE:-dify} + POSTGRES_DB: ${POSTGRES_DB:-dify} PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata} command: > postgres -c 'max_connections=${POSTGRES_MAX_CONNECTIONS:-100}' @@ -801,7 +802,7 @@ services: - ./middleware.env environment: MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD:-difyai123456} - MYSQL_DATABASE: ${DB_DATABASE:-dify} + MYSQL_DATABASE: ${MYSQL_DATABASE:-dify} command: > --max_connections=1000 --innodb_buffer_pool_size=${MYSQL_INNODB_BUFFER_POOL_SIZE:-512M} @@ -809,8 +810,6 @@ services: --innodb_flush_log_at_trx_commit=${MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT:-2} volumes: - ${MYSQL_HOST_VOLUME:-./volumes/mysql/data}:/var/lib/mysql - ports: - - "${MYSQL_PORT:-3306}:3306" healthcheck: test: [ @@ -1062,19 +1061,19 @@ services: - ./volumes/oceanbase/init.d:/root/boot/init.d environment: OB_MEMORY_LIMIT: ${OCEANBASE_MEMORY_LIMIT:-6G} - OB_SYS_PASSWORD: ${OCEANBASE_PASSWORD:-difyai123456} - OB_TENANT_PASSWORD: ${OCEANBASE_PASSWORD:-difyai123456} + OB_SYS_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} + OB_TENANT_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} OB_CLUSTER_NAME: ${OCEANBASE_CLUSTER_NAME:-difyai} OB_SERVER_IP: 127.0.0.1 MODE: mini LANG: en_US.UTF-8 ports: - - "${OCEANBASE_PORT:-2881}:2881" + - "${OCEANBASE_VECTOR_PORT:-2881}:2881" healthcheck: test: [ "CMD-SHELL", - 'obclient -h127.0.0.1 -P2881 -uroot@test -p$${OB_TENANT_PASSWORD} -e "SELECT 1;"', + 'obclient -h127.0.0.1 -P2881 -uroot@test -p${OCEANBASE_VECTOR_PASSWORD} -e "SELECT 1;"', ] interval: 10s retries: 30 diff --git a/docker/middleware.env.example b/docker/middleware.env.example index c465c410a0..3374ddd537 100644 --- a/docker/middleware.env.example +++ b/docker/middleware.env.example @@ -4,33 +4,22 @@ # Database Configuration # Database type, supported values are `postgresql` and `mysql` DB_TYPE=postgresql +DB_USERNAME=postgres +DB_PASSWORD=difyai123456 +DB_HOST=db_postgres +DB_PORT=5432 +DB_DATABASE=dify + # PostgreSQL Configuration -POSTGRES_USER=postgres +POSTGRES_USER=${DB_USERNAME} # The password for the default postgres user. -POSTGRES_PASSWORD=difyai123456 -# PostgreSQL host -POSTGRES_HOST=db_postgres -# PostgreSQL port -POSTGRES_PORT=5432 +POSTGRES_PASSWORD=${DB_PASSWORD} # The name of the default postgres database. -POSTGRES_DB=dify +POSTGRES_DB=${DB_DATABASE} # postgres data directory PGDATA=/var/lib/postgresql/data/pgdata PGDATA_HOST_VOLUME=./volumes/db/data -# MySQL Configuration -MYSQL_USER=mysql -# MySQL password -MYSQL_PASSWORD=difyai123456 -# MySQL database name -MYSQL_DB=dify -# MySQL host -MYSQL_HOST=db_mysql -# MySQL port -MYSQL_PORT=3306 -# MySQL data directory host volume -MYSQL_HOST_VOLUME=./volumes/mysql/data - # Maximum number of connections to the database # Default is 100 # @@ -75,6 +64,15 @@ POSTGRES_STATEMENT_TIMEOUT=0 # A value of 0 prevents the server from terminating idle sessions. POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT=0 +# MySQL Configuration +MYSQL_USERNAME=${DB_USERNAME} +# MySQL password +MYSQL_PASSWORD=${DB_PASSWORD} +# MySQL database name +MYSQL_DATABASE=${DB_DATABASE} +# MySQL data directory host volume +MYSQL_HOST_VOLUME=./volumes/mysql/data + # MySQL Performance Configuration # Maximum number of connections to MySQL # Default is 1000