Рубрики
Uncategorized

Создайте бэкэнд для проектов IoT и настройте конвейер CI / CD с Docker

Почта будет охватывать детали создания простого бэкэнда, которая собирает данные, отправленные устройствами IoT. Мы будем использовать Node.js, docker, docker, dontuxdb и grafana и развернуть его на наличии на кафедре на Docker Cloud.

Автор оригинала: Luc Juggery.

TL; доктор

Устройства IOT повсюду и доступны по смешным ценам. Например, вы можете приобрести ноль ноль Raspberry Pi W, у которой есть некоторые действительно хорошие характеристики менее чем на 10 долларов. Поскольку проекты IOT продолжают процветать, мы обсудим подробности создания простого бэкэнда, которая собирает данные, отправленные устройствами IoT. Чтобы построить эту бэкэнду, мы будем использовать Node.js, docker, docker, dontuxdb и grafana. Мы разверним его на Diumpanyocean через Docker Cloud.

использование

Мы проиллюстрируем нашу бэкэнд с температурными данными с симулятора. Этот проект может служить основой для создания приложений IOT, которые используют реальные мировые устройства (например Raspberry Pi , Оранжевый PI , C.H.I.P ) отправлять практически любые виды временных данных. IOS или Android-приложения также могут отправлять данные на нашу BackeND.

Мы можем представить такие приложения, как:

  • Мониторинг холодной цепи (температура отправки)
  • приборная панель окружающей среды (температура, влажность, …)
  • Мониторинг энергоэффективности (отправка потребления электроэнергии в реальном времени)
  • тревоги (отправка статуса двери)
  • Мониторинг вождения (отправка скорости в реальном времени)
  • Уровень воды бассейна
  • и более!

Проэкт

Это приложение Backend состоит из трех услуг:

API получает данные по поводу запроса HTTP Post и сохраняет его в базе данных в основе введении NINTUXDB. Приборная панель, построенная с Grafana, позволяет нам визуализировать данные из базы данных.

Примечание: Устройства Real World могут использовать протокол более низкого уровня, такой как TCP или UDP, для ограничения размера рамы.

Когда бэкэнда собирает данные, мы сначала создам простой симулятор данных в Bash. В следующей статье мы сосредоточимся на реализации устройства на основе Raspberry Pi (или другого устройства ARM), отправляющих данные реального мира.

Шаги, которые мы будем покрывать:

  • Создание простого симулятора
  • Создание API
  • Создайте документ докера API
  • Добавление приключания на картинку
  • Построить приложение Docker Compose
  • Распределить изображение с Docker Hub
  • Настройка конвейера CI/CD с Docker Cloud
  • Заключение
  • Что дальше?

Все шаги, которые мы пройдем в этой статье, можно найти на GitHub в DEMO IOT DEMO Project Репозиторий. Пример Node.js Реализация API находится в IOT API Репозиторий.

Эти репозитории GitHub используются в качестве проектов, чтобы проиллюстрировать Docker подробнее для DEV и OPS онлайн курс .

Примечание: Текущая версия Backend не готова, но может использоваться в качестве отправной точки.

Создание простого симулятора

В этой части мы создадим скрипт, который имитирует температуру, отправленную конкретным устройством на данном временетете. Ниже приведен образцы данных, которые будут отправлены:

{
  ts: "2017-03-01T23:12:52Z",
  type: "temp",
  value: 34,
  sensor_id: 123
}

Давайте рассмотрим свойства:

  • TS является временем, когда температура была измерена, в формате ISO8601
  • Sensor_id используется, чтобы мы знали, какое устройство пришло температура
  • Тип Харкодируется до «Temp», чтобы указать температуру, но другие значения могут быть использованы
  • ценность это значение температуры послал

Ниже приведен сценарий, который мы будем использовать для симулятора.

#!/bin/bash

# Default HOST:PORT targeted
HOST="localhost"
PORT=1337

function usage {
    echo "Usage: simulator.sh [-h HOST] [-p PORT]"
    exit 1
}

# Parse arguments
while getopts h:p: FLAG; do
  case $FLAG in
    h)
      HOST=$OPTARG
      ;;
    p)
      PORT=$OPTARG
      ;;
    \?)
      usage
      ;;
  esac
done

# Generate and send random data
while(true); do
    # Current date
    d=$(date -u +"%Y-%m-%dT%H:%M:%SZ")

    # Random temperature between 20 and 34°C
    temp=$(( ( RANDOM % 15 )  + 20 ))

    # Send data to API
    curl -XPOST -H "Content-Type: application/json" -d '{"ts":"'$d'", "type": "temp", "value": '$temp', "sensor_id": 123 }' http://$HOST:$PORT/data

    sleep 1
Done

В основном, в каждой итерации петли текущая дата извлекается, генерируется случайное число от 20 до 34 ° C и отправляется на хост, предоставляемый в качестве параметра. По умолчанию данные отправляются в Localhost на порт 1337 Отказ Если нам нужно отправлять данные на хост, www.example.com, на порту 3000 Мы бы запустили симулятор так:

$ ./simulator.sh -h www.example.com -p 3000

Создание API

API, разработанный в Node.js, будет иметь следующие характеристики:

  • реализует HTTP Post EndPoint ON/DATA
  • Слушает порта 1337, если не предоставляется переменная среды порта
  • Ответы с 201 HTTP-кодом состояния (создание)
  • Отображает полученные данные на стандартном выходе
  • содержит тест для проверки реализации конечной точки

На этом этапе API не сохраняет данные, но в ближайшее время мы подключаем его с базой данных IntruxDB.

В основном, API состоит из 3 файлов:

  • Package.json Содержит метаданные приложения и список зависимостей
  • app.js Содержит код, определяющий веб-сервер приложения
  • index.js это въездная точка, которая звонит app.js Отказ

Index.js.

// Load dependencies
const util    = require('util'),
      winston = require('winston'),
      app     = require('./app');

// Define API port
let port   = process.env.PORT || 1337;

// Run API
app.listen(port, function(){
    winston.info(util.format("server listening on port %s", port));
});

App.js.

// Load dependencies
const express    = require('express'),
      bodyParser = require('body-parser'),
      winston    = require('winston');

// Create express application
let app = module.exports = express();

// Body parser configuration
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

// Handle incoming data
app.post('/data',
         (req, res, next) => {
             winston.info(req.body);
             return res.sendStatus(201);
         });

Для непрерывной интеграции/непрерывной развертывания мы определим простой тест в Тест/functional.js Файл Отказ При работе с NPM Test , он запускает API, отправляет образец данных и ожидает получить 201 HTTP-код состояния состояния.

$ npm test

> iot@1.0.0 test /Users/luc/iot-api
> mocha test/functional.js


  Creation
info: server listening on port 3000
info:  ts=2017-03-11T15:00:53Z, type=temp, value=34, sensor_id=123
    ✓ should create dummy data (43ms)

Создайте документ докера API

Для того, чтобы упаковать API в контейнер, мы создадим DockerFile в корневом коде приложения. Этот DockerFile содержит все инструкции, необходимые для установки зависимостей приложения, снизу вверх: библиотеки Linux и двоичные файлы, Node.js Runtime, модули NPM и код приложения.

FROM mhart/alpine-node:7.7.1

# Copy list of server side dependencies
COPY package.json /tmp/package.json

# Install dependencies
RUN cd /tmp && npm install

# Copy dependencies libraries
RUN mkdir /app && cp -a /tmp/node_modules /app/

# Copy src files
COPY . /app/

# Use /app working directory
WORKDIR /app

# Expose http port
EXPOSE 1337

# Run application
CMD ["npm", "start"]

Чтобы ограничить размер изображения, который будет создан, мы будем использовать MHART/ALPINE-NODE , который является легким альпийским Linux, который встраивает odd.js Runtime. Это изображение действительно популярно — мы можем сказать, сколько раз это загружено. Кроме того, чтобы убедиться, что простое изменение в коде не восстановит все зависимости, мы запускаем NPM установить Команда сначала, а затем скопируйте источник приложения, чтобы он использовал кэш. API открывает порт 1337 и бегается с общей NPM начать команда.

Давайте теперь создадим докерный образ API и тег его с 1,0.

 docker image build -t iot-api:1.0 .
Sending build context to Docker daemon 9.216 kB
Step 1/9 : FROM mhart/alpine-node:7.7.1
 ---> e1a533c514f2
Step 2/9 : ENV LAST_UPDATED 20170318T100000
 ---> Running in 28946c53b094
 ---> 1ab1b4b2fd77
Removing intermediate container 28946c53b094
Step 3/9 : COPY package.json /tmp/package.json
 ---> ff681a2fd62b
Removing intermediate container 749abfe9aae9
Step 4/9 : RUN cd /tmp && npm install
 ---> Running in 70ab8ad9ecc0
...
 ---> 514366651621
Removing intermediate container 70ab8ad9ecc0
Step 5/9 : RUN mkdir /app && cp -a /tmp/node_modules /app/
 ---> Running in 9a7d7a541edf
 ---> 2b9377530971
Removing intermediate container 9a7d7a541edf
Step 6/9 : COPY . /app/
 ---> ec5cf6e0fc95
Removing intermediate container b3587338bfd1
Step 7/9 : WORKDIR /app
 ---> e74dc2e2921d
Removing intermediate container 629a4eaa046d
Step 8/9 : EXPOSE 1337
 ---> Running in dfbfef3335eb
 ---> 9888e647a2ee
Removing intermediate container dfbfef3335eb
Step 9/9 : CMD npm start
 ---> Running in cf7dd0eaf15c
 ---> ce3bbc3098e8
Removing intermediate container cf7dd0eaf15c
Successfully built ce3bbc3098e

Теперь у нас есть изображение API — он готов быть создан в контейнере со следующей командой:

$ docker container run -p 1337:1337 iot-api:1.0

В текущей версии у него нет никакой утилиты, так как она печатает только полученные данные. На следующих шагах мы изменим код, чтобы сохранять данные в основном Приключите база данных.

Добавление приключания на картинку

SOUTUUXDB — отличная база данных, ориентированная на временной серии, и, как мы увидим, это действительно легко начать. Приключите документацию Может помочь вам очень быстро понять основные концепции.

Запуск приключания внутри контейнера

Docker Hub предоставляет официальный Приключение изображения Отказ Из документации мы можем видеть, что самый простой способ запуска контейнера на основе наводства наводящейся с помощью следующей команды:

$ docker container run \
-p 8083:8083 -p 8086:8086 \
-e INFLUXDB_ADMIN_ENABLED=true \
influxdb

Порт 8083 используется для доступа к интерфейсу администрирования, и порт 8086 используется для выставления конечных точек HTTP-точек наключения. Поскольку эти порты открываются (с опцией -P), они доступны непосредственно от localhost.

Кроме того, интерфейс администрирования не включен по умолчанию — нам нужно предоставить Nictuxdb_admin_enabled Переменная среды для него доступен на порту 8083.

local-topuxdb-admin.png

Из интерфейса администрирования мы можем создать базу данных, которую мы будем использовать, чтобы сохранить данные.

На этом этапе мы можем создать контейнер для API (с использованием IOT-API: 1.0 Image) и другой контейнер для базы данных BELOULING TOUTHUXDB. Это здорово, но текущий API не сохраняет изменение данных, которые.

Измените API, чтобы сохранить данные в IncoluxDB

Нам нужно изменить app.js файл, так что он использует Узел приток NPM для подключения к IncoluxDB и напишите точку данных.

Вот модифицированный код:

// Load dependencies
const express    = require('express'),
      Influx     = require('influx'),
      bodyParser = require('body-parser'),
      winston    = require('winston');

// Create express application
let app = module.exports = express();

// Create a client towards InfluxDB
let influx = new Influx.InfluxDB({
   host: process.env.INFLUXDB_HOST || "db"
   database: process.env.INFLUXDB_DATABASE || "iot"
});

// Body parser configuration
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

// Handle incoming data
app.post('/data',
         function(req, res, next){
             influx.writePoints([
                 {
                  measurement: 'data',
                  tags: { type: req.body.type },
                  fields: { sensor_id: req.body.sensor_id, value: req.body.value },
                  timestamp: new Date(req.body.ts).getTime() * 1000000
                 }
             ]).then(() => {
               winston.info(req.body);
               return res.sendStatus(201);
             })
             .catch( err => {
               winston.error(err.message);
               return res.sendStatus(500);
             });
         });

Здесь здесь есть два важных веща:

  1. Мы создали Приток. Приключите объект и указанный хозяин Приключенный Он будет работать и база данных это будет использовать. Эти параметры предоставляются в качестве переменных среды и по умолчанию соответственно как «БД» и «IOT». Мы поймем, почему значение по умолчанию хозяин Является ли «БД», когда мы будем использовать Docker Compose.

  2. Способ сохранять данные, это точки записи Отказ В Terminology Terminology, A точка Является ли набор Timestamped полей и теги, которые принадлежат к Измерение Отказ В первом приближении A Измерение можно рассматривать как Таблица В традиционной базе данных SQL. В нашем примере есть один тег ( Тип ), который указывает на природу отправленных данных. Поля Sensor_id (Идентификатор устройства, отправляя данные) и ценить .

Давайте создадим новую версию Image API для учета этих изменений.

$ docker image build -t iot-api:2.0

Теперь мы знаем, как создавать контейнеры для запуска IncoluxDB и последней версии API. Для того, чтобы они могли работать вместе чистым способом, мы будем использовать Docker Compose, чтобы определить приложение многоконтеров.

Построить приложение Docker Compose

Docker Compose — это инструмент, написанный в Python, который позволяет приложениям работать как список услуг. Используется Docker-Compose.yml Файл для определения приложения. В нашем простом примере Docker-Compose.yml Файл будет выглядеть следующее:

version: "3.1"
services:
  db:
    image: influxdb
    environment:
      - INFLUXDB_ADMIN_ENABLED:true
    ports:
      - 8083:8083
      - 8086:8086
  api:
    Image: iot-api:2.0
    ports:
      - 1337:1337

Определены два сервиса — оба дБ и API Опубликовать порты, которые мы определены выше.

Поскольку мы хотели бы иметь аккуратный интерфейс для визуализации данных, мы добавим еще одну услугу на картинке перед запуском приложения. Мы будем использовать Графана платформа , что позволяет нам строить действительно необычные панели.

Grafana-образец-приборная панель .png

Конечно, в нашем примере приборная панель не будет выглядеть как скриншот выше, но вы обнаружите, что добавление графов действительно легко.

Мы можем использовать Графана Изображение От Docker Hub, чтобы создать новую услугу, названную Приборная панель и добавьте его к вышеуказанному файлу Docker-compose.yml.

version: "3.1"
services:
  db:
    image: influxdb
    environment:
      - INFLUXDB_ADMIN_ENABLED:true
    ports:
      - 8083:8083
      - 8086:8086
  api:
    image: iot-api:2.0
    ports:
      - 1337:1337
  dashboard:
    image: grafana/grafana
    ports:
      - 3000:3000

Grafana выставляет порт 3000, который сопоставлен на тот же порт на локальной машине. Это означает, что интерфейс Grafana будет доступен на http://localhost: 3000 — Мы увидим это скоро.

Теперь давайте запустим все приложение и посмотрите, как контейнеры (которые являются только экземплярами каждой службы) способны взаимодействовать друг с другом. Приложение Docker Compose может быть запущено со следующей командой.

$ docker-compose up
Creating network "iotapi_default" with the default driver
Creating iotapi_api_1
Creating iotapi_db_1
Creating iotapi_dashboard_1
Attaching to iotapi_db_1, iotapi_api_1, iotapi_dashboard_1
…

Многие вещи произошли здесь — создана сеть, и контейнер был создан для каждой службы и подключена к этой сети. Находясь в той же сети (пользовательский мост в нашем примере), контейнер службы может взаимодействовать с контейнером другого сервиса, просто используя имя обслуживания. Звучит с толку? Давайте посмотрим на два примера:

  • Контейнер, созданный от API Служба может подключаться к DB только ссылаться на строку «БД» в качестве хоста IntruxDB. Это причина, по которой мы по умолчании имеем хост «БД» в API-коде.
