添加本地部署

This commit is contained in:
zhx 2026-05-09 10:40:17 +08:00
parent 8344badaa7
commit c1b7795f65
20 changed files with 2597 additions and 1 deletions

86
.env Normal file
View File

@ -0,0 +1,86 @@
APP_BIND=0.0.0.0
APP_PORT=2026
DEFAULT_REFRESH_INTERVAL_SECONDS=10
REFRESH_INTERVAL_OPTIONS=5,10,15,30,60
PROBE_TIMEOUT_SECONDS=3
PROBE_CACHE_TTL_SECONDS=5
PROBE_MAX_WORKERS=12
HOST_METRIC_CACHE_TTL_SECONDS=25
TAT_METRIC_TIMEOUT_SECONDS=30
TAT_CPU_SAMPLE_SECONDS=1
NACOS_BASE_URL=http://10.2.1.17:8848
NACOS_NAMESPACE_ID=f7a8594e-090c-4830-a3ad-b5c0f9afcc07
NACOS_NAMESPACE_NAME=RedCircleServiceProd
NACOS_DISCOVERY_GROUP=prod
NACOS_DISCOVERY_CLUSTER_NAME=DEFAULT
NACOS_CACHE_TTL_SECONDS=15
MONGO_URI=mongodb://root:123456@10.2.21.9:27017/tarab_all?authSource=admin&readPreference=secondaryPreferred&retryWrites=false&maxPoolSize=50&minPoolSize=5&maxIdleTimeMS=6000
MONGO_DB_NAME=tarab_all
MONGO_INSTANCE_ID=ins-o9mmob66
MONGO_CACHE_TTL_SECONDS=20
CPU_WARN_PERCENT=60
CPU_BAD_PERCENT=85
MEMORY_WARN_PERCENT=70
MEMORY_BAD_PERCENT=90
DISK_WARN_PERCENT=75
DISK_BAD_PERCENT=90
PROCESS_WARN_COUNT=180
PROCESS_BAD_COUNT=260
SERVICE_LATENCY_WARN_MS=1000
SERVICE_LATENCY_BAD_MS=3000
DEPLOY_REGION=me-saudi-arabia
TENCENT_SECRET_ID=IKIDMchhZEfrsiNo472DAtTpzzmLjttkOnyu
TENCENT_SECRET_KEY=nMkbLsGRO6ZqulSyJQJ0UjjU0KSKxOgl
GATEWAY_CLB_LOAD_BALANCER_ID=lb-cbiabr1q
GATEWAY_CLB_LISTENER_IDS=lbl-ktvz8m6k
GATEWAY_CLB_ALLOWED_DOMAINS=jvapi.haiyihy.com
GATEWAY_CLB_POLL_SECONDS=2
GATEWAY_CLB_TASK_TIMEOUT_SECONDS=120
GATEWAY_CLB_DRAIN_SECONDS=0
CDN_ALLOWED_DOMAINS=h5.haiyihy.com
CDN_PURGE_TASK_LIMIT=20
# Admin frontend deployment for Yumi
UPDATE_DEFAULT_ADMIN_GIT_REF=main
ADMIN_FRONTEND_ENABLED=1
ADMIN_FRONTEND_SERVICE_NAME=admin
ADMIN_FRONTEND_REPO_URL=git@gitea.haiyihy.com:hy/chatapp3-admin.git
ADMIN_FRONTEND_REPO_ROOT=/opt/deploy/sources/chatapp3-admin
ADMIN_FRONTEND_HOST=admin-platform
ADMIN_FRONTEND_IP=10.2.1.2
ADMIN_FRONTEND_INSTANCE_ID=ins-p11begwe
ADMIN_FRONTEND_SSH_HOST=10.2.1.2
ADMIN_FRONTEND_SSH_USER=root
ADMIN_FRONTEND_SSH_PORT=22
ADMIN_FRONTEND_SSH_USE_SUDO=0
ADMIN_FRONTEND_REMOTE_DIR=/opt/yumi-admin/frontend-admin
ADMIN_FRONTEND_SITE_DIR=/opt/yumi-admin/frontend-admin/site
ADMIN_FRONTEND_COMPOSE_FILE=/opt/yumi-admin/frontend-admin/docker-compose.yml
ADMIN_FRONTEND_COMPOSE_SERVICE=caddy
ADMIN_FRONTEND_RELEASE_META_PATH=/opt/yumi-admin/frontend-admin/.hy-app-monitor-admin-release.json
ADMIN_FRONTEND_BUILD_SCRIPT=build:antdv-next
ADMIN_FRONTEND_DIST_DIR=apps/dist
ADMIN_FRONTEND_PUBLIC_URL=https://yumi-admin.haiyihy.com
CHATAPP_CRON_ENABLED=1
CHATAPP_CRON_REPO_URL=git@gitea.haiyihy.com:hy/chatapp-cron.git
CHATAPP_CRON_REPO_ROOT=/opt/deploy/sources/chatapp-cron
CHATAPP_CRON_DEFAULT_GIT_REF=main
CHATAPP_CRON_SERVICE_NAME=chatapp-cron
CHATAPP_CRON_HOST=cron
CHATAPP_CRON_IP=10.3.1.14
CHATAPP_CRON_INSTANCE_ID=ins-nt6bsay0
CHATAPP_CRON_SSH_HOST=10.3.1.14
CHATAPP_CRON_SSH_USER=root
CHATAPP_CRON_SSH_PORT=22
CHATAPP_CRON_SSH_USE_SUDO=0
CHATAPP_CRON_REMOTE_DIR=/opt/deploy/runtime/current
CHATAPP_CRON_COMPOSE_FILE=/opt/deploy/runtime/current/docker-compose.yml
CHATAPP_CRON_COMPOSE_SERVICE=week-star-job
CHATAPP_CRON_BINARY_PATH=/opt/deploy/runtime/current/week-star-job/service
CHATAPP_CRON_RELEASE_META_PATH=/opt/deploy/runtime/current/.hy-app-monitor-chatapp-cron-release.json
# Harbor credentials for hy-app-monitor service update
HARBOR_REGISTRY=10.2.1.3:18082
HARBOR_PROJECT=likei
HARBOR_USERNAME=admin
HARBOR_PASSWORD=QkVXKcxCff_3x-pEkDCR_aAB

1
.gitignore vendored
View File

@ -2,5 +2,4 @@ run/
__pycache__/ __pycache__/
*.pyc *.pyc
.DS_Store .DS_Store
.env
.venv/ .venv/

399
localbox/.env.local Normal file
View File

@ -0,0 +1,399 @@
#
# Baishun source profiles.
# Keep the current compatibility vars below unchanged until the switch script lands.
#
BAISHUN_ACTIVE_PROFILE=prod
# Golang / new baishun integration
BAISHUN_GOLANG_TEST_PLATFORM_BASE_URL=https://game-cn-test.jieyou.shop
BAISHUN_GOLANG_TEST_APP_ID=4581045902
BAISHUN_GOLANG_TEST_APP_NAME=yumiparty_app
BAISHUN_GOLANG_TEST_APP_CHANNEL=yumiparty
BAISHUN_GOLANG_TEST_APP_KEY=jHpYp5sNMvHHfn3dhaPQhkCTL8SYMXVy
BAISHUN_GOLANG_TEST_GSP=101
BAISHUN_GOLANG_TEST_LAUNCH_CODE_TTL_SECONDS=300
BAISHUN_GOLANG_TEST_SS_TOKEN_TTL_SECONDS=86400
BAISHUN_GOLANG_PROD_PLATFORM_BASE_URL=https://mesh-channels-online.jieyou.shop
BAISHUN_GOLANG_PROD_APP_ID=7485318192
BAISHUN_GOLANG_PROD_APP_NAME=yumiparty_app
BAISHUN_GOLANG_PROD_APP_CHANNEL=yumiparty
BAISHUN_GOLANG_PROD_APP_KEY=i1PUKj0aJjdWF3qRbBeoGBEgfFsHpUGS
BAISHUN_GOLANG_PROD_GSP=111
BAISHUN_GOLANG_PROD_LAUNCH_CODE_TTL_SECONDS=300
BAISHUN_GOLANG_PROD_SS_TOKEN_TTL_SECONDS=86400
# Java other / lucky gift baishun integration
BAISHUN_JAVA_TEST_APP_ID=1704692112
BAISHUN_JAVA_TEST_APP_CHANNEL=lotfun
BAISHUN_JAVA_TEST_APP_KEY=6EllbAruJDfw
BAISHUN_JAVA_TEST_LUCKY_GIFT_API_CONFIG_1_STANDARD_ID=18816
BAISHUN_JAVA_TEST_LUCKY_GIFT_API_CONFIG_1_URL=https://game-cn-test.jieyou.shop/lucky_gift/start_game
BAISHUN_JAVA_TEST_LUCKY_GIFT_API_CONFIG_2_STANDARD_ID=18816
BAISHUN_JAVA_TEST_LUCKY_GIFT_API_CONFIG_2_URL=https://game-cn-test.jieyou.shop/lucky_gift/start_game
BAISHUN_JAVA_TEST_LUCKY_GIFT_API_DEFAULT_URL=https://game-cn-test.jieyou.shop/lucky_gift/start_game
BAISHUN_JAVA_PROD_APP_ID=7485318192
BAISHUN_JAVA_PROD_APP_CHANNEL=yumiparty
BAISHUN_JAVA_PROD_APP_KEY=i1PUKj0aJjdWF3qRbBeoGBEgfFsHpUGS
BAISHUN_JAVA_PROD_LUCKY_GIFT_API_CONFIG_1_STANDARD_ID=18816
BAISHUN_JAVA_PROD_LUCKY_GIFT_API_CONFIG_1_URL=https://mesh-channels-online.jieyou.shop/lucky_gift/start_game
BAISHUN_JAVA_PROD_LUCKY_GIFT_API_CONFIG_2_STANDARD_ID=18816
BAISHUN_JAVA_PROD_LUCKY_GIFT_API_CONFIG_2_URL=https://mesh-channels-online.jieyou.shop/lucky_gift/start_game
BAISHUN_JAVA_PROD_LUCKY_GIFT_API_DEFAULT_URL=https://mesh-channels-online.jieyou.shop/lucky_gift/start_game
# Current active compatibility values
BAISHUN_APP_CHANNEL=yumiparty
BAISHUN_APP_ID=7485318192
BAISHUN_APP_KEY=i1PUKj0aJjdWF3qRbBeoGBEgfFsHpUGS
BAISHUN_APP_NAME=yumiparty_app
BAISHUN_PLATFORM_BASE_URL=https://mesh-channels-online.jieyou.shop
BAISHUN_GSP=111
BAISHUN_LAUNCH_CODE_TTL_SECONDS=300
BAISHUN_SS_TOKEN_TTL_SECONDS=86400
CHATAPP_AUTO_MIGRATE=false
CHATAPP_HTTP_SHUTDOWN_TIMEOUT_SECONDS=30
CHATAPP_HTTP_TIMEOUT_SECONDS=8
CHATAPP_JAVA_AUTH_BASE_URL=http://auth:1000
CHATAPP_JAVA_CONSOLE_BASE_URL=http://console:2700/console
CHATAPP_JAVA_APP_BASE_URL=http://other:2400
CHATAPP_JAVA_DEVICE_BASE_URL=http://other:2400
CHATAPP_JAVA_EXTERNAL_BASE_URL=http://external:3000
CHATAPP_JAVA_OTHER_BASE_URL=http://other:2400
CHATAPP_JAVA_WALLET_BASE_URL=http://wallet:2000
CHATAPP_STORE_MYSQL_DSN=root:123456@tcp(mysql:3306)/likei?charset=utf8mb4&parseTime=True&loc=Asia%2FRiyadh
CHATAPP_STORE_REDIS_ADDR=redis:6379
CHATAPP_STORE_REDIS_DB=0
CHATAPP_STORE_REDIS_PASSWORD=""
CHATAPP_WEEK_STAR_DEFAULT_SYS_ORIGIN=LIKEI
CHATAPP_WEEK_STAR_RETRY_BATCH_SIZE=10
CHATAPP_WEEK_STAR_RETRY_BLOCK_MILLIS=5000
CHATAPP_WEEK_STAR_RETRY_CONSUMER_GROUP=week-star-retry
CHATAPP_WEEK_STAR_RETRY_CONSUMER_NAME=week-star-retry-cron-sg-1
CHATAPP_WEEK_STAR_RETRY_MIN_IDLE_MILLIS=60000
CHATAPP_WEEK_STAR_RETRY_STREAM_KEY=week-star:reward-retry
CHATAPP_WEEK_STAR_SETTLE_INTERVAL_SECONDS=60
CHATAPP_WEEK_STAR_TIMEZONE=Asia/Riyadh
CRON_AUTO_MIGRATE=false
CRON_HTTP_TIMEOUT_SECONDS=8
CRON_JAVA_OTHER_BASE_URL=http://10.2.1.16:2400
CRON_MYSQL_DSN=root:123456@tcp(mysql:3306)/likei?charset=utf8mb4&parseTime=True&loc=Asia%2FRiyadh
CRON_REDIS_ADDR=redis:6379
CRON_REDIS_DB=0
CRON_REDIS_PASSWORD=""
CRON_SHUTDOWN_TIMEOUT_SECONDS=30
GAME_INTERNAL_CALLBACK_SECRET=dNIiHptGHkDs8ngMoK_1XCTRxzzTGb19
GAME_JAVA_WALLET_BASE_URL=http://wallet:2000
GAME_LUCKY_GIFT_GO_URL=http://golang:2900
INVITE_CAMPAIGN_GO_URL=http://golang:2900
GITEA_ADMIN_PASSWORD="A59chf#33"
GITEA_ADMIN_USERNAME=admin
GITEA_BASE_URL=http://43.164.74.132:3000
LIKEI_AGORA_APP_CERTIFICATE=a6feb209de6448148a926f59634807bb
LIKEI_AGORA_APP_ID=""
LIKEI_AGORA_AUTH_KEY="Basic ZTA0MTVjMzYwZjBmNDNhZGFhNTdjZDZmNjgwYTFiZWQ6MWIyYmNjZDU0NGQzNDRhYmJhMTNiNDliZjUyMGY4MTI="
LIKEI_AGORA_PRIVILEGE_EXPIRE_SECOND=86400
LIKEI_AGORA_TOKEN_EXPIRE_SECOND=86400
LIKEI_AIRWALLEX_API_KEY=e397fa14297xxxxxxxx6d3dff3e92c63c338
LIKEI_AIRWALLEX_BASE_URL=https://api-demo.airwallex.com
LIKEI_AIRWALLEX_CLIENT_ID=j5v_C5xxg
LIKEI_AI_MINIMAX_AUTHORIZATION="Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJHcm91cE5hbWUiOiJ0b255IGxpdSIsIlVzZXJOYW1lIjoidG9ueSBsaXUiLCJBY2NvdW50IjoiIiwiU3ViamVjdElEIjoiMTkzMDg0MzI0Nzg4NjczMzY4NCIsIlBob25lIjoiIiwiR3JvdXBJRCI6IjE5MzA4NDMyNDc4ODI1MzkzODAiLCJQYWdlTmFtZSI6IiIsIk1haWwiOiJsaXV0YW90b255M0BpY2xvdWQuY29tIiwiQ3JlYXRlVGltZSI6IjIwMjUtMDYtMjUgMTQ6MzA6MjYiLCJUb2tlblR5cGUiOjEsImlzcyI6Im1pbmltYXgifQ.TAHcSE-3YSSLWC9z9424GVF6twqi3Po5LkpGENtLF25397IvEV-CiXDFzBE5F-H6w9yG-YAROwGy0jFxwoDWPF4IsC2emKp5Qan5geavx7YqTEUQ4vJzhu7TJgDrvvUcUanVPQRBo5IyqpPuDagNPHhmPca7wgOrVHQfahUs7Q5VwOUiUDguHdwXcl6h4Yk32Ufv7rHDuS_sZnuAXxG_dY_XfIkJGwdMz7O7c9uWICnnMFXAL7GEyhy50MKJoEiCFLWnIC6Tu20oTnd2QBDlp1JCzdphA9FpBqo0SVCSmR2CZK1Uo4oXioxizkfv4EgPpCZUkOVSqT2f74l1zbFe-g"
LIKEI_AI_MINIMAX_MODEL=MiniMax-Text-01
LIKEI_AI_MINIMAX_URL=https://api.minimax.io/v1/text/chatcompletion_v2
LIKEI_AI_QIANFAN_APP_ID=""
LIKEI_AI_QIANFAN_AUTHORIZATION="Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJHcm91cE5hbWUiOiJ0b255IGxpdSIsIlVzZXJOYW1lIjoidG9ueSBsaXUiLCJBY2NvdW50IjoiIiwiU3ViamVjdElEIjoiMTkzMDg0MzI0Nzg4NjczMzY4NCIsIlBob25lIjoiIiwiR3JvdXBJRCI6IjE5MzA4NDMyNDc4ODI1MzkzODAiLCJQYWdlTmFtZSI6IiIsIk1haWwiOiJsaXV0YW90b255M0BpY2xvdWQuY29tIiwiQ3JlYXRlVGltZSI6IjIwMjUtMDYtMjUgMTQ6MzA6MjYiLCJUb2tlblR5cGUiOjEsImlzcyI6Im1pbmltYXgifQ.TAHcSE-3YSSLWC9z9424GVF6twqi3Po5LkpGENtLF25397IvEV-CiXDFzBE5F-H6w9yG-YAROwGy0jFxwoDWPF4IsC2emKp5Qan5geavx7YqTEUQ4vJzhu7TJgDrvvUcUanVPQRBo5IyqpPuDagNPHhmPca7wgOrVHQfahUs7Q5VwOUiUDguHdwXcl6h4Yk32Ufv7rHDuS_sZnuAXxG_dY_XfIkJGwdMz7O7c9uWICnnMFXAL7GEyhy50MKJoEiCFLWnIC6Tu20oTnd2QBDlp1JCzdphA9FpBqo0SVCSmR2CZK1Uo4oXioxizkfv4EgPpCZUkOVSqT2f74l1zbFe-g"
LIKEI_AI_QIANFAN_MODEL=MiniMax-Text-01
LIKEI_AI_QIANFAN_URL=https://api.minimax.io/v1/text/chatcompletion_v2
LIKEI_AI_TTS_MODEL=MiniMax-Text-01
LIKEI_AI_TTS_URL=https://api.minimax.io/v1/text/chatcompletion_v2
LIKEI_ALIYUN_OSS_ACCESS_KEY_ID=LTAI5
LIKEI_ALIYUN_OSS_ACCESS_KEY_SECRET=v2Z31d
LIKEI_ALIYUN_OSS_ACCESS_URL=https://media.haiyihy.com
LIKEI_ALIYUN_OSS_BUCKET_NAME=tkm-likei
LIKEI_ALIYUN_OSS_ENDPOINT=http://oss-accelerate.aliyuncs.com
LIKEI_ALIYUN_STS_ENDPOINT=sts.us-west-1.aliyuncs.com
LIKEI_ALIYUN_STS_ROLE_ARN=acs:ram::124470563:role/stsoss
LIKEI_APP_INTERNAL_LB_ID=lb-epvnr4o0
LIKEI_APP_INTERNAL_LB_VIP=10.2.1.16
LIKEI_ARTIFACT_DELIVERY_MODE=direct-http
LIKEI_ARTIFACT_HTTP_PORT=18080
LIKEI_CENSOR_ACTIVE=qcloud
LIKEI_CENSOR_TUPU_ENABLED=true
LIKEI_CLB_SUBNET_ID=subnet-c0uzemts
LIKEI_CLIPSPAY_MD5_SECRET_KEY=18455c7xxxxx4a48fb7fe
LIKEI_CLIPSPAY_MERCHANT_NO=800xx2370
LIKEI_CLIPSPAY_NOTIFY_URL=https://dexxxxx.com/play/server/notice/clipspay
LIKEI_CLIPSPAY_PLACE_ORDER_API=http://uat.card.api.clipspay.com/payment/gateway/api/backTransReq
LIKEI_CLIPSPAY_REDIRECT_RESULT=https://dev.xxxxine.com/clipspay/redirect
LIKEI_CLIPSPAY_TERMINAL_KEY=NzMyNGRxxxxxYThiMmE4ODA
LIKEI_CLIPSPAY_TERMINAL_NO=10xxx6
LIKEI_CLOUD_MONGO_DB=tarab_all
LIKEI_CLOUD_MONGO_HOST=10.2.21.9
LIKEI_CLOUD_MONGO_PORT=27017
LIKEI_CLOUD_MONGO_PROXY_PORT=37017
LIKEI_CLOUD_MONGO_URI=mongodb://root:123456@10.2.21.9:27017/tarab_all?authSource=admin&readPreference=secondaryPreferred&retryWrites=false&maxPoolSize=50&minPoolSize=5&maxIdleTimeMS=6000
LIKEI_CLOUD_MYSQL_DATABASES="likei likei_wallet"
LIKEI_CLOUD_MYSQL_HOST=10.2.21.3
LIKEI_CLOUD_MYSQL_PASSWORD="A59chf#33"
LIKEI_CLOUD_MYSQL_PORT=3306
LIKEI_CLOUD_MYSQL_PROXY_PORT=33306
LIKEI_CLOUD_MYSQL_USER=root
LIKEI_DEFAULT_DEPLOY_ORDER_JSON=["mongo-1","nacos-2","nacos-1","app-2","pay-2","gateway-2","app-1","pay-1","gateway-1","cron-sg-1"]
LIKEI_DEPLOY_BASE_DIR=/opt/deploy
LIKEI_DEPLOY_BUCKET=haiyihy-deploy-1420526837
LIKEI_DEPLOY_BUCKET_REGION=me-saudi-arabia
LIKEI_DEPLOY_CONNECTION_DRAIN_POLL_SECONDS=2
LIKEI_DEPLOY_CONNECTION_DRAIN_TIMEOUT_SECONDS=20
LIKEI_DEPLOY_HOSTS_JSON={"nacos-1":{"ip":"10.2.22.2","instance_id":"ins-3yelqb7y","services":["nacos"],"group":"nacos"},"nacos-2":{"ip":"10.2.22.10","instance_id":"ins-0oxyvn58","services":["nacos"],"group":"nacos"},"mongo-1":{"ip":"10.2.21.9","instance_id":"ins-o9mmob66","services":["mongo"],"group":"infra"},"app-1":{"ip":"10.2.11.3","instance_id":"ins-n566mmeg","services":["auth","external","console","other","live","golang"],"group":"app"},"app-2":{"ip":"10.2.12.6","instance_id":"ins-kauk17la","services":["auth","external","console","other","live","golang"],"group":"app"},"pay-1":{"ip":"10.2.11.14","instance_id":"ins-ceqfcxd2","services":["wallet","order"],"group":"pay"},"pay-2":{"ip":"10.2.12.5","instance_id":"ins-awhb74q6","services":["wallet","order"],"group":"pay"},"gateway-1":{"ip":"10.2.1.8","instance_id":"ins-aeyaoj40","services":["gateway"],"group":"gateway"},"gateway-2":{"ip":"10.2.2.17","instance_id":"ins-irvi5b7u","services":["gateway"],"group":"gateway"},"cron-sg-1":{"ip":"10.3.1.14","instance_id":"ins-nt6bsay0","services":["week-star-job"],"group":"cron","region":"ap-singapore"}}
LIKEI_DEPLOY_LB_DRAIN_SETTLE_SECONDS=8
LIKEI_DEPLOY_MACHINE_INSTANCE_ID=ins-ntmpcd3a
LIKEI_DEPLOY_MACHINE_TAT_REGION=me-saudi-arabia
LIKEI_DEPLOY_REGION=me-saudi-arabia
LIKEI_DEPLOY_REPO_REF=main
LIKEI_DEPLOY_RUNTIME_ROOT=/opt/deploy/runtime/current
LIKEI_DEPLOY_SOURCES_ROOT=/opt/deploy/sources
LIKEI_DEPLOY_STATE_ROOT=/opt/deploy/state
LIKEI_DEPLOY_STOP_TIMEOUT_SECONDS=45
LIKEI_EXTERNAL_LOCAL_DISK_READ_COMPAT=false
LIKEI_EXTERNAL_OSS_MODE=tencent-cos
LIKEI_FRAMEWORK_NACOS_STOP_KEY=CxILm9hA1b9hF3Hl
LIKEI_FRONTEND_ADMIN_CONSOLE_UPSTREAM=10.2.1.16:2700
LIKEI_FRONTEND_ADMIN_DOMAIN=yumi-admin.haiyihy.com
LIKEI_FRONTEND_ADMIN_GOLANG_UPSTREAM=10.2.1.16:2900
LIKEI_FRONTEND_ADMIN_INSTANCE_ID=ins-p11begwe
LIKEI_GAME_BAISHUN2FUN_APP_CHANNEL=lotfun
LIKEI_GAME_BAISHUN2FUN_APP_ID=1704692112
LIKEI_GAME_BAISHUN2FUN_APP_KEY=6EllbAruJDfw
LIKEI_GAME_BAISHUN_APP_CHANNEL=yumiparty
LIKEI_GAME_BAISHUN_APP_ID=7485318192
LIKEI_GAME_BAISHUN_APP_KEY=i1PUKj0aJjdWF3qRbBeoGBEgfFsHpUGS
LIKEI_GAME_HKYS_SIGN_KEY=svO
LIKEI_GAME_HOTGAME_SIGN_KEY=svO
LIKEI_GAME_SUD_APP_CHANNEL=lotfun
LIKEI_GAME_SUD_APP_ID=1704692112
LIKEI_GAME_SUD_APP_KEY=6EllbAruJDfw
LIKEI_GAME_SUD_APP_SECRET=Psw9s7nOnxxxxxxxS97y4uf0vW
LIKEI_GATEWAY_CLB_ID=lb-cbiabr1q
LIKEI_GATEWAY_FORWARD_AES_KEY=8NcSaTt8EHjRlRuG
LIKEI_GATEWAY_FORWARD_ROUTE_AES_KEY=7NcAa111UGiRlRiR
LIKEI_GATEWAY_INTERNAL_LB_VIP=10.2.1.12
LIKEI_GATEWAY_ROUTE_AUTH_URI=http://auth:1000
LIKEI_GATEWAY_ROUTE_EXTERNAL_URI=http://external:3000
LIKEI_GATEWAY_ROUTE_FORWARD_URI=lb://rc-auth
LIKEI_GATEWAY_ROUTE_GAME_APP_URI=http://golang:2900
LIKEI_GATEWAY_ROUTE_GAME_BAISHUN_URI=http://golang:2900
LIKEI_GATEWAY_ROUTE_GAME_INTERNAL_URI=http://golang:2900
LIKEI_GATEWAY_ROUTE_GO_URI=http://golang:2900
LIKEI_GATEWAY_ROUTE_INVITE_APP_URI=http://golang:2900
LIKEI_GATEWAY_ROUTE_INVITE_INTERNAL_URI=http://golang:2900
LIKEI_GATEWAY_ROUTE_INVITE_PUBLIC_URI=http://golang:2900
LIKEI_GATEWAY_ROUTE_LIVE_URI=http://live:2500
LIKEI_GATEWAY_ROUTE_ORDER_URI=http://order:2600
LIKEI_GATEWAY_ROUTE_OTHER_URI=http://other:2400
LIKEI_GATEWAY_ROUTE_REGISTER_REWARD_APP_URI=http://golang:2900
LIKEI_GATEWAY_ROUTE_WALLET_URI=http://wallet:2000
LIKEI_GOOGLE_PAY_GLOBAL_PATCH_JSON=payfile/google_pay.json
LIKEI_GOOGLE_PAY_GLOBAL_SERVER_ACCOUNT=server-api@api-5499404589076025365-781142.iam.gserviceaccount.com
LIKEI_GOOGLE_PAY_TAXAB_PATCH_JSON=payfile/tarab-427706-04fe535b024a.json
LIKEI_GOOGLE_PAY_TAXAB_PUBLIC_KEY=MIIBIjANxxxxxxxxTjmAO68rmnKr2gYJ3isuepCZsaX0wIDAQAB
LIKEI_GOOGLE_PAY_TAXAB_SERVER_ACCOUNT=tarab-server@tarab-427706.iam.gserviceaccount.com
LIKEI_H5_CDN_PATH=https://h5.haiyihy.com/
LIKEI_H5_VERIFY_URL=https://h5.haiyihy.com/index.html
LIKEI_HUAWEI_CLIENT_ID=11xx93
LIKEI_HUAWEI_CLIENT_SECRET=dff36e68xxxx30da9c7240ae0bc96
LIKEI_HUAWEI_GRANT_TYPE=client_credentials
LIKEI_HUAWEI_IAP_PUBLIC_KEY=MIIBojANBgkqhkiG9w0Bxxxxx7cdmApDJfpAlKeLZ9fy7d3VIWyqZiLYtxxxxj3t+sFuC4lEJBVrw5MgDE7bmpjidOm0rxxxxUYC1hSI8xXagbJ0sOcYXSunxxxx1NaupT2+ILoZPfIQVF4RThlQmphuOif4uMMlYvYosiueCKlv6MYQi0fVcLKEjWVc/XslowtLS4w0EV/eAVpFq7kTvy04LNYVscSjZop7AHEMVVoNgzg+mLC0UGsftYRfEBeKHkNppTg931qodgJSkIM582ZTK0eujAJR43On3z1gc8+UvSKW+9w+tAqw099VYrFY3sXySUfVJ6SoejiHeKlAgMBAAE=
LIKEI_HUAWEI_OAUTH_LOGIN_URL=https://oauth-login.cloud.huawei.com/oauth2/v3/token
LIKEI_IM_APP_ID=20036101
LIKEI_IM_BASE_ENDPOINT=https://adminapisgp.im.qcloud.com
LIKEI_IM_BROADCAST_GROUP_LIKEI="@TGS#2RUK4PK5C2"
LIKEI_IM_BROADCAST_GROUP_LOTFUN="@TGS#a3C"
LIKEI_IM_IDENTIFIER=yumiadmin
LIKEI_IM_KEY=dcdf53135f27e7cf8541c4ae9798fb0cb2f0e4d6c5c20022dbaea053f35cbb8c
LIKEI_IM_NEWSLETTER_ACCOUNT=yuminotice
LIKEI_IM_NOTICE_ACCOUNT=yuminotice
LIKEI_LIGHTHOUSE_REGION=ap-singapore
LIKEI_LOCALHOST_ASSET_PREFIX=http://127.0.0.1:3000/oss/local/
LIKEI_LOCAL_ASSET_PREFIX=http://10.0.2.2:3000/oss/local/
LIKEI_LOCAL_AUTH_PORT=1000
LIKEI_LOCAL_CONSOLE_PORT=2700
LIKEI_LOCAL_DATA_SYNC_MODE=direct
LIKEI_LOCAL_EXTERNAL_PORT=3000
LIKEI_LOCAL_GAME_FRUIT_JAVA_OPTS="-Xms128m -Xmx384m"
LIKEI_LOCAL_GAME_FRUIT_PORT=8001
LIKEI_LOCAL_GATEWAY_PORT=1100
LIKEI_LOCAL_GOLANG_PORT=2900
LIKEI_LOCAL_JAVA_OPTS="-Xms128m -Xmx512m"
LIKEI_LOCAL_LIVE_PORT=2500
LIKEI_LOCAL_MONGO_CONTAINER=chatapp3-local-mongo
LIKEI_LOCAL_MONGO_EXPOSE_PORT=27018
LIKEI_LOCAL_MONGO_ROOT_PASSWORD=123456
LIKEI_LOCAL_MONGO_ROOT_USERNAME=root
LIKEI_LOCAL_MYSQL_CONTAINER=chatapp3-local-mysql
LIKEI_LOCAL_MYSQL_DATABASE=likei
LIKEI_LOCAL_MYSQL_EXPOSE_PORT=13306
LIKEI_LOCAL_MYSQL_INFRA_EXPOSE_PORT=13306
LIKEI_LOCAL_MYSQL_ROOT_PASSWORD=123456
LIKEI_LOCAL_NACOS_AUTH_ENABLE=false
LIKEI_LOCAL_NACOS_CLIENT_GRPC_PORT=9848
LIKEI_LOCAL_NACOS_CONSOLE_PORT=8080
LIKEI_LOCAL_NACOS_JVM_XMN=128m
LIKEI_LOCAL_NACOS_JVM_XMS=256m
LIKEI_LOCAL_NACOS_JVM_XMX=256m
LIKEI_LOCAL_NACOS_PORT=8848
LIKEI_LOCAL_ORDER_PORT=2600
LIKEI_LOCAL_OTHER_PORT=2400
LIKEI_LOCAL_REDIS_EXPOSE_PORT=16379
LIKEI_LOCAL_REDIS_INFRA_EXPOSE_PORT=16379
LIKEI_LOCAL_ROCKETMQ_IMAGE_TAG=5.3.2
LIKEI_LOCAL_ROCKETMQ_NAMESRV_PORT=19876
LIKEI_LOCAL_ROCKETMQ_PROXY_GRPC_PORT=18081
LIKEI_LOCAL_ROCKETMQ_PROXY_HTTP_PORT=18080
LIKEI_LOCAL_SCHEDULING_JAVA_OPTS="-Xms128m -Xmx384m"
LIKEI_LOCAL_SCHEDULING_PORT=2800
LIKEI_LOCAL_SYNC_CACHE_DIR=/Users/hy/Documents/hy/chatapp3/chatapp3-deploy/tencent-prod/var/cache/local-data-sync
LIKEI_LOCAL_VISUAL_MONITOR_PORT=8000
LIKEI_LOCAL_WALLET_PORT=2000
LIKEI_LOCAL_ZOOKEEPER_EXPOSE_PORT=2181
LIKEI_MAVEN_REPO_LOCAL=/opt/deploy/.m2/repository
LIKEI_MIFA_PAY_GATEWAY_BASE_URL=https://pay-gate-uat.payermax.com
LIKEI_MIFA_PAY_MER_ACCOUNT=d00f5fc97a114a0db291eceaf9841739
LIKEI_MIFA_PAY_MER_NO=10001925
LIKEI_MIFA_PAY_NOTIFY_URL=https://jvapi.haiyihy.com/play-server-notice/mifa_pay/receive_payment
LIKEI_MIFA_PAY_PLATFORM_RSA_PUBLIC_KEY=MIIBIjANBgkqhkiG9w0BAQEFAACBAQ8AMIIBCgKCAQEAi4+8n/BEFhWKzWs1SMdD+1gzK3xiI/wGGTS330yKSxQMM5Ec39AFQjKFTvcjIZegt2vTQYnA/AL0l0O5C98BWSBuM20/pUXd1+i/Ew/lvLYoeKDD4ARkCzJfXQcDgvm4gTZvnVJwerCN+E2rziNZoLTdTo468IArzBVFzWGa/YmQvi7brCbTlzp5EpVeZMNLNpM04I0uJIiqGpEp0PDPbbn/ZVzZLoLKO+LXWxXx1nFPVlL+X1yk1TyJVfPv7Au3mv9UXNGSF6EP21n97aaU1j29+PXNy3Yze8pmkdWmcOqGnORSLPk0Acl6gklBGyvFiSk/QsL1ocecqD8cJk1JbQIDAQAB
LIKEI_MIFA_PAY_RSA_PRIVATE_KEY=MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCQU2JiAdSO8M3CQft5nZEGLO9/TPFArQCffVzWoaz3niIacJ/B3dOePJyXMljuKByoRC+1ApW+9ucVXoulkLkqUAve0q7xKMFaxCw4OAEkRC6JhjYgEJyJXLEA9KRT6EklvvomqfUwuddCKtTNLL2hFtG5+2P+BioYrekaIiZh9lIel1msn4WKoBp3LgyStcZBQOPzhD7NcKsbo+ppjT4JBSQyVZrcJ3mYe+YSV/Qnw/KY2v3OzPeLApeZhLh5wVsfcmyz04IHFogLIjRVFGU6Xbvfz8ujRtpoBD+3RSz5GKiBLPjoSgGLSIxCWc10VphKwOlvR0bi3ssKYG9HsHw5AgMBAAECggEADzebgfXrcX7WUwsd9r60UdBfGC8GqOkUzbwsE71MPXeA5QTG82vuKhr977sxQTsdemhmF1HEdDQYPVqQos5Vl66E8eOI6oh/ipBwkSTmiepedcWe41adCqapSw6AXRB61e4C9hypa4/MsH9PnKqA/AEp79AfxOLlgWCk2UqMfXuPuYhKD9SSlYVoJ5x/W48B+NBaRuSiCV3agPfnpRtMuTZ9Vs4IOL4riIyE9ABBgFinL0h/D5qSX6JnrO+N1miORSiM+2e/Sh/xs6nrCIuh9pSBcXjAeO/l4/BKCfj3TPH9hcYWWWRVgbX0WV6MDZFz/au5o9LZ7m9kUltP4dH7AQKBgQDvyrKh7BKIrwEwvt0eWBfCNdwLctb0GbsEoYVsQaiS/cLfje5289DLTTYc18fy/G8dRMGftME6qAiidtQaEb/mfSWPhHYfTayWJ0At8TvX2qbUS2b46or3lRgUBWOgpNkmLSEy7ae0I1UTStI3UN9rJNvjZ7Jntc7KGeZMfivCqQKBgQCaFMN2xBV00KerElFp0XZRaCZEyLz3MkTOwSlcs4c9cA7TTV0sZlxNRsA11WCaFIEV8TGCjZMJfmZihmB+LRXOhb45lXD+xi/JTOPs9UVOPJNpeFHuABL93/TqL0ma7d/VntKkIv2g+/CUoSzXQ6QrLg4/BpmfevZDtW/A8Gx3EQKBgQCe/TmVjM35HHfglxxLK0ONfGKKoLkPHiRW/LVXQu1/kItt6FBNRHmS4n3Xf+bOIDuYH2d1+cYImzMmbT1Sj6Q6MY3+62fad4jQAfRWwdTY2Nu2dMwwjGpZn9xYIf6dm89ytYeGmfaQxMB6yyg4jwGjq8uzqqSqiOw0Khn9a8aeCQKBgArX0zmUav4hgOslCt2rg+wOrELC7alnvDfgmAySBb5pGGH+W8Q4H97AT955+aZeMwdcReOuGt7cKlBcrIW0nog+GTjsL1t+jvZXluKiEBKFaMpPUVSyZKPBEvc4BLIGc24REznBzJ97m16aSRGNDQyM3SvKRx1WBeaV6htlz/xBAoGAbi5IvOQMCbUvtrD/lJ3xkVaoEQL6dlCVBK7Ldf5+6g/Rc9j6d5B2UVb3v9+BOpAHHFa2fIPNI8y22TmCjgIGi6O8Rm60KqFDQIQnzcmPQg9HsTIG5u0V2b/0saUj2txHRzIC+cZ4b+/xms7OHu1OKZeVIZhNdT/+CWmO2wVgA/s=
LIKEI_MONGO_HOST=10.2.21.9
LIKEI_MONGO_PORT=27017
LIKEI_MONGO_URI=mongodb://root:123456@mongo:27017/tarab_all?authSource=admin&readPreference=secondaryPreferred&retryWrites=false&maxPoolSize=50&minPoolSize=5&maxIdleTimeMS=6000
LIKEI_MYSQL_JDBC_URL=jdbc:p6spy:mysql://mysql:3306/likei?characterEncoding=utf8&useUnicode=true&useSSL=false&allowMultiQueries=true&useLegacyDatetimeCode=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&autoReconnect=true
LIKEI_MYSQL_PASSWORD=123456
LIKEI_MYSQL_SCAN_HOST=app-1
LIKEI_MYSQL_USERNAME=root
LIKEI_NACOS_CLIENT_GRPC_PORT=9848
LIKEI_NACOS_DB_NAME=nacos
LIKEI_NACOS_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
LIKEI_NACOS_DB_PASSWORD="A59chf#33"
LIKEI_NACOS_DB_USER=root
LIKEI_NACOS_DISCOVERY_CACHE_SETTLE_SECONDS=8
LIKEI_NACOS_DISCOVERY_CLUSTER_NAME=DEFAULT
LIKEI_NACOS_DISCOVERY_DISABLE_TIMEOUT_SECONDS=30
LIKEI_NACOS_DISCOVERY_ENABLE_TIMEOUT_SECONDS=60
LIKEI_NACOS_DISCOVERY_GROUP=local
LIKEI_NACOS_DISCOVERY_POLL_SECONDS=2
LIKEI_NACOS_HOST=10.2.1.17
LIKEI_NACOS_INTERNAL_LB_ID=lb-6xvx317u
LIKEI_NACOS_INTERNAL_LB_VIP=10.2.1.17
LIKEI_NACOS_NAMESPACE=f7a8594e-090c-4830-a3ad-b5c0f9afcc07
LIKEI_NACOS_NAMESPACE_NAME=chatapp3-local
LIKEI_NACOS_PORT=8848
LIKEI_ORDER_TELEGRAM_BOT_TOKEN=72649:AAE7gZj0
LIKEI_ORDER_TELEGRAM_WEBHOOK_URL=https://local.api.yuyinfang168.com/order/telegram/webhook
LIKEI_PAYERMAX_APP_ID=d6afddeb3ca447448
LIKEI_PAYERMAX_ENABLE_REAL_TIME_EXCHANGE_RATE=false
LIKEI_PAYERMAX_GATEWAY_BASE_URL=https://pay-gate-uat.payermax.com
LIKEI_PAYERMAX_MERCHANT_ID=SDP01010
LIKEI_PAYERMAX_PLATFORM_RSA_PUBLIC_KEY=MIIBIjANBgkqhkiG9w0BAQEFAACBAQ8AMIIBCgKCAQEAi4+8n/BEFhWKzWs1SMdD+1gzK3xiI/wGGTS330yKSxQMM5Ec39AFQjKFTvcjIZegt2vTQYnA/AL0l0O5C98BWSBuM20/pUXd1+i/Ew/lvLYoeKDD4ARkCzJfXQcDgvm4gTZvnVJwerCN+E2rziNZoLTdTo468IArzBVFzWGa/YmQvi7brCbTlzp5EpVeZMNLNpM04I0uJIiqGpEp0PDPbbn/ZVzZLoLKO+LXWxXx1nFPVlL+X1yk1TyJVfPv7Au3mv9UXNGSF6EP21n97aaU1j29+PXNy3Yze8pmkdWmcOqGnORSLPk0Acl6gklBGyvFiSk/QsL1ocecqD8cJk1JbQIDAQAB
LIKEI_PAYERMAX_RSA_PRIVATE_KEY=MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCQU2JiAdSO8M3CQft5nZEGLO9/TPFArQCffVzWoaz3niIacJ/B3dOePJyXMljuKByoRC+1ApW+9ucVXoulkLkqUAve0q7xKMFaxCw4OAEkRC6JhjYgEJyJXLEA9KRT6EklvvomqfUwuddCKtTNLL2hFtG5+2P+BioYrekaIiZh9lIel1msn4WKoBp3LgyStcZBQOPzhD7NcKsbo+ppjT4JBSQyVZrcJ3mYe+YSV/Qnw/KY2v3OzPeLApeZhLh5wVsfcmyz04IHFogLIjRVFGU6Xbvfz8ujRtpoBD+3RSz5GKiBLPjoSgGLSIxCWc10VphKwOlvR0bi3ssKYG9HsHw5AgMBAAECggEADzebgfXrcX7WUwsd9r60UdBfGC8GqOkUzbwsE71MPXeA5QTG82vuKhr977sxQTsdemhmF1HEdDQYPVqQos5Vl66E8eOI6oh/ipBwkSTmiepedcWe41adCqapSw6AXRB61e4C9hypa4/MsH9PnKqA/AEp79AfxOLlgWCk2UqMfXuPuYhKD9SSlYVoJ5x/W48B+NBaRuSiCV3agPfnpRtMuTZ9Vs4IOL4riIyE9ABBgFinL0h/D5qSX6JnrO+N1miORSiM+2e/Sh/xs6nrCIuh9pSBcXjAeO/l4/BKCfj3TPH9hcYWWWRVgbX0WV6MDZFz/au5o9LZ7m9kUltP4dH7AQKBgQDvyrKh7BKIrwEwvt0eWBfCNdwLctb0GbsEoYVsQaiS/cLfje5289DLTTYc18fy/G8dRMGftME6qAiidtQaEb/mfSWPhHYfTayWJ0At8TvX2qbUS2b46or3lRgUBWOgpNkmLSEy7ae0I1UTStI3UN9rJNvjZ7Jntc7KGeZMfivCqQKBgQCaFMN2xBV00KerElFp0XZRaCZEyLz3MkTOwSlcs4c9cA7TTV0sZlxNRsA11WCaFIEV8TGCjZMJfmZihmB+LRXOhb45lXD+xi/JTOPs9UVOPJNpeFHuABL93/TqL0ma7d/VntKkIv2g+/CUoSzXQ6QrLg4/BpmfevZDtW/A8Gx3EQKBgQCe/TmVjM35HHfglxxLK0ONfGKKoLkPHiRW/LVXQu1/kItt6FBNRHmS4n3Xf+bOIDuYH2d1+cYImzMmbT1Sj6Q6MY3+62fad4jQAfRWwdTY2Nu2dMwwjGpZn9xYIf6dm89ytYeGmfaQxMB6yyg4jwGjq8uzqqSqiOw0Khn9a8aeCQKBgArX0zmUav4hgOslCt2rg+wOrELC7alnvDfgmAySBb5pGGH+W8Q4H97AT955+aZeMwdcReOuGt7cKlBcrIW0nog+GTjsL1t+jvZXluKiEBKFaMpPUVSyZKPBEvc4BLIGc24REznBzJ97m16aSRGNDQyM3SvKRx1WBeaV6htlz/xBAoGAbi5IvOQMCbUvtrD/lJ3xkVaoEQL6dlCVBK7Ldf5+6g/Rc9j6d5B2UVb3v9+BOpAHHFa2fIPNI8y22TmCjgIGi6O8Rm60KqFDQIQnzcmPQg9HsTIG5u0V2b/0saUj2txHRzIC+cZ4b+/xms7OHu1OKZeVIZhNdT/+CWmO2wVgA/s=
LIKEI_PAYERMAX_RSA_PUBLIC_KEY=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkFNiYgHUjvDNwkH7eZ2RBizvf0zxQK0An31c1qGs954iGnCfwd3TnjyclzJY7igcqEQvtQKVvvbnFV6LpZC5KlAL3tKu8SjBWsQsODgBJEQuiYY2IBCciVyxAPSkU+hJJb76Jqn1MLnXQirUzSy9oRbRuftj/gYqGK3pGiImYfZSHpdZrJ+FiqAady4MkrXGQUDj84Q+zXCrG6PqaY0+CQUkMlWa3Cd5mHvmElf0J8PymNr9zsz3iwKXmYS4ecFbH3Jss9OCBxaICyI0VRRlOl2738/Lo0baaAQ/t0Us+RiogSz46EoBi0iMQlnNdFaYSsDpb0dG4t7LCmBvR7B8OQIDAQAB
LIKEI_PAYERMAX_SECRET_KEY=8aexx98f
LIKEI_PAYNICORN_APP_KEY=79xx58
LIKEI_PAYNICORN_MERCHANT_SECRET=704a8xxx50b
LIKEI_PAYPAL_DEV_MERCHANT_ID=Ac2aB2KFgz3xxxxxGmbS7dcPedRf2_eg23D
LIKEI_PAYPAL_DEV_SECRET_KEY=ECjyOP4nxxxxxxB0JEAH9P7im
LIKEI_PAYPAL_MERCHANT_ID=AZm9zUAxxxxx8kiGKL6D4l0elx2
LIKEI_PAYPAL_SECRET_KEY=EJuYA6cSud6xxxxx4_Fj9rbBh1yYnr97btui2ocuR
LIKEI_PAY_INTERNAL_LB_ID=lb-4f5xi6p0
LIKEI_PAY_INTERNAL_LB_VIP=10.2.1.15
LIKEI_PAY_WEB_PAY_BASE_URL="https://h5.likeichat.com/#/"
LIKEI_PAY_WEB_PAY_COLLECTION_PAGE=collection-receipt
LIKEI_PAY_WEB_PAY_RECHARGE_PAGE=recharge
LIKEI_PAY_WEB_PAY_RESULT_PAGE=pay-result
LIKEI_PUBLIC_API_BASE=https://jvapi.haiyihy.com
LIKEI_PUBLIC_H5_DOMAIN=h5.haiyihy.com
LIKEI_PUBLIC_H5_ORIGIN_DOMAIN=h5-origin.haiyihy.com
LIKEI_PUBLIC_ROOT_DOMAIN=haiyihy.com
LIKEI_PUBLIC_SITE_CERT_ID=WkzXsNlm
LIKEI_PUBLIC_SITE_INSTANCE_ID=lhins-0waytx8h
LIKEI_PUBLIC_WWW_DOMAIN=www.haiyihy.com
LIKEI_PUBLIC_WWW_ORIGIN_DOMAIN=www-origin.haiyihy.com
LIKEI_REDIS_DATABASE=0
LIKEI_REDIS_HOST=redis
LIKEI_REDIS_PORT=6379
LIKEI_ROCKETMQ_ACCESS_KEY=local
LIKEI_ROCKETMQ_ENDPOINT=rocketmq-proxy:8081
LIKEI_ROCKETMQ_LOCAL_DISABLE=false
LIKEI_ROCKETMQ_SECRET_KEY=local
LIKEI_RTC_APP_ID=4b5e5cea3b86476caf7f7a57d05b82d1
LIKEI_RTC_AUTH_KEY="Basic ZTA0MTVjMzYwZjBmNDNhZGFhNTdjZDZmNjgwYTFiZWQ6MWIyYmNjZDU0NGQzNDRhYmJhMTNiNDliZjUyMGY4MTI="
LIKEI_RTC_CERTIFICATE=a6feb209de6448148a926f59634807bb
LIKEI_RTC_KILL_ROOM_URL=https://api.sd-rtn.com/dev/v1/kicking-rule
LIKEI_SERVICE_STOP_GRACE_PERIOD_SECONDS=45
LIKEI_SMS_ALIYUN_ACCESS_KEY_ID=LTAI5
LIKEI_SMS_ALIYUN_ACCESS_KEY_SECRET=v2Z31d
LIKEI_SMS_ALIYUN_ENABLED=true
LIKEI_SMS_ALIYUN_ENDPOINT=http://oss-accelerate.aliyuncs.com
LIKEI_SMS_ALIYUN_SIGN_NAME=Tarab
LIKEI_TAT_IMPORT_INSTANCE_ID=ins-n566mmeg
LIKEI_TAT_MONGO_INSTANCE_ID=ins-o9mmob66
LIKEI_TAT_MYSQL_INSTANCE_ID=ins-n566mmeg
LIKEI_TAT_REGION=ap-singapore
LIKEI_TELEGRAM_BOT_TOKEN=8350:AAGwh1O
LIKEI_TELEGRAM_MONITOR_ALERT_LIMIT_SECONDS=60
LIKEI_TELEGRAM_MONITOR_CHAT_ID_1=-5081
LIKEI_TELEGRAM_MONITOR_PROXY_HOST=127.0.0.1
LIKEI_TELEGRAM_MONITOR_PROXY_PORT=7897
LIKEI_TENCENT_CLOUD_IMS_ENDPOINT=http://oss-accelerate.aliyuncs.com
LIKEI_TENCENT_CLOUD_IMS_REGION=me-saudi-arabia
LIKEI_TENCENT_CLOUD_IMS_SECRET_ID=IKIDMchhZEfrsiNo472DAtTpzzmLjttkOnyu
LIKEI_TENCENT_CLOUD_IMS_SECRET_KEY=nMkbLsGRO6ZqulSyJQJ0UjjU0KSKxOgl
LIKEI_TENCENT_CLS_ENDPOINT=ap-singapore.cls.tencentcs.com
LIKEI_TENCENT_CLS_REGION=ap-singapore
LIKEI_TENCENT_CLS_SECRET_ID=IKID1pNfgOmrc4G8frlNfcEWU7PMkrd4AwNU
LIKEI_TENCENT_CLS_SECRET_KEY=oISIp41i7F6fwvby1kCLBivsWqrZ07vV
LIKEI_TENCENT_COS_ACCESS_URL=https://media.haiyihy.com
LIKEI_TENCENT_COS_BUCKET=yumi-assets-1420526837
LIKEI_TENCENT_COS_ENABLED=true
LIKEI_TENCENT_COS_REGION=me-saudi-arabia
LIKEI_TENCENT_COS_SECRET_ID=IKIDMchhZEfrsiNo472DAtTpzzmLjttkOnyu
LIKEI_TENCENT_COS_SECRET_KEY=nMkbLsGRO6ZqulSyJQJ0UjjU0KSKxOgl
LIKEI_TRTC_ENDPOINT=http://oss-accelerate.aliyuncs.com
LIKEI_TRTC_SDK_APP_ID=20036101
LIKEI_TRTC_SECRET_ID=IKIDMchhZEfrsiNo472DAtTpzzmLjttkOnyu
LIKEI_TRTC_SECRET_KEY=nMkbLsGRO6ZqulSyJQJ0UjjU0KSKxOgl
LIKEI_VISUAL_MONITOR_PASSWORD=devxx23
LIKEI_VISUAL_MONITOR_USERNAME=dxxop
LIKEI_VPC_ID=vpc-rdxuns0f
LIKEI_WALLET_MYSQL_JDBC_URL=jdbc:p6spy:mysql://mysql:3306/likei_wallet?characterEncoding=utf8&useUnicode=true&useSSL=false&allowMultiQueries=true&useLegacyDatetimeCode=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&autoReconnect=true
LIKEI_YOMI_AES_KEY=Lt2tYDHewn6U4
LUCKY_GIFT_API_CONFIG_1_STANDARD_ID=18816
LUCKY_GIFT_API_CONFIG_1_URL=https://game-cn-test.jieyou.shop/lucky_gift/start_game
LUCKY_GIFT_API_CONFIG_2_STANDARD_ID=18816
LUCKY_GIFT_API_CONFIG_2_URL=https://game-cn-test.jieyou.shop/lucky_gift/start_game
LUCKY_GIFT_API_DEFAULT_APP_CHANNEL=lotfun
LUCKY_GIFT_API_DEFAULT_APP_ID=1704692112
LUCKY_GIFT_API_DEFAULT_APP_KEY=6EllbAruJDfw
LUCKY_GIFT_API_DEFAULT_URL=https://game-cn-test.jieyou.shop/lucky_gift/start_game
LUCKY_GIFT_API_ENABLED=true
LUCKY_GIFT_GO_ENABLED=true
LUCKY_GIFT_GO_TIMEOUT_MILLIS=10000
NACOS_CONFIG_HOST=127.0.0.1
NACOS_CONFIG_PORT=8848
NACOS_CONSOLE_HOST=127.0.0.1
NACOS_CONSOLE_PORT=8080
NACOS_HOST=nacos
NACOS_PORT=8848
NACOS_URL=http://127.0.0.1:8848/nacos
NACOS_USERNAME=
NACOS_PASSWORD=
NAMESPACE_ID=f7a8594e-090c-4830-a3ad-b5c0f9afcc07
NAMESPACE_NAME=chatapp3-local
TENCENT_SECRET_ID=IKIDMchhZEfrsiNo472DAtTpzzmLjttkOnyu
TENCENT_SECRET_KEY=nMkbLsGRO6ZqulSyJQJ0UjjU0KSKxOgl
TZ=Asia/Shanghai
WEEK_STAR_DEFAULT_SYS_ORIGIN=LIKEI
WEEK_STAR_RETRY_BATCH_SIZE=10
WEEK_STAR_RETRY_BLOCK_MILLIS=5000
WEEK_STAR_RETRY_CONSUMER_GROUP=week-star-retry
WEEK_STAR_RETRY_CONSUMER_NAME=week-star-retry-cron-sg-1
WEEK_STAR_RETRY_MIN_IDLE_MILLIS=60000
WEEK_STAR_RETRY_STREAM_KEY=week-star:reward-retry
WEEK_STAR_SETTLE_INTERVAL_SECONDS=60
WEEK_STAR_TIMEZONE=Asia/Riyadh

