ソースを参照

feat: add environment configuration files for app and mgnt; update Node version in .nvmrc; create MongoDB seed script

Dave 2 ヶ月 前
コミット
0ae385b14c
8 ファイル変更584 行追加7 行削除
  1. 26 0
      .env.app
  2. 25 0
      .env.app.test
  3. 83 0
      .env.mgnt
  4. 77 0
      .env.mgnt.test
  5. 1 1
      .nvmrc
  6. 322 0
      install服务器部署.md
  7. 12 6
      package.json
  8. 38 0
      prisma/mongo/seed.ts

+ 26 - 0
.env.app

@@ -0,0 +1,26 @@
+# 测试服环境变量
+APP_ENV=test
+
+# Prisma Config
+# Dave local
+MONGO_URL="mongodb://admin:ZXcv%21%21996@localhost:27017/box_admin?authSource=admin"
+
+# office dev env
+# MONGO_URL="mongodb://msAdmin:Fl1%2A29MJe%26jLvj@localhost:27017/box_admin?authSource=admin"
+
+# Redis Config
+REDIS_HOST=127.0.0.1
+REDIS_PORT=6379
+REDIS_PASSWORD=
+REDIS_DB=0
+REDIS_KEY_PREFIX=box:
+
+# App set to 0.0.0.0 for local LAN access
+APP_HOST=0.0.0.0
+APP_PORT=3301
+APP_CORS_ORIGIN=*
+
+
+# JWT
+JWT_SECRET=047df8aaa3d17dc1173c5a9a3052ba66c2b0bd96937147eb643319a0c90d132f
+JWT_ACCESS_TOKEN_TTL=43200

+ 25 - 0
.env.app.test

@@ -0,0 +1,25 @@
+# 测试服环境变量
+APP_ENV=test
+
+# Prisma Config
+MONGO_URL="mongodb://boxuser:ZXcv1234@localhost:27017/box_admin?authSource=admin"
+
+# office dev env
+# MONGO_URL="mongodb://msAdmin:Fl1%2A29MJe%26jLvj@localhost:27017/box_admin?authSource=admin"
+
+# Redis Config
+REDIS_HOST=127.0.0.1
+REDIS_PORT=6379
+REDIS_PASSWORD=
+REDIS_DB=0
+REDIS_KEY_PREFIX=box:
+
+# App set to 0.0.0.0 for local LAN access
+APP_HOST=0.0.0.0
+APP_PORT=3301
+APP_CORS_ORIGIN=*
+
+
+# JWT
+JWT_SECRET=047df8aaa3d17dc1173c5a9a3052ba66c2b0bd96937147eb643319a0c90d132f
+JWT_ACCESS_TOKEN_TTL=43200

+ 83 - 0
.env.mgnt

@@ -0,0 +1,83 @@
+# 测试服环境变量
+APP_ENV=test
+
+# Prisma Config
+# MYSQL_URL="mysql://root:123456@localhost:3306/box_admin"
+# MONGO_URL="mongodb://msAdmin:Fl1%2A29MJe%26jLvj@localhost:27017/box_admin?authSource=admin"
+
+MYSQL_URL="mysql://root:123456@localhost:3306/box_admin"
+# MYSQL_URL="mysql://root:123456@localhost:3306/box_admin"
+
+MONGO_URL="mongodb://admin:ZXcv%21%21996@localhost:27017/box_admin?authSource=admin"
+# MONGO_URL="mongodb://msAdmin:Fl1%2A29MJe%26jLvj@localhost:27017/box_admin?authSource=admin"
+
+# Redis Config
+REDIS_HOST=127.0.0.1
+REDIS_PORT=6379
+REDIS_PASSWORD=
+REDIS_DB=0
+REDIS_KEY_PREFIX=box:
+
+# 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
+
+
+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
+

+ 77 - 0
.env.mgnt.test

@@ -0,0 +1,77 @@
+# 测试服环境变量
+APP_ENV=test
+
+# Prisma Config
+MYSQL_URL="mysql://boxdbuser:ZXcv1234@localhost:3306/box_admin"
+MONGO_URL="mongodb://boxuser:ZXcv1234@localhost:27017/box_admin?authSource=admin"
+
+# Redis Config
+REDIS_HOST=127.0.0.1
+REDIS_PORT=6379
+REDIS_PASSWORD=
+REDIS_DB=0
+REDIS_KEY_PREFIX=box:
+
+# 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
+
+
+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
.nvmrc

@@ -1 +1 @@
-22
+20

+ 322 - 0
install服务器部署.md

@@ -0,0 +1,322 @@
+# 📘 Box 系统后端部署指南(中文完整版)
+
+---
+
+# 1. 安装 Node.js 20.x(使用 NVM)
+
+```bash
+# 安装 NVM(Node 版本管理器)
+curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
+
+# 让 NVM 生效(当前终端会话)
+export NVM_DIR="$HOME/.nvm"
+[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
+[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
+
+# 检查 NVM 是否安装成功
+nvm --version
+
+# 安装 Node.js 20 LTS
+nvm install 20
+
+# 设置默认 Node 版本
+nvm alias default 20
+
+# 确认 Node & npm 版本
+node --version
+npm --version
+```
+
+---
+
+# 2. 安装 pnpm
+
+```bash
+npm install -g pnpm
+pnpm --version
+```
+
+---
+
+# 3. 安装与配置 MySQL 8.0
+
+## 创建数据库与用户
+
+```bash
+mysql -u root -p
+```
+
+```sql
+CREATE DATABASE box_admin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+
+CREATE USER 'boxdbuser'@'localhost' IDENTIFIED BY 'ZXcv1234';
+GRANT ALL PRIVILEGES ON box_admin.* TO 'boxdbuser'@'localhost';
+FLUSH PRIVILEGES;
+```
+
+## 配置环境变量
+
+编辑 `.env.mgnt.test` 与 `.env.mgnt`:
+
+```bash
+MYSQL_URL="mysql://boxdbuser:ZXcv1234@localhost:3306/box_admin"
+```
+
+---
+
+# 4. 安装与配置 MongoDB 6.0(含副本集)
+
+## 创建用户(启用认证前)
+
+```bash
+mongosh
+```
+
+```javascript
+use admin
+db.createUser({
+  user: "admin",
+  pwd: "ZXcv1234",
+  roles: [ { role: "userAdminAnyDatabase", db: "admin" }, { role: "root", db: "admin" } ]
+})
+
+use box_admin
+db.createUser({
+  user: "boxuser",
+  pwd: "ZXcv1234",
+  roles: [ { role: "readWrite", db: "box_admin" } ]
+})
+
+exit
+```
+
+## 环境变量
+
+编辑:
+
+- `.env.mgnt.test`
+- `.env.mgnt`
+- `.env.app.test`
+- `.env.app`
+
+确保:
+
+```bash
+MONGO_URL="mongodb://boxuser:ZXcv1234@localhost:27017/box_admin?authSource=box_admin&replicaSet=rs0"
+```
+
+## 生成 Mongo Keyfile
+
+```bash
+sudo mkdir -p /var/lib/mongo/keyfile
+sudo openssl rand -base64 756 | sudo tee /var/lib/mongo/keyfile/mongodb-keyfile > /dev/null
+sudo chown mongod:mongod /var/lib/mongo/keyfile/mongodb-keyfile
+sudo chmod 400 /var/lib/mongo/keyfile/mongodb-keyfile
+```
+
+## 配置 /etc/mongod.conf
+
+```yaml
+net:
+  port: 27017
+  bindIp: 127.0.0.1
+
+storage:
+  dbPath: /var/lib/mongo
+  journal:
+    enabled: true
+
+security:
+  authorization: enabled
+  keyFile: /var/lib/mongo/keyfile/mongodb-keyfile
+
+replication:
+  replSetName: 'rs0'
+
+systemLog:
+  destination: file
+  logAppend: true
+  path: /var/log/mongodb/mongod.log
+  verbosity: 0
+```
+
+## 重启 + 初始化副本集
+
+```bash
+sudo systemctl restart mongod
+sudo systemctl status mongod
+```
+
+```bash
+mongosh -u admin -p
+use admin
+rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "localhost:27017" } ] })
+rs.status()
+exit
+```
+
+---
+
+# 5. 安装 PM2
+
+```bash
+npm install -g pm2
+pm2 --version
+pm2 startup systemd
+```
+
+---
+
+# 6. 后端部署(TEST 环境)
+
+## Step 1:准备目录
+
+```bash
+mkdir -p /usr/local/apps/box-project
+cd /usr/local/apps/box-project
+```
+
+## Step 2:部署后端
+
+```bash
+git clone http://47.238.201.61:3000/fct/box-nestjs-monorepo.git
+cd box-nestjs-monorepo
+
+# 使用 TEST 环境
+tcp .env.mgnt.test .env.mgnt
+cp .env.app.test .env.app
+
+pnpm install
+npm rebuild bcrypt
+pnpm prisma:generate
+pnpm prisma:setup:test
+```
+
+---
+
+# 7. PM2 启动后端服务
+
+## 启动 mgnt API
+
+```bash
+pnpm build:mgnt
+pm2 start dist/apps/box-mgnt-api/main.js --name box-mgnt
+pm2 save
+pm2 logs box-mgnt
+```
+
+## 启动 app API
+
+```bash
+pnpm build:app
+pm2 start dist/apps/box-app-api/main.js --name box-app
+pm2 save
+pm2 logs box-app
+```
+
+---
+
+# 8. 配置 Nginx 反代
+
+⚠️ 端口需与 `.env.mgnt` / `.env.app` 对应。
+
+## mgnt(后台)
+
+```bash
+sudo vim /etc/nginx/sites-available/box-mgnt.conf
+```
+
+```nginx
+server {
+    listen 80;
+    server_name mgnt.box-domain.com;
+
+    location / {
+        proxy_pass http://localhost:3300;
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
+    }
+}
+```
+
+```bash
+sudo ln -s /etc/nginx/sites-available/box-mgnt.conf /etc/nginx/sites-enabled/
+sudo nginx -t
+sudo systemctl reload nginx
+```
+
+## app(前台)
+
+```bash
+sudo vim /etc/nginx/sites-available/box-app.conf
+```
+
+```nginx
+server {
+    listen 80;
+    server_name app.box-domain.com;
+
+    location / {
+        proxy_pass http://localhost:3301;
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
+    }
+}
+```
+
+```bash
+sudo ln -s /etc/nginx/sites-available/box-app.conf /etc/nginx/sites-enabled/
+sudo nginx -t
+sudo systemctl reload nginx
+```
+
+---
+
+# 9. 部署前端
+
+```bash
+git clone http://47.238.201.61:3000/fct/box-frontend.git
+cd box-frontend
+
+pnpm install
+pnpm build
+
+pm2 serve ./dist 9000 --name box-frontend --spa
+pm2 save
+pm2 logs box-frontend
+```
+
+## Nginx 配置前端
+
+```bash
+sudo vim /etc/nginx/sites-available/box-frontend.conf
+```
+
+```nginx
+server {
+    listen 80;
+    server_name man.box-domain.com;
+
+    location / {
+        proxy_pass http://localhost:9000;
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
+    }
+}
+```
+
+```bash
+sudo ln -s /etc/nginx/sites-available/box-frontend.conf /etc/nginx/sites-enabled/
+sudo nginx-t
+sudo systemctl reload nginx
+```
+
+---
+
+# 🎉 部署完成!

