تا ابد دانشجو، داده دوست، کار دوست، کامپیوتر دوست، الکترونیک دوست، هم بنیان گذار ویراساد، داداش حاجی خودمون :)
راه اندازی سرویس 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 [ "npm", "start" ]
در مرحله بعد نوشتن داکر کامپوز فایل برای پروژه خودمون هستش که سرویس های لازم را بالا بیاره که به صورت زیر می نویسیم:
version: '3.8'
services:
minio:
image: minio/minio:latest
volumes:
- minio_data_1:/data1
expose:
- "9000"
environment:
MINIO_ACCESS_KEY: $MINIO_ACCESS_KEY
MINIO_SECRET_KEY: $MINIO_SECRET_KEY
command: server /data1
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
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:
- "27017"
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:
- "3000"
volumes:
- ./node:/home/node/app
- node_modules:/home/node/app/node_modules
labels:
- "traefik.enable=true"
- "traefik.http.routers.nodejs.rule=Host(`localhost`)"
networks:
- jana
traefik:
image: "traefik:v2.2"
container_name: "traefik"
command:
#- "--log.level=DEBUG"
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
ports:
- "8080:80"
- "8088:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
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 در مرورگر خروجی کار خود را خواهیم دید :)
مطلبی دیگر از این انتشارات
شروع ساده با Apache Airflow
مطلبی دیگر از این انتشارات
هیدروپونیک تجربه ای جالب از ساختن و کاشتن
مطلبی دیگر از این انتشارات
چگونه میتوان دادهها را به بهترین شکل جمعآوری کرد؟