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).


