Files
Docker-Proxy/install/DockerProxy_Install.sh

2711 lines
93 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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"
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"
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"
IMAGE_NAME="registry"
UI_IMAGE_NAME="dqzboy/docker-registry-ui"
DOCKER_COMPOSE_FILE="docker-compose.yaml"
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 "是否开启${LIGHT_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 "你的服务器已经启动BBR"
else
INFO "开启BBR中..."
modprobe tcp_bbr
if [ $? -eq 0 ]; then
INFO "BBR模块添加成功."
else
ERROR "BBR模块添加失败请执行 ${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
if [ $? -eq 0 ]; then
INFO "BBR已经成功开启。"
else
ERROR "BBR开启失败请执行 ${LIGHT_CYAN}sysctl -p${RESET} 检查."
exit 3
fi
WARN "如果BBR开启后未生效请执行 ${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
WARN "$package 的安装时间超过 ${LIGHT_YELLOW}$TIMEOUT${RESET}。是否继续? [${LIGHT_GREEN}y${RESET}/${LIGHT_YELLOW}n${RESET}]"
read -r 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
IFS=',' read -r -a records_array <<< "$selected_records"
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
IFS=',' read -r -a records_array <<< "$selected_records"
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 -ri "s@- DOCKER_REGISTRY_URL=http://reg-docker-hub:5000@- 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 "退出下载配置! 首次安装如果没有配置无法启动服务,只能启动UI服务"
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" != "5" ]]; 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 "是否执行软件包安装? ${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 COMP_INST() {
SEPARATOR "安装组件"
echo -e "1) ${BOLD}安装${LIGHT_GREEN}环境依赖${RESET}"
echo -e "2) ${BOLD}安装${LIGHT_GREEN}Docker${RESET}"
echo -e "3) ${BOLD}安装${LIGHT_MAGENTA}Compose${RESET}"
echo -e "4) ${BOLD}安装${GREEN}Nginx${RESET}"
echo -e "5) ${BOLD}安装${LIGHT_CYAN}Caddy${RESET}"
echo -e "6) ${BOLD}配置${LIGHT_YELLOW}Nginx${RESET}"
echo -e "7) ${BOLD}配置${CYAN}Caddy${RESET}"
echo -e "8) ${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)
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
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 -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
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() {
AUTH_MENU() {
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 -Bbn "$username" "$password" > ${PROXY_DIR}/${server}_htpasswd
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