INSTALL.sh 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. #!/usr/bin/env bash
  2. #
  3. # JimV-C
  4. #
  5. # Copyright (C) 2017 JimV <james.iter.cn@gmail.com>
  6. #
  7. # Author: James Iter <james.iter.cn@gmail.com>
  8. #
  9. # This script will help you to automation install JimV-C.
  10. #
  11. export PYPI='https://mirrors.aliyun.com/pypi/simple/'
  12. export NGINX_JIMV='curl https://raw.githubusercontent.com/jamesiter/JimV-C/master/misc/nginx_jimv.conf >> /etc/nginx/nginx.conf'
  13. export SMTP_HOST=''
  14. export SMTP_USER=''
  15. export SMTP_PASSWORD=''
  16. ARGS=`getopt -o h --long rdb_root_password:,rdb_jimv_password:,redis_password:,jwt_secret:,secret_key:,help -n 'INSTALL.sh' -- "$@"`
  17. eval set -- "${ARGS}"
  18. while true
  19. do
  20. case "$1" in
  21. --rdb_root_password)
  22. export RDB_ROOT_PSWD=$2
  23. shift 2
  24. ;;
  25. --rdb_jimv_password)
  26. export RDB_JIMV_PSWD=$2
  27. shift 2
  28. ;;
  29. --redis_password)
  30. export REDIS_PSWD=$2
  31. shift 2
  32. ;;
  33. --jwt_secret)
  34. export JWT_SECRET=$2
  35. shift 2
  36. ;;
  37. --secret_key)
  38. export SECRET_KEY=$2
  39. shift 2
  40. ;;
  41. -h|--help)
  42. echo 'INSTALL.sh [-h|--help|--rdb_root_password|--rdb_jimv_password|--redis_password|--jwt_secret|--secret_key]'
  43. exit 0
  44. ;;
  45. --)
  46. shift
  47. break
  48. ;;
  49. *)
  50. echo "Internal error!"
  51. exit 1
  52. ;;
  53. esac
  54. done
  55. function check_precondition() {
  56. source /etc/os-release
  57. case ${ID} in
  58. centos|fedora|rhel)
  59. if [ ${VERSION_ID} -lt 7 ]; then
  60. echo "System version must greater than or equal to 7, We found ${VERSION_ID}."
  61. exit 1
  62. fi
  63. ;;
  64. *)
  65. echo "${ID} is unknown, Please to be installed manually."
  66. exit 1
  67. ;;
  68. esac
  69. }
  70. function prepare() {
  71. if [ ! ${RDB_ROOT_PSWD} -o ${#RDB_ROOT_PSWD} -eq 0 ]; then
  72. export RDB_ROOT_PSWD=`./misc/gen_pswd.sh`
  73. fi
  74. if [ ! ${RDB_JIMV_PSWD} -o ${#RDB_JIMV_PSWD} -eq 0 ]; then
  75. export RDB_JIMV_PSWD=`./misc/gen_pswd.sh`
  76. fi
  77. if [ ! ${REDIS_PSWD} -o ${#REDIS_PSWD} -eq 0 ]; then
  78. export REDIS_PSWD=`./misc/gen_pswd.sh 128`
  79. fi
  80. if [ ! ${JWT_SECRET} -o ${#JWT_SECRET} -eq 0 ]; then
  81. export JWT_SECRET=`./misc/gen_pswd.sh 128`
  82. fi
  83. if [ ! ${SECRET_KEY} -o ${#SECRET_KEY} -eq 0 ]; then
  84. export SECRET_KEY=`./misc/gen_pswd.sh 128`
  85. fi
  86. yum install epel-release python2-pip git -y
  87. pip install --upgrade pip -i ${PYPI}
  88. pip install virtualenv -i ${PYPI}
  89. }
  90. function install_MariaDB() {
  91. # 安装 MariaDB
  92. yum install mariadb mariadb-server -y
  93. # 配置 MariaDB
  94. mkdir -p /etc/systemd/system/mariadb.service.d
  95. echo '[Service]' > /etc/systemd/system/mariadb.service.d/limits.conf
  96. echo 'LimitNOFILE=65535' >> /etc/systemd/system/mariadb.service.d/limits.conf
  97. systemctl --system daemon-reload
  98. sed -i '/\[mysqld\]/a\bind-address = 127.0.0.1' /etc/my.cnf
  99. sed -i '/\[mysqld\]/a\log-bin' /etc/my.cnf
  100. sed -i '/\[mysqld\]/a\expire_logs_days = 1' /etc/my.cnf
  101. sed -i '/\[mysqld\]/a\innodb_file_per_table' /etc/my.cnf
  102. sed -i '/\[mysqld\]/a\max_connections = 1000' /etc/my.cnf
  103. # 启动并使其随机启动
  104. systemctl enable mariadb.service
  105. systemctl start mariadb.service
  106. # 初始化 MariaDB
  107. mysql_secure_installation << EOF
  108. Y
  109. ${RDB_ROOT_PSWD}
  110. ${RDB_ROOT_PSWD}
  111. Y
  112. Y
  113. Y
  114. Y
  115. EOF
  116. # 测试是否部署成功
  117. mysql -u root -p${RDB_ROOT_PSWD} -e 'show databases'
  118. }
  119. function install_Redis() {
  120. # 安装 Redis
  121. yum install redis -y
  122. # 配置 Redis
  123. echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
  124. sysctl -p
  125. sed -i '@^daemonize no@daemonize yes@g' /etc/redis.conf
  126. sed -i 's@^bind 127.0.0.1@bind 0.0.0.0@g' /etc/redis.conf
  127. sed -i 's@^appendonly no@appendonly yes@g' /etc/redis.conf
  128. echo "requirepass ${REDIS_PSWD}" >> /etc/redis.conf
  129. # 启动并使其随机启动
  130. systemctl enable redis.service
  131. systemctl start redis.service
  132. }
  133. function install_Nginx() {
  134. # 安装 Nginx
  135. yum install nginx -y
  136. # 配置 Nginx
  137. mkdir -p /etc/jimv/keys
  138. chown -R www.www /var/lib/nginx
  139. sed -i 's@user nginx.*$@user www;@' /etc/nginx/nginx.conf
  140. sed -i '/^.*server {/,$d' /etc/nginx/nginx.conf
  141. curl ${NGINX_JIMV} >> /etc/nginx/nginx.conf
  142. # 启动并使其随机启动
  143. systemctl enable nginx.service
  144. systemctl start nginx.service
  145. }
  146. function create_web_user() {
  147. useradd -m www
  148. }
  149. function create_web_sites_directory() {
  150. su - www -c "mkdir ~/sites"
  151. }
  152. function clone_and_checkout_JimV-C() {
  153. su - www -c "git clone https://github.com/jamesiter/JimV-C.git ~/sites/JimV-C"
  154. }
  155. function install_dependencies_library() {
  156. # 创建 python 虚拟环境
  157. su - www -c "virtualenv --system-site-packages ~/venv"
  158. # 导入 python 虚拟环境
  159. su - www -c "source ~/venv/bin/activate"
  160. # 使切入 www 用户时自动导入 python 虚拟环境
  161. su - www -c "echo '. ~/venv/bin/activate' >> .bashrc"
  162. # 安装 JimV-C 所需扩展库
  163. su - www -c "pip install -r ~/sites/JimV-C/requirements.txt -i ${PYPI}"
  164. }
  165. function fit_www_user_permission() {
  166. mkdir -p /var/log/jimv
  167. chown www.www /var/log/jimv
  168. mkdir -p /run/jimv
  169. chown www.www /run/jimv
  170. }
  171. function initialization_db() {
  172. # 建立 JimV 数据库专属用户
  173. mysql -u root -p${RDB_ROOT_PSWD} -e "grant all on jimv.* to jimv@localhost identified by \"${RDB_JIMV_PSWD}\"; flush privileges"
  174. # 初始化数据库
  175. su - www -c "mysql -u jimv -p${RDB_JIMV_PSWD} < ~/sites/JimV-C/misc/init.sql"
  176. # 确认是否初始化成功
  177. mysql -u jimv -p${RDB_JIMV_PSWD} -e 'show databases'
  178. }
  179. function generate_config_file() {
  180. cp -v /home/www/sites/JimV-C/jimvc.conf /etc/jimvc.conf
  181. sed -i "s/\"db_password\".*$/\"db_password\": \"${RDB_JIMV_PSWD}\",/" /etc/jimvc.conf
  182. sed -i "s/\"redis_password\".*$/\"redis_password\": \"${REDIS_PSWD}\",/" /etc/jimvc.conf
  183. sed -i "s/\"jwt_secret\".*$/\"jwt_secret\": \"${JWT_SECRET}\",/" /etc/jimvc.conf
  184. sed -i "s/\"SECRET_KEY\".*$/\"SECRET_KEY\": \"${SECRET_KEY}\",/" /etc/jimvc.conf
  185. sed -i "s/\"smtp_host\".*$/\"smtp_host\": \"${SMTP_HOST}\",/" /etc/jimvc.conf
  186. sed -i "s/\"smtp_user\".*$/\"smtp_user\": \"${SMTP_USER}\",/" /etc/jimvc.conf
  187. sed -i "s/\"smtp_password\".*$/\"smtp_password\": \"${SMTP_PASSWORD}\",/" /etc/jimvc.conf
  188. }
  189. function display_summary_information() {
  190. echo
  191. echo "=== Summary information"
  192. echo "RDB root password: [${RDB_ROOT_PSWD}]"
  193. echo "RDB jimv password: [${RDB_JIMV_PSWD}]"
  194. echo "Redis password: [${REDIS_PSWD}]"
  195. }
  196. function deploy() {
  197. check_precondition
  198. prepare
  199. create_web_user
  200. create_web_sites_directory
  201. clone_and_checkout_JimV-C
  202. fit_www_user_permission
  203. install_MariaDB
  204. install_Redis
  205. install_Nginx
  206. install_dependencies_library
  207. initialization_db
  208. generate_config_file
  209. display_summary_information
  210. }
  211. deploy