7
localbox/.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
.DS_Store
.venv/
__pycache__/
release.env
tmp/
var/
*.gz

25
localbox/AGENTS.md Normal file
View File

@ -0,0 +1,25 @@
# AGENTS Rules
`localbox部署` 只负责本地部署和本地联调。`chatapp3` 的线上部署已经迁移到 `hy-app-monitor`
## 仓库结构
- 仓库根目录保留统一入口 `./deploy.sh`
- 本地脚本和 compose 文件都放在仓库根目录
- `local-infra/` 只存放本地 MySQL / RocketMQ 初始化文件
- `.env.local` 放在仓库根目录
- `var/` 只存放本地缓存和构建产物,不提交到仓库
- 默认自动识别 `../../chatapp3/chatapp3-java``../../chatapp3/chatapp3-golang`;路径不同再用环境变量覆盖
## 必须遵守
- 只使用仓库根目录 `./deploy.sh` 作为推荐入口
- 本地构建依赖 `chatapp3-java``chatapp3-golang` sibling 仓库
- Java 私有 Maven 包只来自 `chatapp3-java/maven_private`
- 所有新增能力都必须服务于本地启动、本地构建、本地检查、本地重启或本地 Nacos 配置发布
## 禁止
- 禁止重新引入 `gitea/``tencent-prod/`、Jenkins、发布控制台、Harbor、远程部署、回滚、云侧同步相关代码
- 禁止重新引入 `.env.prod`、发布编排、线上 Nacos 发布、TAT、COS 等链路
- 禁止新增与本地部署无关的目录、脚本或入口

164
localbox/README.md Normal file
View File

@ -0,0 +1,164 @@
# localbox部署
`chatapp3` 的线上部署已经迁移到 `hy-app-monitor`。这个目录只保留本地部署、本地构建、本地检查和本地联调能力。
## 目录结构
```text
localbox部署/
├── deploy.sh # 统一入口
├── start_local_services.sh # 启动本地环境
├── build_local_backend.sh # 构建本地 Java 后端
├── restart_local_service.sh # 重启单个服务
├── check_local_services.sh # 检查本地服务状态
├── publish_local_nacos_configs.sh
├── local-services.compose.yml # 本地完整环境 compose
├── local-infra.compose.yml # 轻量基础设施 compose
├── local-infra/ # MySQL / RocketMQ 初始化文件
├── .env.local # 本地环境变量
└── var/ # 本地缓存和构建产物(已忽略)
```
## 前置条件
- macOS 已安装 Docker Desktop
- 如需重新编译 Java当前终端使用 `JDK 17`
- 工作区中存在 `chatapp3-java``chatapp3-golang`
- 目录根部 `.env.local` 已准备好本地配置
脚本会自动识别现有的 `../../chatapp3/chatapp3-java``../../chatapp3/chatapp3-golang`。如果本地目录不同,可以通过 `LIKEI_WORKSPACE_DIR``LIKEI_LOCAL_JAVA_REPO_DIR``LIKEI_LOCAL_GOLANG_REPO_DIR` 覆盖。
## 快速开始
推荐统一从 `hy-app-monitor/localbox部署` 目录执行:
```bash
./deploy.sh start
```
如果只想启动、不重新构建本地 Java jar
```bash
./deploy.sh start --skip-build
```
如果只起基础设施,不起业务服务:
```bash
./deploy.sh start --infra-only
```
如果只想单独起轻量基础设施MySQL + Redis
```bash
docker compose --env-file ./.env.local -f ./local-infra.compose.yml up -d
```
## 常用命令
重新构建全部 Java 服务:
```bash
./deploy.sh build
```
只构建指定服务:
```bash
./deploy.sh build auth live other
```
检查全部本地服务状态:
```bash
./deploy.sh check
```
重启单个服务:
```bash
./deploy.sh restart live
./deploy.sh restart golang
./deploy.sh restart mysql
./deploy.sh restart rocketmq
```
重新构建并重启某个 Java 服务:
```bash
./deploy.sh restart --rebuild auth
./deploy.sh restart --rebuild live
```
重新发布本地 Nacos 配置:
```bash
./deploy.sh publish-nacos
```
## 启动流程
默认启动流程如下:
1. 安装 `chatapp3-java/maven_private` 私有 Maven 包到本地 Maven 仓库。
2. 当前终端为 `JDK 17` 时,使用 `local` profile 构建本地 Java jar。
3. 启动本地 MySQL、Redis、Mongo、Nacos、Zookeeper。
4. 当 `LIKEI_ROCKETMQ_LOCAL_DISABLE=false` 时,额外启动本地 RocketMQ。
5. 发布本地 Nacos 配置。
6. 启动全部 Java 服务和 `chatapp3-golang`
脚本会优先复用当前可用的 Docker Desktop daemon如果 Docker Desktop 还没起来,会尝试自动拉起。
## RocketMQ 开关
本地幸运礼物全链路默认可以启用 RocketMQ。开关在目录根部 `.env.local`
```bash
LIKEI_ROCKETMQ_LOCAL_DISABLE=false
LIKEI_ROCKETMQ_ENDPOINT=rocketmq-proxy:8081
```
如果只想先把 `other` 跑起来、不走 MQ
```bash
LIKEI_ROCKETMQ_LOCAL_DISABLE=true
```
脚本会自动给 `other` 补上 `RocketMQAutoConfiguration` 的排除参数。
## 常用排查
查看 compose 状态:
```bash
docker compose --env-file ./.env.local -f ./local-services.compose.yml ps
```
查看服务日志:
```bash
docker compose --env-file ./.env.local -f ./local-services.compose.yml logs -f live
docker compose --env-file ./.env.local -f ./local-services.compose.yml logs -f golang
```
## 本地端口
- `gateway`: `1100`
- `auth`: `1000`
- `wallet`: `2000`
- `other`: `2400`
- `live`: `2500`
- `order`: `2600`
- `console`: `2700`
- `external`: `3000`
- `visual-monitor`: `8000`
- `game-fruit`: `8001`
- `scheduling`: `2800`
- `golang`: `2900`
- `nacos`: `8848`
- `rocketmq namesrv`: `19876`
- `rocketmq proxy http`: `18080`
- `rocketmq proxy grpc`: `18081`
- `mysql`: `13306`
- `redis`: `16379`
- `mongo`: `27018`

104
localbox/build_local_backend.sh Executable file
View File

@ -0,0 +1,104 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
# shellcheck disable=SC1091
source "$SCRIPT_DIR/common.sh"
load_local_env
MAVEN_REPO_LOCAL="${MAVEN_REPO_LOCAL:-$ROOT_DIR/var/local-maven-repo}"
INSTALL_PRIVATE_SCRIPT="$SCRIPT_DIR/install_private_maven.py"
usage() {
cat <<'EOF'
用法:
./build_local_backend.sh # 构建全部 Java 后端 jar需要 JDK 17
./build_local_backend.sh auth live # 只构建指定服务
EOF
}
all_java_services() {
cat <<'EOF'
auth
console
external
game-fruit
gateway
live
order
other
scheduling
visual-monitor
wallet
EOF
}
module_for_service() {
case "$1" in
gateway) echo "rc-gateway" ;;
auth) echo "rc-auth" ;;
external) echo "rc-service/rc-service-external/external-start" ;;
other) echo "rc-service/rc-service-other/other-start" ;;
live) echo "rc-service/rc-service-live/live-start" ;;
order) echo "rc-service/rc-service-order/order-start" ;;
wallet) echo "rc-service/rc-service-wallet/wallet-start" ;;
console) echo "rc-service/rc-service-console/console-start" ;;
visual-monitor) echo "rc-visual/visual-monitor" ;;
scheduling) echo "rc-scheduling" ;;
game-fruit) echo "rc-service-game/game-fruit" ;;
*)
return 1
;;
esac
}
select_services() {
if [ "$#" -eq 0 ]; then
all_java_services
return 0
fi
for service in "$@"; do
if ! module_for_service "$service" >/dev/null; then
echo "unknown java service: $service" >&2
usage >&2
exit 1
fi
printf '%s\n' "$service"
done
}
mkdir -p "$MAVEN_REPO_LOCAL"
require_java_17
python3 "$INSTALL_PRIVATE_SCRIPT" \
--source-root "$JAVA_REPO_DIR/maven_private" \
--maven-repo-local "$MAVEN_REPO_LOCAL"
SELECTED_SERVICES=()
while IFS= read -r service; do
[ -n "$service" ] || continue
SELECTED_SERVICES+=("$service")
done <<EOF
$(select_services "$@")
EOF
MODULES=()
for service in "${SELECTED_SERVICES[@]}"; do
MODULES+=("$(module_for_service "$service")")
done
MODULE_LIST="$(IFS=,; echo "${MODULES[*]}")"
echo "building java services: ${SELECTED_SERVICES[*]}"
mvn \
-P local \
-Dmaven.repo.local="$MAVEN_REPO_LOCAL" \
-DskipTests \
-Dmaven.test.skip=true \
package \
-pl "$MODULE_LIST" \
-am \
-f "$JAVA_REPO_DIR/pom.xml"

236
localbox/check_local_services.sh Executable file
View File

@ -0,0 +1,236 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
# shellcheck disable=SC1091
source "$SCRIPT_DIR/common.sh"
load_local_env
wait_for_docker
APP_SERVICES=(
auth
gateway
wallet
other
live
order
console
scheduling
external
visual-monitor
game-fruit
golang
)
INFRA_SERVICES=(
mysql
redis
mongo
nacos
zookeeper
)
if ! local_rocketmq_disabled; then
INFRA_SERVICES+=(
rocketmq-namesrv
rocketmq-broker
rocketmq-proxy
)
fi
FAILURES=0
container_name_for_service() {
case "$1" in
visual-monitor) printf '%s\n' "chatapp3-local-visual-monitor" ;;
game-fruit) printf '%s\n' "chatapp3-local-game-fruit" ;;
rocketmq-namesrv) printf '%s\n' "chatapp3-local-rocketmq-namesrv" ;;
rocketmq-broker) printf '%s\n' "chatapp3-local-rocketmq-broker" ;;
rocketmq-proxy) printf '%s\n' "chatapp3-local-rocketmq-proxy" ;;
*) printf '%s\n' "chatapp3-local-$1" ;;
esac
}
health_url_for_service() {
local service="$1"
case "$service" in
gateway)
printf 'http://127.0.0.1:%s/actuator/health\n' "$(service_port "$service")"
;;
console)
printf 'http://127.0.0.1:%s/console/actuator/health\n' "$(service_port "$service")"
;;
golang)
printf 'http://127.0.0.1:%s/health\n' "$(service_port "$service")"
;;
*)
printf 'http://127.0.0.1:%s/actuator/health\n' "$(service_port "$service")"
;;
esac
}
http_probe() {
local url="$1"
local body_file http_code
body_file="$(mktemp)"
http_code="$(curl -sS --max-time 5 -o "$body_file" -w '%{http_code}' "$url" || true)"
printf '%s\n' "$http_code"
cat "$body_file"
rm -f "$body_file"
}
print_row() {
printf '%-16s %-10s %-12s %s\n' "$1" "$2" "$3" "$4"
}
published_host_port() {
local container_name="$1"
local target_port="$2"
docker port "$container_name" "$target_port" 2>/dev/null | sed -n '1s/.*://p'
}
probe_app_service() {
local service="$1"
local container_name container_state health_url
local probe_payload http_code body status detail
container_name="$(container_name_for_service "$service")"
container_state="$(docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' "$container_name" 2>/dev/null || printf 'missing')"
health_url="$(health_url_for_service "$service")"
probe_payload="$(http_probe "$health_url")"
http_code="$(printf '%s\n' "$probe_payload" | sed -n '1p')"
body="$(printf '%s\n' "$probe_payload" | sed '1d')"
status="FAIL"
detail="container=${container_state} http=${http_code}"
if [ "$http_code" = "200" ]; then
if [ "$service" = "golang" ]; then
status="OK"
detail="container=${container_state} http=200 path=/health"
else
local actuator_status reason
actuator_status="$(printf '%s' "$body" | jq -r '.status // empty' 2>/dev/null || true)"
if [ "$actuator_status" = "UP" ]; then
status="OK"
detail="container=${container_state} actuator=UP"
else
reason="$(printf '%s' "$body" | jq -r '.components.refreshScope.details.error // .components.db.details.error // .error // empty' 2>/dev/null || true)"
detail="container=${container_state} actuator=${actuator_status:-unknown}"
if [ -n "$reason" ]; then
detail="$detail reason=$(printf '%s' "$reason" | tr '\n' ' ' | cut -c1-120)"
fi
fi
fi
else
local reason
reason="$(printf '%s' "$body" | jq -r '.errorMsg // .message // .status // empty' 2>/dev/null || true)"
if [ -n "$reason" ]; then
detail="$detail reason=$(printf '%s' "$reason" | tr '\n' ' ' | cut -c1-120)"
fi
fi
if [ "$status" != "OK" ]; then
FAILURES=$((FAILURES + 1))
fi
print_row "$service" "$status" "$container_state" "$detail"
}
probe_infra_service() {
local service="$1"
local container_name container_state status detail
container_name="$(container_name_for_service "$service")"
container_state="$(docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' "$container_name" 2>/dev/null || printf 'missing')"
status="FAIL"
detail="container=${container_state}"
case "$service" in
nacos)
local probe_payload http_code body nacos_status
probe_payload="$(http_probe "http://127.0.0.1:${LIKEI_LOCAL_NACOS_PORT}/nacos/actuator/health")"
http_code="$(printf '%s\n' "$probe_payload" | sed -n '1p')"
body="$(printf '%s\n' "$probe_payload" | sed '1d')"
nacos_status="$(printf '%s' "$body" | jq -r '.status // empty' 2>/dev/null || true)"
if [ "$http_code" = "200" ] && [ "$nacos_status" = "UP" ]; then
status="OK"
detail="container=${container_state} actuator=UP"
else
detail="container=${container_state} http=${http_code} actuator=${nacos_status:-unknown}"
fi
;;
zookeeper)
local zk_host_port
zk_host_port="$(published_host_port "$container_name" "2181/tcp")"
if [ -z "$zk_host_port" ]; then
zk_host_port="${LIKEI_LOCAL_ZOOKEEPER_EXPOSE_PORT}"
fi
if nc -z 127.0.0.1 "$zk_host_port" >/dev/null 2>&1; then
status="OK"
detail="container=${container_state} tcp=open port=${zk_host_port}"
else
detail="container=${container_state} tcp=not_ready port=${zk_host_port}"
fi
;;
rocketmq-namesrv)
if nc -z 127.0.0.1 "${LIKEI_LOCAL_ROCKETMQ_NAMESRV_PORT}" >/dev/null 2>&1; then
status="OK"
detail="container=${container_state} tcp=open port=${LIKEI_LOCAL_ROCKETMQ_NAMESRV_PORT}"
else
detail="container=${container_state} tcp=not_ready port=${LIKEI_LOCAL_ROCKETMQ_NAMESRV_PORT}"
fi
;;
rocketmq-broker)
if docker exec chatapp3-local-rocketmq-broker sh mqadmin clusterList -n rocketmq-namesrv:9876 2>/dev/null | grep -q "DefaultCluster"; then
status="OK"
detail="container=${container_state} cluster=DefaultCluster"
else
detail="container=${container_state} cluster=not_ready"
fi
;;
rocketmq-proxy)
if nc -z 127.0.0.1 "${LIKEI_LOCAL_ROCKETMQ_PROXY_GRPC_PORT}" >/dev/null 2>&1; then
status="OK"
detail="container=${container_state} tcp=open port=${LIKEI_LOCAL_ROCKETMQ_PROXY_GRPC_PORT}"
else
detail="container=${container_state} tcp=not_ready port=${LIKEI_LOCAL_ROCKETMQ_PROXY_GRPC_PORT}"
fi
;;
*)
if [ "$container_state" = "healthy" ] || [ "$container_state" = "running" ]; then
status="OK"
detail="container=${container_state}"
fi
;;
esac
if [ "$status" != "OK" ]; then
FAILURES=$((FAILURES + 1))
fi
print_row "$service" "$status" "$container_state" "$detail"
}
echo "App Services"
print_row "SERVICE" "RESULT" "CONTAINER" "DETAIL"
for service in "${APP_SERVICES[@]}"; do
probe_app_service "$service"
done
echo
echo "Infra Services"
print_row "SERVICE" "RESULT" "CONTAINER" "DETAIL"
for service in "${INFRA_SERVICES[@]}"; do
probe_infra_service "$service"
done
echo
if [ "$FAILURES" -eq 0 ]; then
echo "SUMMARY: all checked local backend services are healthy"
else
echo "SUMMARY: $FAILURES service(s) need attention"
exit 1
fi

344
localbox/common.sh Normal file
View File

@ -0,0 +1,344 @@
#!/usr/bin/env bash
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
COMPOSE_FILE="$ROOT_DIR/local-services.compose.yml"
ENV_FILE="${LIKEI_ENV_FILE:-$ROOT_DIR/.env.local}"
DOCKER_APP_BIN_DIR="/Applications/Docker.app/Contents/Resources/bin"
resolve_default_workspace_dir() {
local candidate
for candidate in "$ROOT_DIR/.." "$ROOT_DIR/../chatapp3" "$ROOT_DIR/../../chatapp3" "$ROOT_DIR/../.."; do
if [ -d "$candidate/chatapp3-java" ] && [ -d "$candidate/chatapp3-golang" ]; then
cd "$candidate" && pwd
return 0
fi
done
cd "$ROOT_DIR/.." && pwd
}
DEFAULT_WORKSPACE_DIR="$(resolve_default_workspace_dir)"
WORKSPACE_DIR="$DEFAULT_WORKSPACE_DIR"
JAVA_REPO_DIR="$WORKSPACE_DIR/chatapp3-java"
GOLANG_REPO_DIR="$WORKSPACE_DIR/chatapp3-golang"
configure_local_repo_paths() {
if [ -n "${LIKEI_WORKSPACE_DIR:-}" ]; then
WORKSPACE_DIR="$(cd "$LIKEI_WORKSPACE_DIR" && pwd)"
else
WORKSPACE_DIR="$DEFAULT_WORKSPACE_DIR"
fi
JAVA_REPO_DIR="${LIKEI_LOCAL_JAVA_REPO_DIR:-$WORKSPACE_DIR/chatapp3-java}"
GOLANG_REPO_DIR="${LIKEI_LOCAL_GOLANG_REPO_DIR:-$WORKSPACE_DIR/chatapp3-golang}"
export WORKSPACE_DIR
export JAVA_REPO_DIR
export GOLANG_REPO_DIR
export LIKEI_LOCAL_JAVA_REPO_DIR="$JAVA_REPO_DIR"
export LIKEI_LOCAL_GOLANG_REPO_DIR="$GOLANG_REPO_DIR"
}
configure_local_repo_paths
trim_spaces() {
local value="${1:-}"
value="${value#"${value%%[![:space:]]*}"}"
value="${value%"${value##*[![:space:]]}"}"
printf '%s' "$value"
}
strip_wrapping_quotes() {
local value="${1:-}"
if [ "${#value}" -ge 2 ]; then
case "$value" in
\"*\")
printf '%s' "${value:1:${#value}-2}"
return 0
;;
\'*\')
printf '%s' "${value:1:${#value}-2}"
return 0
;;
esac
fi
printf '%s' "$value"
}
is_truthy() {
case "${1:-}" in
1|true|TRUE|True|yes|YES|Yes|y|Y|on|ON|On)
return 0
;;
*)
return 1
;;
esac
}
local_rocketmq_disabled() {
is_truthy "${LIKEI_ROCKETMQ_LOCAL_DISABLE:-true}"
}
configure_local_runtime_defaults() {
if [ -z "${LIKEI_LOCAL_OTHER_JAVA_OPTS_EXTRA+x}" ]; then
if local_rocketmq_disabled; then
export LIKEI_LOCAL_OTHER_JAVA_OPTS_EXTRA="-Dspring.autoconfigure.exclude=com.red.circle.component.mq.config.RocketMQAutoConfiguration"
else
export LIKEI_LOCAL_OTHER_JAVA_OPTS_EXTRA=""
fi
fi
}
load_local_env() {
if [ -f "$ENV_FILE" ]; then
while IFS= read -r raw_line || [ -n "$raw_line" ]; do
local line key value
line="$(trim_spaces "$raw_line")"
[ -n "$line" ] || continue
case "$line" in
\#*)
continue
;;
export\ *)
line="${line#export }"
;;
esac
case "$line" in
*=*)
key="${line%%=*}"
value="${line#*=}"
key="$(trim_spaces "$key")"
value="$(trim_spaces "$value")"
value="$(strip_wrapping_quotes "$value")"
export "$key=$value"
;;
esac
done < "$ENV_FILE"
fi
export LIKEI_ENV_FILE="$ENV_FILE"
export LIKEI_ENV_MODE="local"
configure_local_repo_paths
configure_local_runtime_defaults
}
ensure_docker_cli() {
if command -v docker >/dev/null 2>&1; then
return 0
fi
if [ -d "$DOCKER_APP_BIN_DIR" ]; then
export PATH="$DOCKER_APP_BIN_DIR:$PATH"
fi
command -v docker >/dev/null 2>&1
}
wait_for_docker() {
ensure_docker_cli || {
echo "docker CLI not found" >&2
exit 1
}
if docker info >/dev/null 2>&1; then
return 0
fi
if [ -d "/Applications/Docker.app" ]; then
open -a Docker >/dev/null 2>&1 || true
fi
for _ in $(seq 1 120); do
if docker info >/dev/null 2>&1; then
return 0
fi
sleep 2
done
echo "docker daemon did not become ready in time" >&2
exit 1
}
compose() {
docker compose --env-file "$ENV_FILE" -f "$COMPOSE_FILE" "$@"
}
wait_http() {
local url="$1"
local retries="${2:-120}"
for _ in $(seq 1 "$retries"); do
if curl -fsS "$url" >/dev/null 2>&1; then
return 0
fi
sleep 2
done
echo "service did not become healthy in time: $url" >&2
exit 1
}
wait_tcp_port() {
local host="$1"
local port="$2"
local retries="${3:-120}"
for _ in $(seq 1 "$retries"); do
if nc -z "$host" "$port" >/dev/null 2>&1; then
return 0
fi
sleep 2
done
echo "tcp port did not become ready in time: $host:$port" >&2
exit 1
}
wait_container_healthy() {
local container_name="$1"
local retries="${2:-120}"
for _ in $(seq 1 "$retries"); do
local state
state="$(docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' "$container_name" 2>/dev/null || true)"
if [ "$state" = "healthy" ] || [ "$state" = "running" ]; then
return 0
fi
sleep 2
done
echo "container did not become healthy in time: $container_name" >&2
exit 1
}
wait_rocketmq_cluster() {
local retries="${1:-120}"
for _ in $(seq 1 "$retries"); do
if docker exec chatapp3-local-rocketmq-broker sh mqadmin clusterList -n rocketmq-namesrv:9876 2>/dev/null | grep -q "DefaultCluster"; then
return 0
fi
sleep 2
done
echo "rocketmq cluster did not become ready in time: DefaultCluster" >&2
exit 1
}
wait_local_rocketmq() {
if local_rocketmq_disabled; then
return 0
fi
require_env LIKEI_LOCAL_ROCKETMQ_NAMESRV_PORT
require_env LIKEI_LOCAL_ROCKETMQ_PROXY_GRPC_PORT
wait_container_healthy chatapp3-local-rocketmq-namesrv 120
wait_container_healthy chatapp3-local-rocketmq-broker 120
wait_container_healthy chatapp3-local-rocketmq-proxy 120
wait_tcp_port 127.0.0.1 "${LIKEI_LOCAL_ROCKETMQ_NAMESRV_PORT}" 120
wait_rocketmq_cluster 120
wait_tcp_port 127.0.0.1 "${LIKEI_LOCAL_ROCKETMQ_PROXY_GRPC_PORT}" 120
}
require_env() {
local key="$1"
if [ -z "${!key:-}" ]; then
echo "required environment variable is missing: $key" >&2
exit 1
fi
}
java_major_version() {
if ! command -v java >/dev/null 2>&1; then
return 1
fi
local raw_version major
raw_version="$(java -version 2>&1 | awk -F '"' '/version/ {print $2; exit}')"
[ -n "$raw_version" ] || return 1
major="${raw_version%%.*}"
if [ "$major" = "1" ]; then
major="$(printf '%s\n' "$raw_version" | awk -F. '{print $2}')"
fi
printf '%s\n' "$major"
}
require_java_17() {
local major
major="$(java_major_version || true)"
if [ -z "$major" ]; then
echo "java not found; rebuilding local Java services requires JDK 17" >&2
exit 1
fi
if [ "$major" != "17" ]; then
echo "rebuilding local Java services requires JDK 17; current java major version is $major" >&2
exit 1
fi
}
is_java_service() {
case "$1" in
gateway|auth|external|other|live|order|wallet|console|visual-monitor|scheduling|game-fruit)
return 0
;;
*)
return 1
;;
esac
}
java_artifact_path_for_service() {
case "$1" in
gateway) printf '%s\n' "$JAVA_REPO_DIR/rc-gateway/target/rc-gateway-1.0.0-local.jar" ;;
auth) printf '%s\n' "$JAVA_REPO_DIR/rc-auth/target/rc-auth-1.0.0-local.jar" ;;
external) printf '%s\n' "$JAVA_REPO_DIR/rc-service/rc-service-external/external-start/target/rc-service-external-1.0.0-local.jar" ;;
other) printf '%s\n' "$JAVA_REPO_DIR/rc-service/rc-service-other/other-start/target/rc-service-other-1.0.0-local.jar" ;;
live) printf '%s\n' "$JAVA_REPO_DIR/rc-service/rc-service-live/live-start/target/rc-service-live-1.0.0-local.jar" ;;
order) printf '%s\n' "$JAVA_REPO_DIR/rc-service/rc-service-order/order-start/target/rc-service-order-1.0.0-local.jar" ;;
wallet) printf '%s\n' "$JAVA_REPO_DIR/rc-service/rc-service-wallet/wallet-start/target/rc-service-wallet-1.0.0-local.jar" ;;
console) printf '%s\n' "$JAVA_REPO_DIR/rc-service/rc-service-console/console-start/target/rc-service-console-1.0.0-local.jar" ;;
visual-monitor) printf '%s\n' "$JAVA_REPO_DIR/rc-visual/visual-monitor/target/visual-monitor-1.0.0-local.jar" ;;
scheduling) printf '%s\n' "$JAVA_REPO_DIR/rc-scheduling/target/rc-scheduling-1.0.0-local.jar" ;;
game-fruit) printf '%s\n' "$JAVA_REPO_DIR/rc-service-game/game-fruit/target/game-fruit-1.0.0-local.jar" ;;
*)
return 1
;;
esac
}
all_local_java_jars_present() {
local service artifact_path
for service in gateway auth external other live order wallet console visual-monitor scheduling game-fruit; do
artifact_path="$(java_artifact_path_for_service "$service")" || return 1
if [ ! -f "$artifact_path" ]; then
echo "missing local jar: $artifact_path" >&2
return 1
fi
done
}
service_port() {
local env_key
case "$1" in
gateway) env_key="LIKEI_LOCAL_GATEWAY_PORT" ;;
auth) env_key="LIKEI_LOCAL_AUTH_PORT" ;;
wallet) env_key="LIKEI_LOCAL_WALLET_PORT" ;;
other) env_key="LIKEI_LOCAL_OTHER_PORT" ;;
live) env_key="LIKEI_LOCAL_LIVE_PORT" ;;
order) env_key="LIKEI_LOCAL_ORDER_PORT" ;;
console) env_key="LIKEI_LOCAL_CONSOLE_PORT" ;;
scheduling) env_key="LIKEI_LOCAL_SCHEDULING_PORT" ;;
golang) env_key="LIKEI_LOCAL_GOLANG_PORT" ;;
external) env_key="LIKEI_LOCAL_EXTERNAL_PORT" ;;
visual-monitor) env_key="LIKEI_LOCAL_VISUAL_MONITOR_PORT" ;;
game-fruit) env_key="LIKEI_LOCAL_GAME_FRUIT_PORT" ;;
*)
return 1
;;
esac
require_env "$env_key"
printf '%s\n' "${!env_key}"
}
wait_service_port() {
local service="$1"
local retries="${2:-120}"
local port
port="$(service_port "$service")" || {
echo "unknown app service port: $service" >&2
exit 1
}
wait_tcp_port 127.0.0.1 "$port" "$retries"
}

