NetrunНа главную

Сайты и приложения

Как выложить приложение на Deno в интернет

· 5 мин чтения

Коротко

Чтобы выложить приложение на 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 (защищённое соединение, замочек в браузере). Ниже — что стоит поправить в проекте до публикации, чтобы ссылка открылась с первого раза.

  1. Положите deno.json в корень проекта#

    Файл deno.json (или deno.jsonc) в корне — это паспорт проекта: по нему мы понимаем, что перед нами Deno, а не Node.js, и берём оттуда команды запуска и карту импортов. Держите его именно в корне архива, рядом с главным файлом приложения, а не внутри вложенной папки — иначе язык определится неправильно. Даже если проект состоит из одного файла и внешних библиотек у него нет, deno.json всё равно стоит добавить: он задаёт, чем именно запускать приложение.

  2. Читайте порт из переменной окружения#

    Порт, на котором слушать, задаём мы и передаём его в переменной окружения PORT — в коде возьмите его через Deno.env.get("PORT"), а не пишите число руками. Слушать нужно адрес 0.0.0.0, а не localhost: localhost виден только самому приложению изнутри, и снаружи ссылка останется пустой. В Deno.serve это объект с полями port и hostname, куда вы подставляете значение из окружения. Захардкоженный порт — причина номер один, по которой публикация проходит, а страница не открывается.

  3. Выдайте разрешения в команде запуска#

    Deno не даёт программе выйти в сеть или прочитать переменные окружения, пока вы явно не разрешите это флагами при запуске. Опишите запуск задачей start в deno.json и перечислите в ней нужные разрешения: как минимум --allow-net, чтобы принимать запросы, и --allow-env, чтобы прочитать порт и секреты. Без этого приложение соберётся, но сразу упадёт с ошибкой вида «Requires net access» — она видна первой же строкой в логах в кабинете. Если разбираться с точным списком некогда, на первое время подойдёт --allow-all, а сузить права можно потом.

  4. Не кладите в архив кэш зависимостей#

    Библиотеки Deno скачивает во время сборки сам — по импортам в коде и по карте импортов из deno.json. Поэтому папку с кэшем, папку vendor и node_modules в архив класть не нужно: они много весят, устаревают при первой же правке и на результат не влияют. А вот файл deno.lock приложить полезно — с ним при публикации подтянутся ровно те версии библиотек, на которых вы всё проверяли у себя.

  5. Вынесите ключи в секреты#

    Токены, ключи от внешних сервисов и строку подключения к базе читайте из переменных окружения тем же Deno.env.get, что и порт. При настройке проекта Netrun спросит эти значения и подставит их в зашифрованном виде, так что в архиве и в репозитории на GitHub они лежать не будут. Помните, что для чтения окружения нужен флаг --allow-env: без него приложение упадёт на первом же обращении к ключу.

  6. Загрузите код и заберите ссылку#

    Принесите проект одним из двух способов: 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 проект работает без сна.

Запустите свой проект

Загрузите код, ответьте на пару вопросов — и получите рабочую ссылку. Есть бесплатный тариф

Попробовать Netrun
Все статьи блога