# Эксплуатация и обновление [Документация](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 / имя экземпляра`. Загруженный файл-образец здесь не используется. 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` или установка, выбранная через `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 до повторного создания с тем же именем.