Unverified Commit f8eefa31 authored by Yuhao's avatar Yuhao Committed by GitHub

feat: add redis ssl support (#65)

parent 0587ff0f
...@@ -21,9 +21,11 @@ DEFAULTS = { ...@@ -21,9 +21,11 @@ DEFAULTS = {
'REDIS_HOST': 'localhost', 'REDIS_HOST': 'localhost',
'REDIS_PORT': '6379', 'REDIS_PORT': '6379',
'REDIS_DB': '0', 'REDIS_DB': '0',
'REDIS_USE_SSL': 'False',
'SESSION_REDIS_HOST': 'localhost', 'SESSION_REDIS_HOST': 'localhost',
'SESSION_REDIS_PORT': '6379', 'SESSION_REDIS_PORT': '6379',
'SESSION_REDIS_DB': '2', 'SESSION_REDIS_DB': '2',
'SESSION_REDIS_USE_SSL': 'False',
'OAUTH_REDIRECT_PATH': '/console/api/oauth/authorize', 'OAUTH_REDIRECT_PATH': '/console/api/oauth/authorize',
'OAUTH_REDIRECT_INDEX_PATH': '/', 'OAUTH_REDIRECT_INDEX_PATH': '/',
'CONSOLE_URL': 'https://cloud.dify.ai', 'CONSOLE_URL': 'https://cloud.dify.ai',
...@@ -105,14 +107,18 @@ class Config: ...@@ -105,14 +107,18 @@ class Config:
# redis settings # redis settings
self.REDIS_HOST = get_env('REDIS_HOST') self.REDIS_HOST = get_env('REDIS_HOST')
self.REDIS_PORT = get_env('REDIS_PORT') self.REDIS_PORT = get_env('REDIS_PORT')
self.REDIS_USERNAME = get_env('REDIS_USERNAME')
self.REDIS_PASSWORD = get_env('REDIS_PASSWORD') self.REDIS_PASSWORD = get_env('REDIS_PASSWORD')
self.REDIS_DB = get_env('REDIS_DB') self.REDIS_DB = get_env('REDIS_DB')
self.REDIS_USE_SSL = get_bool_env('REDIS_USE_SSL')
# session redis settings # session redis settings
self.SESSION_REDIS_HOST = get_env('SESSION_REDIS_HOST') self.SESSION_REDIS_HOST = get_env('SESSION_REDIS_HOST')
self.SESSION_REDIS_PORT = get_env('SESSION_REDIS_PORT') self.SESSION_REDIS_PORT = get_env('SESSION_REDIS_PORT')
self.SESSION_REDIS_USERNAME = get_env('SESSION_REDIS_USERNAME')
self.SESSION_REDIS_PASSWORD = get_env('SESSION_REDIS_PASSWORD') self.SESSION_REDIS_PASSWORD = get_env('SESSION_REDIS_PASSWORD')
self.SESSION_REDIS_DB = get_env('SESSION_REDIS_DB') self.SESSION_REDIS_DB = get_env('SESSION_REDIS_DB')
self.SESSION_REDIS_USE_SSL = get_bool_env('SESSION_REDIS_USE_SSL')
# storage settings # storage settings
self.STORAGE_TYPE = get_env('STORAGE_TYPE') self.STORAGE_TYPE = get_env('STORAGE_TYPE')
...@@ -165,6 +171,7 @@ class Config: ...@@ -165,6 +171,7 @@ class Config:
self.CELERY_BACKEND = get_env('CELERY_BACKEND') self.CELERY_BACKEND = get_env('CELERY_BACKEND')
self.CELERY_RESULT_BACKEND = 'db+{}'.format(self.SQLALCHEMY_DATABASE_URI) \ self.CELERY_RESULT_BACKEND = 'db+{}'.format(self.SQLALCHEMY_DATABASE_URI) \
if self.CELERY_BACKEND == 'database' else self.CELERY_BROKER_URL if self.CELERY_BACKEND == 'database' else self.CELERY_BROKER_URL
self.BROKER_USE_SSL = self.CELERY_BROKER_URL.startswith('rediss://')
# hosted provider credentials # hosted provider credentials
self.OPENAI_API_KEY = get_env('OPENAI_API_KEY') self.OPENAI_API_KEY = get_env('OPENAI_API_KEY')
......
...@@ -15,9 +15,24 @@ def init_app(app: Flask) -> Celery: ...@@ -15,9 +15,24 @@ def init_app(app: Flask) -> Celery:
backend=app.config["CELERY_BACKEND"], backend=app.config["CELERY_BACKEND"],
task_ignore_result=True, task_ignore_result=True,
) )
# Add SSL options to the Celery configuration
ssl_options = {
"ssl_cert_reqs": None,
"ssl_ca_certs": None,
"ssl_certfile": None,
"ssl_keyfile": None,
}
celery_app.conf.update( celery_app.conf.update(
result_backend=app.config["CELERY_RESULT_BACKEND"], result_backend=app.config["CELERY_RESULT_BACKEND"],
) )
if app.config["BROKER_USE_SSL"]:
celery_app.conf.update(
broker_use_ssl=ssl_options, # Add the SSL options to the broker configuration
)
celery_app.set_default() celery_app.set_default()
app.extensions["celery"] = celery_app app.extensions["celery"] = celery_app
return celery_app return celery_app
import redis import redis
from redis.connection import SSLConnection, Connection
redis_client = redis.Redis() redis_client = redis.Redis()
def init_app(app): def init_app(app):
connection_class = Connection
if app.config.get('REDIS_USE_SSL', False):
connection_class = SSLConnection
redis_client.connection_pool = redis.ConnectionPool(**{ redis_client.connection_pool = redis.ConnectionPool(**{
'host': app.config.get('REDIS_HOST', 'localhost'), 'host': app.config.get('REDIS_HOST', 'localhost'),
'port': app.config.get('REDIS_PORT', 6379), 'port': app.config.get('REDIS_PORT', 6379),
'username': app.config.get('REDIS_USERNAME', None),
'password': app.config.get('REDIS_PASSWORD', None), 'password': app.config.get('REDIS_PASSWORD', None),
'db': app.config.get('REDIS_DB', 0), 'db': app.config.get('REDIS_DB', 0),
'encoding': 'utf-8', 'encoding': 'utf-8',
'encoding_errors': 'strict', 'encoding_errors': 'strict',
'decode_responses': False 'decode_responses': False
}) }, connection_class=connection_class)
app.extensions['redis'] = redis_client app.extensions['redis'] = redis_client
import redis import redis
from redis.connection import SSLConnection, Connection
from flask import request from flask import request
from flask_session import Session, SqlAlchemySessionInterface, RedisSessionInterface from flask_session import Session, SqlAlchemySessionInterface, RedisSessionInterface
from flask_session.sessions import total_seconds from flask_session.sessions import total_seconds
...@@ -23,16 +24,21 @@ def init_app(app): ...@@ -23,16 +24,21 @@ def init_app(app):
if session_type == 'sqlalchemy': if session_type == 'sqlalchemy':
app.session_interface = sqlalchemy_session_interface app.session_interface = sqlalchemy_session_interface
elif session_type == 'redis': elif session_type == 'redis':
connection_class = Connection
if app.config.get('SESSION_REDIS_USE_SSL', False):
connection_class = SSLConnection
sess_redis_client = redis.Redis() sess_redis_client = redis.Redis()
sess_redis_client.connection_pool = redis.ConnectionPool(**{ sess_redis_client.connection_pool = redis.ConnectionPool(**{
'host': app.config.get('SESSION_REDIS_HOST', 'localhost'), 'host': app.config.get('SESSION_REDIS_HOST', 'localhost'),
'port': app.config.get('SESSION_REDIS_PORT', 6379), 'port': app.config.get('SESSION_REDIS_PORT', 6379),
'username': app.config.get('SESSION_REDIS_USERNAME', None),
'password': app.config.get('SESSION_REDIS_PASSWORD', None), 'password': app.config.get('SESSION_REDIS_PASSWORD', None),
'db': app.config.get('SESSION_REDIS_DB', 2), 'db': app.config.get('SESSION_REDIS_DB', 2),
'encoding': 'utf-8', 'encoding': 'utf-8',
'encoding_errors': 'strict', 'encoding_errors': 'strict',
'decode_responses': False 'decode_responses': False
}) }, connection_class=connection_class)
app.extensions['session_redis'] = sess_redis_client app.extensions['session_redis'] = sess_redis_client
......
...@@ -36,14 +36,18 @@ services: ...@@ -36,14 +36,18 @@ services:
# It is consistent with the configuration in the 'redis' service below. # It is consistent with the configuration in the 'redis' service below.
REDIS_HOST: redis REDIS_HOST: redis
REDIS_PORT: 6379 REDIS_PORT: 6379
REDIS_USERNAME: ''
REDIS_PASSWORD: difyai123456 REDIS_PASSWORD: difyai123456
REDIS_USE_SSL: 'false'
# use redis db 0 for redis cache # use redis db 0 for redis cache
REDIS_DB: 0 REDIS_DB: 0
# The configurations of session, Supported values are `sqlalchemy`. `redis` # The configurations of session, Supported values are `sqlalchemy`. `redis`
SESSION_TYPE: redis SESSION_TYPE: redis
SESSION_REDIS_HOST: redis SESSION_REDIS_HOST: redis
SESSION_REDIS_PORT: 6379 SESSION_REDIS_PORT: 6379
SESSION_REDIS_USERNAME: ''
SESSION_REDIS_PASSWORD: difyai123456 SESSION_REDIS_PASSWORD: difyai123456
SESSION_REDIS_USE_SSL: 'false'
# use redis db 2 for session store # use redis db 2 for session store
SESSION_REDIS_DB: 2 SESSION_REDIS_DB: 2
# The configurations of celery broker. # The configurations of celery broker.
...@@ -129,8 +133,10 @@ services: ...@@ -129,8 +133,10 @@ services:
# The configurations of redis cache connection. # The configurations of redis cache connection.
REDIS_HOST: redis REDIS_HOST: redis
REDIS_PORT: 6379 REDIS_PORT: 6379
REDIS_USERNAME: ''
REDIS_PASSWORD: difyai123456 REDIS_PASSWORD: difyai123456
REDIS_DB: 0 REDIS_DB: 0
REDIS_USE_SSL: 'false'
# The configurations of celery broker. # The configurations of celery broker.
CELERY_BROKER_URL: redis://:difyai123456@redis:6379/1 CELERY_BROKER_URL: redis://:difyai123456@redis:6379/1
# The type of storage to use for storing user files. Supported values are `local` and `s3`, Default: `local` # The type of storage to use for storing user files. Supported values are `local` and `s3`, Default: `local`
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment