- Changed docker-compose.yml to mount OrbStack Docker socket path (/Users/brunogao/.orbstack/run/docker.sock) - Updated GITEA_INSTANCE_URL to use 192.168.1.83:33000 instead of gitea:3000 for proper DNS resolution - Both runner-docker and runner-k8s now correctly point to OrbStack Docker daemon - This resolves the 'Cannot connect to the Docker daemon' error and DNS resolution failures
326 lines
9.8 KiB
Bash
Executable File
326 lines
9.8 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Docker和GitHub连接验证脚本
|
||
# 用于测试是否能通过WireGuard正常访问Docker Hub和GitHub
|
||
|
||
set -e
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m'
|
||
|
||
print_status() {
|
||
echo -e "${BLUE}[INFO]${NC} $1"
|
||
}
|
||
|
||
print_success() {
|
||
echo -e "${GREEN}[✓]${NC} $1"
|
||
}
|
||
|
||
print_error() {
|
||
echo -e "${RED}[✗]${NC} $1"
|
||
}
|
||
|
||
print_warning() {
|
||
echo -e "${YELLOW}[!]${NC} $1"
|
||
}
|
||
|
||
# 测试计数器
|
||
PASSED=0
|
||
FAILED=0
|
||
WARNING=0
|
||
|
||
# 检查WireGuard状态
|
||
check_wg_status() {
|
||
echo "=================================================="
|
||
print_status "1. 检查WireGuard隧道状态"
|
||
echo "=================================================="
|
||
|
||
if sudo wg show wg0 &>/dev/null; then
|
||
print_success "WireGuard接口wg0正在运行"
|
||
|
||
# 显示详细信息
|
||
WG_INFO=$(sudo wg show wg0)
|
||
echo "$WG_INFO" | grep -E "interface|peer|endpoint|latest handshake|transfer" | while read line; do
|
||
print_status " $line"
|
||
done
|
||
|
||
((PASSED++))
|
||
echo ""
|
||
return 0
|
||
else
|
||
print_error "WireGuard接口wg0未运行"
|
||
print_warning "请先运行: ./setup_wireguard.sh"
|
||
((FAILED++))
|
||
echo ""
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# 检查路由表
|
||
check_routes() {
|
||
echo "=================================================="
|
||
print_status "2. 检查网络路由"
|
||
echo "=================================================="
|
||
|
||
# 检查默认路由
|
||
DEFAULT_ROUTE=$(netstat -rn | grep "^default" | head -1)
|
||
print_status "默认路由: $DEFAULT_ROUTE"
|
||
|
||
# 检查WireGuard路由
|
||
WG_ROUTES=$(netstat -rn | grep wg0 | head -5)
|
||
if [ -n "$WG_ROUTES" ]; then
|
||
print_success "WireGuard路由已配置"
|
||
echo "$WG_ROUTES" | while read line; do
|
||
print_status " $line"
|
||
done
|
||
((PASSED++))
|
||
else
|
||
print_warning "未找到WireGuard路由"
|
||
((WARNING++))
|
||
fi
|
||
echo ""
|
||
}
|
||
|
||
# 检查DNS解析
|
||
check_dns() {
|
||
echo "=================================================="
|
||
print_status "3. 检查DNS解析"
|
||
echo "=================================================="
|
||
|
||
# 检查GitHub解析
|
||
print_status "解析 github.com..."
|
||
GITHUB_IP=$(dig +short github.com @223.5.5.5 | head -1)
|
||
if [ -n "$GITHUB_IP" ]; then
|
||
print_success "GitHub DNS解析成功: $GITHUB_IP"
|
||
((PASSED++))
|
||
else
|
||
print_error "GitHub DNS解析失败"
|
||
((FAILED++))
|
||
fi
|
||
|
||
# 检查Docker Hub解析
|
||
print_status "解析 registry-1.docker.io..."
|
||
DOCKER_IP=$(dig +short registry-1.docker.io @223.5.5.5 | head -1)
|
||
if [ -n "$DOCKER_IP" ]; then
|
||
print_success "Docker Hub DNS解析成功: $DOCKER_IP"
|
||
((PASSED++))
|
||
else
|
||
print_error "Docker Hub DNS解析失败"
|
||
((FAILED++))
|
||
fi
|
||
echo ""
|
||
}
|
||
|
||
# 测试GitHub连接
|
||
test_github_connectivity() {
|
||
echo "=================================================="
|
||
print_status "4. 测试GitHub连接"
|
||
echo "=================================================="
|
||
|
||
# 测试HTTPS连接
|
||
print_status "测试GitHub HTTPS (github.com)..."
|
||
if curl -I -s --connect-timeout 10 --max-time 15 https://github.com 2>&1 | head -1 | grep -q "200\|301\|302"; then
|
||
print_success "GitHub HTTPS连接正常"
|
||
((PASSED++))
|
||
else
|
||
print_error "GitHub HTTPS连接失败"
|
||
((FAILED++))
|
||
fi
|
||
|
||
# 测试API连接
|
||
print_status "测试GitHub API (api.github.com)..."
|
||
API_RESPONSE=$(curl -s --connect-timeout 10 --max-time 15 https://api.github.com/zen 2>/dev/null || echo "failed")
|
||
if [ "$API_RESPONSE" != "failed" ] && [ -n "$API_RESPONSE" ]; then
|
||
print_success "GitHub API连接正常: $API_RESPONSE"
|
||
((PASSED++))
|
||
else
|
||
print_error "GitHub API连接失败"
|
||
((FAILED++))
|
||
fi
|
||
|
||
# 测试SSH连接
|
||
print_status "测试GitHub SSH (git@github.com)..."
|
||
SSH_TEST=$(timeout 10 ssh -T -o StrictHostKeyChecking=no -o ConnectTimeout=10 git@github.com 2>&1 || true)
|
||
if echo "$SSH_TEST" | grep -q "successfully authenticated"; then
|
||
print_success "GitHub SSH认证成功"
|
||
((PASSED++))
|
||
elif echo "$SSH_TEST" | grep -q "Permission denied"; then
|
||
print_warning "GitHub SSH连接成功但未配置密钥(正常)"
|
||
((WARNING++))
|
||
else
|
||
print_warning "GitHub SSH连接测试失败(如无SSH密钥则正常)"
|
||
((WARNING++))
|
||
fi
|
||
|
||
# 测试Git克隆速度
|
||
print_status "测试Git克隆速度..."
|
||
TMP_DIR="/tmp/git_speed_test_$$"
|
||
START_TIME=$(date +%s)
|
||
|
||
if timeout 60 git clone --depth 1 https://github.com/github/gitignore.git "$TMP_DIR" &>/dev/null; then
|
||
END_TIME=$(date +%s)
|
||
DURATION=$((END_TIME - START_TIME))
|
||
print_success "Git克隆成功,耗时: ${DURATION}秒"
|
||
rm -rf "$TMP_DIR"
|
||
((PASSED++))
|
||
else
|
||
print_error "Git克隆失败或超时"
|
||
rm -rf "$TMP_DIR" 2>/dev/null || true
|
||
((FAILED++))
|
||
fi
|
||
echo ""
|
||
}
|
||
|
||
# 测试Docker连接
|
||
test_docker_connectivity() {
|
||
echo "=================================================="
|
||
print_status "5. 测试Docker连接"
|
||
echo "=================================================="
|
||
|
||
if ! command -v docker &>/dev/null; then
|
||
print_warning "Docker未安装,跳过Docker测试"
|
||
((WARNING++))
|
||
echo ""
|
||
return 0
|
||
fi
|
||
|
||
# 检查Docker运行状态
|
||
print_status "检查Docker守护进程..."
|
||
if docker info &>/dev/null; then
|
||
print_success "Docker守护进程运行正常"
|
||
((PASSED++))
|
||
else
|
||
print_error "Docker守护进程未运行"
|
||
print_warning "请启动Docker Desktop"
|
||
((FAILED++))
|
||
echo ""
|
||
return 1
|
||
fi
|
||
|
||
# 测试Docker Hub连接
|
||
print_status "测试Docker Hub连接 (拉取alpine镜像)..."
|
||
START_TIME=$(date +%s)
|
||
|
||
if timeout 120 docker pull alpine:latest 2>&1 | grep -q "Downloaded\|Image is up to date\|Status: Downloaded newer image"; then
|
||
END_TIME=$(date +%s)
|
||
DURATION=$((END_TIME - START_TIME))
|
||
print_success "Docker Hub连接正常,耗时: ${DURATION}秒"
|
||
((PASSED++))
|
||
|
||
# 清理测试镜像
|
||
docker rmi alpine:latest &>/dev/null || true
|
||
else
|
||
print_error "Docker Hub连接失败或超时"
|
||
((FAILED++))
|
||
fi
|
||
|
||
# 测试其他镜像仓库
|
||
print_status "测试其他镜像仓库 (hello-world)..."
|
||
if timeout 60 docker pull hello-world:latest &>/dev/null; then
|
||
print_success "镜像仓库连接正常"
|
||
docker rmi hello-world:latest &>/dev/null || true
|
||
((PASSED++))
|
||
else
|
||
print_warning "镜像仓库连接较慢或失败"
|
||
((WARNING++))
|
||
fi
|
||
echo ""
|
||
}
|
||
|
||
# 测试出口IP
|
||
test_exit_ip() {
|
||
echo "=================================================="
|
||
print_status "6. 检查出口IP地址"
|
||
echo "=================================================="
|
||
|
||
print_status "检测当前出口IP (IPv4)..."
|
||
EXIT_IP=$(curl -s --max-time 10 https://api.ipify.org 2>/dev/null || echo "检测失败")
|
||
if [ "$EXIT_IP" != "检测失败" ]; then
|
||
print_success "出口IP (IPv4): $EXIT_IP"
|
||
((PASSED++))
|
||
else
|
||
print_error "无法检测出口IP"
|
||
((FAILED++))
|
||
fi
|
||
|
||
print_status "检测当前出口IP (IPv6)..."
|
||
EXIT_IP_V6=$(curl -s --max-time 10 https://api64.ipify.org 2>/dev/null || echo "检测失败")
|
||
if [ "$EXIT_IP_V6" != "检测失败" ]; then
|
||
print_success "出口IP (IPv6): $EXIT_IP_V6"
|
||
((PASSED++))
|
||
else
|
||
print_warning "无法检测IPv6出口IP(可能未启用IPv6)"
|
||
((WARNING++))
|
||
fi
|
||
|
||
# 检测位置
|
||
print_status "检测IP地理位置..."
|
||
LOCATION=$(curl -s --max-time 10 "https://ipapi.co/$EXIT_IP/json/" 2>/dev/null | grep -o '"country_name":"[^"]*' | cut -d'"' -f4 || echo "未知")
|
||
if [ "$LOCATION" != "未知" ] && [ -n "$LOCATION" ]; then
|
||
print_success "位置: $LOCATION"
|
||
else
|
||
print_status "位置: 未知"
|
||
fi
|
||
echo ""
|
||
}
|
||
|
||
# 生成报告
|
||
generate_report() {
|
||
echo "=================================================="
|
||
echo " 测试结果汇总"
|
||
echo "=================================================="
|
||
echo ""
|
||
print_success "通过测试: $PASSED"
|
||
print_warning "警告项目: $WARNING"
|
||
print_error "失败测试: $FAILED"
|
||
echo ""
|
||
|
||
TOTAL=$((PASSED + FAILED + WARNING))
|
||
if [ $TOTAL -gt 0 ]; then
|
||
SUCCESS_RATE=$((PASSED * 100 / TOTAL))
|
||
print_status "成功率: ${SUCCESS_RATE}%"
|
||
fi
|
||
echo ""
|
||
|
||
if [ $FAILED -eq 0 ]; then
|
||
print_success "所有关键测试通过!Docker和GitHub可以通过WireGuard正常访问。"
|
||
echo ""
|
||
print_status "建议:"
|
||
echo " - 定期运行此脚本检查连接状态"
|
||
echo " - 如遇到问题,可运行 ./check-tunnel.sh 进行详细诊断"
|
||
else
|
||
print_error "部分测试失败,请检查配置。"
|
||
echo ""
|
||
print_status "故障排查步骤:"
|
||
echo " 1. 确保WireGuard运行: sudo wg show wg0"
|
||
echo " 2. 检查路由配置: netstat -rn | grep wg0"
|
||
echo " 3. 重启WireGuard: ./stop_wireguard.sh && ./setup_wireguard.sh"
|
||
echo " 4. 如果是Docker问题,重启Docker Desktop"
|
||
echo " 5. 运行完整诊断: ./check-tunnel.sh"
|
||
fi
|
||
echo ""
|
||
echo "=================================================="
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
echo ""
|
||
echo "=================================================="
|
||
echo " Docker和GitHub WireGuard连接验证"
|
||
echo "=================================================="
|
||
echo ""
|
||
|
||
check_wg_status || exit 1
|
||
check_routes
|
||
check_dns
|
||
test_exit_ip
|
||
test_github_connectivity
|
||
test_docker_connectivity
|
||
generate_report
|
||
}
|
||
|
||
main "$@" |