Создание production-сервера c Ansible

Автоматизация серверной инфраструктуры. Автоматическая установка Docker и Compose на виртуальную машину через Ansible. Подключение сертификатов Let's Encrypt.

Комментарии (53)
Arunas
2019-12-26 19:09

спасибо, очень поможет, очень хорошый урок.

Ответить
Руслан
2019-12-27 08:11

Отличный эпизод, как всегда. Огромная просьба рассмотреть возможность добавить в материалы настройку Github Actions для CI/CD.

PS: интересует также, имеются ли в Ваших курсах материалы по опыту правильной организации multi-tenant архитектуры на любом из фреймовоков? Либо в планах на будущее)

Спасибо еще раз за супер курс!

Ответить
Ruslan
2019-12-27 16:33

Тёзка, там заявлен Дженкинс. Видел на Ютубе CI/CD для Битбакета и для ГитЛаба тоже наверняка найдется.

Ответить
Руслан
2019-12-27 19:28

Руслан, спасибо, конечно, видел то что Jenkins заявлен. Просто Github Actions видется более перспективней в плане популярности в ближайшие время, хотелось на него перескочить в плане self-hosted CI/CD, не ставить на сервак java (Jenkins) или ruby (Gitlab CI).

Ответить
Ruslan
2019-12-28 09:50

А что с приватными репами, только за деньги, как и на самом Github ?

А вообщем, я о том, что нужно придерживаться плана. Я тоже могу написать, что сейчас большой downtime и давайте поднимем кластер для CI/CD без downtime.

Какие-то такие дополнения можно сделать в самом конце когда станет известно как делать: "Разработка аукциона на Slim и ReactJS" :)

Ответить
Paul
2019-12-28 22:39

Мощно!

Ответить
Алекс Про
2019-12-29 17:17

Снимайте, пожалуйста, видео на чёрной теме IDE!!!

Ответить
Deworker Pro
2019-12-29 18:34

Приведите пример видео с YouTube с красивой тёмной темой.

Ответить
Deworker Pro
2019-12-29 18:51

Эта нечёткая (пыльная)

Ответить
Иван
2020-01-23 19:49

Тема: ayu, темная подтема: mirage

Ответить
Deworker Pro
2020-01-23 20:18

Это для Visual Studio. Есть форк для PhpStorm?

Ответить
Иван
2020-01-23 23:40

Visual Studio Code, если быть точным, но и это частность - тема не принадлежит одной какой-то сущности.

Для Sublime Text 3 - есть точно, для PhpStorm - не знаю, должна быть.

Тема мощная и крутая, очень досадно будет, если не портирована.

Ответить
Алексей
2019-12-29 20:36

Все отлично. Но, хотелось бы краем глаза глянуть как вы настраивали реестр для докера. Сама установка вроде бы элементарна.

docker run --entrypoint ./auth/htpasswd registry:2 -Bbn registry passwd > ./auth/htpasswd

docker-compose.yml

version: "3.7" services:

registry:
    restart: always
    image: registry:2
    ports:
        - 5000:5000
    environment:
        REGISTRY_HTTP_TLS_CERTIFICATE: /certs/example.com.crt
        REGISTRY_HTTP_TLS_KEY: /certs/example.com.key
        REGISTRY_AUTH: htpasswd
        REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
        REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
    volumes:
        - ./registry:/var/lib/registry
        - ./auth:/auth
        - /etc/letsencrypt/live/example.com:/certs

Но с сертификатами у меня получился жуткий костыль. Из коробки докер с letsencrypt не заработал, хотя в документации пишут, что должен. Или, может, дело в версии убунты? У меня 16.04

Ответить
Deworker Pro
2019-12-30 05:47

Просто можно как с gateway закрыть сертификатами и htpasswd снаружи в Nginx:

version: '3'
services:
    nginx:
        image: nginx:alpine
        restart: always
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - /etc/letsencrypt:/etc/letsencrypt
            - /var/www/html:/var/www/html
            - ./docker/nginx/conf.d:/etc/nginx/conf.d
            - ./htpasswd:/etc/nginx/auth/htpasswd
        depends_on:
            - registry
    registry:
        image: registry:2
        restart: always
        volumes:
            - registry:/var/lib/registry
volumes:
    registry:
Ответить
Роман
2020-01-12 16:44
  • ./docker/nginx/conf.d:/etc/nginx/conf.d

А в этом случае прокидываемый конфиг в контейнер как будет выглядеть? Самый базовый с ssl сниппетами и auth_basic_user_file /path/to/.htpasswd; в главном локейшене для nginx на домен registry.domain.com, к примеру, верно?

Ответить
Deworker Pro
2020-01-13 09:57

Да, примитивный с секцией server как приведённый в документации к registry, только переделанный для Let's Encrypt.

Ответить
Роман
2020-01-13 10:03

Спасибо!

Ответить
BMWist
2020-01-13 14:39

Было бы не плохо, если бы в одном уроке настройку registry сервера показали на этой же виртуалке, чтобы охватить все технологии, которые используется, мне было бы очень полезно ))

Ответить
Роман
2020-02-09 02:19

Дмитрий, я правильно понимаю что ваш кейс с оркестрацией сервера подразумевает абсолютно голый сервер? Если на удаленной машине, на которой я хочу поднять образы из реестра, уже стоит nginx и слушает 80 и 443 порты, то в этом случае не получится проброска этих портов для gateway в docker-compose-production и, как следствие образы не поднимутся. Завелось вместе с ssl только тогда, когда я сделал проброс незанятого порта, к примеру 5001 на 443 ("5001":"443", в докер композ прод), но для этого приходится добавлять порт на продакшене в строке браузера, для того чтобы происходило перенаправление в обработку докера на 443 порт. Хотел узнать, может есть какой-то лайфхак, чтобы разрулить эту ситуацию на уровне конфигов nginx, хотя пробовал разные варианты. Просто не хочется добавлять все время порт в строке браузера

Ответить
Deworker Pro
2020-02-09 12:40

Да, на сервере можно поднять только один Nginx на одном порту. Поэтому если уже стоит внешний Nginx, то можно в него добавить хост с proxy_pass localhost:5001

Ответить
Александр
2019-12-31 12:01

Курс супер. Но зачем так заморачиваться с сертификатами, если можно использовать Treafik. Он все это умеет из коробки.

Ответить
Руслан
2020-01-01 23:29

Александр, интересуют подробности других преимуществ Traefik vs nginx / haproxy etc. (кроме сертификатов) и опыт оптимальной установки/настройки?

Ответить
Александр
2020-01-02 18:26

Я только осваиваю. Но он много чего умеет. Про haroxy не слышал.

Ответить
Руслан
2020-01-02 20:21

Насколько понимаю, чтобы разобраться как обойтись средствами уже задействованного nginx, чем вводить дополнительный слой либо отдавать предпочтение одному из многих специализированных прокси-серверов/балансировщиков, уже заточенных под микросервисы и k8s (traefik, haproxy, envoy, kong и пр.). Последние конечно удобны разными плюшками из коробки, но на них можно будет легко мигрировать при необходимости и от нужд в этих плюшках конкретного проекта.

Ответить
Deworker Pro
2020-01-04 16:49

UPD 1: В Cron-задаче очистки Docker нужно добавить флаг "a":

docker system prune -af --filter "until=$((30*24))h"
Ответить
Ruslan
2020-01-06 13:54

А в эту чистку используемые контейнеры попадают, ведь проект может быть и год без изменений? Или это очищает только элементы из которых собирается наш контейнер?

Ответить
Deworker Pro
2020-01-06 17:27
$ docker system prune -a

This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache
Ответить
Sergei
2020-01-06 16:22

ничего_не_понял_но_очень_интересно.jpg

Ответить
BMWist
2020-01-11 01:42

Буду переходить на vscale.io

Ответить
Сарибжанов Ильдар
2020-01-15 03:52

На мой взгляд идея ущербности установки с мануалов перед установкой скриптом - надумана.

Мы же сейчас говорим про разработчиков, которые разворачивание окружения производят раз в несколько месяцев, а то и реже. Что скрипт отдельный писать, что мануалы использовать итог один - всё равно придётся актуализировать скрипт под нужды. К тому же сам алгоритм инсталяции может поменяться, например, добавятся зависимости или платформа поменяется. Например, докер переедет go на rust и потребуется отдельно доставлять раст. А по итогу, чтобы починить свой шел придётся лезть в мануалы.

Я не говорю, что представленный материал не нужен, но я бы «продавал» его с позиции управления сложностью: производим декомпозицию алгоритма разворачивания сервера и уход от низкоуровневых абстракций (общение с терминалом) к высокому уровню - ансибл.

Спасибо за материал =)

Ответить
Deworker Pro
2020-01-15 09:49

Да, всегда приходится лазить в мануалы и любая автоматизация является оверхедом когда виртуалок и программистов в проекте не больше одной/одного. Тогда можно заходить и ставить софт и править конфиги вручную без скриптов, выполнить что-нибудь в БД без миграций и на локальном компьютере ставить тоже вручную.

Но как только виртуалок становится две, так сразу при ручном подходе получаем вероятность рассинхронизации версий и конфигов, когда на одной что-то поменяли или обновили, а на второй забыли или ещё не успели.

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

Так что как только виртуалок и программистов становится много, то автоматизация во всём очень помогает. И пусть все сисадмины тоже коммитят в tasks.yml.

Ответить
Руслан
2020-01-16 08:31

Подскажите, доступа к root нет, использую в качестве remote_user пользователя,

remote_user: deploy become: yes become_user: deploy

Пишет ошибку: Failed to lock apt for exclusive operation

