i.sh 3.8 KB

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