HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>После того как сайт написан, его нужно выложить в интернет. Стандартный путь включает три пункта:</p>
1 <p>После того как сайт написан, его нужно выложить в интернет. Стандартный путь включает три пункта:</p>
2 <ol><li>Покупка домена</li>
2 <ol><li>Покупка домена</li>
3 <li>Покупка хостинга и его настройка</li>
3 <li>Покупка хостинга и его настройка</li>
4 <li>Деплой</li>
4 <li>Деплой</li>
5 </ol><p>В этом уроке мы рассмотрим эти пункты более подробно.</p>
5 </ol><p>В этом уроке мы рассмотрим эти пункты более подробно.</p>
6 <h2>Покупка домена</h2>
6 <h2>Покупка домена</h2>
7 <p>Чтобы приобрести домен, необходимо обратиться в компании-регистраторы. Домен оплачивается раз в год и закрепляется за определенным человеком или компанией.</p>
7 <p>Чтобы приобрести домен, необходимо обратиться в компании-регистраторы. Домен оплачивается раз в год и закрепляется за определенным человеком или компанией.</p>
8 <p>Иногда хостер и регистратор - одна и та же компания. Тогда домен и сервер связываются одновременно. Иначе нужно производить определенные настройки на стороне сервера и подтверждать свое право владения доменом.</p>
8 <p>Иногда хостер и регистратор - одна и та же компания. Тогда домен и сервер связываются одновременно. Иначе нужно производить определенные настройки на стороне сервера и подтверждать свое право владения доменом.</p>
9 <h2>Покупка хостинга и его настройка</h2>
9 <h2>Покупка хостинга и его настройка</h2>
10 <p>Хостинг - это ресурсы для размещения и обслуживания сайта в интернете. Хостинг бывает разным. Это может быть:</p>
10 <p>Хостинг - это ресурсы для размещения и обслуживания сайта в интернете. Хостинг бывает разным. Это может быть:</p>
11 <ul><li>Уже полностью готовая среда, в которую заливается код сайта</li>
11 <ul><li>Уже полностью готовая среда, в которую заливается код сайта</li>
12 <li>Просто железные серверы, которыми можно и нужно управлять самостоятельно</li>
12 <li>Просто железные серверы, которыми можно и нужно управлять самостоятельно</li>
13 </ul><p>Обычно работа с хостингом выглядит так:</p>
13 </ul><p>Обычно работа с хостингом выглядит так:</p>
14 <ol><li>Регистрируемся на сайте хостинга</li>
14 <ol><li>Регистрируемся на сайте хостинга</li>
15 <li>Выбираем тариф и вид хостинга (On-Prem, IaaS, PaaS, SaaS), привязываем банковскую карту</li>
15 <li>Выбираем тариф и вид хостинга (On-Prem, IaaS, PaaS, SaaS), привязываем банковскую карту</li>
16 <li>Получаем доступ к ресурсам - к IP-адресу и паре "логин/пароль" для доступа по SSH и FTP</li>
16 <li>Получаем доступ к ресурсам - к IP-адресу и паре "логин/пароль" для доступа по SSH и FTP</li>
17 <li>При необходимости настраиваем хостинг и деплоим проект</li>
17 <li>При необходимости настраиваем хостинг и деплоим проект</li>
18 </ol><h2>Деплой</h2>
18 </ol><h2>Деплой</h2>
19 <p><strong>Деплой</strong>- это выкладка новой версии сайта на сервер. Этот процесс может быть довольно сложным и зависит от используемых технологий. Во время деплоя могут выполняться следующие задачи:</p>
19 <p><strong>Деплой</strong>- это выкладка новой версии сайта на сервер. Этот процесс может быть довольно сложным и зависит от используемых технологий. Во время деплоя могут выполняться следующие задачи:</p>
20 <ol><li>Скачиваем код проекта на сервер (обычно через клонирование Git)</li>
20 <ol><li>Скачиваем код проекта на сервер (обычно через клонирование Git)</li>
21 <li>Ставим все необходимые зависимости</li>
21 <li>Ставим все необходимые зависимости</li>
22 <li>Выполняем сборку приложения</li>
22 <li>Выполняем сборку приложения</li>
23 <li>Выполняем<strong>миграции</strong>- SQL-скрипты, которые изменяют структуру базы данных</li>
23 <li>Выполняем<strong>миграции</strong>- SQL-скрипты, которые изменяют структуру базы данных</li>
24 <li>Запускаем новую версию кода</li>
24 <li>Запускаем новую версию кода</li>
25 </ol><p>Обсудим самый простой способ начать деплоить. Большинство PaaS-хостеров имеют бесплатные планы, достаточные для выкладки учебных проектов. Их достоинство в том, что вам не придется покупать адрес - домен третьего уровня предоставляется бесплатно.</p>
25 </ol><p>Обсудим самый простой способ начать деплоить. Большинство PaaS-хостеров имеют бесплатные планы, достаточные для выкладки учебных проектов. Их достоинство в том, что вам не придется покупать адрес - домен третьего уровня предоставляется бесплатно.</p>
26 <p>Для деплоя учебных проектов мы предлагаем использовать<a>Render</a>. Этот сервис поддерживает деплой GitHub-репозиториев</p>
26 <p>Для деплоя учебных проектов мы предлагаем использовать<a>Render</a>. Этот сервис поддерживает деплой GitHub-репозиториев</p>
27 <h2>Деплой на Render.com</h2>
27 <h2>Деплой на Render.com</h2>
28 <p>Чтобы наше приложение работало на Render, его необходимо упаковать в Docker-контейнер. Более подробную информацию о Docker можно найти в<a>отдельном курсе</a>. Здесь же достаточно просто следовать приведённым шагам.</p>
28 <p>Чтобы наше приложение работало на Render, его необходимо упаковать в Docker-контейнер. Более подробную информацию о Docker можно найти в<a>отдельном курсе</a>. Здесь же достаточно просто следовать приведённым шагам.</p>
29 <p>Контейнер можно представить как коробку, в которой есть всё необходимое для работы приложения: сам код, программы для его запуска и даже настройки. Это позволяет приложению работать одинаково на любом устройстве или сервере, независимо от его окружения</p>
29 <p>Контейнер можно представить как коробку, в которой есть всё необходимое для работы приложения: сам код, программы для его запуска и даже настройки. Это позволяет приложению работать одинаково на любом устройстве или сервере, независимо от его окружения</p>
30 <p>Для создания такого контейнера используется специальный файл - Dockerfile. Это текстовый файл, в котором мы пишем инструкции: что установить, как настроить и как запустить приложение. Render использует Dockerfile для создания образа контейнера - это как финальная сборка коробки с приложением. После этого Render разворачивает этот образ на своих серверах, и ваше приложение начинает работать. Всё, что вам нужно сделать, - это предоставить Dockerfile и код приложения, а Render позаботится обо всём остальном</p>
30 <p>Для создания такого контейнера используется специальный файл - Dockerfile. Это текстовый файл, в котором мы пишем инструкции: что установить, как настроить и как запустить приложение. Render использует Dockerfile для создания образа контейнера - это как финальная сборка коробки с приложением. После этого Render разворачивает этот образ на своих серверах, и ваше приложение начинает работать. Всё, что вам нужно сделать, - это предоставить Dockerfile и код приложения, а Render позаботится обо всём остальном</p>
31 <h3>Создаем Dockerfile</h3>
31 <h3>Создаем Dockerfile</h3>
32 <p>Создайте в корне своего приложения файл Dockerfile. Добавьте в него следующий код:</p>
32 <p>Создайте в корне своего приложения файл Dockerfile. Добавьте в него следующий код:</p>
33 <p>Рассмотрим подробнее, что здесь происходит. За основу мы берем базовый образ, в котором уже установлены Gradle и JDK 21. Затем устанавливаем рабочую директорию<em>/app</em>внутри контейнера, теперь все последующие команды будут выполняться внутри этой директории. Далее копируем в нее из директории<em>/app</em>файлы нашего приложения. После этого выполняем сборку приложения с помощью команды ./gradlew clean build. При запуске контейнера приложение автоматически запускается через ./gradlew run. Таким образом, при запуске контейнер будет знать, как запустить приложение и содержать всё необходимое для его работы</p>
33 <p>Рассмотрим подробнее, что здесь происходит. За основу мы берем базовый образ, в котором уже установлены Gradle и JDK 21. Затем устанавливаем рабочую директорию<em>/app</em>внутри контейнера, теперь все последующие команды будут выполняться внутри этой директории. Далее копируем в нее из директории<em>/app</em>файлы нашего приложения. После этого выполняем сборку приложения с помощью команды ./gradlew clean build. При запуске контейнера приложение автоматически запускается через ./gradlew run. Таким образом, при запуске контейнер будет знать, как запустить приложение и содержать всё необходимое для его работы</p>
34 <p>В зависимости от приложения, путь к файлам приложения и команда запуска у вас могут отличаться. Путь к файлам приложения указывается относительно Dockerfile</p>
34 <p>В зависимости от приложения, путь к файлам приложения и команда запуска у вас могут отличаться. Путь к файлам приложения указывается относительно Dockerfile</p>
35 <h3>Работаем с Render</h3>
35 <h3>Работаем с Render</h3>
36 <p>Зарегистрируйтесь в сервисе<a>Render</a>, удобнее всего сделать это через GitHub. После регистрации на вкладке<em>Dashboard</em>вы сможете добавлять новые приложения - веб-сервисы и базы данных</p>
36 <p>Зарегистрируйтесь в сервисе<a>Render</a>, удобнее всего сделать это через GitHub. После регистрации на вкладке<em>Dashboard</em>вы сможете добавлять новые приложения - веб-сервисы и базы данных</p>
37 <p>Наше приложение использует базу данных, поэтому для начала нужно создать эту базу. Конечно, во время разработки мы могли использовать встроенную базу данных в памяти, чтобы быстро тестировать приложение. Но для рабочего приложения такое решение не подходит, так как при перезапуске приложения все данные исчезнут. Поэтому здесь мы будем использовать настоящую базу данных PostgreSQL, чтобы данные сохранялись постоянно, даже после перезапуска приложения</p>
37 <p>Наше приложение использует базу данных, поэтому для начала нужно создать эту базу. Конечно, во время разработки мы могли использовать встроенную базу данных в памяти, чтобы быстро тестировать приложение. Но для рабочего приложения такое решение не подходит, так как при перезапуске приложения все данные исчезнут. Поэтому здесь мы будем использовать настоящую базу данных PostgreSQL, чтобы данные сохранялись постоянно, даже после перезапуска приложения</p>
38 <p>Удобство PaaS-сервисов заключается в том, что они берут на себя всю сложность настройки и управления инфраструктурой. Вам не нужно вручную устанавливать PostgreSQL или настраивать сервер - платформа сделает это за вас. Вы просто создаете базу данных в несколько кликов, а Render автоматически сделает все необходимое для её работы</p>
38 <p>Удобство PaaS-сервисов заключается в том, что они берут на себя всю сложность настройки и управления инфраструктурой. Вам не нужно вручную устанавливать PostgreSQL или настраивать сервер - платформа сделает это за вас. Вы просто создаете базу данных в несколько кликов, а Render автоматически сделает все необходимое для её работы</p>
39 <p>Чтобы создать базу данных, нажмите на кнопку<em>Add new</em>и выберите<em>Postgres</em></p>
39 <p>Чтобы создать базу данных, нажмите на кнопку<em>Add new</em>и выберите<em>Postgres</em></p>
40 <p>Дайте нашему сервису название (<em>Name</em>), оно будет отображаться в дашборде. Можно также указать имя базы данных и пользователя. Но это необязательно, если их не указать, Render сам сформирует случайные имена</p>
40 <p>Дайте нашему сервису название (<em>Name</em>), оно будет отображаться в дашборде. Можно также указать имя базы данных и пользователя. Но это необязательно, если их не указать, Render сам сформирует случайные имена</p>
41 <p>Регион можно оставить по умолчанию, но обязательно запомните, какой вы выбрали, это пригодится нам дальше при выборе региона для самого приложения</p>
41 <p>Регион можно оставить по умолчанию, но обязательно запомните, какой вы выбрали, это пригодится нам дальше при выборе региона для самого приложения</p>
42 <p>Нажмите кнопку Create database в самом низу страницы, чтобы создать базу данных</p>
42 <p>Нажмите кнопку Create database в самом низу страницы, чтобы создать базу данных</p>
43 <p>Выбирайте везде бесплатный тариф, его вполне достаточно для учебных целей и так не придется вводить номер кредитной карты</p>
43 <p>Выбирайте везде бесплатный тариф, его вполне достаточно для учебных целей и так не придется вводить номер кредитной карты</p>
44 <p>После создания базы данных, Render покажет вам данные для подключения к ней (раздел<em>Connections</em>)</p>
44 <p>После создания базы данных, Render покажет вам данные для подключения к ней (раздел<em>Connections</em>)</p>
45 <p>Вам нужно будет скопировать несколько важных значений:<em>Hostname</em>(адрес сервера),<em>Port</em>(порт),<em>Database</em>(имя базы),<em>Username</em>(имя пользователя) и<em>Password</em>(пароль). Эти данные понадобятся позже, когда вы будете настраивать переменные окружения для вашего приложения.</p>
45 <p>Вам нужно будет скопировать несколько важных значений:<em>Hostname</em>(адрес сервера),<em>Port</em>(порт),<em>Database</em>(имя базы),<em>Username</em>(имя пользователя) и<em>Password</em>(пароль). Эти данные понадобятся позже, когда вы будете настраивать переменные окружения для вашего приложения.</p>
46 <p>Теперь, когда у нас есть база данных, мы можем перейти к созданию непосредственно приложения. Вернитесь на дашборд, снова нажмите<em>Add new</em>и выберите<em>Web Service</em></p>
46 <p>Теперь, когда у нас есть база данных, мы можем перейти к созданию непосредственно приложения. Вернитесь на дашборд, снова нажмите<em>Add new</em>и выберите<em>Web Service</em></p>
47 - <p>Подключите свой GitHub-репозиторий с проектом, который хотите задеплоить, или вставьте его URL, после чего нажмите<em>Connect</em></p>
47 + <p>Подключите свой GitHub-репозиторий проектом, который хотите задеплоить, или вставьте его URL, после чего нажмите<em>Connect</em></p>
48 <p>Заполните поля с настройками приложения. В поле Name задайте имя для своего приложения. В<em>Language</em>оставляем<em>Docker</em>в качестве среды выполнения проекта. Поле Root<em>Directory</em>оставьте пустым, так как<em>Dockerfile</em>находится в корне проекта</p>
48 <p>Заполните поля с настройками приложения. В поле Name задайте имя для своего приложения. В<em>Language</em>оставляем<em>Docker</em>в качестве среды выполнения проекта. Поле Root<em>Directory</em>оставьте пустым, так как<em>Dockerfile</em>находится в корне проекта</p>
49 <p>Обратите внимание на регион приложения (Region).<strong>Веб-сервис и база данных должны находиться в одном регионе, иначе приложение не сможет подключиться к базе</strong></p>
49 <p>Обратите внимание на регион приложения (Region).<strong>Веб-сервис и база данных должны находиться в одном регионе, иначе приложение не сможет подключиться к базе</strong></p>
50 <p>Сейчас наше приложение пока еще не знает, как подключиться к базе данных. Чтобы оно могло работать с базой, ему нужно передать информацию о подключении: адрес сервера, порт, имя базы, логин и пароль. Это делается с помощью переменных окружения - специальных настроек, которые передаются приложению при запуске. Переменные окружения - это способ передать приложению информацию о том, как подключиться к базе данных</p>
50 <p>Сейчас наше приложение пока еще не знает, как подключиться к базе данных. Чтобы оно могло работать с базой, ему нужно передать информацию о подключении: адрес сервера, порт, имя базы, логин и пароль. Это делается с помощью переменных окружения - специальных настроек, которые передаются приложению при запуске. Переменные окружения - это способ передать приложению информацию о том, как подключиться к базе данных</p>
51 <p>Чтобы указать переменные окружения, пролистайте настройки приложения вниз, до раздела<em>Environment variable</em>. Нажмите на кнопку<em>Add Environment Variable</em>, добавьте нужные для подключения к базе данных переменные окружения и задайте им значения. Здесь нам пригодятся те сведения, которые мы скопировали в базе данных -<em>Hostname, Port, Database, Username, Password</em></p>
51 <p>Чтобы указать переменные окружения, пролистайте настройки приложения вниз, до раздела<em>Environment variable</em>. Нажмите на кнопку<em>Add Environment Variable</em>, добавьте нужные для подключения к базе данных переменные окружения и задайте им значения. Здесь нам пригодятся те сведения, которые мы скопировали в базе данных -<em>Hostname, Port, Database, Username, Password</em></p>
52 <p>Переменная окружения<em>JDBC_DATABASE_URL</em>содержит всю информацию, необходимую для подключения к базе данных: адрес сервера, порт, имя базы, пользователь и пароль. Именно через эту переменную приложение узнает, как подключиться к базе</p>
52 <p>Переменная окружения<em>JDBC_DATABASE_URL</em>содержит всю информацию, необходимую для подключения к базе данных: адрес сервера, порт, имя базы, пользователь и пароль. Именно через эту переменную приложение узнает, как подключиться к базе</p>
53 <p>Формат записи URL у базы данных должен быть таким:</p>
53 <p>Формат записи URL у базы данных должен быть таким:</p>
54 <p>Например:</p>
54 <p>Например:</p>
55 <p>Чтобы всё работало правильно, ваше приложение должно быть настроено так, чтобы оно могло читать и использовать эту переменную окружения. Это стандартный способ передачи данных о подключении к базе данных в приложениях</p>
55 <p>Чтобы всё работало правильно, ваше приложение должно быть настроено так, чтобы оно могло читать и использовать эту переменную окружения. Это стандартный способ передачи данных о подключении к базе данных в приложениях</p>
56 <p>После завершения настройки нужно будет нажать на кнопку Deploy Web Service. Ваше приложение будет клонировано из репозитория, собрано и запущено. После завершения процесса приложение станет доступно по определенному адресу, который сформируется автоматически</p>
56 <p>После завершения настройки нужно будет нажать на кнопку Deploy Web Service. Ваше приложение будет клонировано из репозитория, собрано и запущено. После завершения процесса приложение станет доступно по определенному адресу, который сформируется автоматически</p>
57 <p>Перейдите по этому адресу и проверьте, что приложение работает корректно.</p>
57 <p>Перейдите по этому адресу и проверьте, что приложение работает корректно.</p>
58 <p>Если что-то пошло не так, всегда можно посмотреть логи приложения на вкладке Logs. Они помогут вам разобраться с ошибкой</p>
58 <p>Если что-то пошло не так, всегда можно посмотреть логи приложения на вкладке Logs. Они помогут вам разобраться с ошибкой</p>
59 <h2>Особенности сборки Gradle</h2>
59 <h2>Особенности сборки Gradle</h2>
60 <p>Подключив базу данных к нашему приложению, мы добавили в него файл<em>src/main/resources/schema.sql</em>, который затем читается из кода. Когда мы попробуем собрать приложение и запустить на сервере, этот код не сработает, потому что Gradle не копирует файлы из директории<em>src/main/resources</em>в получившийся<em>jar</em>.</p>
60 <p>Подключив базу данных к нашему приложению, мы добавили в него файл<em>src/main/resources/schema.sql</em>, который затем читается из кода. Когда мы попробуем собрать приложение и запустить на сервере, этот код не сработает, потому что Gradle не копирует файлы из директории<em>src/main/resources</em>в получившийся<em>jar</em>.</p>
61 <p>Это можно исправить с помощью плагина<em>shadow</em>, который автоматически добавляет все ресурсы в<em>jar</em>:</p>
61 <p>Это можно исправить с помощью плагина<em>shadow</em>, который автоматически добавляет все ресурсы в<em>jar</em>:</p>
62 <h3>Выводы</h3>
62 <h3>Выводы</h3>
63 <ul><li>Процесс публикации сайта включает три ключевых этапа: покупка домена, выбор и настройка хостинга, а также деплой приложения на сервер.</li>
63 <ul><li>Процесс публикации сайта включает три ключевых этапа: покупка домена, выбор и настройка хостинга, а также деплой приложения на сервер.</li>
64 <li>Выбор хостинга зависит от потребностей проекта: можно использовать готовые решения (PaaS) или управлять собственными серверами (IaaS).</li>
64 <li>Выбор хостинга зависит от потребностей проекта: можно использовать готовые решения (PaaS) или управлять собственными серверами (IaaS).</li>
65 <li>Деплой на PaaS упрощает процесс развертывания, предоставляя бесплатные планы и автоматизацию, что особенно полезно для учебных проектов.</li>
65 <li>Деплой на PaaS упрощает процесс развертывания, предоставляя бесплатные планы и автоматизацию, что особенно полезно для учебных проектов.</li>
66 </ul>
66 </ul>