mall 电商项目完整部署---实战

项目说明:

mall 后端 SpringBoot,mall‑admin‑web 后台管理 Vue 前端,mall‑app‑sc 移动端 uni‑app 前端;全部基于 Docker 部署,操作系统 CentOS7.9 ,最低配置 4 核 8G,关闭防火墙或开放端口。 涉及端口:80、3306、6379、5672、15672、9200、5601、9000、9001、8080、8081、8085 服务器 IP 下文统一用10.8.0.23,替换成自己服务器公网 / 内网 IP 即可。

前置准备工作

1、关闭防火墙(避免端口访问失败)

复制代码
# 关闭防火墙
systemctl stop firewalld
# 开机禁止自启
systemctl disable firewalld
# 关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

2、更新 yum 工具

复制代码
yum install -y yum-utils device-mapper-persistent-data lvm2

第一部分:Docker 环境安装配置

步骤 1:配置阿里云 docker 源

复制代码
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

步骤 2:安装 docker‑ce

复制代码
yum install -y docker-ce

步骤 3:配置镜像加速

复制代码
mkdir -p /etc/docker
vim /etc/docker/daemon.json

粘贴下面全部内容

复制代码
{
"registry-mirrors": [
"https://docker.1panel.live",
"https://docker.fxxk.dedyn.io",
"https://hub.rat.dev",
"https://mirror.aliyuncs.com",
"https://mirror.baidubce.com",
"https://docker.nju.edu.cn"
]
}

保存退出:esc 输入 :wq回车

步骤 4:启动 docker 并设置开机自启

复制代码
systemctl daemon-reload
systemctl start docker
systemctl enable docker
# 验证docker版本
docker -v

步骤 5:开启 docker2375 远程端口(maven 打包镜像需要)

⚠️生产环境不要开启 2375 对外暴露,仅学习测试使用

复制代码
vim /usr/lib/systemd/system/docker.service

找到ExecStart修改:

复制代码
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

保存退出,重载并重启 docker

复制代码
systemctl daemon-reload
systemctl restart docker
# 检查2375端口监听
ss -nlt | grep 2375

第二部分:中间件 Docker 部署(MySQL、Redis、Nginx、RabbitMQ、ES、Kibana、Logstash、Mongo、MinIO)

