Этот пост является продолжением поста о развертывании платформы «Конфидент», опубликованного на Хабре
В предыдущем посте мы развернули 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
Каково же было мое удивление, когда в ответ я получил целый список:
Наша проблема кроется в последнем пункте. Удаляем этот том:
docker volume rm demo-platform_node-dbdata
В ответ в Terminal получаем имя тома — это значит, что все прошло хорошо. Таким же образом подставляем другие имена томов, на всякий случай тоже удаляем их и снова поднимаем блокчейн:
docker-compose up -d
Теперь полезным будет посмотреть список и статус всех активных контейнеров:
docker-compose ps
Вот что получилось у меня:
Проверяем localhost — работает. Заходим в Grafana и любуемся ровным графиком высоты:
Ура, мне удается повторить идеальный график в конце предыдущего поста. Цветные графики каждой ноды синхронно растут; их можно переключить справа от графика. Прекрасная стабильность, в дальнейшем точно продолжу работать с блокчейном на M1 Pro.
Чувствительность к регистру в Grafana
Эта проблема не возникла у меня в прошлом посте, но в этот раз, при повторном деплое, я с ней столкнулся. Неожиданно оказалось, что параметры в Grafana чувствительны к регистру, и проблема эта, судя по запросу «grafana datasource case sensitive», имеет большую историю:
К счастью, параметров в Grafana у нас пока немного, и отследить нужный удалось быстро. Заходим в Connections — Data Sources и видим его в первой строчке Name:
Это имя должно полностью совпадать с тем, что прописано в json-файле дэшборда, с учетом прописных и строчных букв. Чтобы проверить это, нажимаем кнопку с шестеренкой (Dashboard settings) над нашими графиками, переходим в JSON model и через Cmd+F ищем InfluxDB:
Результатов будет много, встретится и 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 будет скачивать новый образ, поэтому придется подождать чуть дольше:
Переезжаем на 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:
Посмотрим, что в источниках данных Grafana:
Возможно, у вас здесь будет не один актуальный источник данных (в нашем случае web3), а еще и несколько других, уже устаревших. Откройте каждый из них и нажмите Delete внизу страницы, не будем хранить ненужное.
Теперь переходим в Dashboards и открываем WE Nodes Test.
Выглядит круче, чем наш предыдущий дэшборд, правда? На скриншот поместилась лишь небольшая часть. На «спидометре» сверху демонстрируется среднее число транзакций на node-0 в разные периоды — это пригодится нам, когда мы будем делать более сложные проекты. Второй график — это высота блокчейна, он уже был в начале поста.
Третий график — это распределение ролей по нашим трем нодам (0, 1, 2). Желтая точка означает, что нода в данном раунде майнит, а зеленая — что просто принимает блок. В соответствии с консенсусом PoA, прописанным в конфигах, ноды майнят блоки по очереди.
Подведем итоги
Мы мигрировали на Apple Silicon, рассмотрели несколько потенциальных проблем и накатили мониторинг на основе Grafana, Flux и Telegraf. Наша блокчейн-сеть работает стабильно и имеет всё необходимое для развертывания и мониторинга демопроектов. К ним мы и перейдем в будущих постах.
