#!/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 "========================================================"
Created
August 11, 2025 02:06
-
-
Save meisa233/52eece8794eef08bd6f025d52de0d082 to your computer and use it in GitHub Desktop.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment