335 lines
8.7 KiB
Bash
335 lines
8.7 KiB
Bash
#!/bin/bash
|
||
set -e
|
||
|
||
echo "=========================================="
|
||
echo " 修复Docker服务未找到问题"
|
||
echo "=========================================="
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m'
|
||
|
||
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
|
||
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||
|
||
# 检查Docker安装状态
|
||
check_docker_installation() {
|
||
log_info "检查Docker安装状态..."
|
||
|
||
if command -v docker &> /dev/null; then
|
||
docker --version
|
||
log_info "✅ Docker CLI 已安装"
|
||
return 0
|
||
else
|
||
log_error "❌ Docker CLI 未安装"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# 检查服务文件
|
||
check_service_files() {
|
||
log_info "检查Docker服务文件..."
|
||
|
||
local services=(
|
||
"/lib/systemd/system/docker.service"
|
||
"/usr/lib/systemd/system/docker.service"
|
||
"/etc/systemd/system/docker.service"
|
||
)
|
||
|
||
for service in "${services[@]}"; do
|
||
if [ -f "$service" ]; then
|
||
log_info "找到服务文件: $service"
|
||
return 0
|
||
fi
|
||
done
|
||
|
||
log_warn "未找到Docker服务文件"
|
||
return 1
|
||
}
|
||
|
||
# 重新安装Docker服务
|
||
reinstall_docker_service() {
|
||
log_info "重新安装Docker服务..."
|
||
|
||
# 彻底清理
|
||
log_info "彻底清理Docker..."
|
||
systemctl stop docker 2>/dev/null || true
|
||
systemctl stop containerd 2>/dev/null || true
|
||
|
||
# 卸载现有docker
|
||
apt-get remove -y --purge docker docker-engine docker.io containerd runc docker-ce docker-ce-cli 2>/dev/null || true
|
||
|
||
# 清理文件和目录
|
||
rm -rf /var/lib/docker
|
||
rm -rf /var/lib/containerd
|
||
rm -rf /etc/docker
|
||
rm -f /etc/apt/sources.list.d/docker*
|
||
|
||
# 重新安装Docker(使用更稳定的方法)
|
||
log_info "重新安装Docker..."
|
||
|
||
# 方法1:使用官方脚本但跳过服务设置
|
||
curl -fsSL https://get.docker.com -o get-docker.sh
|
||
chmod +x get-docker.sh
|
||
|
||
# 修改脚本以跳过systemd检查
|
||
sed -i 's/systemctl is-active docker/#systemctl is-active docker/g' get-docker.sh
|
||
sed -i 's/systemctl start docker/#systemctl start docker/g' get-docker.sh
|
||
sed -i 's/systemctl enable docker/#systemctl enable docker/g' get-docker.sh
|
||
|
||
# 运行修改后的脚本
|
||
./get-docker.sh --version 24.0.5
|
||
|
||
if [ $? -eq 0 ]; then
|
||
log_info "✅ Docker组件安装成功"
|
||
else
|
||
log_warn "官方脚本安装有问题,尝试手动安装..."
|
||
manual_install_docker
|
||
fi
|
||
}
|
||
|
||
# 手动安装Docker
|
||
manual_install_docker() {
|
||
log_info "手动安装Docker..."
|
||
|
||
# 安装依赖
|
||
apt-get update
|
||
apt-get install -y \
|
||
apt-transport-https \
|
||
ca-certificates \
|
||
curl \
|
||
gnupg2 \
|
||
software-properties-common
|
||
|
||
# 添加Docker官方GPG密钥
|
||
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
|
||
|
||
# 添加Docker仓库
|
||
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||
|
||
# 安装Docker
|
||
apt-get update
|
||
apt-get install -y \
|
||
docker-ce=5:24.0.5-1~debian.12~bookworm \
|
||
docker-ce-cli=5:24.0.5-1~debian.12~bookworm \
|
||
containerd.io \
|
||
docker-buildx-plugin \
|
||
docker-compose-plugin
|
||
}
|
||
|
||
# 创建Docker服务文件
|
||
create_docker_service() {
|
||
log_info "创建Docker服务文件..."
|
||
|
||
# 创建服务目录
|
||
mkdir -p /etc/systemd/system
|
||
|
||
# 创建docker.service文件
|
||
cat > /etc/systemd/system/docker.service << 'EOF'
|
||
[Unit]
|
||
Description=Docker Application Container Engine
|
||
Documentation=https://docs.docker.com
|
||
After=network-online.target firewalld.service containerd.service
|
||
Wants=network-online.target
|
||
Requires=containerd.service
|
||
|
||
[Service]
|
||
Type=notify
|
||
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
|
||
ExecReload=/bin/kill -s HUP $MAINPID
|
||
TimeoutSec=0
|
||
RestartSec=2
|
||
Restart=always
|
||
StartLimitBurst=3
|
||
StartLimitInterval=60s
|
||
LimitNOFILE=infinity
|
||
LimitNPROC=infinity
|
||
LimitCORE=infinity
|
||
TasksMax=infinity
|
||
Delegate=yes
|
||
KillMode=process
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
# 创建containerd服务文件
|
||
cat > /etc/systemd/system/containerd.service << 'EOF'
|
||
[Unit]
|
||
Description=containerd container runtime
|
||
Documentation=https://containerd.io
|
||
After=network.target local-fs.target
|
||
|
||
[Service]
|
||
ExecStartPre=-/sbin/modprobe overlay
|
||
ExecStart=/usr/bin/containerd
|
||
Restart=always
|
||
RestartSec=5
|
||
Delegate=yes
|
||
KillMode=process
|
||
OOMScoreAdjust=-999
|
||
LimitNOFILE=infinity
|
||
LimitNPROC=infinity
|
||
LimitCORE=infinity
|
||
TasksMax=infinity
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
log_info "服务文件创建完成"
|
||
}
|
||
|
||
# 配置和启动服务
|
||
setup_and_start_services() {
|
||
log_info "配置和启动Docker服务..."
|
||
|
||
# 重新加载systemd
|
||
systemctl daemon-reload
|
||
|
||
# 启用并启动containerd
|
||
systemctl enable containerd
|
||
systemctl start containerd
|
||
|
||
# 启用并启动docker
|
||
systemctl enable docker
|
||
systemctl start docker
|
||
|
||
# 等待服务启动
|
||
sleep 5
|
||
|
||
# 检查服务状态
|
||
if systemctl is-active docker &> /dev/null; then
|
||
log_info "✅ Docker服务启动成功!"
|
||
else
|
||
log_error "❌ Docker服务启动失败"
|
||
journalctl -u docker --no-pager -n 20
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# 验证安装
|
||
verify_installation() {
|
||
log_info "验证Docker安装..."
|
||
|
||
# 检查docker命令
|
||
if command -v docker &> /dev/null; then
|
||
log_info "✅ Docker CLI: $(docker --version)"
|
||
else
|
||
log_error "❌ Docker CLI 不可用"
|
||
return 1
|
||
fi
|
||
|
||
# 检查服务状态
|
||
if systemctl is-active docker &> /dev/null; then
|
||
log_info "✅ Docker服务运行正常"
|
||
else
|
||
log_error "❌ Docker服务未运行"
|
||
return 1
|
||
fi
|
||
|
||
# 测试docker info
|
||
if docker info &> /dev/null; then
|
||
log_info "✅ Docker守护进程响应正常"
|
||
else
|
||
log_warn "⚠️ Docker守护进程无响应"
|
||
return 1
|
||
fi
|
||
|
||
log_info "🎉 Docker安装验证完成!"
|
||
}
|
||
|
||
# 安装RustDesk服务器
|
||
install_rustdesk() {
|
||
log_info "开始安装RustDesk服务器..."
|
||
|
||
# 创建数据目录
|
||
mkdir -p /var/lib/rustdesk-server/{hbbs,hbbr}
|
||
|
||
# 拉取镜像
|
||
log_info "拉取RustDesk服务器镜像..."
|
||
docker pull rustdesk/rustdesk-server:latest
|
||
|
||
# 启动hbbs
|
||
log_info "启动RustDesk hbbs服务..."
|
||
docker run -d \
|
||
--name hbbs \
|
||
--restart unless-stopped \
|
||
--network host \
|
||
-v /var/lib/rustdesk-server/hbbs:/root \
|
||
rustdesk/rustdesk-server:latest hbbs
|
||
|
||
# 启动hbbr
|
||
log_info "启动RustDesk hbbr服务..."
|
||
docker run -d \
|
||
--name hbbr \
|
||
--restart unless-stopped \
|
||
--network host \
|
||
-v /var/lib/rustdesk-server/hbbr:/root \
|
||
rustdesk/rustdesk-server:latest hbbr
|
||
|
||
log_info "✅ RustDesk服务器部署完成!"
|
||
|
||
# 显示部署信息
|
||
show_rustdesk_info
|
||
}
|
||
|
||
# 显示RustDesk信息
|
||
show_rustdesk_info() {
|
||
echo ""
|
||
log_info "🎉 RustDesk服务器部署完成!"
|
||
echo "=========================================="
|
||
echo "服务状态:"
|
||
echo " docker ps -a # 查看容器状态"
|
||
echo " systemctl status docker # 查看Docker服务"
|
||
echo ""
|
||
echo "重要信息:"
|
||
echo " 查看密钥: cat /var/lib/rustdesk-server/hbbs/id_ed25519.pub"
|
||
echo " 服务器IP: $(curl -s ifconfig.me || hostname -I | awk '{print $1}')"
|
||
echo ""
|
||
echo "客户端连接时需要:"
|
||
echo " 1. 上面显示的IP地址"
|
||
echo " 2. 上面显示的密钥"
|
||
echo "=========================================="
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
log_info "开始修复Docker服务未找到问题..."
|
||
|
||
check_docker_installation || {
|
||
log_error "Docker未正确安装,退出"
|
||
exit 1
|
||
}
|
||
|
||
if check_service_files; then
|
||
log_info "服务文件存在,尝试启动服务..."
|
||
setup_and_start_services
|
||
else
|
||
log_info "服务文件不存在,重新安装..."
|
||
reinstall_docker_service
|
||
create_docker_service
|
||
setup_and_start_services
|
||
fi
|
||
|
||
verify_installation && {
|
||
log_info "✅ Docker修复成功!"
|
||
echo ""
|
||
read -p "是否现在安装RustDesk服务器?(y/n): " -n 1 -r
|
||
echo
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
install_rustdesk
|
||
else
|
||
log_info "您可以稍后运行此脚本安装RustDesk"
|
||
fi
|
||
} || {
|
||
log_error "❌ Docker修复失败"
|
||
}
|
||
}
|
||
|
||
# 执行主函数
|
||
main "$@"
|