Службы KIS. Разработка — различия между версиями
Admin (обсуждение | вклад) (→Требования к работоспособности при потере соединения) |
Admin (обсуждение | вклад) |
||
| (не показаны 34 промежуточные версии 2 участников) | |||
| Строка 1: | Строка 1: | ||
| − | + | Этот файл продублирован на svn | |
| + | Для сервисов ИБИС есть похожий документ см [[Службы_MIS3._Разработка]] | ||
| + | = Общие требования = | ||
| + | |||
| + | == Структура файлов == | ||
| − | |||
* каждая служба живет в своем каталоге | * каждая служба живет в своем каталоге | ||
* имена каталогов в '''ВЕРХНЕМ''' регистре | * имена каталогов в '''ВЕРХНЕМ''' регистре | ||
* все имена файлов в '''нижнем''' регистре | * все имена файлов в '''нижнем''' регистре | ||
* имя исполняемого файла службы должно заканчиваться на '''_srv''' | * имя исполняемого файла службы должно заканчиваться на '''_srv''' | ||
| − | * имя службы должно начинаться с '''kis''' | + | * имя службы должно начинаться с '''kis''' без "_srv" в конце! |
* имя исполняемого файла по управлению службой должно заканчиваться на '''_ctl''' | * имя исполняемого файла по управлению службой должно заканчиваться на '''_ctl''' | ||
* настройка подключения к БД должна храниться в файле kis.ini | * настройка подключения к БД должна храниться в файле kis.ini | ||
| − | * настройки службы должны храниться в | + | * настройки службы должны храниться в <имя''службы>.ini файле рядом с исполнимыми файлами. см. [Конфигурационные файлы KIS](Конфигурационные''файлы_KIS "wikilink") |
| + | Пример расположения служб | ||
| − | + | <pre class="">KIS_SRV | |
| − | <pre> | ||
| − | KIS_SRV | ||
├─KIS_MQTT | ├─KIS_MQTT | ||
│ ├──kis_mqtt_srv.exe | │ ├──kis_mqtt_srv.exe | ||
| Строка 21: | Строка 23: | ||
│ ├──kis.ini | │ ├──kis.ini | ||
│ │ kis_mqtt.ini | │ │ kis_mqtt.ini | ||
| + | │ │ kis_mqtt.ini.example | ||
| + | │ │ readme.md | ||
│ └──LOG - Папка с логами | │ └──LOG - Папка с логами | ||
└─KIS_EHR_CONNECTOR | └─KIS_EHR_CONNECTOR | ||
| Строка 27: | Строка 31: | ||
├──kis.ini | ├──kis.ini | ||
├──kis_ehr_connector.ini | ├──kis_ehr_connector.ini | ||
| − | └──LOG | + | ├──kis_ehr_connector.ini.example |
| − | </pre> | + | ├──readme.md |
| − | + | └──LOG</pre> | |
Именования файлов | Именования файлов | ||
| Строка 36: | Строка 40: | ||
* _app.EXE в виде отдельного приложения (на этапе разработки) | * _app.EXE в виде отдельного приложения (на этапе разработки) | ||
| − | + | Все исполняемые файлы (*.exe) должны содержать актуальную информацию о версии (номер версии должен совпадать с номером ревизии SVN на котором этот exe собран) | |
| − | Имя службы должно быть латинскими буквами в нижнем регистре (с подчеркиваниями). Примеры названий служб: | + | == Имя службы windows == |
| + | |||
| + | Имя службы должно быть латинскими буквами в нижнем регистре (с подчеркиваниями) без "_srv" в конце. Примеры названий служб: | ||
* kis_mqtt | * kis_mqtt | ||
| − | * kis_ehr_connector | + | * kis_ehr_connector |
* kis_pg_rest | * kis_pg_rest | ||
* kis_supp | * kis_supp | ||
* kis_simi_epic | * kis_simi_epic | ||
| + | == Взаимодействие с postgresql == | ||
| + | |||
| + | === Аутентификация в БД === | ||
| − | |||
* каждая служба должна работать под своим уникальным пользователем (для того чтобы можно было мониторить работу службы со стороны БД) | * каждая служба должна работать под своим уникальным пользователем (для того чтобы можно было мониторить работу службы со стороны БД) | ||
| − | * имя пользователя должно быть | + | * имя пользователя должно быть |
| − | ** большими буквами | + | ** большими буквами |
** совпадать с именем службы | ** совпадать с именем службы | ||
| − | ** заканчиваться на | + | ** заканчиваться на "SRV" |
| + | |||
| + | логин пароль храним в открытом виде в файле ini (<имя службы>.ini) | ||
| − | |||
* [Postgresql] | * [Postgresql] | ||
** user | ** user | ||
| Строка 60: | Строка 69: | ||
** password_crypt | ** password_crypt | ||
| − | === application_name в сессии | + | === application_name в сессии postgresql === |
| − | Любая сессия должна себя идентифицировать установив application_name в формате | + | Любая сессия должна себя идентифицировать установив application_name в формате <имя файла> (версия). Например: |
| − | + | kis_mqtt.exe (1.0.0.1) | |
Ниже пример кода: | Ниже пример кода: | ||
| − | <source> | + | <source > |
procedure TdmMain.conAfterConnect(Sender: TObject); | procedure TdmMain.conAfterConnect(Sender: TObject); | ||
var | var | ||
| Строка 79: | Строка 88: | ||
</source> | </source> | ||
| + | === Требования к работоспособности при потере соединения === | ||
| + | * Служба должна корректно отрабатывать ошибки, связанные с потерей соединения с БД и пытаться восстановить соединение самостоятельно. | ||
| − | === | + | === Размер work_mem === |
| − | + | для сессии которая слушает pg_listen (и только для нее) нужно проставить | |
| + | |||
| + | set session work_mem='64kB' | ||
| − | + | == Зависимость от другого ПО == | |
* служба не должна зависеть от стороннего ПО, такого как | * служба не должна зависеть от стороннего ПО, такого как | ||
| Строка 92: | Строка 105: | ||
** клиент БД | ** клиент БД | ||
| − | == Диагностика работы службы == | + | == Диагностика работы службы == |
| − | * служба должна писать информацию о событиях в файл лога. Рекомендуется использовать | + | |
| + | * служба должна писать информацию о событиях в файл лога. Рекомендуется использовать QuickLOG | ||
* файлы логов должны быть легко просматриваемы сторонними программами. | * файлы логов должны быть легко просматриваемы сторонними программами. | ||
| + | * Логи должны сами удаляться | ||
| + | |||
| + | == WEB API == | ||
| − | |||
Здесь описаны методы http, которые должна реализовать служба, чтобы можно было мониторить состояние службы. Эти методы будут вызвать сторонние приложения (админка kis_z, или другие сторонние программы) для отображения статуса работы службы | Здесь описаны методы http, которые должна реализовать служба, чтобы можно было мониторить состояние службы. Эти методы будут вызвать сторонние приложения (админка kis_z, или другие сторонние программы) для отображения статуса работы службы | ||
| − | === | + | === GET /checkstatus === |
Метод возвращает 1 в теле ответа, если сервис работает правильно | Метод возвращает 1 в теле ответа, если сервис работает правильно | ||
| Строка 105: | Строка 121: | ||
=== GET /info === | === GET /info === | ||
| − | возвращает json, в котором есть настройки, текущий статус сервера (есть подключение к БД и т.п.) | + | возвращает json, в котором есть настройки, текущий статус сервера (версия сервиса, есть подключение к БД и т.п.) Пример |
| − | Пример | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | === GET /stat === | + | <pre class=""> {"FileVer": "1.0.0.6", |
| + | "StartDT": "2018-10-17T16:08:16.867+03:00", | ||
| + | "AppExe": "C:\\KIS_SRV\\KIS_MQTT_SRV\\kis_mqtt_srv.exe", | ||
| + | "DBInfo": { | ||
| + | "ConnectStr": "192.168.1.16:7432\/emiac1", | ||
| + | "ConnectStatus": "connected", | ||
| + | "lastMessageRecivedDT": "2019-02- 04T08:20:58.302+03:00", | ||
| + | "MeessageCount": 35024, | ||
| + | "ListenState": "Active" | ||
| + | }, | ||
| + | "MQTTInfo": { | ||
| + | "ConnectStr": "192.168.1.16:1883", | ||
| + | "ConnectStatus": "active", | ||
| + | "ClientID": "V5nZpiOiintKZ1wgeg2K1f1", | ||
| + | "LastSendDT": "2019-02-04T08:20:58.302+03:00", | ||
| + | "MessageCount": 35008 }</pre> | ||
| + | === GET /stat === | ||
Возвращает json со статистикой работы за период. Для построения графика нагрузки службы (метод необязателен и делается в последнюю очередь) | Возвращает json со статистикой работы за период. Для построения графика нагрузки службы (метод необязателен и делается в последнюю очередь) | ||
Пример: | Пример: | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | === GET /showlog === | + | <pre class="">{ |
| + | "last10hour": [{ | ||
| + | "dt": "2019-02-04T08:20:00.000+03:00", | ||
| + | "Count": 10 | ||
| + | }, | ||
| + | { | ||
| + | "dt": "2019-02-04T08:21:00.000+03:00", | ||
| + | "Count": 12 | ||
| + | }, | ||
| + | { | ||
| + | "dt": "2019-02-04T08:22:00.000+03:00", | ||
| + | "Count": 9 | ||
| + | }] | ||
| + | }</pre> | ||
| + | === GET /showlog === | ||
Показывает лог работы программы | Показывает лог работы программы | ||
| Строка 156: | Строка 165: | ||
Обычная html страница, которая показывает файл лог, который лежит на сервере | Обычная html страница, которая показывает файл лог, который лежит на сервере | ||
| − | === GET /admin | + | Пример кода Delphi для вывода в ответе TIdHTTPResponseInfo файла лога в кодировке UTF8 содержащего Русскими символы: |
| + | |||
| + | if AnsiUpperCase(leftStr(ARequestInfo.URI, 15)) = '/API/V1/SHOWLOG' then | ||
| + | begin | ||
| + | SL := TStringList.Create; | ||
| + | uOTSynopseLog.TOTSynLog.Family.SynLog.Flush(True); | ||
| + | // Даём команду и ожидаем закрытия LOG файла во всех потоках. | ||
| + | uOTSynopseLog.TOTSynLog.Family.SynLog.CloseLogFile; | ||
| + | // Считываем LOG файл. Пока он не будет считан другие потоки его не откроют | ||
| + | SL.LoadFromFile(uOTSynopseLog.TOTSynLog.Family.SynLog.FileName, TEncoding.UTF8); | ||
| + | AResponseInfo.ContentType := 'text/plain'; | ||
| + | AResponseInfo.CharSet := ''''utf-8''''; | ||
| + | AResponseInfo.ContentText := SL.Text; | ||
| + | SL.Free; | ||
| + | exit; | ||
| + | end; | ||
| + | end; | ||
| + | |||
| + | === GET /admin === | ||
Возвращает html страницу управления | Возвращает html страницу управления | ||
| − | === GET /checkupdate === | + | === GET /checkupdate === |
| − | Проверить наличие обновления (в БАЗЕ) | + | |
| − | * если обновление не найдено, то возвращает пустую строку | + | Проверить наличие обновления (в БАЗЕ) |
| + | |||
| + | * если обновление не найдено, то возвращает пустую строку | ||
* если обновление найдено, то возвращает версию обновления | * если обновление найдено, то возвращает версию обновления | ||
| − | === GET /curversion === | + | === GET /curversion === |
| − | |||
| + | возвращает строку, текущая версия сервиса | ||
| + | === POST /update === | ||
| + | |||
| + | Обновиться | ||
| − | |||
| − | |||
* проверить есть ли доставленное обнове в БД | * проверить есть ли доставленное обнове в БД | ||
* вызвать утилиту обновления для сервиса | * вызвать утилиту обновления для сервиса | ||
== Документация == | == Документация == | ||
| − | В каталоге обязательно должен быть файл readme.md в формате markdown (для редактирования можно использовать Typora). В нем должны быть следующие разделы: | + | |
| + | === Файл readme.md === | ||
| + | |||
| + | В каталоге обязательно должен быть файл readme.md в формате markdown (для редактирования можно использовать Typora). Кодировка UTF-8. В нем должны быть следующие разделы: | ||
* Назначение | * Назначение | ||
| + | * Описание работы | ||
* Состав (список файлов с описанием) | * Состав (список файлов с описанием) | ||
* Установка | * Установка | ||
| − | * Настройка | + | * Настройка (что можно настроить в ini файлах, что можно настроить в adj) |
* Обновление | * Обновление | ||
* Мониторинг (проверка работоспособности, где и какие логи ведутся, как посмотреть какие ошибки возникали) | * Мониторинг (проверка работоспособности, где и какие логи ведутся, как посмотреть какие ошибки возникали) | ||
| Строка 187: | Строка 221: | ||
По правильному, содержимое файла markodown нужно продублировать на wiki (в typora есть экспорт) | По правильному, содержимое файла markodown нужно продублировать на wiki (в typora есть экспорт) | ||
| − | == | + | === Файлы-примеры конфигурационных файлов (ini.example) === |
| − | * [ | + | |
| + | Для каждого из возможных ini файлов должен лежать файл пример с расширением ini.example со всеми значениями по умолчанию и комментариями. Например для kis_mqtt.ini должен быть файл kis_mqtt.ini.example | ||
| + | |||
| + | |||
| + | === Документация разработчика === | ||
| + | |||
| + | В исходных кодах в каталоге '''DOC''' должен быть файл readme_dev.md в формате markdown | ||
| + | |||
| + | = Публикация и распространение = | ||
| + | |||
| + | на WEBDAV в папку <LAST_SRV_FILES\имя-службы_большими буквами> необходимо выложить два файла: | ||
| + | |||
| + | * <имя''службы''маленькими>.7z | ||
| + | * ver.ini | ||
| + | |||
| + | == Состав файла 7z == | ||
| + | |||
| + | # все необходимые для работы файлы | ||
| + | # ini-файлы с настройками по умолчанию (как правило это два файла) | ||
| + | # файл readme.md (см пункт "Документация") | ||
| + | |||
| + | == Содержимое файла ver.ini == | ||
| + | |||
| + | |||
| + | |||
| + | [Ver] | ||
| + | srv_ver=1.0.0.13 | ||
| + | |||
| + | == Автоматизация публикации == | ||
| + | |||
| + | В папке CI (Continuous Integration) необходимо создать два файла: | ||
| + | |||
| + | * 01_pack.bat - создает архив 7z | ||
| + | * 02_webdav.bat публикует архив в папке на WEBDAV с помощью утилиты curl | ||
| + | |||
| + | Примеры скриптов можно брать из kis''services\trunk\kis''pg_rest\CI | ||
| + | |||
| + | == Алгоритм публикации == | ||
| + | # Изменяем в проекте номер версии, успешно компилим | ||
| + | # Правим файл ver.ini в папке bin | ||
| + | # Последовательно запускаем скрипты 01_pack.bat, 02_webdav.bat (смотрим в логи что все успешно) | ||
| + | == Список сервисов == | ||
| + | * [[KIS MQTT_connector]] | ||
| + | * [[KIS_CERTIFICATE]] | ||
| + | * [[KIS_CLS_EMIAC_SRV]] | ||
| + | * [[KIS_COVID_VAC_SRV]] | ||
| + | * [[KIS_EHR_CONNECTOR_SRV]] | ||
| + | * [[KIS_EMIAC_GATE_SRV]] | ||
| + | * [[KIS_EMIAC_NSI_CSV]] | ||
| + | * [[KIS_LAB_LIS_SRV]] | ||
| + | * [[KIS_NSI_REP_SRV]] | ||
| + | * [[KIS_PG_REST]] | ||
| + | * [[KIS_RMUR_REP_SRV]] | ||
| + | * [[KIS_SIMI_SRV]] | ||
| + | * [[KIS_UPD_SRV]] | ||
| + | * [[KIS_SRV_INSTALLER]] | ||
[[Категория:Руководство программиста KIS]][[Категория:KIS сервисы]] | [[Категория:Руководство программиста KIS]][[Категория:KIS сервисы]] | ||
Текущая версия на 11:00, 21 сентября 2021
Этот файл продублирован на svn
Для сервисов ИБИС есть похожий документ см Службы_MIS3._Разработка
Содержание
Общие требования
Структура файлов
- каждая служба живет в своем каталоге
- имена каталогов в ВЕРХНЕМ регистре
- все имена файлов в нижнем регистре
- имя исполняемого файла службы должно заканчиваться на _srv
- имя службы должно начинаться с kis без "_srv" в конце!
- имя исполняемого файла по управлению службой должно заканчиваться на _ctl
- настройка подключения к БД должна храниться в файле kis.ini
- настройки службы должны храниться в <имяслужбы>.ini файле рядом с исполнимыми файлами. см. [Конфигурационные файлы KIS](Конфигурационныефайлы_KIS "wikilink")
Пример расположения служб
KIS_SRV
├─KIS_MQTT
│ ├──kis_mqtt_srv.exe
│ ├──kis_mqtt_ctl.exe
│ ├──kis.ini
│ │ kis_mqtt.ini
│ │ kis_mqtt.ini.example
│ │ readme.md
│ └──LOG - Папка с логами
└─KIS_EHR_CONNECTOR
├──kis_ehr_connector_srv.exe
├──kis_ehr_connector_ctl.exe
├──kis.ini
├──kis_ehr_connector.ini
├──kis_ehr_connector.ini.example
├──readme.md
└──LOG
Именования файлов
- _srv.exe севрис
- _ctl.exe управляющая программ
- _app.EXE в виде отдельного приложения (на этапе разработки)
Все исполняемые файлы (*.exe) должны содержать актуальную информацию о версии (номер версии должен совпадать с номером ревизии SVN на котором этот exe собран)
Имя службы windows
Имя службы должно быть латинскими буквами в нижнем регистре (с подчеркиваниями) без "_srv" в конце. Примеры названий служб:
- kis_mqtt
- kis_ehr_connector
- kis_pg_rest
- kis_supp
- kis_simi_epic
Взаимодействие с postgresql
Аутентификация в БД
- каждая служба должна работать под своим уникальным пользователем (для того чтобы можно было мониторить работу службы со стороны БД)
- имя пользователя должно быть
- большими буквами
- совпадать с именем службы
- заканчиваться на "SRV"
логин пароль храним в открытом виде в файле ini (<имя службы>.ini)
- [Postgresql]
- user
- password
- password_crypt
application_name в сессии postgresql
Любая сессия должна себя идентифицировать установив application_name в формате <имя файла> (версия). Например:
kis_mqtt.exe (1.0.0.1)
Ниже пример кода:
procedure TdmMain.conAfterConnect(Sender: TObject);
var
S : String;
begin
S := ExtractFileName(FSrvInfo.AppExe);
S := S+ ' (' + FSrvInfo.FileVer + ')';
con.ExecSQL('SET application_name = ''' + S + ''''); // устанваливаем переменную application_name (pg_stat_activity)
end;Требования к работоспособности при потере соединения
- Служба должна корректно отрабатывать ошибки, связанные с потерей соединения с БД и пытаться восстановить соединение самостоятельно.
Размер work_mem
для сессии которая слушает pg_listen (и только для нее) нужно проставить
set session work_mem='64kB'
Зависимость от другого ПО
- служба не должна зависеть от стороннего ПО, такого как
- вебсерверы (IIS, APACH)
- Net framework
- клиент БД
Диагностика работы службы
- служба должна писать информацию о событиях в файл лога. Рекомендуется использовать QuickLOG
- файлы логов должны быть легко просматриваемы сторонними программами.
- Логи должны сами удаляться
WEB API
Здесь описаны методы http, которые должна реализовать служба, чтобы можно было мониторить состояние службы. Эти методы будут вызвать сторонние приложения (админка kis_z, или другие сторонние программы) для отображения статуса работы службы
GET /checkstatus
Метод возвращает 1 в теле ответа, если сервис работает правильно
GET /info
возвращает json, в котором есть настройки, текущий статус сервера (версия сервиса, есть подключение к БД и т.п.) Пример
{"FileVer": "1.0.0.6",
"StartDT": "2018-10-17T16:08:16.867+03:00",
"AppExe": "C:\\KIS_SRV\\KIS_MQTT_SRV\\kis_mqtt_srv.exe",
"DBInfo": {
"ConnectStr": "192.168.1.16:7432\/emiac1",
"ConnectStatus": "connected",
"lastMessageRecivedDT": "2019-02- 04T08:20:58.302+03:00",
"MeessageCount": 35024,
"ListenState": "Active"
},
"MQTTInfo": {
"ConnectStr": "192.168.1.16:1883",
"ConnectStatus": "active",
"ClientID": "V5nZpiOiintKZ1wgeg2K1f1",
"LastSendDT": "2019-02-04T08:20:58.302+03:00",
"MessageCount": 35008 }
GET /stat
Возвращает json со статистикой работы за период. Для построения графика нагрузки службы (метод необязателен и делается в последнюю очередь)
Пример:
{
"last10hour": [{
"dt": "2019-02-04T08:20:00.000+03:00",
"Count": 10
},
{
"dt": "2019-02-04T08:21:00.000+03:00",
"Count": 12
},
{
"dt": "2019-02-04T08:22:00.000+03:00",
"Count": 9
}]
}
GET /showlog
Показывает лог работы программы
Обычная html страница, которая показывает файл лог, который лежит на сервере
Пример кода Delphi для вывода в ответе TIdHTTPResponseInfo файла лога в кодировке UTF8 содержащего Русскими символы:
if AnsiUpperCase(leftStr(ARequestInfo.URI, 15)) = '/API/V1/SHOWLOG' then begin SL := TStringList.Create; uOTSynopseLog.TOTSynLog.Family.SynLog.Flush(True); // Даём команду и ожидаем закрытия LOG файла во всех потоках. uOTSynopseLog.TOTSynLog.Family.SynLog.CloseLogFile; // Считываем LOG файл. Пока он не будет считан другие потоки его не откроют SL.LoadFromFile(uOTSynopseLog.TOTSynLog.Family.SynLog.FileName, TEncoding.UTF8); AResponseInfo.ContentType := 'text/plain'; AResponseInfo.CharSet := 'utf-8'; AResponseInfo.ContentText := SL.Text; SL.Free; exit; end; end;
GET /admin
Возвращает html страницу управления
GET /checkupdate
Проверить наличие обновления (в БАЗЕ)
- если обновление не найдено, то возвращает пустую строку
- если обновление найдено, то возвращает версию обновления
GET /curversion
возвращает строку, текущая версия сервиса
POST /update
Обновиться
- проверить есть ли доставленное обнове в БД
- вызвать утилиту обновления для сервиса
Документация
Файл readme.md
В каталоге обязательно должен быть файл readme.md в формате markdown (для редактирования можно использовать Typora). Кодировка UTF-8. В нем должны быть следующие разделы:
- Назначение
- Описание работы
- Состав (список файлов с описанием)
- Установка
- Настройка (что можно настроить в ini файлах, что можно настроить в adj)
- Обновление
- Мониторинг (проверка работоспособности, где и какие логи ведутся, как посмотреть какие ошибки возникали)
По правильному, содержимое файла markodown нужно продублировать на wiki (в typora есть экспорт)
Файлы-примеры конфигурационных файлов (ini.example)
Для каждого из возможных ini файлов должен лежать файл пример с расширением ini.example со всеми значениями по умолчанию и комментариями. Например для kis_mqtt.ini должен быть файл kis_mqtt.ini.example
Документация разработчика
В исходных кодах в каталоге DOC должен быть файл readme_dev.md в формате markdown
Публикация и распространение
на WEBDAV в папку <LAST_SRV_FILES\имя-службы_большими буквами> необходимо выложить два файла:
- <имяслужбымаленькими>.7z
- ver.ini
Состав файла 7z
- все необходимые для работы файлы
- ini-файлы с настройками по умолчанию (как правило это два файла)
- файл readme.md (см пункт "Документация")
Содержимое файла ver.ini
[Ver] srv_ver=1.0.0.13
Автоматизация публикации
В папке CI (Continuous Integration) необходимо создать два файла:
- 01_pack.bat - создает архив 7z
- 02_webdav.bat публикует архив в папке на WEBDAV с помощью утилиты curl
Примеры скриптов можно брать из kisservices\trunk\kispg_rest\CI
Алгоритм публикации
- Изменяем в проекте номер версии, успешно компилим
- Правим файл ver.ini в папке bin
- Последовательно запускаем скрипты 01_pack.bat, 02_webdav.bat (смотрим в логи что все успешно)