i.sh 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #!/usr/bin/env bash
  2. CDN=https://cdn.jsdelivr.net/gh/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. echo "
  53. listen 8443 ssl http2;
  54. ssl_certificate cert/$domain/ecc.cer;
  55. ssl_certificate_key cert/$domain/ecc.key;
  56. " > server/cert/cert.conf
  57. log "证书申请完成,重启服务 ..."
  58. server/run.sh reload
  59. log "在线预览: https://zjcqoo.github.io/#test=$ip"
  60. }
  61. install() {
  62. cd /home/jsproxy
  63. log "下载 nginx 程序 ..."
  64. curl -O $CDN/$OS/openresty-$OPENRESTY_VER.tar.gz
  65. tar zxf openresty-$OPENRESTY_VER.tar.gz
  66. rm -f openresty-$OPENRESTY_VER.tar.gz
  67. local ngx_exe=openresty/nginx/sbin/nginx
  68. local ngx_ver=$($ngx_exe -v 2>&1)
  69. if [[ "$ngx_ver" != *"nginx version:"* ]]; then
  70. err "$ngx_exe 无法执行!尝试编译安装"
  71. exit 1
  72. fi
  73. log "$ngx_ver"
  74. log "nginx path: $NGX_DIR"
  75. log "下载代理服务 ..."
  76. curl -o jsproxy.tar.gz https://codeload.github.com/EtherDream/jsproxy/tar.gz/$JSPROXY_VER
  77. tar zxf jsproxy.tar.gz
  78. rm -f jsproxy.tar.gz
  79. if [ -x server/run.sh ]; then
  80. warn "尝试停止当前服务 ..."
  81. server/run.sh quit
  82. fi
  83. if [ -d server ]; then
  84. backup="$PWD/bak/$(date +%Y_%m_%d_%H_%M_%S)"
  85. warn "当前 server 目录备份到 $backup"
  86. mkdir -p $backup
  87. mv server $backup
  88. fi
  89. mv jsproxy-$JSPROXY_VER server
  90. log "启动服务 ..."
  91. server/run.sh
  92. log "服务已开启"
  93. gen_cert
  94. }
  95. main() {
  96. log "自动安装脚本开始执行"
  97. if [[ "$SUPPORTED_OS" != *"$OS"* ]]; then
  98. err "当前系统 $OS 不支持自动安装。尝试编译安装"
  99. exit 1
  100. fi
  101. if [[ "$USER" != "root" ]]; then
  102. err "自动安装需要 root 权限。如果无法使用 root,尝试编译安装"
  103. exit 1
  104. fi
  105. if ! id -u jsproxy > /dev/null 2>&1 ; then
  106. log "创建用户 jsproxy ..."
  107. groupadd nobody > /dev/null 2>&1
  108. useradd jsproxy -g nobody --create-home
  109. fi
  110. warn "HTTPS 证书申请需要验证 80 端口,确保 TCP:80 已添加到防火墙"
  111. warn "如果当前已有 80 端口的服务,将暂时无法收到数据"
  112. iptables \
  113. -m comment --comment "acme challenge svc" \
  114. -t nat \
  115. -I PREROUTING 1 \
  116. -p tcp --dport 80 \
  117. -j REDIRECT \
  118. --to-ports 10080
  119. local src=$0
  120. local dst=/home/jsproxy/i.sh
  121. warn "当前脚本移动到 $dst"
  122. mv -f $src $dst
  123. chmod +x $dst
  124. log "切换到 jsproxy 用户,执行安装脚本 ..."
  125. su - jsproxy -c "$dst install"
  126. local line=$(iptables -t nat -L --line-numbers | grep "acme challenge svc")
  127. iptables -t nat -D PREROUTING ${line%% *}
  128. log "安装完成。后续维护参考 https://github.com/EtherDream/jsproxy"
  129. }
  130. case $1 in
  131. "install")
  132. install;;
  133. "cert")
  134. gen_cert;;
  135. *)
  136. main;;
  137. esac