install_script_standalone.sh 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157
  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. break
  239. elif [[ ${ssl_option} == 2 ]]; then
  240. while read -r -p "请输入证书的.crt文件路径(必填): " crt_path; do
  241. if [[ -z "${crt_path}" ]]; then
  242. echo_content red "路径不能为空"
  243. else
  244. if [[ ! -f "${crt_path}" ]]; then
  245. echo_content red "证书的.crt文件路径不存在"
  246. else
  247. cp "${crt_path}" "${CADDY_CERT}${domain}.crt"
  248. break
  249. fi
  250. fi
  251. done
  252. while read -r -p "请输入证书的.key文件路径(必填): " key_path; do
  253. if [[ -z "${key_path}" ]]; then
  254. echo_content red "路径不能为空"
  255. else
  256. if [[ ! -f "${key_path}" ]]; then
  257. echo_content red "证书的.key文件路径不存在"
  258. else
  259. cp "${key_path}" "${CADDY_CERT}${domain}.key"
  260. break
  261. fi
  262. fi
  263. done
  264. break
  265. else
  266. echo_content red "不可以输入除1和2之外的其他字符"
  267. fi
  268. done
  269. cat >${CADDY_Config} <<EOF
  270. {
  271. "admin": {
  272. "disabled": true
  273. },
  274. "logging": {
  275. "sink": {
  276. "writer": {
  277. "output": "discard"
  278. }
  279. },
  280. "logs": {
  281. "default": {
  282. "writer": {
  283. "output": "discard"
  284. }
  285. }
  286. }
  287. },
  288. "storage": {
  289. "module": "file_system",
  290. "root": "${CADDY_CERT}"
  291. },
  292. "apps": {
  293. "http": {
  294. "servers": {
  295. "srv0": {
  296. "listen": [
  297. ":80"
  298. ],
  299. "routes": [
  300. {
  301. "match": [
  302. {
  303. "host": [
  304. "${domain}"
  305. ]
  306. }
  307. ],
  308. "handle": [
  309. {
  310. "handler": "static_response",
  311. "headers": {
  312. "Location": [
  313. "https://{http.request.host}:${caddy_remote_port}{http.request.uri}"
  314. ]
  315. },
  316. "status_code": 301
  317. }
  318. ]
  319. }
  320. ]
  321. },
  322. "srv1": {
  323. "listen": [
  324. ":${caddy_remote_port}"
  325. ],
  326. "routes": [
  327. {
  328. "handle": [
  329. {
  330. "handler": "subroute",
  331. "routes": [
  332. {
  333. "match": [
  334. {
  335. "host": [
  336. "${domain}"
  337. ]
  338. }
  339. ],
  340. "handle": [
  341. {
  342. "handler": "file_server",
  343. "root": "${CADDY_SRV}",
  344. "index_names": [
  345. "index.html",
  346. "index.htm"
  347. ]
  348. }
  349. ],
  350. "terminal": true
  351. }
  352. ]
  353. }
  354. ]
  355. }
  356. ],
  357. "tls_connection_policies": [
  358. {
  359. "match": {
  360. "sni": [
  361. "${domain}"
  362. ]
  363. }
  364. }
  365. ],
  366. "automatic_https": {
  367. "disable": true
  368. }
  369. }
  370. }
  371. },
  372. "tls": {
  373. "certificates": {
  374. "automate": [
  375. "${domain}"
  376. ],
  377. "load_files": [
  378. {
  379. "certificate": "${CADDY_CERT_DIR}${domain}/${domain}.crt",
  380. "key": "${CADDY_CERT_DIR}${domain}/${domain}.key"
  381. }
  382. ]
  383. },
  384. "automation": {
  385. "policies": [
  386. {
  387. "issuers": [
  388. {
  389. "module": "${ssl_module}",
  390. "email": "${your_email}"
  391. }
  392. ]
  393. }
  394. ]
  395. }
  396. }
  397. }
  398. }
  399. EOF
  400. if [[ -n $(lsof -i:80,443 -t) ]]; then
  401. kill -9 "$(lsof -i:80,443 -t)"
  402. fi
  403. docker pull caddy:2.6.2 &&
  404. docker run -d --name trojan-panel-caddy --restart always \
  405. --network=host \
  406. -v "${CADDY_Config}":"${CADDY_Config}" \
  407. -v ${CADDY_CERT}:"${CADDY_CERT_DIR}${domain}/" \
  408. -v ${CADDY_SRV}:${CADDY_SRV} \
  409. caddy:2.6.2 caddy run --config ${CADDY_Config}
  410. if [[ -n $(docker ps -q -f "name=^trojan-panel-caddy$" -f "status=running") ]]; then
  411. cat >${DOMAIN_FILE} <<EOF
  412. ${domain}
  413. EOF
  414. echo_content skyBlue "---> Caddy安装完成"
  415. else
  416. echo_content red "---> Caddy安装失败或运行异常,请尝试修复或卸载重装"
  417. exit 0
  418. fi
  419. else
  420. domain=$(cat "${DOMAIN_FILE}")
  421. echo_content skyBlue "---> 你已经安装了Caddy"
  422. fi
  423. }
  424. # TrojanGFW+Caddy+Web+TLS+Websocket
  425. install_trojan_gfw_standalone() {
  426. if [[ -z $(docker ps -a -q -f "name=^trojan-panel-trojanGFW-standalone$") ]]; then
  427. echo_content green "---> 安装TrojanGFW+Caddy+Web+TLS+Websocket"
  428. read -r -p "请输入TrojanGFW的端口(默认:443): " trojanGFW_port
  429. [[ -n ${trojanGFW_port} ]] && trojanGFW_port=443
  430. while read -r -p "请输入TrojanGFW的密码(必填): " trojan_pas; do
  431. if [[ -z "${trojan_pas}" ]]; then
  432. echo_content red "密码不能为空"
  433. else
  434. break
  435. fi
  436. done
  437. cat >${TROJANGFW_STANDALONE_CONFIG} <<EOF
  438. {
  439. "run_type": "server",
  440. "local_addr": "0.0.0.0",
  441. "local_port": ${trojanGFW_port},
  442. "remote_addr": "${remote_addr}",
  443. "remote_port": 80,
  444. "password": [
  445. "${trojan_pas}"
  446. ],
  447. "log_level": 1,
  448. "ssl": {
  449. "cert": "${CADDY_CERT}${domain}.crt",
  450. "key": "${CADDY_CERT}${domain}.key",
  451. "key_password": "",
  452. "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",
  453. "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
  454. "prefer_server_cipher": true,
  455. "alpn": [
  456. "http/1.1"
  457. ],
  458. "alpn_port_override": {
  459. "h2": 81
  460. },
  461. "reuse_session": true,
  462. "session_ticket": false,
  463. "session_timeout": 600,
  464. "plain_http_response": "",
  465. "curves": "",
  466. "dhparam": ""
  467. },
  468. "tcp": {
  469. "prefer_ipv4": false,
  470. "no_delay": true,
  471. "keep_alive": true,
  472. "reuse_port": false,
  473. "fast_open": false,
  474. "fast_open_qlen": 20
  475. },
  476. "mysql": {
  477. "enabled": false,
  478. "server_addr": "127.0.0.1",
  479. "server_port": 3306,
  480. "database": "",
  481. "username": "",
  482. "password": "",
  483. "key": "",
  484. "cert": "",
  485. "ca": ""
  486. }
  487. }
  488. EOF
  489. docker pull trojangfw/trojan &&
  490. docker run -d --name trojan-panel-trojanGFW-standalone --restart always \
  491. --network=host \
  492. -v ${TROJANGFW_STANDALONE_CONFIG}:"/config/config.json" \
  493. -v ${CADDY_CERT}:${CADDY_CERT} \
  494. trojangfw/trojan
  495. if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGFW-standalone$" -f "status=running") ]]; then
  496. echo_content skyBlue "---> TrojanGFW+Caddy+Web+TLS 安装完成"
  497. echo_content red "\n=============================================================="
  498. echo_content skyBlue "TrojanGFW+Caddy+Web+TLS 安装成功"
  499. echo_content yellow "域名: ${domain}"
  500. echo_content yellow "TrojanGFW的端口: ${trojanGFW_port}"
  501. echo_content yellow "TrojanGFW的密码: ${trojan_pas}"
  502. echo_content red "\n=============================================================="
  503. else
  504. echo_content red "---> TrojanGFW+Caddy+Web+TLS 安装失败或运行异常,请尝试修复或卸载重装"
  505. exit 0
  506. fi
  507. else
  508. echo_content skyBlue "---> 你已经安装了TrojanGFW+Caddy+Web+TLS"
  509. fi
  510. }
  511. # TrojanGO+Caddy+Web+TLS+Websocket
  512. install_trojanGO_standalone() {
  513. if [[ -z $(docker ps -a -q -f "name=^trojan-panel-trojanGO-standalone$") ]]; then
  514. echo_content green "---> 安装TrojanGO+Caddy+Web+TLS+Websocket"
  515. read -r -p "请输入TrojanGO的端口(默认:443): " trojanGO_port
  516. [[ -z "${trojanGO_port}" ]] && trojanGO_port=443
  517. while read -r -p "请输入TrojanGO的密码(必填): " trojan_pas; do
  518. if [[ -z "${trojan_pas}" ]]; then
  519. echo_content red "密码不能为空"
  520. else
  521. break
  522. fi
  523. done
  524. while read -r -p "是否开启多路复用?(false/关闭 true/开启 默认:true/开启): " trojanGO_mux_enable; do
  525. if [[ -z "${trojanGO_mux_enable}" || ${trojanGO_mux_enable} == true ]]; then
  526. trojanGO_mux_enable=true
  527. break
  528. else
  529. if [[ ${trojanGO_mux_enable} != false ]]; then
  530. echo_content red "不可以输入除false和true之外的其他字符"
  531. else
  532. break
  533. fi
  534. fi
  535. done
  536. while read -r -p "是否开启Websocket?(false/关闭 true/开启 默认:false/关闭): " trojanGO_websocket_enable; do
  537. if [[ -z "${trojanGO_websocket_enable}" || ${trojanGO_websocket_enable} == false ]]; then
  538. trojanGO_websocket_enable=false
  539. break
  540. else
  541. if [[ ${trojanGO_websocket_enable} != true ]]; then
  542. echo_content red "不可以输入除false和true之外的其他字符"
  543. else
  544. read -r -p "请输入Websocket路径(默认:trojan-panel-websocket-path): " trojanGO_websocket_path
  545. [[ -z "${trojanGO_websocket_path}" ]] && trojanGO_websocket_path="trojan-panel-websocket-path"
  546. break
  547. fi
  548. fi
  549. done
  550. while read -r -p "是否启用Shadowsocks AEAD加密?(false/关闭 true/开启 默认:false/关闭): " trojanGO_shadowsocks_enable; do
  551. if [[ -z "${trojanGO_shadowsocks_enable}" || ${trojanGO_shadowsocks_enable} == false ]]; then
  552. trojanGO_shadowsocks_enable=false
  553. break
  554. else
  555. if [[ ${trojanGO_shadowsocks_enable} != true ]]; then
  556. echo_content yellow "不可以输入除false和true之外的其他字符"
  557. else
  558. echo_content skyBlue "Shadowsocks AEAD加密方式如下:"
  559. echo_content yellow "1. AES-128-GCM(默认)"
  560. echo_content yellow "2. CHACHA20-IETF-POLY1305"
  561. echo_content yellow "3. AES-256-GCM"
  562. read -r -p "请输入Shadowsocks AEAD加密方式(默认:1): " select_method_type
  563. [[ -z "${select_method_type}" ]] && select_method_type=1
  564. case ${select_method_type} in
  565. 1)
  566. trojanGO_shadowsocks_method="AES-128-GCM"
  567. ;;
  568. 2)
  569. trojanGO_shadowsocks_method="CHACHA20-IETF-POLY1305"
  570. ;;
  571. 3)
  572. trojanGO_shadowsocks_method="AES-256-GCM"
  573. ;;
  574. *)
  575. trojanGO_shadowsocks_method="AES-128-GCM"
  576. ;;
  577. esac
  578. while read -r -p "请输入Shadowsocks AEAD加密密码(必填): " trojanGO_shadowsocks_password; do
  579. if [[ -z "${trojanGO_shadowsocks_password}" ]]; then
  580. echo_content red "密码不能为空"
  581. else
  582. break
  583. fi
  584. done
  585. break
  586. fi
  587. fi
  588. done
  589. cat >${TROJANGO_STANDALONE_CONFIG} <<EOF
  590. {
  591. "run_type": "server",
  592. "local_addr": "0.0.0.0",
  593. "local_port": ${trojanGO_port},
  594. "remote_addr": "${remote_addr}",
  595. "remote_port": 80,
  596. "log_level": 1,
  597. "log_file": "",
  598. "password": [
  599. "${trojan_pas}"
  600. ],
  601. "disable_http_check": false,
  602. "udp_timeout": 60,
  603. "ssl": {
  604. "verify": true,
  605. "verify_hostname": true,
  606. "cert": "${CADDY_CERT}${domain}.crt",
  607. "key": "${CADDY_CERT}${domain}.key",
  608. "key_password": "",
  609. "cipher": "",
  610. "curves": "",
  611. "prefer_server_cipher": false,
  612. "sni": "",
  613. "alpn": [
  614. "http/1.1"
  615. ],
  616. "session_ticket": true,
  617. "reuse_session": true,
  618. "plain_http_response": "",
  619. "fallback_addr": "",
  620. "fallback_port": 80,
  621. "fingerprint": ""
  622. },
  623. "tcp": {
  624. "no_delay": true,
  625. "keep_alive": true,
  626. "prefer_ipv4": false
  627. },
  628. "mux": {
  629. "enabled": ${trojanGO_mux_enable},
  630. "concurrency": 8,
  631. "idle_timeout": 60
  632. },
  633. "websocket": {
  634. "enabled": ${trojanGO_websocket_enable},
  635. "path": "/${trojanGO_websocket_path}",
  636. "host": "${domain}"
  637. },
  638. "shadowsocks": {
  639. "enabled": ${trojanGO_shadowsocks_enable},
  640. "method": "${trojanGO_shadowsocks_method}",
  641. "password": "${trojanGO_shadowsocks_password}"
  642. },
  643. "mysql": {
  644. "enabled": false,
  645. "server_addr": "localhost",
  646. "server_port": 3306,
  647. "database": "",
  648. "username": "",
  649. "password": "",
  650. "check_rate": 60
  651. }
  652. }
  653. EOF
  654. docker pull p4gefau1t/trojan-go &&
  655. docker run -d --name trojan-panel-trojanGO-standalone --restart=always \
  656. --network=host \
  657. -v ${TROJANGO_STANDALONE_CONFIG}:"/etc/trojan-go/config.json" \
  658. -v ${CADDY_CERT}:${CADDY_CERT} \
  659. p4gefau1t/trojan-go
  660. if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGO-standalone$" -f "status=running") ]]; then
  661. echo_content skyBlue "---> TrojanGO+Caddy+Web+TLS+Websocket 安装完成"
  662. echo_content red "\n=============================================================="
  663. echo_content skyBlue "TrojanGO+Caddy+Web+TLS+Websocket 安装成功"
  664. echo_content yellow "域名: ${domain}"
  665. echo_content yellow "TrojanGO的端口: ${trojanGO_port}"
  666. echo_content yellow "TrojanGO的密码: ${trojan_pas}"
  667. echo_content yellow "TrojanGO私钥和证书目录: ${CADDY_CERT}"
  668. if [[ ${trojanGO_websocket_enable} == true ]]; then
  669. echo_content yellow "Websocket路径: ${trojanGO_websocket_path}"
  670. fi
  671. if [[ ${trojanGO_shadowsocks_enable} == true ]]; then
  672. echo_content yellow "Shadowsocks AEAD加密方式: ${trojanGO_shadowsocks_method}"
  673. echo_content yellow "Shadowsocks AEAD加密密码: ${trojanGO_shadowsocks_password}"
  674. fi
  675. echo_content red "\n=============================================================="
  676. else
  677. echo_content red "---> TrojanGO+Caddy+Web+TLS+Websocket 安装失败或运行异常,请尝试修复或卸载重装"
  678. exit 0
  679. fi
  680. else
  681. echo_content skyBlue "---> 你已经了安装了TrojanGO+Caddy+Web+TLS+Websocket"
  682. fi
  683. }
  684. # 安装Hysteria
  685. install_hysteria_standalone() {
  686. if [[ -z $(docker ps -a -q -f "name=^trojan-panel-hysteria-standalone$") ]]; then
  687. echo_content green "---> 安装Hysteria"
  688. echo_content skyBlue "Hysteria的模式如下:"
  689. echo_content yellow "1. udp(默认)"
  690. echo_content yellow "2. faketcp"
  691. read -r -p "请输入Hysteria的模式(默认:1): " selectProtocolType
  692. [[ -z "${selectProtocolType}" ]] && selectProtocolType=1
  693. case ${selectProtocolType} in
  694. 1)
  695. hysteria_protocol="udp"
  696. ;;
  697. 2)
  698. hysteria_protocol="faketcp"
  699. ;;
  700. *)
  701. hysteria_protocol="udp"
  702. ;;
  703. esac
  704. read -r -p "请输入Hysteria的端口(默认:443): " hysteria_port
  705. [[ -z ${hysteria_port} ]] && hysteria_port=443
  706. read -r -p "请输入单客户端最大上传速度/Mbps(默认:100): " hysteria_up_mbps
  707. [[ -z "${hysteria_up_mbps}" ]] && hysteria_up_mbps=100
  708. read -r -p "请输入单客户端最大下载速度/Mbps(默认:100): " hysteria_down_mbps
  709. [[ -z "${hysteria_down_mbps}" ]] && hysteria_down_mbps=100
  710. while read -r -p "请输入Hysteria的密码(必填): " hysteria_password; do
  711. if [[ -z ${hysteria_password} ]]; then
  712. echo_content red "密码不能为空"
  713. else
  714. break
  715. fi
  716. done
  717. cat >${HYSTERIA_STANDALONE_CONFIG} <<EOF
  718. {
  719. "listen": ":${hysteria_port}",
  720. "protocol": "${hysteria_protocol}",
  721. "cert": "${CADDY_CERT}${domain}.crt",
  722. "key": "${CADDY_CERT}${domain}.key",
  723. "up_mbps": ${hysteria_up_mbps},
  724. "down_mbps": ${hysteria_down_mbps},
  725. "auth_str": "${hysteria_password}"
  726. }
  727. EOF
  728. docker pull tobyxdd/hysteria &&
  729. docker run -d --name trojan-panel-hysteria-standalone --restart=always \
  730. --network=host \
  731. -v ${HYSTERIA_STANDALONE_CONFIG}:/etc/hysteria.json \
  732. -v ${CADDY_CERT}:${CADDY_CERT} \
  733. tobyxdd/hysteria -c /etc/hysteria.json server
  734. if [[ -n $(docker ps -q -f "name=^trojan-panel-hysteria-standalone$" -f "status=running") ]]; then
  735. echo_content skyBlue "---> Hysteria 安装完成"
  736. echo_content red "\n=============================================================="
  737. echo_content skyBlue "Hysteria 安装成功"
  738. echo_content yellow "域名: ${domain}"
  739. echo_content yellow "Hysteria的端口: ${hysteria_port}"
  740. echo_content yellow "Hysteria的密码: ${hysteria_password}"
  741. echo_content yellow "Hysteria私钥和证书目录: ${CADDY_CERT}"
  742. echo_content red "\n=============================================================="
  743. else
  744. echo_content red "---> Hysteria 安装失败或运行异常,请尝试修复或卸载重装"
  745. exit 0
  746. fi
  747. else
  748. echo_content skyBlue "---> 你已经安装了Hysteria"
  749. fi
  750. }
  751. # 安装NaiveProxy(Caddy+ForwardProxy)
  752. install_navieproxy_standalone() {
  753. if [[ -z $(docker ps -a -q -f "name=^trojan-panel-navieproxy-standalone$") ]]; then
  754. echo_content green "---> 安装NaiveProxy(Caddy+ForwardProxy)"
  755. read -r -p "请输入NaiveProxy的端口(默认:443): " naiveproxy_port
  756. [[ -z "${naiveproxy_port}" ]] && naiveproxy_port=443
  757. while read -r -p "请输入NaiveProxy的用户名(必填): " naiveproxy_username; do
  758. if [[ -z "${naiveproxy_username}" ]]; then
  759. echo_content red "用户名不能为空"
  760. else
  761. break
  762. fi
  763. done
  764. while read -r -p "请输入NaiveProxy的密码(必填): " naiveproxy_pass; do
  765. if [[ -z "${naiveproxy_pass}" ]]; then
  766. echo_content red "密码不能为空"
  767. else
  768. break
  769. fi
  770. done
  771. domain=$(cat "${DOMAIN_FILE}")
  772. cat >${NAIVEPROXY_STANDALONE_CONFIG} <<EOF
  773. {
  774. "admin": {
  775. "disabled": true
  776. },
  777. "logging": {
  778. "sink": {
  779. "writer": {
  780. "output": "discard"
  781. }
  782. },
  783. "logs": {
  784. "default": {
  785. "writer": {
  786. "output": "discard"
  787. }
  788. }
  789. }
  790. },
  791. "apps": {
  792. "http": {
  793. "servers": {
  794. "srv0": {
  795. "listen": [
  796. ":${naiveproxy_port}"
  797. ],
  798. "routes": [
  799. {
  800. "handle": [
  801. {
  802. "handler": "subroute",
  803. "routes": [
  804. {
  805. "handle": [
  806. {
  807. "auth_pass_deprecated": "${naiveproxy_pass}",
  808. "auth_user_deprecated": "${naiveproxy_username}",
  809. "handler": "forward_proxy",
  810. "hide_ip": true,
  811. "hide_via": true,
  812. "probe_resistance": {}
  813. }
  814. ]
  815. },
  816. {
  817. "match": [
  818. {
  819. "host": [
  820. "${domain}"
  821. ]
  822. }
  823. ],
  824. "handle": [
  825. {
  826. "handler": "file_server",
  827. "root": "/caddy-forwardproxy/dist/",
  828. "index_names": [
  829. "index.html",
  830. "index.htm"
  831. ]
  832. }
  833. ],
  834. "terminal": true
  835. }
  836. ]
  837. }
  838. ]
  839. }
  840. ],
  841. "tls_connection_policies": [
  842. {
  843. "match": {
  844. "sni": [
  845. "${domain}"
  846. ]
  847. }
  848. }
  849. ],
  850. "automatic_https": {
  851. "disable": true
  852. }
  853. }
  854. }
  855. },
  856. "tls": {
  857. "certificates": {
  858. "load_files": [
  859. {
  860. "certificate": "${CADDY_CERT}${domain}.crt",
  861. "key": "${CADDY_CERT}${domain}.crt"
  862. }
  863. ]
  864. }
  865. }
  866. }
  867. }
  868. EOF
  869. docker pull jonssonyan/caddy-forwardproxy &&
  870. docker run -d --name trojan-panel-navieproxy-standalone --restart=always \
  871. --network=host \
  872. -v ${NAIVEPROXY_STANDALONE_CONFIG}:"/caddy-forwardproxy/config/config.json" \
  873. -v ${CADDY_CERT}:${CADDY_CERT} \
  874. jonssonyan/caddy-forwardproxy
  875. if [[ -n $(docker ps -q -f "name=^trojan-panel-navieproxy-standalone$" -f "status=running") ]]; then
  876. echo_content skyBlue "---> NaiveProxy(Caddy+ForwardProxy) 安装完成"
  877. echo_content red "\n=============================================================="
  878. echo_content skyBlue "NaiveProxy(Caddy+ForwardProxy) 安装成功"
  879. echo_content yellow "域名: ${domain}"
  880. echo_content yellow "NaiveProxy的端口: ${naiveproxy_port}"
  881. echo_content yellow "NaiveProxy的用户名: ${naiveproxy_username}"
  882. echo_content yellow "NaiveProxy的密码: ${naiveproxy_pass}"
  883. echo_content yellow "NaiveProxy私钥和证书目录: ${CADDY_CERT}"
  884. echo_content red "\n=============================================================="
  885. else
  886. echo_content red "---> NaiveProxy(Caddy+ForwardProxy) 安装失败或运行异常,请尝试修复或卸载重装"
  887. exit 0
  888. fi
  889. else
  890. echo_content skyBlue "---> 你已经了安装了NaiveProxy(Caddy+ForwardProxy)"
  891. fi
  892. }
  893. # 卸载Caddy TLS
  894. uninstall_caddy_tls() {
  895. # 判断Caddy TLS是否安装
  896. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-caddy$") ]]; then
  897. echo_content green "---> 卸载Caddy TLS"
  898. docker rm -f trojan-panel-caddy &&
  899. rm -rf ${CADDY_DATA}
  900. echo_content skyBlue "---> Caddy TLS卸载完成"
  901. else
  902. echo_content red "---> 请先安装Caddy TLS"
  903. fi
  904. }
  905. # TrojanGFW+Caddy+Web+TLS
  906. uninstall_trojan_gfw_standalone() {
  907. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-trojanGFW-standalone$") ]]; then
  908. echo_content green "---> 卸载TrojanGFW+Caddy+Web+TLS"
  909. docker rm -f trojan-panel-trojanGFW-standalone &&
  910. docker rmi -f trojangfw/trojan &&
  911. rm -f ${TROJANGFW_STANDALONE_CONFIG}
  912. echo_content skyBlue "---> TrojanGFW+Caddy+Web+TLS 卸载完成"
  913. else
  914. echo_content red "---> 请先安装TrojanGFW+Caddy+Web+TLS"
  915. fi
  916. }
  917. # 卸载TrojanGO 单机版
  918. uninstall_trojanGO_standalone() {
  919. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-trojanGO-standalone$") ]]; then
  920. echo_content green "---> 卸载TrojanGO+Caddy+Web+TLS+Websocket"
  921. docker rm -f trojan-panel-trojanGO-standalone &&
  922. docker rmi -f p4gefau1t/trojan-go &&
  923. rm -f ${TROJANGO_STANDALONE_CONFIG}
  924. echo_content skyBlue "---> TrojanGO+Caddy+Web+TLS+Websocket 卸载完成"
  925. else
  926. echo_content red "---> 请先安装TrojanGO+Caddy+Web+TLS+Websocket"
  927. fi
  928. }
  929. # 卸载Hysteria
  930. uninstall_hysteria_standalone() {
  931. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-hysteria-standalone$") ]]; then
  932. echo_content green "---> 卸载Hysteria"
  933. docker rm -f trojan-panel-hysteria-standalone &&
  934. docker rmi -f tobyxdd/hysteria &&
  935. rm -f ${HYSTERIA_STANDALONE_CONFIG}
  936. echo_content skyBlue "---> Hysteria 卸载完成"
  937. else
  938. echo_content red "---> 请先安装Hysteria"
  939. fi
  940. }
  941. # 卸载NaiveProxy(Caddy+ForwardProxy)
  942. uninstall_navieproxy_standalone() {
  943. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-navieproxy-standalone$") ]]; then
  944. echo_content green "---> 卸载NaiveProxy(Caddy+ForwardProxy)"
  945. docker rm -f trojan-panel-navieproxy-standalone &&
  946. docker rmi -f jonssonyan/caddy-forwardproxy &&
  947. rm -f ${NAIVEPROXY_STANDALONE_CONFIG}
  948. echo_content skyBlue "---> NaiveProxy(Caddy+ForwardProxy) 卸载完成"
  949. else
  950. echo_content red "---> 请先安装NaiveProxy(Caddy+ForwardProxy)"
  951. fi
  952. }
  953. # 卸载全部Trojan Panel相关的容器
  954. uninstall_all() {
  955. echo_content green "---> 卸载全部Trojan Panel相关的容器"
  956. docker rm -f $(docker ps -a -q -f "name=^trojan-panel") &&
  957. rm -rf ${TP_DATA}
  958. echo_content skyBlue "---> 卸载全部Trojan Panel相关的容器完成"
  959. }
  960. # 故障检测
  961. failure_testing() {
  962. echo_content green "---> 故障检测开始"
  963. if [[ ! $(docker -v 2>/dev/null) ]]; then
  964. echo_content red "---> Docker运行异常"
  965. else
  966. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-caddy$") ]]; then
  967. if [[ -z $(docker ps -q -f "name=^trojan-panel-caddy$" -f "status=running") ]]; then
  968. echo_content red "---> Caddy TLS运行异常"
  969. fi
  970. domain=$(cat "${DOMAIN_FILE}")
  971. if [[ -z $(cat "${DOMAIN_FILE}") || ! -d "${CADDY_CERT}" || ! -f "${CADDY_CERT}${domain}.crt" ]]; then
  972. echo_content red "---> 证书申请异常,请尝试重启服务器将重新申请证书或者重新搭建选择自定义证书选项"
  973. fi
  974. fi
  975. 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
  976. echo_content red "---> TrojanGFW运行异常"
  977. fi
  978. 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
  979. echo_content red "---> TrojanGO运行异常"
  980. fi
  981. 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
  982. echo_content red "---> Hysteria运行异常"
  983. fi
  984. 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
  985. echo_content red "---> NaiveProxy(Caddy+ForwardProxy)运行异常"
  986. fi
  987. fi
  988. echo_content green "---> 故障检测结束"
  989. }
  990. main() {
  991. cd "$HOME" || exit 0
  992. init_var
  993. mkdir_tools
  994. check_sys
  995. depend_install
  996. clear
  997. echo_content red "\n=============================================================="
  998. echo_content skyBlue "System Required: CentOS 7+/Ubuntu 18+/Debian 10+"
  999. echo_content skyBlue "Version: v1.3.4"
  1000. echo_content skyBlue "Description: One click Install Trojan Panel standalone server"
  1001. echo_content skyBlue "Author: jonssonyan <https://jonssonyan.com>"
  1002. echo_content skyBlue "Github: https://github.com/trojanpanel"
  1003. echo_content skyBlue "Docs: https://trojanpanel.github.io"
  1004. echo_content red "\n=============================================================="
  1005. echo_content yellow "1. 安装TrojanGFW+Caddy+Web+TLS"
  1006. echo_content yellow "2. 安装TrojanGO+Caddy+Web+TLS+Websocket"
  1007. echo_content yellow "3. 安装Hysteria"
  1008. echo_content yellow "4. 安装NaiveProxy(Caddy+ForwardProxy)"
  1009. echo_content yellow "5. 安装Caddy TLS"
  1010. echo_content green "\n=============================================================="
  1011. echo_content yellow "6. 卸载TrojanGFW+Caddy+Web+TLS"
  1012. echo_content yellow "7. 卸载TrojanGO+Caddy+Web+TLS+Websocket"
  1013. echo_content yellow "8. 卸载Hysteria"
  1014. echo_content yellow "9. 卸载NaiveProxy(Caddy+ForwardProxy)"
  1015. echo_content yellow "10. 卸载Caddy TLS"
  1016. echo_content yellow "11. 卸载全部Trojan Panel相关的应用"
  1017. echo_content green "\n=============================================================="
  1018. echo_content yellow "12. 故障检测"
  1019. read -r -p "请选择:" selectInstall_type
  1020. case ${selectInstall_type} in
  1021. 1)
  1022. install_docker
  1023. install_caddy_tls
  1024. install_trojan_gfw_standalone
  1025. ;;
  1026. 2)
  1027. install_docker
  1028. install_caddy_tls
  1029. install_trojanGO_standalone
  1030. ;;
  1031. 3)
  1032. install_docker
  1033. install_caddy_tls
  1034. install_hysteria_standalone
  1035. ;;
  1036. 4)
  1037. install_docker
  1038. install_caddy_tls
  1039. install_navieproxy_standalone
  1040. ;;
  1041. 5)
  1042. install_docker
  1043. install_caddy_tls
  1044. ;;
  1045. 6)
  1046. uninstall_trojan_gfw_standalone
  1047. ;;
  1048. 7)
  1049. uninstall_trojanGO_standalone
  1050. ;;
  1051. 8)
  1052. uninstall_hysteria_standalone
  1053. ;;
  1054. 9)
  1055. uninstall_navieproxy_standalone
  1056. ;;
  1057. 10)
  1058. uninstall_caddy_tls
  1059. ;;
  1060. 11)
  1061. uninstall_all
  1062. ;;
  1063. 12)
  1064. failure_testing
  1065. ;;
  1066. *)
  1067. echo_content red "没有这个选项"
  1068. ;;
  1069. esac
  1070. }
  1071. main