Магия деплоя: автоматическое развертывание Coreness одной командой
О чем статья
В этой статье рассматривается решение проблемы деплоя Telegram-бота Coreness. Вместо ручного копирования файлов, настройки зависимостей и миграций БД была создана система, которая делает всё автоматически.
Что получится:
- Развернуть бота одной командой
- Автоматически обновляться без потери данных
- Умно мигрировать базу данных
- Устанавливать SSL-сертификаты
- Откатываться при ошибках
Напоминание
Coreness — это современное ядро с модульной архитектурой на основе плагинов, позволяющее создать Telegram-ботов с уникальными сценариями и полным контролем процессов.
Про создание ядра и архитектуру можно прочитать в предыдущей статье: Мой первый пет-проект.
Часть 1: Быстрый старт за 5 минут
Способ 1: Через командную строку
Способ 2: Через веб-интерфейс GitHub
- Перейти на страницу скрипта в GitHub
- Нажать кнопку "Download raw file" в правом верхнем углу
- Сохранить и запустить скрипт: python core_updater.py
Рекомендуется запускать скрипт через консоль/терминал, а не двойным кликом мыши.
Правильно: python core_updater.py в терминале
Неправильно: двойной клик на файле .py
Почему: При первичной установке проблем обычно не возникает, но при обновлении существующего проекта могут быть непредвиденные ошибки с путями, переменными окружения и скрипт может закрыться до завершения операций
Что происходит дальше:
- Скрипт автоматически определяет, что это первая установка
- Предлагает выбрать версию (Base/Pro)
- Base версия — скачивается без токена (публичный репозиторий)
- Pro версия — требует GitHub токен (приватный репозиторий)
- Устанавливает зависимости Python
- Создает базу данных
- Самоудаляется после завершения
Результат
Через 5 минут у вас есть полностью готовое ядро Coreness с:
- Настроенной базой данных
- Установленными зависимостями
- Готовыми конфигурациями
- Логами и папками для данных
Важно: Это готовое ядро, которое ожидает настройки конфигом для сценариев. Если скачать базовые конфиги (обновить заводские конфиги), то по умолчанию будут настроены базовые тестовые сценарии для всех плагинов, модулей и возможностей.
Часть 2: Как работает магия обновления
Умный скрипт core_updater.py
Проблема: Как автоматически понять, что хочет пользователь — установить бота впервые или обновить существующего?
Решение: Используем расположение скрипта как индикатор намерений. Если скрипт лежит в папке tools/ — это обновление существующего проекта. Если где-то еще — первая установка.
Почему это эффективно:
- Нулевая настройка — пользователь просто скачивает скрипт куда хочет
- Автоматическое определение — система сама понимает, что делать
- Безопасность — невозможно случайно перезаписать существующий проект
- Универсальность — один скрипт для двух задач
Как это работает: Скрипт анализирует свой путь и выбирает стратегию. При установке создается новая папка, при обновлении система работает с существующей.
Умная работа с токенами
Проблема: Как обеспечить доступ к разным версиям (публичной и приватной)?
Решение: Гибридная система токенов с fallback на ручной ввод.
Стратегия токенов:
- Base версия — скачивается без токена (публичный репозиторий)
- Pro версия — требует токен (приватный репозиторий)
- Автоматический fallback — если токен не найден в переменных окружения, запрашиваем вручную
- Повторные попытки — при ошибках скачивания пробуем разные методы
Что это дает:
- Простота для Base — никаких токенов не нужно
- Гибкость для Pro — можно использовать переменные окружения или вводить вручную
- Надежность — несколько методов скачивания на случай проблем
- Прозрачность — пользователь понимает, что происходит
Система резервного копирования
Проблема: Как сделать бэкап, который защитит важные данные, но не будет занимать много места?
Решение: Умная система исключений с разными стратегиями для разных типов файлов.
Стратегия бэкапа:
- Критичные данные (logs/, data/, .git/) — исключаем из бэкапа (не трогаем)
- Временные файлы (.venv/, pycache/, *.pyc) — исключаем (легко восстанавливаются)
- Заводские конфиги (config/, resources/) — бэкап по запросу (обновляем отдельно)
- Код и плагины — полный бэкап (пересоздаем при обновлении)
Что получается:
- Пользовательские данные (logs/, data/) не трогаются
- Настройки бота можно обновлять отдельно
- Git-история сохраняется
- При ошибке — полный откат
- Бэкап занимает минимум места — только то, что действительно нужно
Чистая синхронизация vs обновление
Проблема: Как обновлять файлы, чтобы не потерять пользовательские изменения, но при этом гарантировать работоспособность?
Решение: Гибридная стратегия — разные подходы для разных типов файлов.
Стратегия обновления:
- Критичные компоненты (plugins/, app/, tools/) — чистая синхронизация (полное пересоздание)
- Остальные файлы — умное обновление (сохранение изменений)
Почему так:
- Плагины — должны быть в точности как в репозитории, иначе бот не запустится
- Приложение — критичный код, любые изменения могут сломать систему
- Инструменты — должны быть актуальными для корректной работы
- Остальное — пользователь может кастомизировать, изменения сохраняются
Результат: Безопасность + гибкость. Критичные части всегда работают, пользовательские настройки сохраняются.
Обработка ошибок и откат
Проблема: Что делать, если обновление сломалось на полпути? Как не оставить проект в нерабочем состоянии?
Решение: Многоуровневая система защиты с гарантированным откатом.
Стратегия защиты:
- Перед любыми изменениями — создаем полный бэкап
- Во время обновления — отслеживаем каждый шаг
- При ошибке — немедленно останавливаем процесс
- Автоматический откат — восстанавливаем проект из бэкапа
- Fallback — если автоматический откат не сработал, сохраняем бэкап для ручного восстановления
Что это дает:
- Гарантия работоспособности — проект всегда в стабильном состоянии
- Нулевой риск — даже при критических ошибках ничего не ломается
- Простота восстановления — максимум один бэкап для восстановления
- Прозрачность — пользователь всегда знает, что происходит
Результат: Можно спокойно обновляться — система обеспечивает стабильность проекта.
Часть 3: Умные миграции базы данных
Возможности скрипта database_manager.py
- Пересоздавать таблицы
- Обновлять индексы
- Мигрировать схему с сохранением данных
- Удалять таблицы
Умная миграция
Проблема: Как обновить структуру базы данных, не потеряв пользовательские данные? Особенно когда SQLite не поддерживает некоторые операции.
Решение: Интеллектуальная система миграции с автоматическим определением стратегии.
Алгоритм работы:
- Создание бэкапа — полная копия БД перед любыми изменениями
- Анализ структуры — сравнение существующих таблиц с новыми моделями
- Выбор стратегии — для каждой таблицы определяем оптимальный способ обновления
- Безопасное изменение — добавляем колонки, удаляем лишние (если возможно)
- Пересоздание при необходимости — если SQLite не поддерживает операцию, пересоздаем таблицу с сохранением данных
Умные решения:
- Автоматическое определение поддерживаемых операций SQLite
- Сохранение данных при любых изменениях структуры
- Обработка ошибок с полным откатом при проблемах
- Обновление индексов для оптимальной производительности
Результат: Пользователь просто запускает миграцию, а система автоматически определяет, как безопасно обновить БД.
Сохранение данных при изменении структуры
Проблема: Что делать, когда нужно кардинально изменить структуру таблицы, а SQLite не поддерживает DROP COLUMN?
Решение: Безопасное пересоздание таблицы с полным сохранением данных.
Процесс пересоздания:
- Создание временной таблицы — с новой структурой, но пустой
- Перенос данных — построчное копирование с преобразованием типов
- Обработка ошибок — если данные не помещаются в новый формат, используем NULL
- Атомарная замена — удаляем старую таблицу, переименовываем новую
Умные особенности:
- Сохранение всех данных — даже если структура кардинально изменилась
- Преобразование типов — автоматическая адаптация данных к новой схеме
- Graceful degradation — при проблемах с данными используем безопасные значения
- Атомарность — либо все изменения применяются, либо ничего
Результат: Можно смело менять структуру БД — данные всегда сохранятся, а система останется стабильной.
Бонусная часть: SSL-сертификаты для российских сервисов
Зачем нужны российские сертификаты?
Многие российские сервисы (Сбер, Госуслуги) используют собственные центры сертификации. Без их сертификатов Python не может установить SSL-соединение.
Автоматическая установка
Проблема: Многие российские сервисы (Сбер, Госуслуги) используют собственные центры сертификации. Без их сертификатов Python не может установить SSL-соединение.
Решение: Автоматический установщик, который скачивает и устанавливает российские сертификаты.
Как это работает:
- Скачивание сертификатов — автоматически с официальных источников
- Распаковка архивов — поиск .cer файлов в ZIP архивах
- Создание объединенного файла — все сертификаты в одном месте
- Кроссплатформенная установка — разные способы для Windows и Linux
- Тестирование соединений — проверка работоспособности с реальными серверами
Умные особенности:
- Автоматическое определение ОС — Windows или Linux
- Проверка прав администратора — предупреждение при недостатке прав
- Обработка ошибок — graceful fallback при проблемах
- Очистка временных файлов — не засоряем систему
Важно: В проекте уже есть готовый объединенный файл ssl_certificates/russian_certs.pem, который работает как на Windows, так и на Linux без дополнительной установки в систему.
Что получилось в итоге
Автоматизация деплоя
- Одна команда для установки
- Автоматическое обновление без потери данных
- Умные бэкапы с исключениями
- Полный откат при ошибках
Безопасность
- Выбор версии (Base/Pro)
- Обновление конфигов по запросу
- Кроссплатформенность (Windows/Linux)
- Гибкая работа с токенами — переменные окружения или ручной ввод
Ссылки:
- Предыдущая статья: Мой первый пет-проект
- Репозиторий: github.com/Vensus137/Coreness
- Демо‑бот: t.me/coreness_bot
- Группа проекта: t.me/coreness