yuanchao hace 6 meses
commit
2bc922cf4a
Se han modificado 100 ficheros con 3128 adiciones y 0 borrados
  1. 62 0
      .gitignore
  2. 3 0
      README.md
  3. 268 0
      app离线打包/Android 打包文档.md
  4. 178 0
      app离线打包/IOS 打包文档.md
  5. 201 0
      devops指南/1.jenkins与harbor安装.md
  6. 217 0
      devops指南/2.k8s安装.md
  7. 29 0
      devops指南/3.nfs安装.md
  8. 46 0
      devops指南/4.创建一些账号,以及名命空间.md
  9. 29 0
      devops指南/README.md
  10. 74 0
      devops指南/jenkinsfile/mall4j-b2b2c-h5-release.jenkinsfile
  11. 78 0
      devops指南/jenkinsfile/mall4j-b2b2c-java-release.jenkinsfile
  12. 72 0
      devops指南/jenkinsfile/mall4j-b2b2c-ms-release.jenkinsfile
  13. 55 0
      devops指南/jenkinsfile/mall4j-b2b2c-pc-release.jenkinsfile
  14. 68 0
      devops指南/jenkinsfile/mall4j-b2b2c-s-release.jenkinsfile
  15. 62 0
      devops指南/jenkinsfile/mall4j-b2b2c-vp-release.jenkinsfile
  16. 61 0
      devops指南/jenkinsfile/mall4j-b2b2c-vs-release.jenkinsfile
  17. 958 0
      devops指南/mall4j-b2b2c-release.yaml
  18. 667 0
      devops指南/mall4j-middleware.yaml
  19. BIN
      img/%E9%80%80%E6%AC%BE%E6%96%87%E6%A1%A3%5C1566788134396.png
  20. BIN
      img/01.png
  21. BIN
      img/02.png
  22. BIN
      img/05.png
  23. BIN
      img/1008612.png
  24. BIN
      img/20201026164913.png
  25. BIN
      img/20201026165651.png
  26. BIN
      img/20201026170018.png
  27. BIN
      img/24.png
  28. BIN
      img/ShopWalet/1-01.png
  29. BIN
      img/ShopWalet/1-02.png
  30. BIN
      img/ShopWalet/1-03.png
  31. BIN
      img/ShopWalet/2-01.png
  32. BIN
      img/ShopWalet/2-02.png
  33. BIN
      img/ShopWalet/2-03.png
  34. BIN
      img/ShopWalet/3-01.png
  35. BIN
      img/ShopWalet/3-02.png
  36. BIN
      img/ShopWalet/4-01.png
  37. BIN
      img/ShopWalet/4-02.png
  38. BIN
      img/ShopWalet/4-03.png
  39. BIN
      img/ShopWalet/5-01.png
  40. BIN
      img/app打包/android/AppKey.png
  41. BIN
      img/app打包/android/修改包名、签名.png
  42. BIN
      img/app打包/android/导入工程.png
  43. BIN
      img/app打包/android/导入资源.png
  44. BIN
      img/app打包/android/导出资源.png
  45. BIN
      img/app打包/android/应用名称.png
  46. BIN
      img/app打包/android/微信支付1.png
  47. BIN
      img/app打包/android/微信支付2.png
  48. BIN
      img/app打包/android/打包apk.png
  49. BIN
      img/app打包/android/检查appid.png
  50. BIN
      img/app打包/ios/xcode配置自动签名.png
  51. BIN
      img/app打包/ios/修改control文件appid.png
  52. BIN
      img/app打包/ios/导入本地打包app资源.png
  53. BIN
      img/app打包/ios/打包上传1.png
  54. BIN
      img/app打包/ios/打包上传2.png
  55. BIN
      img/app打包/ios/打包上传3.png
  56. BIN
      img/app打包/ios/打包上传4.png
  57. BIN
      img/app打包/ios/打包上传5.png
  58. BIN
      img/app打包/ios/打包配置.png
  59. BIN
      img/app打包/ios/生成本地打包app资源.png
  60. BIN
      img/app打包/ios/签名配置.png
  61. BIN
      img/app打包/ios/签名错误1.png
  62. BIN
      img/app打包/ios/签名错误2.png
  63. BIN
      img/app打包/ios/配置appkey.png
  64. BIN
      img/app打包/ios/配置app图标1.png
  65. BIN
      img/app打包/ios/配置app图标2.png
  66. BIN
      img/app打包/ios/配置应用名称.png
  67. BIN
      img/app打包/ios/配置版本信息.png
  68. BIN
      img/h5支付域名.png
  69. BIN
      img/nginx文件上传配置.png
  70. BIN
      img/no_scope.png
  71. BIN
      img/sku.png
  72. BIN
      img/tk01.png
  73. BIN
      img/tk03.png
  74. BIN
      img/uniapp资源文件url.png
  75. BIN
      img/一些常见问题/Es开启or关闭1.png
  76. BIN
      img/一些常见问题/Es开启or关闭2.png
  77. BIN
      img/一些常见问题/xxl-job连接-01.png
  78. BIN
      img/一些常见问题/xxl-job连接-02.png
  79. BIN
      img/一些常见问题/xxl-job连接-03.png
  80. BIN
      img/一些常见问题/xxl-job连接-04.png
  81. BIN
      img/一些常见问题/xxl-job连接-05.png
  82. BIN
      img/一些常见问题/图片域名问题处理-01.png
  83. BIN
      img/一些常见问题/图片域名问题处理-02.png
  84. BIN
      img/一些常见问题/图片域名问题处理-03.png
  85. BIN
      img/一些常见问题/图片域名问题处理-04.png
  86. BIN
      img/一些常见问题/图片域名问题处理-05.png
  87. BIN
      img/一些常见问题/图片域名问题处理-06.png
  88. BIN
      img/一些常见问题/平台端支付证书配置-01.png
  89. BIN
      img/一些常见问题/平台端支付证书配置-02.png
  90. BIN
      img/一些常见问题/平台端支付证书配置-03.png
  91. BIN
      img/一些常见问题/平台端支付证书配置-04.png
  92. BIN
      img/一些常见问题/平台端支付证书配置-06.png
  93. BIN
      img/中间件安装/es-01.png
  94. BIN
      img/中间件安装/es-02.png
  95. BIN
      img/中间件安装/es-03.png
  96. BIN
      img/中间件安装/es-04.png
  97. BIN
      img/中间件安装/es-05.png
  98. BIN
      img/中间件安装/es-06.png
  99. BIN
      img/中间件安装/es-07.png
  100. BIN
      img/中间件安装/es-08.png

+ 62 - 0
.gitignore

@@ -0,0 +1,62 @@
+### gradle ###
+.gradle
+/build/
+!gradle/wrapper/gradle-wrapper.jar
+
+### STS ###
+.settings/
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+bin/
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+*.lock
+rebel.xml
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+
+### maven ###
+target/
+*.war
+*.ear
+*.zip
+*.tar
+*.tar.gz
+
+### logs ####
+/logs/
+*.log
+
+### temp ignore ###
+*.cache
+*.diff
+*.patch
+*.tmp
+*.java~
+*.properties~
+*.xml~
+
+### system ignore ###
+.DS_Store
+Thumbs.db
+Servers
+.metadata
+upload
+gen_code
+
+### node ###
+node_modules

+ 3 - 0
README.md

@@ -0,0 +1,3 @@
+# doc
+
+技术文档采用的是markdown格式,推荐下载在本地使用Typora进行阅读

+ 268 - 0
app离线打包/Android 打包文档.md

@@ -0,0 +1,268 @@
+## Mall4j 商城 Android 打包文档
+
+文档源自 [uniapp 官方离线打包文档](https://nativesupport.dcloud.net.cn/AppDocs/),如有出入以官网文档为准
+
+### 准备工作
+
+**Android平台签名证书**
+
+关于证书,可以参考 [uniapp-官方生成指南](https://ask.dcloud.net.cn/article/35777) ;或者使用 [第三方网站](https://www.yunedit.com/) 快速生成
+
+**注册Dcloud账号,登录后台创建应用并申请离线打包 [Appkey](https://nativesupport.dcloud.net.cn/AppDocs/usesdk/appkey)**
+
+
+
+### 开发环境
+
+Android Studio [官方下载](https://developer.android.google.cn/studio/index.html)
+
+HbulidX  [官方下载](https://www.dcloud.io/hbuilderx.html)
+
+App离线SDK下载  [最新android平台SDK下载](https://nativesupport.dcloud.net.cn/AppDocs/download/android)
+
+
+
+### SDK目录说明
+
+```
+|-- HBuilder-Hello                App离线打包演示应用
+|-- HBuilder-Integrate-AS         集成uni-app的最简示例
+|-- SDK                           SDK库文件目录
+|-- Feature-Android.xls           Android平台各扩展Feature API对应的详细配置
+|-- Readme.txt                    版本说明文件及注意事项
+|-- UniPlugin-Hello-AS            uni原生插件开发示例
+```
+
+
+
+### 导入工程
+
+打开 Android Studio 导入 SDK 中的 HBuilder-Integrate-AS 工程
+
+![导入工程](../img/app打包/android/导入工程.png)
+
+
+
+导入后 Android Studio 会自动下载项目中用到的资源,默认源是Google,建议科学上网
+
+
+
+### 工程配置
+
+**build.gradle**
+
+将生成的签名证书放入 simpleDemo 目录下
+打开 simpleDemo/build.gradle 配置文件,修改包名和签名信息
+
+![修改包名、签名](../img/app打包/android/修改包名、签名.png)
+
+
+
+```js
+// 签名信息配置
+signingConfigs {
+    config {
+        keyAlias 'key0'				// 证书别名
+        keyPassword '123456'		// 证书密码
+        storeFile file('test.jks')	// 证书文件路径
+        storePassword '123456'		// 证书文件密码
+        v1SigningEnabled true
+        v2SigningEnabled true
+    }
+}
+```
+
+
+
+
+
+**Androidmanifest.xml**
+
+打开 simpleDemo/src/main/Androidmanifest.xml,修改包名,配置Appkey
+
+![修改包名、签名](../img/app打包/android/AppKey.png)
+
+
+
+### 图标、启动图以及应用名称
+
+#### 图标、启动图
+
+simpleDemo/src/main/res/drawable,icon  为图标,splash  为启动图。可直接替换
+
+#### **应用名称**
+
+simpleDemo/src/main/res/values/strings.xml文件,修改“app_name”字段值
+
+![](../img/app打包/android/应用名称.png)
+
+
+
+### UTS依赖配置
+
+项目中使用了UTS插件,依赖于UTS基础模块,需要集成。
+
+参考uniapp-官网 **[UTS基础模块](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/uts.html)**
+
+
+
+### 模块及第三方SDK配置
+
+使用模块或第三方SDK需要引入资源,并添加对应配置。
+
+#### 第三方SDK配置
+
+以 [微信支付](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/pay?id=%e5%be%ae%e4%bf%a1%e6%94%af%e4%bb%98) 为例,需要登录 [微信开放平台](https://open.weixin.qq.com/) 创建移动应用,审核成功后获取 微信AppId(appkey) [微信appkey申请方法](http://ask.dcloud.net.cn/article/208)
+
+1. 引入文件
+
+   在 SDK/libs 目录下,找到 payment-weixin-release.aar 将这个文件放入工程中 simpleDemo/libs 目录;
+
+   将 SDK/src/wxapi 下的 WXPayEntryActivity.java 文件复制到工程 simpleDemo/main/java/包名/wxapi 目录
+
+   ![](../img/app打包/android/微信支付1.png)
+
+   
+
+2. 添加配置
+
+   1. Androidmainfest.xml 
+
+      需要在application节点前添加权限
+
+      ```xml
+      <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
+      ```
+
+      application节点下配置如下代码
+
+      ```xml
+       <meta-data  android:name="WX_APPID"  android:value="$微信APPID" />
+       <activity android:name="io.dcloud.feature.payment.weixin.WXPayProcessMeadiatorActivity"
+                  android:exported="false"
+                  android:excludeFromRecents="true"
+                  android:theme="@style/ProjectDialogTheme"/>
+        <activity
+                  android:name="$你的包名.wxapi.WXPayEntryActivity"
+                  android:exported="true"
+                  android:theme="@android:style/Theme.Translucent.NoTitleBar"
+                  android:launchMode="singleTop" />
+      ```
+
+   2. dcloud_properties.xml  (assets/data)
+
+      ```xml
+      <feature name="Payment" value="io.dcloud.feature.payment.PaymentFeatureImpl">
+          <module name="Payment-Weixin" value="io.dcloud.feature.payment.weixin.WeiXinPay"/>
+      </feature>
+      ```
+      
+   3. build.gradle (simpleDemo/build.gradle)在主工程的build.gradle文件配置 dependencies
+   
+      ```json
+      dependencies {
+          implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
+          implementation 'androidx.appcompat:appcompat:1.0.0'
+          implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+          implementation 'androidx.recyclerview:recyclerview:1.0.0'
+          implementation 'com.facebook.fresco:fresco:2.5.0'
+          implementation "com.facebook.fresco:animated-gif:2.5.0"
+          implementation 'com.github.bumptech.glide:glide:4.9.0'
+          implementation 'com.alibaba:fastjson:1.2.83'
+          implementation 'androidx.webkit:webkit:1.3.0'
+      
+          //  微信支付依赖配置
+          implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.8.0'
+      }
+      ```
+
+![](../img/app打包/android/微信支付2.png)
+
+
+
+
+
+项目中用到的模块及第三方SDK
+
+注意版本区别:如 跨境版 不支持支付宝、微信支付,则无需集成相关模块;
+
+注意应用区别:如 商家移动端 没有支付功能,则无需集成支付模块;
+
+| 模块/第三方SDK                                               | 需要引入的文件                                  |
+| ------------------------------------------------------------ | ----------------------------------------------- |
+| [系统定位](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/geolocation?id=系统定位) | 无需引入文件,需添加配置                        |
+| [支付宝支付](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/pay?id=支付宝) | payment-alipay-release.aar                      |
+| [微信支付](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/pay?id=微信支付) | payment-weixin-release.aar                      |
+| [VideoPlayer(视频播放)](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/others?id=videoplayer(视频播放)) | media-release.aar、weex_videoplayer-release.aar |
+| [UTS基础模块](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/uts.html) | utsplugin-release.aar                           |
+| [权限申请弹窗全局监听(UTS插件)](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/utsPlugins.html) | uni-createRequestPermissionListener-release.aar |
+
+
+
+### 导出资源
+
+用 HbulidX 打开项目,打开 manifest.json 配置文件,修改 uniapp 应用标识(appid) 为 离线AppKey 中的应用id
+
+![](../img/app打包/android/检查appid.png)
+
+
+
+选择项目 -> 发行 -> 原生App-本地打包 -> 生成本地打包App资源,编译完成后控制台会显示资源路径
+
+或执行命令 npm run build:app-android 编译
+
+![](../img/app打包/android/导出资源.png)
+
+
+
+### 导入资源
+
+将编译好的app资源拷贝到项目assets->apps下,目录结构如下图
+
+![](../img/app打包/android/导入资源.png)
+
+
+
+修改 assets/data/dcloud_control.xml 中的 appid 为 uni-app 的 id
+
+
+
+### 打包apk
+
+Android Studio 菜单选择 Build  ->  Generate Signed Bund / APK ,弹窗选择 APK,选择打包用的签名,输入签名信息,选择release, 点击 Finish 即可完成打包
+
+![](../img/app打包/android/打包apk.png)
+
+
+
+
+
+### 常见问题
+
+#### 未配置AppKey或配置错误
+
+1、查看签名文件是否配置到了主APP的build.gradle
+
+2、查看离线项目中dcloud_control.xml文件中的appid是否与申请AppKey时的appid一致
+
+3、检测离线项目的包名是否申请AppKey时的包名是否一致
+
+4、编译完通过apk解压获取一下签名信息与申请AppKey时填写的SHA1一致
+
+
+
+#### 模拟器中app无法运行
+
+要在模拟器运行,需要在 simpleDemo 目录下 build.gradle 配置文件  defaultConfig 下 添加配置 
+
+```xml
+android {
+	defaultConfig {
+       ...
+       ndk {
+           abiFilters 'arm64-v8a','armeabi-v7a', 'x86'
+	   }
+    }
+}
+```
+

+ 178 - 0
app离线打包/IOS 打包文档.md

@@ -0,0 +1,178 @@
+## Mall4j 商城 IOS 打包文档
+
+文档源自 [uniapp 官方离线打包文档](https://nativesupport.dcloud.net.cn/AppDocs/),如有出入以官网文档为准
+
+### 准备工作
+
+[苹果开发者平台](https://developer.apple.com/) 账号,需要加入苹果开发计划,创建App,申请证书,描述文件等
+
+注册Dcloud账号,登录后台创建应用并申请离线打包 [Appkey](https://nativesupport.dcloud.net.cn/AppDocs/usesdk/appkey)
+
+
+
+### 开发环境
+
+macOS Ventura 及以上 (可用虚拟机)
+
+Xcode 15 及以上版本
+
+HbulidX
+
+App离线SDK下载  [最新iOS平台SDK下载](https://nativesupport.dcloud.net.cn/AppDocs/download/ios)
+
+
+
+### SDK目录说明
+
+```
+|-- HBuilder-Hello       给用户打uni-app项目的离线打包工程
+|-- Feature-iOS.xls      配置表(依赖的库、资源文件、参数配置等)
+|-- SDK                 工程需要的库文件,.h头文件,配置文件,资源文件
+```
+
+- 详细说明:[App离线SDK内不同文件的作用](https://nativesupport.dcloud.net.cn/AppDocs/usesdk/iOSReadMe)
+
+
+
+### 配置工程
+
+下载离线SDK压缩包,解压;用 Xcode 打开 HBuilder-Hello 项目
+
+
+
+#### 配置Appkey
+
+打开 HBuilder-Hello ->  Supporting Files -> HBuilder-Hello-Info,找到 dcloud_appkey,填入appKey
+
+![](../img/app打包/ios/配置appkey.png)
+
+
+
+#### 生成本地打包app资源
+
+用 HbulidX 打开项目,选择菜单 发行 -> 原生App-本地打包 -> 生成本地打包App资源
+
+或执行命令 npm run build:app-ios 编译
+
+![](../img/app打包/ios/生成本地打包app资源.png)
+
+
+
+#### 导入打包资源到xcode
+
+把生成好的本地打包app资源复制到 xcode 项目目录下的 Pandora -> apps 路径下,替换掉原来的
+
+![](../img/app打包/ios/导入本地打包app资源.png)
+
+
+
+#### 修改 control.xml 文件
+
+打开 Xcode 工程Supporting Files -> control.xml文件修改 appid 值,改成和manifest.json里面的id一样
+
+![](../img/app打包/ios/修改control文件appid.png)
+
+
+
+#### 修改应用信息
+
+按图示箭头从左往右依次点击 HBuilder-Hello -> TARGETS 下的 HBuilder
+
+在General下修改应用名称、包名、版本名称、版本号
+
+Display Name是app名称
+
+Bundle Identifier为苹果的AppID
+
+Version为应用版本号,在App Store中显示的版本号,推荐与manifest.json中version下的name值一致;
+
+Build为编译版本号,App Store判断升级使用,推荐与manifest.json中version下的code值一致。
+
+![](../img/app打包/ios/配置版本信息.png)
+
+
+
+##### **修改app名称**
+
+即使修改了Display Name,打包后的app名称依然是"Hbuilder你好";需要改一下 InfoPlist.strings 下面的 CFBundleDisplayName 为应用名字,InfoPlist.strings(English)为英文系统应用名,Simplified为中文简体系统应用名
+
+![](../img/app打包/ios/配置应用名称.png)
+
+
+
+##### **修改app图标**
+
+按图示箭头从左往右依次点击 HBuilder-Hello -> TARGETS 下的 HBuilder
+
+在General下 找到 App Icons and Launch Images 点击小箭头
+
+![](../img/app打包/ios/配置app图标1.png)
+
+在 HBuilderX 中打开 mainfest.json,在 App图标配置中 使用自动生成图标功能,然后把生成的图标拖动到 xcode 中 Images 对应的每个大小的位置中 即可完成配置
+
+![](../img/app打包/ios/配置app图标2.png)
+
+
+
+##### **配置应用签名**
+
+配置 xcode 自动签名: 
+
+打开 xcode 配置,切换到 Account 选项,添加已完成签名申请的苹果开发者账号
+
+![](../img/app打包/ios/xcode配置自动签名.png)
+
+
+
+如图示打开 Signing & CapaBilities,勾选 "Automatically manage signing",选择一下 Team(如果没有的话,创建一个),填一下Bundle Identifier
+
+![](../img/app打包/ios/签名配置.png)
+
+签名常见错误1
+
+![](../img/app打包/ios/签名错误1.png)
+
+切换到选择卡“Build Settings” 搜索签名 “Signing” ;
+然后在列出的代码签名标识中把值设置为 “Apple Development”;
+
+签名常见错误2
+
+![](../img/app打包/ios/签名错误2.png)
+
+切换到选择卡“Build Settings” 搜索签名 “ Provision”,(快捷键command+delete)删除User-Defined下面的PROVISIONING_PROFILE
+
+
+
+### 第三方模块配置
+
+项目目前使用到模块/第三方SDK包含 定位、微信支付、支付宝支付、视频播放。
+具体配置方法可参考uniapp官网  [模块/三方SDK配置介绍](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/iOSModuleConfig/common)
+
+
+
+### 打包上传
+
+点击 Xcode 中部项目名称,设置编译配置,选择 Any iOS Device (arm64, armv7)
+
+![](../img/app打包/ios/打包配置.png)
+
+
+
+点击 Product 菜单,Archive 选项
+
+![](../img/app打包/ios/打包上传1.png)
+
+
+
+待编译完成后会自动弹出 Archives ,点击 右上角 Distribute App ,准备上传
+
+Archives 弹窗可通过 Window -> Organizer 菜单打开
+
+![](../img/app打包/ios/打包上传2.png)
+
+
+
+后续的弹窗一路 next ,最后签名完毕后点击 upload 上传
+
+![](../img/app打包/ios/打包上传4.png)
+

+ 201 - 0
devops指南/1.jenkins与harbor安装.md

@@ -0,0 +1,201 @@
+### 1. maven
+
+1. 下载maven,地址:https://maven.apache.org/download.cgi
+2. 上传到服务器解压
+
+```
+tar -zxvf apache-maven-3.8.6-bin.tar.gz -C /usr/local/
+```
+
+3.重命名
+
+```
+mv /usr/local/apache-maven-3.8.6 /usr/local/maven
+```
+
+### 2. jdk
+
+1. 下载jdk,https://download.oracle.com/java/17/archive/jdk-17.0.6_linux-x64_bin.tar.gz
+2. 上传到服务器解压
+
+```
+tar -zxvf jdk-17.0.6_linux-x64_bin.tar.gz -C /usr/local/
+```
+
+3.重命名
+
+```
+mv /usr/local/jdk-17.0.6 /usr/local/jdk
+```
+
+### 3. jenkins
+
+> jeknins用docker安装,不知道如何安装docker的,可以参考docker的安装教程
+
+
+
+jenkins用lts版本,用docker-compose安装
+
+```
+# 创建文件夹存放jenkins的数据
+mkdir -p /usr/local/docker/jenkins/data
+# 进到文件夹
+cd /usr/local/jenkins
+# 给这个目录赋予操作权限,供 jenkins 容器进行访问,不赋予权限的话,容器中的 jenkins 用户无法读取宿主机的这个文件;
+chmod 777 /usr/local/docker/jenkins/data
+
+# 放入maven和jdk
+mv /usr/local/maven /usr/local/docker/jenkins/data/maven
+mv /usr/local/jdk /usr/local/docker/jenkins/data/jdk
+
+# 让jenkins可以使用宿主机的docker
+chown root:root /var/run/docker.sock
+chmod o+rw /var/run/docker.sock
+```
+
+编辑 docker-compose
+
+`vi /usr/local/docker/jenkins/docker-compose.yml`
+
+内容如下
+```
+version: '3.1'
+services:
+  jenkins:
+    image: 'jenkins/jenkins:lts'
+    container_name: jenkins
+    restart: always
+    ports:
+      - '8080:8080'
+      - '50000:50000'
+    volumes:
+      - './data/:/var/jenkins_home/'
+      - '/var/run/docker.sock:/var/run/docker.sock'
+      - '/usr/bin/docker:/usr/bin/docker'
+      - '/etc/docker/daemon.json:/etc/docker/daemon.json'
+```
+启动
+```
+cd /usr/local/docker/jenkins
+docker compose up -d
+```
+
+启动jenkins之后除了默认的插件,还要安装`publisher over ssh` 和 `nodejs` 插件
+
+在jenkins当中,还要将`maven`,`jdk`,`nodejs`的之前下载好放入jenkins的路径写进去,不要让jenkins自己安装
+
+
+
+jenkins 在设置里面找到脚本命令行,运行这行命令
+```
+hudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION = true
+```
+安装 Build Authorization Token Root 插件
+
+安装该插件后,就可以通过 https://jenkins.mall4j.com/buildByToken/build?job=NAME&token=SECRET 地址来触发 job 了,此时不需要将 job 设置为匿名可访问也可以正常触发。
+
+
+jenkins 在设置里面找到脚本命令行,运行这行命令
+```
+System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
+```
+
+### 4. harbor
+
+1. 下载harbor(2.x),地址:https://github.com/goharbor/harbor/releases
+2. 上传到服务器解压
+
+```
+tar -zxvf harbor-offline-installer-v2.6.0.tgz -C /usr/local/docker
+```
+
+3.修改配置文件
+
+```
+cd /usr/local/docker/harbor/
+
+cp harbor.yml.tmpl harbor.yml
+
+vi harbor.yml
+```
+改掉 hostname,注掉https相关信息,修改默认密码harbor_admin_password
+```
+hostname: 192.168.1.11
+# https related config
+#https:
+  # https port for harbor, default is 443
+#  port: 443
+  # The path of cert and key files for nginx
+#  certificate: /your/certificate/path
+#  private_key: /your/private/key/path
+
+harbor_admin_password: 123456
+```
+
+4. 安装
+```
+./install.sh
+```
+
+5.所有要用到这个harbor的服务器,都要配置仓库地址
+
+```
+vi /etc/docker/daemon.json
+```
+增加一条
+```
+"insecure-registries":["192.168.1.11:80"]
+```
+重启docker
+```
+systemctl daemon-reload
+systemctl restart docker
+```
+
+6. 假如重启docker后harbor有问题,要重新跑一遍harbor的docker-compose
+```
+cd /usr/local/docker/harbor/
+docker compose stop
+docker compose up -d
+```
+
+## 设置开机自启
+
+
+```
+cd /etc/rc.d/init.d/
+```
+
+创建自启脚本`vi autostart.sh`内容如下
+```
+#!/bin/sh
+#chkconfig: 2345 80 90
+#description: 开机自启动脚本
+
+# harbor启动是需要顺序的,docker关闭之后,由docker启动的不太行,要docker-compose进行启动
+cd /usr/local/docker/harbor/
+docker compose restart
+
+cd /usr/local/docker/jenkins/
+docker compose restart
+
+# 让jenkins可以使用宿主机的docker 虽然加到了开机自启,但是不知道为何这个不会生效。所以每次重启,都需要重新执行一下下面两条命令
+chown root:root /var/run/docker.sock
+chmod o+rw /var/run/docker.sock
+```
+
+增加脚本的可执行权限
+
+```
+chmod +x autostart.sh
+```
+
+把服务添加到chkconfig列表
+```
+chkconfig --add autostart.sh
+```
+
+查看服务自启动状态(如果2~5都是on,就表明会自动启动了)
+```
+chkconfig --list autostart.sh
+```

+ 217 - 0
devops指南/2.k8s安装.md

@@ -0,0 +1,217 @@
+需要一个master节点,一个worker节点
+
+主节点需要组件
+- docker(也可以是其他容器运行时)
+- kubectl 集群命令行交互工具
+- kubeadm 集群初始化工具
+
+
+工作节点需要组件
+- docker(也可以是其他容器运行时)
+- kubelet 管理 Pod 和容器,确保他们健康稳定运行。
+- kube-proxy 网络代理,负责网络相关的工作
+
+
+```
+# 关闭selinux
+# 临时禁用selinux
+setenforce 0
+
+# 禁用交换分区
+swapoff -a
+# 永久禁用,打开/etc/fstab注释掉swap那一行。
+sed -i 's/.*swap.*/#&/' /etc/fstab
+
+
+curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
+
+# 删除之前的cni 网络信息
+ip link set cni0 down
+brctl delbr cni0
+
+# 安装依赖
+yum install -y epel-release conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
+
+# 关闭防火墙
+systemctl disable firewalld && systemctl stop firewalld
+
+# 设置iptables
+iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
+
+# 禁用 SELinux
+# 永久关闭 修改/etc/sysconfig/selinux文件设置
+sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
+sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
+
+# 加载内核模块
+cat > /etc/sysconfig/modules/ipvs.modules <<EOF
+#!/bin/bash
+modprobe -- ip_vs
+modprobe -- ip_vs_rr
+modprobe -- ip_vs_wrr
+modprobe -- ip_vs_sh
+modprobe -- nf_conntrack_ipv4
+modprobe -- br_netfilter
+EOF
+
+# 修改访问权限
+chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
+
+# 配置内核参数,将桥接的IPv4流量传递到iptables的链
+cat << EOF | tee /etc/sysctl.d/k8s.conf
+net.bridge.bridge-nf-call-iptables=1
+net.bridge.bridge-nf-call-ip6tables=1
+net.ipv4.ip_forward=1
+net.ipv4.tcp_tw_recycle=0
+vm.swappiness=0
+vm.overcommit_memory=1
+vm.panic_on_oom=0
+fs.inotify.max_user_watches=89100
+fs.file-max=52706963
+fs.nr_open=52706963
+net.ipv6.conf.all.disable_ipv6=1
+net.netfilter.nf_conntrack_max=2310720
+EOF
+
+sysctl -p /etc/sysctl.d/k8s.conf
+
+
+# docker 安装:
+# 安装docker所需的工具
+yum install -y yum-utils device-mapper-persistent-data lvm2
+
+# 配置阿里云的docker源
+yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
+
+# 安装 docker-ce docker-ce-cli
+yum makecache fast
+yum install -y docker-ce docker-ce-cli
+
+# 安装完成后配置启动时的命令,否则 docker 会将 iptables FORWARD chain 的默认策略设置为DROP
+sed -i "13i ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT" /usr/lib/systemd/system/docker.service
+
+# 启动docker
+systemctl enable docker && systemctl start docker
+
+# Kubernetes 默认设置cgroup驱动位为 "systemd" ,而 Docker 服务的cgroup驱动默认为 "cgroupfs",
+# insecure-registries 里面的ip和端口改成harbor所在的ip和端口
+# 建议将其修改为 “systemd", 与 Kubernetes 保持一致 ##
+tee /etc/docker/daemon.json <<-'EOF'
+{
+  "registry-mirrors": ["https://0hz7oz4n.mirror.aliyuncs.com"],
+  "exec-opts": ["native.cgroupdriver=systemd"],
+  "insecure-registries":["192.168.1.11:80"],
+  "log-driver": "json-file",
+  "log-opts": {
+    "max-size": "100m","max-file": "1"
+  },
+  "storage-driver": "overlay2"
+}
+EOF
+
+
+# 重启Docker 服务
+sudo systemctl daemon-reload
+sudo systemctl restart docker
+
+
+# 添加阿里云的K8S源:  k8s-master   k8s-node1    k8s-node2
+cat <<EOF > /etc/yum.repos.d/kubernetes.repo
+[kubernetes]
+name=Kubernetes
+baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
+enabled=1
+gpgcheck=0
+repo_gpgcheck=0
+gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
+EOF
+
+# 检查一下最新的1.23的版本
+yum list --showduplicates kubeadm --disableexcludes=kubernetes
+
+
+# 每个节点分别设置对应主机名
+hostnamectl set-hostname k8s-master
+hostnamectl set-hostname k8s-node1
+hostnamectl set-hostname k8s-node2
+
+# 所有节点都修改 hosts
+vi /etc/hosts
+192.168.1.5 k8s-master
+192.168.1.57 k8s-node1
+192.168.1.18 k8s-node2
+
+
+# 安装kubeadm  kubectl  kubelet 1.23.12(大于等于24的话,docker就不能愉快工作了)
+# 主节点
+yum install -y kubelet-1.23.12 kubectl-1.23.12 kubeadm-1.23.12
+
+# node节点
+yum install -y kubelet-1.23.12 kubectl-1.23.12 kubeadm-1.23.12
+echo 'KUBELET_EXTRA_ARGS="--runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice"' > /etc/sysconfig/kubelet
+
+
+# 启动kubelet服务
+systemctl enable kubelet && systemctl start kubelet
+
+# 查看已经安装的版本
+kubelet --version
+```
+
+二. 初始化 k8s-master 环境 或 kubeadm reset 后都要按以下步骤执行, IP地址需根据实际情况调整
+
+
+```
+# 因为需要下载 images 需要一些时间, 这里会等待一会儿, IP 按当前网络环境自行修改:
+# 说明: https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
+kubeadm init \
+--kubernetes-version=1.23.12 \
+--apiserver-advertise-address=192.168.1.5 \
+--image-repository registry.aliyuncs.com/google_containers \
+--service-cidr=10.1.0.0/16 \
+--pod-network-cidr=10.244.0.0/16
+```
+
+
+命令说明:
+
+–pod-network-cidr: 定义pod网段为:10.244.0.0/16
+
+–apiserver-advertise-address:master主机内网IP地址
+
+–image-repository:指定阿里云镜像仓库地址。由于kubeadm 默认从官网http://k8s.grc.io下载所需镜像,国内无法访问,因此需要通过–image-repository指定阿里云镜像仓库地址。
+
+集群初始化会出现如下结果
+
+Your Kubernetes control-plane has initialized successfully!
+
+
+上面安装完后,会提示你输入如下命令,复制粘贴过来,执行即可。
+
+```
+# 上面安装完成后,k8s会提示你输入如下命令,执行
+mkdir -p $HOME/.kube
+sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
+sudo chown $(id -u):$(id -g) $HOME/.kube/config
+```
+
+如果是root用户请执行: 最好加入到 .zshrc  .bashrc, 此处有疑问.... TODO:
+```
+export KUBECONFIG=/etc/kubernetes/admin.conf
+```
+
+node机上执行:  此时执行会报错并且执行不成功, 请稍等执行好flannel 再到node机上执行: 如忘记: 可使用命令 kubeadm token create --print-join-command 查看:
+```
+kubeadm join 192.168.1.5:6443 --token zxk5dz.es4kdp9ahxydsk5i \
+        --discovery-token-ca-cert-hash sha256:a5f29decea10aecf53cb174b22120095dade42303b34b5d4f5ea7e0bf4fb00b8
+```
+
+配置: kube-flannel.yml
+```
+# 服务器没办法访问的话,直接把这个地址在浏览器打开,然后下载下来也可以
+curl -k -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
+kubectl apply -f kube-flannel.yml
+```
+
+重要: ok, 此时去node机上执行 kubeadm join 即可, 这时在node执行 join 时会自动生 /run/flannel/subnet.env 文件, 而不会再报找不到文件的错误!
+

+ 29 - 0
devops指南/3.nfs安装.md

@@ -0,0 +1,29 @@
+1、所有节点
+```
+#所有机器安装
+yum install -y nfs-utils
+```
+
+2、主节点
+```
+#nfs主节点
+echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
+
+mkdir -p /nfs/data
+systemctl enable rpcbind --now
+systemctl enable nfs-server --now
+#配置生效
+exportfs -r
+```
+
+3、从节点
+```
+showmount -e 主节点ip
+
+#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
+mkdir -p /nfs/data
+
+mount -t nfs 主节点ip:/nfs/data /nfs/data
+# 写入一个测试文件
+echo "hello nfs server" > /nfs/data/test.txt
+```

+ 46 - 0
devops指南/4.创建一些账号,以及名命空间.md

@@ -0,0 +1,46 @@
+
+1. 创建在harbor上创建个名命空间,创建完之后,要在jekninsfile改成对应的名命空间。
+
+2. 在k8s当中创建一个和harbor当中一样的名命空间。这个名命空间要在jenkinsfile当中进行编辑。目前就叫做`mall4j-b2b2c-release`
+
+3. 为jenkins创建git账号与harbor账号
+
+在jenkins-系统管理配置-Manage Credentials-全局(Manage Credentials这个管理界面下面有个列表,列表域下面有个全局)-添加凭据
+
+如果无法手动进入的话,可以访问 `jenkins域名+/credentials/store/system/domain/_/`
+
+添加两个凭据把git和harbor的用户名和密码放进去保存。
+
+4. 根据本目录下的jenkinsfile文件夹,在jenkins当中添加不同的”流水线“任务,任务名和文件名可以类似。
+
+5. 修改jenkinsfile里面的GIT_CREDENTIAL_ID与HARBOR_CREDENTIAL_ID让jenkins可以访问到。
+
+6. 修改jenkinsfile里面的environment配置,改成自己的环境。复制进去jenkins的流水线脚本框内保存。前端的jenkinsfile要改掉里面的域名。
+
+7. 在nfs当中的`/nfs/data`下,创建几个放中间件需要的文件夹,将`linux环境(生产环境搭建)`里面的内容进行阅读。并把里面的文件夹的内容放到对应的nfs的文件夹当中。
+
+```shell
+mkdir cert
+mkdir mall4j-middleware
+mkdir mall4j-b2b2c-release
+cd mall4j-middleware
+mkdir mall4j-elasticsearch
+mkdir mall4j-minio
+mkdir mall4j-mysql
+mkdir mall4j-aof-redis
+mkdir mall4j-nginx
+mkdir mall4j-wukongim
+```
+
+9. 创建中间件所在的名命空间,起名为`mall4j-middleware`,将`mall4j-middleware.yaml`导入,注意里面的配置是否与nfs当中的ip和环境变量之类的一致。
+
+10. 创建商城容器的名命空间,起名为`mall4j-b2b2c-release`,将`mall4j-b2b2c-release.yaml`导入,注意里面的ip之类的会不会有问题。还要在`mall4j-b2b2c-release`当中创建harbor的密文,起名为harbor。
+
+否则里面的yaml里面的配置无效,就没办法拉取镜像了。
+```
+      imagePullSecrets:
+        - name: harbor
+```
+
+
+

+ 29 - 0
devops指南/README.md

@@ -0,0 +1,29 @@
+因为我们不是专业的讲师,所以专业的讲课交给专业的人处理。
+
+如果想要了解devops的可以看下:https://www.bilibili.com/video/BV13Y411E7nd
+
+nfs的概念可以看下这个:https://www.bilibili.com/video/BV13Q4y1C7hS/?p=63
+
+
+jenkins点击部署大概会经历以下几个流程:
+1. 在jenkins内部对代码进行打包(maven或者npm)进行打包。
+2. 然后用docker进行build构建镜像。
+3. 将已经构建好的docker镜像放到harbor当中。
+4. 通知k8s拉取harbor当中的镜像部署。
+
+因此需要安装jenkins、harbor、k8s。推荐 jenkins和harbor放在一台硬盘容量的机器,比如1t的硬盘。
+
+如果只是测试环境:k8s至少需要一台master(2核4g),一台node(8核32g)。
+
+如果是生产环境:k8s至少需要一台master(2核4g),node节点不限台,内存加起来起码要超过64g。
+
+因为用上了k8s,所以有公共存储的概念,还需要一台机器作为nfs。
+
+一共至少需要4台机器: 
+1. 一台`jenkins+harbor`(1t硬盘)
+2. 一台k8s master(2核4g)
+3. 一台k8s node(8核32g)
+4. 一台nfs(1t硬盘)
+
+
+

+ 74 - 0
devops指南/jenkinsfile/mall4j-b2b2c-h5-release.jenkinsfile

@@ -0,0 +1,74 @@
+pipeline {
+    agent any
+
+    environment {
+        // git账号,不用改
+        GIT_CREDENTIAL_ID = '175776d4-6bbc-4da1-ace2-f2a89453fba4'
+        // git地址
+        GIT_ADDRESS = 'https://git.mall4j.com/bbc/mall4uni-bbc'
+        // git分支
+        GIT_BRANCH = 'master'
+
+        // harbor账号,不用改
+        HARBOR_CREDENTIAL_ID = 'edd44d2d-f182-40ab-8e72-b4fcae6f793f'
+        // harbor地址
+        HARBOR_ADDR = '192.168.1.11:80'
+        // 名命空间
+        NAMESPACE = 'mall4j-b2b2c-release'
+    }
+    stages {
+        stage ('拉取git仓库代码') {
+            steps {
+                checkout([$class: 'GitSCM', branches: [[name: '*/' + "$GIT_BRANCH"]], extensions: [], userRemoteConfigs: [[credentialsId: "$GIT_CREDENTIAL_ID", url: "$GIT_ADDRESS"]]])
+            }
+        }
+        stage ('通过pnpm构建项目') {
+            steps {
+                sh '''export PATH=/var/jenkins_home/nodejs/bin:$PATH
+
+rm -f .env.production
+tee ./.env.production <<-'EOF'
+# 如需添加更多环境变量,请以 VITE_APP_ 开头声明
+# 在代码中使用 import.meta.env.VITE_APP_XXX 获取指定变量
+# 环境配置标识
+VITE_APP_ENV = 'production'
+# 微信公众号appid
+# 注意此处为微信 公众号appid,不是小程序appid
+# 小程序appid在 manifest.json 文件的 mp-weixin.appid 字段中配置
+VITE_APP_MP_APPID = 'wx42bbe857570c5b40'
+# h5或其它app打开当前App的自定义UrlSchemes,还需要在manifest.json -> distribute -> app-plus -> android/schemes 与 ios urltypes  中进行配置 (二者需要一致)
+VITE_APP_URL_SCHEMES = 'lanhaibbc'
+# 统一接口域名
+VITE_APP_BASE_API = 'https://b2b2c-api.mall4j.com'
+# 客服|直播webstock接口请求地址
+VITE_APP_WS_IM_API = 'wss://b2b2c-im.mall4j.com'
+# 移动端域名地址配置
+# 需要配置到 微信公众号后台 JS安全域名
+# 用于微信公众号页面调用微信接口能力、生成分享二维码链接等
+VITE_APP_H5_DOMAIN = 'https://h5.mall4j.com'
+# 图片域名
+VITE_APP_RESOURCES_URL = 'https://img.mall4j.com/'
+# 商家管理后台地址
+VITE_APP_MERCHANT_PLATFORM_URL = 'https://b2b2c-multishop.mall4j.com'
+# 天地图Key
+VITE_APP_MAP_KEY = ''
+EOF
+npm config set registry https://registry.npmmirror.com
+pnpm install --no-frozen-lockfile
+npm run build:h5'''
+            }
+        }
+        stage('构建yami-shop-h5镜像') {
+            steps {
+                withEnv(["PROJECT_NAME=yami-shop-h5"]) {
+                    sh 'docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
+                    withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
+                        sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
+                        sh 'docker push  $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
+                        sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
+                    }
+                }
+            }
+        }
+    }
+}

+ 78 - 0
devops指南/jenkinsfile/mall4j-b2b2c-java-release.jenkinsfile

@@ -0,0 +1,78 @@
+pipeline {
+    agent any
+
+    environment {
+        JAVA_HOME = "/var/jenkins_home/jdk"
+        // git账号,不用改
+        GIT_CREDENTIAL_ID = '175776d4-6bbc-4da1-ace2-f2a89453fba4'
+        // git地址
+        GIT_ADDRESS = 'https://git.mall4j.com/bbc/mall4j-bbc'
+        // git分支
+        GIT_BRANCH = 'master'
+
+        // harbor账号,不用改
+        HARBOR_CREDENTIAL_ID = 'edd44d2d-f182-40ab-8e72-b4fcae6f793f'
+        // harbor地址
+        HARBOR_ADDR = '192.168.1.11:80'
+        // 名命空间
+        NAMESPACE = 'mall4j-b2b2c-release'
+    }
+    stages {
+        stage ('拉取git仓库代码') {
+            steps {
+                checkout([$class: 'GitSCM', branches: [[name: '*/' + "$GIT_BRANCH"]], extensions: [], userRemoteConfigs: [[credentialsId: "$GIT_CREDENTIAL_ID", url: "$GIT_ADDRESS"]]])
+            }
+        }
+        stage ('通过maven构建项目') {
+            steps {
+                // 替换es索引地址
+                sh 'sed -i "s#PRODUCT(\\"product\\")#PRODUCT(\\"$NAMESPACE-product\\")#g" ./yami-shop-search/yami-shop-search-common/src/main/java/com/yami/shop/search/common/constant/EsIndexEnum.java'
+                // 替换定时任务
+                sh 'sed -i "s#\\"mall4j-bbc\\"#\\"mall4j-bbc\\"#g" ./yami-shop-platform/src/main/java/com/yami/shop/platform/config/XxlJobConfig.java'
+                // 构建项目
+                sh '/var/jenkins_home/maven/bin/mvn -T 1C clean package -DskipTests=true'
+            }
+        }
+        stage ('通过docker并行制作镜像') {
+
+            parallel {
+                stage('构建yami-shop-api镜像') {
+                    steps {
+                        withEnv(["PROJECT_NAME=yami-shop-api"]) {
+                            sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
+                            withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
+                                sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
+                                sh 'docker push  $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
+                                sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
+                            }
+                        }
+                    }
+                }
+                stage('构建yami-shop-multishop镜像') {
+                    steps {
+                        withEnv(["PROJECT_NAME=yami-shop-multishop"]) {
+                            sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
+                            withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
+                                sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
+                                sh 'docker push  $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
+                                sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
+                            }
+                        }
+                    }
+                }
+                stage('构建yami-shop-platform镜像') {
+                    steps {
+                        withEnv(["PROJECT_NAME=yami-shop-platform"]) {
+                            sh 'cd ./$PROJECT_NAME && docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
+                            withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
+                                sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
+                                sh 'docker push  $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
+                                sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 72 - 0
devops指南/jenkinsfile/mall4j-b2b2c-ms-release.jenkinsfile

@@ -0,0 +1,72 @@
+pipeline {
+    agent any
+
+    environment {
+        // git账号,不用改
+        GIT_CREDENTIAL_ID = '175776d4-6bbc-4da1-ace2-f2a89453fba4'
+        // git地址
+        GIT_ADDRESS = 'https://git.mall4j.com/bbc/mall4ms-bbc'
+        // git分支
+        GIT_BRANCH = 'master'
+
+        // harbor账号,不用改
+        HARBOR_CREDENTIAL_ID = 'edd44d2d-f182-40ab-8e72-b4fcae6f793f'
+        // harbor地址
+        HARBOR_ADDR = '192.168.1.11:80'
+        // 名命空间
+        NAMESPACE = 'mall4j-b2b2c-release'
+    }
+    stages {
+        stage ('拉取git仓库代码') {
+            steps {
+                checkout([$class: 'GitSCM', branches: [[name: '*/' + "$GIT_BRANCH"]], extensions: [], userRemoteConfigs: [[credentialsId: "$GIT_CREDENTIAL_ID", url: "$GIT_ADDRESS"]]])
+            }
+        }
+        stage ('通过npm构建项目') {
+            steps {
+                sh '''export PATH=/var/jenkins_home/nodejs/bin:$PATH
+rm -f .env.production
+tee ./.env.production <<-'EOF'
+# 如需添加更多环境变量,请以 VITE_APP_ 开头声明
+# 在代码中使用 import.meta.env.VITE_APP_XXX 获取指定变量
+# 环境配置标识
+VITE_APP_ENV = 'production'
+# 微信公众号appid
+VITE_APP_MP_APPID = ''
+# 统一接口域名
+VITE_APP_BASE_API = 'https://b2b2c-multishop.mall4j.com/apis'
+# 客服webstock接口请求地址
+VITE_APP_WS_IM_API = 'wss://b2b2c-im.mall4j.com'
+# 移动端域名地址配置
+VITE_APP_H5_DOMAIN = 'https://h5.mall4j.com/'
+# 商家端后台地址(pc)
+VITE_APP_MERCHANT_PKATFORM_URL = 'https://b2b2c-multishop.mall4j.com/'
+# 图片域名
+VITE_APP_RESOURCES_URL = 'https://img.mall4j.com/'
+// h5或其它app打开当前App的自定义UrlSchemes,还需要在manifest.json -> app-plus -> android/schemes 与 ios urltypes  中进行配置 (二者需要一致) (不可与用户移动端的urlSchemes相同)
+VITE_APP_URL_SCHEMES = 'lanhaibbcms'
+# 天地图Key
+VITE_APP_MAP_KEY = ''
+EOF
+cd src
+sed -i 's#"key" : ""#"key" : ""#g' manifest.json
+cd ..
+npm config set registry https://registry.npmmirror.com
+pnpm install --no-frozen-lockfile
+npm run build:h5'''
+            }
+        }
+        stage('构建yami-shop-ms镜像') {
+            steps {
+                withEnv(["PROJECT_NAME=yami-shop-ms"]) {
+                    sh 'docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
+                    withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
+                        sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
+                        sh 'docker push  $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
+                        sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
+                    }
+                }
+            }
+        }
+    }
+}

+ 55 - 0
devops指南/jenkinsfile/mall4j-b2b2c-pc-release.jenkinsfile

@@ -0,0 +1,55 @@
+pipeline {
+    agent any
+
+    environment {
+        // git账号,不用改
+        GIT_CREDENTIAL_ID = '175776d4-6bbc-4da1-ace2-f2a89453fba4'
+        // git地址
+        GIT_ADDRESS = 'https://git.mall4j.com/bbc/mall4pc-bbc'
+        // git分支
+        GIT_BRANCH = 'master'
+
+        // harbor账号,不用改
+        HARBOR_CREDENTIAL_ID = 'edd44d2d-f182-40ab-8e72-b4fcae6f793f'
+        // harbor地址
+        HARBOR_ADDR = '192.168.1.11:80'
+        // 名命空间
+        NAMESPACE = 'mall4j-b2b2c-release'
+    }
+    stages {
+        stage ('拉取git仓库代码') {
+            steps {
+                checkout([$class: 'GitSCM', branches: [[name: '*/' + "$GIT_BRANCH"]], extensions: [], userRemoteConfigs: [[credentialsId: "$GIT_CREDENTIAL_ID", url: "$GIT_ADDRESS"]]])
+            }
+        }
+        stage ('通过npm构建项目') {
+            steps {
+sh '''export PATH=/var/jenkins_home/nodejs/bin:$PATH
+rm -f .env.production
+tee ./.env.production <<-'EOF'
+VITE_APP_RESOURCES_ACTION_TYPE = '1'
+VITE_APP_RESOURCES_URL = 'https://mall4j-minio.mall4j.com/mall4j/'
+VITE_APP_BASE_API = 'https://b2b2c-api.mall4j.com'
+VITE_APP_WS_IM_API = 'wss://b2b2c-im.mall4j.com'
+VITE_APP_H5_DOMAIN = 'https://h5.mall4j.com'
+VITE_APP_MERCHANT_PLATFORM_URL = 'https://b2b2c-multishop.mall4j.com'
+EOF
+npm config set registry https://registry.npmmirror.com
+pnpm install --no-frozen-lockfile
+npm run build'''
+            }
+        }
+        stage('构建yami-shop-pc镜像') {
+            steps {
+                withEnv(["PROJECT_NAME=yami-shop-pc"]) {
+                    sh 'docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
+                    withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
+                        sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
+                        sh 'docker push  $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
+                        sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
+                    }
+                }
+            }
+        }
+    }
+}

+ 68 - 0
devops指南/jenkinsfile/mall4j-b2b2c-s-release.jenkinsfile

@@ -0,0 +1,68 @@
+pipeline {
+    agent any
+
+    environment {
+        // git账号,不用改
+        GIT_CREDENTIAL_ID = '175776d4-6bbc-4da1-ace2-f2a89453fba4'
+        // git地址
+        GIT_ADDRESS = 'https://git.mall4j.com/bbc/mall4s'
+        // git分支
+        GIT_BRANCH = 'master'
+
+        // harbor账号,不用改
+        HARBOR_CREDENTIAL_ID = 'edd44d2d-f182-40ab-8e72-b4fcae6f793f'
+        // harbor地址
+        HARBOR_ADDR = '192.168.1.11:80'
+        // 名命空间
+        NAMESPACE = 'mall4j-b2b2c-release'
+    }
+    stages {
+        stage ('拉取git仓库代码') {
+            steps {
+                checkout([$class: 'GitSCM', branches: [[name: '*/' + "$GIT_BRANCH"]], extensions: [], userRemoteConfigs: [[credentialsId: "$GIT_CREDENTIAL_ID", url: "$GIT_ADDRESS"]]])
+            }
+        }
+        stage ('通过npm构建项目') {
+            steps {
+                sh '''export PATH=/var/jenkins_home/nodejs/bin:$PATH
+                rm -f .env.production
+tee ./.env.production <<-'EOF'
+# 如需添加更多环境变量,请以 VITE_APP_ 开头声明
+# 在代码中使用 import.meta.env.VITE_APP_XXX 获取指定变量
+# 环境配置标识
+VITE_APP_ENV = 'production'
+# 微信公众号appid
+VITE_APP_MP_APPID = 'wx42bbe857570c5b40'
+# 统一接口域名
+VITE_APP_BASE_API = 'https://b2b2c-api.mall4j.com'
+# 移动端域名地址配置
+# 需要配置到 微信公众号后台 JS安全域名中,用于微信公众号页面调用微信接口能力
+VITE_APP_H5_DOMAIN = 'https://h5.mall4j.com'
+# 图片域名
+VITE_APP_RESOURCES_URL = 'https://img.mall4j.com/'
+# 天地图Key
+VITE_APP_MAP_KEY = 'xxx'
+EOF
+
+cd src
+sed -i 's#"key" : ""#"key" : "xxx"#g' manifest.json
+cd ..
+npm config set registry https://registry.npmmirror.com
+pnpm install --no-frozen-lockfile
+npm run build:h5'''
+            }
+        }
+        stage('构建yami-shop-s镜像') {
+            steps {
+                withEnv(["PROJECT_NAME=yami-shop-s"]) {
+                    sh 'docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
+                    withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
+                        sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
+                        sh 'docker push  $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
+                        sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
+                    }
+                }
+            }
+        }
+    }
+}

+ 62 - 0
devops指南/jenkinsfile/mall4j-b2b2c-vp-release.jenkinsfile

@@ -0,0 +1,62 @@
+pipeline {
+    agent any
+
+    environment {
+        // git账号,不用改
+        GIT_CREDENTIAL_ID = '175776d4-6bbc-4da1-ace2-f2a89453fba4'
+        // git地址
+        GIT_ADDRESS = 'https://git.mall4j.com/bbc/mall4vp-bbc'
+        // git分支
+        GIT_BRANCH = 'master'
+
+        // harbor账号,不用改
+        HARBOR_CREDENTIAL_ID = 'edd44d2d-f182-40ab-8e72-b4fcae6f793f'
+        // harbor地址
+        HARBOR_ADDR = '192.168.1.11:80'
+        // 名命空间
+        NAMESPACE = 'mall4j-b2b2c-release'
+    }
+    stages {
+        stage ('拉取git仓库代码') {
+            steps {
+                checkout([$class: 'GitSCM', branches: [[name: '*/' + "$GIT_BRANCH"]], extensions: [], userRemoteConfigs: [[credentialsId: "$GIT_CREDENTIAL_ID", url: "$GIT_ADDRESS"]]])
+            }
+        }
+        stage ('通过npm构建项目') {
+            steps {
+                sh '''export PATH=/var/jenkins_home/nodejs/bin:$PATH
+
+rm -f .env.production
+tee ./.env.production <<-'EOF'
+# 环境配置标识
+ENV = 'production'
+# api接口请求地址
+VITE_APP_BASE_API = 'https://b2b2c-platform.mall4j.com/apis'
+# 客服websocket接口请求地址
+VITE_APP_WS_IM_API = 'wss://b2b2c-im.mall4j.com'
+# 静态资源文件url
+VITE_APP_RESOURCES_URL = 'https://img.mall4j.com/'
+# 天地图Key
+VITE_APP_MAP_KEY = 'xxx'
+EOF
+
+sed -i "s#b2b2c-platform.mall4j.com#b2b2c-platform.mall4j.com#g" nginx.conf
+npm config set registry https://registry.npmmirror.com
+pnpm install --no-frozen-lockfile
+npm run build'''
+            }
+        }
+        stage('构建yami-shop-vp镜像') {
+            steps {
+                withEnv(["PROJECT_NAME=yami-shop-vp"]) {
+                    sh 'docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
+                    withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
+                        sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
+                        sh 'docker push  $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
+                        sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
+                    }
+                }
+            }
+        }
+    }
+}

+ 61 - 0
devops指南/jenkinsfile/mall4j-b2b2c-vs-release.jenkinsfile

@@ -0,0 +1,61 @@
+pipeline {
+    agent any
+
+    environment {
+        // git账号,不用改
+        GIT_CREDENTIAL_ID = '175776d4-6bbc-4da1-ace2-f2a89453fba4'
+        // git地址
+        GIT_ADDRESS = 'https://git.mall4j.com/bbc/mall4vs-bbc'
+        // git分支
+        GIT_BRANCH = 'master'
+
+        // harbor账号,不用改
+        HARBOR_CREDENTIAL_ID = 'edd44d2d-f182-40ab-8e72-b4fcae6f793f'
+        // harbor地址
+        HARBOR_ADDR = '192.168.1.11:80'
+        // 名命空间
+        NAMESPACE = 'mall4j-b2b2c-release'
+    }
+    stages {
+        stage ('拉取git仓库代码') {
+            steps {
+                checkout([$class: 'GitSCM', branches: [[name: '*/' + "$GIT_BRANCH"]], extensions: [], userRemoteConfigs: [[credentialsId: "$GIT_CREDENTIAL_ID", url: "$GIT_ADDRESS"]]])
+            }
+        }
+        stage ('通过npm构建项目') {
+            steps {
+                sh '''export PATH=/var/jenkins_home/nodejs/bin:$PATH
+rm -f .env.production
+tee ./.env.production <<-'EOF'
+# 环境配置标识
+ENV = 'production'
+# api接口请求地址
+VITE_APP_BASE_API = 'https://b2b2c-multishop.mall4j.com/apis'
+# 客服webstock接口请求地址
+VITE_APP_WS_IM_API = 'wss://b2b2c-im.mall4j.com'
+# 静态资源文件url 这里有个斜杠
+VITE_APP_RESOURCES_URL = 'https://img.mall4j.com/'
+# 天地图Key
+VITE_APP_MAP_KEY = 'xxx'
+EOF
+
+sed -i "s#b2b2c-multishop.mall4j.com#b2b2c-multishop.mall4j.com#g" nginx.conf
+npm config set registry https://registry.npmmirror.com
+pnpm install --no-frozen-lockfile
+npm run build'''
+            }
+        }
+        stage('构建yami-shop-vs镜像') {
+            steps {
+                withEnv(["PROJECT_NAME=yami-shop-vs"]) {
+                    sh 'docker build -t $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER .'
+                    withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
+                        sh 'echo "$DOCKER_PASSWORD" | docker login $HARBOR_ADDR -u "$DOCKER_USERNAME" --password-stdin'
+                        sh 'docker push  $HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER'
+                        sh 'ssh root@192.168.1.5 kubectl set image deploy/$PROJECT_NAME $PROJECT_NAME=$HARBOR_ADDR/$NAMESPACE/$PROJECT_NAME:$BUILD_NUMBER -n $NAMESPACE'
+                    }
+                }
+            }
+        }
+    }
+}

+ 958 - 0
devops指南/mall4j-b2b2c-release.yaml

@@ -0,0 +1,958 @@
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: yami-shop-api
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-api
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: yami-shop-api
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: yami-shop-api
+      annotations:
+        kubectl.kubernetes.io/restartedAt: '2022-10-12T16:47:44+08:00'
+    spec:
+      volumes:
+        - name: yami-shop-api
+          nfs:
+            server: 192.168.1.28
+            path: /nfs/data/mall4j-b2b2c-release/
+      containers:
+        - name: yami-shop-api
+          image: '192.168.1.11:80/mall4j-b2b2c-release/yami-shop-api:0'
+          env:
+            - name: TZ
+              value: Asia/Shanghai
+            - name: MYSQL_HOST
+              value: 10.1.246.56
+            - name: MYSQL_PORT
+              value: '3306'
+            - name: MYSQL_DATABASE
+              value: mall4j_b2b2c_release
+            - name: MYSQL_USERNAME
+              value: root
+            - name: MYSQL_PASSWORD
+              value: 'hn02le.34lkdLKD'
+            - name: REDIS_HOST
+              value: 10.1.58.182
+            - name: REDIS_PORT
+              value: '6379'
+            - name: REDIS_DATABASE
+              value: '6'
+            - name: REDIS_PASSWORD
+              value: 'hn02le.34lkdLKD'
+            - name: ELASTIC_ADDRESS
+              value: 'http://10.1.96.227:9200'
+            - name: ELASTIC_USERNAME
+              value: elastic
+            - name: ELASTIC_PASSWORD
+              value: 'hn02le.34lkdLKD'
+            - name: DATACENTER_ID
+              value: '21'
+            - name: WUKONGIM_ADDRESS
+              value: 'http://10.1.207.132:5001'
+            - name: WUKONGIM_TOKEN
+              value: 'hn02le.34lkdLKD'
+            - name: SMS_SUPPLIER
+              value: 'alibaba'
+            - name: SMS_ACCESS_KEY_ID
+              value: '必填短信服务accessKeyId'
+            - name: SMS_ACCESS_KEY_SECRET
+              value: '必填短信accessKeySecret'
+            - name: SMS_SIGNATURE
+              value: '必填短信签名signName'
+            - name: JAVA_OPTS
+              value: >-
+                -Xmx1024m -Xss256k -Xshareclasses -Xtune:virtualized
+                -Dspring.profiles.active=docker
+          resources: {}
+          volumeMounts:
+            - name: yami-shop-api
+              mountPath: /opt/projects/yami-b2b2c/log
+              subPath: ./yami-shop-api/log
+          livenessProbe:
+            httpGet:
+              path: /actuator/health/liveness
+              port: 8112
+              scheme: HTTP
+            initialDelaySeconds: 30
+            timeoutSeconds: 1
+            periodSeconds: 30
+            successThreshold: 1
+            failureThreshold: 3
+          readinessProbe:
+            httpGet:
+              path: /actuator/health/readiness
+              port: 8112
+              scheme: HTTP
+            initialDelaySeconds: 30
+            timeoutSeconds: 1
+            periodSeconds: 30
+            successThreshold: 1
+            failureThreshold: 3
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: Default
+      securityContext: {}
+      imagePullSecrets:
+        - name: harbor
+      schedulerName: default-scheduler
+      dnsConfig: {}
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: yami-shop-h5
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-h5
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: yami-shop-h5
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: yami-shop-h5
+      annotations:
+        kubectl.kubernetes.io/restartedAt: '2022-10-13T11:58:12+08:00'
+    spec:
+      containers:
+        - name: yami-shop-h5
+          image: '192.168.1.11:80/mall4j-b2b2c-release/yami-shop-h5:0'
+          resources: {}
+          livenessProbe:
+            httpGet:
+              path: /
+              port: 80
+              scheme: HTTP
+            initialDelaySeconds: 3
+            timeoutSeconds: 1
+            periodSeconds: 10
+            successThreshold: 1
+            failureThreshold: 3
+          readinessProbe:
+            httpGet:
+              path: /
+              port: 80
+              scheme: HTTP
+            initialDelaySeconds: 3
+            timeoutSeconds: 1
+            periodSeconds: 10
+            successThreshold: 1
+            failureThreshold: 3
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: Default
+      securityContext: {}
+      imagePullSecrets:
+        - name: harbor
+      schedulerName: default-scheduler
+      dnsConfig: {}
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: yami-shop-ms
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-ms
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: yami-shop-ms
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: yami-shop-ms
+      annotations:
+        kubectl.kubernetes.io/restartedAt: '2022-10-13T12:05:54+08:00'
+    spec:
+      containers:
+        - name: yami-shop-ms
+          image: '192.168.1.11:80/mall4j-b2b2c-release/yami-shop-ms:0'
+          resources: {}
+          livenessProbe:
+            httpGet:
+              path: /
+              port: 80
+              scheme: HTTP
+            initialDelaySeconds: 3
+            timeoutSeconds: 1
+            periodSeconds: 10
+            successThreshold: 1
+            failureThreshold: 3
+          readinessProbe:
+            httpGet:
+              path: /
+              port: 80
+              scheme: HTTP
+            initialDelaySeconds: 3
+            timeoutSeconds: 1
+            periodSeconds: 10
+            successThreshold: 1
+            failureThreshold: 3
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: Default
+      securityContext: {}
+      imagePullSecrets:
+        - name: harbor
+      schedulerName: default-scheduler
+      dnsConfig: {}
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: yami-shop-multishop
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-multishop
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: yami-shop-multishop
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: yami-shop-multishop
+      annotations:
+        kubectl.kubernetes.io/restartedAt: '2022-10-12T16:47:44+08:00'
+    spec:
+      volumes:
+        - name: yami-shop-multishop
+          nfs:
+            server: 192.168.1.28
+            path: /nfs/data/mall4j-b2b2c-release/
+      containers:
+        - name: yami-shop-multishop
+          image: '192.168.1.11:80/mall4j-b2b2c-release/yami-shop-multishop:0'
+          env:
+            - name: TZ
+              value: Asia/Shanghai
+            - name: MYSQL_HOST
+              value: 10.1.246.56
+            - name: MYSQL_PORT
+              value: '3306'
+            - name: MYSQL_DATABASE
+              value: mall4j_b2b2c_release
+            - name: MYSQL_USERNAME
+              value: root
+            - name: MYSQL_PASSWORD
+              value: 'hn02le.34lkdLKD'
+            - name: REDIS_HOST
+              value: 10.1.58.182
+            - name: REDIS_PORT
+              value: '6379'
+            - name: REDIS_DATABASE
+              value: '6'
+            - name: REDIS_PASSWORD
+              value: 'hn02le.34lkdLKD'
+            - name: ELASTIC_ADDRESS
+              value: 'http://10.1.96.227:9200'
+            - name: ELASTIC_USERNAME
+              value: elastic
+            - name: ELASTIC_PASSWORD
+              value: 'hn02le.34lkdLKD'
+            - name: DATACENTER_ID
+              value: '21'
+            - name: WUKONGIM_ADDRESS
+              value: 'http://10.1.207.132:5001'
+            - name: WUKONGIM_TOKEN
+              value: 'hn02le.34lkdLKD'
+            - name: SMS_SUPPLIER
+              value: 'alibaba'
+            - name: SMS_ACCESS_KEY_ID
+              value: '必填短信服务accessKeyId'
+            - name: SMS_ACCESS_KEY_SECRET
+              value: '必填短信accessKeySecret'
+            - name: SMS_SIGNATURE
+              value: '必填短信签名signName'
+            - name: JAVA_OPTS
+              value: >-
+                -Xmx1024m -Xss256k -Xshareclasses -Xtune:virtualized
+                -Dspring.profiles.active=docker
+          resources: {}
+          volumeMounts:
+            - name: yami-shop-multishop
+              mountPath: /opt/projects/yami-b2b2c/log
+              subPath: ./yami-shop-multishop/log
+          livenessProbe:
+            httpGet:
+              path: /actuator/health/liveness
+              port: 8113
+              scheme: HTTP
+            initialDelaySeconds: 30
+            timeoutSeconds: 1
+            periodSeconds: 30
+            successThreshold: 1
+            failureThreshold: 3
+          readinessProbe:
+            httpGet:
+              path: /actuator/health/readiness
+              port: 8113
+              scheme: HTTP
+            initialDelaySeconds: 30
+            timeoutSeconds: 1
+            periodSeconds: 30
+            successThreshold: 1
+            failureThreshold: 3
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: Default
+      securityContext: {}
+      imagePullSecrets:
+        - name: harbor
+      schedulerName: default-scheduler
+      dnsConfig: {}
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: yami-shop-pc
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-pc
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: yami-shop-pc
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: yami-shop-pc
+      annotations:
+        kubectl.kubernetes.io/restartedAt: '2022-10-13T11:58:12+08:00'
+    spec:
+      containers:
+        - name: yami-shop-pc
+          image: '192.168.1.11:80/mall4j-b2b2c-release/yami-shop-pc:0'
+          env:
+            - name: TZ
+              value: Asia/Shanghai
+          resources: {}
+          livenessProbe:
+            httpGet:
+              path: /
+              port: 80
+              scheme: HTTP
+            initialDelaySeconds: 3
+            timeoutSeconds: 1
+            periodSeconds: 10
+            successThreshold: 1
+            failureThreshold: 3
+          readinessProbe:
+            httpGet:
+              path: /
+              port: 80
+              scheme: HTTP
+            initialDelaySeconds: 3
+            timeoutSeconds: 1
+            periodSeconds: 10
+            successThreshold: 1
+            failureThreshold: 3
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: Default
+      securityContext: {}
+      imagePullSecrets:
+        - name: harbor
+      schedulerName: default-scheduler
+      dnsConfig: {}
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: yami-shop-platform
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-platform
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: yami-shop-platform
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: yami-shop-platform
+      annotations:
+        kubectl.kubernetes.io/restartedAt: '2022-10-12T16:47:44+08:00'
+    spec:
+      volumes:
+        - name: yami-shop-platform
+          nfs:
+            server: 192.168.1.28
+            path: /nfs/data/mall4j-b2b2c-release/
+      containers:
+        - name: yami-shop-platform
+          image: '192.168.1.11:80/mall4j-b2b2c-release/yami-shop-platform:0'
+          env:
+            - name: TZ
+              value: Asia/Shanghai
+            - name: MYSQL_HOST
+              value: 10.1.246.56
+            - name: MYSQL_PORT
+              value: '3306'
+            - name: MYSQL_DATABASE
+              value: mall4j_b2b2c_release
+            - name: MYSQL_USERNAME
+              value: root
+            - name: MYSQL_PASSWORD
+              value: 'hn02le.34lkdLKD'
+            - name: REDIS_HOST
+              value: 10.1.58.182
+            - name: REDIS_PORT
+              value: '6379'
+            - name: REDIS_DATABASE
+              value: '6'
+            - name: REDIS_PASSWORD
+              value: 'hn02le.34lkdLKD'
+            - name: ELASTIC_ADDRESS
+              value: 'http://10.1.96.227:9200'
+            - name: ELASTIC_USERNAME
+              value: elastic
+            - name: ELASTIC_PASSWORD
+              value: 'hn02le.34lkdLKD'
+            - name: XXL_JOB_ADDRESS
+              value: 'http://10.1.165.104:8080/xxl-job-admin'
+            - name: XXL_JOB_ACCESS_TOKEN
+              value: mall4j_token
+            - name: DATACENTER_ID
+              value: '21'
+            - name: WUKONGIM_ADDRESS
+              value: 'http://10.1.207.132:5001'
+            - name: WUKONGIM_TOKEN
+              value: 'hn02le.34lkdLKD'
+            - name: SMS_SUPPLIER
+              value: 'alibaba'
+            - name: SMS_ACCESS_KEY_ID
+              value: '必填短信服务accessKeyId'
+            - name: SMS_ACCESS_KEY_SECRET
+              value: '必填短信accessKeySecret'
+            - name: SMS_SIGNATURE
+              value: '必填短信签名signName'
+            - name: JAVA_OPTS
+              value: >-
+                -Xmx1024m -Xss256k -Xshareclasses -Xtune:virtualized
+                -Dspring.profiles.active=docker
+          resources: {}
+          volumeMounts:
+            - name: yami-shop-platform
+              mountPath: /opt/projects/yami-b2b2c/log
+              subPath: ./yami-shop-platform/log
+          livenessProbe:
+            httpGet:
+              path: /actuator/health/liveness
+              port: 8114
+              scheme: HTTP
+            initialDelaySeconds: 30
+            timeoutSeconds: 1
+            periodSeconds: 30
+            successThreshold: 1
+            failureThreshold: 3
+          readinessProbe:
+            httpGet:
+              path: /actuator/health/readiness
+              port: 8114
+              scheme: HTTP
+            initialDelaySeconds: 30
+            timeoutSeconds: 1
+            periodSeconds: 30
+            successThreshold: 1
+            failureThreshold: 3
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: Default
+      securityContext: {}
+      imagePullSecrets:
+        - name: harbor
+      schedulerName: default-scheduler
+      dnsConfig: {}
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: yami-shop-s
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-s
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: yami-shop-s
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: yami-shop-s
+      annotations:
+        kubectl.kubernetes.io/restartedAt: '2022-10-13T12:06:51+08:00'
+    spec:
+      containers:
+        - name: yami-shop-s
+          image: '192.168.1.11:80/mall4j-b2b2c-release/yami-shop-s:0'
+          resources: {}
+          livenessProbe:
+            httpGet:
+              path: /
+              port: 80
+              scheme: HTTP
+            initialDelaySeconds: 3
+            timeoutSeconds: 1
+            periodSeconds: 10
+            successThreshold: 1
+            failureThreshold: 3
+          readinessProbe:
+            httpGet:
+              path: /
+              port: 80
+              scheme: HTTP
+            initialDelaySeconds: 3
+            timeoutSeconds: 1
+            periodSeconds: 10
+            successThreshold: 1
+            failureThreshold: 3
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: Default
+      securityContext: {}
+      imagePullSecrets:
+        - name: harbor
+      schedulerName: default-scheduler
+      dnsConfig: {}
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: yami-shop-vp
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-vp
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: yami-shop-vp
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: yami-shop-vp
+      annotations:
+        kubectl.kubernetes.io/restartedAt: '2022-10-13T12:05:19+08:00'
+    spec:
+      containers:
+        - name: yami-shop-vp
+          image: '192.168.1.11:80/mall4j-b2b2c-release/yami-shop-vp:0'
+          resources: {}
+          livenessProbe:
+            httpGet:
+              path: /
+              port: 80
+              scheme: HTTP
+            initialDelaySeconds: 3
+            timeoutSeconds: 1
+            periodSeconds: 10
+            successThreshold: 1
+            failureThreshold: 3
+          readinessProbe:
+            httpGet:
+              path: /
+              port: 80
+              scheme: HTTP
+            initialDelaySeconds: 3
+            timeoutSeconds: 1
+            periodSeconds: 10
+            successThreshold: 1
+            failureThreshold: 3
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: Default
+      securityContext: {}
+      imagePullSecrets:
+        - name: harbor
+      schedulerName: default-scheduler
+      dnsConfig: {}
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: yami-shop-vs
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-vs
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: yami-shop-vs
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: yami-shop-vs
+      annotations:
+        kubectl.kubernetes.io/restartedAt: '2022-10-13T12:04:06+08:00'
+    spec:
+      containers:
+        - name: yami-shop-vs
+          image: '192.168.1.11:80/mall4j-b2b2c-release/yami-shop-vs:0'
+          resources: {}
+          livenessProbe:
+            httpGet:
+              path: /
+              port: 80
+              scheme: HTTP
+            initialDelaySeconds: 3
+            timeoutSeconds: 1
+            periodSeconds: 10
+            successThreshold: 1
+            failureThreshold: 3
+          readinessProbe:
+            httpGet:
+              path: /
+              port: 80
+              scheme: HTTP
+            initialDelaySeconds: 3
+            timeoutSeconds: 1
+            periodSeconds: 10
+            successThreshold: 1
+            failureThreshold: 3
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: Default
+      securityContext: {}
+      imagePullSecrets:
+        - name: harbor
+      schedulerName: default-scheduler
+      dnsConfig: {}
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: yami-shop-api
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-api
+spec:
+  ports:
+    - protocol: TCP
+      port: 8112
+      targetPort: 8112
+  selector:
+    k8s.kuboard.cn/name: yami-shop-api
+  type: ClusterIP
+  sessionAffinity: None
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: yami-shop-h5
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-h5
+spec:
+  ports:
+    - name: gp3zqc
+      protocol: TCP
+      port: 80
+      targetPort: 80
+  selector:
+    k8s.kuboard.cn/name: yami-shop-h5
+  type: ClusterIP
+  sessionAffinity: None
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: yami-shop-ms
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-ms
+spec:
+  ports:
+    - name: gp3zqc
+      protocol: TCP
+      port: 80
+      targetPort: 80
+  selector:
+    k8s.kuboard.cn/name: yami-shop-ms
+  type: ClusterIP
+  sessionAffinity: None
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: yami-shop-multishop
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-multishop
+spec:
+  ports:
+    - protocol: TCP
+      port: 8113
+      targetPort: 8113
+  selector:
+    k8s.kuboard.cn/name: yami-shop-multishop
+  type: ClusterIP
+  sessionAffinity: None
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: yami-shop-pc
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-pc
+spec:
+  ports:
+    - protocol: TCP
+      port: 80
+      targetPort: 80
+  selector:
+    k8s.kuboard.cn/name: yami-shop-pc
+  type: ClusterIP
+  sessionAffinity: None
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: yami-shop-platform
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-platform
+spec:
+  ports:
+    - protocol: TCP
+      port: 8114
+      targetPort: 8114
+  selector:
+    k8s.kuboard.cn/name: yami-shop-platform
+  type: ClusterIP
+  sessionAffinity: None
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: yami-shop-s
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-s
+spec:
+  ports:
+    - name: gp3zqc
+      protocol: TCP
+      port: 80
+      targetPort: 80
+  selector:
+    k8s.kuboard.cn/name: yami-shop-s
+  type: ClusterIP
+  sessionAffinity: None
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: yami-shop-vp
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-vp
+spec:
+  ports:
+    - name: gp3zqc
+      protocol: TCP
+      port: 80
+      targetPort: 80
+  selector:
+    k8s.kuboard.cn/name: yami-shop-vp
+  type: ClusterIP
+  sessionAffinity: None
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: yami-shop-vs
+  namespace: mall4j-b2b2c-release
+  labels:
+    k8s.kuboard.cn/name: yami-shop-vs
+spec:
+  ports:
+    - name: gp3zqc
+      protocol: TCP
+      port: 80
+      targetPort: 80
+  selector:
+    k8s.kuboard.cn/name: yami-shop-vs
+  type: ClusterIP
+  sessionAffinity: None
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+

+ 667 - 0
devops指南/mall4j-middleware.yaml

@@ -0,0 +1,667 @@
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: mall4j-elasticsearch
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-elasticsearch
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: mall4j-elasticsearch
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: mall4j-elasticsearch
+    spec:
+      volumes:
+        - name: mall4j-elasticsearch
+          nfs:
+            server: 192.168.1.28
+            path: /nfs/data/mall4j-middleware/mall4j-elasticsearch/
+      containers:
+        - name: mall4j-elasticsearch
+          image: 'elasticsearch:7.17.27'
+          env:
+            - name: TAKE_FILE_OWNERSHIP
+              value: 'true'
+            - name: discovery.type
+              value: single-node
+            - name: ES_JAVA_OPTS
+              value: '-Xms2048m -Xmx2048m'
+            - name: ELASTICSEARCH_USERNAME
+              value: 'elastic'
+            - name: ELASTIC_PASSWORD
+              value: 'hn02le.34lkdLKD'
+            - name: xpack.security.enabled
+              value: 'true'
+          resources: {}
+          volumeMounts:
+            - name: mall4j-elasticsearch
+              mountPath: /usr/share/elasticsearch/data
+              subPath: ./data
+            - name: mall4j-elasticsearch
+              mountPath: /usr/share/elasticsearch/plugins
+              subPath: ./plugins
+            - name: mall4j-elasticsearch
+              mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
+              subPath: ./config/elasticsearch.yml
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: Default
+      securityContext: {}
+      schedulerName: default-scheduler
+      dnsConfig: {}
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: mall4j-minio
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-minio
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: mall4j-minio
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: mall4j-minio
+    spec:
+      volumes:
+        - name: mall4j-minio
+          nfs:
+            server: 192.168.1.28
+            path: /nfs/data/mall4j-middleware/mall4j-minio/
+      containers:
+        - name: mall4j-minio
+          image: 'minio/minio:RELEASE.2024-04-18T19-09-19Z'
+          args:
+            - "server"
+            - "/data"
+            - "--console-address"
+            - ":9001"
+          env:
+            - name: MINIO_ROOT_USER
+              value: admin
+            - name: MINIO_ROOT_PASSWORD
+              value: 'hn02le.34lkdLKD'
+#            - name: MINIO_BROWSER_REDIRECT_URL
+#              value: http://你的代理服务器IP/域名:30682/minio/
+          resources: {}
+          volumeMounts:
+            - name: mall4j-minio
+              mountPath: /data
+              subPath: ./data
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: ClusterFirst
+      securityContext: {}
+      schedulerName: default-scheduler
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: mall4j-aof-redis
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-aof-redis
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: mall4j-aof-redis
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: mall4j-aof-redis
+    spec:
+      volumes:
+        - name: mall4j-aof-redis
+          nfs:
+            path: /nfs/data/mall4j-middleware/mall4j-aof-redis/
+            server: 192.168.1.28
+      containers:
+        - name: mall4j-aof-redis
+          image: redis:7.0
+        - command:
+            - redis-server
+            - /etc/redis/redis.conf
+            - '--requirepass'
+            - hn02le.34lkdLKD
+          resources: {}
+          volumeMounts:
+            - mountPath: /etc/redis/redis.conf
+              name: mall4j-aof-redis
+              subPath: ./redis.conf
+            - mountPath: /data
+              name: mall4j-aof-redis
+              subPath: ./data
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: ClusterFirst
+      securityContext: {}
+      schedulerName: default-scheduler
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: mall4j-redis
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-redis
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: mall4j-redis
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: mall4j-redis
+    spec:
+      containers:
+        - name: mall4j-redis
+          image: redis
+          resources: {}
+          command:
+            - --requirepass hn02le.34lkdLKD
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: ClusterFirst
+      securityContext: {}
+      schedulerName: default-scheduler
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: mall4j-xxl-job
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-xxl-job
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: mall4j-xxl-job
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: mall4j-xxl-job
+    spec:
+      containers:
+        - name: mall4j-xxl-job
+          image: 'xuxueli/xxl-job-admin:3.0.0'
+          env:
+            - name: PARAMS
+              value: >-
+                --spring.datasource.url=jdbc:mysql://10.1.246.56:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 \        
+                --spring.datasource.username=root \        
+                --spring.datasource.password=hn02le.34lkdLKD \        
+                --xxl.job.accessToken=mall4j_token \        
+                --xxl.job.logretentiondays=7
+          resources: {}
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: ClusterFirst
+      securityContext: {}
+      schedulerName: default-scheduler
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: mall4j-nginx
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-nginx
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: mall4j-nginx
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: mall4j-nginx
+    spec:
+      volumes:
+        - name: mall4j-nginx
+          nfs:
+            server: 192.168.1.28
+            path: /nfs/data/mall4j-middleware/mall4j-nginx
+      containers:
+        - name: mall4j-nginx
+          image: nginx
+          ports:
+            - hostPort: 80
+              containerPort: 80
+              protocol: TCP
+          resources: {}
+          volumeMounts:
+            - name: mall4j-nginx
+              mountPath: /etc/nginx/nginx.conf
+              subPath: ./conf/nginx.conf
+            - name: mall4j-nginx
+              mountPath: /etc/nginx/conf.d
+              subPath: ./conf/conf.d
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: Default
+      securityContext: {}
+      schedulerName: default-scheduler
+      dnsConfig: {}
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+  name: mall4j-wukongim
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-wukongim
+  annotations: {}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: mall4j-wukongim
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: mall4j-wukongim
+    spec:
+      volumes:
+        - name: mall4j-wukongim
+          nfs:
+            server: 192.168.1.28
+            path: /nfs/data/mall4j-middleware/mall4j-wukongim
+      containers:
+        - name: mall4j-wukongim
+          image: 'wukongim/wukongim:v2.2.0-20250426'
+          env:
+            - name: WK_MANAGERTOKEN
+              value: hn02le.34lkdLKD
+            - name: WK_WEBHOOK_HTTPADDR
+              value: http://mall4j-multishop:8113/notice/im/online
+          resources: {}
+          volumeMounts:
+            - name: wukongim
+              mountPath: /root/wukongim/wk.yaml
+              subPath: ./wk.yaml
+            - name: wukongim
+              mountPath: /root/wukongim/data
+              subPath: ./data
+            - name: wukongim
+              mountPath: /root/wukongim/logs
+              subPath: ./logs
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: Default
+      nodeName: k8s-node1
+      securityContext: {}
+      schedulerName: default-scheduler
+      dnsConfig: {}
+  strategy:
+    type: RollingUpdate
+    rollingUpdate:
+      maxUnavailable: 25%
+      maxSurge: 25%
+  revisionHistoryLimit: 10
+  progressDeadlineSeconds: 600
+
+---
+kind: StatefulSet
+apiVersion: apps/v1
+metadata:
+  name: mall4j-mysql
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-mysql
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      k8s.kuboard.cn/name: mall4j-mysql
+  template:
+    metadata:
+      creationTimestamp: null
+      labels:
+        k8s.kuboard.cn/name: mall4j-mysql
+    spec:
+      volumes:
+        - name: mall4j-mysql
+          nfs:
+            server: 192.168.1.28
+            path: /nfs/data/mall4j-middleware/mall4j-mysql
+      containers:
+        - name: mall4j-mysql
+          image: 'mysql:8.0.35'
+          env:
+            - name: MYSQL_ROOT_PASSWORD
+              value: 'hn02le.34lkdLKD'
+            - name: TZ
+              value: Asia/Shanghai
+          resources:
+            limits:
+              cpu: '10'
+              memory: 8Gi
+          volumeMounts:
+            - name: mall4j-mysql
+              mountPath: /var/lib/mysql
+              subPath: ./data
+            - name: mall4j-mysql
+              mountPath: /etc/mysql/conf.d
+              subPath: ./conf.d
+          terminationMessagePath: /dev/termination-log
+          terminationMessagePolicy: File
+          imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+      terminationGracePeriodSeconds: 30
+      dnsPolicy: ClusterFirst
+      securityContext: {}
+      schedulerName: default-scheduler
+  serviceName: mall4j-mysql
+  podManagementPolicy: OrderedReady
+  updateStrategy:
+    type: RollingUpdate
+    rollingUpdate:
+      partition: 0
+  revisionHistoryLimit: 10
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: mall4j-minio
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-minio
+spec:
+  ports:
+    - name: wsf6yb
+      protocol: TCP
+      port: 9000
+      targetPort: 9000
+      nodePort: 30681
+    - name: jxaiy0
+      protocol: TCP
+      port: 9001
+      targetPort: 9001
+      nodePort: 30682
+  selector:
+    k8s.kuboard.cn/name: mall4j-minio
+  type: NodePort
+  sessionAffinity: None
+  externalTrafficPolicy: Cluster
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: mall4j-mysql
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-mysql
+spec:
+  ports:
+    - name: c5ii2b
+      protocol: TCP
+      port: 3306
+      targetPort: 3306
+      nodePort: 30268
+  selector:
+    k8s.kuboard.cn/name: mall4j-mysql
+  type: NodePort
+  sessionAffinity: None
+  externalName: mall4j-mysql.mall4j-middleware
+  externalTrafficPolicy: Cluster
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: mall4j-nginx
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-nginx
+spec:
+  ports:
+    - protocol: TCP
+      port: 80
+      targetPort: 80
+  selector:
+    k8s.kuboard.cn/name: mall4j-nginx
+  type: ClusterIP
+  sessionAffinity: None
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: mall4j-xxl-job
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-xxl-job
+spec:
+  ports:
+    - protocol: TCP
+      port: 8080
+      targetPort: 8080
+      nodePort: 30218
+  selector:
+    k8s.kuboard.cn/name: mall4j-xxl-job
+  type: NodePort
+  sessionAffinity: None
+  externalTrafficPolicy: Cluster
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: mall4j-redis
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-redis
+spec:
+  ports:
+    - name: d7feys
+      protocol: TCP
+      port: 6379
+      targetPort: 6379
+      nodePort: 30272
+  selector:
+    k8s.kuboard.cn/name: mall4j-redis
+  type: NodePort
+  sessionAffinity: None
+  externalTrafficPolicy: Cluster
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: mall4j-elasticsearch
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-elasticsearch
+spec:
+  ports:
+    - name: 7yaisb
+      protocol: TCP
+      port: 9200
+      targetPort: 9200
+      nodePort: 31752
+    - name: jxai2k
+      protocol: TCP
+      port: 9300
+      targetPort: 9300
+      nodePort: 31099
+  selector:
+    k8s.kuboard.cn/name: mall4j-elasticsearch
+  type: NodePort
+  sessionAffinity: None
+  externalTrafficPolicy: Cluster
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: mall4j-wukongim
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-wukongim
+spec:
+  ports:
+    - name: x4a3et
+      protocol: TCP
+      port: 5001
+      targetPort: 5001
+      nodePort: 32372
+    - name: i2jkzm
+      protocol: TCP
+      port: 5200
+      targetPort: 5200
+      nodePort: 32665
+  selector:
+    k8s.kuboard.cn/name: mall4j-wukongim
+  type: NodePort
+  sessionAffinity: None
+  externalTrafficPolicy: Cluster
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster
+
+---
+kind: Service
+apiVersion: v1
+metadata:
+  name: mall4j-aof-redis
+  namespace: mall4j-middleware
+  labels:
+    k8s.kuboard.cn/name: mall4j-aof-redis
+spec:
+  ports:
+    - name: qhmx8a
+      protocol: TCP
+      port: 6379
+      targetPort: 6379
+      nodePort: 31377
+  selector:
+    k8s.kuboard.cn/name: mall4j-aof-redis
+  type: NodePort
+  sessionAffinity: None
+  externalTrafficPolicy: Cluster
+  ipFamilies:
+    - IPv4
+  ipFamilyPolicy: SingleStack
+  internalTrafficPolicy: Cluster

BIN
img/%E9%80%80%E6%AC%BE%E6%96%87%E6%A1%A3%5C1566788134396.png


BIN
img/01.png


BIN
img/02.png


BIN
img/05.png


BIN
img/1008612.png


BIN
img/20201026164913.png


BIN
img/20201026165651.png


BIN
img/20201026170018.png


BIN
img/24.png


BIN
img/ShopWalet/1-01.png


BIN
img/ShopWalet/1-02.png


BIN
img/ShopWalet/1-03.png


BIN
img/ShopWalet/2-01.png


BIN
img/ShopWalet/2-02.png


BIN
img/ShopWalet/2-03.png


BIN
img/ShopWalet/3-01.png


BIN
img/ShopWalet/3-02.png


BIN
img/ShopWalet/4-01.png


BIN
img/ShopWalet/4-02.png


BIN
img/ShopWalet/4-03.png


BIN
img/ShopWalet/5-01.png


BIN
img/app打包/android/AppKey.png


BIN
img/app打包/android/修改包名、签名.png


BIN
img/app打包/android/导入工程.png


BIN
img/app打包/android/导入资源.png


BIN
img/app打包/android/导出资源.png


BIN
img/app打包/android/应用名称.png


BIN
img/app打包/android/微信支付1.png


BIN
img/app打包/android/微信支付2.png


BIN
img/app打包/android/打包apk.png


BIN
img/app打包/android/检查appid.png


BIN
img/app打包/ios/xcode配置自动签名.png


BIN
img/app打包/ios/修改control文件appid.png


BIN
img/app打包/ios/导入本地打包app资源.png


BIN
img/app打包/ios/打包上传1.png


BIN
img/app打包/ios/打包上传2.png


BIN
img/app打包/ios/打包上传3.png


BIN
img/app打包/ios/打包上传4.png


BIN
img/app打包/ios/打包上传5.png


BIN
img/app打包/ios/打包配置.png


BIN
img/app打包/ios/生成本地打包app资源.png


BIN
img/app打包/ios/签名配置.png


BIN
img/app打包/ios/签名错误1.png


BIN
img/app打包/ios/签名错误2.png


BIN
img/app打包/ios/配置appkey.png


BIN
img/app打包/ios/配置app图标1.png


BIN
img/app打包/ios/配置app图标2.png


BIN
img/app打包/ios/配置应用名称.png


BIN
img/app打包/ios/配置版本信息.png


BIN
img/h5支付域名.png


BIN
img/nginx文件上传配置.png


BIN
img/no_scope.png


BIN
img/sku.png


BIN
img/tk01.png


BIN
img/tk03.png


BIN
img/uniapp资源文件url.png


BIN
img/一些常见问题/Es开启or关闭1.png


BIN
img/一些常见问题/Es开启or关闭2.png


BIN
img/一些常见问题/xxl-job连接-01.png


BIN
img/一些常见问题/xxl-job连接-02.png


BIN
img/一些常见问题/xxl-job连接-03.png


BIN
img/一些常见问题/xxl-job连接-04.png


BIN
img/一些常见问题/xxl-job连接-05.png


BIN
img/一些常见问题/图片域名问题处理-01.png


BIN
img/一些常见问题/图片域名问题处理-02.png


BIN
img/一些常见问题/图片域名问题处理-03.png


BIN
img/一些常见问题/图片域名问题处理-04.png


BIN
img/一些常见问题/图片域名问题处理-05.png


BIN
img/一些常见问题/图片域名问题处理-06.png


BIN
img/一些常见问题/平台端支付证书配置-01.png


BIN
img/一些常见问题/平台端支付证书配置-02.png


BIN
img/一些常见问题/平台端支付证书配置-03.png


BIN
img/一些常见问题/平台端支付证书配置-04.png


BIN
img/一些常见问题/平台端支付证书配置-06.png


BIN
img/中间件安装/es-01.png


BIN
img/中间件安装/es-02.png


BIN
img/中间件安装/es-03.png


BIN
img/中间件安装/es-04.png


BIN
img/中间件安装/es-05.png


BIN
img/中间件安装/es-06.png


BIN
img/中间件安装/es-07.png


BIN
img/中间件安装/es-08.png


Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio