Добрый день!
Я давно хотел попробовать поставить 1С 8.3.9 на Linux сервер. Обычно я работал либо с файловой конфигурацией, либо со стандартной Windows+MsSql. Но хотелось попробовать развернуть базу самому и посмотреть, насколько это сложно.
Сразу скажу, что на Инфостарте была уже похожая публикация по установке на CentOs, но во-первых я делал установку несколько по-другому, во-вторых я рассмотрел вопрос включения отладки по http, и в-третьих я хотел сделать более пошаговую иструкцию, с нуля. Кстати сказать, остальные инструкции которые я находил, были либо устаревшими либо недостаточно подробными. А уж вопрос отладки серверных процедур по http для Linux-сервера я очень долго решал, и думаю он будет очень полезен.
Шаг 1. Установка сервера DigitalOcean
Оказывается, у облачного провайдера DigitalOcean можно получить 10$ по реф ссылке.
И всего за 5$ развернуть Droplet с установленной Ubuntu 16.04 x64.
И вот ваша виртуальная машина уже готова.
Шаг 2. Установка Putty
Немного непривычно, но с сервером придется работать через консольные команды. Для этого лучше всего подойдет утилита Putty. Среди прочих достоинств, она умеет вставлять в консоль текст по клику правой кнопки мышки или по нажатию shift-insert, что поможет в дальнейшей работе.
шаг 3. установка PostgreSQL 9.5 пропатченного
Пропатченная для 1С сборка PostgreSql лежит на сайте авторов PostgresPro, я взял версию 9.5. Также там есть и инструкции по установке, я их просто скопировал в окно putty.
sudo sh -c 'echo "deb http://1c.postgrespro.ru/deb/ $(lsb_release -cs) main" > /etc/apt/sources.list.d/postgrespro-1c.list'
wget --quiet -O - http://1c.postgrespro.ru/keys/GPG-KEY-POSTGRESPRO-1C-92 | sudo apt-key add - && sudo apt-get update
sudo apt-get install postgresql-pro-1c-9.5
После установки в консоли будет видно в каких папках установился PostgreSql, запомните где находится папка config.
в
Проверить работу сервера Postgresql можно с помощью команды
service postgresql status
Если установка была успешна, то вы увидите зеленую надпись "Active".
Шаг 4. установка Listen_adresses для соединения с pgAdmin.
После установки PostgreSql мне понадобилось проверить как он работает, и я стал соединяться с ним с помощью PgAdmin 1.22.1. Однако, соединиться не вышло, оказалось, нужно указать в конфигурации listen_addresses='*'. И тут меня встретил консольный(!) текстовый редактор vi. Это вам не нежно любимый Notepad++ с дополнениями. Впрочем, после небольшого чтения мануалов, оказалось что с редактором просто работать: по умолчанию файл открывается на чтение; для редактирования нужно перейти в insert mode нажав i; после редактирования нажать Esc и набрать две команды :w - для сохранения и команду :q для выхода из редактора. Итак, выполним команду открытия postgresql.conf
sudo vi /etc/postgresql/9.5/main/postgresql.conf
Найдем в этом файле listen_addresses='' и поменяем на listen_addresses='*'. После чего перезапустим postgresql с помощью команды
service postgresql restart
Проверить какие сервисы сейчас слушают порты можно с помощью команды
netstat -tlp
И у вас должна быть примерно такая картина: (здесь у меня уже включен сервер 1с и отладка)
Шаг 5. установка пароля на пользователя postgres
Далее получилось так, что сервер был запущен и listen_addresses были установлены, но возникала ошибка авторизации типа "пользователь postgres не прошел проверку подлинности по паролю". Как оказалось, по умолчанию у него пароль не установлен. Для его установки я поменял пользователя с root на postgresql , зашел в терминал postgresql и выполнил команду \password.
su postgres
psql
\password
Шаг 6. Соединение через pgadmin 3 (ver 1.22.1)
После всех этих настроек, соединение удалось. Как позже оказалось, базу на этом этапе через pgadmin создавать не надо! Главное что есть возможность подключиться и посмотреть таблицы БД. Проверьте что у базы postgres стоит сопоставление(collation) ru_RU.UTF8
Шаг 7. Установка необходимых пакетов для 1с
По нескольким статьям я собрал список пакетов, которые могут понадобиться для работы 1С:
imagemagick
unixodbc
ttf-mscorefonts-installer
t1utils
libgsf-bin
Вот тут обычно могут быть проблемы, но у меня все установилось гладко. Кстати, при установке 1С конфигурирование шрифтов с помощью выполнения config_system больше не нужно, так как Утилита конфигурирования для работы в ОС Linux config_system удалена из состава поставки и шрифты должны подхватываться автоматически из каталогов типа /usr/share/fonts/msttfcorefonts
Шаг 8. Передача на сервер и установка 1С.
Для передачи скачанных deb пакетов на сервер, я воспользовался входящей в Putty утилитой PSFTP. Положил все deb файлы в папку d:\deb_83\ и далее выполнил команды:
mkdir /root/onec/
cd /root/onec/
put -r d:\deb_83\
sudo dpkg -i 1c-enterprise83-common_8.3.9-2170_amd64.deb
Для установки пакетов я просто копировал их имена из Свойств файла в Windows в putty.
После установки проверяем запуск сервера 1С командой
service srv1cv83 status
Также должна быть зеленая надпись "Active". Нужно дать права на папки созданному при установке пользователю usr1cv8:
chown -R usr1cv8:grp1cv8 /opt/1C/
chown -R usr1cv8:grp1cv8 /home/usr1cv8/
Шаг 9. Создание базы из консоли администрирования 1С
В консоли администрирования под Windows я долго не мог подлючиться к своему серверу, так как появлялась ошибка "этот хост неизвестен". Оказалось, нужно в hosts файле в моей windows7 прописать адрес сервера кластера, где 207.0.0.0 - ваш IP Lunix-сервера
207.0.0.0 ubuntu-512mb-fraOnec-01
Далее я стал создавать базу 1С, и, как говорилось выше, надо создавать новую базу данных, для этого введите новое имя в поле "База данных", например db1cnew и не забудьте галочку "создать базу данных в случае ее отсутствия". Иначе может появиться ошибка "type mvarchar does not exist", если создавали из pgadmin базу.
Шаг 10. Отладка серверных модулей.
Естественно, после запуска базы, хочется ее отладить, но не все так просто. Для начала нужно запустить сервер с флагом отладки. Для этого открываем файл запуска сервера:
sudo vi /etc/init.d/srv1cv83
И раскомментируем там параметр SRV1CV8_DEBUG=1.
Перезапустим сервер 1С , для просмотра его статуса выполним команду
ps aux |grep 1с
Флаг -debug появился, но дальше после него стоит флаг -tcp. При режиме tcp отладки зайти в точку останова в серверных процедурах не получится, и нужно разбираться дальше. Включение отладки по http оказалось непростой задачей, потому что нигде я не смог найти рабочего решения. Как оказалось, нужно добавить флаг -http в скрипт запуска сервера в функции buildCommmandLine:
sudo vi /etc/init.d/srv1cv83
добавить в функции buildCommmandLine после -debug флаг -http
"$cmdline -debug -http"
Вот так это должно выглядеть:
Теперь для просмотра флагов процесса опять вызовем команду
ps aux |grep 1с
И увидим, что теперь процессы сервера 1С запущены с флагом http и добавился процесс сервера отладка dbgs:
После этого нужно в Конфигураторе в меню Сервис->Параметры->Отладка поставить "Отладка по протоколу HTTP", и отладка заработает:
Шаг 11. Нагрузочный тест Гилева
Также я решли провести нагрузочный тест от Гилева. Скачал dt, поставил на свою базу. Естественно, на 512 мегабайт он не работал, я в панели управления Digital Ocean сделал Resize своего сервера на 1 гигабайт оперативки, и поменял настройки PostgreSQL (возможно, что я сделал это неоптимально и буду рад прочитать в комментариях какие настройки нужны были).
shared_buffers = 256MB
temp_buffers = 64MB
work_mem = 512MB
maintenance_work_mem = 192MB
autovacuum_work_mem = -1
Тест все равно вываливался с ошибкой "превышен максимальный расход памяти сервера за один вызов" и я поменял параметр "Безопасный расход памяти за один вызов" на -1 в настройках сервера 1С. это помогло, и тест завершился с оценкой 7.76. Еще один Resize сервера на 4GB и 2CPU и оценка стала 12.41
Выводы
Разворачивание сервера с нуля и установка необходимых пакетов не занимает много времени. Как видно, работа с Linux может представлять вполне достойную альтернативу серверу на Window, особенно учитывая огромное количество облачных провайдеров и легкость развертывания сервера.
В этой статье я не рассмотрел такие интересные вопросы, как оптимизация настроек PostgreSQL, и создание из сервера с Ubuntu контейнера для Docker - это оставлю на будущее.