publish_wp_site.sh 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. #!/bin/bash
  2. #### 从临时服务器发布站点到正式环境
  3. #### Author: chenpeiqing
  4. #### Date: 2025-01-07
  5. SITE_CODE=$1
  6. DOMAIN_NAME=$2
  7. DATABASE_NAME=$3
  8. # 最大重试次数
  9. MAX_RETRIES=3
  10. # 初始重试次数
  11. RETRY_COUNT=0
  12. TEMP_DOMAIN='v3-site.adwebcloud.com'
  13. RDS_HOST='127.0.0.1'
  14. RDS_ADMIN='root'
  15. RDS_PWD='Admin@123.com'
  16. TEMP_USER_NAME='ubuntu'
  17. TEMP_IP='35.87.155.71'
  18. TEMP_PEM='/opt/adweb3/pem/adweb3.pem'
  19. first_time=$(date +'%s')
  20. #打印入参
  21. echo "SITE_CODE":$SITE_CODE
  22. echo "DOMAIN_NAME":$DOMAIN_NAME
  23. echo "DATABASE_NAME":$DATABASE_NAME
  24. #临时服务器打包项目代码和数据库文件
  25. start_time=$(date +'%s')
  26. echo "打包站点代码和数据库文件开始:"
  27. ssh -i $TEMP_PEM -p 22 -o IdentitiesOnly=yes $TEMP_USER_NAME@$TEMP_IP << EOF
  28. sudo -i
  29. sh /opt/adweb3/shell/bak-wpsite.sh $SITE_CODE
  30. exit
  31. EOF
  32. end_time=$(date +'%s')
  33. echo "打包站点代码和数据库文件完成,花费:"$((end_time - start_time))"s"
  34. #创建空数据库以及指定用户
  35. start_time=$(date +'%s')
  36. echo "创建生产目录和数据库开始:"
  37. mysql -h $RDS_HOST -u$RDS_ADMIN -p$RDS_PWD<< EOF
  38. DROP DATABASE IF EXISTS $DATABASE_NAME;
  39. CREATE DATABASE $DATABASE_NAME CHARACTER SET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  40. DROP USER IF EXISTS $SITE_CODE;
  41. CREATE USER '$SITE_CODE'@'%' IDENTIFIED BY 'Admin@123.com';
  42. GRANT ALL ON $DATABASE_NAME.* TO '$SITE_CODE'@'%';
  43. flush privileges;
  44. exit
  45. EOF
  46. #创建站点文件夹
  47. if [ ! -d "/usr/local/wwwroot/$DOMAIN_NAME" ]; then
  48. mkdir -p /usr/local/wwwroot/$DOMAIN_NAME
  49. fi
  50. end_time=$(date +'%s')
  51. echo "创建生产目录和数据库完成,花费:"$((end_time - start_time))"s"
  52. ##下载SQL文件
  53. start_time=$(date +'%s')
  54. echo "下载数据库文件并导入数据库开始:"
  55. wget -P /usr/local/wwwroot/$DOMAIN_NAME/ http://download-template-v3.adwebcloud.com/$SITE_CODE.sql
  56. mysql -h $RDS_HOST -u$SITE_CODE -p'Admin@123.com' $DATABASE_NAME</usr/local/wwwroot/$DOMAIN_NAME/$SITE_CODE.sql
  57. end_time=$(date +'%s')
  58. echo "下载数据库文件并导入数据库完成,花费:"$((end_time - start_time))"s"
  59. #下载站点文件
  60. start_time=$(date +'%s')
  61. # 函数:下载文件并显示进度
  62. download_file() {
  63. echo "正在下载: http://download-template-v3.adwebcloud.com/$SITE_CODE.tar.gz"
  64. wget -c "http://download-template-v3.adwebcloud.com/$SITE_CODE.tar.gz" -O "/usr/local/wwwroot/$DOMAIN_NAME/$SITE_CODE.tar.gz"
  65. if [ $? -eq 0 ]; then
  66. echo "下载成功: /usr/local/wwwroot/$DOMAIN_NAME/$SITE_CODE.tar.gz"
  67. return 0
  68. else
  69. echo "下载失败: http://download-template-v3.adwebcloud.com/$SITE_CODE.tar.gz"
  70. return 1
  71. fi
  72. }
  73. # 下载文件,直到成功或达到最大重试次数
  74. while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
  75. download_file
  76. if [ $? -eq 0 ]; then
  77. break
  78. else
  79. RETRY_COUNT=$((RETRY_COUNT + 1))
  80. echo "重试 $RETRY_COUNT/$MAX_RETRIES..."
  81. fi
  82. done
  83. # 检查是否下载成功
  84. if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
  85. echo "下载失败,已达到最大重试次数 $MAX_RETRIES"
  86. else
  87. echo "文件已成功下载到 /usr/local/wwwroot/$DOMAIN_NAME/"
  88. fi
  89. #wget -P /usr/local/wwwroot/$DOMAIN_NAME/ http://download-template-v3.adwebcloud.com/$SITE_CODE.tar.gz
  90. end_time=$(date +'%s')
  91. echo "下载代码包完成,花费:"$((end_time - start_time))"s"
  92. #下载站点文件
  93. start_time=$(date +'%s')
  94. echo "解压缩到指定位置开始:"
  95. tar -zxf /usr/local/wwwroot/$DOMAIN_NAME/$SITE_CODE.tar.gz -C /usr/local/wwwroot/$DOMAIN_NAME/
  96. mv /usr/local/wwwroot/$DOMAIN_NAME/$SITE_CODE/* /usr/local/wwwroot/$DOMAIN_NAME/
  97. rm -rf /usr/local/wwwroot/$DOMAIN_NAME/$SITE_CODE
  98. end_time=$(date +'%s')
  99. echo "解压缩到指定位置完成,花费:"$((end_time - start_time))"s"
  100. #更新站点配置文件
  101. start_time=$(date +'%s')
  102. echo "更新站点配置开始:"
  103. chown -R www-data:www-data /usr/local/wwwroot/$DOMAIN_NAME
  104. #替换redis object cache 键值
  105. sed -i "s:'$SITE_CODE.$TEMP_DOMAIN':'$DOMAIN_NAME':g" /usr/local/wwwroot/$DOMAIN_NAME/wp-config.php
  106. #替换sql数据库名称
  107. sed -i "s:'$SITE_CODE':'$DATABASE_NAME':g" /usr/local/wwwroot/$DOMAIN_NAME/wp-config.php
  108. #替换sql数据库用户名
  109. sed -i "s:'adweb':'$SITE_CODE':g" /usr/local/wwwroot/$DOMAIN_NAME/wp-config.php
  110. #替换sql数据库密码
  111. sed -i "s:'2024_RqBQxctjakHCJVq8kmmYHQKZQGU4YMUH':'Admin@123.com':g" /usr/local/wwwroot/$DOMAIN_NAME/wp-config.php
  112. #替换sql数据库链接地址
  113. sed -i "s:'127.0.0.1':'$RDS_HOST':g" /usr/local/wwwroot/$DOMAIN_NAME/wp-config.php
  114. sed -i "s:'localhost':'$RDS_HOST':g" /usr/local/wwwroot/$DOMAIN_NAME/wp-config.php
  115. #删除下载站点文件和sql文件压缩包
  116. cd /usr/local/wwwroot/$DOMAIN_NAME/
  117. rm -rf $SITE_CODE.sql.tar.gz $SITE_CODE.tar.gz $SITE_CODE.sql
  118. end_time=$(date +'%s')
  119. #更新站点域名
  120. cp /opt/adweb3/config/wp-cli.phar /usr/local/wwwroot/$DOMAIN_NAME
  121. cd /usr/local/wwwroot/$DOMAIN_NAME
  122. # 解析域名
  123. result=$(nslookup $DOMAIN_NAME | grep -Po 'Address: \K[\d.]+')
  124. result_www=$(nslookup www.$DOMAIN_NAME | grep -Po 'Address: \K[\d.]+')
  125. # 判断解析结果是否为空
  126. if [ ! -z "$result" ] && [ ! -z "$result_www" ]; then
  127. #替换为www域名
  128. php ./wp-cli.phar search-replace "$SITE_CODE.$TEMP_DOMAIN" "www.$DOMAIN_NAME" --allow-root
  129. echo "result:"$result
  130. echo "result_www:"$result_www
  131. elif [ ! -z "$result" ] && [ -z "$result_www" ]; then
  132. #替换域名
  133. php ./wp-cli.phar search-replace "$SITE_CODE.$TEMP_DOMAIN" "$DOMAIN_NAME" --allow-root
  134. echo "result":$result
  135. elif [ -z "$result" ] && [ ! -z "$result_www" ]; then
  136. #替换为www域名
  137. php ./wp-cli.phar search-replace "$SITE_CODE.$TEMP_DOMAIN" "www.$DOMAIN_NAME" --allow-root
  138. echo "result:"$result
  139. echo "result_www:"$result_www
  140. else
  141. echo "Parsing failed"
  142. fi
  143. #清除站点缓存
  144. php ./wp-cli.phar cache flush --allow-root
  145. rm -rf /usr/local/wwwroot/$DOMAIN_NAME/wp-cli.phar
  146. echo "更新站点配置完成,花费:"$((end_time - start_time))"s"
  147. # 重启nginx
  148. cp /opt/adweb3/nginx_template/wp-site.conf /usr/local/openresty/nginx/vhost/$DOMAIN_NAME.conf
  149. sed -i "s:DOMAIN_NAME:$DOMAIN_NAME:g" /usr/local/openresty/nginx/vhost/$DOMAIN_NAME.conf
  150. echo "开始重启nginx配置"
  151. /usr/local/openresty/nginx/sbin/nginx -s reload
  152. echo "nginx配置重启完成"echo "开始重启nginx配置"
  153. #生成ssl证书
  154. echo "生成$DOMAIN_NAME的ssl证书开始:"
  155. start_time=$(date +'%s')
  156. # 解析域名
  157. result=$(nslookup $DOMAIN_NAME | grep -Po 'Address: \K[\d.]+')
  158. result_www=$(nslookup www.$DOMAIN_NAME | grep -Po 'Address: \K[\d.]+')
  159. # 判断解析结果是否为空
  160. if [ ! -z "$result" ] && [ ! -z "$result_www" ]; then
  161. #生成SSL证书
  162. #生成位置 /root/.acme.sh/$DOMAIN_NAME
  163. /root/.acme.sh/acme.sh --issue -d $DOMAIN_NAME -d "www.$DOMAIN_NAME" --webroot /usr/local/wwwroot/$DOMAIN_NAME
  164. echo "result:"$result
  165. echo "result_www:"$result_www
  166. elif [ ! -z "$result" ] && [ -z "$result_www" ]; then
  167. /root/.acme.sh/acme.sh --issue -d $DOMAIN_NAME --webroot /usr/local/wwwroot/$DOMAIN_NAME
  168. echo "result":$result
  169. elif [ -z "$result" ] && [ ! -z "$result_www" ]; then
  170. /root/.acme.sh/acme.sh --issue -d "www.$DOMAIN_NAME" --webroot /usr/local/wwwroot/$DOMAIN_NAME
  171. echo "result:"$result
  172. echo "result_www:"$result_www
  173. else
  174. echo "Parsing failed"
  175. fi
  176. #等待30s,确保SSL证书目录生成
  177. sleep 30
  178. if [ -d "/root/.acme.sh/$DOMAIN_NAME" ]; then
  179. fullchain=$(cat /root/.acme.sh/$DOMAIN_NAME/fullchain.cer)
  180. awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "fullchain" n ".pem"}' < /root/.acme.sh/$DOMAIN_NAME/fullchain.cer
  181. Certificate_body=$(cat fullchain.pem)
  182. echo '[start cert.pem]'
  183. echo $Certificate_body
  184. echo '[end cert.pem]'
  185. Certificate_chain=$(cat fullchain1.pem)
  186. Certificate_chain1=$(cat fullchain2.pem)
  187. echo '[start chain.pem]'
  188. echo ${Certificate_chain}" "${Certificate_chain1}
  189. echo '[end chain.pem]'
  190. Certificate_private_key=$(cat /root/.acme.sh/$DOMAIN_NAME/*key)
  191. echo '[start privkey.pem]'
  192. echo $Certificate_private_key
  193. echo '[end privkey.pem]'
  194. rm -rf *.pem
  195. elif [ -d "/root/.acme.sh/${DOMAIN_NAME}_ecc" ]; then
  196. fullchain=$(cat /root/.acme.sh/${DOMAIN_NAME}_ecc/fullchain.cer)
  197. awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "fullchain" n ".pem"}' < /root/.acme.sh/${DOMAIN_NAME}_ecc/fullchain.cer
  198. Certificate_body=$(cat fullchain.pem)
  199. echo '[start cert.pem]'
  200. echo $Certificate_body
  201. echo '[end cert.pem]'
  202. Certificate_chain=$(cat fullchain1.pem)
  203. Certificate_chain1=$(cat fullchain2.pem)
  204. echo '[start chain.pem]'
  205. echo ${Certificate_chain}" "${Certificate_chain1}
  206. echo '[end chain.pem]'
  207. Certificate_private_key=$(cat /root/.acme.sh/${DOMAIN_NAME}_ecc/*key)
  208. echo '[start privkey.pem]'
  209. echo $Certificate_private_key
  210. echo '[end privkey.pem]'
  211. rm -rf *.pem
  212. else
  213. echo "SSL Certificate not found"
  214. fi
  215. end_time=$(date +'%s')
  216. echo "生成$DOMAIN_NAME的ssl证书开始花费:"$((end_time - start_time))"s"
  217. #开启nginx证书 ssl 配置
  218. #重启nginx
  219. sed -i "s:####::g" /usr/local/openresty/nginx/vhost/$DOMAIN_NAME.conf
  220. echo "开始重启nginx配置"
  221. /usr/local/openresty/nginx/sbin/nginx -s reload
  222. echo "nginx配置重启完成"echo "开始重启nginx配置"
  223. #临时服务器清空之前的临时资源
  224. ssh -i $TEMP_PEM -p 22 -o IdentitiesOnly=yes $TEMP_USER_NAME@$TEMP_IP << EOF
  225. sudo -i
  226. sh /opt/adweb3/shell/remove-wpsite.sh $SITE_CODE
  227. exit
  228. EOF
  229. echo "[Creation completed]"