Поиск по сайту:

Как разместить веб-сайт с помощью Caddy в Ubuntu 22.04


Автор выбрал программу Write for DOnations.

Введение

Let’s Encrypt для включения HTTPS и включает поддержку HTTP/2. HTTPS — это система для защиты трафика между вашими пользователями и вашим сервером, и она быстро становится основным ожиданием любого работающего веб-сайта — без нее Chrome и Firefox предупредят, что ваш веб-сайт «незащищен», если пользователи попытаются отправить данные для входа.

В этом руководстве вы создадите Caddy из исходного кода с помощью xcaddy, специального инструмента для сборки Caddy, и используете его для размещения веб-сайта, защищенного с помощью HTTPS. Это влечет за собой его компиляцию, настройку с помощью Caddyfile и установку плагина. В конце концов, ваш домен будет обслуживать статические страницы, защищенные бесплатными сертификатами TLS от Let’s Encrypt.

Предпосылки

  • Сервер Ubuntu 22.04 с привилегиями root, не менее 2 ГБ ОЗУ и дополнительной учетной записью без полномочий root. Вы можете настроить это, следуя нашему Руководству по начальной настройке сервера для Ubuntu 22.04. В этом руководстве пользователем без полномочий root является sammy.
  • Как установить Go на Ubuntu 20.04, чтобы настроить последнюю версию Go (Caddy требуется Go версии 17 или выше).
  • Полностью зарегистрированное доменное имя. В этом руководстве будет использоваться ваш_домен. Вы можете приобрести доменное имя на Freenom или воспользоваться услугами регистратора доменов по вашему выбору.
  • Запись A DNS с your_domain, указывающая на общедоступный IP-адрес вашего сервера, и DNS-запись CNAME с www.your_domain указывает на @. Вы можете следовать этому введению в DNS DigitalOcean, чтобы узнать, как их добавить.
  • Персональный токен доступа (ключ API) с разрешениями на чтение и запись для вашей учетной записи DigitalOcean. Посетите страницу Как создать токен личного доступа, чтобы создать его.

Шаг 1 — Сборка Кэдди

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

Посетите страницу выпусков xcaddy и скопируйте ссылку на последний выпуск для платформы linux_amd64. Перед загрузкой перейдите в /tmp, выполнив следующую команду:

  1. cd /tmp

Затем загрузите последнюю версию с помощью wget:

  1. wget https://github.com/caddyserver/xcaddy/releases/download/v0.3.1/xcaddy_0.3.1_linux_amd64.tar.gz

После загрузки извлеките только двоичный файл:

  1. tar xvf xcaddy_0.3.1_linux_amd64.tar.gz xcaddy

Наконец, переместите исполняемый файл xcaddy в /usr/bin, сделав его доступным для всей системы:

  1. sudo mv xcaddy /usr/bin

Теперь, когда xcaddy установлен, вы соберете Caddy. Для этого создайте отдельный каталог для его хранения:

  1. mkdir ~/caddy

Перейдите к нему, выполнив следующую команду:

  1. cd ~/caddy

Чтобы собрать последнюю версию Caddy без каких-либо сторонних плагинов, выполните следующую команду:

  1. xcaddy build

Выполнение этой команды займет некоторое время, но вывод будет примерно таким:

