Чёрный пояс 1С. AdminClusterMonitor: открытый проект для админов 1С | infolimp.ru

Чёрный пояс 1С. AdminClusterMonitor: открытый учебный проект для безопасного администрирования кластера 1С на Linux

1 сентября 2026 · infolimp.ru · Чёрный пояс 1С

Разбор проблемы «кластер 1С на заводских настройках» из статьи infostart.ru доведён до рабочего инструмента: открытый учебный проект AdminClusterMonitor - внешняя обработка 1С и набор Linux-скриптов, которые находят «перестарков» (рабочие процессы без активных соединений старше заданного порога), безопасно перезапускают их в режиме dry-run с подтверждением, логируют действия и уведомляют администратора в Telegram или почту. Ниже - архитектура, установка на Ubuntu/CentOS, ключевые фрагменты BSL и bash-кода, тестовые сценарии и чек-лист администратора.

Оглавление:
  1. Контекст: от разбора проблемы к рабочему инструменту
  2. Обзор проекта
  3. Состав пакета
  4. Установка на Linux
  5. Примеры кода
  6. Тестовые сценарии
  7. Чек-лист администратора
  8. Безопасность
  9. Лицензия

Контекст: от разбора проблемы к рабочему инструменту

Статья infostart.ru «Кластер 1С на заводских настройках: норма или мина на боевой базе» точно описывает проблему: кластер 1С живёт на «заводских настройках», а администратор доверяет консоли больше, чем реальному поведению процессов.

Но в исходном виде это - умозрительный разбор без готового инструмента. Ниже - следующий шаг: открытый учебный проект AdminClusterMonitor, который показывает практический, инженерный подход к администрированию описанных в той статье проблем, с реальным кодом и командами для проверки на своём кластере.

Мы подготовили учебный проект AdminClusterMonitor - набор из внешней обработки, скриптов и инструкций, который демонстрирует:

Всё это оформлено как пошаговый учебный проект, который можно изучать, повторять, дорабатывать и развивать вместе с сообществом Infostart.ru.

Обзор учебного проекта AdminClusterMonitor

Цель проекта: показать практическую реализацию мониторинга и безопасного управления процессами кластера 1С, с акцентом на Linux-окружение и воспроизводимые инженерные практики.

Основные задачи:

Формат: учебный проект, который можно:

  • развернуть в тестовой среде;
  • пошагово пройти по инструкции;
  • адаптировать под свои кластеры и инфраструктуру;
  • использовать как основу для собственных инструментов администрирования.

Состав пакета для Infostart

Мы передаём сообществу архив ready_for_infostart.zip, содержащий следующие файлы:

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

Установка и настройка на Linux (Ubuntu/CentOS)

Шаг 1. Подготовка тестовой среды

Рекомендуется сначала развернуть проект в тестовой среде (отдельный сервер или тестовая копия базы), чтобы отработать сценарии без риска для продуктивного кластера.

Шаг 2. Установка файлов проекта

Скопируйте файлы из архива в соответствующие каталоги и выполните скрипт установки:

