Эксплуатация и обновление
Документация · Конфигурация · Архитектура
Запуск менеджера
Запускайте run.py из корня проекта с выбранным JSON. По умолчанию работает один
процесс приложения без автоматического перезапуска при правке исходников.
Для разработки доступен --reload; загрузка обновления Git через интерфейс
в этом режиме запрещена, чтобы изменение Python-файлов не прервало саму задачу.
После перехода со старой версии, где reload был включён всегда, перезапустите
run.py, чтобы начал действовать новый режим запуска.
Очередь задач и подтверждения реквизитов находятся в памяти одного процесса. Не запускайте несколько менеджеров над одним JSON и не используйте несколько worker-процессов. Остановка приложения не останавливает автоматически все терминалы; она также не гарантирует завершение текущей операции создания. Перед выключением дождитесь окончания задач.
Обновление через настройки
Раздел «Обновление проекта и сервиса» выполняет три отдельные операции:
- «Проверить обновления» вызывает
git fetchдля remote текущей ветки и показывает отставание от upstream. Рабочие файлы при проверке не заменяются. - «Загрузить обновление» выполняет только fast-forward. Рабочее дерево должно быть чистым, включая неотслеживаемые файлы; локальные коммиты требуют ручного объединения. Автоматического stash, сброса или переключения ветки нет.
- «Собрать и разложить сервис» принудительно компилирует исходник текущего проекта
через MetaEditor и копирует подтверждённый EX5 во все существующие экземпляры
в подпапках
mt5_folder / имя экземпляра. Загруженный файл-образец здесь не используется.
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 без записи автозапуска недостаточен.
Скрипт развёртывания из четвёртой части
Для прежнего сценария доступен:
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 или
установка, выбранная через mt5_installation (либо определённая по расположению
проекта в Shared Projects). Автозапуск настраивается тем же способом, что и
через интерфейс, с подстановкой имени базы и сохранением других сервисов.
Для копирования одного сервиса с учётом текущих путей используйте новый интерфейс.
Резервные копии
Сохраняйте личный 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 до повторного создания с тем же именем.