i.sh 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #!/usr/bin/env bash
  2. { # this ensures the entire script is downloaded #
  3. JSPROXY_VER=dev
  4. OPENRESTY_VER=1.15.8.1
  5. SRC_URL=https://raw.githubusercontent.com/EtherDream/jsproxy/$JSPROXY_VER
  6. BIN_URL=https://raw.githubusercontent.com/EtherDream/jsproxy-bin/master
  7. ZIP_URL=https://codeload.github.com/EtherDream/jsproxy/tar.gz
  8. SUPPORTED_OS="Linux-x86_64"
  9. OS="$(uname)-$(uname -m)"
  10. USER=$(whoami)
  11. INSTALL_DIR=/home/jsproxy
  12. NGX_DIR=$INSTALL_DIR/openresty
  13. DOMAIN_SUFFIX=(
  14. xip.io
  15. nip.io
  16. sslip.io
  17. )
  18. GET_IP_API=(
  19. https://api.ipify.org
  20. https://bot.whatismyipaddress.com/
  21. )
  22. COLOR_RESET="\033[0m"
  23. COLOR_RED="\033[31m"
  24. COLOR_GREEN="\033[32m"
  25. COLOR_YELLOW="\033[33m"
  26. output() {
  27. local color=$1
  28. shift 1
  29. local sdata=$@
  30. local stime=$(date "+%H:%M:%S")
  31. printf "$color[jsproxy $stime]$COLOR_RESET $sdata\n"
  32. }
  33. log() {
  34. output $COLOR_GREEN $1
  35. }
  36. warn() {
  37. output $COLOR_YELLOW $1
  38. }
  39. err() {
  40. output $COLOR_RED $1
  41. }
  42. gen_cert() {
  43. local ip=""
  44. for i in ${GET_IP_API[@]}; do
  45. log "服务器公网 IP 获取中,通过接口 $i"
  46. ip=$(curl -s $i)
  47. if [[ ! $ip ]]; then
  48. warn "获取失败"
  49. continue
  50. fi
  51. if [[ $(ipcalc -c $ip 2>&1) ]]; then
  52. warn "无效 IP:$ip"
  53. continue
  54. fi
  55. break
  56. done
  57. if [[ $ip ]]; then
  58. log "服务器公网 IP: $ip"
  59. else
  60. err "服务器公网 IP 获取失败,无法申请证书"
  61. exit 1
  62. fi
  63. log "安装 acme.sh 脚本 ..."
  64. curl https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh | INSTALLONLINE=1 sh
  65. local acme=~/.acme.sh/acme.sh
  66. for i in ${DOMAIN_SUFFIX[@]}; do
  67. local domain=$ip.$i
  68. log "尝试为域名 $domain 申请证书 ..."
  69. local dist=server/cert/$domain
  70. mkdir -p $dist
  71. $acme \
  72. --issue \
  73. -d $domain \
  74. --keylength ec-256 \
  75. --webroot server/acme
  76. $acme \
  77. --install-cert \
  78. -d $domain \
  79. --ecc \
  80. --key-file $dist/ecc.key \
  81. --fullchain-file $dist/ecc.cer
  82. if [ -s $dist/ecc.key ] && [ -s $dist/ecc.cer ]; then
  83. echo "# generated by i.sh
  84. listen 8443 ssl http2;
  85. ssl_certificate cert/$domain/ecc.cer;
  86. ssl_certificate_key cert/$domain/ecc.key;
  87. " > server/cert/cert.conf
  88. log "证书申请完成,重启服务 ..."
  89. server/run.sh reload
  90. log "在线预览: https://$domain:8443"
  91. break
  92. fi
  93. err "证书申请失败!"
  94. rm -rf $dist
  95. done
  96. }
  97. install() {
  98. cd $INSTALL_DIR
  99. log "下载 nginx 程序 ..."
  100. curl -O $BIN_URL/$OS/openresty-$OPENRESTY_VER.tar.gz
  101. tar zxf openresty-$OPENRESTY_VER.tar.gz
  102. rm -f openresty-$OPENRESTY_VER.tar.gz
  103. local ngx_exe=$NGX_DIR/nginx/sbin/nginx
  104. local ngx_ver=$($ngx_exe -v 2>&1)
  105. if [[ "$ngx_ver" != *"nginx version:"* ]]; then
  106. err "$ngx_exe 无法执行!尝试编译安装"
  107. exit 1
  108. fi
  109. log "$ngx_ver"
  110. log "nginx path: $NGX_DIR"
  111. log "下载代理服务 ..."
  112. curl -o jsproxy.tar.gz $ZIP_URL/$JSPROXY_VER
  113. tar zxf jsproxy.tar.gz
  114. rm -f jsproxy.tar.gz
  115. log "下载静态资源 ..."
  116. curl -o www.tar.gz $ZIP_URL/gh-pages
  117. mkdir jsproxy-$JSPROXY_VER/www
  118. tar zxf www.tar.gz -C jsproxy-$JSPROXY_VER/www --strip-components=1
  119. rm -f www.tar.gz
  120. if [ -x server/run.sh ]; then
  121. warn "尝试停止当前服务 ..."
  122. server/run.sh quit
  123. fi
  124. if [ -d server ]; then
  125. backup="$INSTALL_DIR/bak/$(date +%Y_%m_%d_%H_%M_%S)"
  126. warn "当前 server 目录备份到 $backup"
  127. mkdir -p $backup
  128. mv server $backup
  129. fi
  130. mv jsproxy-$JSPROXY_VER server
  131. log "启动服务 ..."
  132. server/run.sh
  133. log "服务已开启"
  134. gen_cert
  135. }
  136. main() {
  137. log "自动安装脚本开始执行"
  138. if [[ "$SUPPORTED_OS" != *"$OS"* ]]; then
  139. err "当前系统 $OS 不支持自动安装。尝试编译安装"
  140. exit 1
  141. fi
  142. if [[ "$USER" != "root" ]]; then
  143. err "自动安装需要 root 权限。如果无法使用 root,尝试编译安装"
  144. exit 1
  145. fi
  146. if ! id -u jsproxy > /dev/null 2>&1 ; then
  147. log "创建用户 jsproxy ..."
  148. groupadd nobody > /dev/null 2>&1
  149. useradd jsproxy -g nobody --create-home
  150. fi
  151. warn "HTTPS 证书申请需要验证 80 端口,确保 TCP:80 已添加到防火墙"
  152. warn "如果当前已有 80 端口的服务,将暂时无法收到数据"
  153. iptables \
  154. -m comment --comment "acme challenge svc" \
  155. -t nat \
  156. -I PREROUTING 1 \
  157. -p tcp --dport 80 \
  158. -j REDIRECT \
  159. --to-ports 10080
  160. log "切换到 jsproxy 用户,执行安装脚本 ..."
  161. su - jsproxy -c "curl -s $SRC_URL/i.sh | bash -s install"
  162. local line=$(iptables -t nat -L --line-numbers | grep "acme challenge svc")
  163. iptables -t nat -D PREROUTING ${line%% *}
  164. log "安装完成。后续维护参考 https://github.com/EtherDream/jsproxy"
  165. }
  166. case $1 in
  167. "install")
  168. install;;
  169. "cert")
  170. gen_cert;;
  171. *)
  172. main;;
  173. esac
  174. } # this ensures the entire script is downloaded #