diff --git a/README.md b/README.md index 0d7124f..e3e825e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
- +
diff --git a/assets/docker.xmind b/assets/docker.xmind new file mode 100644 index 0000000..293f1ff Binary files /dev/null and b/assets/docker.xmind differ diff --git a/assets/linux.xmind b/assets/linux.xmind new file mode 100644 index 0000000..291a618 Binary files /dev/null and b/assets/linux.xmind differ diff --git a/codes/docker/docker-compose-demo/Dockerfile b/codes/docker/docker-compose-demo/Dockerfile new file mode 100644 index 0000000..7c4b8c7 --- /dev/null +++ b/codes/docker/docker-compose-demo/Dockerfile @@ -0,0 +1,5 @@ +FROM python:3.6-alpine +ADD . /code +WORKDIR /code +RUN pip install redis flask +CMD ["python", "app.py"] diff --git a/codes/docker/docker-compose-demo/app.py b/codes/docker/docker-compose-demo/app.py new file mode 100644 index 0000000..f0dfc20 --- /dev/null +++ b/codes/docker/docker-compose-demo/app.py @@ -0,0 +1,13 @@ +from flask import Flask +from redis import Redis + +app = Flask(__name__) +redis = Redis(host='redis', port=6379) + +@app.route('/') +def hello(): + count = redis.incr('hits') + return 'Hello World! 该页面已被访问 {} 次。\n'.format(count) + +if __name__ == "__main__": + app.run(host="0.0.0.0", debug=True) diff --git a/codes/docker/docker-compose-demo/docker-compose.yml b/codes/docker/docker-compose-demo/docker-compose.yml new file mode 100644 index 0000000..80d8ced --- /dev/null +++ b/codes/docker/docker-compose-demo/docker-compose.yml @@ -0,0 +1,10 @@ +version: '3' +services: + + web: + build: . + ports: + - "5000:5000" + + redis: + image: "redis:alpine" diff --git a/codes/docker/docker-compose-demo/run.sh b/codes/docker/docker-compose-demo/run.sh new file mode 100644 index 0000000..0913e24 --- /dev/null +++ b/codes/docker/docker-compose-demo/run.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +set -x +docker-compose up diff --git a/codes/linux/lib/env.sh b/codes/linux/lib/env.sh index 4c41818..9176eec 100644 --- a/codes/linux/lib/env.sh +++ b/codes/linux/lib/env.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash +# ------------------------------------------------------------------------------ +# 常用变量库 +# @author Zhang Peng +# ------------------------------------------------------------------------------ + # ------------------------------------------------------------------------------ 颜色状态 # Regular Color @@ -51,3 +56,48 @@ YES=0 NO=1 SUCCEED=0 FAILED=1 + +# 显示打印日志的时间 +DATE=`date "+%Y-%m-%d %H:%M:%S"` +# 那个用户在操作 +USER=$(whoami) + +# ------------------------------------------------------------------------------ log + +logInfo() { + #($0脚本本身,$@将参数作为整体传输调用) + echo "[${DATE}] [${USER}] [INFO] [$0] [$@] execute succeed." >> /var/log/shell.log +} + +logWarn() { + #($0脚本本身,$@将参数作为整体传输调用) + echo "[${DATE}] [${USER}] [WARN] [$0] [$@] execute succeed." >> /var/log/shell.log +} + +logError() { + #($0脚本本身,$@将参数作为整体传输调用) + echo "[${DATE}] [${USER}] [ERROR] [$0] [$@] execute failed." >> /var/log/shell.log +} + +printInfo() { + echo -e "${C_B_GREEN}[INFO] $@${C_RESET}" +} + +printWarn() { + echo -e "${C_B_YELLOW}[WARN] $@${C_RESET}" +} + +printError() { + echo -e "${C_B_RED}[ERROR] $@${C_RESET}" +} + +callAndLog () { + $* + if [[ $? -eq ${SUCCEED} ]]; then + logInfo "$@ succeed" + echo -e "${C_B_GREEN}[INFO] [$0] [$@] execute succeed.${C_RESET}" + else + logError "$@ failed" + echo -e "${C_B_RED}[ERROR] [$0] [$@] execute failed.${C_RESET}" + fi +} diff --git a/codes/linux/lib/git.sh b/codes/linux/lib/git.sh index 6e33ca7..1a1b422 100644 --- a/codes/linux/lib/git.sh +++ b/codes/linux/lib/git.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash +# ------------------------------------------------------------------------------ +# Git 基本操作脚本 +# @author Zhang Peng +# ------------------------------------------------------------------------------ + # 装载其它库 ROOT=`dirname ${BASH_SOURCE[0]}` source ${ROOT}/env.sh @@ -33,7 +38,7 @@ checkGit() { return ${NO} fi - printf "${C_B_B_YELLOW}${source} is invalid dir.${C_RESET}\n" + printf "${C_B_YELLOW}${source} is invalid dir.${C_RESET}\n" return ${NO} } @@ -49,18 +54,18 @@ cloneOrPullGit() { local root=$5 if [[ ! ${repository} ]] || [[ ! ${group} ]] || [[ ! ${project} ]] || [[ ! ${branch} ]] || [[ ! ${root} ]]; then - printf "${C_B_YELLOW}>>>> Please input root, group, project, branch.${C_RESET}\n" + printf "${C_B_YELLOW}Please input root, group, project, branch.${C_RESET}\n" return ${FAILED} fi if [[ ! -d "${root}" ]]; then - printf "${C_B_YELLOW}>>>> ${root} is not directory.${C_RESET}\n" + printf "${C_B_YELLOW}${root} is not directory.${C_RESET}\n" return ${FAILED} fi local source=${root}/${group}/${project} - printf "${C_B_CYAN}>>>> project directory is ${source}.${C_RESET}\n" - printf "${C_B_CYAN}>>>> git url is ${repository}:${group}/${project}.git.${C_RESET}\n" + printf "${C_B_MAGENTA}project directory is ${source}.${C_RESET}\n" + printf "${C_B_MAGENTA}git url is ${repository}:${group}/${project}.git.${C_RESET}\n" mkdir -p ${root}/${group} checkGit ${source} @@ -73,21 +78,21 @@ cloneOrPullGit() { printf "${C_B_RED}<<<< git checkout ${branch} failed.${C_RESET}\n" return ${FAILED} fi - printf "${C_B_GREEN}>>>> git checkout ${branch} succeed.${C_RESET}\n" + printf "${C_B_GREEN}git checkout ${branch} succeed.${C_RESET}\n" git reset --hard if [[ "${SUCCEED}" != "$?" ]]; then printf "${C_B_RED}<<<< git reset --hard failed.${C_RESET}\n" return ${FAILED} fi - printf "${C_B_GREEN}>>>> git reset --hard succeed.${C_RESET}\n" + printf "${C_B_GREEN}git reset --hard succeed.${C_RESET}\n" git pull if [[ "${SUCCEED}" != "$?" ]]; then printf "${C_B_RED}<<<< git pull failed.${C_RESET}\n" return ${FAILED} fi - printf "${C_B_GREEN}>>>> git pull succeed.${C_RESET}\n" + printf "${C_B_GREEN}git pull succeed.${C_RESET}\n" else # 如果 ${source} 不是 git 项目,执行 clone 操作 @@ -96,7 +101,7 @@ cloneOrPullGit() { printf "${C_B_RED}<<<< git clone ${project} failed.${C_RESET}\n" return ${FAILED} fi - printf "${C_B_GREEN}>>>> git clone ${project} succeed.${C_RESET}\n" + printf "${C_B_GREEN}git clone ${project} succeed.${C_RESET}\n" cd ${source} || return ${FAILED} @@ -105,8 +110,9 @@ cloneOrPullGit() { printf "${C_B_RED}<<<< git checkout ${branch} failed.${C_RESET}\n" return ${FAILED} fi - printf "${C_B_GREEN}>>>> git checkout ${branch} succeed.${C_RESET}\n" + printf "${C_B_GREEN}git checkout ${branch} succeed.${C_RESET}\n" fi + printf "${C_B_GREEN}Clone or pull git project [$2/$3:$4] succeed.${C_RESET}\n" return ${SUCCEED} } diff --git a/codes/linux/lib/java.sh b/codes/linux/lib/java.sh new file mode 100644 index 0000000..0d66f22 --- /dev/null +++ b/codes/linux/lib/java.sh @@ -0,0 +1,135 @@ +#!/usr/bin/env bash + +# ------------------------------------------------------------------------------ +# Java 应用运维脚本 +# @author Zhang Peng +# ------------------------------------------------------------------------------ + +# ------------------------------------------------------------------------------ env preparation +# load libs +CURRENT_PATH=`dirname ${BASH_SOURCE[0]}` +source ${CURRENT_PATH}/env.sh + +# ------------------------------------------------------------------------------ functions + +stopServer() { + if [[ ! $1 ]]; then + printError "please input java app name" + return ${FAILED} + fi + + local javaAppName=$1 + local pid=`jps | grep ${javaAppName} | awk '{print $1}'` + if [[ -n "${pid}" ]]; then + kill -9 ${pid} + if [[ $? -eq ${SUCCEED} ]]; then + printInfo "stop ${javaAppName} succeed" + return ${SUCCEED} + else + printError "stop ${javaAppName} failed" + return ${FAILED} + fi + else + printWarn "${javaAppName} is not running" + return ${SUCCEED} + fi +} + +startServer() { + if [[ ! $1 ]]; then + printError "please input java app name" + return ${FAILED} + fi + + # >>>> 1. check java app is started or not + # >>>> 1.1. exit script if the app is started + local javaAppName=$1 + local pid=`jps | grep ${javaAppName} | awk '{print $1}'` + if [[ -n "${pid}" ]]; then + printInfo "${javaAppName} is started, PID: ${pid}" + return ${SUCCEED} + fi + + # >>>> 2. package options + # GC OPTS + local javaOptions="-server -Xms1g -Xmx2g -Xss256k" + javaOptions="${javaOptions} -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:NewRatio=4" + + # GC LOG OPTS + javaOptions="${javaOptions} -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps" + javaOptions="${javaOptions} -verbose:gc -Xloggc:${LOG_PATH}/${javaAppName}.gc.log" + javaOptions="${javaOptions} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M" + + # Heap Dump OPTS + javaOptions="${javaOptions} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError" + javaOptions="${javaOptions} -XX:HeapDumpPath=${LOG_PATH}/${javaAppName}.heapdump.hprof" + + # APP OPTS + javaOptions="${javaOptions} -Dsun.net.inetaddr.ttl=60 -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8" + if [[ ${PROFILE} ]]; then + javaOptions="${javaOptions} -Dspring.profiles.active=${PROFILE}" + fi + + # DEBUG OPTS + if [[ "${DEBUG}" == "on" ]]; then + # JMX OPTS + local ip=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d '/') + local jmxPort=$(expr 10000 + ${PORT}) + javaOptions="${javaOptions} -Dcom.sun.management.jmxremote=true" + javaOptions="${javaOptions} -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" + javaOptions="${javaOptions} -Djava.rmi.server.hostname=${ip} -Dcom.sun.management.jmxremote.port=${jmxPort}" + + # Remote Debug + local debugPort=$(expr 20000 + ${PORT}) + javaOptions="${javaOptions} -Xdebug -Xnoagent -Djava.compiler=NONE" + javaOptions="${javaOptions} -Xrunjdwp:transport=dt_socket,address=${debugPort},server=y,suspend=n" + fi + + # CLASSPATH + local appOptions="-classpath ${ROOT_PATH}/lib/* -Dlogging.config=file:${ROOT_PATH}/config/logback.dev.xml" + appOptions="${appOptions} --spring.config.location=classpath:/,classpath:/config/,file:${ROOT_PATH},file:${ROOT_PATH}/config/" + if [[ ${PORT} ]]; then + appOptions="${appOptions} --server.port=${PORT}" + fi + + # >>>> 3. create log dir and console log file + mkdir -p ${LOG_PATH} + if [[ ! -f ${CONSOLE_LOG} ]]; then + touch ${CONSOLE_LOG} + fi + + # >>>> 4. start java app + printInfo "starting ${javaAppName}, execute cli: " + printInfo "nohup java ${javaOptions} -jar ${ROOT_PATH}/${javaAppName}.jar ${appOptions} >> ${CONSOLE_LOG} 2>&1 &" + nohup java ${javaOptions} -jar ${ROOT_PATH}/${javaAppName}.jar ${appOptions} >> ${CONSOLE_LOG} 2>&1 & + + # >>>> 5. check java app is started or not + local pid=`jps | grep ${javaAppName} | awk '{print $1}'` + if [[ -n "${pid}" ]]; then + printInfo "start ${javaAppName} succeed, PID: ${pid}" + return ${SUCCEED} + else + printError "start ${javaAppName} failed" + return ${FAILED} + fi +} + +# ------------------------------------------------------------------------------ main +export LANG="zh_CN.UTF-8" +ROOT_PATH=$(cd ${CURRENT_PATH}/..; pwd) + +APP_NAME=java-app +LOG_PATH=/var/log/myapp +CONSOLE_LOG=${LOG_PATH}/${APP_NAME}.console.log + +PORT=8888 +PROFILE=dev +DEBUG=off + +startServer ${APP_NAME} +#stopServer ${APP_NAME} +if [[ $? -eq ${SUCCEED} ]]; then + exit ${SUCCEED} +else + exit ${FAILED} +fi diff --git a/codes/linux/lib/maven.sh b/codes/linux/lib/maven.sh new file mode 100644 index 0000000..64fc15f --- /dev/null +++ b/codes/linux/lib/maven.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash + +# ------------------------------------------------------------------------------ +# maven 项目操作脚本 +# @author Zhang Peng +# ------------------------------------------------------------------------------ + +# 装载其它库 +ROOT=`dirname ${BASH_SOURCE[0]}` +source ${ROOT}/env.sh + +mavenBuild() { + local source=$1 + mavenCheck $1 + if [[ "${SUCCEED}" != "$?" ]]; then + return ${FAILED} + fi + + if [[ -d "${source}" ]]; then + cd ${source} + if [[ -f "${source}/settings.xml" ]]; then + callAndLog "mvn clean install -B -U -s ${source}/settings.xml -Dmaven.test.skip=true" + else + callAndLog "mvn clean install -DskipTests=true -B -U" + fi + cd - + return ${SUCCEED} + else + printf "${C_B_RED}please input valid maven project path.${C_RESET}\n" + return ${FAILED} + fi +} + +mavenCheck() { + local source=$1 + if [[ -d "${source}" ]]; then + cd ${source} + if [[ -f "${source}/pom.xml" ]]; then + return ${YES} + else + printf "${C_B_RED}pom.xml is not exists.${C_RESET}\n" + return ${NO} + fi + cd - + return ${YES} + else + printf "${C_B_RED}please input valid maven project path.${C_RESET}\n" + return ${NO} + fi +} + +##################################### MAIN ##################################### +printf "\n${C_B_GREEN}>>>> maven build begin.${C_RESET}\n\n" + +printf "${C_B_MAGENTA}Current path is ${ROOT}.${C_RESET}\n" + +mavenBuild ${ROOT}/.. +r1=$? + +if [[ "${r1}" == "${SUCCEED}" ]]; then + printf "\n${C_B_GREEN}<<<< maven build succeed.${C_RESET}\n\n" + exit ${SUCCEED} +else + printf "\n${C_B_RED}<<<< maven build failed.${C_RESET}\n\n" + exit ${FAILED} +fi diff --git a/codes/linux/lib/net.sh b/codes/linux/lib/net.sh new file mode 100644 index 0000000..ce8dbd3 --- /dev/null +++ b/codes/linux/lib/net.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +# ---------------------------------------------------------------------------------- +# 控制台颜色 +BLACK="\033[1;30m" +RED="\033[1;31m" +GREEN="\033[1;32m" +YELLOW="\033[1;33m" +BLUE="\033[1;34m" +PURPLE="\033[1;35m" +CYAN="\033[1;36m" +RESET="$(tput sgr0)" +# ---------------------------------------------------------------------------------- + +printf "${PURPLE}" +cat << EOF +# ---------------------------------------------------------------------------------- +# XXX 脚本 +# @author: Zhang Peng +# ---------------------------------------------------------------------------------- +EOF +printf "${RESET}" + +printf "${BLUE}>>>>>>>> begin.\n${RESET}" + +printf "${GREEN}[OK]\n${RESET}" +printf "${RED}[ERROR]\n${RESET}" + +printf "${BLUE}<<<<<<<< end.\n${RESET}" + +IP=`ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d '/'` diff --git a/codes/linux/libtest/git-update.sh b/codes/linux/libtest/git-update.sh index 0c457cf..2baea11 100644 --- a/codes/linux/libtest/git-update.sh +++ b/codes/linux/libtest/git-update.sh @@ -28,10 +28,9 @@ doCloneOrPullGit ${REPOSITORY} turnon nginx-tutorial master ${ROOT} r2=$? if [[ "${r1}" == "${SUCCEED}" && "${r2}" == "${SUCCEED}" ]]; then - printf "\n${C_GREEN}Succeed.${C_RESET}\n" + printf "\n${C_B_GREEN}<<<< Init workspace Succeed.${C_RESET}\n\n" exit ${SUCCEED} else - printf "\n${C_RED}Failed.${C_RESET}\n" + printf "\n${C_B_RED}<<<< Init workspace Failed.${C_RESET}\n\n" exit ${FAILED} fi - diff --git a/codes/linux/soft/README.md b/codes/linux/soft/README.md index fcd4f70..c78aa35 100644 --- a/codes/linux/soft/README.md +++ b/codes/linux/soft/README.md @@ -13,7 +13,7 @@ - [RocketMQ 安装](#rocketmq-安装) - [Nacos 安装](#nacos-安装) - [ZooKeeper 安装](#zookeeper-安装) -- [Nginx 安装](#nginx-安装) +- [Nginx 运维](#nginx-安装) - [Fastdfs 安装](#fastdfs-安装) - [Docker 安装](#docker-安装) @@ -190,7 +190,7 @@ curl -o- https://gitee.com/turnon/linux-tutorial/raw/master/codes/linux/soft/zoo wget -qO- https://gitee.com/turnon/linux-tutorial/raw/master/codes/linux/soft/zookeeper-install.sh | bash ``` -## Nginx 安装 +## Nginx 运维 **安装说明** diff --git a/codes/linux/soft/docker-install.sh b/codes/linux/soft/docker-install.sh index 549406a..fd142bc 100644 --- a/codes/linux/soft/docker-install.sh +++ b/codes/linux/soft/docker-install.sh @@ -26,23 +26,22 @@ printf "${RESET}" printf "${GREEN}>>>>>>>> install docker begin.${RESET}\n" # uninstall old version docker -sudo yum remove docker \ - docker-client \ - docker-client-latest \ - docker-common \ - docker-latest \ - docker-latest-logrotate \ - docker-logrotate \ - docker-selinux \ - docker-engine-selinux \ - docker-engine +sudo yum remove docker \ + docker-client \ + docker-client-latest \ + docker-common \ + docker-latest \ + docker-latest-logrotate \ + docker-logrotate \ + docker-engine + # install required libs sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # add docker yum repo sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum makecache fast # install docker -sudo yum -y install docker-ce +sudo yum install docker-ce docker-ce-cli containerd.io sudo systemctl start docker docker version printf "${GREEN}<<<<<<<< install docker end.${RESET}\n" diff --git a/docs/README.md b/docs/README.md index 10b2c7b..08cfab5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,14 @@ -# linux-tutorial ++ + + +
+ ++ +
+ +