Bash - install_admincluster.shUTF-8
1#!/bin/bash
2# install_admincluster.sh - пример
3 
4set -e
5mkdir -p /opt/admincluster
6cp AdminClusterMonitor.epf /opt/admincluster/
7cp admincluster_run.sh /opt/admincluster/
8cp admincluster_notify.sh /opt/admincluster/
9chmod +x /opt/admincluster/*.sh
10 
11mkdir -p /etc/admincluster
12cp config.conf.example /etc/admincluster/config.conf
13cp profiles.json.example /etc/admincluster/profiles.json
14 
15chown -R root:root /opt/admincluster /etc/admincluster
16chmod 750 /opt/admincluster
17 
18cp admincluster-monitor@.service /etc/systemd/system/
19cp admincluster-monitor@.timer /etc/systemd/system/
20 
21systemctl daemon-reload
22 
23echo "Установка завершена. Настройте /etc/admincluster/config.conf и profiles.json, затем активируйте таймер."

Шаг 3. Настройка конфигурации

Отредактируйте файл /etc/admincluster/config.conf и задайте параметры уведомлений и путей:

Config - /etc/admincluster/config.confUTF-8
1# /etc/admincluster/config.conf (пример)
2 
3TELEGRAM_BOT_TOKEN="000000:XXXXXXXXXXXXXXXXXXXXXXXX"
4TELEGRAM_CHAT_ID="-1001234567890"
5ALERT_EMAIL="ops@example.com"
6 
7EPF_PATH="/opt/admincluster/AdminClusterMonitor.epf"
8HELPER_PATH="/opt/admincluster"

В файле /etc/admincluster/profiles.json опишите профили кластеров (пример структуры):

JSON - /etc/admincluster/profiles.jsonUTF-8
1{
2  "prod": {
3    "Name": "prod",
4    "RasHost": "127.0.0.1",
5    "RasPort": 1545,
6    "Description": "Продуктивный кластер"
7  },
8  "test": {
9    "Name": "test",
10    "RasHost": "127.0.0.1",
11    "RasPort": 1546,
12    "Description": "Тестовый кластер"
13  }
14}

Шаг 4. Настройка systemd-unit и таймера

Пример systemd-unit для профиля кластера:

Systemd Service - /etc/systemd/system/admincluster-monitor@.serviceUTF-8
1[Unit]
2Description=AdminClusterMonitor service for profile %i
3After=network.target
4 
5[Service]
6Type=simple
7User=1c
8EnvironmentFile=/etc/admincluster/config.conf
9ExecStart=/opt/admincluster/admincluster_run.sh --profile %i
10StandardOutput=syslog
11StandardError=syslog
12SyslogIdentifier=admincluster-monitor-%i
13Restart=on-failure

Пример таймера:

Systemd Timer - /etc/systemd/system/admincluster-monitor@.timerUTF-8
1[Unit]
2Description=Timer for AdminClusterMonitor service for profile %i
3 
4[Timer]
5OnBootSec=2min
6OnUnitActiveSec=1h
7Persistent=true
8 
9[Install]
10WantedBy=timers.target

Активация таймера для профиля prod:

Bash - Активация таймераUTF-8
1sudo systemctl enable --now admincluster-monitor@prod.timer

Шаг 5. Проверка логов и работы

Для проверки работы используйте:

Bash - Просмотр журналаUTF-8
1journalctl -u admincluster-monitor@prod -f

В тестовом режиме можно запустить скрипт напрямую:

Bash - Тестовый запуск dry-runUTF-8
1sudo /opt/admincluster/admincluster_run.sh --profile test --dry-run

Примеры кода и скриптов

Фрагмент BSL-логики внешней обработки

BSL 1C:Enterprise - AdminClusterMonitor.epfUTF-8
1// AdminClusterMonitor.epf - фрагмент логики
2 
3&НаСервере
4Функция ПолучитьСписокПроцессовКластера(Профиль) Экспорт
5    Результат = Новый ТаблицаЗначений;
6    Результат.Колонки.Добавить("IdПроцесса");
7    Результат.Колонки.Добавить("ВремяЗапуска", Новый ОписаниеТипов("Дата"));
8    Результат.Колонки.Добавить("ВозрастМинут", Новый ОписаниеТипов("Число"));
9    Результат.Колонки.Добавить("КолСоединений", Новый ОписаниеТипов("Число"));
10    Результат.Колонки.Добавить("Пользователь");
11    Результат.Колонки.Добавить("База");
12    Результат.Колонки.Добавить("Хост");
13 
14    Попытка
15        // В реальной среде заменить на вызов API ras/ragent или helper-скрипта
16        Процессы = УправлениеКластером.ПолучитьСписокПроцессов(Профиль.RasHost, Профиль.RasPort);
17        Для Каждого П Из Процессы Цикл
18            Стр = Результат.Добавить();
19            Стр.IdПроцесса = П.Идентификатор;
20            Стр.ВремяЗапуска = П.ВремяЗапуска;
21            Стр.ВозрастМинут = Окр(РазностьДат(ТекущаяДата(), П.ВремяЗапуска) * 24 * 60, 0);
22            Стр.КолСоединений = П.КоличествоСоединений;
23            Стр.Пользователь = П.Пользователь;
24            Стр.База = П.ИмяБазы;
25            Стр.Хост = П.Хост;
26        КонецЦикла;
27    Исключение
28        Сообщить("Ошибка при получении списка процессов: " + ОписаниеОшибки());
29    КонецПопытки;
30 
31    Возврат Результат;
32КонецФункции
33 
34&НаКлиенте
35Процедура ВыполнитьПроверкуИУведомить(Профиль)
36    Таб = ПолучитьСписокПроцессовКластера(Профиль);
37    Период = Настройки.ПериодПерезапускаМинут;
38 
39    Результат = Новый ТаблицаЗначений;
40    Результат.Колонки.Добавить("IdПроцесса");
41    Результат.Колонки.Добавить("ВозрастМинут");
42    Результат.Колонки.Добавить("КолСоединений");
43    Результат.Колонки.Добавить("ФлагПерестарок");
44 
45    Для Каждого Стр Из Таб Цикл
46        НовСтр = Результат.Добавить();
47        НовСтр.IdПроцесса = Стр.IdПроцесса;
48        НовСтр.ВозрастМинут = Стр.ВозрастМинут;
49        НовСтр.КолСоединений = Стр.КолСоединений;
50        НовСтр.ФлагПерестарок = (Стр.ВозрастМинут > Период) И (Стр.КолСоединений = 0);
51    КонецЦикла;
52 
53    // Экспорт отчёта и вызов внешнего скрипта уведомлений
54    ПутьЭкспорта = Настройки.ПутьКHelper + "/export_report.csv";
55    // Здесь предполагается вспомогательная процедура формирования CSV
56 
57    Если Результат.Строки.Найти(Новый УсловиеПоКолонке("ФлагПерестарок", Истина)) <> Неопределено Тогда
58        Команда = "/bin/sh " + Настройки.ПутьКHelper + "/admincluster_notify.sh --profile " + Профиль.Имя + " --file " + ПутьЭкспорта;
59        Если Настройки.DryRun Тогда
60            ВыполнитьКоманду(Команда + " --dry-run", Истина);
61        Иначе
62            ВыполнитьКоманду(Команда, Истина);
63        КонецЕсли;
64    КонецЕсли;
65 
66    Сообщить("Проверка завершена для профиля: " + Профиль.Имя);
67КонецПроцедуры

Скрипт запуска проверки - admincluster_run.sh

Bash - admincluster_run.shUTF-8
1#!/bin/bash
2# /opt/admincluster/admincluster_run.sh
3 
4CONFIG="/etc/admincluster/config.conf"
5. "$CONFIG"
6 
7PROFILE=""
8DRYRUN=0
9 
10while [[ $# -gt 0 ]]; do
11  case $1 in
12    --profile) PROFILE="$2"; shift 2;;
13    --dry-run) DRYRUN=1; shift;;
14    *) shift;;
15  esac
16done
17 
18LOG_TAG="admincluster-monitor"
19 
20if [[ -z "$PROFILE" ]]; then
21  echo "Не указан профиль (--profile NAME)" >&2
22  exit 1
23fi
24 
25CMD="/usr/bin/1cv8 -run $EPF_PATH --profile $PROFILE"
26if [[ $DRYRUN -eq 1 ]]; then
27  CMD="$CMD --dry-run"
28fi
29 
30logger -t $LOG_TAG "Запуск проверки профиля $PROFILE (dryrun=${DRYRUN})"
31$CMD 2>&1 | logger -t $LOG_TAG

Скрипт уведомлений - admincluster_notify.sh

Bash - admincluster_notify.shUTF-8
1#!/bin/bash
2# /opt/admincluster/admincluster_notify.sh
3 
4CONFIG="/etc/admincluster/config.conf"
5. "$CONFIG"
6 
7DRYRUN=0
8FILE=""
9PROFILE=""
10 
11while [[ $# -gt 0 ]]; do
12  case $1 in
13    --file) FILE="$2"; shift 2;;
14    --profile) PROFILE="$2"; shift 2;;
15    --dry-run) DRYRUN=1; shift;;
16    *) shift;;
17  esac
18done
19 
20SUBJECT="AdminClusterMonitor: обнаружены 'перестарки' в $PROFILE"
21BODY="В профиле $PROFILE обнаружены процессы-перестарки. Отчёт: $FILE"
22 
23if [[ $DRYRUN -eq 1 ]]; then
24  logger -t admincluster-monitor "DRYRUN: $SUBJECT - $BODY"
25  echo "DRYRUN: уведомление не отправлено"
26  exit 0
27fi
28 
29# Telegram
30if [[ -n "$TELEGRAM_BOT_TOKEN" && -n "$TELEGRAM_CHAT_ID" ]]; then
31  curl -s -X POST "https://api.telegram.org/bot${{TELEGRAM_BOT_TOKEN}}/sendMessage" \
32    -d chat_id="${{TELEGRAM_CHAT_ID}}" \
33    -d text="${{SUBJECT}}\n${{BODY}}" >/dev/null 2>&1
34fi
35 
36# Почта
37if [[ -n "$ALERT_EMAIL" ]]; then
38  echo -e "$BODY" | mail -s "$SUBJECT" "$ALERT_EMAIL"
39fi
40 
41logger -t admincluster-monitor "Уведомление отправлено для профиля $PROFILE"

Тестовые сценарии и учебные задания

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

Сценарий 1. Базовая проверка «перестарков»

Сценарий 2. Процесс с соединениями

Сценарий 3. Уведомления

Сценарий 4. Автоматизация через systemd

Чек-лист администратора

Безопасность и работа с секретами

В проекте используются учётные данные для доступа к кластеру и для отправки уведомлений. Рекомендуется:

Лицензия и приглашение к доработке

Проект предлагается сообществу Infostart под свободной лицензией (MIT-подобной), допускающей:

Проект открыт для доработки сообществом:


Полный код проекта - в открытом репозитории github.com/NickScherbakov/infostart-gift, лицензия MIT-подобная, свободна для доработки.