NetrunНа главную

Если что-то не работает

Сайт не открывается после публикации: localhost, 0.0.0.0 и порт

· 6 мин чтения

Коротко

Сайт, который работает локально, но не открывается после публикации, чаще всего слушает адрес localhost (127.0.0.1) вместо 0.0.0.0 или свой жёстко прописанный порт вместо порта из переменной PORT. Адрес localhost принимает подключения только изнутри той же машины, поэтому платформа снаружи до приложения не достучится, хотя в логах оно пишет, что запущено. Исправление — две правки в команде запуска: адрес 0.0.0.0 и порт из переменной окружения PORT. В Netrun платформа сама задаёт PORT и подсказывает, если приложение слушает только localhost.

  • Адрес 127.0.0.1, он же localhost, принимает подключения только от программ на той же машине, поэтому снаружи приложение на нём недоступно.
  • Адрес 0.0.0.0 означает «принимать подключения на всех сетевых интерфейсах», и именно его ждут хостинги и контейнеры.
  • Хостинг сообщает приложению номер порта через переменную окружения PORT, и приложение должно слушать именно его.
  • Flask, uvicorn, gunicorn и встроенный сервер Django по умолчанию слушают 127.0.0.1, поэтому адрес 0.0.0.0 им нужно указать явно.
  • Django дополнительно проверяет адрес сайта по списку ALLOWED_HOSTS и без нужной записи отвечает ошибкой 400 Bad Request.

Знакомая картина: на компьютере сайт открывается по адресу localhost:5000, вы публикуете его, в логах написано Running on или Uvicorn running — а по ссылке пусто, ошибка 502 или бесконечная загрузка. Приложение при этом действительно запущено. Оно просто ждёт гостей не у той двери: слушает адрес, до которого снаружи не дотянуться, или порт, на который никто не приходит.

Разберёмся без сетевых терминов. Адрес localhost (он же 127.0.0.1) — это «только для своих»: к нему могут подключиться лишь программы на той же машине, поэтому у вас на ноутбуке всё работает. Адрес 0.0.0.0 — это «для всех, кто пришёл по сети»: так приложение принимает подключения отовсюду, в том числе от платформы, которая передаёт ему посетителей. А порт — номер двери, в которую стучится платформа; хостинг сообщает его через переменную PORT.

Как указать адрес 0.0.0.0 и порт из PORT в популярных фреймворках
ФреймворкКак запускатьПо умолчанию слушает
Flaskapp.run(host='0.0.0.0', port=int(os.environ.get('PORT', 8080))) или gunicorn --bind 0.0.0.0:$PORT app:app127.0.0.1:5000
FastAPI (uvicorn)uvicorn main:app --host 0.0.0.0 --port $PORT127.0.0.1:8000
Djangogunicorn project.wsgi --bind 0.0.0.0:$PORT, адрес сайта добавить в ALLOWED_HOSTS127.0.0.1:8000
Express (Node.js)app.listen(process.env.PORT || 3000) без указания адреса или с адресом 0.0.0.0все адреса, если адрес не указан
Next.jsnext start -H 0.0.0.0 -p $PORT (переменную PORT next start читает и сам)порт 3000
Vite (preview)vite preview --host 0.0.0.0 --port $PORTlocalhost:4173
Streamlitstreamlit run app.py --server.address 0.0.0.0 --server.port $PORTпорт 8501
  1. Посмотрите в логах, какой адрес и порт слушает приложение#

    Почти каждый веб-сервер при старте пишет, где он ждёт подключений: Running on http://127.0.0.1:5000, Uvicorn running on http://127.0.0.1:8000, Listening on port 3000. Откройте логи запуска и найдите эту строку. Если там 127.0.0.1 или localhost — дело в адресе. Если адрес 0.0.0.0, но порт не тот, который задаёт хостинг, — дело в порте. Если строки нет вовсе, приложение упало раньше, и смотреть нужно на ошибку выше.

  2. Замените localhost на 0.0.0.0#

    Найдите в коде или в команде запуска место, где указан адрес, и поставьте 0.0.0.0. Во Flask это параметр host в app.run, в uvicorn и Streamlit — флаги --host и --server.address, в gunicorn — флаг --bind с адресом и портом через двоеточие. В Express адрес можно просто не указывать: тогда Node.js слушает все адреса сразу. Если же в коде явно написано localhost или 127.0.0.1, уберите это.

  3. Берите порт из переменной окружения PORT#

    Хостинг сам решает, на каком порту ждать приложение, и сообщает его через переменную окружения PORT. Если в коде жёстко прописано 5000, 8000 или 3000, приложение запустится, но платформа будет стучаться в другую дверь. В Python порт читается как int(os.environ.get('PORT', 8080)), в Node.js — как process.env.PORT, в командах запуска — как $PORT. Запасное значение после запятой нужно только для запуска у вас на компьютере. Netrun задаёт PORT сам, а если проект со своим Dockerfile, порт берётся из первой строки EXPOSE.

  4. Для Django добавьте адрес сайта в ALLOWED_HOSTS#

    У Django есть отдельная проверка: он отвечает только на запросы к адресам из списка ALLOWED_HOSTS. Если адреса вашего сайта там нет, страница откроется ошибкой 400 Bad Request, даже когда адрес и порт настроены верно. Добавьте в список домен, по которому открывается сайт, а удобнее — читайте список из переменной окружения, чтобы не править код при смене домена. И запускайте сайт через gunicorn, а не через runserver: встроенный сервер Django предназначен только для разработки.

  5. Не публикуйте сервер разработки фронтенда#

    Команды npm run dev у Vite, React и Vue запускают сервер для разработки, который по умолчанию слушает только localhost и не рассчитан на посетителей. Для публикации нужен либо собранный сайт, либо режим preview или start. Если фронтенд обычный, без своего сервера, загрузите исходники с package.json: в Netrun сборка идёт на стороне платформы, и порт с адресом вам настраивать не придётся. Если нужен именно серверный режим, как у Next.js или Nuxt, запускайте его командой start с адресом 0.0.0.0 и портом из PORT.

  6. Опубликуйте заново и откройте ссылку#

    После правок загрузите новую версию проекта и снова посмотрите в логи: в строке запуска теперь должен стоять адрес 0.0.0.0 и порт из переменной PORT. Если ссылка всё равно не открывается, проверьте, что приложение не падает сразу после старта, — тогда в логах будет ошибка и перезапуск по кругу. Учтите, что тяжёлому приложению, которое при старте загружает модель или большой файл, нужно время, прежде чем оно начнёт отвечать.

