У любого проекта должен быть сайт. Даже если единственный пользователь — моя мама.Мама — это идеальный 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-канал, где я делюсь своими пет-проектами, экспериментами, идеями для стартапов и многим другим.
Комментарии (12)
kellas
14.08.2025 11:35Идея статьи отличная, а инструкция которая вроде как должна быть простой - усложнена.
Докер ставится одной командой -curl
https://get.docker.com
| sh
а в docker-compose.yml используем valian/docker-nginx-auto-ssl
services: nginx: image: valian/docker-nginx-auto-ssl environment: ALLOWED_DOMAINS: '*' volumes: - ./site:/var/www/default - ./.cache/nginx/ssl:/etc/resty-auto-ssl # - ./openresty.conf:/usr/local/openresty/nginx/conf/server-proxy.conf # network_mode: host ports: - 443:443 - 80:80 restart: always logging: driver: json-file options: max-file: '3'
и можно не думать про обновление сертификатов
karabanov
14.08.2025 11:35Nginx и Certbot можно заменить на Angie - он умеет получать сертификаты по ACME и проксировать трафик в контейнеры на основании указанных labels.
kuragami
14.08.2025 11:35А мне нравится Caddy. Минимум конфига и ssl из коробки. Сейчас, правда, перешёл на traefik для роута разных приложений. Но если бы мне нужно было сделать именно что сайт, то точно Caddy.
j0ker13
14.08.2025 11:35Точно так же.
Caddy сам получает, сам следит за продлением сертов.
Если только http сервер - в компоуз добавляю caddy, для роута traefik
RomanKu
14.08.2025 11:35Пользую vim и не должен был, по идее, читать эту статью, но когда мне надо было недавно прикрутить tls к forgejo я поставил Caddy просто потому, что он проще в настройке и обновлении сертиикатов (правда, через месяц поставил рядом кастомный openbao vault-agent для получения сертификатов из kv хранилища, но это уже совсем другая история)
При всей моей любви к nginx считаю, что он не нужен для новичков, особенно в докере т.к. на моей практике большинство проблем с автообновлением и конфигурированием nginx в принципе, как раз таки в этой связке и другие комментаторы накидали действительно годные варианты для использования в данном проекте
Почему nginx + docker плохи для новичка? Его надо уметь готовить и правильно настраивать, в заголовке статьи написано "Docker, Nginx и Certbot" и отдельный пунктик на "замочке", но при этом
сертификат получается руками
certbot запускается как /bin/sh и не работает в фоне, не отслеживает протухание сертификатов
nginx не получает команду на перечитывание конфигов при обновлении сертификатов
в итоге через несколько месяцев LE сертификат "протухнет" а автоматическое обновление мы в данной статье так и не настроили и вместо рыжих предупреждений сайт вообще не откроется и надо будет нажимать в определенных местах для открытия сайта с невалидным сертификатом
Еще для новичков и если надо больше 1 сайта проксировать я предлагаю NPM как раз по причине легкой настройки и работе с certbot "из коробки"
olku
Файловые конфиги вроде Nginx для такого проекта не нужны, в контейнерную эпоху рассматривают хотя бы Traefik.
MountainGoat
Трюфик не нужен там, где ставят один инстанс Nginx для странички про любимую собачку.
pavia
Nginx здесь не только реверс прокси сервер, но и веб сервер для представленного статического сайта, а Traefik чистый реверс прокси, которому нужен веб сервер, так что всё верно автор сделал.