// Create a client towards InfluxDB
let influx = new Influx.InfluxDB({
   host: process.env.INFLUXDB_HOST || "db"
   database: process.env.INFLUXDB_DATABASE || "iot"
});
  • То же самое произошло для Grafana, мы увидим, что когда мы определяем DataSource на основе наводства.

Создайте базу данных

Использование интерфейса администрирования IncoluxDB, доступным на Plocalhost Port 8083, мы создадим базу данных с именем IOT.

local-topuxdb-create-database.png

Запустить симулятор

Начнем симулятор против localhost по порту 1337 (значения по умолчанию)

$ ./simulator.sh

Создать панель инструментов Grafana

Веб-интерфейс Grafana доступен на порту 3000, учетные данные по умолчанию — admin/admin. Первые вещи, которые нам нужно сделать, это создать источник данных. Поскольку NOTUXDB является одним из возможных возможных источников данных Grafana знает, нам просто нужно указать пару параметров:

  • URL URL-хост-приключания (обратите внимание на «дБ» в URL, чтобы нацелить службу БД)
  • Имя базы данных (IOT).
local-grafana-create-datasource.png

После добавления источника данных мы можем создать приборную панель. Чтобы сделать все возможное, мы пойдем с графиком и изменим запрос по умолчанию, чтобы он соответствовал одному на скриншоте ниже:

local-grafana-create-dashboard.png

Когда приборная панель создана, мы видим данные с отображаемой симулятора.

local-grafana-data-samples.png

Распределить изображение с Docker Hub

IOT IOT-API: 2.0 — последняя версия, которую мы создали, и тот, который нам нужно будет распространять, поэтому она может работать в других средах. Для этого мы будем использовать Docker Hub, официальный онлайн-реестр Docker. В основном, реестр — это место, где изображения могут быть сохранены.

Как только мы создали учетную запись в Docker Hub, мы создадим новый репозиторий, названный IOT-API. Мы будем сохранять видимость по умолчанию, чтобы все могли использовать изображения, хранящиеся в этом репозитории.

docker-hub-create-repo.png

Как только репозиторий будет создан, мы готовы подтолкнуть IOT-API: 2.0 в него. Это требует, чтобы изображение было помечено с помощью формата, ожидаемого Docker Hub: Имя пользователя/Репозиторий: Tag Отказ Давайте сделаем это, используя Docker Image Tag команда.

$ docker image tag iot-api:2.0 lucj/iot-api:2.0

Как только изображение будет готово, нам просто нужно войти в командную строку

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (lucj):
Password:
Login Succeeded

А затем нажмите изображение

$ docker push lucj/iot-api:2.0
The push refers to a repository [docker.io/lucj/iot-api]
2bf4fd3a3ace: Pushed
d462833d0039: Pushed
f1031b6334de: Pushed
2b458930d75d: Pushed
8e254b51dfd6: Layer already exists
60ab55d3379d: Layer already exists
2.0: digest: sha256:875971ec33256e551b743fb938d7933c52098b6b9348f5d35abc445c35dc9e06 size: 1577

Если мы проверим на концентратор Docker, мы можем видеть, что изображение теперь присутствует.

docker-hub-check-version.png

Теперь мы сможем легко развернуть все приложение с помощью Docker Compose на любой машине.

Настройка конвейера CI/CD с Docker Cloud

Когда мы создали API, мы указали тест одновременно. В этой части мы настроим среду для автоматизации процесса тестирования и развертывания. Трубопровод, который мы поставим на месте, является следующим:

Cicd-workflow.png.png.png

Когда изменения нажаты на GitHUB, тесты автоматически запускаются. Если они работают нормально, будет создана новая версия изображения API и нажата в докерный концентратор. Затем он перераспределяется на целевой среде через платформу Cloud Docker — мы будем использовать Капелька Digitalocean В этом примере.

Настройка теста на приложение Docker Compose

Теперь, когда у нас есть приложение Docker Compose, мы будем уточнить процесс тестирования немного и использовать файл Docker-Compose.yml, чтобы указать, как необходимо запустить тесты.

db:
  image: influxdb

sut:
  build: .
  command: /bin/sh -c 'curl -i -XPOST http://db:8086/query --data-urlencode "q=CREATE DATABASE iot" && npm test'
  links:
    - db

Две сервисы определены в этом файле:

  • дБ : базовый приток
  • Sut : Служба, которая создает изображение и запускает создание базы данных и команду теста

Примечание: как Curl нет по умолчанию в альпийский Image, мы добавили инструкцию в DockerFile, поэтому он будет установлен, когда мы создаем изображение. Это не большая сделка, потому что Curl действительно свет, и это определенно поможет нам создать базу данных перед запуском тестов.

...
# Install curl
RUN apk add -U curl

# Copy list of server side dependencies
COPY package.json /tmp/package.json
…

Затем тесты могут быть запущены со следующей командой

$ docker-compose -f compose-test.yml build sut
$ docker-compose -f compose-test.yml run sut
HTTP/1.1 200 OK
Connection: close
Content-Type: application/json
Request-Id: a661cdb3-0d59-11e7-8001-000000000000
X-Influxdb-Version: 1.2.1
Date: Mon, 20 Mar 2017 10:40:35 GMT
Transfer-Encoding: chunked

{"results":[{"statement_id":0}]}

> iot@1.0.0 test /app
> mocha test/functional.js

  Creation
info: server listening on port 3000
info:  ts=2017-03-11T15:00:53Z, type=temp, value=34, sensor_id=123
    ✓ should create dummy data (83ms)

  1 passing (99ms)

В принципе, он работает дБ Сначала и постройте и управляет Sut услуга. Когда Sut RAN, базаревная база данных по имени IOT Создан (выдача a curl против API introuxdb) и NPM Test Команда RAN. API будет запущен, и тестовые данные будут отправлены.

Мы провели тесты локально, это работает, и это здорово! С тому вещами мы уже на месте, мы сможем автоматизировать процесс тестирования.

Управлять приложением с Docker Cloud

Docker Cloud — это CAAS (контейнер в качестве обслуживания) платформы, размещенной докером. Это позволяет вам очень легко управлять контейнерными приложениями:

  • Настройка базовой инфраструктуры на нескольких облачных провайдерах
  • Интеграция с GitHub и Bitbucket
  • Настройка цельного CI/CD-трубопровода

Предварительное условие

Нам сначала необходимо использовать меню «Облачные настройки» для подключения Исходный поставщик (наш аккаунт GitHub в этом случае) и A Облачный провайдер (Digitalocean).

Dockercloud-cloud-settings.png

Digitalocean — отличная платформа, которая позволяет легко и быстро и быстро раскручивать виртуальные машины. Это, очевидно, не бесплатно, кроме пары долларов достаточно для нас, чтобы начать и действительно повеселиться.

Создание базовой инфраструктуры

Мы создадим узел, который работает на Digitalocean — это будет использоваться для развертывания приложения.

CICD-Digitalocean-Create-cravlet.png

Мы указали пару вариантов, такие как регион, размер виртуальной машины и тег ( IOT ), который будет использоваться, когда мы разверним приложение позже.

Конфигурация репозитория

В разделе «Репозиторий» нам нужно выбрать IOT-API Репо, мы ранее были созданы в Docker Hub и настроить его так, чтобы:

  • Он запускает тесты на каждом толчке в Github (опция автотестра)
  • Это строит изображение, когда тесты добиваются успеха (опция Autobuild)
  • Это восстанавливает изображение (опция AutoredeePloy)

Авто-тест и Autobuild Опции определены на уровне репозитория, как показано на следующем скриншоте.

Dockercloud-repository-build-settings.png

По умолчанию фаза тестирования будет запускать сервис с именем Sut что мы определили в файле compose-test.yml.

Как мы увидим дальше, Autoredeploy Опция указана на уровне обслуживания.

Создание стека