所有数据挂载目录统一/mydata/*,容器数据持久化,删除容器数据不会丢失。

2.1 MySQL5.7 部署

复制代码
#拉取镜像
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 \
--restart=always \
-d mysql:5.7

安装 mysql 客户端工具

复制代码
yum -y install mysql
#登录mysql
mysql -uroot -proot -h127.0.0.1 --default-character-set=utf8

mysql 里面依次执行下面 SQL

复制代码
#创建mall数据库
create database mall character set utf8;
#创建账号reader密码123456,允许任意ip访问
grant all privileges on *.* to 'reader'@'%' identified by '123456';
flush privileges;
exit;

后续需要把 mall 项目的mall.sql数据库脚本上传服务器,导入命令: mysql -uroot -proot -h127.0.0.1 mall < mall.sql

复制代码
wget https://gitee.com/macrozheng/mall/raw/master/document/sql/mall.sql -O /root/mall.sql

2.2 Redis7 部署

复制代码
docker pull redis:7

docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
--restart=always \
-d redis:7 redis-server --appendonly yes

#测试连接
docker exec -it redis redis-cli
127.0.0.1:6379> set a 100
127.0.0.1:6379> get a
exit

2.3 Nginx1.22 部署

复制代码
#拉取镜像
docker pull nginx:1.22
#临时启动一次复制配置文件
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-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 \
--restart=always \
-d nginx:1.22

2.4 RabbitMQ 3.7.15 部署

复制代码
docker pull rabbitmq:3.7.15

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
exit

浏览器访问:http://10.8.0.23:15672 默认账号密码 guest / guest

  1. 新增用户:mall密码mall,标签选 administrator
  1. 新增虚拟主机:/mall
  1. 给 mall 用户授权/mall虚拟主机读写权限。

2.5 Elasticsearch7.17.3 + IK 分词器

复制代码
#修改系统虚拟内存,es必须
sysctl -w vm.max_map_count=262144

docker pull elasticsearch:7.17.3

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

#修改目录权限,否则启动报错
chmod 777 /mydata/elasticsearch/data/
docker restart elasticsearch

安装 IK 中文分词插件

复制代码
cd /root
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://10.8.0.23:9200

2.6 Kibana7.17.3

复制代码
docker pull kibana:7.17.3

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

访问地址 http://10.8.0.23:5601

2.7 Logstash7.17.3

复制代码
docker pull logstash:7.17.3
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}"
}
}

保存退出,启动 logstash

复制代码
docker run --name logstash -p 4560:4560 -p 4561:4561 -p 4562:4562 -p 4563:4563 \
--restart=always \
--link elasticsearch:es \
-v /mydata/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
-d logstash:7.17.3

#进入容器安装插件
docker exec -it logstash /bin/bash
logstash-plugin install logstash-codec-json_lines
exit
docker restart logstash

Resolving mixin dependencies 下一步很大概率会报 Connection reset by peer,是访问国外 gem 源被拦截了。

立刻执行下面这套

  1. 退出容器

    exit

  2. 备份 + 修改配置,彻底抛弃这个插件

    cp /mydata/logstash/logstash.conf /mydata/logstash/logstash.conf.bak
    vim /mydata/logstash/logstash.conf

全部替换为:

复制代码
input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    type => "debug"
  }
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4561
    type => "error"
  }
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4562
    type => "business"
  }
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4563
    type => "record"
  }
}
filter{
  json {
    source => "message"
  }
  if [type] == "record" {
    mutate {
      remove_field => "port"
      remove_field => "host"
      remove_field => "@version"
    }
  }
}
output {
  elasticsearch {
    hosts => "http://es:9200"
    index => "mall-%{type}-%{+YYYY.MM.dd}"
  }
}

保存:Esc → :wq

  1. 重启并观察日志

    docker restart logstash
    docker logs -f logstash

看到 Pipeline started 就代表 logstash 就绪。

2.8 MongoDB4

复制代码
docker pull mongo:4
docker run -p 27017:27017 --name mongo \
--restart=always \
-v /mydata/mongo/db:/data/db \
-d mongo:4

2.9 MinIO 对象存储(上传图片文件)

复制代码
docker run -p 9000:9000 -p 9090:9090 --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 ":9090"

访问:http://10.8.0.23:9090,账号密码minioadmin/minioadmin,手动创建 bucket 桶 。

✅到此所有中间件部署完毕,执行docker ps确认全部容器 running 状态。

第三部分:后端 mall SpringBoot 服务部署打包

3.1 安装 JDK1.8 + Maven

复制代码
yum install java-1.8.0-openjdk java-1.8.0-devel -y
java -version

#安装maven
# 下载 maven 3.8.8(兼容 JDK8,稳定)
cd /usr/local
wget https://archive.apache.org/dist/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
tar -zxf apache-maven-3.8.8-bin.tar.gz

# 备份旧软链,建立新软链
mv /usr/share/maven /usr/share/maven.old
ln -s /usr/local/apache-maven-3.8.8 /usr/share/maven

# 写入全局环境变量
cat >> /etc/profile <<EOF
export M2_HOME=/usr/share/maven
export PATH=\$PATH:\$M2_HOME/bin
EOF

source /etc/profile
mvn -v

3.2 拉取 mall 后端源码

复制代码
cd /root
git clone -b dev-v2 https://github.com/macrozheng/mall.git
cd mall

3.3 修改 pom.xml docker 远程地址

复制代码
vim pom.xml

找到<docker.host>,修改为你的服务器 IP:2375

复制代码
<docker.host>http://10.8.0.23:2375</docker.host>

3.4 修改配置文件 application‑prod.yml

  1. 修改 mall-admin/src/main/resources/application-prod.yml

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

修改数据库、redis、minio、logstash 地址,容器之间 link 别名:mysql 容器别名db,redis 别名redis,logstash 别名logstash,minio 别名minio

复制代码
spring:
  datasource:
    username: reader
    password: 123456
    url: jdbc:mysql://db:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
  redis:
    host: redis
minio:
  endpoint: http://minio:9000
  accessKey: minioadmin
  secretKey: minioadmin
logging:
  logstash:
    host: logstash
  1. mall‑portal、mall‑search 同样检查application‑prod.yml配置,数据库 es mongo rabbitmq 地址,rabbitmq 填写我们创建的账号 mall/mall,虚拟主机/mall。

3.5 Maven 打包并且构建 docker 镜像

复制代码
cd /root/mall
#跳过测试打包
mvn clean package -Dmaven.test.skip=true

BUILD SUCCESS 代表成功,执行docker images,可以看到mall/mall-admin、mall/mall‑portal、mall/mall‑search镜像。

原 pom 里绑定了 docker:build,所以打包的时候会自动构建镜像,很慢而且你暂时不需要。

执行这条,跳过 docker 插件:

复制代码
mvn clean package -Dmaven.test.skip=true -DskipDocker

打包完成后,三个可执行 jar 位置:

复制代码
/root/mall/mall-admin/target/mall-admin-1.0-SNAPSHOT.jar
/root/mall/mall-search/target/mall-search-1.0-SNAPSHOT.jar
/root/mall/mall-portal/target/mall-portal-1.0-SNAPSHOT.jar

3.6 启动三个后端容器

mall‑admin 后台管理接口(8080)
复制代码
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 商品搜索服务(8081)
复制代码
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‑portal 前台商城接口(8085)

⚠️注意 link 别名 rabbitmq 容器名字是 rabbitmq,所以 --link rabbitmq:rabbit

复制代码
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

3.7 后端接口验证

查看制作的镜像

docker images

浏览器访问 swagger 文档

复制代码
http://10.8.0.23:8080/swagger-ui/
http://10.8.0.23:8081/swagger-ui/
http://10.8.0.23:8085/swagger-ui/

能打开页面,接口列表展示出来,后端部署完成。 如果访问失败,看容器日志:docker logs mall‑admin排查报错。

第四部分:部署 mall‑admin‑web【后台管理 Vue 前端】

gitee 地址:https://gitee.com/humajun/mall-admin-web,分支dev‑v2(vue2 版本,适配 mall 后端)

4.1 服务器安装 nodejs16

复制代码
cd /root
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

#验证版本
node -v
npm -v

4.2 拉取前端代码

复制代码
# 拉取官方 gitee 镜像,指定 dev-v2
git clone --branch dev-v2 https://gitee.com/macrozheng/mall-admin-web.git

cd mall-admin-web

4.3 修改生产环境接口地址

复制代码
vim config/prod.env.js

修改BASE_API为你的后端 mall‑admin 地址

复制代码
'use strict'
module.exports ={
NODE_ENV:'"production"',
BASE_API:'"http://10.8.0.23:8080"'
}

4.4 安装依赖编译打包

复制代码
#清理缓存
npm cache clean --force
#使用淘宝镜像安装依赖
npm install --registry=https://registry.npmmirror.com
#生产打包,输出dist目录
npm run build

4.5 将打包产物放到 Nginx 网页目录

复制代码
#把dist改名为html
mv dist html
#覆盖nginx的html目录
mv html /mydata/nginx/

#重启nginx
docker restart nginx

访问后台管理页面:http://10.8.0.23

默认账号admin密码macro123,登录成功代表后台前端部署完成。

🔔排坑:登录报跨域 / 接口报错,检查 prod.env.js 地址,确认 8080 后端服务正常运行。

第五部分:mall‑app‑sc 移动端 uni‑app 前端部署(H5 网页版本)

gitee 地址:https://gitee.com/humajun/mall-app-sc,使用 HBuilderX 工具在本地电脑 Windows 操作,不要在 linux 服务器编译 uni‑app!!!服务器没有 HBuilderX 环境。

5.1 本地电脑操作步骤

  1. 下载 HBuilderX(App 开发版)官网 dcloud.io
  2. gitee 下载mall‑app‑sc源码 zip 包,解压,HBuilderX:文件 →导入 →从本地目录导入项目。
  1. 修改appConfig.js:

    export const API_BASE_URL = 'http://10.8.0.23:8085';
    export const USE_ALIPAY = false;

8085是 mall‑portal 前台后端端口。

  1. 顶部菜单:发行 →网站‑H5 ,编译完成后,输出unpackage/dist/build/h5文件夹。
  1. 将 h5 里面全部文件上传 linux 服务器/mydata/nginx/html/app目录。

服务器执行命令

复制代码
mkdir -p /mydata/nginx/html/app
#把本地h5全部文件上传到此目录,然后重启nginx
docker restart nginx

访问移动端 H5 地址:http://10.8.0.23/app/,切换浏览器手机模式,看到电商首页即为成功。

📌全套排错小白指南

  1. docker 容器启动失败:docker logs 容器名查看日志定位错误
  2. ES 启动失败:chmod 777 /mydata/elasticsearch/data目录权限
  3. 前端登录接口 404:核对 prod.env.js 的后端 IP 端口,确认后端容器 link 正确。
  4. 数据库连接报错:确认 mall.sql 已经导入,reader 账号权限。
  5. Maven 打包镜像失败:确认 docker 的 2375 端口监听,防火墙放行 2375。
  6. rabbitmq 报错:创建mall用户、/mall虚拟主机,授权权限。

📍项目访问汇总

|--------------|-----------------------------------------------------------------------------------------------------------------|-----------------------|
| 模块 | 访问地址 | 账号密码 |
| 后台管理前端 | http://10.8.0.23 | admin / macro123 |
| 后台接口 swagger | http://10.8.0.23:8080/swagger-ui/ | - |
| 搜索接口 swagger | http://10.8.0.23:8081/swagger-ui/ | - |
| 前台接口 swagger | http://10.8.0.23:8085/swagger-ui/ | - |
| 移动端 H5 | http://10.8.0.23/app/ | - |
| RabbitMQ 管理页 | http://10.8.0.23:15672 | mall/mall |
| Kibana 日志 | http://10.8.0.23:5601 | - |
| MinIO 对象存储 | http://10.8.0.23:9090 | minioadmin/minioadmin |

相关推荐
咋的啥名都用不了呢~21 分钟前
Linux项目部署5(安装Nginx的插件)
linux
CodeYp201941 分钟前
第11讲:应用层协议 HTTP
linux·http
爱和冰阔落42 分钟前
【Linux网络】JsonCpp 怎么实现序列化?从 Request/Response 到网络计算器消息设计
linux·运维·网络·php
Decay__1 小时前
01_SQLServer 体系架构全解 —— 实例进程、关系引擎、SQLOS 与事务日志深入
运维·数据库·sql·mysql·架构
我是koten6 小时前
【运维杂谈】K8s遇到Terminating的名称空间删除不了怎么办?(解决方案亲测有效)
linux·运维·服务器·云原生·kubernetes·k8s·名称空间
2601_9679873714 小时前
安装 Redis 或 Redis Stack
linux·windows·redis·macos·安装
feng_you_ying_li14 小时前
linux之数据链路层
linux·网络·智能路由器
修己xj14 小时前
服务器无法解析域名?一次 DNS 配置缺失的排查与修复
运维
GeW16 小时前
高端化走到深处,是数据库和Linux的事
linux