Как запустить сайт с Docker, Nginx и Certbot: полный гайд
У любого проекта должен быть сайт. Даже если единственный пользователь — моя мама.Мама — это идеальный QA: откроет с телефона, в дороге, через мобильный интернет, спросит «а почему замочек не зелёный?» и закроет, если что-то долго грузится. Значит, сайт должен открываться по твоему красивому домену, по HTTPS, без рыжих предупреждений, и желательно находиться в поиске.
В этой статье мы за вечер соберём и задеплоим простой сайт «с нуля» почти бесплатно: купим домен, поднимем машину с публичным IP, обернём всё в Docker, прикрутим автопродление SSL, добавим sitemap.xml и robots.txt, и вручную прокинем сайт в индексацию Google и Яндекса, чтобы он не лежал «в вакууме».
По шагам:
- покупаем красивый домен
- находим компьютер с публичным IP (или дешёвый VPS)
- ставим Docker и Docker Compose
- пишем минимальные конфиги (reverse‑proxy, сайт, robots.txt, sitemap.xml)
- настраиваем и обновляем SSL (Let’s Encrypt, автообновление)
- подключаем Google Search Console и Яндекс.Вебмастер, отправляем сайт в индекс
В конце — у тебя домен с «замочком», сайт открывается на телефоне у мамы, а поисковики знают, что ты существуешь.Проблематика (что обычно ломается)
- «Сайт есть, а доверия нет». Без HTTPS браузеры пугают пользователей. Let’s Encrypt спасает, но сертификаты живут 90 дней — если не автоматизировать продление, всё сломается в самый неудобный момент.
- DNS и сеть — чёрная магия. Белый IP, порты 80/443, NAT, иногда IPv6 — легко потеряться. Мы пройдём «самый короткий путь» без лишней теории.
- Зоопарк гайдов. Одни статьи переписывают учебник по Linux, другие — «магия одной кнопкой». В итоге или оверкилл, или непонятно, что происходит под капотом.
- Поисковики не телепаты. Если не отдать sitemap.xml, корректный robots.txt и не «постучаться» в Search Console/Вебмастер, сайт может неделями валяться вне индекса.
- Конфиги, которые не воспроизводятся. «Оно работало у меня локально» — не план. Нужна структура, которую можно повторить через месяц или перенести на новую машину за 10 минут.
- Безопасность и обновления. Правильные заголовки, автопродление сертификатов, изоляция через Docker — всё это снижает риск «позвать маму — показать 502».
🛒 Шаг 1. Покупаем красивый домен
Первое, что нужно любому сайту, — свой адрес в интернете.Я обычно беру домены на reg.ru, потому что у них простой интерфейс и быстрая регистрация. Но по факту — можно использовать любой регистратор, хоть GoDaddy, хоть Namecheap, хоть вашего локального провайдера.
Процесс простой:
- Вбиваем желаемый адрес в поисковую строку на сайте регистратора.
- Смотрим доступные варианты и цены (будьте готовы, что .com и .ru могут сильно отличаться).
- Выбираем понравившийся домен.
- Оплачиваем.
💡 Лайфхак:Отказываемся от всех «дополнительных услуг» — конструкторы сайтов, «хостинг за 1 рубль», SEO-пакеты и прочий мусор. Это почти всегда платные подписки, которые через месяц начнут жечь бюджет.
В итоге у нас в руках домен, например:
Дальше будем учить его показывать наш сайт и радовать маму зелёным замочком.
🌐 Шаг 2. Находим компьютер с публичным IP
Чтобы сайт был доступен маме в любое время суток, нам нужен компьютер, который:
- работает 24/7;
- имеет постоянный (статический) IP;
- готов тянуть на себе веб-сервер.
Вариант 1: Домашний сервер
Если у тебя дома стоит ПК, который никогда не выключается (например, твой старый системник или мини-сервер), можно попросить у интернет-провайдера выделенный статический IP.У меня такая услуга стоит ~200 ₽/месяц, у тебя может быть чуть дороже или дешевле.
Но надо заморочиться с локальной сетью, пробросом портов и динамическим DNS. Но для нашей задачи это лишняя головная боль — главное, чтобы в итоге у нас был:
- компьютер с Ubuntu (или другой Linux-системой);
- статический IP;
- доступ по SSH.
Вариант 2: VPS (виртуальный сервер)
Я чаще всего беру VPS на serverspace — самая дешёвая конфигурация там обходится примерно в 400 ₽/месяц. Это дороже, чем дома, но зато:
- сервер гарантированно работает 24/7;
- не шумит кулерами под столом;
- можно выбрать локацию (Москва, Амстердам, Нью-Йорк — что душе угодно).
📌 На этом этапе у нас уже есть:
- домен debugtest.ru;
- машина, на которую можно будет задеплоить сайт.
- в настройках DNS IP адрес связан с доменом debugtest.ru
Дальше — ставим Docker и готовим окружение.
🐳 Шаг 3. Ставим Docker и Docker Compose
Почему я люблю Docker?Потому что всё окружение можно описать декларативно: база, сервер, сервисы — всё в одном docker-compose.yml. Один файл — и твой проект можно поднять на любой машине за пару минут.
Для нашей цели нам нужен только Docker Engine и Docker Compose plugin.Ниже — команды для Ubuntu 24. Если у тебя другая версия или дистрибутив, просто загугли:
📦 0.1 Подключаем репозиторий Docker
⚙ 0.2 Устанавливаем Docker Engine + Compose plugin
🙅 0.3 (Необязательно) запуск Docker без sudo
После этого выйди из сессии SSH (exit) и зайди снова. Теперь можно писать docker ps, а не sudo docker ps.
📂 Шаг 4. Пишем минимальные конфиги
Пора навести порядок и подготовить инфраструктуру, которая сможет работать на любом сервере с Docker.
1. Делаем структуру папочек
В корне создаём папку sites и внутри неё такую структуру:
Команды для Linux:
Для редактирования текстовых файлов можно использовать nano:
(Если ты используешь vim, то, скорее всего, и так не читаешь этот гайд 😉)
2. docker-compose.yml
Файл docker-compose.yml (в папке sites) будет выглядеть так:
3. Конфиг Nginx (nginx/debugtest.conf)
4. sitemap.xml
site/sitemap.xml:
5. robots.txt
site/robots.txt:
📌 Теперь у нас есть:
- Docker-конфигурация для Nginx;
- минимальный статический сайт;
- robots.txt и sitemap.xml для поисковиков.
Дальше — будем ставить SSL и запускать всё это добро.
🔒 Шаг 5. Настраиваем и обновляем SSL (Let’s Encrypt)
Наша цель — чтобы мама открыла https://debugtest.ru и увидела зелёный замочек, а не красное «Небезопасно».Для этого используем бесплатные сертификаты от Let’s Encrypt и встроим их в наш Docker-стек.
1. Запускаем docker-compose
Переходим в папку с docker-compose.yml и стартуем контейнеры:
Пока без -d, чтобы видеть логи и убедиться, что Nginx поднялся без ошибок.
2. Проверяем валидацию (dry-run)
Открываем вторую SSH-сессию к серверу и там выполняем тестовый запуск certbot:
--dry-run — это проверка. Certbot не выпустит реальный сертификат, но убедится, что домен доступен и валидация проходит.
3. Выпускаем реальный сертификат
Если dry-run прошёл без ошибок — запускаем команду без --dry-run:
После этого в папке certbot/conf/live/debugtest.ru/ появятся файлы сертификатов.
4. Обновляем конфиг Nginx под HTTPS
Файл nginx/debugtest.conf теперь будет выглядеть так:
5. Перезапускаем стек
6. Проверяем в браузере
Открываем https://debugtest.ru — должен быть зелёный замочек.Если всё ок, значит мама сможет зайти на сайт без предупреждений.
💡 Про автопродлениеСертификаты Let’s Encrypt живут 90 дней. Чтобы не бегать руками, добавь в crontab:
Это проверит сертификат каждый день в 4 утра и перезапустит Nginx, если сертификат обновился.
🔍 Шаг 6. Подключаем Google Search Console и Яндекс.Вебмастер, отправляем сайт в индекс
Поисковики не телепаты. Даже если твой сайт уже крутится с идеальным SSL и sitemap.xml, Google и Яндекс могут заметить его через недели.Мы ускорим этот процесс вручную.
1. Google Search Console
- Заходим в Google Search Console.
- Жмём Добавить ресурс → Домен (лучше, чем URL-префикс — сразу охватывает все поддомены и https/http).
- Подтверждаем владение доменом через DNS:Search Console покажет TXT-запись.Идём к своему регистратору (Reg.ru, Namecheap и т.д.).Добавляем эту TXT-запись в настройки домена.Ждём от пары минут до пары часов, пока DNS обновится.
- После подтверждения — заходим в меню Индексация → Файлы Sitemap.
- Добавляем путь к карте сайта:https://debugtest.ru/sitemap.xml
- Жмём Отправить и проверяем, что статус — «Успешно».
💡 Лайфхак: сразу после добавления sitemap.xml можно зайти в Проверка URL и вручную «Запросить индексацию» главной страницы. Это ускорит попадание сайта в выдачу.
2. Яндекс.Вебмастер
- Заходим в Яндекс.Вебмастер.
- ЖмёмДобавить сайти указываем:https://debugtest.ru/
- Подтверждаем владение доменом:Через загрузку HTML-файла в корень сайта.Или через метатег в <head> (если редактируешь index.html).Или через DNS TXT-запись (так же, как в Google).
- Переходим в раздел Индексация → Файлы Sitemap.
- Добавляем:https://debugtest.ru/sitemap.xml
- Жмём Отправить и проверяем, что файл принят без ошибок.
3. Как понять, что всё работает
- В Google Search Console и Яндекс.Вебмастере появится график количества проиндексированных страниц.
- Если на сайте что-то меняешь — обновляй дату <lastmod> в sitemap.xml, чтобы поисковики знали, что появилась свежая версия.
- Не спеши паниковать: первые визиты ботов могут быть уже через пару часов, но полная индексация — через 2–7 дней.
📌 Теперь твой сайт:
- Доступен по HTTPS.
- Знает, как его индексировать (robots.txt + sitemap.xml).
- Внесён в обе главные поисковые панели.
- Готов к визиту мамы и к появлению в Google/Яндексе.
💬 Если тебе зашёл этот формат и ты хочешь видеть больше таких разборов, у меня есть Telegram-канал, где я делюсь своими пет-проектами, экспериментами, идеями для стартапов и многим другим.