Сервисы и скрипты
Хостинг для дашборда: куда выложить, чтобы открыли коллеги
Коротко
Чтобы дашбордом пользовались коллеги, ему нужен хостинг с публичным адресом: локальная ссылка вида localhost открывается только на вашем компьютере, а VPN или проброс портов ради пары графиков никто настраивать не станет. Хостинг для дашборда на Streamlit, Dash, Plotly или Gradio выглядит так: вы загружаете код в Netrun, платформа сама собирает проект, запускает его и выдаёт ссылку с HTTPS, которую можно отправить в рабочий чат. Единственное требование к коду: приложение должно слушать порт из переменной окружения PORT и адрес 0.0.0.0, а не значения, прописанные в коде.
Дашборд обычно доживает до состояния «работает у меня» за один вечер, а дальше начинается самое неприятное. Хостинг для дашборда упирается не в язык и не в библиотеку графиков: локальный адрес коллеге не откроется, отправлять скриншоты в чат стыдно, а классические обходные пути — пустить всех в корпоративный VPN, пробросить порт наружу или оставить включённым свой ноутбук — либо не согласует служба безопасности, либо перестанет работать в тот момент, когда вы закроете крышку.
В Netrun путь короче: вы загружаете папку с кодом, платформа сама определяет, что перед ней приложение с веб-интерфейсом, ставит зависимости, запускает его и выдаёт публичную ссылку с HTTPS. Принцип одинаковый для Streamlit, Dash и Plotly, Gradio и просто веб-приложения с графиками, которое вы написали сами, — меняется только то, какие файлы лежат в проекте.
Уберите из кода фиксированный порт и адрес#
Порт, на котором работает дашборд, задаёт платформа через переменную окружения PORT — читайте его оттуда, а не прописывайте числом в коде или в файле настроек фреймворка. Слушать нужно адрес 0.0.0.0, а не localhost: приложение, которое слушает localhost, доступно только само себе, и ссылка останется пустой. Порт, вписанный числом прямо в код, — причина номер один, по которой дашборд собирается, но не открывается.
Решите, откуда дашборд берёт данные#
Файл с данными, который лежит рядом с кодом, попадает на сервер вместе с проектом и меняется только при следующей публикации — для справочника это нормально, для ежедневных цифр нет. Если данные должны быть живыми, читайте их из базы или из внешнего источника по ключу, а не из выгрузки в архиве. Отдельной услуги «база данных» у платформы нет: базу либо поднимают рядом с дашбордом своим файлом docker-compose (приложение и база — два сервиса одного проекта), либо берут внешнюю. Строку подключения платформа спросит при настройке и сохранит в секретах.
Сохраняйте то, что дашборд пишет сам, в постоянную папку#
Кэш тяжёлых расчётов, выгруженные отчёты, сохранённые пользователем настройки — всё это нужно писать в постоянную папку проекта /data. Файлы, созданные просто рядом с кодом, при следующей публикации появляются заново в исходном виде, а содержимое /data переживает и обновление кода, и перезапуск. Содержимое этой папки видно в кабинете на вкладке «Данные»: файл можно скачать, загрузить или удалить. Если у проекта свой docker-compose, папки /data нет — там постоянное хранилище это именованные тома из вашего файла.
Закройте дашборд паролем внутри приложения#
Ссылка публичная: кто её знает, тот и откроет, поэтому проверку доступа делайте в самом приложении — формой входа или общим паролем перед показом содержимого. У популярных фреймворков для дашбордов это обычно либо настройка, либо небольшое дополнение, а в своём приложении достаточно простой формы. Сам пароль держите в секретах: при настройке проекта Netrun спросит значения и подставит их в переменные окружения в зашифрованном виде, так что в архиве и в репозитории они лежать не будут.
Загрузите код и отправьте ссылку коллегам#
Принесите проект архивом (ZIP, RAR, 7z, tar) или импортом репозитория с GitHub, в том числе приватного. Зависимости и собранные папки вроде venv или node_modules класть в архив не нужно — они ставятся при сборке. Дальше платформа соберёт проект, запустит его и выдаст адрес с HTTPS; логи и статус публикации видны в кабинете в реальном времени, поэтому ошибку видно сразу, а не по белой странице.
Выберите режим работы под то, как вы показываете дашборд#
На бесплатном тарифе можно держать один проект, и дашборд в нём засыпает, когда им долго никто не пользуется, а просыпается сам, когда кто-то открывает ссылку — первый заход после паузы чуть дольше обычного. Для внутреннего отчёта, который смотрят пару раз в неделю, этого достаточно. Если дашборд показывают вживую на созвоне или он должен отвечать быстро в любой момент, берите тариф Pro: там проект работает круглосуточно без засыпания.
В итоге у дашборда появляется обычный адрес, который можно отправить в рабочий чат, добавить в закладки или вставить во внутреннюю вики. Никакого VPN, проброса портов и включённого ноутбука: проект живёт на сервере, при сбое перезапускается сам, а обновление отчёта сводится к загрузке новой версии кода — ссылка остаётся прежней. Попробовать Netrun.
Частые вопросы
Подойдёт ли это для Dash, Plotly или Gradio?
Да. Платформа не привязана к одному фреймворку: подходит любое приложение с веб-интерфейсом, которое слушает порт из переменной окружения PORT. Стек определяется по файлам проекта — например, по requirements.txt для Python или package.json для Node.js, — и нужная команда запуска подбирается автоматически.
Как сделать, чтобы цифры на дашборде обновлялись сами?
Обновление должно происходить внутри приложения: дашборд каждый раз читает свежие данные из базы или из внешнего источника, а не из файла, загруженного вместе с кодом. Отдельного планировщика по расписанию на платформе нет, поэтому периодический пересчёт делают в самом коде — циклом с паузой или библиотекой расписаний вроде schedule и APScheduler в Python, node-cron в Node.js. Результат пересчёта складывайте в /data или в базу, чтобы он не пропал при следующей публикации.
Можно ли сделать дашборд доступным только своим?
Отдельной системы пользователей и прав на стороне платформы нет, а ссылка публичная: кто её знает, тот и откроет. Поэтому проверку доступа делают внутри самого приложения — форма входа или общий пароль перед показом содержимого. Пароли и ключи храните в секретах проекта, а не в коде: они шифруются и не попадают ни в архив, ни в репозиторий.
Почему дашборд собрался, но по ссылке ничего не открывается?
Чаще всего приложение слушает не тот адрес: в коде остался фиксированный порт или localhost вместо 0.0.0.0. Уберите свои значения и читайте порт из переменной окружения PORT. Вторая по частоте причина — ошибка при старте, например не хватает библиотеки или файла с данными; её видно в логах в кабинете в реальном времени.
Можно ли выложить готовую BI-платформу вроде Metabase или Superset?
Да, если у проекта есть свой Dockerfile или docker-compose — платформа их использует и поднимет связку сервисов, до пяти штук в одном проекте, например BI-приложение и базу рядом с ним. В таком проекте постоянное хранилище описывается именованными томами прямо в вашем файле compose: папки /data там нет. Такая связка заметно тяжелее небольшого дашборда на Streamlit, поэтому сверьтесь с актуальными лимитами тарифа в кабинете.
Нужен ли свой сервер или VPS?
Нет. Netrun разворачивает проект на своих серверах. Не нужно арендовать VPS, настраивать systemd и nginx или продлевать сертификаты — всё это работает за вас.
Почему мой сайт иногда засыпает?
На бесплатном тарифе сайты засыпают после простоя и просыпаются за пару секунд при первом запросе. На тарифе Pro проект работает без сна.
Сохранятся ли данные при обновлении кода?
Да, если данные лежат в постоянном хранилище. У обычного проекта это папка /data: всё, что приложение туда сохранило, остаётся при обновлении кода и перезапуске, а посмотреть и скачать файлы можно на вкладке «Данные». Если вы описали сервисы сами в docker-compose, постоянное хранилище — это именованные тома из вашего файла, и папки /data у такого проекта нет. Файлы, записанные мимо хранилища, при следующей публикации создаются заново. Ссылка проекта в любом случае остаётся прежней.
Где указать токены и другие секретные значения?
В проекте есть вкладка «Секреты» — там задаются значения из кода, например токен от BotFather. Мы храним их в зашифрованном виде: названия переменных вы видите, сами значения не показываем никому, включая вас.