راه اندازی سرویس NodeJS+Mongo+Minio بر بستر داکر

دیاگرام مورد استفاده ما
دیاگرام مورد استفاده ما

خیلی از اپلیکیشن هایی که در بخش R&D توسعه داده می شوند بر بستر معروف mongo, node استوار شده اند، و خیلی وقتا استفاده از PaaS ها برای استقرار این استک مورد توصیه هستش، در این پروژه ما سعی کردیم اپلیکیشن های js که توسط بچه ها توسعه داده می شه رو روی یک سروری تستی که داریم بالا بیاریم و سعی کنیم با استفاده از swarm اسکیل لازم رو انجام بدیم و لود بالانس نیز داشته باشیم. زیر ساخت برنامه نوشته شده بر اساس پایگاه داده mongo ، فایل استوریج minio، اپلیکیشن node، و لود بالانسر traefik نوشته شده است، اولین قدم نوشتن یک داکر فایل Dockerfile برای اپلیکیشن نود خودمان می باشد:


FROM node:12
COPY ./jana /usr/src/app
WORKDIR /usr/src/app
RUN npm install
EXPOSE 3000
CMD [ &quotnpm&quot, &quotstart&quot ]

در مرحله بعد نوشتن داکر کامپوز فایل برای پروژه خودمون هستش که سرویس های لازم را بالا بیاره که به صورت زیر می نویسیم:

version: '3.8'
services:
  minio:
    image: minio/minio:latest
    volumes:
      - minio_data_1:/data1
    expose:
      - &quot9000&quot
    environment:
      MINIO_ACCESS_KEY: $MINIO_ACCESS_KEY
      MINIO_SECRET_KEY: $MINIO_SECRET_KEY
    command: server /data1
    healthcheck:
      test: [&quotCMD&quot, &quotcurl&quot, &quot-f&quot, &quothttp://localhost:9000/minio/health/live&quot]
      interval: 30s
      timeout: 20s
      retries: 3
    restart: always
    networks:
      - jana

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: $MONGO_USERNAME
      MONGO_INITDB_ROOT_PASSWORD: $MONGO_PASSWORD
      MONGO_INITDB_DATABASE: $MONGO_DATABASE
    ports:
      - &quot27017&quot
    volumes:
      - mongodb_data_container:/data/db
    networks:
      - jana
  
  nodejs:
    build:
      context: ./node
      dockerfile: Dockerfile
    image: nodejs
    restart: unless-stopped
    env_file: .env
    environment:
      - MONGO_USERNAME=$MONGO_USERNAME
      - MONGO_PASSWORD=$MONGO_PASSWORD
      - MONGO_HOSTNAME=$MONGO_HOSTNAME
      - MONGO_PORT=$MONGO_PORT
      - MONGO_DATABASE=$MONGO_DATABASE
      - NODE_ENV=$NODE_ENV 
    expose:
      - &quot3000&quot
    volumes:
      - ./node:/home/node/app
      - node_modules:/home/node/app/node_modules

    labels:
      - &quottraefik.enable=true&quot
      - &quottraefik.http.routers.nodejs.rule=Host(`localhost`)&quot
    networks:
      - jana

  traefik:
    image: &quottraefik:v2.2&quot
    container_name: &quottraefik&quot
    command:
      #- &quot--log.level=DEBUG&quot
      - &quot--api.insecure=true&quot
      - &quot--providers.docker=true&quot
      - &quot--providers.docker.exposedbydefault=false&quot
      - &quot--entrypoints.web.address=:80&quot
    ports:
      - &quot8080:80&quot
      - &quot8088:8080&quot
    volumes:
      - &quot/var/run/docker.sock:/var/run/docker.sock:ro&quot
    networks:
      - jana

volumes:

  mongodb_data_container:
  minio_data_1:
  node_modules:

networks:
  jana:
    driver: bridge

و با توجه به پروژه مقادیر وریبل هایی که در کامپوز فایل نوشته ایم را در فایل env. اضافه می کنیم:

MONGO_USERNAME=mamad
MONGO_PASSWORD=mamadian
MONGO_HOSTNAME=mongo
MONGO_DATABASE=mamad-app
MONGO_PORT=27017
NODE_ENV=staging
MINIO_ACCESS_KEY='my_secure_access_key_for_mamad'
MINIO_SECRET_KEY='my_secure_secret_key_for_mamad'

در مورد سرویس ترافیک در پست های قبلی صحبت کرده ایم و فایل های مرتبط با اپلیکیشن را در دایرکتوری node/jana کلون می کنیم و حالا برای اینکه فایل ما کار کنه کافیه دستور زیر رو بزنیم:

docker-compose up -d --scale nodejs=2

این دستور داکر کامپوز ما را بالا میاره و از سرویس نود دو کانتینر بالا میاره که به ما در بالانس لود کمک خواهد کرد:

docker ps
کانتینتر های بالا اومده :)
کانتینتر های بالا اومده :)

با توجه به اینکه قبلا بر روی سرور nginx نصب شده بود، برای سرویس دادن به افراد بر روی یک ساب دامنه برای nginx یک کانفیگ فایل مینویسیم:

  server { # simple reverse-proxy
    listen       80;
    server_name  proj.address.ir www.proj.address.ir;
    location / {
      proxy_pass      http://localhost:8080;
    }
  }

و در پوشه /etc/nginx/conf.d قرار می دهیم (از site-available site-enabled بعدا استفاده خواهیم کرد)

دستور زیر را میزنیم:

nginx -t
خروجی مطلوب دستور
خروجی مطلوب دستور

و در نهایت با دستور:

nginx -s relaod

سرویس انجینکس را ریلود می کنیم.

اکنون اگر در DNS ساب دامنه مورد نظر بر روی آی پی پابلیک سرور ست شده باشد، با زدن proj.address.ir در مرورگر خروجی کار خود را خواهیم دید :)