outdoor server 部署指南 - housekeeper-software/tech GitHub Wiki
准备环境
OS: debian 10
network: 静态IP
可以连接互联网
安装文件
安装文件有两个包构成:
1. install.tar.gz ,这里是安装脚本以及redis,mysql的基本配置
2. pack包,这个包由服务器开发部门提供,其中包含jar包和 application.yml。每次服务器版本更新,需要更换这个包
install.tar.gz文件说明
比如安装目录设置为 /root,则展开之后的文件布局为:
deamon.json : 阿里云docker加速,这个文件被复制到 /etc/docker目录下
dockerfile : 制作web server 的docker 文件
init.sql : 初始化mysql
jdk-8u221-linux-x64.tar.gz : jdk安装包
my.conf :mysql的配置文件
redis.conf : redis配置文件
setup-server-with-db.sh :安装包含redis,mysql
sources.list: debian清华源
upgrade-server.sh : 升级脚本
setup-server-no-db.sh :最小化安装脚本,不包含redis,mysql
setup-db.sh :仅仅安装mysql , redis ,实际项目上的部署,mysql和redis是独立服务器部署
pack包
pack包由研发部门提供,可以以任意方式压缩。安装时需要解压到服务器上的某个目录,比如 /package目录
此刻,这个目录下至少有一个 jar包,一个application.yml文件
完全安装,包含mysql,redis
首次安装使用 setup-server-with-db
具体命令行:
./setup-server-with-db.sh /package 192.168.180.3 19999
总计需要三个参数:
1. /package 就是jar所在的目录名
2. 192.168.180.3 :就是本机ip
3. 19999:就是web server侦听的端口
最小化安装,不包含mysql,redis
首次安装使用 setup-server-no-db.sh
具体命令行:
./setup-server-no-db.sh /package 192.168.180.3 19999
总计需要三个参数:
1. /package 就是jar所在的目录名
2. 192.168.180.3 :就是redis,mysql所在服务器的ip地址
3. 19999:就是web server侦听的端口
升级
将新的package解压到服务器的某个目录,比如/upgrade
./upgrade-server.sh /upgrade 192.168.180.3 19999
三个参数的意义同上所示
安装mysql,redis
需要文件:
daemon.json
init.sql
my.conf
redis.conf
sources.list
执行 ./setup-db.sh
application.yml
yml中有几个地方需要替换为宏变量:
server:
port: {port}
max-http-header-size: 10240
url: jdbc:mysql://{ip}:3306/entrance_guard?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
redis:
host: {ip}
redis
#daemonize yes
以上这句话必须被注释掉,容器运行不支持 daemon方式
脚本解析
setup-server-no-db.sh
在实际场景下,一般使用这个脚本去部署服务器,因为mysql和redis会单独部署到独立的虚拟主机上,我们只要远程连接上去即可。
#!/bin/bash
function docker_install()
{
echo "check docker exist......"
docker -v
if [ $? -eq 0 ]; then
echo "docker installed already"
else
echo "prepare install docker..."
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
echo "docker install done"
fi
}
read -r -p "install server without mysql and redis in this server[Y/N]>" answer
case $answer in
Y|y)
echo "fine,let's continue"
;;
*)
exit 1
;;
esac
if [ ! -n "$1" ] || [ ! -n "$2" ] || [ ! -n "$3" ]; then
echo "please input [jar source directory,local ip,server listen port], for example: /package 192.168.180.3 19999"
exit 1
fi
if [ -n "$(docker -v)" ] && [ -n "$(docker ps -aq --filter name=outdoor)" ]; then
echo "container [outdoor] running, please use upgrade shell"
exit 1
fi
CON=$(find $1 -type f -name "*.jar" -print | wc -l)
if [ $CON -ne 1 ]; then
echo "the number of jar packages must be equal to 1 in directory: $1"
exit 1
fi
jar_file=$(find $1 -type f -name "*.jar")
jar_filename=$(basename $jar_file)
echo "found jar package name: ${jar_filename}"
echo "listen port: $3"
cp sources.list /etc/apt/sources.list
# 安装常用工具
apt-get update
apt-get -y install apt-utils gnupg ca-certificates procps net-tools wget curl vim unzip tcpdump
# 内核优化
echo "fs.file-max=102400" >> /etc/sysctl.conf
echo "root soft nofile 204800" >> /etc/security/limits.conf
echo "root hard nofile 204800" >> /etc/security/limits.conf
echo "evan soft nofile 204800" >> /etc/security/limits.conf
echo "evan hard nofile 204800" >> /etc/security/limits.conf
sysctl -p
# 创建容器虚拟卷
mkdir -p /data/server/logs
mkdir -p /data/server/appfiles
mkdir -p /data/server/jar
# 复制一些容器所需的配置
cp daemon.json /etc/docker/daemon.json
# 复制jar 包
cp -Rf $1/* /data/server/jar
sed -i s/{ip}/$2/g /data/server/jar/application.yml
sed -i s/{port}/$3/g /data/server/jar/application.yml
# 从阿里云安装 Docker CE
docker_install
if [ ! "$(docker -v)" ]; then
echo "docker not installed"
rm -rf /data
exit 1
fi
# 重启 Docker
systemctl daemon-reload
systemctl restart docker
# 制作 JDK 容器
echo "build jdk image..."
docker build -t jdk:1.8 .
# 启动 java 服务
docker run -d --name outdoor \
--restart=always \
-p $3:$3 \
-v /data/server/appfiles:/home/appfiles \
-v /data/server/logs:/logs \
-v /data/server/jar:/app \
jdk:1.8 /bin/bash -c "cd /app && java -jar ${jar_filename}"
if [ -n "$(docker ps -aq --filter name=outdoor)" ];then
echo "outdoor running!"
else
echo "outdoor not running,installation failed"
fi
echo "DONE"
setup-db.sh
用来在独立虚拟主机安装mysql,redis,注意,我们使用的是容器化部署
#!/bin/bash
function docker_install()
{
echo "check docker exist......"
docker -v
if [ $? -eq 0 ]; then
echo "docker installed already"
else
echo "prepare install docker..."
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
echo "docker install done"
fi
}
cp sources.list /etc/apt/sources.list
# 安装常用工具
apt-get update
apt-get -y install apt-utils gnupg ca-certificates procps net-tools wget curl vim unzip tcpdump
# 创建容器虚拟卷
mkdir -p /data/redis/data
mkdir -p /data/redis/conf
mkdir -p /data/mysql/conf
mkdir -p /data/mysql/init
# 复制一些容器所需的配置
cp redis.conf /data/redis/conf/redis.conf
cp daemon.json /etc/docker/daemon.json
cp my.conf /data/mysql/conf/my.conf
cp init.sql /data/mysql/init
# 从阿里云安装 Docker CE
docker_install
# 重启 Docker
systemctl daemon-reload
systemctl restart docker
# pull all images
echo "pull mysql image..."
docker pull mysql:5.7
echo "pull redis image..."
docker pull redis
# 启动 redis
docker run --name redis \
-p 6379:6379 \
-v /data/redis/data:/data \
-v /data/redis/conf:/etc/redis \
-d redis:latest \
redis-server /etc/redis/redis.conf
# 启动 mysql
docker run -d --name=mysql \
-v /data/mysql/log:/var/log/mysql \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/conf:/etc/mysql \
-v /data/mysql/init:/docker-entrypoint-initdb.d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=mysql \
mysql:5.7
if [ -n "$(docker ps -aq --filter name=redis)" ]; then
echo "redis running!"
else
echo "redis installation failed"
fi
if [ -n "$(docker ps -aq --filter name=mysql)" ]; then
echo "mysql running!"
else
echo "mysql installation failed"
fi
echo "DONE"
upgrade-server.sh
这是升级web服务器的脚本,前提是已经安装过web服务器
#!/bin/bash
read -r -p "upgrade jar package in this server[Y/N]>" answer
case $answer in
Y|y)
echo "fine,let's continue"
;;
*)
exit
;;
esac
if [ ! -n "$1" ] || [ ! -n "$2" ] || [ ! -n "$3" ]; then
echo "please input [jar source directory,local ip,server listen port], for example: /package 192.168.180.3 19999"
exit 1
fi
if [ ! "$(docker -v)" ]; then
echo "docker not installed"
exit 1
fi
CON=`docker image ls 'jdk:1.8' | wc -l`
if [ $CON -lt 1 ]; then
echo "not found jdk:1.8 image "
exit
fi
CON=$(find $1 -type f -name "*.jar" -print | wc -l)
if [ $CON -ne 1 ];then
echo "the number of jar packages must be equal to 1 in directory: $1"
exit
fi
jar_file=$(find $1 -type f -name "*.jar")
jar_filename=$(basename $jar_file)
echo "found jar package name: ${jar_filename}"
echo "listen port: $3"
# 删除旧的容器
if [ -n "$(docker ps -aq --filter name=outdoor)" ];then
docker stop outdoor
docker rm outdoor
fi
# 复制jar 包
rm -rf /data/server/jar
mkdir -p /data/server/jar
cp -Rf $1/* /data/server/jar
sed -i s/{ip}/$2/g /data/server/jar/application.yml
sed -i s/{port}/$3/g /data/server/jar/application.yml
# 启动 java 容器
docker run -d --name outdoor \
--restart=always \
-p $3:$3 \
-v /data/server/appfiles:/home/appfiles \
-v /data/server/logs:/logs \
-v /data/server/jar:/app \
jdk:1.8 /bin/bash -c "cd /app && java -jar ${jar_filename}"
if [ -n "$(docker ps -aq --filter name=outdoor)" ]; then
echo "outdoor running!"
else
echo "outdoor not running,upgrade failed"
fi
echo "DONE"
setup-server-with-db.sh
在一个虚拟主机中安装所有,包含web server ,mysql,redis
#!/bin/bash
function docker_install()
{
echo "check docker exist......"
docker -v
if [ $? -eq 0 ]; then
echo "docker installed already"
else
echo "prepare install docker..."
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
echo "docker install done"
fi
}
read -r -p "install with mysql and redis in this server[Y/N]>" answer
case $answer in
Y|y)
echo "fine,let's continue"
;;
*)
exit 1
;;
esac
if [ ! -n "$1" ] || [ ! -n "$2" ] || [ ! -n "$3" ]; then
echo "please input [jar source directory,local ip,server listen port], for example: /package 192.168.180.3 19999"
exit 1
fi
if [ -n "$(docker -v)" ] && [ -n "$(docker ps -aq --filter name=outdoor)" ];then
echo "container [outdoor] running,please use upgrade shell"
exit 1
fi
CON=$(find $1 -type f -name "*.jar" -print | wc -l)
if [ $CON -ne 1 ]; then
echo "the number of jar packages must be equal to 1 in directory: $1"
exit 1
fi
jar_file=$(find $1 -type f -name "*.jar")
jar_filename=$(basename $jar_file)
echo "found jar package name: ${jar_filename}"
echo "listen port: $3"
cp sources.list /etc/apt/sources.list
# 安装常用工具
apt-get update
apt-get -y install apt-utils gnupg ca-certificates procps net-tools wget curl vim unzip tcpdump
# 内核优化
echo "fs.file-max=102400" >> /etc/sysctl.conf
echo "root soft nofile 204800" >> /etc/security/limits.conf
echo "root hard nofile 204800" >> /etc/security/limits.conf
echo "evan soft nofile 204800" >> /etc/security/limits.conf
echo "evan hard nofile 204800" >> /etc/security/limits.conf
sysctl -p
# 创建容器虚拟卷
mkdir -p /data/redis/data
mkdir -p /data/redis/conf
mkdir -p /data/mysql/conf
mkdir -p /data/mysql/init
mkdir -p /data/server/logs
mkdir -p /data/server/appfiles
mkdir -p /data/server/jar
# 复制一些容器所需的配置
cp redis.conf /data/redis/conf/redis.conf
cp daemon.json /etc/docker/daemon.json
cp my.conf /data/mysql/conf/my.conf
# 复制jar 包
cp -Rf $1/* /data/server/jar
cp init.sql /data/mysql/init
sed -i s/{ip}/$2/g /data/server/jar/application.yml
sed -i s/{port}/$3/g /data/server/jar/application.yml
# 从阿里云安装 Docker CE
docker_install
if [ ! "$(docker -v)" ]; then
echo "docker not installed"
rm -rf /data
exit 1
fi
# 重启 Docker
systemctl daemon-reload
systemctl restart docker
# pull all images
docker pull mysql:5.7
docker pull redis
# 启动 redis
docker run --name redis \
-p 6379:6379 \
-v /data/redis/data:/data \
-v /data/redis/conf:/etc/redis \
-d redis:latest \
redis-server /etc/redis/redis.conf
# 启动 mysql
docker run -d --name=mysql \
-v /data/mysql/log:/var/log/mysql \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/conf:/etc/mysql \
-v /data/mysql/init:/docker-entrypoint-initdb.d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=mysql \
mysql:5.7
docker build -t jdk:1.8 .
# 启动 java 服务
docker run -d --name outdoor \
--restart=always \
-p $3:$3 \
-v /data/server/appfiles:/home/appfiles \
-v /data/server/logs:/logs \
-v /data/server/jar:/app \
jdk:1.8 /bin/bash -c "cd /app && java -jar ${jar_filename}"
if [ -n "$(docker ps -aq --filter name=redis)" ]; then
echo "redis running!"
else
echo "redis installation failed"
fi
if [ -n "$(docker ps -aq --filter name=mysql)" ]; then
echo "mysql running!"
else
echo "mysql installation failed"
fi
if [ -n "$(docker ps -aq --filter name=outdoor)" ]; then
echo "outdoor running!"
else
echo "outdoor not running,installation failed"
fi
echo "DONE"
JDK 容器制作
FROM debian:10
USER root
ENV DEBIAN_FRONTEND noninteractive
ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1
ADD sources.list /etc/apt/sources.list
RUN apt-get update && \
apt-get -y install apt-utils gnupg ca-certificates procps net-tools wget curl vim
ADD jdk-8u221-linux-x64.tar.gz /usr/local
ENV JAVA_HOME=/usr/local/jdk1.8.0_221
ENV JRE_HOME=/usr/local/jdk1.8.0_221/jre
ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
docker 常用命令
docker ps -a : 查看正在运行的容器
docker ps -aq --filter name=redis :查看redis是否运行
docker stop outdoor : 停止outdoor的容器
docker start outdoor : 启动outdoor的容器
docker logs outdoor -f : 查看outdoor容器的日志输出