| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933 |
- #!/usr/bin/env bash
- #===============================================================================
- #
- # FILE: DockerProxy_Install.sh
- #
- # USAGE: ./DockerProxy_Install.sh
- #
- # DESCRIPTION: 自建Docker镜像加速服务,基于官方 registry 一键部署Docker、K8s、Quay、Ghcr镜像加速\管理服务.支持部署到Render.
- #
- # ORGANIZATION: DingQz dqzboy.com 浅时光博客
- #===============================================================================
- echo
- cat << EOF
- ██████╗ ██████╗ ██████╗██╗ ██╗███████╗██████╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗██╗ ██╗
- ██╔══██╗██╔═══██╗██╔════╝██║ ██╔╝██╔════╝██╔══██╗ ██╔══██╗██╔══██╗██╔═══██╗╚██╗██╔╝╚██╗ ██╔╝
- ██║ ██║██║ ██║██║ █████╔╝ █████╗ ██████╔╝ ██████╔╝██████╔╝██║ ██║ ╚███╔╝ ╚████╔╝
- ██║ ██║██║ ██║██║ ██╔═██╗ ██╔══╝ ██╔══██╗ ██╔═══╝ ██╔══██╗██║ ██║ ██╔██╗ ╚██╔╝
- ██████╔╝╚██████╔╝╚██████╗██║ ██╗███████╗██║ ██║ ██║ ██║ ██║╚██████╔╝██╔╝ ██╗ ██║
- ╚═════╝ ╚═════╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝
- 博客: dqzboy.com 浅时光博客
- 项目地址: https://github.com/dqzboy/Docker-Proxy
-
- EOF
- echo "----------------------------------------------------------------------------------------------------------"
- echo -e "\033[32m机场推荐\033[0m(\033[34m按量不限时,解锁ChatGPT\033[0m):\033[34;4mhttps://mojie.mx/#/register?code=CG6h8Irm\033[0m"
- echo "----------------------------------------------------------------------------------------------------------"
- echo
- echo
- GREEN="\033[0;32m"
- RED="\033[31m"
- YELLOW="\033[33m"
- RESET="\033[0m"
- BLUE="\033[0;34m"
- MAGENTA="\033[0;35m"
- CYAN="\033[0;36m"
- WHITE="\033[1;37m"
- BLACK="\033[0;30m"
- PINK="\033[0;95m"
- LIGHT_GREEN="\033[1;32m"
- LIGHT_RED="\033[1;31m"
- LIGHT_YELLOW="\033[1;33m"
- LIGHT_BLUE="\033[1;34m"
- LIGHT_MAGENTA="\033[1;35m"
- LIGHT_CYAN="\033[1;36m"
- LIGHT_PINK="\033[1;95m"
- BRIGHT_CYAN="\033[96m"
- BOLD="\033[1m"
- UNDERLINE="\033[4m"
- BLINK="\033[5m"
- REVERSE="\033[7m"
- INFO="[${GREEN}INFO${RESET}]"
- ERROR="[${RED}ERROR${RESET}]"
- WARN="[${YELLOW}WARN${RESET}]"
- function INFO() {
- echo -e "${INFO} ${1}"
- }
- function ERROR() {
- echo -e "${ERROR} ${1}"
- }
- function WARN() {
- echo -e "${WARN} ${1}"
- }
- function PROMPT_Y_N() {
- echo -e "[${LIGHT_GREEN}y${RESET}/${LIGHT_BLUE}n${RESET}]: "
- }
- PROMPT_YES_NO=$(PROMPT_Y_N)
- function SEPARATOR() {
- echo -e "${INFO}${BOLD}${LIGHT_BLUE}======================== ${1} ========================${RESET}"
- }
- PROXY_DIR="/data/registry-proxy"
- mkdir -p ${PROXY_DIR}
- cd "${PROXY_DIR}"
- GITRAW="https://raw.githubusercontent.com/dqzboy/Docker-Proxy/main"
- CNGITRAW="https://gitee.com/boydqz/Docker-Proxy/raw/main"
- # docker registry
- IMAGE_NAME="dqzboy/registry"
- UI_IMAGE_NAME="dqzboy/docker-registry-ui"
- DOCKER_COMPOSE_FILE="docker-compose.yaml"
- # HubCMD-UI
- CMDUI_IMAGE_NAME="dqzboy/hubcmd-ui"
- CMDUI_COMPOSE_FILE="${GITRAW}/hubcmdui/${DOCKER_COMPOSE_FILE}"
- attempts=0
- maxAttempts=3
- function CHECK_OS() {
- SEPARATOR "检查环境"
- OSVER=$(cat /etc/os-release | grep -o '[0-9]' | head -n 1)
- if [ -f /etc/os-release ]; then
- . /etc/os-release
- else
- echo "无法确定发行版"
- exit 1
- fi
- case "$ID" in
- "centos")
- repo_type="centos"
- ;;
- "debian")
- repo_type="debian"
- ;;
- "rhel")
- repo_type="rhel"
- ;;
- "ubuntu")
- repo_type="ubuntu"
- ;;
- "opencloudos")
- repo_type="centos"
- ;;
- "rocky")
- repo_type="centos"
- ;;
- *)
- WARN "此脚本目前不支持您的系统: $ID"
- exit 1
- ;;
- esac
- INFO "System release:: $NAME"
- INFO "System version: $VERSION"
- INFO "System ID: $ID"
- INFO "System ID Like: $ID_LIKE"
- }
- function CHECK_PACKAGE_MANAGER() {
- if command -v dnf &> /dev/null; then
- package_manager="dnf"
- elif command -v yum &> /dev/null; then
- package_manager="yum"
- elif command -v apt-get &> /dev/null; then
- package_manager="apt-get"
- elif command -v apt &> /dev/null; then
- package_manager="apt"
- else
- ERROR "不受支持的软件包管理器."
- exit 1
- fi
- }
- function CHECK_PKG_MANAGER() {
- if command -v rpm &> /dev/null; then
- pkg_manager="rpm"
- elif command -v dpkg &> /dev/null; then
- pkg_manager="dpkg"
- elif command -v apt &> /dev/null; then
- pkg_manager="apt"
- else
- ERROR "无法确定包管理系统."
- exit 1
- fi
- }
- function CHECKMEM() {
- memory_usage=$(free | awk '/^Mem:/ {printf "%.2f", $3/$2 * 100}')
- memory_usage=${memory_usage%.*}
- if [[ $memory_usage -gt 90 ]]; then
- read -e -p "$(WARN "内存占用率${LIGHT_RED}高于 70%($memory_usage%)${RESET} 是否继续安装? ${PROMPT_YES_NO}")" continu
- if [ "$continu" == "n" ] || [ "$continu" == "N" ]; then
- exit 1
- fi
- else
- INFO "内存资源充足.请继续 ${LIGHT_GREEN}($memory_usage%)${RESET}"
- fi
- }
- function CHECKFIRE() {
- systemctl stop firewalld &> /dev/null
- systemctl disable firewalld &> /dev/null
- systemctl stop iptables &> /dev/null
- systemctl disable iptables &> /dev/null
- ufw disable &> /dev/null
- INFO "防火墙已被禁用."
- if [[ "$repo_type" == "centos" || "$repo_type" == "rhel" ]]; then
- if sestatus | grep "SELinux status" | grep -q "enabled"; then
- WARN "SELinux 已启用。禁用 SELinux..."
- setenforce 0
- sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
- INFO "SELinux 已被禁用."
- else
- INFO "SELinux 已被禁用."
- fi
- fi
- }
- function CHECKBBR() {
- kernel_version=$(uname -r | awk -F "-" '{print $1}')
- read -e -p "$(WARN "是否开启${BRIGHT_CYAN}BBR${RESET},优化网络带宽提高网络性能? ${PROMPT_YES_NO}")" choice_bbr
- case $choice_bbr in
- y | Y)
- version_compare=$(echo "${kernel_version} 4.9" | awk '{if ($1 >= $2) print "yes"; else print "no"}')
- if [ "$version_compare" != "yes" ]; then
- WARN "你的内核版本小于4.9,无法启动BBR,需要你手动升级内核"
- exit 0
- fi
- sysctl net.ipv4.tcp_available_congestion_control | grep -q "bbr"
- if [ $? -eq 0 ]; then
- INFO "你的服务器已经启动 ${BRIGHT_CYAN}BBR${RESET}"
- else
- INFO "开启BBR中..."
- modprobe tcp_bbr
- if [ $? -eq 0 ]; then
- INFO "${BRIGHT_CYAN}BBR${RESET} 模块${LIGHT_GREEN}添加成功${RESET}"
- else
- ERROR "${BRIGHT_CYAN}BBR${RESET} 模块${LIGHT_RED}添加失败${RESET},请执行 ${LIGHT_CYAN}sysctl -p${RESET} 检查."
- exit 1
- fi
- if [ ! -d /etc/modules-load.d/ ]; then
- mkdir -p /etc/modules-load.d/
- fi
- if [ ! -f /etc/modules-load.d/tcp_bbr.conf ]; then
- touch /etc/modules-load.d/tcp_bbr.conf
- fi
- if ! grep -q "tcp_bbr" /etc/modules-load.d/tcp_bbr.conf ; then
- echo 'tcp_bbr' >> /etc/modules-load.d/tcp_bbr.conf
- fi
- for setting in "net.core.default_qdisc=fq" "net.ipv4.tcp_congestion_control=bbr"; do
- if ! grep -q "$setting" /etc/sysctl.conf; then
- echo "$setting" >> /etc/sysctl.conf
- fi
- done
- sysctl -p &> /dev/null
- if [ $? -ne 0 ]; then
- ERROR "应用sysctl设置过程中发生了一个错误,请执行 ${LIGHT_CYAN}sysctl -p${RESET} 检查."
- exit 2
- fi
- lsmod | grep tcp_bbr &> /dev/null
- if [ $? -eq 0 ]; then
- INFO "${BRIGHT_CYAN}BBR${RESET} 已经${LIGHT_GREEN}成功开启${RESET}"
- else
- ERROR "${BRIGHT_CYAN}BBR${RESET} 开启${LIGHT_RED}失败${RESET},请执行 ${LIGHT_CYAN}sysctl -p${RESET} 检查."
- exit 3
- fi
- WARN "如果 ${BRIGHT_CYAN}BBR${RESET} 开启后${LIGHT_YELLOW}未生效${RESET},请执行 ${LIGHT_BLUE}reboot${RESET} 重启服务器使其BBR模块生效"
- fi
- ;;
- n | N)
- INFO "不开启BBR"
- ;;
- *)
- WARN "输入了无效的选择。请重新输入${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}"
- CHECKBBR
- ;;
- esac
- }
- function INSTALL_PACKAGE(){
- SEPARATOR "安装依赖"
- INFO "检查依赖安装情况,请稍等 ..."
- TIMEOUT=300
- PACKAGES_APT=(
- lsof jq wget apache2-utils tar
- )
- PACKAGES_YUM=(
- epel-release lsof jq wget yum-utils httpd-tools tar
- )
- if [ "$package_manager" = "dnf" ] || [ "$package_manager" = "yum" ]; then
- for package in "${PACKAGES_YUM[@]}"; do
- if $pkg_manager -q "$package" &>/dev/null; then
- INFO "${LIGHT_GREEN}已经安装${RESET} $package ..."
- else
- INFO "${LIGHT_CYAN}正在安装${RESET} $package ..."
- start_time=$(date +%s)
- $package_manager -y install "$package" --skip-broken > /dev/null 2>&1 &
- install_pid=$!
- while [[ $(($(date +%s) - $start_time)) -lt $TIMEOUT ]] && kill -0 $install_pid &>/dev/null; do
- sleep 1
- done
- if kill -0 $install_pid &>/dev/null; then
- read -e -p "$(WARN "$package 的安装时间超过 ${LIGHT_YELLOW}$TIMEOUT 秒${RESET}。是否继续? ${PROMPT_YES_NO}")" continue_install
- if [ "$continue_install" != "y" ]; then
- ERROR "$package 的安装超时。退出脚本。"
- exit 1
- else
- continue
- fi
- fi
- wait $install_pid
- if [ $? -ne 0 ]; then
- ERROR "$package 安装失败。请检查系统安装源,然后再次运行此脚本!请尝试手动执行安装: ${LIGHT_BLUE}$package_manager -y install $package${RESET}"
- exit 1
- fi
- fi
- done
- elif [ "$package_manager" = "apt-get" ] || [ "$package_manager" = "apt" ];then
- dpkg --configure -a &>/dev/null
- $package_manager update &>/dev/null
- for package in "${PACKAGES_APT[@]}"; do
- if $pkg_manager -s "$package" &>/dev/null; then
- INFO "已经安装 $package ..."
- else
- INFO "正在安装 $package ..."
- $package_manager install -y $package > /dev/null 2>&1
- if [ $? -ne 0 ]; then
- ERROR "安装 $package 失败,请检查系统安装源之后再次运行此脚本!请尝试手动执行安装: ${LIGHT_BLUE}$package_manager -y install $package${RESET}"
- exit 1
- fi
- fi
- done
- else
- ERROR "无法确定包管理系统,脚本无法继续执行,请检查!"
- exit 1
- fi
- }
- function INSTALL_CADDY() {
- SEPARATOR "安装Caddy"
- start_caddy() {
- systemctl enable caddy.service &>/dev/null
- systemctl restart caddy.service
- status=$(systemctl is-active caddy)
- if [ "$status" = "active" ]; then
- INFO "Caddy 服务运行正常,请继续..."
- else
- ERROR "Caddy 服务未运行,请查看日志报错,定位问题后再次执行脚本!"
- ERROR "-----------服务启动失败,请查看错误日志 ↓↓↓-----------"
- journalctl -u caddy.service --no-pager
- ERROR "-----------服务启动失败,请查看错误日志 ↑↑↑-----------"
- exit 1
- fi
- }
- check_caddy() {
- if pgrep "caddy" > /dev/null; then
- INFO "Caddy 已在运行."
- else
- WARN "Caddy 未运行。尝试启动 Caddy..."
- start_attempts=3
- for ((i=1; i<=$start_attempts; i++)); do
- start_caddy
- if pgrep "caddy" > /dev/null; then
- INFO "Caddy 已成功启动."
- break
- else
- if [ $i -eq $start_attempts ]; then
- ERROR "Caddy 在尝试 $start_attempts 后无法启动。请检查配置"
- exit 1
- else
- WARN "在 $i 时间内启动 Caddy 失败。重试..."
- fi
- fi
- done
- fi
- }
- if [ "$package_manager" = "dnf" ]; then
- if which caddy &>/dev/null; then
- INFO "Caddy 已经安装."
- else
- INFO "正在安装Caddy程序,请稍候..."
- $package_manager -y install 'dnf-command(copr)' &>/dev/null
- $package_manager -y copr enable @caddy/caddy &>/dev/null
- while [ $attempts -lt $maxAttempts ]; do
- $package_manager -y install caddy &>/dev/null
- if [ $? -ne 0 ]; then
- ((attempts++))
- WARN "正在尝试安装Caddy >>> (Attempt: $attempts)"
- if [ $attempts -eq $maxAttempts ]; then
- ERROR "Caddy installation failed. Please try installing manually."
- echo "命令: $package_manager -y install 'dnf-command(copr)' && $package_manager -y copr enable @caddy/caddy && $package_manager -y install caddy"
- exit 1
- fi
- else
- INFO "已安装 Caddy."
- break
- fi
- done
- fi
- check_caddy
- elif [ "$package_manager" = "yum" ]; then
- if which caddy &>/dev/null; then
- INFO "Caddy 已经安装."
- else
- INFO "正在安装Caddy程序,请稍候..."
- $package_manager -y install yum-plugin-copr &>/dev/null
- $package_manager -y copr enable @caddy/caddy &>/dev/null
- while [ $attempts -lt $maxAttempts ]; do
- $package_manager -y install caddy &>/dev/null
- if [ $? -ne 0 ]; then
- ((attempts++))
- WARN "正在尝试安装Caddy >>> (Attempt: $attempts)"
- if [ $attempts -eq $maxAttempts ]; then
- ERROR "Caddy installation failed. Please try installing manually."
- echo "命令: $package_manager -y install 'dnf-command(copr)' && $package_manager -y copr enable @caddy/caddy && $package_manager -y install caddy"
- exit 1
- fi
- else
- INFO "已安装 Caddy."
- break
- fi
- done
- fi
- check_caddy
- elif [ "$package_manager" = "apt" ] || [ "$package_manager" = "apt-get" ];then
- dpkg --configure -a &>/dev/null
- $package_manager update &>/dev/null
- if $pkg_manager -s "caddy" &>/dev/null; then
- INFO "Caddy 已安装,跳过..."
- else
- INFO "安装 Caddy 请稍等 ..."
- $package_manager install -y debian-keyring debian-archive-keyring apt-transport-https &>/dev/null
- 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
- curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list &>/dev/null
- $package_manager update &>/dev/null
- $package_manager install -y caddy &>/dev/null
- if [ $? -ne 0 ]; then
- ERROR "安装 Caddy 失败,请检查系统安装源之后再次运行此脚本!请尝试手动执行安装:$package_manager -y install caddy"
- exit 1
- fi
- fi
- check_caddy
- else
- WARN "无法确定包管理系统."
- exit 1
- fi
- }
- function CONFIG_CADDY() {
- SEPARATOR "配置Caddy"
- while true; do
- INFO "${LIGHT_GREEN}>>> 域名解析主机记录(即域名前缀):${RESET} ${LIGHT_CYAN}ui、hub、gcr、ghcr、k8sgcr、k8s、quay、mcr、elastic${RESET}"
- WARN "${LIGHT_GREEN}>>> 只需选择你部署的服务进行解析即可${RESET},${LIGHT_YELLOW}无需将上面提示中所有的主机记录进行解析${RESET}"
- read -e -p "$(WARN "是否配置Caddy,实现自动HTTPS? 执行前需在DNS服务商对部署服务解析主机记录 ${PROMPT_YES_NO}")" caddy_conf
- case "$caddy_conf" in
- y|Y )
- read -e -p "$(INFO "请输入你的域名${LIGHT_BLUE}[例: baidu.com]${RESET} ${LIGHT_RED}不可为空${RESET}: ")" caddy_domain
- read -e -p "$(INFO "请输入要配置的${LIGHT_MAGENTA}主机记录${RESET},用逗号分隔${LIGHT_BLUE}[例: ui,hub]${RESET}: ")" selected_records
- # 验证输入的主机记录
- local valid_records=("ui" "hub" "gcr" "ghcr" "k8sgcr" "k8s" "quay" "mcr" "elastic")
- IFS=',' read -r -a records_array <<< "$selected_records"
- local invalid_records=()
- for record in "${records_array[@]}"; do
- if ! [[ " ${valid_records[@]} " =~ " ${record} " ]]; then
- invalid_records+=("$record")
- fi
- done
- if [[ ${#invalid_records[@]} -gt 0 ]]; then
- ERROR "无效的主机记录: ${LIGHT_RED}${invalid_records[@]}${RESET}"
- INFO "请输入有效的主机记录: ${LIGHT_GREEN}ui、hub、gcr、ghcr、k8sgcr、k8s、quay、mcr、elastic${RESET}"
- continue
- fi
- declare -A record_templates
- record_templates[ui]="ui.$caddy_domain {
- reverse_proxy localhost:50000 {
- header_up Host {host}
- header_up Origin {scheme}://{host}
- header_up X-Forwarded-For {remote_addr}
- header_up X-Forwarded-Proto {scheme}
- header_up X-Forwarded-Ssl on
- header_up X-Forwarded-Port {server_port}
- header_up X-Forwarded-Host {host}
- }
- }"
- record_templates[hub]="hub.$caddy_domain {
- reverse_proxy localhost:51000 {
- header_up Host {host}
- header_up X-Real-IP {remote_addr}
- header_up X-Forwarded-For {remote_addr}
- header_up X-Nginx-Proxy true
- }
- }"
- record_templates[ghcr]="ghcr.$caddy_domain {
- reverse_proxy localhost:52000 {
- header_up Host {host}
- header_up X-Real-IP {remote_addr}
- header_up X-Forwarded-For {remote_addr}
- header_up X-Nginx-Proxy true
- }
- }"
- record_templates[gcr]="gcr.$caddy_domain {
- reverse_proxy localhost:53000 {
- header_up Host {host}
- header_up X-Real-IP {remote_addr}
- header_up X-Forwarded-For {remote_addr}
- header_up X-Nginx-Proxy true
- }
- }"
- record_templates[k8sgcr]="k8sgcr.$caddy_domain {
- reverse_proxy localhost:54000 {
- header_up Host {host}
- header_up X-Real-IP {remote_addr}
- header_up X-Forwarded-For {remote_addr}
- header_up X-Nginx-Proxy true
- }
- }"
- record_templates[k8s]="k8s.$caddy_domain {
- reverse_proxy localhost:55000 {
- header_up Host {host}
- header_up X-Real-IP {remote_addr}
- header_up X-Forwarded-For {remote_addr}
- header_up X-Nginx-Proxy true
- }
- }"
- record_templates[quay]="quay.$caddy_domain {
- reverse_proxy localhost:56000 {
- header_up Host {host}
- header_up X-Real-IP {remote_addr}
- header_up X-Forwarded-For {remote_addr}
- header_up X-Nginx-Proxy true
- }
- }"
- record_templates[mcr]="mcr.$caddy_domain {
- reverse_proxy localhost:57000 {
- header_up Host {host}
- header_up X-Real-IP {remote_addr}
- header_up X-Forwarded-For {remote_addr}
- header_up X-Nginx-Proxy true
- }
- }"
- record_templates[elastic]="elastic.$caddy_domain {
- reverse_proxy localhost:58000 {
- header_up Host {host}
- header_up X-Real-IP {remote_addr}
- header_up X-Forwarded-For {remote_addr}
- header_up X-Nginx-Proxy true
- }
- }"
- > /etc/caddy/Caddyfile
- for record in "${records_array[@]}"; do
- if [[ -n "${record_templates[$record]}" ]]; then
- echo "${record_templates[$record]}" >> /etc/caddy/Caddyfile
- fi
- done
- start_attempts=3
- for ((i=1; i<=$start_attempts; i++)); do
- start_caddy
- if pgrep "caddy" > /dev/null; then
- INFO "重新载入配置成功. Caddy服务启动完成"
- break
- else
- if [ $i -eq $start_attempts ]; then
- ERROR "Caddy 在尝试 $start_attempts 后无法启动。请检查配置"
- exit 1
- else
- WARN "第 $i 次启动 Caddy 失败。重试..."
- fi
- fi
- done
- break;;
- n|N )
- WARN "退出配置 Caddy 操作。"
- break;;
- * )
- INFO "请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}";;
- esac
- done
- }
- function INSTALL_NGINX() {
- SEPARATOR "安装Nginx"
- start_nginx() {
- systemctl enable nginx &>/dev/null
- systemctl restart nginx
- status=$(systemctl is-active nginx)
- if [ "$status" = "active" ]; then
- INFO "Nginx 服务运行正常,请继续..."
- else
- ERROR "Nginx 服务未运行,请查看日志报错,定位问题后再次执行脚本!"
- ERROR "-----------服务启动失败,请查看错误日志 ↓↓↓-----------"
- journalctl -u nginx.service --no-pager
- ERROR "-----------服务启动失败,请查看错误日志 ↑↑↑-----------"
- exit 1
- fi
- }
- check_nginx() {
- if pgrep "nginx" > /dev/null; then
- INFO "Nginx 已在运行."
- else
- WARN "Nginx 未运行。尝试启动 Nginx..."
- start_attempts=3
- for ((i=1; i<=$start_attempts; i++)); do
- start_nginx
- if pgrep "nginx" > /dev/null; then
- INFO "Nginx 已成功启动."
- break
- else
- if [ $i -eq $start_attempts ]; then
- ERROR "Nginx 在尝试 $start_attempts 次后无法启动。请检查配置"
- exit 1
- else
- WARN "第 $i 次启动 Nginx 失败。重试..."
- fi
- fi
- done
- fi
- }
- if [ "$package_manager" = "dnf" ] || [ "$package_manager" = "yum" ]; then
- if which nginx &>/dev/null; then
- INFO "Nginx 已经安装."
- else
- INFO "正在安装Nginx程序,请稍候..."
- NGINX="nginx-1.24.0-1.el${OSVER}.ngx.x86_64.rpm"
- rm -f ${NGINX}
- wget http://nginx.org/packages/centos/${OSVER}/x86_64/RPMS/${NGINX} &>/dev/null
- while [ $attempts -lt $maxAttempts ]; do
- $package_manager -y install ${NGINX} &>/dev/null
- if [ $? -ne 0 ]; then
- ((attempts++))
- WARN "正在尝试安装Nginx >>> (Attempt: $attempts)"
- if [ $attempts -eq $maxAttempts ]; then
- ERROR "Nginx installation failed. Please try installing manually."
- rm -f ${NGINX}
- echo "命令: wget http://nginx.org/packages/centos/${OSVER}/x86_64/RPMS/${NGINX} && $package_manager -y install ${NGINX}"
- exit 1
- fi
- else
- INFO "已安装 Nginx."
- rm -f ${NGINX}
- break
- fi
- done
- fi
- check_nginx
- elif [ "$package_manager" = "apt-get" ] || [ "$package_manager" = "apt" ];then
- dpkg --configure -a &>/dev/null
- $package_manager update &>/dev/null
- if $pkg_manager -s "nginx" &>/dev/null; then
- INFO "nginx 已安装,跳过..."
- else
- INFO "安装 nginx 请稍等 ..."
- $package_manager install -y nginx > /dev/null 2>&1
- if [ $? -ne 0 ]; then
- ERROR "安装 nginx 失败,请检查系统安装源之后再次运行此脚本!请尝试手动执行安装:$package_manager -y install nginx"
- exit 1
- fi
- fi
- check_nginx
- else
- WARN "无法确定包管理系统."
- exit 1
- fi
- }
- function CONFIG_NGINX() {
- SEPARATOR "配置Nginx"
- while true; do
- WARN "自行安装的 Nginx ${LIGHT_RED}请勿执行此操作${RESET},${LIGHT_BLUE}以防覆盖原有配置${RESET}"
- INFO "${LIGHT_GREEN}>>> 域名解析主机记录(即域名前缀):${RESET} ${LIGHT_CYAN}ui、hub、gcr、ghcr、k8sgcr、k8s、quay、mcr、elastic${RESET}"
- WARN "${LIGHT_GREEN}>>> 只需选择你部署的服务进行解析即可${RESET},${LIGHT_YELLOW}无需将上面提示中所有的主机记录进行解析${RESET}"
- read -e -p "$(WARN "是否配置 Nginx?配置完成后需在DNS服务商解析主机记录 ${PROMPT_YES_NO}")" nginx_conf
- case "$nginx_conf" in
- y|Y )
- read -e -p "$(INFO "请输入你的域名${LIGHT_BLUE}[例: baidu.com]${RESET} ${LIGHT_RED}不可为空${RESET}: ")" nginx_domain
- read -e -p "$(INFO "请输入要配置的${LIGHT_MAGENTA}主机记录${RESET},用逗号分隔${LIGHT_BLUE}[例: ui,hub]${RESET}: ")" selected_records
- # 验证输入的主机记录
- local valid_records=("ui" "hub" "gcr" "ghcr" "k8sgcr" "k8s" "quay" "mcr" "elastic")
- IFS=',' read -r -a records_array <<< "$selected_records"
- local invalid_records=()
- for record in "${records_array[@]}"; do
- if ! [[ " ${valid_records[@]} " =~ " ${record} " ]]; then
- invalid_records+=("$record")
- fi
- done
- if [[ ${#invalid_records[@]} -gt 0 ]]; then
- ERROR "无效的主机记录: ${LIGHT_RED}${invalid_records[@]}${RESET}"
- INFO "请输入有效的主机记录: ${LIGHT_GREEN}ui、hub、gcr、ghcr、k8sgcr、k8s、quay、mcr、elastic${RESET}"
- continue
- fi
- declare -A record_templates
- record_templates[ui]="server {
- listen 80;
- #listen 443 ssl;
- server_name ui.$nginx_domain;
- #ssl_certificate /path/to/your_domain_name.crt;
- #ssl_certificate_key /path/to/your_domain_name.key;
- #ssl_session_timeout 1d;
- #ssl_session_cache shared:SSL:50m;
- #ssl_session_tickets off;
- #ssl_protocols TLSv1.2 TLSv1.3;
- #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
- #ssl_prefer_server_ciphers on;
- #ssl_buffer_size 8k;
- proxy_connect_timeout 600;
- proxy_send_timeout 600;
- proxy_read_timeout 600;
- send_timeout 600;
- location / {
- proxy_pass http://localhost:50000;
- proxy_set_header Host \$host;
- proxy_set_header Origin \$scheme://\$host;
- proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto \$scheme;
- proxy_set_header X-Forwarded-Ssl on;
- proxy_set_header X-Forwarded-Port \$server_port;
- proxy_set_header X-Forwarded-Host \$host;
- }
- }"
- record_templates[hub]="server {
- listen 80;
- #listen 443 ssl;
- server_name hub.$nginx_domain;
- #ssl_certificate /path/to/your_domain_name.crt;
- #ssl_certificate_key /path/to/your_domain_name.key;
- #ssl_session_timeout 1d;
- #ssl_session_cache shared:SSL:50m;
- #ssl_session_tickets off;
- #ssl_protocols TLSv1.2 TLSv1.3;
- #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
- #ssl_prefer_server_ciphers on;
- #ssl_buffer_size 8k;
- proxy_connect_timeout 600;
- proxy_send_timeout 600;
- proxy_read_timeout 600;
- send_timeout 600;
- location / {
- proxy_pass http://localhost:51000;
- proxy_set_header Host \$host;
- proxy_set_header X-Real-IP \$remote_addr;
- proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
- proxy_set_header X-Nginx-Proxy true;
- proxy_buffering off;
- proxy_redirect off;
- }
- }"
- record_templates[ghcr]="server {
- listen 80;
- #listen 443 ssl;
- server_name ghcr.$nginx_domain;
- #ssl_certificate /path/to/your_domain_name.crt;
- #ssl_certificate_key /path/to/your_domain_name.key;
- #ssl_session_timeout 1d;
- #ssl_session_cache shared:SSL:50m;
- #ssl_session_tickets off;
- #ssl_protocols TLSv1.2 TLSv1.3;
- #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
- #ssl_prefer_server_ciphers on;
- #ssl_buffer_size 8k;
- proxy_connect_timeout 600;
- proxy_send_timeout 600;
- proxy_read_timeout 600;
- send_timeout 600;
- location / {
- proxy_pass http://localhost:52000;
- proxy_set_header Host \$host;
- proxy_set_header X-Real-IP \$remote_addr;
- proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
- proxy_set_header X-Nginx-Proxy true;
- proxy_buffering off;
- proxy_redirect off;
- }
- }"
- record_templates[gcr]="server {
- listen 80;
- #listen 443 ssl;
- server_name gcr.$nginx_domain;
- #ssl_certificate /path/to/your_domain_name.crt;
- #ssl_certificate_key /path/to/your_domain_name.key;
- #ssl_session_timeout 1d;
- #ssl_session_cache shared:SSL:50m;
- #ssl_session_tickets off;
- #ssl_protocols TLSv1.2 TLSv1.3;
- #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
- #ssl_prefer_server_ciphers on;
- #ssl_buffer_size 8k;
- proxy_connect_timeout 600;
- proxy_send_timeout 600;
- proxy_read_timeout 600;
- send_timeout 600;
- location / {
- proxy_pass http://localhost:53000;
- proxy_set_header Host \$host;
- proxy_set_header X-Real-IP \$remote_addr;
- proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
- proxy_set_header X-Nginx-Proxy true;
- proxy_buffering off;
- proxy_redirect off;
- }
- }"
- record_templates[k8sgcr]="server {
- listen 80;
- #listen 443 ssl;
- server_name k8sgcr.$nginx_domain;
- #ssl_certificate /path/to/your_domain_name.crt;
- #ssl_certificate_key /path/to/your_domain_name.key;
- #ssl_session_timeout 1d;
- #ssl_session_cache shared:SSL:50m;
- #ssl_session_tickets off;
- #ssl_protocols TLSv1.2 TLSv1.3;
- #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
- #ssl_prefer_server_ciphers on;
- #ssl_buffer_size 8k;
- proxy_connect_timeout 600;
- proxy_send_timeout 600;
- proxy_read_timeout 600;
- send_timeout 600;
- location / {
- proxy_pass http://localhost:54000;
- proxy_set_header Host \$host;
- proxy_set_header X-Real-IP \$remote_addr;
- proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
- proxy_set_header X-Nginx-Proxy true;
- proxy_buffering off;
- proxy_redirect off;
- }
- }"
- record_templates[k8s]="server {
- listen 80;
- #listen 443 ssl;
- server_name k8s.$nginx_domain;
- #ssl_certificate /path/to/your_domain_name.crt;
- #ssl_certificate_key /path/to/your_domain_name.key;
- #ssl_session_timeout 1d;
- #ssl_session_cache shared:SSL:50m;
- #ssl_session_tickets off;
- #ssl_protocols TLSv1.2 TLSv1.3;
- #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
- #ssl_prefer_server_ciphers on;
- #ssl_buffer_size 8k;
- proxy_connect_timeout 600;
- proxy_send_timeout 600;
- proxy_read_timeout 600;
- send_timeout 600;
- location / {
- proxy_pass http://localhost:55000;
- proxy_set_header Host \$host;
- proxy_set_header X-Real-IP \$remote_addr;
- proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
- proxy_set_header X-Nginx-Proxy true;
- proxy_buffering off;
- proxy_redirect off;
- }
- }"
- record_templates[quay]="server {
- listen 80;
- #listen 443 ssl;
- server_name quay.$nginx_domain;
- #ssl_certificate /path/to/your_domain_name.crt;
- #ssl_certificate_key /path/to/your_domain_name.key;
- #ssl_session_timeout 1d;
- #ssl_session_cache shared:SSL:50m;
- #ssl_session_tickets off;
- #ssl_protocols TLSv1.2 TLSv1.3;
- #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
- #ssl_prefer_server_ciphers on;
- #ssl_buffer_size 8k;
- proxy_connect_timeout 600;
- proxy_send_timeout 600;
- proxy_read_timeout 600;
- send_timeout 600;
- location / {
- proxy_pass http://localhost:56000;
- proxy_set_header Host \$host;
- proxy_set_header X-Real-IP \$remote_addr;
- proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
- proxy_set_header X-Nginx-Proxy true;
- proxy_buffering off;
- proxy_redirect off;
- }
- }"
- record_templates[mcr]="server {
- listen 80;
- #listen 443 ssl;
- server_name mcr.$nginx_domain;
- #ssl_certificate /path/to/your_domain_name.crt;
- #ssl_certificate_key /path/to/your_domain_name.key;
- #ssl_session_timeout 1d;
- #ssl_session_cache shared:SSL:50m;
- #ssl_session_tickets off;
- #ssl_protocols TLSv1.2 TLSv1.3;
- #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
- #ssl_prefer_server_ciphers on;
- #ssl_buffer_size 8k;
- proxy_connect_timeout 600;
- proxy_send_timeout 600;
- proxy_read_timeout 600;
- send_timeout 600;
- location / {
- proxy_pass http://localhost:57000;
- proxy_set_header Host \$host;
- proxy_set_header X-Real-IP \$remote_addr;
- proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
- proxy_set_header X-Nginx-Proxy true;
- proxy_buffering off;
- proxy_redirect off;
- }
- }"
- record_templates[elastic]="server {
- listen 80;
- #listen 443 ssl;
- server_name elastic.$nginx_domain;
- #ssl_certificate /path/to/your_domain_name.crt;
- #ssl_certificate_key /path/to/your_domain_name.key;
- #ssl_session_timeout 1d;
- #ssl_session_cache shared:SSL:50m;
- #ssl_session_tickets off;
- #ssl_protocols TLSv1.2 TLSv1.3;
- #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
- #ssl_prefer_server_ciphers on;
- #ssl_buffer_size 8k;
- proxy_connect_timeout 600;
- proxy_send_timeout 600;
- proxy_read_timeout 600;
- send_timeout 600;
- location / {
- proxy_pass http://localhost:58000;
- proxy_set_header Host \$host;
- proxy_set_header X-Real-IP \$remote_addr;
- proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
- proxy_set_header X-Nginx-Proxy true;
- proxy_buffering off;
- proxy_redirect off;
- }
- }"
- > /etc/nginx/conf.d/docker-proxy.conf
- for record in "${records_array[@]}"; do
- if [[ -n "${record_templates[$record]}" ]]; then
- echo "${record_templates[$record]}" >> /etc/nginx/conf.d/docker-proxy.conf
- fi
- done
- start_attempts=3
- for ((i=1; i<=$start_attempts; i++)); do
- start_nginx
- if pgrep "nginx" > /dev/null; then
- INFO "重新载入配置成功. Nginx服务启动完成"
- break
- else
- if [ $i -eq $start_attempts ]; then
- ERROR "Nginx 在尝试 $start_attempts 后无法启动。请检查配置"
- exit 1
- else
- WARN "第 $i 次启动 Nginx 失败。重试..."
- fi
- fi
- done
- break;;
- n|N )
- WARN "退出配置 Nginx 操作。"
- break;;
- * )
- INFO "请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}";;
- esac
- done
- }
- function CHECK_DOCKER() {
- status=$(systemctl is-active docker)
- if [ "$status" = "active" ]; then
- INFO "Docker 服务运行正常,请继续..."
- else
- ERROR "Docker 服务未运行,请查看日志报错,定位问题后再次执行脚本!"
- ERROR "-----------服务启动失败,请查看错误日志 ↓↓↓-----------"
- journalctl -u docker.service --no-pager
- ERROR "-----------服务启动失败,请查看错误日志 ↑↑↑-----------"
- exit 1
- fi
- }
- function INSTALL_DOCKER() {
- repo_file="docker-ce.repo"
- url="https://download.docker.com/linux/$repo_type"
- MAX_ATTEMPTS=3
- attempt=0
- success=false
- if [ "$repo_type" = "centos" ] || [ "$repo_type" = "rhel" ]; then
- if ! command -v docker &> /dev/null;then
- while [[ $attempt -lt $MAX_ATTEMPTS ]]; do
- attempt=$((attempt + 1))
- WARN "Docker 未安装,正在进行安装..."
- yum-config-manager --add-repo $url/$repo_file &>/dev/null
- $package_manager -y install docker-ce &>/dev/null
- if [ $? -eq 0 ]; then
- success=true
- break
- fi
- ERROR "Docker 安装失败,正在尝试重新下载 (尝试次数: $attempt)"
- done
- if $success; then
- INFO "Docker 安装成功,版本为:$(docker --version)"
- systemctl restart docker &>/dev/null
- CHECK_DOCKER
- systemctl enable docker &>/dev/null
- else
- ERROR "Docker 安装失败,请尝试手动安装"
- exit 1
- fi
- else
- INFO "Docker 已安装,安装版本为:$(docker --version)"
- systemctl restart docker | grep -E "ERROR|ELIFECYCLE|WARN"
- fi
- elif [ "$repo_type" == "ubuntu" ]; then
- if ! command -v docker &> /dev/null;then
- while [[ $attempt -lt $MAX_ATTEMPTS ]]; do
- attempt=$((attempt + 1))
- WARN "Docker 未安装,正在进行安装..."
- curl -fsSL $url/gpg | sudo apt-key add - &>/dev/null
- add-apt-repository "deb [arch=amd64] $url $(lsb_release -cs) stable" <<< $'\n' &>/dev/null
- $package_manager -y install docker-ce docker-ce-cli containerd.io &>/dev/null
- if [ $? -eq 0 ]; then
- success=true
- break
- fi
- ERROR "Docker 安装失败,正在尝试重新下载 (尝试次数: $attempt)"
- done
- if $success; then
- INFO "Docker 安装成功,版本为:$(docker --version)"
- systemctl restart docker &>/dev/null
- CHECK_DOCKER
- systemctl enable docker &>/dev/null
- else
- ERROR "Docker 安装失败,请尝试手动安装"
- exit 1
- fi
- else
- INFO "Docker 已安装,安装版本为:$(docker --version)"
- systemctl restart docker | grep -E "ERROR|ELIFECYCLE|WARN"
- fi
- elif [ "$repo_type" == "debian" ]; then
- if ! command -v docker &> /dev/null;then
- while [[ $attempt -lt $MAX_ATTEMPTS ]]; do
- attempt=$((attempt + 1))
- WARN "Docker 未安装,正在进行安装..."
- curl -fsSL $url/gpg | sudo apt-key add - &>/dev/null
- add-apt-repository "deb [arch=amd64] $url $(lsb_release -cs) stable" <<< $'\n' &>/dev/null
- $package_manager -y install docker-ce docker-ce-cli containerd.io &>/dev/null
- if [ $? -eq 0 ]; then
- success=true
- break
- fi
- ERROR "Docker 安装失败,正在尝试重新下载 (尝试次数: $attempt)"
- done
- if $success; then
- INFO "Docker 安装成功,版本为:$(docker --version)"
- systemctl restart docker &>/dev/null
- CHECK_DOCKER
- systemctl enable docker &>/dev/null
- else
- ERROR "Docker 安装失败,请尝试手动安装"
- exit 1
- fi
- else
- INFO "Docker 已安装,安装版本为:$(docker --version)"
- systemctl restart docker &>/dev/null
- CHECK_DOCKER
- fi
- else
- ERROR "不支持的操作系统."
- exit 1
- fi
- }
- function INSTALL_COMPOSE() {
- SEPARATOR "安装Docker Compose"
- TAG=`curl -s https://api.github.com/repos/docker/compose/releases/latest | jq -r '.tag_name'`
- url="https://github.com/docker/compose/releases/download/$TAG/docker-compose-$(uname -s)-$(uname -m)"
- MAX_ATTEMPTS=3
- attempt=0
- success=false
- save_path="/usr/local/bin"
- chmod +x $save_path/docker-compose &>/dev/null
- if ! command -v docker-compose &> /dev/null || [ -z "$(docker-compose --version)" ]; then
- WARN "Docker Compose 未安装或安装不完整,正在进行安装..."
- while [ $attempt -lt $MAX_ATTEMPTS ]; do
- attempt=$((attempt + 1))
- wget --continue -q $url -O $save_path/docker-compose
- if [ $? -eq 0 ]; then
- chmod +x $save_path/docker-compose
- version_check=$(docker-compose --version)
- if [ -n "$version_check" ]; then
- success=true
- chmod +x $save_path/docker-compose
- break
- else
- WARN "Docker Compose 下载的文件不完整,正在尝试重新下载 (尝试次数: $attempt)"
- rm -f $save_path/docker-compose
- fi
- fi
- ERROR "Docker Compose 下载失败,正在尝试重新下载 (尝试次数: $attempt)"
- done
- if $success; then
- INFO "Docker Compose 安装成功,版本为:$(docker-compose --version)"
- else
- ERROR "Docker Compose 下载失败,请尝试手动安装docker-compose"
- exit 1
- fi
- else
- chmod +x $save_path/docker-compose
- INFO "Docker Compose 已经安装,版本为:$(docker-compose --version)"
- fi
- }
- function INSTALL_DOCKER_CN() {
- MAX_ATTEMPTS=3
- attempt=0
- success=false
- cpu_arch=$(uname -m)
- save_path="/opt/docker_tgz"
- mkdir -p $save_path
- docker_ver="docker-26.1.4.tgz"
- case $cpu_arch in
- "arm64")
- url="https://raw.gitcode.com/dqzboy/docker/blobs/686ed74bf10e53fbec21f4c8d0eb4ae68b458198/$docker_ver"
- ;;
- "aarch64")
- url="https://raw.gitcode.com/dqzboy/docker/blobs/686ed74bf10e53fbec21f4c8d0eb4ae68b458198/$docker_ver"
- ;;
- "x86_64")
- url="https://raw.gitcode.com/dqzboy/docker/blobs/f4cf4ec4167a4e6e4debc61d7b0be0d9b729a93a/$docker_ver"
- ;;
- *)
- ERROR "不支持的CPU架构: $cpu_arch"
- exit 1
- ;;
- esac
- if ! command -v docker &> /dev/null; then
- while [ $attempt -lt $MAX_ATTEMPTS ]; do
- attempt=$((attempt + 1))
- WARN "Docker 未安装,正在进行安装..."
- wget -P "$save_path" "$url" &>/dev/null
- if [ $? -eq 0 ]; then
- success=true
- break
- fi
- ERROR "Docker 安装失败,正在尝试重新下载 (尝试次数: $attempt)"
- done
- if $success; then
- tar -xzf $save_path/$docker_ver -C $save_path
- \cp $save_path/docker/* /usr/bin/ &>/dev/null
- rm -rf $save_path
- INFO "Docker 安装成功,版本为:$(docker --version)"
-
- cat > /usr/lib/systemd/system/docker.service <<EOF
- [Unit]
- Description=Docker Application Container Engine
- Documentation=https://docs.docker.com
- After=network-online.target firewalld.service
- Wants=network-online.target
- [Service]
- Type=notify
- ExecStart=/usr/bin/dockerd
- ExecReload=/bin/kill -s HUP
- LimitNOFILE=infinity
- LimitNPROC=infinity
- LimitCORE=infinity
- TimeoutStartSec=0
- Delegate=yes
- KillMode=process
- Restart=on-failure
- StartLimitBurst=3
- StartLimitInterval=60s
- [Install]
- WantedBy=multi-user.target
- EOF
- systemctl daemon-reload
- systemctl restart docker &>/dev/null
- CHECK_DOCKER
- systemctl enable docker &>/dev/null
- else
- ERROR "Docker 安装失败,请尝试手动安装"
- exit 1
- fi
- else
- INFO "Docker 已安装,安装版本为:$(docker --version)"
- systemctl restart docker &>/dev/null
- CHECK_DOCKER
- fi
- }
- function INSTALL_COMPOSE_CN() {
- SEPARATOR "安装Docker Compose"
- MAX_ATTEMPTS=3
- attempt=0
- cpu_arch=$(uname -m)
- success=false
- save_path="/usr/local/bin"
- case $cpu_arch in
- "arm64")
- url="https://raw.gitcode.com/dqzboy/docker/blobs/b373da5a65a002691d78cf8d279704e85253d18a/docker-compose-linux-aarch64"
- ;;
- "aarch64")
- url="https://raw.gitcode.com/dqzboy/docker/blobs/b373da5a65a002691d78cf8d279704e85253d18a/docker-compose-linux-aarch64"
- ;;
- "x86_64")
- url="https://raw.gitcode.com/dqzboy/docker/blobs/3cd18cebe93acf81597b9c18f6770bf1bc5fa6dc/docker-compose-linux-x86_64"
- ;;
- *)
- ERROR "不支持的CPU架构: $cpu_arch"
- exit 1
- ;;
- esac
- chmod +x $save_path/docker-compose &>/dev/null
- if ! command -v docker-compose &> /dev/null || [ -z "$(docker-compose --version)" ]; then
- WARN "Docker Compose 未安装或安装不完整,正在进行安装..."
- while [ $attempt -lt $MAX_ATTEMPTS ]; do
- attempt=$((attempt + 1))
- wget --continue -q $url -O $save_path/docker-compose
- if [ $? -eq 0 ]; then
- chmod +x $save_path/docker-compose
- version_check=$(docker-compose --version)
- if [ -n "$version_check" ]; then
- success=true
- chmod +x $save_path/docker-compose
- break
- else
- WARN "Docker Compose 下载的文件不完整,正在尝试重新下载 (尝试次数: $attempt)"
- rm -f $save_path/docker-compose
- fi
- fi
- ERROR "Docker Compose 下载失败,正在尝试重新下载 (尝试次数: $attempt)"
- done
- if $success; then
- INFO "Docker Compose 安装成功,版本为:$(docker-compose --version)"
- else
- ERROR "Docker Compose 下载失败,请尝试手动安装docker-compose"
- exit 1
- fi
- else
- chmod +x $save_path/docker-compose
- INFO "Docker Compose 安装成功,版本为:$(docker-compose --version)"
- fi
- }
- function update_docker_registry_url() {
- local container_name=$1
- if [[ -f "${PROXY_DIR}/${DOCKER_COMPOSE_FILE}" ]]; then
- sed -i "s@- DOCKER_REGISTRY_URL=.*@- DOCKER_REGISTRY_URL=http://${container_name}:5000@g" ${PROXY_DIR}/${DOCKER_COMPOSE_FILE}
- else
- ERROR "文件 ${LIGHT_CYAN}${PROXY_DIR}/${DOCKER_COMPOSE_FILE} ${RESET} ${LIGHT_RED}不存在${RESET},导致容器无法应用新配置"
- exit 1
- fi
- }
- function CONFIG_FILES() {
- while true; do
- read -e -p "$(INFO "安装环境确认 [${LIGHT_GREEN}国外输1${RESET} ${LIGHT_YELLOW}国内输2${RESET}] > ")" install_docker_reg
- case "$install_docker_reg" in
- 1 )
- files=(
- "dockerhub reg-docker-hub ${GITRAW}/config/registry-hub.yml"
- "gcr reg-gcr ${GITRAW}/config/registry-gcr.yml"
- "ghcr reg-ghcr ${GITRAW}/config/registry-ghcr.yml"
- "quay reg-quay ${GITRAW}/config/registry-quay.yml"
- "k8sgcr reg-k8s-gcr ${GITRAW}/config/registry-k8sgcr.yml"
- "k8s reg-k8s ${GITRAW}/config/registry-k8s.yml"
- "mcr reg-mcr ${GITRAW}/config/registry-mcr.yml"
- "elastic reg-elastic ${GITRAW}/config/registry-elastic.yml"
- )
- break;;
- 2 )
- files=(
- "dockerhub reg-docker-hub ${CNGITRAW}/config/registry-hub.yml"
- "gcr reg-gcr ${CNGITRAW}/config/registry-gcr.yml"
- "ghcr reg-ghcr ${CNGITRAW}/config/registry-ghcr.yml"
- "quay reg-quay ${CNGITRAW}/config/registry-quay.yml"
- "k8sgcr reg-k8s-gcr ${CNGITRAW}/config/registry-k8sgcr.yml"
- "k8s reg-k8s ${CNGITRAW}/config/registry-k8s.yml"
- "mcr reg-mcr ${CNGITRAW}/config/registry-mcr.yml"
- "elastic reg-elastic ${CNGITRAW}/config/registry-elastic.yml"
- )
- break;;
- * )
- INFO "请输入 ${LIGHT_GREEN}1${RESET} 表示国外 或者 ${LIGHT_YELLOW}2${RESET} 表示大陆";;
- esac
- done
- }
- function DOWN_CONFIG() {
- selected_names=()
- selected_files=()
- selected_containers=()
- echo -e "${YELLOW}-------------------------------------------------${RESET}"
- echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
- echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
- echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
- echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
- echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
- echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
- echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
- echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
- echo -e "${GREEN}9)${RESET} ${BOLD}all${RESET}"
- echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
- echo -e "${YELLOW}-------------------------------------------------${RESET}"
- read -e -p "$(INFO "输入序号下载对应配置文件,${LIGHT_YELLOW}空格分隔${RESET}多个选项. ${LIGHT_CYAN}all下载所有${RESET} > ")" choices_reg
- while [[ ! "$choices_reg" =~ ^([0-9]+[[:space:]]*)+$ ]]; do
- WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-9 ${RESET}序号"
- read -e -p "$(INFO "输入序号下载对应配置文件,${LIGHT_YELLOW}空格分隔${RESET}多个选项. ${LIGHT_CYAN}all下载所有${RESET} > ")" choices_reg
- done
- if [[ "$choices_reg" == "9" ]]; then
- for file in "${files[@]}"; do
- file_name=$(echo "$file" | cut -d' ' -f1)
- container_name=$(echo "$file" | cut -d' ' -f2)
- file_url=$(echo "$file" | cut -d' ' -f3-)
- selected_names+=("$file_name")
- selected_containers+=("$container_name")
- selected_files+=("$file_url")
- wget -NP ${PROXY_DIR}/ $file_url &>/dev/null
- done
- selected_all=true
- elif [[ "$choices_reg" == "0" ]]; then
- WARN "退出下载配置! ${LIGHT_YELLOW}首次安装如果没有配置无法启动服务,只能启动UI服务${RESET}"
- return
- else
- for choice in ${choices_reg}; do
- if [[ $choice =~ ^[0-9]+$ ]] && ((choice > 0 && choice <= ${#files[@]})); then
- file_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f1)
- container_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f2)
- file_url=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f3-)
- selected_names+=("$file_name")
- selected_containers+=("$container_name")
- selected_files+=("$file_url")
- wget -NP ${PROXY_DIR}/ $file_url &>/dev/null
- else
- WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-9 ${RESET}序号"
- fi
- done
- selected_all=false
- # 非更新配置操作则执行下面步骤
- if [[ "$main_choice" != "4" ]]; then
- first_selected_container=${selected_containers[0]}
- update_docker_registry_url "$first_selected_container"
- fi
- fi
- WARN "${LIGHT_GREEN}>>> 提示:${RESET} ${LIGHT_BLUE}Proxy代理缓存过期时间${RESET} ${MAGENTA}单位:ns、us、ms、s、m、h.默认ns,0禁用缓存过期${RESET}"
- read -e -p "$(INFO "是否要修改缓存时间? ${PROMPT_YES_NO}")" modify_cache
- while [[ "$modify_cache" != "y" && "$modify_cache" != "n" ]]; do
- WARN "无效输入,请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}"
- read -e -p "$(INFO "是否要修改缓存时间? ${PROMPT_YES_NO}")" modify_cache
- done
- if [[ "$modify_cache" == "y" ]]; then
- while true; do
- read -e -p "$(INFO "请输入新的缓存时间值: ")" new_ttl
- for file_url in "${selected_files[@]}"; do
- yml_name=$(basename "$file_url")
- sed -ri "s/ttl: 168h/ttl: ${new_ttl}/g" ${PROXY_DIR}/${yml_name} &>/dev/null
- done
- break
- done
- fi
- }
- # 一键部署调此函数
- function PROXY_HTTP() {
- read -e -p "$(INFO "是否添加代理? ${PROMPT_YES_NO}")" modify_config
- case $modify_config in
- [Yy]* )
- read -e -p "$(INFO "输入代理地址 ${LIGHT_MAGENTA}(eg: host:port)${RESET}: ")" url
- while [[ -z "$url" ]]; do
- WARN "代理${LIGHT_YELLOW}地址不能为空${RESET},请重新输入!"
- read -e -p "$(INFO "输入代理地址 ${LIGHT_MAGENTA}(eg: host:port)${RESET}: ")" url
- done
- sed -i "s@#- http=http://host:port@- http_proxy=http://${url}@g" ${PROXY_DIR}/${DOCKER_COMPOSE_FILE}
- sed -i "s@#- https=http://host:port@- https_proxy=http://${url}@g" ${PROXY_DIR}/${DOCKER_COMPOSE_FILE}
- INFO "你配置代理地址为: ${CYAN}http://${url}${RESET}"
- ;;
- [Nn]* )
- WARN "跳过添加代理配置"
- ;;
- * )
- ERROR "无效的输入。请重新输入${LIGHT_GREEN}Y or N ${RESET}的选项"
- PROXY_HTTP
- ;;
- esac
- }
- # 7) 本机Docker代理,调此函数
- function DOCKER_PROXY_HTTP() {
- WARN "${BOLD}${LIGHT_GREEN}提示:${RESET} ${LIGHT_CYAN}配置本机Docker服务走代理,加速本机Docker镜像下载${RESET}"
- read -e -p "$(INFO "是否添加本机Docker服务代理? ${PROMPT_YES_NO}")" modify_proxy
- case $modify_proxy in
- [Yy]* )
- read -e -p "$(INFO "输入代理地址 ${LIGHT_MAGENTA}(eg: host:port)${RESET}: ")" url
- while [[ -z "$url" ]]; do
- WARN "代理${LIGHT_YELLOW}地址不能为空${RESET},请重新输入。"
- read -e -p "$(INFO "输入代理地址 ${LIGHT_MAGENTA}(eg: host:port)${RESET}: ")" url
- done
- INFO "你配置代理地址为: ${CYAN}http://${url}${RESET}"
- ;;
- [Nn]* )
- WARN "退出本机Docker服务代理配置"
- exit 1
- ;;
- * )
- ERROR "无效的输入。请重新输入${LIGHT_GREEN}Y or N ${RESET}的选项"
- DOCKER_PROXY_HTTP
- ;;
- esac
- }
- function CHECK_DOCKER_PROXY() {
- local url=$1
- local http_proxy=$(docker info 2>/dev/null | grep -i "HTTP Proxy" | awk -F ': ' '{print $2}')
- local https_proxy=$(docker info 2>/dev/null | grep -i "HTTPS Proxy" | awk -F ': ' '{print $2}')
- if [[ "$http_proxy" == "http://$url" && "$https_proxy" == "http://$url" ]]; then
- INFO "Docker 代理${LIGHT_GREEN}配置成功${RESET},当前 HTTP Proxy: ${LIGHT_CYAN}$http_proxy${RESET}, HTTPS Proxy: ${LIGHT_CYAN}$https_proxy${RESET}"
- else
- ERROR "Docker 代理${LIGHT_RED}配置失败${RESET},请检查配置并重新执行配置"
- DOCKER_PROXY_HTTP
- fi
- }
- function ADD_DOCKERD_PROXY() {
- mkdir -p /etc/systemd/system/docker.service.d
- if [ ! -f /etc/systemd/system/docker.service.d/http-proxy.conf ]; then
- cat > /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
- [Service]
- Environment="HTTP_PROXY=http://$url"
- Environment="HTTPS_PROXY=http://$url"
- EOF
- systemctl daemon-reload
- systemctl restart docker &>/dev/null
- CHECK_DOCKER
- CHECK_DOCKER_PROXY "$url"
- else
- 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
- cat >> /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
- [Service]
- Environment="HTTP_PROXY=http://$url"
- Environment="HTTPS_PROXY=http://$url"
- EOF
- systemctl daemon-reload
- systemctl restart docker &>/dev/null
- CHECK_DOCKER
- CHECK_DOCKER_PROXY "$url"
- else
- if [[ "$main_choice" = "7" ]]; then
- WARN "已经存在相同的代理配置,${LIGHT_RED}请勿重复配置${RESET}"
- fi
- fi
- fi
- }
- # 一键部署时调用START_CONTAINER
- function START_CONTAINER() {
- if [ "$modify_config" = "y" ] || [ "$modify_config" = "Y" ]; then
- ADD_DOCKERD_PROXY
- else
- INFO "拉取服务镜像并启动服务中,请稍等..."
- fi
- # DOWN_CONFIG函数执行后判断selected_all变量
- if [ "$selected_all" = true ]; then
- docker-compose up -d --force-recreate
- # 检查命令执行是否成功
- if [ $? -ne 0 ]; then
- ERROR "Docker 容器启动失败,请通过查看日志确认启动失败原因"
- exit 1
- fi
- else
- docker-compose up -d "${selected_names[@]}" registry-ui
- # 检查命令执行是否成功
- if [ $? -ne 0 ]; then
- ERROR "Docker 容器启动失败,请通过查看日志确认启动失败原因"
- exit 1
- fi
- fi
- }
- # 使用函数UPDATE_CONFIG时调用RESTART_CONTAINER
- function RESTART_CONTAINER() {
- # DOWN_CONFIG函数执行后判断selected_all变量
- if [ "$selected_all" = true ]; then
- docker-compose restart
- # 检查命令执行是否成功
- if [ $? -ne 0 ]; then
- ERROR "Docker 容器启动失败,请通过查看日志确认启动失败原因"
- exit 1
- fi
- else
- docker-compose restart "${selected_names[@]}"
- # 检查命令执行是否成功
- if [ $? -ne 0 ]; then
- ERROR "Docker 容器启动失败,请通过查看日志确认启动失败原因"
- exit 1
- fi
- fi
- }
- function INSTALL_DOCKER_PROXY() {
- SEPARATOR "部署Docker Proxy"
- CONFIG_FILES
- if [[ "$install_docker_reg" == "1" ]]; then
- wget -NP ${PROXY_DIR}/ ${GITRAW}/${DOCKER_COMPOSE_FILE} &>/dev/null
- elif [[ "$install_docker_reg" == "2" ]]; then
- wget -NP ${PROXY_DIR}/ ${CNGITRAW}/${DOCKER_COMPOSE_FILE} &>/dev/null
- fi
- DOWN_CONFIG
- PROXY_HTTP
- START_CONTAINER
- }
- function STOP_REMOVE_CONTAINER() {
- if [[ -f "${PROXY_DIR}/${DOCKER_COMPOSE_FILE}" ]]; then
- INFO "停止和移除所有容器"
- docker-compose -f "${PROXY_DIR}/${DOCKER_COMPOSE_FILE}" down --remove-orphans
- else
- WARN "${LIGHT_YELLOW}容器目前未处于运行状态,无需进行删除操作!${RESET}"
- exit 1
- fi
- }
- function UPDATE_CONFIG() {
- while true; do
- read -e -p "$(WARN "是否更新配置,更新前请确保您已备份现有配置,此操作不可逆? ${PROMPT_YES_NO}")" update_conf
- case "$update_conf" in
- y|Y )
- CONFIG_FILES
- DOWN_CONFIG
- RESTART_CONTAINER
- break;;
- n|N )
- WARN "退出配置更新操作。"
- break;;
- * )
- INFO "请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}";;
- esac
- done
- }
- function REMOVE_NONE_TAG() {
- docker images | grep "^${IMAGE_NAME}.*<none>" | awk '{print $3}' | xargs -r docker rmi
- images=$(docker images ${IMAGE_NAME} --format '{{.Repository}}:{{.Tag}}')
- latest=$(echo "$images" | sort -V | tail -n1)
- for image in $images
- do
- if [ "$image" != "$latest" ];then
- docker rmi $image
- fi
- done
- }
- function PACKAGE() {
- while true; do
- read -e -p "$(INFO "是否执行软件包安装? (${LIGHT_YELLOW}首次部署需安装依赖${RESET}) ${PROMPT_YES_NO}")" choice_package
- case "$choice_package" in
- y|Y )
- INSTALL_PACKAGE
- break;;
- n|N )
- WARN "跳过软件包安装步骤"
- break;;
- * )
- INFO "请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}";;
- esac
- done
- }
- function INSTALL_WEB() {
- while true; do
- SEPARATOR "安装WEB服务"
- read -e -p "$(INFO "是否安装WEB服务? (用来通过域名方式访问加速服务) ${PROMPT_YES_NO}")" choice_service
- if [[ "$choice_service" =~ ^[YyNn]$ ]]; then
- if [[ "$choice_service" == "Y" || "$choice_service" == "y" ]]; then
- while true; do
- read -e -p "$(INFO "选择安装的WEB服务。安装${LIGHT_CYAN}Caddy可自动开启HTTPS${RESET} [Nginx/Caddy]: ")" web_service
- if [[ "$web_service" =~ ^(nginx|Nginx|caddy|Caddy)$ ]]; then
- if [[ "$web_service" == "nginx" || "$web_service" == "Nginx" ]]; then
- INSTALL_NGINX
- CONFIG_NGINX
- break
- elif [[ "$web_service" == "caddy" || "$web_service" == "Caddy" ]]; then
- INSTALL_CADDY
- CONFIG_CADDY
- break
- fi
- else
- WARN "请输入 ${LIGHT_CYAN}nginx${RESET} 或 ${LIGHT_BLUE}caddy${RESET}"
- fi
- done
- break
- else
- WARN "跳过WEB服务安装步骤"
- break
- fi
- else
- INFO "请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}"
- fi
- done
- }
- function PROMPT(){
- PUBLIC_IP=$(curl -s https://ifconfig.me)
- ALL_IPS=$(hostname -I)
- INTERNAL_IP=$(echo "$ALL_IPS" | awk '$1!="127.0.0.1" && $1!="::1" && $1!="docker0" {print $1}')
- echo
- INFO "=================感谢您的耐心等待,安装已经完成=================="
- INFO
- INFO "请用浏览器访问 UI 面板: "
- INFO "公网访问地址: ${UNDERLINE}http://$PUBLIC_IP:50000${RESET}"
- INFO "内网访问地址: ${UNDERLINE}http://$INTERNAL_IP:50000${RESET}"
- INFO
- INFO "服务安装路径: ${LIGHT_BLUE}${PROXY_DIR}${RESET}"
- INFO
- INFO "作者博客: https://dqzboy.com"
- INFO "技术交流: https://t.me/dqzboyblog"
- INFO "代码仓库: https://github.com/dqzboy/Docker-Proxy"
- INFO
- INFO "若用云服务器并设域名及证书,需在安全组开放80、443端口;否则开放对应服务监听端口"
- INFO
- INFO "================================================================"
- }
- function INSTALL_PROXY() {
- ALL_IN_ONE() {
- CHECK_OS
- CHECK_PACKAGE_MANAGER
- CHECK_PKG_MANAGER
- CHECKMEM
- CHECKFIRE
- CHECKBBR
- PACKAGE
- INSTALL_WEB
- while true; do
- SEPARATOR "安装Docker"
- read -e -p "$(INFO "安装环境确认 [${LIGHT_GREEN}国外输1${RESET} ${LIGHT_YELLOW}国内输2${RESET}] > ")" deploy_docker
- case "$deploy_docker" in
- 1 )
- INSTALL_DOCKER
- INSTALL_COMPOSE
- break;;
- 2 )
- INSTALL_DOCKER_CN
- INSTALL_COMPOSE_CN
- break;;
- * )
- INFO "请输入 ${LIGHT_GREEN}1${RESET} 表示国外 或者 ${LIGHT_YELLOW}2${RESET} 表示大陆";;
- esac
- done
- INSTALL_DOCKER_PROXY
- PROMPT
- }
- ADD_DOCKER_SERVICE() {
- WARN "提示: 此操作是在你的服务器${LIGHT_CYAN}已经部署对应组件${RESET}后才可执行,否则执行过程将会出现${LIGHT_RED}各种报错!${RESET}"
- INSTALL_DOCKER_PROXY
- }
- SEPARATOR "安装服务"
- echo -e "1) 一键${BOLD}${LIGHT_GREEN}部署所有${RESET}服务"
- echo -e "2) ${BOLD}${LIGHT_CYAN}安装指定${RESET}容器服务"
- echo -e "3) ${BOLD}返回${LIGHT_RED}主菜单${RESET}"
- echo -e "0) ${BOLD}退出脚本${RESET}"
- echo "---------------------------------------------------------------"
- read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" proxy_install
- case $proxy_install in
- 1)
- ALL_IN_ONE
- ;;
- 2)
- ADD_DOCKER_SERVICE
- ;;
- 3)
- main_menu
- ;;
- 0)
- exit 1
- ;;
- *)
- WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-3${RESET}的选项."
- INSTALL_PROXY
- ;;
- esac
- }
- function REMOVE_CMDUI() {
- if [ -d "${CMDUI_DIR}" ]; then
- if [ -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" ]; then
- INFO "停止和移除HubCMD-UI容器"
- docker-compose -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" down --remove-orphans
- rm -rf "${CMDUI_DIR}"
- else
- WARN "${LIGHT_YELLOW}文件${CMDUI_DIR}/${DOCKER_COMPOSE_FILE} 不存在,无需进行删除操作!${RESET}"
- fi
- else
- WARN "${LIGHT_YELLOW}目录 ${CMDUI_DIR} 不存在,无需进行删除操作!${RESET}"
- fi
- docker images | grep "^${CMDUI_IMAGE_NAME}.*<none>" | awk '{print $3}' | xargs -r docker rmi
- images=$(docker images ${CMDUI_IMAGE_NAME} --format '{{.Repository}}:{{.Tag}}')
- latest=$(echo "$images" | sort -V | tail -n1)
- for image in $images; do
- if [ "$image" != "$latest" ]; then
- docker rmi $image
- fi
- done
- # 强制移除所有相关镜像
- docker rmi --force $(docker images -q ${CMDUI_IMAGE_NAME}) &>/dev/null
- }
- function HUBCMDUI() {
- CMDUI_NAME="hubcmd-ui"
- CMDUI_DIR="${PROXY_DIR}/hubcmdui"
- CMDUI_PROMPT() {
- PUBLIC_IP=$(curl -s https://ifconfig.me)
- ALL_IPS=$(hostname -I)
- INTERNAL_IP=$(echo "$ALL_IPS" | awk '$1!="127.0.0.1" && $1!="::1" && $1!="docker0" {print $1}')
- echo
- INFO "=================感谢您的耐心等待,安装已经完成=================="
- INFO
- INFO "请用浏览器访问 HubCMD-UI 面板: "
- INFO "公网访问地址: ${UNDERLINE}http://$PUBLIC_IP:30080${RESET}"
- INFO "内网访问地址: ${UNDERLINE}http://$INTERNAL_IP:30080${RESET}"
- INFO
- INFO "后端访问地址: 地址后面跟admin,例: ${UNDERLINE}http://$INTERNAL_IP/admin:30080${RESET}"
- INFO "默认账号密码: ${LIGHT_GREEN}root${RESET}/${LIGHT_CYAN}admin${RESET}"
- INFO
- INFO "服务安装路径: ${LIGHT_BLUE}${CMDUI_DIR}${RESET}"
- INFO
- INFO "作者博客: https://dqzboy.com"
- INFO "技术交流: https://t.me/dqzboyblog"
- INFO "代码仓库: https://github.com/dqzboy/Docker-Proxy"
- INFO
- INFO "================================================================"
- }
- INSTALL_HUBCMDUI() {
- mkdir -p ${CMDUI_DIR}
- INFO "正在安装HubCMD-UI服务,请稍等!安装路径 ${LIGHT_CYAN}${CMDUI_DIR}${RESET}"
- if [[ -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" ]]; then
- if docker-compose ps --services 2>/dev/null | grep -q "^${CMDUI_NAME}$"; then
- INFO "${CMDUI_NAME} 已经安装并启动,无需重复执行安装!"
- else
- docker-compose -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" up -d
- fi
- else
- wget -NP ${CMDUI_DIR}/ ${CMDUI_COMPOSE_FILE} &>/dev/null
- if [ $? -ne 0 ]; then
- WARN "下载${LIGHT_YELLOW}docker-compose.yaml 文件失败${RESET},请稍后重试!"
- HUBCMDUI
- fi
- docker-compose -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" up -d
- if [ $? -eq 0 ]; then
- CMDUI_PROMPT
- exit 1
- else
- WARN "服务安装失败,请稍后重试!"
- HUBCMDUI
- fi
- fi
- }
- UPDATE_HUBCMDUI() {
- if [ -d "${CMDUI_DIR}" ]; then
- if [ -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" ]; then
- INFO "正在更新HubCMD-UI容器"
- docker-compose -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" pull
- if [ $? -ne 0 ]; then
- WARN "HubCMD-UI ${LIGHT_YELLOW}镜像拉取失败${RESET},请稍后重试!"
- HUBCMDUI
- fi
- docker-compose -f "${CMDUI_DIR}/${DOCKER_COMPOSE_FILE}" up -d --force-recreate
- if [ $? -ne 0 ]; then
- WARN "HubCMD-UI ${LIGHT_YELLOW}服务启动失败${RESET},请稍后重试!"
- HUBCMDUI
- else
- INFO "HubCMD-UI ${LIGHT_GREEN}服务更新并启动完成${RESET}"
- fi
- else
- WARN "${LIGHT_YELLOW}文件${CMDUI_DIR}/${DOCKER_COMPOSE_FILE} 不存在,无法进行更新操作!${RESET}"
- fi
- else
- WARN "${LIGHT_YELLOW}目录 ${CMDUI_DIR} 不存在,无法进行更新操作!${RESET}"
- fi
- }
- UNINSTALL_HUBCMDUI() {
- WARN "${LIGHT_RED}注意:${RESET} ${LIGHT_YELLOW}请执行删除之前确定是否需要备份配置文件${RESET}"
- while true; do
- read -e -p "$(INFO "本人${LIGHT_RED}已知晓后果,确认删除${RESET}服务? ${PROMPT_YES_NO}")" delcmdui
- case "$delcmdui" in
- y|Y )
- REMOVE_CMDUI
- break;;
- n|N )
- WARN "退出执行卸载服务"
- break;;
- * )
- INFO "请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}";;
- esac
- done
- }
- SEPARATOR "HubCMD-UI管理"
- echo -e "1) ${BOLD}${LIGHT_GREEN}安装${RESET}HubCMD-UI"
- echo -e "2) ${BOLD}${LIGHT_YELLOW}卸载${RESET}HubCMD-UI"
- echo -e "3) ${BOLD}${LIGHT_CYAN}更新${RESET}HubCMD-UI"
- echo -e "4) ${BOLD}返回${LIGHT_RED}主菜单${RESET}"
- echo -e "0) ${BOLD}退出脚本${RESET}"
- echo "---------------------------------------------------------------"
- read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" cmdui_choice
- case $cmdui_choice in
- 1)
- INSTALL_HUBCMDUI
- HUBCMDUI
- ;;
- 2)
- UNINSTALL_HUBCMDUI
- HUBCMDUI
- ;;
- 3)
- UPDATE_HUBCMDUI
- HUBCMDUI
- ;;
- 4)
- main_menu
- ;;
- 0)
- exit 1
- ;;
- *)
- WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-4${RESET}的选项."
- HUBCMDUI
- ;;
- esac
- }
- function COMP_INST() {
- SEPARATOR "安装组件"
- echo -e "1) ${BOLD}安装${LIGHT_GREEN}环境依赖${RESET}"
- echo -e "2) ${BOLD}安装${LIGHT_CYAN}Docker${RESET}"
- echo -e "3) ${BOLD}安装${LIGHT_MAGENTA}Compose${RESET}"
- echo -e "4) ${BOLD}安装${GREEN}Nginx${RESET}"
- echo -e "5) ${BOLD}安装${LIGHT_BLUE}Caddy${RESET}"
- echo -e "6) ${BOLD}配置${LIGHT_YELLOW}Nginx${RESET}"
- echo -e "7) ${BOLD}配置${CYAN}Caddy${RESET}"
- echo -e "8) ${BOLD}安装${BLUE}HubCMD-UI${RESET}"
- echo -e "9) ${BOLD}返回${LIGHT_RED}主菜单${RESET}"
- echo -e "0) ${BOLD}退出脚本${RESET}"
- echo "---------------------------------------------------------------"
- read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" comp_choice
- case $comp_choice in
- 1)
- CHECK_OS
- CHECK_PACKAGE_MANAGER
- CHECK_PKG_MANAGER
- CHECKMEM
- PACKAGE
- COMP_INST
- ;;
- 2)
- CHECK_OS
- CHECK_PACKAGE_MANAGER
- CHECK_PKG_MANAGER
- while true; do
- SEPARATOR "安装Docker"
- read -e -p "$(INFO "安装环境确认 [${LIGHT_GREEN}国外输1${RESET} ${LIGHT_YELLOW}国内输2${RESET}] > ")" deploy_docker
- case "$deploy_docker" in
- 1 )
- INSTALL_DOCKER
- break;;
- 2 )
- INSTALL_DOCKER_CN
- break;;
- * )
- INFO "请输入 ${LIGHT_GREEN}1${RESET} 表示国外 或者 ${LIGHT_YELLOW}2${RESET} 表示大陆";;
- esac
- done
- COMP_INST
- ;;
- 3)
- CHECK_OS
- CHECK_PACKAGE_MANAGER
- CHECK_PKG_MANAGER
- while true; do
- read -e -p "$(INFO "安装环境确认 [${LIGHT_GREEN}国外输1${RESET} ${LIGHT_YELLOW}国内输2${RESET}] > ")" deploy_compose
- case "$deploy_compose" in
- 1 )
- INSTALL_COMPOSE
- break;;
- 2 )
- INSTALL_COMPOSE_CN
- break;;
- * )
- INFO "请输入 ${LIGHT_GREEN}1${RESET} 表示国外 或者 ${LIGHT_YELLOW}2${RESET} 表示大陆";;
- esac
- done
- COMP_INST
- ;;
- 4)
- CHECK_OS
- CHECK_PACKAGE_MANAGER
- CHECK_PKG_MANAGER
- INSTALL_NGINX
- COMP_INST
- ;;
- 5)
- CHECK_OS
- CHECK_PACKAGE_MANAGER
- CHECK_PKG_MANAGER
- INSTALL_CADDY
- COMP_INST
- ;;
- 6)
- CONFIG_NGINX
- COMP_INST
- ;;
- 7)
- CONFIG_CADDY
- COMP_INST
- ;;
- 8)
- HUBCMDUI
- COMP_INST
- ;;
- 9)
- main_menu
- ;;
- 0)
- exit 1
- ;;
- *)
- WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-8${RESET}的选项."
- COMP_INST
- ;;
- esac
- }
- function SVC_MGMT() {
- # 定义Docker容器服务名称
- CONTAINER_SERVICES() {
- services=(
- "dockerhub"
- "gcr"
- "ghcr"
- "quay"
- "k8sgcr"
- "k8s"
- "mcr"
- "elastic"
- )
- }
- RESTART_SERVICE() {
- CONTAINER_SERVICES
- selected_services=()
- WARN "重启服务请在${LIGHT_GREEN}${DOCKER_COMPOSE_FILE}${RESET}文件存储目录下执行脚本.默认安装路径: ${LIGHT_BLUE}${PROXY_DIR}${RESET}"
- echo -e "${YELLOW}-------------------------------------------------${RESET}"
- echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
- echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
- echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
- echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
- echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
- echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
- echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
- echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
- echo -e "${GREEN}9)${RESET} ${BOLD}all${RESET}"
- echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
- echo -e "${YELLOW}-------------------------------------------------${RESET}"
- read -e -p "$(INFO "输入序号选择对应服务,${LIGHT_YELLOW}空格分隔${RESET}多个选项. ${LIGHT_CYAN}all选择所有${RESET} > ")" restart_service
- if [[ "$restart_service" == "9" ]]; then
- for service_name in "${services[@]}"; do
- if docker-compose ps --services 2>/dev/null | grep -q "^${service_name}$"; then
- selected_services+=("$service_name")
- else
- WARN "服务 ${service_name}未运行,跳过重启。"
- fi
- done
- INFO "重启的服务: ${selected_services[*]}"
- elif [[ "$restart_service" == "0" ]]; then
- WARN "退出重启服务!"
- exit 1
- else
- for choice in ${restart_service}; do
- if [[ $choice =~ ^[0-9]+$ ]] && ((choice >0 && choice <= ${#services[@]})); then
- service_name="${services[$((choice -1))]}"
- if docker-compose ps --services 2>/dev/null | grep -q "^${service_name}$"; then
- selected_services+=("$service_name")
- else
- WARN "服务 ${service_name} 未运行,跳过重启。"
-
- fi
- else
- ERROR "无效的选择: $choice. 请重新${LIGHT_GREEN}选择0-9${RESET}的选项"
- RESTART_SERVICE # 选择无效重新调用当前函数进行选择
- fi
- done
- INFO "重启的服务: ${selected_services[*]}"
- fi
- }
- UPDATE_SERVICE() {
- CONTAINER_SERVICES
- selected_services=()
- WARN "更新服务请在${LIGHT_GREEN}${DOCKER_COMPOSE_FILE}${RESET}文件存储目录下执行脚本.默认安装路径: ${LIGHT_BLUE}${PROXY_DIR}${RESET}"
- echo -e "${YELLOW}-------------------------------------------------${RESET}"
- echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
- echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
- echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
- echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
- echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
- echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
- echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
- echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
- echo -e "${GREEN}9)${RESET} ${BOLD}all${RESET}"
- echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
- echo -e "${YELLOW}-------------------------------------------------${RESET}"
- read -e -p "$(INFO "输入序号选择对应服务,${LIGHT_YELLOW}空格分隔${RESET}多个选项. ${LIGHT_CYAN}all选择所有${RESET} > ")" choices_service
- if [[ "$choices_service" == "9" ]]; then
- for service_name in "${services[@]}"; do
- if docker-compose ps --services 2>/dev/null | grep -q "^${service_name}$"; then
- selected_services+=("$service_name")
- else
- WARN "服务 ${service_name}未运行,跳过更新。"
- fi
- done
- INFO "更新的服务: ${selected_services[*]}"
- elif [[ "$choices_service" == "0" ]]; then
- WARN "退出更新服务!"
- exit 1
- else
- for choice in ${choices_service}; do
- if [[ $choice =~ ^[0-9]+$ ]] && ((choice >0 && choice <= ${#services[@]})); then
- service_name="${services[$((choice -1))]}"
- if docker-compose ps --services 2>/dev/null | grep -q "^${service_name}$"; then
- selected_services+=("$service_name")
- else
- WARN "服务 ${service_name} 未运行,跳过更新。"
-
- fi
- else
- ERROR "无效的选择: $choice. 请重新${LIGHT_GREEN}选择0-9${RESET}的选项"
- UPDATE_SERVICE # 选择无效重新调用当前函数进行选择
- fi
- done
- INFO "更新的服务: ${selected_services[*]}"
- fi
- }
- CONTAIENR_LOGS() {
- CONTAINER_SERVICES
- selected_services=()
- echo -e "${YELLOW}-------------------------------------------------${RESET}"
- echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
- echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
- echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
- echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
- echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
- echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
- echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
- echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
- echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
- echo -e "${YELLOW}-------------------------------------------------${RESET}"
- read -e -p "$(INFO "输入序号选择对应服务,${LIGHT_YELLOW}空格分隔${RESET}多个选项. ${LIGHT_CYAN}all选择所有${RESET} > ")" restart_service
- if [[ "$restart_service" == "0" ]]; then
- WARN "退出查看容器服务日志操作!"
- exit 1
- else
- for choice in ${restart_service}; do
- if [[ $choice =~ ^[0-9]+$ ]] && ((choice >0 && choice <= ${#services[@]})); then
- service_name="${services[$((choice -1))]}"
- if docker-compose ps --services 2>/dev/null | grep -q "^${service_name}$"; then
- selected_services+=("$service_name")
- else
- WARN "服务 ${service_name} 未运行,无法查看容器日志。"
- fi
- else
- ERROR "无效的选择: $choice. 请重新${LIGHT_GREEN}选择0-8${RESET}的选项"
- CONTAIENR_LOGS # 选择无效重新调用当前函数进行选择
- fi
- done
- INFO "查看日志的服务: ${selected_services[*]}"
- fi
- }
- MODIFY_SERVICE_CONFIG() {
- selected_services=()
- selected_files=()
- existing_files=()
- non_existing_files=()
- files=(
- "dockerhub registry-hub.yml"
- "gcr registry-gcr.yml"
- "ghcr registry-ghcr.yml"
- "quay registry-quay.yml"
- "k8sgcr registry-k8sgcr.yml"
- "k8s registry-k8s.yml"
- "mcr registry-mcr.yml"
- "elastic registry-elastic.yml"
- )
- while true; do
- echo -e "${YELLOW}-------------------------------------------------${RESET}"
- echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
- echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
- echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
- echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
- echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
- echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
- echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
- echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
- echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
- echo -e "${YELLOW}-------------------------------------------------${RESET}"
- read -e -p "$(INFO "输入序号修改服务对应配置文件,${LIGHT_YELLOW}空格分隔${RESET}多个选项 > ")" ttl_service
- if [[ "$ttl_service" == "0" ]]; then
- WARN "退出修改容器服务配置操作!"
- return
- elif [[ "$ttl_service" =~ ^([1-8]+[[:space:]]*)+$ ]]; then
- break
- else
- WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-8 ${RESET}序号"
- fi
- done
- for choice in ${ttl_service}; do
- file_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f2)
- service_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f1)
- selected_files+=("$file_name")
- if [ -f "${PROXY_DIR}/${file_name}" ]; then
- existing_files+=("$file_name")
- selected_services+=("$service_name")
- else
- non_existing_files+=("$file_name")
- fi
-
- if ! docker-compose ps --services 2>/dev/null | grep -q "^${service_name}$"; then
- WARN "服务 ${service_name} 未运行。"
- fi
- done
- if [ ${#existing_files[@]} -gt 0 ]; then
- INFO "${GREEN}存在的配置文件:${RESET} ${existing_files[*]}${RESET}"
- fi
- if [ ${#non_existing_files[@]} -gt 0 ]; then
- WARN "${RED}不存在的配置文件:${RESET} ${non_existing_files[*]}"
- fi
- if [ ${#existing_files[@]} -gt 0 ]; then
- WARN "${LIGHT_GREEN}>>> 提示:${RESET} ${LIGHT_BLUE}Proxy代理缓存过期时间${RESET} ${MAGENTA}单位:ns、us、ms、s、m、h.默认ns,0禁用缓存过期${RESET}"
- read -e -p "$(INFO "是否要修改缓存时间? ${PROMPT_YES_NO}")" modify_cache
- while [[ "$modify_cache" != "y" && "$modify_cache" != "n" ]]; do
- WARN "无效输入,请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}"
- read -e -p "$(INFO "是否要修改缓存时间? ${PROMPT_YES_NO}")" modify_cache
- done
- if [[ "$modify_cache" == "y" ]]; then
- while true; do
- read -e -p "$(INFO "请输入新的缓存时间值: ")" new_ttl
- for file_url in "${existing_files[@]}"; do
- yml_name=$(basename "$file_url")
- WARN "${YELLOW}正在修改配置文件: ${PROXY_DIR}/${yml_name}${RESET}"
- sed -i "s/ttl: .*/ttl: ${new_ttl}/g" "${PROXY_DIR}/${yml_name}" &>/dev/null
- INFO "${GREEN}配置文件 ${yml_name} 修改完成,代理缓存过期时间已设置为: ${new_ttl}${RESET}"
- done
- break
- done
- fi
- else
- WARN "未选择有效的配置文件进行修改。"
- fi
- }
- SEPARATOR "服务管理"
- echo -e "1) ${BOLD}${LIGHT_GREEN}重启${RESET}服务"
- echo -e "2) ${BOLD}${LIGHT_CYAN}更新${RESET}服务"
- echo -e "3) ${BOLD}${LIGHT_MAGENTA}查看${RESET}日志"
- echo -e "4) ${BOLD}${LIGHT_BLUE}缓存${RESET}时效"
- echo -e "5) ${BOLD}返回${LIGHT_RED}主菜单${RESET}"
- echo -e "0) ${BOLD}退出脚本${RESET}"
- echo "---------------------------------------------------------------"
- read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" ser_choice
- case $ser_choice in
- 1)
- RESTART_SERVICE
- if [ ${#selected_services[@]} -eq 0 ]; then
- ERROR "没有需要重启的服务,请重新选择"
- RESTART_SERVICE
- else
- docker-compose stop ${selected_services[*]}
- docker-compose up -d --force-recreate ${selected_services[*]}
- fi
- SVC_MGMT
- ;;
- 2)
- UPDATE_SERVICE
- if [ ${#selected_services[@]} -eq 0 ]; then
- ERROR "没有需要更新的服务,请重新选择"
- UPDATE_SERVICE
- else
- docker-compose pull ${selected_services[*]}
- docker-compose up -d --force-recreate ${selected_services[*]}
- fi
- SVC_MGMT
- ;;
- 3)
- CONTAIENR_LOGS
- if [ ${#selected_services[@]} -eq 0 ]; then
- ERROR "没有需要查看的服务,请重新选择"
- CONTAIENR_LOGS
- else
- # 查看最近30条日志
- docker-compose logs --tail=30 ${selected_services[*]}
- fi
- SVC_MGMT
- ;;
- 4)
- MODIFY_SERVICE_CONFIG
- if [ ${#selected_services[@]} -eq 0 ]; then
- ERROR "修改的服务未运行,请重新选择"
- MODIFY_SERVICE_CONFIG
- else
- docker-compose restart ${selected_services[*]}
- fi
- SVC_MGMT
- ;;
- 5)
- main_menu
- ;;
- 0)
- exit 1
- ;;
- *)
- WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-5${RESET}的选项."
- SVC_MGMT
- ;;
- esac
- }
- function ADD_SYS_CMD() {
- MAX_ATTEMPTS=3
- attempt=0
- success=false
- TARGET_PATH="/usr/bin/hub"
- INSTALL_ENV() {
- while true; do
- read -e -p "$(INFO "安装环境确认 [${LIGHT_GREEN}国外输1${RESET} ${LIGHT_YELLOW}国内输2${RESET}] > ")" sys_cmd
- case "$sys_cmd" in
- 1 )
- DOWNLOAD_URL="https://raw.githubusercontent.com/dqzboy/Docker-Proxy/main/install/DockerProxy_Install.sh"
- break;;
- 2 )
- DOWNLOAD_URL="https://cdn.jsdelivr.net/gh/dqzboy/Docker-Proxy/install/DockerProxy_Install.sh"
- break;;
- * )
- INFO "请输入 ${LIGHT_GREEN}1${RESET} 表示国外 或者 ${LIGHT_YELLOW}2${RESET} 表示大陆";;
- esac
- done
- }
- INSTALL_OR_UPDATE_CMD() {
- local action=$1
- while [[ $attempt -lt $MAX_ATTEMPTS ]]; do
- attempt=$((attempt + 1))
- if [[ "$action" == "安装" ]]; then
- if command -v hub &> /dev/null; then
- INFO "系统命令已存在,无需安装。"
- success=true
- break
- fi
- WARN "正在安装脚本中,请稍等..."
- else
- WARN "正在进行脚本更新,请稍等..."
- fi
- wget -q -O "$TARGET_PATH" "$DOWNLOAD_URL" &>/dev/null
- if [ $? -eq 0 ]; then
- success=true
- chmod +x "$TARGET_PATH"
- break
- fi
- ERROR "${action}脚本${RED}失败${RESET},正在尝试重新${action} (尝试次数: $attempt)"
- done
- if $success; then
- INFO "${action}脚本${GREEN}成功${RESET},命令行输入 ${LIGHT_GREEN}hub${RESET} 运行"
- else
- ERROR "设置系统命令失败"
- exit 1
- fi
- }
- SEPARATOR "设置脚本为系统命令"
- echo -e "1) ${BOLD}安装${LIGHT_GREEN}系统命令${RESET}"
- echo -e "2) ${BOLD}更新${LIGHT_CYAN}系统命令${RESET}"
- echo -e "3) ${BOLD}返回${LIGHT_RED}主菜单${RESET}"
- echo -e "0) ${BOLD}退出脚本${RESET}"
- echo "---------------------------------------------------------------"
- read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" cmd_choice
- case $cmd_choice in
- 1)
- INSTALL_ENV
- INSTALL_OR_UPDATE_CMD "安装"
- ;;
- 2)
- INSTALL_ENV
- INSTALL_OR_UPDATE_CMD "更新"
- ;;
- 3)
- main_menu
- ;;
- 0)
- exit 1
- ;;
- *)
- WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-3${RESET}的选项."
- ADD_SYS_CMD
- ;;
- esac
- }
- function UNI_DOCKER_SERVICE() {
- RM_SERVICE() {
- selected_containers=()
- files=(
- "dockerhub registry-hub.yml"
- "gcr registry-gcr.yml"
- "ghcr registry-ghcr.yml"
- "quay registry-quay.yml"
- "k8sgcr registry-k8sgcr.yml"
- "k8s registry-k8s.yml"
- "mcr registry-mcr.yml"
- "elastic registry-elastic.yml"
- )
- echo -e "${YELLOW}-------------------------------------------------${RESET}"
- echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
- echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
- echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
- echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
- echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
- echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
- echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
- echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
- echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
- echo -e "${YELLOW}-------------------------------------------------${RESET}"
- read -e -p "$(INFO "输入序号删除服务和对应配置文件,${LIGHT_YELLOW}空格分隔${RESET}多个选项 > ")" rm_service
- while [[ ! "$rm_service" =~ ^([0-8]+[[:space:]]*)+$ ]]; do
- WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-8 ${RESET}序号"
- read -e -p "$(INFO "输入序号删除服务和对应配置文件,${LIGHT_YELLOW}空格分隔${RESET}多个选项 > ")" rm_service
- done
- if [[ "$rm_service" == "0" ]]; then
- WARN "退出删除容器服务操作!"
- return
- else
- selected_services=()
- for choice in ${rm_service}; do
- if [[ $choice =~ ^[0-8]+$ ]] && ((choice > 0 && choice <= ${#files[@]})); then
- file_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f2)
- service_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f1)
-
- if docker-compose ps --services 2>/dev/null | grep -q "^${service_name}$"; then
- selected_services+=("$service_name")
- else
- WARN "服务 ${LIGHT_MAGENTA}${service_name} 未运行${RESET},但将尝试删除相关文件。"
- fi
-
- if [ -f "${PROXY_DIR}/${file_name}" ]; then
- rm -f "${PROXY_DIR}/${file_name}"
- INFO "配置文件 ${LIGHT_CYAN}${file_name}${RESET} ${LIGHT_GREEN}已被删除${RESET}"
- else
- WARN "配置文件 ${LIGHT_CYAN}${file_name}${RESET} 不存在,${LIGHT_YELLOW}无需删除${RESET}"
- fi
- else
- WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-8 ${RESET}序号"
- UNI_DOCKER_SERVICE
- return
- fi
- done
- # 一次性删除所有选中的服务
- if [ ${#selected_services[@]} -gt 0 ]; then
- INFO "删除的服务: ${LIGHT_RED}${selected_services[*]}${RESET}"
- docker-compose down ${selected_services[*]}
- fi
- fi
- }
- RM_ALLSERVICE() {
- STOP_REMOVE_CONTAINER
- REMOVE_NONE_TAG
- REMOVE_CMDUI
- docker rmi --force $(docker images -q ${IMAGE_NAME}) &>/dev/null
- docker rmi --force $(docker images -q ${UI_IMAGE_NAME}) &>/dev/null
- if [ -d "${PROXY_DIR}" ]; then
- rm -rf "${PROXY_DIR}" &>/dev/null
- fi
- if [ -f "/usr/bin/hub" ]; then
- rm -f /usr/bin/hub &>/dev/null
- fi
- INFO "${LIGHT_YELLOW}感谢您的使用,Docker-Proxy服务已卸载。欢迎您再次使用!${RESET}"
- SEPARATOR "DONE"
- }
- CONFIREM_ACTION() {
- local action_name=$1
- local action_function=$2
- WARN "${LIGHT_RED}注意:${RESET} ${LIGHT_YELLOW}卸载服务会一同将本地的配置和对应服务删除,请执行删除之前确定是否需要备份本地的配置文件${RESET}"
- while true; do
- read -e -p "$(INFO "本人${LIGHT_RED}已知晓后果,确认${action_name}${RESET}服务? ${PROMPT_YES_NO}")" uniservice
- case "$uniservice" in
- y|Y )
- $action_function
- break;;
- n|N )
- WARN "退出${action_name}服务."
- break;;
- * )
- INFO "请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}";;
- esac
- done
- }
- SEPARATOR "卸载服务"
- echo -e "1) ${BOLD}卸载${LIGHT_YELLOW}所有服务${RESET}"
- echo -e "2) ${BOLD}删除${LIGHT_CYAN}指定服务${RESET}"
- echo -e "3) ${BOLD}返回${LIGHT_RED}主菜单${RESET}"
- echo -e "0) ${BOLD}退出脚本${RESET}"
- echo "---------------------------------------------------------------"
- read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" rm_choice
- case $rm_choice in
- 1)
- CONFIREM_ACTION "卸载所有" RM_ALLSERVICE
- ;;
- 2)
- CONFIREM_ACTION "删除指定" RM_SERVICE
- UNI_DOCKER_SERVICE
- ;;
- 3)
- main_menu
- ;;
- 0)
- exit 1
- ;;
- *)
- WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-3${RESET}的选项."
- UNI_DOCKER_SERVICE
- ;;
- esac
- }
- function AUTH_SERVICE_CONFIG() {
- CHECK_REG_AUTH() {
- if ! command -v docker &> /dev/null; then
- ERROR "docker 命令未找到,请确保 Docker 已正确安装"
- AUTH_SERVICE_CONFIG
- fi
- declare -A services
- services=(
- ["reg-docker-hub"]="dockerhub"
- ["reg-gcr"]="gcr"
- ["reg-ghcr"]="ghcr"
- ["reg-quay"]="quay"
- ["reg-k8s-gcr"]="k8sgcr"
- ["reg-k8s"]="k8s"
- ["reg-mcr"]="mcr"
- ["reg-elastic"]="elastic"
- )
- container_names=$(docker ps --filter "name=reg-" --filter "status=running" --format "{{.Names}}")
- auth_containers=()
- for container_name in $container_names; do
- specified_name=${services[$container_name]}
- if [ -z "$specified_name" ]; then
- specified_name=$container_name
- fi
- if docker exec $container_name grep -q "auth" /etc/distribution/config.yml; then
- auth_containers+=("$specified_name")
- fi
- done
- if [ ${#auth_containers[@]} -gt 0 ]; then
- INFO "当前运行的 Docker 容器中${LIGHT_GREEN}包含认证${RESET}的容器有: ${LIGHT_CYAN}${auth_containers[*]}${RESET}"
- else
- WARN "当前运行的 Docker 容器中${LIGHT_YELLOW}没有包含认证${RESET}的容器"
- fi
- }
- AUTH_MENU() {
- CHECK_REG_AUTH
- selected_files=()
- selected_services=()
- files=(
- "dockerhub registry-hub.yml"
- "gcr registry-gcr.yml"
- "ghcr registry-ghcr.yml"
- "quay registry-quay.yml"
- "k8sgcr registry-k8sgcr.yml"
- "k8s registry-k8s.yml"
- "mcr registry-mcr.yml"
- "elastic registry-elastic.yml"
- )
- echo -e "${YELLOW}-------------------------------------------------${RESET}"
- echo -e "${GREEN}1)${RESET} ${BOLD}docker hub${RESET}"
- echo -e "${GREEN}2)${RESET} ${BOLD}gcr${RESET}"
- echo -e "${GREEN}3)${RESET} ${BOLD}ghcr${RESET}"
- echo -e "${GREEN}4)${RESET} ${BOLD}quay${RESET}"
- echo -e "${GREEN}5)${RESET} ${BOLD}k8s-gcr${RESET}"
- echo -e "${GREEN}6)${RESET} ${BOLD}k8s${RESET}"
- echo -e "${GREEN}7)${RESET} ${BOLD}mcr${RESET}"
- echo -e "${GREEN}8)${RESET} ${BOLD}elastic${RESET}"
- echo -e "${GREEN}0)${RESET} ${BOLD}exit${RESET}"
- echo -e "${YELLOW}-------------------------------------------------${RESET}"
- read -e -p "$(INFO "输入序号选择添加认证的服务,${LIGHT_YELLOW}空格分隔${RESET}多个选项 > ")" auth_service
- while [[ ! "$auth_service" =~ ^([0-8]+[[:space:]]*)+$ ]]; do
- WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-8 ${RESET}序号"
- read -e -p "$(INFO "输入序号选择添加认证的服务,${LIGHT_YELLOW}空格分隔${RESET}多个选项 > ")" auth_service
- done
- }
- ADD_AUTH_CONFIG() {
- local FILE=$1
- local auth_config="
- auth:
- htpasswd:
- realm: basic-realm
- path: /auth/htpasswd"
- if [ ! -f "$FILE" ]; then
- ERROR "配置文件 ${LIGHT_BLUE}$FILE${RESET} 不存在"
- exit 1
- else
- if ! grep -q "auth:" "$FILE" || ! grep -q "htpasswd:" "$FILE" || ! grep -q "realm: basic-realm" "$FILE" || ! grep -q "path: /auth/htpasswd" "$FILE"; then
- echo -e "$auth_config" | sudo tee -a "$FILE" > /dev/null
- INFO "配置文件 ${LIGHT_BLUE}$FILE${RESET} 添加认证配置成功"
- else
- WARN "配置文件 ${LIGHT_BLUE}$FILE${RESET} 已添加认证配置"
- fi
- fi
- }
- ADD_AUTH_COMPOSE() {
- local SERVICES=$1
- local FILE=${DOCKER_COMPOSE_FILE}
- local HTPASSWD_CONFIG=" - ./${SERVICES}_htpasswd:/auth/htpasswd"
- if [ ! -f "$FILE" ]; then
- ERROR "配置文件 ${LIGHT_BLUE}$FILE${RESET} 不存在"
- exit 1
- fi
- for SERVICE in "${SERVICES[@]}"; do
- if grep -q " $SERVICE:" "$FILE"; then
- if ! grep -A10 " $SERVICE:" "$FILE" | grep -q " - ./${SERVICES}_htpasswd:/auth/htpasswd"; then
- sed -i "/ $SERVICE:/,/volumes:/ {
- /volumes:/a\\
- $HTPASSWD_CONFIG
- }" "$FILE"
- INFO "Htpasswd配置添加到 ${LIGHT_GREEN}$SERVICE${RESET} 服务中"
- else
- WARN "Htpasswd配置已存在 ${LIGHT_YELLOW}$SERVICE${RESET} 服务中"
- fi
- else
- ERROR "服务 $SERVICE 在 $FILE 中不存在"
- fi
- done
- }
- DEL_AUTH_CONFIG() {
- local FILE=$1
- if [ ! -f "$FILE" ]; then
- ERROR "配置文件 $FILE 不存在"
- else
- if grep -q "auth:" "$FILE"; then
- sed -i '/^auth:$/,/^[^[:space:]]/d' "$FILE" >/dev/null
- INFO "配置文件 ${LIGHT_BLUE}$FILE${RESET} 成功移除认证信息"
- else
- WARN "配置文件 ${LIGHT_BLUE}$FILE${RESET} 不存在认证信息"
- fi
- fi
- }
- DEL_AUTH_COMPOSE() {
- local SERVICES=$1
- local FILE=${DOCKER_COMPOSE_FILE}
- if [ ! -f "$FILE" ]; then
- ERROR "$File 不存在"
- exit 1
- fi
- for SERVICE in "${SERVICES[@]}"; do
- if grep -q " $SERVICE:" "$FILE"; then
- sed -i "/ $SERVICE:/,/^[^[:space:]]/ {/^[[:space:]]*- .\/${SERVICES}_htpasswd:\/auth\/htpasswd/d}" "$FILE"
- else
- ERROR "$FILE 中不存在服务 $SERVICE"
- fi
- done
- }
- ENABLE_AUTH() {
- AUTH_MENU
- if [[ "$auth_service" == "0" ]]; then
- WARN "退出添加容器认证操作!"
- return
- else
- for choice in ${auth_service}; do
- if [[ $choice =~ ^[0-8]+$ ]] && ((choice > 0 && choice <= ${#files[@]})); then
- file_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f2)
- service_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f1)
- selected_files+=("$file_name")
- if docker-compose ps --services 2>/dev/null | grep -q "^${service_name}$"; then
- selected_services+=("$service_name")
- else
- WARN "服务 ${LIGHT_MAGENTA}${service_name} 未运行${RESET},无法添加认证授权"
- fi
- else
- WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-8 ${RESET}序号"
- AUTH_MENU
- return
- fi
- done
- WARN "${LIGHT_GREEN}>>> 提示:${RESET} ${LIGHT_CYAN}配置认证后,执行镜像拉取需先通过 docker login登入后使用.访问UI需输入账号密码${RESET}"
- read -e -p "$(INFO "是否需要配置镜像仓库访问账号和密码? ${PROMPT_YES_NO}")" enable_auth
- while [[ "$enable_auth" != "y" && "$enable_auth" != "n" ]]; do
- WARN "无效输入,请输入 ${LIGHT_GREEN}y${RESET} 或 ${LIGHT_YELLOW}n${RESET}"
- read -e -p "$(INFO "是否需要配置镜像仓库访问账号和密码? ${PROMPT_YES_NO}")" enable_auth
- done
- if [[ "$enable_auth" == "y" ]]; then
- while true; do
- read -e -p "$(INFO "请输入账号名称: ")" username
- if [[ -z "$username" ]]; then
- ERROR "用户名不能为空。请重新输入"
- else
- break
- fi
- done
- while true; do
- read -e -p "$(INFO "请输入账号密码: ")" password
- if [[ -z "$password" ]]; then
- ERROR "密码不能为空。请重新输入"
- else
- break
- fi
- done
- for file_url in "${selected_files[@]}"; do
- yml_name=$(basename "$file_url")
- ADD_AUTH_CONFIG "${PROXY_DIR}/${yml_name}"
- done
- for server in "${selected_services[@]}"; do
- htpasswd -Bbc ${PROXY_DIR}/${server}_htpasswd "$username" "$password" 2>/dev/null
- ADD_AUTH_COMPOSE "${server}"
- done
- fi
- fi
- }
- DELETE_AUTH() {
- AUTH_MENU
- if [[ "$auth_service" == "0" ]]; then
- WARN "退出移除容器认证操作!"
- return
- else
- for choice in ${auth_service}; do
- if [[ $choice =~ ^[0-8]+$ ]] && ((choice > 0 && choice <= ${#files[@]})); then
- file_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f2)
- service_name=$(echo "${files[$((choice - 1))]}" | cut -d' ' -f1)
- selected_files+=("$file_name")
- if docker-compose ps --services 2>/dev/null | grep -q "^${service_name}$"; then
- selected_services+=("$service_name")
- else
- WARN "服务 ${LIGHT_MAGENTA}${service_name} 未运行${RESET},无法添加认证授权"
- fi
- else
- WARN "无效输入,请重新输入${LIGHT_YELLOW} 0-8 ${RESET}序号"
- AUTH_MENU
- return
- fi
- done
- for file_url in "${selected_files[@]}"; do
- yml_name=$(basename "$file_url")
- DEL_AUTH_CONFIG "${PROXY_DIR}/${yml_name}"
- done
- for server in "${selected_services[@]}"; do
- DEL_AUTH_COMPOSE "${server}"
- rm -f ${PROXY_DIR}/${server}_htpasswd
- done
- fi
- }
- SEPARATOR "认证授权"
- echo -e "1) ${BOLD}${LIGHT_YELLOW}添加${RESET}认证"
- echo -e "2) ${BOLD}${LIGHT_CYAN}删除${RESET}认证"
- echo -e "3) ${BOLD}返回${LIGHT_RED}主菜单${RESET}"
- echo -e "0) ${BOLD}退出脚本${RESET}"
- echo "---------------------------------------------------------------"
- read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" auth_choice
- case $auth_choice in
- 1)
- ENABLE_AUTH
- if [ ${#selected_services[@]} -eq 0 ]; then
- WARN "没有运行任何选择的服务,请${LIGHT_CYAN}重新选择运行${RESET}的服务"
- AUTH_SERVICE_CONFIG # 没有服务运行调用函数
- else
- docker-compose down ${selected_services[*]}
- docker-compose up -d --force-recreate ${selected_services[*]}
- fi
- AUTH_SERVICE_CONFIG
- ;;
- 2)
- DELETE_AUTH
- if [ ${#selected_services[@]} -eq 0 ]; then
- WARN "没有运行任何选择的服务,请${LIGHT_CYAN}重新选择运行${RESET}的服务"
- AUTH_SERVICE_CONFIG # 没有服务运行调用函数
- else
- docker-compose down ${selected_services[*]}
- docker-compose up -d --force-recreate ${selected_services[*]}
- fi
- AUTH_SERVICE_CONFIG
- ;;
- 3)
- main_menu
- ;;
- 0)
- exit 1
- ;;
- *)
- WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-3${RESET}的选项."
- AUTH_SERVICE_CONFIG
- ;;
- esac
- }
- ## 主菜单
- function main_menu() {
- echo -e "╔════════════════════════════════════════════════════╗"
- echo -e "║ ║"
- echo -e "║ ${LIGHT_CYAN}欢迎使用Docker-Proxy${RESET} ║"
- echo -e "║ ║"
- echo -e "║ TG频道: ${UNDERLINE}https://t.me/dqzboyblog${RESET} ║"
- echo -e "║ ║"
- echo -e "║ ${LIGHT_BLUE}by dqzboy${RESET} ║"
- echo -e "║ ║"
- echo -e "╚════════════════════════════════════════════════════╝"
- echo
- SEPARATOR "请选择操作"
- echo -e "1) ${BOLD}${LIGHT_GREEN}安装${RESET}服务"
- echo -e "2) ${BOLD}${LIGHT_MAGENTA}组件${RESET}安装"
- echo -e "3) ${BOLD}${LIGHT_YELLOW}管理${RESET}服务"
- echo -e "4) ${BOLD}${LIGHT_CYAN}更新${RESET}配置"
- echo -e "5) ${BOLD}${LIGHT_RED}卸载${RESET}服务"
- echo -e "6) ${BOLD}${LIGHT_BLUE}认证${RESET}授权"
- echo -e "7) 本机${BOLD}${CYAN}Docker代理${RESET}"
- echo -e "8) 设置成${BOLD}${YELLOW}系统命令${RESET}"
- echo -e "0) ${BOLD}退出脚本${RESET}"
- echo "---------------------------------------------------------------"
- read -e -p "$(INFO "输入${LIGHT_CYAN}对应数字${RESET}并按${LIGHT_GREEN}Enter${RESET}键 > ")" main_choice
- case $main_choice in
- 1)
- INSTALL_PROXY
- ;;
- 2)
- COMP_INST
- ;;
- 3)
- SVC_MGMT
- ;;
- 4)
- SEPARATOR "更新配置"
- UPDATE_CONFIG
- SEPARATOR "更新完成"
- ;;
- 5)
- UNI_DOCKER_SERVICE
- ;;
- 6)
- AUTH_SERVICE_CONFIG
- ;;
- 7)
- SEPARATOR "配置本机Docker代理"
- DOCKER_PROXY_HTTP
- ADD_DOCKERD_PROXY
- SEPARATOR "Docker代理配置完成"
- ;;
- 8)
- ADD_SYS_CMD
- ;;
- 0)
- exit 1
- ;;
- *)
- WARN "输入了无效的选择。请重新${LIGHT_GREEN}选择0-7${RESET}的选项."
- sleep 2; main_menu
- ;;
- esac
- }
- main_menu
|