一.环境需求

配置项

说明

操作系统

CentOS 7.9

CPU

4 核

内存

8 GB

二.项目介绍

mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis
实现。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、
会员中心、客户服务、帮助中心等模块。 后台管理系统包含商品管理、订单管理、会员管
理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。

2.1系统构架图

2.2 业务架构图

2.3 涉及到部署技术栈

2.4 项目环境需求

三.前置准备

3.1 Docker环境安装

安装yum-utils:
yum install -y yum-utils device-mapper-persistent-data lvm2

安装docker:
yum install docker-ce

为yum源添加docker仓库位置:
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-
ce.repo -O /etc/yum.repos.d/docker-ce.repo

vim /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://docker.1panel.live",
    "https://docker.fxxk.dedyn.io",
    "https://hub.rat.dev",
    "https://docker.anyhub.us.kg",
    "https://dockerhub.jobcher.com",
    "https://dockerhub.icu",
    "https://mirror.aliyuncs.com",
    "https://mirror.baidubce.com",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker..ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc",
    "https://atomhub.openatom.cn",
    "https://dockerpull.com"
  ]
}

#重启docker
systemctl daemon-reload
systemctl restart docker

3.2 MySQL安装

下载MySQL5.7的docker镜像
docker pull mysql:5.7

使用如下命令启动MySQL服务:
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:5.7

进入运行MySQL的docker容器:
# 安装mysql客户端
yum -y install mysql
# 登入数据库
mysql -uroot -proot -h 127.0.0.1 --default-character-set=utf8
# 创建数据库
create database mall character set utf8;

将sql文件导入到数据库:
mysql -uroot -proot -h 127.0.0.1 mall < mall.sql

创建一个reader:123456帐号并修改权限,使得任何ip都能访问:
mysql -uroot -proot -h 127.0.0.1
grant all privileges on *.* to 'reader' @'%' identified by 
'123456';
flush privileges;
exit

3.3 Redis安装

下载Redis7的docker镜像:
docker pull redis:7

使用如下命令启动Redis服务:
docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
--restart=always \
-d redis:7 redis-server --appendonly yes

进入Redis容器使用redis-cli命令进行连接:
docker exec -it redis redis-cli

3.4 Nginx安装

下载Nginx1.22的docker镜像:
docker pull nginx:1.22

先运行一次容器(为了拷贝配置文件):
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
--restart=always \
-v /mydata/nginx/logs:/var/log/nginx  \
-d nginx:1.22

将容器内的配置文件拷贝到指定目录:
docker cp nginx:/etc/nginx /mydata/nginx/

修改文件名称:
cd /mydata/nginx
mv nginx conf

终止并删除容器:
docker stop nginx
docker rm nginx

使用如下命令启动Nginx服务:
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx  \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.22

3.5 RabbitMQ

安装 + 下载rabbitmq:3.7.15的docker镜像:
docker pull rabbitmq:3.7.15

使用如下命令启动RabbitMQ服务:
docker run -p 5672:5672 -p 15672:15672 --name rabbitmq \
--restart=always \
-v /mydata/rabbitmq/data:/var/lib/rabbitmq \
-d rabbitmq:3.7.15

进入容器启动
docker exec -it rabbitmq /bin/bash
rabbitmq-plugins enable rabbitmq_management

访问管理界面

添加用户

创建一个虚拟主机

给mall用户配置该虚拟host的权限

3.6 Elasticsearch安装

下载Elasticsearch7.17.3的docker镜像:
docker pull elasticsearch:7.17.3

修改虚拟内存区域大小,否则会因为过小而无法启动
sysctl -w vm.max_map_count=262144

使用如下命令启动Elasticsearch服务,内存小的服务器可以通过ES_JAVA_OPTS来
设置占用内存大小:
docker run -p 9200:9200 -p 9300:9300 --name elasticsearch \
--restart=always \
-e "discovery.type=single-node" \
-e "cluster.name=elasticsearch" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx1024m" \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-d elasticsearch:7.17.3

启动时会发现/usr/share/elasticsearch/data目录没有访问权限,只需要修
改/mydata/elasticsearch/data目录的权限,再重新启动即可;
chmod 777 /mydata/elasticsearch/data/
docker restart elasticsearch

