DockerProxy_Install.sh 110 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148
  1. #!/usr/bin/env bash
  2. #===============================================================================
  3. #
  4. # FILE: DockerProxy_Install.sh
  5. #
  6. # USAGE: ./DockerProxy_Install.sh
  7. #
  8. # DESCRIPTION: 自建Docker镜像加速服务,基于官方 registry 一键部署Docker、K8s、Quay、Ghcr镜像加速\管理服务.支持部署到Render.
  9. #
  10. # ORGANIZATION: DingQz dqzboy.com 浅时光博客
  11. #===============================================================================
  12. echo
  13. cat << EOF
  14. ██████╗ ██████╗ ██████╗██╗ ██╗███████╗██████╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗██╗ ██╗
  15. ██╔══██╗██╔═══██╗██╔════╝██║ ██╔╝██╔════╝██╔══██╗ ██╔══██╗██╔══██╗██╔═══██╗╚██╗██╔╝╚██╗ ██╔╝
  16. ██║ ██║██║ ██║██║ █████╔╝ █████╗ ██████╔╝ ██████╔╝██████╔╝██║ ██║ ╚███╔╝ ╚████╔╝
  17. ██║ ██║██║ ██║██║ ██╔═██╗ ██╔══╝ ██╔══██╗ ██╔═══╝ ██╔══██╗██║ ██║ ██╔██╗ ╚██╔╝
  18. ██████╔╝╚██████╔╝╚██████╗██║ ██╗███████╗██║ ██║ ██║ ██║ ██║╚██████╔╝██╔╝ ██╗ ██║
  19. ╚═════╝ ╚═════╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝
  20. 博客: dqzboy.com 浅时光博客
  21. 项目地址: https://github.com/dqzboy/Docker-Proxy
  22. EOF
  23. echo "----------------------------------------------------------------------------------------------------------"
  24. echo -e "\033[32mVPS 推荐\033[0m(\033[34mRackNerd 高性价比便宜VPS\033[0m):\033[34;4mhttps://my.racknerd.com/aff.php?aff=12151\033[0m"
  25. echo "----------------------------------------------------------------------------------------------------------"
  26. echo
  27. echo
  28. GREEN="\033[0;32m"
  29. RED="\033[31m"
  30. YELLOW="\033[33m"
  31. RESET="\033[0m"
  32. BLUE="\033[0;34m"
  33. MAGENTA="\033[0;35m"
  34. CYAN="\033[0;36m"
  35. WHITE="\033[1;37m"
  36. BLACK="\033[0;30m"
  37. PINK="\033[0;95m"
  38. LIGHT_GREEN="\033[1;32m"
  39. LIGHT_RED="\033[1;31m"
  40. LIGHT_YELLOW="\033[1;33m"
  41. LIGHT_BLUE="\033[1;34m"
  42. LIGHT_MAGENTA="\033[1;35m"
  43. LIGHT_CYAN="\033[1;36m"
  44. LIGHT_PINK="\033[1;95m"
  45. BRIGHT_CYAN="\033[96m"
  46. BOLD="\033[1m"
  47. UNDERLINE="\033[4m"
  48. BLINK="\033[5m"
  49. REVERSE="\033[7m"
  50. INFO="[${GREEN}INFO${RESET}]"
  51. ERROR="[${RED}ERROR${RESET}]"
  52. WARN="[${YELLOW}WARN${RESET}]"
  53. function INFO() {
  54. echo -e "${INFO} ${1}"
  55. }
  56. function ERROR() {
  57. echo -e "${ERROR} ${1}"
  58. }
  59. function WARN() {
  60. echo -e "${WARN} ${1}"
  61. }
  62. function PROMPT_Y_N() {
  63. echo -e "[${LIGHT_GREEN}y${RESET}/${LIGHT_BLUE}n${RESET}]: "
  64. }
  65. PROMPT_YES_NO=$(PROMPT_Y_N)
  66. function SEPARATOR() {
  67. echo -e "${INFO}${BOLD}${LIGHT_BLUE}======================== ${1} ========================${RESET}"
  68. }
  69. PROXY_DIR="/data/registry-proxy"
  70. mkdir -p ${PROXY_DIR}
  71. cd "${PROXY_DIR}"
  72. GITRAW="https://raw.githubusercontent.com/dqzboy/Docker-Proxy/main"
  73. CNGITRAW="https://gitee.com/boydqz/Docker-Proxy/raw/main"
  74. # docker registry
  75. IMAGE_NAME="dqzboy/registry"
  76. UI_IMAGE_NAME="dqzboy/docker-registry-ui"
  77. DOCKER_COMPOSE_FILE="docker-compose.yaml"
  78. # HubCMD-UI
  79. CMDUI_IMAGE_NAME="dqzboy/hubcmd-ui"
  80. CMDUI_COMPOSE_FILE="${GITRAW}/hubcmdui/${DOCKER_COMPOSE_FILE}"
  81. attempts=0
  82. maxAttempts=3
  83. function CHECK_OS() {
  84. SEPARATOR "检查环境"
  85. OSVER=$(cat /etc/os-release | grep -o '[0-9]' | head -n 1)
  86. if [ -f /etc/os-release ]; then
  87. . /etc/os-release
  88. else
  89. echo "无法确定发行版"
  90. exit 1
  91. fi
  92. case "$ID" in
  93. "centos")
  94. repo_type="centos"
  95. ;;
  96. "debian")
  97. repo_type="debian"
  98. ;;
  99. "rhel")
  100. repo_type="rhel"
  101. ;;
  102. "ubuntu")
  103. repo_type="ubuntu"
  104. ;;
  105. "opencloudos")
  106. repo_type="centos"
  107. ;;
  108. "rocky")
  109. repo_type="centos"
  110. ;;
  111. *)
  112. WARN "此脚本目前不支持您的系统: $ID"
  113. exit 1
  114. ;;
  115. esac
  116. INFO "System release:: $NAME"
  117. INFO "System version: $VERSION"
  118. INFO "System ID: $ID"
  119. INFO "System ID Like: $ID_LIKE"
  120. }
  121. function CHECK_PACKAGE_MANAGER() {
  122. if command -v dnf &> /dev/null; then
  123. package_manager="dnf"
  124. elif command -v yum &> /dev/null; then
  125. package_manager="yum"
  126. elif command -v apt-get &> /dev/null; then
  127. package_manager="apt-get"
  128. elif command -v apt &> /dev/null; then
  129. package_manager="apt"
  130. else
  131. ERROR "不受支持的软件包管理器."
  132. exit 1
  133. fi
  134. }
  135. function CHECK_PKG_MANAGER() {
  136. if command -v rpm &> /dev/null; then
  137. pkg_manager="rpm"
  138. elif command -v dpkg &> /dev/null; then
  139. pkg_manager="dpkg"
  140. elif command -v apt &> /dev/null; then
  141. pkg_manager="apt"
  142. else
  143. ERROR "无法确定包管理系统."
  144. exit 1
  145. fi
  146. }
  147. function CHECK_COMPOSE_CMD() {
  148. if command -v docker &> /dev/null && docker compose version &> /dev/null; then
  149. DOCKER_COMPOSE_CMD="docker compose"
  150. elif command -v docker-compose &> /dev/null; then
  151. DOCKER_COMPOSE_CMD="docker-compose"
  152. else
  153. WARN "未检查到Docker Compose客户端工具,请通过脚本安装部署!"
  154. fi
  155. }
  156. function CHECKMEM() {
  157. memory_usage=$(free | awk '/^Mem:/ {printf "%.2f", $3/$2 * 100}')
  158. memory_usage=${memory_usage%.*}
  159. if [[ $memory_usage -gt 90 ]]; then
  160. read -e -p "$(WARN "内存占用率${LIGHT_RED}高于 70%($memory_usage%)${RESET} 是否继续安装? ${PROMPT_YES_NO}")" continu
  161. if [ "$continu" == "n" ] || [ "$continu" == "N" ]; then
  162. exit 1
  163. fi
  164. else
  165. INFO "内存资源充足.请继续 ${LIGHT_GREEN}($memory_usage%)${RESET}"
  166. fi
  167. }
  168. function CHECKFIRE() {
  169. systemctl stop firewalld &> /dev/null
  170. systemctl disable firewalld &> /dev/null
  171. systemctl stop iptables &> /dev/null
  172. systemctl disable iptables &> /dev/null
  173. ufw disable &> /dev/null
  174. INFO "防火墙已被禁用."
  175. if [[ "$repo_type" == "centos" || "$repo_type" == "rhel" ]]; then
  176. if sestatus | grep "SELinux status" | grep -q "enabled"; then
  177. WARN "SELinux 已启用。禁用 SELinux..."
  178. setenforce 0
  179. sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
  180. INFO "SELinux 已被禁用."
  181. else
  182. INFO "SELinux 已被禁用."
  183. fi
  184. fi
  185. }
  186. function CHECKBBR() {
  187. kernel_version=$(uname -r | awk -F "-" '{print $1}')
  188. read -e -p "$(WARN "是否开启${BRIGHT_CYAN}BBR${RESET},优化网络带宽提高网络性能? ${PROMPT_YES_NO}")" choice_bbr
  189. case $choice_bbr in
  190. y | Y)
  191. version_compare=$(echo "${kernel_version} 4.9" | awk '{if ($1 >= $2) print "yes"; else print "no"}')
  192. if [ "$version_compare" != "yes" ]; then
  193. WARN "你的内核版本小于4.9,无法启动BBR,需要你手动升级内核"
  194. exit 0
  195. fi
  196. sysctl net.ipv4.tcp_available_congestion_control | grep -q "bbr"
  197. if [ $? -eq 0 ]; then
  198. INFO "你的服务器已经启动 ${BRIGHT_CYAN}BBR${RESET}"
  199. else
  200. INFO "开启BBR中..."
  201. modprobe tcp_bbr
  202. if [ $? -eq 0 ]; then
  203. INFO "${BRIGHT_CYAN}BBR${RESET} 模块${LIGHT_GREEN}添加成功${RESET}"
  204. else
  205. ERROR "${BRIGHT_CYAN}BBR${RESET} 模块${LIGHT_RED}添加失败${RESET},请执行 ${LIGHT_CYAN}sysctl -p${RESET} 检查."
  206. exit 1
  207. fi
  208. if [ ! -d /etc/modules-load.d/ ]; then
  209. mkdir -p /etc/modules-load.d/
  210. fi
  211. if [ ! -f /etc/modules-load.d/tcp_bbr.conf ]; then
  212. touch /etc/modules-load.d/tcp_bbr.conf
  213. fi
  214. if ! grep -q "tcp_bbr" /etc/modules-load.d/tcp_bbr.conf ; then
  215. echo 'tcp_bbr' >> /etc/modules-load.d/tcp_bbr.conf
  216. fi
  217. for setting in "net.core.default_qdisc=fq" "net.ipv4.tcp_congestion_control=bbr"; do
  218. if ! grep -q "$setting" /etc/sysctl.conf; then
  219. echo "$setting" >> /etc/sysctl.conf
  220. fi
  221. done
  222. sysctl -p &> /dev/null
  223. if [ $? -ne 0 ]; then
  224. ERROR "应用sysctl设置过程中发生了一个错误,请执行 ${LIGHT_CYAN}sysctl -p${RESET} 检查."
  225. exit 2
  226. fi
  227. lsmod | grep tcp_bbr &> /dev/null
  228. if [ $? -eq 0 ]; then
  229. INFO "${BRIGHT_CYAN}BBR${RESET} 已经${LIGHT_GREEN}成功开启${RESET}"
  230. else
  231. ERROR "${BRIGHT_CYAN}BBR${RESET} 开启${LIGHT_RED}失败${RESET},请执行 ${LIGHT_CYAN}sysctl -p${RESET} 检查."
  232. exit 3
  233. fi
  234. WARN "如果 ${BRIGHT_CYAN}BBR${RESET} 开启后${LIGHT_YELLOW}未生效${RESET},请执行 ${LIGHT_BLUE}reboot${RESET} 重启服务器使其BBR模块生效"
  235. fi
  236. ;;
  237. n | N)
  238. INFO "不开启BBR"
  239. ;;
  240. *)
  241. WARN "输入了无效的选择。请重新输入${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}"
  242. CHECKBBR
  243. ;;
  244. esac
  245. }
  246. function INSTALL_PACKAGE(){
  247. SEPARATOR "安装依赖"
  248. INFO "检查依赖安装情况,请稍等 ..."
  249. TIMEOUT=300
  250. PACKAGES_APT=(
  251. lsof jq wget apache2-utils tar
  252. )
  253. PACKAGES_YUM=(
  254. epel-release lsof jq wget yum-utils httpd-tools tar
  255. )
  256. if [ "$package_manager" = "dnf" ] || [ "$package_manager" = "yum" ]; then
  257. for package in "${PACKAGES_YUM[@]}"; do
  258. if $pkg_manager -q "$package" &>/dev/null; then
  259. INFO "${LIGHT_GREEN}已经安装${RESET} $package ..."
  260. else
  261. INFO "${LIGHT_CYAN}正在安装${RESET} $package ..."
  262. start_time=$(date +%s)
  263. $package_manager -y install "$package" --skip-broken > /dev/null 2>&1 &
  264. install_pid=$!
  265. while [[ $(($(date +%s) - $start_time)) -lt $TIMEOUT ]] && kill -0 $install_pid &>/dev/null; do
  266. sleep 1
  267. done
  268. if kill -0 $install_pid &>/dev/null; then
  269. read -e -p "$(WARN "$package 的安装时间超过 ${LIGHT_YELLOW}$TIMEOUT 秒${RESET}。是否继续? ${PROMPT_YES_NO}")" continue_install
  270. if [ "$continue_install" != "y" ]; then
  271. ERROR "$package 的安装超时。退出脚本。"
  272. exit 1
  273. else
  274. continue
  275. fi
  276. fi
  277. wait $install_pid
  278. if [ $? -ne 0 ]; then
  279. ERROR "$package 安装失败。请检查系统安装源,然后再次运行此脚本!请尝试手动执行安装: ${LIGHT_BLUE}$package_manager -y install $package${RESET}"
  280. exit 1
  281. fi
  282. fi
  283. done
  284. elif [ "$package_manager" = "apt-get" ] || [ "$package_manager" = "apt" ];then
  285. dpkg --configure -a &>/dev/null
  286. $package_manager update &>/dev/null
  287. for package in "${PACKAGES_APT[@]}"; do
  288. if $pkg_manager -s "$package" &>/dev/null; then
  289. INFO "已经安装 $package ..."
  290. else
  291. INFO "正在安装 $package ..."
  292. $package_manager install -y $package > /dev/null 2>&1
  293. if [ $? -ne 0 ]; then
  294. ERROR "安装 $package 失败,请检查系统安装源之后再次运行此脚本!请尝试手动执行安装: ${LIGHT_BLUE}$package_manager -y install $package${RESET}"
  295. exit 1
  296. fi
  297. fi
  298. done
  299. else
  300. ERROR "无法确定包管理系统,脚本无法继续执行,请检查!"
  301. exit 1
  302. fi
  303. }
  304. function INSTALL_CADDY() {
  305. SEPARATOR "安装Caddy"
  306. start_caddy() {
  307. systemctl enable caddy.service &>/dev/null
  308. systemctl restart caddy.service
  309. status=$(systemctl is-active caddy)
  310. if [ "$status" = "active" ]; then
  311. INFO "Caddy 服务运行正常,请继续..."
  312. else
  313. ERROR "Caddy 服务未运行,请查看日志报错,定位问题后再次执行脚本!"
  314. ERROR "-----------服务启动失败,请查看错误日志 ↓↓↓-----------"
  315. journalctl -u caddy.service --no-pager
  316. ERROR "-----------服务启动失败,请查看错误日志 ↑↑↑-----------"
  317. exit 1
  318. fi
  319. }
  320. check_caddy() {
  321. if pgrep "caddy" > /dev/null; then
  322. INFO "Caddy 已在运行."
  323. else
  324. WARN "Caddy 未运行。尝试启动 Caddy..."
  325. start_attempts=3
  326. for ((i=1; i<=$start_attempts; i++)); do
  327. start_caddy
  328. if pgrep "caddy" > /dev/null; then
  329. INFO "Caddy 已成功启动."
  330. break
  331. else
  332. if [ $i -eq $start_attempts ]; then
  333. ERROR "Caddy 在尝试 $start_attempts 后无法启动。请检查配置"
  334. exit 1
  335. else
  336. WARN "在 $i 时间内启动 Caddy 失败。重试..."
  337. fi
  338. fi
  339. done
  340. fi
  341. }
  342. if [ "$package_manager" = "dnf" ]; then
  343. if which caddy &>/dev/null; then
  344. INFO "Caddy 已经安装."
  345. else
  346. INFO "正在安装Caddy程序,请稍候..."
  347. $package_manager -y install 'dnf-command(copr)' &>/dev/null
  348. $package_manager -y copr enable @caddy/caddy &>/dev/null
  349. while [ $attempts -lt $maxAttempts ]; do
  350. $package_manager -y install caddy &>/dev/null
  351. if [ $? -ne 0 ]; then
  352. ((attempts++))
  353. WARN "正在尝试安装Caddy >>> (Attempt: $attempts)"
  354. if [ $attempts -eq $maxAttempts ]; then
  355. ERROR "Caddy installation failed. Please try installing manually."
  356. echo "命令: $package_manager -y install 'dnf-command(copr)' && $package_manager -y copr enable @caddy/caddy && $package_manager -y install caddy"
  357. exit 1
  358. fi
  359. else
  360. INFO "已安装 Caddy."
  361. break
  362. fi
  363. done
  364. fi
  365. check_caddy
  366. elif [ "$package_manager" = "yum" ]; then
  367. if which caddy &>/dev/null; then
  368. INFO "Caddy 已经安装."
  369. else
  370. INFO "正在安装Caddy程序,请稍候..."
  371. $package_manager -y install yum-plugin-copr &>/dev/null
  372. $package_manager -y copr enable @caddy/caddy &>/dev/null
  373. while [ $attempts -lt $maxAttempts ]; do
  374. $package_manager -y install caddy &>/dev/null
  375. if [ $? -ne 0 ]; then
  376. ((attempts++))
  377. WARN "正在尝试安装Caddy >>> (Attempt: $attempts)"
  378. if [ $attempts -eq $maxAttempts ]; then
  379. ERROR "Caddy installation failed. Please try installing manually."
  380. echo "命令: $package_manager -y install 'dnf-command(copr)' && $package_manager -y copr enable @caddy/caddy && $package_manager -y install caddy"
  381. exit 1
  382. fi
  383. else
  384. INFO "已安装 Caddy."
  385. break
  386. fi
  387. done
  388. fi
  389. check_caddy
  390. elif [ "$package_manager" = "apt" ] || [ "$package_manager" = "apt-get" ];then
  391. dpkg --configure -a &>/dev/null
  392. $package_manager update &>/dev/null
  393. if $pkg_manager -s "caddy" &>/dev/null; then
  394. INFO "Caddy 已安装,跳过..."
  395. else
  396. INFO "安装 Caddy 请稍等 ..."
  397. $package_manager install -y debian-keyring debian-archive-keyring apt-transport-https &>/dev/null
  398. curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg &>/dev/null
  399. curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list &>/dev/null
  400. $package_manager update &>/dev/null
  401. $package_manager install -y caddy &>/dev/null
  402. if [ $? -ne 0 ]; then
  403. ERROR "安装 Caddy 失败,请检查系统安装源之后再次运行此脚本!请尝试手动执行安装:$package_manager -y install caddy"
  404. exit 1
  405. fi
  406. fi
  407. check_caddy
  408. else
  409. WARN "无法确定包管理系统."
  410. exit 1
  411. fi
  412. }
  413. function CONFIG_CADDY() {
  414. SEPARATOR "配置Caddy"
  415. while true; do
  416. INFO "${LIGHT_GREEN}>>> 域名解析主机记录(即域名前缀):${RESET} ${LIGHT_CYAN}ui、hub、gcr、ghcr、k8sgcr、k8s、quay、mcr、elastic${RESET}"
  417. WARN "${LIGHT_GREEN}>>> 只需选择你部署的服务进行解析即可${RESET},${LIGHT_YELLOW}无需将上面提示中所有的主机记录进行解析${RESET}"
  418. read -e -p "$(WARN "是否配置Caddy,实现自动HTTPS? 执行前需在DNS服务商对部署服务解析主机记录 ${PROMPT_YES_NO}")" caddy_conf
  419. case "$caddy_conf" in
  420. y|Y )
  421. read -e -p "$(INFO "请输入你的域名${LIGHT_BLUE}[例: baidu.com]${RESET} ${LIGHT_RED}不可为空${RESET}: ")" caddy_domain
  422. read -e -p "$(INFO "请输入要配置的${LIGHT_MAGENTA}主机记录${RESET},用逗号分隔${LIGHT_BLUE}[例: ui,hub]${RESET}: ")" selected_records
  423. # 验证输入的主机记录
  424. local valid_records=("ui" "hub" "gcr" "ghcr" "k8sgcr" "k8s" "quay" "mcr" "elastic")
  425. IFS=',' read -r -a records_array <<< "$selected_records"
  426. local invalid_records=()
  427. for record in "${records_array[@]}"; do
  428. if ! [[ " ${valid_records[@]} " =~ " ${record} " ]]; then
  429. invalid_records+=("$record")
  430. fi
  431. done
  432. if [[ ${#invalid_records[@]} -gt 0 ]]; then
  433. ERROR "无效的主机记录: ${LIGHT_RED}${invalid_records[@]}${RESET}"
  434. INFO "请输入有效的主机记录: ${LIGHT_GREEN}ui、hub、gcr、ghcr、k8sgcr、k8s、quay、mcr、elastic${RESET}"
  435. continue
  436. fi
  437. declare -A record_templates
  438. record_templates[ui]="ui.$caddy_domain {
  439. reverse_proxy localhost:50000 {
  440. header_up Host {host}
  441. header_up Origin {scheme}://{host}
  442. header_up X-Forwarded-For {remote_addr}
  443. header_up X-Forwarded-Proto {scheme}
  444. header_up X-Forwarded-Ssl on
  445. header_up X-Forwarded-Port {server_port}
  446. header_up X-Forwarded-Host {host}
  447. }
  448. }"
  449. record_templates[hub]="hub.$caddy_domain {
  450. reverse_proxy localhost:51000 {
  451. header_up Host {host}
  452. header_up X-Real-IP {remote_addr}
  453. header_up X-Forwarded-For {remote_addr}
  454. header_up X-Nginx-Proxy true
  455. }
  456. }"
  457. record_templates[ghcr]="ghcr.$caddy_domain {
  458. reverse_proxy localhost:52000 {
  459. header_up Host {host}
  460. header_up X-Real-IP {remote_addr}
  461. header_up X-Forwarded-For {remote_addr}
  462. header_up X-Nginx-Proxy true
  463. }
  464. }"
  465. record_templates[gcr]="gcr.$caddy_domain {
  466. reverse_proxy localhost:53000 {
  467. header_up Host {host}
  468. header_up X-Real-IP {remote_addr}
  469. header_up X-Forwarded-For {remote_addr}
  470. header_up X-Nginx-Proxy true
  471. }
  472. }"
  473. record_templates[k8sgcr]="k8sgcr.$caddy_domain {
  474. reverse_proxy localhost:54000 {
  475. header_up Host {host}
  476. header_up X-Real-IP {remote_addr}
  477. header_up X-Forwarded-For {remote_addr}
  478. header_up X-Nginx-Proxy true
  479. }
  480. }"
  481. record_templates[k8s]="k8s.$caddy_domain {
  482. reverse_proxy localhost:55000 {
  483. header_up Host {host}
  484. header_up X-Real-IP {remote_addr}
  485. header_up X-Forwarded-For {remote_addr}
  486. header_up X-Nginx-Proxy true
  487. }
  488. }"
  489. record_templates[quay]="quay.$caddy_domain {
  490. reverse_proxy localhost:56000 {
  491. header_up Host {host}
  492. header_up X-Real-IP {remote_addr}
  493. header_up X-Forwarded-For {remote_addr}
  494. header_up X-Nginx-Proxy true
  495. }
  496. }"
  497. record_templates[mcr]="mcr.$caddy_domain {
  498. reverse_proxy localhost:57000 {
  499. header_up Host {host}
  500. header_up X-Real-IP {remote_addr}
  501. header_up X-Forwarded-For {remote_addr}
  502. header_up X-Nginx-Proxy true
  503. }
  504. }"
  505. record_templates[elastic]="elastic.$caddy_domain {
  506. reverse_proxy localhost:58000 {
  507. header_up Host {host}
  508. header_up X-Real-IP {remote_addr}
  509. header_up X-Forwarded-For {remote_addr}
  510. header_up X-Nginx-Proxy true
  511. }
  512. }"
  513. > /etc/caddy/Caddyfile
  514. for record in "${records_array[@]}"; do
  515. if [[ -n "${record_templates[$record]}" ]]; then
  516. echo "${record_templates[$record]}" >> /etc/caddy/Caddyfile
  517. fi
  518. done
  519. start_attempts=3
  520. for ((i=1; i<=$start_attempts; i++)); do
  521. start_caddy
  522. if pgrep "caddy" > /dev/null; then
  523. INFO "重新载入配置成功. Caddy服务启动完成"
  524. break
  525. else
  526. if [ $i -eq $start_attempts ]; then
  527. ERROR "Caddy 在尝试 $start_attempts 后无法启动。请检查配置"
  528. exit 1
  529. else
  530. WARN "第 $i 次启动 Caddy 失败。重试..."
  531. fi
  532. fi
  533. done
  534. break;;
  535. n|N )
  536. WARN "退出配置 Caddy 操作。"
  537. break;;
  538. * )
  539. INFO "请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}";;
  540. esac
  541. done
  542. }
  543. function INSTALL_NGINX() {
  544. SEPARATOR "安装Nginx"
  545. start_nginx() {
  546. systemctl enable nginx &>/dev/null
  547. systemctl restart nginx
  548. status=$(systemctl is-active nginx)
  549. if [ "$status" = "active" ]; then
  550. INFO "Nginx 服务运行正常,请继续..."
  551. else
  552. ERROR "Nginx 服务未运行,请查看日志报错,定位问题后再次执行脚本!"
  553. ERROR "-----------服务启动失败,请查看错误日志 ↓↓↓-----------"
  554. journalctl -u nginx.service --no-pager
  555. ERROR "-----------服务启动失败,请查看错误日志 ↑↑↑-----------"
  556. exit 1
  557. fi
  558. }
  559. check_nginx() {
  560. if pgrep "nginx" > /dev/null; then
  561. INFO "Nginx 已在运行."
  562. else
  563. WARN "Nginx 未运行。尝试启动 Nginx..."
  564. start_attempts=3
  565. for ((i=1; i<=$start_attempts; i++)); do
  566. start_nginx
  567. if pgrep "nginx" > /dev/null; then
  568. INFO "Nginx 已成功启动."
  569. break
  570. else
  571. if [ $i -eq $start_attempts ]; then
  572. ERROR "Nginx 在尝试 $start_attempts 次后无法启动。请检查配置"
  573. exit 1
  574. else
  575. WARN "第 $i 次启动 Nginx 失败。重试..."
  576. fi
  577. fi
  578. done
  579. fi
  580. }
  581. if [ "$package_manager" = "dnf" ] || [ "$package_manager" = "yum" ]; then
  582. if which nginx &>/dev/null; then
  583. INFO "Nginx 已经安装."
  584. else
  585. INFO "正在安装Nginx程序,请稍候..."
  586. NGINX="nginx-1.24.0-1.el${OSVER}.ngx.x86_64.rpm"
  587. rm -f ${NGINX}
  588. wget http://nginx.org/packages/centos/${OSVER}/x86_64/RPMS/${NGINX} &>/dev/null
  589. while [ $attempts -lt $maxAttempts ]; do
  590. $package_manager -y install ${NGINX} &>/dev/null
  591. if [ $? -ne 0 ]; then
  592. ((attempts++))
  593. WARN "正在尝试安装Nginx >>> (Attempt: $attempts)"
  594. if [ $attempts -eq $maxAttempts ]; then
  595. ERROR "Nginx installation failed. Please try installing manually."
  596. rm -f ${NGINX}
  597. echo "命令: wget http://nginx.org/packages/centos/${OSVER}/x86_64/RPMS/${NGINX} && $package_manager -y install ${NGINX}"
  598. exit 1
  599. fi
  600. else
  601. INFO "已安装 Nginx."
  602. rm -f ${NGINX}
  603. break
  604. fi
  605. done
  606. fi
  607. check_nginx
  608. elif [ "$package_manager" = "apt-get" ] || [ "$package_manager" = "apt" ];then
  609. dpkg --configure -a &>/dev/null
  610. $package_manager update &>/dev/null
  611. if $pkg_manager -s "nginx" &>/dev/null; then
  612. INFO "nginx 已安装,跳过..."
  613. else
  614. INFO "安装 nginx 请稍等 ..."
  615. $package_manager install -y nginx > /dev/null 2>&1
  616. if [ $? -ne 0 ]; then
  617. ERROR "安装 nginx 失败,请检查系统安装源之后再次运行此脚本!请尝试手动执行安装:$package_manager -y install nginx"
  618. exit 1
  619. fi
  620. fi
  621. check_nginx
  622. else
  623. WARN "无法确定包管理系统."
  624. exit 1
  625. fi
  626. }
  627. function CONFIG_NGINX() {
  628. SEPARATOR "配置Nginx"
  629. while true; do
  630. WARN "自行安装的 Nginx ${LIGHT_RED}请勿执行此操作${RESET},${LIGHT_BLUE}以防覆盖原有配置${RESET}"
  631. INFO "${LIGHT_GREEN}>>> 域名解析主机记录(即域名前缀):${RESET} ${LIGHT_CYAN}ui、hub、gcr、ghcr、k8sgcr、k8s、quay、mcr、elastic${RESET}"
  632. WARN "${LIGHT_GREEN}>>> 只需选择你部署的服务进行解析即可${RESET},${LIGHT_YELLOW}无需将上面提示中所有的主机记录进行解析${RESET}"
  633. read -e -p "$(WARN "是否配置 Nginx?配置完成后需在DNS服务商解析主机记录 ${PROMPT_YES_NO}")" nginx_conf
  634. case "$nginx_conf" in
  635. y|Y )
  636. read -e -p "$(INFO "请输入你的域名${LIGHT_BLUE}[例: baidu.com]${RESET} ${LIGHT_RED}不可为空${RESET}: ")" nginx_domain
  637. read -e -p "$(INFO "请输入要配置的${LIGHT_MAGENTA}主机记录${RESET},用逗号分隔${LIGHT_BLUE}[例: ui,hub]${RESET}: ")" selected_records
  638. # 验证输入的主机记录
  639. local valid_records=("ui" "hub" "gcr" "ghcr" "k8sgcr" "k8s" "quay" "mcr" "elastic")
  640. IFS=',' read -r -a records_array <<< "$selected_records"
  641. local invalid_records=()
  642. for record in "${records_array[@]}"; do
  643. if ! [[ " ${valid_records[@]} " =~ " ${record} " ]]; then
  644. invalid_records+=("$record")
  645. fi
  646. done
  647. if [[ ${#invalid_records[@]} -gt 0 ]]; then
  648. ERROR "无效的主机记录: ${LIGHT_RED}${invalid_records[@]}${RESET}"
  649. INFO "请输入有效的主机记录: ${LIGHT_GREEN}ui、hub、gcr、ghcr、k8sgcr、k8s、quay、mcr、elastic${RESET}"
  650. continue
  651. fi
  652. declare -A record_templates
  653. record_templates[ui]="server {
  654. listen 80;
  655. #listen 443 ssl;
  656. server_name ui.$nginx_domain;
  657. #ssl_certificate /path/to/your_domain_name.crt;
  658. #ssl_certificate_key /path/to/your_domain_name.key;
  659. #ssl_session_timeout 1d;
  660. #ssl_session_cache shared:SSL:50m;
  661. #ssl_session_tickets off;
  662. #ssl_protocols TLSv1.2 TLSv1.3;
  663. #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  664. #ssl_prefer_server_ciphers on;
  665. #ssl_buffer_size 8k;
  666. proxy_connect_timeout 600;
  667. proxy_send_timeout 600;
  668. proxy_read_timeout 600;
  669. send_timeout 600;
  670. location / {
  671. proxy_pass http://localhost:50000;
  672. proxy_set_header Host \$host;
  673. proxy_set_header Origin \$scheme://\$host;
  674. proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
  675. proxy_set_header X-Forwarded-Proto \$scheme;
  676. proxy_set_header X-Forwarded-Ssl on;
  677. proxy_set_header X-Forwarded-Port \$server_port;
  678. proxy_set_header X-Forwarded-Host \$host;
  679. }
  680. }"
  681. record_templates[hub]="server {
  682. listen 80;
  683. #listen 443 ssl;
  684. server_name hub.$nginx_domain;
  685. #ssl_certificate /path/to/your_domain_name.crt;
  686. #ssl_certificate_key /path/to/your_domain_name.key;
  687. #ssl_session_timeout 1d;
  688. #ssl_session_cache shared:SSL:50m;
  689. #ssl_session_tickets off;
  690. #ssl_protocols TLSv1.2 TLSv1.3;
  691. #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  692. #ssl_prefer_server_ciphers on;
  693. #ssl_buffer_size 8k;
  694. proxy_connect_timeout 600;
  695. proxy_send_timeout 600;
  696. proxy_read_timeout 600;
  697. send_timeout 600;
  698. location / {
  699. proxy_pass http://localhost:51000;
  700. proxy_set_header Host \$host;
  701. proxy_set_header X-Real-IP \$remote_addr;
  702. proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
  703. proxy_set_header X-Nginx-Proxy true;
  704. proxy_buffering off;
  705. proxy_redirect off;
  706. }
  707. }"
  708. record_templates[ghcr]="server {
  709. listen 80;
  710. #listen 443 ssl;
  711. server_name ghcr.$nginx_domain;
  712. #ssl_certificate /path/to/your_domain_name.crt;
  713. #ssl_certificate_key /path/to/your_domain_name.key;
  714. #ssl_session_timeout 1d;
  715. #ssl_session_cache shared:SSL:50m;
  716. #ssl_session_tickets off;
  717. #ssl_protocols TLSv1.2 TLSv1.3;
  718. #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  719. #ssl_prefer_server_ciphers on;
  720. #ssl_buffer_size 8k;
  721. proxy_connect_timeout 600;
  722. proxy_send_timeout 600;
  723. proxy_read_timeout 600;
  724. send_timeout 600;
  725. location / {
  726. proxy_pass http://localhost:52000;
  727. proxy_set_header Host \$host;
  728. proxy_set_header X-Real-IP \$remote_addr;
  729. proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
  730. proxy_set_header X-Nginx-Proxy true;
  731. proxy_buffering off;
  732. proxy_redirect off;
  733. }
  734. }"
  735. record_templates[gcr]="server {
  736. listen 80;
  737. #listen 443 ssl;
  738. server_name gcr.$nginx_domain;
  739. #ssl_certificate /path/to/your_domain_name.crt;
  740. #ssl_certificate_key /path/to/your_domain_name.key;
  741. #ssl_session_timeout 1d;
  742. #ssl_session_cache shared:SSL:50m;
  743. #ssl_session_tickets off;
  744. #ssl_protocols TLSv1.2 TLSv1.3;
  745. #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  746. #ssl_prefer_server_ciphers on;
  747. #ssl_buffer_size 8k;
  748. proxy_connect_timeout 600;
  749. proxy_send_timeout 600;
  750. proxy_read_timeout 600;
  751. send_timeout 600;
  752. location / {
  753. proxy_pass http://localhost:53000;
  754. proxy_set_header Host \$host;
  755. proxy_set_header X-Real-IP \$remote_addr;
  756. proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
  757. proxy_set_header X-Nginx-Proxy true;
  758. proxy_buffering off;
  759. proxy_redirect off;
  760. }
  761. }"
  762. record_templates[k8sgcr]="server {
  763. listen 80;
  764. #listen 443 ssl;
  765. server_name k8sgcr.$nginx_domain;
  766. #ssl_certificate /path/to/your_domain_name.crt;
  767. #ssl_certificate_key /path/to/your_domain_name.key;
  768. #ssl_session_timeout 1d;
  769. #ssl_session_cache shared:SSL:50m;
  770. #ssl_session_tickets off;
  771. #ssl_protocols TLSv1.2 TLSv1.3;
  772. #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  773. #ssl_prefer_server_ciphers on;
  774. #ssl_buffer_size 8k;
  775. proxy_connect_timeout 600;
  776. proxy_send_timeout 600;
  777. proxy_read_timeout 600;
  778. send_timeout 600;
  779. location / {
  780. proxy_pass http://localhost:54000;
  781. proxy_set_header Host \$host;
  782. proxy_set_header X-Real-IP \$remote_addr;
  783. proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
  784. proxy_set_header X-Nginx-Proxy true;
  785. proxy_buffering off;
  786. proxy_redirect off;
  787. }
  788. }"
  789. record_templates[k8s]="server {
  790. listen 80;
  791. #listen 443 ssl;
  792. server_name k8s.$nginx_domain;
  793. #ssl_certificate /path/to/your_domain_name.crt;
  794. #ssl_certificate_key /path/to/your_domain_name.key;
  795. #ssl_session_timeout 1d;
  796. #ssl_session_cache shared:SSL:50m;
  797. #ssl_session_tickets off;
  798. #ssl_protocols TLSv1.2 TLSv1.3;
  799. #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  800. #ssl_prefer_server_ciphers on;
  801. #ssl_buffer_size 8k;
  802. proxy_connect_timeout 600;
  803. proxy_send_timeout 600;
  804. proxy_read_timeout 600;
  805. send_timeout 600;
  806. location / {
  807. proxy_pass http://localhost:55000;
  808. proxy_set_header Host \$host;
  809. proxy_set_header X-Real-IP \$remote_addr;
  810. proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
  811. proxy_set_header X-Nginx-Proxy true;
  812. proxy_buffering off;
  813. proxy_redirect off;
  814. }
  815. }"
  816. record_templates[quay]="server {
  817. listen 80;
  818. #listen 443 ssl;
  819. server_name quay.$nginx_domain;
  820. #ssl_certificate /path/to/your_domain_name.crt;
  821. #ssl_certificate_key /path/to/your_domain_name.key;
  822. #ssl_session_timeout 1d;
  823. #ssl_session_cache shared:SSL:50m;
  824. #ssl_session_tickets off;
  825. #ssl_protocols TLSv1.2 TLSv1.3;
  826. #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  827. #ssl_prefer_server_ciphers on;
  828. #ssl_buffer_size 8k;
  829. proxy_connect_timeout 600;
  830. proxy_send_timeout 600;
  831. proxy_read_timeout 600;
  832. send_timeout 600;
  833. location / {
  834. proxy_pass http://localhost:56000;
  835. proxy_set_header Host \$host;
  836. proxy_set_header X-Real-IP \$remote_addr;
  837. proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
  838. proxy_set_header X-Nginx-Proxy true;
  839. proxy_buffering off;
  840. proxy_redirect off;
  841. }
  842. }"
  843. record_templates[mcr]="server {
  844. listen 80;
  845. #listen 443 ssl;
  846. server_name mcr.$nginx_domain;
  847. #ssl_certificate /path/to/your_domain_name.crt;
  848. #ssl_certificate_key /path/to/your_domain_name.key;
  849. #ssl_session_timeout 1d;
  850. #ssl_session_cache shared:SSL:50m;
  851. #ssl_session_tickets off;
  852. #ssl_protocols TLSv1.2 TLSv1.3;
  853. #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  854. #ssl_prefer_server_ciphers on;
  855. #ssl_buffer_size 8k;
  856. proxy_connect_timeout 600;
  857. proxy_send_timeout 600;
  858. proxy_read_timeout 600;
  859. send_timeout 600;
  860. location / {
  861. proxy_pass http://localhost:57000;
  862. proxy_set_header Host \$host;
  863. proxy_set_header X-Real-IP \$remote_addr;
  864. proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
  865. proxy_set_header X-Nginx-Proxy true;
  866. proxy_buffering off;
  867. proxy_redirect off;
  868. }
  869. }"
  870. record_templates[elastic]="server {
  871. listen 80;
  872. #listen 443 ssl;
  873. server_name elastic.$nginx_domain;
  874. #ssl_certificate /path/to/your_domain_name.crt;
  875. #ssl_certificate_key /path/to/your_domain_name.key;
  876. #ssl_session_timeout 1d;
  877. #ssl_session_cache shared:SSL:50m;
  878. #ssl_session_tickets off;
  879. #ssl_protocols TLSv1.2 TLSv1.3;
  880. #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  881. #ssl_prefer_server_ciphers on;
  882. #ssl_buffer_size 8k;
  883. proxy_connect_timeout 600;
  884. proxy_send_timeout 600;
  885. proxy_read_timeout 600;
  886. send_timeout 600;
  887. location / {
  888. proxy_pass http://localhost:58000;
  889. proxy_set_header Host \$host;
  890. proxy_set_header X-Real-IP \$remote_addr;
  891. proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
  892. proxy_set_header X-Nginx-Proxy true;
  893. proxy_buffering off;
  894. proxy_redirect off;
  895. }
  896. }"
  897. > /etc/nginx/conf.d/docker-proxy.conf
  898. for record in "${records_array[@]}"; do
  899. if [[ -n "${record_templates[$record]}" ]]; then
  900. echo "${record_templates[$record]}" >> /etc/nginx/conf.d/docker-proxy.conf
  901. fi
  902. done
  903. start_attempts=3
  904. for ((i=1; i<=$start_attempts; i++)); do
  905. start_nginx
  906. if pgrep "nginx" > /dev/null; then
  907. INFO "重新载入配置成功. Nginx服务启动完成"
  908. break
  909. else
  910. if [ $i -eq $start_attempts ]; then
  911. ERROR "Nginx 在尝试 $start_attempts 后无法启动。请检查配置"
  912. exit 1
  913. else
  914. WARN "第 $i 次启动 Nginx 失败。重试..."
  915. fi
  916. fi
  917. done
  918. break;;
  919. n|N )
  920. WARN "退出配置 Nginx 操作。"
  921. break;;
  922. * )
  923. INFO "请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}";;
  924. esac
  925. done
  926. }
  927. function CHECK_DOCKER() {
  928. status=$(systemctl is-active docker)
  929. if [ "$status" = "active" ]; then
  930. INFO "Docker 服务运行正常,请继续..."
  931. else
  932. ERROR "Docker 服务未运行,请查看日志报错,定位问题后再次执行脚本!"
  933. ERROR "-----------服务启动失败,请查看错误日志 ↓↓↓-----------"
  934. journalctl -u docker.service --no-pager
  935. ERROR "-----------服务启动失败,请查看错误日志 ↑↑↑-----------"
  936. exit 1
  937. fi
  938. }
  939. function INSTALL_DOCKER() {
  940. repo_file="docker-ce.repo"
  941. url="https://download.docker.com/linux/$repo_type"
  942. MAX_ATTEMPTS=3
  943. attempt=0
  944. success=false
  945. if [ "$repo_type" = "centos" ] || [ "$repo_type" = "rhel" ]; then
  946. if ! command -v docker &> /dev/null;then
  947. while [[ $attempt -lt $MAX_ATTEMPTS ]]; do
  948. attempt=$((attempt + 1))
  949. WARN "Docker 未安装,正在进行安装..."
  950. yum-config-manager --add-repo $url/$repo_file &>/dev/null
  951. $package_manager -y install docker-ce &>/dev/null
  952. if [ $? -eq 0 ]; then
  953. success=true
  954. break
  955. fi
  956. ERROR "Docker 安装失败,正在尝试重新下载 (尝试次数: $attempt)"
  957. done
  958. if $success; then
  959. INFO "Docker 安装成功,版本为:$(docker --version)"
  960. systemctl restart docker &>/dev/null
  961. CHECK_DOCKER
  962. systemctl enable docker &>/dev/null
  963. else
  964. ERROR "Docker 安装失败,请尝试手动安装"
  965. exit 1
  966. fi
  967. else
  968. INFO "Docker 已安装,安装版本为:$(docker --version)"
  969. systemctl restart docker | grep -E "ERROR|ELIFECYCLE|WARN"
  970. fi
  971. elif [ "$repo_type" == "ubuntu" ]; then
  972. if ! command -v docker &> /dev/null;then
  973. while [[ $attempt -lt $MAX_ATTEMPTS ]]; do
  974. attempt=$((attempt + 1))
  975. WARN "Docker 未安装,正在进行安装..."
  976. curl -fsSL $url/gpg | sudo apt-key add - &>/dev/null
  977. add-apt-repository "deb [arch=amd64] $url $(lsb_release -cs) stable" <<< $'\n' &>/dev/null
  978. $package_manager -y install docker-ce docker-ce-cli containerd.io &>/dev/null
  979. if [ $? -eq 0 ]; then
  980. success=true
  981. break
  982. fi
  983. ERROR "Docker 安装失败,正在尝试重新下载 (尝试次数: $attempt)"
  984. done
  985. if $success; then
  986. INFO "Docker 安装成功,版本为:$(docker --version)"
  987. systemctl restart docker &>/dev/null
  988. CHECK_DOCKER
  989. systemctl enable docker &>/dev/null
  990. else
  991. ERROR "Docker 安装失败,请尝试手动安装"
  992. exit 1
  993. fi
  994. else
  995. INFO "Docker 已安装,安装版本为:$(docker --version)"
  996. systemctl restart docker | grep -E "ERROR|ELIFECYCLE|WARN"
  997. fi
  998. elif [ "$repo_type" == "debian" ]; then
  999. if ! command -v docker &> /dev/null;then
  1000. while [[ $attempt -lt $MAX_ATTEMPTS ]]; do
  1001. attempt=$((attempt + 1))
  1002. WARN "Docker 未安装,正在进行安装..."
  1003. curl -fsSL $url/gpg | sudo apt-key add - &>/dev/null
  1004. add-apt-repository "deb [arch=amd64] $url $(lsb_release -cs) stable" <<< $'\n' &>/dev/null
  1005. $package_manager -y install docker-ce docker-ce-cli containerd.io &>/dev/null
  1006. if [ $? -eq 0 ]; then
  1007. success=true
  1008. break
  1009. fi
  1010. ERROR "Docker 安装失败,正在尝试重新下载 (尝试次数: $attempt)"
  1011. done
  1012. if $success; then
  1013. INFO "Docker 安装成功,版本为:$(docker --version)"
  1014. systemctl restart docker &>/dev/null
  1015. CHECK_DOCKER
  1016. systemctl enable docker &>/dev/null
  1017. else
  1018. ERROR "Docker 安装失败,请尝试手动安装"
  1019. exit 1
  1020. fi
  1021. else
  1022. INFO "Docker 已安装,安装版本为:$(docker --version)"
  1023. systemctl restart docker &>/dev/null
  1024. CHECK_DOCKER
  1025. fi
  1026. else
  1027. ERROR "不支持的操作系统."
  1028. exit 1
  1029. fi
  1030. }
  1031. function INSTALL_COMPOSE() {
  1032. SEPARATOR "安装Docker Compose"
  1033. TAG=`curl -s https://api.github.com/repos/docker/compose/releases/latest | jq -r '.tag_name'`
  1034. url="https://github.com/docker/compose/releases/download/$TAG/docker-compose-$(uname -s)-$(uname -m)"
  1035. MAX_ATTEMPTS=3
  1036. attempt=0
  1037. success=false
  1038. save_path="/usr/local/bin"
  1039. chmod +x $save_path/docker-compose &>/dev/null
  1040. if ! command -v docker-compose &> /dev/null || [ -z "$(docker-compose --version)" ]; then
  1041. WARN "Docker Compose 未安装或安装不完整,正在进行安装..."
  1042. while [ $attempt -lt $MAX_ATTEMPTS ]; do
  1043. attempt=$((attempt + 1))
  1044. wget --continue -q $url -O $save_path/docker-compose
  1045. if [ $? -eq 0 ]; then
  1046. chmod +x $save_path/docker-compose
  1047. version_check=$(docker-compose --version)
  1048. if [ -n "$version_check" ]; then
  1049. success=true
  1050. chmod +x $save_path/docker-compose
  1051. break
  1052. else
  1053. WARN "Docker Compose 下载的文件不完整,正在尝试重新下载 (尝试次数: $attempt)"
  1054. rm -f $save_path/docker-compose
  1055. fi
  1056. fi
  1057. ERROR "Docker Compose 下载失败,正在尝试重新下载 (尝试次数: $attempt)"
  1058. done
  1059. if $success; then
  1060. INFO "Docker Compose 安装成功,版本为:$(docker-compose --version)"
  1061. else
  1062. ERROR "Docker Compose 下载失败,请尝试手动安装docker-compose"
  1063. exit 1
  1064. fi
  1065. else
  1066. chmod +x $save_path/docker-compose
  1067. INFO "Docker Compose 已经安装,版本为:$(docker-compose --version)"
  1068. fi
  1069. }
  1070. function INSTALL_DOCKER_CN() {
  1071. MAX_ATTEMPTS=3
  1072. attempt=0
  1073. success=false
  1074. cpu_arch=$(uname -m)
  1075. save_path="/opt/docker_tgz"
  1076. mkdir -p $save_path
  1077. docker_ver="docker-27.1.2.tgz"
  1078. case $cpu_arch in
  1079. "arm64")
  1080. url="https://raw.gitcode.com/dqzboy/docker/blobs/2ce4d6bc245ab1c4525b3e6f55db7d710681e56f/$docker_ver"
  1081. ;;
  1082. "aarch64")
  1083. url="https://raw.gitcode.com/dqzboy/docker/blobs/2ce4d6bc245ab1c4525b3e6f55db7d710681e56f/$docker_ver"
  1084. ;;
  1085. "x86_64")
  1086. url="https://raw.gitcode.com/dqzboy/docker/blobs/179729785ed2c4a8c99aeb546fb6ac2864d7da5c/$docker_ver"
  1087. ;;
  1088. *)
  1089. ERROR "不支持的CPU架构: $cpu_arch"
  1090. exit 1
  1091. ;;
  1092. esac
  1093. if ! command -v docker &> /dev/null; then
  1094. while [ $attempt -lt $MAX_ATTEMPTS ]; do
  1095. attempt=$((attempt + 1))
  1096. WARN "Docker 未安装,正在进行安装..."
  1097. wget -P "$save_path" "$url" &>/dev/null
  1098. if [ $? -eq 0 ]; then
  1099. success=true
  1100. break
  1101. fi
  1102. ERROR "Docker 安装失败,正在尝试重新下载 (尝试次数: $attempt)"
  1103. done
  1104. if $success; then
  1105. tar -xzf $save_path/$docker_ver -C $save_path
  1106. \cp $save_path/docker/* /usr/bin/ &>/dev/null
  1107. rm -rf $save_path
  1108. INFO "Docker 安装成功,版本为:$(docker --version)"
  1109. cat > /usr/lib/systemd/system/docker.service <<EOF
  1110. [Unit]
  1111. Description=Docker Application Container Engine
  1112. Documentation=https://docs.docker.com
  1113. After=network-online.target firewalld.service
  1114. Wants=network-online.target
  1115. [Service]
  1116. Type=notify
  1117. ExecStart=/usr/bin/dockerd
  1118. ExecReload=/bin/kill -s HUP
  1119. LimitNOFILE=infinity
  1120. LimitNPROC=infinity
  1121. LimitCORE=infinity
  1122. TimeoutStartSec=0
  1123. Delegate=yes
  1124. KillMode=process
  1125. Restart=on-failure
  1126. StartLimitBurst=3
  1127. StartLimitInterval=60s
  1128. [Install]
  1129. WantedBy=multi-user.target
  1130. EOF
  1131. systemctl daemon-reload
  1132. systemctl restart docker &>/dev/null
  1133. CHECK_DOCKER
  1134. systemctl enable docker &>/dev/null
  1135. else
  1136. ERROR "Docker 安装失败,请尝试手动安装"
  1137. exit 1
  1138. fi
  1139. else
  1140. INFO "Docker 已安装,安装版本为:$(docker --version)"
  1141. systemctl restart docker &>/dev/null
  1142. CHECK_DOCKER
  1143. fi
  1144. }
  1145. function INSTALL_COMPOSE_CN() {
  1146. SEPARATOR "安装Docker Compose"
  1147. MAX_ATTEMPTS=3
  1148. attempt=0
  1149. cpu_arch=$(uname -m)
  1150. success=false
  1151. save_path="/usr/local/bin"
  1152. case $cpu_arch in
  1153. "arm64")
  1154. url="https://raw.gitcode.com/dqzboy/docker/blobs/b7be39a4442a103749c769ca48740e8e1a93a16c/docker-compose-linux-aarch64"
  1155. ;;
  1156. "aarch64")
  1157. url="https://raw.gitcode.com/dqzboy/docker/blobs/b7be39a4442a103749c769ca48740e8e1a93a16c/docker-compose-linux-aarch64"
  1158. ;;
  1159. "x86_64")
  1160. url="https://raw.gitcode.com/dqzboy/docker/blobs/df1b7935ced481a20d16141d97e163823ee793f5/docker-compose-linux-x86_64"
  1161. ;;
  1162. *)
  1163. ERROR "不支持的CPU架构: $cpu_arch"
  1164. exit 1
  1165. ;;
  1166. esac
  1167. chmod +x $save_path/docker-compose &>/dev/null
  1168. if ! command -v docker-compose &> /dev/null || [ -z "$(docker-compose --version)" ]; then
  1169. WARN "Docker Compose 未安装或安装不完整,正在进行安装..."
  1170. while [ $attempt -lt $MAX_ATTEMPTS ]; do
  1171. attempt=$((attempt + 1))
  1172. wget --continue -q $url -O $save_path/docker-compose
  1173. if [ $? -eq 0 ]; then
  1174. chmod +x $save_path/docker-compose
  1175. version_check=$(docker-compose --version)
  1176. if [ -n "$version_check" ]; then
  1177. success=true
  1178. chmod +x $save_path/docker-compose
  1179. break
  1180. else
  1181. WARN "Docker Compose 下载的文件不完整,正在尝试重新下载 (尝试次数: $attempt)"
  1182. rm -f $save_path/docker-compose
  1183. fi
  1184. fi
  1185. ERROR "Docker Compose 下载失败,正在尝试重新下载 (尝试次数: $attempt)"
  1186. done
  1187. if $success; then
  1188. INFO "Docker Compose 安装成功,版本为:$(docker-compose --version)"
  1189. else
  1190. ERROR "Docker Compose 下载失败,请尝试手动安装docker-compose"
  1191. exit 1
  1192. fi
  1193. else
  1194. chmod +x $save_path/docker-compose
  1195. INFO "Docker Compose 安装成功,版本为:$(docker-compose --version)"
  1196. fi
  1197. }
  1198. function update_docker_registry_url() {
  1199. local container_name=$1
  1200. if [[ -f "${PROXY_DIR}/${DOCKER_COMPOSE_FILE}" ]]; then
  1201. sed -i "s@- DOCKER_REGISTRY_URL=.*@- DOCKER_REGISTRY_URL=http://${container_name}:5000@g" ${PROXY_DIR}/${DOCKER_COMPOSE_FILE}
  1202. else
  1203. ERROR "文件 ${LIGHT_CYAN}${PROXY_DIR}/${DOCKER_COMPOSE_FILE} ${RESET} ${LIGHT_RED}不存在${RESET},导致容器无法应用新配置"
  1204. exit 1
  1205. fi
  1206. }
  1207. function CONFIG_FILES() {
  1208. while true; do
  1209. read -e -p "$(INFO "安装环境确认 [${LIGHT_GREEN}国外输1${RESET} ${LIGHT_YELLOW}国内输2${RESET}] > ")" install_docker_reg
  1210. case "$install_docker_reg" in
  1211. 1 )
  1212. files=(
  1213. "dockerhub reg-docker-hub ${GITRAW}/config/registry-hub.yml"
  1214. "gcr reg-gcr ${GITRAW}/config/registry-gcr.yml"
  1215. "ghcr reg-ghcr ${GITRAW}/config/registry-ghcr.yml"
  1216. "quay reg-quay ${GITRAW}/config/registry-quay.yml"
  1217. "k8sgcr reg-k8s-gcr ${GITRAW}/config/registry-k8sgcr.yml"
  1218. "k8s reg-k8s ${GITRAW}/config/registry-k8s.yml"
  1219. "mcr reg-mcr ${GITRAW}/config/registry-mcr.yml"
  1220. "elastic reg-elastic ${GITRAW}/config/registry-elastic.yml"
  1221. )
  1222. break;;
  1223. 2 )
  1224. files=(
  1225. "dockerhub reg-docker-hub ${CNGITRAW}/config/registry-hub.yml"
  1226. "gcr reg-gcr ${CNGITRAW}/config/registry-gcr.yml"
  1227. "ghcr reg-ghcr ${CNGITRAW}/config/registry-ghcr.yml"
  1228. "quay reg-quay ${CNGITRAW}/config/registry-quay.yml"
  1229. "k8sgcr reg-k8s-gcr ${CNGITRAW}/config/registry-k8sgcr.yml"
  1230. "k8s reg-k8s ${CNGITRAW}/config/registry-k8s.yml"
  1231. "mcr reg-mcr ${CNGITRAW}/config/registry-mcr.yml"
  1232. "elastic reg-elastic ${CNGITRAW}/config/registry-elastic.yml"
  1233. )
  1234. break;;
  1235. * )
  1236. INFO "请输入 ${LIGHT_GREEN}1${RESET} 表示国外 或者 ${LIGHT_YELLOW}2${RESET} 表示大陆";;
  1237. esac
  1238. done
  1239. }
  1240. function DOWN_CONFIG() {
  1241. selected_names=()
  1242. selected_files=()
  1243. selected_containers=()
  1244. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  1245. echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
  1246. echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
  1247. echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
  1248. echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
  1249. echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
  1250. echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
  1251. echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
  1252. echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
  1253. echo -e "${GREEN}9)${RESET} ${BOLD}all${RESET}"
  1254. echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
  1255. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  1256. read -e -p "$(INFO "输入序号下载对应配置文件,${LIGHT_YELLOW}空格分隔${RESET}多个选项. ${LIGHT_CYAN}all下载所有${RESET} > ")" choices_reg
  1257. while [[ ! "$choices_reg" =~ ^([0-9]+[[:space:]]*)+$ ]]; do
  1258. WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-9 ${RESET}序号"
  1259. read -e -p "$(INFO "输入序号下载对应配置文件,${LIGHT_YELLOW}空格分隔${RESET}多个选项. ${LIGHT_CYAN}all下载所有${RESET} > ")" choices_reg
  1260. done
  1261. if [[ "$choices_reg" == "9" ]]; then
  1262. for file in "${files[@]}"; do
  1263. file_name=$(echo "$file" | cut -d' ' -f1)
  1264. container_name=$(echo "$file" | cut -d' ' -f2)
  1265. file_url=$(echo "$file" | cut -d' ' -f3-)
  1266. selected_names+=("$file_name")
  1267. selected_containers+=("$container_name")
  1268. selected_files+=("$file_url")
  1269. wget -NP ${PROXY_DIR}/ $file_url &>/dev/null
  1270. done
  1271. selected_all=true
  1272. elif [[ "$choices_reg" == "0" ]]; then
  1273. WARN "退出下载配置! ${LIGHT_YELLOW}首次安装如果没有配置无法启动服务,只能启动UI服务${RESET}"
  1274. return
  1275. else
  1276. for choice in ${choices_reg}; do
  1277. if [[ $choice =~ ^[0-9]+$ ]] && ((choice > 0 && choice <= ${#files[@]})); then
  1278. file_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f1)
  1279. container_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f2)
  1280. file_url=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f3-)
  1281. selected_names+=("$file_name")
  1282. selected_containers+=("$container_name")
  1283. selected_files+=("$file_url")
  1284. wget -NP ${PROXY_DIR}/ $file_url &>/dev/null
  1285. else
  1286. WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-9 ${RESET}序号"
  1287. fi
  1288. done
  1289. selected_all=false
  1290. # 非更新配置操作则执行下面步骤
  1291. if [[ "$main_choice" != "4" ]]; then
  1292. first_selected_container=${selected_containers[0]}
  1293. update_docker_registry_url "$first_selected_container"
  1294. fi
  1295. fi
  1296. WARN "${LIGHT_GREEN}>>> 提示:${RESET} ${LIGHT_BLUE}Proxy代理缓存过期时间${RESET} ${MAGENTA}单位:ns、us、ms、s、m、h.默认ns,0禁用缓存过期${RESET}"
  1297. read -e -p "$(INFO "是否要修改缓存时间? ${PROMPT_YES_NO}")" modify_cache
  1298. while [[ "$modify_cache" != "y" && "$modify_cache" != "n" ]]; do
  1299. WARN "无效输入,请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}"
  1300. read -e -p "$(INFO "是否要修改缓存时间? ${PROMPT_YES_NO}")" modify_cache
  1301. done
  1302. if [[ "$modify_cache" == "y" ]]; then
  1303. while true; do
  1304. read -e -p "$(INFO "请输入新的缓存时间值: ")" new_ttl
  1305. for file_url in "${selected_files[@]}"; do
  1306. yml_name=$(basename "$file_url")
  1307. sed -ri "s/ttl: 168h/ttl: ${new_ttl}/g" ${PROXY_DIR}/${yml_name} &>/dev/null
  1308. done
  1309. break
  1310. done
  1311. fi
  1312. }
  1313. # 一键部署调此函数
  1314. function PROXY_HTTP() {
  1315. read -e -p "$(INFO "是否添加代理? ${PROMPT_YES_NO}")" modify_config
  1316. case $modify_config in
  1317. [Yy]* )
  1318. read -e -p "$(INFO "输入代理地址 ${LIGHT_MAGENTA}(eg: host:port)${RESET}: ")" url
  1319. while [[ -z "$url" ]]; do
  1320. WARN "代理${LIGHT_YELLOW}地址不能为空${RESET},请重新输入!"
  1321. read -e -p "$(INFO "输入代理地址 ${LIGHT_MAGENTA}(eg: host:port)${RESET}: ")" url
  1322. done
  1323. sed -i "s@#- http=http://host:port@- http_proxy=http://${url}@g" ${PROXY_DIR}/${DOCKER_COMPOSE_FILE}
  1324. sed -i "s@#- https=http://host:port@- https_proxy=http://${url}@g" ${PROXY_DIR}/${DOCKER_COMPOSE_FILE}
  1325. INFO "你配置代理地址为: ${CYAN}http://${url}${RESET}"
  1326. ;;
  1327. [Nn]* )
  1328. WARN "跳过添加代理配置"
  1329. ;;
  1330. * )
  1331. ERROR "无效的输入。请重新输入${LIGHT_GREEN}Y or N ${RESET}的选项"
  1332. PROXY_HTTP
  1333. ;;
  1334. esac
  1335. }
  1336. # 7) 本机Docker代理,调此函数
  1337. function DOCKER_PROXY_HTTP() {
  1338. WARN "${BOLD}${LIGHT_GREEN}提示:${RESET} ${LIGHT_CYAN}配置本机Docker服务走代理,加速本机Docker镜像下载${RESET}"
  1339. read -e -p "$(INFO "是否添加本机Docker服务代理? ${PROMPT_YES_NO}")" modify_proxy
  1340. case $modify_proxy in
  1341. [Yy]* )
  1342. read -e -p "$(INFO "输入代理地址 ${LIGHT_MAGENTA}(eg: host:port)${RESET}: ")" url
  1343. while [[ -z "$url" ]]; do
  1344. WARN "代理${LIGHT_YELLOW}地址不能为空${RESET},请重新输入。"
  1345. read -e -p "$(INFO "输入代理地址 ${LIGHT_MAGENTA}(eg: host:port)${RESET}: ")" url
  1346. done
  1347. INFO "你配置代理地址为: ${CYAN}http://${url}${RESET}"
  1348. ;;
  1349. [Nn]* )
  1350. WARN "退出本机Docker服务代理配置"
  1351. exit 1
  1352. ;;
  1353. * )
  1354. ERROR "无效的输入。请重新输入${LIGHT_GREEN}Y or N ${RESET}的选项"
  1355. DOCKER_PROXY_HTTP
  1356. ;;
  1357. esac
  1358. }
  1359. function CHECK_DOCKER_PROXY() {
  1360. local url=$1
  1361. local http_proxy=$(docker info 2>/dev/null | grep -i "HTTP Proxy" | awk -F ': ' '{print $2}')
  1362. local https_proxy=$(docker info 2>/dev/null | grep -i "HTTPS Proxy" | awk -F ': ' '{print $2}')
  1363. if [[ "$http_proxy" == "http://$url" && "$https_proxy" == "http://$url" ]]; then
  1364. INFO "Docker 代理${LIGHT_GREEN}配置成功${RESET},当前 HTTP Proxy: ${LIGHT_CYAN}$http_proxy${RESET}, HTTPS Proxy: ${LIGHT_CYAN}$https_proxy${RESET}"
  1365. else
  1366. ERROR "Docker 代理${LIGHT_RED}配置失败${RESET},请检查配置并重新执行配置"
  1367. DOCKER_PROXY_HTTP
  1368. fi
  1369. }
  1370. function ADD_DOCKERD_PROXY() {
  1371. mkdir -p /etc/systemd/system/docker.service.d
  1372. if [ ! -f /etc/systemd/system/docker.service.d/http-proxy.conf ]; then
  1373. cat > /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
  1374. [Service]
  1375. Environment="HTTP_PROXY=http://$url"
  1376. Environment="HTTPS_PROXY=http://$url"
  1377. EOF
  1378. systemctl daemon-reload
  1379. systemctl restart docker &>/dev/null
  1380. CHECK_DOCKER
  1381. CHECK_DOCKER_PROXY "$url"
  1382. else
  1383. if ! grep -q "HTTP_PROXY=http://$url" /etc/systemd/system/docker.service.d/http-proxy.conf || ! grep -q "HTTPS_PROXY=http://$url" /etc/systemd/system/docker.service.d/http-proxy.conf; then
  1384. cat >> /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
  1385. [Service]
  1386. Environment="HTTP_PROXY=http://$url"
  1387. Environment="HTTPS_PROXY=http://$url"
  1388. EOF
  1389. systemctl daemon-reload
  1390. systemctl restart docker &>/dev/null
  1391. CHECK_DOCKER
  1392. CHECK_DOCKER_PROXY "$url"
  1393. else
  1394. if [[ "$main_choice" = "7" ]]; then
  1395. WARN "已经存在相同的代理配置,${LIGHT_RED}请勿重复配置${RESET}"
  1396. fi
  1397. fi
  1398. fi
  1399. }
  1400. # 一键部署、安装指定容器加速服务时调用START_CONTAINER
  1401. function START_CONTAINER() {
  1402. CHECK_COMPOSE_CMD
  1403. if [ "$modify_config" = "y" ] || [ "$modify_config" = "Y" ]; then
  1404. ADD_DOCKERD_PROXY
  1405. else
  1406. INFO "拉取服务镜像并启动服务中,请稍等..."
  1407. fi
  1408. # DOWN_CONFIG函数执行后判断selected_all变量
  1409. if [ "$selected_all" = true ]; then
  1410. $DOCKER_COMPOSE_CMD up -d --force-recreate
  1411. # 检查命令执行是否成功
  1412. if [ $? -ne 0 ]; then
  1413. ERROR "Docker 容器${LIGHT_RED}启动失败${RESET},请通过查看日志确认启动失败原因"
  1414. exit 1
  1415. fi
  1416. else
  1417. $DOCKER_COMPOSE_CMD up -d "${selected_names[@]}" registry-ui
  1418. # 检查命令执行是否成功
  1419. if [ $? -ne 0 ]; then
  1420. ERROR "Docker 容器${LIGHT_RED}启动失败${RESET},请通过查看日志确认启动失败原因"
  1421. exit 1
  1422. else
  1423. INFO "容器${LIGHT_GREEN}安装完成${RESET},并${LIGHT_GREEN}成功启动${RESET}"
  1424. fi
  1425. fi
  1426. }
  1427. # 使用函数UPDATE_CONFIG时调用RESTART_CONTAINER
  1428. function RESTART_CONTAINER() {
  1429. CHECK_COMPOSE_CMD
  1430. # DOWN_CONFIG函数执行后判断selected_all变量
  1431. if [ "$selected_all" = true ]; then
  1432. $DOCKER_COMPOSE_CMD restart
  1433. # 检查命令执行是否成功
  1434. if [ $? -ne 0 ]; then
  1435. ERROR "Docker 容器启动失败,请通过查看日志确认启动失败原因"
  1436. exit 1
  1437. fi
  1438. else
  1439. $DOCKER_COMPOSE_CMD restart "${selected_names[@]}"
  1440. # 检查命令执行是否成功
  1441. if [ $? -ne 0 ]; then
  1442. ERROR "Docker 容器启动失败,请通过查看日志确认启动失败原因"
  1443. exit 1
  1444. fi
  1445. fi
  1446. }
  1447. function INSTALL_DOCKER_PROXY() {
  1448. SEPARATOR "部署Docker Proxy"
  1449. CONFIG_FILES
  1450. if [[ "$install_docker_reg" == "1" ]]; then
  1451. wget -NP ${PROXY_DIR}/ ${GITRAW}/${DOCKER_COMPOSE_FILE} &>/dev/null
  1452. elif [[ "$install_docker_reg" == "2" ]]; then
  1453. wget -NP ${PROXY_DIR}/ ${CNGITRAW}/${DOCKER_COMPOSE_FILE} &>/dev/null
  1454. fi
  1455. DOWN_CONFIG
  1456. PROXY_HTTP
  1457. START_CONTAINER
  1458. }
  1459. function STOP_REMOVE_CONTAINER() {
  1460. CHECK_COMPOSE_CMD
  1461. if [[ -f "${PROXY_DIR}/${DOCKER_COMPOSE_FILE}" ]]; then
  1462. INFO "停止和移除所有容器"
  1463. $DOCKER_COMPOSE_CMD -f "${PROXY_DIR}/${DOCKER_COMPOSE_FILE}" down --remove-orphans
  1464. else
  1465. WARN "${LIGHT_YELLOW}容器目前未处于运行状态,无需进行删除操作!${RESET}"
  1466. exit 1
  1467. fi
  1468. }
  1469. function UPDATE_CONFIG() {
  1470. while true; do
  1471. read -e -p "$(WARN "是否更新配置,更新前请确保您已备份现有配置,此操作不可逆? ${PROMPT_YES_NO}")" update_conf
  1472. case "$update_conf" in
  1473. y|Y )
  1474. CONFIG_FILES
  1475. DOWN_CONFIG
  1476. RESTART_CONTAINER
  1477. break;;
  1478. n|N )
  1479. WARN "退出配置更新操作。"
  1480. break;;
  1481. * )
  1482. INFO "请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}";;
  1483. esac
  1484. done
  1485. }
  1486. function REMOVE_NONE_TAG() {
  1487. docker images | grep "^${IMAGE_NAME}.*<none>" | awk '{print $3}' | xargs -r docker rmi
  1488. images=$(docker images ${IMAGE_NAME} --format '{{.Repository}}:{{.Tag}}')
  1489. latest=$(echo "$images" | sort -V | tail -n1)
  1490. for image in $images
  1491. do
  1492. if [ "$image" != "$latest" ];then
  1493. docker rmi $image
  1494. fi
  1495. done
  1496. }
  1497. function PACKAGE() {
  1498. while true; do
  1499. read -e -p "$(INFO "是否执行软件包安装? (${LIGHT_YELLOW}首次部署需安装依赖${RESET}) ${PROMPT_YES_NO}")" choice_package
  1500. case "$choice_package" in
  1501. y|Y )
  1502. INSTALL_PACKAGE
  1503. break;;
  1504. n|N )
  1505. WARN "跳过软件包安装步骤"
  1506. break;;
  1507. * )
  1508. INFO "请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}";;
  1509. esac
  1510. done
  1511. }
  1512. function INSTALL_WEB() {
  1513. while true; do
  1514. SEPARATOR "安装WEB服务"
  1515. read -e -p "$(INFO "是否安装WEB服务? (用来通过域名方式访问加速服务) ${PROMPT_YES_NO}")" choice_service
  1516. if [[ "$choice_service" =~ ^[YyNn]$ ]]; then
  1517. if [[ "$choice_service" == "Y" || "$choice_service" == "y" ]]; then
  1518. while true; do
  1519. read -e -p "$(INFO "选择安装的WEB服务。安装${LIGHT_CYAN}Caddy可自动开启HTTPS${RESET} [Nginx/Caddy]: ")" web_service
  1520. if [[ "$web_service" =~ ^(nginx|Nginx|caddy|Caddy)$ ]]; then
  1521. if [[ "$web_service" == "nginx" || "$web_service" == "Nginx" ]]; then
  1522. INSTALL_NGINX
  1523. CONFIG_NGINX
  1524. break
  1525. elif [[ "$web_service" == "caddy" || "$web_service" == "Caddy" ]]; then
  1526. INSTALL_CADDY
  1527. CONFIG_CADDY
  1528. break
  1529. fi
  1530. else
  1531. WARN "请输入 ${LIGHT_CYAN}nginx${RESET} 或 ${LIGHT_BLUE}caddy${RESET}"
  1532. fi
  1533. done
  1534. break
  1535. else
  1536. WARN "跳过WEB服务安装步骤"
  1537. break
  1538. fi
  1539. else
  1540. INFO "请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}"
  1541. fi
  1542. done
  1543. }
  1544. function PROMPT(){
  1545. PUBLIC_IP=$(curl -s https://ifconfig.me)
  1546. ALL_IPS=$(hostname -I)
  1547. INTERNAL_IP=$(echo "$ALL_IPS" | awk '$1!="127.0.0.1" && $1!="::1" && $1!="docker0" {print $1}')
  1548. echo
  1549. INFO "=================感谢您的耐心等待,安装已经完成=================="
  1550. INFO
  1551. INFO "请用浏览器访问 UI 面板: "
  1552. INFO "公网访问地址: ${UNDERLINE}http://$PUBLIC_IP:50000${RESET}"
  1553. INFO "内网访问地址: ${UNDERLINE}http://$INTERNAL_IP:50000${RESET}"
  1554. INFO
  1555. INFO "服务安装路径: ${LIGHT_BLUE}${PROXY_DIR}${RESET}"
  1556. INFO
  1557. INFO "作者博客: https://dqzboy.com"
  1558. INFO "技术交流: https://t.me/dqzboyblog"
  1559. INFO "代码仓库: https://github.com/dqzboy/Docker-Proxy"
  1560. INFO
  1561. INFO "若用云服务器并设域名及证书,需在安全组开放80、443端口;否则开放对应服务监听端口"
  1562. INFO
  1563. INFO "VPS推荐: https://my.racknerd.com/aff.php?aff=12151"
  1564. INFO
  1565. INFO "================================================================"
  1566. }
  1567. function INSTALL_PROXY() {
  1568. ALL_IN_ONE() {
  1569. CHECK_OS
  1570. CHECK_PACKAGE_MANAGER
  1571. CHECK_PKG_MANAGER
  1572. CHECK_COMPOSE_CMD
  1573. CHECKMEM
  1574. CHECKFIRE
  1575. CHECKBBR
  1576. PACKAGE
  1577. INSTALL_WEB
  1578. while true; do
  1579. SEPARATOR "安装Docker"
  1580. read -e -p "$(INFO "安装环境确认 [${LIGHT_GREEN}国外输1${RESET} ${LIGHT_YELLOW}国内输2${RESET}] > ")" deploy_docker
  1581. case "$deploy_docker" in
  1582. 1 )
  1583. INSTALL_DOCKER
  1584. INSTALL_COMPOSE
  1585. break;;
  1586. 2 )
  1587. INSTALL_DOCKER_CN
  1588. INSTALL_COMPOSE_CN
  1589. break;;
  1590. * )
  1591. INFO "请输入 ${LIGHT_GREEN}1${RESET} 表示国外 或者 ${LIGHT_YELLOW}2${RESET} 表示大陆";;
  1592. esac
  1593. done
  1594. INSTALL_DOCKER_PROXY
  1595. PROMPT
  1596. }
  1597. ADD_DOCKER_SERVICE() {
  1598. WARN "提示: 此操作是在你的服务器${LIGHT_CYAN}已经部署对应组件${RESET}后才可执行,否则执行过程将会出现${LIGHT_RED}各种报错!${RESET}"
  1599. INSTALL_DOCKER_PROXY
  1600. }
  1601. SEPARATOR "安装服务"
  1602. echo -e "1) 一键${BOLD}${LIGHT_GREEN}部署所有${RESET}服务"
  1603. echo -e "2) ${BOLD}${LIGHT_CYAN}安装指定${RESET}容器服务"
  1604. echo -e "3) ${BOLD}返回${LIGHT_RED}主菜单${RESET}"
  1605. echo -e "0) ${BOLD}退出脚本${RESET}"
  1606. echo "---------------------------------------------------------------"
  1607. read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" proxy_install
  1608. case $proxy_install in
  1609. 1)
  1610. ALL_IN_ONE
  1611. ;;
  1612. 2)
  1613. ADD_DOCKER_SERVICE
  1614. INSTALL_PROXY
  1615. ;;
  1616. 3)
  1617. main_menu
  1618. ;;
  1619. 0)
  1620. exit 1
  1621. ;;
  1622. *)
  1623. WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-3${RESET}的选项."
  1624. INSTALL_PROXY
  1625. ;;
  1626. esac
  1627. }
  1628. function REMOVE_CMDUI() {
  1629. CHECK_COMPOSE_CMD
  1630. CMDUI_NAME="hubcmd-ui"
  1631. CMDUI_DIR="${PROXY_DIR}/hubcmdui"
  1632. if [ -d "${CMDUI_DIR}" ]; then
  1633. if [ -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" ]; then
  1634. INFO "停止和移除HubCMD-UI容器"
  1635. $DOCKER_COMPOSE_CMD -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" down --remove-orphans
  1636. rm -rf "${CMDUI_DIR}"
  1637. else
  1638. WARN "${LIGHT_YELLOW}文件${CMDUI_DIR}/${DOCKER_COMPOSE_FILE} 不存在,无需进行删除操作!${RESET}"
  1639. fi
  1640. else
  1641. WARN "${LIGHT_YELLOW}目录 ${CMDUI_DIR} 不存在,无需进行删除操作!${RESET}"
  1642. fi
  1643. docker images | grep "^${CMDUI_IMAGE_NAME}.*<none>" | awk '{print $3}' | xargs -r docker rmi
  1644. images=$(docker images ${CMDUI_IMAGE_NAME} --format '{{.Repository}}:{{.Tag}}')
  1645. latest=$(echo "$images" | sort -V | tail -n1)
  1646. for image in $images; do
  1647. if [ "$image" != "$latest" ]; then
  1648. docker rmi $image
  1649. fi
  1650. done
  1651. # 强制移除所有相关镜像
  1652. docker rmi --force $(docker images -q ${CMDUI_IMAGE_NAME}) &>/dev/null
  1653. }
  1654. function HUBCMDUI() {
  1655. CHECK_COMPOSE_CMD
  1656. CMDUI_NAME="hubcmd-ui"
  1657. CMDUI_DIR="${PROXY_DIR}/hubcmdui"
  1658. CMDUI_PROMPT() {
  1659. PUBLIC_IP=$(curl -s https://ifconfig.me)
  1660. ALL_IPS=$(hostname -I)
  1661. INTERNAL_IP=$(echo "$ALL_IPS" | awk '$1!="127.0.0.1" && $1!="::1" && $1!="docker0" {print $1}')
  1662. echo
  1663. INFO "=================感谢您的耐心等待,安装已经完成=================="
  1664. INFO
  1665. INFO "请用浏览器访问 HubCMD-UI 面板: "
  1666. INFO "公网访问地址: ${UNDERLINE}http://$PUBLIC_IP:30080${RESET}"
  1667. INFO "内网访问地址: ${UNDERLINE}http://$INTERNAL_IP:30080${RESET}"
  1668. INFO
  1669. INFO "后端访问地址: 地址后面跟admin,例: ${UNDERLINE}http://$INTERNAL_IP:30080/admin${RESET}"
  1670. INFO "默认账号密码: ${LIGHT_GREEN}root${RESET}/${LIGHT_CYAN}admin@123${RESET}"
  1671. INFO
  1672. INFO "服务安装路径: ${LIGHT_BLUE}${CMDUI_DIR}${RESET}"
  1673. INFO
  1674. INFO "作者博客: https://dqzboy.com"
  1675. INFO "技术交流: https://t.me/dqzboyblog"
  1676. INFO "代码仓库: https://github.com/dqzboy/Docker-Proxy"
  1677. INFO
  1678. INFO "VPS推荐: https://my.racknerd.com/aff.php?aff=12151"
  1679. INFO
  1680. INFO "================================================================"
  1681. }
  1682. INSTALL_HUBCMDUI() {
  1683. mkdir -p ${CMDUI_DIR}
  1684. INFO "正在安装HubCMD-UI服务,请稍等!安装路径 ${LIGHT_CYAN}${CMDUI_DIR}${RESET}"
  1685. if [[ -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" ]]; then
  1686. if $DOCKER_COMPOSE_CMD ps --services 2>/dev/null | grep -q "^${CMDUI_NAME}$"; then
  1687. INFO "${CMDUI_NAME} 已经安装并启动,无需重复执行安装!"
  1688. else
  1689. $DOCKER_COMPOSE_CMD -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" up -d
  1690. fi
  1691. else
  1692. wget -NP ${CMDUI_DIR}/ ${CMDUI_COMPOSE_FILE} &>/dev/null
  1693. if [ $? -ne 0 ]; then
  1694. WARN "下载${LIGHT_YELLOW}docker-compose.yaml 文件失败${RESET},请稍后重试!"
  1695. HUBCMDUI
  1696. fi
  1697. $DOCKER_COMPOSE_CMD -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" up -d
  1698. if [ $? -eq 0 ]; then
  1699. CMDUI_PROMPT
  1700. exit 1
  1701. else
  1702. WARN "服务安装失败,请稍后重试!"
  1703. HUBCMDUI
  1704. fi
  1705. fi
  1706. }
  1707. UPDATE_HUBCMDUI() {
  1708. if [ -d "${CMDUI_DIR}" ]; then
  1709. if [ -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" ]; then
  1710. INFO "正在更新HubCMD-UI容器"
  1711. $DOCKER_COMPOSE_CMD -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" pull
  1712. if [ $? -ne 0 ]; then
  1713. WARN "HubCMD-UI ${LIGHT_YELLOW}镜像拉取失败${RESET},请稍后重试!"
  1714. HUBCMDUI
  1715. fi
  1716. $DOCKER_COMPOSE_CMD -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" up -d --force-recreate
  1717. if [ $? -ne 0 ]; then
  1718. WARN "HubCMD-UI ${LIGHT_YELLOW}服务启动失败${RESET},请稍后重试!"
  1719. HUBCMDUI
  1720. else
  1721. INFO "HubCMD-UI ${LIGHT_GREEN}服务更新并启动完成${RESET}"
  1722. fi
  1723. else
  1724. WARN "${LIGHT_YELLOW}文件${CMDUI_DIR}/${DOCKER_COMPOSE_FILE} 不存在,无法进行更新操作!${RESET}"
  1725. fi
  1726. else
  1727. WARN "${LIGHT_YELLOW}目录 ${CMDUI_DIR} 不存在,无法进行更新操作!${RESET}"
  1728. fi
  1729. }
  1730. UNINSTALL_HUBCMDUI() {
  1731. WARN "${LIGHT_RED}注意:${RESET} ${LIGHT_YELLOW}请执行删除之前确定是否需要备份配置文件${RESET}"
  1732. while true; do
  1733. read -e -p "$(INFO "本人${LIGHT_RED}已知晓后果,确认删除${RESET}服务? ${PROMPT_YES_NO}")" delcmdui
  1734. case "$delcmdui" in
  1735. y|Y )
  1736. REMOVE_CMDUI
  1737. break;;
  1738. n|N )
  1739. WARN "退出执行卸载服务"
  1740. break;;
  1741. * )
  1742. INFO "请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}";;
  1743. esac
  1744. done
  1745. }
  1746. SEPARATOR "HubCMD-UI管理"
  1747. echo -e "1) ${BOLD}${LIGHT_GREEN}安装${RESET}HubCMD-UI"
  1748. echo -e "2) ${BOLD}${LIGHT_YELLOW}卸载${RESET}HubCMD-UI"
  1749. echo -e "3) ${BOLD}${LIGHT_CYAN}更新${RESET}HubCMD-UI"
  1750. echo -e "4) ${BOLD}返回${LIGHT_RED}主菜单${RESET}"
  1751. echo -e "0) ${BOLD}退出脚本${RESET}"
  1752. echo "---------------------------------------------------------------"
  1753. read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" cmdui_choice
  1754. case $cmdui_choice in
  1755. 1)
  1756. INSTALL_HUBCMDUI
  1757. HUBCMDUI
  1758. ;;
  1759. 2)
  1760. UNINSTALL_HUBCMDUI
  1761. HUBCMDUI
  1762. ;;
  1763. 3)
  1764. UPDATE_HUBCMDUI
  1765. HUBCMDUI
  1766. ;;
  1767. 4)
  1768. main_menu
  1769. ;;
  1770. 0)
  1771. exit 1
  1772. ;;
  1773. *)
  1774. WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-4${RESET}的选项."
  1775. HUBCMDUI
  1776. ;;
  1777. esac
  1778. }
  1779. function COMP_INST() {
  1780. CHECK_COMPOSE_CMD
  1781. SEPARATOR "安装组件"
  1782. echo -e "1) ${BOLD}安装${LIGHT_GREEN}环境依赖${RESET}"
  1783. echo -e "2) ${BOLD}安装${LIGHT_CYAN}Docker${RESET}"
  1784. echo -e "3) ${BOLD}安装${LIGHT_MAGENTA}Compose${RESET}"
  1785. echo -e "4) ${BOLD}安装${GREEN}Nginx${RESET}"
  1786. echo -e "5) ${BOLD}安装${LIGHT_BLUE}Caddy${RESET}"
  1787. echo -e "6) ${BOLD}配置${LIGHT_YELLOW}Nginx${RESET}"
  1788. echo -e "7) ${BOLD}配置${CYAN}Caddy${RESET}"
  1789. echo -e "8) ${BOLD}安装${BLUE}HubCMD-UI${RESET}"
  1790. echo -e "9) ${BOLD}返回${LIGHT_RED}主菜单${RESET}"
  1791. echo -e "0) ${BOLD}退出脚本${RESET}"
  1792. echo "---------------------------------------------------------------"
  1793. read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" comp_choice
  1794. case $comp_choice in
  1795. 1)
  1796. CHECK_OS
  1797. CHECK_PACKAGE_MANAGER
  1798. CHECK_PKG_MANAGER
  1799. CHECKMEM
  1800. PACKAGE
  1801. COMP_INST
  1802. ;;
  1803. 2)
  1804. CHECK_OS
  1805. CHECK_PACKAGE_MANAGER
  1806. CHECK_PKG_MANAGER
  1807. while true; do
  1808. SEPARATOR "安装Docker"
  1809. read -e -p "$(INFO "安装环境确认 [${LIGHT_GREEN}国外输1${RESET} ${LIGHT_YELLOW}国内输2${RESET}] > ")" deploy_docker
  1810. case "$deploy_docker" in
  1811. 1 )
  1812. INSTALL_DOCKER
  1813. break;;
  1814. 2 )
  1815. INSTALL_DOCKER_CN
  1816. break;;
  1817. * )
  1818. INFO "请输入 ${LIGHT_GREEN}1${RESET} 表示国外 或者 ${LIGHT_YELLOW}2${RESET} 表示大陆";;
  1819. esac
  1820. done
  1821. COMP_INST
  1822. ;;
  1823. 3)
  1824. CHECK_OS
  1825. CHECK_PACKAGE_MANAGER
  1826. CHECK_PKG_MANAGER
  1827. while true; do
  1828. read -e -p "$(INFO "安装环境确认 [${LIGHT_GREEN}国外输1${RESET} ${LIGHT_YELLOW}国内输2${RESET}] > ")" deploy_compose
  1829. case "$deploy_compose" in
  1830. 1 )
  1831. INSTALL_COMPOSE
  1832. break;;
  1833. 2 )
  1834. INSTALL_COMPOSE_CN
  1835. break;;
  1836. * )
  1837. INFO "请输入 ${LIGHT_GREEN}1${RESET} 表示国外 或者 ${LIGHT_YELLOW}2${RESET} 表示大陆";;
  1838. esac
  1839. done
  1840. COMP_INST
  1841. ;;
  1842. 4)
  1843. CHECK_OS
  1844. CHECK_PACKAGE_MANAGER
  1845. CHECK_PKG_MANAGER
  1846. INSTALL_NGINX
  1847. COMP_INST
  1848. ;;
  1849. 5)
  1850. CHECK_OS
  1851. CHECK_PACKAGE_MANAGER
  1852. CHECK_PKG_MANAGER
  1853. INSTALL_CADDY
  1854. COMP_INST
  1855. ;;
  1856. 6)
  1857. CONFIG_NGINX
  1858. COMP_INST
  1859. ;;
  1860. 7)
  1861. CONFIG_CADDY
  1862. COMP_INST
  1863. ;;
  1864. 8)
  1865. HUBCMDUI
  1866. COMP_INST
  1867. ;;
  1868. 9)
  1869. main_menu
  1870. ;;
  1871. 0)
  1872. exit 1
  1873. ;;
  1874. *)
  1875. WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-8${RESET}的选项."
  1876. COMP_INST
  1877. ;;
  1878. esac
  1879. }
  1880. function SVC_MGMT() {
  1881. CHECK_COMPOSE_CMD
  1882. # 定义Docker容器服务名称
  1883. CONTAINER_SERVICES() {
  1884. services=(
  1885. "dockerhub"
  1886. "gcr"
  1887. "ghcr"
  1888. "quay"
  1889. "k8sgcr"
  1890. "k8s"
  1891. "mcr"
  1892. "elastic"
  1893. )
  1894. }
  1895. RESTART_SERVICE() {
  1896. CONTAINER_SERVICES
  1897. selected_services=()
  1898. WARN "重启服务请在${LIGHT_GREEN}${DOCKER_COMPOSE_FILE}${RESET}文件存储目录下执行脚本.默认安装路径: ${LIGHT_BLUE}${PROXY_DIR}${RESET}"
  1899. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  1900. echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
  1901. echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
  1902. echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
  1903. echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
  1904. echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
  1905. echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
  1906. echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
  1907. echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
  1908. echo -e "${GREEN}9)${RESET} ${BOLD}all${RESET}"
  1909. echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
  1910. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  1911. read -e -p "$(INFO "输入序号选择对应服务,${LIGHT_YELLOW}空格分隔${RESET}多个选项. ${LIGHT_CYAN}all选择所有${RESET} > ")" restart_service
  1912. if [[ "$restart_service" == "9" ]]; then
  1913. for service_name in "${services[@]}"; do
  1914. if $DOCKER_COMPOSE_CMD ps --services 2>/dev/null | grep -q "^${service_name}$"; then
  1915. selected_services+=("$service_name")
  1916. else
  1917. WARN "服务 ${service_name}未运行,跳过重启。"
  1918. fi
  1919. done
  1920. INFO "重启的服务: ${selected_services[*]}"
  1921. elif [[ "$restart_service" == "0" ]]; then
  1922. WARN "退出重启服务!"
  1923. exit 1
  1924. else
  1925. for choice in ${restart_service}; do
  1926. if [[ $choice =~ ^[0-9]+$ ]] && ((choice >0 && choice <= ${#services[@]})); then
  1927. service_name="${services[$((choice -1))]}"
  1928. if $DOCKER_COMPOSE_CMD ps --services 2>/dev/null | grep -q "^${service_name}$"; then
  1929. selected_services+=("$service_name")
  1930. else
  1931. WARN "服务 ${service_name} 未运行,跳过重启。"
  1932. fi
  1933. else
  1934. ERROR "无效的选择: $choice. 请重新${LIGHT_GREEN}选择0-9${RESET}的选项"
  1935. RESTART_SERVICE # 选择无效重新调用当前函数进行选择
  1936. fi
  1937. done
  1938. INFO "重启的服务: ${selected_services[*]}"
  1939. fi
  1940. }
  1941. UPDATE_SERVICE() {
  1942. CONTAINER_SERVICES
  1943. selected_services=()
  1944. WARN "更新服务请在${LIGHT_GREEN}${DOCKER_COMPOSE_FILE}${RESET}文件存储目录下执行脚本.默认安装路径: ${LIGHT_BLUE}${PROXY_DIR}${RESET}"
  1945. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  1946. echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
  1947. echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
  1948. echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
  1949. echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
  1950. echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
  1951. echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
  1952. echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
  1953. echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
  1954. echo -e "${GREEN}9)${RESET} ${BOLD}all${RESET}"
  1955. echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
  1956. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  1957. read -e -p "$(INFO "输入序号选择对应服务,${LIGHT_YELLOW}空格分隔${RESET}多个选项. ${LIGHT_CYAN}all选择所有${RESET} > ")" choices_service
  1958. if [[ "$choices_service" == "9" ]]; then
  1959. for service_name in "${services[@]}"; do
  1960. if $DOCKER_COMPOSE_CMD ps --services 2>/dev/null | grep -q "^${service_name}$"; then
  1961. selected_services+=("$service_name")
  1962. else
  1963. WARN "服务 ${service_name}未运行,跳过更新。"
  1964. fi
  1965. done
  1966. INFO "更新的服务: ${selected_services[*]}"
  1967. elif [[ "$choices_service" == "0" ]]; then
  1968. WARN "退出更新服务!"
  1969. exit 1
  1970. else
  1971. for choice in ${choices_service}; do
  1972. if [[ $choice =~ ^[0-9]+$ ]] && ((choice >0 && choice <= ${#services[@]})); then
  1973. service_name="${services[$((choice -1))]}"
  1974. if $DOCKER_COMPOSE_CMD ps --services 2>/dev/null | grep -q "^${service_name}$"; then
  1975. selected_services+=("$service_name")
  1976. else
  1977. WARN "服务 ${service_name} 未运行,跳过更新。"
  1978. fi
  1979. else
  1980. ERROR "无效的选择: $choice. 请重新${LIGHT_GREEN}选择0-9${RESET}的选项"
  1981. UPDATE_SERVICE # 选择无效重新调用当前函数进行选择
  1982. fi
  1983. done
  1984. INFO "更新的服务: ${selected_services[*]}"
  1985. fi
  1986. }
  1987. CONTAIENR_LOGS() {
  1988. CONTAINER_SERVICES
  1989. selected_services=()
  1990. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  1991. echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
  1992. echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
  1993. echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
  1994. echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
  1995. echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
  1996. echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
  1997. echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
  1998. echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
  1999. echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
  2000. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  2001. read -e -p "$(INFO "输入序号选择对应服务,${LIGHT_YELLOW}空格分隔${RESET}多个选项. ${LIGHT_CYAN}all选择所有${RESET} > ")" restart_service
  2002. if [[ "$restart_service" == "0" ]]; then
  2003. WARN "退出查看容器服务日志操作!"
  2004. exit 1
  2005. else
  2006. for choice in ${restart_service}; do
  2007. if [[ $choice =~ ^[0-9]+$ ]] && ((choice >0 && choice <= ${#services[@]})); then
  2008. service_name="${services[$((choice -1))]}"
  2009. if $DOCKER_COMPOSE_CMD ps --services 2>/dev/null | grep -q "^${service_name}$"; then
  2010. selected_services+=("$service_name")
  2011. else
  2012. WARN "服务 ${service_name} 未运行,无法查看容器日志。"
  2013. fi
  2014. else
  2015. ERROR "无效的选择: $choice. 请重新${LIGHT_GREEN}选择0-8${RESET}的选项"
  2016. CONTAIENR_LOGS # 选择无效重新调用当前函数进行选择
  2017. fi
  2018. done
  2019. INFO "查看日志的服务: ${selected_services[*]}"
  2020. fi
  2021. }
  2022. MODIFY_SERVICE_TTL_CONFIG() {
  2023. selected_services=()
  2024. selected_files=()
  2025. existing_files=()
  2026. non_existing_files=()
  2027. files=(
  2028. "dockerhub registry-hub.yml"
  2029. "gcr registry-gcr.yml"
  2030. "ghcr registry-ghcr.yml"
  2031. "quay registry-quay.yml"
  2032. "k8sgcr registry-k8sgcr.yml"
  2033. "k8s registry-k8s.yml"
  2034. "mcr registry-mcr.yml"
  2035. "elastic registry-elastic.yml"
  2036. )
  2037. while true; do
  2038. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  2039. echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
  2040. echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
  2041. echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
  2042. echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
  2043. echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
  2044. echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
  2045. echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
  2046. echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
  2047. echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
  2048. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  2049. read -e -p "$(INFO "输入序号修改服务对应配置文件,${LIGHT_YELLOW}空格分隔${RESET}多个选项 > ")" ttl_service
  2050. if [[ "$ttl_service" == "0" ]]; then
  2051. WARN "退出修改容器服务配置操作!"
  2052. return
  2053. elif [[ "$ttl_service" =~ ^([1-8]+[[:space:]]*)+$ ]]; then
  2054. break
  2055. else
  2056. WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-8 ${RESET}序号"
  2057. fi
  2058. done
  2059. for choice in ${ttl_service}; do
  2060. file_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f2)
  2061. service_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f1)
  2062. selected_files+=("$file_name")
  2063. if [ -f "${PROXY_DIR}/${file_name}" ]; then
  2064. existing_files+=("$file_name")
  2065. selected_services+=("$service_name")
  2066. else
  2067. non_existing_files+=("$file_name")
  2068. fi
  2069. if ! $DOCKER_COMPOSE_CMD ps --services 2>/dev/null | grep -q "^${service_name}$"; then
  2070. WARN "服务 ${service_name} 未运行。"
  2071. fi
  2072. done
  2073. if [ ${#existing_files[@]} -gt 0 ]; then
  2074. INFO "${GREEN}存在的配置文件:${RESET} ${existing_files[*]}${RESET}"
  2075. fi
  2076. if [ ${#non_existing_files[@]} -gt 0 ]; then
  2077. WARN "${RED}不存在的配置文件:${RESET} ${non_existing_files[*]}"
  2078. fi
  2079. if [ ${#existing_files[@]} -gt 0 ]; then
  2080. WARN "${LIGHT_GREEN}>>> 提示:${RESET} ${LIGHT_BLUE}Proxy代理缓存过期时间${RESET} ${MAGENTA}单位:ns、us、ms、s、m、h.默认ns,0禁用缓存过期${RESET}"
  2081. read -e -p "$(INFO "是否要修改缓存时间? ${PROMPT_YES_NO}")" modify_cache
  2082. while [[ "$modify_cache" != "y" && "$modify_cache" != "n" ]]; do
  2083. WARN "无效输入,请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}"
  2084. read -e -p "$(INFO "是否要修改缓存时间? ${PROMPT_YES_NO}")" modify_cache
  2085. done
  2086. if [[ "$modify_cache" == "y" ]]; then
  2087. while true; do
  2088. read -e -p "$(INFO "请输入新的缓存时间值: ")" new_ttl
  2089. for file_url in "${existing_files[@]}"; do
  2090. yml_name=$(basename "$file_url")
  2091. WARN "${YELLOW}正在修改配置文件: ${PROXY_DIR}/${yml_name}${RESET}"
  2092. sed -i "s/ttl: .*/ttl: ${new_ttl}/g" "${PROXY_DIR}/${yml_name}" &>/dev/null
  2093. INFO "${GREEN}配置文件 ${yml_name} 修改完成,代理缓存过期时间已设置为: ${new_ttl}${RESET}"
  2094. done
  2095. break
  2096. done
  2097. fi
  2098. else
  2099. WARN "未选择有效的配置文件进行修改。"
  2100. fi
  2101. }
  2102. ### 启动新容器
  2103. START_NEW_SERVER_CONFIG_FILES() {
  2104. while true; do
  2105. read -e -p "$(INFO "安装环境确认 [${LIGHT_GREEN}国外输1${RESET} ${LIGHT_YELLOW}国内输2${RESET}] > ")" install_docker_reg
  2106. case "$install_docker_reg" in
  2107. 1 )
  2108. files=(
  2109. "dockerhub reg-docker-hub ${GITRAW}/config/registry-hub.yml"
  2110. "gcr reg-gcr ${GITRAW}/config/registry-gcr.yml"
  2111. "ghcr reg-ghcr ${GITRAW}/config/registry-ghcr.yml"
  2112. "quay reg-quay ${GITRAW}/config/registry-quay.yml"
  2113. "k8sgcr reg-k8s-gcr ${GITRAW}/config/registry-k8sgcr.yml"
  2114. "k8s reg-k8s ${GITRAW}/config/registry-k8s.yml"
  2115. "mcr reg-mcr ${GITRAW}/config/registry-mcr.yml"
  2116. "elastic reg-elastic ${GITRAW}/config/registry-elastic.yml"
  2117. )
  2118. break;;
  2119. 2 )
  2120. files=(
  2121. "dockerhub reg-docker-hub ${CNGITRAW}/config/registry-hub.yml"
  2122. "gcr reg-gcr ${CNGITRAW}/config/registry-gcr.yml"
  2123. "ghcr reg-ghcr ${CNGITRAW}/config/registry-ghcr.yml"
  2124. "quay reg-quay ${CNGITRAW}/config/registry-quay.yml"
  2125. "k8sgcr reg-k8s-gcr ${CNGITRAW}/config/registry-k8sgcr.yml"
  2126. "k8s reg-k8s ${CNGITRAW}/config/registry-k8s.yml"
  2127. "mcr reg-mcr ${CNGITRAW}/config/registry-mcr.yml"
  2128. "elastic reg-elastic ${CNGITRAW}/config/registry-elastic.yml"
  2129. )
  2130. break;;
  2131. * )
  2132. INFO "请输入 ${LIGHT_GREEN}1${RESET} 表示国外 或者 ${LIGHT_YELLOW}2${RESET} 表示大陆";;
  2133. esac
  2134. done
  2135. }
  2136. START_NEW_SERVER_CONFIG_FILES() {
  2137. while true; do
  2138. read -e -p "$(INFO "安装环境确认 [${LIGHT_GREEN}国外输1${RESET} ${LIGHT_YELLOW}国内输2${RESET}] > ")" install_docker_reg
  2139. case "$install_docker_reg" in
  2140. 1 )
  2141. files=(
  2142. "dockerhub reg-docker-hub ${GITRAW}/config/registry-hub.yml"
  2143. "gcr reg-gcr ${GITRAW}/config/registry-gcr.yml"
  2144. "ghcr reg-ghcr ${GITRAW}/config/registry-ghcr.yml"
  2145. "quay reg-quay ${GITRAW}/config/registry-quay.yml"
  2146. "k8sgcr reg-k8s-gcr ${GITRAW}/config/registry-k8sgcr.yml"
  2147. "k8s reg-k8s ${GITRAW}/config/registry-k8s.yml"
  2148. "mcr reg-mcr ${GITRAW}/config/registry-mcr.yml"
  2149. "elastic reg-elastic ${GITRAW}/config/registry-elastic.yml"
  2150. )
  2151. break;;
  2152. 2 )
  2153. files=(
  2154. "dockerhub reg-docker-hub ${CNGITRAW}/config/registry-hub.yml"
  2155. "gcr reg-gcr ${CNGITRAW}/config/registry-gcr.yml"
  2156. "ghcr reg-ghcr ${CNGITRAW}/config/registry-ghcr.yml"
  2157. "quay reg-quay ${CNGITRAW}/config/registry-quay.yml"
  2158. "k8sgcr reg-k8s-gcr ${CNGITRAW}/config/registry-k8sgcr.yml"
  2159. "k8s reg-k8s ${CNGITRAW}/config/registry-k8s.yml"
  2160. "mcr reg-mcr ${CNGITRAW}/config/registry-mcr.yml"
  2161. "elastic reg-elastic ${CNGITRAW}/config/registry-elastic.yml"
  2162. )
  2163. break;;
  2164. * )
  2165. INFO "请输入 ${LIGHT_GREEN}1${RESET} 表示国外 或者 ${LIGHT_YELLOW}2${RESET} 表示大陆";;
  2166. esac
  2167. done
  2168. }
  2169. START_NEW_SERVER_DOWN_CONFIG() {
  2170. selected_names=()
  2171. selected_files=()
  2172. selected_containers=()
  2173. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  2174. echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
  2175. echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
  2176. echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
  2177. echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
  2178. echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
  2179. echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
  2180. echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
  2181. echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
  2182. echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
  2183. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  2184. read -e -p "$(INFO "输入序号下载对应配置文件,${LIGHT_YELLOW}空格分隔${RESET}多个选项 > ")" choices_newser
  2185. while [[ ! "$choices_newser" =~ ^([0-8]+[[:space:]]*)+$ ]]; do
  2186. WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-9 ${RESET}序号"
  2187. read -e -p "$(INFO "输入序号下载对应配置文件,${LIGHT_YELLOW}空格分隔${RESET}多个选项 > ")" choices_newser
  2188. done
  2189. if [[ "$choices_newser" == "0" ]]; then
  2190. WARN "退出下载配置! ${LIGHT_YELLOW}没有配置将无法启动服务!!!${RESET}"
  2191. return
  2192. else
  2193. for choice in ${choices_newser}; do
  2194. if [[ $choice =~ ^[0-9]+$ ]] && ((choice > 0 && choice <= ${#files[@]})); then
  2195. file_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f1)
  2196. container_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f2)
  2197. file_url=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f3-)
  2198. selected_names+=("$file_name")
  2199. selected_containers+=("$container_name")
  2200. selected_files+=("$file_url")
  2201. wget -NP ${PROXY_DIR}/ $file_url &>/dev/null
  2202. else
  2203. WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-8 ${RESET}序号"
  2204. fi
  2205. done
  2206. fi
  2207. WARN "${LIGHT_GREEN}>>> 提示:${RESET} ${LIGHT_BLUE}Proxy代理缓存过期时间${RESET} ${MAGENTA}单位:ns、us、ms、s、m、h.默认ns,0禁用缓存过期${RESET}"
  2208. read -e -p "$(INFO "是否要修改缓存时间? ${PROMPT_YES_NO}")" modify_cache
  2209. while [[ "$modify_cache" != "y" && "$modify_cache" != "n" ]]; do
  2210. WARN "无效输入,请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}"
  2211. read -e -p "$(INFO "是否要修改缓存时间? ${PROMPT_YES_NO}")" modify_cache
  2212. done
  2213. if [[ "$modify_cache" == "y" ]]; then
  2214. while true; do
  2215. read -e -p "$(INFO "请输入新的缓存时间值: ")" new_ttl
  2216. for file_url in "${selected_files[@]}"; do
  2217. yml_name=$(basename "$file_url")
  2218. sed -ri "s/ttl: 168h/ttl: ${new_ttl}/g" ${PROXY_DIR}/${yml_name} &>/dev/null
  2219. done
  2220. break
  2221. done
  2222. fi
  2223. }
  2224. START_NEW_DOCKER_SERVICE() {
  2225. if [ -d "${PROXY_DIR}" ]; then
  2226. if [ -f "${PROXY_DIR}/${DOCKER_COMPOSE_FILE}" ]; then
  2227. START_NEW_SERVER_CONFIG_FILES
  2228. START_NEW_SERVER_DOWN_CONFIG
  2229. PROXY_HTTP
  2230. INFO "正在启动新的容器服务,请稍等..."
  2231. $DOCKER_COMPOSE_CMD -f "${PROXY_DIR}/${DOCKER_COMPOSE_FILE}" up -d "${selected_names[@]}"
  2232. if [ $? -ne 0 ]; then
  2233. WARN "${selected_names[*]} ${LIGHT_YELLOW}服务启动失败${RESET},请排查!"
  2234. else
  2235. INFO "${selected_names[*]} ${LIGHT_GREEN}服务启动完成${RESET}"
  2236. fi
  2237. else
  2238. WARN "${LIGHT_YELLOW}文件${PROXY_DIR}/${DOCKER_COMPOSE_FILE} 不存在,无法启动新的容器!${RESET}"
  2239. fi
  2240. else
  2241. WARN "${LIGHT_YELLOW}目录 ${PROXY_DIR} 不存在,无法启动新的容器!${RESET}"
  2242. fi
  2243. }
  2244. ### 启动新容器 END
  2245. SEPARATOR "服务管理"
  2246. echo -e "1) ${BOLD}${LIGHT_GREEN}重启${RESET}服务"
  2247. echo -e "2) ${BOLD}${LIGHT_CYAN}更新${RESET}服务"
  2248. echo -e "3) ${BOLD}${LIGHT_MAGENTA}查看${RESET}日志"
  2249. echo -e "4) ${BOLD}${LIGHT_BLUE}缓存${RESET}时效"
  2250. echo -e "5) ${BOLD}启动${CYAN}新服务${RESET}"
  2251. echo -e "6) ${BOLD}返回${LIGHT_RED}主菜单${RESET}"
  2252. echo -e "0) ${BOLD}退出脚本${RESET}"
  2253. echo "---------------------------------------------------------------"
  2254. read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" ser_choice
  2255. case $ser_choice in
  2256. 1)
  2257. RESTART_SERVICE
  2258. if [ ${#selected_services[@]} -eq 0 ]; then
  2259. ERROR "没有需要重启的服务,请重新选择"
  2260. RESTART_SERVICE
  2261. else
  2262. $DOCKER_COMPOSE_CMD stop ${selected_services[*]}
  2263. $DOCKER_COMPOSE_CMD up -d --force-recreate ${selected_services[*]}
  2264. fi
  2265. SVC_MGMT
  2266. ;;
  2267. 2)
  2268. UPDATE_SERVICE
  2269. if [ ${#selected_services[@]} -eq 0 ]; then
  2270. ERROR "没有需要更新的服务,请重新选择"
  2271. UPDATE_SERVICE
  2272. else
  2273. $DOCKER_COMPOSE_CMD pull ${selected_services[*]}
  2274. $DOCKER_COMPOSE_CMD up -d --force-recreate ${selected_services[*]}
  2275. fi
  2276. SVC_MGMT
  2277. ;;
  2278. 3)
  2279. CONTAIENR_LOGS
  2280. if [ ${#selected_services[@]} -eq 0 ]; then
  2281. ERROR "没有需要查看的服务,请重新选择"
  2282. CONTAIENR_LOGS
  2283. else
  2284. # 查看最近30条日志
  2285. $DOCKER_COMPOSE_CMD logs --tail=30 ${selected_services[*]}
  2286. fi
  2287. SVC_MGMT
  2288. ;;
  2289. 4)
  2290. MODIFY_SERVICE_TTL_CONFIG
  2291. if [ ${#selected_services[@]} -eq 0 ]; then
  2292. ERROR "修改的服务未运行,请重新选择"
  2293. MODIFY_SERVICE_TTL_CONFIG
  2294. else
  2295. $DOCKER_COMPOSE_CMD restart ${selected_services[*]}
  2296. fi
  2297. SVC_MGMT
  2298. ;;
  2299. 5)
  2300. START_NEW_DOCKER_SERVICE
  2301. SVC_MGMT
  2302. ;;
  2303. 6)
  2304. main_menu
  2305. ;;
  2306. 0)
  2307. exit 1
  2308. ;;
  2309. *)
  2310. WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-5${RESET}的选项."
  2311. SVC_MGMT
  2312. ;;
  2313. esac
  2314. }
  2315. function ADD_SYS_CMD() {
  2316. MAX_ATTEMPTS=3
  2317. attempt=0
  2318. success=false
  2319. TARGET_PATH="/usr/bin/hub"
  2320. INSTALL_ENV() {
  2321. while true; do
  2322. read -e -p "$(INFO "安装环境确认 [${LIGHT_GREEN}国外输1${RESET} ${LIGHT_YELLOW}国内输2${RESET}] > ")" sys_cmd
  2323. case "$sys_cmd" in
  2324. 1 )
  2325. DOWNLOAD_URL="https://raw.githubusercontent.com/dqzboy/Docker-Proxy/main/install/DockerProxy_Install.sh"
  2326. break;;
  2327. 2 )
  2328. DOWNLOAD_URL="https://cdn.jsdelivr.net/gh/dqzboy/Docker-Proxy/install/DockerProxy_Install.sh"
  2329. break;;
  2330. * )
  2331. INFO "请输入 ${LIGHT_GREEN}1${RESET} 表示国外 或者 ${LIGHT_YELLOW}2${RESET} 表示大陆";;
  2332. esac
  2333. done
  2334. }
  2335. INSTALL_OR_UPDATE_CMD() {
  2336. local action=$1
  2337. while [[ $attempt -lt $MAX_ATTEMPTS ]]; do
  2338. attempt=$((attempt + 1))
  2339. if [[ "$action" == "安装" ]]; then
  2340. if command -v hub &> /dev/null; then
  2341. INFO "系统命令已存在,无需安装。"
  2342. success=true
  2343. break
  2344. fi
  2345. WARN "正在安装脚本中,请稍等..."
  2346. else
  2347. WARN "正在进行脚本更新,请稍等..."
  2348. if [ -f "$TARGET_PATH" ]; then
  2349. rm -f "$TARGET_PATH" &>/dev/null
  2350. fi
  2351. fi
  2352. wget -q -O "$TARGET_PATH" "$DOWNLOAD_URL" &>/dev/null
  2353. if [ $? -eq 0 ]; then
  2354. success=true
  2355. chmod +x "$TARGET_PATH"
  2356. break
  2357. fi
  2358. ERROR "${action}脚本${RED}失败${RESET},正在尝试重新${action} (尝试次数: $attempt)"
  2359. done
  2360. if $success; then
  2361. INFO "${action}脚本${GREEN}成功${RESET},命令行输入 ${LIGHT_GREEN}hub${RESET} 运行"
  2362. else
  2363. ERROR "设置系统命令失败"
  2364. exit 1
  2365. fi
  2366. }
  2367. SEPARATOR "设置脚本为系统命令"
  2368. echo -e "1) ${BOLD}安装${LIGHT_GREEN}系统命令${RESET}"
  2369. echo -e "2) ${BOLD}更新${LIGHT_CYAN}系统命令${RESET}"
  2370. echo -e "3) ${BOLD}返回${LIGHT_RED}主菜单${RESET}"
  2371. echo -e "0) ${BOLD}退出脚本${RESET}"
  2372. echo "---------------------------------------------------------------"
  2373. read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" cmd_choice
  2374. case $cmd_choice in
  2375. 1)
  2376. INSTALL_ENV
  2377. INSTALL_OR_UPDATE_CMD "安装"
  2378. ;;
  2379. 2)
  2380. INSTALL_ENV
  2381. INSTALL_OR_UPDATE_CMD "更新"
  2382. ;;
  2383. 3)
  2384. main_menu
  2385. ;;
  2386. 0)
  2387. exit 1
  2388. ;;
  2389. *)
  2390. WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-3${RESET}的选项."
  2391. ADD_SYS_CMD
  2392. ;;
  2393. esac
  2394. }
  2395. function UNI_DOCKER_SERVICE() {
  2396. CHECK_COMPOSE_CMD
  2397. RM_SERVICE() {
  2398. selected_containers=()
  2399. files=(
  2400. "dockerhub registry-hub.yml"
  2401. "gcr registry-gcr.yml"
  2402. "ghcr registry-ghcr.yml"
  2403. "quay registry-quay.yml"
  2404. "k8sgcr registry-k8sgcr.yml"
  2405. "k8s registry-k8s.yml"
  2406. "mcr registry-mcr.yml"
  2407. "elastic registry-elastic.yml"
  2408. )
  2409. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  2410. echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
  2411. echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
  2412. echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
  2413. echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
  2414. echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
  2415. echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
  2416. echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
  2417. echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
  2418. echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
  2419. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  2420. read -e -p "$(INFO "输入序号删除服务和对应配置文件,${LIGHT_YELLOW}空格分隔${RESET}多个选项 > ")" rm_service
  2421. while [[ ! "$rm_service" =~ ^([0-8]+[[:space:]]*)+$ ]]; do
  2422. WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-8 ${RESET}序号"
  2423. read -e -p "$(INFO "输入序号删除服务和对应配置文件,${LIGHT_YELLOW}空格分隔${RESET}多个选项 > ")" rm_service
  2424. done
  2425. if [[ "$rm_service" == "0" ]]; then
  2426. WARN "退出删除容器服务操作!"
  2427. return
  2428. else
  2429. selected_services=()
  2430. for choice in ${rm_service}; do
  2431. if [[ $choice =~ ^[0-8]+$ ]] && ((choice > 0 && choice <= ${#files[@]})); then
  2432. file_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f2)
  2433. service_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f1)
  2434. if $DOCKER_COMPOSE_CMD ps --services 2>/dev/null | grep -q "^${service_name}$"; then
  2435. selected_services+=("$service_name")
  2436. else
  2437. WARN "服务 ${LIGHT_MAGENTA}${service_name} 未运行${RESET},但将尝试删除相关文件。"
  2438. fi
  2439. if [ -f "${PROXY_DIR}/${file_name}" ]; then
  2440. rm -f "${PROXY_DIR}/${file_name}"
  2441. INFO "配置文件 ${LIGHT_CYAN}${file_name}${RESET} ${LIGHT_GREEN}已被删除${RESET}"
  2442. else
  2443. WARN "配置文件 ${LIGHT_CYAN}${file_name}${RESET} 不存在,${LIGHT_YELLOW}无需删除${RESET}"
  2444. fi
  2445. else
  2446. WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-8 ${RESET}序号"
  2447. UNI_DOCKER_SERVICE
  2448. return
  2449. fi
  2450. done
  2451. # 一次性删除所有选中的服务
  2452. if [ ${#selected_services[@]} -gt 0 ]; then
  2453. INFO "删除的服务: ${LIGHT_RED}${selected_services[*]}${RESET}"
  2454. $DOCKER_COMPOSE_CMD down ${selected_services[*]}
  2455. fi
  2456. fi
  2457. }
  2458. RM_ALLSERVICE() {
  2459. STOP_REMOVE_CONTAINER
  2460. REMOVE_NONE_TAG
  2461. REMOVE_CMDUI
  2462. docker rmi --force $(docker images -q ${IMAGE_NAME}) &>/dev/null
  2463. docker rmi --force $(docker images -q ${UI_IMAGE_NAME}) &>/dev/null
  2464. if [ -d "${PROXY_DIR}" ]; then
  2465. rm -rf "${PROXY_DIR}" &>/dev/null
  2466. fi
  2467. if [ -f "/usr/bin/hub" ]; then
  2468. rm -f /usr/bin/hub &>/dev/null
  2469. fi
  2470. INFO "${LIGHT_YELLOW}感谢您的使用,Docker-Proxy服务已卸载。欢迎您再次使用!${RESET}"
  2471. SEPARATOR "DONE"
  2472. }
  2473. CONFIREM_ACTION() {
  2474. local action_name=$1
  2475. local action_function=$2
  2476. WARN "${LIGHT_RED}注意:${RESET} ${LIGHT_YELLOW}卸载服务会一同将本地的配置和对应服务删除,请执行删除之前确定是否需要备份本地的配置文件${RESET}"
  2477. while true; do
  2478. read -e -p "$(INFO "本人${LIGHT_RED}已知晓后果,确认${action_name}${RESET}服务? ${PROMPT_YES_NO}")" uniservice
  2479. case "$uniservice" in
  2480. y|Y )
  2481. $action_function
  2482. break;;
  2483. n|N )
  2484. WARN "退出${action_name}服务."
  2485. break;;
  2486. * )
  2487. INFO "请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}";;
  2488. esac
  2489. done
  2490. }
  2491. SEPARATOR "卸载服务"
  2492. echo -e "1) ${BOLD}卸载${LIGHT_YELLOW}所有服务${RESET}"
  2493. echo -e "2) ${BOLD}删除${LIGHT_CYAN}指定服务${RESET}"
  2494. echo -e "3) ${BOLD}返回${LIGHT_RED}主菜单${RESET}"
  2495. echo -e "0) ${BOLD}退出脚本${RESET}"
  2496. echo "---------------------------------------------------------------"
  2497. read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" rm_choice
  2498. case $rm_choice in
  2499. 1)
  2500. CONFIREM_ACTION "卸载所有" RM_ALLSERVICE
  2501. ;;
  2502. 2)
  2503. CONFIREM_ACTION "删除指定" RM_SERVICE
  2504. UNI_DOCKER_SERVICE
  2505. ;;
  2506. 3)
  2507. main_menu
  2508. ;;
  2509. 0)
  2510. exit 1
  2511. ;;
  2512. *)
  2513. WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-3${RESET}的选项."
  2514. UNI_DOCKER_SERVICE
  2515. ;;
  2516. esac
  2517. }
  2518. function AUTH_SERVICE_CONFIG() {
  2519. CHECK_COMPOSE_CMD
  2520. CHECK_REG_AUTH() {
  2521. if ! command -v docker &> /dev/null; then
  2522. ERROR "docker 命令未找到,请确保 Docker 已正确安装"
  2523. AUTH_SERVICE_CONFIG
  2524. fi
  2525. declare -A services
  2526. services=(
  2527. ["reg-docker-hub"]="dockerhub"
  2528. ["reg-gcr"]="gcr"
  2529. ["reg-ghcr"]="ghcr"
  2530. ["reg-quay"]="quay"
  2531. ["reg-k8s-gcr"]="k8sgcr"
  2532. ["reg-k8s"]="k8s"
  2533. ["reg-mcr"]="mcr"
  2534. ["reg-elastic"]="elastic"
  2535. )
  2536. container_names=$(docker ps --filter "name=reg-" --filter "status=running" --format "{{.Names}}")
  2537. # 检查哪些容器正在运行
  2538. for container_name in "${!services[@]}"; do
  2539. if docker ps --filter "name=$container_name" --filter "status=running" --format "{{.Names}}" | grep -q "$container_name"; then
  2540. running_containers+=("${services[$container_name]}")
  2541. else
  2542. stopped_containers+=("${services[$container_name]}")
  2543. fi
  2544. done
  2545. if [ ${#running_containers[@]} -gt 0 ]; then
  2546. INFO "当前运行的 Docker 容器有: ${LIGHT_CYAN}${running_containers[*]}${RESET}"
  2547. else
  2548. WARN "当前没有运行的 Docker 容器"
  2549. AUTH_SERVICE_CONFIG # 如果没有运行的容器,直接返回
  2550. fi
  2551. auth_containers=()
  2552. non_auth_containers=()
  2553. for container_name in $container_names; do
  2554. specified_name=${services[$container_name]}
  2555. if [ -z "$specified_name" ]; then
  2556. specified_name=$container_name
  2557. fi
  2558. if docker exec $container_name grep -q "auth" /etc/distribution/config.yml; then
  2559. auth_containers+=("$specified_name")
  2560. else
  2561. non_auth_containers+=("$specified_name")
  2562. fi
  2563. done
  2564. if [ ${#auth_containers[@]} -gt 0 ]; then
  2565. INFO "当前运行的 Docker 容器中${LIGHT_GREEN}包含认证${RESET}的容器有: ${LIGHT_CYAN}${auth_containers[*]}${RESET}"
  2566. else
  2567. WARN "当前运行的 Docker 容器中${LIGHT_YELLOW}没有包含认证${RESET}的容器"
  2568. fi
  2569. if [ ${#non_auth_containers[@]} -gt 0 ]; then
  2570. WARN "当前运行的 Docker 容器中${LIGHT_YELLOW}没有包含认证${RESET}的容器有: ${LIGHT_BLUE}${non_auth_containers[*]}${RESET}"
  2571. else
  2572. INFO "当前运行的 Docker 容器中${LIGHT_GREEN}所有容器都包含认证${RESET}"
  2573. fi
  2574. }
  2575. AUTH_MENU() {
  2576. CHECK_REG_AUTH
  2577. selected_files=()
  2578. selected_services=()
  2579. files=(
  2580. "dockerhub registry-hub.yml"
  2581. "gcr registry-gcr.yml"
  2582. "ghcr registry-ghcr.yml"
  2583. "quay registry-quay.yml"
  2584. "k8sgcr registry-k8sgcr.yml"
  2585. "k8s registry-k8s.yml"
  2586. "mcr registry-mcr.yml"
  2587. "elastic registry-elastic.yml"
  2588. )
  2589. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  2590. echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
  2591. echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
  2592. echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
  2593. echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
  2594. echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
  2595. echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
  2596. echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
  2597. echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
  2598. echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
  2599. echo -e "${YELLOW}-------------------------------------------------${RESET}"
  2600. read -e -p "$(INFO "输入序号选择添加认证的服务,${LIGHT_YELLOW}空格分隔${RESET}多个选项 > ")" auth_service
  2601. while [[ ! "$auth_service" =~ ^([0-8]+[[:space:]]*)+$ ]]; do
  2602. WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-8 ${RESET}序号"
  2603. read -e -p "$(INFO "输入序号选择添加认证的服务,${LIGHT_YELLOW}空格分隔${RESET}多个选项 > ")" auth_service
  2604. done
  2605. }
  2606. ADD_AUTH_CONFIG() {
  2607. local FILE=$1
  2608. local auth_config="
  2609. auth:
  2610. htpasswd:
  2611. realm: basic-realm
  2612. path: /auth/htpasswd"
  2613. if [ ! -f "$FILE" ]; then
  2614. ERROR "配置文件 ${LIGHT_BLUE}$FILE${RESET} 不存在"
  2615. exit 1
  2616. else
  2617. if ! grep -q "auth:" "$FILE" || ! grep -q "htpasswd:" "$FILE" || ! grep -q "realm: basic-realm" "$FILE" || ! grep -q "path: /auth/htpasswd" "$FILE"; then
  2618. echo -e "$auth_config" | sudo tee -a "$FILE" > /dev/null
  2619. INFO "配置文件 ${LIGHT_BLUE}$FILE${RESET} 添加认证配置成功"
  2620. else
  2621. WARN "配置文件 ${LIGHT_BLUE}$FILE${RESET} 已添加认证配置"
  2622. fi
  2623. fi
  2624. }
  2625. ADD_AUTH_COMPOSE() {
  2626. local SERVICES=$1
  2627. local FILE=${DOCKER_COMPOSE_FILE}
  2628. local HTPASSWD_CONFIG=" - ./${SERVICES}_htpasswd:/auth/htpasswd"
  2629. if [ ! -f "$FILE" ]; then
  2630. ERROR "配置文件 ${LIGHT_BLUE}$FILE${RESET} 不存在"
  2631. exit 1
  2632. fi
  2633. for SERVICE in "${SERVICES[@]}"; do
  2634. if grep -q " $SERVICE:" "$FILE"; then
  2635. if ! grep -A10 " $SERVICE:" "$FILE" | grep -q " - ./${SERVICES}_htpasswd:/auth/htpasswd"; then
  2636. sed -i "/ $SERVICE:/,/volumes:/ {
  2637. /volumes:/a\\
  2638. $HTPASSWD_CONFIG
  2639. }" "$FILE"
  2640. INFO "Htpasswd配置添加到 ${LIGHT_GREEN}$SERVICE${RESET} 服务中"
  2641. else
  2642. WARN "Htpasswd配置已存在 ${LIGHT_YELLOW}$SERVICE${RESET} 服务中"
  2643. fi
  2644. else
  2645. ERROR "服务 $SERVICE 在 $FILE 中不存在"
  2646. fi
  2647. done
  2648. }
  2649. DEL_AUTH_CONFIG() {
  2650. local FILE=$1
  2651. if [ ! -f "$FILE" ]; then
  2652. ERROR "配置文件 $FILE 不存在"
  2653. else
  2654. if grep -q "auth:" "$FILE"; then
  2655. sed -i '/^auth:$/,/^[^[:space:]]/d' "$FILE" >/dev/null
  2656. INFO "配置文件 ${LIGHT_BLUE}$FILE${RESET} 成功移除认证信息"
  2657. else
  2658. WARN "配置文件 ${LIGHT_BLUE}$FILE${RESET} 不存在认证信息"
  2659. fi
  2660. fi
  2661. }
  2662. DEL_AUTH_COMPOSE() {
  2663. local SERVICES=$1
  2664. local FILE=${DOCKER_COMPOSE_FILE}
  2665. if [ ! -f "$FILE" ]; then
  2666. ERROR "$File 不存在"
  2667. exit 1
  2668. fi
  2669. for SERVICE in "${SERVICES[@]}"; do
  2670. if grep -q " $SERVICE:" "$FILE"; then
  2671. sed -i "/ $SERVICE:/,/^[^[:space:]]/ {/^[[:space:]]*- .\/${SERVICES}_htpasswd:\/auth\/htpasswd/d}" "$FILE"
  2672. else
  2673. ERROR "$FILE 中不存在服务 $SERVICE"
  2674. fi
  2675. done
  2676. }
  2677. ENABLE_AUTH() {
  2678. AUTH_MENU
  2679. if [[ "$auth_service" == "0" ]]; then
  2680. WARN "退出添加容器认证操作!"
  2681. return
  2682. else
  2683. for choice in ${auth_service}; do
  2684. if [[ $choice =~ ^[0-8]+$ ]] && ((choice > 0 && choice <= ${#files[@]})); then
  2685. file_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f2)
  2686. service_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f1)
  2687. selected_files+=("$file_name")
  2688. if $DOCKER_COMPOSE_CMD ps --services 2>/dev/null | grep -q "^${service_name}$"; then
  2689. selected_services+=("$service_name")
  2690. else
  2691. WARN "服务 ${LIGHT_MAGENTA}${service_name} 未运行${RESET},无法添加认证授权"
  2692. fi
  2693. else
  2694. WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-8 ${RESET}序号"
  2695. AUTH_MENU
  2696. return
  2697. fi
  2698. done
  2699. WARN "${LIGHT_GREEN}>>> 提示:${RESET} ${LIGHT_CYAN}配置认证后,执行镜像拉取需先通过 docker login登入后使用.访问UI需输入账号密码${RESET}"
  2700. read -e -p "$(INFO "是否需要配置镜像仓库访问账号和密码? ${PROMPT_YES_NO}")" enable_auth
  2701. while [[ "$enable_auth" != "y" && "$enable_auth" != "n" ]]; do
  2702. WARN "无效输入,请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}"
  2703. read -e -p "$(INFO "是否需要配置镜像仓库访问账号和密码? ${PROMPT_YES_NO}")" enable_auth
  2704. done
  2705. if [[ "$enable_auth" == "y" ]]; then
  2706. while true; do
  2707. read -e -p "$(INFO "请输入账号名称: ")" username
  2708. if [[ -z "$username" ]]; then
  2709. ERROR "用户名不能为空。请重新输入"
  2710. else
  2711. break
  2712. fi
  2713. done
  2714. while true; do
  2715. read -e -p "$(INFO "请输入账号密码: ")" password
  2716. if [[ -z "$password" ]]; then
  2717. ERROR "密码不能为空。请重新输入"
  2718. else
  2719. break
  2720. fi
  2721. done
  2722. for file_url in "${selected_files[@]}"; do
  2723. yml_name=$(basename "$file_url")
  2724. ADD_AUTH_CONFIG "${PROXY_DIR}/${yml_name}"
  2725. done
  2726. for server in "${selected_services[@]}"; do
  2727. htpasswd -Bbc ${PROXY_DIR}/${server}_htpasswd "$username" "$password" 2>/dev/null
  2728. ADD_AUTH_COMPOSE "${server}"
  2729. done
  2730. fi
  2731. fi
  2732. }
  2733. DELETE_AUTH() {
  2734. AUTH_MENU
  2735. if [[ "$auth_service" == "0" ]]; then
  2736. WARN "退出移除容器认证操作!"
  2737. return
  2738. else
  2739. for choice in ${auth_service}; do
  2740. if [[ $choice =~ ^[0-8]+$ ]] && ((choice > 0 && choice <= ${#files[@]})); then
  2741. file_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f2)
  2742. service_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f1)
  2743. selected_files+=("$file_name")
  2744. if $DOCKER_COMPOSE_CMD ps --services 2>/dev/null | grep -q "^${service_name}$"; then
  2745. selected_services+=("$service_name")
  2746. else
  2747. WARN "服务 ${LIGHT_MAGENTA}${service_name} 未运行${RESET},无法添加认证授权"
  2748. fi
  2749. else
  2750. WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-8 ${RESET}序号"
  2751. AUTH_MENU
  2752. return
  2753. fi
  2754. done
  2755. for file_url in "${selected_files[@]}"; do
  2756. yml_name=$(basename "$file_url")
  2757. DEL_AUTH_CONFIG "${PROXY_DIR}/${yml_name}"
  2758. done
  2759. for server in "${selected_services[@]}"; do
  2760. DEL_AUTH_COMPOSE "${server}"
  2761. rm -f ${PROXY_DIR}/${server}_htpasswd
  2762. done
  2763. fi
  2764. }
  2765. SEPARATOR "认证授权"
  2766. echo -e "1) ${BOLD}${LIGHT_YELLOW}添加${RESET}认证"
  2767. echo -e "2) ${BOLD}${LIGHT_CYAN}删除${RESET}认证"
  2768. echo -e "3) ${BOLD}返回${LIGHT_RED}主菜单${RESET}"
  2769. echo -e "0) ${BOLD}退出脚本${RESET}"
  2770. echo "---------------------------------------------------------------"
  2771. read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" auth_choice
  2772. case $auth_choice in
  2773. 1)
  2774. ENABLE_AUTH
  2775. if [ ${#selected_services[@]} -eq 0 ]; then
  2776. WARN "退出认证授权,请${LIGHT_CYAN}重新选择${RESET}服务认证的操作"
  2777. AUTH_SERVICE_CONFIG # 没有服务运行调用函数
  2778. else
  2779. $DOCKER_COMPOSE_CMD down ${selected_services[*]}
  2780. $DOCKER_COMPOSE_CMD up -d --force-recreate ${selected_services[*]}
  2781. fi
  2782. AUTH_SERVICE_CONFIG
  2783. ;;
  2784. 2)
  2785. DELETE_AUTH
  2786. if [ ${#selected_services[@]} -eq 0 ]; then
  2787. WARN "退出认证授权,请${LIGHT_CYAN}重新选择${RESET}服务认证的操作"
  2788. AUTH_SERVICE_CONFIG # 没有服务运行调用函数
  2789. else
  2790. $DOCKER_COMPOSE_CMD down ${selected_services[*]}
  2791. $DOCKER_COMPOSE_CMD up -d --force-recreate ${selected_services[*]}
  2792. fi
  2793. AUTH_SERVICE_CONFIG
  2794. ;;
  2795. 3)
  2796. main_menu
  2797. ;;
  2798. 0)
  2799. exit 1
  2800. ;;
  2801. *)
  2802. WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-3${RESET}的选项."
  2803. AUTH_SERVICE_CONFIG
  2804. ;;
  2805. esac
  2806. }
  2807. ## 主菜单
  2808. function main_menu() {
  2809. echo -e "╔════════════════════════════════════════════════════╗"
  2810. echo -e "║ ║"
  2811. echo -e "║ ${LIGHT_CYAN}欢迎使用Docker-Proxy${RESET} ║"
  2812. echo -e "║ ║"
  2813. echo -e "║ TG频道: ${UNDERLINE}https://t.me/dqzboyblog${RESET} ║"
  2814. echo -e "║ ║"
  2815. echo -e "║ ${LIGHT_BLUE}by dqzboy${RESET} ║"
  2816. echo -e "║ ║"
  2817. echo -e "╚════════════════════════════════════════════════════╝"
  2818. echo
  2819. SEPARATOR "请选择操作"
  2820. echo -e "1) ${BOLD}${LIGHT_GREEN}安装${RESET}服务"
  2821. echo -e "2) ${BOLD}${LIGHT_MAGENTA}组件${RESET}安装"
  2822. echo -e "3) ${BOLD}${LIGHT_YELLOW}管理${RESET}服务"
  2823. echo -e "4) ${BOLD}${LIGHT_CYAN}更新${RESET}配置"
  2824. echo -e "5) ${BOLD}${LIGHT_RED}卸载${RESET}服务"
  2825. echo -e "6) ${BOLD}${LIGHT_BLUE}认证${RESET}授权"
  2826. echo -e "7) 本机${BOLD}${CYAN}Docker代理${RESET}"
  2827. echo -e "8) 设置成${BOLD}${YELLOW}系统命令${RESET}"
  2828. echo -e "0) ${BOLD}退出脚本${RESET}"
  2829. echo "---------------------------------------------------------------"
  2830. read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" main_choice
  2831. case $main_choice in
  2832. 1)
  2833. INSTALL_PROXY
  2834. ;;
  2835. 2)
  2836. COMP_INST
  2837. ;;
  2838. 3)
  2839. SVC_MGMT
  2840. ;;
  2841. 4)
  2842. SEPARATOR "更新配置"
  2843. UPDATE_CONFIG
  2844. SEPARATOR "更新完成"
  2845. ;;
  2846. 5)
  2847. UNI_DOCKER_SERVICE
  2848. ;;
  2849. 6)
  2850. AUTH_SERVICE_CONFIG
  2851. ;;
  2852. 7)
  2853. SEPARATOR "配置本机Docker代理"
  2854. DOCKER_PROXY_HTTP
  2855. ADD_DOCKERD_PROXY
  2856. SEPARATOR "Docker代理配置完成"
  2857. ;;
  2858. 8)
  2859. ADD_SYS_CMD
  2860. ;;
  2861. 0)
  2862. exit 1
  2863. ;;
  2864. *)
  2865. WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-7${RESET}的选项."
  2866. sleep 2; main_menu
  2867. ;;
  2868. esac
  2869. }
  2870. main_menu