Блог

Развертываем платформу «Конфидент» на M1 Pro, решаем конфликты с прошлыми деплоями и переезжаем на Flux с InfluxQL

Этот пост является продолжением поста о развертывании платформы «Конфидент», опубликованного на Хабре

В предыдущем посте мы развернули open-source версию платформы «Конфидент» на макбуке с процессором Intel. Сегодня, как тогда и обещал, я повторю ту же самую конфигурацию на макбуке с Apple Silicon. По пути расскажу о возможных сопутствующих проблемах и командах, которые позволяют начисто стереть следы от неудачных попыток развертывания и тем самым избежать возможных проблем с ними. А в конце поста мы переедем на новый дэшборд для мониторинга!

Работа в терминале на маке с Intel была предсказуема, но на M1 Pro при попытке поднять блокчейн меня встретили многочисленные сообщения:

The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

Я подумал, что это может быть важной ошибкой, посуетился на StackOverflow, попытался прописать какие-то конкретные версии образов, похимичил с docker-compose. Так прошло несколько весьма беспорядочных попыток деплоя, после которых я все-таки понял, что платформа вполне себе развертывается, несмотря на эти предупреждения. с самого старта.

Хорошо, открываю браузер, вбиваю localhost, вижу локальный веб-клиент сети. Создаю учетную запись и уже жду, как на моих глазах равномерно будет расти число блоков. Но вместо этого не происходит ничего, сервис не пускает меня дальше окна логина. Ладно, пересоздам всё заново. Что для этого надо сделать? Остановить блокчейн, удалить всё содержимое папки проекта demo-platform, перезапустить Docker… вроде ничего не забыл.

Увы, ситуация повторилась. Что еще интереснее, localhost откуда-то знает об учетках, которые я регистрировал в прошлых попытках, будто бы где-то все еще крутятся данные после неудачных попыток. Время звать девопсов (привет, Алик).

Удаляем тома Docker вручную

Для перезапуска я погасил блокчейн через docker-compose down и удалил все файлы из рабочей папки. Посмотрим теперь, остались ли у нас активные тома, через команду

docker volume ls

Каково же было мое удивление, когда в ответ я получил целый список:

image11.png

Наша проблема кроется в последнем пункте. Удаляем этот том:

docker volume rm demo-platform_node-dbdata

В ответ в Terminal получаем имя тома — это значит, что все прошло хорошо. Таким же образом подставляем другие имена томов, на всякий случай тоже удаляем их и снова поднимаем блокчейн:

docker-compose up -d

Теперь полезным будет посмотреть список и статус всех активных контейнеров:

docker-compose ps

Вот что получилось у меня:

image4.png

Проверяем localhost — работает. Заходим в Grafana и любуемся ровным графиком высоты:

image2.png

Ура, мне удается повторить идеальный график в конце предыдущего поста. Цветные графики каждой ноды синхронно растут; их можно переключить справа от графика. Прекрасная стабильность, в дальнейшем точно продолжу работать с блокчейном на M1 Pro.

Чувствительность к регистру в Grafana

Эта проблема не возникла у меня в прошлом посте, но в этот раз, при повторном деплое, я с ней столкнулся. Неожиданно оказалось, что параметры в Grafana чувствительны к регистру, и проблема эта, судя по запросу «grafana datasource case sensitive», имеет большую историю:

image9.png

К счастью, параметров в Grafana у нас пока немного, и отследить нужный удалось быстро. Заходим в Connections — Data Sources и видим его в первой строчке Name:

image10.png

Это имя должно полностью совпадать с тем, что прописано в json-файле дэшборда, с учетом прописных и строчных букв. Чтобы проверить это, нажимаем кнопку с шестеренкой (Dashboard settings) над нашими графиками, переходим в JSON model и через Cmd+F ищем InfluxDB:

image1.png

Результатов будет много, встретится и InfluxDB, и influxdb. Но во всех строчках с uid будет именно первый вариант. В модели, которую мы используем, с этим проблем нет, так что если вы не проигнорировали регистр в поле Name дэшборда, всё должно работать исправно.

Потенциальная проблема с Angular

Возможно, вы обратили внимание, что над дэшбордом Grafana рядом с заголовком Height у нас появляется восклицательный знак. Связано это с тем, что Grafana вот-вот перестанет поддерживать Angular. Подробней об этом можно почитать на сайте платформы. Отказ от поддержки заявлен с версии 11, и нам с 10.4.1, возможно, ничего не грозит. Но на всякий случай можно перестраховаться и пересесть на более старую версию.

Сделать это несложно, идем в docker-compose.yml и прописываем другую версию образа в разделе grafana. Я остановился на 9.5.8:

image: grafana/grafana:9.5.8

Теперь возвращаемся в Терминал, гасим сеть через docker-compose down и поднимаем через docker-compose up -d. Grafana будет скачивать новый образ, поэтому придется подождать чуть дольше:

image5.png

Переезжаем на Flux

К этому моменту для мониторинга мы все время использовали InfluxQL как язык запроса и анализа данных. Но сейчас InfluxQL в рамках Grafana уже имеет статус deprecated (устаревший), а в общедоступных дэшбордах (имеющих статус public) пользоваться им вообще нельзя. Подробней о сравнении InfluxQL и Flux можно почитать в блоге Flux.

Сегодня для мониторинга нод «Конфидента» используется Flux в связке с плагином Telegraf. Развернем так и в нашей маленькой сети.

Редактируем docker-compose

Для начала нужно отредактировать docker-compose, наш основной файл. Добавим три новых переменных под заголовком environment, там, где у нас сейчас GF_SECURITY_ADMIN_USER и GF_SECURITY_ADMIN_PASSWORD:

- DOCKER_INFLUXDB_INIT_ORG=web3

- DOCKER_INFLUXDB_INIT_BUCKET=web3

- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=a_secure_admin_token

Далее добавим ссылки на готовый дэшборд и data source, который подтянется при деплое Grafana. Мы создадим их чуть позже. Очень удобно, нужно лишь вставить две строки в volumes, под — grafana:/var/lib/grafana:

- ./grafana/datasources/:/etc/grafana/provisioning/datasources/:rw"

- ./grafana/dashboards/:/etc/grafana/provisioning/dashboards/:rw"

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

depends_on:

  - influxdb

Обязательно вставляйте на одном уровне с environments и volume, иначе будет ошибка при деплое.

Теперь нужно дополнить раздел environment внутри influxdb. Замените его содержимое на:

- DOCKER_INFLUXDB_INIT_MODE=setup

- DOCKER_INFLUXDB_INIT_USERNAME=admin

- DOCKER_INFLUXDB_INIT_PASSWORD=passpassweb3

- DOCKER_INFLUXDB_INIT_ORG=web3

- DOCKER_INFLUXDB_INIT_BUCKET=web3

- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=a_secure_admin_token

Три последних значения должны совпадать с аналогичными в разделе grafana. Наконец, добавим в конфигурацию плагин Telegraf, о котором я упоминал в начале раздела. На уровне с grafana и influxdb:

telegraf:

  image: telegraf:1.30.1

  hostname: telegraf

  container_name: telegraf

  networks:

    - w3-network

  volumes:

    - ./telegraf.conf:/etc/telegraf/telegraf.conf:ro

  depends_on:

    - influxdb

  links:

    - influxdb

Редактируем конфигурации нод

У нас есть три ноды, у каждой из которых есть конфигурационный файл node.conf в папке configs/nodes/node-0 (и, соответственно, node-1 и node-2). В каждом из трех файлов нужно сделать два изменения.

  • В секции kamon { поменять порт 8125 на 8086.
  • В секции metrics { поменять uri = «http://influxdb:8086» на uri = «http://telegraf:8086», чтобы данные корректно передавались в наш новый сервис.

Добавляем конфигурацию Telegraf

В корневой папке вашего проекта создаем файл telegraf.conf (аналогично node.conf) и копируем в него настройки нашего сервиса:

[agent]

interval = "10s"

round_interval = true

metric_batch_size = 1000

metric_buffer_limit = 10000

collection_jitter = "0s"

flush_interval = "10s"

flush_jitter = "0s"

precision = ""

debug = false

quiet = false

logfile = ""

hostname = ""

omit_hostname = false

[[outputs.influxdb_v2]]

urls = ["http://influxdb:8086"]

token = "a_secure_admin_token"

organization = "web3"

bucket = "web3"

[[inputs.influxdb_listener]]

service_address = "0.0.0.0:8086"

Прописываем источник данных и дэшборд для Grafana

Чтобы не ковыряться в веб-интерфейсе Grafana, пропишем в ней все нужное заранее. В корневой папке проекта создаем папку Grafana, в ней папку datasources и пустой файл influxdb.yaml. В файле прописываем источник данных в соответствии с требованиями Flux:

apiVersion: 1

datasources:

   - name: web3

    type: influxdb

    access: proxy

    url: http://influxdb:8086

    jsonData:

      version: Flux

      organization: web3

      defaultBucket: web3

    secureJsonData:

      token: a_secure_admin_token

    editable: true

На всякий случай: пустые файлы создаются именно в IDE, не в блокноте или, того хуже, в MS Word. Для быстроты можно продублировать файл node.conf, открыть в IDE, заменить содержимое, сохранить и переименовать новый файл.

Теперь к дэшборду. Там же в папке grafana создаем папку dashboards, в ней — пустой файл dashboards.yml. В нем добавляем:

apiVersion: 1

providers:

  - name: 'dashboards'

    type: file

    disableDeletion: true

    updateIntervalSeconds: 60

    allowUiUpdates: true

    options:

      path: /etc/grafana/provisioning/dashboards

      foldersFromFilesStructure: true

На том же уровне создаем файл самого дэшборда, blockchain.json. Просто скачайте этот файл и вставьте в папку dashboards. Создан он по образу и подобию боевых дэшбордов сети «Конфидент». Далеко не все графики пригодятся в рамках нашего цикла постов, но с помощью веб-интерфейса Grafana мы сможем удалить ненужные блоки.

Стартуем блокчейн

Как и раньше, запускаем Терминал из рабочей папки и поднимаем все командой docker-compose up -d. В случае успеха у нас должны взлететь три ноды в обвязке из девяти сервисов. Список запущенных контейнеров доступен по команде docker-compose ps:

image4.png

Посмотрим, что в источниках данных Grafana:

image6.png

Возможно, у вас здесь будет не один актуальный источник данных (в нашем случае web3), а еще и несколько других, уже устаревших. Откройте каждый из них и нажмите Delete внизу страницы, не будем хранить ненужное.

Теперь переходим в Dashboards и открываем WE Nodes Test.

image8.png

Выглядит круче, чем наш предыдущий дэшборд, правда? На скриншот поместилась лишь небольшая часть. На «спидометре» сверху демонстрируется среднее число транзакций на node-0 в разные периоды — это пригодится нам, когда мы будем делать более сложные проекты. Второй график — это высота блокчейна, он уже был в начале поста.

Третий график — это распределение ролей по нашим трем нодам (0, 1, 2). Желтая точка означает, что нода в данном раунде майнит, а зеленая — что просто принимает блок. В соответствии с консенсусом PoA, прописанным в конфигах, ноды майнят блоки по очереди.

Подведем итоги

Мы мигрировали на Apple Silicon, рассмотрели несколько потенциальных проблем и накатили мониторинг на основе Grafana, Flux и Telegraf. Наша блокчейн-сеть работает стабильно и имеет всё необходимое для развертывания и мониторинга демопроектов. К ним мы и перейдем в будущих постах.