Слон — это панель для управления базами 1С, сочетающая в себе функции управления кластером 1С посредством RAS-сервера, основные возможности утилиты ibcmd (выгрузка/загрузка dt, cf, cfe, репликация), а также управление резервными копиями, развёрнутыми на ZFS (через снимки). Представляет собой конфигурацию на 1С 8.5, способную работать обособленно в Docker-контейнере (посредством ibsrv).
Длительные операции Слон выполняет фоново, с использованием нового механизма «Уведомления клиента», позволяющего заданию уведомлять пользователя о промежуточных состояниях по мере его выполнения. Благодаря этому можно загружать конфигурацию или расширение в несколько баз одновременно и отслеживать, какая база на каком этапе обновления.

Изначально Слон разрабатывался именно для управления Docker-контейнерами с PG, развёрнутыми на ZFS-массиве, для оперативного получения копий баз из снимков. Но по мере наращивания функций работы с базами переориентирован и на обычный способ подключения к БД. ZFS интересна далеко не каждому, поэтому покажу сначала Слона без неё, а в заключение — с ней.
Запуск в контейнере
Слон может работать как на Windows, так и на Linux. На Linux ibcmd не может работать с MSSQL, и Слон тоже не будет. Если вам нужен только Postgres, вы можете запустить Слона в Docker-контейнере, который приготовлен для этого случая:
https://github.com/kot-camojiet/1c-single
Создайте docker-compose.yml:
services:
slon:
image: camojiet/1c-single:latest
container_name: slon
ports:
- "8314:8314"
volumes:
- ./fs-data:/fs-data
- ./storage:/storage
security_opt:
- apparmor=unconfined
restart: unless-stopped
environment:
PORT: 8314
TZ: Asia/Vladivostok
Создайте в папке с compose папку с базой и хранилище:
mkdir -p ./fs-data/db-data
mkdir ./storage
Поместите 1Cv8.1CD в ./fs-data/db-data/
Запустите:
docker compose up -d
После запуска контейнера база будет доступна через http на порту 8314.
Основные функции
Зайдите в базу через браузер, авторизуйтесь под Администратором без пароля.
Зайдите в настройки:

В настройках для работы без ZFS достаточно установить пароль, каталог хранилища (там будут храниться dt, cf, cfe и временные папки для ibcmd) и путь к бинарным файлам платформы (для запуска ibcmd).

Далее необходимо добавить сервер 1С.

Укажите название, адрес и порт RAS-сервера, администратора сервера и пароль, администратора кластера и пароль (если есть).
Заблокируйте по умолчанию фоновые задания, чтобы случайно не запустить их во время ознакомления. Установленные по умолчанию параметры будут применяться для создаваемых на этом сервере баз:

Добавьте сервер БД:

Введите необходимые данные для работы с БД:

Теперь можете добавить базу:

Укажите сервер БД, сервер 1С, включите считывание данных (необязательно). Слон фоново считывает данные с баз, помеченных таким образом, о количестве пользователей и состоянии блокировки пользовательских сеансов. После записи база готова к подключению. Если база существовала на этом месте, она будет подключена, если нет — создана.
После подключения базы можете загрузить файлы dt, cf, cfe в хранилище (2), затем загрузить в базу (3,4):

Есть возможность загружать файл по прямой ссылке и ссылке из Nextcloud. Можно загружать несколько файлов в облако по ссылке на расшаренную папку (тестировал на Nextcloud 32.0.3).
После загрузки в базе будет гореть бордовым, если база не авторизована:

Заполните пользователя, пароль, запишите. Бордовая рамка должна исчезнуть, если авторизация пройдена (пользователь должен обладать ролью «Администрирование»).
Допускается загрузка cf или cfe в несколько баз из контекстного меню списка баз:

В случае загрузки в одну базу, параллельное выполнение не имеет смысла (показываю для ознакомления):

Если будет выбрана последовательная загрузка, то запустится одно фоновое задание, которое загрузит файл в базы одну за другой. Если параллельная — на каждую базу будет запущено своё фоновое задание.
Из контекстного меню списка баз можно заблокировать пользовательские сеансы (по одной базе):

задействовать ibcmd replicate:

удалить базу:

а также снять/установить признак «Считывать данные» для множества баз.
В списке баз отражается информация о блокировке заданий (БЗ), блокировке сеансов (БС), количестве запущенных приложений 1CV8C (КП — количество пользователей):

Список установленных расширений доступен на форме базы. Множеству выбранных расширений можно установить параметры:


или удалить их. Удаление всех расширений производится за одну итерацию (с ключом -all), удаление нескольких (но не всех) — по одной итерации на расширение.
Использование Slon-pg + ZFS
Slon-pg — это Docker-образ, предназначенный для запуска инстанса PG для 1С в Docker-контейнере. Он разрабатывался как универсальный инструмент для запуска одиночного PG-инстанса и пары мастер-реплика через штатный механизм PG. В Слоне выведены настройки по запуску мастера и реплики, но в деле испытан только одиночный запуск, и в рамках этой статьи мы не будем затрагивать другие.
Исходные файлы для сборки по ссылке:
https://github.com/kot-camojiet/slon-pg
При заполнении объекта slon-pg будет запущен инстанс PG, данные которого будут расположены на массиве ZFS. На машине с ZFS настраивается sanoid, который обеспечивает создание снимков с нужной периодичностью (например, раз в час). Слон может создать клон из выбранного снимка и запустить на этих данных новый инстанс slon-pg на другом порту. Если данные и WAL находятся в одном снимке, то копия будет консистентной. Таким образом, мы можем получить копию всего инстанса для оперативной копии в нужд поддержки. При этом не надо ждать копирования данных, и такая копия не занимает место — необходимо только немного подождать, пока PG проиграет журнал транзакций до корректного состояния.
Для того чтобы это всё заработало, необходима Linux-машина с OpenZFS на борту, с настроенным массивом и пользователем, которому доступен целевой датасет, с настроенным доступом через SSH. Слон будет отдавать команды по SSH, обеспечивающие запуск PG и управление ZFS. Если Слон располагается на Windows-машине, то имейте в виду, что на Windows 2012 R2 нет SSH-клиента, а на более новых — есть. Без SSH-клиента ничего не получится; как его ставить на старые Windows-машины — я не знаю.
ZFS
Создайте массив:
zpool create -o ashift=13 postgres mirror nvme-HP_SSD_EX950_1TB_HBSE45350300040 nvme-HP_SSD_EX950_1TB_HBSE45350300043 log mirror nvme-INTEL_MEMPEK1J016GAL_BTBT84050517016N-part1 nvme-INTEL_MEMPEK1J016GAL_PHBT844300QV016N-part1
В моём случае это зеркало из двух основных дисков + отдельное зеркало для синхронных записей на Optane. Задумка была интересной, но целесообразность под вопросом. Возможно, удачнее расположить на Optane только метаданные. Не будем на этом останавливаться; надеюсь, найдутся товарищи, которым есть что сказать в части развёртывания Postgres на ZFS.
Выделите отдельный датасет:
zfs create postgres/slon
Настройте:
zfs set recordsize=128k postgres/slon
zfs set atime=off postgres/slon
zfs set primarycache=all postgres/slon
zfs set secondarycache=all postgres/slon
zfs set logbias=throughput postgres/slon
zfs set sync=standard postgres/slon
zfs set compression=lz4 postgres/slon
zfs set dnodesize=auto postgres/slon
Экспериментировал с recordsize=8k (32, 64) и не увидел особой разницы по сравнению с 128k в тестах того же Гилёва, поэтому оставил большее значение в угоду сжимаемости.
С ZFS возможны различные варианты, позволяющие получить приемлемую производительность с недорогого железа. Чем больше дисков, тем производительнее можно получить массив. Например, 8 10k SAS по 1 ТБ с двумя недорогими Optane превратились в приемлемый массив для небольших экспериментов.
Создайте пользователя, сохраните его пароль — он понадобится в дальнейшем:
useradd slon
passwd slon
mkdir /home/slon
chown slon:slon /home/slon
zfs allow -u slon clone,create,destroy,hold,mount,mountpoint,receive,rename,send,snapshot postgres/slon
apt install sudo
Мне не удалось без костылей примонтировать под пользователем slon массив в Debian — монтирует только root, чтобы я ни делал. Вышел из положения дополнительными sudo-скриптами:
cat > /usr/local/bin/zfsmount.sh << 'EOF'
#!/bin/bash
# Обёртка для безопасного монтирования датасетов slon
DATASET="$1"
# Разрешаем только датасеты внутри postgres/slon/* или storage/slon/*
if [[ "$DATASET" =~ ^(postgres/slon/|storage/slon/) ]]; then
/usr/sbin/zfs mount "$DATASET"
else
echo "Error: you can only mount datasets under postgres/slon/* or storage/slon/*" >&2
exit 1
fi
EOF
chmod +x /usr/local/bin/zfsmount.sh
cat > /usr/local/bin/zfsumount.sh << 'EOF'
#!/bin/bash
# Обёртка для безопасного размонтирования датасетов slon
DATASET="$1"
if [[ "$DATASET" =~ ^(postgres/slon/|storage/slon/) ]]; then
/usr/sbin/zfs unmount "$DATASET"
else
echo "Error: you can only unmount datasets under postgres/slon/* or storage/slon/*" >&2
exit 1
fi
EOF
chmod +x /usr/local/bin/zfsumount.sh
echo "slon ALL=(ALL) NOPASSWD: /usr/local/bin/zfsmount.sh, /usr/local/bin/zfsumount.sh" >> /etc/sudoers
Включите пользователя в группу docker:
usermod -aG docker slon
Настройка slon-pg
Заполните в настройках Слона адрес, порт подключения, пользователя:

Введите пароль пользователя slon, который на сервере с ZFS:

Нажмите «Проверить» ещё раз, при успешной установке вы должны увидеть ответ команды uptime на удалённом сервере.
Данный способ работает только с установленной утилитой sshpass на 1С сервере. Если её нет, нужно установить ключ из под серверного пользователя 1С вручную.
Создайте массив ZFS в Слоне:


Будут созданы подразделы для оригиналов и клонов (они должны находиться в одном массиве)
~$ zfs list postgres/slon -r
NAME USED AVAIL REFER MOUNTPOINT
postgres/slon 7.33M 802G 25K /postgres/slon
postgres/slon/clon 24K 802G 24K /postgres/slon/clon
postgres/slon/orig 7.28M 802G 25K /postgres/slon/orig
Создайте инстанс PG:


Первая запись будет долгой, пока образ не загрузится.
В результате запустится контейнер с PG, готовый к подключениям:
~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
372e20f0a2b4 camojiet/slon-pg:latest "entrypoint.sh postg…" 9 minutes ago Up 9 minutes 0.0.0.0:5500->5432/tcp, [::]:5500->5432/tcp test
Теперь можно создать базу на этом инстансе PG:

Снимки
Снимки, доступные из базы - это снимки всего PG-инстанса. В боевой обстановке с настроенными sanoid и syncoid на датасет postgres/slon/orig/test список похожим на этот:

Не снимаю копий syncoid и удаляю свои снимки, чтобы из-за неудалённого снимка не кончилось место на ZFS.
Сделайте снимок:

Теперь можно получить копию базы из снимка ZFS:

На этом этапе можно поменять имя базы клона, а сервер 1С — на отладочный (он поменяется сам, если указан в настройках отладочный сервер):

Появится база и фоновое задание, отслеживающее факт готовности клона после запуска:

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

и свой снимок:

Это необходимо, чтобы освободить снимок, который не будет удалён после устаревания и может занять всё место на диске, если про него забыть. Также будет удалён родительский PG-инстанс, который потребляет ресурсы сервера.
Клонируется всегда весь инстанс, но интерфейс построен так, что как будто делается копия только одной базы. Сделать клон инстанса можно и из формы объекта slon-pg, но в обоих случаях можно обращаться ко всем базам инстанса.
Запуск производился на платформе 8.5.1.1343.
Вступайте в нашу телеграмм-группу Инфостарт