Explorar o código

feat: add environment configuration files and update env file paths in modules

Dave hai 1 mes
pai
achega
bc62edde34

+ 92 - 0
.env

@@ -0,0 +1,92 @@
+# 测试服环境变量
+APP_ENV=test
+
+# Prisma Config
+# MYSQL_URL="mysql://boxdbuser:dwR%3D%29whu2Ze@localhost:3306/box_admin"
+# MONGO_URL="mongodb://boxuser:dwR%3D%29whu2Ze@localhost:27017/box_admin?authSource=admin"
+# MONGO_STATS_URL="mongodb://boxuser:dwR%3D%29whu2Ze@localhost:27017/box_stats?authSource=admin"
+
+# dave local
+# MYSQL_URL="mysql://root:123456@localhost:3306/box_admin"
+# MONGO_URL="mongodb://admin:ZXcv%21%21996@localhost:27017/box_admin?authSource=admin"
+# MONGO_STATS_URL="mongodb://admin:ZXcv%21%21996@localhost:27017/box_stats?authSource=admin"
+
+# MYSQL_URL="mysql://root:rootpass@127.0.0.1:3306/box_admin"
+MONGO_URL="mongodb://boxadmin:boxpass@127.0.0.1:27017/box_admin?authSource=admin"
+MONGO_STATS_URL="mongodb://boxadmin:boxpass@127.0.0.1:27017/box_stats?authSource=admin"
+
+# office dev env
+# MYSQL_URL="mysql://root:123456@192.168.0.100:3306/box_admin"
+# MONGO_URL="mongodb://msAdmin:Fl1%2A29MJe%26jLvj@192.168.0.100:27017/box_admin?authSource=admin"
+# MONGO_STATS_URL="mongodb://msAdmin:Fl1%2A29MJe%26jLvj@192.168.0.100:27017/box_stats?authSource=admin"
+
+# Redis Config
+REDIS_HOST=127.0.0.1
+REDIS_PORT=6379
+REDIS_PASSWORD=
+REDIS_DB=0
+REDIS_KEY_PREFIX=
+
+# RabbitMQ Config: RABBITMQ_URL="amqp://boxrabbit:BoxRabbit2025@localhost:5672"
+# RabbitMQ Config
+RABBITMQ_URL="amqp://boxrabbit:BoxRabbit2025@127.0.0.1:5672"
+RABBITMQ_LOGIN_EXCHANGE="stats.user"
+RABBITMQ_LOGIN_QUEUE="stats.user.login.q"
+RABBITMQ_LOGIN_ROUTING_KEY="user.login"
+RABBITMQ_ADS_CLICK_ROUTING_KEY="stats.ad.click"
+# Stats Events Queues & Routing Keys
+RABBITMQ_STATS_EXCHANGE="stats.user"
+RABBITMQ_STATS_AD_CLICK_QUEUE="stats.ad.click"
+RABBITMQ_STATS_AD_CLICK_ROUTING_KEY="stats.ad.click"
+RABBITMQ_STATS_VIDEO_CLICK_QUEUE="stats.video.click"
+RABBITMQ_STATS_VIDEO_CLICK_ROUTING_KEY="stats.video.click"
+RABBITMQ_STATS_AD_IMPRESSION_QUEUE="stats.ad.impression"
+RABBITMQ_STATS_AD_IMPRESSION_ROUTING_KEY="stats.ad.impression"
+
+
+# App set to 0.0.0.0 for local LAN access
+APP_HOST=0.0.0.0
+APP_PORT=3300
+APP_CORS_ORIGIN=*
+
+# 2FA config
+# node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
+TWOFA_ENC_KEY=2q89JPacSKDmuU3hJCfKQhDg3sq74QScy0ShYBoQPgM=
+APP_ISSUER=BOX-MGNT
+
+
+# JWT
+JWT_SECRET=047df8aaa3d17dc1173c5a9a3052ba66c2b0bd96937147eb643319a0c90d132f
+JWT_ACCESS_TOKEN_TTL=43200
+
+
+# LOCAL IMAGE STORAGE 配置
+# NOTE: Images are encrypted - frontend needs to access via appropriate endpoint
+# For now, using localhost. Update to actual server IP/domain for remote access
+IMAGE_BASE_URL=http://0.0.0.0:3300/images
+IMAGE_ROOT_PATH=/media/dave/DAVEWORKS/works/fctech.my/box-project/box-repo/data/box-images
+IMAGE_ADS_SUBFOLDER=ads-cover
+BOX_IMAGE_LOCAL_ROOT=/media/dave/DAVEWORKS/works/fctech.my/box-project/box-repo/data/box-images
+
+# S3 IMAGE STORAGE 配置
+BOX_IMAGE_S3_ENABLED=false
+AWS_ACCESS_KEY_ID=AKIA6GSNGR5PISMIKCJ4
+AWS_SECRET_ACCESS_KEY=o236gEpw8NkqIaTHmu7d2N2d9NIMqLLu6Mktfyyd
+
+# Bucket name
+AWS_STORAGE_BUCKET_NAME=mybucket-imgs
+
+# The region of your bucket, more info:
+# http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
+AWS_S3_REGION_NAME=ap-east-1
+
+# The endpoint of your bucket, more info:
+# http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
+AWS_S3_ENDPOINT_URL=https://s3.ap-east-1.amazonaws.com
+
+# 上传限制
+UPLOAD_LIMIT_IMAGE=20
+UPLOAD_LIMIT_VIDEO=100
+UPLOAD_LIMIT_PDF=10
+UPLOAD_LIMIT_DEFAULT=10
+