Docker Cloud не создает приложение непосредственно из файла Docker-Compose.yml — он использует немного другой файл, который мы назвали Compose-Cloud.yml. Этот файл содержит ограниченный набор опций и используется для определения нашего стека (группа услуг).

db:
  image: influxdb
  environment:
    - INFLUXDB_ADMIN_ENABLED=true
  ports:
    - 8086:8086
    - 8083:8083
  restart: on-failure
  tags:
iot
api:
  autoredeploy: true
  image: lucj/iot-api:latest
  command: npm start
  ports:
    - 1337:1337
  restart: on-failure
  tags:
iot
dashboard:
  image: grafana/grafana
  ports:
    - 3000:3000
  restart: on-failure
  tags:
iot

Примечания:

  • Мы указали IOT. Тег, поэтому приложение будет развернуто на узле с этим же тегом. (Помните, мы назначили IOT Тег на машину на цифровой камере мы создали.)
  • autoredeploy Флаг используется, обеспечивая построенное каждое новое изображение после успешных испытаний, перенаправляется на нашем узле.

Затем мы скопируем этот файл в мастере Docker Cloud и используете его, чтобы создать стек ..

DockerCloud-Stack-Creating.png

Когда стек создан, мы видим 3-х служб, работающие и доступные конечные точки, которые позволяют достичь приложения снаружи.

DockerCloud-Stack-Running.png

Конфигурация приложения

Как мы сделали ранее, мы создадим базу данных IOT из интерфейса IncrouxDB.

CICD-INTOUXDB-CREATE-DACUE.PNG

А затем настройте GRAFANA, поэтому он подключается с IncoluxDB и создает простую приборную панель.

Cicd-grafana-datasource-create.png

Очевидно, что нет точки данных, так как симулятор или реальное устройство не отправляют данные на нашу бэкэнду.

Cicd-Grafana-Publy-graph.png

Примечание: На 3 предыдущих скриншотах мы использовали URL-адреса, которые стеки обнажены в качестве конечных точек.

Проверьте наш трубопровод

Давайте изменим что-то в коде нашего приложения, чтобы увидеть различные действия, выполненные в нашем трубопроводе.

  1. Изменения толкнули в Github
Cicd-github-compad.png
  1. CI/CD трубопровод сработал
CICD-Docker-Cloud-Build-1.png
  1. Запуск теста ( Sut ) и нажатие изображения в Docker Hub
CICD-Docker-Cloud-Build-2.png
  1. Новая версия на Docker Hub
Capture d'écran 2017-03-23 À 11.55.43.png

Примечание: Мы могли бы также добавить тег, который соответствует Hithub’s Compate Hash. Это задокументировано в Расширенные варианты Для функций автотестов и автоболитов.

На Docker Cloud Service API автоматически переиграл с новой версией изображения.

CICD-Docker-Cloud-autoredeploy.png

Наше приложение развернуто на узле на цифровой камень. Каждое изменение кода автоматически проверяется и развернут, если тесты успешны. Выглядит хорошо.

  1. Запуск симулятора в нашем приложении

Используя конечную точку, предоставленную API, давайте запустим симулятор.

./simulator.sh -h api.iot.065267a7.svc.dockerapp.io -p 1337

Через пару секунд мы можем проверить, что приборная панель получила несколько точек данных.

Cicd-grafana-образец-data.png

Заключение

Эта длительная статья показывает шаги, которые вы можете предпринять, чтобы начать строительство проекта IOT с нуля, используя некоторые полезные технологии. Этот проект, очевидно, не готово к добыче, но, надеюсь, он может быть использован в качестве отправной точки для демонстрации или личного проекта.

Что дальше?

Следующая статья, посвященная стороне устройства проекта, будет проиллюстрировать, как Raspberry Pi (или другое устройство ARM) может легко собирать реальные данные и отправлять их на нашу бэкэн.

Вы строите проект IoT? Вы находите сообщение полезным? Я бы очень хотел услышать ваши отзывы о всем этом.

Оригинал: «https://www.codementor.io/@lucjuggery824/backend-iot-node-docker-6ehsyg699»