diff --git a/scripts/mongodb-copy-prod.sh b/scripts/mongodb-copy-prod.sh new file mode 100755 index 0000000000000000000000000000000000000000..04b6b1c666c56d3b7060f2174bacbb28ec1b12b5 --- /dev/null +++ b/scripts/mongodb-copy-prod.sh @@ -0,0 +1,80 @@ +set -e # Exit shell when an error is encountered + +if [ "$2" = "" ] || [ "$1" = "-h" ]; then + echo "Usage: `basename $0` SRC_URL TARGET_CONTAINER_NAME [DB_NAME (default=ram)]" + exit 0 +fi + +# Config +SRC_URL=$1 +TARGET_CONTAINER_NAME=$2 +DB_NAME=${3:-"ram"} + +echo "SRC_URL=$SRC_URL" +echo "TARGET_CONTAINER_NAME=$TARGET_CONTAINER_NAME" +echo "DB_NAME=$DB_NAME" + +# Local variables +CWD=$PWD +TIMESTAMP=$(date +%Y%m%d%H%M%S) +BACKUP_DIR="backups/${TARGET_CONTAINER_NAME}_${DB_NAME}_${TIMESTAMP}" +DUMP_DIR="dump/$(echo $SRC_URL | sed -E 's/^\s*.*:\/\///g' | cut -f1 -d"/")_${TIMESTAMP}" # remove https:// and path from SRC_URL + +if ! test -f .migrate; then + echo "ERROR: .migrate file not found, check if you are in the right directory" + exit 1 +fi + + +# Backup of the target db +mkdir -p $BACKUP_DIR +docker exec $TARGET_CONTAINER_NAME mkdir -p /dump/$DB_NAME +docker exec $TARGET_CONTAINER_NAME bash -c "mongodump --authenticationDatabase admin --username root -d $DB_NAME --password \$MONGODB_ROOT_PASSWORD -h localhost" +docker cp $TARGET_CONTAINER_NAME:/dump/$DB_NAME $BACKUP_DIR +cp .migrate $BACKUP_DIR +echo "***** Db $TARGET_CONTAINER_NAME/$DB_NAME backed up in $BACKUP_DIR (with .migrate file)" + + +# Restore of the source backup +mkdir -p $DUMP_DIR +cd $DUMP_DIR +wget $SRC_URL/latest.tar.gz +wget $SRC_URL/.migrate +gunzip latest.tar.gz +tar -xvf latest.tar +docker exec $TARGET_CONTAINER_NAME rm -rf /dump/temp/ +docker exec $TARGET_CONTAINER_NAME mkdir /dump/temp/ +docker cp ./mongo__*/ram/ $TARGET_CONTAINER_NAME:/dump/temp/$DB_NAME +docker exec $TARGET_CONTAINER_NAME bash -c "mongo --authenticationDatabase admin --username root --password \$MONGODB_ROOT_PASSWORD $DB_NAME --eval 'db.dropDatabase()'" +docker exec $TARGET_CONTAINER_NAME bash -c "mongorestore --authenticationDatabase admin --username root --password \$MONGODB_ROOT_PASSWORD -d $DB_NAME /dump/temp/$DB_NAME/" +echo "***** Latest dump $SRC_URL restored in $TARGET_CONTAINER_NAME/$DB_NAME (and stored in $DUMP_DIR)" + +# Cleanup user email and password change (not for admin users) +cat > mongo_clean_users.js <<EOL +db.users.aggregate([{ \$addFields: { emailTemp: { \$concat: [ {\$toLower: "\$name"}, ".", {\$toLower: "\$surname"}, "@nowhere69.com" ] } }}, { \$out: "users" }]) +db.users.updateMany({role: {\$ne: 1}}, [{ \$set: {email: "\$emailTemp", password: "\$2a\$12\$vLQjJ9zAWyUwiXLeQDa6w.XzrlgPBhw.2GWrjog/yuEjIaZnQwmZu"} }]) +db.users.updateMany({}, [{ \$unset: "emailTemp" }]) +db.tempusers.deleteMany({}) +db.newslettersubscriptions.deleteMany({}) +EOL +docker cp ./mongo_clean_users.js $TARGET_CONTAINER_NAME:/dump/temp/ +docker exec $TARGET_CONTAINER_NAME bash -c "mongo --authenticationDatabase admin --username root --password \$MONGODB_ROOT_PASSWORD $DB_NAME < /dump/temp/mongo_clean_users.js" +rm mongo_clean_users.js + +# .migrate file copy +cd $CWD +if [ "$DB_NAME" = "ram" ]; then + cp $DUMP_DIR/.migrate .migrate + npm run migrate:up +fi +docker exec $TARGET_CONTAINER_NAME rm -rf /dump/temp/ + + +echo "" +echo "*************************************************************************** Summary *********************************************************************" +echo "Db $TARGET_CONTAINER_NAME/$DB_NAME backed up in $BACKUP_DIR (with .migrate file)" +echo "Latest dump $SRC_URL stored in $DUMP_DIR and restored in $TARGET_CONTAINER_NAME/$DB_NAME (and prod emails cleaned up)" +if [ "$DB_NAME" = "ram" ]; then echo "The local .migrate file has been copied from $SRC_URL for db $DB_NAME and migration:up runned"; fi +echo "*********************************************************************************************************************************************************" + +exit 0