Как настроить надежный обмен данными между базами 1С на разных серверах Ubuntu, используя файловые шары?

Системный администратор 1С v8.3 (Управляемые формы)
← На главную

В данном руководстве мы подробно разберем, как наладить стабильный обмен данными между двумя базами 1С, работающими на серверах Ubuntu, особенно когда возникают сложности с файловыми шарами и правами доступа. Изначально, обмен между базами 1С (WMS обмен данными XML) был реализован через расшаренную папку на Windows, монтируемую в Ubuntu по протоколу CIFS. Однако, столкнулись с проблемой: выставленные через GUI права доступа к папке на Ubuntu (Создание и удаление файлов) сбрасываются обратно на "Доступ к файлам", что приводит к ошибке "Указанный файл обмена не существует" при попытке обмена. Мы выясним причины этой проблемы и предложим различные подходы к ее решению.

Анализируем текущую проблему с правами доступа при CIFS-монтировании

Прежде всего, давайте внимательно рассмотрим ситуацию, с которой вы столкнулись. Моделирование файловых шаров с Windows на Linux с использованием CIFS (Common Internet File System) часто встречается, но может быть источником нестабильности в управлении правами доступа, особенно когда речь идет о взаимодействии между различными операционными системами и специфическими требованиями приложений, таких как 1С. Протокол SMB/CIFS, хотя и широко используется, иногда проявляет особенности в интерпретации и применении прав доступа между Windows и Linux. В данном случае, когда обе базы 1С работают на Ubuntu 20.04, использование CIFS для связи между Linux-серверами является менее оптимальным выбором, чем протоколы, изначально предназначенные для Unix/Linux окружения.

Один из участников сообщества поделился очень показательным опытом, который может быть релевантен вашей ситуации. Представим, что у вас есть база-источник 1С, которая выгружает данные в файл обмена в расшаренную папку, и база-приемник 1С, которая загружает эти данные и затем удаляет файл. Этот цикл – выгрузка, загрузка, удаление – является стандартной практикой для файлового обмена. В определенный момент, после переноса шары на Linux-систему, база-приемник стала выдавать ошибку об отсутствии прав на удаление файла, хотя на саму папку были выставлены полные права. При ближайшем рассмотрении выяснилось, что 1С-источник создавал файл обмена с правами на запись только для себя, не обеспечивая наследование прав на папку для других пользователей, включая пользователя, от имени которого работала 1С-приемник. При последующих перезаписях файла эти "неправильные" права каким-то образом сохранялись, игнорируя настройки папки. Это может происходить из-за особенностей работы протокола SMB/CIFS и того, как он взаимодействует с файловыми системами Linux, особенно в части наследования и применения ACL (Access Control Lists).

Решение проблемы с "залипшими" правами доступа

Если вы столкнулись с подобной ситуацией, когда файл обмена создается с некорректными правами, которые препятствуют его удалению или модификации со стороны базы-приемника, мы рекомендуем выполнить следующие шаги:

  1. Ручное удаление файла: Подключитесь к расшаренной папке (например, через SSH к серверу, где расположена шара, или через файловый менеджер, если есть доступ) и удалите существующий файл обмена вручную. Это действие позволит "сбросить" некорректные права, которые могли быть привязаны к конкретному файлу и сохранялись при его перезаписи. Используйте команду rm /path/to/exchange_file.xml.
  2. Проверка создания нового файла: Запустите процесс обмена со стороны базы-источника. После того как новый файл обмена будет создан, внимательно проверьте его права доступа. Вы можете использовать команду ls -l /path/to/exchange_file.xml для просмотра прав. Убедитесь, что права на запись и удаление файла корректно наследуются от родительской папки или явно выставлены для пользователя, от имени которого работает база-приемник 1С.
  3. Проверка прав пользователя 1С: Важно помнить, что 1С на Linux-серверах часто запускается от имени специфического системного пользователя, например, usr1cv8. Именно этому пользователю должны быть предоставлены все необходимые разрешения (чтение, запись, удаление) на смонтированную папку и файлы внутри нее. Убедитесь, что для пользователя usr1cv8 и группы, к которой он принадлежит (часто grp1cv8), есть полные права на папку обмена.

Если проблема с правами все же возникает даже после тщательной настройки CIFS/NFS, возможно, стоит проверить, какой пользователь запускает процесс 1С на клиентской машине. Права должны быть настроены не только для самой папки, но и для пользователя, от имени которого 1С пытается получить доступ к файлу. Часто ошибки с доступом возникают, если 1С запускается от имени системного пользователя, который не имеет нужных разрешений на монтированную папку. Убедитесь, что пользователь, от имени которого работает 1С (например, usr1cv8), имеет необходимые права на чтение, запись и удаление файлов в целевой папке.

Более надежные подходы к организации файлового обмена между серверами Ubuntu

Если проблема с CIFS продолжает возникать или вы ищете более стабильное и нативное решение для обмена между серверами на базе Linux, мы рассмотрим несколько альтернативных вариантов, которые могут быть более подходящими для вашей инфраструктуры. Для обмена между двумя серверами Ubuntu, использование NFS (Network File System) является предпочтительным решением, так как этот протокол изначально разработан для взаимодействия Unix/Linux-систем и обеспечивает более стабильное управление правами доступа.

Использование NFS (Network File System) для Linux-систем

NFS является стандартным протоколом для обмена файлами между Unix/Linux-системами и часто обеспечивает гораздо более стабильное и предсказуемое управление правами доступа по сравнению с CIFS в Linux-окружении. Мы настоятельно рекомендуем рассмотреть переход на NFS, если обе ваши базы 1С находятся на серверах Ubuntu. Это позволит избежать многих проблем, связанных с особенностями кросс-платформенного взаимодействия протокола SMB/CIFS.

Настройка NFS-сервера на Ubuntu:

  1. Установите NFS-сервер: На сервере, где находится папка, которую вы хотите расшарить (сервер-источник файла обмена), выполните следующие команды для обновления списка пакетов и установки NFS-сервера:
    
    sudo apt update
    sudo apt install nfs-kernel-server
    
  2. Настройте экспорт папки: Откройте файл конфигурации экспортов /etc/exports для редактирования: sudo nano /etc/exports Добавьте строку, указывающую на папку, которую вы хотите расшарить, и разрешенные IP-адреса клиентов. Например:
    
    /path/to/your/1c/exchange/folder client_ip_address(rw,sync,no_subtree_check,anonuid=1000,anongid=1000)
    
    Где:
    • /path/to/your/1c/exchange/folder – это полный путь к вашей папке обмена 1С.
    • client_ip_address – IP-адрес сервера, где работает база-приемник. Вы можете указать подсеть (например, 192.168.1.0/24) или * для любого хоста (не рекомендуется для продакшена без дополнительных мер безопасности).
    • rw – разрешение на чтение и запись.
    • sync – обеспечивает синхронную запись на диск, повышая надежность, но может немного снизить производительность.
    • no_subtree_check – отключает проверку поддеревьев, что может улучшить стабильность при переименованиях файлов.
    • anonuid и anongid – опции, позволяющие указать, под каким пользователем и группой будут выполняться операции для анонимных пользователей (в случае, если пользователь на клиенте не соответствует ни одному из пользователей на сервере). Часто здесь указывают UID/GID пользователя usr1cv8 с сервера.
  3. Примените изменения и перезапустите NFS-сервер: После сохранения файла /etc/exports примените изменения и перезапустите службу NFS:
    
    sudo exportfs -a
    sudo systemctl restart nfs-kernel-server
    
  4. Настройка прав на самой папке: Убедитесь, что папка /path/to/your/1c/exchange/folder имеет корректные права для пользователя, от имени которого будет работать 1С на сервере NFS. Используйте команды chown и chmod. Например, если 1С работает от пользователя usr1cv8:
    
    sudo chown -R usr1cv8:grp1cv8 /path/to/your/1c/exchange/folder
    sudo chmod -R 770 /path/to/your/1c/exchange/folder
    

    Эти команды установят владельцем папки пользователя usr1cv8 и группу grp1cv8, а также дадут владельцу и группе полные права (7 - чтение, запись, выполнение), другим пользователям — никаких прав (0).

Настройка NFS-клиента на Ubuntu:

  1. Установите NFS-клиент: На сервере, который будет монтировать расшаренную папку (сервер-приемник файла обмена), выполните следующие команды:
    
    sudo apt update
    sudo apt install nfs-common
    
  2. Создайте точку монтирования: Создайте локальную папку, куда будет смонтирована сетевая шара: sudo mkdir -p /mnt/1c_exchange
  3. Смонтируйте NFS-шару: Выполните команду монтирования: sudo mount server_ip_address:/path/to/your/1c/exchange/folder /mnt/1c_exchange Для автоматического монтирования при старте системы добавьте запись в файл /etc/fstab. Откройте файл /etc/fstab: sudo nano /etc/fstab Добавьте следующую строку:
    
    server_ip_address:/path/to/your/1c/exchange/folder /mnt/1c_exchange nfs defaults,user,exec 0 0
    
    Здесь defaults,user,exec – стандартные опции монтирования, позволяющие пользователям получать доступ и выполнять файлы. Важно убедиться, что пользователь usr1cv8 на этом сервере имеет полные права на папку /mnt/1c_exchange. После добавления записи, вы можете проверить монтирование без перезагрузки командой sudo mount -a.
  4. Проверка прав: После монтирования, проверьте права на /mnt/1c_exchange и убедитесь, что пользователь usr1cv8 имеет права на чтение, запись и удаление. Убедитесь, что UID и GID пользователя usr1cv8 на клиенте соответствуют UID и GID на сервере, или используйте опции anonuid/anongid в /etc/exports для маппинга.

