em-script/scripts/packages/configure_packages.sh

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 "$@"