среда, 29 октября 2014 г.

Организация сервера хранилища конфигураций 1С на Ubuntu Server 14.04 LTS х86_64

В стандартных поставках от 1С сервер хранилища конфигурации для linux x86_64 систем не поставляется.
Ибо сервер хранилища конфигурации является 32-разрядным приложением.
Случилось так, что сервер уже поднят и достаточно прекрасно чухает себя на 64-битной платформе. А понадобилась возможность ведения "командной" разработки конфигурации...
Фирма 1С заявляет, что "одновременная работа 32-х-битного сервера хранилища вместе с 64-х битным сервером 1С:Предприятия возможна"!

Качаем i386 сборку необходимого нам дистрибутива (в моем случае это был 8.3.5.1231) и распаковываем, например, в /opt/1C/cr

Приступим:
#apt-get install libstdc++6:i386
#service srv1cv83 stop
#cp /etc/init.d/srv1cv83 ~/
#cd /opt/1C/cr && ls | while read p; do dpkg -X ${p} / ; done

Создаем скрипт автозапуска сервера хранилища
#mcedit /etc/init.d/crserver
такого содержания:
#!/bin/bash
### BEGIN INIT INFO
# Provides:          crserver
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: 1C 8.3 Confiration Storage Server
# Description:       1C 8.3 Confiration Storage Server
### END INIT INFO

SRV_PORT="1542"
STORAGES_DIR="/mnt/1c/ConfigurationStorage"
#
BINDIR="/opt/1C/v8.3/i386"
PATH="${BINDIR}:${PATH}"
DESC="1C 8.3 Confiration Storage Server"
NAME=crserver
DAEMON=${BINDIR}/$NAME
DAEMON_ARGS="-daemon -port ${SRV_PORT} -d ${STORAGES_DIR}"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# ======[start]====== 
 
# Seting FD limit (fix: error 24 too many open files)
ulimit -n 50000

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

do_start()
{
    # Return
    #   0 if daemon has been started
    #   1 if daemon was already running
    #   2 if daemon could not be started
    start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON --test > /dev/null || return 1
    start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS || return 2
    # Add code here, if necessary, that waits for the process to be ready
    # to handle requests from services started subsequently which depend
    # on this one.  As a last resort, sleep for some time.
}

do_stop()
{
    # Return
    #   0 if daemon has been stopped
    #   1 if daemon was already stopped
    #   2 if daemon could not be stopped
    #   other if a failure occurred
    start-stop-daemon --stop --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    # Wait for children to finish too if this is a daemon that forks
    # and if the daemon is only ever run from this initscript.
    # If the above conditions are not satisfied then add some other code
    # that waits for the process to drop all resources that could be
    # needed by services started subsequently.  A last resort is to
    # sleep for some time.
    start-stop-daemon --stop --oknodo --retry=0/30/KILL/5 --exec $DAEMON
    [ "$?" = 2 ] && return 2
    # Many daemons don't delete their pidfiles when they exit.
    rm -f $PIDFILE
    return "$RETVAL"
}

case "$1" in
  start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
    do_start
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  stop)
    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
    do_stop
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  status)
       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  restart)
    #
    log_daemon_msg "Restarting $DESC" "$NAME"
    do_stop
    case "$?" in
      0|1)
        do_start
        case "$?" in
            0) log_end_msg 0 ;;
            1) log_end_msg 1 ;; # Old process is still running
            *) log_end_msg 1 ;; # Failed to start
        esac
        ;;
      *)
        # Failed to stop
        log_end_msg 1
        ;;
    esac
    ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
    exit 3
    ;;
esac

# ======[theend]====== 
ну, соответственно подставляем свои переменные.

И далее все просто:
#mv ~/srv1cv83 /etc/init.d/srv1cv83
#chmod a+x /etc/init.d/crserver && update-rc.d crserver defaults
#service srv1cv83 start
#service crserver start
#rm -R /opt/1C/cr

Сервер хранилища запущен.

