diff --git a/README.md b/README.md index 4f2190e..0d3311a 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,8 @@ vim .env.deploy-test > **pc(Electron)依赖安装**:在跑 `06-install-frontend.sh` 前,裸机请先执行 **`00-init-tools.sh`**(见上文「步骤 0」,含 GitHub SSH→HTTPS 重写)。仍报错见下文「pc 前端 yarn install 失败」。`pc` 建议仅用 **Yarn**;可删除 `package-lock.json` 消除混用锁文件警告。 +> **`07-start-frontend.sh`**:启动前会读取 `.env.deploy-test`(若存在),文末「访问地址」等处使用 `DEPLOY_TEST_IP`;未设置时默认为 `127.0.0.1`,避免脚本在 `set -u` 下因未定义变量退出。 + --- ## 配置文件(`.env.deploy-test`) @@ -182,9 +184,11 @@ TENCENT_SDK_SECRET_KEY=xxx ### 后端服务 -| 服务 | 端口 | -|------|------| -| openim-server | :10002 (HTTP) / :10001 (WS) | +| 服务 | 端口 / 说明 | +|------|-------------| +| openim-server | :10002(HTTP API)、:10001(MsgGateway WebSocket)— **同一进程上两个监听端口**,不是两个独立后端 | +| chat-rpc | 对内 RPC(注册到 Etcd,无单独对外 HTTP 端口) | +| admin-rpc | 同上 | | chat-api | :10008 | | admin-api | :10009 | | meetingmsg | :8000 (WS) | @@ -192,6 +196,21 @@ TENCENT_SDK_SECRET_KEY=xxx | livestream | :8081 | | build-server | :8281 | +> **进程数量**:`05-start.sh` 会拉起 **9 个独立操作系统进程**(上表 9 行)。其中 `openim-server` 是 **一个** OpenIM 单二进制,内部包含用户/群组/消息等 RPC 与 API、网关等模块;官方文档或 K8s 部署里常把其中一部分拆成多个 Pod,看起来像「十几个服务」,在本仓库的**单机单进程**模式下合并进同一个 `openim-server`,因此只看到 **1 个 PID**、**2 个对客户端暴露的端口**(10002 + 10001)。 + +### 架构说明:`openim-server` 内部 RPC 与 `chat` 四进程 + +#### `openim-server`:单进程里模块之间怎么调 RPC? + +- 单二进制在 `main` 里依次启动多个子模块(如 auth、user、group、msg、API、MsgGateway 等)。模块之间**仍然是 gRPC**:各模块在本机 **TCP** 上起 gRPC Server(端口可在配置里固定或由 `autoSetPorts` 分配),客户端通过 **`GetConn(服务名)`** 去连。 +- 服务发现使用 **`discovery/standalone`**(`config.SetStandalone()`):在**当前进程内**维护「服务名 → 地址」的注册表,**不经过**本机 Docker 里的 **Etcd**。部署里的 **Etcd** 主要给 **chat** 与其它独立进程做发现;与 `openim-server` **内部** RPC 是两套机制。 + +#### `chat` 为何是 `chat-rpc` / `admin-rpc` / `chat-api` / `admin-api` 四个进程? + +- **源码即四个独立 `main` 包**(`chat/cmd/rpc/...`、`chat/cmd/api/...`),与上游 OpenIM Chat 一致,编译为四个二进制,由 `04-build.sh` / `05-start.sh` 分别拉起。 +- **职责拆分**:**RPC**(给其它服务 gRPC 调用)与 **HTTP API**(对外 REST)分开;**业务侧(chat)** 与 **管理侧(admin)** 分开,便于鉴权、独立重启、按负载分别扩容,生产环境也可分机器部署。 +- **能否合并成一个进程(像 `openim-server` 那样)?** **理论上可以**:新增统一入口、在同一进程内启动四套逻辑并处理端口与 Etcd 注册即可。但本仓库 **当前未提供**该单进程模式,需要额外开发与测试;**默认与推荐**仍是 **4 进程** 部署。 + ### 前端开发服务器(可选) | 项目 | 端口 | 说明 | @@ -316,12 +335,27 @@ TENCENT_SDK_SECRET_KEY=xxx cd pc && rm -rf node_modules && yarn install ``` +### `check-conn.sh`(MongoDB / S3) + +按 `.env.deploy-test` 检查远程 MongoDB 与两个 S3 Bucket。 + +| 项目 | 说明 | +|------|------| +| **完整校验** | 安装 **mongosh** 可测认证与库访问;安装 **AWS CLI**(命令 `aws`)可列桶与读写探测。 | +| **未安装工具时** | MongoDB 可用 **nc** 仅测端口连通;S3 会跳过并打印手动验证命令。 | +| **安装提示** | 脚本按系统给出命令(macOS 为 `brew`;Debian/Ubuntu 为 `apt-get`;Amazon/RHEL 为 `dnf`/`yum`),不会在 Linux 上误导为 `brew`。 | +| **可选自动安装** | 以 **root** 执行且设置 `CHECK_CONN_AUTO_INSTALL=1` 时,会尝试用 `apt`/`dnf`/`yum` 安装缺失的 `awscli`、`mongodb-mongosh`;失败仅告警,可按屏幕提示手动安装。 | + +```bash +./deploy-test/check-conn.sh +CHECK_CONN_AUTO_INSTALL=1 ./deploy-test/check-conn.sh # root,可选自动安装 CLI +./deploy-test/check-conn.sh mongo +./deploy-test/check-conn.sh s3 +``` + ### 其他 ```bash -# 验证 MongoDB / S3 连接 -./deploy-test/check-conn.sh - # 查看 LiveKit 日志(WebRTC 不通时) ./deploy-test/logs.sh livekit --last diff --git a/check-conn.sh b/check-conn.sh index 653040e..b00c2d1 100755 --- a/check-conn.sh +++ b/check-conn.sh @@ -6,6 +6,9 @@ # ./check-conn.sh # 同时检查 MongoDB 和 S3 # ./check-conn.sh mongo # 只检查 MongoDB # ./check-conn.sh s3 # 只检查 S3 +# +# 环境: +# CHECK_CONN_AUTO_INSTALL=1 以 root 运行时尝试用 apt/dnf/yum 安装 awscli、mongosh(可选) # ============================================================================= set -euo pipefail source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" @@ -14,12 +17,90 @@ init_script_log # ← 脚本执行日志 TARGET="${1:-all}" +# ── 按系统给出安装提示(避免在 Linux 服务器上误导为 brew)────────────────────── +_hint_install_mongosh() { + if [[ "$(uname -s)" == "Darwin" ]]; then + echo "brew install mongosh" + elif command -v apt-get &>/dev/null; then + echo "sudo apt-get update && sudo apt-get install -y mongodb-mongosh" + elif command -v dnf &>/dev/null; then + echo "sudo dnf install -y mongodb-mongosh" + else + echo "https://www.mongodb.com/docs/mongodb-shell/install/" + fi +} + +_hint_install_awscli() { + if [[ "$(uname -s)" == "Darwin" ]]; then + echo "brew install awscli" + elif command -v apt-get &>/dev/null; then + echo "sudo apt-get update && sudo apt-get install -y awscli" + elif command -v dnf &>/dev/null; then + echo "sudo dnf install -y aws-cli" + elif command -v yum &>/dev/null; then + echo "sudo yum install -y aws-cli" + else + echo "https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html" + fi +} + +# root + CHECK_CONN_AUTO_INSTALL=1 时尝试安装(失败则仅告警,不退出) +_try_install_mongosh() { + [[ "${CHECK_CONN_AUTO_INSTALL:-0}" == "1" ]] || return 0 + command -v mongosh &>/dev/null && return 0 + [[ "$(id -u)" -eq 0 ]] || { + info "CHECK_CONN_AUTO_INSTALL=1 但非 root,跳过 mongosh 自动安装" + return 0 + } + info "CHECK_CONN_AUTO_INSTALL:尝试安装 mongosh ..." + if command -v apt-get &>/dev/null; then + if DEBIAN_FRONTEND=noninteractive apt-get update -qq \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y mongodb-mongosh; then + command -v mongosh &>/dev/null && success "mongosh 已可用" && return 0 + fi + elif command -v dnf &>/dev/null; then + if dnf install -y mongodb-mongosh; then + command -v mongosh &>/dev/null && success "mongosh 已可用" && return 0 + fi + fi + warn "mongosh 自动安装未成功,请手动: $(_hint_install_mongosh)" + return 0 +} + +_try_install_awscli() { + [[ "${CHECK_CONN_AUTO_INSTALL:-0}" == "1" ]] || return 0 + command -v aws &>/dev/null && return 0 + [[ "$(id -u)" -eq 0 ]] || { + info "CHECK_CONN_AUTO_INSTALL=1 但非 root,跳过 awscli 自动安装" + return 0 + } + info "CHECK_CONN_AUTO_INSTALL:尝试安装 awscli ..." + if command -v apt-get &>/dev/null; then + if DEBIAN_FRONTEND=noninteractive apt-get update -qq \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y awscli; then + command -v aws &>/dev/null && success "awscli 已可用" && return 0 + fi + elif command -v dnf &>/dev/null; then + if dnf install -y aws-cli; then + command -v aws &>/dev/null && success "awscli 已可用" && return 0 + fi + elif command -v yum &>/dev/null; then + if yum install -y aws-cli; then + command -v aws &>/dev/null && success "awscli 已可用" && return 0 + fi + fi + warn "awscli 自动安装未成功,请手动: $(_hint_install_awscli)" + return 0 +} + header "远程服务连接检查" # ────────────────────────────────────────────────────────────────────────────── # MongoDB # ────────────────────────────────────────────────────────────────────────────── check_mongo() { + _try_install_mongosh + step "MongoDB: ${MONGO_HOST}:${MONGO_PORT}/${MONGO_DATABASE}" echo -e " Host: ${MONGO_HOST}" @@ -52,7 +133,7 @@ check_mongo() { info "mongosh 未安装,使用 nc 检查端口..." if nc -z -w5 "${MONGO_HOST}" "${MONGO_PORT}" 2>/dev/null; then success "MongoDB 端口 ${MONGO_HOST}:${MONGO_PORT} 可达 ✓" - warn "(未验证认证,安装 mongosh 可做完整测试)" + warn "(未验证认证,安装 mongosh 可做完整测试: $(_hint_install_mongosh))" else error "MongoDB 端口不可达: ${MONGO_HOST}:${MONGO_PORT}" fi @@ -73,7 +154,7 @@ except Exception as e: PYEOF [[ $? -eq 0 ]] && success "MongoDB 连接正常" || error "MongoDB 连接失败" else - warn "跳过 MongoDB 连接验证(请安装 mongosh: brew install mongosh)" + warn "跳过 MongoDB 连接验证(请安装 mongosh: $(_hint_install_mongosh))" echo -e " 手动验证: mongosh \"${MONGO_URI}\"" fi } @@ -138,12 +219,14 @@ _check_s3_bucket() { warn "S3 写入测试失败(Bucket 可读但可能无写权限)" fi else - warn "awscli 未安装,跳过验证(brew install awscli)" + warn "awscli 未安装,跳过验证($(_hint_install_awscli))" echo " 手动验证: AWS_ACCESS_KEY_ID=${key_id} aws s3 ls s3://${bucket}" fi } check_s3() { + _try_install_awscli + step "S3 (open-im-server) — IM 文件存储" _check_s3_bucket \ "openim" \