下载分词插件
wget https://release.infinilabs.com/analysis-
ik/stable/elasticsearch-analysis-ik-7.17.3.zip

上传到镜像内
docker cp elasticsearch-analysis-ik-7.17.3.zip elasticsearch:/
docker exec -it elasticsearch /bin/bash
elasticsearch-plugin install file:///elasticsearch-analysis-ik-
7.17.3.zip
exit

重新启动服务:
docker restart elasticsearch

访问会返回版本信息:http://$IP:9200,
{
  "name": "708f1d885c16",
  "cluster_name": "elasticsearch",
  "cluster_uuid": "mza51wT-QvaZ5R0NmE183g",
  "version": {
    "number": "7.17.3",
    "build_flavor": "default",
    "build_type": "docker",
    "build_hash": "5ad023604c8d7416c9eb6c0eadb62b14e766caff",
    "build_date": "2022-04-19T08:11:19.070913226Z",
    "build_snapshot": false,
    "lucene_version": "8.11.1",
    "minimum_wire_compatibility_version": "6.8.0",
    "minimum_index_compatibility_version": "6.0.0-beta1"
  },
  "tagline": "You Know, for Search"
}

3.7 Logstash安装

下载Logstash7.17.3的docker镜像:
docker pull logstash:7.17.3
编辑logstash收集文件
mkdir -p /mydata/logstash
vim /mydata/logstash/logstash.conf
input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
    type => "debug"
  }
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4561
    codec => json_lines
    type => "error"
  }
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4562
    codec => json_lines
    type => "business"
  }
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4563
    codec => json_lines
    type => "record"
  }
}
filter{
  if [type] == "record" {
    mutate {
      remove_field => "port"
      remove_field => "host"
      remove_field => "@version"
    }
    json {
      source => "message"
      remove_field => ["message"]
    }
  }
}
output {
  elasticsearch {
    hosts => "es:9200"
    index => "mall-%{type}-%{+YYYY.MM.dd}"
  }
}

进入容器内部,安装json_lines插件
docker exec -it logstash /bin/bash
logstash-plugin install logstash-codec-json_lines

3.8 Kibana安裝

下载kibana7.17.3的docker镜像: 
docker pull kibana:7.17.3

使用docker命令启动:
docker run --name kibana -p 5601:5601 \
    --restart=always \
    --link elasticsearch:es \
    -e "elasticsearch.hosts=http://es:9200" \
    -d kibana:7.17.3

浏览器访问

3.9 Mongo安裝

下载mongo4的docker镜像:
docker pull mongo:4

使用docker命令启动:
docker run -p 27017:27017 --name mongo \
    --restart=always \
    -v /mydata/mongo/db:/data/db \
    -d mongo:4

3.10 Minio

安装 拉取镜像
docker pull minio/minio

启动容器 
docker run -p 9090:9000 -p 9001:9001 --name minio \
 --restart=always \
-v /mydata/minio/data:/data \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minioadmin \
-d minio/minio server /data --console-address ":9001"

浏览器访问  账号密码:minioadmin / minioadmin

3.11Jenkins安装

拉取镜像
docker pull jenkins/jenkins:lts

启动jendins
docker run -p 8088:8080 -p 50000:50000
--name jenkins
restart=always-v /mydata/jenkins:/var/jenkins_home\
-v /var/run/docker.sock:/var/run/docker.sock\
-v /usr/bin/docker:/usr/bin/docker \> -d jenkins/jenkins:lts

获得初始密码
cat /mydata/jenkins/secrets/initialAdminPassword

浏览器访问,前面还有个输入密码,前面获取的初始密码输入进去就行

四、后端服务部署

4.1 Java代码编译打包前置准备

安装Maven

安装jdk1.8.0

yum install java-1.8.0-openjdk java-1.8.0-devel -y
java -version

修改docker对外接口2375

vim /usr/lib/systemd/system/docker.service
#修改下列内容
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H 
unix://var/run/docker.sock
systemctl daemon-reload 
systemctl restart docker
ss -nlt | grep 2375

因为重启docker确认之前的容器是否启动成功,如果部分没启动可以使用下面的命令(执行3次)

docker start `docker ps -qa`
docker start `docker ps -qa`
docker start `docker ps -qa`
docker ps

拉取后端服务代码

cd /root
git clone https://github.com/macrozheng/mall.git
mall
├── mall-common -- 工具类及通用代码
├── mall-mbg -- MyBatisGenerator生成的数据库操作代码
├── mall-security -- SpringSecurity封装公用模块
├── mall-admin -- 后台商城管理系统接口[*]
├── mall-search -- 基于Elasticsearch的商品搜索系统[*]
├── mall-portal -- 前台商城系统接口[*]
└── mall-demo -- 框架搭建时的测试代码

修改配置参数

cd /root/mall
vim pom.xml
#找到如下关键字,改为docker机器IP:2375
<docker.host>http://192.168.83.168:2375</docker.host>

修改mall-admin配置

vim mall-admin/src/main/resources/application-prod.yml

开始构建打包服务

docker run --rm\
-v /root/mall:/app \
-w /app \
eclipse-temurin:17-jdk \
/bin/bash -c "apt-get update && apt-get install -y maven && mvn clean package -Dmaven.test.skip=true"
启动 JDK 17 容器  挂载项目代码到 /app  在容器内安装 Maven  执行 mvn clean package -Dmaven.test.skip=true

启动后端服务

部署mall-admin

docker run -p 8080:8080 --name mall-admin \
    --restart=always \
    --link mysql:db \
    --link redis:redis \
    --link minio:minio \
    --link logstash:logstash \
    -v /etc/localtime:/etc/localtime \
    -v /mydata/app/admin/logs:/var/logs \
    -d mall/mall-admin:1.0-SNAPSHOT

部署mall-search

docker run -p 8081:8081 --name mall-search \
    --restart=always \
    --link logstash:logstash \
    --link elasticsearch:es \
    --link mysql:db \
    -v /etc/localtime:/etc/localtime \
    -v /mydata/app/search/logs:/var/logs \
    -d mall/mall-search:1.0-SNAPSHOT

部署mall-port

docker run -p 8085:8085 --name mall-portal \
    --restart=always \
    --link logstash:logstash \
    --link mysql:db \
    --link redis:redis \
    --link mongo:mongo \
    --link rabbitmq:rabbit \
    -v /etc/localtime:/etc/localtime \
    -v /mydata/app/portal/logs:/var/logs \
    -d mall/mall-portal:1.0-SNAPSHOT

五、部署管理系統前端页面

5.1 前端服务前置准备

下载安装nodejs工具
wget https://nodejs.org/dist/latest-v16.x/node-v16.20.2-linux-
x64.tar.gz
tar zxvf node-v16.20.2-linux-x64.tar.gz -C  /usr/local/
echo "export NODE_HOME=/usr/local/node-v16.20.2-linux-x64" >> 
/etc/profile
echo "export PATH=\$PATH:\$NODE_HOME/bin" >> /etc/profile
source /etc/profile 
# 查看npm版本
npm -v
node -v

5.2 拉取前端web代码

git clone --branch dev-v2 https://gitee.com/macrozheng/mall-admin-
web.git

修改mall-admin-web配置文件

cd /root/mall-admin-web
vim config/prod.env.js
#将BASE_API修改为后端mall-admin地址端口

编译打包前端服务

### SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ npm 
install node-sass
cd /root/mall-admin-web
npm cache clean --force
npm install --registry=https://registry.npmmirror.com
npm run build

生成目录

将目录复制到nginx目录下替换原有内容

mv dist html
mv /root/mall-admin-web/html/  /mydata/nginx/
# mv:是否覆盖"/mydata/nginx/html"? yes
ls /mydata/nginx/html/
# index.html  static

重启服务

docker restart mall-admin
docker restart nginx

浏览器验证

六、部署APP-UI前端

6.1 打开HbuilderX开发工具

导入项目:

手动下载软件包:https://gitee.com/macrozheng/mall-app-
web/repository/archive/master.zip

导入到软件中

改配置

"sassImplementationName": "node-sass", 

6.2 发行 ==> PC web 或 H5

找到编译后的网页文件上到Nginx /mydata/nginx/html目录内

6.3 访问验证:http://$ip/app/

更多推荐