install_script_standalone.sh 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283
  1. #!/usr/bin/env bash
  2. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  3. export PATH
  4. # System Required: CentOS 7+/Ubuntu 18+/Debian 10+
  5. # Version: v1.3.4
  6. # Description: One click Install Trojan Panel standalone server
  7. # Author: jonssonyan <https://jonssonyan.com>
  8. # Github: https://github.com/trojanpanel/install-script
  9. init_var() {
  10. ECHO_TYPE="echo -e"
  11. package_manager=""
  12. release=""
  13. get_arch=""
  14. can_google=0
  15. # Docker
  16. DOCKER_MIRROR='"https://registry.docker-cn.com","https://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"'
  17. # 项目目录
  18. TP_DATA="/tpdata/"
  19. STATIC_HTML="https://github.com/trojanpanel/install-script/releases/download/v1.0.0/html.tar.gz"
  20. # Caddy
  21. CADDY_DATA="/tpdata/caddy/"
  22. CADDY_Config="/tpdata/caddy/config.json"
  23. CADDY_SRV="/tpdata/caddy/srv/"
  24. CADDY_CERT="/tpdata/caddy/cert/"
  25. DOMAIN_FILE="/tpdata/caddy/domain.lock"
  26. CADDY_CERT_DIR="/tpdata/caddy/cert/certificates/acme-v02.api.letsencrypt.org-directory/"
  27. domain=""
  28. caddy_remote_port=8863
  29. your_email=""
  30. ssl_option=1
  31. ssl_module_type=1
  32. ssl_module="acme"
  33. crt_path=""
  34. key_path=""
  35. # trojanGFW
  36. TROJANGFW_DATA="/tpdata/trojanGFW/"
  37. TROJANGFW_STANDALONE_CONFIG="/tpdata/trojanGFW/standalone_config.json"
  38. trojanGFW_port=443
  39. # trojanGO
  40. TROJANGO_DATA="/tpdata/trojanGO/"
  41. TROJANGO_STANDALONE_CONFIG="/tpdata/trojanGO/standalone_config.json"
  42. trojanGO_port=443
  43. trojanGO_websocket_enable=false
  44. trojanGO_websocket_path="trojan-panel-websocket-path"
  45. trojanGO_shadowsocks_enable=false
  46. trojanGO_shadowsocks_method="AES-128-GCM"
  47. trojanGO_shadowsocks_password=""
  48. trojanGO_mux_enable=true
  49. # trojan
  50. trojan_pas=""
  51. remote_addr="127.0.0.1"
  52. # hysteria
  53. HYSTERIA_DATA="/tpdata/hysteria/"
  54. HYSTERIA_STANDALONE_CONFIG="/tpdata/hysteria/standalone_config.json"
  55. hysteria_port=443
  56. hysteria_password=""
  57. hysteria_protocol="udp"
  58. hysteria_up_mbps=100
  59. hysteria_down_mbps=100
  60. # naiveproxy
  61. NAIVEPROXY_DATA="/tpdata/naiveproxy/"
  62. NAIVEPROXY_STANDALONE_CONFIG="/tpdata/naiveproxy/standalone_config.json"
  63. naiveproxy_port=443
  64. naiveproxy_username=""
  65. naiveproxy_pass=""
  66. }
  67. echo_content() {
  68. case $1 in
  69. "red")
  70. ${ECHO_TYPE} "\033[31m$2\033[0m"
  71. ;;
  72. "green")
  73. ${ECHO_TYPE} "\033[32m$2\033[0m"
  74. ;;
  75. "yellow")
  76. ${ECHO_TYPE} "\033[33m$2\033[0m"
  77. ;;
  78. "blue")
  79. ${ECHO_TYPE} "\033[34m$2\033[0m"
  80. ;;
  81. "purple")
  82. ${ECHO_TYPE} "\033[35m$2\033[0m"
  83. ;;
  84. "skyBlue")
  85. ${ECHO_TYPE} "\033[36m$2\033[0m"
  86. ;;
  87. "white")
  88. ${ECHO_TYPE} "\033[37m$2\033[0m"
  89. ;;
  90. esac
  91. }
  92. mkdir_tools() {
  93. # 项目目录
  94. mkdir -p ${TP_DATA}
  95. # Caddy
  96. mkdir -p ${CADDY_DATA}
  97. touch ${CADDY_Config}
  98. mkdir -p ${CADDY_SRV}
  99. mkdir -p ${CADDY_CERT}
  100. # trojanGFW
  101. mkdir -p ${TROJANGFW_DATA}
  102. touch ${TROJANGFW_STANDALONE_CONFIG}
  103. # trojanGO
  104. mkdir -p ${TROJANGO_DATA}
  105. touch ${TROJANGO_STANDALONE_CONFIG}
  106. # hysteria
  107. mkdir -p ${HYSTERIA_DATA}
  108. touch ${HYSTERIA_STANDALONE_CONFIG}
  109. # naiveproxy
  110. mkdir -p ${NAIVEPROXY_DATA}
  111. touch ${NAIVEPROXY_STANDALONE_CONFIG}
  112. }
  113. can_connect() {
  114. ping -c2 -i0.3 -W1 "$1" &>/dev/null
  115. if [[ "$?" == "0" ]]; then
  116. return 0
  117. else
  118. return 1
  119. fi
  120. }
  121. check_sys() {
  122. if [[ $(command -v yum) ]]; then
  123. package_manager='yum'
  124. elif [[ $(command -v dnf) ]]; then
  125. package_manager='dnf'
  126. elif [[ $(command -v apt) ]]; then
  127. package_manager='apt'
  128. elif [[ $(command -v apt-get) ]]; then
  129. package_manager='apt-get'
  130. fi
  131. if [[ -z "${package_manager}" ]]; then
  132. echo_content red "暂不支持该系统"
  133. exit 0
  134. fi
  135. if [[ -n $(find /etc -name "redhat-release") ]] || grep </proc/version -q -i "centos"; then
  136. release="centos"
  137. elif grep </etc/issue -q -i "debian" && [[ -f "/etc/issue" ]] || grep </etc/issue -q -i "debian" && [[ -f "/proc/version" ]]; then
  138. release="debian"
  139. elif grep </etc/issue -q -i "ubuntu" && [[ -f "/etc/issue" ]] || grep </etc/issue -q -i "ubuntu" && [[ -f "/proc/version" ]]; then
  140. release="ubuntu"
  141. fi
  142. if [[ -z "${release}" ]]; then
  143. echo_content red "仅支持CentOS 7+/Ubuntu 18+/Debian 10+系统"
  144. exit 0
  145. fi
  146. if [[ $(arch) =~ ("x86_64"|"amd64"|"arm64"|"aarch64"|"arm"|"s390x") ]]; then
  147. get_arch=$(arch)
  148. fi
  149. if [[ -z "${get_arch}" ]]; then
  150. echo_content red "仅支持amd64/arm64/arm/s390x处理器架构"
  151. exit 0
  152. fi
  153. }
  154. depend_install() {
  155. if [[ "${package_manager}" != 'yum' && "${package_manager}" != 'dnf' ]]; then
  156. ${package_manager} update -y
  157. fi
  158. ${package_manager} install -y \
  159. curl \
  160. wget \
  161. tar \
  162. lsof \
  163. systemd
  164. }
  165. # 安装Docker
  166. install_docker() {
  167. if [[ ! $(docker -v 2>/dev/null) ]]; then
  168. echo_content green "---> 安装Docker"
  169. # 关闭防火墙
  170. if [[ "$(firewall-cmd --state 2>/dev/null)" == "running" ]]; then
  171. systemctl stop firewalld.service && systemctl disable firewalld.service
  172. fi
  173. # 时区
  174. timedatectl set-timezone Asia/Shanghai
  175. can_connect www.google.com
  176. [[ "$?" == "0" ]] && can_google=1
  177. if [[ ${can_google} == 0 ]]; then
  178. sh <(curl -sL https://get.docker.com) --mirror Aliyun
  179. # 设置Docker国内源
  180. mkdir -p /etc/docker &&
  181. cat >/etc/docker/daemon.json <<EOF
  182. {
  183. "registry-mirrors":[${DOCKER_MIRROR}],
  184. "log-driver":"json-file",
  185. "log-opts":{
  186. "max-size":"50m",
  187. "max-file":"3"
  188. }
  189. }
  190. EOF
  191. else
  192. sh <(curl -sL https://get.docker.com)
  193. fi
  194. systemctl enable docker &&
  195. systemctl restart docker
  196. if [[ $(docker -v 2>/dev/null) ]]; then
  197. echo_content skyBlue "---> Docker安装完成"
  198. else
  199. echo_content red "---> Docker安装失败"
  200. exit 0
  201. fi
  202. else
  203. echo_content skyBlue "---> 你已经安装了Docker"
  204. fi
  205. }
  206. # 安装Caddy TLS
  207. install_caddy_tls() {
  208. if [[ -z $(docker ps -a -q -f "name=^trojan-panel-caddy$") ]]; then
  209. echo_content green "---> 安装Caddy TLS"
  210. wget --no-check-certificate -O ${CADDY_DATA}html.tar.gz ${STATIC_HTML} &&
  211. tar -zxvf ${CADDY_DATA}html.tar.gz -C ${CADDY_SRV}
  212. read -r -p "请输入Caddy的转发端口(默认:8863): " caddy_remote_port
  213. [[ -z "${caddy_remote_port}" ]] && caddy_remote_port=8863
  214. echo_content yellow "提示:请确认域名已经解析到本机 否则可能安装失败"
  215. while read -r -p "请输入你的域名(必填): " domain; do
  216. if [[ -z "${domain}" ]]; then
  217. echo_content red "域名不能为空"
  218. else
  219. break
  220. fi
  221. done
  222. read -r -p "请输入你的邮箱(可选): " your_email
  223. while read -r -p "请选择设置证书的方式?(1/自动申请和续签证书 2/手动设置证书路径 默认:1/自动申请和续签证书): " ssl_option; do
  224. if [[ -z ${ssl_option} || ${ssl_option} == 1 ]]; then
  225. while read -r -p "请选择申请证书的方式(1/acme 2/zerossl 默认:1/acme): " ssl_module_type; do
  226. if [[ -z "${ssl_module_type}" || ${ssl_module_type} == 1 ]]; then
  227. ssl_module="acme"
  228. CADDY_CERT_DIR="/tpdata/caddy/cert/certificates/acme-v02.api.letsencrypt.org-directory/"
  229. break
  230. elif [[ ${ssl_module_type} == 2 ]]; then
  231. ssl_module="zerossl"
  232. CADDY_CERT_DIR="/tpdata/caddy/cert/certificates/acme.zerossl.com-v2-dv90/"
  233. break
  234. else
  235. echo_content red "不可以输入除1和2之外的其他字符"
  236. fi
  237. done
  238. cat >${CADDY_Config} <<EOF
  239. {
  240. "admin":{
  241. "disabled":true
  242. },
  243. "logging":{
  244. "sink":{
  245. "writer":{
  246. "output":"discard"
  247. }
  248. },
  249. "logs":{
  250. "default":{
  251. "writer":{
  252. "output":"discard"
  253. }
  254. }
  255. }
  256. },
  257. "storage":{
  258. "module":"file_system",
  259. "root":"${CADDY_CERT}"
  260. },
  261. "apps":{
  262. "http":{
  263. "servers":{
  264. "srv0":{
  265. "listen":[
  266. ":80"
  267. ],
  268. "routes":[
  269. {
  270. "match":[
  271. {
  272. "host":[
  273. "${domain}"
  274. ]
  275. }
  276. ],
  277. "handle":[
  278. {
  279. "handler":"static_response",
  280. "headers":{
  281. "Location":[
  282. "https://{http.request.host}:${caddy_remote_port}{http.request.uri}"
  283. ]
  284. },
  285. "status_code":301
  286. }
  287. ]
  288. }
  289. ]
  290. },
  291. "srv1":{
  292. "listen":[
  293. ":${caddy_remote_port}"
  294. ],
  295. "routes":[
  296. {
  297. "handle":[
  298. {
  299. "handler":"subroute",
  300. "routes":[
  301. {
  302. "match":[
  303. {
  304. "host":[
  305. "${domain}"
  306. ]
  307. }
  308. ],
  309. "handle":[
  310. {
  311. "handler":"file_server",
  312. "root":"${CADDY_SRV}",
  313. "index_names":[
  314. "index.html",
  315. "index.htm"
  316. ]
  317. }
  318. ],
  319. "terminal":true
  320. }
  321. ]
  322. }
  323. ]
  324. }
  325. ],
  326. "tls_connection_policies":[
  327. {
  328. "match":{
  329. "sni":[
  330. "${domain}"
  331. ]
  332. }
  333. }
  334. ],
  335. "automatic_https":{
  336. "disable":true
  337. }
  338. }
  339. }
  340. },
  341. "tls":{
  342. "certificates":{
  343. "automate":[
  344. "${domain}"
  345. ]
  346. },
  347. "automation":{
  348. "policies":[
  349. {
  350. "issuers":[
  351. {
  352. "module":"${ssl_module}",
  353. "email":"${your_email}"
  354. }
  355. ]
  356. }
  357. ]
  358. }
  359. }
  360. }
  361. }
  362. EOF
  363. break
  364. elif [[ ${ssl_option} == 2 ]]; then
  365. while read -r -p "请输入证书的.crt文件路径(必填): " crt_path; do
  366. if [[ -z "${crt_path}" ]]; then
  367. echo_content red "路径不能为空"
  368. else
  369. if [[ ! -f "${crt_path}" ]]; then
  370. echo_content red "证书的.crt文件路径不存在"
  371. else
  372. cp "${crt_path}" "${CADDY_CERT}${domain}.crt"
  373. break
  374. fi
  375. fi
  376. done
  377. while read -r -p "请输入证书的.key文件路径(必填): " key_path; do
  378. if [[ -z "${key_path}" ]]; then
  379. echo_content red "路径不能为空"
  380. else
  381. if [[ ! -f "${key_path}" ]]; then
  382. echo_content red "证书的.key文件路径不存在"
  383. else
  384. cp "${key_path}" "${CADDY_CERT}${domain}.key"
  385. break
  386. fi
  387. fi
  388. done
  389. cat >${CADDY_Config} <<EOF
  390. {
  391. "admin":{
  392. "disabled":true
  393. },
  394. "logging":{
  395. "sink":{
  396. "writer":{
  397. "output":"discard"
  398. }
  399. },
  400. "logs":{
  401. "default":{
  402. "writer":{
  403. "output":"discard"
  404. }
  405. }
  406. }
  407. },
  408. "storage":{
  409. "module":"file_system",
  410. "root":"${CADDY_CERT}"
  411. },
  412. "apps":{
  413. "http":{
  414. "servers":{
  415. "srv0":{
  416. "listen":[
  417. ":80"
  418. ],
  419. "routes":[
  420. {
  421. "match":[
  422. {
  423. "host":[
  424. "${domain}"
  425. ]
  426. }
  427. ],
  428. "handle":[
  429. {
  430. "handler":"static_response",
  431. "headers":{
  432. "Location":[
  433. "https://{http.request.host}:${caddy_remote_port}{http.request.uri}"
  434. ]
  435. },
  436. "status_code":301
  437. }
  438. ]
  439. }
  440. ]
  441. },
  442. "srv1":{
  443. "listen":[
  444. ":${caddy_remote_port}"
  445. ],
  446. "routes":[
  447. {
  448. "handle":[
  449. {
  450. "handler":"subroute",
  451. "routes":[
  452. {
  453. "match":[
  454. {
  455. "host":[
  456. "${domain}"
  457. ]
  458. }
  459. ],
  460. "handle":[
  461. {
  462. "handler":"file_server",
  463. "root":"${CADDY_SRV}",
  464. "index_names":[
  465. "index.html",
  466. "index.htm"
  467. ]
  468. }
  469. ],
  470. "terminal":true
  471. }
  472. ]
  473. }
  474. ]
  475. }
  476. ],
  477. "tls_connection_policies":[
  478. {
  479. "match":{
  480. "sni":[
  481. "${domain}"
  482. ]
  483. }
  484. }
  485. ],
  486. "automatic_https":{
  487. "disable":true
  488. }
  489. }
  490. }
  491. },
  492. "tls":{
  493. "certificates":{
  494. "automate":[
  495. "${domain}"
  496. ],
  497. "load_files":[
  498. {
  499. "certificate":"${CADDY_CERT_DIR}${domain}/${domain}.crt",
  500. "key":"${CADDY_CERT_DIR}${domain}/${domain}.key"
  501. }
  502. ]
  503. },
  504. "automation":{
  505. "policies":[
  506. {
  507. "issuers":[
  508. {
  509. "module":"${ssl_module}",
  510. "email":"${your_email}"
  511. }
  512. ]
  513. }
  514. ]
  515. }
  516. }
  517. }
  518. }
  519. EOF
  520. break
  521. else
  522. echo_content red "不可以输入除1和2之外的其他字符"
  523. fi
  524. done
  525. if [[ -n $(lsof -i:80,443 -t) ]]; then
  526. kill -9 "$(lsof -i:80,443 -t)"
  527. fi
  528. docker pull caddy:2.6.2 &&
  529. docker run -d --name trojan-panel-caddy --restart always \
  530. --network=host \
  531. -v "${CADDY_Config}":"${CADDY_Config}" \
  532. -v ${CADDY_CERT}:"${CADDY_CERT_DIR}${domain}/" \
  533. -v ${CADDY_SRV}:${CADDY_SRV} \
  534. caddy:2.6.2 caddy run --config ${CADDY_Config}
  535. if [[ -n $(docker ps -q -f "name=^trojan-panel-caddy$" -f "status=running") ]]; then
  536. cat >${DOMAIN_FILE} <<EOF
  537. ${domain}
  538. EOF
  539. echo_content skyBlue "---> Caddy安装完成"
  540. else
  541. echo_content red "---> Caddy安装失败或运行异常,请尝试修复或卸载重装"
  542. exit 0
  543. fi
  544. else
  545. domain=$(cat "${DOMAIN_FILE}")
  546. echo_content skyBlue "---> 你已经安装了Caddy"
  547. fi
  548. }
  549. # TrojanGFW+Caddy+Web+TLS+Websocket
  550. install_trojan_gfw_standalone() {
  551. if [[ -z $(docker ps -a -q -f "name=^trojan-panel-trojanGFW-standalone$") ]]; then
  552. echo_content green "---> 安装TrojanGFW+Caddy+Web+TLS+Websocket"
  553. read -r -p "请输入TrojanGFW的端口(默认:443): " trojanGFW_port
  554. [[ -n ${trojanGFW_port} ]] && trojanGFW_port=443
  555. while read -r -p "请输入TrojanGFW的密码(必填): " trojan_pas; do
  556. if [[ -z "${trojan_pas}" ]]; then
  557. echo_content red "密码不能为空"
  558. else
  559. break
  560. fi
  561. done
  562. cat >${TROJANGFW_STANDALONE_CONFIG} <<EOF
  563. {
  564. "run_type": "server",
  565. "local_addr": "0.0.0.0",
  566. "local_port": ${trojanGFW_port},
  567. "remote_addr": "${remote_addr}",
  568. "remote_port": 80,
  569. "password": [
  570. "${trojan_pas}"
  571. ],
  572. "log_level": 1,
  573. "ssl": {
  574. "cert": "${CADDY_CERT}${domain}.crt",
  575. "key": "${CADDY_CERT}${domain}.key",
  576. "key_password": "",
  577. "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",
  578. "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
  579. "prefer_server_cipher": true,
  580. "alpn": [
  581. "http/1.1"
  582. ],
  583. "alpn_port_override": {
  584. "h2": 81
  585. },
  586. "reuse_session": true,
  587. "session_ticket": false,
  588. "session_timeout": 600,
  589. "plain_http_response": "",
  590. "curves": "",
  591. "dhparam": ""
  592. },
  593. "tcp": {
  594. "prefer_ipv4": false,
  595. "no_delay": true,
  596. "keep_alive": true,
  597. "reuse_port": false,
  598. "fast_open": false,
  599. "fast_open_qlen": 20
  600. },
  601. "mysql": {
  602. "enabled": false,
  603. "server_addr": "127.0.0.1",
  604. "server_port": 3306,
  605. "database": "",
  606. "username": "",
  607. "password": "",
  608. "key": "",
  609. "cert": "",
  610. "ca": ""
  611. }
  612. }
  613. EOF
  614. docker pull trojangfw/trojan &&
  615. docker run -d --name trojan-panel-trojanGFW-standalone --restart always \
  616. --network=host \
  617. -v ${TROJANGFW_STANDALONE_CONFIG}:"/config/config.json" \
  618. -v ${CADDY_CERT}:${CADDY_CERT} \
  619. trojangfw/trojan
  620. if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGFW-standalone$" -f "status=running") ]]; then
  621. echo_content skyBlue "---> TrojanGFW+Caddy+Web+TLS 安装完成"
  622. echo_content red "\n=============================================================="
  623. echo_content skyBlue "TrojanGFW+Caddy+Web+TLS 安装成功"
  624. echo_content yellow "域名: ${domain}"
  625. echo_content yellow "TrojanGFW的端口: ${trojanGFW_port}"
  626. echo_content yellow "TrojanGFW的密码: ${trojan_pas}"
  627. echo_content red "\n=============================================================="
  628. else
  629. echo_content red "---> TrojanGFW+Caddy+Web+TLS 安装失败或运行异常,请尝试修复或卸载重装"
  630. exit 0
  631. fi
  632. else
  633. echo_content skyBlue "---> 你已经安装了TrojanGFW+Caddy+Web+TLS"
  634. fi
  635. }
  636. # TrojanGO+Caddy+Web+TLS+Websocket
  637. install_trojanGO_standalone() {
  638. if [[ -z $(docker ps -a -q -f "name=^trojan-panel-trojanGO-standalone$") ]]; then
  639. echo_content green "---> 安装TrojanGO+Caddy+Web+TLS+Websocket"
  640. read -r -p "请输入TrojanGO的端口(默认:443): " trojanGO_port
  641. [[ -z "${trojanGO_port}" ]] && trojanGO_port=443
  642. while read -r -p "请输入TrojanGO的密码(必填): " trojan_pas; do
  643. if [[ -z "${trojan_pas}" ]]; then
  644. echo_content red "密码不能为空"
  645. else
  646. break
  647. fi
  648. done
  649. while read -r -p "是否开启多路复用?(false/关闭 true/开启 默认:true/开启): " trojanGO_mux_enable; do
  650. if [[ -z "${trojanGO_mux_enable}" || ${trojanGO_mux_enable} == true ]]; then
  651. trojanGO_mux_enable=true
  652. break
  653. else
  654. if [[ ${trojanGO_mux_enable} != false ]]; then
  655. echo_content red "不可以输入除false和true之外的其他字符"
  656. else
  657. break
  658. fi
  659. fi
  660. done
  661. while read -r -p "是否开启Websocket?(false/关闭 true/开启 默认:false/关闭): " trojanGO_websocket_enable; do
  662. if [[ -z "${trojanGO_websocket_enable}" || ${trojanGO_websocket_enable} == false ]]; then
  663. trojanGO_websocket_enable=false
  664. break
  665. else
  666. if [[ ${trojanGO_websocket_enable} != true ]]; then
  667. echo_content red "不可以输入除false和true之外的其他字符"
  668. else
  669. read -r -p "请输入Websocket路径(默认:trojan-panel-websocket-path): " trojanGO_websocket_path
  670. [[ -z "${trojanGO_websocket_path}" ]] && trojanGO_websocket_path="trojan-panel-websocket-path"
  671. break
  672. fi
  673. fi
  674. done
  675. while read -r -p "是否启用Shadowsocks AEAD加密?(false/关闭 true/开启 默认:false/关闭): " trojanGO_shadowsocks_enable; do
  676. if [[ -z "${trojanGO_shadowsocks_enable}" || ${trojanGO_shadowsocks_enable} == false ]]; then
  677. trojanGO_shadowsocks_enable=false
  678. break
  679. else
  680. if [[ ${trojanGO_shadowsocks_enable} != true ]]; then
  681. echo_content yellow "不可以输入除false和true之外的其他字符"
  682. else
  683. echo_content skyBlue "Shadowsocks AEAD加密方式如下:"
  684. echo_content yellow "1. AES-128-GCM(默认)"
  685. echo_content yellow "2. CHACHA20-IETF-POLY1305"
  686. echo_content yellow "3. AES-256-GCM"
  687. read -r -p "请输入Shadowsocks AEAD加密方式(默认:1): " select_method_type
  688. [[ -z "${select_method_type}" ]] && select_method_type=1
  689. case ${select_method_type} in
  690. 1)
  691. trojanGO_shadowsocks_method="AES-128-GCM"
  692. ;;
  693. 2)
  694. trojanGO_shadowsocks_method="CHACHA20-IETF-POLY1305"
  695. ;;
  696. 3)
  697. trojanGO_shadowsocks_method="AES-256-GCM"
  698. ;;
  699. *)
  700. trojanGO_shadowsocks_method="AES-128-GCM"
  701. ;;
  702. esac
  703. while read -r -p "请输入Shadowsocks AEAD加密密码(必填): " trojanGO_shadowsocks_password; do
  704. if [[ -z "${trojanGO_shadowsocks_password}" ]]; then
  705. echo_content red "密码不能为空"
  706. else
  707. break
  708. fi
  709. done
  710. break
  711. fi
  712. fi
  713. done
  714. cat >${TROJANGO_STANDALONE_CONFIG} <<EOF
  715. {
  716. "run_type": "server",
  717. "local_addr": "0.0.0.0",
  718. "local_port": ${trojanGO_port},
  719. "remote_addr": "${remote_addr}",
  720. "remote_port": 80,
  721. "log_level": 1,
  722. "log_file": "",
  723. "password": [
  724. "${trojan_pas}"
  725. ],
  726. "disable_http_check": false,
  727. "udp_timeout": 60,
  728. "ssl": {
  729. "verify": true,
  730. "verify_hostname": true,
  731. "cert": "${CADDY_CERT}${domain}.crt",
  732. "key": "${CADDY_CERT}${domain}.key",
  733. "key_password": "",
  734. "cipher": "",
  735. "curves": "",
  736. "prefer_server_cipher": false,
  737. "sni": "",
  738. "alpn": [
  739. "http/1.1"
  740. ],
  741. "session_ticket": true,
  742. "reuse_session": true,
  743. "plain_http_response": "",
  744. "fallback_addr": "",
  745. "fallback_port": 80,
  746. "fingerprint": ""
  747. },
  748. "tcp": {
  749. "no_delay": true,
  750. "keep_alive": true,
  751. "prefer_ipv4": false
  752. },
  753. "mux": {
  754. "enabled": ${trojanGO_mux_enable},
  755. "concurrency": 8,
  756. "idle_timeout": 60
  757. },
  758. "websocket": {
  759. "enabled": ${trojanGO_websocket_enable},
  760. "path": "/${trojanGO_websocket_path}",
  761. "host": "${domain}"
  762. },
  763. "shadowsocks": {
  764. "enabled": ${trojanGO_shadowsocks_enable},
  765. "method": "${trojanGO_shadowsocks_method}",
  766. "password": "${trojanGO_shadowsocks_password}"
  767. },
  768. "mysql": {
  769. "enabled": false,
  770. "server_addr": "localhost",
  771. "server_port": 3306,
  772. "database": "",
  773. "username": "",
  774. "password": "",
  775. "check_rate": 60
  776. }
  777. }
  778. EOF
  779. docker pull p4gefau1t/trojan-go &&
  780. docker run -d --name trojan-panel-trojanGO-standalone --restart=always \
  781. --network=host \
  782. -v ${TROJANGO_STANDALONE_CONFIG}:"/etc/trojan-go/config.json" \
  783. -v ${CADDY_CERT}:${CADDY_CERT} \
  784. p4gefau1t/trojan-go
  785. if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGO-standalone$" -f "status=running") ]]; then
  786. echo_content skyBlue "---> TrojanGO+Caddy+Web+TLS+Websocket 安装完成"
  787. echo_content red "\n=============================================================="
  788. echo_content skyBlue "TrojanGO+Caddy+Web+TLS+Websocket 安装成功"
  789. echo_content yellow "域名: ${domain}"
  790. echo_content yellow "TrojanGO的端口: ${trojanGO_port}"
  791. echo_content yellow "TrojanGO的密码: ${trojan_pas}"
  792. echo_content yellow "TrojanGO私钥和证书目录: ${CADDY_CERT}"
  793. if [[ ${trojanGO_websocket_enable} == true ]]; then
  794. echo_content yellow "Websocket路径: ${trojanGO_websocket_path}"
  795. fi
  796. if [[ ${trojanGO_shadowsocks_enable} == true ]]; then
  797. echo_content yellow "Shadowsocks AEAD加密方式: ${trojanGO_shadowsocks_method}"
  798. echo_content yellow "Shadowsocks AEAD加密密码: ${trojanGO_shadowsocks_password}"
  799. fi
  800. echo_content red "\n=============================================================="
  801. else
  802. echo_content red "---> TrojanGO+Caddy+Web+TLS+Websocket 安装失败或运行异常,请尝试修复或卸载重装"
  803. exit 0
  804. fi
  805. else
  806. echo_content skyBlue "---> 你已经了安装了TrojanGO+Caddy+Web+TLS+Websocket"
  807. fi
  808. }
  809. # 安装Hysteria
  810. install_hysteria_standalone() {
  811. if [[ -z $(docker ps -a -q -f "name=^trojan-panel-hysteria-standalone$") ]]; then
  812. echo_content green "---> 安装Hysteria"
  813. echo_content skyBlue "Hysteria的模式如下:"
  814. echo_content yellow "1. udp(默认)"
  815. echo_content yellow "2. faketcp"
  816. read -r -p "请输入Hysteria的模式(默认:1): " selectProtocolType
  817. [[ -z "${selectProtocolType}" ]] && selectProtocolType=1
  818. case ${selectProtocolType} in
  819. 1)
  820. hysteria_protocol="udp"
  821. ;;
  822. 2)
  823. hysteria_protocol="faketcp"
  824. ;;
  825. *)
  826. hysteria_protocol="udp"
  827. ;;
  828. esac
  829. read -r -p "请输入Hysteria的端口(默认:443): " hysteria_port
  830. [[ -z ${hysteria_port} ]] && hysteria_port=443
  831. read -r -p "请输入单客户端最大上传速度/Mbps(默认:100): " hysteria_up_mbps
  832. [[ -z "${hysteria_up_mbps}" ]] && hysteria_up_mbps=100
  833. read -r -p "请输入单客户端最大下载速度/Mbps(默认:100): " hysteria_down_mbps
  834. [[ -z "${hysteria_down_mbps}" ]] && hysteria_down_mbps=100
  835. while read -r -p "请输入Hysteria的密码(必填): " hysteria_password; do
  836. if [[ -z ${hysteria_password} ]]; then
  837. echo_content red "密码不能为空"
  838. else
  839. break
  840. fi
  841. done
  842. cat >${HYSTERIA_STANDALONE_CONFIG} <<EOF
  843. {
  844. "listen": ":${hysteria_port}",
  845. "protocol": "${hysteria_protocol}",
  846. "cert": "${CADDY_CERT}${domain}.crt",
  847. "key": "${CADDY_CERT}${domain}.key",
  848. "up_mbps": ${hysteria_up_mbps},
  849. "down_mbps": ${hysteria_down_mbps},
  850. "auth_str": "${hysteria_password}"
  851. }
  852. EOF
  853. docker pull tobyxdd/hysteria &&
  854. docker run -d --name trojan-panel-hysteria-standalone --restart=always \
  855. --network=host \
  856. -v ${HYSTERIA_STANDALONE_CONFIG}:/etc/hysteria.json \
  857. -v ${CADDY_CERT}:${CADDY_CERT} \
  858. tobyxdd/hysteria -c /etc/hysteria.json server
  859. if [[ -n $(docker ps -q -f "name=^trojan-panel-hysteria-standalone$" -f "status=running") ]]; then
  860. echo_content skyBlue "---> Hysteria 安装完成"
  861. echo_content red "\n=============================================================="
  862. echo_content skyBlue "Hysteria 安装成功"
  863. echo_content yellow "域名: ${domain}"
  864. echo_content yellow "Hysteria的端口: ${hysteria_port}"
  865. echo_content yellow "Hysteria的密码: ${hysteria_password}"
  866. echo_content yellow "Hysteria私钥和证书目录: ${CADDY_CERT}"
  867. echo_content red "\n=============================================================="
  868. else
  869. echo_content red "---> Hysteria 安装失败或运行异常,请尝试修复或卸载重装"
  870. exit 0
  871. fi
  872. else
  873. echo_content skyBlue "---> 你已经安装了Hysteria"
  874. fi
  875. }
  876. # 安装NaiveProxy(Caddy+ForwardProxy)
  877. install_navieproxy_standalone() {
  878. if [[ -z $(docker ps -a -q -f "name=^trojan-panel-navieproxy-standalone$") ]]; then
  879. echo_content green "---> 安装NaiveProxy(Caddy+ForwardProxy)"
  880. read -r -p "请输入NaiveProxy的端口(默认:443): " naiveproxy_port
  881. [[ -z "${naiveproxy_port}" ]] && naiveproxy_port=443
  882. while read -r -p "请输入NaiveProxy的用户名(必填): " naiveproxy_username; do
  883. if [[ -z "${naiveproxy_username}" ]]; then
  884. echo_content red "用户名不能为空"
  885. else
  886. break
  887. fi
  888. done
  889. while read -r -p "请输入NaiveProxy的密码(必填): " naiveproxy_pass; do
  890. if [[ -z "${naiveproxy_pass}" ]]; then
  891. echo_content red "密码不能为空"
  892. else
  893. break
  894. fi
  895. done
  896. domain=$(cat "${DOMAIN_FILE}")
  897. cat >${NAIVEPROXY_STANDALONE_CONFIG} <<EOF
  898. {
  899. "admin": {
  900. "disabled": true
  901. },
  902. "logging": {
  903. "sink": {
  904. "writer": {
  905. "output": "discard"
  906. }
  907. },
  908. "logs": {
  909. "default": {
  910. "writer": {
  911. "output": "discard"
  912. }
  913. }
  914. }
  915. },
  916. "apps": {
  917. "http": {
  918. "servers": {
  919. "srv0": {
  920. "listen": [
  921. ":${naiveproxy_port}"
  922. ],
  923. "routes": [
  924. {
  925. "handle": [
  926. {
  927. "handler": "subroute",
  928. "routes": [
  929. {
  930. "handle": [
  931. {
  932. "auth_pass_deprecated": "${naiveproxy_pass}",
  933. "auth_user_deprecated": "${naiveproxy_username}",
  934. "handler": "forward_proxy",
  935. "hide_ip": true,
  936. "hide_via": true,
  937. "probe_resistance": {}
  938. }
  939. ]
  940. },
  941. {
  942. "match": [
  943. {
  944. "host": [
  945. "${domain}"
  946. ]
  947. }
  948. ],
  949. "handle": [
  950. {
  951. "handler": "file_server",
  952. "root": "/caddy-forwardproxy/dist/",
  953. "index_names": [
  954. "index.html",
  955. "index.htm"
  956. ]
  957. }
  958. ],
  959. "terminal": true
  960. }
  961. ]
  962. }
  963. ]
  964. }
  965. ],
  966. "tls_connection_policies": [
  967. {
  968. "match": {
  969. "sni": [
  970. "${domain}"
  971. ]
  972. }
  973. }
  974. ],
  975. "automatic_https": {
  976. "disable": true
  977. }
  978. }
  979. }
  980. },
  981. "tls": {
  982. "certificates": {
  983. "load_files": [
  984. {
  985. "certificate": "${CADDY_CERT}${domain}.crt",
  986. "key": "${CADDY_CERT}${domain}.crt"
  987. }
  988. ]
  989. }
  990. }
  991. }
  992. }
  993. EOF
  994. docker pull jonssonyan/caddy-forwardproxy &&
  995. docker run -d --name trojan-panel-navieproxy-standalone --restart=always \
  996. --network=host \
  997. -v ${NAIVEPROXY_STANDALONE_CONFIG}:"/caddy-forwardproxy/config/config.json" \
  998. -v ${CADDY_CERT}:${CADDY_CERT} \
  999. jonssonyan/caddy-forwardproxy
  1000. if [[ -n $(docker ps -q -f "name=^trojan-panel-navieproxy-standalone$" -f "status=running") ]]; then
  1001. echo_content skyBlue "---> NaiveProxy(Caddy+ForwardProxy) 安装完成"
  1002. echo_content red "\n=============================================================="
  1003. echo_content skyBlue "NaiveProxy(Caddy+ForwardProxy) 安装成功"
  1004. echo_content yellow "域名: ${domain}"
  1005. echo_content yellow "NaiveProxy的端口: ${naiveproxy_port}"
  1006. echo_content yellow "NaiveProxy的用户名: ${naiveproxy_username}"
  1007. echo_content yellow "NaiveProxy的密码: ${naiveproxy_pass}"
  1008. echo_content yellow "NaiveProxy私钥和证书目录: ${CADDY_CERT}"
  1009. echo_content red "\n=============================================================="
  1010. else
  1011. echo_content red "---> NaiveProxy(Caddy+ForwardProxy) 安装失败或运行异常,请尝试修复或卸载重装"
  1012. exit 0
  1013. fi
  1014. else
  1015. echo_content skyBlue "---> 你已经了安装了NaiveProxy(Caddy+ForwardProxy)"
  1016. fi
  1017. }
  1018. # 卸载Caddy TLS
  1019. uninstall_caddy_tls() {
  1020. # 判断Caddy TLS是否安装
  1021. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-caddy$") ]]; then
  1022. echo_content green "---> 卸载Caddy TLS"
  1023. docker rm -f trojan-panel-caddy &&
  1024. rm -rf ${CADDY_DATA}
  1025. echo_content skyBlue "---> Caddy TLS卸载完成"
  1026. else
  1027. echo_content red "---> 请先安装Caddy TLS"
  1028. fi
  1029. }
  1030. # TrojanGFW+Caddy+Web+TLS
  1031. uninstall_trojan_gfw_standalone() {
  1032. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-trojanGFW-standalone$") ]]; then
  1033. echo_content green "---> 卸载TrojanGFW+Caddy+Web+TLS"
  1034. docker rm -f trojan-panel-trojanGFW-standalone &&
  1035. docker rmi -f trojangfw/trojan &&
  1036. rm -f ${TROJANGFW_STANDALONE_CONFIG}
  1037. echo_content skyBlue "---> TrojanGFW+Caddy+Web+TLS 卸载完成"
  1038. else
  1039. echo_content red "---> 请先安装TrojanGFW+Caddy+Web+TLS"
  1040. fi
  1041. }
  1042. # 卸载TrojanGO 单机版
  1043. uninstall_trojanGO_standalone() {
  1044. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-trojanGO-standalone$") ]]; then
  1045. echo_content green "---> 卸载TrojanGO+Caddy+Web+TLS+Websocket"
  1046. docker rm -f trojan-panel-trojanGO-standalone &&
  1047. docker rmi -f p4gefau1t/trojan-go &&
  1048. rm -f ${TROJANGO_STANDALONE_CONFIG}
  1049. echo_content skyBlue "---> TrojanGO+Caddy+Web+TLS+Websocket 卸载完成"
  1050. else
  1051. echo_content red "---> 请先安装TrojanGO+Caddy+Web+TLS+Websocket"
  1052. fi
  1053. }
  1054. # 卸载Hysteria
  1055. uninstall_hysteria_standalone() {
  1056. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-hysteria-standalone$") ]]; then
  1057. echo_content green "---> 卸载Hysteria"
  1058. docker rm -f trojan-panel-hysteria-standalone &&
  1059. docker rmi -f tobyxdd/hysteria &&
  1060. rm -f ${HYSTERIA_STANDALONE_CONFIG}
  1061. echo_content skyBlue "---> Hysteria 卸载完成"
  1062. else
  1063. echo_content red "---> 请先安装Hysteria"
  1064. fi
  1065. }
  1066. # 卸载NaiveProxy(Caddy+ForwardProxy)
  1067. uninstall_navieproxy_standalone() {
  1068. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-navieproxy-standalone$") ]]; then
  1069. echo_content green "---> 卸载NaiveProxy(Caddy+ForwardProxy)"
  1070. docker rm -f trojan-panel-navieproxy-standalone &&
  1071. docker rmi -f jonssonyan/caddy-forwardproxy &&
  1072. rm -f ${NAIVEPROXY_STANDALONE_CONFIG}
  1073. echo_content skyBlue "---> NaiveProxy(Caddy+ForwardProxy) 卸载完成"
  1074. else
  1075. echo_content red "---> 请先安装NaiveProxy(Caddy+ForwardProxy)"
  1076. fi
  1077. }
  1078. # 卸载全部Trojan Panel相关的容器
  1079. uninstall_all() {
  1080. echo_content green "---> 卸载全部Trojan Panel相关的容器"
  1081. docker rm -f $(docker ps -a -q -f "name=^trojan-panel") &&
  1082. rm -rf ${TP_DATA}
  1083. echo_content skyBlue "---> 卸载全部Trojan Panel相关的容器完成"
  1084. }
  1085. # 故障检测
  1086. failure_testing() {
  1087. echo_content green "---> 故障检测开始"
  1088. if [[ ! $(docker -v 2>/dev/null) ]]; then
  1089. echo_content red "---> Docker运行异常"
  1090. else
  1091. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-caddy$") ]]; then
  1092. if [[ -z $(docker ps -q -f "name=^trojan-panel-caddy$" -f "status=running") ]]; then
  1093. echo_content red "---> Caddy TLS运行异常"
  1094. fi
  1095. domain=$(cat "${DOMAIN_FILE}")
  1096. if [[ -z $(cat "${DOMAIN_FILE}") || ! -d "${CADDY_CERT}" || ! -f "${CADDY_CERT}${domain}.crt" ]]; then
  1097. echo_content red "---> 证书申请异常,请尝试重启服务器将重新申请证书或者重新搭建选择自定义证书选项"
  1098. fi
  1099. fi
  1100. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-trojanGFW-standalone$") && -z $(docker ps -q -f "name=^trojan-panel-trojanGFW-standalone$" -f "status=running") ]]; then
  1101. echo_content red "---> TrojanGFW运行异常"
  1102. fi
  1103. 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
  1104. echo_content red "---> TrojanGO运行异常"
  1105. fi
  1106. 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
  1107. echo_content red "---> Hysteria运行异常"
  1108. fi
  1109. 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
  1110. echo_content red "---> NaiveProxy(Caddy+ForwardProxy)运行异常"
  1111. fi
  1112. fi
  1113. echo_content green "---> 故障检测结束"
  1114. }
  1115. main() {
  1116. cd "$HOME" || exit 0
  1117. init_var
  1118. mkdir_tools
  1119. check_sys
  1120. depend_install
  1121. clear
  1122. echo_content red "\n=============================================================="
  1123. echo_content skyBlue "System Required: CentOS 7+/Ubuntu 18+/Debian 10+"
  1124. echo_content skyBlue "Version: v1.3.4"
  1125. echo_content skyBlue "Description: One click Install Trojan Panel standalone server"
  1126. echo_content skyBlue "Author: jonssonyan <https://jonssonyan.com>"
  1127. echo_content skyBlue "Github: https://github.com/trojanpanel"
  1128. echo_content skyBlue "Docs: https://trojanpanel.github.io"
  1129. echo_content red "\n=============================================================="
  1130. echo_content yellow "1. 安装TrojanGFW+Caddy+Web+TLS"
  1131. echo_content yellow "2. 安装TrojanGO+Caddy+Web+TLS+Websocket"
  1132. echo_content yellow "3. 安装Hysteria"
  1133. echo_content yellow "4. 安装NaiveProxy(Caddy+ForwardProxy)"
  1134. echo_content yellow "5. 安装Caddy TLS"
  1135. echo_content green "\n=============================================================="
  1136. echo_content yellow "6. 卸载TrojanGFW+Caddy+Web+TLS"
  1137. echo_content yellow "7. 卸载TrojanGO+Caddy+Web+TLS+Websocket"
  1138. echo_content yellow "8. 卸载Hysteria"
  1139. echo_content yellow "9. 卸载NaiveProxy(Caddy+ForwardProxy)"
  1140. echo_content yellow "10. 卸载Caddy TLS"
  1141. echo_content yellow "11. 卸载全部Trojan Panel相关的应用"
  1142. echo_content green "\n=============================================================="
  1143. echo_content yellow "12. 故障检测"
  1144. read -r -p "请选择:" selectInstall_type
  1145. case ${selectInstall_type} in
  1146. 1)
  1147. install_docker
  1148. install_caddy_tls
  1149. install_trojan_gfw_standalone
  1150. ;;
  1151. 2)
  1152. install_docker
  1153. install_caddy_tls
  1154. install_trojanGO_standalone
  1155. ;;
  1156. 3)
  1157. install_docker
  1158. install_caddy_tls
  1159. install_hysteria_standalone
  1160. ;;
  1161. 4)
  1162. install_docker
  1163. install_caddy_tls
  1164. install_navieproxy_standalone
  1165. ;;
  1166. 5)
  1167. install_docker
  1168. install_caddy_tls
  1169. ;;
  1170. 6)
  1171. uninstall_trojan_gfw_standalone
  1172. ;;
  1173. 7)
  1174. uninstall_trojanGO_standalone
  1175. ;;
  1176. 8)
  1177. uninstall_hysteria_standalone
  1178. ;;
  1179. 9)
  1180. uninstall_navieproxy_standalone
  1181. ;;
  1182. 10)
  1183. uninstall_caddy_tls
  1184. ;;
  1185. 11)
  1186. uninstall_all
  1187. ;;
  1188. 12)
  1189. failure_testing
  1190. ;;
  1191. *)
  1192. echo_content red "没有这个选项"
  1193. ;;
  1194. esac
  1195. }
  1196. main