+ 12 - 6
package.json

@@ -6,14 +6,20 @@
     "dev:mgnt": "nest start box-mgnt-api --watch",
     "build:mgnt": "nest build box-mgnt-api",
     "start:mgnt": "node dist/apps/box-mgnt-api/main.js",
-    "dev:app": "dotenv -e .env.app.dev -- nest start box-app-api --watch",
-    "prisma:migrate:dev:mysql": "dotenv -e .env.mgnt.dev -- prisma migrate dev --schema=prisma/mysql/schema",
-    "prisma:migrate:reset:mysql": "dotenv -e .env.mgnt.dev -- prisma migrate reset --schema=prisma/mysql/schema",
-    "prisma:generate:mysql": "dotenv -e .env.mgnt.dev -- prisma generate --schema=prisma/mysql/schema",
-    "prisma:generate:mongo": "dotenv -e .env.mgnt.dev -- prisma generate --schema=prisma/mongo/schema",
+    "dev:app": "dotenv -e .env.app -- nest start box-app-api --watch",
+    "build:app": "nest build box-app-api",
+    "prisma:migrate:dev:mysql": "dotenv -e .env.mgnt -- prisma migrate dev --schema=prisma/mysql/schema",
+    "prisma:migrate:reset:mysql": "dotenv -e .env.mgnt -- prisma migrate reset --schema=prisma/mysql/schema",
+    "prisma:generate:mysql": "dotenv -e .env.mgnt -- prisma generate --schema=prisma/mysql/schema",
+    "prisma:generate:mongo": "dotenv -e .env.mgnt -- prisma generate --schema=prisma/mongo/schema",
     "prisma:generate": "pnpm prisma:generate:mysql && pnpm prisma:generate:mongo",
