После того как сайт написан, встаёт вопрос о том как выложить его в интернет. Стандартный путь включает три пункта:

  1. Покупка домена
  2. Покупка хостинга и его настройка
  3. Деплой

Первый я пропущу (скоро мы его опишем в https://guides.hexlet.io), а вот про два других поговорим.

Deploy

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

  1. Код проекта скачивается на сервер (обычно через клонирование Git)
  2. Ставятся все необходимые зависимости
  3. Выполняется процесс сборки, например собирается фронтенд-часть
  4. Выполняются миграции. Миграции — SQL-скрипты, которые изменяют структуру базы данных
  5. Запускается новая версия кода

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

Deploy
Notification

Несмотря на разнообразие способов деплоя, есть одно важное правило общее для всех — деплоить можно только вперёд! Деплой нельзя «откатывать» (в первую очередь это касается миграций, но про базы мы пока не говорим). Если после или во время деплоя что-то пошло не так, то правильно деплоить снова, но предыдущую версию.

Кроме того, деплои можно классифицировать по способу обновления и отката:

  • Последовательное обновление — сервера обновляются по очереди
  • Сине-Зелёный деплой — полное дублирование инфраструктуры с подменой

Отдельно стоит сказать про канареечный релиз (canary release). При таком подходе переключение на использование новой версии происходит постепенно, сначала для небольшого процента пользователей, а затем и для всех

Способ деплоя сильно зависит от используемого хостинга и даже способа настройки серверного окружения. Выделяют следующие типы хостингов:

  • Виртуальный хостинг (Shared Hosting) — самый дешёвый способ размещать сайт в интернете. Такая услуга включает в себя доступ на сервер с уже настроенным программным обеспечением под конкретный стек, например Linux + PHP + MySQL. Этот способ подходит для самых простых сайтов и требует минимальной настройки.
  • VPS/VDS — наиболее сбалансированная услуга, в рамках которой предоставляется виртуальная машина. Плюс в том, что такой вид хостинга позволяет задействовать больше серверных мощностей: ЦПУ, память и диск. Предустановленного ПО нет, всё нужно делать самостоятельно. По сравнению с виртуальным хостингом вы не ограничены в правах и можете настраивать сервер, как вам угодно.
  • Выделенный сервер (Dedicated Server) — сервер (либо свой, либо арендованный). Такой хостинг требует больше всего участия, но зато вы получаете лучшее соотношение производительность/цена.
  • IaaS (Infrastructure as a Service) — инфраструктура как сервис. Вид хостинга, при котором большая часть возможностей представляется как сервис. Как пример Amazon Web Service (AWS).
  • PaaS (Platform as a Service) — платформа как сервис. Наиболее дорогой и самый автоматизированный способ из коробки по размещению сайтов. Выкладка сайта происходит буквально по команде git push. Кроме цены важно учитывать используемые технологии и подходы. PaaS обладает наибольшим числом ограничений по тому, что и как можно делать, но в обмен вы получаете не просто автоматизированный хостинг, но и платформу, которая автоматически «скейлится» (масштабируется) под нагрузку.

Все способы деплоя можно грубо разбить на две большие категории. Деплой на PaaS и деплой на все остальное.

PaaS

Самый простой способ начать деплоить. Большинство PaaS-хостеров имеют бесплатные планы, достаточные для выкладки учебных проектов. Из плюсов: не придётся покупать адрес, домен третьего уровня предоставляется бесплатно. Самое популярное PaaS-решение на текущий день — Heroku, у этого сервиса прекрасная документация, следуя которой можно быстро выложить свой первый сайт. Пошаговое руководство, описывающее выкладку сайта на PHP доступно по ссылке: https://devcenter.heroku.com/articles/getting-started-with-php. Heroku используется на Хекслете для JavaScript- и PHP-проектов.

$ heroku create
Creating sharp-rain-871... done, stack is cedar-14
http://sharp-rain-871.herokuapp.com/ | https://git.heroku.com/sharp-rain-871.git
Git remote heroku added

$ git push heroku master
remote: Building source:
remote:
remote: -----> PHP app detected
remote: -----> Bootstrapping...
remote: -----> Installing platform packages...
remote:        NOTICE: No runtime required in composer.json; requirements
remote:        from dependencies in composer.lock will be used for selection
remote:        - php (7.1.3)
remote:        - apache (2.4.20)
remote:        - nginx (1.8.1)
remote: -----> Installing dependencies...
remote:        Composer version 1.4.1 2017-03-10 09:29:45
remote:        Loading composer repositories with package information
remote:        Installing dependencies from lock file
remote:        Package operations: 12 installs, 0 updates, 0 removals
remote:          - Installing psr/log (1.0.2): Loading from cache
remote:          - Installing monolog/monolog (1.22.1): Loading from cache
...
remote:          - Installing symfony/twig-bridge (v3.2.7): Loading from cache
remote:        Generating optimized autoload files
remote: -----> Preparing runtime environment...
remote: -----> Checking for additional extensions to install...
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 14.8M
remote: -----> Launching...
remote:        Released v17
remote:        https://gsphpjon.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/gsphpjon.git
 + 264e577...4f2369c master -> master (forced update)

Самостоятельная работа

Выложите на Heroku тот код, который вы написали на Slim в течение этого курса.

Все остальное

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

Самая первая задача — настроить окружение. Если в виртуальном хостинге всегда есть набор предустановленных программ, то во всех остальных видах хостинга нет ничего, кроме голой операционной системы. Установка необходимого ПО такой же автоматизируемый процесс как процесс деплоя и у него есть даже собственное название — Управление конфигурациями (Configuration Management). Рекомендую использовать Ansible, популярное решение для настройки (На Хекслете есть соответствующий курс).

- hosts: all

  tasks:

    - lineinfile:
        create: yes
        regexp: ~/.local
        path: ~/.bash_profile
        line: "export PATH=$PATH:~/.local/bin"

    - name: install packages
      apt: pkg=python3-pip state=latest update_cache=yes
      tags: pip
      become: yes

    - pip:
        name: pip
        state: latest
      become: yes

Ключевое понятие Ansible — Playbook (плейбук). Это файл (или файлы) в формате YAML, в котором описывается, что нужно сделать на указанной машине. В каждом плейбуке используются готовые модули, поставляемые вместе с Ansible. Этих модулей сотни, с помощью них можно делать практически всё, начиная от установки программ и заканчивая настройкой сети и управления правами файловой системы. Ansible — универсальный инструмент, с его помощью можно не только настраивать окружение, но и собственно деплоить. Причём для деплоя есть готовый модуль — deploy helper.

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


Дополнительные материалы

  1. Среды разработки
  2. DevOps
  3. Непрерывное развертывание
  4. Terraform
  5. Ansible
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →