У любого проекта должен быть сайт. Даже если единственный пользователь — моя мама.Мама — это идеальный 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-пакеты и прочий мусор. Это почти всегда платные подписки, которые через месяц начнут жечь бюджет.
В итоге у нас в руках домен, например: debugtest.ru
Дальше будем учить его показывать наш сайт и радовать маму зелёным замочком.
🌐 Шаг 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 — должен быть зелёный замочек.Если всё ок, значит мама сможет зайти на сайт без предупреждений.
💡 Про автопродление — cертификаты 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
Заходим в 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-канал, где я делюсь своими пет-проектами, экспериментами, идеями для стартапов и многим другим.