Как стать автором
Поиск
Написать публикацию
Обновить

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

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров5.1K

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

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

По шагам:

  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-пакеты и прочий мусор. Это почти всегда платные подписки, которые через месяц начнут жечь бюджет.

В итоге у нас в руках домен, например: 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

  1. Заходим в Google Search Console.

  2. Жмём Добавить ресурс → Домен (лучше, чем URL-префикс — сразу охватывает все поддомены и https/http).

  3. Подтверждаем владение доменом через DNS:Search Console покажет TXT-запись.Идём к своему регистратору (Reg.ru, Namecheap и т. д.). Добавляем эту TXT-запись в настройки домена. Ждём от пары минут до пары часов, пока DNS обновится.

  4. После подтверждения — заходим в меню Индексация → Файлы Sitemap.

  5. Добавляем путь к карте сайта: https://debugtest.ru/sitemap.xml

  6. Жмём Отправить и проверяем, что статус — «Успешно».

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

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

  1. Заходим в Яндекс.Вебмастер.

  2. ЖмёмДобавить сайти указываем: https://debugtest.ru/

  3. Подтверждаем владение доменом:Через загрузку HTML-файла в корень сайта.Или через метатег в <head> (если редактируешь index.html).Или через DNS TXT-запись (так же, как в Google).

  4. Переходим в раздел Индексация → Файлы Sitemap.

  5. Добавляем: https://debugtest.ru/sitemap.xml

  6. Жмём Отправить и проверяем, что файл принят без ошибок.

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

  • В Google Search Console и Яндекс.Вебмастере появится график количества проиндексированных страниц.

  • Если на сайте что-то меняешь — обновляй дату <lastmod> в sitemap.xml, чтобы поисковики знали, что появилась свежая версия.

  • Не спеши паниковать: первые визиты ботов могут быть уже через пару часов, но полная индексация — через 2–7 дней.

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

  • Доступен по HTTPS.

  • Знает, как его индексировать (robots.txt + sitemap.xml).

  • Внесён в обе главные поисковые панели.

  • Готов к визиту мамы и к появлению в Google/Яндексе.

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

Теги:
Хабы:
+6
Комментарии11

Публикации

Ближайшие события