Skip to content

Instantly share code, notes, and snippets.

@meisa233
Created August 11, 2025 02:06
Show Gist options
  • Save meisa233/52eece8794eef08bd6f025d52de0d082 to your computer and use it in GitHub Desktop.
Save meisa233/52eece8794eef08bd6f025d52de0d082 to your computer and use it in GitHub Desktop.
#!/bin/bash

echo "Milvus ARM64 openEuler Standalone部署脚本 - 端口修复版"
echo "========================================================"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 1. 处理防火墙问题
echo -e "${YELLOW}步骤1: 处理防火墙和网络设置${NC}"
if systemctl is-active firewalld >/dev/null 2>&1; then
    echo "检测到firewalld正在运行,添加Docker网络规则..."
    
    firewall-cmd --permanent --zone=trusted --add-interface=docker0 2>/dev/null
    firewall-cmd --permanent --add-port=2379/tcp
    firewall-cmd --permanent --add-port=2380/tcp
    firewall-cmd --permanent --add-port=9000/tcp
    firewall-cmd --permanent --add-port=9001/tcp
    firewall-cmd --permanent --add-port=19530/tcp
    firewall-cmd --permanent --add-port=9091/tcp
    firewall-cmd --permanent --zone=trusted --add-source=172.17.0.0/16
    firewall-cmd --permanent --zone=trusted --add-source=172.18.0.0/16
    firewall-cmd --reload
    
    echo -e "${GREEN}✓ 防火墙规则已添加${NC}"
fi

# 2. 设置内核参数
echo -e "${YELLOW}步骤2: 优化内核网络参数${NC}"
sysctl -w net.bridge.bridge-nf-call-iptables=1 2>/dev/null
sysctl -w net.bridge.bridge-nf-call-ip6tables=1 2>/dev/null
sysctl -w net.ipv4.ip_forward=1
echo -e "${GREEN}✓ 内核参数已设置${NC}"

# 3. 清理旧环境
echo -e "${YELLOW}步骤3: 完全清理旧环境${NC}"
docker stop milvus-standalone milvus-etcd milvus-minio 2>/dev/null
docker rm -f milvus-standalone milvus-etcd milvus-minio 2>/dev/null
docker network rm milvus-net 2>/dev/null

