Docker, SSL и 100 баллов Google Speed: Превращаем «голый» контейнер в нормальный сайт GRAV CMS. Часть 3

В прошлых сериях мы с вами сделали страшное: подняли свой сайт на CMS Grav внутри Docker-контейнера. Это было дешево (99 рублей, Карл!), сердито и быстро.

*Выбираем только виртуализацию KVM, для использования Docker
*Выбираем только виртуализацию KVM, для использования Docker

Но у нас осталась одна проблема. Наш сайт болтался в интернете «голым» — на 80-м порту, без HTTPS. В 2026 году браузеры смотрят на такие сайты как на прокаженных, помечая их обидным «Not Secure». Да и Google такие ресурсы, мягко говоря, недолюбливает.

Сегодня мы будем наводить красоту:

  1. Спрячем Grav за обратным прокси (Reverse Proxy).
  2. Прикрутим бесплатные SSL-сертификаты, которые сами обновляются (потому что лень — двигатель прогресса).
  3. Настроим базовое техническое SEO, чтобы поисковики перестали нас игнорировать.
  4. И, конечно, похвастаемся «зеленой зоной» в Google PageSpeed.

Шаг 1. Хирургическое вмешательство в Docker Compose

Раньше наш Grav нагло смотрел в интернет портом 80:80. Это работало, но если мы хотим SSL, нам нужен посредник. Кто-то, кто будет встречать гостей, проверять документы (сертификаты) и провожать к столику.

В мире Docker лучшим дворецким для ленивых админов является Nginx Proxy Manager (NPM). У него есть веб-морда, он сам дружит с Let’s Encrypt, и мне не надо писать километровые конфиги Nginx руками в vi.

Заходим на сервер (привет, MobaXterm, мой верный друг) и открываем наш docker-compose.yml.

Нам нужно сделать две вещи:

  1. Убрать прямой проброс портов у Grav.
  2. Добавить сервис npm (Nginx Proxy Manager) и объединить их общей внутренней сетью.

Было просто, стало надежно. Вот как выглядит мой конфиг теперь:

* Редактируем docker-compose.yml. Обратите внимание: Grav больше не светит портами наружу, он в домике (в сети my-network)
* Редактируем docker-compose.yml. Обратите внимание: Grav больше не светит портами наружу, он в домике (в сети my-network)

Запускаем всё это дело командой docker compose up -d. Видим, как Docker радостно качает слои и поднимает контейнеры.

* Docker шуршит дисками. Grav пересоздан, NPM запущен. Полет нормальный.
* Docker шуршит дисками. Grav пересоздан, NPM запущен. Полет нормальный.

Шаг 2. Получаем «Зеленый замок» (SSL) за 3 клика

Теперь самое приятное. Вместо того чтобы мучиться с консольным certbot, прописывать кроны и бояться, что через 3 месяца сертификат протухнет, мы идем в админку NPM.

Она висит на 81-м порту. Заходим, меняем дефолтные пароли (мы же не халатные админы, верно?) и видим пустую панель.

 * Панель управления полетами. Пока пусто, но это ненадолго.
 * Панель управления полетами. Пока пусто, но это ненадолго.

Нажимаем "0 Proxy Hosts", далее "Add Proxy Host". Тут всё интуитивно, даже если вы видели Linux только в кино про хакеров:

  1. Вбиваем наш домен (myisa.ru).
  2. Указываем, куда пересылать трафик: имя контейнера grav и порт 80.
  3. Включаем галочки Block Common Exploits (мелочь, а приятно).

А теперь магия. Вкладка SSL. Выбираем «Request a new Certificate», ставим галку Force SSL (чтобы всех принудительно кидало на HTTPS) и соглашаемся с правилами.

* Настройка проксирования. Force SSL — обязательно, мы же не хотим оставлять дыры.
* Настройка проксирования. Force SSL — обязательно, мы же не хотим оставлять дыры.

Жмем Save. Nginx Proxy Manager сам стучится в Let's Encrypt, доказывает, что домен наш, получает сертификат и прописывает его. Всё. Сайт открывается по HTTPS.

Шаг 3. Техническое SEO: Делаем вид, что мы рады роботам

Сайт работает, замок зеленый. Но для поисковых систем наш сайт — это черный ящик. Надо дать им карту и инструкции.

В Grav (в отличие от некоторых CMS на букву W) это делается через плагины, которые не кладут базу данных при установке.

Идем в админку Grav -> Plugins. Нам нужен джентльменский набор:

  1. Sitemap — генерирует карту сайта.
  2. Social & SEO Meta Tags — чтобы ссылки в Телеграме выглядели красиво, а не как набор символов.
* Установка плагинов в Grav. Кнопка "+ Add" — наш лучший друг.
* Установка плагинов в Grav. Кнопка "+ Add" — наш лучший друг.

После установки Sitemap у нас автоматически появляется раздел sitemap. Но поисковик сам его не найдет, если мы ему не скажем. Для этого нужен файл-вахтер — robots.txt.

В Grav он уже есть просто добавим в него строку

Sitemap: https://myisa.ru/sitemap

* Проверяем robots.txt. <a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fmyisa.ru%2Frobots.txt&postId=2678547" rel="nofollow noreferrer noopener" target="_blank">https://myisa.ru/robots.txt</a> Если в конце есть ссылка на Sitemap — значит, поисковые роботы не заблудятся.
* Проверяем robots.txt. https://myisa.ru/robots.txt Если в конце есть ссылка на Sitemap — значит, поисковые роботы не заблудятся.

Теперь любая страница нашего сайта имеет правильные мета-теги, а Яндекс с Гуглом знают, какие страницы индексировать.

Шаг 4. Момент истины: Google PageSpeed

Ради чего мы вообще связывались с Grav, а не ставили тяжелый WordPress? Ради скорости. Grav работает на файлах, ему не нужно делать сто запросов к базе данных, чтобы отдать заголовок страницы.

Я закончил настройку, включил HTTP/2 в Nginx Proxy Manager (галочка, которую мы ставили ранее, помните?) и пошел в Google PageSpeed Insights.

Барабанная дробь...

* "Стол очков". 100 из 100. Производительность, SEO, Best Practices. Шах и мат, любители тяжелых фреймворков.
* "Стол очков". 100 из 100. Производительность, SEO, Best Practices. Шах и мат, любители тяжелых фреймворков.

100 баллов на компьютерах. На дешёвом VPS за 99 рублей. С SSL шифрованием и Docker-прослойкой.

Итог

Что мы имеем на выходе третьей части:

  1. Безопасность: Весь трафик шифруется, порты закрыты, работает Reverse Proxy.
  2. Удобство: Сертификаты обновляются сами, админка Grav летает.
  3. SEO: Технический минимум выполнен, сайт готов к индексации.
  4. Скорость: Максимально возможная.

Вся эта конструкция потребляет минимум ресурсов сервера (Debian 11 кушает совсем немного), легко переносится (просто скопируйте папку с volume) и не требует постоянного внимания.

Системный администратор доволен. Google доволен. Бюджет (99р) цел.

P.S. В следующих статьях (если я не поленюсь) расскажу, как прикрутить сюда VS Code вместо админки. Настроим Remote SSH для написания статей прямо в редакторе кода. Не переключайтесь.

Начать дискуссию