49 lines
No EOL
1.5 KiB
Bash
49 lines
No EOL
1.5 KiB
Bash
#!/bin/bash
|
|
# Move to the script's directory
|
|
cd "$(dirname "$0")"
|
|
|
|
# 1. ROBUST ENV SOURCING (Same logic as MinIO/Keepalived)
|
|
ENV_PATH="/docker/mongo/.env"
|
|
if [ -f "$ENV_PATH" ]; then
|
|
while read -r line || [ -n "$line" ]; do
|
|
[[ "$line" =~ ^#.*$ ]] && continue
|
|
[[ -z "$line" ]] && continue
|
|
export "${line//\"/}"
|
|
done < "$ENV_PATH"
|
|
else
|
|
echo "ERROR: .env file not found!"
|
|
exit 1
|
|
fi
|
|
|
|
STATUS_JSON=$(docker exec -t "mongo-db${KOMODO_NODE_ID}" mongosh --quiet --eval "rs.status()" 2>/dev/null)
|
|
IS_INIT=$(echo "$STATUS_JSON" | grep -c "ok: 1")
|
|
|
|
if [ "$IS_INIT" -gt 0 ]; then
|
|
echo "✅ MongoDB is already part of a replica set. Nothing to do."
|
|
exit 0
|
|
fi
|
|
|
|
if [ "$KOMODO_NODE_ID" == "1" ]; then
|
|
echo "👑 Node 1 detected. Initiating as Primary for 'rs${LXC_NUM}'..."
|
|
|
|
# Initiate with just self to guarantee Primary status
|
|
docker exec -t "mongo-db1" mongosh --eval "
|
|
rs.initiate({
|
|
_id: 'rs${LXC_NUM}',
|
|
members: [{ _id: 0, host: 'mongo-db1:27017' }]
|
|
})"
|
|
|
|
echo "⏳ Waiting for election..."
|
|
sleep 5
|
|
|
|
# Pre-authorize the partner
|
|
docker exec -t "mongo-db1" mongosh --eval "rs.add('mongo-db2:27017')"
|
|
echo "🚀 Node 1 is now Primary and waiting for Node 2."
|
|
|
|
else
|
|
echo "🏃 Node 2 detected. Attempting to handshake with Node 1..."
|
|
|
|
# Node 2 doesn't initiate. It just waits for Node 1 to be ready.
|
|
# Node 1 already ran rs.add('mongo-db2'), so Node 2 just needs to be up.
|
|
echo "🤝 Node 2 is online. Synchronization should start automatically via Node 1's config."
|
|
fi |