install_script_standalone.sh 42 KB

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