Автоматизация серверной инфраструктуры. Автоматическая установка Docker и Compose на виртуальную машину через Ansible. Подключение сертификатов Let's Encrypt.
- 00:00:54 Ручная установка виртуальной машины
- 00:03:10 Автоматизация через скрипты
- 00:04:35 Проблема мутабельной инфраструктуры
- 00:05:44 Установка нужного состояния
- 00:07:19 Декларативное описание состояния
- 00:11:01 Обзор Ansible
- 00:13:35 Написание плейбука
- 00:15:35 Установка Docker через Ansible
- 00:20:20 Разделение на файлы задач
- 00:20:52 Установка Certbot
- 00:22:57 Получение Let's Encrypt сертификатов
- 00:26:41 Условия и циклы в Ansible
- 00:30:39 Ручная перегенерация сертификатов
- 00:31:22 Файлы для переменных
- 00:32:04 Создание пользователя для деплоя
- 00:33:57 Пробрасывание SSH-ключа
- 00:35:06 Логин в Docker-реестр
- 00:37:01 Плагин для работы с Docker
- 00:37:33 Использование ролей для разных машин
- 00:43:05 Makefile для запуска
- 00:43:42 Запуск на реальной машине
- 00:48:50 Деплой сайта на виртуалку
- 00:50:45 Перезапуск Nginx при обновлении сертификатов
- 00:52:12 Обзор результата и выводы
Позже в 61-ом эпизоде мы рассмотрим, как для выпуска сертификатов вместо нашего gateway использовать прокси-сервер Traefik.
Скрытый контент (код, слайды, ...) для подписчиков.
Открыть →Чтобы не пропускать новые эпизоды подпишитесь на наш канал @deworkerpro в Telegram
спасибо, очень поможет, очень хорошый урок.
Отличный эпизод, как всегда. Огромная просьба рассмотреть возможность добавить в материалы настройку Github Actions для CI/CD.
PS: интересует также, имеются ли в Ваших курсах материалы по опыту правильной организации multi-tenant архитектуры на любом из фреймовоков? Либо в планах на будущее)
Спасибо еще раз за супер курс!
Тёзка, там заявлен Дженкинс. Видел на Ютубе CI/CD для Битбакета и для ГитЛаба тоже наверняка найдется.
Руслан, спасибо, конечно, видел то что Jenkins заявлен. Просто Github Actions видется более перспективней в плане популярности в ближайшие время, хотелось на него перескочить в плане self-hosted CI/CD, не ставить на сервак java (Jenkins) или ruby (Gitlab CI).
А что с приватными репами, только за деньги, как и на самом Github ?
А вообщем, я о том, что нужно придерживаться плана. Я тоже могу написать, что сейчас большой downtime и давайте поднимем кластер для CI/CD без downtime.
Какие-то такие дополнения можно сделать в самом конце когда станет известно как делать: "Разработка аукциона на Slim и ReactJS" :)
Мощно!
Снимайте, пожалуйста, видео на чёрной теме IDE!!!
Приведите пример видео с YouTube с красивой тёмной темой.
https://www.youtube.com/watch?v=8RdJ3G-OZoc ))) Тёмная тема не выжигает глаза
Эта нечёткая (пыльная)
Тема: ayu, темная подтема: mirage
Это для Visual Studio. Есть форк для PhpStorm?
Visual Studio Code, если быть точным, но и это частность - тема не принадлежит одной какой-то сущности.
Для Sublime Text 3 - есть точно, для PhpStorm - не знаю, должна быть.
Тема мощная и крутая, очень досадно будет, если не портирована.
https://plugins.jetbrains.com/plugin/8006-material-theme-ui
https://plugins.jetbrains.com/plugin/12100-dark-purple-theme
https://plugins.jetbrains.com/plugin/12692-darcula-darker-theme (даркер не пыльная)
https://plugins.jetbrains.com/plugin/12163-monocai-color-theme
https://plugins.jetbrains.com/plugin/13106-xcode-dark-theme
Все отлично. Но, хотелось бы краем глаза глянуть как вы настраивали реестр для докера. Сама установка вроде бы элементарна.
docker run --entrypoint ./auth/htpasswd registry:2 -Bbn registry passwd > ./auth/htpasswd
docker-compose.yml
version: "3.7" services:
Но с сертификатами у меня получился жуткий костыль. Из коробки докер с letsencrypt не заработал, хотя в документации пишут, что должен. Или, может, дело в версии убунты? У меня 16.04
Просто можно как с gateway закрыть сертификатами и htpasswd снаружи в Nginx:
А в этом случае прокидываемый конфиг в контейнер как будет выглядеть? Самый базовый с ssl сниппетами и auth_basic_user_file /path/to/.htpasswd; в главном локейшене для nginx на домен registry.domain.com, к примеру, верно?
Да, примитивный с секцией server как приведённый в документации к registry, только переделанный для Let's Encrypt.
Спасибо!
Было бы не плохо, если бы в одном уроке настройку registry сервера показали на этой же виртуалке, чтобы охватить все технологии, которые используется, мне было бы очень полезно ))
Дмитрий, я правильно понимаю что ваш кейс с оркестрацией сервера подразумевает абсолютно голый сервер? Если на удаленной машине, на которой я хочу поднять образы из реестра, уже стоит nginx и слушает 80 и 443 порты, то в этом случае не получится проброска этих портов для gateway в docker-compose-production и, как следствие образы не поднимутся. Завелось вместе с ssl только тогда, когда я сделал проброс незанятого порта, к примеру 5001 на 443 ("5001":"443", в докер композ прод), но для этого приходится добавлять порт на продакшене в строке браузера, для того чтобы происходило перенаправление в обработку докера на 443 порт. Хотел узнать, может есть какой-то лайфхак, чтобы разрулить эту ситуацию на уровне конфигов nginx, хотя пробовал разные варианты. Просто не хочется добавлять все время порт в строке браузера
Да, на сервере можно поднять только один Nginx на одном порту. Поэтому если уже стоит внешний Nginx, то можно в него добавить хост с proxy_pass localhost:5001
Курс супер. Но зачем так заморачиваться с сертификатами, если можно использовать Treafik. Он все это умеет из коробки.
Александр, интересуют подробности других преимуществ Traefik vs nginx / haproxy etc. (кроме сертификатов) и опыт оптимальной установки/настройки?
Я только осваиваю. Но он много чего умеет. Про haroxy не слышал.
Насколько понимаю, чтобы разобраться как обойтись средствами уже задействованного nginx, чем вводить дополнительный слой либо отдавать предпочтение одному из многих специализированных прокси-серверов/балансировщиков, уже заточенных под микросервисы и k8s (traefik, haproxy, envoy, kong и пр.). Последние конечно удобны разными плюшками из коробки, но на них можно будет легко мигрировать при необходимости и от нужд в этих плюшках конкретного проекта.
UPD 1: В Cron-задаче очистки Docker нужно добавить флаг "a":
А в эту чистку используемые контейнеры попадают, ведь проект может быть и год без изменений? Или это очищает только элементы из которых собирается наш контейнер?
ничего_не_понял_но_очень_интересно.jpg
Буду переходить на vscale.io
На мой взгляд идея ущербности установки с мануалов перед установкой скриптом - надумана.
Мы же сейчас говорим про разработчиков, которые разворачивание окружения производят раз в несколько месяцев, а то и реже. Что скрипт отдельный писать, что мануалы использовать итог один - всё равно придётся актуализировать скрипт под нужды. К тому же сам алгоритм инсталяции может поменяться, например, добавятся зависимости или платформа поменяется. Например, докер переедет go на rust и потребуется отдельно доставлять раст. А по итогу, чтобы починить свой шел придётся лезть в мануалы.
Я не говорю, что представленный материал не нужен, но я бы «продавал» его с позиции управления сложностью: производим декомпозицию алгоритма разворачивания сервера и уход от низкоуровневых абстракций (общение с терминалом) к высокому уровню - ансибл.
Спасибо за материал =)
Да, всегда приходится лазить в мануалы и любая автоматизация является оверхедом когда виртуалок и программистов в проекте не больше одной/одного. Тогда можно заходить и ставить софт и править конфиги вручную без скриптов, выполнить что-нибудь в БД без миграций и на локальном компьютере ставить тоже вручную.
Но как только виртуалок становится две, так сразу при ручном подходе получаем вероятность рассинхронизации версий и конфигов, когда на одной что-то поменяли или обновили, а на второй забыли или ещё не успели.
Или когда мы пускаем на сервер другого сисадмина с фриланса, который не понятно что там по своим шпаргалкам ставит и настраивает. Сразу получаем проблемы с тем, что он мог что-то забыть на одной из них. И что он через неделю уйдёт, а нам не очень полную шпаргалку оставит. Или что-то сломает, а мы не узнаем что именно.
Так что как только виртуалок и программистов становится много, то автоматизация во всём очень помогает. И пусть все сисадмины тоже коммитят в tasks.yml.
Подскажите, доступа к root нет, использую в качестве remote_user пользователя,
remote_user: deploy become: yes become_user: deploy
Пишет ошибку: Failed to lock apt for exclusive operation
Подскажите, как настроить без root доступа?
Задачи с apt запускайте только от root (через become без become_user).
после успешного make site, в кроне хостинга (в /etc/cron.d/certbot) введётся команда "...certbot -q renew". Но как реально автоматом происходит certbot renew, если gateway (nginx) работает в докере, а сертификат продлен снаружи? как в этой ситуации, происходит автоматическое продление сертификата?
Как упомянули после деплоя, в cli.ini вместо хука
service nginx restart
нужно вписать перезапуск gateway вроде такого:Например, в
site/tasks
добавить задачу добавления строки:в чем разница между этими вариантами? Ведь, в первом варианте, когда в provisioning/roles/certbot/files/cli.ini записываем renew-hook = /bin/sh -c 'cd /home/deploy/site && docker-compose restart gateway' , то при make site этот cli.ini пападает в /etc/letsencrypt/cli.ini (VM Debian у хостинга).
у demo-auction.skucai.com деплоил (18-01-2020) проект, по первому варианту, и подожду 32 дней, посмотрю, продлится сертификат или нет.
А как проверит cron: правильно введена команда? Теперь, после успешного деплое, в VM Debian /etc/cron.d/certbot есть такая: 0 /12 * root test -x /usr/bin/certbot -a ! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew . А с crontab -e видно: 0 1 * docker system prune -af --filter "until=$((3024))h"
Разница в том, что роль certbot будет общая для всех production и staging серверов. Им может быть нужен разный хук и одинаковый cli.ini может всем не подойти. Поэтому можно всем скопировать общий cli.ini без хука, а потом уже в ролях site и staging добавить им по своей строке. Зависит от ситуации.
спасибо.
Я что-то совсем запутался. Registry требует установки перед ним вэбсервера или нет?
Из этого конфига я подумал, что Registry может сам работать без вэба, но
И видно, что он лезет по https в папку V2 :
На это можно не отвечать. Я уже разобрался. В итоге у меня собралась рабочая среда из: WSL 2, CentOS и docker repository в одном контейнере без вэба впереди. А можно ли в конфигах nginx применять пересенные, чтоб не перебивать названия сайтов "deworker.pro" на свои? В 19и местах пришлось менять руками, так и запутаться можно.
Два варианта. Либо запускать его со своими сертификатами
TLS_CERTIFICATE
и htpasswd без внешнего Nginx, либо реестр запускать без сертификатов, настроив их в дополнительном Nginx.Спасибо.
Мне понравился вариант, когда реро само за себя, если нужно на той же машине использовать вэб, то не нужно учитывать , что 80 и 443 уже используется.
Это тоже для новичков или курилка спецов по devops'у?
Вы не понимаете, что такое объяснение.
Объяснение, это не рассказ.
Здесь практика по разработке проекта.
Рассказывать что такое консоль, apt и cron здесь нет смысла.
Понял, спасибо.
https://i.imgur.com/GrKChZd.png
По команде
ansible-playbook -i hosts.yml site.yml
у меня на удаленной машине (Ubuntu 18.04) произошла ошибка на шаге Add Certbot repository. Видимо он не смог потом сделатьapt-get update
. Возможно попробовать другой repo: ?вот такой вариант прошел, кстати
Да, мы уже обсуждали под эпизодом про Xdebug.
Я не понял, для того чтобы заработали поддомены надо ли предпринимать дополнительно что то или достаточно тех настроек nginx которые в контейнерах указаны?
Ещё нужно прописать A-записи с IP-адресом сервера в настройках DNS этих доменов и поддоменов.
Но это уже производится в панели управления регистратора, а не в проекте.
На примере vscale, ip повторяет адрес основного домена? а порт нужно указать?
В панели управления регистратора или хостинга проставляем домену и поддомену одинаковую A-запись с одним IP-адресом нашей виртуалки. Или A-запись проставляем тоько домену, а с поддомена ссылаемся на домен через CNAME-запись.
ошибка в таске Add Cert Repository, что тут можно предпринять?
upd: увидел ответ выше
Дмитрий, привет После выпуска сертификата apache не останавливается (Debian 10) - в связи не получается сделать deploy так как nginx не запускается Иногда при запуске playbook для выпуска сертификата certbot дает ошибку, и после пользователь deploy не создается (в связи с чем не authorize не docker-login не работают). Если create-user раньше вытащить, ничего страшного? И еще: как сделать интерпритатор питона по умолчанию на 3 версию - в логах ловлю сообщения на прекращение поддержки старых версий
Это со свежим кодом из репозитория с конструкцией wait_for?
Ничего страшного. Можно ставить в любой последовательности. Для игнорирования ошибок можно добавить ignore_errors: true к задаче получения сертификатов.
Они постепенно переходят и описывают это так.
Столкнулся с проблемой. Если создать пароль nginx.htpasswd с параметром -B то nginx возвращает ошибку 500. Если этот параметр не применять, то всё хорошо. Образ был просто nginx.
Да, Nginx не поддерживает этот алгоритм.
UPD: Улучшили фрагмент с 26-й минуты про запуск Apache-сервера на использование конструкции wait_for.
Ошибка в make docker-login на шаге [Log into private registry]
fatal: [server]: FAILED! => {"changed": true, "cmd": "docker login -u ** -p *** registry.tiru.ru", "delta": "0:00:00.306697", "end": "2020-03-09 14:13:12.031002", "msg": "non-zero return code", "rc": 1, "start": "2020-03-09 14:13:11.724305", "stderr": "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\nError response from daemon: Get registry.tiru.ru/v2/: dial tcp: lookup registry.tiru.ru on 188.93.16.19:53: no such host", "stderr_lines": ["WARNING! Using --password via the CLI is insecure. Use --password-stdin.", "Error response from daemon: Get registry.tiru.ru/v2/: dial tcp: lookup registry.tiru.ru on 188.93.16.19:53: no such host"], "stdout": "", "stdout_lines": []}
Поддомен не находит. Настройте его DNS-записи на хостинге или в панели регистратора.
Добрый день, а что именно написать в DNS , какой именно айпишник? Чтото гдето не найду момент по видео, какие записи вставлять. Да и в личном кабинете докерхаб про это не сказано.
В панели хостинга в настройках доменов создать A-запись с названием поддомена и вписать туда IP-адрес вашей виртуальной машины.
что не хватает ему не пойму, может надо в своем докер репозитории какие нить теги создать ? А то он пустой.
Добрый вечер!!! после Check if server is running все обрубается и вылетает ошибка
После повторного выполнения make site task path: /home/pamparam/PhpstormProjects/auction/provisioning/roles/site/tasks/generate_certificates.yml:15 skipping: [server] => {"changed": false, "skip_reason": "Conditional result was False"}
и здоровенная портянка
проверил по этим адресам есть /etc/letsencrypt/live/auction.pamdev.ru/cert.pem но к доменам и поддоменам они не привязаны и make push не проходит так как стучится по https
Так как файлы уже есть, то при последующих запусках всегда будет skipping
К доменам и поддоменам они теперь должны привязываться в Nginx.
да но в директории /etc/nginx/snippets/ файлов ssl.conf certbot.conf нет и nginx дальше не дает выполнить команды
А почему их там нет?
пока сам не понимаю.. выполняю команду make site
ожидаю что должны появится но их нет
вообще нет nginx
Ansible толлько устанавливает Docker с Certbot и генерирует сертификаты.
А сам проект с Nginx и PHP деплоится через
make deploy
послеmake build
иmake push
.Если в первый раз вылетела ошибка, то добавьте к командам запуска и остановки apache значения
ignore_errors: yes
и перезапустите снова.Вобщем запнулся на этом уроке. Вторые выходные сижу на нем. выше писал про Error response from daemon: Get registry.tiru.ru/v2/: dial tcp: lookup registry.tiru.ru on 188.93.16.19:53: no such host"]
Создал поддомен registry.tiru.ru какие NS записи создавать, надоли сервак под этот домен, и если надо как его настроить. Откуда на вашем регистре поддомене nginx. Ни какой инфы в видосах не нашел, как смотреть дальнейшие видео нипонятно, тк на практике не выходит ничего. Спулил с гита ветку последней версии и откатывал на версию этого урока. Менял домен deworker.pro автозаменой на свой , не выходит. Дмитрий объясните по подробнее про домен registry.tiru.ru , тк хочется проверить вашу теорию на практике , своими ручками. А не просто поверить этой "теории"
Сам поддомен нужно создать в панели управления вашего хостинга, где вы регистрировали домен.
Там должно быть примерно так, но с вашими адресами:
Так поддомены создаются и привязываются к виртуальным машинам по их IP-адресам. И только после этого начинают открываться в браузере.
так и есть у меня сейчас
только ошибка не с айпишником 188.93.16.19 как раньше, а с моим 31.184.254.199
сертификат тоже чтоли нужен на этот домен сделать, походу.
Да, сделать сертификат и для него.
сделал не помогло , ...login attempt to registry.tiru.ru/v2/ failed with status: 404 Not Found".... ни какой формы авторизации нету по этому адресу как у Вас. Чтото я вобще не догоняю.
registry.tiru.ru", "delta": "0:00:00.529081", "end": "2020-03-16 18:12:43.121638", "msg": "non-zero return code", "rc": 1, "start": "2020-03-16 18:12:42.592557", "stderr": "WARNING! Using --password via the CLI is insecure. Use --password-stdin.\nError response from daemon: login attempt to registry.tiru.ru/v2/ failed with status: 404 Not Found", "stderr_lines": ["WARNING! Using --password via the CLI is insecure. Use --password-stdin.", "Error response from daemon: login attempt to registry.tiru.ru/v2/ failed with status: 404 Not Found"], "stdout": "", "stdout_lines": []}
Виртуалку и поддомен для реестра вы сделали.
Теперь осталось установить туда сам реестр по примерам из комментариев выше.
после make deploy demo-auction.arsku.com/работает, а api.demo-auction.arsku.com кидает ошибку: 502 Bad Gateway.
команда docker logs --since 30s -f auction_api_1 даёт ответ:
как решить эту проблему?
правда, после ansible make site остался контейнер httpd:2.4 apache, я его остановил...
вид http://www.arvidija.lt/turinys.php?autoidpsl=16&puslapio_PVD=programming
Не запустился api-php-fpm.
Да, передеплоил с другого компьютера и всё ок.
Дмитрий, приветствую. А не могли бы вы объяснить, за что отвечает переменная REGISTRY при команде make docker-login Видел в комментариях, что люди тоже столкнулись с проблемой на этой команде, но точного ответа и понимания так и не последовало после ваших советов/ответов.
Я правильно понимаю, что вы не используете докер хаб, а создали свой регистр для хранения образов? Или я ошибаюсь?
Если это так, то не ясно, как создавать свой регистр из данных видео. На хабре есть конечно статьи, но хотелось бы тут узнать все нюансы которые вы затрагиваете.
По крайней мере у меня есть аккаунт на DockerHub и я успешно сделал туда пуш в виде docker push myaccount/php:1 (например), но если я пытаюсь использовать команду "docker login -u {{ username }} -p {{ password }} {{ registry }}", как в видео, меня шлют лесом и говорят что нет такого регистра. Вот хотелось бы понять, почему у вас работает и что это за registry.deworker.pro
Заранее спасибо за ответ
UPD - нашел в комментах инфу что требуется поднять свой регистр. Как то не приятно, что требуется копаться в комментах, в поисках информации которая не дается в курсе. Это прям минус.
Если кто столкнулся с таким моментов, что у него нет собственного докер регистра, можно поступить так:
Регистрируетесь на докер хаб
Меняете docker_login.yml на такое
При использование команды make build и make push используется для переменной REGISRTY ваш айдишник на докер хабе.
Пулится пушится логинится успешно.
Минус всего этого - ваши образы на докер хабе публичные
Да, именно так. И в параметре REGISTRY мы его адрес указываем.
Про это запишу скоро отдельное видео.
Спустя 10 дней получился настроить wsl 2->Ubuntu-18.04 = Ansible +Docker Registry и wsl 2->Debian это у нас production-сервера и wsl 2->Ubuntu-20 = dev
В шторме, Не могу понять по комитам на гите, какой соответствует окончанию этого урока? Даты коммитов перемешаны му собой не разберешь. Хорошо бы подписывали , на какой комит переключаться под конец урока, чтоб ручками все проверить самому ))
К этому уроку вся группа коммитов про provisioning до "Added site certbot renew hook".
Воот! такое бы примечание для каждого урока!
При попытке запушить билды на AWS мне выпадает сообщение "no basic auth credentials". До этого успешно создал реестр и команда make docker-login успешно сработала. Что теперь делать?
P.S. Разобрался уже. Я просто вводил одну команду, а в makefile она уже другая.
И все равно. Я застрял на этом уроке. Не понимаю, почему у меня не работает. Делаю пошагово за автором. Дохожу до создания своего отдельного приватного репозитория. Перехожу на урок 33, создаю репозиторий. Логинюсь в него. Пушу туда образы. Все проходит нормально. Ввожу команду деплоя и вижу следующее:
Я худо-бедно умею программировать, но таким разворачиванием еще не занимался, я в этом новичок. Помогите разобраться пожалуйста.
Теперь залогиньтесь с сервера для пулла:
Да, получилось. Но тут же пошла другая ошибка:
Сервера реестра и основного проекта находятся на разных виртуалках под разными IP-адресами. Попробую сделать что-то с этим, но спасибо за ответ, который меня продвинул дальше.
Подскажите, у вас получилось разобраться в чем тут проблема? Завис на этом же месте.
Не знаю, актуально ли. Но если кто столкнётся с подобным, то помогла вот эта команда:
Подскажите выполняю команды:
если выполнить команду под root то все проходит что не так.
и после выполнения
не удаляет apahe приходится удалять ручками, что нужно настроить для автоматического удаления
Значит либо пользователь deploy, либо файлу docker-compose не проставлена группа docker.
Надо проверить.
да, что то сегодня всё рухнуло, пользователь deploy не может запустить docker-compose
хотя root норм запускает
система ubuntu
если не удасться это полечить, то придется под рутом всё делать ((
я вручную сделал: добавил deploy в группу sudo, задал ему пароль, зашел по ssh с паролем и вызвал sudo chmod a+rx /usr/local/bin/docker-compose
в результате docker-compose у пользователя deploy заработал
Дима, как через ansible сделать тоже самое для пользователя deploy?
P.S. вроде в ansible достаточно добавить a+rx в mode: 'u+x,g+x,a+rx' при установке docker-compose
а чтобы это сработало, надо переустановить docker-compose предварительно, например, удалив его зайти под root rm /usr/local/bin/docker-compose
либо создавать отдельный ансибл таск на изменение прав доступа к /usr/local/bin/docker-compose
Отдельный не нужен. Группа должна быть указана в существующем:
[20633] Cannot open self /usr/local/bin/docker-compose or archive /usr/local/bin/docker-compose.pkg
тоже возникла такая ошибка
если захожу под рутом, то всё хорошо
Всем привет, я только подключился
может кто знает как это бороть?
А как в итоге решил? =)
Можно вручную зайти на сервер по ssh от рута и там запустить
apt update
. После этого проблемы с установками не будет.Спасибо большое за ваш труд! Очень нравится новый формат, раньше мастер-классы больше как стримы выглядели, но все равно было интересно.
А если не помогло?
ЗЫ. Спасибо великолепный контент. За такое не жалко подписку оформить
Помогла команда
KEY в данном случае ключи которые выводятся ошибкой NO_PUBKEY на команде apt update
К сожалению, ни apt update, ни apt-upgrade не помогает решить проблему. Есть еще идеи как побороть? Сервер настраиваю для jenkins.
Полностью чистый и ни чем не загажен
поделитесь своей темой, очень красивая, не видел раньше таких. сами делали?
Да, cделал сам специально для скринкастов. Выложил на GitHub.
а почему при установке докера и сертификатов в конфигурации ансибла у тебя в начале обновляются пакеты, а в коммитах на гитхабе этого нету
Лишний раз такие конструкции можно не прописывать если такие
update_cache: yes
есть у других шагов.Добрый вечер. Дмитрий, подскажите пожалуйста. Получится использовать Ваш пример для частного репозитория на docker hub? Будет ли частный репозиторий доступен кому-то кроме меня? Как я понял, необходимо установить на локальный компьютер ansible и certbot?
Для приватного доступа к DockerHub достаточно выполнить тот же
docker login
, но не в свой реестр, а вregistry-1.docker.io
Я как раз имел ввиду свой реестр. Если я его обозначил как "private", то кроме меня его никто не увидит?
Никто без пароля к нему не подключится.
Благодарю.)
Добрый день. Продолжаю наскоками смотреть и пробовать у себя. После ряда ошибок с почтой и получением сертификатов при деплое на сервер вроде и прошел на пару шагов вперед, но все ещё появляются ошибки видимо связанные с почтой и получением сертификата. Текст такой:
Не подскажите что это может быть и как с ним бороться?
Судя по сообщению:
у вас по какой-то причине не установился certbot.
Поясните, пжл, ведь письмо с сертификатом должно быть на почте? Почту получаю, а сертификат не вижу. (раньше никогда с сертификатами дела не имел). И в чем ещё может быть причина?
я ранее имел дело с certbot и letsencrypt - сертификат на почту не приходит, но https норм работал как надо. видимо, так и должно быть
На сервере Ubuntu 20.04 сертификат не ставится. Почему - не знаю, переустановил сервер на Вebian 10, как у Дмитрия. Однако возникли проблемы с Add GPG key для докера.
Если у вас сервер Debian 10, замените блок ниже
на:
Это не ошибка, сервер у меня Debian 10, а в url "ubuntu"
Если у вас Ubuntu 20.04 - Add GPG key работает.
Почему так - непонятно.
Решение нашел здесь. https://github.com/dwdraju/ansible-install-docker/blob/master/tasks/ubuntu.yml
А в каком именно месте у вас выдавало ошибку сертификата и что писало? Я попробовал ваш метод с подменой ссылки и к сожалению ничего не получилось, та же ошибка, что и была
Насколько я помню, была ошибка при выполнении самого первого таска из роли об установке сертификата.
Какой у вас vps-server? Debian 10?
Много где еще ошибки могут быть. Например, если вы скачаете коммит, о котором говорил Дмитрий в комментариях под уроком - там в файле hosts.yml не прописан пароль юзера. Я понимаю конечно, что возможно до этого Дмитрий сделал соединение ssh по ключу. Но это просто в качестве примера, а есть еще другие моменты, из-за которых у вас ошибки.
Я специально для этих уроков взял Debian 10 чистый, 512 мб оперативки, как у Дмитрия. В ruvds стоит 130р. в месяц, норм.
Да, взял как в уроке. Кстати, сразу не обратил внимание, но таск с присоединением ключа вроде проходит и без замены TASK [docker : Add GPG key] ok: [server] Если в нем поменять на левый адрес, то сразу вылетает ошибка. Значит у меня на этом этапе все нормлаьно. Запинается на таске генерации нового сертификата. При этом таск с проверкой существования сертификата вроде тоже нормально проходит: TASK [site : Check if certificate already exists] ok: [server] => (item=demo.my.company) ok: [server] => (item=api.demo.my.company)
И по ssh-key тоже вроде заходит: TASK [docker : Verify fingerprint] ok: [server]
Дядя Женя, Вы пишете "Запинается на таске генерации нового сертификата", то есть на таске "name: Generate new certificate". То есть на этом таске:
А вы сменили емаил на свой?
В смысле на свой? На тот емаил, который настроен на моем сервере? Да и я его привел в отчете, который привел как пример. Сервер demo.my.company, а почта user@my.company. Она же указана в certbot.yml и site/defaults/main.yml. Конечно почта и сервер выдуманные, но смысл, думаю понятен. Или нужно было где-то ещё поменять? Или даже на другую почту?
Не знаю, я указал реальный емаил. Возможно, как-то проверяется существование реального емаила перед генерацией сертификата?
Ну так у меня реальный. Я почту на сервере поднял, принимаю с неё письма, отправляю с неё на свою обычную гмайловскую почту и ещё на пару почтовиков. Только в примере, что выложил тут выше в отчете, заменил на выдуманную. Зачем реальную светить? ))) Чтоб спамеры спамили? ))))) Только вот в папке с почтой у обоих юзеров (пока настроил почту для двух юзеров) пусто, в смысле сертификата нет. А по идее должен прийти
Рецепт успешного прохождения этого урока. Через публичный репозиторий на docker hub.
Имя коммита "Added provisioning roles" 65036b2
roles/docker/tasks/main.yml - name: Add GPG key - полностью заменить таск на:
Это не ошибка, сервер Debian 10, а в url "ubuntu". Если у вас Ubuntu 20.04 - Add GPG key работает. Почему так - непонятно. Решение нашел здесь. https://github.com/dwdraju/ansible-install-docker/blob/master/tasks/ubuntu.yml. НО я использовал не все как в ссылке, а частично, как написал выше.
Не могу уже отредактировать, напишу сюда, чуть подформатирую свой пункт "Установка нужных прав".
Установка нужных прав на проект.
не могу отредактировать свое большое сообщение, пишу здесь. немного отформатирую эти пункты:
hosts.yml ip прописать от вашего vps
ansible_ssh_pass добавить в hosts.yml и прописать пароль к root от вашего vps
у Дмитрия вообще нет этого параметра в файле hosts.yml! Я так понимаю, он заранее закинул ssh-публичный ключ на сервер, а приватный ключ прописал в конфигах ansible глобально? Дмитрий, если читаете этот пункт, просьба прояснить этот момент).
Жаль, что ваш ответ не был оформлен как ответ мне. Я на почте его не увидел, а само видео пока не просматривал заново и коменты не листал. Случайно сюда зашел. Чуток попозже попробую все что вы сказали (нужно внимательно вчитываться). В любом случае - спасибо. Но до этого я уже успел сделать первых 5 пунктов. Вроде все так и есть, только сервер на vscale.io как Дмитрия. И 512 оперативки. Но при этом на память не ругается. Остальное буду смотреть
После вставок в roles/docker/tasks/main.yml, roles/docker/tasks/main.yml, hosts.yml (тут ansible_ssh_pass) у меня запнулся уже на первом шаге с ошибкой:
с указанием на файл provisioning/site.yml
Все остальное у меня было настроено так же.
Хотя ещё оставался вопрос о правах на запись. Не совсем понял где их прописывать. Я то из под винды работаю. Но по логике разрешение нужно прописывать для юзера на сервере, куда заливаю сайт. Тогда стоит вопрос, куда из файлов каталога provisioning вписать эти разрешения.
Какая у вас хостовая машина? Если ubuntu то видимо надо: apt-get install sshpass.
Хостовая, тоесть домашняя? Винда + wsl2+ubuntu. Установил sshpass и заливка запнулась на том же шаге, что и раньше, на TASK [site : Generate new certificate]
Если предположить, что ошибка в этой строке отчета: provisioning/roles/site/tasks/generate_certificates.yml:19, то опять приходим к тому, что что-то не так с почтой, потому что в этой секции написано:
site/defaults/main.yml
тут все верно?
Да, почта работающая. Даже свою личную почту прописывал. Ни в спаме нигде нет.
А - записи верные для certbot_hosts?
Лучше задам глупые вопросы. certbot_hosts это где, в каком файле или это я файл пропустил? А - записи прописываются ж у хостера, где сервер? Там все нормально, иначе не мог бы зайти, пропинговать, не получал бы почту. Ну или я не знаю как проверить.
certbot_hosts - это переменная ansible в файле provisioning/roles/site/defaults/main.yml
А - записи прописываются ж у хостера, где сервер? - нет. А-записи прописываются у регистратора домена (хостер иногда сам может быть регистратором, а может и не быть). Комментарий Дмитрия на этой странице об А-записях: 2020-03-14 15:05. Ну да, если домены пинговались, значит все верно сделано было. Хотя, надо внимательнее посмотреть при пинге, там ай пи совпадает с ай пи вашего сервера или нет? Про почту не скажу ничего, никогда не настраивал
certbot_hosts Ну так про неё уже шла речь. Там все верно. Вы ж из этого файла цитату приводили. А - записи прописываются сперва у регистратора, затем у хостера, чтоб привязать конкретные сервер к конкретному имени. И как я уже говорил, если бы было что-то не так, то нельзя было бы пинговать, нельзя было бы на него зайти по имени. А так я даже в браузере прописываю айпи и захожу на сервер. И айпи соответствует.
Да, при создании виртуальной машины я сразу добавил свой ключ, чтобы входить без пароля.
Добрый вечер.
В make прекрасно работает команда, только надо её немного изменить
username - пользователь на удалённом сервере
password - использовать token, создаётся в учётной записи на hub.docker.com
Спасибо.
Помогло прояснить очень много моментов, если у кого-то тоже будут вопросы, пишите. Люто провозился с этим.
Есть ли возможность запуска команды make site со страницы сайта?
что значит со страницы сайта? на сервере имеется в виду?
Да хоть на сервере, хоть у себя в продакшене или девелопменте, с последующим переносом на сервер. Но в первую очередь у себя на компе, где продакшен и девелопмент.
На сервере не имеет смысла! make site оно же запускает ansible (а ansible предназначен для управления с хостовой машины вашими серверами).
Хостовая машина == ваш домашний комп в этом контексте
Кстати, нашел сегодня для понимания смысла по аналогии. В друпале есть такая штука - мультисайт. Фактически тоже, что и Дмитрий демонстрирует. Но в дурпале раньше не было автоматизации этого процесса. Все руками приходилось прописывать. Но вот несколько лет назад оказывается они сами сделали под себя приложение для управления сайтами на основе ansible+php
Получилась вэбморда для управления хоть у себя на хосте для разработки, продашкена и провизионинга, хоть для удаленного разворачивания аналогичной системы на сервере.
Слегка уточню свой интерес про запуск команд make site со страницы сайта. Есть два варианта:
На данный момент я понимаю, что в простейшем случае нужен код что-то типа такого (api/public/index.php):
Так я могу запустить какую-то команду и отобразить её вывод на странице сайта. Но если прописать:
То выведет
127int(127)
Я так понимаю, что это из-за того, что находимся в "другом образе", не на самом хосте, где разрабатываем сайт, а в контейнере. Пробовал в каталоге provisioning в файле Makefile Добавлять команду типа:
Она работает. Но замена на
Тоже ничего не дала
127int(127)
.Благодаря ошибке стал понимать, что в моем случае скорее всего нужно доустановить ансибл в один из контейнеров, чтоб получился приблизительный путь
/app/public/index
.То есть по идее в docker-compose нужно добавить секцию что-то типа такого:
а в Dockerfile что-то типа этого:
и потом вызывать командой:
Но пока не получилось
По крайней мере установка ансибл с помощью команды:
Хоть и установила ансибл, но ничего не дала в плане выполнения команд от его имени Так же и с добавлением
Пробую собрать образ с ансибл. Стал понимать, что к нему нужно докинуть ещё пайтон и другие вещи. Собрал такой Dockerfile:
вроде показывает, что все собирается, но потом выдает ошибку:
Dockerfile лежит в корне. Кроме его ничего нет и по идее не нужно.
Пробовал добавить вместо первой строки такую
Но результат тот же
Вернусь к вопросу ошибки при заливке на сервер. Не знаю, насколько правильно поступил, но прописал у хостера добавочную А запись типа api.demo.site.com и все задеплоилось. По крайней мере ошибок нет. Но и есть предупреждение типа:
При этом страница сайта туда не загрузилась. Выдает только "Index of/" Я не совсем понял. Откуда она должна заливаться: из репозитория или с нашего компа?
Через Ansible только ставится софт и загружаются сертификаты для доменов.
Сам сайт выкладывается уже потом через Docker командой
make deploy
Спасибо. Теперь понятно. А это предупреждение? Оно о чем? Критично? Исправлять как-то надо?
Это уведомление о пропуске (skipping) шага по условию. Исправлять не надо.
Я, кстати, было решил, что Ансибл уже заменяет make deploy
Дмитрий, добрый день,
пожалуйста, можете добавить в сборку Prometheus + Grafana для мониторинга нагрузки? Думаю будет очень актуально, учитывая разворачивание масштабируемой под нагрузку архитектуры. Либо посоветовать как их грамотно внедрить/настроить в текущей архитектуре в докере.
Спасибо огромное заранее!
PS: н-р, может взять подобный стек за основу Prometheus + Grafana + cAdvisor + Node Exporter + Alert Manager + Unsee
Это лучше добавить когда-нибудь после разработки. А так да, Prometheus популярен для мониторинга нагрузки и сбора бизнес-метрик самого проекта.
Дима, спасибо, конечно будет хорошо и после разработки, пока пробую разобраться самостоятельно.
Доброе утро.
Дмитрий, возник такой вопрос.
Вы заранее добавили ключ на сервер, чтобы можно было войти по ssh без пароля.
Я попробовал написать tasks для решения этой задачи, но до конца не могу довести дело.
Пока у меня получилось два файла, один записывает удалённый хост в файл known_hosts, а второй копирует ключ на сервер.
add_known_hosts.yml (запись хоста в known_hosts)
Запускаю этот файл командой
Указываю какой хост, с каким ip надо записать в known_hosts, потом запрашивается подтверждение действия
Затем требуется ввести пароль root для доступа к серверу.
Вот на этом моменте я потерялся.
После ввода хоста, ip и подтвержения не могу понять как указать root пароль. Работа завершается ошибкой
Permission denied (publickey,password)., но и хост записывается в known_hosts
Пробовал изменить команду в make файле на такую
Но в этом случае пароль запрашивается самым первым и естественно он не срабатывает.
copy_auth_key.yml (копирует ключ)
Запускаю командой
Запрашивается root пароль и ключ успешно копируется.
Этот код работает даже если первый завершится ошибкой из-за того, что не указан root пароль для первой задачи.
1) Как можно убрать ручной ввод подтверждения и как передать пароль, чтобы ansible реагировал на него после ввода подтверждения (для add_known_hosts.yml)?
2) Как можно объединить эти два yml файла, через handler?
Я добавляю свой ключ сразу в интерфейсе хостинга и потом все виртуалки создаются сразу с ним. Так что прокидывать ключ для root отдельно через Ansible не приходится.
Я это понял. Но как сделать так, как я описал в комментарии? Создаётся виртуалка, Вам предоставляется пользователь root и пароль. Вот чтобы не заходить ни в панель хостинга, ни по ssh и вручную копировать, а через ansible, как я пытался сделать.
Я бы просто в
hosts.yml
указал пароль:и потом бы при желании запустил copy-key.
Пароль получается в открытом виде будет в ansible_password?
Сначала в локальном
hosts.yml
будет открытым. Потом запущуcopy-key
и этот пароль удалю.А, ну да. Есть же файл hosts.yml.dist, его в репозиторий, а hosts.yml в gitignore и dockerignore.
К сожалению такой вариант не сработал. Выдал ошибку.
Может я самый тупой здесь но у меня есть два вопроса:
/var/www/deworker.pro
make docker-login
Добрый день.
1) В домашней директории пользователя на сервере, то есть, /home/username. При подключении к серверу по ssh Вы попадаете именно в домашний каталог пользователя.
2) Это Ваши данные, которые Вы указали при регистрации на hub.docker.com. Но для docker login, как я понял, лучше использовать token, который можно создать в личном кабинете на hub.docker.com.
Спасибо. А не подскажете ещё ? А поменять адерс куда будет деполоиться есть возможность ?
В смысле поменять адрес?
В Makefile при выполнении deploy Вы указываете в параметре HOST адрес, на который Вы хотите выгрузить свои наработки. Укажите другой ip и всё. Это если я Вас правильно понял.
Добрый день, Дмитрий.
Появились пару вопросов.
1) Есть некий домен для которого выпущены сертификаты ssl. Этот домен планируется перенести на другой сервер и настроить автоматическое продление сертифкатов. Могут ли возникнуть проблемы при выпуске сертификатов через letsencrypt, если срок действия текущих сертификатов ещё не истёк?
2) При создании cron задачи на очистку docker от неиспользуемых image Вы указываете период в 30 дней
Почему именно Вы храните image именно месяц? Думаю, что можно чистить от неиспользуемых чаще. Ведь можно и за день заполнить всё дисковое пространство на сервере(что вчера у меня и вышло).
1) Сначала пока не обновятся DNS-кэши сервер Lets Encrypt будет попадать на старую виртуалку. Потом это исправится и всё получится. А так никаких проблем не будет.
2) Да, можно и меньше.
1) Значит надо указать новые ns записи для домена и подождать, пока они не обновятся, потом только запускать создание ключей lets encrypt?
Либо подождать, либо просто скопировать папку
/etc/letcencrypt
с одной виртуалки на другую.Понял. Скорей всего придётся ждать, так как на старом сервере простой shared хостинг.
Чтобы меньше ждать можно за день до переезда в настройках DNS домена для A-записи указать TTL в 60 секунд. Так все кэширующие серверы потом обновятся за минуту.
Спасибо.
Здравствуйте, у меня установлен Ansible на Win10, пинг "ansible all -m ping -i hosts.yml" проходит нормально, но при запуске "make site" выдаёт следующую ошибку:
$ make site ansible-playbook -i hosts.yml site.yml process_begin: CreateProcess(NULL, python3.7 C:\cygwin64\bin\ansible-playbook -i hosts.yml site.yml, ...) failed. make (e=193): Error 193 make: *** [site] Error 193
Подскажите, плиз в чём может быть ошибка.
Не работаю с Windows, так что не подскажу.
После первого запуска "make site" получил ошибку:
После второго запуска "make site" получил ошибку:
В чем причина данного безобразия?
Поменял --name apache на docker run -d --name apache1 -v опять первая ошибка
Ошибку в блоке "Up certbot standalone Apache" решил ручным удаление контейнера с именем: apache на сервере
Ошибку "Generate new certificate" не получается исправить
Вопрос закрыт, разобрался
Все сделал в соответствии с уроком. Сайт залил на витуалку. Все без ошибок. Сайт не открывается. Все пингуется, A и CNAME записи в DNS прописаны корректно.
Пишет:
Все по двадцать раз проверил, НЕ ЗАПУСКАЕТСЯ САЙТ!!! HELP люди!!!!
Вопрос закрыт
Дмитрий, большое спасибо за ваши скринкасты! Всё очень круто и полезно!
Подскажите пожалуйста, с чем может быть связана эта ошибка на этапе make deploy, вроде всё как у вас сделал, только docker registry сделал на каком то бесплатном сервисе, не на своей виртуалке.
С тем, что 80 порт в вашем сервисе уже занят каким-либо сервером.
Странно - вроде ничем не занят(
Это получается в каком то контейнере какой то процесс занял порт 80?
А можно поподробнее о том как была написана конфигурация для Nginx.
Например, существует генератор, который создаст готовую, но там всё иначе nginx.conf vs conf.d, sites-available и т.д.
Можете порекомендовать ресурсы для изучения Nginx? Документацию смотрел, там много чего. А вот для начинающего?
Если рассматривать конфигурацию, то Nginx изначально загружает один файл:
и все настройки сервера и хостов можно вписывать прямо в него.
Но это неудобно, так как при обновлении Nginx можно этот файл случайно перезатереть. Поэтому чтобы примешивать туда свои настройки в Linux популярен подход добавления импорта всех файлов из особой папки
conf.d
. Для этого в оригинальномnginx.conf
имеется строка импорта всех файлов из этой папки:В итоге мы можем насоздавать в ней сколько угодно своих файлов:
и все их содержимое в итоге смержится вместе.
Но если устанавливаем Nginx вручную на виртуальную машину для нескольких сайтов, то имеет смысл придерживаться более продвинутой структуры по примеру сервера Apache с отдельными папками
sites-available
для хостов иsites-enabled
для символических ссылок на них. С ними можно включать и отключать сайты по отдельности пробрасыванием и удалением ярлыков вsites-enabled
:так как в
nginx.conf
ещё и производится импорт всех файлов изsites-enabled
.И помимо этого в комплекте по умолчанию имеются вспомогательные файлы вроде
fastcgi_params.conf
для упрощения добавления проксирования в тот же php-fpm.Это полноценная конфигурация по умолчанию.
Но если мы используем Nginx в Docker для одного хоста, то нам не очень нужна такая продвинутая структура. Нам достаточно просто создать свой конфигурационный файл хоста и закинуть его в
conf.d
, чтобы он оттуда подхватился автоматически.Так что по каким файлам раскладывать и как это всё потом импортировать – это дело вкуса.
Спасибо за ответ. Очень классно.
Здесь получается редирект 443 https://www -> https:// не работает, т.к сертификат не поддерживает www.
При генерации нужно указать
certbot certonly --standalone -d domain.com -d www.domain.com
для использования одного и того же сертификата для обеих блоков в nginx (не проверял лично).Извиняюсь за оффтоп, а какие-то настройки с шрифтами делали на ubuntu? на видео они кажутся норм, но когда себе ставил то по сравнению с windows сглаживание очень плохое
Отдельно в Ubuntu ставил шрифт Tahoma.
Добрый день, подскажите как устранить проблему сайт открывается по адресу example.com, а также example.com/index.php все настройки NGINX как в проекте
Добавить канонические адреса через
link rel="canonical"
.Тогда поисковики не будут индексировать дубли.
Здравствуйте, а почему решили выбрать для выпуска и продления сертификатов режим webroot, а не standalone?
Разобрался, standalone используется в тех случаях, когда на сервере нет вебсервера и он не будет ставится, т.к. иначе при каждой установке/обновлении его надо будет останавливать, чтоб запустить вебсервер плагина standalone.
Именно. При standalone он постоянно запущен и занимает порт.
При запуске
ansible-playbook hosts.yml --check
Получаю ошибку
provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
all:
В чём может быть проблема?
Разобрался, проблема была в другом. Ошибке yml докера
На таске site : Up certbot standalone Apache падает с ошибкой docker: Error response from daemon: cgroups: cgroup mountpoint does not exist: unknown. Кто-нибудь решил?
У меня после шага Up certbot standalone Apache была ошибка при генерации сертефикатов. Оказалось, что после поднятия контейнера с сервером он падал с ошибкой
Помогло поменять тег httpd:2.4 на httpd:alpine
У кого MacBook с чипом M1, при билде нужно добавить флаг
Без этого флага на продовом сервере контейнеры останавливались с ошибкой
https://appdividend.com/2023/01/29/exec-user-process-caused-exec-format-error/
Это. Просто. Офигительно! Спасибо!!
При добавлении репозитория certbot возникает ошибка, машина с Ubuntu 22.04
Сама ошибка:
Подскажите пожалуйста.
Уже неактуально. Решил благодаря комментариям. Не нашел, где Дмитрий вызывает handler main в docker. Он сам по себе не запускается.
Подскажите пожалуйста более подробно, как решили описанную ошибку
Пару дней промучался с воспроизведением данного урока через VPS на Debian 12. В итоге, всё успешно запустил и задеплоил. Может, кому пригодятся данные фиксы:
ошибка "..does not have a Release file" при выполнении таски Add Certbot repository - заменить поддомен на archive
Неявная ошибка при выполнении таска Generate new certificate (connection refuse при проверке acme-challenge). В первую очередь надо проверить A-записи для ваших доменов (об этом уже было сказано). Но в моём случае не запускался демон с апачем (запускался и через 4-5 сек отрубался), соответственно, Up certbot standalone Apache отрабатывал без ошибок, но соединение не проходило, надо использовать более старый образ httpd:2.4-bullseye
подскажите что не так ?
вобщем понял что длЯ убунты 22 надо поменять файл provisioning/roles/certbot/tasks/main.yml
Одно не понятно nginx то должен быть уже установлен там или нет для основного домена ?
Сначала ничего не должно быть. Первоначальный выпуск сертификатов идёт через Apache в docker.
В будущих эпизодах мы для автовыпуска сертификатов перейдём на Traefik. Там уже этот Apache будет не нужен.
при попытке запушить ошибка , docker-login до этого отработал нормально/ Подскажите что tver не хватает ?
PS. пришлось вручную из папки auction выполнить docker login итд итп тогда авторизовало , из папки provisioning не подхватывает авторизацию
Или войти через: