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: { \$literal: "\$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 # For local db, change user email if [ "$TARGET_CONTAINER_NAME" = "resin-db" ]; then cat > mongo_rename_user.js <<EOL db.users.updateMany({email: "inclusionnumerique@grandlyon.com"}, [{ \$set: { email: "admin@admin.com" } }]) db.users.updateMany({role: 1}, [{ \$set: { password: { \$literal: "\$2a\$12\$vLQjJ9zAWyUwiXLeQDa6w.XzrlgPBhw.2GWrjog/yuEjIaZnQwmZu" } } }]) EOL docker cp ./mongo_rename_user.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_rename_user.js" rm mongo_rename_user.js fi # .migrate file copy cd $CWD if [ "$DB_NAME" = "ram" ]; then cp $DUMP_DIR/.migrate .migrate if [ "$TARGET_CONTAINER_NAME" = "resin-db" ]; then npm run migrate:up; fi 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"; fi if [ "$DB_NAME" = "ram" ]; then echo "Don't forget to reset elasticsearch indexes!!!"; fi if [ "$DB_NAME" = "ram" ] && [ "$TARGET_CONTAINER_NAME" = "resin-db" ]; then echo "migration:up runned"; fi echo "*********************************************************************************************************************************************************" exit 0