Разверните собственный хост статических сайтов на VPS с помощью Caddy Server

Недавно мне пришлось работать над проектом с интересными требованиями:

  • Хостинг статического веб-сайта
  • С удобным для пользователя процессом загрузки файлов
  • Работающий на пользовательском домене
  • С SSL сертификатом
  • И иметь корневой доступ к серверу (по… причинам).

Большинство из этих требований на самом деле очень легко выполнить с помощью стороннего провайдера. Но вот последнее. Это самое сложное. Большинство провайдеров не предоставляют вам доступ на уровне root. Это означает, что мне придется делать все это самому на виртуальном частном сервере (VPS).

И я это сделал, поэтому решил поделиться с вами на случай, если у вас (или у меня в будущем) когда-нибудь возникнут такие же потребности.

Предоставление VPS

Прежде всего, вам понадобится собственный VPS. Я использовал Linode. Он очень быстрый, надежный и доступный. Кроме того, если у вас еще нет учетной записи, у них обычно проводятся акции, по которым вы можете начать работу с бесплатными кредитами.

Ура!

(Полное раскрытие информации: я работаю в компании Akamai, которая теперь владеет Linode, но это мой блог, и я могу писать все, что захочу. Я рекомендую их, потому что они мне нравятся, а не потому, что я работаю на Akamai. Но мне помогает то, что я пользуюсь ими бесплатно. Так что ради прозрачности, возможно, есть некоторая предвзятость, но я надеюсь, что вы будете использовать их, потому что они хорошие).

Если у вас есть учетная запись Linode, вы можете перейти на cloud.linode.com/linodes, чтобы создать новый сервер. Или, если у вас есть учетная запись в другом месте, сделайте то же самое там. Остальное должно быть в основном таким же.

Нам нужно создать новый сервер, определить дистрибутив Linux, местоположение и ресурсы. Я выбрал Ubuntu (то, к чему я привык) во Фримонте, Калифорния (ближе всего к моим пользователям/мне) на экземпляре Nanode 1 ГБ (самый дешевый из тех, что у них есть; $5; lol).

Для статического сайта, вероятно, было бы неплохо интегрировать CDN, но в данном проекте это не было предусмотрено.

Последнее — это настройка доступа к вашему серверу. Вам придется установить пароль пользователя root, но я бы настоятельно рекомендовал сгенерировать SSH-ключи. Если вы это сделаете, вам не нужно будет помнить пароль.

В любом случае, как только ваш сервер будет создан, вы сможете увидеть его IP-адрес (например, 50.100.7.293). Вы можете использовать его для подключения к серверу по SSH, открыв терминал и набрав:

ssh root@50.100.7.293
Войти в полноэкранный режим Выйти из полноэкранного режима

В первый раз, когда вы это сделаете, вас могут спросить, доверяете ли вы серверу. Вы отвечаете. Доверяйте.

Если вы не использовали SSH-ключи, вы непослушный ребенок и будете наказаны тем, что вам придется вводить пароль каждый раз, когда вы захотите войти в систему. Если вы использовали SSH-ключи, поздравляю. Вы уже должны быть на сервере. (Серьезно, вам действительно стоит использовать SSH-ключи).

Последний шаг здесь технически необязателен, но это хорошая идея — запустить команду update (если вы вошли в систему под именем «root», вам не нужен sudo, но привычка):

sudo apt update
Вход в полноэкранный режим Выйдите из полноэкранного режима

Настройка веб-сервера Caddy

Caddy — это веб-сервер с открытым исходным кодом, написанный на языке Go. Он хорошо подходит для статического хостинга, обратного проксирования и многого другого, а одной из самых крутых особенностей является встроенный HTTPS.

Честно говоря, я думал, что эта часть будет намного сложнее, чем оказалось, но Caddy великолепен. Сначала мы выполним инструкции по установке Caddy на наш сервер (обратите внимание, что каждая строка — это отдельная команда):

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
Войти в полноэкранный режим Выйти из полноэкранного режима

После этого вы сможете зайти на IP-адрес вашего сервера и увидеть сайт Caddy по умолчанию.

Подключение домена

Это еще один шаг, который может немного отличаться в зависимости от вашего DNS-провайдера, но суть должна быть одинаковой.

