mapletree/lxc1/p2-apps/mongo/mongo_init.sh
2026-02-02 14:40:03 -07:00

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