Advertisement
  1. Code
  2. Web Development

Настройка Staging окружения

by
Read Time:18 minsLanguages:

Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)

Общепринятая практика заключается в том, чтобы работать локально в проекте и выкатывать ревизии на производственный сервер, но шаг, который люди часто пропускают, является промежуточным сервером. Промежуточный сервер представляет собой смесь между производством и разработкой; вы можете проверить свое приложение так, как если бы оно было на производстве. Давайте рассмотрим некоторые из проблем, которые вам придется рассмотреть, а также шаги, необходимые для репликации производственной платформы как службы (PAAS).

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

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

Вы можете найти и исправить эти проблемы, поскольку в промежуточном окружение есть то же программное обеспечение, что и в вашем производственном окружении. Это резко контрастирует с вашей локальной машиной, где у вас могут быть установлены разные версии программного обеспечения (например, PHP 5.3 vs PHP 5.4) или даже разные функции. Я выкатывал код, содержащий вызовы file_get_contents, только чтобы найти, что производственный сервер не поддерживает эту функцию.

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


Это все в деталях (в основном)

Проблемы случаются со всеми, особенно когда вы устремились к крайним срокам.

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

Справедливо предположить, что большинство людей развертывают свои приложения с помощью какого-то средства управления версиями (например, GIT). Если есть вероятность того, что вы работаете над старым проектом, который все еще использует FTP, сайты, такие как ftploy.com или deployHQ.com, могут выступать в качестве буфера между GIT и вашим сервером. Джеффри Уэй собрал информативное видео, в котором подробно описывается, как это сделать.

Помимо GIT, вам нужно подумать о языках, программном обеспечении и «специальных» функциях, предлагаемых вашими производственными серверами. Я использую PAAS на основе PHP, названный Fortrabbit, потому что они предлагают обновленную поддержку PHP, Apache и GIT. Они также предоставляют возможность добавить ключевое слово в сообщение GIT commit, которое запускает Composer для установки зависимостей вашего проекта.

Это система, которую я установлю в остальной части этой статьи. Его стандартный набор функций, а также специальная функция композитора делают Fortrabbit идеальным для широкого круга хостов. Просто помните: это не волшебное решение, но шаги, которые вы делаете, следуют тому же шаблону, который вы использовали бы для настройки промежуточной среды для большинства проектов. Подготовьте процесс к вашим конкретным потребностям.

Поэтому без дальнейших церемоний, давайте уже приступим.


Создание сервера

Создание промежуточного окружения напрямую зависит от вашего производственного окружения.

Существует множество различных операционных систем, которые вы можете запускать на сервере. Fortrabbit запускает Debian Squeeze на своих серверах, и поскольку мы пытаемся их сопоставить, я решил запустить его также.

Я воспользуюсь Vagrant, чтобы настроить это. Не беспокойтесь, если вы никогда не использовали Vagrant; мы не будем делать ничего сложного. Убедитесь, что у вас установлен VirtualBox и Vagrant (Vagrant - это CLI для VirtualBox, поэтому требуется VirtualBox).

Vagrant принимает виртуальный снимок операционной системы в качестве базового «бокса», и затем вы можете создавать несколько виртуальных машин из этого образа. Итак, сначала нужно загрузить базовое поле для Debian Squeeze. Я не совсем уверен, откуда моя копия, поэтому я загрузил ее в DropBox для загрузки и использования. Чтобы установить, откройте окно терминала и введите:

Это добавляет бокс в Vagrant с именем «debian». Теперь мы можем создать экземпляр этого бокса для нашего промежуточного окружения. Сначала создадим новую папку:

Затем создайте конфигурационный файл Vagrant, введя:

Это создает файл конфигурации с именем «VagrantFile», который содержит все настройки для вашего сервера. Это выглядит весьма громоздко, когда вы его открываете, но большинство строк - это комментарии. Вам нужно только раскомментировать строку, в которой говорится: config.vm.network: bridge. Удаление всех остальных комментариев оставляет вам файл, который выглядит так:

Эти параметры говорят Vagrant о создании новой виртуальной машины на основе нашего базового блока Debian Squeeze. Затем он устанавливает сетевой режим в « bridged». Виртуальная машина с мостовой сетью отображается как новая физическая машина для вашего маршрутизатора, поэтому она автоматически получает свой собственный IP-адрес. Это позволяет получить доступ к устройству с любого устройства в сети (возможно, вне сети, если вы настроите маршрутизатор).

Теперь мы можем запустить нашу виртуальную машину с помощью команды: «vagrant up» (без кавычек).

Вы должны увидеть вывод Vagrant, создающий вашу виртуальную машину. Если ваш компьютер имеет несколько сетевых адаптеров, подключенных к сети, Vagrant предложит вам выбрать NIC для моста.

Мы будем использовать SSH для входа в систему, но нам нужно будет использовать встроенную в систему Vagrant команду «vagrant ssh» для входа. Согласно лучшим практикам Vagrant, все боксы должны иметь пользователя с именем «vagrant» с паролем, как для root, так и для vagrant, «vagrant». Пользователь vagrant добавляется как пользователь sudo, которому не нужно вводить пароль, поэтому вы можете напрямую использовать команды sudo.

Давайте перейдем и настроим программное обеспечение сервера.


Программное обеспечение

Настройка Fortrabbit включает в себя:

  • Apache 2.2
  • PHP 5.4
  • Composer

Кроме того, они используют репозиторий dotdeb для установки основной части. Для тех, кто незнаком, dotdeb - это проект Гийома Плессиса, который устанавливает самые современные версии популярных пакетов веб-серверов.

Мы готовы начать. Убедитесь, что окно терминала открыто и вы залогинены на сервере через SSH. Во-первых, добавьте dotdeb repo в APT (менеджер пакетов), добавив новый файл в каталог sources.d:

Это открывает новый файл с именем dotdeb.list в vim (текстовый редактор). Имя не важно, потому что все файлы в этом каталоге считываются в APT. Нам нужно добавить четыре строки в этот файл. Если вы никогда не использовали VIM, просто введите «i», чтобы войти в режим вставки и скопируйте/вставьте следующие четыре строки:

Для сохранения нажмите клавишу esc и введите: wq. Это команда сохранить изменения и выйти, что в основном означает сохранение и выход.

Нажатие Enter сохраняет файл и возвращает вас в командную строку.

Теперь мы добавили репозитории, но нам еще нужно добавить подпись, прежде чем мы сможем их использовать. Чтобы добавить ключ GNU, введите следующее:

Это загружает ключ dotdeb и добавляет его как подписанный источник. Теперь обновите APT, чтобы вытащить новый пакет, набрав:

Это может занять около минуты, но у вас будут все пакеты dotdeb, перечисленные в APT, когда выполнится команда. Благодаря тому, как dotdeb настроен и как загружаются зависимости APT, мы можем одновременно установить Apache и PHP, набрав:

С помощью этой отдельной строки APT устанавливает и настраивает Apache2 и PHP5. Если вы используете дополнение Memcache Fortrabbit, вы можете установить его с помощью:

Но я не собираюсь касаться memcache в нашем примере в этой статье.

Теперь нам нужно установить расширения, которые использует Fortrabbit. Выполните следующую команду:

Последнее, что нам нужно установить, это Composer. Я собираюсь установить его глобально, потому что мы будем использовать его в нескольких разных местах. Команды для глобальной установки Composer:

Первая команда загружает и выполняет установку; вторая команда перемещает Composer в папку bin, чтобы мы могли использовать ее без объявления пути. Перейдем к конфигурации.


Настройка Apache

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

Начнем с виртуального хоста.

Я собираюсь продолжать использовать vim, но знаю, что если вы хотите работать в своих собственных программах, вы можете скопировать и вставить или сохранить его в папке staging_server, созданной на вашем компьютере.

Эта папка шарится на вашу виртуальную машину, и вы можете получить доступ к файлам в корневом каталоге vagrant. Затем вы можете использовать: sudo cp /vagrant/file newfile или sudo mv /vagrant/filee newfile для копирования или перемещения файлов соответственно.

Чтобы создать новый виртуальный хост, нам нужно создать файл в каталоге /etc/apache2/sites-available/. Чтобы сделать это с помощью VIM, введите следующее:

Внутри введите следующее (помните, чтобы нажать «i» для режима вставки):

Первая строка объявляет виртуальный хост, который прослушивает запросы на любом IP-адресе на порту 80. Затем мы устанавливаем адрес электронной почты администратора и имя сервера. Адрес электронной почты предназначен для сообщений об ошибках, а параметр имени сервера сообщает Apache, когда он читает этот виртуальный хост. Регулярные виртуальные хосты работают с IP-адресами. Например, каждый vhost прослушивает другой IP; так Apache различает их.

Поскольку у вас, вероятно, есть только один IP-адрес, мы можем использовать виртуальные хосты на основе имен, позволяя вам указать другое имя на одном IP-адресе.

В нашем примере любые запросы, направленные на demo.dev, собираются этим виртуальным хостом.

Следующая строка устанавливает корневую папку документа. Здесь Apache извлекает файлы для этого vhost. Выражения внутри директивы Directory устанавливают разрешения для этого vhost. Я не буду вдаваться в подробности, но мы сначала задали параметры директорий для Apache, затем устанавливаем, что можно переопределить в файле .htaccess, и, наконец, мы установили, кто может получить доступ к сайту (каждый может в нашем случае).

Последние две строки говорят Apache, как назвать файл лога и что писать в этот лог. Наш файл лога называется demo.log в папке логов Apache, расположенной в /var/log/apache2/ на этой виртуальной машине.

Чтобы включить этот vhost, введите следующее:

Это создает символическую связь между файлом в папке sites-available с файлом в папке sites-enabled. После запуска этой команды вам будет предложено перезапустить Apache. Вы получите сообщение об ошибке, если попытаетесь перезапустить Apache, потому что мы не создали каталог сайта. Это легко поправить, создав папку demo, на которую мы ссылались в файле vhost:

Мы не хотим, чтобы пользователь root имел собственную папку, поэтому измените ее на пользователя vagrant с помощью команды chown:

Теперь перезапустите Apache:

Теперь наш новый сайт должен быть полностью функциональным. Следующий шаг - настроить GIT.


Немного Git магии

Убедитесь, что вы находитесь в домашнем каталоге, набрав cd ~. Создайте новую папку для репо: mkdir demo.git, перейдите в папку и инициализируйте новый, пустой репозиторий GIT:

Пустой репо является стандартным репо без рабочего каталога. Если вы хотите узнать больше о GIT, посмотрите видеоролик Andrew Burgess.

Теперь нам нужна возможность пушить код в папку сайта, и есть много способов сделать это. Но мне нравится делать вещи как можно ближе к сервису, которому я подражаю. Вот картина процесса git fortrabbit,  взятого с их сайта:

Вы можете видеть, что процесс push проходит через три этапа. Он отображает сообщение об обновлении при его подключении и развертывает сайт в каталоге. Заключительный шаг устанавливает все, если сообщение фиксации изменений содержит ключевые слова «[trigger: composer]». Затем, после завершения этих трех шагов, вам будет отображено «>> All Done

Прежде чем создавать хуки, я хочу поговорить о цветах.

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


Цвета в терминале

Терминалы поставляются с шестнадцатью цветами ANSI, которые можно настроить и использовать на терминале. Вот изображение экрана настроек iTerm2, показывающего шестнадцать цветовых слотов:

Вы можете получить к ним доступ в терминале, набрав escape-символ, за которым следует открытая квадратная скобка, а затем код цвета. Вы можете видеть на этом изображении, что цвета разделены на две строки: одна с надписью «Обычный», а другая «Яркая». Кодами нормальных цветов являются числа 30-37, за которыми следует буква «m», а яркие цвета - от 90-97, а затем m. Вы можете проверить это в окне терминала с помощью echo. Чтобы создать escape-символ, введите ctrl-v, а затем ctrl- [. Вы получите символ, который выглядит как ^[, но он не будет работать, если вы просто наберете «^[» (shift-6, а затем откройте квадратную скобку). Поэтому в окне терминала введите:

Опять же, первый ^[ не был напечатан, но был создан с помощью ctrl-v, а затем ctrl-[. Код символа 0m является кодом сброса; он удаляет все форматирование. Это связано с тем, что цветовые коды не заканчиваются после следующего слова, они продолжаются до тех пор, пока они не получат другой код.

Если все сделано правильно, приведенный выше код выводит слова «hello world» красным цветом (если только этот слот не установлен на другой цвет).

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


Создание хуков

Если вы еще раз взглянете на скриншот Fortrabbit, вы увидите, что перед обновлением репо отображается сообщение «Шаг 1: Обновление репозитория». Чтобы сделать все правильно, мы должны поместить это сообщение в хук pre-receive, который выполняется до обновления репо. В окне терминала введите:

Это открывает хук для редактирования. Добавьте следующий код:

Первая строка сообщает ОС, что это файл PHP и запускать его как таковой. Затем мы назначаем цвет и последовательность сброса для переменных. Последний шаг делает echo строки.

Следующий хук немного сложнее, потому что он обрабатывает остальные действия. Мы сделаем это шаг за шагом, поэтому сохраните первый хук (: wq) и откройте следующий:

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

Это всего лишь набросок для работы. Первое, что нам нужно добавить, - это функция, чтобы вытащить новую версию репо в каталог сайта. Традиционно, я бы просто напечатал следующее, если бы я был в папке:

Вы можете использовать что-то вроде git pull, но это может привести к ошибкам. Если файл был напрямую изменен или если вы пропустили коммит, то git pull не позволит вам вытащить или удалить ваши необработанные файлы.

Это две простые команды, но вы получите сообщение об ошибке, если попытаетесь запустить их из хука.

GIT устанавливает некоторые переменные среды до запуска хуков. Вы можете обойти это одним из двух решений, и я покажу вам оба.

Первое - переопределить переменные окружения, передавая информацию напрямую. Второй полностью стирает переменные. Я буду использовать первый вариант в этом примере и второй вариант, когда мы будет работать над триггером композера. Замените комментарий, который я добавил выше, где он говорит «TODO Deploy to site» следующим:

Это переопределяет переменные среды и вызывает вышеупомянутые функции. Добавленный параметр -q указывает, что GIT является «тихим», запрещая GIT выводить любые сообщения.

Теперь нам нужно проверить триггер Composer. Давайте разделим это на два шага. Сначала мы проверяем триггер, а затем выполняем composer. Замените второй комментарий TODO следующим:

Первая строка извлекает сообщение фиксации с помощью команды git log и передает в специальном формате, чтобы исключить любую дополнительную информацию. Затем мы проверяем, имеет ли строка специальное триггерное слово и выводим третий шаг и OK-сообщение. Мы проверяем ключевое слово Composer, но вы можете реализовать несколько ключевых слов для других функций, таких как: migrate в Laravel или выполнить модульные тесты. Добавьте что-нибудь, чтобы улучшить рабочий процесс.

Последний шаг - выполнить composer. composer имеет две команды: composer install и composer update.

Команда install не читает файл composer.json, если находит composer.lock, и поскольку некоторые люди могут добавить composer.lock в свой файл .gitignore, безопаснее запускать composer update (он всегда смотрит на файл composer.json ,

Вторая проблема заключается в том, что иногда Composer использует GIT для загрузки пакетов, и эти попытки терпят неудачу из-за переменных среды. Итак, вот хорошее место, чтобы просто удалить переменную окружения «GIT_DIR». Замените комментарий для запуска Composer следующим образом:

Этот код прямолинейный. Мы перемещаем процесс PHP в папку сайта, а затем удаляем переменную окружения GIT_DIR, чтобы функция GIT функционировала нормально. Последняя строка выполняет Composer.


Связывание свободных концов

У нас теперь есть настройка обоих хуков, но мы не совсем готовы начать использовать наш сервер. Во-первых, нам нужно сделать эти крючки исполняемыми:

Затем создайте репозиторий GIT в папке сайта. Мы получим ошибку, если попытаемся запустить наши хуки, потому что папка сайта не является репозиторией GIT. Чтобы исправить этот введите:

Первые две строки создают репо, а затем мы добавляем голый репозиторий в качестве источника этого репо.

Вы также должны добавить свой открытый ключ к авторизованным хостам этого сервера, чтобы вы могли получить доступ к серверу через GIT без пароля. Вы можете скопировать свой открытый ключ, набрав на своем компьютере (а не виртуальной машине):

Затем просто вставьте его на сервер в файл ~/.ssh/authorized_keys:

Просто добавьте его в файл, но оставьте все, что уже внутри.

Затем нам нужно добавить IP-адрес этого сервера в наш файл hosts. Чтобы найти IP-адрес, введите:

Это показывает IP-адрес всех сетевых устройств на этой виртуальной машине. Добавьте тот, который подключается к вашей локальной сети. Если вы не можете определить, какой IP-адрес использовать, скопируйте и вставьте его в свой браузер. Если он подключается, у вас есть правильный IP-адрес.

Возьмите IP-адрес и добавьте его в файл хостов вашего компьютера (а не файл хостов VM). Файл hosts на Mac находится по адресу etc/hosts:

Затем добавьте следующую строку:

Если это будет возможно, вы сможете перейти на http://demo.dev в своем браузере. Находясь на вашем Mac, создайте папку и инициализируйте репозиторий GIT:

Если все пойдет хорошо, вы должны увидеть ответ от наших хуков GIT. Переход к http://demo.dev должен привести к появлению сообщения «Hello World» в вашем браузере.


Вывод

Таким образом, вы можете создать промежуточное окружение, которое имитирует функциональность типичного PAAS. Если у вас возникли проблемы с этим, или вам нужно настроить несколько промежуточных сред, я создал сценарий, который полностью автоматизирует процесс. Для получения дополнительной информации вы можете посетить stagr.gmanricks.com.

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.