Сайт, который не открывается после публикации, в большинстве случаев лечится двумя правками: адрес 0.0.0.0 вместо localhost и порт из переменной PORT вместо жёстко прописанного числа. Это правило одинаково для любого хостинга и любого контейнера, так что один раз поправленный код будет работать везде. В Netrun переменная PORT задаётся автоматически, ссылка выдаётся сразу с HTTPS, а если приложение слушает только localhost, платформа подскажет, что поменять. Попробовать Netrun.

Частые вопросы

Чем отличается 127.0.0.1 от 0.0.0.0?

Адрес 127.0.0.1, или localhost, принимает подключения только от программ на той же машине. Адрес 0.0.0.0 значит «принимать подключения отовсюду», в том числе по сети. На своём компьютере разницы не видно, а на сервере приложение на 127.0.0.1 недоступно для посетителей.

Почему в логах написано, что сайт запущен, а ссылка не открывается?

Потому что запущен он на адресе или порте, до которого платформа не дотягивается. Посмотрите строку запуска в логах: если там 127.0.0.1 или localhost, поменяйте адрес на 0.0.0.0, а если порт не совпадает с переменной PORT, читайте порт из неё.

Какой порт указать, если хостинг не говорит какой?

Читайте порт из переменной окружения PORT: так делают почти все хостинги, и код будет работать на любом из них без правок. Запасное значение, например 8080, оставьте на случай запуска у себя на компьютере, где переменной нет.

Безопасно ли слушать 0.0.0.0?

На хостинге да: приложение работает в отдельном окружении, и снаружи до него доходят только запросы через публичную ссылку. Для сайта это и есть цель — принимать посетителей. Осторожнее стоит быть с 0.0.0.0 на своём ноутбуке в общественной сети: там приложение становится видно соседям по Wi-Fi.

Нужно ли что-то менять для бота, у которого нет сайта?

Нет, если бот работает опросом: он сам ходит в Telegram за сообщениями и не ждёт подключений, поэтому адрес и порт ему не нужны. Адрес 0.0.0.0 и порт из PORT нужны только тому, кто принимает запросы снаружи, — сайту, API или боту на вебхуке.

Как выложить сайт в интернет?

Загрузите код сайта ZIP-архивом или из GitHub — Netrun соберёт его и выдаст рабочую ссылку с HTTPS. Подойдёт статический сайт (HTML, CSS, JS), приложение на React или сайт на Python. Покупать домен, настраивать сервер и сертификаты не нужно.

Проект не открывается, что делать?

Откройте страницу проекта и загляните в его статус и логи. Если разобраться не получается, напишите нам на почту.

А React, Vue, Next.js, Nuxt, Svelte или Astro?

Да, все они работают. Загрузите исходный код с package.json — собирать проект у себя и класть готовую сборку в архив не нужно, сборка идёт у нас. Если фреймворк умеет и в готовые страницы, и в серверный режим, подойдут оба варианта: в серверном приложение должно слушать порт из переменной окружения. Одна важная деталь: значения, которые попадают в собранный фронтенд, видны любому посетителю — настоящие ключи держите на стороне сервера.

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

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

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