Войдите в систему, откуда вы управляете DNS (скорее всего, это ваш регистратор доменных имен). Измените настройки DNS, добавив новую запись A. Задайте имя поддомена или используйте ‘@’ для корневого домена, а в качестве значения задайте IP-адрес вашего сервера.

После этого вы можете перейти на свой домен, и вы увидите сайт Caddy по умолчанию. Удобно, что на странице даже приведены примеры дальнейших действий. Мы будем следовать им в ближайшее время, но с небольшими изменениями.

Создание SFTP-доступа

В моем проекте я хотел предоставить другому человеку доступ к серверу, чтобы он мог загружать файлы. Они не хотели использовать терминал, но были достаточно знакомы с FTP. Поэтому я решил предоставить им SFTP-доступ, создав нового пользователя.

Это оказалось проще, чем я предполагал вначале:

adduser username
Войти в полноэкранный режим Выйти из полноэкранного режима

В результате вам будет предложено задать пароль и некоторые дополнительные сведения о пользователе. После этого вы можете передать имя пользователя и пароль кому угодно, чтобы предоставить им доступ к серверу.

Затем вы можете использовать FTP-клиент, например Filezilla, который поддерживает SFTP. Только не забудьте использовать протокол sftp:// в URL (sftp://50.100.7.293 или sftp://your.domain.com).

Мне нравится эта система, потому что она отлично подходит для тех, кто предпочитает графический интерфейс, и можно ограничить доступ пользователя только его домашней папкой.

Обслуживание веб-сайта

Итак, переходим к последнему шагу. Нам нужно указать Caddy, как обслуживать наш сайт. Caddy можно использовать для нескольких различных вещей, таких как обратный прокси или запуск php_fastcgi, но сегодня я сосредоточусь на обслуживании статических файлов. Для этого нам понадобится папка, которую мы будем использовать в качестве корневой.

Веб-страница Caddy по умолчанию предлагает поместить папку в /var/www/html, но мне нравится создавать папку, соответствующую домену, в домашней директории пользователя. Таким образом мы можем поддерживать несколько доменов, и интуитивно понятно, за что отвечает каждая папка.

Вы можете создать папку с помощью Filezilla или в терминале с помощью этой команды:

sudo mkdir /home/username/your.domain.com
Войти в полноэкранный режим Выйти из полноэкранного режима

Далее, вам понадобится файл index.html. Опять же, вы можете использовать Filezilla, терминал или даже VS Code. Вот команда для создания файла index.html и записи в него HTML:

echo '<h1>Nugget is a good dog</h1>' > /home/username/your.domain.com/index.html
Войти в полноэкранный режим Выйти из полноэкранного режима

Это очень простой сайт, но он действительно работает.

Итак, теперь у нас есть все необходимое для запуска нашего сайта. Нам просто нужно указать Caddy, где находится сайт. Мы можем сделать это, отредактировав файл Caddy по умолчанию:

sudo nano /etc/caddy/Caddyfile
Войти в полноэкранный режим Выйти из полноэкранного режима

Файл должен содержать блок конфигурации, открывающийся с помощью :80 и устанавливающий статический сервер из папки /usr/share/caddy. Также есть несколько закомментированных строк с примерами других вещей, которые вы можете сделать. Чтобы узнать еще больше, ознакомьтесь с учебником по Caddyfile.

Для нашего сайта нам нужно заменить :80 на наш домен, а папку корневого сервера на ту, которую мы создали минуту назад. Это должно выглядеть примерно так:

your.domain.com {
  root * /home/username/your.domain.com
  file_server
}
Вход в полноэкранный режим Выход из полноэкранного режима

Вы захотите поменять свои данные, но как только вы это сделаете, последним шагом будет перезагрузка службы Caddy.

systemctl reload caddy
Войти в полноэкранный режим Выйти из полноэкранного режима

Через несколько мгновений вы должны перезагрузить свой сайт и увидеть, что на нем загружается новое содержимое файла index.html.

Если вы захотите внести изменения в будущем, вам нужно будет просто заменить HTML-файл, а не перезагружать сервер.

