1️⃣ Estructura de archivos vps1/ ├─ docker-compose.yml └─ init-mongo.js Lo mismo para VPS2 y VPS3 (cambiando las IPs de bind_ip según corresponda). 2️⃣ Contenido de init-mongo.js // init-mongo.js // Crear usuario con todos los permisos sobre 'mibase' db = db.getSiblingDB('mibase'); db.createUser({ user: "miusuario", pwd: "mipassword", roles: [{ role: "dbOwner", db: "mibase" }] }); // Inicializar el replica set (solo se ejecuta en el contenedor que será primario) rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "192.168.1.101:27017" }, // primario { _id: 1, host: "192.168.1.102:27017" }, // secundario { _id: 2, host: "192.168.1.103:27017" } // secundario ] }); Nota: Aunque este script se monte en todos los contenedores, MongoDB ignora la reejecución del usuario si ya existe, y rs.initiate() solo tiene efecto la primera vez que se ejecuta en el primario. 3️⃣ Docker Compose para VPS1 version: "3.9" services: mongodb: image: mongo:7 container_name: mongodb environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: rootpassword command: > mongod --replSet rs0 --bind_ip 192.168.1.101,192.168.1.102,192.168.1.103,192.168.1.200 --auth ports: - "27017:27017" volumes: - mongo_data:/data/db - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro restart: unless-stopped volumes: mongo_data: VPS2 y VPS3: solo cambian la IP de bind_ip según la IP de cada VPS. VPS2 → 192.168.1.102,192.168.1.101,192.168.1.103,192.168.1.200 VPS3 → 192.168.1.103,192.168.1.101,192.168.1.102,192.168.1.200 4️⃣ Conexión desde tu backend mongodb://miusuario:mipassword@192.168.1.101:27017,192.168.1.102:27017,192.168.1.103:27017/mibase?replicaSet=rs0 El driver (o Mongoose) manejará lecturas y escrituras correctamente, y failover automático si el primario cae. 5️⃣ Seguridad Solo pueden conectarse: IPs de los VPS del replica set IP del backend (192.168.1.200) Se requiere autenticación (--auth).