Сайты и приложения
Как выложить приложение на Deno в интернет
Коротко
Чтобы выложить приложение на Deno в интернет, нужен сервер, который держит его запущенным, и адрес с HTTPS. Проще всего загрузить исходный код в Netrun: платформа увидит файл deno.json в корне, подтянет зависимости и выдаст публичную ссылку. В коде порт берите из переменной окружения PORT через Deno.env.get("PORT") и слушайте адрес 0.0.0.0, а не localhost. Отдельная особенность Deno — разрешения: команда запуска должна явно выдать доступ в сеть и к переменным окружения (--allow-net и --allow-env), иначе приложение упадёт на старте с ошибкой вида «Requires net access».
Обычно, чтобы выложить Deno-приложение в интернет, нужно арендовать сервер, поставить туда сам Deno, придумать, как держать процесс запущенным после перезагрузки, поставить перед ним прокси и получить сертификат. К этому добавляется тонкость, которой нет у других языков: Deno по умолчанию не пускает программу никуда — ни в сеть, ни к переменным окружения. На своей машине вы привыкли дописывать нужные флаги руками в терминале, а на сервере ту же строку приходится аккуратно переносить в описание службы.
В Netrun этот кусок работы исчезает: вы загружаете исходный код, платформа по файлу deno.json понимает, что перед ней Deno, скачивает зависимости, запускает приложение и выдаёт публичную ссылку с HTTPS (защищённое соединение, замочек в браузере). Ниже — что стоит поправить в проекте до публикации, чтобы ссылка открылась с первого раза.
Положите deno.json в корень проекта#
Файл deno.json (или deno.jsonc) в корне — это паспорт проекта: по нему мы понимаем, что перед нами Deno, а не Node.js, и берём оттуда команды запуска и карту импортов. Держите его именно в корне архива, рядом с главным файлом приложения, а не внутри вложенной папки — иначе язык определится неправильно. Даже если проект состоит из одного файла и внешних библиотек у него нет, deno.json всё равно стоит добавить: он задаёт, чем именно запускать приложение.
Читайте порт из переменной окружения#
Порт, на котором слушать, задаём мы и передаём его в переменной окружения PORT — в коде возьмите его через Deno.env.get("PORT"), а не пишите число руками. Слушать нужно адрес 0.0.0.0, а не localhost: localhost виден только самому приложению изнутри, и снаружи ссылка останется пустой. В Deno.serve это объект с полями port и hostname, куда вы подставляете значение из окружения. Захардкоженный порт — причина номер один, по которой публикация проходит, а страница не открывается.
Выдайте разрешения в команде запуска#
Deno не даёт программе выйти в сеть или прочитать переменные окружения, пока вы явно не разрешите это флагами при запуске. Опишите запуск задачей start в deno.json и перечислите в ней нужные разрешения: как минимум --allow-net, чтобы принимать запросы, и --allow-env, чтобы прочитать порт и секреты. Без этого приложение соберётся, но сразу упадёт с ошибкой вида «Requires net access» — она видна первой же строкой в логах в кабинете. Если разбираться с точным списком некогда, на первое время подойдёт --allow-all, а сузить права можно потом.
Не кладите в архив кэш зависимостей#
Библиотеки Deno скачивает во время сборки сам — по импортам в коде и по карте импортов из deno.json. Поэтому папку с кэшем, папку vendor и node_modules в архив класть не нужно: они много весят, устаревают при первой же правке и на результат не влияют. А вот файл deno.lock приложить полезно — с ним при публикации подтянутся ровно те версии библиотек, на которых вы всё проверяли у себя.
Вынесите ключи в секреты#
Токены, ключи от внешних сервисов и строку подключения к базе читайте из переменных окружения тем же Deno.env.get, что и порт. При настройке проекта Netrun спросит эти значения и подставит их в зашифрованном виде, так что в архиве и в репозитории на GitHub они лежать не будут. Помните, что для чтения окружения нужен флаг --allow-env: без него приложение упадёт на первом же обращении к ключу.
Загрузите код и заберите ссылку#
Принесите проект одним из двух способов: ZIP-архивом с исходниками или импортом репозитория с GitHub, в том числе приватного. Ставить Deno у себя и собирать что-либо заранее не нужно — сборка идёт на нашей стороне, а её статус и логи видны в кабинете в реальном времени, поэтому ошибку видно сразу, а не по пустой странице. Когда сборка закончится, вы получите публичную ссылку с HTTPS: её можно открывать и отправлять кому угодно, а при обновлении кода адрес останется прежним.
Готово: приложение на Deno доступно в интернете без аренды сервера, настройки службы и ручного сертификата. На бесплатном тарифе доступен один проект: сайт на нём засыпает при простое и просыпается сам, когда кто-то открывает ссылку — первый заход после паузы чуть медленнее. Если это не сайт, а бот или фоновый скрипт, будить его некому: такие проекты на бесплатном тарифе работают три дня, а дальше нужен тариф Pro с круглосуточной работой. Попробовать Netrun.
Частые вопросы
Почему Deno-приложение запустилось, но ссылка не открывается?
Чаще всего дело в одном из трёх: приложению не выдали разрешение на сеть флагом --allow-net, порт написан в коде числом вместо чтения из переменной окружения PORT, или сервер слушает localhost вместо 0.0.0.0. Проверьте команду запуска в deno.json и строку, где создаётся сервер. Логи в кабинете показывают, чем именно закончился старт, так что гадать не придётся.
Как передать нужный порт в Deno.serve?
Deno.serve принимает объект с настройками: в поле port положите число из переменной окружения, например Number(Deno.env.get("PORT")), а в hostname — строку 0.0.0.0. Если этого не сделать, Deno.serve возьмёт свой порт по умолчанию, и снаружи по ссылке до приложения никто не достучится.
Что означает ошибка «Requires net access» при старте?
Так Deno сообщает, что программа попыталась выйти в сеть или прочитать окружение без разрешения. Лечится это не в коде, а в команде запуска: добавьте нужные флаги — --allow-net для сети, --allow-env для переменных окружения, --allow-read и --allow-write, если приложение работает с файлами. После правки загрузите обновлённый код, и проект соберётся заново по той же ссылке.
Можно ли использовать npm-пакеты в Deno-проекте?
Да, Deno умеет подключать пакеты npm прямо в импортах, и мы скачиваем их при сборке — папку node_modules в архив класть не нужно. Если же проект написан как обычный Node.js-проект с package.json, он тоже опубликуется, только определится как приложение на Node.js. Смешивать оба манифеста в одном корне не стоит: так определение языка становится непредсказуемым.
Как запускать Deno-скрипт по расписанию?
Отдельного планировщика на платформе нет, поэтому расписание живёт внутри самого приложения: обычно это бесконечный цикл, который делает работу и засыпает до следующего раза. Такой проект считается фоновым скриптом: он не засыпает, но и разбудить его некому, поэтому на бесплатном тарифе он работает три дня, а для постоянной работы нужен Pro.
Сохранятся ли файлы, которые приложение записывает само?
Сохранятся, если писать их в постоянную папку проекта — /data. Файлы, записанные просто рядом с кодом, при следующей публикации создаются заново. Для записи не забудьте разрешение --allow-write, а содержимое папки видно в кабинете на вкладке «Данные»: файлы можно скачать, загрузить или удалить.
Какие языки и технологии поддерживаются?
Python, Node.js, Go, Rust, Ruby, PHP, Java, .NET, Deno, Bun, Elixir, статические сайты и bash-скрипты. Можно принести свой Dockerfile или docker-compose, но чаще стек определяется по коду автоматически.
Нужно ли уметь работать с Docker?
Нет. Netrun сам определяет язык проекта и собирает его. Если у вас уже есть Dockerfile или docker-compose, мы их поддержим, но писать их специально не требуется.
Где указать токены и другие секретные значения?
В проекте есть вкладка «Секреты» — там задаются значения из кода, например токен от BotFather. Мы храним их в зашифрованном виде: названия переменных вы видите, сами значения не показываем никому, включая вас.
Почему мой сайт иногда засыпает?
На бесплатном тарифе сайты засыпают после простоя и просыпаются за пару секунд при первом запросе. На тарифе Pro проект работает без сна.