У любого проекта должен быть сайт. Даже если единственный пользователь — моя мама.
Мама — это идеальный QA: откроет с телефона, в дороге, через мобильный интернет, спросит «а почему замочек не зелёный?» и закроет, если что-то долго грузится. Значит, сайт должен открываться по твоему красивому домену, по HTTPS, без рыжих предупреждений, и желательно находиться в поиске.

В этой статье мы за вечер соберём и задеплоим простой сайт «с нуля» почти бесплатно: купим домен, поднимем машину с публичным IP, обернём всё в Docker, прикрутим автопродление SSL, добавим sitemap.xml и robots.txt, и вручную прокинем сайт в индексацию Google и Яндекса, чтобы он не лежал «в вакууме».

Как запустить сайт с Docker, Nginx и Certbot: полный гайд⁠⁠

По шагам:

  1. покупаем красивый домен
  2. находим компьютер с публичным IP (или дешёвый VPS)
  3. ставим Docker и Docker Compose
  4. пишем минимальные конфиги (reverse‑proxy, сайт, robots.txt, sitemap.xml)
  5. настраиваем и обновляем SSL (Let’s Encrypt, автообновление)
  6. подключаем 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, хоть вашего локального провайдера.

Процесс простой:

  1. Вбиваем желаемый адрес в поисковую строку на сайте регистратора.
  2. Смотрим доступные варианты и цены (будьте готовы, что .com и .ru могут сильно отличаться).
  3. Выбираем понравившийся домен.
  4. Оплачиваем.

💡 Лайфхак:
Отказываемся от всех «дополнительных услуг» — конструкторы сайтов, «хостинг за 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. Если у тебя другая версия или дистрибутив, просто загугли:

how to install docker-compose <название_твоей_системы>

📦 0.1 Подключаем репозиторий Docker

sudo apt-get update

sudo apt-get install -y ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \

"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \

$(. /etc/os-release && echo $VERSION_CODENAME) stable" | \

sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

⚙ 0.2 Устанавливаем Docker Engine + Compose plugin

sudo apt-get update

sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

🙅 0.3 (Необязательно) запуск Docker без sudo

sudo usermod -aG docker $USER

После этого выйди из сессии SSH (exit) и зайди снова. Теперь можно писать docker ps, а не sudo docker ps.

📂 Шаг 4. Пишем минимальные конфиги

Пора навести порядок и подготовить инфраструктуру, которая сможет работать на любом сервере с Docker.

1. Делаем структуру папочек

В корне создаём папку sites и внутри неё такую структуру:

sites/

├─ docker-compose.yml

├─ nginx/

│ ├─ debugtest.conf # конфиг nginx для сайта

├─ site/ # твои статические файлы

│ ├─ index.html

│ ├─ sitemap.xml

│ └─ robots.txt

└─ certbot/

├─ conf/ # здесь появятся сертификаты (том для /etc/letsencrypt)

└─ www/ # временные файлы для валидации домена

Команды для Linux:

mkdir -p sites/nginx sites/site sites/certbot/conf sites/certbot/www

touch sites/site/index.html

Для редактирования текстовых файлов можно использовать nano:

nano sites/site/index.html

(Если ты используешь vim, то, скорее всего, и так не читаешь этот гайд 😉)

2. docker-compose.yml

Файл docker-compose.yml (в папке sites) будет выглядеть так:

services:

nginx:

image: nginx:1.27-alpine

container_name: speech_nginx

ports:

- "80:80"

- "443:443"

volumes:

- ./nginx:/etc/nginx/conf.d/:ro

- ./certbot/www:/var/www/certbot/:ro

- ./certbot/conf/:/etc/nginx/ssl/:ro

- ./site:/var/www/html/site

restart: unless-stopped

certbot:

image: certbot/certbot:latest

container_name: speech_certbot

volumes:

- ./certbot/conf:/etc/letsencrypt

- ./certbot/www:/var/www/certbot

entrypoint: /bin/sh

# будем запускать вручную:

# docker compose run --rm certbot ...

3. Конфиг Nginx (nginx/debugtest.conf)

server {

listen 80;

server_name debugtest.ru www.debugtest.ru;

server_tokens off;

location /.well-known/acme-challenge/ {

root /var/www/certbot;

}

location / {

root /var/www/html/site;

try_files $uri $uri/ /index.html =404;

}

}

4. sitemap.xml

site/sitemap.xml:

<?xml version="1.0" encoding="UTF-8"?>

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

<url>

<loc>https://debugtest.ru/</loc>

<lastmod>2025-08-12</lastmod>

<changefreq>monthly</changefreq>

<priority>1.0</priority>

</url>

</urlset>

5. robots.txt

site/robots.txt:

User-agent: *

Allow: /

Sitemap: https://debugtest.ru/sitemap.xml

📌 Теперь у нас есть:

  • 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 и стартуем контейнеры:

docker compose up

Пока без -d, чтобы видеть логи и убедиться, что Nginx поднялся без ошибок.

2. Проверяем валидацию (dry-run)

Открываем вторую SSH-сессию к серверу и там выполняем тестовый запуск certbot:

docker compose run --rm certbot certonly \

--webroot --webroot-path /var/www/certbot/ \

--dry-run \

-d debugtest.ru

--dry-run — это проверка. Certbot не выпустит реальный сертификат, но убедится, что домен доступен и валидация проходит.

3. Выпускаем реальный сертификат

Если dry-run прошёл без ошибок — запускаем команду без --dry-run:

docker compose run --rm certbot certonly \

--webroot --webroot-path /var/www/certbot/ \

-d debugtest.ru

После этого в папке certbot/conf/live/debugtest.ru/ появятся файлы сертификатов.

4. Обновляем конфиг Nginx под HTTPS

Файл nginx/debugtest.conf теперь будет выглядеть так:

server {

listen 443 ssl;

server_name debugtest.ru;

ssl_certificate /etc/nginx/ssl/live/debugtest.ru/fullchain.pem;

ssl_certificate_key /etc/nginx/ssl/live/debugtest.ru/privkey.pem;

location / {

root /var/www/html/site;

try_files $uri $uri/ /index.html =404;

proxy_set_header Host $host;

client_max_body_size 3G;

proxy_set_header X-Forwarded-Proto https;

}

location = /sitemap.xml {

root /var/www/html/site;

try_files /sitemap.xml =404;

}

location = /robots.txt {

root /var/www/html/site;

try_files /robots.txt =404;

}

}

5. Перезапускаем стек

docker compose down

docker compose up -d

6. Проверяем в браузере

Открываем https://debugtest.ru — должен быть зелёный замочек.
Если всё ок, значит мама сможет зайти на сайт без предупреждений.

💡 Про автопродление
Сертификаты Let’s Encrypt живут 90 дней. Чтобы не бегать руками, добавь в crontab:

0 4 * * * docker compose run --rm certbot renew && docker compose kill -s SIGHUP nginx

Это проверит сертификат каждый день в 4 утра и перезапустит Nginx, если сертификат обновился.

🔍 Шаг 6. Подключаем Google Search Console и Яндекс.Вебмастер, отправляем сайт в индекс

Поисковики не телепаты. Даже если твой сайт уже крутится с идеальным SSL и sitemap.xml, Google и Яндекс могут заметить его через недели.
Мы ускорим этот процесс вручную.

1. Google Search Console

  1. Заходим в Google Search Console.
  2. Жмём Добавить ресурс  Домен (лучше, чем URL-префикс — сразу охватывает все поддомены и https/http).
  3. Подтверждаем владение доменом через DNS:Search Console покажет TXT-запись.Идём к своему регистратору (Reg.ru, Namecheap и т.д.).Добавляем эту TXT-запись в настройки домена.Ждём от пары минут до пары часов, пока DNS обновится.
  4. Search Console покажет TXT-запись.
  5. Идём к своему регистратору (Reg.ru, Namecheap и т.д.).
  6. Добавляем эту TXT-запись в настройки домена.
  7. Ждём от пары минут до пары часов, пока DNS обновится.
  8. После подтверждения — заходим в меню Индексация → Файлы Sitemap.
  9. Добавляем путь к карте сайта:https://debugtest.ru/sitemap.xml
  10. Жмём Отправить и проверяем, что статус — «Успешно».

💡 Лайфхак: сразу после добавления sitemap.xml можно зайти в Проверка URL и вручную «Запросить индексацию» главной страницы. Это ускорит попадание сайта в выдачу.

2. Яндекс.Вебмастер

  1. Заходим в Яндекс.Вебмастер.
  2. Жмём Добавить сайт и указываем:https://debugtest.ru/
  3. Подтверждаем владение доменом:Через загрузку HTML-файла в корень сайта.Или через метатег в <head> (если редактируешь index.html).Или через DNS TXT-запись (так же, как в Google).
  4. Через загрузку HTML-файла в корень сайта.
  5. Или через метатег в <head> (если редактируешь index.html).
  6. Или через DNS TXT-запись (так же, как в Google).
  7. Переходим в раздел Индексация → Файлы Sitemap.
  8. Добавляем:https://debugtest.ru/sitemap.xml
  9. Жмём Отправить и проверяем, что файл принят без ошибок.

3. Как понять, что всё работает

  • В Google Search Console и Яндекс.Вебмастере появится график количества проиндексированных страниц.
  • Если на сайте что-то меняешь — обновляй дату <lastmod> в sitemap.xml, чтобы поисковики знали, что появилась свежая версия.
  • Не спеши паниковать: первые визиты ботов могут быть уже через пару часов, но полная индексация — через 2–7 дней.

📌 Теперь твой сайт:

  • Доступен по HTTPS.
  • Знает, как его индексировать (robots.txt + sitemap.xml).
  • Внесён в обе главные поисковые панели.
  • Готов к визиту мамы и к появлению в Google/Яндексе.

💬 Если тебе зашёл этот формат и ты хочешь видеть больше таких разборов, у меня есть Telegram-канал, где я делюсь своими пет-проектами, экспериментами, идеями для стартапов и многим другим.
Ссылка на канал — в моём профиле.