+ 1 - 1
.env.mgnt.test

@@ -2,7 +2,7 @@
 APP_ENV=test
 
 # Prisma Config
-MYSQL_URL="mysql://boxdbuser:dwR=)whu2Ze@localhost:3306/box_admin"
+# MYSQL_URL="mysql://boxdbuser:dwR=)whu2Ze@localhost:3306/box_admin"
 MONGO_URL="mongodb://admin:ZOiIskNE52rxFt5d@localhost:27117/box_admin?authSource=admin"
 MONGO_STATS_URL="mongodb://admin:ZOiIskNE52rxFt5d@localhost:27117/box_stats?authSource=admin"
 

+ 103 - 0
.env.test

@@ -0,0 +1,103 @@
+# 测试服环境变量
+APP_ENV=test
+
+# Prisma Config
+# MYSQL_URL="mysql://boxdbuser:dwR=)whu2Ze@localhost:3306/box_admin"
+MONGO_URL="mongodb://admin:ZOiIskNE52rxFt5d@localhost:27117/box_admin?authSource=admin"
+MONGO_STATS_URL="mongodb://admin:ZOiIskNE52rxFt5d@localhost:27117/box_stats?authSource=admin"
+
+# Redis Config
+REDIS_HOST=127.0.0.1
+REDIS_PORT=6379
+REDIS_PASSWORD=
+REDIS_DB=0
+REDIS_KEY_PREFIX=
+
+# RabbitMQ Config: RABBITMQ_URL="amqp://boxrabbit:BoxRabbit#2025@localhost:5672"
+# RabbitMQ Config
+RABBITMQ_URL="amqp://boxrabbit:BoxRabbit%232025@localhost:5672"
+RABBITMQ_LOGIN_EXCHANGE="stats.user"
+RABBITMQ_LOGIN_QUEUE="stats.user.login.q"
+RABBITMQ_LOGIN_ROUTING_KEY="user.login"
+RABBITMQ_ADS_CLICK_ROUTING_KEY="stats.ad.click"
+# Stats Events Queues & Routing Keys
+RABBITMQ_STATS_EXCHANGE="stats.user"
+RABBITMQ_STATS_AD_CLICK_QUEUE="stats.ad.click"
+RABBITMQ_STATS_AD_CLICK_ROUTING_KEY="stats.ad.click"
+RABBITMQ_STATS_VIDEO_CLICK_QUEUE="stats.video.click"
+RABBITMQ_STATS_VIDEO_CLICK_ROUTING_KEY="stats.video.click"
+RABBITMQ_STATS_AD_IMPRESSION_QUEUE="stats.ad.impression"
+RABBITMQ_STATS_AD_IMPRESSION_ROUTING_KEY="stats.ad.impression"
+
+
+# App set to 0.0.0.0 for local LAN access
+APP_HOST=0.0.0.0
+APP_PORT=3300
+APP_CORS_ORIGIN=*
+
+# 2FA config
+# node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
+TWOFA_ENC_KEY=2q89JPacSKDmuU3hJCfKQhDg3sq74QScy0ShYBoQPgM=
+APP_ISSUER=BOX-MGNT
+
+
+# JWT
+JWT_SECRET=047df8aaa3d17dc1173c5a9a3052ba66c2b0bd96937147eb643319a0c90d132f
+JWT_ACCESS_TOKEN_TTL=43200
+
+# JAVA 管理 API
+MGNT_API_URL=http://47.76.151.238:83
+MGNT_API_TOKEN=
+
+# IM Chat API
+IMCHAT_API_URL=http://47.76.151.238:88
+IMCHAT_API_TOKEN=
+
+# 游戏服配置
+GAME_SERVER_ADMIN_API_URL=http://119.28.182.132:83
+GAME_SERVER_TOKEN=
+
+# 第三方批量创建用户密钥
+B_BASE_URL=https://wwapi.hxc1t.com
+B_SIGN_SECRET=Z3VhbmNpbmV3ZWl4aWFvMTIzNDU2
+PARTNER_MD5_KEY=160360904be3dd23bf4f1278a74196efdbf3f9b834ce883ef6ae09eb05c5c652
+PARTNER_ITEMS_LIMIT=100
+B_BASE_ORDER_ADD=/open/open/order/add
+B_BASE_ORDER_UPDATE_STATUS=/open/open/order/updateStatus
+B_BASE_CHAT_ADD=/open/order/chat/send
+
+# Oss 配置
+OSS_ACCESS_KEY_ID=AKIA6GSNGR5PHKXR6O6H
+OSS_ACCESS_KEY_SECRET=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
+OSS_BUCKET=ww-buckets
+OSS_REGION=ap-east-1
+
+# LOCAL IMAGE STORAGE 配置
+IMAGE_BASE_URL=https://app.boxt3yk.com/images
+IMAGE_ROOT_PATH=/usr/local/apps/box-project/box-images
+IMAGE_ADS_SUBFOLDER=ads-cover
+BOX_IMAGE_LOCAL_ROOT=/usr/local/apps/box-project/box-images
+
+# S3 IMAGE STORAGE 配置
+BOX_IMAGE_S3_ENABLED=false
+AWS_ACCESS_KEY_ID=AKIA6GSNGR5PISMIKCJ4
+AWS_SECRET_ACCESS_KEY=o236gEpw8NkqIaTHmu7d2N2d9NIMqLLu6Mktfyyd
+
+# Bucket name
+AWS_STORAGE_BUCKET_NAME=mybucket-imgs
+
+# The region of your bucket, more info:
+# http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
+AWS_S3_REGION_NAME=ap-east-1
+
+# The endpoint of your bucket, more info:
+# http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
+AWS_S3_ENDPOINT_URL=https://s3.ap-east-1.amazonaws.com
+
+# 上传限制
+UPLOAD_LIMIT_IMAGE=20
+UPLOAD_LIMIT_VIDEO=100
+UPLOAD_LIMIT_PDF=10
+UPLOAD_LIMIT_DEFAULT=10
+
+

+ 1 - 1
apps/box-app-api/src/app.module.ts

@@ -22,7 +22,7 @@ import { RecommendationModule } from './feature/recommendation/recommendation.mo
     // Global config, reuse .env + .env.app.dev at repo root
     ConfigModule.forRoot({
       isGlobal: true,
-      envFilePath: ['.env.app', '.env'],
+      envFilePath: ['.env'],
       expandVariables: true,
     }),
 

+ 1 - 2
apps/box-app-api/src/feature/auth/auth.controller.ts

@@ -18,8 +18,7 @@ export class AuthController {
   @Post('login')
   @ApiOperation({
     summary: '用户登录/落地注册',
-    description:
-      '无 JWT 模式:首次登录会自动注册并绑定渠道(优先使用传入 channelId,否则使用默认渠道 isDefault=true)。后续登录仅依赖 uid(channelId 可忽略)。',
+    description: '首次登录会自动注册并绑定渠道',
   })
   @ApiOkResponse({
     description:

+ 5 - 5
apps/box-app-api/src/feature/auth/login.dto.ts

@@ -1,5 +1,5 @@
 import { IsNotEmpty, IsString, IsOptional } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
+import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
 
 export class LoginDto {
   @ApiProperty({
@@ -10,7 +10,7 @@ export class LoginDto {
   @IsString()
   uid: string;
 
-  @ApiProperty({
+  @ApiPropertyOptional({
     description: '渠道ID(仅首次登录可能提供)',
     example: 'channel-123',
     required: false,
@@ -19,7 +19,7 @@ export class LoginDto {
   @IsString()
   channelId?: string;
 
-  @ApiProperty({
+  @ApiPropertyOptional({
     description: '机器型号(可能缺失)',
     example: 'iPhone 12 Pro xxxx',
     required: false,
@@ -28,7 +28,7 @@ export class LoginDto {
   @IsString()
   machine?: string;
 
-  @ApiProperty({
+  @ApiPropertyOptional({
     description: '应用版本号',
     example: '1.0.0',
     required: false,
@@ -37,7 +37,7 @@ export class LoginDto {
   @IsString()
   appVersion?: string;
 
-  @ApiProperty({
+  @ApiPropertyOptional({
     description: '操作系统类型',
     example: 'Android',
     required: false,

+ 1 - 1
apps/box-mgnt-api/src/app.module.ts

@@ -29,7 +29,7 @@ const isProd = process.env.NODE_ENV === 'production';
     // Global config, load from .env.mgnt then .env with validation
     ConfigModule.forRoot({
       isGlobal: true,
-      envFilePath: ['.env.mgnt', '.env'],
+      envFilePath: ['.env'],
       validate: validateEnvironment,
     }),
     ConfigModule.forFeature(appConfigFactory),

+ 1 - 1
apps/box-stats-api/src/app.module.ts

@@ -11,7 +11,7 @@ import { StatsEventsModule } from './feature/stats-events/stats-events.module';
   imports: [
     ConfigModule.forRoot({
       isGlobal: true,
-      envFilePath: ['.env.stats', '.env'], // adjust as needed
+      envFilePath: ['.env'], // adjust as needed
     }),
     ScheduleModule.forRoot(),