326
localbox/create_local_app_user.sh Executable file
View File

@ -0,0 +1,326 @@
#!/usr/bin/env bash
set -euo pipefail
# ===== 修改这里即可 =====
ACCOUNT="${ACCOUNT:-1234567}"
PASSWORD="${PASSWORD:-$ACCOUNT}"
GATEWAY_BASE_URL="${GATEWAY_BASE_URL:-http://192.168.110.64:1100}"
SYS_ORIGIN="${SYS_ORIGIN:-LIKEI}"
SYS_ORIGIN_CHILD="${SYS_ORIGIN_CHILD:-LIKEI}"
NICKNAME="${NICKNAME:-local-${ACCOUNT}}"
PHONE_PREFIX="${PHONE_PREFIX:-86}"
PHONE_NUMBER="${PHONE_NUMBER:-138$(date +%d%H%M%S)}"
OPEN_ID="${OPEN_ID:-local-${ACCOUNT}-${PHONE_NUMBER}}"
COUNTRY_CODE="${COUNTRY_CODE:-CN}"
COUNTRY_NAME="${COUNTRY_NAME:-China}"
COUNTRY_ID="${COUNTRY_ID:-}"
MYSQL_CONTAINER="${MYSQL_CONTAINER:-chatapp3-local-mysql}"
MYSQL_DATABASE="${MYSQL_DATABASE:-likei}"
MYSQL_USER="${MYSQL_USER:-root}"
MYSQL_PASSWORD="${MYSQL_PASSWORD:-123456}"
REDIS_CONTAINER="${REDIS_CONTAINER:-chatapp3-local-redis}"
REQ_CLIENT="${REQ_CLIENT:-Android}"
REQ_APP_INTEL="${REQ_APP_INTEL:-version=1.0.0;build=1;model=LocalScript;sysVersion=Mac;channel=local;}"
REQ_LANG="${REQ_LANG:-zh-CN}"
REQ_ZONE="${REQ_ZONE:-Asia/Shanghai}"
REQ_IMEI="${REQ_IMEI:-local-create-app-user-${ACCOUNT}}"
HTTP_TIMEOUT="${HTTP_TIMEOUT:-15}"
# ========================
GATEWAY_BASE_URL="${GATEWAY_BASE_URL%/}"
log() {
printf '[create-local-app-user] %s\n' "$*"
}
die() {
printf '[create-local-app-user] ERROR: %s\n' "$*" >&2
exit 1
}
require_cmd() {
command -v "$1" >/dev/null 2>&1 || die "缺少命令: $1"
}
sql_quote() {
printf "%s" "$1" | sed "s/'/''/g"
}
mysql_exec() {
docker exec -i -e MYSQL_PWD="$MYSQL_PASSWORD" "$MYSQL_CONTAINER" \
mysql -u"$MYSQL_USER" "$MYSQL_DATABASE"
}
mysql_scalar() {
docker exec -i -e MYSQL_PWD="$MYSQL_PASSWORD" "$MYSQL_CONTAINER" \
mysql -u"$MYSQL_USER" -N -B "$MYSQL_DATABASE" -e "$1" | head -n 1
}
json_login_payload() {
ACCOUNT="$ACCOUNT" PASSWORD="$PASSWORD" python3 - <<'PY'
import json
import os
print(json.dumps({
"account": os.environ["ACCOUNT"],
"pwd": os.environ["PASSWORD"],
}, ensure_ascii=False))
PY
}
json_register_payload() {
ACCOUNT="$ACCOUNT" PASSWORD="$PASSWORD" NICKNAME="$NICKNAME" OPEN_ID="$OPEN_ID" \
PHONE_PREFIX="$PHONE_PREFIX" PHONE_NUMBER="$PHONE_NUMBER" \
COUNTRY_CODE="$COUNTRY_CODE" COUNTRY_NAME="$COUNTRY_NAME" COUNTRY_ID="$COUNTRY_ID" \
python3 - <<'PY'
import json
import os
profile = {
"userNickname": os.environ["NICKNAME"],
"userAvatar": "",
"userSex": 1,
"bornYear": 1998,
"bornMonth": 1,
"bornDay": 1,
}
if os.environ.get("COUNTRY_CODE"):
profile["countryCode"] = os.environ["COUNTRY_CODE"]
if os.environ.get("COUNTRY_NAME"):
profile["countryName"] = os.environ["COUNTRY_NAME"]
if os.environ.get("COUNTRY_ID"):
profile["countryId"] = int(os.environ["COUNTRY_ID"])
print(json.dumps({
"type": "MOBILE",
"openId": os.environ["OPEN_ID"],
"profile": profile,
"mobile": {
"phonePrefix": int(os.environ["PHONE_PREFIX"]),
"phoneNumber": os.environ["PHONE_NUMBER"],
"pwd": os.environ["PASSWORD"],
"code": "000000",
},
}, ensure_ascii=False))
PY
}
api_post() {
local path="$1"
local body="$2"
local output="$3"
local code
code="$(curl -sS -m "$HTTP_TIMEOUT" -o "$output" -w "%{http_code}" \
-X POST "${GATEWAY_BASE_URL}${path}" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H "Req-Sys-Origin: origin=${SYS_ORIGIN};originChild=${SYS_ORIGIN_CHILD}" \
-H "Req-Client: ${REQ_CLIENT}" \
-H "Req-App-Intel: ${REQ_APP_INTEL}" \
-H "Req-Lang: ${REQ_LANG}" \
-H "Req-Zone: ${REQ_ZONE}" \
-H "req-imei: ${REQ_IMEI}" \
--data "$body" || true)"
[[ "$code" == 2* ]]
}
json_status_ok() {
python3 - "$1" <<'PY'
import json
import sys
try:
data = json.load(open(sys.argv[1], encoding="utf-8"))
except Exception:
sys.exit(1)
if isinstance(data, dict) and "status" in data:
sys.exit(0 if data.get("status") is True else 1)
sys.exit(0)
PY
}
print_api_error() {
python3 - "$1" <<'PY'
import json
import sys
text = open(sys.argv[1], encoding="utf-8").read()
try:
data = json.loads(text)
except Exception:
print(text)
sys.exit(0)
if isinstance(data, dict):
msg = data.get("errorMsg") or data.get("message") or data
print(msg)
else:
print(data)
PY
}
extract_user_id() {
python3 - "$1" <<'PY'
import json
import sys
data = json.load(open(sys.argv[1], encoding="utf-8"))
body = data.get("body", data) if isinstance(data, dict) else {}
profile = body.get("userProfile", {}) if isinstance(body, dict) else {}
user_id = profile.get("id") or profile.get("userId") or body.get("userId")
print(user_id or "")
PY
}
extract_account() {
python3 - "$1" <<'PY'
import json
import sys
data = json.load(open(sys.argv[1], encoding="utf-8"))
body = data.get("body", data) if isinstance(data, dict) else {}
profile = body.get("userProfile", {}) if isinstance(body, dict) else {}
print(profile.get("account") or "")
PY
}
try_login() {
local output="$1"
local payload
payload="$(json_login_payload)"
api_post "/auth/account/login" "$payload" "$output" && json_status_ok "$output"
}
generate_password_hash() {
local raw
raw="$(htpasswd -bnBC 10 '' "$PASSWORD" | sed 's/^://')"
printf '{bcrypt}%s' "$raw"
}
ensure_account_password() {
local user_id="$1"
local password_hash="$2"
local account_q origin_q origin_child_q hash_q
account_q="$(sql_quote "$ACCOUNT")"
origin_q="$(sql_quote "$SYS_ORIGIN")"
origin_child_q="$(sql_quote "$SYS_ORIGIN_CHILD")"
hash_q="$(sql_quote "$password_hash")"
mysql_exec <<SQL
START TRANSACTION;
SET @user_id := ${user_id};
SET @account := '${account_q}';
SET @origin := '${origin_q}';
SET @origin_child := '${origin_child_q}';
SET @hash := '${hash_q}';
SET @id_seed := CAST(UNIX_TIMESTAMP(CURRENT_TIMESTAMP(6)) * 1000000 AS UNSIGNED);
UPDATE user_base_info
SET account = @account, origin_sys = @origin, sys_origin_child = @origin_child, update_time = NOW()
WHERE id = @user_id
LIMIT 1;
DELETE FROM user_account_auth WHERE user_id = @user_id;
INSERT INTO user_account_auth (id, user_id, pwd, is_del, create_time, update_time)
VALUES (@id_seed + 1, @user_id, @hash, 0, NOW(), NOW());
DELETE FROM user_auth_type WHERE user_id = @user_id AND type = 'ACCOUNT';
INSERT INTO user_auth_type (id, user_id, type, open_id, is_del, create_time, update_time)
VALUES (@id_seed + 2, @user_id, 'ACCOUNT', CAST(@user_id AS CHAR), 0, NOW(), NOW());
COMMIT;
SQL
}
clear_login_cache() {
local user_id="$1"
if docker ps --format '{{.Names}}' | grep -qx "$REDIS_CONTAINER"; then
docker exec "$REDIS_CONTAINER" sh -lc "
for key in \$(redis-cli --scan --pattern 'ACCOUNT_LOGIN_TIME*_${user_id}'); do redis-cli DEL \"\$key\" >/dev/null; done
redis-cli DEL 'USER:HASH:${user_id}' 'USER:PROFILE:${user_id}' 'USER:USER_RUN_PROFILE:${user_id}' 'USER:USER_REGION:${user_id}' >/dev/null
" >/dev/null || true
fi
}
main() {
require_cmd curl
require_cmd docker
require_cmd python3
require_cmd htpasswd
docker ps --format '{{.Names}}' | grep -qx "$MYSQL_CONTAINER" \
|| die "MySQL 容器未运行: ${MYSQL_CONTAINER}"
log "目标账号: ${ACCOUNT}"
log "网关地址: ${GATEWAY_BASE_URL}"
local login_response
login_response="$(mktemp)"
if try_login "$login_response"; then
log "账号已可登录无需创建。userId=$(extract_user_id "$login_response") account=$(extract_account "$login_response")"
rm -f "$login_response"
return
fi
local login_error
login_error="$(print_api_error "$login_response")"
rm -f "$login_response"
if [[ -z "$login_error" || "$login_error" == *"Connection refused"* || "$login_error" == *"timed out"* || "$login_error" == *"No route"* ]]; then
die "登录接口不可用,请先检查 GATEWAY_BASE_URL/auth/other 服务。原因: ${login_error:-empty response}"
fi
log "直接登录未通过,开始创建或补齐本地账号密码。原因: ${login_error}"
local account_q origin_q existing_user_id user_id
account_q="$(sql_quote "$ACCOUNT")"
origin_q="$(sql_quote "$SYS_ORIGIN")"
existing_user_id="$(mysql_scalar "SELECT id FROM user_base_info WHERE account='${account_q}' AND origin_sys='${origin_q}' AND is_del=0 LIMIT 1;")"
if [[ -n "$existing_user_id" ]]; then
user_id="$existing_user_id"
log "账号已存在重置账号密码登录信息。userId=${user_id}"
else
local create_response create_payload generated_account
create_response="$(mktemp)"
create_payload="$(json_register_payload)"
log "账号不存在,先走 App 注册接口创建完整用户。phone=+${PHONE_PREFIX} ${PHONE_NUMBER}"
api_post "/auth/account/create" "$create_payload" "$create_response" \
|| die "注册接口请求失败: $(print_api_error "$create_response")"
json_status_ok "$create_response" \
|| die "注册接口返回失败: $(print_api_error "$create_response")"
user_id="$(extract_user_id "$create_response")"
generated_account="$(extract_account "$create_response")"
rm -f "$create_response"
[[ -n "$user_id" ]] || die "注册成功但未解析到 userId"
log "注册成功userId=${user_id} generatedAccount=${generated_account},开始绑定指定账号 ${ACCOUNT}"
fi
ensure_account_password "$user_id" "$(generate_password_hash)"
clear_login_cache "$user_id"
local verify_response
verify_response="$(mktemp)"
if try_login "$verify_response"; then
log "验证登录成功。userId=$(extract_user_id "$verify_response") account=$(extract_account "$verify_response") password=${PASSWORD}"
rm -f "$verify_response"
return
fi
die "账号已写入,但登录验证失败: $(print_api_error "$verify_response")"
}
main "$@"

