|  | @@ -24,10 +24,23 @@ init_var() {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    STATIC_HTML="https://github.com/trojanpanel/install-script/releases/download/v1.0.0/html.tar.gz"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  # Caddy
 | 
	
		
			
				|  |  | +  CADDY_DATA="/tpdata/caddy/"
 | 
	
		
			
				|  |  | +  CADDY_Caddyfile="/tpdata/caddy/Caddyfile"
 | 
	
		
			
				|  |  | +  CADDY_SRV="/tpdata/caddy/srv/"
 | 
	
		
			
				|  |  | +  CADDY_ACME="/tpdata/caddy/acme/"
 | 
	
		
			
				|  |  | +  DOMAIN_FILE="/tpdata/caddy/domain.lock"
 | 
	
		
			
				|  |  | +  domain=""
 | 
	
		
			
				|  |  | +  caddy_remote_port=8863
 | 
	
		
			
				|  |  | +  your_email="[email protected]"
 | 
	
		
			
				|  |  | +  crt_path=""
 | 
	
		
			
				|  |  | +  key_path=""
 | 
	
		
			
				|  |  | +  ssl_option=1
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    # MariaDB
 | 
	
		
			
				|  |  |    MARIA_DATA="/tpdata/mariadb/"
 | 
	
		
			
				|  |  |    mariadb_ip="trojan-panel-mariadb"
 | 
	
		
			
				|  |  | -  mariadb_port=9507
 | 
	
		
			
				|  |  | +  mariadb_port=3306
 | 
	
		
			
				|  |  |    mariadb_user="root"
 | 
	
		
			
				|  |  |    mariadb_pas=""
 | 
	
		
			
				|  |  |    database="trojan_panel_db"
 | 
	
	
		
			
				|  | @@ -36,7 +49,7 @@ init_var() {
 | 
	
		
			
				|  |  |    #Redis
 | 
	
		
			
				|  |  |    REDIS_DATA="/tpdata/redis/"
 | 
	
		
			
				|  |  |    redis_host="trojan-panel-redis"
 | 
	
		
			
				|  |  | -  redis_port=6378
 | 
	
		
			
				|  |  | +  redis_port=6379
 | 
	
		
			
				|  |  |    redis_pass=""
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    # Trojan Panel
 | 
	
	
		
			
				|  | @@ -44,59 +57,15 @@ init_var() {
 | 
	
		
			
				|  |  |    TROJAN_PANEL_WEBFILE="/tpdata/trojan-panel/webfile/"
 | 
	
		
			
				|  |  |    TROJAN_PANEL_LOGS="/tpdata/trojan-panel/logs/"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  # Trojan Panel Core
 | 
	
		
			
				|  |  | -  TROJAN_PANEL_CORE_DATA="/tpdata/trojan-panel-core/"
 | 
	
		
			
				|  |  | -  TROJAN_PANEL_CORE_LOGS="/tpdata/trojan-panel-core/logs/"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    # Trojan Panel UI
 | 
	
		
			
				|  |  |    TROJAN_PANEL_UI_DATA="/tpdata/trojan-panel-ui/"
 | 
	
		
			
				|  |  |    # Nginx
 | 
	
		
			
				|  |  |    NGINX_DATA="/tpdata/nginx/"
 | 
	
		
			
				|  |  |    NGINX_CONFIG="/tpdata/nginx/default.conf"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  # Caddy
 | 
	
		
			
				|  |  | -  CADDY_DATA="/tpdata/caddy/"
 | 
	
		
			
				|  |  | -  CADDY_Caddyfile="/tpdata/caddy/Caddyfile"
 | 
	
		
			
				|  |  | -  CADDY_SRV="/tpdata/caddy/srv/"
 | 
	
		
			
				|  |  | -  CADDY_ACME="/tpdata/caddy/acme/"
 | 
	
		
			
				|  |  | -  DOMAIN_FILE="/tpdata/caddy/domain.lock"
 | 
	
		
			
				|  |  | -  domain=""
 | 
	
		
			
				|  |  | -  caddy_remote_port=8863
 | 
	
		
			
				|  |  | -  your_email="[email protected]"
 | 
	
		
			
				|  |  | -  crt_path=""
 | 
	
		
			
				|  |  | -  key_path=""
 | 
	
		
			
				|  |  | -  ssl_option=1
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  # trojanGFW
 | 
	
		
			
				|  |  | -  TROJANGFW_DATA="/tpdata/trojanGFW/"
 | 
	
		
			
				|  |  | -  TROJANGFW_CONFIG="/tpdata/trojanGFW/config.json"
 | 
	
		
			
				|  |  | -  TROJANGFW_STANDALONE_CONFIG="/tpdata/trojanGFW/standalone_config.json"
 | 
	
		
			
				|  |  | -  trojanGFW_port=443
 | 
	
		
			
				|  |  | -  # trojanGO
 | 
	
		
			
				|  |  | -  TROJANGO_DATA="/tpdata/trojanGO/"
 | 
	
		
			
				|  |  | -  TROJANGO_CONFIG="/tpdata/trojanGO/config.json"
 | 
	
		
			
				|  |  | -  TROJANGO_STANDALONE_CONFIG="/tpdata/trojanGO/standalone_config.json"
 | 
	
		
			
				|  |  | -  trojanGO_port=443
 | 
	
		
			
				|  |  | -  trojanGO_websocket_enable=false
 | 
	
		
			
				|  |  | -  trojanGO_websocket_path="trojan-panel-websocket-path"
 | 
	
		
			
				|  |  | -  trojanGO_shadowsocks_enable=false
 | 
	
		
			
				|  |  | -  trojanGO_shadowsocks_method="AES-128-GCM"
 | 
	
		
			
				|  |  | -  trojanGO_shadowsocks_password=""
 | 
	
		
			
				|  |  | -  trojanGO_mux_enable=true
 | 
	
		
			
				|  |  | -  # trojan
 | 
	
		
			
				|  |  | -  trojan_pas=""
 | 
	
		
			
				|  |  | -  remote_addr="trojan-panel-caddy"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  # hysteria
 | 
	
		
			
				|  |  | -  HYSTERIA_DATA="/tpdata/hysteria/"
 | 
	
		
			
				|  |  | -  HYSTERIA_CONFIG="/tpdata/hysteria/config.json"
 | 
	
		
			
				|  |  | -  HYSTERIA_STANDALONE_CONFIG="/tpdata/hysteria/standalone_config.json"
 | 
	
		
			
				|  |  | -  hysteria_port=443
 | 
	
		
			
				|  |  | -  hysteria_password=""
 | 
	
		
			
				|  |  | -  hysteria_protocol="udp"
 | 
	
		
			
				|  |  | -  hysteria_up_mbps=100
 | 
	
		
			
				|  |  | -  hysteria_down_mbps=100
 | 
	
		
			
				|  |  | -  trojan_panel_url=""
 | 
	
		
			
				|  |  | +  # Trojan Panel Core
 | 
	
		
			
				|  |  | +  TROJAN_PANEL_CORE_DATA="/tpdata/trojan-panel-core/"
 | 
	
		
			
				|  |  | +  TROJAN_PANEL_CORE_LOGS="/tpdata/trojan-panel-core/logs/"
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  echo_content() {
 | 
	
	
		
			
				|  | @@ -129,6 +98,12 @@ mkdir_tools() {
 | 
	
		
			
				|  |  |    # 项目目录
 | 
	
		
			
				|  |  |    mkdir -p ${TP_DATA}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  # Caddy
 | 
	
		
			
				|  |  | +  mkdir -p ${CADDY_DATA}
 | 
	
		
			
				|  |  | +  touch ${CADDY_Caddyfile}
 | 
	
		
			
				|  |  | +  mkdir -p ${CADDY_SRV}
 | 
	
		
			
				|  |  | +  mkdir -p ${CADDY_ACME}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    # MariaDB
 | 
	
		
			
				|  |  |    mkdir -p ${MARIA_DATA}
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -139,36 +114,15 @@ mkdir_tools() {
 | 
	
		
			
				|  |  |    mkdir -p ${TROJAN_PANEL_DATA}
 | 
	
		
			
				|  |  |    mkdir -p ${TROJAN_PANEL_LOGS}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  # Trojan Panel Core
 | 
	
		
			
				|  |  | -  mkdir -p ${TROJAN_PANEL_CORE_DATA}
 | 
	
		
			
				|  |  | -  mkdir -p ${TROJAN_PANEL_CORE_LOGS}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    # Trojan Panel UI
 | 
	
		
			
				|  |  |    mkdir -p ${TROJAN_PANEL_UI_DATA}
 | 
	
		
			
				|  |  |    # # Nginx
 | 
	
		
			
				|  |  |    mkdir -p ${NGINX_DATA}
 | 
	
		
			
				|  |  |    touch ${NGINX_CONFIG}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  # Caddy
 | 
	
		
			
				|  |  | -  mkdir -p ${CADDY_DATA}
 | 
	
		
			
				|  |  | -  touch ${CADDY_Caddyfile}
 | 
	
		
			
				|  |  | -  mkdir -p ${CADDY_SRV}
 | 
	
		
			
				|  |  | -  mkdir -p ${CADDY_ACME}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  # trojanGFW
 | 
	
		
			
				|  |  | -  mkdir -p ${TROJANGFW_DATA}
 | 
	
		
			
				|  |  | -  touch ${TROJANGFW_CONFIG}
 | 
	
		
			
				|  |  | -  touch ${TROJANGFW_STANDALONE_CONFIG}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  # trojanGO
 | 
	
		
			
				|  |  | -  mkdir -p ${TROJANGO_DATA}
 | 
	
		
			
				|  |  | -  touch ${TROJANGO_CONFIG}
 | 
	
		
			
				|  |  | -  touch ${TROJANGO_STANDALONE_CONFIG}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  # hysteria
 | 
	
		
			
				|  |  | -  mkdir -p ${HYSTERIA_DATA}
 | 
	
		
			
				|  |  | -  touch ${HYSTERIA_CONFIG}
 | 
	
		
			
				|  |  | -  touch ${HYSTERIA_STANDALONE_CONFIG}
 | 
	
		
			
				|  |  | +  # Trojan Panel Core
 | 
	
		
			
				|  |  | +  mkdir -p ${TROJAN_PANEL_CORE_DATA}
 | 
	
		
			
				|  |  | +  mkdir -p ${TROJAN_PANEL_CORE_LOGS}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  can_connect() {
 | 
	
	
		
			
				|  | @@ -689,6 +643,7 @@ EOF
 | 
	
		
			
				|  |  |    echo_content red "\n=============================================================="
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +# 安装Trojan Panel Core
 | 
	
		
			
				|  |  |  install_trojan_panel_core() {
 | 
	
		
			
				|  |  |    if [[ -z $(docker ps -q -f "name=^trojan-panel-core$") ]]; then
 | 
	
		
			
				|  |  |      echo_content green "---> 安装Trojan Panel Core"
 | 
	
	
		
			
				|  | @@ -755,712 +710,6 @@ install_trojan_panel_core() {
 | 
	
		
			
				|  |  |    fi
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -# 安装TrojanGFW 数据库版
 | 
	
		
			
				|  |  | -install_trojan_gfw() {
 | 
	
		
			
				|  |  | -  if [[ -z $(docker ps -q -f "name=^trojan-panel-trojanGFW$") ]]; then
 | 
	
		
			
				|  |  | -    echo_content green "---> 安装TrojanGFW"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    read -r -p "请输入TrojanGFW的端口(默认:443): " trojanGFW_port
 | 
	
		
			
				|  |  | -    [[ -z "${trojanGFW_port}" ]] && trojanGFW_port=443
 | 
	
		
			
				|  |  | -    read -r -p "请输入数据库的IP地址(默认:本机数据库): " mariadb_ip
 | 
	
		
			
				|  |  | -    [[ -z "${mariadb_ip}" ]] && mariadb_ip="trojan-panel-mariadb"
 | 
	
		
			
				|  |  | -    read -r -p "请输入数据库的端口(默认:本机数据库端口): " mariadb_port
 | 
	
		
			
				|  |  | -    [[ -z "${mariadb_port}" ]] && mariadb_port=3306
 | 
	
		
			
				|  |  | -    read -r -p "请输入数据库的用户名(默认:root): " mariadb_user
 | 
	
		
			
				|  |  | -    [[ -z "${mariadb_user}" ]] && mariadb_user="root"
 | 
	
		
			
				|  |  | -    while read -r -p "请输入数据库的密码(必填): " mariadb_pas; do
 | 
	
		
			
				|  |  | -      if [[ -z "${mariadb_pas}" ]]; then
 | 
	
		
			
				|  |  | -        echo_content red "密码不能为空"
 | 
	
		
			
				|  |  | -      else
 | 
	
		
			
				|  |  | -        break
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -    done
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    cat >${TROJANGFW_CONFIG} <<EOF
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -    "run_type": "server",
 | 
	
		
			
				|  |  | -    "local_addr": "0.0.0.0",
 | 
	
		
			
				|  |  | -    "local_port": ${trojanGFW_port},
 | 
	
		
			
				|  |  | -    "remote_addr": "${remote_addr}",
 | 
	
		
			
				|  |  | -    "remote_port": 80,
 | 
	
		
			
				|  |  | -    "password": [],
 | 
	
		
			
				|  |  | -    "log_level": 1,
 | 
	
		
			
				|  |  | -    "ssl": {
 | 
	
		
			
				|  |  | -        "cert": "${CADDY_ACME}${domain}/${domain}.crt",
 | 
	
		
			
				|  |  | -        "key": "${CADDY_ACME}${domain}/${domain}.key",
 | 
	
		
			
				|  |  | -        "key_password": "",
 | 
	
		
			
				|  |  | -        "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384",
 | 
	
		
			
				|  |  | -        "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
 | 
	
		
			
				|  |  | -        "prefer_server_cipher": true,
 | 
	
		
			
				|  |  | -        "alpn": [
 | 
	
		
			
				|  |  | -            "http/1.1"
 | 
	
		
			
				|  |  | -        ],
 | 
	
		
			
				|  |  | -        "alpn_port_override": {
 | 
	
		
			
				|  |  | -            "h2": 81
 | 
	
		
			
				|  |  | -        },
 | 
	
		
			
				|  |  | -        "reuse_session": true,
 | 
	
		
			
				|  |  | -        "session_ticket": false,
 | 
	
		
			
				|  |  | -        "session_timeout": 600,
 | 
	
		
			
				|  |  | -        "plain_http_response": "",
 | 
	
		
			
				|  |  | -        "curves": "",
 | 
	
		
			
				|  |  | -        "dhparam": ""
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    "tcp": {
 | 
	
		
			
				|  |  | -        "prefer_ipv4": false,
 | 
	
		
			
				|  |  | -        "no_delay": true,
 | 
	
		
			
				|  |  | -        "keep_alive": true,
 | 
	
		
			
				|  |  | -        "reuse_port": false,
 | 
	
		
			
				|  |  | -        "fast_open": false,
 | 
	
		
			
				|  |  | -        "fast_open_qlen": 20
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    "mysql": {
 | 
	
		
			
				|  |  | -        "enabled": true,
 | 
	
		
			
				|  |  | -        "server_addr": "${mariadb_ip}",
 | 
	
		
			
				|  |  | -        "server_port": ${mariadb_port},
 | 
	
		
			
				|  |  | -        "database": "trojan_panel_db",
 | 
	
		
			
				|  |  | -        "username": "${mariadb_user}",
 | 
	
		
			
				|  |  | -        "password": "${mariadb_pas}",
 | 
	
		
			
				|  |  | -        "key": "",
 | 
	
		
			
				|  |  | -        "cert": "",
 | 
	
		
			
				|  |  | -        "ca": ""
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -EOF
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    docker pull trojangfw/trojan &&
 | 
	
		
			
				|  |  | -      docker run -d --name trojan-panel-trojanGFW --restart always \
 | 
	
		
			
				|  |  | -        --network=trojan-panel-network \
 | 
	
		
			
				|  |  | -        -p ${trojanGFW_port}:${trojanGFW_port} \
 | 
	
		
			
				|  |  | -        -v ${TROJANGFW_CONFIG}:"/config/config.json" \
 | 
	
		
			
				|  |  | -        -v ${CADDY_ACME}:${CADDY_ACME} \
 | 
	
		
			
				|  |  | -        trojangfw/trojan
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGFW$") ]]; then
 | 
	
		
			
				|  |  | -      echo_content skyBlue "---> TrojanGFW 数据库版 安装完成"
 | 
	
		
			
				|  |  | -      echo_content red "\n=============================================================="
 | 
	
		
			
				|  |  | -      echo_content skyBlue "TrojanGFW+Caddy+Web+TLS节点 数据库版 安装成功"
 | 
	
		
			
				|  |  | -      echo_content yellow "域名: ${domain}"
 | 
	
		
			
				|  |  | -      echo_content yellow "TrojanGFW的端口: ${trojanGFW_port}"
 | 
	
		
			
				|  |  | -      echo_content yellow "TrojanGFW的密码: 用户名&密码"
 | 
	
		
			
				|  |  | -      echo_content red "\n=============================================================="
 | 
	
		
			
				|  |  | -    else
 | 
	
		
			
				|  |  | -      echo_content red "---> TrojanGFW 数据库版 安装失败"
 | 
	
		
			
				|  |  | -      exit 0
 | 
	
		
			
				|  |  | -    fi
 | 
	
		
			
				|  |  | -  else
 | 
	
		
			
				|  |  | -    echo_content skyBlue "---> 你已经安装了TrojanGFW 数据库版"
 | 
	
		
			
				|  |  | -  fi
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -# 安装TrojanGFW 单机版
 | 
	
		
			
				|  |  | -install_trojan_gfw_standalone() {
 | 
	
		
			
				|  |  | -  if [[ -z $(docker ps -q -f "name=^trojan-panel-trojanGFW-standalone$") ]]; then
 | 
	
		
			
				|  |  | -    echo_content green "---> 安装TrojanGFW"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    read -r -p "请输入TrojanGFW的端口(默认:443): " trojanGFW_port
 | 
	
		
			
				|  |  | -    [[ -n ${trojanGFW_port} ]] && trojanGFW_port=443
 | 
	
		
			
				|  |  | -    while read -r -p "请输入TrojanGFW的密码(必填): " trojan_pas; do
 | 
	
		
			
				|  |  | -      if [[ -z "${trojan_pas}" ]]; then
 | 
	
		
			
				|  |  | -        echo_content red "密码不能为空"
 | 
	
		
			
				|  |  | -      else
 | 
	
		
			
				|  |  | -        break
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -    done
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    cat >${TROJANGFW_STANDALONE_CONFIG} <<EOF
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -    "run_type": "server",
 | 
	
		
			
				|  |  | -    "local_addr": "0.0.0.0",
 | 
	
		
			
				|  |  | -    "local_port": ${trojanGFW_port},
 | 
	
		
			
				|  |  | -    "remote_addr": "${remote_addr}",
 | 
	
		
			
				|  |  | -    "remote_port": 80,
 | 
	
		
			
				|  |  | -    "password": [
 | 
	
		
			
				|  |  | -        "${trojan_pas}"
 | 
	
		
			
				|  |  | -    ],
 | 
	
		
			
				|  |  | -    "log_level": 1,
 | 
	
		
			
				|  |  | -    "ssl": {
 | 
	
		
			
				|  |  | -        "cert": "${CADDY_ACME}${domain}/${domain}.crt",
 | 
	
		
			
				|  |  | -        "key": "${CADDY_ACME}${domain}/${domain}.key",
 | 
	
		
			
				|  |  | -        "key_password": "",
 | 
	
		
			
				|  |  | -        "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384",
 | 
	
		
			
				|  |  | -        "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
 | 
	
		
			
				|  |  | -        "prefer_server_cipher": true,
 | 
	
		
			
				|  |  | -        "alpn": [
 | 
	
		
			
				|  |  | -            "http/1.1"
 | 
	
		
			
				|  |  | -        ],
 | 
	
		
			
				|  |  | -        "alpn_port_override": {
 | 
	
		
			
				|  |  | -            "h2": 81
 | 
	
		
			
				|  |  | -        },
 | 
	
		
			
				|  |  | -        "reuse_session": true,
 | 
	
		
			
				|  |  | -        "session_ticket": false,
 | 
	
		
			
				|  |  | -        "session_timeout": 600,
 | 
	
		
			
				|  |  | -        "plain_http_response": "",
 | 
	
		
			
				|  |  | -        "curves": "",
 | 
	
		
			
				|  |  | -        "dhparam": ""
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    "tcp": {
 | 
	
		
			
				|  |  | -        "prefer_ipv4": false,
 | 
	
		
			
				|  |  | -        "no_delay": true,
 | 
	
		
			
				|  |  | -        "keep_alive": true,
 | 
	
		
			
				|  |  | -        "reuse_port": false,
 | 
	
		
			
				|  |  | -        "fast_open": false,
 | 
	
		
			
				|  |  | -        "fast_open_qlen": 20
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    "mysql": {
 | 
	
		
			
				|  |  | -        "enabled": false,
 | 
	
		
			
				|  |  | -        "server_addr": "127.0.0.1",
 | 
	
		
			
				|  |  | -        "server_port": 3306,
 | 
	
		
			
				|  |  | -        "database": "",
 | 
	
		
			
				|  |  | -        "username": "",
 | 
	
		
			
				|  |  | -        "password": "",
 | 
	
		
			
				|  |  | -        "key": "",
 | 
	
		
			
				|  |  | -        "cert": "",
 | 
	
		
			
				|  |  | -        "ca": ""
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -EOF
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    docker pull trojangfw/trojan &&
 | 
	
		
			
				|  |  | -      docker run -d --name trojan-panel-trojanGFW-standalone --restart always \
 | 
	
		
			
				|  |  | -        --network=trojan-panel-network \
 | 
	
		
			
				|  |  | -        -p ${trojanGFW_port}:${trojanGFW_port} \
 | 
	
		
			
				|  |  | -        -v ${TROJANGFW_STANDALONE_CONFIG}:"/config/config.json" \
 | 
	
		
			
				|  |  | -        -v ${CADDY_ACME}:${CADDY_ACME} \
 | 
	
		
			
				|  |  | -        trojangfw/trojan
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGFW-standalone$") ]]; then
 | 
	
		
			
				|  |  | -      echo_content skyBlue "---> TrojanGFW 单机版 安装完成"
 | 
	
		
			
				|  |  | -      echo_content red "\n=============================================================="
 | 
	
		
			
				|  |  | -      echo_content skyBlue "TrojanGFW+Caddy+Web+TLS节点 单机版 安装成功"
 | 
	
		
			
				|  |  | -      echo_content yellow "域名: ${domain}"
 | 
	
		
			
				|  |  | -      echo_content yellow "TrojanGFW的端口: ${trojanGFW_port}"
 | 
	
		
			
				|  |  | -      echo_content yellow "TrojanGFW的密码: ${trojan_pas}"
 | 
	
		
			
				|  |  | -      echo_content red "\n=============================================================="
 | 
	
		
			
				|  |  | -    else
 | 
	
		
			
				|  |  | -      echo_content red "---> TrojanGFW 单机版 安装失败"
 | 
	
		
			
				|  |  | -      exit 0
 | 
	
		
			
				|  |  | -    fi
 | 
	
		
			
				|  |  | -  else
 | 
	
		
			
				|  |  | -    echo_content skyBlue "---> 你已经安装了TrojanGFW 单机版"
 | 
	
		
			
				|  |  | -  fi
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -# 安装TrojanGO 数据库版
 | 
	
		
			
				|  |  | -install_trojanGO() {
 | 
	
		
			
				|  |  | -  if [[ -z $(docker ps -q -f "name=^trojan-panel-trojanGO$") ]]; then
 | 
	
		
			
				|  |  | -    echo_content green "---> 安装TrojanGO 数据库版"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    read -r -p "请输入TrojanGO的端口(默认:443): " trojanGO_port
 | 
	
		
			
				|  |  | -    [[ -z "${trojanGO_port}" ]] && trojanGO_port=443
 | 
	
		
			
				|  |  | -    read -r -p "请输入数据库的IP地址(默认:本机数据库): " mariadb_ip
 | 
	
		
			
				|  |  | -    [[ -z "${mariadb_ip}" ]] && mariadb_ip="trojan-panel-mariadb"
 | 
	
		
			
				|  |  | -    read -r -p "请输入数据库的端口(默认:本机数据库端口): " mariadb_port
 | 
	
		
			
				|  |  | -    [[ -z "${mariadb_port}" ]] && mariadb_port=3306
 | 
	
		
			
				|  |  | -    read -r -p "请输入数据库的用户名(默认:root): " mariadb_user
 | 
	
		
			
				|  |  | -    [[ -z "${mariadb_user}" ]] && mariadb_user="root"
 | 
	
		
			
				|  |  | -    while read -r -p "请输入数据库的密码(必填): " mariadb_pas; do
 | 
	
		
			
				|  |  | -      if [[ -z "${mariadb_pas}" ]]; then
 | 
	
		
			
				|  |  | -        echo_content red "密码不能为空"
 | 
	
		
			
				|  |  | -      else
 | 
	
		
			
				|  |  | -        break
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -    done
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    while read -r -p "是否开启多路复用?(false/关闭 true/开启 默认:true/开启): " trojanGO_mux_enable; do
 | 
	
		
			
				|  |  | -      if [[ -z "${trojanGO_mux_enable}" || ${trojanGO_mux_enable} == true ]]; then
 | 
	
		
			
				|  |  | -        trojanGO_mux_enable=true
 | 
	
		
			
				|  |  | -        break
 | 
	
		
			
				|  |  | -      else
 | 
	
		
			
				|  |  | -        if [[ ${trojanGO_mux_enable} != false ]]; then
 | 
	
		
			
				|  |  | -          echo_content red "不可以输入除false和true之外的其他字符"
 | 
	
		
			
				|  |  | -        else
 | 
	
		
			
				|  |  | -          break
 | 
	
		
			
				|  |  | -        fi
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -    done
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    while read -r -p "是否开启Websocket?(false/关闭 true/开启 默认:false/关闭): " trojanGO_websocket_enable; do
 | 
	
		
			
				|  |  | -      if [[ -z "${trojanGO_websocket_enable}" || ${trojanGO_websocket_enable} == false ]]; then
 | 
	
		
			
				|  |  | -        trojanGO_websocket_enable=false
 | 
	
		
			
				|  |  | -        break
 | 
	
		
			
				|  |  | -      else
 | 
	
		
			
				|  |  | -        if [[ ${trojanGO_websocket_enable} != true ]]; then
 | 
	
		
			
				|  |  | -          echo_content red "不可以输入除false和true之外的其他字符"
 | 
	
		
			
				|  |  | -        else
 | 
	
		
			
				|  |  | -          read -r -p "请输入Websocket路径(默认:trojan-panel-websocket-path): " trojanGO_websocket_path
 | 
	
		
			
				|  |  | -          [[ -z "${trojanGO_websocket_path}" ]] && trojanGO_websocket_path="trojan-panel-websocket-path"
 | 
	
		
			
				|  |  | -          break
 | 
	
		
			
				|  |  | -        fi
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -    done
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    while read -r -p "是否启用Shadowsocks AEAD加密?(false/关闭 true/开启 默认:false/关闭): " trojanGO_shadowsocks_enable; do
 | 
	
		
			
				|  |  | -      if [[ -z "${trojanGO_shadowsocks_enable}" || ${trojanGO_shadowsocks_enable} == false ]]; then
 | 
	
		
			
				|  |  | -        trojanGO_shadowsocks_enable=false
 | 
	
		
			
				|  |  | -        break
 | 
	
		
			
				|  |  | -      else
 | 
	
		
			
				|  |  | -        if [[ ${trojanGO_shadowsocks_enable} != true ]]; then
 | 
	
		
			
				|  |  | -          echo_content yellow "不可以输入除false和true之外的其他字符"
 | 
	
		
			
				|  |  | -        else
 | 
	
		
			
				|  |  | -          echo_content skyBlue "Shadowsocks AEAD加密方式如下:"
 | 
	
		
			
				|  |  | -          echo_content yellow "1. AES-128-GCM(默认)"
 | 
	
		
			
				|  |  | -          echo_content yellow "2. CHACHA20-IETF-POLY1305"
 | 
	
		
			
				|  |  | -          echo_content yellow "3. AES-256-GCM"
 | 
	
		
			
				|  |  | -          read -r -p "请输入Shadowsocks AEAD加密方式(默认:1): " select_method_type
 | 
	
		
			
				|  |  | -          [[ -z "${select_method_type}" ]] && select_method_type=1
 | 
	
		
			
				|  |  | -          case ${select_method_type} in
 | 
	
		
			
				|  |  | -          1)
 | 
	
		
			
				|  |  | -            trojanGO_shadowsocks_method="AES-128-GCM"
 | 
	
		
			
				|  |  | -            ;;
 | 
	
		
			
				|  |  | -          2)
 | 
	
		
			
				|  |  | -            trojanGO_shadowsocks_method="CHACHA20-IETF-POLY1305"
 | 
	
		
			
				|  |  | -            ;;
 | 
	
		
			
				|  |  | -          3)
 | 
	
		
			
				|  |  | -            trojanGO_shadowsocks_method="AES-256-GCM"
 | 
	
		
			
				|  |  | -            ;;
 | 
	
		
			
				|  |  | -          *)
 | 
	
		
			
				|  |  | -            trojanGO_shadowsocks_method="AES-128-GCM"
 | 
	
		
			
				|  |  | -            ;;
 | 
	
		
			
				|  |  | -          esac
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          while read -r -p "请输入Shadowsocks AEAD加密密码(必填): " trojanGO_shadowsocks_password; do
 | 
	
		
			
				|  |  | -            if [[ -z "${trojanGO_shadowsocks_password}" ]]; then
 | 
	
		
			
				|  |  | -              echo_content red "密码不能为空"
 | 
	
		
			
				|  |  | -            else
 | 
	
		
			
				|  |  | -              break
 | 
	
		
			
				|  |  | -            fi
 | 
	
		
			
				|  |  | -          done
 | 
	
		
			
				|  |  | -          break
 | 
	
		
			
				|  |  | -        fi
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -    done
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    cat >${TROJANGO_CONFIG} <<EOF
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -  "run_type": "server",
 | 
	
		
			
				|  |  | -  "local_addr": "0.0.0.0",
 | 
	
		
			
				|  |  | -  "local_port": ${trojanGO_port},
 | 
	
		
			
				|  |  | -  "remote_addr": "${remote_addr}",
 | 
	
		
			
				|  |  | -  "remote_port": 80,
 | 
	
		
			
				|  |  | -  "log_level": 1,
 | 
	
		
			
				|  |  | -  "log_file": "",
 | 
	
		
			
				|  |  | -  "password": [],
 | 
	
		
			
				|  |  | -  "disable_http_check": false,
 | 
	
		
			
				|  |  | -  "udp_timeout": 60,
 | 
	
		
			
				|  |  | -  "ssl": {
 | 
	
		
			
				|  |  | -    "verify": true,
 | 
	
		
			
				|  |  | -    "verify_hostname": true,
 | 
	
		
			
				|  |  | -    "cert": "${CADDY_ACME}${domain}/${domain}.crt",
 | 
	
		
			
				|  |  | -    "key": "${CADDY_ACME}${domain}/${domain}.key",
 | 
	
		
			
				|  |  | -    "key_password": "",
 | 
	
		
			
				|  |  | -    "cipher": "",
 | 
	
		
			
				|  |  | -    "curves": "",
 | 
	
		
			
				|  |  | -    "prefer_server_cipher": false,
 | 
	
		
			
				|  |  | -    "sni": "",
 | 
	
		
			
				|  |  | -    "alpn": [
 | 
	
		
			
				|  |  | -      "http/1.1"
 | 
	
		
			
				|  |  | -    ],
 | 
	
		
			
				|  |  | -    "session_ticket": true,
 | 
	
		
			
				|  |  | -    "reuse_session": true,
 | 
	
		
			
				|  |  | -    "plain_http_response": "",
 | 
	
		
			
				|  |  | -    "fallback_addr": "",
 | 
	
		
			
				|  |  | -    "fallback_port": 80,
 | 
	
		
			
				|  |  | -    "fingerprint": ""
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  "tcp": {
 | 
	
		
			
				|  |  | -    "no_delay": true,
 | 
	
		
			
				|  |  | -    "keep_alive": true,
 | 
	
		
			
				|  |  | -    "prefer_ipv4": false
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  "mux": {
 | 
	
		
			
				|  |  | -    "enabled": ${trojanGO_mux_enable},
 | 
	
		
			
				|  |  | -    "concurrency": 8,
 | 
	
		
			
				|  |  | -    "idle_timeout": 60
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  "websocket": {
 | 
	
		
			
				|  |  | -    "enabled": ${trojanGO_websocket_enable},
 | 
	
		
			
				|  |  | -    "path": "/${trojanGO_websocket_path}",
 | 
	
		
			
				|  |  | -    "host": "${domain}"
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  "shadowsocks": {
 | 
	
		
			
				|  |  | -    "enabled": ${trojanGO_shadowsocks_enable},
 | 
	
		
			
				|  |  | -    "method": "${trojanGO_shadowsocks_method}",
 | 
	
		
			
				|  |  | -    "password": "${trojanGO_shadowsocks_password}"
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  "mysql": {
 | 
	
		
			
				|  |  | -    "enabled": true,
 | 
	
		
			
				|  |  | -    "server_addr": "${mariadb_ip}",
 | 
	
		
			
				|  |  | -    "server_port": ${mariadb_port},
 | 
	
		
			
				|  |  | -    "database": "trojan_panel_db",
 | 
	
		
			
				|  |  | -    "username": "${mariadb_user}",
 | 
	
		
			
				|  |  | -    "password": "${mariadb_pas}",
 | 
	
		
			
				|  |  | -    "check_rate": 60
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -EOF
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    docker pull p4gefau1t/trojan-go &&
 | 
	
		
			
				|  |  | -      docker run -d --name trojan-panel-trojanGO --restart=always \
 | 
	
		
			
				|  |  | -        --network=trojan-panel-network \
 | 
	
		
			
				|  |  | -        -p ${trojanGO_port}:${trojanGO_port} \
 | 
	
		
			
				|  |  | -        -v ${TROJANGO_CONFIG}:"/etc/trojan-go/config.json" \
 | 
	
		
			
				|  |  | -        -v ${CADDY_ACME}:${CADDY_ACME} \
 | 
	
		
			
				|  |  | -        p4gefau1t/trojan-go
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGO$") ]]; then
 | 
	
		
			
				|  |  | -      echo_content skyBlue "---> TrojanGO 数据库版 安装完成"
 | 
	
		
			
				|  |  | -      echo_content red "\n=============================================================="
 | 
	
		
			
				|  |  | -      echo_content skyBlue "TrojanGO+Caddy+Web+TLS+Websocket节点 数据库版 安装成功"
 | 
	
		
			
				|  |  | -      echo_content yellow "域名: ${domain}"
 | 
	
		
			
				|  |  | -      echo_content yellow "TrojanGO的端口: ${trojanGO_port}"
 | 
	
		
			
				|  |  | -      echo_content yellow "TrojanGO的密码: 用户名&密码"
 | 
	
		
			
				|  |  | -      echo_content yellow "TrojanGO私钥和证书目录: ${CADDY_ACME}${domain}/"
 | 
	
		
			
				|  |  | -      if [[ ${trojanGO_websocket_enable} == true ]]; then
 | 
	
		
			
				|  |  | -        echo_content yellow "Websocket路径: ${trojanGO_websocket_path}"
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -      if [[ ${trojanGO_shadowsocks_enable} == true ]]; then
 | 
	
		
			
				|  |  | -        echo_content yellow "Shadowsocks AEAD加密方式: ${trojanGO_shadowsocks_method}"
 | 
	
		
			
				|  |  | -        echo_content yellow "Shadowsocks AEAD加密密码: ${trojanGO_shadowsocks_password}"
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -      echo_content red "\n=============================================================="
 | 
	
		
			
				|  |  | -    else
 | 
	
		
			
				|  |  | -      echo_content red "---> TrojanGO 数据库版 安装失败"
 | 
	
		
			
				|  |  | -      exit 0
 | 
	
		
			
				|  |  | -    fi
 | 
	
		
			
				|  |  | -  else
 | 
	
		
			
				|  |  | -    echo_content skyBlue "---> 你已经安装了TrojanGO 数据库版"
 | 
	
		
			
				|  |  | -  fi
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -# 安装TrojanGO 单机版
 | 
	
		
			
				|  |  | -install_trojanGO_standalone() {
 | 
	
		
			
				|  |  | -  if [[ -z $(docker ps -q -f "name=^trojan-panel-trojanGO-standalone$") ]]; then
 | 
	
		
			
				|  |  | -    echo_content green "---> 安装TrojanGO 单机版"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    read -r -p "请输入TrojanGO的端口(默认:443): " trojanGO_port
 | 
	
		
			
				|  |  | -    [[ -z "${trojanGO_port}" ]] && trojanGO_port=443
 | 
	
		
			
				|  |  | -    while read -r -p "请输入TrojanGO的密码(必填): " trojan_pas; do
 | 
	
		
			
				|  |  | -      if [[ -z "${trojan_pas}" ]]; then
 | 
	
		
			
				|  |  | -        echo_content red "密码不能为空"
 | 
	
		
			
				|  |  | -      else
 | 
	
		
			
				|  |  | -        break
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -    done
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    while read -r -p "是否开启多路复用?(false/关闭 true/开启 默认:true/开启): " trojanGO_mux_enable; do
 | 
	
		
			
				|  |  | -      if [[ -z "${trojanGO_mux_enable}" || ${trojanGO_mux_enable} == true ]]; then
 | 
	
		
			
				|  |  | -        trojanGO_mux_enable=true
 | 
	
		
			
				|  |  | -        break
 | 
	
		
			
				|  |  | -      else
 | 
	
		
			
				|  |  | -        if [[ ${trojanGO_mux_enable} != false ]]; then
 | 
	
		
			
				|  |  | -          echo_content red "不可以输入除false和true之外的其他字符"
 | 
	
		
			
				|  |  | -        else
 | 
	
		
			
				|  |  | -          break
 | 
	
		
			
				|  |  | -        fi
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -    done
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    while read -r -p "是否开启Websocket?(false/关闭 true/开启 默认:false/关闭): " trojanGO_websocket_enable; do
 | 
	
		
			
				|  |  | -      if [[ -z "${trojanGO_websocket_enable}" || ${trojanGO_websocket_enable} == false ]]; then
 | 
	
		
			
				|  |  | -        trojanGO_websocket_enable=false
 | 
	
		
			
				|  |  | -        break
 | 
	
		
			
				|  |  | -      else
 | 
	
		
			
				|  |  | -        if [[ ${trojanGO_websocket_enable} != true ]]; then
 | 
	
		
			
				|  |  | -          echo_content red "不可以输入除false和true之外的其他字符"
 | 
	
		
			
				|  |  | -        else
 | 
	
		
			
				|  |  | -          read -r -p "请输入Websocket路径(默认:trojan-panel-websocket-path): " trojanGO_websocket_path
 | 
	
		
			
				|  |  | -          [[ -z "${trojanGO_websocket_path}" ]] && trojanGO_websocket_path="trojan-panel-websocket-path"
 | 
	
		
			
				|  |  | -          break
 | 
	
		
			
				|  |  | -        fi
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -    done
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    while read -r -p "是否启用Shadowsocks AEAD加密?(false/关闭 true/开启 默认:false/关闭): " trojanGO_shadowsocks_enable; do
 | 
	
		
			
				|  |  | -      if [[ -z "${trojanGO_shadowsocks_enable}" || ${trojanGO_shadowsocks_enable} == false ]]; then
 | 
	
		
			
				|  |  | -        trojanGO_shadowsocks_enable=false
 | 
	
		
			
				|  |  | -        break
 | 
	
		
			
				|  |  | -      else
 | 
	
		
			
				|  |  | -        if [[ ${trojanGO_shadowsocks_enable} != true ]]; then
 | 
	
		
			
				|  |  | -          echo_content yellow "不可以输入除false和true之外的其他字符"
 | 
	
		
			
				|  |  | -        else
 | 
	
		
			
				|  |  | -          echo_content skyBlue "Shadowsocks AEAD加密方式如下:"
 | 
	
		
			
				|  |  | -          echo_content yellow "1. AES-128-GCM(默认)"
 | 
	
		
			
				|  |  | -          echo_content yellow "2. CHACHA20-IETF-POLY1305"
 | 
	
		
			
				|  |  | -          echo_content yellow "3. AES-256-GCM"
 | 
	
		
			
				|  |  | -          read -r -p "请输入Shadowsocks AEAD加密方式(默认:1): " select_method_type
 | 
	
		
			
				|  |  | -          [[ -z "${select_method_type}" ]] && select_method_type=1
 | 
	
		
			
				|  |  | -          case ${select_method_type} in
 | 
	
		
			
				|  |  | -          1)
 | 
	
		
			
				|  |  | -            trojanGO_shadowsocks_method="AES-128-GCM"
 | 
	
		
			
				|  |  | -            ;;
 | 
	
		
			
				|  |  | -          2)
 | 
	
		
			
				|  |  | -            trojanGO_shadowsocks_method="CHACHA20-IETF-POLY1305"
 | 
	
		
			
				|  |  | -            ;;
 | 
	
		
			
				|  |  | -          3)
 | 
	
		
			
				|  |  | -            trojanGO_shadowsocks_method="AES-256-GCM"
 | 
	
		
			
				|  |  | -            ;;
 | 
	
		
			
				|  |  | -          *)
 | 
	
		
			
				|  |  | -            trojanGO_shadowsocks_method="AES-128-GCM"
 | 
	
		
			
				|  |  | -            ;;
 | 
	
		
			
				|  |  | -          esac
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -          while read -r -p "请输入Shadowsocks AEAD加密密码(必填): " trojanGO_shadowsocks_password; do
 | 
	
		
			
				|  |  | -            if [[ -z "${trojanGO_shadowsocks_password}" ]]; then
 | 
	
		
			
				|  |  | -              echo_content red "密码不能为空"
 | 
	
		
			
				|  |  | -            else
 | 
	
		
			
				|  |  | -              break
 | 
	
		
			
				|  |  | -            fi
 | 
	
		
			
				|  |  | -          done
 | 
	
		
			
				|  |  | -          break
 | 
	
		
			
				|  |  | -        fi
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -    done
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    cat >${TROJANGO_STANDALONE_CONFIG} <<EOF
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -  "run_type": "server",
 | 
	
		
			
				|  |  | -  "local_addr": "0.0.0.0",
 | 
	
		
			
				|  |  | -  "local_port": ${trojanGO_port},
 | 
	
		
			
				|  |  | -  "remote_addr": "${remote_addr}",
 | 
	
		
			
				|  |  | -  "remote_port": 80,
 | 
	
		
			
				|  |  | -  "log_level": 1,
 | 
	
		
			
				|  |  | -  "log_file": "",
 | 
	
		
			
				|  |  | -  "password": [
 | 
	
		
			
				|  |  | -      "${trojan_pas}"
 | 
	
		
			
				|  |  | -  ],
 | 
	
		
			
				|  |  | -  "disable_http_check": false,
 | 
	
		
			
				|  |  | -  "udp_timeout": 60,
 | 
	
		
			
				|  |  | -  "ssl": {
 | 
	
		
			
				|  |  | -    "verify": true,
 | 
	
		
			
				|  |  | -    "verify_hostname": true,
 | 
	
		
			
				|  |  | -    "cert": "${CADDY_ACME}${domain}/${domain}.crt",
 | 
	
		
			
				|  |  | -    "key": "${CADDY_ACME}${domain}/${domain}.key",
 | 
	
		
			
				|  |  | -    "key_password": "",
 | 
	
		
			
				|  |  | -    "cipher": "",
 | 
	
		
			
				|  |  | -    "curves": "",
 | 
	
		
			
				|  |  | -    "prefer_server_cipher": false,
 | 
	
		
			
				|  |  | -    "sni": "",
 | 
	
		
			
				|  |  | -    "alpn": [
 | 
	
		
			
				|  |  | -      "http/1.1"
 | 
	
		
			
				|  |  | -    ],
 | 
	
		
			
				|  |  | -    "session_ticket": true,
 | 
	
		
			
				|  |  | -    "reuse_session": true,
 | 
	
		
			
				|  |  | -    "plain_http_response": "",
 | 
	
		
			
				|  |  | -    "fallback_addr": "",
 | 
	
		
			
				|  |  | -    "fallback_port": 80,
 | 
	
		
			
				|  |  | -    "fingerprint": ""
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  "tcp": {
 | 
	
		
			
				|  |  | -    "no_delay": true,
 | 
	
		
			
				|  |  | -    "keep_alive": true,
 | 
	
		
			
				|  |  | -    "prefer_ipv4": false
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -    "mux": {
 | 
	
		
			
				|  |  | -    "enabled": ${trojanGO_mux_enable},
 | 
	
		
			
				|  |  | -    "concurrency": 8,
 | 
	
		
			
				|  |  | -    "idle_timeout": 60
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  "websocket": {
 | 
	
		
			
				|  |  | -    "enabled": ${trojanGO_websocket_enable},
 | 
	
		
			
				|  |  | -    "path": "/${trojanGO_websocket_path}",
 | 
	
		
			
				|  |  | -    "host": "${domain}"
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  "shadowsocks": {
 | 
	
		
			
				|  |  | -    "enabled": ${trojanGO_shadowsocks_enable},
 | 
	
		
			
				|  |  | -    "method": "${trojanGO_shadowsocks_method}",
 | 
	
		
			
				|  |  | -    "password": "${trojanGO_shadowsocks_password}"
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  "mysql": {
 | 
	
		
			
				|  |  | -    "enabled": false,
 | 
	
		
			
				|  |  | -    "server_addr": "localhost",
 | 
	
		
			
				|  |  | -    "server_port": 3306,
 | 
	
		
			
				|  |  | -    "database": "",
 | 
	
		
			
				|  |  | -    "username": "",
 | 
	
		
			
				|  |  | -    "password": "",
 | 
	
		
			
				|  |  | -    "check_rate": 60
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -EOF
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    docker pull p4gefau1t/trojan-go &&
 | 
	
		
			
				|  |  | -      docker run -d --name trojan-panel-trojanGO-standalone --restart=always \
 | 
	
		
			
				|  |  | -        --network=trojan-panel-network \
 | 
	
		
			
				|  |  | -        -p ${trojanGO_port}:${trojanGO_port} \
 | 
	
		
			
				|  |  | -        -v ${TROJANGO_STANDALONE_CONFIG}:"/etc/trojan-go/config.json" \
 | 
	
		
			
				|  |  | -        -v ${CADDY_ACME}:${CADDY_ACME} \
 | 
	
		
			
				|  |  | -        p4gefau1t/trojan-go
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGO-standalone$") ]]; then
 | 
	
		
			
				|  |  | -      echo_content skyBlue "---> TrojanGO 单机版 安装完成"
 | 
	
		
			
				|  |  | -      echo_content red "\n=============================================================="
 | 
	
		
			
				|  |  | -      echo_content skyBlue "TrojanGO+Caddy+Web+TLS+Websocket节点 单机版 安装成功"
 | 
	
		
			
				|  |  | -      echo_content yellow "域名: ${domain}"
 | 
	
		
			
				|  |  | -      echo_content yellow "TrojanGO的端口: ${trojanGO_port}"
 | 
	
		
			
				|  |  | -      echo_content yellow "TrojanGO的密码: ${trojan_pas}"
 | 
	
		
			
				|  |  | -      echo_content yellow "TrojanGO私钥和证书目录: ${CADDY_ACME}${domain}/"
 | 
	
		
			
				|  |  | -      if [[ ${trojanGO_websocket_enable} == true ]]; then
 | 
	
		
			
				|  |  | -        echo_content yellow "Websocket路径: ${trojanGO_websocket_path}"
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -      if [[ ${trojanGO_shadowsocks_enable} == true ]]; then
 | 
	
		
			
				|  |  | -        echo_content yellow "Shadowsocks AEAD加密方式: ${trojanGO_shadowsocks_method}"
 | 
	
		
			
				|  |  | -        echo_content yellow "Shadowsocks AEAD加密密码: ${trojanGO_shadowsocks_password}"
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -      echo_content red "\n=============================================================="
 | 
	
		
			
				|  |  | -    else
 | 
	
		
			
				|  |  | -      echo_content red "---> TrojanGO 单机版 安装失败"
 | 
	
		
			
				|  |  | -      exit 0
 | 
	
		
			
				|  |  | -    fi
 | 
	
		
			
				|  |  | -  else
 | 
	
		
			
				|  |  | -    echo_content skyBlue "---> 你已经了安装了TrojanGO 单机版"
 | 
	
		
			
				|  |  | -  fi
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -install_hysteria() {
 | 
	
		
			
				|  |  | -  if [[ -z $(docker ps -q -f "name=^trojan-panel-hysteria$") ]]; then
 | 
	
		
			
				|  |  | -    echo_content green "---> 安装Hysteria 数据库版"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    echo_content skyBlue "Hysteria的模式如下:"
 | 
	
		
			
				|  |  | -    echo_content yellow "1. udp(默认)"
 | 
	
		
			
				|  |  | -    echo_content yellow "2. faketcp"
 | 
	
		
			
				|  |  | -    read -r -p "请输入Hysteria的模式(默认:1): " selectProtocolType
 | 
	
		
			
				|  |  | -    [[ -z "${selectProtocolType}" ]] && selectProtocolType=1
 | 
	
		
			
				|  |  | -    case ${selectProtocolType} in
 | 
	
		
			
				|  |  | -    1)
 | 
	
		
			
				|  |  | -      hysteria_protocol="udp"
 | 
	
		
			
				|  |  | -      ;;
 | 
	
		
			
				|  |  | -    2)
 | 
	
		
			
				|  |  | -      hysteria_protocol="faketcp"
 | 
	
		
			
				|  |  | -      ;;
 | 
	
		
			
				|  |  | -    *)
 | 
	
		
			
				|  |  | -      hysteria_protocol="udp"
 | 
	
		
			
				|  |  | -      ;;
 | 
	
		
			
				|  |  | -    esac
 | 
	
		
			
				|  |  | -    read -r -p "请输入Hysteria的端口(默认:443): " hysteria_port
 | 
	
		
			
				|  |  | -    [[ -z "${hysteria_port}" ]] && hysteria_port=443
 | 
	
		
			
				|  |  | -    read -r -p "请输入单客户端最大上传速度/Mbps(默认:100): " hysteria_up_mbps
 | 
	
		
			
				|  |  | -    [[ -z "${hysteria_up_mbps}" ]] && hysteria_up_mbps=100
 | 
	
		
			
				|  |  | -    read -r -p "请输入单客户端最大下载速度/Mbps(默认:100): " hysteria_down_mbps
 | 
	
		
			
				|  |  | -    [[ -z "${hysteria_down_mbps}" ]] && hysteria_down_mbps=100
 | 
	
		
			
				|  |  | -    read -r -p "请输入Trojan Panel的域名(默认:本机): " trojan_panel_url
 | 
	
		
			
				|  |  | -    [[ -z "${trojan_panel_url}" ]] && trojan_panel_url=${domain}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    cat >${HYSTERIA_CONFIG} <<EOF
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -  "listen": ":${hysteria_port}",
 | 
	
		
			
				|  |  | -  "protocol": "${hysteria_protocol}",
 | 
	
		
			
				|  |  | -  "cert": "${CADDY_ACME}${domain}/${domain}.crt",
 | 
	
		
			
				|  |  | -  "key": "${CADDY_ACME}${domain}/${domain}.key",
 | 
	
		
			
				|  |  | -  "up_mbps": ${hysteria_up_mbps},
 | 
	
		
			
				|  |  | -  "down_mbps": ${hysteria_down_mbps},
 | 
	
		
			
				|  |  | -  "auth": {
 | 
	
		
			
				|  |  | -    "mode": "external",
 | 
	
		
			
				|  |  | -    "config": {
 | 
	
		
			
				|  |  | -      "http": "https://${trojan_panel_url}:8888/api/auth/hysteria"
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  "prometheus_listen": ":8801"
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -EOF
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    docker pull tobyxdd/hysteria &&
 | 
	
		
			
				|  |  | -      docker run -d --name trojan-panel-hysteria --restart=always \
 | 
	
		
			
				|  |  | -        --network=trojan-panel-network \
 | 
	
		
			
				|  |  | -        -p ${hysteria_port}:${hysteria_port}/udp \
 | 
	
		
			
				|  |  | -        -p 8801:8801 \
 | 
	
		
			
				|  |  | -        -v ${HYSTERIA_CONFIG}:/etc/hysteria.json \
 | 
	
		
			
				|  |  | -        -v ${CADDY_ACME}:${CADDY_ACME} \
 | 
	
		
			
				|  |  | -        tobyxdd/hysteria -c /etc/hysteria.json server
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if [[ -n $(docker ps -q -f "name=^trojan-panel-hysteria$") ]]; then
 | 
	
		
			
				|  |  | -      echo_content skyBlue "---> Hysteria 数据版 安装完成"
 | 
	
		
			
				|  |  | -      echo_content red "\n=============================================================="
 | 
	
		
			
				|  |  | -      echo_content skyBlue "Hysteria节点 数据版 安装成功"
 | 
	
		
			
				|  |  | -      echo_content yellow "域名: ${domain}"
 | 
	
		
			
				|  |  | -      echo_content yellow "Hysteria的端口: ${hysteria_port}"
 | 
	
		
			
				|  |  | -      echo_content yellow "Hysteria的密码: 用户名&密码"
 | 
	
		
			
				|  |  | -      echo_content yellow "Hysteria私钥和证书目录: ${CADDY_ACME}${domain}/"
 | 
	
		
			
				|  |  | -      echo_content red "\n=============================================================="
 | 
	
		
			
				|  |  | -    else
 | 
	
		
			
				|  |  | -      echo_content red "---> Hysteria 数据版 安装失败"
 | 
	
		
			
				|  |  | -      exit 0
 | 
	
		
			
				|  |  | -    fi
 | 
	
		
			
				|  |  | -  else
 | 
	
		
			
				|  |  | -    echo_content skyBlue "---> 你已经安装了Hysteria 数据版"
 | 
	
		
			
				|  |  | -  fi
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -install_hysteria_standalone() {
 | 
	
		
			
				|  |  | -  if [[ -z $(docker ps -q -f "name=^trojan-panel-hysteria-standalone$") ]]; then
 | 
	
		
			
				|  |  | -    echo_content green "---> 安装Hysteria 单机版"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    echo_content skyBlue "Hysteria的模式如下:"
 | 
	
		
			
				|  |  | -    echo_content yellow "1. udp(默认)"
 | 
	
		
			
				|  |  | -    echo_content yellow "2. faketcp"
 | 
	
		
			
				|  |  | -    read -r -p "请输入Hysteria的模式(默认:1): " selectProtocolType
 | 
	
		
			
				|  |  | -    [[ -z "${selectProtocolType}" ]] && selectProtocolType=1
 | 
	
		
			
				|  |  | -    case ${selectProtocolType} in
 | 
	
		
			
				|  |  | -    1)
 | 
	
		
			
				|  |  | -      hysteria_protocol="udp"
 | 
	
		
			
				|  |  | -      ;;
 | 
	
		
			
				|  |  | -    2)
 | 
	
		
			
				|  |  | -      hysteria_protocol="faketcp"
 | 
	
		
			
				|  |  | -      ;;
 | 
	
		
			
				|  |  | -    *)
 | 
	
		
			
				|  |  | -      hysteria_protocol="udp"
 | 
	
		
			
				|  |  | -      ;;
 | 
	
		
			
				|  |  | -    esac
 | 
	
		
			
				|  |  | -    read -r -p "请输入Hysteria的端口(默认:443): " hysteria_port
 | 
	
		
			
				|  |  | -    [[ -z ${hysteria_port} ]] && hysteria_port=443
 | 
	
		
			
				|  |  | -    read -r -p "请输入单客户端最大上传速度/Mbps(默认:100): " hysteria_up_mbps
 | 
	
		
			
				|  |  | -    [[ -z "${hysteria_up_mbps}" ]] && hysteria_up_mbps=100
 | 
	
		
			
				|  |  | -    read -r -p "请输入单客户端最大下载速度/Mbps(默认:100): " hysteria_down_mbps
 | 
	
		
			
				|  |  | -    [[ -z "${hysteria_down_mbps}" ]] && hysteria_down_mbps=100
 | 
	
		
			
				|  |  | -    while read -r -p "请输入Hysteria的密码(必填): " hysteria_password; do
 | 
	
		
			
				|  |  | -      if [[ -z ${hysteria_password} ]]; then
 | 
	
		
			
				|  |  | -        echo_content red "密码不能为空"
 | 
	
		
			
				|  |  | -      else
 | 
	
		
			
				|  |  | -        break
 | 
	
		
			
				|  |  | -      fi
 | 
	
		
			
				|  |  | -    done
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    cat >${HYSTERIA_STANDALONE_CONFIG} <<EOF
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -  "listen": ":${hysteria_port}",
 | 
	
		
			
				|  |  | -  "protocol": "${hysteria_protocol}",
 | 
	
		
			
				|  |  | -  "cert": "${CADDY_ACME}${domain}/${domain}.crt",
 | 
	
		
			
				|  |  | -  "key": "${CADDY_ACME}${domain}/${domain}.key",
 | 
	
		
			
				|  |  | -  "up_mbps": ${hysteria_up_mbps},
 | 
	
		
			
				|  |  | -  "down_mbps": ${hysteria_down_mbps},
 | 
	
		
			
				|  |  | -  "obfs": "${hysteria_password}"
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -EOF
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    docker pull tobyxdd/hysteria &&
 | 
	
		
			
				|  |  | -      docker run -d --name trojan-panel-hysteria-standalone --restart=always \
 | 
	
		
			
				|  |  | -        --network=trojan-panel-network \
 | 
	
		
			
				|  |  | -        -p ${hysteria_port}:${hysteria_port}/udp \
 | 
	
		
			
				|  |  | -        -v ${HYSTERIA_STANDALONE_CONFIG}:/etc/hysteria.json \
 | 
	
		
			
				|  |  | -        -v ${CADDY_ACME}:${CADDY_ACME} \
 | 
	
		
			
				|  |  | -        tobyxdd/hysteria -c /etc/hysteria.json server
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if [[ -n $(docker ps -q -f "name=^trojan-panel-hysteria-standalone$") ]]; then
 | 
	
		
			
				|  |  | -      echo_content skyBlue "---> Hysteria 单机版 安装完成"
 | 
	
		
			
				|  |  | -      echo_content red "\n=============================================================="
 | 
	
		
			
				|  |  | -      echo_content skyBlue "Hysteria节点 单机版 安装成功"
 | 
	
		
			
				|  |  | -      echo_content yellow "域名: ${domain}"
 | 
	
		
			
				|  |  | -      echo_content yellow "Hysteria的端口: ${hysteria_port}"
 | 
	
		
			
				|  |  | -      echo_content yellow "Hysteria的密码: ${hysteria_password}"
 | 
	
		
			
				|  |  | -      echo_content yellow "Hysteria私钥和证书目录: ${CADDY_ACME}${domain}/"
 | 
	
		
			
				|  |  | -      echo_content red "\n=============================================================="
 | 
	
		
			
				|  |  | -    else
 | 
	
		
			
				|  |  | -      echo_content red "---> Hysteria 单机版 安装失败"
 | 
	
		
			
				|  |  | -      exit 0
 | 
	
		
			
				|  |  | -    fi
 | 
	
		
			
				|  |  | -  else
 | 
	
		
			
				|  |  | -    echo_content skyBlue "---> 你已经安装了Hysteria 单机版"
 | 
	
		
			
				|  |  | -  fi
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  # 更新Trojan Panel
 | 
	
		
			
				|  |  |  update_trojan_panel() {
 | 
	
		
			
				|  |  |    # 判断Trojan Panel是否安装
 | 
	
	
		
			
				|  | @@ -1555,6 +804,7 @@ update_trojan_panel() {
 | 
	
		
			
				|  |  |      echo_content red "---> Trojan Panel UI更新失败"
 | 
	
		
			
				|  |  |    fi
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  # 更新Trojan Panel Core
 | 
	
		
			
				|  |  |  update_trojan_panel_core() {
 | 
	
		
			
				|  |  |    # 判断Trojan Panel Core是否安装
 | 
	
	
		
			
				|  | @@ -1719,94 +969,7 @@ uninstall_trojan_panel_core() {
 | 
	
		
			
				|  |  |    fi
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -# 卸载TrojanGFW+Caddy+Web+TLS节点 数据库版
 | 
	
		
			
				|  |  | -uninstall_trojan_gfw() {
 | 
	
		
			
				|  |  | -  if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGFW$") ]]; then
 | 
	
		
			
				|  |  | -    echo_content green "---> 卸载TrojanGFW+Caddy+Web+TLS节点 数据库版"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    docker rm -f trojan-panel-trojanGFW &&
 | 
	
		
			
				|  |  | -      docker rmi -f trojangfw/trojan &&
 | 
	
		
			
				|  |  | -      rm -f ${TROJANGFW_CONFIG}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    echo_content skyBlue "---> TrojanGFW+Caddy+Web+TLS节点 数据库版卸载完成"
 | 
	
		
			
				|  |  | -  else
 | 
	
		
			
				|  |  | -    echo_content red "---> 请先安装TrojanGFW+Caddy+Web+TLS节点 数据库版"
 | 
	
		
			
				|  |  | -  fi
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -# 卸载TrojanGFW+Caddy+Web+TLS节点 单机版
 | 
	
		
			
				|  |  | -uninstall_trojan_gfw_standalone() {
 | 
	
		
			
				|  |  | -  if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGFW-standalone$") ]]; then
 | 
	
		
			
				|  |  | -    echo_content green "---> 卸载TrojanGFW+Caddy+Web+TLS节点 单机版"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    docker rm -f trojan-panel-trojanGFW-standalone &&
 | 
	
		
			
				|  |  | -      docker rmi -f trojangfw/trojan &&
 | 
	
		
			
				|  |  | -      rm -f ${TROJANGFW_STANDALONE_CONFIG}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    echo_content skyBlue "---> TrojanGFW+Caddy+Web+TLS节点 单机版卸载完成"
 | 
	
		
			
				|  |  | -  else
 | 
	
		
			
				|  |  | -    echo_content red "---> 请先安装TrojanGFW+Caddy+Web+TLS节点 单机版"
 | 
	
		
			
				|  |  | -  fi
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -# 卸载TrojanGo+Caddy+Web+TLS+Websocket节点 数据库版
 | 
	
		
			
				|  |  | -uninstall_trojanGO() {
 | 
	
		
			
				|  |  | -  if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGO$") ]]; then
 | 
	
		
			
				|  |  | -    echo_content green "---> 卸载TrojanGo+Caddy+Web+TLS+Websocket节点 数据库版"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    docker rm -f trojan-panel-trojanGO &&
 | 
	
		
			
				|  |  | -      docker rmi -f p4gefau1t/trojan-go &&
 | 
	
		
			
				|  |  | -      rm -f ${TROJANGO_CONFIG}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    echo_content skyBlue "---> TrojanGo+Caddy+Web+TLS+Websocket节点 数据库版卸载完成"
 | 
	
		
			
				|  |  | -  else
 | 
	
		
			
				|  |  | -    echo_content red "---> 请先安装TrojanGo+Caddy+Web+TLS+Websocket节点 数据库版"
 | 
	
		
			
				|  |  | -  fi
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -# 卸载TrojanGo+Caddy+Web+TLS+Websocket节点 单机版
 | 
	
		
			
				|  |  | -uninstall_trojanGO_standalone() {
 | 
	
		
			
				|  |  | -  if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGO-standalone$") ]]; then
 | 
	
		
			
				|  |  | -    echo_content green "---> 卸载TrojanGo+Caddy+Web+TLS+Websocket节点 单机版"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    docker rm -f trojan-panel-trojanGO-standalone &&
 | 
	
		
			
				|  |  | -      docker rmi -f p4gefau1t/trojan-go &&
 | 
	
		
			
				|  |  | -      rm -f ${TROJANGO_STANDALONE_CONFIG}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    echo_content skyBlue "---> TrojanGo+Caddy+Web+TLS+Websocket节点 单机版卸载完成"
 | 
	
		
			
				|  |  | -  else
 | 
	
		
			
				|  |  | -    echo_content red "---> 请先安装TrojanGo+Caddy+Web+TLS+Websocket节点 单机版"
 | 
	
		
			
				|  |  | -  fi
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -uninstall_hysteria() {
 | 
	
		
			
				|  |  | -  if [[ -n $(docker ps -q -f "name=^trojan-panel-hysteria") ]]; then
 | 
	
		
			
				|  |  | -    echo_content green "---> 卸载Hysteria节点 数据库版"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    docker rm -f trojan-panel-hysteria &&
 | 
	
		
			
				|  |  | -      docker rmi -f tobyxdd/hysteria &&
 | 
	
		
			
				|  |  | -      rm -f ${HYSTERIA_CONFIG}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    echo_content skyBlue "---> Hysteria节点 数据库版卸载完成"
 | 
	
		
			
				|  |  | -  else
 | 
	
		
			
				|  |  | -    echo_content red "---> 请先安装Hysteria节点 数据库版"
 | 
	
		
			
				|  |  | -  fi
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -uninstall_hysteria_standalone() {
 | 
	
		
			
				|  |  | -  if [[ -n $(docker ps -q -f "name=^trojan-panel-hysteria-standalone$") ]]; then
 | 
	
		
			
				|  |  | -    echo_content green "---> 卸载Hysteria节点 单机版"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    docker rm -f trojan-panel-hysteria-standalone &&
 | 
	
		
			
				|  |  | -      docker rmi -f tobyxdd/hysteria &&
 | 
	
		
			
				|  |  | -      rm -f ${HYSTERIA_STANDALONE_CONFIG}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    echo_content skyBlue "---> Hysteria节点 单机版卸载完成"
 | 
	
		
			
				|  |  | -  else
 | 
	
		
			
				|  |  | -    echo_content red "---> 请先安装Hysteria节点 单机版"
 | 
	
		
			
				|  |  | -  fi
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +# 卸载全部Trojan Panel相关的容器
 | 
	
		
			
				|  |  |  uninstall_all() {
 | 
	
		
			
				|  |  |    echo_content green "---> 卸载全部Trojan Panel相关的容器"
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1817,6 +980,7 @@ uninstall_all() {
 | 
	
		
			
				|  |  |    echo_content skyBlue "---> 卸载全部Trojan Panel相关的容器完成"
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +# 故障检测
 | 
	
		
			
				|  |  |  failure_testing() {
 | 
	
		
			
				|  |  |    echo_content green "---> 故障检测开始"
 | 
	
		
			
				|  |  |    if [[ ! $(docker -v 2>/dev/null) ]]; then
 | 
	
	
		
			
				|  | @@ -1838,12 +1002,12 @@ failure_testing() {
 | 
	
		
			
				|  |  |      if [[ -n $(docker ps -a -q -f "name=^trojan-panel-redis$") && -z $(docker ps -q -f "name=^trojan-panel-redis$" -f "status=running") ]]; then
 | 
	
		
			
				|  |  |        echo_content red "---> Redis运行异常"
 | 
	
		
			
				|  |  |      fi
 | 
	
		
			
				|  |  | -    if [[ -n $(docker ps -a -q -f "name=^trojan-panel-ui$") && -z $(docker ps -q -f "name=^trojan-panel-ui$" -f "status=running") ]]; then
 | 
	
		
			
				|  |  | -      echo_content red "---> Trojan Panel前端运行异常"
 | 
	
		
			
				|  |  | -    fi
 | 
	
		
			
				|  |  |      if [[ -n $(docker ps -a -q -f "name=^trojan-panel$") && -z $(docker ps -q -f "name=^trojan-panel$" -f "status=running") ]]; then
 | 
	
		
			
				|  |  |        echo_content red "---> Trojan Panel后端运行异常"
 | 
	
		
			
				|  |  |      fi
 | 
	
		
			
				|  |  | +    if [[ -n $(docker ps -a -q -f "name=^trojan-panel-ui$") && -z $(docker ps -q -f "name=^trojan-panel-ui$" -f "status=running") ]]; then
 | 
	
		
			
				|  |  | +      echo_content red "---> Trojan Panel前端运行异常"
 | 
	
		
			
				|  |  | +    fi
 | 
	
		
			
				|  |  |      if [[ -n $(docker ps -a -q -f "name=^trojan-panel-core$") && -z $(docker ps -q -f "name=^trojan-panel-core$" -f "status=running") ]]; then
 | 
	
		
			
				|  |  |        echo_content red "---> Trojan Panel Core运行异常"
 | 
	
		
			
				|  |  |      fi
 |