راه اندازی سرویس 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 در مرورگر خروجی کار خود را خواهیم دید :)