# MongoDB 副本集

[English](./README.md) | [中文](./README.zh.md)

此服务用于搭建一个包含三个成员的 MongoDB 副本集。

## 前提条件

1. 为副本集生成一个密钥文件：

   ```bash
   mkdir -p ./secrets
   openssl rand -base64 756 > ./secrets/rs0.key
   ```

## 初始化

1. 启动服务：

   ```bash
   docker compose up -d
   ```

   这些服务将通过 `mongo-init` init 容器自动初始化副本集。该容器会：
   - 等待所有 MongoDB 节点就绪
   - 连接到主节点
   - 使用容器名初始化副本集
   - 通过容器网络进行通信

2. 验证副本集状态：

   ```bash
   docker exec -it mongodb-replicaset-mongo1-1 mongosh -u root -p password --authenticationDatabase admin --eval "rs.status()"
   ```

## 服务

- `mongo1`: 副本集的第一个成员。
- `mongo2`: 副本集的第二个成员。
- `mongo3`: 副本集的第三个成员。

## 配置

- `TZ`: 容器的时区，默认为 `UTC`。
- `MONGO_VERSION`: MongoDB 镜像的版本，默认为 `8.2.3`。
- `MONGO_INITDB_ROOT_USERNAME`: 数据库的 root 用户名，默认为 `root`。
- `MONGO_INITDB_ROOT_PASSWORD`: 数据库的 root 密码，默认为 `password`。
- `MONGO_INITDB_DATABASE`: 要创建的初始数据库，默认为 `admin`。
- `MONGO_REPLICA_SET_NAME`: 副本集的名称，默认为 `rs0`。
- `MONGO_PORT_OVERRIDE_1`: 第一个成员的主机端口，默认为 `27017`。
- `MONGO_PORT_OVERRIDE_2`: 第二个成员的主机端口，默认为 `27018`。
- `MONGO_PORT_OVERRIDE_3`: 第三个成员的主机端口，默认为 `27019`。

## 卷

- `secrets/rs0.key`: 用于副本集成员之间认证的密钥文件。

## 安全性

副本集密钥文件以只读方式挂载，并在容器内复制到 `/tmp` 目录，设置适当的权限（400）。这种方法确保了跨平台兼容性（Windows/Linux/macOS），同时满足安全要求。主机系统上的密钥文件永远不会被修改。
