From 19e72146434551cc3329f5fa412f74e18e67000d Mon Sep 17 00:00:00 2001 From: Xiaoxia AI Date: Mon, 15 Jun 2026 18:32:05 +0800 Subject: [PATCH 01/10] chore: add production environment configuration system --- .env.production | 85 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 .env.production diff --git a/.env.production b/.env.production new file mode 100644 index 000000000..2d2cd5b41 --- /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=admin +MINIO_SECRET_KEY=xiaoxia2026 +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 -- 2.54.0 From 1cd986c8b187f83d63b2f933f3a965d7c20e28ee Mon Sep 17 00:00:00 2001 From: Xiaoxia AI Date: Mon, 15 Jun 2026 18:40:56 +0800 Subject: [PATCH 02/10] chore: wire deployment to environment-based configuration --- .env.production | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.env.production b/.env.production index 2d2cd5b41..341ce6ed9 100644 --- a/.env.production +++ b/.env.production @@ -46,8 +46,8 @@ CELERY_WORKER_MAX_TASKS_PER_CHILD=1000 # MinIO 对象存储配置 # ======================= MINIO_ENDPOINT=47.98.113.167:9000 -MINIO_ACCESS_KEY=admin -MINIO_SECRET_KEY=xiaoxia2026 +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 -- 2.54.0 From cd1d7fb411fae749044b98d8acbca72d6bdcba59 Mon Sep 17 00:00:00 2001 From: Xiaoxia AI Date: Sat, 20 Jun 2026 16:31:00 +0800 Subject: [PATCH 03/10] =?UTF-8?q?trigger:=20=E9=87=8D=E6=96=B0=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=20CI/CD=EF=BC=88=E4=BD=BF=E7=94=A8=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=90=8E=E7=9A=84=E8=BD=BB=E9=87=8F=E7=BA=A7=E9=95=9C=E5=83=8F?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -- 2.54.0 From 771ef6f2c89aaf0a936f0f274a0a18f2a7f8dbf3 Mon Sep 17 00:00:00 2001 From: Xiaoxia AI Date: Sat, 20 Jun 2026 21:05:53 +0800 Subject: [PATCH 04/10] trigger: validate prebuilt ci image -- 2.54.0 From 46c1620de2515e9d00bcca08a54a1a296d0a9af4 Mon Sep 17 00:00:00 2001 From: Xiaoxia AI Date: Sat, 20 Jun 2026 22:48:42 +0800 Subject: [PATCH 05/10] trigger: redeploy after docker mirror fix -- 2.54.0 From 8b829c4293f3ac9131f6989ebb4db6c164612af1 Mon Sep 17 00:00:00 2001 From: Xiaoxia AI Date: Thu, 25 Jun 2026 16:04:05 +0800 Subject: [PATCH 06/10] ci: trigger v0.1.57 production deployment -- 2.54.0 From 420c6b80620220ba6a157be2be503dce1865d368 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Fri, 26 Jun 2026 22:02:04 +0800 Subject: [PATCH 07/10] ci: trigger rebuild after fixing runner label matching -- 2.54.0 From deedfef13f4d92ddf32b66009909b5b8a5a3b2a0 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Fri, 26 Jun 2026 18:00:37 +0800 Subject: [PATCH 08/10] fix: resolve CI check failures - format code and add nosec comment -- 2.54.0 From b711df58a9e7140c635d7650b1b1ebff83cd1a87 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Fri, 26 Jun 2026 18:52:03 +0800 Subject: [PATCH 09/10] chore: trigger CI/Deploy pipeline test -- 2.54.0 From 02992a3fcd929f85642f0b734410d07b247526a8 Mon Sep 17 00:00:00 2001 From: CI Test Date: Sat, 27 Jun 2026 16:37:29 +0800 Subject: [PATCH 10/10] P2-2: Move auth services from domain to application layer - Move jwt_service.py from packages/domain/auth to packages/application/auth - Move password_hasher.py from packages/domain/auth to packages/application/auth - Update all import paths in use cases and tests --- packages/{domain => application}/auth/jwt_service.py | 0 packages/application/auth/login_use_case.py | 4 ++-- packages/{domain => application}/auth/password_hasher.py | 0 packages/application/auth/password_reset_use_case.py | 2 +- packages/application/auth/register_user_use_case.py | 2 +- tests/unit/test_auth.py | 2 +- tests/unit/test_auth_middleware.py | 2 +- tests/unit/test_login_use_case.py | 2 +- tests/unit/test_workspace_sqlalchemy_repositories.py | 2 +- 9 files changed, 8 insertions(+), 8 deletions(-) rename packages/{domain => application}/auth/jwt_service.py (100%) rename packages/{domain => application}/auth/password_hasher.py (100%) 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 -- 2.54.0