install_script_standalone.sh 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  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.0.0
  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_Caddyfile="/tpdata/caddy/Caddyfile"
  23. CADDY_SRV="/tpdata/caddy/srv/"
  24. CADDY_ACME="/tpdata/caddy/acme/"
  25. DOMAIN_FILE="/tpdata/caddy/domain.lock"
  26. domain=""
  27. caddy_remote_port=8863
  28. your_email="[email protected]"
  29. crt_path=""
  30. key_path=""
  31. ssl_option=1
  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. }
  58. echo_content() {
  59. case $1 in
  60. "red")
  61. ${ECHO_TYPE} "\033[31m$2\033[0m"
  62. ;;
  63. "green")
  64. ${ECHO_TYPE} "\033[32m$2\033[0m"
  65. ;;
  66. "yellow")
  67. ${ECHO_TYPE} "\033[33m$2\033[0m"
  68. ;;
  69. "blue")
  70. ${ECHO_TYPE} "\033[34m$2\033[0m"
  71. ;;
  72. "purple")
  73. ${ECHO_TYPE} "\033[35m$2\033[0m"
  74. ;;
  75. "skyBlue")
  76. ${ECHO_TYPE} "\033[36m$2\033[0m"
  77. ;;
  78. "white")
  79. ${ECHO_TYPE} "\033[37m$2\033[0m"
  80. ;;
  81. esac
  82. }
  83. mkdir_tools() {
  84. # 项目目录
  85. mkdir -p ${TP_DATA}
  86. # Caddy
  87. mkdir -p ${CADDY_DATA}
  88. touch ${CADDY_Caddyfile}
  89. mkdir -p ${CADDY_SRV}
  90. mkdir -p ${CADDY_ACME}
  91. # trojanGFW
  92. mkdir -p ${TROJANGFW_DATA}
  93. touch ${TROJANGFW_STANDALONE_CONFIG}
  94. # trojanGO
  95. mkdir -p ${TROJANGO_DATA}
  96. touch ${TROJANGO_STANDALONE_CONFIG}
  97. # hysteria
  98. mkdir -p ${HYSTERIA_DATA}
  99. touch ${HYSTERIA_STANDALONE_CONFIG}
  100. }
  101. can_connect() {
  102. ping -c2 -i0.3 -W1 "$1" &>/dev/null
  103. if [[ "$?" == "0" ]]; then
  104. return 0
  105. else
  106. return 1
  107. fi
  108. }
  109. check_sys() {
  110. if [[ $(command -v yum) ]]; then
  111. package_manager='yum'
  112. elif [[ $(command -v dnf) ]]; then
  113. package_manager='dnf'
  114. elif [[ $(command -v apt) ]]; then
  115. package_manager='apt'
  116. elif [[ $(command -v apt-get) ]]; then
  117. package_manager='apt-get'
  118. fi
  119. if [[ -z "${package_manager}" ]]; then
  120. echo_content red "暂不支持该系统"
  121. exit 0
  122. fi
  123. if [[ -n $(find /etc -name "redhat-release") ]] || grep </proc/version -q -i "centos"; then
  124. release="centos"
  125. elif grep </etc/issue -q -i "debian" && [[ -f "/etc/issue" ]] || grep </etc/issue -q -i "debian" && [[ -f "/proc/version" ]]; then
  126. release="debian"
  127. elif grep </etc/issue -q -i "ubuntu" && [[ -f "/etc/issue" ]] || grep </etc/issue -q -i "ubuntu" && [[ -f "/proc/version" ]]; then
  128. release="ubuntu"
  129. fi
  130. if [[ -z "${release}" ]]; then
  131. echo_content red "仅支持CentOS 7+/Ubuntu 18+/Debian 10+系统"
  132. exit 0
  133. fi
  134. if [[ $(arch) =~ ("x86_64"|"amd64"|"arm64"|"aarch64"|"arm"|"s390x") ]]; then
  135. get_arch=$(arch)
  136. fi
  137. if [[ -z "${get_arch}" ]]; then
  138. echo_content red "仅支持amd64/arm64/arm/s390x处理器架构"
  139. exit 0
  140. fi
  141. }
  142. depend_install() {
  143. if [[ "${package_manager}" != 'yum' && "${package_manager}" != 'dnf' ]]; then
  144. ${package_manager} update -y
  145. fi
  146. ${package_manager} install -y \
  147. curl \
  148. wget \
  149. tar \
  150. lsof \
  151. systemd
  152. }
  153. # 安装Docker
  154. install_docker() {
  155. if [[ ! $(docker -v 2>/dev/null) ]]; then
  156. echo_content green "---> 安装Docker"
  157. # 关闭防火墙
  158. if [[ "$(firewall-cmd --state 2>/dev/null)" == "running" ]]; then
  159. systemctl stop firewalld.service && systemctl disable firewalld.service
  160. fi
  161. # 时区
  162. timedatectl set-timezone Asia/Shanghai
  163. can_connect www.google.com
  164. [[ "$?" == "0" ]] && can_google=1
  165. if [[ ${can_google} == 0 ]]; then
  166. sh <(curl -sL https://get.docker.com) --mirror Aliyun
  167. # 设置Docker国内源
  168. mkdir -p /etc/docker &&
  169. cat >/etc/docker/daemon.json <<EOF
  170. {
  171. "registry-mirrors":[${DOCKER_MIRROR}],
  172. "log-driver":"json-file",
  173. "log-opts":{
  174. "max-size":"50m",
  175. "max-file":"3"
  176. }
  177. }
  178. EOF
  179. else
  180. sh <(curl -sL https://get.docker.com)
  181. fi
  182. systemctl enable docker &&
  183. systemctl restart docker
  184. if [[ $(docker -v 2>/dev/null) ]]; then
  185. echo_content skyBlue "---> Docker安装完成"
  186. else
  187. echo_content red "---> Docker安装失败"
  188. exit 0
  189. fi
  190. else
  191. echo_content skyBlue "---> 你已经安装了Docker"
  192. fi
  193. }
  194. # 安装Caddy TLS
  195. install_caddy_tls() {
  196. if [[ -z $(docker ps -a -q -f "name=^trojan-panel-caddy$") ]]; then
  197. echo_content green "---> 安装Caddy TLS"
  198. wget --no-check-certificate -O ${CADDY_DATA}html.tar.gz ${STATIC_HTML} &&
  199. tar -zxvf ${CADDY_DATA}html.tar.gz -C ${CADDY_SRV}
  200. read -r -p "请输入Caddy的转发端口(用于申请证书,默认:8863): " caddy_remote_port
  201. [[ -z "${caddy_remote_port}" ]] && caddy_remote_port=8863
  202. while read -r -p "请输入你的域名(必填): " domain; do
  203. if [[ -z "${domain}" ]]; then
  204. echo_content red "域名不能为空"
  205. else
  206. break
  207. fi
  208. done
  209. mkdir "${CADDY_ACME}${domain}"
  210. while read -r -p "请选择设置证书的方式?(1/自动申请和续签证书 2/手动设置证书路径 默认:1/自动申请和续签证书): " ssl_option; do
  211. if [[ -z ${ssl_option} || ${ssl_option} == 1 ]]; then
  212. echo_content yellow "正在检测域名,请稍后..."
  213. ping_ip=$(ping "${domain}" -s1 -c1 | grep "ttl=" | head -n1 | cut -d"(" -f2 | cut -d")" -f1)
  214. curl_ip=$(curl ifconfig.me)
  215. if [[ "${ping_ip}" != "${curl_ip}" ]]; then
  216. echo_content yellow "你的域名没有解析到本机IP,请稍后再试"
  217. echo_content red "---> Caddy安装失败"
  218. exit 0
  219. fi
  220. read -r -p "请输入你的邮箱(用于申请证书,默认:[email protected]): " your_email
  221. [[ -z "${your_email}" ]] && your_email="[email protected]"
  222. cat >${CADDY_Caddyfile} <<EOF
  223. http://${domain}:80 {
  224. redir https://${domain}:${caddy_remote_port}{url}
  225. }
  226. https://${domain}:${caddy_remote_port} {
  227. gzip
  228. tls ${your_email}
  229. root ${CADDY_SRV}
  230. }
  231. EOF
  232. break
  233. else
  234. if [[ ${ssl_option} != 2 ]]; then
  235. echo_content red "不可以输入除1和2之外的其他字符"
  236. else
  237. while read -r -p "请输入证书的.crt文件路径(必填): " crt_path; do
  238. if [[ -z "${crt_path}" ]]; then
  239. echo_content red "路径不能为空"
  240. else
  241. if [[ ! -f "${crt_path}" ]]; then
  242. echo_content red "证书的.crt文件路径不存在"
  243. else
  244. cp "${crt_path}" "${CADDY_ACME}${domain}/${domain}.crt"
  245. break
  246. fi
  247. fi
  248. done
  249. while read -r -p "请输入证书的.key文件路径(必填): " key_path; do
  250. if [[ -z "${key_path}" ]]; then
  251. echo_content red "路径不能为空"
  252. else
  253. if [[ ! -f "${key_path}" ]]; then
  254. echo_content red "证书的.key文件路径不存在"
  255. else
  256. cp "${key_path}" "${CADDY_ACME}${domain}/${domain}.key"
  257. break
  258. fi
  259. fi
  260. done
  261. cat >${CADDY_Caddyfile} <<EOF
  262. http://${domain}:80 {
  263. redir https://${domain}:${caddy_remote_port}{url}
  264. }
  265. https://${domain}:${caddy_remote_port} {
  266. gzip
  267. tls /root/.caddy/acme/acme-v02.api.letsencrypt.org/sites/${domain}/${domain}.crt /root/.caddy/acme/acme-v02.api.letsencrypt.org/sites/${domain}/${domain}.key
  268. root ${CADDY_SRV}
  269. }
  270. EOF
  271. break
  272. fi
  273. fi
  274. done
  275. if [[ -n $(lsof -i:80,443 -t) ]]; then
  276. kill -9 "$(lsof -i:80,443 -t)"
  277. fi
  278. docker pull teddysun/caddy:1.0.5 &&
  279. docker run -d --name trojan-panel-caddy --restart always \
  280. --network=host \
  281. -v ${CADDY_Caddyfile}:"/etc/caddy/Caddyfile" \
  282. -v ${CADDY_ACME}:"/root/.caddy/acme/acme-v02.api.letsencrypt.org/sites/" \
  283. -v ${CADDY_SRV}:${CADDY_SRV} \
  284. teddysun/caddy:1.0.5
  285. if [[ -n $(docker ps -q -f "name=^trojan-panel-caddy$" -f "status=running") ]]; then
  286. cat >${DOMAIN_FILE} <<EOF
  287. ${domain}
  288. EOF
  289. echo_content skyBlue "---> Caddy安装完成"
  290. else
  291. echo_content red "---> Caddy安装失败或运行异常,请尝试修复或卸载重装"
  292. exit 0
  293. fi
  294. else
  295. domain=$(cat "${DOMAIN_FILE}")
  296. echo_content skyBlue "---> 你已经安装了Caddy"
  297. fi
  298. }
  299. # TrojanGFW+Caddy+Web+TLS+Websocket
  300. install_trojan_gfw_standalone() {
  301. if [[ -z $(docker ps -a -q -f "name=^trojan-panel-trojanGFW-standalone$") ]]; then
  302. echo_content green "---> 安装TrojanGFW+Caddy+Web+TLS+Websocket"
  303. read -r -p "请输入TrojanGFW的端口(默认:443): " trojanGFW_port
  304. [[ -n ${trojanGFW_port} ]] && trojanGFW_port=443
  305. while read -r -p "请输入TrojanGFW的密码(必填): " trojan_pas; do
  306. if [[ -z "${trojan_pas}" ]]; then
  307. echo_content red "密码不能为空"
  308. else
  309. break
  310. fi
  311. done
  312. cat >${TROJANGFW_STANDALONE_CONFIG} <<EOF
  313. {
  314. "run_type": "server",
  315. "local_addr": "0.0.0.0",
  316. "local_port": ${trojanGFW_port},
  317. "remote_addr": "${remote_addr}",
  318. "remote_port": 80,
  319. "password": [
  320. "${trojan_pas}"
  321. ],
  322. "log_level": 1,
  323. "ssl": {
  324. "cert": "${CADDY_ACME}${domain}/${domain}.crt",
  325. "key": "${CADDY_ACME}${domain}/${domain}.key",
  326. "key_password": "",
  327. "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",
  328. "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
  329. "prefer_server_cipher": true,
  330. "alpn": [
  331. "http/1.1"
  332. ],
  333. "alpn_port_override": {
  334. "h2": 81
  335. },
  336. "reuse_session": true,
  337. "session_ticket": false,
  338. "session_timeout": 600,
  339. "plain_http_response": "",
  340. "curves": "",
  341. "dhparam": ""
  342. },
  343. "tcp": {
  344. "prefer_ipv4": false,
  345. "no_delay": true,
  346. "keep_alive": true,
  347. "reuse_port": false,
  348. "fast_open": false,
  349. "fast_open_qlen": 20
  350. },
  351. "mysql": {
  352. "enabled": false,
  353. "server_addr": "127.0.0.1",
  354. "server_port": 3306,
  355. "database": "",
  356. "username": "",
  357. "password": "",
  358. "key": "",
  359. "cert": "",
  360. "ca": ""
  361. }
  362. }
  363. EOF
  364. docker pull trojangfw/trojan &&
  365. docker run -d --name trojan-panel-trojanGFW-standalone --restart always \
  366. --network=host \
  367. -v ${TROJANGFW_STANDALONE_CONFIG}:"/config/config.json" \
  368. -v ${CADDY_ACME}:${CADDY_ACME} \
  369. trojangfw/trojan
  370. if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGFW-standalone$" -f "status=running") ]]; then
  371. echo_content skyBlue "---> TrojanGFW+Caddy+Web+TLS 安装完成"
  372. echo_content red "\n=============================================================="
  373. echo_content skyBlue "TrojanGFW+Caddy+Web+TLS 安装成功"
  374. echo_content yellow "域名: ${domain}"
  375. echo_content yellow "TrojanGFW的端口: ${trojanGFW_port}"
  376. echo_content yellow "TrojanGFW的密码: ${trojan_pas}"
  377. echo_content red "\n=============================================================="
  378. else
  379. echo_content red "---> TrojanGFW+Caddy+Web+TLS 安装失败或运行异常,请尝试修复或卸载重装"
  380. exit 0
  381. fi
  382. else
  383. echo_content skyBlue "---> 你已经安装了TrojanGFW+Caddy+Web+TLS"
  384. fi
  385. }
  386. # TrojanGO+Caddy+Web+TLS+Websocket
  387. install_trojanGO_standalone() {
  388. if [[ -z $(docker ps -a -q -f "name=^trojan-panel-trojanGO-standalone$") ]]; then
  389. echo_content green "---> 安装TrojanGO+Caddy+Web+TLS+Websocket"
  390. read -r -p "请输入TrojanGO的端口(默认:443): " trojanGO_port
  391. [[ -z "${trojanGO_port}" ]] && trojanGO_port=443
  392. while read -r -p "请输入TrojanGO的密码(必填): " trojan_pas; do
  393. if [[ -z "${trojan_pas}" ]]; then
  394. echo_content red "密码不能为空"
  395. else
  396. break
  397. fi
  398. done
  399. while read -r -p "是否开启多路复用?(false/关闭 true/开启 默认:true/开启): " trojanGO_mux_enable; do
  400. if [[ -z "${trojanGO_mux_enable}" || ${trojanGO_mux_enable} == true ]]; then
  401. trojanGO_mux_enable=true
  402. break
  403. else
  404. if [[ ${trojanGO_mux_enable} != false ]]; then
  405. echo_content red "不可以输入除false和true之外的其他字符"
  406. else
  407. break
  408. fi
  409. fi
  410. done
  411. while read -r -p "是否开启Websocket?(false/关闭 true/开启 默认:false/关闭): " trojanGO_websocket_enable; do
  412. if [[ -z "${trojanGO_websocket_enable}" || ${trojanGO_websocket_enable} == false ]]; then
  413. trojanGO_websocket_enable=false
  414. break
  415. else
  416. if [[ ${trojanGO_websocket_enable} != true ]]; then
  417. echo_content red "不可以输入除false和true之外的其他字符"
  418. else
  419. read -r -p "请输入Websocket路径(默认:trojan-panel-websocket-path): " trojanGO_websocket_path
  420. [[ -z "${trojanGO_websocket_path}" ]] && trojanGO_websocket_path="trojan-panel-websocket-path"
  421. break
  422. fi
  423. fi
  424. done
  425. while read -r -p "是否启用Shadowsocks AEAD加密?(false/关闭 true/开启 默认:false/关闭): " trojanGO_shadowsocks_enable; do
  426. if [[ -z "${trojanGO_shadowsocks_enable}" || ${trojanGO_shadowsocks_enable} == false ]]; then
  427. trojanGO_shadowsocks_enable=false
  428. break
  429. else
  430. if [[ ${trojanGO_shadowsocks_enable} != true ]]; then
  431. echo_content yellow "不可以输入除false和true之外的其他字符"
  432. else
  433. echo_content skyBlue "Shadowsocks AEAD加密方式如下:"
  434. echo_content yellow "1. AES-128-GCM(默认)"
  435. echo_content yellow "2. CHACHA20-IETF-POLY1305"
  436. echo_content yellow "3. AES-256-GCM"
  437. read -r -p "请输入Shadowsocks AEAD加密方式(默认:1): " select_method_type
  438. [[ -z "${select_method_type}" ]] && select_method_type=1
  439. case ${select_method_type} in
  440. 1)
  441. trojanGO_shadowsocks_method="AES-128-GCM"
  442. ;;
  443. 2)
  444. trojanGO_shadowsocks_method="CHACHA20-IETF-POLY1305"
  445. ;;
  446. 3)
  447. trojanGO_shadowsocks_method="AES-256-GCM"
  448. ;;
  449. *)
  450. trojanGO_shadowsocks_method="AES-128-GCM"
  451. ;;
  452. esac
  453. while read -r -p "请输入Shadowsocks AEAD加密密码(必填): " trojanGO_shadowsocks_password; do
  454. if [[ -z "${trojanGO_shadowsocks_password}" ]]; then
  455. echo_content red "密码不能为空"
  456. else
  457. break
  458. fi
  459. done
  460. break
  461. fi
  462. fi
  463. done
  464. cat >${TROJANGO_STANDALONE_CONFIG} <<EOF
  465. {
  466. "run_type": "server",
  467. "local_addr": "0.0.0.0",
  468. "local_port": ${trojanGO_port},
  469. "remote_addr": "${remote_addr}",
  470. "remote_port": 80,
  471. "log_level": 1,
  472. "log_file": "",
  473. "password": [
  474. "${trojan_pas}"
  475. ],
  476. "disable_http_check": false,
  477. "udp_timeout": 60,
  478. "ssl": {
  479. "verify": true,
  480. "verify_hostname": true,
  481. "cert": "${CADDY_ACME}${domain}/${domain}.crt",
  482. "key": "${CADDY_ACME}${domain}/${domain}.key",
  483. "key_password": "",
  484. "cipher": "",
  485. "curves": "",
  486. "prefer_server_cipher": false,
  487. "sni": "",
  488. "alpn": [
  489. "http/1.1"
  490. ],
  491. "session_ticket": true,
  492. "reuse_session": true,
  493. "plain_http_response": "",
  494. "fallback_addr": "",
  495. "fallback_port": 80,
  496. "fingerprint": ""
  497. },
  498. "tcp": {
  499. "no_delay": true,
  500. "keep_alive": true,
  501. "prefer_ipv4": false
  502. },
  503. "mux": {
  504. "enabled": ${trojanGO_mux_enable},
  505. "concurrency": 8,
  506. "idle_timeout": 60
  507. },
  508. "websocket": {
  509. "enabled": ${trojanGO_websocket_enable},
  510. "path": "/${trojanGO_websocket_path}",
  511. "host": "${domain}"
  512. },
  513. "shadowsocks": {
  514. "enabled": ${trojanGO_shadowsocks_enable},
  515. "method": "${trojanGO_shadowsocks_method}",
  516. "password": "${trojanGO_shadowsocks_password}"
  517. },
  518. "mysql": {
  519. "enabled": false,
  520. "server_addr": "localhost",
  521. "server_port": 3306,
  522. "database": "",
  523. "username": "",
  524. "password": "",
  525. "check_rate": 60
  526. }
  527. }
  528. EOF
  529. docker pull p4gefau1t/trojan-go &&
  530. docker run -d --name trojan-panel-trojanGO-standalone --restart=always \
  531. --network=host \
  532. -v ${TROJANGO_STANDALONE_CONFIG}:"/etc/trojan-go/config.json" \
  533. -v ${CADDY_ACME}:${CADDY_ACME} \
  534. p4gefau1t/trojan-go
  535. if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGO-standalone$" -f "status=running") ]]; then
  536. echo_content skyBlue "---> TrojanGO+Caddy+Web+TLS+Websocket 安装完成"
  537. echo_content red "\n=============================================================="
  538. echo_content skyBlue "TrojanGO+Caddy+Web+TLS+Websocket 安装成功"
  539. echo_content yellow "域名: ${domain}"
  540. echo_content yellow "TrojanGO的端口: ${trojanGO_port}"
  541. echo_content yellow "TrojanGO的密码: ${trojan_pas}"
  542. echo_content yellow "TrojanGO私钥和证书目录: ${CADDY_ACME}${domain}/"
  543. if [[ ${trojanGO_websocket_enable} == true ]]; then
  544. echo_content yellow "Websocket路径: ${trojanGO_websocket_path}"
  545. fi
  546. if [[ ${trojanGO_shadowsocks_enable} == true ]]; then
  547. echo_content yellow "Shadowsocks AEAD加密方式: ${trojanGO_shadowsocks_method}"
  548. echo_content yellow "Shadowsocks AEAD加密密码: ${trojanGO_shadowsocks_password}"
  549. fi
  550. echo_content red "\n=============================================================="
  551. else
  552. echo_content red "---> TrojanGO+Caddy+Web+TLS+Websocket 安装失败或运行异常,请尝试修复或卸载重装"
  553. exit 0
  554. fi
  555. else
  556. echo_content skyBlue "---> 你已经了安装了TrojanGO+Caddy+Web+TLS+Websocket"
  557. fi
  558. }
  559. # 安装Hysteria
  560. install_hysteria_standalone() {
  561. if [[ -z $(docker ps -a -q -f "name=^trojan-panel-hysteria-standalone$") ]]; then
  562. echo_content green "---> 安装Hysteria"
  563. echo_content skyBlue "Hysteria的模式如下:"
  564. echo_content yellow "1. udp(默认)"
  565. echo_content yellow "2. faketcp"
  566. read -r -p "请输入Hysteria的模式(默认:1): " selectProtocolType
  567. [[ -z "${selectProtocolType}" ]] && selectProtocolType=1
  568. case ${selectProtocolType} in
  569. 1)
  570. hysteria_protocol="udp"
  571. ;;
  572. 2)
  573. hysteria_protocol="faketcp"
  574. ;;
  575. *)
  576. hysteria_protocol="udp"
  577. ;;
  578. esac
  579. read -r -p "请输入Hysteria的端口(默认:443): " hysteria_port
  580. [[ -z ${hysteria_port} ]] && hysteria_port=443
  581. read -r -p "请输入单客户端最大上传速度/Mbps(默认:100): " hysteria_up_mbps
  582. [[ -z "${hysteria_up_mbps}" ]] && hysteria_up_mbps=100
  583. read -r -p "请输入单客户端最大下载速度/Mbps(默认:100): " hysteria_down_mbps
  584. [[ -z "${hysteria_down_mbps}" ]] && hysteria_down_mbps=100
  585. while read -r -p "请输入Hysteria的密码(必填): " hysteria_password; do
  586. if [[ -z ${hysteria_password} ]]; then
  587. echo_content red "密码不能为空"
  588. else
  589. break
  590. fi
  591. done
  592. cat >${HYSTERIA_STANDALONE_CONFIG} <<EOF
  593. {
  594. "listen": ":${hysteria_port}",
  595. "protocol": "${hysteria_protocol}",
  596. "cert": "${CADDY_ACME}${domain}/${domain}.crt",
  597. "key": "${CADDY_ACME}${domain}/${domain}.key",
  598. "up_mbps": ${hysteria_up_mbps},
  599. "down_mbps": ${hysteria_down_mbps},
  600. "obfs": "${hysteria_password}"
  601. }
  602. EOF
  603. docker pull tobyxdd/hysteria &&
  604. docker run -d --name trojan-panel-hysteria-standalone --restart=always \
  605. --network=host \
  606. -v ${HYSTERIA_STANDALONE_CONFIG}:/etc/hysteria.json \
  607. -v ${CADDY_ACME}:${CADDY_ACME} \
  608. tobyxdd/hysteria -c /etc/hysteria.json server
  609. if [[ -n $(docker ps -q -f "name=^trojan-panel-hysteria-standalone$" -f "status=running") ]]; then
  610. echo_content skyBlue "---> Hysteria 安装完成"
  611. echo_content red "\n=============================================================="
  612. echo_content skyBlue "Hysteria 安装成功"
  613. echo_content yellow "域名: ${domain}"
  614. echo_content yellow "Hysteria的端口: ${hysteria_port}"
  615. echo_content yellow "Hysteria的密码: ${hysteria_password}"
  616. echo_content yellow "Hysteria私钥和证书目录: ${CADDY_ACME}${domain}/"
  617. echo_content red "\n=============================================================="
  618. else
  619. echo_content red "---> Hysteria 安装失败或运行异常,请尝试修复或卸载重装"
  620. exit 0
  621. fi
  622. else
  623. echo_content skyBlue "---> 你已经安装了Hysteria"
  624. fi
  625. }
  626. # 卸载Caddy TLS
  627. uninstall_caddy_tls() {
  628. # 判断Caddy TLS是否安装
  629. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-caddy$") ]]; then
  630. echo_content green "---> 卸载Caddy TLS"
  631. docker rm -f trojan-panel-caddy &&
  632. rm -rf ${CADDY_DATA}
  633. echo_content skyBlue "---> Caddy TLS卸载完成"
  634. else
  635. echo_content red "---> 请先安装Caddy TLS"
  636. fi
  637. }
  638. # TrojanGFW+Caddy+Web+TLS
  639. uninstall_trojan_gfw_standalone() {
  640. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-trojanGFW-standalone$") ]]; then
  641. echo_content green "---> 卸载TrojanGFW+Caddy+Web+TLS"
  642. docker rm -f trojan-panel-trojanGFW-standalone &&
  643. docker rmi -f trojangfw/trojan &&
  644. rm -f ${TROJANGFW_STANDALONE_CONFIG}
  645. echo_content skyBlue "---> TrojanGFW+Caddy+Web+TLS 卸载完成"
  646. else
  647. echo_content red "---> 请先安装TrojanGFW+Caddy+Web+TLS"
  648. fi
  649. }
  650. # 卸载TrojanGO 单机版
  651. uninstall_trojanGO_standalone() {
  652. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-trojanGO-standalone$") ]]; then
  653. echo_content green "---> 卸载TrojanGO+Caddy+Web+TLS+Websocket"
  654. docker rm -f trojan-panel-trojanGO-standalone &&
  655. docker rmi -f p4gefau1t/trojan-go &&
  656. rm -f ${TROJANGO_STANDALONE_CONFIG}
  657. echo_content skyBlue "---> TrojanGO+Caddy+Web+TLS+Websocket 卸载完成"
  658. else
  659. echo_content red "---> 请先安装TrojanGO+Caddy+Web+TLS+Websocket"
  660. fi
  661. }
  662. # 卸载Hysteria
  663. uninstall_hysteria_standalone() {
  664. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-hysteria-standalone$") ]]; then
  665. echo_content green "---> 卸载Hysteria"
  666. docker rm -f trojan-panel-hysteria-standalone &&
  667. docker rmi -f tobyxdd/hysteria &&
  668. rm -f ${HYSTERIA_STANDALONE_CONFIG}
  669. echo_content skyBlue "---> Hysteria 卸载完成"
  670. else
  671. echo_content red "---> 请先安装Hysteria"
  672. fi
  673. }
  674. # 卸载全部Trojan Panel相关的容器
  675. uninstall_all() {
  676. echo_content green "---> 卸载全部Trojan Panel相关的容器"
  677. docker rm -f $(docker ps -a -q -f "name=^trojan-panel") &&
  678. docker rmi -f $(docker images | grep "^jonssonyan/trojan-panel" | awk '{print $3}') &&
  679. rm -rf ${TP_DATA}
  680. echo_content skyBlue "---> 卸载全部Trojan Panel相关的容器完成"
  681. }
  682. # 故障检测
  683. failure_testing() {
  684. echo_content green "---> 故障检测开始"
  685. if [[ ! $(docker -v 2>/dev/null) ]]; then
  686. echo_content red "---> Docker运行异常"
  687. else
  688. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-caddy$") ]]; then
  689. if [[ -z $(docker ps -q -f "name=^trojan-panel-caddy$" -f "status=running") ]]; then
  690. echo_content red "---> Caddy TLS运行异常"
  691. fi
  692. domain=$(cat "${DOMAIN_FILE}")
  693. if [[ -z $(cat "${DOMAIN_FILE}") || ! -d "${CADDY_ACME}${domain}" || ! -f "${CADDY_ACME}${domain}/${domain}.crt" ]]; then
  694. echo_content red "---> 证书申请异常,请尝试重启服务器将重新申请证书或者重新搭建选择自定义证书选项"
  695. fi
  696. fi
  697. 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
  698. echo_content red "---> TrojanGFW运行异常"
  699. fi
  700. 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
  701. echo_content red "---> TrojanGO运行异常"
  702. fi
  703. 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
  704. echo_content red "---> Hysteria运行异常"
  705. fi
  706. fi
  707. echo_content green "---> 故障检测结束"
  708. }
  709. # 卸载阿里云内置相关监控
  710. uninstall_aliyun() {
  711. # 卸载云监控(Cloudmonitor) Java 版
  712. /usr/local/cloudmonitor/wrapper/bin/cloudmonitor.sh stop &&
  713. /usr/local/cloudmonitor/wrapper/bin/cloudmonitor.sh remove &&
  714. rm -rf /usr/local/cloudmonitor
  715. # 卸载云盾(安骑士)
  716. wget --no-check-certificate -O uninstall.sh http://update.aegis.aliyun.com/download/uninstall.sh && chmod +x uninstall.sh && ./uninstall.sh
  717. wget --no-check-certificate -O quartz_uninstall.sh http://update.aegis.aliyun.com/download/quartz_uninstall.sh && chmod +x quartz_uninstall.sh && ./quartz_uninstall.sh
  718. pkill aliyun-service
  719. rm -fr /etc/init.d/agentwatch /usr/sbin/aliyun-service
  720. rm -rf /usr/local/aegis*
  721. iptables -I INPUT -s 140.205.201.0/28 -j DROP
  722. iptables -I INPUT -s 140.205.201.16/29 -j DROP
  723. iptables -I INPUT -s 140.205.201.32/28 -j DROP
  724. iptables -I INPUT -s 140.205.225.192/29 -j DROP
  725. iptables -I INPUT -s 140.205.225.200/30 -j DROP
  726. iptables -I INPUT -s 140.205.225.184/29 -j DROP
  727. iptables -I INPUT -s 140.205.225.183/32 -j DROP
  728. iptables -I INPUT -s 140.205.225.206/32 -j DROP
  729. iptables -I INPUT -s 140.205.225.205/32 -j DROP
  730. iptables -I INPUT -s 140.205.225.195/32 -j DROP
  731. iptables -I INPUT -s 140.205.225.204/32 -j DROP
  732. }
  733. main() {
  734. cd "$HOME" || exit 0
  735. init_var
  736. mkdir_tools
  737. check_sys
  738. depend_install
  739. clear
  740. echo_content red "\n=============================================================="
  741. echo_content skyBlue "System Required: CentOS 7+/Ubuntu 18+/Debian 10+"
  742. echo_content skyBlue "Version: v1.0.0"
  743. echo_content skyBlue "Description: One click Install Trojan Panel standalone server"
  744. echo_content skyBlue "Author: jonssonyan <https://jonssonyan.com>"
  745. echo_content skyBlue "Github: https://github.com/trojanpanel"
  746. echo_content skyBlue "Docs: https://trojanpanel.github.io"
  747. echo_content red "\n=============================================================="
  748. echo_content yellow "1. 安装TrojanGFW+Caddy+Web+TLS"
  749. echo_content yellow "3. 安装TrojanGO+Caddy+Web+TLS+Websocket"
  750. echo_content yellow "5. 安装Hysteria"
  751. echo_content yellow "3. 安装Caddy TLS"
  752. echo_content green "\n=============================================================="
  753. echo_content yellow "2. 卸载TrojanGFW+Caddy+Web+TLS"
  754. echo_content yellow "4. 卸载TrojanGO+Caddy+Web+TLS+Websocket"
  755. echo_content yellow "6. 卸载Hysteria"
  756. echo_content yellow "7. 卸载Caddy TLS"
  757. echo_content yellow "8. 卸载全部Trojan Panel相关的应用"
  758. echo_content green "\n=============================================================="
  759. echo_content yellow "9. 故障检测"
  760. read -r -p "请选择:" selectInstall_type
  761. case ${selectInstall_type} in
  762. 1)
  763. install_docker
  764. install_caddy_tls
  765. install_trojan_gfw_standalone
  766. ;;
  767. 2)
  768. install_docker
  769. install_caddy_tls
  770. install_trojanGO_standalone
  771. ;;
  772. 3)
  773. install_docker
  774. install_caddy_tls
  775. install_hysteria_standalone
  776. ;;
  777. 4)
  778. uninstall_trojan_gfw_standalone
  779. ;;
  780. 5)
  781. uninstall_trojanGO_standalone
  782. ;;
  783. 6)
  784. uninstall_hysteria_standalone
  785. ;;
  786. 7)
  787. uninstall_caddy_tls
  788. ;;
  789. 8)
  790. uninstall_all
  791. ;;
  792. 9)
  793. failure_testing
  794. ;;
  795. *)
  796. echo_content red "没有这个选项"
  797. ;;
  798. esac
  799. }
  800. main