update
This commit is contained in:
@@ -101,14 +101,30 @@ PROD_DATABASES = {
|
|||||||
"NAME": os.getenv("POSTGRES_DB"),
|
"NAME": os.getenv("POSTGRES_DB"),
|
||||||
"USER": os.getenv("POSTGRES_USER"),
|
"USER": os.getenv("POSTGRES_USER"),
|
||||||
"PASSWORD": os.getenv("POSTGRES_PASSWORD"),
|
"PASSWORD": os.getenv("POSTGRES_PASSWORD"),
|
||||||
"HOST": os.getenv("POSTGRES_HOST"),
|
"HOST": os.getenv("POSTGRES_HOST", "pgbouncer"),
|
||||||
|
"PORT": "5432",
|
||||||
|
# 由于使用了 PgBouncer,这里不需要保持长连接
|
||||||
|
"CONN_MAX_AGE": 0,
|
||||||
|
"OPTIONS": {
|
||||||
|
"application_name": "webpreview", # 便于在数据库中识别应用
|
||||||
|
"sslmode": "disable", # PgBouncer 不支持 SSL
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
PROD_CACHES = {
|
PROD_CACHES = {
|
||||||
"default": {
|
"default": {
|
||||||
"BACKEND": "django.core.cache.backends.db.DatabaseCache",
|
"BACKEND": "django.core.cache.backends.redis.RedisCache",
|
||||||
"LOCATION": "webpreview_api_cache",
|
"LOCATION": os.getenv("REDIS_URL", "redis://webpreview-redis:6379/1"),
|
||||||
|
"OPTIONS": {
|
||||||
|
"CLIENT_CLASS": "django_redis.client.DefaultClient",
|
||||||
|
"CONNECTION_POOL_KWARGS": {"max_connections": 50},
|
||||||
|
"SOCKET_CONNECT_TIMEOUT": 5, # 连接超时时间
|
||||||
|
"SOCKET_TIMEOUT": 5, # 读写超时时间
|
||||||
|
"RETRY_ON_TIMEOUT": True, # 超时时重试
|
||||||
|
"MAX_CONNECTIONS": 1000, # 连接池最大连接数
|
||||||
|
"HEALTH_CHECK_INTERVAL": 30, # 健康检查间隔
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,7 +132,12 @@ if DEBUG:
|
|||||||
DATABASES = DEV_DATABASES
|
DATABASES = DEV_DATABASES
|
||||||
else:
|
else:
|
||||||
DATABASES = PROD_DATABASES
|
DATABASES = PROD_DATABASES
|
||||||
|
# 使用 Redis 作为会话存储
|
||||||
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
|
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
|
||||||
|
SESSION_CACHE_ALIAS = "default"
|
||||||
|
# 设置会话过期时间(24小时)
|
||||||
|
SESSION_COOKIE_AGE = 86400
|
||||||
|
# 配置缓存
|
||||||
CACHES = PROD_CACHES
|
CACHES = PROD_CACHES
|
||||||
|
|
||||||
# Password validation
|
# Password validation
|
||||||
|
|||||||
@@ -1,5 +1,19 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
python manage.py createcachetable
|
# 等待 Redis 和 PgBouncer 准备就绪
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
# 执行数据库迁移
|
||||||
python manage.py migrate --noinput
|
python manage.py migrate --noinput
|
||||||
exec gunicorn --bind 0.0.0.0:8000 api.asgi:application -k uvicorn.workers.UvicornWorker -w 5
|
|
||||||
|
# 启动 Gunicorn
|
||||||
|
exec gunicorn api.asgi:application \
|
||||||
|
--bind 0.0.0.0:8000 \
|
||||||
|
--worker-class uvicorn.workers.UvicornWorker \
|
||||||
|
--workers 4 \
|
||||||
|
--threads 2 \
|
||||||
|
--timeout 120 \
|
||||||
|
--keep-alive 65 \
|
||||||
|
--max-requests 1000 \
|
||||||
|
--max-requests-jitter 50 \
|
||||||
|
--log-level info
|
||||||
@@ -14,4 +14,6 @@ dependencies = [
|
|||||||
"pydantic[email]>=2.10.6",
|
"pydantic[email]>=2.10.6",
|
||||||
"python-dotenv>=1.0.1",
|
"python-dotenv>=1.0.1",
|
||||||
"uvicorn>=0.34.0",
|
"uvicorn>=0.34.0",
|
||||||
|
"django-redis>=5.4.0",
|
||||||
|
"redis>=5.0.1",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ django==5.1.6
|
|||||||
django-cors-headers==4.7.0
|
django-cors-headers==4.7.0
|
||||||
django-extensions==3.2.3
|
django-extensions==3.2.3
|
||||||
django-ninja==1.3.0
|
django-ninja==1.3.0
|
||||||
|
django-redis==5.4.0
|
||||||
dnspython==2.7.0
|
dnspython==2.7.0
|
||||||
email-validator==2.2.0
|
email-validator==2.2.0
|
||||||
gunicorn==23.0.0
|
gunicorn==23.0.0
|
||||||
@@ -16,6 +17,7 @@ psycopg-binary==3.2.5
|
|||||||
pydantic==2.10.6
|
pydantic==2.10.6
|
||||||
pydantic-core==2.27.2
|
pydantic-core==2.27.2
|
||||||
python-dotenv==1.0.1
|
python-dotenv==1.0.1
|
||||||
|
redis==5.2.1
|
||||||
sqlparse==0.5.3
|
sqlparse==0.5.3
|
||||||
typing-extensions==4.12.2
|
typing-extensions==4.12.2
|
||||||
uvicorn==0.34.0
|
uvicorn==0.34.0
|
||||||
|
|||||||
26
uv.lock
generated
26
uv.lock
generated
@@ -93,6 +93,19 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/00/72/fd2589323b40893d3224e174eeec0c4ce5a42c7d2d384d11ba269ad4d050/django_ninja-1.3.0-py3-none-any.whl", hash = "sha256:f58096b6c767d1403dfd6c49743f82d780d7b9688d9302ecab316ac1fa6131bb", size = 2423381 },
|
{ url = "https://files.pythonhosted.org/packages/00/72/fd2589323b40893d3224e174eeec0c4ce5a42c7d2d384d11ba269ad4d050/django_ninja-1.3.0-py3-none-any.whl", hash = "sha256:f58096b6c767d1403dfd6c49743f82d780d7b9688d9302ecab316ac1fa6131bb", size = 2423381 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "django-redis"
|
||||||
|
version = "5.4.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "django" },
|
||||||
|
{ name = "redis" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/83/9d/2272742fdd9d0a9f0b28cd995b0539430c9467a2192e4de2cea9ea6ad38c/django-redis-5.4.0.tar.gz", hash = "sha256:6a02abaa34b0fea8bf9b707d2c363ab6adc7409950b2db93602e6cb292818c42", size = 52567 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/b7/f1/63caad7c9222c26a62082f4f777de26389233b7574629996098bf6d25a4d/django_redis-5.4.0-py3-none-any.whl", hash = "sha256:ebc88df7da810732e2af9987f7f426c96204bf89319df4c6da6ca9a2942edd5b", size = 31119 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dnspython"
|
name = "dnspython"
|
||||||
version = "2.7.0"
|
version = "2.7.0"
|
||||||
@@ -242,6 +255,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 },
|
{ url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "redis"
|
||||||
|
version = "5.2.1"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/47/da/d283a37303a995cd36f8b92db85135153dc4f7a8e4441aa827721b442cfb/redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f", size = 4608355 }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3c/5f/fa26b9b2672cbe30e07d9a5bdf39cf16e3b80b42916757c5f92bca88e4ba/redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4", size = 261502 },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlparse"
|
name = "sqlparse"
|
||||||
version = "0.5.3"
|
version = "0.5.3"
|
||||||
@@ -291,10 +313,12 @@ dependencies = [
|
|||||||
{ name = "django-cors-headers" },
|
{ name = "django-cors-headers" },
|
||||||
{ name = "django-extensions" },
|
{ name = "django-extensions" },
|
||||||
{ name = "django-ninja" },
|
{ name = "django-ninja" },
|
||||||
|
{ name = "django-redis" },
|
||||||
{ name = "gunicorn" },
|
{ name = "gunicorn" },
|
||||||
{ name = "psycopg", extra = ["binary"] },
|
{ name = "psycopg", extra = ["binary"] },
|
||||||
{ name = "pydantic", extra = ["email"] },
|
{ name = "pydantic", extra = ["email"] },
|
||||||
{ name = "python-dotenv" },
|
{ name = "python-dotenv" },
|
||||||
|
{ name = "redis" },
|
||||||
{ name = "uvicorn" },
|
{ name = "uvicorn" },
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -304,9 +328,11 @@ requires-dist = [
|
|||||||
{ name = "django-cors-headers", specifier = ">=4.7.0" },
|
{ name = "django-cors-headers", specifier = ">=4.7.0" },
|
||||||
{ name = "django-extensions", specifier = ">=3.2.3" },
|
{ name = "django-extensions", specifier = ">=3.2.3" },
|
||||||
{ name = "django-ninja", specifier = ">=1.3.0" },
|
{ name = "django-ninja", specifier = ">=1.3.0" },
|
||||||
|
{ name = "django-redis", specifier = ">=5.4.0" },
|
||||||
{ name = "gunicorn", specifier = ">=23.0.0" },
|
{ name = "gunicorn", specifier = ">=23.0.0" },
|
||||||
{ name = "psycopg", extras = ["binary"], specifier = ">=3.2.5" },
|
{ name = "psycopg", extras = ["binary"], specifier = ">=3.2.5" },
|
||||||
{ name = "pydantic", extras = ["email"], specifier = ">=2.10.6" },
|
{ name = "pydantic", extras = ["email"], specifier = ">=2.10.6" },
|
||||||
{ name = "python-dotenv", specifier = ">=1.0.1" },
|
{ name = "python-dotenv", specifier = ">=1.0.1" },
|
||||||
|
{ name = "redis", specifier = ">=5.0.1" },
|
||||||
{ name = "uvicorn", specifier = ">=0.34.0" },
|
{ name = "uvicorn", specifier = ">=0.34.0" },
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user