HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p><strong>Подробно рассказываем, как деплоить приложение Node.js на Railway и что для этого нужно знать.</strong></p>
1 <p><strong>Подробно рассказываем, как деплоить приложение Node.js на Railway и что для этого нужно знать.</strong></p>
2 <p><em>Важное предисловие - в этом гайде рассматривается способ деплоя с помощью GitHub, поэтому у вас должен быть свой аккаунт на<a>Railway</a>и на GitHub. Для полноценного понимания текста вы должны уметь работать с Git и знать, как устроен Node.js. Если пока нет - вот наш<a>большой бесплатный курс по Git</a>и профессия<a>Node.js-разработчик</a>. Гайд будет полезен бэкенд и фронтенд-разработчикам - в процессе мы создадим небольшое hello-world приложение. Подробно код нашего приложения можно изучить<a>здесь</a>.</em></p>
2 <p><em>Важное предисловие - в этом гайде рассматривается способ деплоя с помощью GitHub, поэтому у вас должен быть свой аккаунт на<a>Railway</a>и на GitHub. Для полноценного понимания текста вы должны уметь работать с Git и знать, как устроен Node.js. Если пока нет - вот наш<a>большой бесплатный курс по Git</a>и профессия<a>Node.js-разработчик</a>. Гайд будет полезен бэкенд и фронтенд-разработчикам - в процессе мы создадим небольшое hello-world приложение. Подробно код нашего приложения можно изучить<a>здесь</a>.</em></p>
3 <h2>Содержание</h2>
3 <h2>Содержание</h2>
4 <ul><li><a>Создание приложения</a></li>
4 <ul><li><a>Создание приложения</a></li>
5 <li><a>Первый деплой</a></li>
5 <li><a>Первый деплой</a></li>
6 <li><a>Деплой React-приложения</a></li>
6 <li><a>Деплой React-приложения</a></li>
7 </ul><h2>Создание приложения</h2>
7 </ul><h2>Создание приложения</h2>
8 <p>В качестве примера создадим приложение на фреймворке<a>Fastify</a>. Если вы фронтенд-разработчик и не собираетесь делать бэкенд-приложение, не расстраивайтесь. Дальше я расскажу, как подключить SPA-приложение на React и правильно настроить деплой. Просто следуйте инструкциям.</p>
8 <p>В качестве примера создадим приложение на фреймворке<a>Fastify</a>. Если вы фронтенд-разработчик и не собираетесь делать бэкенд-приложение, не расстраивайтесь. Дальше я расскажу, как подключить SPA-приложение на React и правильно настроить деплой. Просто следуйте инструкциям.</p>
9 <p>Для создания приложения на Fastify используйте команду:</p>
9 <p>Для создания приложения на Fastify используйте команду:</p>
10 <p>Если утилита запрашивает установку дополнительных пакетов, согласитесь - введите y:</p>
10 <p>Если утилита запрашивает установку дополнительных пакетов, согласитесь - введите y:</p>
11 <p>Утилита сгенерирует файлы. После этого установите зависимости:</p>
11 <p>Утилита сгенерирует файлы. После этого установите зависимости:</p>
12 <p>Проверьте, что приложение работает. Для этого его нужно запустить:</p>
12 <p>Проверьте, что приложение работает. Для этого его нужно запустить:</p>
13 <p>Перейдите по адресу сервера. В случае чего, приложение подскажет нужный адрес:</p>
13 <p>Перейдите по адресу сервера. В случае чего, приложение подскажет нужный адрес:</p>
14 <p>Теперь все готово для деплоя на Railway.</p>
14 <p>Теперь все готово для деплоя на Railway.</p>
15 <h2>Первый деплой</h2>
15 <h2>Первый деплой</h2>
16 <p>Есть несколько способов деплоя: с помощью cli-утилиты и через GitHub. В нашем гайде я расскажу про второй способ.</p>
16 <p>Есть несколько способов деплоя: с помощью cli-утилиты и через GitHub. В нашем гайде я расскажу про второй способ.</p>
17 <p>Создайте репозиторий на GitHub и запушьте туда наше приложение. После этого зайдите в свой аккаунт на<a>Railway</a>и нажмите "Start a New Project". Дальше нужно выбрать "Deploy from Github repo".</p>
17 <p>Создайте репозиторий на GitHub и запушьте туда наше приложение. После этого зайдите в свой аккаунт на<a>Railway</a>и нажмите "Start a New Project". Дальше нужно выбрать "Deploy from Github repo".</p>
18 <p>Выберите нужный репозиторий с приложением, для этого можно воспользоваться поиском.</p>
18 <p>Выберите нужный репозиторий с приложением, для этого можно воспользоваться поиском.</p>
19 <p>Нажмите "Deploy now". Через некоторое время приложение соберется и запустится, а в окне появится статус успешности деплоя.</p>
19 <p>Нажмите "Deploy now". Через некоторое время приложение соберется и запустится, а в окне появится статус успешности деплоя.</p>
20 <p>Дальше нужно перейти на него, а после этого нажать "Deploy logs". В случае успешного выполнения вы должны увидеть логи работы приложения.</p>
20 <p>Дальше нужно перейти на него, а после этого нажать "Deploy logs". В случае успешного выполнения вы должны увидеть логи работы приложения.</p>
21 <p>Приложение работает, но еще не доступно для внешнего мира. Нужно его привязать к определенному адресу. Закройте окно деплоя и вернитесь в проект, зайдите в настройки (1) и нажмите "Generate Domain" (2).</p>
21 <p>Приложение работает, но еще не доступно для внешнего мира. Нужно его привязать к определенному адресу. Закройте окно деплоя и вернитесь в проект, зайдите в настройки (1) и нажмите "Generate Domain" (2).</p>
22 <p>Появится адрес, по которому нужно будет перейти и дождаться, когда приложение запустится и выведет результат: {"root":true}.</p>
22 <p>Появится адрес, по которому нужно будет перейти и дождаться, когда приложение запустится и выведет результат: {"root":true}.</p>
23 <p>Поздравляю, проект задеплоен и уже можно звать гостей!</p>
23 <p>Поздравляю, проект задеплоен и уже можно звать гостей!</p>
24 <blockquote><h3>Читайте также:</h3>
24 <blockquote><h3>Читайте также:</h3>
25 <p>Разбираем Node.js.<a>Как свойство main в package.json определяет точку входа</a></p>
25 <p>Разбираем Node.js.<a>Как свойство main в package.json определяет точку входа</a></p>
26 </blockquote><h2>Деплой React-приложения</h2>
26 </blockquote><h2>Деплой React-приложения</h2>
27 <p>Теперь немного усложним проект, добавим в него SPA-приложение на React. Для этого в директории проекта выполните команду:</p>
27 <p>Теперь немного усложним проект, добавим в него SPA-приложение на React. Для этого в директории проекта выполните команду:</p>
28 <p>Она создаст приложение на React в директории my-app в корне нашего проекта. Имя приложения my-app можно будет заменить на любое другое.</p>
28 <p>Она создаст приложение на React в директории my-app в корне нашего проекта. Имя приложения my-app можно будет заменить на любое другое.</p>
29 <p>Проверьте, что приложение работает. Для этого перейдите в директорию и запустите React-приложение:</p>
29 <p>Проверьте, что приложение работает. Для этого перейдите в директорию и запустите React-приложение:</p>
30 <p>После старта откроется страница в браузере с адресом приложения, по умолчанию это<a>http://localhost</a></p>
30 <p>После старта откроется страница в браузере с адресом приложения, по умолчанию это<a>http://localhost</a></p>
31 <p>. Проверьте, что вы остановили Fastify-проект, который мы создали ранее, чтобы он не занимал порт. Вы должны увидеть логотип React.</p>
31 <p>. Проверьте, что вы остановили Fastify-проект, который мы создали ранее, чтобы он не занимал порт. Вы должны увидеть логотип React.</p>
32 <p>Приложение на React имеет особенность: его нужно собирать. Команда npm start запускает Webpack-сервер, который предназначен для разработки, но не для полноценной работы. Об этом пишет само приложение после запуска:</p>
32 <p>Приложение на React имеет особенность: его нужно собирать. Команда npm start запускает Webpack-сервер, который предназначен для разработки, но не для полноценной работы. Об этом пишет само приложение после запуска:</p>
33 <p>Чтобы собрать приложение, выполните команду сборки в директории my-app:</p>
33 <p>Чтобы собрать приложение, выполните команду сборки в директории my-app:</p>
34 <p>После этого появится директория build - это и есть наше собранное React-приложение, подготовленное для работы на проде. Билд не включает в себя вебпак-сервер, поэтому нам нужен какой-то другой сервер, который будет предоставлять клиентам веб-приложение. Этим сервером будет наше приложение на Fastify, которое мы до этого уже создали.</p>
34 <p>После этого появится директория build - это и есть наше собранное React-приложение, подготовленное для работы на проде. Билд не включает в себя вебпак-сервер, поэтому нам нужен какой-то другой сервер, который будет предоставлять клиентам веб-приложение. Этим сервером будет наше приложение на Fastify, которое мы до этого уже создали.</p>
35 <p>Нужно немного доработать наше Fastify-приложение, чтобы оно умело раздавать фронт. Перейдите в корень проекта, все команды ниже будут выполняться в этой директории.</p>
35 <p>Нужно немного доработать наше Fastify-приложение, чтобы оно умело раздавать фронт. Перейдите в корень проекта, все команды ниже будут выполняться в этой директории.</p>
36 <p>Для работы со статикой (билдом React-приложения), установите библиотеку:</p>
36 <p>Для работы со статикой (билдом React-приложения), установите библиотеку:</p>
37 <p>Отредактируйте файл app.js. В него нужно импортировать установленную библиотеку:</p>
37 <p>Отредактируйте файл app.js. В него нужно импортировать установленную библиотеку:</p>
38 <p>И добавьте внутри функции подключение нашего React-приложения:</p>
38 <p>И добавьте внутри функции подключение нашего React-приложения:</p>
39 <p>Добавьте обработчик по умолчанию, чтобы он возвращал html-страницу:</p>
39 <p>Добавьте обработчик по умолчанию, чтобы он возвращал html-страницу:</p>
40 <p>Это даст возможность открывать React-приложение при любых несуществующих роутах. Полный код файла должен получиться таким:</p>
40 <p>Это даст возможность открывать React-приложение при любых несуществующих роутах. Полный код файла должен получиться таким:</p>
41 <p>Код написан с использованием commonJS-модулей. Вы можете переделать код на ES-модули, либо оставить его как есть. Не переживайте, если что-то в коде не понятно. Основная работа уже позади.</p>
41 <p>Код написан с использованием commonJS-модулей. Вы можете переделать код на ES-модули, либо оставить его как есть. Не переживайте, если что-то в коде не понятно. Основная работа уже позади.</p>
42 <p>Проверьте, что ваше приложение на React остановлено - оно может занимать порт, который нам еще понадобится. Запустите приложение Fastify и откройте его в браузере, добавив к адресу любой путь, например -<a>http://localhost</a></p>
42 <p>Проверьте, что ваше приложение на React остановлено - оно может занимать порт, который нам еще понадобится. Запустите приложение Fastify и откройте его в браузере, добавив к адресу любой путь, например -<a>http://localhost</a></p>
43 <p><a>/somepath</a>. Если вы видите приложение на React, то все получилось.</p>
43 <p><a>/somepath</a>. Если вы видите приложение на React, то все получилось.</p>
44 <p>Запушьте изменения в GitHub. На Railway сразу начнется автоматическая сборка приложения - вам нужно перейти в ваш проект и проверить его работу. Вы увидите, что приложение работает, но страница React недоступна. Так происходит, потому что директория build не попадает в репозиторий, а Railway не выполняет билд. В сервисе выполняются стандартные команды для запуска приложения.</p>
44 <p>Запушьте изменения в GitHub. На Railway сразу начнется автоматическая сборка приложения - вам нужно перейти в ваш проект и проверить его работу. Вы увидите, что приложение работает, но страница React недоступна. Так происходит, потому что директория build не попадает в репозиторий, а Railway не выполняет билд. В сервисе выполняются стандартные команды для запуска приложения.</p>
45 <p>Если мы склонируем проект в новую директорию и выполним npm ci, а затем npm start, то приложение на React тоже не будет работать. Это произойдет и с Railway. Перед запуском должно собираться React-приложение. Для решения этой проблемы можно модифицировать package.json. Нужно добавить в него установку зависимостей React-приложения, для этого добавьте в секцию scripts еще одну команду:</p>
45 <p>Если мы склонируем проект в новую директорию и выполним npm ci, а затем npm start, то приложение на React тоже не будет работать. Это произойдет и с Railway. Перед запуском должно собираться React-приложение. Для решения этой проблемы можно модифицировать package.json. Нужно добавить в него установку зависимостей React-приложения, для этого добавьте в секцию scripts еще одну команду:</p>
46 <p>"postinstall": "npm ci --prefix my-app"`</p>
46 <p>"postinstall": "npm ci --prefix my-app"`</p>
47 <p>Эта команда будет устанавливать зависимости в директории my-app при каждой установке зависимостей в корневом проекте.</p>
47 <p>Эта команда будет устанавливать зависимости в директории my-app при каждой установке зависимостей в корневом проекте.</p>
48 <p>Аналогично нужно добавить команду сборки фронтенд приложения:</p>
48 <p>Аналогично нужно добавить команду сборки фронтенд приложения:</p>
49 <p>"build": "npm run build --prefix my-app"</p>
49 <p>"build": "npm run build --prefix my-app"</p>
50 <p>Либо это можно сделать через настройки проекта Railway. Не забудьте при этом нажать на кнопку (2):</p>
50 <p>Либо это можно сделать через настройки проекта Railway. Не забудьте при этом нажать на кнопку (2):</p>
51 <p>Теперь Railway будет устанавливать зависимости в my-app и делать сборку перед запуском приложения. Запушьте ваши изменения, проверьте работу, проверьте страницу на React.</p>
51 <p>Теперь Railway будет устанавливать зависимости в my-app и делать сборку перед запуском приложения. Запушьте ваши изменения, проверьте работу, проверьте страницу на React.</p>
52 <p>Если что-то пошло не так, проверьте логи. Если вы правильно указали postinstall, то в логах вы должны видеть запуск установки зависимостей:</p>
52 <p>Если что-то пошло не так, проверьте логи. Если вы правильно указали postinstall, то в логах вы должны видеть запуск установки зависимостей:</p>
53 <p>Если вы только изучаете программирование и у вас на Railway есть бесплатный аккаунт, рекомендую удалять каждый деплой, чтобы ваше приложение не тратило ресурсы. Изначально вам доступно ограниченное количество ресурсов на сервисе, а если ваши приложения превысят лимит, то придется брать платный тариф или ждать начало нового месяца. То есть каждый месяц лимиты, которые тратит пользователь, сбрасываются, но в таком случае придется ждать.</p>
53 <p>Если вы только изучаете программирование и у вас на Railway есть бесплатный аккаунт, рекомендую удалять каждый деплой, чтобы ваше приложение не тратило ресурсы. Изначально вам доступно ограниченное количество ресурсов на сервисе, а если ваши приложения превысят лимит, то придется брать платный тариф или ждать начало нового месяца. То есть каждый месяц лимиты, которые тратит пользователь, сбрасываются, но в таком случае придется ждать.</p>
54 <p>Готовый проект для деплоя<a>находится здесь</a>.</p>
54 <p>Готовый проект для деплоя<a>находится здесь</a>.</p>
55 <blockquote><h3>На Хекслете запускается набор первого онлайн-буткемпа:</h3>
55 <blockquote><h3>На Хекслете запускается набор первого онлайн-буткемпа:</h3>
56 <p>Всю программу первого онлайн-буткемпа от Хекслета по профессии "Фронтенд-разработчик" можно посмотреть<a>здесь</a></p>
56 <p>Всю программу первого онлайн-буткемпа от Хекслета по профессии "Фронтенд-разработчик" можно посмотреть<a>здесь</a></p>
57 </blockquote>
57 </blockquote>