diff --git a/.env.production b/.env.production new file mode 100644 index 000000000..341ce6ed9 --- /dev/null +++ b/.env.production @@ -0,0 +1,85 @@ +# ======================= +# 生产环境配置 +# ======================= +APP_ENV=production +APP_NAME=xiaoxia-saas +APP_VERSION=0.1.0 +DEBUG=false + +# ======================= +# API 服务配置 +# ======================= +API_HOST=0.0.0.0 +API_PORT=8000 +API_PREFIX=/api/v1 + +# ======================= +# Web 前端配置 +# ======================= +WEB_PORT=3000 +WEB_URL=https://xiaoxiajianji.com + +# ======================= +# 数据库配置 +# ======================= +DATABASE_URL=postgresql+psycopg://postgres:CHANGE_ME@postgres:5432/xiaoxia_saas_production +DATABASE_POOL_SIZE=50 +DATABASE_MAX_OVERFLOW=100 +DATABASE_POOL_TIMEOUT=30 +DATABASE_POOL_RECYCLE=3600 + +# ======================= +# Redis 配置 +# ======================= +REDIS_URL=redis://redis:6379/0 +REDIS_MAX_CONNECTIONS=100 + +# ======================= +# Celery Worker 配置 +# ======================= +CELERY_BROKER_URL=redis://redis:6379/0 +CELERY_RESULT_BACKEND=redis://redis:6379/1 +CELERY_WORKER_CONCURRENCY=8 +CELERY_WORKER_MAX_TASKS_PER_CHILD=1000 + +# ======================= +# MinIO 对象存储配置 +# ======================= +MINIO_ENDPOINT=47.98.113.167:9000 +MINIO_ACCESS_KEY=CHANGE_ME_PRODUCTION +MINIO_SECRET_KEY=CHANGE_ME_PRODUCTION +MINIO_BUCKET=xiaoxia-assets +MINIO_SECURE=false +MINIO_PUBLIC_URL=http://47.98.113.167:9000 + +# ======================= +# 日志配置 +# ======================= +LOG_LEVEL=INFO +LOG_FORMAT=json +LOG_FILE=/var/log/xiaoxia-saas/app.log + +# ======================= +# CORS 配置 +# ======================= +CORS_ORIGINS=https://xiaoxiajianji.com,https://api.xiaoxiajianji.com +CORS_ALLOW_CREDENTIALS=true + +# ======================= +# 文件上传限制 +# ======================= +MAX_UPLOAD_SIZE_MB=2000 +ALLOWED_FILE_TYPES=video/mp4,video/quicktime,video/x-msvideo,audio/mpeg,audio/wav,image/jpeg,image/png,image/gif + +# ======================= +# 安全配置 +# ======================= +SECRET_KEY=CHANGE_ME_TO_RANDOM_STRING_AT_LEAST_32_CHARS_IN_PRODUCTION +ACCESS_TOKEN_EXPIRE_MINUTES=60 +REFRESH_TOKEN_EXPIRE_DAYS=7 + +# ======================= +# 监控与追踪(可选) +# ======================= +# SENTRY_DSN= +# PROMETHEUS_PORT=9090 diff --git a/packages/domain/auth/jwt_service.py b/packages/application/auth/jwt_service.py similarity index 100% rename from packages/domain/auth/jwt_service.py rename to packages/application/auth/jwt_service.py diff --git a/packages/application/auth/login_use_case.py b/packages/application/auth/login_use_case.py index 2cf852ad1..a56f6641f 100755 --- a/packages/application/auth/login_use_case.py +++ b/packages/application/auth/login_use_case.py @@ -11,7 +11,7 @@ import jwt as pyjwt from packages.adapters.redis import get_session_store from packages.adapters.redis.session_store import SessionStore -from packages.domain.auth import jwt_service, password_hasher +from packages.application.auth import jwt_service, password_hasher LEGACY_SHA256_HEX_LENGTH = 64 @@ -170,7 +170,7 @@ class RefreshTokenUseCase: self.user_repository = user_repository self.session_store = session_store or get_session_store() # Import jwt_service for token creation - from packages.domain.auth import jwt_service as jwt_svc_module + from packages.application.auth import jwt_service as jwt_svc_module self.jwt_service = jwt_svc_module self._jwt_secret_key = jwt_svc_module.config.SECRET_KEY diff --git a/packages/domain/auth/password_hasher.py b/packages/application/auth/password_hasher.py similarity index 100% rename from packages/domain/auth/password_hasher.py rename to packages/application/auth/password_hasher.py diff --git a/packages/application/auth/password_reset_use_case.py b/packages/application/auth/password_reset_use_case.py index 08efaeb0a..f0dae6d99 100755 --- a/packages/application/auth/password_reset_use_case.py +++ b/packages/application/auth/password_reset_use_case.py @@ -7,7 +7,7 @@ from datetime import datetime, timedelta, timezone from typing import Optional from packages.adapters.smtp import get_email_service -from packages.domain.auth import password_hasher, password_validator +from packages.application.auth import password_hasher, password_validator class RequestPasswordResetRequest: diff --git a/packages/application/auth/register_user_use_case.py b/packages/application/auth/register_user_use_case.py index ea3f44214..7f17ff2b4 100755 --- a/packages/application/auth/register_user_use_case.py +++ b/packages/application/auth/register_user_use_case.py @@ -8,7 +8,7 @@ from typing import Optional from uuid import uuid4 from packages.adapters.smtp import get_email_service -from packages.domain.auth import password_hasher, password_validator +from packages.application.auth import password_hasher, password_validator from packages.domain.entities import User diff --git a/tests/unit/test_auth.py b/tests/unit/test_auth.py index fbd8358c5..142918582 100644 --- a/tests/unit/test_auth.py +++ b/tests/unit/test_auth.py @@ -28,7 +28,7 @@ from app.config import settings from packages.adapters.smtp import NoopEmailService from packages.application.auth.login_use_case import LoginRequest, LoginUseCase from packages.application.auth.register_user_use_case import RegisterUserRequest, RegisterUserUseCase -from packages.domain.auth import password_hasher +from packages.application.auth import password_hasher from packages.domain.entities import User diff --git a/tests/unit/test_auth_middleware.py b/tests/unit/test_auth_middleware.py index 0e906080e..bf1046bd4 100644 --- a/tests/unit/test_auth_middleware.py +++ b/tests/unit/test_auth_middleware.py @@ -15,7 +15,7 @@ if str(API_ROOT) not in sys.path: from app.config import settings from app.middleware.auth import get_current_user, get_current_user_optional, require_workspace_access -from packages.domain.auth import password_hasher +from packages.application.auth import password_hasher from packages.domain.entities import User diff --git a/tests/unit/test_login_use_case.py b/tests/unit/test_login_use_case.py index 6cd0cc923..4ef8e0401 100644 --- a/tests/unit/test_login_use_case.py +++ b/tests/unit/test_login_use_case.py @@ -13,7 +13,7 @@ from packages.application.auth import ( LogoutRequest, LogoutUseCase, ) -from packages.domain.auth import password_hasher +from packages.application.auth import password_hasher from packages.domain.entities import User diff --git a/tests/unit/test_workspace_sqlalchemy_repositories.py b/tests/unit/test_workspace_sqlalchemy_repositories.py index e9500198b..d611c2ee6 100644 --- a/tests/unit/test_workspace_sqlalchemy_repositories.py +++ b/tests/unit/test_workspace_sqlalchemy_repositories.py @@ -10,7 +10,7 @@ from packages.application.workspace.create_workspace_use_case import CreateWorks from packages.application.workspace.invite_member_use_case import InviteMemberRequest, InviteMemberUseCase from packages.application.workspace.list_members_use_case import ListMembersRequest, ListMembersUseCase from packages.application.workspace.list_workspaces_use_case import ListWorkspacesRequest, ListWorkspacesUseCase -from packages.domain.auth import password_hasher +from packages.application.auth import password_hasher from packages.domain.entities import User