Использование FTP/SFTP для обмена файлами

Если по какой-либо причине использование сетевых файловых систем (NFS или CIFS) не подходит, или требуется более высокий уровень безопасности (например, при обмене через интернет), мы можем рассмотреть использование протоколов FTP (File Transfer Protocol) или SFTP (SSH File Transfer Protocol). SFTP, в отличие от FTP, обеспечивает шифрование данных, что значительно повышает безопасность передачи и является предпочтительным выбором.

Этот подход потребует модификации программного кода в 1С для использования встроенных средств работы с FTP/SFTP, поскольку ваша текущая обработка ожидает локальный файловый путь. Если изменение конфигурации 1С допустимо, это может быть очень гибким и безопасным решением.

Для работы с FTP в 1С вы можете использовать объект FTPСоединение. Если требуется SFTP, часто требуется использовать внешние компоненты или реализовать взаимодействие через системные утилиты (sftp в командной строке) и последующую работу с локальными файлами.


// Пример кода для 1С (псевдокод)
// Предполагаем, что файл обмена уже сформирован в локальной папке
// и должен быть выгружен на удаленный сервер по FTP.

// Создаем объект FTPСоединение
// Параметры: Сервер, Порт, Пользователь, Пароль, ПассивныйРежим, Таймаут, ИспользоватьSSL, Кодировка
Попытка
    СоединениеFTP = Новый FTPСоединение(
        "ftp.your-server.com",    // IP или доменное имя FTP-сервера
        21,                       // Порт FTP (для SFTP порт 22, но нужен другой объект или внешняя компонента)
        "your_ftp_username",      // Имя пользователя на FTP-сервере
        "your_ftp_password",      // Пароль пользователя
        Истина,                   // Использовать пассивный режим (рекомендуется)
        60,                       // Таймаут в секундах
        Ложь,                     // Не использовать SSL/TLS (для SFTP нужно Истина и соответствующая реализация)
        "UTF-8"                   // Кодировка
    );

    // Устанавливаем текущий каталог на FTP-сервере (если нужно)
    // СоединениеFTP.УстановитьТекущийКаталог("/remote/exchange/folder");

    // Выгрузка файла обмена с локального пути на FTP-сервер
    ЛокальныйПутьКФайлу = "/home/usr1cv8/1c_exchange/output/exchange_data.xml";
    УдаленныйПутьКФайлу = "/remote/exchange/folder/exchange_data.xml"; // Или просто "exchange_data.xml" если установлен текущий каталог

    СоединениеFTP.Записать(ЛокальныйПутьКФайлу, УдаленныйПутьКФайлу);
    Сообщить("Файл обмена успешно выгружен на FTP-сервер.");

    // Для загрузки файла с FTP-сервера
    ЛокальныйПутьДляЗагрузки = "/home/usr1cv8/1c_exchange/input/received_data.xml";
    УдаленныйПутьФайлаНаСервере = "/remote/exchange/folder/received_data.xml";

    СоединениеFTP.Прочитать(УдаленныйПутьФайлаНаСервере, ЛокальныйПутьДляЗагрузки);
    Сообщить("Файл обмена успешно загружен с FTP-сервера.");

    // Для удаления файла с FTP-сервера после обработки
    СоединениеFTP.Удалить(УдаленныйПутьФайлаНаСервере);
    Сообщить("Файл обмена успешно удален с FTP-сервера.");

Исключение
    Сообщить("Ошибка при работе с FTP: " + ОписаниеОшибки());
КонецПопытки;

Для полноценной работы с SFTP в 1С, как правило, требуется использование внешних компонент, которые реализуют SSH и SFTP протоколы, или же можно использовать системные утилиты sftp через ЗапуститьПриложение и работать с локальными файлами после их передачи.

Синхронизация файлов с помощью Rsync

В случае, если вы хотите, чтобы 1С работала с локальными папками на каждом сервере, но при этом эти папки автоматически синхронизировались между собой, мы можем использовать утилиту rsync. Этот метод предполагает, что 1С на каждом сервере будет выгружать или загружать файлы в свою локальную папку обмена, а rsync будет периодически обеспечивать актуальность этих папок между серверами. Это решение удобно тем, что 1С работает только с локальной файловой системой, что исключает проблемы сетевого монтирования.

Мы можем настроить скрипт на одном из серверов (или на обоих), который будет выполнять синхронизацию по расписанию через cron. Для безопасной работы rsync без ввода пароля рекомендуется настроить аутентификацию по SSH-ключам между серверами.

Пример команды rsync для синхронизации локальной папки на сервере-источнике с удаленной папкой на сервере-приемнике:


# На сервере-источнике, для отправки файлов на сервер-приемник:
rsync -avz --remove-source-files /path/to/local/1c/exchange/output/ user@remote_server_ip:/path/to/remote/1c/exchange/input/

# На сервере-приемнике, для получения файлов с сервера-источника:
rsync -avz user@remote_server_ip:/path/to/remote/1c/exchange/output/ /path/to/local/1c/exchange/input/ --remove-source-files

Где:

Для автоматизации запуска rsync добавьте задачу в cron пользователя usr1cv8 (или другого системного пользователя с соответствующими правами):

crontab -e

Добавьте строку, например, для запуска каждые 5 минут:


*/5 * * * * /usr/bin/rsync -avz --remove-source-files /path/to/local/1c/exchange/output/ user@remote_server_ip:/path/to/remote/1c/exchange/input/ > /var/log/1c_rsync.log 2>&1

Убедитесь, что пути к папкам в командах rsync соответствуют вашим реальным путям на серверах, а пользователь 1С имеет права на чтение и запись в этих локальных папках.

Альтернативные методы обмена данными (требующие изменения логики 1С)

Если изменение существующей обработки 1С все-таки допустимо, открываются более гибкие и мощные возможности для обмена данными, позволяющие уйти от ограничений файловой системы и обеспечить более высокую надежность и производительность.

Использование HTTP-сервисов 1С

HTTP-сервисы 1С представляют собой современный и эффективный способ обмена данными напрямую между базами 1С без использования промежуточных файлов и сетевых папок. Это позволяет значительно упростить и ускорить процесс, а также повысить его надежность за счет встроенных механизмов 1С, которые оперируют данными напрямую, а не через файловую систему.

Для реализации HTTP-сервисов потребуется разработка серверной части (публикация сервиса в одной базе, которая будет предоставлять данные или принимать их) и клиентской части (обращение к этому сервису из другой базы для отправки или получения данных) в конфигурации 1С. Этот подход является предпочтительным для сложных, частых и больших объемов обменов, где требуется высокая степень автоматизации и минимум ручного вмешательства. Вы будете использовать объекты 1С, такие как HTTPЗапрос, HTTPСоединение, JSON или XML-сериализацию для передачи данных.

Интеграция через брокеры сообщений (например, RabbitMQ)

Хотя в данном случае автор посчитал RabbitMQ избыточным, мы все же кратко рассмотрим этот вариант, так как он становится крайне полезным в более сложных сценариях интеграции. Брокеры сообщений, такие как RabbitMQ, обеспечивают гарантированную доставку сообщений, асинхронность и высокую масштабируемость. Это означает, что даже если одна из систем временно недоступна, сообщения не будут потеряны, а обработаются, как только система восстановится.

В контексте 1С, это означало бы, что база-источник публиковала бы сообщения (например, XML-данные обмена) в очередь RabbitMQ, а база-приемник подписывалась бы на эту очередь и забирала сообщения для обработки. Для взаимодействия с RabbitMQ из 1С обычно используются внешние компоненты или специализированные интеграционные решения, которые переводят команды 1С в API брокера сообщений. Этот путь актуален, если в будущем потребуется усложнить логику обмена, добавить несколько участников, обеспечить отказоустойчивость или интегрировать 1С с другими информационными системами (не только с другими 1С-базами).

Критически важные аспекты прав доступа пользователя 1С

Независимо от выбранного метода обмена данными, всегда критически важно убедиться, что системный пользователь, от имени которого работает сервер 1С (например, usr1cv8), имеет полные и корректные права доступа на все директории и файлы, с которыми он взаимодействует. Это касается не только чтения и записи, но и возможности удаления файлов, что является ключевым для успешного цикла обмена (например, после обработки файла обмена он должен быть удален). Если 1С не имеет прав на удаление файла, это может привести к накоплению старых файлов и ошибкам в последующих обменах.

Мы рекомендуем регулярно проверять права на папки и файлы, используя команды ls -l, chown и chmod в терминале Ubuntu, чтобы исключить проблемы с разрешениями. Убедитесь, что пользователь usr1cv8 и его основная группа (grp1cv8) имеют rwx (чтение, запись, выполнение) права на папки, в которых хранятся или временно размещаются файлы обмена. Это поможет избежать многих типовых проблем, связанных с доступом к файловой системе.

← На главную