记录一次(钉钉-第三方企业应用)项目部署和搭建
架构图
首先准备好钱!!!!!!!!
一共准备了4台ECS服务器,1台RDS(mysql版,钉钉平台必须5.6 OR 5.7),1台RDS(redis版)2个EIP弹性ip,1个SLB负载均衡(钉钉平台实例必须是CLB,别买ALB),1个NAT网关(实例必须是公网NAT)(以上全部为阿里云全家桶)
流量出口
首先开通NAT并且绑定一条EIP(弹性ip),然后和其中2台服务器做绑定(应为业务需要4台服务器只有2台会连接外网)
按照此图操作之后,图中api1和api2就可以在阿里云后台远程连接去访问外网了,交换机是为了把买的这些云服务组在一个内网环境下
ping一下百度,发现是通了
此时相当于流量的出口做好了,但是还缺流量入口,包括如果想要远程SSH连接到我们的服务器去部署项目就必须要有入口,那么就是如之前架构图所示EIP+SLB组成入口了
流量入口
如图,这是绑定之后的样子,绑定前先去搞一个EIP,新的EIP最后面显示不是解除绑定,而是绑定,然后选择好自己已经开通的SLB实例绑定即可
添加同一vpc(内网环境下)的服务器的端口到SLB下,多台服务器都是支持的,如图显示正常,就可以***H方式尝试远程连接到服务器了
远程连接尝试(成功!!!!)
安装docker
阿里ECS服务器系统是Debian11,所以网上找了此系统安装Docker的教程,这里就直接抄一下别人的心血了
卸载旧版本
$ sudo apt-get remove docker docker-engine docker.io containerd runc
安装软件包以允许 apt 通过 HTTPS 使用存储库
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
添加 Docker 的官方 GPG 密钥:
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
添加源
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装docker
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
启动 docker
$ sudo systemctl start docker
设置开机启动 docker
$ sudo systemctl enable docker
使用阿里云ACR的加速服务
$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://e4vaaqhb.mirror.aliyuncs.com"]
}
EOF
重启 docker
重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载。
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
将当前用户加入 docker 用户组
需要将当前用户加入 docker 用户组,否则进行相关操作会提示没有权限,也不建议使用 root 身份来操作docker
sudo usermod -aG docker $USER && newgrp docker
Docker安装完成!!!!!!!!
安装OpenJdk8
我这里安装的是jre8,想要安装什么去docker官网可以找https://hub.docker.com/
拉取镜像(alpine轻量的jre环境,优点就是,占用空间小)
docker pull openjdk:8-jre-alpine
查看已存在镜像
docker images
删除镜像命令
dokcer rmi ${IMAGE ID} or ${REPOSITORY}:${TAG}
启动容器并映射宿主机文件夹以及配置
docker run -d -p 8899:8899 --name ${name} --restart=always(一直启动) --privileged=true(最高权限) -v ${/宿主机/jar/包外部路径}:${内部路径自定义/随便写/会自动/创建对应/路径} -e TZ="Asia/Shanghai"(设置时区) openjdk:8-jre-alpine java -jar /home/data/api/api.jar(启动jar包,要用容器内路径) --spring-config-location=/home/data/api/application.properties(设置外部配置文件,用容器内路径)
查看运行中容器
docker ps -a(-a//可以查看已经退出的容器)
重启容器
docker restart ${name}
停止容器
docker stop ${name}
删除容器命令
docker rm ${容器id}
查看项目启动之后的控制台日志
docker logs --tail 100 -f ${容器名称}
安装nginx
拉取nginx
docker pull nginx:stable-alpine
按照端口映射端口,文件夹映射文件夹的操作,将nginx配置文件,前端页面静态js文件夹,日志文件做映射处理
docker pull nginx:stable-alpine
docker run -d -p 80:80 -p 443:443 //端口映射
--name nginx //容器名
--restart=always //自启
--privileged=true //最高权限
-v /home/data/html/dingClient:/home/data/html/dingClient //前端静态页
-v /home/data/nginx/conf/conf.d:/etc/nginx/conf.d //配置文件子文件
-v /home/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf//配置文件主 文件
-v /home/data/nginx/logs:/home/data/nginx/logs //日志文件
-e TZ="Asia/Shanghai" //时区设置
nginx:stable-alpine
/* 复制的时候记得不要换行,空格即可 */
遇到的一些坑
-
- application.properties配置文件问题,映射的配置文件不生效,验证方法:设置外部配置文件和内部的配置文件端口不一样,看看启动日志的端口是哪个,确定spring-config-location配置是否生效(最后没有解决此问题,就在pom.xml使用了一种新的打包方式)
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<!-- 指定启动类,将依赖打成外部jar包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<!-- 生成的jar中,不要包含pom.xml和pom.properties这两个文件 -->
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<!-- 是否要把第三方jar加入到类构建路径 -->
<addClasspath>true</addClasspath>
<!-- 外部依赖jar包的最终位置 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- 项目启动类 -->
<mainClass>vip.natty.${你的主类}</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!--拷贝依赖到jar外面的lib目录-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-lib</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>target/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>compile</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<!--指定配置文件,将resources打成外部resource-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<!-- 指定配置文件目录,这样jar运行时会去找到同目录下的resources文件夹下查找 -->
<manifestEntries>
<Class-Path>resources/</Class-Path>
</manifestEntries>
</archive>
<!-- 打包时忽略的文件(也就是不打进jar包里的文件) -->
<excludes>
<exclude>*.properties</exclude>
</excludes>
</configuration>
</plugin>
<!-- 拷贝资源文件 外面的resource目录-->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<!-- 资源文件输出目录 -->
<outputDirectory>${project.build.directory}/resources</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
将这3个文件放入linux容器这样配置文件就只有一份且可以在外部宿主机中修改
记住此时修改容器映射规则
-
- 开发环境下存在配置问题不影响的,在打包部署之后就会产生(例如MapperScan中之前写的是..* 项目运行没有任何问题,开发环境就出问题了,一直报找不到Mapper的错误,排查了很久才找到最简单的注解写错)
- 开发环境下存在配置问题不影响的,在打包部署之后就会产生(例如MapperScan中之前写的是..* 项目运行没有任何问题,开发环境就出问题了,一直报找不到Mapper的错误,排查了很久才找到最简单的注解写错)
- 3.切记做docker映射之后例如jdk使用java -jar 启动命令的时候路径是容器内部路径,其他也是同理