Запускаем конфигуратор и создаем новое локальное хранилище с <Имя хранилища>. Копируем его в каталог STORAGES_DIR, указанный в настройках скрипта запуска сервера хранилища. Подключаем полученное хранилище к БД для разработок (tcp://<IP сервера>/<Имя хранилища>).

11 комментариев:

  1. несколько серверов хранилищ на одной машине в линуксе можно поставить? например, 8.3.3.496 и 8.3.8.1652?

    ОтветитьУдалить
    Ответы
    1. В принципе, да. Распаковать в разные директории, сделать разные скрипты запуска (пути, порты). Не пробовал, но должно работать.

      Удалить
  2. День добрый не могли бы подсказать в какую степь копать.
    при запуске журнал выдет следующее
    -- Начат процесс запуска юнита c1storage.service.
    авг 31 18:37:57 1c-storage systemd[1]: c1storage.service: Control process exited, code=exited status=1
    авг 31 18:37:57 1c-storage systemd[1]: Failed to start LSB: 1C 8.3 Confiration Storage Server.
    -- Subject: Ошибка юнита c1storage.service
    -- Defined-By: systemd
    -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
    --
    -- Произошел сбой юнита c1storage.service.
    --
    -- Результат: failed.
    авг 31 18:37:57 1c-storage systemd[1]: c1storage.service: Unit entered failed state.
    авг 31 18:37:57 1c-storage systemd[1]: c1storage.service: Failed with result 'exit-code'.
    авг 31 18:39:37 1c-storage systemd[1]: Starting Cleanup of Temporary Directories...
    -- Subject: Начинается запуск юнита systemd-tmpfiles-clean.service
    -- Defined-By: systemd
    -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
    --
    но служба вроде как запустилась
    tcp 0 0 0.0.0.0:1542 0.0.0.0:* LISTEN 2069/crserver
    root 2069 0.0 1.6 96812 33728 ? Ssl 18:37 0:00 /opt/1C/v8.3/i386/crserver -daemon -port 1542 -d /mnt/1C/storage


    куда копать , какие логи смотреть,делал все по мануалу ну кроме названия скрипта crserver.система Ubuntu 16.04.3 LTS

    ОтветитьУдалить
    Ответы
    1. Скрипт запуска демона написан для Ubuntu 14.04. В 16-й за запуск служб отвечает systemd а не init.d. Обратную совместимость оставили, соответственно служба запускается. Вам нужно переписать скрипт запуска по правилам systemd и правильно потом его зарегистрировать (#update-rc.d crserver defaults не подойдет). В принципе эту ошибку можно игнорировать. У меня на 16-й в логи ругается, но работает. Единственное - для перезапуска демона нужен ребут. Если перепишите скрипт - можете поделиться - изменю статью. Самому переписывать пока некогда.

      Удалить
  3. Не удалось переписать для Ubuntu 16.04? Сам пока не могу справится.

    ОтветитьУдалить
  4. Получилось на Ubuntu 16.04 таким способом, создал юнит для systemd:
    /etc/systemd/system/crserver.service

    с таким содержимым:
    [Unit]
    Description=test_service

    [Service]
    Type=oneshot
    ExecStart=/opt/1C/v8.3/i386/crserver -daemon -port 1542 -d /mnt/storage
    RemainAfterExit=yes

    [Install]
    WantedBy=multi-user.target

    Дальше перезапускаем systemd
    $ sudo systemctl daemon-reload
    Включаем автозагрузку юнита
    $ sudo systemctl enable crserver.service

    И теперь можно управлять службой так:
    $ sudo systemctl stop | start | restart crserver.service
    $ sudo service stop | start | restart crserver

    И служба стартует автоматом.

    ОтветитьУдалить
  5. Александр, спасибо, скрипт рабочий. Но при переподключении к хранилищу вылетает ошибка "Too many opened files". Подскажите, а куда теперь в 16.04 можно сделатьв ставку "# Seting FD limit (fix: error 24 too many open files) ulimit -n 50000"?

    ОтветитьУдалить
    Ответы
    1. В /etc/security/limits.conf добавьте/измените строки:

      * hard nofile 65536
      * soft nofile 65536

      После - перезагрузка

      Удалить
    2. Не помогло. Пробовал вместо 65536 ставить 2000000. Дописывал в /etc/sysctl.conf -> fs.file-max=2000000. Тоже самое...

      Удалить
    3. Выполняем:
      #ps -aux | grep crserver

      Ответ:
      root 2081 0.0 0.7 155332 57448 ? Ssl 09:53 0:14 /opt/1C/v8.3/i386/crserver -daemon -port 1542 -d /media/ConfigurationStorage

      Первый параметр ответа - это юзер. Обычно это root, если не переназначали принудительно.

      Правим /etc/security/limits.conf:

      root hard nofile 65536
      root soft nofile 65536

      Ребут.

      Как я понял '*' в ubuntu не распространяется на рута.

      Еще вариант создать конфиг в:
      /etc/systemd/system/crserver.service.d/nofile_limit.conf

      с таким содержимым:
      [Service]
      LimitNOFILE=65536

      Удалить
    4. Разобрался, в /etc/systemd/system/crserver.service в разделе [Service] надо добавить LimitNOFILE=infinity

      Удалить