Как выложить проект с базой данных
Пока проект живёт на вашем компьютере, база рядом с ним ставится в одну команду. Как только дело доходит до публикации, начинается отдельная история: где база будет жить, как к ней подключиться из приложения, куда девать пароль, что будет с данными при следующем обновлении кода. Классический путь — арендовать сервер, поставить туда базу, настроить доступ и не забыть про бэкапы.
Приложение с базой можно вынести целиком, одним проектом. Netrun поднимает связанные сервисы по файлу docker-compose: приложение и базу рядом, до пяти сервисов в проекте. Данные лежат в постоянном хранилище и переживают обновление кода. Ниже — как это собрать.
Опишите приложение и базу в одном файле
Положите в корень проекта файл docker-compose.yml и опишите в нём два сервиса: ваше приложение и базу — PostgreSQL, MySQL, MongoDB или Redis, готовым официальным образом. Приложение мы соберём из вашего кода, база возьмётся из образа: ставить и настраивать её вручную не нужно.
Подключите базе постоянное хранилище
Это главный шаг, который нельзя пропускать. Добавьте базе именованный том и подключите его к папке, где база хранит файлы. Без тома данные лежат внутри контейнера и очистятся при первом же обновлении кода. С томом они переживают перезапуск и повторную публикацию — мы удаляем такие данные, только когда вы сами удаляете проект.
Соедините сервисы по имени, а не по адресу
Внутри проекта сервисы видят друг друга по имени из файла описания. Если база названа db, приложение подключается к хосту db на стандартном порту базы — прописывать IP-адреса не нужно и не следует, они меняются при перезапуске. Наружу база при этом не торчит: публичный адрес получает только приложение, а база доступна лишь соседнему сервису.
Вынесите пароль базы в секреты
Пароль базы, имя пользователя и строку подключения не пишите в файле описания и не оставляйте в коде — читайте их из переменных окружения. При настройке проекта Netrun спросит эти значения и подставит в окружение в зашифрованном виде, поэтому в архиве и в репозитории пароля не будет.
Загрузите проект и накатите схему
Загрузите папку ZIP-архивом или импортируйте репозиторий из GitHub. Netrun увидит описание сервисов, поднимет базу и приложение и выдаст публичный адрес с HTTPS. Создание таблиц оставьте на стороне приложения — миграции при старте или встроенный механизм фреймворка. Тогда при первом запуске схема появится сама, а при следующих обновлениях данные останутся на месте.
Итог: приложение и база живут одним проектом, подключение настроено, пароль лежит в секретах, а данные не пропадают при обновлении кода. Сервера, ручной установки базы и настройки доступа при этом не потребовалось. Попробовать Netrun.
Частые вопросы
Пропадут ли данные при обновлении кода?
Нет, если базе подключён именованный том. Тогда при обновлении кода пересобирается только приложение, а файлы базы остаются на месте. Без тома данные лежат внутри контейнера и очищаются при первой же повторной публикации, поэтому этот шаг обязателен.
Какие базы данных можно поднять?
Любые, у которых есть готовый образ: PostgreSQL, MySQL, MariaDB, MongoDB, Redis и другие. Достаточно описать сервис в файле docker-compose — ставить и настраивать базу вручную не нужно.
Как приложение подключается к базе?
По имени сервиса из файла описания. Если база названа db, в строке подключения указывается хост db и стандартный порт базы. IP-адреса прописывать не нужно: они меняются при перезапуске, а имя остаётся прежним.
Будет ли база доступна из интернета?
Нет. Публичный адрес получает только приложение, а база видна лишь соседним сервисам внутри проекта. Это правильное поведение: открытая наружу база — самый частый способ потерять данные.
Сколько сервисов помещается в один проект?
До пяти. Обычно этого хватает: приложение, база, кэш и, например, фоновый обработчик задач.
Можно ли запустить несколько сервисов сразу?
Да. Через docker-compose можно поднять до пяти связанных сервисов в одном проекте — например, приложение вместе с базой данных.
Сохранятся ли данные при обновлении кода?
Да. База данных и файлы проекта переживают обновление кода и перезапуск, ссылка проекта тоже остаётся прежней.
Где указать токены и другие секретные значения?
В настройках проекта есть раздел для значений из кода — например, токена от BotFather. Мы храним их в зашифрованном виде.