Подскажите, как настроить без root доступа?

Ответить
Deworker Pro
2020-01-17 15:02

Задачи с apt запускайте только от root (через become без become_user).

Ответить
Arunas
2020-01-16 19:44

после успешного make site, в кроне хостинга (в /etc/cron.d/certbot) введётся команда "...certbot -q renew". Но как реально автоматом происходит certbot renew, если gateway (nginx) работает в докере, а сертификат продлен снаружи? как в этой ситуации, происходит автоматическое продление сертификата?

Ответить
Deworker Pro
2020-01-17 15:17

Как упомянули после деплоя, в cli.ini вместо хука service nginx restart нужно вписать перезапуск gateway вроде такого:

renew-hook = /bin/sh -c 'cd /home/deploy/site && docker-compose restart gateway'
Ответить
Deworker Pro
2020-01-22 16:29

Например, в site/tasks добавить задачу добавления строки:

-   name: Add Certbot hook
    lineinfile:
        path: /etc/letsencrypt/cli.ini
        line: "renew-hook = /bin/sh -c 'cd /home/deploy/site && docker-compose restart gateway'"
Ответить
Arunas
2020-01-22 17:12

в чем разница между этими вариантами? Ведь, в первом варианте, когда в 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 у хостинга).

Ответить
Arunas
2020-01-22 17:26

у demo-auction.skucai.com деплоил (18-01-2020) проект, по первому варианту, и подожду 32 дней, посмотрю, продлится сертификат или нет.

Ответить
Arunas
2020-01-22 17:31

А как проверит 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"

Ответить
Deworker Pro
2020-01-22 17:37

Разница в том, что роль certbot будет общая для всех production и staging серверов. Им может быть нужен разный хук и одинаковый cli.ini может всем не подойти. Поэтому можно всем скопировать общий cli.ini без хука, а потом уже в ролях site и staging добавить им по своей строке. Зависит от ситуации.

Ответить
Arunas
2020-01-22 17:43

спасибо.

Ответить
Ruslan
2020-01-18 17:17

Я что-то совсем запутался. Registry требует установки перед ним вэбсервера или нет?

version: '3'

services:
  registry:
    image: registry:2
    restart: always
    ports:
      - "5000:5000"
    environment:
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/live/{{ registry_host }}/cert.pem
      REGISTRY_HTTP_TLS_KEY: /certs/live/{{ registry_host }}/privkey.pem
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/password
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      - ./auth:/auth
      - ./data:/data
      - /etc/letsencrypt/:/certs:ro

Из этого конфига я подумал, что Registry может сам работать без вэба, но

docker push registry.mydomain.com/auction-gateway:master-1

И видно, что он лезет по https в папку V2 :

Get https://registry.mydomain.com/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Ответить
Ruslan
2020-01-18 22:56

На это можно не отвечать. Я уже разобрался. В итоге у меня собралась рабочая среда из: WSL 2, CentOS и docker repository в одном контейнере без вэба впереди. А можно ли в конфигах nginx применять пересенные, чтоб не перебивать названия сайтов "deworker.pro" на свои? В 19и местах пришлось менять руками, так и запутаться можно.

Ответить
Deworker Pro
2020-01-19 05:59

Два варианта. Либо запускать его со своими сертификатами TLS_CERTIFICATE и htpasswd без внешнего Nginx, либо реестр запускать без сертификатов, настроив их в дополнительном Nginx.

Ответить
Ruslan
2020-01-19 09:20

Спасибо.

Мне понравился вариант, когда реро само за себя, если нужно на той же машине использовать вэб, то не нужно учитывать , что 80 и 443 уже используется.

Ответить
Иван
2020-01-23 19:52

Это тоже для новичков или курилка спецов по devops'у?
Вы не понимаете, что такое объяснение.
Объяснение, это не рассказ.

Ответить
Deworker Pro
2020-01-24 08:52

Здесь практика по разработке проекта.
Рассказывать что такое консоль, apt и cron здесь нет смысла.

Ответить
Иван
2020-01-24 13:50

Понял, спасибо.

Ответить
Роман
2020-02-05 15:48

https://i.imgur.com/GrKChZd.png

По команде ansible-playbook -i hosts.yml site.yml у меня на удаленной машине (Ubuntu 18.04) произошла ошибка на шаге Add Certbot repository. Видимо он не смог потом сделать apt-get update. Возможно попробовать другой repo: ?

Ответить
Роман
2020-02-05 16:14
-   name: Add Certbot repository
    apt_repository:
        repo: 'ppa:certbot/certbot'
        state: present
        update_cache: yes

-   name: Install Certbot
    apt:
        name: certbot
        state: present
        update_cache: yes

вот такой вариант прошел, кстати

Ответить
Deworker Pro
2020-02-05 16:16

Да, мы уже обсуждали под эпизодом про Xdebug.

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий