เบงเบดเบ—เบตเบเบฒเบ™เบซเบธเป‰เบกเบซเปเปˆเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ VueJS + NodeJS + MongoDB เปƒเบ™ Docker

เบงเบดเบ—เบตเบเบฒเบ™เบซเบธเป‰เบกเบซเปเปˆเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ VueJS + NodeJS + MongoDB เปƒเบ™ Docker
เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเปƒเบˆเป„เบ”เป‰เบˆเบฒเบเบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบเบเปˆเบฝเบงเบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบกเบทเป‰เบ—เปเบฒเบญเบดเบ”เปƒเบ™เบ—เบตเบกเบ‡เบฒเบ™เปƒเบซเบกเปˆเบกเบฑเบเบˆเบฐเป„เบ›เปƒเบ™เบ—เบฒเบ‡เบ”เบฝเบงเบเบฑเบ™: backender เบ™เบฑเปˆเบ‡เบฅเบปเบ‡เบเบฑเบšเบ‚เป‰เบญเบเปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ magical เบ—เบตเปˆเบˆเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบฅเบฐ deploy เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. Docker เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบ‚เบฒเบ”เบšเปเปˆเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบ–เบงเบซเบ™เป‰เบฒเป€เบžเบฒเบฐเบงเปˆเบฒ ... backend เบกเบฑเบเบˆเบฐเบ–เบทเบเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™เบ„เบงเบฒเบกเบเบงเป‰เบฒเบ‡เบ‚เบญเบ‡ PHP / Java / Python / C# stacks, เปเบฅเบฐเบ”เป‰เบฒเบ™เบซเบ™เป‰เบฒเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเบปเบšเบเบงเบ™ backend เบ—เบธเบเป†เบ„เบฑเป‰เบ‡เป€เบžเบทเปˆเบญเบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰เบ—เบธเบเบขเปˆเบฒเบ‡. เบกเบตเบžเบฝเบ‡เปเบ•เปˆเบขเบนเปˆเบšเปˆเบญเบ™เบ”เบฝเบงเบ—เบตเปˆเบ‚เป‰เบญเบเป€เบซเบฑเบ™เบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™ Docker-Jenkins เบเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ—เบตเปˆเป‚เบ›เปˆเบ‡เปƒเบช, เบšเบฑเบ™เบ—เบถเบ, เปเบฅเบฐเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”.

เบšเบปเบ”เบ„เบงเบฒเบกเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบเป„เบ”เป‰เบ–เบทเบเบ‚เบฝเบ™เบเปˆเบฝเบงเบเบฑเบš Docker. เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบซเบ™เป‰เบฒเบ”เบฝเบงเป‚เบ”เบเปƒเบŠเป‰ VueJS / Vue Router, เบชเปˆเบงเบ™เป€เบŠเบตเบŸเป€เบงเบตเปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบฎเบนเบšเปเบšเบš RESTful API เบเบฑเบš NodeJS, เปเบฅเบฐ MongoDB เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบ›เบฑเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™. Docker Compose เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบšเบฑเบ™เบˆเบธเบซเบผเบฒเบ.

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡ Docker เบˆเบถเปˆเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™

Docker เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป„เบ”เป‰. เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเบšเปเปˆเบˆเบณเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ›เบฃเปเบเบกเบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡ เบซเบผเบท เบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เบ‚เบญเบ‡เบฅเบธเป‰เบ™เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบ‚เบญเบ‡เบฅเบฒเบง. เบชเบดเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เปเบกเปˆเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Docker เปเบฅเบฐเบžเบดเบก 1-2 เบ„เปเบฒเบชเบฑเปˆเบ‡เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ console. เบงเบดเบ—เบตเบ—เบตเปˆเบชเบฐเบ”เบงเบเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™ Linux.

เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™

เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Docker เปเบฅเบฐ Docker เบ‚เบฝเบ™

เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป‚เบŸเบ™เป€เบ”เบต

เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡ 2 เป‚เบŸเบ™เป€เบ”เบตเบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒเปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ. เป„เบŸเบฅเปŒเบ—เบตเปˆเบกเบตเบ™เบฒเบกเบชเบฐเบเบธเบ™ .yml เปเบกเปˆเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Docker Compose, เบšเปˆเบญเบ™เบ—เบตเปˆเบšเบฑเบ™เบˆเบธเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ–เบทเบเบเปเบฒเบ™เบปเบ”เปเบฅเบฐเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡.
Docker-compose.yml:

version: "3"
services:
  mongo:
    container_name: mongo
    hostname: mongo
    image: mongo
    ports:
      - "27017:27017"
  server:
    build: server/
    #command: node ./server.js #ะทะดะตััŒ ะผะพะถะฝะพ ะฟะตั€ะตะทะฐะฟะธัะฐั‚ัŒ CMD ะธะท Dockerfile ะฒ /server
    ports:
      - "3000:3000"
    links:
      - mongo
  client:
    build: client/
    #command: http-server ./dist #ะทะดะตััŒ ะผะพะถะฝะพ ะฟะตั€ะตะทะฐะฟะธัะฐั‚ัŒ CMD ะธะท Dockerfile ะฒ /client
    network_mode: host
    ports:
      - "8089:8089"
    depends_on:
      - server

เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡ 3 เบšเปเบฅเบดเบเบฒเบ™เปƒเบ™ Docker: เบชเปเบฒเบฅเบฑเบš NodeJS, MongoDB เปเบฅเบฐเบชเปเบฒเบฅเบฑเบš static ones เปƒเบ™ Vue. เป€เบžเบตเปˆเบกเป€เบžเบทเปˆเบญเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบฅเบนเบเบ„เป‰เบฒเบเบฑเบšเป€เบŠเบตเบšเป€เบงเบต เบ‚เบถเป‰เบ™เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ. เป€เบžเบทเปˆเบญเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ MongoDB เบเบฑเบš server API, เปƒเบซเป‰เปƒเบŠเป‰ เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ mongo. เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เบฅเบนเบเบ„เป‰เบฒ, mongo - names of services .

เบฅเบนเบเบ„เป‰เบฒ VueJS

เบขเบนเปˆเปƒเบ™เป‚เบŸเบ™เป€เบ”เบต /เบฅเบนเบโ€‹เบ„เป‰เบฒ เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปเบกเปˆเบ™เบญเบตเบ‡เปƒเบชเปˆ VueJS. เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป„เบ”เป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เป‚เบ”เบเปƒเบŠเป‰ Vue Cli. เป€เบกเบทเปˆเบญเบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš, เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒเปเบกเปˆเบ™เบชเป‰เบฒเบ‡เบขเบนเปˆเปƒเบ™เบŠเบธเบ”เบ‚เบญเบ‡เป„เบŸเบฅเปŒเบ„เบปเบ‡เบ—เบตเปˆเบขเบนเปˆเปƒเบ™เป‚เบŸเบ™เป€เบ”เบต / เบซเปˆเบฒเบ‡. Dockerfile เบญเบฐเบ—เบดเบšเบฒเบเบŠเบธเบ”เบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš:

FROM node:10
WORKDIR /client
COPY ./package*.json ./
RUN npm install
RUN npm install -g http-server
COPY . .
RUN npm run build
EXPOSE 8081
CMD ["npm", "test:dev"]

เบเบฐเบฅเบธเบ™เบฒเบฎเบฑเบšเบŠเบฒเบšเบงเปˆเบฒ package.json เป„เบ”เป‰เบ–เบทเบเบ„เบฑเบ”เบฅเบญเบเปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบˆเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบ‚เบญเบ‡เป„เบŸเบฅเปŒเป‚เบ„เบ‡เบเบฒเบ™. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เป€เบžเบทเปˆเบญเปƒเบซเป‰เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เป‚เบŸเบ™เป€เบ”เบต /node_modules เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบชเป‰เบฒเบ‡เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡. เปเบ•เปˆเบฅเบฐเปเบ–เบงเบ„เปเบฒเบชเบฑเปˆเบ‡เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ.

เบชเบธเบ”เบ—เป‰เบฒเบ, เป€เบกเบทเปˆเบญเบเปˆเบญเบ‡เบšเบฑเบ™เบˆเบธเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบ„เปเบฒเบชเบฑเปˆเบ‡เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ” npm run dev. เบ„เปเบฒเบชเบฑเปˆเบ‡เบ™เบตเป‰เบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เปƒเบ™ package.json:


"scripts": {
	 "test:dev": "http-server dist -p 8081 -c 1 --push-state"
}

เป€เบžเบทเปˆเบญเปเบฅเปˆเบ™เป„เบŸเบฅเปŒเบˆเบฒเบเป‚เบŸเบ™เป€เบ”เบต / เบซเปˆเบฒเบ‡, เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ—เบปเปˆเบงเป‚เบฅเบ http-server, เปเบฅเบฐเบขเบนเปˆเปƒเบ™ dev-dependencies เบŠเบธเบ” spa-http-serverเป€เบžเบทเปˆเบญเปƒเบซเป‰ Vue Router เป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡. เบ—เบธเบ‡ --push-state เบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒ index.html. เบ—เบธเบ‡ -c เบ—เบตเปˆเบกเบตเบ„เปˆเบฒ 1 เบงเบดเบ™เบฒเบ—เบตเบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆ http-เป€เบŠเบตเบšเป€เบงเบต เบšเปเปˆ cache scripts. เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš; เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ nginx.

เปƒเบ™เบฎเป‰เบฒเบ™ Vuex เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก apiHost: 'http://localhost:3000', เบšเปˆเบญเบ™เบ—เบตเปˆเบžเบญเบ” NodeJS Api เบ–เบทเบเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™. เบชเปˆเบงเบ™เบฅเบนเบเบ„เป‰เบฒเปเบกเปˆเบ™เบเบฝเบกเบžเป‰เบญเบก. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฒเบเบฅเบนเบเบ„เป‰เบฒเบเบฑเบšเบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™เป„เบ›เบซเบฒ url เบ™เบตเป‰.

NodeJS server API

เบขเบนเปˆเปƒเบ™เป‚เบŸเบ™เป€เบ”เบต /server เบชเป‰เบฒเบ‡ เป€เบŠเบตเบšเป€เบงเบต เปเบฅเบฐ Dockerfile:


FROM node:10
WORKDIR /server
COPY ./package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

ะ’ เป€เบŠเบตเบšเป€เบงเบต เบŠเบตเป‰เบšเบญเบ url เบชเปเบฒเบฅเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ const url = 'mongodb://mongo:27017/';. เบญเบฐเบ™เบธเบเบฒเบ”เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ‚เป‰เบฒเบกเป‚เบ”เป€เบกเบ™เบˆเบฒเบเบฅเบนเบเบ„เป‰เบฒ:


const clientUrl = 'http://localhost:8081';
const corsOptions = {
  origin: clientUrl,
  optionsSuccessStatus: 200, // some legacy browsers (IE11, various SmartTVs) choke on 204
};
app.use(cors());
app.all('/*', (req, res, next) => {
  res.header('Access-Control-Allow-Origin', clientUrl);
  res.header('Access-Control-Allow-Headers', 'X-Requested-With');
  next();
});
  app.get('/getProducts', cors(corsOptions), (req, res) => {
    products.getContent
      .then(data => res.json(data), err => res.json(err));
  });
  app.get('/getUsers', cors(corsOptions), (req, res) => {
    db.getUsers()
      .then(data => res.json(data), err => res.json(err));
  });

เบชเบฐเบซเบฅเบธเบš

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป„เบ›เบ—เบตเปˆเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ docker-compose build เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบเปเปˆโ€‹เบชเป‰เบฒเบ‡โ€‹เบฎเบนเบšโ€‹เบžเบฒเบšโ€‹เปเบฅเบฐโ€‹ docker-compose up เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบšเบฑเบ™เบˆเบธ. เบ—เบตเบกเบ‡เบฒเบ™เบˆเบฐเบเบปเบ 3 เบ•เบนเป‰เบšเบฑเบ™เบˆเบธ: server, client, mongo. เบชเปเบฒเบฅเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡ NodeJS, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ” configure hot-reload เป‚เบ”เบเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบกเบฑเบ™เบเบฑเบšเป‚เบŸเบ™เป€เบ”เบตเบœเบนเป‰เปƒเบŠเป‰. เปเบฅเบฐเบฅเบนเบเบ„เป‰เบฒเบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ„เบงเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเปƒเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ”เป‰เบงเบเบเบฒเบ™เป‚เบซเบผเบ”เบ„เบทเบ™เปƒเบซเบกเปˆ, เปเบฅเปˆเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ ะธ Mongo. เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, เบžเบฝเบ‡เปเบ•เปˆเบฅเบฐเบšเบธเบŠเบทเปˆเบ‚เบญเบ‡เบกเบฑเบ™ docker-compose up client. เบขเปˆเบฒเบฅเบทเบกเป€เบฎเบฑเบ”เบกเบฑเบ™เบšเบฒเบ‡เบ„เบฑเป‰เบ‡ prune เปเบฅเบฐเบเบฒเบ™เบฅเบถเบšเบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต, เป€เบ„เบทเบญเบ‚เปˆเบฒเบ, เปเบฅเบฐเบฎเบนเบšเบžเบฒเบšเบ•เปˆเบฒเบ‡เป†เป€เบžเบทเปˆเบญเบ‚เบฐเบซเบเบฒเบเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™.

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบฅเบฐเบซเบฑเบ”เป€เบ•เบฑเบก เบ—เบตเปˆเบ™เบตเป‰. เป‚เบ„เบ‡เบเบฒเบ™เบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™