jsproxy/i.sh

173 lines
3.8 KiB
Bash
Raw Normal View History

2019-05-20 08:53:44 +00:00
#!/usr/bin/env bash
2019-05-14 09:08:37 +00:00
2019-05-20 08:53:44 +00:00
CDN=https://cdn.jsdelivr.net/gh/etherdream/jsproxy-bin@master
2019-05-14 09:08:37 +00:00
2019-05-26 07:53:03 +00:00
JSPROXY_VER=0.0.10
2019-05-20 08:53:44 +00:00
OPENRESTY_VER=1.15.8.1
2019-05-14 09:08:37 +00:00
2019-05-20 08:53:44 +00:00
SUPPORTED_OS="Linux-x86_64"
OS="$(uname)-$(uname -m)"
USER=`whoami`
2019-05-20 08:53:44 +00:00
NGX_DIR="$HOME/openresty"
COLOR_RESET="\033[0m"
COLOR_RED="\033[31m"
COLOR_GREEN="\033[32m"
COLOR_YELLOW="\033[33m"
output() {
2019-05-21 01:12:15 +00:00
local color=$1
2019-05-20 08:53:44 +00:00
shift 1
2019-05-21 01:12:15 +00:00
local sdata=$@
local stime=$(date "+%H:%M:%S")
2019-05-20 08:53:44 +00:00
printf "$color[jsproxy $stime]$COLOR_RESET $sdata\n"
}
log() {
output $COLOR_GREEN $1
}
warn() {
output $COLOR_YELLOW $1
}
err() {
output $COLOR_RED $1
}
2019-05-26 06:39:28 +00:00
gen_cert() {
log "准备申请 HTTPS 证书,使用 服务器IP.xip.io 域名"
local ip_api="https://api.ipify.org"
log "正在获取服务器公网 IP通过接口: $ip_api"
local ip=$(curl -s $ip_api)
log "服务器公网 IP: $ip"
log "安装 acme.sh 脚本 ..."
curl https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh | INSTALLONLINE=1 sh
local acme=~/.acme.sh/acme.sh
local domain=$ip.xip.io
2019-05-26 07:53:03 +00:00
local dist=./server/cert/$domain
mkdir -p $dist
2019-05-26 06:39:28 +00:00
log "执行 acme.sh 脚本 ..."
$acme \
--issue \
-d $domain \
--keylength ec-256 \
2019-05-26 07:53:03 +00:00
--webroot ./server/acme
2019-05-26 06:39:28 +00:00
$acme \
--install-cert \
-d $domain \
--ecc \
--key-file $dist/ecc.key \
--fullchain-file $dist/ecc.cer
2019-05-26 07:53:03 +00:00
echo "
listen 8443 ssl http2;
ssl_certificate cert/$domain/ecc.cer;
ssl_certificate_key cert/$domain/ecc.key;
" > ./server/cert.conf
2019-05-26 06:39:28 +00:00
log "证书申请完成,重启服务 ..."
./server/run.sh reload
log "预览: https://zjcqoo.github.io/#test=$ip"
}
install() {
log "下载 nginx 程序 ..."
curl -O $CDN/$OS/openresty-$OPENRESTY_VER.tar.gz
tar zxf openresty-$OPENRESTY_VER.tar.gz
rm -f openresty-$OPENRESTY_VER.tar.gz
2019-05-21 01:12:15 +00:00
local ngx_exe="$NGX_DIR/nginx/sbin/nginx"
local ngx_ver=$($ngx_exe -v 2>&1)
2019-05-20 08:53:44 +00:00
2019-05-21 01:12:15 +00:00
if [[ "$ngx_ver" != *"nginx version:"* ]]; then
err "$ngx_exe 无法执行!尝试编译安装"
2019-05-20 08:53:44 +00:00
exit 1
fi
2019-05-21 01:12:15 +00:00
log "$ngx_ver"
2019-05-20 10:04:50 +00:00
log "nginx path: $NGX_DIR"
2019-05-20 08:53:44 +00:00
2019-05-20 10:04:50 +00:00
log "下载代理服务 ..."
2019-05-20 08:53:44 +00:00
curl -s -O $CDN/server-$JSPROXY_VER.tar.gz
2019-05-20 13:11:51 +00:00
if [ -x ./server/run.sh ]; then
warn "尝试停止当前服务 ..."
2019-05-20 10:04:50 +00:00
./server/run.sh quit
fi
2019-05-20 08:53:44 +00:00
if [ -d "server" ]; then
2019-05-20 10:04:50 +00:00
backup="$PWD/bak/$(date +%Y_%m_%d_%H_%M_%S)"
2019-05-20 08:53:44 +00:00
warn "当前 server 目录备份到 $backup"
mkdir -p $backup
mv server $backup
fi
tar zxf server-$JSPROXY_VER.tar.gz
rm -f server-$JSPROXY_VER.tar.gz
log "启动服务 ..."
./server/run.sh
2019-05-26 06:39:28 +00:00
log "服务已开启"
gen_cert
2019-05-20 08:53:44 +00:00
}
main() {
2019-05-26 06:39:28 +00:00
log "jsproxy 自动安装脚本开始执行 ..."
2019-05-20 08:53:44 +00:00
if [[ "$SUPPORTED_OS" != *"$OS"* ]]; then
err "当前系统 $OS 不支持自动安装。尝试编译安装"
exit 1
fi
if [[ "$USER" != "root" ]]; then
err "自动安装需要 root 权限。如果无法使用 root尝试编译安装"
exit 1
fi
2019-05-20 10:04:50 +00:00
if ! id -u jsproxy > /dev/null 2>&1 ; then
log "创建用户 jsproxy ..."
groupadd nobody > /dev/null 2>&1
useradd jsproxy -g nobody --create-home
fi
2019-05-20 08:53:44 +00:00
2019-05-26 06:39:28 +00:00
warn "HTTPS 证书申请需要验证 80 端口,确保 TCP:80 已添加到防火墙"
warn "如果当前已有 80 端口的服务,将暂时无法收到数据"
iptables \
-m comment --comment "acme challenge svc" \
-t nat \
-I PREROUTING 1 \
-p tcp --dport 80 \
-j REDIRECT \
--to-ports 10080
2019-05-21 01:12:15 +00:00
local src=$0
local dst=/home/jsproxy/i.sh
2019-05-20 10:04:50 +00:00
warn "当前脚本移动到 $dst"
2019-05-20 08:53:44 +00:00
mv -f $src $dst
chmod +x $dst
2019-05-20 10:04:50 +00:00
log "切换到 jsproxy 用户,执行安装脚本 ..."
2019-05-20 08:53:44 +00:00
su - jsproxy -c "$dst install"
2019-05-26 06:39:28 +00:00
log "恢复 80 端口 ..."
local line=$(iptables -t nat -L --line-numbers | grep "acme challenge svc")
iptables -t nat -D PREROUTING ${line%% *}
log "安装完成。后续维护参考 https://github.com/EtherDream/jsproxy"
2019-05-20 08:53:44 +00:00
}
if [[ "$1" == "install" ]]; then
install
else
main
fi