install_script.sh 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963
  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 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. # MariaDB
  21. MARIA_DATA="/tpdata/mariadb/"
  22. mariadb_ip="trojan-panel-mariadb"
  23. mariadb_port=9507
  24. mariadb_user="root"
  25. mariadb_pas=""
  26. database="trojan_panel_db"
  27. account_table="account"
  28. #Redis
  29. REDIS_DATA="/tpdata/redis/"
  30. redis_host="trojan-panel-redis"
  31. redis_port=6378
  32. redis_pass=""
  33. # Trojan Panel
  34. TROJAN_PANEL_DATA="/tpdata/trojan-panel/"
  35. TROJAN_PANEL_WEBFILE="/tpdata/trojan-panel/webfile/"
  36. TROJAN_PANEL_LOGS="/tpdata/trojan-panel/logs/"
  37. # Trojan Panel Core
  38. TROJAN_PANEL_CORE_DATA="/tpdata/trojan-panel-core/"
  39. TROJAN_PANEL_CORE_LOGS="/tpdata/trojan-panel-core/logs/"
  40. # Trojan Panel UI
  41. TROJAN_PANEL_UI_DATA="/tpdata/trojan-panel-ui/"
  42. # Nginx
  43. NGINX_DATA="/tpdata/nginx/"
  44. NGINX_CONFIG="/tpdata/nginx/default.conf"
  45. # Caddy
  46. CADDY_DATA="/tpdata/caddy/"
  47. CADDY_Caddyfile="/tpdata/caddy/Caddyfile"
  48. CADDY_SRV="/tpdata/caddy/srv/"
  49. CADDY_ACME="/tpdata/caddy/acme/"
  50. DOMAIN_FILE="/tpdata/caddy/domain.lock"
  51. domain=""
  52. caddy_remote_port=8863
  53. your_email="[email protected]"
  54. crt_path=""
  55. key_path=""
  56. ssl_option=1
  57. # trojanGFW
  58. TROJANGFW_DATA="/tpdata/trojanGFW/"
  59. TROJANGFW_CONFIG="/tpdata/trojanGFW/config.json"
  60. TROJANGFW_STANDALONE_CONFIG="/tpdata/trojanGFW/standalone_config.json"
  61. trojanGFW_port=443
  62. # trojanGO
  63. TROJANGO_DATA="/tpdata/trojanGO/"
  64. TROJANGO_CONFIG="/tpdata/trojanGO/config.json"
  65. TROJANGO_STANDALONE_CONFIG="/tpdata/trojanGO/standalone_config.json"
  66. trojanGO_port=443
  67. trojanGO_websocket_enable=false
  68. trojanGO_websocket_path="trojan-panel-websocket-path"
  69. trojanGO_shadowsocks_enable=false
  70. trojanGO_shadowsocks_method="AES-128-GCM"
  71. trojanGO_shadowsocks_password=""
  72. trojanGO_mux_enable=true
  73. # trojan
  74. trojan_pas=""
  75. remote_addr="trojan-panel-caddy"
  76. # hysteria
  77. HYSTERIA_DATA="/tpdata/hysteria/"
  78. HYSTERIA_CONFIG="/tpdata/hysteria/config.json"
  79. HYSTERIA_STANDALONE_CONFIG="/tpdata/hysteria/standalone_config.json"
  80. hysteria_port=443
  81. hysteria_password=""
  82. hysteria_protocol="udp"
  83. hysteria_up_mbps=100
  84. hysteria_down_mbps=100
  85. trojan_panel_url=""
  86. }
  87. echo_content() {
  88. case $1 in
  89. "red")
  90. ${ECHO_TYPE} "\033[31m$2\033[0m"
  91. ;;
  92. "green")
  93. ${ECHO_TYPE} "\033[32m$2\033[0m"
  94. ;;
  95. "yellow")
  96. ${ECHO_TYPE} "\033[33m$2\033[0m"
  97. ;;
  98. "blue")
  99. ${ECHO_TYPE} "\033[34m$2\033[0m"
  100. ;;
  101. "purple")
  102. ${ECHO_TYPE} "\033[35m$2\033[0m"
  103. ;;
  104. "skyBlue")
  105. ${ECHO_TYPE} "\033[36m$2\033[0m"
  106. ;;
  107. "white")
  108. ${ECHO_TYPE} "\033[37m$2\033[0m"
  109. ;;
  110. esac
  111. }
  112. mkdir_tools() {
  113. # 项目目录
  114. mkdir -p ${TP_DATA}
  115. # MariaDB
  116. mkdir -p ${MARIA_DATA}
  117. # Redis
  118. mkdir -p ${REDIS_DATA}
  119. # Trojan Panel
  120. mkdir -p ${TROJAN_PANEL_DATA}
  121. mkdir -p ${TROJAN_PANEL_LOGS}
  122. # Trojan Panel Core
  123. mkdir -p ${TROJAN_PANEL_CORE_DATA}
  124. mkdir -p ${TROJAN_PANEL_CORE_LOGS}
  125. # Trojan Panel UI
  126. mkdir -p ${TROJAN_PANEL_UI_DATA}
  127. # # Nginx
  128. mkdir -p ${NGINX_DATA}
  129. touch ${NGINX_CONFIG}
  130. # Caddy
  131. mkdir -p ${CADDY_DATA}
  132. touch ${CADDY_Caddyfile}
  133. mkdir -p ${CADDY_SRV}
  134. mkdir -p ${CADDY_ACME}
  135. # trojanGFW
  136. mkdir -p ${TROJANGFW_DATA}
  137. touch ${TROJANGFW_CONFIG}
  138. touch ${TROJANGFW_STANDALONE_CONFIG}
  139. # trojanGO
  140. mkdir -p ${TROJANGO_DATA}
  141. touch ${TROJANGO_CONFIG}
  142. touch ${TROJANGO_STANDALONE_CONFIG}
  143. # hysteria
  144. mkdir -p ${HYSTERIA_DATA}
  145. touch ${HYSTERIA_CONFIG}
  146. touch ${HYSTERIA_STANDALONE_CONFIG}
  147. }
  148. can_connect() {
  149. ping -c2 -i0.3 -W1 "$1" &>/dev/null
  150. if [[ "$?" == "0" ]]; then
  151. return 0
  152. else
  153. return 1
  154. fi
  155. }
  156. check_sys() {
  157. if [[ $(command -v yum) ]]; then
  158. package_manager='yum'
  159. elif [[ $(command -v dnf) ]]; then
  160. package_manager='dnf'
  161. elif [[ $(command -v apt) ]]; then
  162. package_manager='apt'
  163. elif [[ $(command -v apt-get) ]]; then
  164. package_manager='apt-get'
  165. fi
  166. if [[ -z "${package_manager}" ]]; then
  167. echo_content red "暂不支持该系统"
  168. exit 0
  169. fi
  170. if [[ -n $(find /etc -name "redhat-release") ]] || grep </proc/version -q -i "centos"; then
  171. release="centos"
  172. elif grep </etc/issue -q -i "debian" && [[ -f "/etc/issue" ]] || grep </etc/issue -q -i "debian" && [[ -f "/proc/version" ]]; then
  173. release="debian"
  174. elif grep </etc/issue -q -i "ubuntu" && [[ -f "/etc/issue" ]] || grep </etc/issue -q -i "ubuntu" && [[ -f "/proc/version" ]]; then
  175. release="ubuntu"
  176. fi
  177. if [[ -z "${release}" ]]; then
  178. echo_content red "仅支持CentOS 7+/Ubuntu 18+/Debian 10+系统"
  179. exit 0
  180. fi
  181. if [[ $(arch) =~ ("x86_64"|"amd64"|"arm64"|"aarch64"|"arm"|"s390x") ]]; then
  182. get_arch=$(arch)
  183. fi
  184. if [[ -z "${get_arch}" ]]; then
  185. echo_content red "仅支持amd64/arm64/arm/s390x处理器架构"
  186. exit 0
  187. fi
  188. }
  189. depend_install() {
  190. if [[ "${package_manager}" != 'yum' && "${package_manager}" != 'dnf' ]]; then
  191. ${package_manager} update -y
  192. fi
  193. ${package_manager} install -y \
  194. curl \
  195. wget \
  196. tar \
  197. lsof \
  198. systemd
  199. }
  200. # 安装BBRPlus 仅支持CentOS系统
  201. install_bbr_plus() {
  202. kernel_version="4.14.129-bbrplus"
  203. if [[ ! -f /etc/redhat-release ]]; then
  204. echo_content yellow "仅支持CentOS系统"
  205. exit 0
  206. fi
  207. if [[ "$(uname -r)" == "${kernel_version}" ]]; then
  208. echo_content yellow "内核已经安装,无需重复执行"
  209. exit 0
  210. fi
  211. # 卸载原加速
  212. echo_content green "卸载加速..."
  213. sed -i '/net.core.default_qdisc/d' /etc/sysctl.conf
  214. sed -i '/net.ipv4.tcp_congestion_control/d' /etc/sysctl.conf
  215. if [[ -e /appex/bin/serverSpeeder.sh ]]; then
  216. wget --no-check-certificate -O appex.sh https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh && chmod +x appex.sh && bash appex.sh uninstall
  217. rm -f appex.sh
  218. fi
  219. echo_content green "下载内核..."
  220. wget https://github.com/cx9208/bbrplus/raw/master/centos7/x86_64/kernel-${kernel_version}.rpm
  221. echo_content green "安装内核..."
  222. yum install -y kernel-${kernel_version}.rpm
  223. # 检查内核是否安装成功
  224. list="$(awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg)"
  225. target="CentOS Linux (${kernel_version})"
  226. result=$(echo "${list}" | grep "${target}")
  227. if [[ -z "${result}" ]]; then
  228. echo_content red "内核安装失败"
  229. exit 1
  230. fi
  231. echo_content green "切换内核..."
  232. grub2-set-default "CentOS Linux (${kernel_version}) 7 (Core)"
  233. echo_content green "启用模块..."
  234. echo "net.core.default_qdisc=fq" >>/etc/sysctl.conf
  235. echo "net.ipv4.tcp_congestion_control=bbrplus" >>/etc/sysctl.conf
  236. rm -f kernel-${kernel_version}.rpm
  237. read -r -p "BBRPlusPlus安装完成,现在重启 ? [Y/n] :" yn
  238. [[ -z "${yn}" ]] && yn="y"
  239. if [[ $yn == [Yy] ]]; then
  240. echo_content green "重启中..."
  241. reboot
  242. fi
  243. }
  244. # 安装Docker
  245. install_docker() {
  246. if [[ ! $(docker -v 2>/dev/null) ]]; then
  247. echo_content green "---> 安装Docker"
  248. # 关闭防火墙
  249. if [[ "$(firewall-cmd --state 2>/dev/null)" == "running" ]]; then
  250. systemctl stop firewalld.service && systemctl disable firewalld.service
  251. fi
  252. # 时区
  253. timedatectl set-timezone Asia/Shanghai
  254. can_connect www.google.com
  255. [[ "$?" == "0" ]] && can_google=1
  256. if [[ ${can_google} == 0 ]]; then
  257. sh <(curl -sL https://get.docker.com) --mirror Aliyun
  258. # 设置Docker国内源
  259. mkdir -p /etc/docker &&
  260. cat >/etc/docker/daemon.json <<EOF
  261. {
  262. "registry-mirrors":[${DOCKER_MIRROR}],
  263. "log-driver":"json-file",
  264. "log-opts":{
  265. "max-size":"50m",
  266. "max-file":"3"
  267. }
  268. }
  269. EOF
  270. else
  271. sh <(curl -sL https://get.docker.com)
  272. fi
  273. systemctl enable docker &&
  274. systemctl restart docker &&
  275. docker network create trojan-panel-network
  276. if [[ $(docker -v 2>/dev/null) ]]; then
  277. echo_content skyBlue "---> Docker安装完成"
  278. else
  279. echo_content red "---> Docker安装失败"
  280. exit 0
  281. fi
  282. else
  283. if [[ -z $(docker network ls | grep "trojan-panel-network") ]]; then
  284. docker network create trojan-panel-network
  285. fi
  286. echo_content skyBlue "---> 你已经安装了Docker"
  287. fi
  288. }
  289. # 安装Caddy TLS
  290. install_caddy_tls() {
  291. if [[ -z $(docker ps -q -f "name=^trojan-panel-caddy$") ]]; then
  292. echo_content green "---> 安装Caddy TLS"
  293. wget --no-check-certificate -O ${CADDY_DATA}html.tar.gz ${STATIC_HTML} &&
  294. tar -zxvf ${CADDY_DATA}html.tar.gz -C ${CADDY_SRV}
  295. read -r -p "请输入Caddy的转发端口(用于申请证书,默认:8863): " caddy_remote_port
  296. [[ -z "${caddy_remote_port}" ]] && caddy_remote_port=8863
  297. while read -r -p "请输入你的域名(必填): " domain; do
  298. if [[ -z "${domain}" ]]; then
  299. echo_content red "域名不能为空"
  300. else
  301. break
  302. fi
  303. done
  304. mkdir "${CADDY_ACME}${domain}"
  305. while read -r -p "请选择设置证书的方式?(1/自动申请和续签证书 2/手动设置证书路径 默认:1/自动申请和续签证书): " ssl_option; do
  306. if [[ -z ${ssl_option} || ${ssl_option} == 1 ]]; then
  307. echo_content yellow "正在检测域名,请稍后..."
  308. ping_ip=$(ping "${domain}" -s1 -c1 | grep "ttl=" | head -n1 | cut -d"(" -f2 | cut -d")" -f1)
  309. curl_ip=$(curl ifconfig.me)
  310. if [[ "${ping_ip}" != "${curl_ip}" ]]; then
  311. echo_content yellow "你的域名没有解析到本机IP,请稍后再试"
  312. echo_content red "---> Caddy安装失败"
  313. exit 0
  314. fi
  315. read -r -p "请输入你的邮箱(用于申请证书,默认:[email protected]): " your_email
  316. [[ -z "${your_email}" ]] && your_email="[email protected]"
  317. cat >${CADDY_Caddyfile} <<EOF
  318. http://${domain}:80 {
  319. redir https://${domain}:${caddy_remote_port}{url}
  320. }
  321. https://${domain}:${caddy_remote_port} {
  322. gzip
  323. tls ${your_email}
  324. root ${CADDY_SRV}
  325. }
  326. EOF
  327. break
  328. else
  329. if [[ ${ssl_option} != 2 ]]; then
  330. echo_content red "不可以输入除1和2之外的其他字符"
  331. else
  332. while read -r -p "请输入证书的.crt文件路径(必填): " crt_path; do
  333. if [[ -z "${crt_path}" ]]; then
  334. echo_content red "路径不能为空"
  335. else
  336. if [[ ! -f "${crt_path}" ]]; then
  337. echo_content red "证书的.crt文件路径不存在"
  338. else
  339. cp "${crt_path}" "${CADDY_ACME}${domain}/${domain}.crt"
  340. break
  341. fi
  342. fi
  343. done
  344. while read -r -p "请输入证书的.key文件路径(必填): " key_path; do
  345. if [[ -z "${key_path}" ]]; then
  346. echo_content red "路径不能为空"
  347. else
  348. if [[ ! -f "${key_path}" ]]; then
  349. echo_content red "证书的.key文件路径不存在"
  350. else
  351. cp "${key_path}" "${CADDY_ACME}${domain}/${domain}.key"
  352. break
  353. fi
  354. fi
  355. done
  356. cat >${CADDY_Caddyfile} <<EOF
  357. http://${domain}:80 {
  358. redir https://${domain}:${caddy_remote_port}{url}
  359. }
  360. https://${domain}:${caddy_remote_port} {
  361. gzip
  362. 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
  363. root ${CADDY_SRV}
  364. }
  365. EOF
  366. break
  367. fi
  368. fi
  369. done
  370. if [[ -n $(lsof -i:80,443 -t) ]]; then
  371. kill -9 "$(lsof -i:80,443 -t)"
  372. fi
  373. docker pull teddysun/caddy:1.0.5 &&
  374. docker run -d --name trojan-panel-caddy --restart always \
  375. --network=trojan-panel-network \
  376. -p 80:80 \
  377. -p ${caddy_remote_port}:${caddy_remote_port} \
  378. -v ${CADDY_Caddyfile}:"/etc/caddy/Caddyfile" \
  379. -v ${CADDY_ACME}:"/root/.caddy/acme/acme-v02.api.letsencrypt.org/sites/" \
  380. -v ${CADDY_SRV}:${CADDY_SRV} \
  381. teddysun/caddy:1.0.5
  382. if [[ -n $(docker ps -q -f "name=^trojan-panel-caddy$") ]]; then
  383. cat >${DOMAIN_FILE} <<EOF
  384. ${domain}
  385. EOF
  386. echo_content skyBlue "---> Caddy安装完成"
  387. else
  388. echo_content red "---> Caddy安装失败"
  389. exit 0
  390. fi
  391. else
  392. domain=$(cat "${DOMAIN_FILE}")
  393. echo_content skyBlue "---> 你已经安装了Caddy"
  394. fi
  395. }
  396. # 安装MariaDB
  397. install_mariadb() {
  398. if [[ -z $(docker ps -q -f "name=^trojan-panel-mariadb$") ]]; then
  399. echo_content green "---> 安装MariaDB"
  400. read -r -p "请输入数据库的端口(默认:9507): " mariadb_port
  401. [[ -z "${mariadb_port}" ]] && mariadb_port=9507
  402. read -r -p "请输入数据库的用户名(默认:root): " mariadb_user
  403. [[ -z "${mariadb_user}" ]] && mariadb_user="root"
  404. while read -r -p "请输入数据库的密码(必填): " mariadb_pas; do
  405. if [[ -z "${mariadb_pas}" ]]; then
  406. echo_content red "密码不能为空"
  407. else
  408. break
  409. fi
  410. done
  411. if [[ "${mariadb_user}" == "root" ]]; then
  412. docker pull mariadb:10.7.3 &&
  413. docker run -d --name trojan-panel-mariadb --restart always \
  414. --network=trojan-panel-network \
  415. -p ${mariadb_port}:3306 \
  416. -v ${MARIA_DATA}:/var/lib/mysql \
  417. -e MYSQL_DATABASE="trojan_panel_db" \
  418. -e MYSQL_ROOT_PASSWORD="${mariadb_pas}" \
  419. -e TZ=Asia/Shanghai \
  420. mariadb:10.7.3
  421. else
  422. docker pull mariadb:10.7.3 &&
  423. docker run -d --name trojan-panel-mariadb --restart always \
  424. --network=trojan-panel-network \
  425. -p ${mariadb_port}:3306 \
  426. -v ${MARIA_DATA}:/var/lib/mysql \
  427. -e MYSQL_DATABASE="trojan_panel_db" \
  428. -e MYSQL_ROOT_PASSWORD="${mariadb_pas}" \
  429. -e MYSQL_USER="${mariadb_user}" \
  430. -e MYSQL_PASSWORD="${mariadb_pas}" \
  431. -e TZ=Asia/Shanghai \
  432. mariadb:10.7.3
  433. fi
  434. if [[ -n $(docker ps -q -f "name=^trojan-panel-mariadb$") ]]; then
  435. echo_content skyBlue "---> MariaDB安装完成"
  436. echo_content yellow "---> MariaDB root的数据库密码(请妥善保存): ${mariadb_pas}"
  437. if [[ "${mariadb_user}" != "root" ]]; then
  438. echo_content yellow "---> MariaDB ${mariadb_user}的数据库密码(请妥善保存): ${mariadb_pas}"
  439. fi
  440. else
  441. echo_content red "---> MariaDB安装失败"
  442. exit 0
  443. fi
  444. else
  445. echo_content skyBlue "---> 你已经安装了MariaDB"
  446. fi
  447. }
  448. # 安装Redis
  449. install_redis() {
  450. if [[ -z $(docker ps -q -f "name=^trojan-panel-redis$") ]]; then
  451. echo_content green "---> 安装Redis"
  452. read -r -p "请输入Redis的端口(默认:6378): " redis_port
  453. [[ -z "${redis_port}" ]] && redis_port=6378
  454. while read -r -p "请输入Redis的密码(必填): " redis_pass; do
  455. if [[ -z "${redis_pass}" ]]; then
  456. echo_content red "密码不能为空"
  457. else
  458. break
  459. fi
  460. done
  461. docker pull redis:6.2.7 &&
  462. docker run -d --name trojan-panel-redis --restart always \
  463. --network=trojan-panel-network \
  464. -p ${redis_port}:6379 \
  465. -v ${REDIS_DATA}:/data redis:6.2.7 \
  466. redis-server --requirepass "${redis_pass}"
  467. if [[ -n $(docker ps -q -f "name=^trojan-panel-redis$") ]]; then
  468. echo_content skyBlue "---> Redis安装完成"
  469. echo_content yellow "---> Redis的数据库密码(请妥善保存): ${redis_pass}"
  470. else
  471. echo_content red "---> Redis安装失败"
  472. exit 0
  473. fi
  474. else
  475. echo_content skyBlue "---> 你已经安装了Redis"
  476. fi
  477. }
  478. # 安装TrojanPanel
  479. install_trojan_panel() {
  480. if [[ -z $(docker ps -q -f "name=^trojan-panel$") ]]; then
  481. echo_content green "---> 安装Trojan Panel"
  482. read -r -p "请输入数据库的IP地址(默认:本机数据库): " mariadb_ip
  483. [[ -z "${mariadb_ip}" ]] && mariadb_ip="trojan-panel-mariadb"
  484. read -r -p "请输入数据库的端口(默认:本机数据库端口): " mariadb_port
  485. [[ -z "${mariadb_port}" ]] && mariadb_port=3306
  486. read -r -p "请输入数据库的用户名(默认:root): " mariadb_user
  487. [[ -z "${mariadb_user}" ]] && mariadb_user="root"
  488. while read -r -p "请输入数据库的密码(必填): " mariadb_pas; do
  489. if [[ -z "${mariadb_pas}" ]]; then
  490. echo_content red "密码不能为空"
  491. else
  492. break
  493. fi
  494. done
  495. if [[ "${mariadb_ip}" == "trojan-panel-mariadb" ]]; then
  496. docker exec trojan-panel-mariadb mysql -p"${mariadb_pas}" -e "drop database trojan_panel_db;" &&
  497. docker exec trojan-panel-mariadb mysql -p"${mariadb_pas}" -e "create database trojan_panel_db;"
  498. else
  499. docker exec trojan-panel-mariadb mysql -h"${mariadb_ip}" -P"${mariadb_port}" -u"${mariadb_user}" -p"${mariadb_pas}" -e "drop database trojan_panel_db;" &>/dev/null &&
  500. docker exec trojan-panel-mariadb mysql -h"${mariadb_ip}" -P"${mariadb_port}" -u"${mariadb_user}" -p"${mariadb_pas}" -e "create database trojan_panel_db;" &>/dev/null
  501. fi
  502. read -r -p "请输入Redis的IP地址(默认:本机Redis): " redis_host
  503. [[ -z "${redis_host}" ]] && redis_host="trojan-panel-redis"
  504. read -r -p "请输入Redis的端口(默认:本机Redis端口): " redis_port
  505. [[ -z "${redis_port}" ]] && redis_port=6379
  506. while read -r -p "请输入Redis的密码(必填): " redis_pass; do
  507. if [[ -z "${redis_pass}" ]]; then
  508. echo_content red "密码不能为空"
  509. else
  510. break
  511. fi
  512. done
  513. if [[ "${mariadb_ip}" == "trojan-panel-redis" ]]; then
  514. docker exec trojan-panel-redis redis-cli -a "${redis_pass}" -e "flushall" &>/dev/null
  515. else
  516. docker exec trojan-panel-redis redis-cli -h "${redis_host}" -p ${redis_port} -a "${redis_pass}" -e "flushall" &>/dev/null
  517. fi
  518. docker pull jonssonyan/trojan-panel &&
  519. docker run -d --name trojan-panel --restart always \
  520. --network=trojan-panel-network \
  521. -p 8081:8081 \
  522. -v ${CADDY_SRV}:${TROJAN_PANEL_WEBFILE} \
  523. -v ${TROJAN_PANEL_LOGS}:${TROJAN_PANEL_LOGS} \
  524. -v /etc/localtime:/etc/localtime \
  525. -e "mariadb_ip=${mariadb_ip}" \
  526. -e "mariadb_port=${mariadb_port}" \
  527. -e "mariadb_user=${mariadb_user}" \
  528. -e "mariadb_pas=${mariadb_pas}" \
  529. -e "redis_host=${redis_host}" \
  530. -e "redis_port=${redis_port}" \
  531. -e "redis_pass=${redis_pass}" \
  532. jonssonyan/trojan-panel
  533. if [[ -n $(docker ps -q -f "name=^trojan-panel$") ]]; then
  534. echo_content skyBlue "---> Trojan Panel后端安装完成"
  535. else
  536. echo_content red "---> Trojan Panel后端安装失败"
  537. exit 0
  538. fi
  539. else
  540. echo_content skyBlue "---> 你已经安装了Trojan Panel"
  541. fi
  542. if [[ -z $(docker ps -q -f "name=^trojan-panel-ui$") ]]; then
  543. # 配置Nginx
  544. cat >${NGINX_CONFIG} <<-EOF
  545. server {
  546. listen 80;
  547. listen 443 ssl;
  548. server_name localhost;
  549. #强制ssl
  550. ssl on;
  551. ssl_certificate ${CADDY_ACME}${domain}/${domain}.crt;
  552. ssl_certificate_key ${CADDY_ACME}${domain}/${domain}.key;
  553. #缓存有效期
  554. ssl_session_timeout 5m;
  555. #安全链接可选的加密协议
  556. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  557. #加密算法
  558. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  559. #使用服务器端的首选算法
  560. ssl_prefer_server_ciphers on;
  561. #access_log /var/log/nginx/host.access.log main;
  562. location / {
  563. root ${TROJAN_PANEL_UI_DATA};
  564. index index.html index.htm;
  565. }
  566. location /api {
  567. proxy_pass http://trojan-panel:8081;
  568. }
  569. #error_page 404 /404.html;
  570. #497 http->https
  571. error_page 497 https://\$host:8888\$uri?\$args;
  572. # redirect server error pages to the static page /50x.html
  573. #
  574. error_page 500 502 503 504 /50x.html;
  575. location = /50x.html {
  576. root /usr/share/nginx/html;
  577. }
  578. }
  579. EOF
  580. docker pull jonssonyan/trojan-panel-ui &&
  581. docker run -d --name trojan-panel-ui --restart always \
  582. --network=trojan-panel-network \
  583. -p 8888:80 \
  584. -v ${NGINX_CONFIG}:/etc/nginx/conf.d/default.conf \
  585. -v ${CADDY_ACME}"${domain}":${CADDY_ACME}"${domain}" \
  586. jonssonyan/trojan-panel-ui
  587. if [[ -n $(docker ps -q -f "name=^trojan-panel-ui$") ]]; then
  588. echo_content skyBlue "---> Trojan Panel前端安装完成"
  589. else
  590. echo_content red "---> Trojan Panel前端安装失败"
  591. exit 0
  592. fi
  593. else
  594. echo_content skyBlue "---> 你已经安装了Trojan Panel UI"
  595. fi
  596. echo_content red "\n=============================================================="
  597. echo_content skyBlue "Trojan Panel 安装成功"
  598. echo_content yellow "MariaDB ${mariadb_user}的密码(请妥善保存): ${mariadb_pas}"
  599. echo_content yellow "Redis的密码(请妥善保存): ${redis_pass}"
  600. echo_content yellow "管理面板地址: https://${domain}:8888"
  601. echo_content yellow "系统管理员 默认用户名: sysadmin 默认密码: 123456 请及时登陆管理面板修改密码"
  602. echo_content yellow "Trojan Panel私钥和证书目录: ${CADDY_ACME}${domain}/"
  603. echo_content red "\n=============================================================="
  604. }
  605. install_trojan_panel_core() {
  606. if [[ -z $(docker ps -q -f "name=^trojan-panel-core$") ]]; then
  607. echo_content green "---> 安装Trojan Panel Core"
  608. read -r -p "请输入数据库的IP地址(默认:本机数据库): " mariadb_ip
  609. [[ -z "${mariadb_ip}" ]] && mariadb_ip="trojan-panel-mariadb"
  610. read -r -p "请输入数据库的端口(默认:本机数据库端口): " mariadb_port
  611. [[ -z "${mariadb_port}" ]] && mariadb_port=3306
  612. read -r -p "请输入数据库的用户名(默认:root): " mariadb_user
  613. [[ -z "${mariadb_user}" ]] && mariadb_user="root"
  614. while read -r -p "请输入数据库的密码(必填): " mariadb_pas; do
  615. if [[ -z "${mariadb_pas}" ]]; then
  616. echo_content red "密码不能为空"
  617. else
  618. break
  619. fi
  620. done
  621. read -r -p "请输入数据库名称(默认:trojan_panel_db): " database
  622. [[ -z "${database}" ]] && database="trojan_panel_db"
  623. read -r -p "请输入数据库的用户表名称(默认:account): " account_table
  624. [[ -z "${account_table}" ]] && account_table="account"
  625. read -r -p "请输入Redis的IP地址(默认:本机Redis): " redis_host
  626. [[ -z "${redis_host}" ]] && redis_host="trojan-panel-redis"
  627. read -r -p "请输入Redis的端口(默认:本机Redis端口): " redis_port
  628. [[ -z "${redis_port}" ]] && redis_port=6379
  629. while read -r -p "请输入Redis的密码(必填): " redis_pass; do
  630. if [[ -z "${redis_pass}" ]]; then
  631. echo_content red "密码不能为空"
  632. else
  633. break
  634. fi
  635. done
  636. domain=$(cat "${DOMAIN_FILE}")
  637. docker pull jonssonyan/trojan-panel-core &&
  638. docker run -d --name trojan-panel-core --restart always \
  639. --network=trojan-panel-network \
  640. -p 443:443 \
  641. -p 8100:8100 \
  642. -v ${TROJAN_PANEL_CORE_LOGS}:${TROJAN_PANEL_CORE_LOGS} \
  643. -v /etc/localtime:/etc/localtime \
  644. -v ${CADDY_ACME}:${CADDY_ACME} \
  645. -e "mariadb_ip=${mariadb_ip}" \
  646. -e "mariadb_port=${mariadb_port}" \
  647. -e "mariadb_user=${mariadb_user}" \
  648. -e "mariadb_pas=${mariadb_pas}" \
  649. -e "database=${database}" \
  650. -e "account-table=${account_table}" \
  651. -e "redis_host=${redis_host}" \
  652. -e "redis_port=${redis_port}" \
  653. -e "redis_pass=${redis_pass}" \
  654. -e "crt_path=${CADDY_ACME}${domain}/${domain}.crt" \
  655. -e "key_path=${CADDY_ACME}${domain}/${domain}.key" \
  656. jonssonyan/trojan-panel-core
  657. if [[ -n $(docker ps -q -f "name=^trojan-panel-core$") ]]; then
  658. echo_content skyBlue "---> Trojan Panel Core安装完成"
  659. else
  660. echo_content red "---> Trojan Panel Core后端安装失败"
  661. exit 0
  662. fi
  663. else
  664. echo_content skyBlue "---> 你已经安装了Trojan Panel Core"
  665. fi
  666. }
  667. # 安装TrojanGFW 数据库版
  668. install_trojan_gfw() {
  669. if [[ -z $(docker ps -q -f "name=^trojan-panel-trojanGFW$") ]]; then
  670. echo_content green "---> 安装TrojanGFW"
  671. read -r -p "请输入TrojanGFW的端口(默认:443): " trojanGFW_port
  672. [[ -z "${trojanGFW_port}" ]] && trojanGFW_port=443
  673. read -r -p "请输入数据库的IP地址(默认:本机数据库): " mariadb_ip
  674. [[ -z "${mariadb_ip}" ]] && mariadb_ip="trojan-panel-mariadb"
  675. read -r -p "请输入数据库的端口(默认:本机数据库端口): " mariadb_port
  676. [[ -z "${mariadb_port}" ]] && mariadb_port=3306
  677. read -r -p "请输入数据库的用户名(默认:root): " mariadb_user
  678. [[ -z "${mariadb_user}" ]] && mariadb_user="root"
  679. while read -r -p "请输入数据库的密码(必填): " mariadb_pas; do
  680. if [[ -z "${mariadb_pas}" ]]; then
  681. echo_content red "密码不能为空"
  682. else
  683. break
  684. fi
  685. done
  686. cat >${TROJANGFW_CONFIG} <<EOF
  687. {
  688. "run_type": "server",
  689. "local_addr": "0.0.0.0",
  690. "local_port": ${trojanGFW_port},
  691. "remote_addr": "${remote_addr}",
  692. "remote_port": 80,
  693. "password": [],
  694. "log_level": 1,
  695. "ssl": {
  696. "cert": "${CADDY_ACME}${domain}/${domain}.crt",
  697. "key": "${CADDY_ACME}${domain}/${domain}.key",
  698. "key_password": "",
  699. "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",
  700. "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
  701. "prefer_server_cipher": true,
  702. "alpn": [
  703. "http/1.1"
  704. ],
  705. "alpn_port_override": {
  706. "h2": 81
  707. },
  708. "reuse_session": true,
  709. "session_ticket": false,
  710. "session_timeout": 600,
  711. "plain_http_response": "",
  712. "curves": "",
  713. "dhparam": ""
  714. },
  715. "tcp": {
  716. "prefer_ipv4": false,
  717. "no_delay": true,
  718. "keep_alive": true,
  719. "reuse_port": false,
  720. "fast_open": false,
  721. "fast_open_qlen": 20
  722. },
  723. "mysql": {
  724. "enabled": true,
  725. "server_addr": "${mariadb_ip}",
  726. "server_port": ${mariadb_port},
  727. "database": "trojan_panel_db",
  728. "username": "${mariadb_user}",
  729. "password": "${mariadb_pas}",
  730. "key": "",
  731. "cert": "",
  732. "ca": ""
  733. }
  734. }
  735. EOF
  736. docker pull trojangfw/trojan &&
  737. docker run -d --name trojan-panel-trojanGFW --restart always \
  738. --network=trojan-panel-network \
  739. -p ${trojanGFW_port}:${trojanGFW_port} \
  740. -v ${TROJANGFW_CONFIG}:"/config/config.json" \
  741. -v ${CADDY_ACME}:${CADDY_ACME} \
  742. trojangfw/trojan
  743. if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGFW$") ]]; then
  744. echo_content skyBlue "---> TrojanGFW 数据库版 安装完成"
  745. echo_content red "\n=============================================================="
  746. echo_content skyBlue "TrojanGFW+Caddy+Web+TLS节点 数据库版 安装成功"
  747. echo_content yellow "域名: ${domain}"
  748. echo_content yellow "TrojanGFW的端口: ${trojanGFW_port}"
  749. echo_content yellow "TrojanGFW的密码: 用户名&密码"
  750. echo_content red "\n=============================================================="
  751. else
  752. echo_content red "---> TrojanGFW 数据库版 安装失败"
  753. exit 0
  754. fi
  755. else
  756. echo_content skyBlue "---> 你已经安装了TrojanGFW 数据库版"
  757. fi
  758. }
  759. # 安装TrojanGFW 单机版
  760. install_trojan_gfw_standalone() {
  761. if [[ -z $(docker ps -q -f "name=^trojan-panel-trojanGFW-standalone$") ]]; then
  762. echo_content green "---> 安装TrojanGFW"
  763. read -r -p "请输入TrojanGFW的端口(默认:443): " trojanGFW_port
  764. [[ -n ${trojanGFW_port} ]] && trojanGFW_port=443
  765. while read -r -p "请输入TrojanGFW的密码(必填): " trojan_pas; do
  766. if [[ -z "${trojan_pas}" ]]; then
  767. echo_content red "密码不能为空"
  768. else
  769. break
  770. fi
  771. done
  772. cat >${TROJANGFW_STANDALONE_CONFIG} <<EOF
  773. {
  774. "run_type": "server",
  775. "local_addr": "0.0.0.0",
  776. "local_port": ${trojanGFW_port},
  777. "remote_addr": "${remote_addr}",
  778. "remote_port": 80,
  779. "password": [
  780. "${trojan_pas}"
  781. ],
  782. "log_level": 1,
  783. "ssl": {
  784. "cert": "${CADDY_ACME}${domain}/${domain}.crt",
  785. "key": "${CADDY_ACME}${domain}/${domain}.key",
  786. "key_password": "",
  787. "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",
  788. "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
  789. "prefer_server_cipher": true,
  790. "alpn": [
  791. "http/1.1"
  792. ],
  793. "alpn_port_override": {
  794. "h2": 81
  795. },
  796. "reuse_session": true,
  797. "session_ticket": false,
  798. "session_timeout": 600,
  799. "plain_http_response": "",
  800. "curves": "",
  801. "dhparam": ""
  802. },
  803. "tcp": {
  804. "prefer_ipv4": false,
  805. "no_delay": true,
  806. "keep_alive": true,
  807. "reuse_port": false,
  808. "fast_open": false,
  809. "fast_open_qlen": 20
  810. },
  811. "mysql": {
  812. "enabled": false,
  813. "server_addr": "127.0.0.1",
  814. "server_port": 3306,
  815. "database": "",
  816. "username": "",
  817. "password": "",
  818. "key": "",
  819. "cert": "",
  820. "ca": ""
  821. }
  822. }
  823. EOF
  824. docker pull trojangfw/trojan &&
  825. docker run -d --name trojan-panel-trojanGFW-standalone --restart always \
  826. --network=trojan-panel-network \
  827. -p ${trojanGFW_port}:${trojanGFW_port} \
  828. -v ${TROJANGFW_STANDALONE_CONFIG}:"/config/config.json" \
  829. -v ${CADDY_ACME}:${CADDY_ACME} \
  830. trojangfw/trojan
  831. if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGFW-standalone$") ]]; then
  832. echo_content skyBlue "---> TrojanGFW 单机版 安装完成"
  833. echo_content red "\n=============================================================="
  834. echo_content skyBlue "TrojanGFW+Caddy+Web+TLS节点 单机版 安装成功"
  835. echo_content yellow "域名: ${domain}"
  836. echo_content yellow "TrojanGFW的端口: ${trojanGFW_port}"
  837. echo_content yellow "TrojanGFW的密码: ${trojan_pas}"
  838. echo_content red "\n=============================================================="
  839. else
  840. echo_content red "---> TrojanGFW 单机版 安装失败"
  841. exit 0
  842. fi
  843. else
  844. echo_content skyBlue "---> 你已经安装了TrojanGFW 单机版"
  845. fi
  846. }
  847. # 安装TrojanGO 数据库版
  848. install_trojanGO() {
  849. if [[ -z $(docker ps -q -f "name=^trojan-panel-trojanGO$") ]]; then
  850. echo_content green "---> 安装TrojanGO 数据库版"
  851. read -r -p "请输入TrojanGO的端口(默认:443): " trojanGO_port
  852. [[ -z "${trojanGO_port}" ]] && trojanGO_port=443
  853. read -r -p "请输入数据库的IP地址(默认:本机数据库): " mariadb_ip
  854. [[ -z "${mariadb_ip}" ]] && mariadb_ip="trojan-panel-mariadb"
  855. read -r -p "请输入数据库的端口(默认:本机数据库端口): " mariadb_port
  856. [[ -z "${mariadb_port}" ]] && mariadb_port=3306
  857. read -r -p "请输入数据库的用户名(默认:root): " mariadb_user
  858. [[ -z "${mariadb_user}" ]] && mariadb_user="root"
  859. while read -r -p "请输入数据库的密码(必填): " mariadb_pas; do
  860. if [[ -z "${mariadb_pas}" ]]; then
  861. echo_content red "密码不能为空"
  862. else
  863. break
  864. fi
  865. done
  866. while read -r -p "是否开启多路复用?(false/关闭 true/开启 默认:true/开启): " trojanGO_mux_enable; do
  867. if [[ -z "${trojanGO_mux_enable}" || ${trojanGO_mux_enable} == true ]]; then
  868. trojanGO_mux_enable=true
  869. break
  870. else
  871. if [[ ${trojanGO_mux_enable} != false ]]; then
  872. echo_content red "不可以输入除false和true之外的其他字符"
  873. else
  874. break
  875. fi
  876. fi
  877. done
  878. while read -r -p "是否开启Websocket?(false/关闭 true/开启 默认:false/关闭): " trojanGO_websocket_enable; do
  879. if [[ -z "${trojanGO_websocket_enable}" || ${trojanGO_websocket_enable} == false ]]; then
  880. trojanGO_websocket_enable=false
  881. break
  882. else
  883. if [[ ${trojanGO_websocket_enable} != true ]]; then
  884. echo_content red "不可以输入除false和true之外的其他字符"
  885. else
  886. read -r -p "请输入Websocket路径(默认:trojan-panel-websocket-path): " trojanGO_websocket_path
  887. [[ -z "${trojanGO_websocket_path}" ]] && trojanGO_websocket_path="trojan-panel-websocket-path"
  888. break
  889. fi
  890. fi
  891. done
  892. while read -r -p "是否启用Shadowsocks AEAD加密?(false/关闭 true/开启 默认:false/关闭): " trojanGO_shadowsocks_enable; do
  893. if [[ -z "${trojanGO_shadowsocks_enable}" || ${trojanGO_shadowsocks_enable} == false ]]; then
  894. trojanGO_shadowsocks_enable=false
  895. break
  896. else
  897. if [[ ${trojanGO_shadowsocks_enable} != true ]]; then
  898. echo_content yellow "不可以输入除false和true之外的其他字符"
  899. else
  900. echo_content skyBlue "Shadowsocks AEAD加密方式如下:"
  901. echo_content yellow "1. AES-128-GCM(默认)"
  902. echo_content yellow "2. CHACHA20-IETF-POLY1305"
  903. echo_content yellow "3. AES-256-GCM"
  904. read -r -p "请输入Shadowsocks AEAD加密方式(默认:1): " select_method_type
  905. [[ -z "${select_method_type}" ]] && select_method_type=1
  906. case ${select_method_type} in
  907. 1)
  908. trojanGO_shadowsocks_method="AES-128-GCM"
  909. ;;
  910. 2)
  911. trojanGO_shadowsocks_method="CHACHA20-IETF-POLY1305"
  912. ;;
  913. 3)
  914. trojanGO_shadowsocks_method="AES-256-GCM"
  915. ;;
  916. *)
  917. trojanGO_shadowsocks_method="AES-128-GCM"
  918. ;;
  919. esac
  920. while read -r -p "请输入Shadowsocks AEAD加密密码(必填): " trojanGO_shadowsocks_password; do
  921. if [[ -z "${trojanGO_shadowsocks_password}" ]]; then
  922. echo_content red "密码不能为空"
  923. else
  924. break
  925. fi
  926. done
  927. break
  928. fi
  929. fi
  930. done
  931. cat >${TROJANGO_CONFIG} <<EOF
  932. {
  933. "run_type": "server",
  934. "local_addr": "0.0.0.0",
  935. "local_port": ${trojanGO_port},
  936. "remote_addr": "${remote_addr}",
  937. "remote_port": 80,
  938. "log_level": 1,
  939. "log_file": "",
  940. "password": [],
  941. "disable_http_check": false,
  942. "udp_timeout": 60,
  943. "ssl": {
  944. "verify": true,
  945. "verify_hostname": true,
  946. "cert": "${CADDY_ACME}${domain}/${domain}.crt",
  947. "key": "${CADDY_ACME}${domain}/${domain}.key",
  948. "key_password": "",
  949. "cipher": "",
  950. "curves": "",
  951. "prefer_server_cipher": false,
  952. "sni": "",
  953. "alpn": [
  954. "http/1.1"
  955. ],
  956. "session_ticket": true,
  957. "reuse_session": true,
  958. "plain_http_response": "",
  959. "fallback_addr": "",
  960. "fallback_port": 80,
  961. "fingerprint": ""
  962. },
  963. "tcp": {
  964. "no_delay": true,
  965. "keep_alive": true,
  966. "prefer_ipv4": false
  967. },
  968. "mux": {
  969. "enabled": ${trojanGO_mux_enable},
  970. "concurrency": 8,
  971. "idle_timeout": 60
  972. },
  973. "websocket": {
  974. "enabled": ${trojanGO_websocket_enable},
  975. "path": "/${trojanGO_websocket_path}",
  976. "host": "${domain}"
  977. },
  978. "shadowsocks": {
  979. "enabled": ${trojanGO_shadowsocks_enable},
  980. "method": "${trojanGO_shadowsocks_method}",
  981. "password": "${trojanGO_shadowsocks_password}"
  982. },
  983. "mysql": {
  984. "enabled": true,
  985. "server_addr": "${mariadb_ip}",
  986. "server_port": ${mariadb_port},
  987. "database": "trojan_panel_db",
  988. "username": "${mariadb_user}",
  989. "password": "${mariadb_pas}",
  990. "check_rate": 60
  991. }
  992. }
  993. EOF
  994. docker pull p4gefau1t/trojan-go &&
  995. docker run -d --name trojan-panel-trojanGO --restart=always \
  996. --network=trojan-panel-network \
  997. -p ${trojanGO_port}:${trojanGO_port} \
  998. -v ${TROJANGO_CONFIG}:"/etc/trojan-go/config.json" \
  999. -v ${CADDY_ACME}:${CADDY_ACME} \
  1000. p4gefau1t/trojan-go
  1001. if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGO$") ]]; then
  1002. echo_content skyBlue "---> TrojanGO 数据库版 安装完成"
  1003. echo_content red "\n=============================================================="
  1004. echo_content skyBlue "TrojanGO+Caddy+Web+TLS+Websocket节点 数据库版 安装成功"
  1005. echo_content yellow "域名: ${domain}"
  1006. echo_content yellow "TrojanGO的端口: ${trojanGO_port}"
  1007. echo_content yellow "TrojanGO的密码: 用户名&密码"
  1008. echo_content yellow "TrojanGO私钥和证书目录: ${CADDY_ACME}${domain}/"
  1009. if [[ ${trojanGO_websocket_enable} == true ]]; then
  1010. echo_content yellow "Websocket路径: ${trojanGO_websocket_path}"
  1011. fi
  1012. if [[ ${trojanGO_shadowsocks_enable} == true ]]; then
  1013. echo_content yellow "Shadowsocks AEAD加密方式: ${trojanGO_shadowsocks_method}"
  1014. echo_content yellow "Shadowsocks AEAD加密密码: ${trojanGO_shadowsocks_password}"
  1015. fi
  1016. echo_content red "\n=============================================================="
  1017. else
  1018. echo_content red "---> TrojanGO 数据库版 安装失败"
  1019. exit 0
  1020. fi
  1021. else
  1022. echo_content skyBlue "---> 你已经安装了TrojanGO 数据库版"
  1023. fi
  1024. }
  1025. # 安装TrojanGO 单机版
  1026. install_trojanGO_standalone() {
  1027. if [[ -z $(docker ps -q -f "name=^trojan-panel-trojanGO-standalone$") ]]; then
  1028. echo_content green "---> 安装TrojanGO 单机版"
  1029. read -r -p "请输入TrojanGO的端口(默认:443): " trojanGO_port
  1030. [[ -z "${trojanGO_port}" ]] && trojanGO_port=443
  1031. while read -r -p "请输入TrojanGO的密码(必填): " trojan_pas; do
  1032. if [[ -z "${trojan_pas}" ]]; then
  1033. echo_content red "密码不能为空"
  1034. else
  1035. break
  1036. fi
  1037. done
  1038. while read -r -p "是否开启多路复用?(false/关闭 true/开启 默认:true/开启): " trojanGO_mux_enable; do
  1039. if [[ -z "${trojanGO_mux_enable}" || ${trojanGO_mux_enable} == true ]]; then
  1040. trojanGO_mux_enable=true
  1041. break
  1042. else
  1043. if [[ ${trojanGO_mux_enable} != false ]]; then
  1044. echo_content red "不可以输入除false和true之外的其他字符"
  1045. else
  1046. break
  1047. fi
  1048. fi
  1049. done
  1050. while read -r -p "是否开启Websocket?(false/关闭 true/开启 默认:false/关闭): " trojanGO_websocket_enable; do
  1051. if [[ -z "${trojanGO_websocket_enable}" || ${trojanGO_websocket_enable} == false ]]; then
  1052. trojanGO_websocket_enable=false
  1053. break
  1054. else
  1055. if [[ ${trojanGO_websocket_enable} != true ]]; then
  1056. echo_content red "不可以输入除false和true之外的其他字符"
  1057. else
  1058. read -r -p "请输入Websocket路径(默认:trojan-panel-websocket-path): " trojanGO_websocket_path
  1059. [[ -z "${trojanGO_websocket_path}" ]] && trojanGO_websocket_path="trojan-panel-websocket-path"
  1060. break
  1061. fi
  1062. fi
  1063. done
  1064. while read -r -p "是否启用Shadowsocks AEAD加密?(false/关闭 true/开启 默认:false/关闭): " trojanGO_shadowsocks_enable; do
  1065. if [[ -z "${trojanGO_shadowsocks_enable}" || ${trojanGO_shadowsocks_enable} == false ]]; then
  1066. trojanGO_shadowsocks_enable=false
  1067. break
  1068. else
  1069. if [[ ${trojanGO_shadowsocks_enable} != true ]]; then
  1070. echo_content yellow "不可以输入除false和true之外的其他字符"
  1071. else
  1072. echo_content skyBlue "Shadowsocks AEAD加密方式如下:"
  1073. echo_content yellow "1. AES-128-GCM(默认)"
  1074. echo_content yellow "2. CHACHA20-IETF-POLY1305"
  1075. echo_content yellow "3. AES-256-GCM"
  1076. read -r -p "请输入Shadowsocks AEAD加密方式(默认:1): " select_method_type
  1077. [[ -z "${select_method_type}" ]] && select_method_type=1
  1078. case ${select_method_type} in
  1079. 1)
  1080. trojanGO_shadowsocks_method="AES-128-GCM"
  1081. ;;
  1082. 2)
  1083. trojanGO_shadowsocks_method="CHACHA20-IETF-POLY1305"
  1084. ;;
  1085. 3)
  1086. trojanGO_shadowsocks_method="AES-256-GCM"
  1087. ;;
  1088. *)
  1089. trojanGO_shadowsocks_method="AES-128-GCM"
  1090. ;;
  1091. esac
  1092. while read -r -p "请输入Shadowsocks AEAD加密密码(必填): " trojanGO_shadowsocks_password; do
  1093. if [[ -z "${trojanGO_shadowsocks_password}" ]]; then
  1094. echo_content red "密码不能为空"
  1095. else
  1096. break
  1097. fi
  1098. done
  1099. break
  1100. fi
  1101. fi
  1102. done
  1103. cat >${TROJANGO_STANDALONE_CONFIG} <<EOF
  1104. {
  1105. "run_type": "server",
  1106. "local_addr": "0.0.0.0",
  1107. "local_port": ${trojanGO_port},
  1108. "remote_addr": "${remote_addr}",
  1109. "remote_port": 80,
  1110. "log_level": 1,
  1111. "log_file": "",
  1112. "password": [
  1113. "${trojan_pas}"
  1114. ],
  1115. "disable_http_check": false,
  1116. "udp_timeout": 60,
  1117. "ssl": {
  1118. "verify": true,
  1119. "verify_hostname": true,
  1120. "cert": "${CADDY_ACME}${domain}/${domain}.crt",
  1121. "key": "${CADDY_ACME}${domain}/${domain}.key",
  1122. "key_password": "",
  1123. "cipher": "",
  1124. "curves": "",
  1125. "prefer_server_cipher": false,
  1126. "sni": "",
  1127. "alpn": [
  1128. "http/1.1"
  1129. ],
  1130. "session_ticket": true,
  1131. "reuse_session": true,
  1132. "plain_http_response": "",
  1133. "fallback_addr": "",
  1134. "fallback_port": 80,
  1135. "fingerprint": ""
  1136. },
  1137. "tcp": {
  1138. "no_delay": true,
  1139. "keep_alive": true,
  1140. "prefer_ipv4": false
  1141. },
  1142. "mux": {
  1143. "enabled": ${trojanGO_mux_enable},
  1144. "concurrency": 8,
  1145. "idle_timeout": 60
  1146. },
  1147. "websocket": {
  1148. "enabled": ${trojanGO_websocket_enable},
  1149. "path": "/${trojanGO_websocket_path}",
  1150. "host": "${domain}"
  1151. },
  1152. "shadowsocks": {
  1153. "enabled": ${trojanGO_shadowsocks_enable},
  1154. "method": "${trojanGO_shadowsocks_method}",
  1155. "password": "${trojanGO_shadowsocks_password}"
  1156. },
  1157. "mysql": {
  1158. "enabled": false,
  1159. "server_addr": "localhost",
  1160. "server_port": 3306,
  1161. "database": "",
  1162. "username": "",
  1163. "password": "",
  1164. "check_rate": 60
  1165. }
  1166. }
  1167. EOF
  1168. docker pull p4gefau1t/trojan-go &&
  1169. docker run -d --name trojan-panel-trojanGO-standalone --restart=always \
  1170. --network=trojan-panel-network \
  1171. -p ${trojanGO_port}:${trojanGO_port} \
  1172. -v ${TROJANGO_STANDALONE_CONFIG}:"/etc/trojan-go/config.json" \
  1173. -v ${CADDY_ACME}:${CADDY_ACME} \
  1174. p4gefau1t/trojan-go
  1175. if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGO-standalone$") ]]; then
  1176. echo_content skyBlue "---> TrojanGO 单机版 安装完成"
  1177. echo_content red "\n=============================================================="
  1178. echo_content skyBlue "TrojanGO+Caddy+Web+TLS+Websocket节点 单机版 安装成功"
  1179. echo_content yellow "域名: ${domain}"
  1180. echo_content yellow "TrojanGO的端口: ${trojanGO_port}"
  1181. echo_content yellow "TrojanGO的密码: ${trojan_pas}"
  1182. echo_content yellow "TrojanGO私钥和证书目录: ${CADDY_ACME}${domain}/"
  1183. if [[ ${trojanGO_websocket_enable} == true ]]; then
  1184. echo_content yellow "Websocket路径: ${trojanGO_websocket_path}"
  1185. fi
  1186. if [[ ${trojanGO_shadowsocks_enable} == true ]]; then
  1187. echo_content yellow "Shadowsocks AEAD加密方式: ${trojanGO_shadowsocks_method}"
  1188. echo_content yellow "Shadowsocks AEAD加密密码: ${trojanGO_shadowsocks_password}"
  1189. fi
  1190. echo_content red "\n=============================================================="
  1191. else
  1192. echo_content red "---> TrojanGO 单机版 安装失败"
  1193. exit 0
  1194. fi
  1195. else
  1196. echo_content skyBlue "---> 你已经了安装了TrojanGO 单机版"
  1197. fi
  1198. }
  1199. install_hysteria() {
  1200. if [[ -z $(docker ps -q -f "name=^trojan-panel-hysteria$") ]]; then
  1201. echo_content green "---> 安装Hysteria 数据库版"
  1202. echo_content skyBlue "Hysteria的模式如下:"
  1203. echo_content yellow "1. udp(默认)"
  1204. echo_content yellow "2. faketcp"
  1205. read -r -p "请输入Hysteria的模式(默认:1): " selectProtocolType
  1206. [[ -z "${selectProtocolType}" ]] && selectProtocolType=1
  1207. case ${selectProtocolType} in
  1208. 1)
  1209. hysteria_protocol="udp"
  1210. ;;
  1211. 2)
  1212. hysteria_protocol="faketcp"
  1213. ;;
  1214. *)
  1215. hysteria_protocol="udp"
  1216. ;;
  1217. esac
  1218. read -r -p "请输入Hysteria的端口(默认:443): " hysteria_port
  1219. [[ -z "${hysteria_port}" ]] && hysteria_port=443
  1220. read -r -p "请输入单客户端最大上传速度/Mbps(默认:100): " hysteria_up_mbps
  1221. [[ -z "${hysteria_up_mbps}" ]] && hysteria_up_mbps=100
  1222. read -r -p "请输入单客户端最大下载速度/Mbps(默认:100): " hysteria_down_mbps
  1223. [[ -z "${hysteria_down_mbps}" ]] && hysteria_down_mbps=100
  1224. read -r -p "请输入Trojan Panel的域名(默认:本机): " trojan_panel_url
  1225. [[ -z "${trojan_panel_url}" ]] && trojan_panel_url=${domain}
  1226. cat >${HYSTERIA_CONFIG} <<EOF
  1227. {
  1228. "listen": ":${hysteria_port}",
  1229. "protocol": "${hysteria_protocol}",
  1230. "cert": "${CADDY_ACME}${domain}/${domain}.crt",
  1231. "key": "${CADDY_ACME}${domain}/${domain}.key",
  1232. "up_mbps": ${hysteria_up_mbps},
  1233. "down_mbps": ${hysteria_down_mbps},
  1234. "auth": {
  1235. "mode": "external",
  1236. "config": {
  1237. "http": "https://${trojan_panel_url}:8888/api/auth/hysteria"
  1238. }
  1239. },
  1240. "prometheus_listen": ":8801"
  1241. }
  1242. EOF
  1243. docker pull tobyxdd/hysteria &&
  1244. docker run -d --name trojan-panel-hysteria --restart=always \
  1245. --network=trojan-panel-network \
  1246. -p ${hysteria_port}:${hysteria_port}/udp \
  1247. -p 8801:8801 \
  1248. -v ${HYSTERIA_CONFIG}:/etc/hysteria.json \
  1249. -v ${CADDY_ACME}:${CADDY_ACME} \
  1250. tobyxdd/hysteria -c /etc/hysteria.json server
  1251. if [[ -n $(docker ps -q -f "name=^trojan-panel-hysteria$") ]]; then
  1252. echo_content skyBlue "---> Hysteria 数据版 安装完成"
  1253. echo_content red "\n=============================================================="
  1254. echo_content skyBlue "Hysteria节点 数据版 安装成功"
  1255. echo_content yellow "域名: ${domain}"
  1256. echo_content yellow "Hysteria的端口: ${hysteria_port}"
  1257. echo_content yellow "Hysteria的密码: 用户名&密码"
  1258. echo_content yellow "Hysteria私钥和证书目录: ${CADDY_ACME}${domain}/"
  1259. echo_content red "\n=============================================================="
  1260. else
  1261. echo_content red "---> Hysteria 数据版 安装失败"
  1262. exit 0
  1263. fi
  1264. else
  1265. echo_content skyBlue "---> 你已经安装了Hysteria 数据版"
  1266. fi
  1267. }
  1268. install_hysteria_standalone() {
  1269. if [[ -z $(docker ps -q -f "name=^trojan-panel-hysteria-standalone$") ]]; then
  1270. echo_content green "---> 安装Hysteria 单机版"
  1271. echo_content skyBlue "Hysteria的模式如下:"
  1272. echo_content yellow "1. udp(默认)"
  1273. echo_content yellow "2. faketcp"
  1274. read -r -p "请输入Hysteria的模式(默认:1): " selectProtocolType
  1275. [[ -z "${selectProtocolType}" ]] && selectProtocolType=1
  1276. case ${selectProtocolType} in
  1277. 1)
  1278. hysteria_protocol="udp"
  1279. ;;
  1280. 2)
  1281. hysteria_protocol="faketcp"
  1282. ;;
  1283. *)
  1284. hysteria_protocol="udp"
  1285. ;;
  1286. esac
  1287. read -r -p "请输入Hysteria的端口(默认:443): " hysteria_port
  1288. [[ -z ${hysteria_port} ]] && hysteria_port=443
  1289. read -r -p "请输入单客户端最大上传速度/Mbps(默认:100): " hysteria_up_mbps
  1290. [[ -z "${hysteria_up_mbps}" ]] && hysteria_up_mbps=100
  1291. read -r -p "请输入单客户端最大下载速度/Mbps(默认:100): " hysteria_down_mbps
  1292. [[ -z "${hysteria_down_mbps}" ]] && hysteria_down_mbps=100
  1293. while read -r -p "请输入Hysteria的密码(必填): " hysteria_password; do
  1294. if [[ -z ${hysteria_password} ]]; then
  1295. echo_content red "密码不能为空"
  1296. else
  1297. break
  1298. fi
  1299. done
  1300. cat >${HYSTERIA_STANDALONE_CONFIG} <<EOF
  1301. {
  1302. "listen": ":${hysteria_port}",
  1303. "protocol": "${hysteria_protocol}",
  1304. "cert": "${CADDY_ACME}${domain}/${domain}.crt",
  1305. "key": "${CADDY_ACME}${domain}/${domain}.key",
  1306. "up_mbps": ${hysteria_up_mbps},
  1307. "down_mbps": ${hysteria_down_mbps},
  1308. "obfs": "${hysteria_password}"
  1309. }
  1310. EOF
  1311. docker pull tobyxdd/hysteria &&
  1312. docker run -d --name trojan-panel-hysteria-standalone --restart=always \
  1313. --network=trojan-panel-network \
  1314. -p ${hysteria_port}:${hysteria_port}/udp \
  1315. -v ${HYSTERIA_STANDALONE_CONFIG}:/etc/hysteria.json \
  1316. -v ${CADDY_ACME}:${CADDY_ACME} \
  1317. tobyxdd/hysteria -c /etc/hysteria.json server
  1318. if [[ -n $(docker ps -q -f "name=^trojan-panel-hysteria-standalone$") ]]; then
  1319. echo_content skyBlue "---> Hysteria 单机版 安装完成"
  1320. echo_content red "\n=============================================================="
  1321. echo_content skyBlue "Hysteria节点 单机版 安装成功"
  1322. echo_content yellow "域名: ${domain}"
  1323. echo_content yellow "Hysteria的端口: ${hysteria_port}"
  1324. echo_content yellow "Hysteria的密码: ${hysteria_password}"
  1325. echo_content yellow "Hysteria私钥和证书目录: ${CADDY_ACME}${domain}/"
  1326. echo_content red "\n=============================================================="
  1327. else
  1328. echo_content red "---> Hysteria 单机版 安装失败"
  1329. exit 0
  1330. fi
  1331. else
  1332. echo_content skyBlue "---> 你已经安装了Hysteria 单机版"
  1333. fi
  1334. }
  1335. # 更新Trojan Panel
  1336. update_trojan_panel() {
  1337. # 判断Trojan Panel是否安装
  1338. if [[ -z $(docker ps -q -f "name=^trojan-panel$") ]]; then
  1339. echo_content red "---> 请先安装Trojan Panel"
  1340. exit 0
  1341. fi
  1342. echo_content green "---> 更新Trojan Panel"
  1343. read -r -p "请输入数据库的IP地址(默认:本机数据库): " mariadb_ip
  1344. [[ -z "${mariadb_ip}" ]] && mariadb_ip="trojan-panel-mariadb"
  1345. read -r -p "请输入数据库的端口(默认:本机数据库端口): " mariadb_port
  1346. [[ -z "${mariadb_port}" ]] && mariadb_port=3306
  1347. read -r -p "请输入数据库的用户名(默认:root): " mariadb_user
  1348. [[ -z "${mariadb_user}" ]] && mariadb_user="root"
  1349. while read -r -p "请输入数据库的密码(必填): " mariadb_pas; do
  1350. if [[ -z "${mariadb_pas}" ]]; then
  1351. echo_content red "密码不能为空"
  1352. else
  1353. break
  1354. fi
  1355. done
  1356. if [[ "${mariadb_ip}" == "trojan-panel-mariadb" ]]; then
  1357. docker exec trojan-panel-mariadb mysql -p"${mariadb_pas}" -e "drop database trojan_panel_db;"
  1358. docker exec trojan-panel-mariadb mysql -p"${mariadb_pas}" -e "create database trojan_panel_db;"
  1359. else
  1360. docker exec trojan-panel-mariadb mysql -h"${mariadb_ip}" -P"${mariadb_port}" -u"${mariadb_user}" -p"${mariadb_pas}" -e "drop database trojan_panel_db;" &>/dev/null
  1361. docker exec trojan-panel-mariadb mysql -h"${mariadb_ip}" -P"${mariadb_port}" -u"${mariadb_user}" -p"${mariadb_pas}" -e "create database trojan_panel_db;" &>/dev/null
  1362. fi
  1363. read -r -p "请输入Redis的IP地址(默认:本机Redis): " redis_host
  1364. [[ -z "${redis_host}" ]] && redis_host="trojan-panel-redis"
  1365. read -r -p "请输入Redis的端口(默认:本机Redis端口): " redis_port
  1366. [[ -z "${redis_port}" ]] && redis_port=6379
  1367. while read -r -p "请输入Redis的密码(必填): " redis_pass; do
  1368. if [[ -z "${redis_pass}" ]]; then
  1369. echo_content red "密码不能为空"
  1370. else
  1371. break
  1372. fi
  1373. done
  1374. if [[ "${mariadb_ip}" == "trojan-panel-redis" ]]; then
  1375. docker exec trojan-panel-redis redis-cli -a "${redis_pass}" -e "flushall" &>/dev/null
  1376. else
  1377. docker exec trojan-panel-redis redis-cli -h "${redis_host}" -p ${redis_port} -a "${redis_pass}" -e "flushall" &>/dev/null
  1378. fi
  1379. docker rm -f trojan-panel &&
  1380. docker rmi -f jonssonyan/trojan-panel &&
  1381. rm -rf ${TROJAN_PANEL_DATA}
  1382. docker rm -f trojan-panel-ui &&
  1383. docker rmi -f jonssonyan/trojan-panel-ui &&
  1384. rm -rf ${TROJAN_PANEL_UI_DATA}
  1385. docker pull jonssonyan/trojan-panel &&
  1386. docker run -d --name trojan-panel --restart always \
  1387. --network=trojan-panel-network \
  1388. -p 8081:8081 \
  1389. -v ${CADDY_SRV}:${TROJAN_PANEL_WEBFILE} \
  1390. -v ${TROJAN_PANEL_LOGS}:${TROJAN_PANEL_LOGS} \
  1391. -v /etc/localtime:/etc/localtime \
  1392. -e "mariadb_ip=${mariadb_ip}" \
  1393. -e "mariadb_port=${mariadb_port}" \
  1394. -e "mariadb_user=${mariadb_user}" \
  1395. -e "mariadb_pas=${mariadb_pas}" \
  1396. -e "redis_host=${redis_host}" \
  1397. -e "redis_port=${redis_port}" \
  1398. -e "redis_pass=${redis_pass}" \
  1399. jonssonyan/trojan-panel
  1400. if [[ "$?" == "0" ]]; then
  1401. echo_content skyBlue "---> Trojan Panel更新完成"
  1402. else
  1403. echo_content red "---> Trojan Panel更新失败"
  1404. fi
  1405. docker pull jonssonyan/trojan-panel-ui &&
  1406. docker run -d --name trojan-panel-ui --restart always \
  1407. --network=trojan-panel-network \
  1408. -p 8888:80 \
  1409. -v ${NGINX_CONFIG}:/etc/nginx/conf.d/default.conf \
  1410. -v ${CADDY_ACME}"${domain}":${CADDY_ACME}"${domain}" \
  1411. jonssonyan/trojan-panel-ui
  1412. if [[ "$?" == "0" ]]; then
  1413. echo_content skyBlue "---> Trojan Panel UI更新完成"
  1414. else
  1415. echo_content red "---> Trojan Panel UI更新失败"
  1416. fi
  1417. }
  1418. # 更新Trojan Panel Core
  1419. update_trojan_panel_core() {
  1420. # 判断Trojan Panel Core是否安装
  1421. if [[ -z $(docker ps -q -f "name=^trojan-panel-core$") ]]; then
  1422. echo_content red "---> 请先安装Trojan Panel Core"
  1423. exit 0
  1424. fi
  1425. echo_content green "---> 更新Trojan Panel Core"
  1426. read -r -p "请输入数据库的IP地址(默认:本机数据库): " mariadb_ip
  1427. [[ -z "${mariadb_ip}" ]] && mariadb_ip="trojan-panel-mariadb"
  1428. read -r -p "请输入数据库的端口(默认:本机数据库端口): " mariadb_port
  1429. [[ -z "${mariadb_port}" ]] && mariadb_port=3306
  1430. read -r -p "请输入数据库的用户名(默认:root): " mariadb_user
  1431. [[ -z "${mariadb_user}" ]] && mariadb_user="root"
  1432. while read -r -p "请输入数据库的密码(必填): " mariadb_pas; do
  1433. if [[ -z "${mariadb_pas}" ]]; then
  1434. echo_content red "密码不能为空"
  1435. else
  1436. break
  1437. fi
  1438. done
  1439. read -r -p "请输入数据库名称(默认:trojan_panel_db): " database
  1440. [[ -z "${database}" ]] && database="trojan_panel_db"
  1441. read -r -p "请输入数据库的用户表名称(默认:account): " account_table
  1442. [[ -z "${account_table}" ]] && account_table="account"
  1443. if [[ "${mariadb_ip}" == "trojan-panel-mariadb" ]]; then
  1444. docker exec trojan-panel-mariadb mysql -p"${mariadb_pas}" -e "drop database trojan_panel_db;"
  1445. docker exec trojan-panel-mariadb mysql -p"${mariadb_pas}" -e "create database trojan_panel_db;"
  1446. else
  1447. docker exec trojan-panel-mariadb mysql -h"${mariadb_ip}" -P"${mariadb_port}" -u"${mariadb_user}" -p"${mariadb_pas}" -e "drop database trojan_panel_db;" &>/dev/null
  1448. docker exec trojan-panel-mariadb mysql -h"${mariadb_ip}" -P"${mariadb_port}" -u"${mariadb_user}" -p"${mariadb_pas}" -e "create database trojan_panel_db;" &>/dev/null
  1449. fi
  1450. read -r -p "请输入Redis的IP地址(默认:本机Redis): " redis_host
  1451. [[ -z "${redis_host}" ]] && redis_host="trojan-panel-redis"
  1452. read -r -p "请输入Redis的端口(默认:本机Redis端口): " redis_port
  1453. [[ -z "${redis_port}" ]] && redis_port=6379
  1454. while read -r -p "请输入Redis的密码(必填): " redis_pass; do
  1455. if [[ -z "${redis_pass}" ]]; then
  1456. echo_content red "密码不能为空"
  1457. else
  1458. break
  1459. fi
  1460. done
  1461. if [[ "${mariadb_ip}" == "trojan-panel-redis" ]]; then
  1462. docker exec trojan-panel-redis redis-cli -a "${redis_pass}" -e "flushall" &>/dev/null
  1463. else
  1464. docker exec trojan-panel-redis redis-cli -h "${redis_host}" -p ${redis_port} -a "${redis_pass}" -e "flushall" &>/dev/null
  1465. fi
  1466. docker rm -f trojan-panel-core &&
  1467. docker rmi -f jonssonyan/trojan-panel-core &&
  1468. rm -rf ${TROJAN_PANEL_CORE_DATA}
  1469. docker pull jonssonyan/trojan-panel-core &&
  1470. docker run -d --name trojan-panel-core --restart always \
  1471. --network=trojan-panel-network \
  1472. -p 9000-10000:9000-10000 \
  1473. -v ${TROJAN_PANEL_CORE_LOGS}:${TROJAN_PANEL_CORE_LOGS} \
  1474. -v /etc/localtime:/etc/localtime \
  1475. -e "mariadb_ip=${mariadb_ip}" \
  1476. -e "mariadb_port=${mariadb_port}" \
  1477. -e "mariadb_user=${mariadb_user}" \
  1478. -e "mariadb_pas=${mariadb_pas}" \
  1479. -e "database=${database}" \
  1480. -e "account-table=${account_table}" \
  1481. -e "redis_host=${redis_host}" \
  1482. -e "redis_port=${redis_port}" \
  1483. -e "redis_pass=${redis_pass}" \
  1484. jonssonyan/trojan-panel-core
  1485. if [[ "$?" == "0" ]]; then
  1486. echo_content skyBlue "---> Trojan Panel Core更新完成"
  1487. else
  1488. echo_content red "---> Trojan Panel Core更新失败"
  1489. fi
  1490. }
  1491. # 卸载Caddy TLS
  1492. uninstall_caddy_tls() {
  1493. # 判断Caddy TLS是否安装
  1494. if [[ -n $(docker ps -q -f "name=^trojan-panel-caddy$") ]]; then
  1495. echo_content green "---> 卸载Caddy TLS"
  1496. docker rm -f trojan-panel-caddy &&
  1497. rm -rf ${CADDY_DATA}
  1498. echo_content skyBlue "---> Caddy TLS卸载完成"
  1499. else
  1500. echo_content red "---> 请先安装Caddy TLS"
  1501. fi
  1502. }
  1503. # 卸载MariaDB
  1504. uninstall_mariadb() {
  1505. # 判断MariaDB是否安装
  1506. if [[ -n $(docker ps -q -f "name=^trojan-panel-mariadb$") ]]; then
  1507. echo_content green "---> 卸载MariaDB"
  1508. docker rm -f trojan-panel-mariadb &&
  1509. rm -rf ${MARIA_DATA}
  1510. echo_content skyBlue "---> MariaDB卸载完成"
  1511. else
  1512. echo_content red "---> 请先安装MariaDB"
  1513. fi
  1514. }
  1515. # 卸载Redis
  1516. uninstall_redis() {
  1517. # 判断Redis是否安装
  1518. if [[ -n $(docker ps -q -f "name=^trojan-panel-redis$") ]]; then
  1519. echo_content green "---> 卸载Redis"
  1520. docker rm -f trojan-panel-redis &&
  1521. rm -rf ${REDIS_DATA}
  1522. echo_content skyBlue "---> Redis卸载完成"
  1523. else
  1524. echo_content red "---> 请先安装Redis"
  1525. fi
  1526. }
  1527. # 卸载Trojan Panel
  1528. uninstall_trojan_panel() {
  1529. # 判断Trojan Panel是否安装
  1530. if [[ -n $(docker ps -q -f "name=^trojan-panel$") ]]; then
  1531. echo_content green "---> 卸载Trojan Panel"
  1532. docker rm -f trojan-panel &&
  1533. docker rmi -f jonssonyan/trojan-panel &&
  1534. rm -rf ${TROJAN_PANEL_DATA}
  1535. docker rm -f trojan-panel-ui &&
  1536. docker rmi -f jonssonyan/trojan-panel-ui &&
  1537. rm -rf ${TROJAN_PANEL_UI_DATA} &&
  1538. rm -rf ${NGINX_DATA}
  1539. echo_content skyBlue "---> Trojan Panel卸载完成"
  1540. else
  1541. echo_content red "---> 请先安装Trojan Panel"
  1542. fi
  1543. }
  1544. # 卸载Trojan Panel Core
  1545. uninstall_trojan_panel_core() {
  1546. # 判断Trojan Panel Core是否安装
  1547. if [[ -n $(docker ps -q -f "name=^trojan-panel-core$") ]]; then
  1548. echo_content green "---> 卸载Trojan Panel Core"
  1549. docker rm -f trojan-panel-core &&
  1550. docker rmi -f jonssonyan/trojan-panel-core &&
  1551. rm -rf ${TROJAN_PANEL_CORE_DATA}
  1552. echo_content skyBlue "---> Trojan Panel Core卸载完成"
  1553. else
  1554. echo_content red "---> 请先安装Trojan Panel Core"
  1555. fi
  1556. }
  1557. # 卸载TrojanGFW+Caddy+Web+TLS节点 数据库版
  1558. uninstall_trojan_gfw() {
  1559. if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGFW$") ]]; then
  1560. echo_content green "---> 卸载TrojanGFW+Caddy+Web+TLS节点 数据库版"
  1561. docker rm -f trojan-panel-trojanGFW &&
  1562. docker rmi -f trojangfw/trojan &&
  1563. rm -f ${TROJANGFW_CONFIG}
  1564. echo_content skyBlue "---> TrojanGFW+Caddy+Web+TLS节点 数据库版卸载完成"
  1565. else
  1566. echo_content red "---> 请先安装TrojanGFW+Caddy+Web+TLS节点 数据库版"
  1567. fi
  1568. }
  1569. # 卸载TrojanGFW+Caddy+Web+TLS节点 单机版
  1570. uninstall_trojan_gfw_standalone() {
  1571. if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGFW-standalone$") ]]; then
  1572. echo_content green "---> 卸载TrojanGFW+Caddy+Web+TLS节点 单机版"
  1573. docker rm -f trojan-panel-trojanGFW-standalone &&
  1574. docker rmi -f trojangfw/trojan &&
  1575. rm -f ${TROJANGFW_STANDALONE_CONFIG}
  1576. echo_content skyBlue "---> TrojanGFW+Caddy+Web+TLS节点 单机版卸载完成"
  1577. else
  1578. echo_content red "---> 请先安装TrojanGFW+Caddy+Web+TLS节点 单机版"
  1579. fi
  1580. }
  1581. # 卸载TrojanGo+Caddy+Web+TLS+Websocket节点 数据库版
  1582. uninstall_trojanGO() {
  1583. if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGO$") ]]; then
  1584. echo_content green "---> 卸载TrojanGo+Caddy+Web+TLS+Websocket节点 数据库版"
  1585. docker rm -f trojan-panel-trojanGO &&
  1586. docker rmi -f p4gefau1t/trojan-go &&
  1587. rm -f ${TROJANGO_CONFIG}
  1588. echo_content skyBlue "---> TrojanGo+Caddy+Web+TLS+Websocket节点 数据库版卸载完成"
  1589. else
  1590. echo_content red "---> 请先安装TrojanGo+Caddy+Web+TLS+Websocket节点 数据库版"
  1591. fi
  1592. }
  1593. # 卸载TrojanGo+Caddy+Web+TLS+Websocket节点 单机版
  1594. uninstall_trojanGO_standalone() {
  1595. if [[ -n $(docker ps -q -f "name=^trojan-panel-trojanGO-standalone$") ]]; then
  1596. echo_content green "---> 卸载TrojanGo+Caddy+Web+TLS+Websocket节点 单机版"
  1597. docker rm -f trojan-panel-trojanGO-standalone &&
  1598. docker rmi -f p4gefau1t/trojan-go &&
  1599. rm -f ${TROJANGO_STANDALONE_CONFIG}
  1600. echo_content skyBlue "---> TrojanGo+Caddy+Web+TLS+Websocket节点 单机版卸载完成"
  1601. else
  1602. echo_content red "---> 请先安装TrojanGo+Caddy+Web+TLS+Websocket节点 单机版"
  1603. fi
  1604. }
  1605. uninstall_hysteria() {
  1606. if [[ -n $(docker ps -q -f "name=^trojan-panel-hysteria") ]]; then
  1607. echo_content green "---> 卸载Hysteria节点 数据库版"
  1608. docker rm -f trojan-panel-hysteria &&
  1609. docker rmi -f tobyxdd/hysteria &&
  1610. rm -f ${HYSTERIA_CONFIG}
  1611. echo_content skyBlue "---> Hysteria节点 数据库版卸载完成"
  1612. else
  1613. echo_content red "---> 请先安装Hysteria节点 数据库版"
  1614. fi
  1615. }
  1616. uninstall_hysteria_standalone() {
  1617. if [[ -n $(docker ps -q -f "name=^trojan-panel-hysteria-standalone$") ]]; then
  1618. echo_content green "---> 卸载Hysteria节点 单机版"
  1619. docker rm -f trojan-panel-hysteria-standalone &&
  1620. docker rmi -f tobyxdd/hysteria &&
  1621. rm -f ${HYSTERIA_STANDALONE_CONFIG}
  1622. echo_content skyBlue "---> Hysteria节点 单机版卸载完成"
  1623. else
  1624. echo_content red "---> 请先安装Hysteria节点 单机版"
  1625. fi
  1626. }
  1627. uninstall_all() {
  1628. echo_content green "---> 卸载全部Trojan Panel相关的容器"
  1629. docker rm -f "$(docker ps -q -f "name=^trojan-panel")" &&
  1630. docker rmi -f "$(docker images | grep "^trojan-panel" | awk '{print $3}')" &&
  1631. rm -rf ${TP_DATA}
  1632. echo_content skyBlue "---> 卸载全部Trojan Panel相关的容器完成"
  1633. }
  1634. failure_testing() {
  1635. echo_content green "---> 故障检测开始"
  1636. if [[ ! $(docker -v 2>/dev/null) ]]; then
  1637. echo_content red "---> Docker运行异常"
  1638. else
  1639. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-caddy$") ]]; then
  1640. if [[ -z $(docker ps -q -f "name=^trojan-panel-caddy$" -f "status=running") ]]; then
  1641. echo_content red "---> Caddy TLS运行异常"
  1642. else
  1643. domain=$(cat "${DOMAIN_FILE}")
  1644. if [[ -z $(cat "${DOMAIN_FILE}") || ! -d "${CADDY_ACME}${domain}" || ! -f "${CADDY_ACME}${domain}/${domain}.crt" ]]; then
  1645. echo_content red "---> 证书申请异常,请尝试重启服务器将重新申请证书或者重新搭建选择自定义证书选项"
  1646. fi
  1647. fi
  1648. fi
  1649. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-mariadb$") && -z $(docker ps -q -f "name=^trojan-panel-mariadb$" -f "status=running") ]]; then
  1650. echo_content red "---> MariaDB运行异常"
  1651. fi
  1652. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-redis$") && -z $(docker ps -q -f "name=^trojan-panel-redis$" -f "status=running") ]]; then
  1653. echo_content red "---> Redis运行异常"
  1654. fi
  1655. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-ui$") && -z $(docker ps -q -f "name=^trojan-panel-ui$" -f "status=running") ]]; then
  1656. echo_content red "---> Trojan Panel前端运行异常"
  1657. fi
  1658. if [[ -n $(docker ps -a -q -f "name=^trojan-panel$") && -z $(docker ps -q -f "name=^trojan-panel$" -f "status=running") ]]; then
  1659. echo_content red "---> Trojan Panel后端运行异常"
  1660. fi
  1661. if [[ -n $(docker ps -a -q -f "name=^trojan-panel-core$") && -z $(docker ps -q -f "name=^trojan-panel-core$" -f "status=running") ]]; then
  1662. echo_content red "---> Trojan Panel Core运行异常"
  1663. fi
  1664. fi
  1665. echo_content green "---> 故障检测结束"
  1666. }
  1667. # 卸载阿里云内置相关监控
  1668. uninstall_aliyun() {
  1669. # 卸载云监控(Cloudmonitor) Java 版
  1670. /usr/local/cloudmonitor/wrapper/bin/cloudmonitor.sh stop &&
  1671. /usr/local/cloudmonitor/wrapper/bin/cloudmonitor.sh remove &&
  1672. rm -rf /usr/local/cloudmonitor
  1673. # 卸载云盾(安骑士)
  1674. wget --no-check-certificate -O uninstall.sh http://update.aegis.aliyun.com/download/uninstall.sh && chmod +x uninstall.sh && ./uninstall.sh
  1675. 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
  1676. pkill aliyun-service
  1677. rm -fr /etc/init.d/agentwatch /usr/sbin/aliyun-service
  1678. rm -rf /usr/local/aegis*
  1679. iptables -I INPUT -s 140.205.201.0/28 -j DROP
  1680. iptables -I INPUT -s 140.205.201.16/29 -j DROP
  1681. iptables -I INPUT -s 140.205.201.32/28 -j DROP
  1682. iptables -I INPUT -s 140.205.225.192/29 -j DROP
  1683. iptables -I INPUT -s 140.205.225.200/30 -j DROP
  1684. iptables -I INPUT -s 140.205.225.184/29 -j DROP
  1685. iptables -I INPUT -s 140.205.225.183/32 -j DROP
  1686. iptables -I INPUT -s 140.205.225.206/32 -j DROP
  1687. iptables -I INPUT -s 140.205.225.205/32 -j DROP
  1688. iptables -I INPUT -s 140.205.225.195/32 -j DROP
  1689. iptables -I INPUT -s 140.205.225.204/32 -j DROP
  1690. }
  1691. main() {
  1692. cd "$HOME" || exit 0
  1693. init_var
  1694. mkdir_tools
  1695. check_sys
  1696. depend_install
  1697. clear
  1698. echo_content red "\n=============================================================="
  1699. echo_content skyBlue "System Required: CentOS 7+/Ubuntu 18+/Debian 10+"
  1700. echo_content skyBlue "Version: v1.0.0"
  1701. echo_content skyBlue "Description: One click Install Trojan Panel server"
  1702. echo_content skyBlue "Author: jonssonyan <https://jonssonyan.com>"
  1703. echo_content skyBlue "Github: https://github.com/trojanpanel/install-script"
  1704. echo_content red "\n=============================================================="
  1705. echo_content yellow "1. 卸载阿里云盾(仅支持阿里云服务器)"
  1706. echo_content yellow "2. 安装BBRPlus(仅支持CentOS系统)"
  1707. echo_content green "\n=============================================================="
  1708. echo_content yellow "3. 安装Trojan Panel"
  1709. echo_content yellow "4. 更新Trojan Panel(注意: 会清除数据)"
  1710. echo_content yellow "5. 卸载Trojan Panel"
  1711. echo_content green "\n=============================================================="
  1712. echo_content yellow "6. 安装Trojan Panel Core"
  1713. echo_content yellow "7. 更新Trojan Panel Core"
  1714. echo_content yellow "8. 卸载Trojan Panel Core"
  1715. echo_content green "\n=============================================================="
  1716. echo_content yellow "9. 卸载Caddy TLS"
  1717. echo_content yellow "10. 卸载MariaDB"
  1718. echo_content yellow "11. 卸载Redis"
  1719. echo_content yellow "12. 卸载全部Trojan Panel相关的容器"
  1720. echo_content green "\n=============================================================="
  1721. echo_content yellow "13. 故障检测"
  1722. read -r -p "请选择:" selectInstall_type
  1723. case ${selectInstall_type} in
  1724. 1)
  1725. uninstall_aliyun
  1726. ;;
  1727. 2)
  1728. install_bbr_plus
  1729. ;;
  1730. 3)
  1731. install_docker
  1732. install_caddy_tls
  1733. install_mariadb
  1734. install_redis
  1735. install_trojan_panel
  1736. ;;
  1737. 4)
  1738. update_trojan_panel
  1739. ;;
  1740. 5)
  1741. uninstall_trojan_panel
  1742. ;;
  1743. 6)
  1744. install_docker
  1745. install_caddy_tls
  1746. install_trojan_panel_core
  1747. ;;
  1748. 7)
  1749. update_trojan_panel_core
  1750. ;;
  1751. 8)
  1752. uninstall_trojan_panel_core
  1753. ;;
  1754. 9)
  1755. uninstall_caddy_tls
  1756. ;;
  1757. 10)
  1758. uninstall_mariadb
  1759. ;;
  1760. 11)
  1761. uninstall_redis
  1762. ;;
  1763. 12)
  1764. uninstall_all
  1765. ;;
  1766. 13)
  1767. failure_testing
  1768. ;;
  1769. *)
  1770. echo_content red "没有这个选项"
  1771. ;;
  1772. esac
  1773. }
  1774. main