65
localbox/deploy.sh Executable file
View File

@ -0,0 +1,65 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
LOCAL_DIR="$ROOT_DIR"
usage() {
cat <<'EOF'
用法:
./deploy.sh start [--skip-build] [--infra-only]
./deploy.sh build [service...]
./deploy.sh restart [--rebuild] <service>
./deploy.sh check
./deploy.sh publish-nacos
说明:
当前仓库只保留本地部署和本地联调能力。
如果第一个参数是 `--skip-build``--infra-only`,会默认转给 `start`
EOF
}
run_local_script() {
local script_name="$1"
shift
exec "$LOCAL_DIR/$script_name" "$@"
}
if [ "$#" -eq 0 ]; then
usage
exit 0
fi
case "$1" in
--skip-build|--infra-only)
run_local_script start_local_services.sh "$@"
;;
start)
shift
run_local_script start_local_services.sh "$@"
;;
build)
shift
run_local_script build_local_backend.sh "$@"
;;
restart)
shift
run_local_script restart_local_service.sh "$@"
;;
check)
shift
run_local_script check_local_services.sh "$@"
;;
publish-nacos)
shift
run_local_script publish_local_nacos_configs.sh "$@"
;;
-h|--help|help)
usage
;;
*)
echo "unknown command: $1" >&2
usage >&2
exit 1
;;
esac

View File

@ -0,0 +1,66 @@
#!/usr/bin/env python3
from __future__ import annotations
import argparse
import subprocess
from pathlib import Path
def run(command: list[str], cwd: Path | None = None) -> None:
subprocess.run(command, cwd=cwd, check=True)
def install_private_artifacts(maven_private_root: Path, maven_repo_local: str) -> int:
if not maven_private_root.exists():
raise SystemExit(f"missing private maven directory: {maven_private_root}")
install_count = 0
for version_dir in sorted(path for path in maven_private_root.glob("*/*") if path.is_dir()):
pom_candidates = sorted(version_dir.glob("*.pom"))
jar_candidates = sorted(
path
for path in version_dir.glob("*.jar")
if path.is_file() and not path.name.startswith("original-")
)
if not pom_candidates:
continue
pom_file = pom_candidates[0]
command = [
"mvn",
f"-Dmaven.repo.local={maven_repo_local}",
"install:install-file",
f"-DpomFile={pom_file}",
"-DgeneratePom=false",
]
if jar_candidates:
jar_file = jar_candidates[0]
print(f"install private maven artifact: {jar_file.name}", flush=True)
command.append(f"-Dfile={jar_file}")
else:
print(f"install private maven pom: {pom_file.name}", flush=True)
command.extend(
[
f"-Dfile={pom_file}",
"-Dpackaging=pom",
]
)
run(command)
install_count += 1
return install_count
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--source-root", type=Path, required=True)
parser.add_argument("--maven-repo-local", required=True)
args = parser.parse_args()
installed = install_private_artifacts(args.source_root, args.maven_repo_local)
print(f"installed private artifacts: {installed}", flush=True)
if __name__ == "__main__":
main()

View File

