#!/usr/bin/env bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH init_var() { ECHO_TYPE="echo -e" package_manager="" release="" get_arch="" can_google=0 # Docker DOCKER_MIRROR='"https://registry.docker-cn.com","https://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"' # Project directory TP_DATA="/tpdata/" STATIC_HTML="https://github.com/trojanpanel/install-script/releases/download/v1.0/html.tar.gz" # Web WEB_PATH="/tpdata/web/" # Cert CERT_PATH="/tpdata/cert/" DOMAIN_FILE="/tpdata/domain.lock" domain="" # Caddy2 CADDY_DATA="/tpdata/caddy/" CADDY_CONFIG="${CADDY_DATA}config.json" CADDY_LOG="${CADDY_DATA}logs/" CADDY_CERT_DIR="${CERT_PATH}certificates/acme-v02.api.letsencrypt.org-directory/" caddy_port=80 caddy_remote_port=8863 your_email="" ssl_module_type=1 ssl_module="acme" # TrojanGO TROJANGO_DATA="/tpdata/trojanGO/" TROJANGO_STANDALONE_CONFIG="/tpdata/trojanGO/standalone_config.json" trojanGO_port=443 trojanGO_websocket_enable=0 trojanGO_websocket_path="trojan-panel-websocket-path" trojanGO_shadowsocks_enable=0 trojanGO_shadowsocks_method="AES-128-GCM" trojanGO_shadowsocks_password="" trojanGO_mux_enable=1 # trojan trojan_pas="" remote_addr="127.0.0.1" # Hysteria HYSTERIA_DATA="/tpdata/hysteria/" HYSTERIA_STANDALONE_CONFIG="/tpdata/hysteria/standalone_config.json" hysteria_port=443 hysteria_password="" hysteria_protocol="udp" hysteria_up_mbps=100 hysteria_down_mbps=100 # NaiveProxy NAIVEPROXY_DATA="/tpdata/naiveproxy/" NAIVEPROXY_STANDALONE_CONFIG="/tpdata/naiveproxy/standalone_config.json" naiveproxy_port=443 naiveproxy_username="" naiveproxy_pass="" } echo_content() { case $1 in "red") ${ECHO_TYPE} "\033[31m$2\033[0m" ;; "green") ${ECHO_TYPE} "\033[32m$2\033[0m" ;; "yellow") ${ECHO_TYPE} "\033[33m$2\033[0m" ;; "blue") ${ECHO_TYPE} "\033[34m$2\033[0m" ;; "purple") ${ECHO_TYPE} "\033[35m$2\033[0m" ;; "skyBlue") ${ECHO_TYPE} "\033[36m$2\033[0m" ;; "white") ${ECHO_TYPE} "\033[37m$2\033[0m" ;; esac } mkdir_tools() { # Project directory mkdir -p ${TP_DATA} # Web mkdir -p ${WEB_PATH} # Cert mkdir -p ${CERT_PATH} touch ${DOMAIN_FILE} # Caddy2 mkdir -p ${CADDY_DATA} touch ${CADDY_CONFIG} mkdir -p ${CADDY_LOG} # TrojanGO mkdir -p ${TROJANGO_DATA} touch ${TROJANGO_STANDALONE_CONFIG} # Hysteria mkdir -p ${HYSTERIA_DATA} touch ${HYSTERIA_STANDALONE_CONFIG} # NaiveProxy mkdir -p ${NAIVEPROXY_DATA} touch ${NAIVEPROXY_STANDALONE_CONFIG} } can_connect() { ping -c2 -i0.3 -W1 "$1" &>/dev/null if [[ "$?" == "0" ]]; then return 0 else return 1 fi } check_sys() { if [[ $(command -v yum) ]]; then package_manager='yum' elif [[ $(command -v dnf) ]]; then package_manager='dnf' elif [[ $(command -v apt) ]]; then package_manager='apt' elif [[ $(command -v apt-get) ]]; then package_manager='apt-get' fi if [[ -z "${package_manager}" ]]; then echo_content red "The system is not currently supported" exit 0 fi if [[ -n $(find /etc -name "redhat-release") ]] || grep /dev/null) ]]; then echo_content green "---> Install Docker" # turn off firewall if [[ "$(firewall-cmd --state 2>/dev/null)" == "running" ]]; then if [[ "${release}" == "centos" ]]; then systemctl disable firewalld elif [[ "${release}" == "debian" || "${release}" == "ubuntu" ]]; then sudo ufw disable fi fi # set time zone timedatectl set-timezone Asia/Shanghai if [[ ${can_google} == 0 ]]; then sh <(curl -sL https://get.docker.com) --mirror Aliyun mkdir -p /etc/docker && cat >/etc/docker/daemon.json </etc/docker/daemon.json </dev/null) ]]; then echo_content skyBlue "---> Docker installation completed" else echo_content red "---> Docker installation failed" exit 0 fi else echo_content skyBlue "---> You have installed Docker" fi } # Caddy2 https automatic application and renewal certificate configuration file caddy2_https_auto_config() { cat >${CADDY_CONFIG} < Install Caddy2+https" wget --no-check-certificate -O ${WEB_PATH}html.tar.gz -N ${STATIC_HTML} && tar -zxvf ${WEB_PATH}html.tar.gz -k -C ${WEB_PATH} read -r -p "Please enter the port of Caddy2 (default: 80): " caddy_port [[ -z "${caddy_port}" ]] && caddy_port=80 read -r -p "Please enter the forwarding port of Caddy2 (default: 8863): " caddy_remote_port [[ -z "${caddy_remote_port}" ]] && caddy_remote_port=8863 echo_content yellow "Tip: Please confirm that the domain name has been resolved to this machine, otherwise the installation may fail" while read -r -p "Please enter your domain name (required): " domain; do if [[ -z "${domain}" ]]; then echo_content red "Domain name cannot be empty" else break fi done read -r -p "Please enter your email (optional): " your_email while read -r -p "Please choose the way to apply for the certificate (1/acme 2/zerossl default: 1: " ssl_module_type; do if [[ -z "${ssl_module_type}" || ${ssl_module_type} == 1 ]]; then ssl_module="acme" CADDY_CERT_DIR="${CERT_PATH}certificates/acme-v02.api.letsencrypt.org-directory/" break elif [[ ${ssl_module_type} == 2 ]]; then ssl_module="zerossl" CADDY_CERT_DIR="${CERT_PATH}certificates/acme.zerossl.com-v2-dv90/" break else echo_content red "Cannot enter other characters except 1 and 2" fi done caddy2_https_auto_config # Caddy2 temporary listening port for automatic certificate application if [[ -n $(lsof -i:${caddy_port},${caddy_remote_port} -t) ]]; then kill -9 "$(lsof -i:${caddy_port},${caddy_remote_port} -t)" fi docker pull caddy:2.6.2 && docker run -d --name trojan-panel-caddy --restart always \ --network=host \ -v "${CADDY_CONFIG}":"${CADDY_CONFIG}" \ -v ${CERT_PATH}:"${CADDY_CERT_DIR}${domain}/" \ -v ${WEB_PATH}:${WEB_PATH} \ -v ${CADDY_LOG}:${CADDY_LOG} \ caddy:2.6.2 caddy run --config ${CADDY_CONFIG} if [[ -n $(docker ps -q -f "name=^trojan-panel-caddy$" -f "status=running") ]]; then cat >${DOMAIN_FILE} < Caddy2+https installation completed" echo_content yellow "Certificate Directory: ${CERT_PATH}" echo_content red "\n==============================================================" else echo_content red "---> Caddy2+https installation fails or runs abnormally, please try to repair or uninstall and reinstall" exit 0 fi else echo_content skyBlue "---> You have installed Caddy2+https" fi } # Install TrojanGO+Caddy2+Web+TLS+Websocket install_trojanGO_standalone() { if [[ -z $(docker ps -a -q -f "name=^trojan-panel-trojanGO-standalone$") ]]; then echo_content green "---> Install TrojanGO+Caddy2+Web+TLS+Websocket" read -r -p "Please enter the port of TrojanGO (default: 443): " trojanGO_port [[ -z "${trojanGO_port}" ]] && trojanGO_port=443 while read -r -p "Please enter TrojanGO password (required): " trojan_pas; do if [[ -z "${trojan_pas}" ]]; then echo_content red "Password can not be empty" else break fi done while read -r -p "Is multiplexing enabled? (0/disabled 1/enabled default: 1): " trojanGO_mux_enable; do if [[ -z "${trojanGO_mux_enable}" || ${trojanGO_mux_enable} == 1 ]]; then trojanGO_mux_enable=1 break elif [[ ${trojanGO_mux_enable} == 0 ]]; then trojanGO_mux_enable=0 break else echo_content red "Cannot enter other characters except 0 and 1" fi done while read -r -p "Is Websocket enabled? (0/disabled 1/enabled default: 0): " trojanGO_websocket_enable; do if [[ -z "${trojanGO_websocket_enable}" || ${trojanGO_websocket_enable} == 0 ]]; then trojanGO_websocket_enable=0 break elif [[ ${trojanGO_websocket_enable} == 1 ]]; then trojanGO_websocket_enable=1 read -r -p "Please enter the Websocket path (default: trojan-panel-websocket-path): " trojanGO_websocket_path [[ -z "${trojanGO_websocket_path}" ]] && trojanGO_websocket_path="trojan-panel-websocket-path" break else echo_content red "Cannot enter other characters except 0 and 1" fi done while read -r -p "Do you want to enable Shadowsocks AEAD encryption? (0/disabled 1/enabled default: 0): " trojanGO_shadowsocks_enable; do if [[ -z "${trojanGO_shadowsocks_enable}" || ${trojanGO_shadowsocks_enable} == 0 ]]; then trojanGO_shadowsocks_enable=0 break elif [[ ${trojanGO_shadowsocks_enable} == 1 ]]; then echo_content skyBlue "Shadowsocks AEAD encryption method is as follows:" echo_content yellow "1. AES-128-GCM(default)" echo_content yellow "2. CHACHA20-IETF-POLY1305" echo_content yellow "3. AES-256-GCM" read -r -p "Please enter the Shadowsocks AEAD encryption method (default: 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 "Please enter the Shadowsocks AEAD encryption password (required): " trojanGO_shadowsocks_password; do if [[ -z "${trojanGO_shadowsocks_password}" ]]; then echo_content red "Password can not be empty" else break fi done break else echo_content yellow "Cannot enter other characters except 0 and 1" fi done cat >${TROJANGO_STANDALONE_CONFIG} < TrojanGO+Caddy+Web+TLS+Websocket installation completed" echo_content red "\n==============================================================" echo_content skyBlue "TrojanGO+Caddy+Web+TLS+Websocket installed successfully" echo_content yellow "domain: ${domain}" echo_content yellow "Port of TrojanGO: ${trojanGO_port}" echo_content yellow "Password for TrojanGO: ${trojan_pas}" echo_content yellow "Certificate Directory: ${CERT_PATH}" if [[ ${trojanGO_websocket_enable} == 1 ]]; then echo_content yellow "Websocket Path: ${trojanGO_websocket_path}" fi if [[ ${trojanGO_shadowsocks_enable} == 1 ]]; then echo_content yellow "Shadowsocks AEAD encryption method: ${trojanGO_shadowsocks_method}" echo_content yellow "Shadowsocks AEAD encryption password: ${trojanGO_shadowsocks_password}" fi echo_content red "\n==============================================================" else echo_content red "---> TrojanGO+Caddy+Web+TLS+Websocket fails to install or runs abnormally, please try to repair or uninstall and reinstall" exit 0 fi else echo_content skyBlue "---> You have installed TrojanGO+Caddy+Web+TLS+Websocket" fi } # Install Hysteria install_hysteria_standalone() { if [[ -z $(docker ps -a -q -f "name=^trojan-panel-hysteria-standalone$") ]]; then echo_content green "---> Install Hysteria" echo_content skyBlue "Hysteria's schema is as follows:" echo_content yellow "1. udp(default)" echo_content yellow "2. faketcp" read -r -p "Please enter the mode of Hysteria (default: 1): " selectProtocolType [[ -z "${selectProtocolType}" ]] && selectProtocolType=1 case ${selectProtocolType} in 1) hysteria_protocol="udp" ;; 2) hysteria_protocol="faketcp" ;; *) hysteria_protocol="udp" ;; esac read -r -p "Please enter the port of Hysteria (default: 443): " hysteria_port [[ -z ${hysteria_port} ]] && hysteria_port=443 read -r -p "Please enter the maximum upload speed of a single client/Mbps (default: 100): " hysteria_up_mbps [[ -z "${hysteria_up_mbps}" ]] && hysteria_up_mbps=100 read -r -p "Please enter the maximum download speed of a single client/Mbps (default: 100): " hysteria_down_mbps [[ -z "${hysteria_down_mbps}" ]] && hysteria_down_mbps=100 while read -r -p "Please enter the password of Hysteria (required): " hysteria_password; do if [[ -z ${hysteria_password} ]]; then echo_content red "Password can not be empty" else break fi done cat >${HYSTERIA_STANDALONE_CONFIG} < Hysteria installation completed" echo_content red "\n==============================================================" echo_content skyBlue "Hysteria installed successfully" echo_content yellow "domain: ${domain}" echo_content yellow "Port of Hysteria: ${hysteria_port}" echo_content yellow "Password for Hysteria: ${hysteria_password}" echo_content yellow "Certificate Directory: ${CERT_PATH}" echo_content red "\n==============================================================" else echo_content red "---> Hysteria installation fails or runs abnormally, please try to repair or uninstall and reinstall" exit 0 fi else echo_content skyBlue "---> You have installed Hysteria" fi } # Install NaiveProxy (Caddy+ForwardProxy) install_navieproxy_standalone() { if [[ -z $(docker ps -a -q -f "name=^trojan-panel-navieproxy-standalone$") ]]; then echo_content green "---> Install NaiveProxy (Caddy+ForwardProxy)" read -r -p "Please enter the port of NaiveProxy (default: 443): " naiveproxy_port [[ -z "${naiveproxy_port}" ]] && naiveproxy_port=443 while read -r -p "Please enter the username of NaiveProxy (required): " naiveproxy_username; do if [[ -z "${naiveproxy_username}" ]]; then echo_content red "Username can not be empty" else break fi done while read -r -p "Please enter the password of NaiveProxy (required): " naiveproxy_pass; do if [[ -z "${naiveproxy_pass}" ]]; then echo_content red "Password can not be empty" else break fi done domain=$(cat "${DOMAIN_FILE}") cat >${NAIVEPROXY_STANDALONE_CONFIG} < NaiveProxy(Caddy+ForwardProxy) installation completed" echo_content red "\n==============================================================" echo_content skyBlue "NaiveProxy(Caddy+ForwardProxy) installed successfully" echo_content yellow "domain: ${domain}" echo_content yellow "Port of NaiveProxy: ${naiveproxy_port}" echo_content yellow "Username for NaiveProxy: ${naiveproxy_username}" echo_content yellow "Password for NaiveProxy: ${naiveproxy_pass}" echo_content yellow "Certificate Directory: ${CERT_PATH}" echo_content red "\n==============================================================" else echo_content red "---> NaiveProxy(Caddy+ForwardProxy) failed to install or run abnormally, please try to repair or uninstall and reinstall" exit 0 fi else echo_content skyBlue "---> You have installed NaiveProxy(Caddy+ForwardProxy)" fi } # Uninstall Caddy2 uninstall_caddy2() { if [[ -n $(docker ps -a -q -f "name=^trojan-panel-caddy$") ]]; then echo_content green "---> Uninstall Caddy2" docker rm -f trojan-panel-caddy && rm -rf ${CADDY_DATA} echo_content skyBlue "---> Caddy2 uninstallation completed" else echo_content red "---> Please install Caddy2 first" fi } # Uninstall TrojanGO+Caddy+Web+TLS+Websocket uninstall_trojanGO_standalone() { if [[ -n $(docker ps -a -q -f "name=^trojan-panel-trojanGO-standalone$") ]]; then echo_content green "---> Uninstall 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 uninstallation completed" else echo_content red "---> Please install TrojanGO+Caddy+Web+TLS+Websocket first" fi } # Uninstall Hysteria uninstall_hysteria_standalone() { if [[ -n $(docker ps -a -q -f "name=^trojan-panel-hysteria-standalone$") ]]; then echo_content green "---> Uninstall Hysteria" docker rm -f trojan-panel-hysteria-standalone && docker rmi -f tobyxdd/hysteria && rm -f ${HYSTERIA_STANDALONE_CONFIG} echo_content skyBlue "---> Hysteria uninstallation completed" else echo_content red "---> Please install Hysteria" fi } # Uninstall NaiveProxy (Caddy+ForwardProxy) uninstall_navieproxy_standalone() { if [[ -n $(docker ps -a -q -f "name=^trojan-panel-navieproxy-standalone$") ]]; then echo_content green "---> Uninstall NaiveProxy (Caddy+ForwardProxy)" docker rm -f trojan-panel-navieproxy-standalone && docker rmi -f jonssonyan/caddy-forwardproxy && rm -f ${NAIVEPROXY_STANDALONE_CONFIG} echo_content skyBlue "---> NaiveProxy(Caddy+ForwardProxy) uninstallation completed" else echo_content red "---> Please install NaiveProxy(Caddy+ForwardProxy)" fi } # Uninstall all Trojan Panel related containers uninstall_all() { echo_content green "---> Uninstall all Trojan Panel related containers" docker rm -f $(docker ps -a -q -f "name=^trojan-panel") docker rmi -f $(docker images | grep "^jonssonyan/trojan-panel" | awk '{print $3}') rm -rf ${TP_DATA} echo_content skyBlue "---> Uninstall all Trojan Panel related containers completed" } # Fault detection failure_testing() { echo_content green "---> Start troubleshooting" if [[ ! $(docker -v 2>/dev/null) ]]; then echo_content red "---> Docker is running abnormally" else if [[ -n $(docker ps -a -q -f "name=^trojan-panel-caddy$") ]]; then if [[ -z $(docker ps -q -f "name=^trojan-panel-caddy$" -f "status=running") ]]; then echo_content red "---> Caddy2 is running abnormally and the running log is as follows:" docker logs trojan-panel-caddy fi domain=$(cat "${DOMAIN_FILE}") if [[ -n ${domain} && ! -f "${CERT_PATH}${domain}.crt" ]]; then echo_content red "---> The certificate application is abnormal, please try 1. Change the sub-domain name to re-build 2. Restart the server to re-apply for the certificate 3. Re-build and select the custom certificate option" if [[ -f ${CADDY_LOG}error.log ]]; then echo_content red "Caddy2 error log is as follows:" tail -n 20 ${CADDY_LOG}error.log | grep error fi fi fi if [[ -n $(docker ps -a -q -f "name=^trojan-panel-trojanGO-standalone$") && -z $(docker ps -q -f "name=^trojan-panel-trojanGO-standalone$" -f "status=running") ]]; then echo_content red "---> TrojanGO is running abnormally" fi if [[ -n $(docker ps -a -q -f "name=^trojan-panel-hysteria-standalone$") && -z $(docker ps -q -f "name=^trojan-panel-hysteria-standalone$" -f "status=running") ]]; then echo_content red "---> Hysteria is running abnormally" fi if [[ -n $(docker ps -a -q -f "name=^trojan-panel-navieproxy-standalone$") && -z $(docker ps -q -f "name=^trojan-panel-navieproxy-standalone$" -f "status=running") ]]; then echo_content red "---> NaiveProxy(Caddy+ForwardProxy) is running abnormally" fi fi echo_content green "---> Troubleshooting ended" } main() { cd "$HOME" || exit 0 init_var mkdir_tools check_sys depend_install clear echo_content red "\n==============================================================" echo_content skyBlue "System Required: CentOS 7+/Ubuntu 18+/Debian 10+" echo_content skyBlue "Version: v2.2.0" echo_content skyBlue "Description: One click Install Trojan Panel standalone server" echo_content skyBlue "Author: jonssonyan " echo_content skyBlue "Github: https://github.com/trojanpanel" echo_content skyBlue "Docs: https://trojanpanel.github.io" echo_content red "\n==============================================================" echo_content yellow "2. Install TrojanGO+Caddy2+Web+TLS+Websocket" echo_content yellow "3. Install Hysteria" echo_content yellow "4. Install NaiveProxy(Caddy2+ForwardProxy)" echo_content yellow "5. Install Caddy2+https" echo_content green "\n==============================================================" echo_content yellow "7. Uninstall TrojanGO+Caddy2+Web+TLS+Websocket" echo_content yellow "8. Uninstall Hysteria" echo_content yellow "9. Uninstall NaiveProxy(Caddy2+ForwardProxy)" echo_content yellow "10. Uninstall Caddy2+https" echo_content yellow "11. Uninstall all Trojan Panel related containers" echo_content green "\n==============================================================" echo_content yellow "12. Fault detection" read -r -p "Please choose: " selectInstall_type case ${selectInstall_type} in 1) install_docker install_caddy2 install_trojanGO_standalone ;; 2) install_docker install_caddy2 install_hysteria_standalone ;; 3) install_docker install_caddy2 install_navieproxy_standalone ;; 4) install_docker install_caddy2 ;; 5) uninstall_trojanGO_standalone ;; 6) uninstall_hysteria_standalone ;; 7) uninstall_navieproxy_standalone ;; 8) uninstall_caddy2 ;; 9) uninstall_all ;; 10) failure_testing ;; *) echo_content red "No such option" ;; esac } main