199 lines
5.2 KiB
Bash
199 lines
5.2 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_status() {
|
||
log_info "检查Docker服务状态..."
|
||
systemctl status docker --no-pager -l
|
||
}
|
||
|
||
# 修复Docker服务
|
||
fix_docker_service() {
|
||
log_info "修复Docker服务..."
|
||
|
||
# 停止服务
|
||
systemctl stop docker 2>/dev/null || true
|
||
systemctl stop containerd 2>/dev/null || true
|
||
|
||
# 清理可能的问题
|
||
pkill -f docker 2>/dev/null || true
|
||
pkill -f containerd 2>/dev/null || true
|
||
|
||
# 重新配置containerd
|
||
log_info "重新配置containerd..."
|
||
containerd config default > /etc/containerd/config.toml 2>/dev/null || true
|
||
systemctl enable containerd
|
||
systemctl start containerd
|
||
|
||
# 重启Docker服务
|
||
log_info "重启Docker服务..."
|
||
systemctl enable docker
|
||
systemctl daemon-reload
|
||
systemctl start docker
|
||
|
||
# 等待服务启动
|
||
sleep 3
|
||
}
|
||
|
||
# 检查服务日志
|
||
check_docker_logs() {
|
||
log_info "检查Docker服务日志..."
|
||
journalctl -u docker --no-pager -n 20
|
||
}
|
||
|
||
# 修复权限和配置
|
||
fix_permissions() {
|
||
log_info "修复Docker相关权限..."
|
||
|
||
# 创建必要的目录
|
||
mkdir -p /etc/docker
|
||
mkdir -p /var/lib/docker
|
||
mkdir -p /run/docker
|
||
|
||
# 配置docker daemon(简化配置)
|
||
cat > /etc/docker/daemon.json << 'EOF'
|
||
{
|
||
"log-driver": "json-file",
|
||
"log-opts": {
|
||
"max-size": "50m",
|
||
"max-file": "3"
|
||
},
|
||
"storage-driver": "overlay2"
|
||
}
|
||
EOF
|
||
|
||
# 修复权限
|
||
chmod 755 /etc/docker
|
||
chmod 644 /etc/docker/daemon.json
|
||
}
|
||
|
||
# 验证修复
|
||
verify_fix() {
|
||
log_info "验证Docker修复..."
|
||
|
||
if systemctl is-active docker &> /dev/null; then
|
||
log_info "✅ Docker服务现在运行正常!"
|
||
|
||
# 测试基本命令
|
||
log_info "测试Docker命令..."
|
||
docker --version
|
||
docker info --format "{{.ServerVersion}}" && {
|
||
log_info "✅ Docker服务响应正常!"
|
||
} || {
|
||
log_warn "⚠️ Docker服务运行但info命令失败"
|
||
}
|
||
|
||
# 尝试运行测试容器(不拉取镜像,只测试本地)
|
||
log_info "测试Docker基本功能..."
|
||
if docker images -q &> /dev/null; then
|
||
log_info "✅ Docker镜像列表查询成功!"
|
||
else
|
||
log_warn "⚠️ Docker镜像列表查询失败"
|
||
fi
|
||
|
||
else
|
||
log_error "❌ Docker服务仍然未运行"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# 安装RustDesk服务器
|
||
install_rustdesk() {
|
||
log_info "开始安装RustDesk服务器..."
|
||
|
||
if ! systemctl is-active docker &> /dev/null; then
|
||
log_error "Docker服务未运行,无法安装RustDesk"
|
||
return 1
|
||
fi
|
||
|
||
# 创建RustDesk数据目录
|
||
mkdir -p /var/lib/rustdesk-server/{hbbs,hbbr}
|
||
|
||
# 拉取RustDesk服务器镜像
|
||
log_info "拉取RustDesk服务器镜像..."
|
||
docker pull rustdesk/rustdesk-server:latest
|
||
|
||
# 运行hbbs (ID服务器)
|
||
log_info "启动RustDesk hbbs服务..."
|
||
docker run -d \
|
||
--name hbbs \
|
||
--network host \
|
||
-v /var/lib/rustdesk-server/hbbs:/root \
|
||
rustdesk/rustdesk-server:latest hbbs
|
||
|
||
# 运行hbbr (中继服务器)
|
||
log_info "启动RustDesk hbbr服务..."
|
||
docker run -d \
|
||
--name hbbr \
|
||
--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 " docker logs hbbs # 查看hbbs日志"
|
||
echo " docker logs hbbr # 查看hbbr日志"
|
||
echo ""
|
||
echo "重要信息:"
|
||
echo " hbbs容器会生成密钥文件在: /var/lib/rustdesk-server/hbbs"
|
||
echo " 查看密钥: cat /var/lib/rustdesk-server/hbbs/id_ed25519.pub"
|
||
echo ""
|
||
echo "客户端连接时需要:"
|
||
echo " 1. 服务器IP地址"
|
||
echo " 2. 上面显示的密钥"
|
||
echo "=========================================="
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
log_info "开始修复Docker服务..."
|
||
|
||
check_docker_status
|
||
fix_permissions
|
||
fix_docker_service
|
||
check_docker_logs
|
||
verify_fix
|
||
|
||
if systemctl is-active docker &> /dev/null; then
|
||
log_info "✅ Docker服务修复成功!"
|
||
echo ""
|
||
read -p "是否现在安装RustDesk服务器?(y/n): " -n 1 -r
|
||
echo
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
install_rustdesk
|
||
else
|
||
log_info "您可以稍后手动安装RustDesk"
|
||
fi
|
||
else
|
||
log_error "❌ Docker服务修复失败,请检查日志"
|
||
fi
|
||
}
|
||
|
||
# 执行主函数
|
||
main "$@"
|