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容器的日志输出