i.sh 3.9 KB

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