Решил я сделать свой собственный блог о том, как я становлюсь DevOps-инженером. Приступил к созданию и сразу замахнулся на недостижимое для меня сейчас. Но об этом позже.
Для того, чтобы мой блог функционировал, нам нужна виртуальная машина. Белый IP-адрес у меня имеется на роутере Mikrotik. Внутри виртуальной машины поднимаем docker и создаем docker-контейнер с nginx, передаем ему статическую страницу, делаем проброс, покупаем домен, получаем ssl-сертификат. Приступаем.
Для начала я создам виртуальную машину на своей системе виртуализации Proxmox. ВМ будет на базе Ubuntu 24.04. На Mikrotik у меня DHCP-сервер и он смотрит в сервер. ВМ находятся в бридже с Proxmox, то есть, все ВМ машины у меня получают IP-адрес от Mikrotik. Особых настроек ВМ я не производил. Поэтому выкладывать процесс я не буду. Наша задача просто создать базовую ВМ. Это я сделал. Далее нужно установить Docker на хостовую машину (наша ВМ).
Заходим на официальный сайт в раздел установки. Просто вводим команды для установки. Готово.
Предварительно настроим файл nginx.conf. Так как мы будем пользоваться docker, то нам предстоит скопировать файл конфигурации в контейнер. Поэтому создаем файл конфигурации типа: real-devops.conf. Вводим следующую конфигурацию:
server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; } }
Следующим шагом я решил создать Dockerfile для того, чтобы вручную не прописывать каждый раз при создании контейнера одни и те же настройки: Dockerfile
FROM nginx:alpine COPY real-devops.conf /etc/nginx/conf.d/ COPY index.html /usr/share/nginx/html/index.html EXPOSE 80
После того, как контейнер заработал, все в порядке, сайт открывается по локальному IP-адресу, нужно сделать так, чтобы Вы, читатели, могли увидеть мой сайт со своего мобильного интернета, то есть сделать доступ к сайту по белому (публичному) адресу. Заходим на Mikrotik, пробрасываем порт.
server { listen 80; server_name real-devops.ru www.real-devops.ru; # меняем здесь localhost на наш домен location / { root /usr/share/nginx/html; index index.html; } }
А вот здесь и начинается самое интересное. Казалось бы, просто устанавливаем бота, указываем домены и все должно работать, получаем заветную s в протоколе http. Но нет. Проверку не проходит вообще ни в какую. Просто выдает 404 ошибку. То есть он бот не может получить файл, который он создал по адресу http://real-devops.ru/.well-khown/acme-challenge/adsdkwqfwk342fmsf234fdsf2hjhgt434 При этом, если я создаю тестовый файл, например test по адресу: http://real-devops.ry/.well-khown/acme-challange/test, то я могу скачать это файл, а бот не может. Я изломал всю голову, подключил ChatGPT, DeepSeek к решению этого вопроса. Ничего не помогло. Проверили конфиг nginx, правильность путей, доступность домена. Ничего не помогало.
И вот, я пришел в тупик. В чем была проблема? Конкретно - не знаю. Глобально - в моем желании сделать всё и сразу. Если бы я начал с простого, то знал бы, где и на каком этапе проблема. Что происходит внутри контейнера? Надо заходить, смотреть логи, подключаться к нему. Это очень затруднительно. Поэтому я решил удалить эту виртуальную машину и провести декомпозицию.
Я решил, что нужно идти от простого к сложному. Сначала поднять обычный nginx без docker и вдумчиво его настроить. Это даст мне понимание, что если что-то не работает, то проблема в nginx, а не в неправильно настроенном docker.
На этом этапе я снова создал виртуальную машину для nginx. Посмотрел видео, почитал статьи о том, как выполнить базовую конфигурацию nginx. Оказалось, что не все так просто. Если делать по документации на официальном сайте nginx, то файл nginx.conf у них один, а у меня другой. Совершенно другой. У меня нет директивы server. Я пробежался по всем дополняющим конфигам - ничего. Создал сам директиву, прописал настройки. И сервис nginx не запустился. Выдавал ошибку конфигурации и на конфликт директивы, которая использовалась непонятно для чего. Я решил, что не буду пинать труп, а сделаю все нормально. Откатил файл конфигурации к состоянию по умолчанию, открыл видео и знаете что? На видео вообще другая конфигурация. Почему так вышло? Если брать репозиторий с официального сайта nginx, то там один файл конфига. А вот если скачать с базовых репозиториев ubuntu, то nginx устанавливается именно с таким конфигом, как на видео. Стало спокойнее. Далее все шло как по маслу. И вот на этом этапе я наконец разобрался с файлами конфигурации nginx. Если добавлять их в /etc/nginx/sites-available/название_сайта, то конфиг работает как нужно. Но не совсем. В видео все работало, а у меня нет. Я проверил конфиг, вроде все в норме. С помощью chatGPT я выяснил, что конфиг подхватывается ТОЛЬКО если он есть в /etc/nginx/sites-enabled/, а именно если есть симлинк. После создания симлинка все завелось и работало исправно. Наконец-то. Следующим шагом я установил certbot для получения SSL-сертификата.
sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d real-devops.ru -d www.real-devops.ru
Проблема была в том, что я пытался сразу запустить все в контейнере, не разобравшись, как работает сам Nginx. После ручной настройки на хосте стало ясно, какие файлы нужны, как они подключаются и где могла быть ошибка. Теперь, когда Nginx работает корректно, можно вернуться к контейнеризации, но уже с четким пониманием, какие конфигурации нужны и как их правильно настроить. Таким образом, я полностью своими силами сделал хостинг своего же сайта. Всё на этом сайте реализовано мной. Это позволяет понять то, как изнутри работает хостинг. Далее я буду усложнять свой проект. Frontend, backend и DevOps-практики добавят сайту увесистости. Все изменения вы можете наблюдать в этой статье. Она будет обновляться по мере моего развития и работы над этим сайтом.
Вернуться