Skip to content

About

Инвентаризация кластеров 1С:Предприятие 8.3, инспекция серверов MS SQL Server и PostgreSQL (пути, размеры, роли), аудит групп Active Directory (LDAP), синхронизация с Atlassian Confluence и Kestrel Web Dashboard на .NET 10 / C# 14.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

1С: Get Databases

Version .NET 10 C# 14 Platform License: MIT

Служба Windows с веб-интерфейсом для учёта информационных баз 1С:Предприятие 8.3. Собирает базы со всех кластеров 1С, показывает, где лежат их базы данных на MS SQL Server и PostgreSQL, какие группы Active Directory дают к ним доступ и где они опубликованы на IIS. Публикует сводные таблицы в Confluence и умеет восстанавливать DEV-базы из архива бэкапов.


Что делает

  • Находит кластеры 1С на серверах через WMI (службы ragent и ras), а если WMI недоступен, то по открытым TCP-портам.
  • Опрашивает кластеры через rac.exe: список баз, версия платформы, сервер и имя базы в СУБД.
  • Подключается к СУБД и показывает файлы данных и журналов, их размеры и пути, модель восстановления, пользователей.
  • Сопоставляет базу с группами AD (rdp_1c_*, 1cbases*), показывает участников групп и позволяет добавлять и удалять их.
  • Находит веб-публикации баз на IIS и выводит ссылки на них.
  • Раз в сутки публикует таблицы DEV, PROD и SA_INFO в Confluence; при ошибке присылает письмо.
  • Даёт скрытые консоли: управление службами 1С, журнал аудита, восстановление DEV-баз из архива бэкапов.

Состав решения

OneSGetDatabases/
├── src/
│   ├── OneSGetDatabases.Core/      # опрос кластеров, rac/RAS, СУБД, AD, IIS, Confluence, восстановление, кэш
│   └── OneSGetDatabases.Web/       # ASP.NET Core API + веб-интерфейс + служба Windows (порт 5070)
├── tests/
│   └── OneSGetDatabases.Tests/     # xUnit, FluentAssertions, Moq
├── build.ps1                       # сборка, тесты, публикация в publish\Web
├── Directory.Build.props           # версия и общие настройки сборки
└── LICENSE
  • .NET 10, C# 14, асинхронный код без блокирующих вызовов.
  • ASP.NET Core (контроллеры) на Kestrel, запуск как служба Windows OneSGetDatabasesWeb.
  • Веб-интерфейс на чистом JavaScript и CSS, без сборщиков.
  • СУБД: Microsoft.Data.SqlClient, Npgsql. AD: System.DirectoryServices. WMI: System.Management.
  • Кэш баз, групп AD и состояния кластеров хранится в памяти и в каталоге cache рядом со службой, поэтому после перезапуска данные доступны сразу, до окончания нового опроса.

Возможности

Опрос кластеров 1С

  • Список серверов задаётся в ClusterDiscovery:Servers, кластеры и порты RAS на них находятся автоматически.
  • Запросы к rac.exe выполняются параллельно. Если RAS отвечает медленно, запрос повторяется с удвоенным таймаутом.
  • Авторизация подбирается автоматически: без учётной записи, с администратором кластера (--cluster-user), с администратором центрального сервера (--agent-user).
  • Если rac отказал, кластер помечается как «Ошибка» или «Ошибка авторизации» с текстом ответа rac, а не как пустой. Причина видна в окне «Кластеры → Диагностика» и в логе службы.
  • WMI-запрос к хосту ограничен по времени (ClusterDiscovery:WmiQueryTimeoutSeconds), поэтому один медленный сервер не задерживает весь опрос.
  • Если опрос вернул 0 баз, а в кэше они есть, кэш не перезаписывается: пустой результат почти всегда означает ошибку конфигурации или сети.

Веб-публикации на IIS

  • При опросе служба читает applicationHost.config на серверах кластеров (и на IisPublications:ExtraHosts) и default.vrd каждого приложения IIS через административную шару C$.
  • Публикация связывается с базой по строке подключения из default.vrd: имени базы (Ref) и серверу кластера (Srvr).
  • Показывается только основная публикация: её имя совпадает с именем базы, регистр не важен. Служебные публикации той же базы (/<база>_, /<база>_Web, публикации под другим именем) не выводятся.
  • Публикация учитывается, только если сайт IIS стоит на сервере кластера базы или на сервере, куда указывает сервис Consul базы. Копии публикации на других серверах не выводятся, даже если default.vrd ссылается на эту базу.
  • На каждую базу выводится одна публикация. Если база опубликована на нескольких серверах, приоритет у адреса через Consul (*.service.consul), затем у публикации с точным совпадением регистра имени.
  • Если у базы есть сервис Consul (app-<база>.service.consul) и он указывает на тот же сервер, что и публикация, ссылка строится через имя Consul с теми же схемой, портом и путём. Это правило важнее IisPublications:BaseUrls. Имя сервиса с _ или другими недопустимыми для DNS символами (например, app-UTD_Test) не используется: Consul не отдаёт такие имена по DNS, и ссылка строится по BaseUrls или привязке IIS.
  • Иначе адрес берётся из IisPublications:BaseUrls (например, http://app-dev.service.consul/<база>), а без настройки — из привязки сайта IIS. Публикации с собственным заголовком узла в привязке IIS не переписываются.
  • В таблице «Информационные базы» колонка «Публикация» показывает полный адрес вместе с http://. В узкой колонке адрес переносится перед точками имени сервера и перед /; по дефису внутри имени сервера перенос не делается.
  • Ширины колонок, заданные мышью на широком экране, на узком окне уменьшаются пропорционально, чтобы остальные колонки не сжимались. Сохранённые значения при этом не меняются.

СУБД

  • MS SQL Server и PostgreSQL: размеры и физические пути файлов данных и журналов.
  • Модель восстановления, уровень совместимости, состояние базы, пользователи и роли.
  • Вкладка «Файлы и размеры СУБД» с выгрузкой в Excel и JSON.
  • Сервер СУБД показывается именем машины. Если в кластере указан сервис Consul (sql-1c-ERP.service.consul), имя берётся из поля Address этого сервиса в Consul. Если указан DNS-алиас, берётся каноническое имя из DNS. Экземпляр и порт (\INST, ,1433) сохраняются. Исходное имя видно в подсказке, по нему же идёт подключение к СУБД. Если имя машины найти не удалось, выводится имя из кластера.

Active Directory

  • Группа доступа базы определяется по имени (rdp_1c_<база>, 1cbases83_<база> и похожие варианты).
  • Окно группы показывает участников: ФИО, логин, должность, отдел, e-mail, состояние учётной записи. Вложенные группы не выводятся.
  • В группах из ActiveDirectory:ManageableGroupPatterns можно искать пользователей AD, добавлять и удалять участников. Каждое изменение пишется в журнал аудита (AD_ADD_MEMBER, AD_REMOVE_MEMBER).

Confluence

  • Страницы DEV, PROD и SA_INFO обновляются по расписанию (Scheduler:ConfluenceSyncTime).
  • Пока кэш баз пуст, публикация не выполняется, чтобы не записать в Confluence пустые таблицы.
  • При ошибке публикации отправляется письмо на адрес из Email:Recipient.

Веб-интерфейс

  • Таблицы информационных баз и файлов СУБД: поиск, фильтры по среде, кластеру, серверу СУБД и платформе, сортировка. Таблицы помещаются по ширине экрана, длинные значения обрезаются, полный текст виден в подсказке.
  • Ширина колонки меняется перетаскиванием разделителя в заголовке: во время перетаскивания видны направляющая линия и ширина в пикселях. Двойной щелчок по разделителю возвращает исходную ширину. Ширины сохраняются в браузере.
  • Выбор строк флажками или кликом; выбранные строки можно скопировать в буфер (TSV) или выгрузить в Excel и JSON.
  • При наведении на ячейку подсвечиваются ячейки с тем же значением в этой колонке, например все базы на той же версии платформы.
  • Текст в таблицах и полях можно выделять и копировать: пока есть выделение, таблицы не перерисовываются.
  • Окно «Кластеры» с состоянием каждого кластера и логом опроса.

Скрытые консоли

Открываются сочетанием Ctrl + Alt + клик и видны только в текущей вкладке браузера.

Консоль Где кликнуть Что даёт
Управление службами 1С по заголовку «1С: Get Databases» состояние служб ragent и ras; старт, стоп, перезапуск, перезапуск с очисткой сеансового кэша (snccntx*)
Журнал аудита по плашке версии внизу справа кто, когда и что сделал: IP и имя компьютера, объект, действие, результат, длительность
Восстановление баз по счётчику «Показано …» внизу слева восстановление DEV-баз из архива бэкапов SQL Server

Управление службами 1С

  • У каждой строки четыре кнопки: старт, стоп, перезапуск, перезапуск с очисткой кэша. Недоступные в текущем состоянии кнопки выключены. Каждое действие требует подтверждения.
  • Во время операции в строке показывается прогресс, остальные службы можно запускать и останавливать параллельно. Над одной службой одновременно выполняется только одна операция.
  • Браузер передаёт только сервер, имя службы и действие. Порт кластера, служба RAS и каталог кластера берутся из опроса. Если служба в опросе не найдена, операция отклоняется.
  • Остановка затрагивает RAS, агент и его процессы rphost/rmngr. Какие процессы относятся к кластеру, определяется по родительскому агенту, каталогу кластера или порту.
  • У операции собственный таймаут: 3 минуты, закрытая вкладка её не прерывает. Если служба остановилась, запуск выполняется в любом случае, даже при сбое очистки или истёкшем таймауте.
  • Кэш очищается через административную шару: удаляются папки snccntx*. Если шара недоступна, используется WMI (cmd.exe на сервере), результат в этом случае не проверяется. Каталог с запрещёнными символами или путь к корню диска отклоняется.
  • Если у нескольких агентов на сервере общий каталог srvinfo, очищается только папка reg_<порт+1> своего кластера.
  • Все действия и их результат пишутся в журнал аудита. X-Forwarded-For учитывается только от локального обратного прокси.

Восстановление DEV-баз

  • Источник выбирается из архива SqlRestore:BackupArchiveRoot (<сервер>\<база>\…, до 3 уровней вложенности, в том числе раскладка FULL/DIFF/LOG). Каталоги без файлов бэкапа в списке не показываются, есть поиск по имени базы и сервера.
  • Точка восстановления выбирается в календаре. Перед запуском окно показывает план: какой полный, разностный бэкап и сколько журналов будет применено.
  • Цепочка FULL → DIFF → LOG проверяется по LSN из RESTORE HEADERONLY, учитываются полные бэкапы с COPY_ONLY и stripe-наборы из нескольких файлов.
  • Перед восстановлением база переводится в OFFLINE, чтобы рабочие процессы 1С не заняли подключение.
  • После восстановления возвращаются владелец базы, пользователи и их роли; при необходимости база переводится в модель Simple со сжатием журнала.
  • До изменения базы включается блокировка регламентных заданий 1С через rac infobase update. Если включить её не удалось, восстановление не начинается.
  • Разрешены только серверы из SqlRestore:AllowedTargetServers без prod в имени. Базы из SqlRestore:ExcludedDatabases недоступны ни как источник, ни как цель.
  • В журнал аудита записывается короткая сводка: источник, цепочка бэкапов (журналы сворачиваются в «Log ×N» с первым и последним временем), число файлов, длительность и пользователи, которым вернули права. Первые десять имён выводятся полностью, дальше «и ещё N». Остальные предупреждения: не больше трёх, каждое до 150 символов. Полный список предупреждений и пользователи без логина на сервере пишутся в лог службы.

Быстрый старт

Требования

  • Windows Server 2016 и новее или Windows 10/11 x64.
  • .NET 10 Runtime / Hosting Bundle.
  • Платформа 1С:Предприятие 8.3 на сервере службы (нужен rac.exe).

Сборка

.\build.ps1

Скрипт восстанавливает пакеты, собирает решение, запускает тесты и публикует службу в publish\Web. Локальные каталоги cache и logs из папки публикации удаляются, чтобы при выкладке не затереть кэш на сервере.

Конфигурация (appsettings.json)

{
  "Kestrel": {
    "Endpoints": {
      "Http": { "Url": "http://*:5070" }
    }
  },
  "Scheduler": {
    "DiscoveryIntervalMinutes": 30,
    "EnableAutoSyncConfluence": true,
    "ConfluenceSyncTime": "04:00",
    "ConfluenceSyncIntervalHours": 24
  },
  "Rac": {
    "RacPath": "C:\\Program Files\\1cv8\\8.3.25.1445\\bin\\rac.exe",
    "TimeoutSeconds": 30,
    "MaxConcurrency": 16
  },
  "ActiveDirectory": {
    "Domain": "example.corp",
    "Username": "svc_1c_inventory",
    "Password": "YourSecureAdPassword123!",
    "GroupFilters": [ "rdp_1c_*", "1cbases_*" ],
    "ManageableGroupPatterns": [ "rdp_1c_*", "1cbases*" ],
    "V8iBasePath": "\\\\fileserver.example.corp\\1c_bases"
  },
  "Dbms": {
    "DefaultSqlUsername": "monitoring_user",
    "DefaultSqlPassword": "YourSecureDbmsPassword123!",
    "DefaultPgUsername": "monitoring_user",
    "DefaultPgPassword": "YourSecureDbmsPassword123!",
    "ConnectionTimeoutSeconds": 8
  },
  "Confluence": {
    "BaseUrl": "https://confluence.example.com",
    "BearerToken": "YOUR_CONFLUENCE_API_TOKEN_HERE",
    "PageIdDev": "10000001",
    "PageIdProd": "10000002",
    "PageIdSaInfo": "10000003"
  },
  "ClusterDiscovery": {
    "Enabled": true,
    "DefaultClusterUser": "admin_1c",
    "DefaultClusterPassword": "YourClusterPassword123!",
    "WmiQueryTimeoutSeconds": 30,
    "Servers": [
      { "Host": "app-dev01.example.corp", "Environment": "DEV" },
      { "Host": "app-prod01.example.corp", "Environment": "PROD" }
    ]
  },
  "SqlRestore": {
    "BackupArchiveRoot": "\\\\backup_sql\\sql_archive$",
    "AllowedTargetServers": [ "dev-s-sql01", "dev-s-sql02" ],
    "AllowedDomainSuffixes": [ "example.corp" ],
    "DefaultRestoreUsername": "sql_restore",
    "DefaultRestorePassword": "YourDevSqlRestorePassword123!",
    "ExcludedCatalogs": [ "PROD-OLAP" ],
    "ExcludedDatabases": [ "master", "model", "msdb", "tempdb", "ReportServer*", "test_base", "Archive_*" ],
    "InfobaseAdminCredentials": [
      { "Username": "infobase_admin", "Password": "YourInfobaseAdminPassword123!" }
    ]
  },
  "IisPublications": {
    "Enabled": true,
    "ExtraHosts": [],
    "BaseUrls": {
      "app-dev01.example.corp": "http://app-dev.service.consul"
    },
    "TimeoutSecondsPerHost": 60
  },
  "AuditLog": {
    "RetentionDays": 14,
    "MaxLogSizeBytes": 1073741824,
    "LogFilePath": "logs/audit.jsonl"
  },
  "Clusters": []
}

Параметры, которые легко пропустить:

  • Rac:TimeoutSeconds — таймаут одного вызова rac.exe. После таймаута делается один повтор с удвоенным временем.
  • ClusterDiscovery:WmiQueryTimeoutSeconds ограничивает WMI-запрос к одному хосту. Не ответивший хост опрашивается через TCP-порты.
  • ActiveDirectory:ManageableGroupPatterns — маски групп, состав которых можно менять из интерфейса. Учётной записи из ActiveDirectory:Username (или учётной записи службы) нужно право на изменение членства в этих группах.
  • SqlRestore:AllowedDomainSuffixes — домены, в которых FQDN сервера из AllowedTargetServers считается тем же сервером. Имена в других доменах отклоняются.
  • SqlRestore:ExcludedDatabases и ExcludedCatalogs — имена целиком (без учёта регистра) или маски с * и ?. ITIL исключает только базу ITIL, а ITIL* — все базы, начинающиеся с ITIL.
  • SqlRestore:InfobaseAdminCredentials — администраторы информационных баз 1С для блокировки регламентных заданий. Пробуются по порядку, последним пробуется администратор кластера. Поле EncryptedPassword принимается как синоним Password, но значение не шифруется.
  • IisPublications:BaseUrls — внешний адрес публикаций для каждого сервера IIS. ExtraHosts — серверы IIS, на которых нет кластеров 1С.

Установка службы

PowerShell от имени администратора:

cd .\publish\Web
.\INSTALL_SERVICE.ps1 -Start

Создаётся служба OneSGetDatabasesWeb с автозапуском и перезапуском при сбое. Веб-интерфейс: http://<сервер>:5070, Swagger: http://<сервер>:5070/swagger.

Обновление

  1. Остановите службу OneSGetDatabasesWeb.
  2. Скопируйте содержимое publish\Web в каталог службы. Каталоги cache и logs на сервере не заменяйте. Если appsettings.json на сервере свой, перенесите в него новые ключи вместо замены файла.
  3. Запустите службу и обновите страницу с Ctrl + F5.

API

Метод Путь Назначение
GET /api/databases, /api/databases/files, /api/databases/stats базы, файлы СУБД, сводка
GET /api/databases/clusters/health, /api/databases/clusters/logs состояние кластеров и лог опроса
GET /api/export/excel, /api/export/json выгрузка
GET /api/activedirectory/group/{группа}/members участники группы AD
POST, DELETE /api/activedirectory/group/{группа}/members[/{логин}] добавить или удалить участника
GET /api/restore/sources, /timeline, /plan, /diagnose архив бэкапов, точки и план восстановления
POST /api/restore/start запуск восстановления
POST /api/services/action старт, стоп, перезапуск служб 1С
GET /health проверка работоспособности

Полный список с параметрами — в Swagger.


Права и безопасность

  • Веб-интерфейс и API работают без аутентификации. Изменение групп AD, управление службами 1С и восстановление баз доступны любому, кто открыл порт 5070. Ограничьте доступ к порту брандмауэром или обратным прокси с аутентификацией. Журнал аудита записывает IP клиента, но заголовок X-Forwarded-For клиент может подменить.
  • Серверы 1С. Учётной записи службы нужны права локального администратора на серверах из ClusterDiscovery:Servers: WMI для поиска и управления службами, административная шара C$ для чтения конфигурации IIS.
  • SQL Server, инспекция. Достаточно VIEW ANY DATABASE, VIEW SERVER STATE, VIEW ANY DEFINITION и CONNECT ANY DATABASE.
  • SQL Server, восстановление. Учётной записи SqlRestore:DefaultRestoreUsername нужна роль sysadmin на DEV/TEST-серверах из AllowedTargetServers: восстановление переводит базу в OFFLINE, заменяет её, создаёт пользователей и меняет владельца. Служба SQL Server должна читать каталог архива бэкапов.
  • Active Directory. Для просмотра групп достаточно чтения. Для изменения состава нужно право на изменение членства в группах из ManageableGroupPatterns.
  • Секреты. Пароли и токены хранятся в appsettings.json открытым текстом. Ограничьте доступ к каталогу службы или вынесите секреты в переменные окружения.

Лицензия

MIT. См. LICENSE.

About

Инвентаризация кластеров 1С:Предприятие 8.3, инспекция серверов MS SQL Server и PostgreSQL (пути, размеры, роли), аудит групп Active Directory (LDAP), синхронизация с Atlassian Confluence и Kestrel Web Dashboard на .NET 10 / C# 14.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages