#!/usr/bin/env bash # OpenIM + LiveKit 内网测试环境一键部署 # 用法: ./scripts/deploy.sh [服务器内网IP] (不传则自动探测) set -euo pipefail cd "$(dirname "$0")/.." # 1. 首次运行从模板生成 .env if [ ! -f .env ]; then cp .env.example .env echo "已从 .env.example 生成 .env" fi # 2. 确定服务器内网 IP IP="${1:-}" if [ -z "$IP" ]; then IP=$(hostname -I 2>/dev/null | awk '{print $1}') fi if [ -z "$IP" ]; then echo "无法自动获取内网 IP,请手动传入: ./scripts/deploy.sh <服务器IP>" exit 1 fi echo "使用服务器 IP: $IP" # 3. 把 IP 写进 .env(MinIO 外链地址必须是客户端能访问的地址) sed -i "s|^SERVER_IP=.*|SERVER_IP=${IP}|" .env sed -i "s|^MINIO_EXTERNAL_ADDRESS=.*|MINIO_EXTERNAL_ADDRESS=\"http://${IP}:10005\"|" .env sed -i "s|^GRAFANA_URL=.*|GRAFANA_URL=\"http://${IP}:13000/\"|" .env # 4. 预创建挂载目录(避免 docker 把文件路径自动建成目录) mkdir -p components/redis/config components/mnt/data components/mongodb components/etcd components/kafka touch components/redis/config/redis.conf # 5. 拉镜像并启动 docker compose pull docker compose up -d # 6. 等待 openim-server 健康(首次启动约 30-60 秒) echo "等待 openim-server 就绪(最长约 2 分钟)..." status="unknown" for _ in $(seq 1 24); do status=$(docker inspect -f '{{.State.Health.Status}}' openim-server 2>/dev/null || echo "unknown") [ "$status" = "healthy" ] && break sleep 5 done docker compose ps echo if [ "$status" = "healthy" ]; then echo "部署完成。下一步运行自测: ./scripts/selftest.sh ${IP}" else echo "openim-server 尚未 healthy(当前: ${status})。可执行 docker compose logs -f openim-server 查看日志。" fi