bifurcado de antekov/mt5-manager
# Эксплуатация и обновление
| |
| |
[Документация](README.md) · [Конфигурация](configuration.md) · [Архитектура](architecture.md)
| |
| |
## Запуск менеджера
| |
| |
Запускайте `run.py` из корня проекта с выбранным JSON. По умолчанию работает один
| |
процесс приложения без автоматического перезапуска при правке исходников.
| |
Для разработки доступен `--reload`; загрузка обновления Git через интерфейс
| |
в этом режиме запрещена, чтобы изменение Python-файлов не прервало саму задачу.
| |
После перехода со старой версии, где reload был включён всегда, перезапустите
| |
`run.py`, чтобы начал действовать новый режим запуска.
| |
| |
Очередь задач и подтверждения реквизитов находятся в памяти одного процесса.
| |
Не запускайте несколько менеджеров над одним JSON и не используйте несколько
| |
worker-процессов. Остановка приложения не останавливает автоматически все терминалы;
| |
она также не гарантирует завершение текущей операции создания. Перед выключением
| |
дождитесь окончания задач.
| |
| |
## Обновление через настройки
| |
| |
Раздел «Обновление проекта и сервиса» выполняет три отдельные операции:
| |
| |
1. «Проверить обновления» вызывает `git fetch` для remote текущей ветки и показывает
| |
отставание от upstream. Рабочие файлы при проверке не заменяются.
| |
2. «Загрузить обновление» выполняет только fast-forward. Рабочее дерево должно
| |
быть чистым, включая неотслеживаемые файлы; локальные коммиты требуют ручного
| |
объединения. Автоматического stash, сброса или переключения ветки нет.
| |
3. «Собрать и разложить сервис» принудительно компилирует исходник текущего проекта
| |
через MetaEditor и копирует подтверждённый EX5 во все существующие экземпляры
| |
в подпапках `mt5_folder / имя экземпляра`. Используется MetaEditor из исходной установки.
| |
| |
Git и доступ к удалённому репозиторию должны быть настроены у пользователя Windows,
| |
от которого работает менеджер. Нужен checkout с upstream; архив исходников без
| |
Git для этой операции не подходит. Проверка не устанавливает зависимости Python.
| |
После загрузки кода проверьте изменения `requirements.txt`, установите зависимости
| |
при необходимости и перезапустите менеджер, чтобы он загрузил новую версию Python-кода.
| |
| |
Проверка свежести сервиса сравнивает время изменения MQ5 и EX5; отличие EX5 в
| |
установленных копиях определяется по содержимому. Кнопку сборки можно нажать
| |
и после ручного `git pull`. Сборка выполняется заново по явной команде пользователя.
| |
При неудаче компиляции старый EX5 не распространяется. Ошибка копирования в один
| |
экземпляр не отменяет успешно выполненные копирования; результат покажет, какие
| |
папки нужно обработать повторно.
| |
| |
При ошибке развёртывания интерфейс и консоль менеджера показывают для каждого
| |
экземпляра этап, целевой путь и сообщение Windows. «Проверка установки терминала»
| |
означает, что в `mt5_folder / имя экземпляра` не найден `mt5_exe`; проверьте
| |
базовую папку в настройках и расположение терминала на диске. Ошибки создания
| |
папки, копирования и замены EX5 позволяют отдельно проверить права записи
| |
и блокировку файла. Смена `mt5_folder` сразу меняет пути всех экземпляров,
| |
но не переносит их папки и не останавливает процессы в старом каталоге.
| |
| |
Работающие терминалы автоматически не останавливаются. После замены EX5 на диске
| |
перезапустите указанные в результате экземпляры, чтобы они загрузили новую программу.
| |
Кнопка также проверяет и при необходимости добавляет или исправляет запись
| |
автозапуска ServiceStateWriter в `config/services.ini`: путь EX5, `enabled=1`
| |
и `InpDatabase`. Другие сервисы и собственные параметры интервала сохраняются.
| |
Если конфигурацию нужно изменить у работающего терминала, операция попросит
| |
остановить этот экземпляр и повторить развёртывание: MT5 может перезаписать
| |
`services.ini` при завершении. Один EX5 без записи автозапуска недостаточен.
| |
| |
## Скрипт развёртывания из четвёртой части
| |
| |
Для прежнего сценария доступен:
| |
| |
```powershell
| |
python deploy_service.py --config-file config.local.json
| |
```
| |
| |
Он клонирует или обновляет репозиторий в `MQL5/Shared Projects/mt5-manager` каждого
| |
терминала, собирает сервис один раз из текущего проекта и копирует
| |
EX5 и `static/services.ini`. Ветка по умолчанию берётся из текущего checkout;
| |
её можно задать `--branch`, а адрес репозитория — `--repo-url`.
| |
| |
Скрипт строит пути экземпляров от `mt5_folder` и работает с отдельно клонированным
| |
проектом. Для компиляции нужен `MetaEditor64.exe` в единственной исходной
| |
установке, указанной в `terminal_template`. Автозапуск настраивается тем же способом, что и
| |
через интерфейс, с подстановкой имени базы и сохранением других сервисов.
| |
Для копирования одного сервиса с учётом текущих путей используйте новый интерфейс.
| |
| |
## Резервные копии
| |
| |
Сохраняйте личный JSON, папку исходной установки, нужные программы и настройки установленных
| |
терминалов. JSON содержит пароли счетов и требует такого же ограничения доступа,
| |
как другие файлы с реквизитами.
| |
| |
SQLite в режиме WAL может иметь файлы `-wal` и `-shm`. Для простой файловой копии
| |
сначала остановите все сервисы, пишущие в эту базу, и менеджер, затем убедитесь,
| |
что соединения закрыты. Для копии работающей базы используйте механизм SQLite
| |
backup, а не копирование одного открытого файла. Текущая база хранит последнее
| |
состояние, но автоматических миграций в ней нет.
| |
| |
Если после обновления изменилась схема, сделайте резервную копию и выполните
| |
предусмотренное изменением преобразование. Для пересоздания базы только с текущими
| |
снимками можно при остановленных писателях убрать прежние файлы из рабочей папки
| |
в резервный каталог; при запуске сервис создаст новую базу. `CREATE TABLE IF NOT EXISTS`
| |
не добавляет колонки в существующую таблицу.
| |
| |
## Доступ с другого компьютера
| |
| |
`--host 127.0.0.1` разрешает только локальные обращения. Для прослушивания сетевых
| |
интерфейсов используется `--host 0.0.0.0` или конкретный адрес сервера, в браузере
| |
же указывается адрес самого сервера. Значение по умолчанию в `run.py` — `0.0.0.0`;
| |
быстрый старт явно ограничивает доступ локальным адресом.
| |
| |
В менеджере пока нет аутентификации, разграничения прав и встроенного HTTPS.
| |
Доступ к интерфейсу позволяет менять счета, загружать EXE и обновлять код.
| |
Для удалённой работы ограничьте доступ доверенной сетью/VPN либо защитите его
| |
внешним шлюзом с аутентификацией и TLS. Не публикуйте такой порт напрямую в Интернет.
| |
| |
## Если что-то не работает
| |
| |
| Симптом | Что проверить |
| |
|---|---|
| |
| «Запускается» дольше обычного | Сервис запущен, EX5 свежий, `InpDatabase` и Python читают один файл, время Windows корректно |
| |
| «Нет подключения» | Наличие сервера в `servers.dat`, сеть, реквизиты; это не обязательно ошибка запуска сервиса |
| |
| Создание прервано по тайм-ауту | Журналы терминала, первый запуск и LiveUpdate; при необходимости увеличьте `startup_timeout_sec` |
| |
| `read_state(...): no such column` | Версии сервиса и схемы базы разошлись; читайте сообщение в консоли менеджера |
| |
| `read_state(...): no such table: terminals` | Python читает базу, в которой сервис ещё не создал схему. Сравните `database` из сообщения с путём «База сервиса» в журнале MT5; проверьте запуск сервиса и ошибки создания таблиц |
| |
| MetaEditor завершился, но сборка не подтверждена | Откройте MQ5 в MetaEditor, проверьте компиляцию и путь EX5; нулевого кода возврата недостаточно |
| |
| Обновление Git недоступно | Git установлен, upstream задан, дерево чистое, нет собственных коммитов, менеджер запущен без `--reload` |
| |
| Код обновился, поведение прежнее | Перезапустите менеджер; для нового EX5 также перезапустите нужные терминалы |
| |
| Неудачная смена счёта | Исправьте сохранённые реквизиты; папка экземпляра сохраняется, но конфигурация уже обновлена |
| |
| |
Менеджер выводит причины ошибок SQLite в консоль. Подробности запуска и подключения
| |
смотрите также в журналах конкретного MT5. В случае ошибки отката новой установки
| |
сверьте её папку и JSON до повторного создания с тем же именем.
|