# 完全清理数据目录
sudo rm -rf /var/lib/milvus/*
sudo rm -rf /root/milvus_data/
mkdir -p /var/lib/milvus/{etcd,minio,data}
chmod -R 777 /var/lib/milvus/
echo -e "${GREEN}✓ 环境已完全清理${NC}"

# 4. 创建Docker网络
echo -e "${YELLOW}步骤4: 创建Docker网络${NC}"
docker network create --driver bridge milvus-net
echo -e "${GREEN}✓ 网络已创建${NC}"

# 5. 启动etcd(使用原镜像)
echo -e "${YELLOW}步骤5: 启动etcd${NC}"
docker run -d \
  --name milvus-etcd \
  --network milvus-net \
  --restart unless-stopped \
  -e ALLOW_NONE_AUTHENTICATION=yes \
  -e ETCD_AUTO_COMPACTION_RETENTION=1 \
  -e ETCD_QUOTA_BACKEND_BYTES=4294967296 \
  -e ETCD_SNAPSHOT_COUNT=50000 \
  -p 2379:2379 \
  -p 2380:2380 \
  -v /var/lib/milvus/etcd:/bitnami/etcd \
  docker.m.daocloud.io/bitnami/etcd@sha256:b12f857fe1df25242458b8d271d5d133ff8c2fb88e5b694efdc969e53f975105

# 等待etcd启动
echo "等待etcd启动..."
sleep 10
for i in {1..30}; do
    if docker exec milvus-etcd etcdctl endpoint health 2>/dev/null | grep -q "healthy"; then
        echo -e "${GREEN}✓ etcd启动成功 ($i/30)${NC}"
        break
    fi
    echo "等待etcd... ($i/30)"
    sleep 2
    if [ $i -eq 30 ]; then
        echo -e "${RED}✗ etcd启动失败${NC}"
        docker logs milvus-etcd --tail 30
        exit 1
    fi
done

# 6. 启动MinIO(使用原镜像)
echo -e "${YELLOW}步骤6: 启动MinIO${NC}"
docker run -d \
  --name milvus-minio \
  --network milvus-net \
  --restart unless-stopped \
  -e MINIO_ROOT_USER=minioadmin \
  -e MINIO_ROOT_PASSWORD=minioadmin \
  -e MINIO_DEFAULT_BUCKETS=milvus-bucket \
  -p 9000:9000 \
  -p 9001:9001 \
  -v /var/lib/milvus/minio:/bitnami/minio/data \
  docker.m.daocloud.io/bitnami/minio@sha256:04e32b73a600e3e336b33a2965389ba20433403196dd15e889af8d87fbccb0cb

echo "等待MinIO启动..."
sleep 15
echo -e "${GREEN}✓ MinIO已启动${NC}"

# 7. 创建Docker Compose配置文件(推荐方案)
echo -e "${YELLOW}步骤7: 创建Docker Compose配置文件${NC}"
cat > /tmp/docker-compose.yml << 'EOF'
version: '3.5'

services:
  etcd:
    container_name: milvus-etcd
    image: docker.m.daocloud.io/bitnami/etcd@sha256:b12f857fe1df25242458b8d271d5d133ff8c2fb88e5b694efdc969e53f975105
    environment:
      - ALLOW_NONE_AUTHENTICATION=yes
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_AUTO_COMPACTION_RETENTION=1000
      - ETCD_QUOTA_BACKEND_BYTES=4294967296
      - ETCD_SNAPSHOT_COUNT=50000
    volumes:
      - /var/lib/milvus/etcd:/bitnami/etcd
    ports:
      - "2379:2379"
      - "2380:2380"
    healthcheck:
      test: ["CMD", "etcdctl", "endpoint", "health"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio:
    container_name: milvus-minio
    image: docker.m.daocloud.io/bitnami/minio@sha256:04e32b73a600e3e336b33a2965389ba20433403196dd15e889af8d87fbccb0cb
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
      MINIO_DEFAULT_BUCKETS: milvus-bucket
    ports:
      - "9001:9001"
      - "9000:9000"
    volumes:
      - /var/lib/milvus/minio:/bitnami/minio/data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  standalone:
    container_name: milvus-standalone
    image: docker.m.daocloud.io/milvusdb/milvus:v2.5.16-20250805-51b3d246-arm64
    command: ["milvus", "run", "standalone"]
    security_opt:
      - seccomp:unconfined
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: minio:9000
      MINIO_ACCESS_KEY_ID: minioadmin
      MINIO_SECRET_ACCESS_KEY: minioadmin
    volumes:
      - /var/lib/milvus/data:/var/lib/milvus
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
      interval: 30s
      start_period: 90s
      timeout: 20s
      retries: 3
    ports:
      - "19530:19530"
      - "9091:9091"
    depends_on:
      - "etcd"
      - "minio"

networks:
  default:
    name: milvus
EOF

echo -e "${GREEN}✓ Docker Compose配置已创建${NC}"

# 8. 尝试直接运行Milvus(使用环境变量控制端口)
echo -e "${YELLOW}步骤8: 启动Milvus Standalone${NC}"

# 先停止之前可能运行的容器
docker stop milvus-standalone 2>/dev/null
docker rm milvus-standalone 2>/dev/null

# 使用环境变量明确控制各组件端口,避免冲突
docker run -d \
  --name milvus-standalone \
  --network milvus-net \
  --restart unless-stopped \
  -p 19530:19530 \
  -p 9091:9091 \
  -v /var/lib/milvus/data:/var/lib/milvus \
  -e ETCD_ENDPOINTS=milvus-etcd:2379 \
  -e MINIO_ADDRESS=milvus-minio:9000 \
  -e MINIO_ACCESS_KEY_ID=minioadmin \
  -e MINIO_SECRET_ACCESS_KEY=minioadmin \
  -e MINIO_USE_SSL=false \
  -e MINIO_BUCKET_NAME=milvus-bucket \
  -e COMMON_STORAGETYPE=minio \
  -e ETCD_USE_EMBED=false \
  -e PROXY_PORT=19530 \
  -e QUERYNODE_PORT=21123 \
  -e QUERYCOORD_PORT=19531 \
  -e DATANODE_PORT=21124 \
  -e DATACOORD_PORT=13333 \
  -e INDEXNODE_PORT=21121 \
  -e INDEXCOORD_PORT=31000 \
  -e ROOTCOORD_PORT=53100 \
  docker.m.daocloud.io/milvusdb/milvus:v2.5.16-20250805-51b3d246-arm64 \
  milvus run standalone

# 9. 等待Milvus启动
echo -e "${YELLOW}步骤9: 等待Milvus启动${NC}"
echo "Milvus启动需要1-3分钟,请耐心等待..."
sleep 20

SUCCESS=false
MAX_ATTEMPTS=90

for i in $(seq 1 $MAX_ATTEMPTS); do
    # 检查容器是否在运行
    if ! docker ps | grep -q milvus-standalone; then
        echo -e "${YELLOW}⚠ Milvus容器未运行,可能正在重启...${NC}"
        
        # 检查是否有端口冲突错误
        if docker logs milvus-standalone 2>&1 | grep -q "address already in use"; then
            echo -e "${RED}✗ 检测到端口冲突!${NC}"
            echo ""
            echo "建议使用Docker Compose方式部署:"
            echo "  1. 安装docker-compose: pip install docker-compose"
            echo "  2. 运行: cd /tmp && docker-compose up -d"
            echo ""
            break
        fi
        
        sleep 5
        continue
    fi
    
    # 检查健康端点
    if curl -s -f http://localhost:9091/healthz >/dev/null 2>&1; then
        echo -e "${GREEN}✓ Milvus健康检查通过!${NC}"
        SUCCESS=true
        break
    fi
    
    # 检查是否有proxy启动日志
    if docker logs milvus-standalone 2>&1 | tail -20 | grep -q "proxy.*started"; then
        echo -e "${GREEN}✓ Proxy服务已启动${NC}"
        sleep 5
        SUCCESS=true
        break
    fi
    
    # 显示进度
    if [ $((i % 10)) -eq 0 ]; then
        echo "已等待 $((i*2)) 秒... ($i/$MAX_ATTEMPTS)"
    fi
    
    sleep 2
done

# 10. 最终状态报告
echo ""
echo "========================================================"
echo -e "${YELLOW}部署状态${NC}"
echo "========================================================"

# 容器状态
echo "容器运行状态:"
docker ps --format "table {{.Names}}\t{{.Status}}" | grep -E "(NAME|milvus|etcd|minio)"

echo ""
echo "服务健康状态:"

# etcd健康检查
echo -n "  etcd: "
docker exec milvus-etcd etcdctl endpoint health 2>/dev/null | grep -q "healthy" && \
  echo -e "${GREEN}✅ 健康${NC}" || echo -e "${RED}✗ 异常${NC}"

# MinIO健康检查
echo -n "  MinIO: "
curl -s http://localhost:9000/minio/health/live >/dev/null && \
  echo -e "${GREEN}✅ 健康${NC}" || echo -e "${RED}✗ 异常${NC}"

# Milvus健康检查
echo -n "  Milvus: "
if [ "$SUCCESS" = true ]; then
    echo -e "${GREEN}✅ 运行中${NC}"
else
    echo -e "${RED}✗ 启动失败${NC}"
fi

echo ""
echo "========================================================"

if [ "$SUCCESS" = true ]; then
    echo -e "${GREEN}🎉 Milvus部署成功!${NC}"
    echo ""
    echo "连接信息:"
    echo "  • Milvus gRPC: localhost:19530"
    echo "  • Milvus HTTP: http://localhost:9091"
    echo "  • MinIO控制台: http://localhost:9001"
    echo "  • etcd: http://localhost:2379"
else
    echo -e "${RED}❌ Milvus直接部署失败,请使用Docker Compose方式${NC}"
    echo ""
    echo "使用Docker Compose部署(推荐):"
    echo ""
    echo "  1. 安装docker-compose:"
    echo "     sudo pip install docker-compose"
    echo ""
    echo "  2. 部署Milvus:"
    echo "     cd /tmp"
    echo "     docker-compose up -d"
    echo ""
    echo "  3. 查看日志:"
    echo "     docker-compose logs -f"
    echo ""
    echo "Docker Compose配置文件已保存到: /tmp/docker-compose.yml"
    echo ""
    echo "如果docker-compose也失败,可能的原因:"
    echo "  • ARM64架构兼容性问题"
    echo "  • openEuler系统特殊配置"
    echo "  • 考虑使用Milvus Lite或其他部署方式"
fi

echo ""
echo "故障排查命令:"
echo "  • 查看错误: docker logs milvus-standalone 2>&1 | grep -E '(ERROR|panic)'"
echo "  • 查看端口: netstat -tlnp | grep -E '(19530|9091)'"
echo "  • 清理重试: docker rm -f milvus-standalone milvus-minio milvus-etcd"
echo "========================================================"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment