Продакшн сервера на Fornex – выбор площадки хостинга и настройка


Продакшн сервера на Fornex – выбор площадки хостинга и настройка

Сегодня поговорим о том, как нам подготовить и запустить продакшн окружение с нашим веб сайтом или веб сервисом на каком-нибудь хостинг сервис провайдере.

Итак, давайте представим что Вы долго и упорно писали и создавали Ваш проект, но вот весь код написан, автоматические и ручные тесты успешно выполнены, ( пиво выпито, инвестиции заказчика спущены, нужное подчеркнуть) и вот настало время выходить в продакшен!

Однако этот самый продакшен должен быть как-то подготовлен… Если разработку вы вели у себя используя стенд на Vagrant или упаси высший разум на каком-нибудь Denver , то теперь надо как-то где то подготовить для этого площадку, настроить, задеплоить… Интересно? Поехали!

План разворачивания сайта

Итак, краткий план:

Перенос кода и данных

Выбор площадки

Идеальным выбором для размещения своего проекта на мой взгляд является площадка, имеющая свой API, с помощью которого можно автоматизировать управление инфраструктурой – создание серверов например. То есть не сидеть и не тыкать в интерфейсе мышкой а написать один раз скрипт или использовать некоторое специализированное решение. Яркий пример – AWS, Digital Ocean и иже с ними. Там Вам даже не придется ничего придумывать в плане автоматизации.

Дефакто стандартом для управления инфраструктурой в виде кода ( IAAC – Infrastructure As A Code ) является Hashicorp Terraform – поэтому просто смотрим, есть ли в списке его плагин – провайдеров поддержка нужного Вам сервиса, либо идем на Github и ищем там ( возможно плагин уже есть просто не вошел в официальный список – я так находил для DNS от GoDaddy .

Плюсы такого решения – Вы тратите от пары часов до дня чтобы разобраться как это работает и написать подходящий код ( лучше при этом сразу загуглить best practices ), а потом забываете про настройку как про страшный сон и просто добавляете пару строчек кода если надо. Ну и конечно храните это как проект в Git.

Минусы – стоимость вычислительных ресурсов на таких площадках ( сиречь аренда виртуалок) стоит несравнимо дорого по сравнению с теми кто еще не имеет таких функций. Поэтому если у Вас еще не очень большой проект или более того – он учебный, оставим пока эти возможности в голове, так сказать на память, и посмотрим более простое и недорогое решение. Например , площадка хорошего европейского качества, быстрый, качественный провайдер Fornex (да, не лишним будет упомянуть, что выбирая отечественных хостинг провайдеров вы должны учитавать состояние правовой системы и практики ещё применения (а тут бывают промашки), яркий тому пример – недавняя попытка рейдерского захвата датацентра компании IHOR)
(с другой стороны, бывают ситауации, когда без сервера в России не обойтись, но не будет отклоняться от темы) .
Специально для читателей этого сайта Fornex предоставил промокод fkn.ktu10 который дает скидку 10% на покупку всех услуг провайдера. Для активации промокода, нужно зарегистрироваться, выбрать нужную услугу и тариф, а затем нажать на ссылку «у меня есть промо-код».
Отлично. площадку выбрали, займемся инфраструктурой!

Развертывание инфраструктуры

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

На каждый сервер ставим Ubuntu Linux без всяких там надстроек, панелей управления и пр

И не забываем закинуть туда автоматически ssh ключ:

Итак, вот для начала и наша инфраструктура. Для тех, чей проект будет серьезней, советую все же подробней ознакомиться с Terraform!

Настройка серверов

Настраивать сервера вручную, подключаясь к каждому по ssh – это моветон в 2019 году! Во первых, это монотонно и утомительно, во вторых – это плохо масштабируется ( вот надо Вам настроить не 2 сервера а 20 – так же будете команды вбивать?) а в третьих, велик риск получить сервера “снежинки”, конфигурация каждого из которых уникальна, в силу того что каждый раз Вы могли ошибиться или привнести некий “кастом”, просто потому что в процессе работы Вы думали и решили немного изменить сценарий а перенастраивать уже ранее настроенные хосты лень, нет времени, как нибудь потом.

Именно поэтому уже не первый год знающие люди прибегают к использованию специализированных средств управления конфигурацией : puppet , chief , ansible и тд. Про преимущества каждого предлагаю прочитать соответствующие статьи в интернете, коих много. В рамках данного руководства предлагаю использовать Ansible. И нет, не потому что стильно, модно, молодежно ( нужное подчеркнуть), а потому что очень простой yaml декларативный синтаксис, отсутствие необходимости ставить агенты, доступ через ssh (то есть сразу из коробки да еще и безопасно), плюс есть возможность просто одновременно выполнять команды на хостах – эдакий parallel ssh.

В нашем случае все будет предельно просто… Мы лишь хотим вначале проверить возможность “достучаться” до серверов с помощью Ansible а потом с его помощью поставить часть пакетов и сконфигурировать. Для начала напишем тн “inventory” файл, который будет в себя включать информацию о самих хостах – как до них достучаться и т.д. Выглядит он следующим образом (обзовем его hosts.yml):

И опишем заготовку тн “playbook” файла – то есть нашего сценария, в котором будут располагаться задачи:

Теперь с помощью командной строки проверим что сценарий отработает – это покажет нам что синтаксис верен, хосты доступны, ssh ключ подходит и тп:

Отлично! До хостов мы достучались, можно и сконфигурировать! Итак, что мы хотим:

Поставить ряд пакетов с дополнительными утилитами по списку,

Установить веб сервер ( пусть в одном случае это будет Apache, а в другом Nginx)

СУБД ( Конечно же Mysql)

И настроить фаервол ( откроем 22, 80, 443 и еще 10050-10051 это порты системы мониторинга но об этом позже)

Приступаем к написанию! По итогу у нас получается следующий playbook ( Довольно длинный):

– name: Install a list of packages

– name: Install apache

when: inventory_hostname == “infrastructure”

– name: Install nginx

when: inventory_hostname == “service”

– name: DB | Specify MySQL root password before installing

– name: DB | Confirm MySQL root password before installing

– name: DB | Install MySQL server

– name: DB | Create a new database

– name: DB | Create user and grant privileges for database

– name: Firewall | Allow access to list of ports

– name: Firewall | Enable UFW and set default policy to Deny

Он довольно простой – лишь ставит пакеты да что-то немного конфигурирует. На самом деле, с помощью Ansible можно сделать куда больше! Но у нас же учебный пример, ведь так? Иначе мне придется переписать все руководство… Если Вы заметили – в некоторых местах стоят не значения а переменные, в фигурных скобках. Их значения я вынес в файл inventory:


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *