Всех приветствую, кто заглянул сюда. Суть вообще в чем заключается... Я решил, а точнее мой коллега посоветовал, вести блог по DevOps'у.
Зовут меня Вадим, а сам я из маленького города Киров, скорей всего слышали про вятский квас, который рекламировал Тимати, а если не слышали, то вообще не важно) Забейте в гугл картах Киров - кировская область, если стало интересно)
На данный момент начну с того, какими знаниями я уже обладаю для входа:
- Linux - в принципе сидеть с документацией и делать вещи не составляет труда, уходит много времени, но дело практики. Основную базу вроде как знаю.
- Jenkins - повозился пару дней с ним и понял принцип - остальное дело практики
- Ansible - та же история, как и с Jenkins
- Docker - абсолютно не знакомился с данной технологией до начала тестового, по ходу статьи буду решать задачи и расписывать опыт
Что такое Docker, Jenkins и Ansible?
Слишком подробно я расписывать не хочу, т.к. предполагаю, что статья и так будет большой, но вкратце как я это вижу, и как я это понимаю - я расскажу.
Docker - виртуальная среда/машина, предназначенная для быстрого развертывания и доставки приложения/сервера. Если вы имели дело с VirtualBox, то это практически тоже самое, только все настолько вырезано, что остается только самое базовое для работы. Зачем это нужно? Представьте ситуацию, что вам нужно скачать проект с репозитория github и там тонна информации, как развернуть приложение, куда что скопировать, как подрубить сервер, как настроить конфиги. Естественно не больно терпеливому обывателю после 1-2 ошибок вообще больше не захочется возиться с этим, а такое сплошь и рядом. В большинстве мелких контор никто не будет ставить docker и все оптимизировать, поэтому новые разработчики, приходя в такую контору, только неделю будут возиться с документацией и пытаться развернуть проект. Докер один раз сконфигурировал под приложение и можешь хоть на всех 65535 портах открыть его, и все 65535 серверов будут работать. Круто? Думаю да :)
Jenkins - а-ля приложение, которое автоматизирует ваши действия на сервере. Например: вам нужно сделать так, чтобы когда вы скинули свой код в репозиторий, ваш сервер сразу подтянул изменения и они быстро вступили в силу. Но это лишь малая часть того, что он может.
Ansible - когда у вас 100500 серверов, а заходить на каждый и менять какой-то один и тот же конфиг это очень много времени. Прописали скрипт чего нужно изменить в конфиге и через ssh отсылаете на все сервера, и за минуту у вас поменялся конфиг на 100500 серверах. Про Ansible здесь скорей всего больше ничего не будет, т.к. для тестового он мне не понадобится.
А вот и тестовое задание, которое будем делать:
Репозиторий — проект на Django, который предоставляет API
Напишите для него Dockerfile, который можно будет запускать на продакшене(" - на главном сервере, еще именуют как master"). В качестве сервера приложений используйте UWSGI, в качестве базы данных — Postgres, который будет лежать в отдельном контейнере. Затем настройте CI в любом удобном сервисе.
Давайте начинать!
Я подготовил для этого Virtualbox и на нем создал сервер на базе
Debian 11. Про установку системы я не буду рассказывать, т.к. этого и так много в интернете.
Вот настройки VirtualBox
Для более удобного взаимодействия с системой я буду использовать MobaXterm через ssh к своему серверу.
Сначала я установлю БД postgresql. Сразу предупреждаю, что я это уже сделал и расскажу с какими проблемами я столкнулся с самого начала.
Но только установил!!! :-)
P.S. Чтобы приступить к работе нужно зайти в систему через root'а и установить парочку приложений:
- apt install vim - удобный редактор для меня
- apt install sudo - по умолчанию не стоит на дебиане. И чтобы не сидеть от рута, я даю права новому созданному пользователю
- apt install gpg - тоже в стоке не установлено, а для подписания ключа при установке postgresql нужно
Еще зайдите в /etc/apt/sources.list и пропишите репозитории как сказано в документации к дебиану(новые правила безопасности)
deb http://deb.debian.org/debian/ bullseye main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib
deb-src http://security.debian.org/debian-security bullseye-security main contrib
deb http://deb.debian.org/debian/ bullseye-updates main
deb-src http://deb.debian.org/debian/ bullseye-updates main
Можно смело выходить из root'а и заходить через пользователя, которого указывали при установке. Не забудьте добавить пользователя в /etc/sudoers
Следуем инструкции из официальной документации postgresql и устанавливаем БД:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
после шага "$ sudo apt-get update" я не рекомендую устанавливать postgresql без указания версии, лично у меня он ставит сразу две, а мне этого не надо, поэтому я прописал:
$ sudo apt install postgresql-14
Проверим, все ли у нас работает
Зайдите через пользователя postgresql и всегда работайте с БД от этого пользователя - безопасность как никак :)
$ sudo -i -u postgres
Создадим для теста БД
$ createdb mydb
Если ошибок никаких не выкатило значит все хорошо и можно успешно дропнуть эту таблицу, т.к. она нам больше не пригодится. Если же появились ошибки, то можете писать в комментарии - постараюсь помочь, но найти в инете будет гораздо быстрее инфу)
$ dropdb mydb
Доступ к базе данных или начало конфигурирования
Чтобы запустить хоть как-то сервер БД из коробки, нужно прочитать man по pg_ctl утилите. И только в самом конце будет написано, что и где находится) На секундочку: в официальной документации я этого не нашел, возможно плохо искал, но там просят запускать через эту утилиту сервак, а оболочка посылает меня куда подальше, потому что не прописано в PATH.
И все, дальше что делать с этим не сказано, но благо man - наш бог
Пробуем запустить сервак без всяких флагов и ключей предварительно перейдя в директорию с postgresql:
$ cd /usr/lib/postgresql/14/bin
Опа, вот и чудо. Утилитка нашлась и даже запускается
Пробуем запустить сервер БД:
В доке написано так
/usr/lib/postgresql/14/b/usr/lib/postgresql/14/bin/pg_ctl -D ~/14/main initdb
- /usr/lib/postgresql/14/b/usr/lib/postgresql/14/bin/pg_ctl - путь к утилите
- ~/14/main - путь где нужно инициализировать кластер. Вы указываете свой
Идем внутрь кластера и открываем postgresql.conf. Там нужно будет указать свой адрес и порт.
Запускаем:
$ /usr/lib/postgresql/14/bin/pg_ctl -D ~/data start
Проверяем работает ли:)
В следующей части буду оборачивать postgresql в докер и развернем проект на сервере UWSGI, который тоже обернем в докер. Скоммуницируем их и посмотрим, что из этого выйдет.
Возможно где-то я был не прав и я почему-то даже уверен в этом, но я только учусь, поэтому все претензии жду в комментах)