@ -0,0 +1,49 @@
name: chatapp3-local-infra
services:
mysql:
env_file:
- ./.env.local
image: docker.m.daocloud.io/library/mysql:8.4
container_name: likei-local-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${LIKEI_LOCAL_MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${LIKEI_LOCAL_MYSQL_DATABASE}
TZ: ${TZ}
ports:
- "${LIKEI_LOCAL_MYSQL_INFRA_EXPOSE_PORT}:3306"
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-time-zone=+08:00
- --mysql-native-password=ON
volumes:
- likei-local-mysql-data:/var/lib/mysql
- ./local-infra/mysql/init:/docker-entrypoint-initdb.d:ro
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -uroot -p${LIKEI_LOCAL_MYSQL_ROOT_PASSWORD} --silent"]
interval: 5s
timeout: 5s
retries: 30
redis:
env_file:
- ./.env.local
image: docker.m.daocloud.io/library/redis:7-alpine
container_name: likei-local-redis
restart: unless-stopped
ports:
- "${LIKEI_LOCAL_REDIS_INFRA_EXPOSE_PORT}:6379"
command: ["redis-server", "--appendonly", "yes"]
volumes:
- likei-local-redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 30
volumes:
likei-local-mysql-data:
likei-local-redis-data:

View File

@ -0,0 +1,15 @@
CREATE TABLE IF NOT EXISTS user_base_info (
id BIGINT NOT NULL PRIMARY KEY,
account VARCHAR(64) DEFAULT NULL,
user_avatar VARCHAR(255) DEFAULT NULL,
user_nickname VARCHAR(255) DEFAULT NULL,
origin_sys VARCHAR(32) DEFAULT NULL,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS invite_code_mapping (
user_id BIGINT NOT NULL PRIMARY KEY,
invite_code VARCHAR(32) NOT NULL,
account VARCHAR(64) DEFAULT NULL,
UNIQUE KEY uk_invite_code (invite_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

View File

@ -0,0 +1,8 @@
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
autoCreateTopicEnable=true

View File

@ -0,0 +1,48 @@
#!/usr/bin/env sh
set -eu
NAMESRV_ADDR="${NAMESRV_ADDR:-rocketmq-namesrv:9876}"
ROCKETMQ_CLUSTER_NAME="${ROCKETMQ_CLUSTER_NAME:-DefaultCluster}"
ROCKETMQ_BOOTSTRAP_TOPICS="${ROCKETMQ_BOOTSTRAP_TOPICS:-DefaultHeartBeatSyncerTopic}"
echo "waiting for RocketMQ cluster ${ROCKETMQ_CLUSTER_NAME} via ${NAMESRV_ADDR}"
i=0
while [ "$i" -lt 60 ]; do
if sh mqadmin clusterList -n "$NAMESRV_ADDR" >/tmp/rocketmq-cluster.txt 2>/tmp/rocketmq-cluster.err; then
if grep -q "$ROCKETMQ_CLUSTER_NAME" /tmp/rocketmq-cluster.txt; then
break
fi
fi
i=$((i + 1))
sleep 2
done
if [ "$i" -ge 60 ]; then
echo "rocketmq cluster did not become ready: ${ROCKETMQ_CLUSTER_NAME}" >&2
cat /tmp/rocketmq-cluster.err >&2 || true
exit 1
fi
old_ifs="$IFS"
IFS=','
set -- $ROCKETMQ_BOOTSTRAP_TOPICS
IFS="$old_ifs"
for topic in "$@"; do
echo "ensuring RocketMQ topic ${topic}"
i=0
while [ "$i" -lt 20 ]; do
if sh mqadmin updateTopic -n "$NAMESRV_ADDR" -c "$ROCKETMQ_CLUSTER_NAME" -t "$topic"; then
break
fi
i=$((i + 1))
sleep 2
done
if [ "$i" -ge 20 ]; then
echo "failed to initialize RocketMQ topic: ${topic}" >&2
exit 1
fi
done
exec sh mqproxy -n "$NAMESRV_ADDR"

View File

@ -0,0 +1,372 @@
name: chatapp3-local
x-env-file: &env-file
env_file:
- ./.env.local
x-java-environment: &java-environment
JAVA_OPTS: ${LIKEI_LOCAL_JAVA_OPTS:--Xms128m -Xmx512m}
FEIGN_GATEWAY_URL: http://gateway:1100
FEIGN_AUTH_URL: http://auth:1000
FEIGN_WALLET_URL: http://wallet:2000
FEIGN_OTHER_URL: http://other:2400
FEIGN_LIVE_URL: http://live:2500
FEIGN_ORDER_URL: http://order:2600
FEIGN_CONSOLE_URL: http://console:2700
FEIGN_EXTERNAL_URL: http://external:3000
x-java-service: &java-service
<<: *env-file
image: eclipse-temurin:17-jre
restart: unless-stopped
working_dir: /app
environment:
<<: *java-environment
command:
- sh
- -c
- java $$JAVA_OPTS -jar /app/app.jar
networks:
- localnet
services:
mysql:
<<: *env-file
image: mysql:8.4
container_name: chatapp3-local-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${LIKEI_LOCAL_MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${LIKEI_LOCAL_MYSQL_DATABASE}
TZ: ${TZ}
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-time-zone=+08:00
- --mysql-native-password=ON
ports:
- "${LIKEI_LOCAL_MYSQL_EXPOSE_PORT}:3306"
volumes:
- chatapp3-local-mysql-data:/var/lib/mysql
- ./local-infra/mysql/init:/docker-entrypoint-initdb.d:ro
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -uroot -p${LIKEI_LOCAL_MYSQL_ROOT_PASSWORD} --silent"]
interval: 5s
timeout: 5s
retries: 30
networks:
- localnet
redis:
<<: *env-file
image: redis:7-alpine
container_name: chatapp3-local-redis
restart: unless-stopped
command: ["redis-server", "--appendonly", "yes"]
ports:
- "${LIKEI_LOCAL_REDIS_EXPOSE_PORT}:6379"
volumes:
- chatapp3-local-redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 30
networks:
- localnet
mongo:
<<: *env-file
image: mongo:7.0
container_name: chatapp3-local-mongo
restart: unless-stopped
environment:
MONGO_INITDB_ROOT_USERNAME: ${LIKEI_LOCAL_MONGO_ROOT_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${LIKEI_LOCAL_MONGO_ROOT_PASSWORD}
TZ: ${TZ}
ports:
- "${LIKEI_LOCAL_MONGO_EXPOSE_PORT}:27017"
volumes:
- chatapp3-local-mongo-data:/data/db
healthcheck:
test:
[
"CMD-SHELL",
"mongosh --quiet mongodb://${LIKEI_LOCAL_MONGO_ROOT_USERNAME}:${LIKEI_LOCAL_MONGO_ROOT_PASSWORD}@127.0.0.1:27017/admin --eval 'db.runCommand({ ping: 1 }).ok' | grep -q 1",
]
interval: 5s
timeout: 5s
retries: 30
networks:
- localnet
nacos:
<<: *env-file
image: nacos/nacos-server:v2.4.0
container_name: chatapp3-local-nacos
restart: unless-stopped
environment:
MODE: standalone
PREFER_HOST_MODE: hostname
TZ: ${TZ}
NACOS_AUTH_ENABLE: ${LIKEI_LOCAL_NACOS_AUTH_ENABLE}
JVM_XMS: ${LIKEI_LOCAL_NACOS_JVM_XMS}
JVM_XMX: ${LIKEI_LOCAL_NACOS_JVM_XMX}
JVM_XMN: ${LIKEI_LOCAL_NACOS_JVM_XMN}
ports:
- "${LIKEI_LOCAL_NACOS_PORT}:8848"
- "${LIKEI_LOCAL_NACOS_CONSOLE_PORT}:8080"
- "${LIKEI_LOCAL_NACOS_CLIENT_GRPC_PORT}:9848"
networks:
- localnet
zookeeper:
<<: *env-file
image: zookeeper:3.9
container_name: chatapp3-local-zookeeper
restart: unless-stopped
environment:
TZ: ${TZ}
ports:
- "${LIKEI_LOCAL_ZOOKEEPER_EXPOSE_PORT}:2181"
networks:
- localnet
rocketmq-namesrv:
<<: *env-file
image: apache/rocketmq:${LIKEI_LOCAL_ROCKETMQ_IMAGE_TAG:-5.3.2}
container_name: chatapp3-local-rocketmq-namesrv
restart: unless-stopped
command: ["sh", "mqnamesrv"]
environment:
TZ: ${TZ}
JAVA_OPT_EXT: ${LIKEI_LOCAL_ROCKETMQ_NAMESRV_JAVA_OPTS:--Xms128m -Xmx128m -Xmn64m}
ports:
- "${LIKEI_LOCAL_ROCKETMQ_NAMESRV_PORT}:9876"
networks:
- localnet
rocketmq-init:
<<: *env-file
image: apache/rocketmq:${LIKEI_LOCAL_ROCKETMQ_IMAGE_TAG:-5.3.2}
container_name: chatapp3-local-rocketmq-init
restart: "no"
user: root
command:
- sh
- -c
- mkdir -p /home/rocketmq/store && chown -R rocketmq:root /home/rocketmq/store
volumes:
- chatapp3-local-rocketmq-store:/home/rocketmq/store
networks:
- localnet
rocketmq-broker:
<<: *env-file
image: apache/rocketmq:${LIKEI_LOCAL_ROCKETMQ_IMAGE_TAG:-5.3.2}
container_name: chatapp3-local-rocketmq-broker
restart: unless-stopped
depends_on:
rocketmq-namesrv:
condition: service_started
rocketmq-init:
condition: service_completed_successfully
command: ["sh", "mqbroker", "-n", "rocketmq-namesrv:9876", "-c", "/home/rocketmq/rocketmq-5.3.2/conf/broker.conf"]
environment:
TZ: ${TZ}
NAMESRV_ADDR: rocketmq-namesrv:9876
JAVA_OPT_EXT: ${LIKEI_LOCAL_ROCKETMQ_BROKER_JAVA_OPTS:--Xms256m -Xmx256m -Xmn128m}
volumes:
- ./local-infra/rocketmq/broker.conf:/home/rocketmq/rocketmq-5.3.2/conf/broker.conf:ro
- chatapp3-local-rocketmq-store:/home/rocketmq/store
networks:
- localnet
rocketmq-proxy:
<<: *env-file
image: apache/rocketmq:${LIKEI_LOCAL_ROCKETMQ_IMAGE_TAG:-5.3.2}
container_name: chatapp3-local-rocketmq-proxy
restart: unless-stopped
depends_on:
- rocketmq-namesrv
- rocketmq-broker
command: ["/bin/sh", "/opt/rocketmq-ext/start-proxy.sh"]
environment:
TZ: ${TZ}
NAMESRV_ADDR: rocketmq-namesrv:9876
ROCKETMQ_CLUSTER_NAME: DefaultCluster
ROCKETMQ_BOOTSTRAP_TOPICS: DefaultHeartBeatSyncerTopic,RC_DEFAULT_APP_ORDER,RC_DEFAULT_APP_ORDINARY,RC_DEFAULT_APP_DELAYED
JAVA_OPT_EXT: ${LIKEI_LOCAL_ROCKETMQ_PROXY_JAVA_OPTS:--Xms128m -Xmx256m -Xmn64m}
ports:
- "${LIKEI_LOCAL_ROCKETMQ_PROXY_HTTP_PORT}:8080"
- "${LIKEI_LOCAL_ROCKETMQ_PROXY_GRPC_PORT}:8081"
volumes:
- ./local-infra/rocketmq/start-proxy.sh:/opt/rocketmq-ext/start-proxy.sh:ro
networks:
- localnet
gateway:
<<: *java-service
container_name: chatapp3-local-gateway
depends_on:
- nacos
environment:
<<: *java-environment
FEIGN_AUTH_URL: http://rc-auth
ports:
- "${LIKEI_LOCAL_GATEWAY_PORT}:1100"
volumes:
- ${LIKEI_LOCAL_JAVA_REPO_DIR:-../../chatapp3/chatapp3-java}/rc-gateway/target/rc-gateway-1.0.0-local.jar:/app/app.jar:ro
auth:
<<: *java-service
container_name: chatapp3-local-auth
depends_on:
- nacos
ports:
- "${LIKEI_LOCAL_AUTH_PORT}:1000"
volumes:
- ${LIKEI_LOCAL_JAVA_REPO_DIR:-../../chatapp3/chatapp3-java}/rc-auth/target/rc-auth-1.0.0-local.jar:/app/app.jar:ro
external:
<<: *java-service
container_name: chatapp3-local-external
depends_on:
- nacos
ports:
- "${LIKEI_LOCAL_EXTERNAL_PORT}:3000"
volumes:
- ${LIKEI_LOCAL_JAVA_REPO_DIR:-../../chatapp3/chatapp3-java}/rc-service/rc-service-external/external-start/target/rc-service-external-1.0.0-local.jar:/app/app.jar:ro
other:
<<: *java-service
container_name: chatapp3-local-other
depends_on:
- nacos
- mongo
environment:
<<: *java-environment
JAVA_OPTS: "${LIKEI_LOCAL_OTHER_JAVA_OPTS:--Xms128m -Xmx512m} ${LIKEI_LOCAL_OTHER_JAVA_OPTS_EXTRA:-}"
ports:
- "${LIKEI_LOCAL_OTHER_PORT}:2400"
volumes:
- ${LIKEI_LOCAL_JAVA_REPO_DIR:-../../chatapp3/chatapp3-java}/rc-service/rc-service-other/other-start/target/rc-service-other-1.0.0-local.jar:/app/app.jar:ro
live:
<<: *java-service
container_name: chatapp3-local-live
depends_on:
- nacos
- mongo
ports:
- "${LIKEI_LOCAL_LIVE_PORT}:2500"
volumes:
- ${LIKEI_LOCAL_JAVA_REPO_DIR:-../../chatapp3/chatapp3-java}/rc-service/rc-service-live/live-start/target/rc-service-live-1.0.0-local.jar:/app/app.jar:ro
order:
<<: *java-service
container_name: chatapp3-local-order
depends_on:
- nacos
- mongo
ports:
- "${LIKEI_LOCAL_ORDER_PORT}:2600"
volumes:
- ${LIKEI_LOCAL_JAVA_REPO_DIR:-../../chatapp3/chatapp3-java}/rc-service/rc-service-order/order-start/target/rc-service-order-1.0.0-local.jar:/app/app.jar:ro
wallet:
<<: *java-service
container_name: chatapp3-local-wallet
depends_on:
- nacos
- mongo
ports:
- "${LIKEI_LOCAL_WALLET_PORT}:2000"
volumes:
- ${LIKEI_LOCAL_JAVA_REPO_DIR:-../../chatapp3/chatapp3-java}/rc-service/rc-service-wallet/wallet-start/target/rc-service-wallet-1.0.0-local.jar:/app/app.jar:ro
console:
<<: *java-service
container_name: chatapp3-local-console
depends_on:
- nacos
- mongo
ports:
- "${LIKEI_LOCAL_CONSOLE_PORT}:2700"
volumes:
- ${LIKEI_LOCAL_JAVA_REPO_DIR:-../../chatapp3/chatapp3-java}/rc-service/rc-service-console/console-start/target/rc-service-console-1.0.0-local.jar:/app/app.jar:ro
visual-monitor:
<<: *java-service
container_name: chatapp3-local-visual-monitor
depends_on:
- nacos
ports:
- "${LIKEI_LOCAL_VISUAL_MONITOR_PORT}:8000"
volumes:
- ${LIKEI_LOCAL_JAVA_REPO_DIR:-../../chatapp3/chatapp3-java}/rc-visual/visual-monitor/target/visual-monitor-1.0.0-local.jar:/app/app.jar:ro
scheduling:
<<: *java-service
container_name: chatapp3-local-scheduling
depends_on:
- nacos
- zookeeper
environment:
<<: *java-environment
JAVA_OPTS: ${LIKEI_LOCAL_SCHEDULING_JAVA_OPTS:--Xms128m -Xmx384m}
ports:
- "${LIKEI_LOCAL_SCHEDULING_PORT}:2800"
volumes:
- ${LIKEI_LOCAL_JAVA_REPO_DIR:-../../chatapp3/chatapp3-java}/rc-scheduling/target/rc-scheduling-1.0.0-local.jar:/app/app.jar:ro
game-fruit:
<<: *java-service
container_name: chatapp3-local-game-fruit
depends_on:
- nacos
environment:
<<: *java-environment
JAVA_OPTS: ${LIKEI_LOCAL_GAME_FRUIT_JAVA_OPTS:--Xms128m -Xmx384m}
SERVER_PORT: ${LIKEI_LOCAL_GAME_FRUIT_PORT}
ports:
- "${LIKEI_LOCAL_GAME_FRUIT_PORT}:8001"
volumes:
- ${LIKEI_LOCAL_JAVA_REPO_DIR:-../../chatapp3/chatapp3-java}/rc-service-game/game-fruit/target/game-fruit-1.0.0-local.jar:/app/app.jar:ro
golang:
<<: *env-file
image: golang:1.24
container_name: chatapp3-local-golang
restart: unless-stopped
depends_on:
- auth
- other
- wallet
- mysql
- redis
working_dir: /workspace/chatapp3-golang
command:
- sh
- -c
- go mod download && go run ./cmd/api
ports:
- "${LIKEI_LOCAL_GOLANG_PORT}:2900"
volumes:
- ${LIKEI_LOCAL_GOLANG_REPO_DIR:-../../chatapp3/chatapp3-golang}:/workspace/chatapp3-golang
- chatapp3-local-go-pkg:/go/pkg/mod
- chatapp3-local-go-build:/root/.cache/go-build
networks:
- localnet
volumes:
chatapp3-local-go-build:
chatapp3-local-go-pkg:
chatapp3-local-mysql-data:
chatapp3-local-redis-data:
chatapp3-local-mongo-data:
chatapp3-local-rocketmq-store:
networks:
localnet:
name: chatapp3-localnet

View File

@ -0,0 +1,70 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
# shellcheck disable=SC1091
source "$SCRIPT_DIR/common.sh"
load_local_env
NACOS_SOURCE_DIR="${LIKEI_NACOS_CONFIG_ROOT:-$JAVA_REPO_DIR/nacos_config}"
NACOS_CONFIG_HOST="${NACOS_CONFIG_HOST:?missing NACOS_CONFIG_HOST}"
NACOS_CONFIG_PORT="${NACOS_CONFIG_PORT:?missing NACOS_CONFIG_PORT}"
NAMESPACE_ID="${NAMESPACE_ID:-${LIKEI_NACOS_NAMESPACE:?missing LIKEI_NACOS_NAMESPACE}}"
NAMESPACE_NAME="${NAMESPACE_NAME:-${LIKEI_NACOS_NAMESPACE_NAME:?missing LIKEI_NACOS_NAMESPACE_NAME}}"
NACOS_CONFIG_BASE_URL="http://${NACOS_CONFIG_HOST}:${NACOS_CONFIG_PORT}/nacos"
TMP_DIR="$(mktemp -d)"
cleanup() {
rm -rf "$TMP_DIR"
}
trap cleanup EXIT
cp -R "$NACOS_SOURCE_DIR/." "$TMP_DIR/"
if [ -f "$TMP_DIR/common/external.yml" ]; then
cp "$TMP_DIR/common/external.yml" "$TMP_DIR/common/external-config.yml"
fi
if [ "$NAMESPACE_ID" != "public" ]; then
for _ in $(seq 1 60); do
if curl -fsS "${NACOS_CONFIG_BASE_URL}/" >/dev/null; then
break
fi
sleep 1
done
curl -fsS -X POST "$NACOS_CONFIG_BASE_URL/v1/console/namespaces" \
--data-urlencode "customNamespaceId=${NAMESPACE_ID}" \
--data-urlencode "namespaceName=${NAMESPACE_NAME}" \
--data-urlencode "namespaceDesc=${NAMESPACE_NAME}" >/dev/null || true
fi
publish_file() {
local file_path="$1"
local group="$2"
local data_id="$3"
if [ "$NAMESPACE_ID" = "public" ]; then
curl -fsS -X POST "$NACOS_CONFIG_BASE_URL/v1/cs/configs" \
--data-urlencode "group=${group}" \
--data-urlencode "dataId=${data_id}" \
--data-urlencode "type=yaml" \
--data-urlencode "content@${file_path}" >/dev/null
else
curl -fsS -X POST "$NACOS_CONFIG_BASE_URL/v1/cs/configs" \
--data-urlencode "tenant=${NAMESPACE_ID}" \
--data-urlencode "group=${group}" \
--data-urlencode "dataId=${data_id}" \
--data-urlencode "type=yaml" \
--data-urlencode "content@${file_path}" >/dev/null
fi
printf 'published %s/%s\n' "$group" "$data_id"
}
while IFS= read -r file_path; do
[ -f "$file_path" ] || continue
group_name="$(basename "$(dirname "$file_path")")"
data_id="$(basename "$file_path")"
publish_file "$file_path" "$group_name" "$data_id"
done < <(find "$TMP_DIR" -type f -name '*.yml' | sort)

125
localbox/restart_local_service.sh Executable file
View File

@ -0,0 +1,125 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
# shellcheck disable=SC1091
source "$SCRIPT_DIR/common.sh"
load_local_env
wait_for_docker
REBUILD=false
usage() {
cat <<'EOF'
用法:
./restart_local_service.sh live
./restart_local_service.sh --rebuild auth
./restart_local_service.sh golang
支持的服务:
gateway auth external other live order wallet console visual-monitor scheduling game-fruit golang
mysql redis mongo nacos zookeeper
rocketmq rocketmq-namesrv rocketmq-broker rocketmq-proxy
EOF
}
while [ "$#" -gt 0 ]; do
case "$1" in
--rebuild)
REBUILD=true
shift
;;
-h|--help)
usage
exit 0
;;
*)
break
;;
esac
done
if [ "$#" -ne 1 ]; then
usage >&2
exit 1
fi
SERVICE="$1"
if [ "$SERVICE" = "rocketmq-proxy" ]; then
SERVICE="rocketmq-proxy"
fi
case "$SERVICE" in
gateway|auth|external|other|live|order|wallet|console|visual-monitor|scheduling|game-fruit|golang|mysql|redis|mongo|nacos|zookeeper|rocketmq|rocketmq-namesrv|rocketmq-broker|rocketmq-proxy)
;;
*)
echo "unknown service: $SERVICE" >&2
usage >&2
exit 1
;;
esac
if [ "$REBUILD" = true ] && is_java_service "$SERVICE"; then
"$SCRIPT_DIR/build_local_backend.sh" "$SERVICE"
fi
if [ "$SERVICE" = "rocketmq" ]; then
compose up -d --remove-orphans --force-recreate rocketmq-namesrv rocketmq-init rocketmq-broker rocketmq-proxy
elif [ "$SERVICE" = "other" ] && ! local_rocketmq_disabled; then
compose up -d --remove-orphans rocketmq-namesrv rocketmq-init rocketmq-broker rocketmq-proxy
wait_local_rocketmq
compose up -d --no-deps --force-recreate "$SERVICE"
elif [ "$SERVICE" = "rocketmq-broker" ]; then
compose up -d --remove-orphans rocketmq-namesrv rocketmq-init rocketmq-broker
elif [ "$SERVICE" = "rocketmq-proxy" ]; then
compose up -d --remove-orphans rocketmq-namesrv rocketmq-init rocketmq-broker rocketmq-proxy
else
compose up -d --no-deps --force-recreate "$SERVICE"
fi
case "$SERVICE" in
gateway|auth|external|other|live|order|wallet|console|visual-monitor|scheduling|game-fruit|golang)
wait_service_port "$SERVICE" 120
;;
mysql)
wait_container_healthy chatapp3-local-mysql 120
;;
redis)
wait_container_healthy chatapp3-local-redis 120
;;
mongo)
wait_container_healthy chatapp3-local-mongo 120
;;
nacos)
require_env LIKEI_LOCAL_NACOS_PORT
wait_http "http://127.0.0.1:${LIKEI_LOCAL_NACOS_PORT}/nacos/" 120
;;
zookeeper)
wait_container_healthy chatapp3-local-zookeeper 120
;;
rocketmq)
wait_local_rocketmq
;;
rocketmq-namesrv)
require_env LIKEI_LOCAL_ROCKETMQ_NAMESRV_PORT
wait_container_healthy chatapp3-local-rocketmq-namesrv 120
wait_tcp_port 127.0.0.1 "${LIKEI_LOCAL_ROCKETMQ_NAMESRV_PORT}" 120
;;
rocketmq-broker)
wait_container_healthy chatapp3-local-rocketmq-broker 120
wait_rocketmq_cluster 120
;;
rocketmq-proxy)
require_env LIKEI_LOCAL_ROCKETMQ_PROXY_GRPC_PORT
wait_container_healthy chatapp3-local-rocketmq-proxy 120
wait_tcp_port 127.0.0.1 "${LIKEI_LOCAL_ROCKETMQ_PROXY_GRPC_PORT}" 120
;;
esac
if [ "$SERVICE" = "rocketmq" ]; then
compose ps rocketmq-namesrv rocketmq-broker rocketmq-proxy
else
compose ps "$SERVICE"
fi

View File

@ -0,0 +1,88 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
# shellcheck disable=SC1091
source "$SCRIPT_DIR/common.sh"
BUILD_SCRIPT="$SCRIPT_DIR/build_local_backend.sh"
PUBLISH_SCRIPT="$SCRIPT_DIR/publish_local_nacos_configs.sh"
SKIP_BUILD=false
INFRA_ONLY=false
usage() {
cat <<'EOF'
用法:
./start_local_services.sh
./start_local_services.sh --skip-build
./start_local_services.sh --infra-only
EOF
}
while [ "$#" -gt 0 ]; do
case "$1" in
--skip-build)
SKIP_BUILD=true
;;
--infra-only)
INFRA_ONLY=true
;;
-h|--help)
usage
exit 0
;;
*)
echo "unknown option: $1" >&2
usage >&2
exit 1
;;
esac
shift
done
load_local_env
wait_for_docker
if [ "$SKIP_BUILD" = false ] && [ "$INFRA_ONLY" = false ]; then
java_major="$(java_major_version || true)"
if [ "$java_major" = "17" ]; then
"$BUILD_SCRIPT"
else
if all_local_java_jars_present; then
echo "detected Java ${java_major:-unknown}; local rebuild requires JDK 17" >&2
echo "to intentionally reuse the current jars, rerun ./start_local_services.sh --skip-build" >&2
else
echo "local Java jars are missing and the current machine is not using JDK 17" >&2
echo "please switch to JDK 17 and rerun ./start_local_services.sh, or prebuild the jars first" >&2
fi
exit 1
fi
fi
compose up -d mysql redis mongo nacos zookeeper
if ! local_rocketmq_disabled; then
compose up -d --remove-orphans rocketmq-namesrv rocketmq-init rocketmq-broker rocketmq-proxy
fi
wait_container_healthy chatapp3-local-mysql 120
wait_container_healthy chatapp3-local-redis 120
wait_container_healthy chatapp3-local-mongo 120
echo "waiting for nacos..."
require_env LIKEI_LOCAL_NACOS_PORT
wait_http "http://127.0.0.1:${LIKEI_LOCAL_NACOS_PORT}/nacos/" 120
wait_local_rocketmq
"$PUBLISH_SCRIPT"
if [ "$INFRA_ONLY" = false ]; then
compose up -d --force-recreate \
gateway auth external other live order wallet console visual-monitor scheduling game-fruit golang
for service in gateway auth other live order wallet console external visual-monitor scheduling game-fruit golang; do
wait_service_port "$service" 120
done
fi
compose ps