install_script_standalone.sh 42 KB

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