πŸ’½Database Backup and Recovery

From time to time, data is backed up to a secondary database to avoid total corruption or loss of data. For now, data can be backed up on a local database in a development environment. This is done with the use of two MongoDB database containers, docker-compose.yml, the mongodump and mongorestore commands, and also by installing the MongoDB server and its database tools in the Dockerfile.

Sub-processes were used to run these commands in bash scripts with the help of a cron job (for backup) and an endpoint (for restoration). MongoDB Compass can be used to view and manage the databases graphically.

# backend/Dockerfile

FROM node:17-alpine As development

# setting the image working directory which the backend folder of the root directory
WORKDIR /usr/src/app/backend

# copy package.json and package-lock.json to the image working directory
COPY package*.json ./

# install tools for mongodump and mongorestore commands
RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.6/main' >> /etc/apk/repositories
RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.6/community' >> /etc/apk/repositories
RUN apk update
RUN apk add mongodb
RUN apk add mongodb-tools


# install development dependencies
RUN npm install --only=development --force


# copy the application code to the working directory of image
COPY . .

# EXPOSE 3000

#  build the application
RUN npm run build

# docker-compose.yml

version: '3.7'

services:

# Backend service for Elixir.io
  backend:
    container_name: elixir_backend
    build: 
      context: ./backend
      target: development
    ports:
      - 9229:9229
      - 3000:3000
    command: npm run start:dev
    environment:
      JWT_CONSTANT_SECRET: ${JWT_CONSTANT_SECRET}
      S3_ADMINISTRATOR_ACCESS_KEY_ID: ${S3_ADMINISTRATOR_ACCESS_KEY_ID}
      S3_ADMINISTRATOR_SECRET_ACCESS_KEY: ${S3_ADMINISTRATOR_SECRET_ACCESS_KEY}
      S3_BUCKET: ${S3_BUCKET}
      NODE_ENV: development
    volumes:
      - .:/usr/src/app/ # mounting the directory inside the container
      - /usr/src/app/backend/node_modules # mounting node_modules inside the backend container
    env_file:
      - .env
    depends_on:
      - mongo

# MongoDB service for Elixir.io
  mongo:
    container_name: elixir_mongodb
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_DATABASE: ${MONGO_DATABASE}
      MONGO_INITDB_ROOT_USERNAME: ${MONGOROOTUSERNAME}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGOROOTPASSWD}
    
    volumes:
      - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo-js:ro
      - ./mongo-volume:/data/db
    ports: 
      - '27017:27017'


  mongo-backup:
    container_name: elixir_mongodb_backup
    image: mongo
    restart: always

    environment:
      MONGO_INITDB_DATABASE: ${MONGO_DATABASE}
      MONGO_INITDB_ROOT_USERNAME: ${MONGOROOTUSERNAME}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGOROOTPASSWD}

    volumes:
      - ./mongo-backup-volume:/data/db
    ports: 
      - '27021:27017'

Last updated