Output
2022/08/10 15:55:18 [INFO] Temporary folder: /tmp/buildenv_2022-08-10-1555.834895411 2022/08/10 15:55:18 [INFO] Writing main module: /tmp/buildenv_2022-08-10-1555.834895411/main.go package main import ( caddycmd "github.com/caddyserver/caddy/v2/cmd" // plug in Caddy modules here _ "github.com/caddyserver/caddy/v2/modules/standard" ) func main() { caddycmd.Main() } 2022/08/10 15:55:18 [INFO] Initializing Go module 2022/08/10 15:55:18 [INFO] exec (timeout=10s): /usr/local/go/bin/go mod init caddy go: creating new go.mod: module caddy go: to add module requirements and sums: go mod tidy 2022/08/10 15:55:18 [INFO] Pinning versions 2022/08/10 15:55:18 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddyserver/caddy/v2 go: downloading github.com/caddyserver/caddy v1.0.5 ... 2022/08/10 15:55:49 [INFO] Build environment ready 2022/08/10 15:55:49 [INFO] Building Caddy 2022/08/10 15:55:49 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy ... 2022/08/10 15:55:57 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath 2022/08/10 15:58:48 [INFO] Build complete: ./caddy 2022/08/10 15:58:48 [INFO] Cleaning up temporary folder: /tmp/buildenv_2022-08-10-1555.834895411

После завершения исполняемый файл caddy будет доступен в текущей папке. Переместите его в /usr/bin, чтобы установить:

  1. sudo mv caddy /usr/bin

Вы можете попробовать запустить caddy, чтобы убедиться, что он установлен правильно:

  1. caddy version

Вывод будет содержать версию Caddy, которую вы только что скомпилировали:

Output
v2.6.1 h1:EDqo59TyYWhXQnfde93Mmv4FJfYe00dO60zMiEt+pzo=

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

Шаг 2 — Установка Кэдди

Теперь, когда вы убедились, что можете собирать и запускать Caddy, вы можете настроить службу systemd, чтобы Caddy запускался автоматически при запуске системы. Чтобы узнать больше о systemd, посетите наш учебник по Systemd Essentials.

Caddy требует своего пользователя и группу для работы в качестве службы systemd. Создайте группу с помощью следующей команды:

  1. sudo groupadd --system caddy

Затем создайте нового пользователя с именем caddy, который принадлежит к группе caddy:

  1. sudo useradd --system \
  2. --gid caddy \
  3. --create-home \
  4. --home-dir /var/lib/caddy \
  5. --shell /usr/sbin/nologin \
  6. --comment "Caddy web server" \
  7. caddy

У нового пользователя caddy будет создан собственный домашний каталог. Поскольку для его оболочки задано значение nologin, невозможно будет войти в систему как caddy.

Измените владельца двоичного файла Caddy на пользователя root:

  1. sudo chown root:root /usr/bin/caddy

Это изменение не позволит другим учетным записям изменять исполняемый файл. Однако, несмотря на то, что пользователь root будет владеть Caddy, вам рекомендуется запускать его, используя другие учетные записи без полномочий root, присутствующие в системе, как в случае с systemd. услуга. Выполнение команд из учетной записи без полномочий root гарантирует, что злоумышленник не сможет изменить двоичный файл или выполнить команды от имени root в случае взлома Caddy (или другой программы).

Затем установите разрешения для двоичного файла на 755, что даст root полные права на чтение/запись/выполнение для файла, в то время как другие пользователи смогут только читать и выполнять это:

  1. sudo chmod 755 /usr/bin/caddy

Вы завершили настройку бинарного файла Caddy и готовы приступить к настройке Caddy.

Создайте каталог, в котором вы будете хранить файлы конфигурации Caddy:

  1. sudo mkdir /etc/caddy

Затем установите для него права пользователя и группы:

  1. sudo chown -R root:caddy /etc/caddy

Установка пользователя как root и группы как caddy гарантирует, что Caddy будет иметь доступ для чтения и записи к папке (через группу caddy) и что только учетная запись суперпользователя будет иметь те же права на чтение и изменение.

На следующем этапе вы включите автоматическую подготовку сертификатов TLS от Let’s Encrypt. При подготовке к этому создайте каталог для хранения любых сертификатов TLS, которые получит Caddy, и задайте для него те же правила владения, что и для каталога /etc/caddy:

  1. sudo mkdir /etc/ssl/caddy
  2. sudo chown -R root:caddy /etc/ssl/caddy

Caddy должен иметь возможность записывать сертификаты в этот каталог и читать из него, чтобы шифровать запросы. По этой причине измените разрешения для каталога /etc/ssl/caddy, чтобы он был доступен только для root и caddy:

  1. sudo chmod 0770 /etc/ssl/caddy

Затем создайте каталог для хранения файлов, которые будет размещать Caddy:

  1. sudo mkdir /var/www

Затем установите владельца и группу каталога на caddy:

  1. sudo chown caddy:caddy /var/www

Чтобы установить службу Caddy, загрузите файл модуля systemd из репозитория Caddy GitHub в /etc/systemd/system, выполнив:

  1. sudo sh -c 'curl https://raw.githubusercontent.com/caddyserver/dist/master/init/caddy.service > /etc/systemd/system/caddy.service'

Вы получите такой ответ:

Output
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1030 100 1030 0 0 4698 0 --:--:-- --:--:-- --:--:-- 4703 ``` Modify the service file's permissions so it can only be modified by its owner, `root`: ```command sudo chmod 644 /etc/systemd/system/caddy.service

Затем перезагрузите systemd, чтобы обнаружить службу Caddy:

  1. sudo systemctl daemon-reload

Проверьте, обнаружил ли systemd службу Caddy, запустив systemctl status:

  1. sudo systemctl status caddy

Вы получите вывод, похожий на:

Output
● caddy.service - Caddy Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: https://caddyserver.com/docs/

Если у вас такой же вывод, то новая служба была обнаружена systemd.

В рамках первоначальной настройки сервера вы включили ufw и разрешили подключения SSH. Чтобы Caddy обслуживал трафик HTTP и HTTPS с вашего сервера, вам необходимо разрешить их в ufw, выполнив следующую команду:

  1. sudo ufw allow proto tcp from any to any port 80,443

Вывод будет:

Output
Rule added Rule added (v6)

Используйте ufw status, чтобы подтвердить свои изменения:

  1. sudo ufw status

Вы получите следующий вывод:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80,443/tcp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80,443/tcp (v6) ALLOW Anywhere (v6)

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

Шаг 3 — Настройка Кэдди

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

Создайте базовый файл HTML с именем index.html в папке /var/www:

  1. sudo nano /var/www/index.html

Добавьте следующие строки:

<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1 style="font-family: sans-serif">This page is being served via Caddy</h1>
</body>
</html>

При отображении в веб-браузере этот файл будет отображать заголовок с текстом Эта страница обслуживается через Caddy. Сохраните и закройте файл.

Caddy считывает свою конфигурацию из файла с именем Caddyfile, который хранится в папке /etc/caddy. Создайте и откройте файл для редактирования:

  1. sudo nano /etc/caddy/Caddyfile

Добавьте следующие строки:

  1. http:// {
  2. root * /var/www
  3. encode gzip
  4. file_server
  5. }

Эта базовая конфигурация Caddy объявляет, что весь HTTP-трафик на ваш сервер должен обслуживаться файлами (file_server) из /var/www (который помечен как root) и сжат с помощью gzip для сокращения времени загрузки страницы на стороне клиента.

Caddy имеет разные директивы для многих случаев использования. Например, официальная страница документации для директив.

Когда вы закончите, сохраните и закройте файл.

Чтобы проверить, что все работает правильно, запустите службу Caddy:

  1. sudo systemctl start caddy

Затем запустите systemctl status, чтобы найти информацию о статусе службы Caddy:

  1. sudo systemctl status caddy

Вы получите следующее:

Output
● caddy.service - Caddy Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: active (running) since Wed 2022-08-10 15:02:41 UTC; 2s ago Docs: https://caddyserver.com/docs/ Main PID: 5443 (caddy) Tasks: 7 (limit: 1119) Memory: 7.5M CPU: 30ms CGroup: /system.slice/caddy.service └─5443 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile

Теперь вы можете посетить IP-адрес вашего сервера в веб-браузере. Ваша тестовая веб-страница будет отображать:

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

Шаг 4 — Включение автоматического TLS с помощью Let’s Encrypt

Плагины могут изменять и расширять поведение Caddy. Как правило, они предлагают больше директив конфигурации в зависимости от вашего варианта использования. На этом шаге вы включите автоматическую подготовку и обновление сертификата Let’s Encrypt, используя записи DNS TXT для проверки. Чтобы проверить использование записей DNS TXT, вы установите официальный плагин для взаимодействия с API DNS DigitalOcean.

Чтобы добавить плагин, вам нужно перекомпилировать Caddy с помощью xcaddy, указав репозитории плагинов, которые должны быть доступны. Выполните следующую команду, чтобы скомпилировать Caddy с поддержкой DNS DigitalOcean:

  1. xcaddy build --with github.com/caddy-dns/digitalocean@master

Вывод будет примерно таким:

Output
... 2022/08/10 15:03:24 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddy-dns/digitalocean@master github.com/caddyserver/caddy/v2 go: downloading github.com/caddy-dns/digitalocean v0.0.0-20220527005842-9c71e343246b go: downloading github.com/libdns/digitalocean v0.0.0-20220518195853-a541bc8aa80f go: downloading github.com/digitalocean/godo v1.41.0 go: downloading github.com/google/go-querystring v1.0.0 go: downloading golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c go: downloading google.golang.org/appengine v1.6.6 go: added github.com/caddy-dns/digitalocean v0.0.0-20220527005842-9c71e343246b go: added github.com/digitalocean/godo v1.41.0 go: added github.com/libdns/digitalocean v0.0.0-20220518195853-a541bc8aa80f 2022/08/10 15:03:33 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v go: downloading github.com/antlr/antlr4 v0.0.0-20200503195918-621b933c7a7f go: downloading github.com/Masterminds/semver v1.4.2 go: downloading github.com/cenkalti/backoff v2.2.1+incompatible go: downloading github.com/cpuguy83/go-md2man v1.0.10 go: downloading github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220804214150-8b0cc382067f go: downloading github.com/antlr/antlr4 v4.10.1+incompatible go: upgraded github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed => v0.0.0-20220804214150-8b0cc382067f go: upgraded golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c => v0.0.0-20211104180415-d3ed0bb246c8 go: upgraded google.golang.org/appengine v1.6.6 => v1.6.7 2022/08/10 15:03:39 [INFO] Build environment ready 2022/08/10 15:03:39 [INFO] Building Caddy 2022/08/10 15:03:39 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy 2022/08/10 15:03:40 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath 2022/08/10 15:03:56 [INFO] Build complete: ./caddy 2022/08/10 15:03:56 [INFO] Cleaning up temporary folder: /tmp/buildenv_2022-08-10-1503.1377463227

После завершения компиляции переместите полученный двоичный файл в /usr/bin, выполнив:

  1. sudo mv caddy /usr/bin

Затем установите соответствующие разрешения:

  1. sudo chown root:root /usr/bin/caddy
  2. sudo chmod 755 /usr/bin/caddy

Далее вы настроите Caddy для работы с API DigitalOcean для установки записей DNS. Caddy необходимо прочитать ваш токен API как переменную среды для настройки DNS DigitalOcean, поэтому вы отредактируете его файл модуля systemd. Откройте файл для редактирования:

  1. sudo nano /etc/systemd/system/caddy.service

Добавьте выделенную строку в раздел [Service], заменив your_token_here своим токеном API:

...
[Service]
Type=notify
User=caddy
Group=caddy
Environment=DO_AUTH_TOKEN=your_token_here
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
...

Сохраните и закройте этот файл, затем перезагрузите демон systemd, чтобы убедиться, что конфигурация обновлена:

  1. sudo systemctl daemon-reload

Запустите systemctl restart, чтобы проверить изменения конфигурации:

  1. sudo systemctl restart caddy

Затем запустите systemctl status, чтобы проверить, правильно ли он работает:

  1. sudo systemctl status caddy

Вы получите следующий вывод:

Output
● caddy.service - Caddy Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: active (running) since Wed 2022-08-10 15:06:01 UTC; 2s ago Docs: https://caddyserver.com/docs/ Main PID: 5620 (caddy) Tasks: 7 (limit: 1119) Memory: 7.5M CPU: 37ms CGroup: /system.slice/caddy.service └─5620 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile

Затем вам нужно будет внести небольшие изменения в ваш Caddyfile, поэтому откройте его для редактирования:

  1. sudo nano /etc/caddy/Caddyfile

Добавьте выделенные строки в Caddyfile, заменив your_domain своим доменом (вместо http://) и добавление блока tls с указанным DNS DigitalOcean:

your_domain {
    root * /var/www
    encode gzip
    file_server
    
    tls {
        dns digitalocean {env.DO_AUTH_TOKEN}
    }
}

Использование домена, а не спецификатора протокола для имени хоста приведет к тому, что Caddy будет обслуживать запросы через HTTPS. Директива tls настраивает поведение Caddy при использовании TLS, и вы указываете ему использовать подключаемый модуль digitalocean для настройки записей DNS и запроса сертификатов. Поддиректива dns указывает, что Caddy должен использовать систему DNS DigitalOcean вместо HTTP.

Сохраните и закройте файл.

После этого ваш сайт готов к развертыванию. Перезапустите Caddy с помощью systemctl, а затем включите его, чтобы он запускался при загрузке:

  1. sudo systemctl restart caddy
  2. sudo systemctl enable caddy

Когда вы посещаете свой домен, вы будете автоматически перенаправлены на HTTPS с тем же сообщением «Эта страница обслуживается через сообщение Caddy».

Теперь ваша установка Caddy завершена и защищена, и вы можете дополнительно настроить ее в соответствии со своим вариантом использования.

Заключение

Теперь у вас установлен и настроен Caddy на вашем сервере, который обслуживает статические страницы в нужном вам домене и защищен бесплатными сертификатами Let’s Encrypt TLS.

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

Вы также можете узнать больше об использовании языка Go из нашей серии статей «Как программировать в Go».