-    "prisma:seed:mysql": "dotenv -e .env.mgnt.dev -- ts-node -P tsconfig.seed.json prisma/mysql/seed.ts",
+    "prisma:seed:mysql": "dotenv -e .env.mgnt -- ts-node -P tsconfig.seed.json prisma/mysql/seed.ts",
+    "prisma:seed:mongo": "dotenv -e .env.app -- ts-node -P tsconfig.seed.json prisma/mongo/seed.ts",
     "prisma:setup:mysql": "pnpm prisma:migrate:dev:mysql && pnpm prisma:seed:mysql",
+    "prisma:migrate:deploy:mysql:test": "dotenv -e .env.mgnt -- prisma migrate deploy --schema=prisma/mysql/schema",
+    "prisma:seed:mysql:test": "dotenv -e .env.mgnt -- ts-node -P tsconfig.seed.json prisma/mysql/seed.ts",
+    "prisma:seed:mongo:test": "dotenv -e .env.app -- ts-node -P tsconfig.seed.json prisma/mongo/seed.ts",
+    "prisma:setup:test": "pnpm prisma:migrate:deploy:mysql:test && pnpm prisma:seed:mysql:test && pnpm prisma:seed:mongo:test",
     "typecheck": "tsc --noEmit --project tsconfig.base.json",
     "typecheck:watch": "tsc --noEmit --watch --project tsconfig.base.json",
     "lint": "eslint \"{apps,libs}/**/*.ts\" --max-warnings 0",

+ 38 - 0
prisma/mongo/seed.ts

@@ -0,0 +1,38 @@
+// prisma/mongo/seed.ts
+import { PrismaClient } from '@prisma/mongo/client';
+
+const prisma = new PrismaClient();
+
+async function main() {
+  const adsModules = [
+    { adsModule: '启动页', moduleDesc: '启动页(10:21)', seq: 1 },
+    { adsModule: '轮播', moduleDesc: '轮播(2:1)', seq: 2 },
+    { adsModule: '弹窗-图标', moduleDesc: '弹窗-图标(1:1)', seq: 3 },
+    { adsModule: '弹窗-图片', moduleDesc: '弹窗-图片(2:3)', seq: 4 },
+    { adsModule: '弹窗-官方', moduleDesc: '弹窗-官方(2:3)', seq: 5 },
+    { adsModule: '瀑布流-图标', moduleDesc: '瀑布流-图标(1:1)', seq: 6 },
+    { adsModule: '瀑布流-文字', moduleDesc: '瀑布流-文字', seq: 7 },
+    { adsModule: '瀑布流-视频', moduleDesc: '瀑布流-视频(8:5)', seq: 8 },
+    { adsModule: '悬浮-底部', moduleDesc: '悬浮-底部(1:1)', seq: 9 },
+    { adsModule: '悬浮-边缘', moduleDesc: '悬浮-边缘(1:1)', seq: 10 },
+    { adsModule: 'banner', moduleDesc: 'banner(4:1)', seq: 11 },
+    { adsModule: '片头', moduleDesc: '片头(8:5)', seq: 12 },
+    { adsModule: '暂停', moduleDesc: '暂停(2:1)', seq: 13 },
+  ];
+
+  for (const module of adsModules) {
+    await prisma.adsModule.create({
+      data: module,
+    });
+  }
+}
+
+main()
+  .then(async () => {
+    await prisma.$disconnect();
+  })
+  .catch(async (e) => {
+    console.error(e);
+    await prisma.$disconnect();
+    process.exit(1);
+  });