412 lines
9.6 KiB
Bash
Executable File
412 lines
9.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Debian 12 包管理配置脚本
|
|
# 优化 apt 配置和安装基础软件
|
|
|
|
set -e
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
# 日志函数
|
|
log_info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
log_warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
# 优化 apt 配置
|
|
optimize_apt() {
|
|
log_info "优化 apt 配置..."
|
|
|
|
# 创建 apt 配置目录
|
|
mkdir -p /etc/apt/apt.conf.d
|
|
|
|
# 配置 apt 并发连接数
|
|
cat > /etc/apt/apt.conf.d/99custom << 'EOF'
|
|
Acquire::http::Timeout "30";
|
|
Acquire::ftp::Timeout "30";
|
|
Acquire::Retries "3";
|
|
Acquire::http::Pipeline-Depth "0";
|
|
Acquire::http::No-Cache "true";
|
|
Acquire::BrokenProxy "true";
|
|
Acquire::http::Proxy-Auto-Detect "/usr/local/bin/apt-proxy-detect";
|
|
EOF
|
|
|
|
# 配置多线程下载
|
|
cat > /etc/apt/apt.conf.d/99parallel << 'EOF'
|
|
Acquire::Queue-Mode "access";
|
|
Acquire::Retries "0";
|
|
Acquire::http::Dl-Limit "0";
|
|
Acquire::https::Dl-Limit "0";
|
|
Acquire::ftp::Dl-Limit "0";
|
|
EOF
|
|
|
|
log_success "apt 配置优化完成"
|
|
}
|
|
|
|
# 安装基础工具
|
|
install_basic_tools() {
|
|
log_info "安装基础工具..."
|
|
|
|
local packages=(
|
|
curl
|
|
wget
|
|
git
|
|
vim
|
|
htop
|
|
net-tools
|
|
dnsutils
|
|
telnet
|
|
unzip
|
|
zip
|
|
tree
|
|
jq
|
|
ncdu
|
|
tmux
|
|
screen
|
|
lsof
|
|
psmisc
|
|
apt-transport-https
|
|
ca-certificates
|
|
gnupg
|
|
gnupg2
|
|
software-properties-common
|
|
)
|
|
|
|
apt update
|
|
apt install -y "${packages[@]}"
|
|
|
|
log_success "基础工具安装完成"
|
|
}
|
|
|
|
# 安装 Docker (从国内源,支持多源切换)
|
|
install_docker() {
|
|
log_info "从国内源安装 Docker (支持多源自动切换)..."
|
|
|
|
# 获取脚本所在目录
|
|
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
local docker_script="$script_dir/install_docker.sh"
|
|
|
|
# 检查是否存在独立的 Docker 安装脚本
|
|
if [[ -f "$docker_script" ]]; then
|
|
log_info "使用 install_docker.sh 脚本安装..."
|
|
bash "$docker_script" --force
|
|
else
|
|
# 内联安装逻辑(多源支持)
|
|
log_info "使用内置安装逻辑..."
|
|
|
|
# 定义多个 Docker 源
|
|
local -A docker_sources=(
|
|
["aliyun"]="https://mirrors.aliyun.com/docker-ce"
|
|
["ustc"]="https://mirrors.ustc.edu.cn/docker-ce"
|
|
["huawei"]="https://mirrors.huaweicloud.com/docker-ce"
|
|
["163"]="https://mirrors.163.com/docker-ce"
|
|
["tsinghua"]="https://mirrors.tuna.tsinghua.edu.cn/docker-ce"
|
|
)
|
|
local source_order=("aliyun" "ustc" "huawei" "163" "tsinghua")
|
|
|
|
# 卸载旧版本
|
|
apt remove -y docker docker-engine docker.io containerd runc 2>/dev/null || true
|
|
apt update
|
|
apt install -y ca-certificates curl gnupg lsb-release
|
|
|
|
mkdir -p /etc/apt/keyrings
|
|
local codename=$(lsb_release -cs)
|
|
local arch=$(dpkg --print-architecture)
|
|
local installed=false
|
|
|
|
for source_name in "${source_order[@]}"; do
|
|
local source_url="${docker_sources[$source_name]}"
|
|
log_info "尝试使用 $source_name 源: $source_url"
|
|
|
|
# 测试源
|
|
if ! curl -sfL --connect-timeout 5 --max-time 10 "$source_url/linux/debian/gpg" -o /dev/null 2>/dev/null; then
|
|
log_warning "$source_name 源不可用,跳过..."
|
|
continue
|
|
fi
|
|
|
|
# 配置源
|
|
rm -f /etc/apt/keyrings/docker.gpg /etc/apt/sources.list.d/docker.list
|
|
curl -fsSL "$source_url/linux/debian/gpg" | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
|
echo "deb [arch=$arch signed-by=/etc/apt/keyrings/docker.gpg] $source_url/linux/debian $codename stable" > /etc/apt/sources.list.d/docker.list
|
|
|
|
apt update
|
|
|
|
# 尝试安装
|
|
set +e
|
|
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 2>&1
|
|
local result=$?
|
|
set -e
|
|
|
|
if [[ $result -eq 0 ]]; then
|
|
log_success "Docker 安装成功 (源: $source_name)"
|
|
installed=true
|
|
break
|
|
else
|
|
log_warning "从 $source_name 安装失败,尝试下一个源..."
|
|
fi
|
|
done
|
|
|
|
if [[ "$installed" != "true" ]]; then
|
|
log_error "Docker 安装失败,已尝试所有可用源"
|
|
exit 1
|
|
fi
|
|
|
|
# 配置 Docker
|
|
mkdir -p /etc/docker
|
|
cat > /etc/docker/daemon.json << 'EOF'
|
|
{
|
|
"registry-mirrors": [
|
|
"https://docker-proxy.syy.1msoft.cn",
|
|
"https://registry.docker-cn.com",
|
|
"https://docker.mirrors.ustc.edu.cn",
|
|
"https://hub-mirror.c.163.com",
|
|
"https://mirror.baidubce.com"
|
|
],
|
|
"log-driver": "json-file",
|
|
"log-opts": {
|
|
"max-size": "100m",
|
|
"max-file": "3"
|
|
},
|
|
"storage-driver": "overlay2"
|
|
}
|
|
EOF
|
|
|
|
systemctl enable docker
|
|
systemctl start docker
|
|
|
|
if id -u "$SUDO_USER" >/dev/null 2>&1; then
|
|
usermod -aG docker "$SUDO_USER"
|
|
log_info "已将用户 $SUDO_USER 添加到 docker 组,请重新登录以生效"
|
|
fi
|
|
|
|
if docker --version >/dev/null 2>&1; then
|
|
log_success "Docker 安装成功,版本: $(docker --version)"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# 安装开发工具
|
|
install_dev_tools() {
|
|
log_info "安装开发工具..."
|
|
|
|
local packages=(
|
|
build-essential
|
|
cmake
|
|
ninja-build
|
|
python3
|
|
python3-pip
|
|
python3-venv
|
|
python3-dev
|
|
nodejs
|
|
npm
|
|
golang
|
|
rustc
|
|
cargo
|
|
openjdk-17-jdk
|
|
maven
|
|
gradle
|
|
)
|
|
|
|
apt update
|
|
apt install -y "${packages[@]}"
|
|
|
|
# 配置 Python pip 国内源
|
|
mkdir -p /root/.pip
|
|
cat > /root/.pip/pip.conf << 'EOF'
|
|
[global]
|
|
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
|
|
[install]
|
|
trusted-host = https://pypi.tuna.tsinghua.edu.cn
|
|
EOF
|
|
|
|
# 配置 npm 国内源
|
|
npm config set registry https://registry.npmmirror.com
|
|
|
|
# 配置 Go 国内代理
|
|
mkdir -p /root/go
|
|
echo 'export GOPROXY=https://goproxy.cn,direct' >> /root/.bashrc
|
|
echo 'export GO111MODULE=on' >> /root/.bashrc
|
|
|
|
# 配置 Rust 国内源
|
|
mkdir -p /root/.cargo
|
|
cat > /root/.cargo/config << 'EOF'
|
|
[source.crates-io]
|
|
replace-with = 'tuna'
|
|
|
|
[source.tuna]
|
|
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"
|
|
EOF
|
|
|
|
log_success "开发工具安装完成"
|
|
}
|
|
|
|
# 安装网络工具
|
|
install_network_tools() {
|
|
log_info "安装网络工具..."
|
|
|
|
local packages=(
|
|
openssh-server
|
|
openssh-client
|
|
iptables
|
|
ufw
|
|
fail2ban
|
|
nmap
|
|
tcpdump
|
|
wireshark
|
|
iperf3
|
|
mtr
|
|
traceroute
|
|
whois
|
|
ntp
|
|
chrony
|
|
)
|
|
|
|
apt update
|
|
apt install -y "${packages[@]}"
|
|
|
|
log_success "网络工具安装完成"
|
|
}
|
|
|
|
# 安装监控工具
|
|
install_monitoring_tools() {
|
|
log_info "安装监控工具..."
|
|
|
|
local packages=(
|
|
prometheus
|
|
prometheus-node-exporter
|
|
grafana
|
|
zabbix-agent
|
|
nagios-nrpe-plugin
|
|
munin-node
|
|
collectd
|
|
sysstat
|
|
iotop
|
|
atop
|
|
nmon
|
|
)
|
|
|
|
apt update
|
|
apt install -y "${packages[@]}"
|
|
|
|
log_success "监控工具安装完成"
|
|
}
|
|
|
|
# 清理包缓存
|
|
clean_cache() {
|
|
log_info "清理包缓存..."
|
|
|
|
apt autoremove -y
|
|
apt autoclean -y
|
|
apt clean -y
|
|
|
|
log_success "包缓存清理完成"
|
|
}
|
|
|
|
# 显示包信息
|
|
show_package_info() {
|
|
log_info "系统包信息:"
|
|
|
|
echo "已安装包数量: $(dpkg -l | grep '^ii' | wc -l)"
|
|
echo "可用更新: $(apt list --upgradable 2>/dev/null | grep -v "Listing" | wc -l)"
|
|
echo "磁盘使用情况:"
|
|
df -h /var/cache/apt
|
|
}
|
|
|
|
# 显示帮助信息
|
|
show_help() {
|
|
cat << EOF
|
|
Debian 12 包管理配置工具
|
|
|
|
用法: $0 [选项] [操作]
|
|
|
|
操作:
|
|
optimize 优化 apt 配置
|
|
basic 安装基础工具
|
|
dev 安装开发工具 (不含 Docker)
|
|
docker 从国内源安装 Docker
|
|
network 安装网络工具
|
|
monitor 安装监控工具
|
|
clean 清理包缓存
|
|
info 显示包信息
|
|
all 执行所有操作
|
|
|
|
选项:
|
|
-h, --help 显示此帮助信息
|
|
|
|
示例:
|
|
$0 optimize # 优化 apt 配置
|
|
$0 basic # 安装基础工具
|
|
$0 docker # 从国内源安装 Docker
|
|
$0 all # 执行所有操作
|
|
|
|
EOF
|
|
}
|
|
|
|
# 主函数
|
|
main() {
|
|
local action="$1"
|
|
|
|
case $action in
|
|
optimize)
|
|
optimize_apt
|
|
;;
|
|
basic)
|
|
install_basic_tools
|
|
;;
|
|
dev)
|
|
install_dev_tools
|
|
;;
|
|
docker)
|
|
install_docker
|
|
;;
|
|
network)
|
|
install_network_tools
|
|
;;
|
|
monitor)
|
|
install_monitoring_tools
|
|
;;
|
|
clean)
|
|
clean_cache
|
|
;;
|
|
info)
|
|
show_package_info
|
|
;;
|
|
all)
|
|
optimize_apt
|
|
install_basic_tools
|
|
install_dev_tools
|
|
install_docker
|
|
install_network_tools
|
|
install_monitoring_tools
|
|
;;
|
|
""|-h|--help)
|
|
show_help
|
|
;;
|
|
*)
|
|
log_error "未知操作: $action"
|
|
show_help
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
log_success "包管理配置完成!"
|
|
}
|
|
|
|
# 执行主函数
|
|
main "$@" |