Рад! Но это еще не все. Есть еще несколько интересных вещей, о которых Caddy позаботится за нас:

  • Предоставление SSL-сертификата
  • Установка его на сервер
  • Перенаправление с HTTP на HTTPS
  • Обновление SSL-сертификатов до истечения срока действия

И все это поставляется из коробки. Я действительно был впечатлен тем, насколько приятно и легко с ним работать по сравнению с некоторыми из тех, через которые мне приходилось проходить в прошлом.

Это не значит, что он лучше, чем альтернатива вроде NGINX. Но он определенно проще. Я не настолько эксперт, чтобы утверждать, но для моих проектов этого более чем достаточно.

Следующие шаги

На этом мы сегодня закончим, но я решил оставить вам еще несколько идей о том, что вы можете сделать дальше.

Узнайте больше о Caddy

Мы лишь поверхностно ознакомились с возможностями Caddy, но я рекомендую вам узнать больше, зайдя на сайт caddyserver.com. Например, мы не установили сжатие на нашем сервере. Это значительно повысило бы производительность. Вы можете прочитать больше о доступных опциях в документации.

Ограничение доступа пользователей

Как я уже говорил, когда мы создавали учетную запись пользователя SFTP, этот пользователь может иметь доступ к гораздо большему, чем ему нужно. Если вы хотите дать кому-то доступ к редактированию содержимого домашней папки или только папки сайта, вы можете это сделать. Это, вероятно, хорошая практика безопасности.

Настройка правил брандмауэра

По тому же принципу безопасности, наш сервер в настоящее время разрешает публичный доступ к любому порту. Если вы собираетесь запустить несколько приложений, возможно, будет хорошей идеей ограничить публичный доступ к портам и разрешить доступ только через обратный прокси-сервер.

К счастью, в Ubuntu есть встроенный инструмент UncomplicatedFirewall, который, в общем-то, является простым брандмауэром. Вы можете проверить состояние брандмауэра с помощью этой команды:

sudo ufw status
Войти в полноэкранный режим Выйти из полноэкранного режима

По умолчанию он должен быть «неактивным». Вы можете активировать его с помощью команды:

sudo ufw enable
Войти в полноэкранный режим Выйти из полноэкранного режима

Если вы включите его, убедитесь, что вы открыли доступ к необходимым портам, включая 22, 80 и 443. Они обеспечивают доступ для протоколов SSH, HTTP и HTTPS соответственно.

Если вы включите брандмауэр и выйдете, не открыв доступ к SSH, вы можете заблокировать себя на сервере. Не спрашивайте меня, откуда я знаю.

В любом случае, вы можете разрешить доступ к этим портам с помощью этих команд:

sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
Войти в полноэкранный режим Выйти из полноэкранного режима

(Вы также можете явно указать номера портов).

Вы можете сделать еще больше с помощью этого брандмауэра, но это выходит за рамки сегодняшней статьи.

Автоматизация развертывания

В настоящее время внесение изменений в веб-сайт — это немного ручной процесс. И многие сервисы предлагают сегодня способы автоматического развертывания ваших изменений, когда они попадают в Git-репозиторий.

Я сам еще не создал такую систему, но это было бы очень здорово, и я думаю, что у меня есть простая концепция. Вы можете установить веб-сервер, который может прослушивать веб-крючки. Затем использовать ваш CI/CD конвейер (возможно, GitHub Actions), чтобы пинговать этот webhook каждый раз, когда новое изменение прибывает в производственную ветку.

Когда веб-крючок срабатывает, он может запустить сценарий bash, который использует Git для извлечения изменений, запускает все необходимые команды сборки и копирует производственные артефакты в папку сайта.

Я уверен, что это звучит проще, чем есть на самом деле, и я упустил некоторые вещи, но вы поняли идею. Если вы сделаете сборку, дайте мне знать. Я с удовольствием проверю.

Но пока это все, что у меня есть. Адиос амигос!

Большое спасибо, что прочитали. Если вам понравилась эта статья, пожалуйста, поделитесь ею. Это один из лучших способов поддержать меня. Вы также можете подписаться на мою рассылку или следить за мной в Twitter, если хотите знать, когда будут опубликованы новые статьи.


Первоначально опубликовано на austingil.com.

Оцените статью
devanswers.ru
Добавить комментарий