Статьи

Развертывание приложения Laravel с использованием Capistrano

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

Эта статья была обновлена ​​до Capistrano 3. Более подробную информацию о новой версии можно найти на веб-сайте Capistrano.

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

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

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

Ваш удаленный сервер должен предоставить доступ по SSH . Он также должен был установить все необходимые зависимости для вашего проекта, такие как GIT, PHP, MySQL, Composer, … Кроме того, вам не нужно никакого дополнительного программного обеспечения на вашем рабочем сервере.

Чтобы установить и использовать capistrano, вам нужен как минимум Ruby 1.9 (если у вас не установлен Ruby, я рекомендую установить его с помощью rbenv ). Чтобы установить capistrano, вам просто нужно запустить:

1
$ gem install capistrano

Так почему капистрано, спросите вы. Как всегда, есть много способов выполнить задачу, но в моем случае capistrano всегда казался самым простым и гибким подходом. Вы можете настроить его под свои нужды, и существует множество плагинов, которые снова упростят вашу работу.

Capistrano — это утилита и среда для параллельного выполнения команд на нескольких удаленных компьютерах через SSH. Он использует простой DSL (частично заимствованный из Rake), который позволяет вам определять задачи, которые могут быть применены к машинам в определенных ролях. Он также поддерживает туннелирование соединений через некоторые шлюзы, что позволяет выполнять операции за VPN и межсетевыми экранами.

Теперь у нас есть все, что нам нужно, поэтому давайте настроим наши параметры развертывания. Но сначала мы должны создать папку на удаленном сервере, куда должны быть развернуты все файлы. Войдите на свой сервер с SSH и создайте папку. Общее место это /var/www/ . Итак, давайте сделаем это:

1
2
$ sudo mkdir /var/www/my-app
$ sudo chown -R username:group /var/www/my-app

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

1
2
$ cd my-project
$ cap install

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

01
02
03
04
05
06
07
08
09
10
.
├── Capfile
├── config
│  ├── deploy
│  │  ├── production.rb
│  │  └── staging.rb
│  └── deploy.rb
└── lib
    └── capistrano
        └── tasks

Capfile похож на точку монтирования для capistrano, но сейчас нам просто нужно отредактировать config/deploy.rb и config/deploy/production.rb . Первый файл отвечает за все этапы сборки, второй файл представляет собой «этап». У вас может быть несколько этапов, таких как производство, подготовка, тестирование … В каждом файле конфигурации этапа вы можете указать свои серверы. Давайте откроем эти два файла в вашем любимом текстовом редакторе и заменим содержимое следующими фрагментами. Мы пройдем код позже.

Начнем с config/deploy/production.rb :

1
2
3
4
5
6
role :app, %w{[email protected]} # EDIT your ssh username and server ip address
 
set :ssh_options, {
    auth_methods: %w(password),
    password: «» # EDIT your ssh password
}

Далее мы config/deploy.rb :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
set :application, «Your app name» # EDIT your app name
set :repo_url, «https://github.com/laravel/laravel.git» # EDIT your git repository
set :deploy_to, «/var/www/my-app» # EDIT folder where files should be deployed to
 
namespace :deploy do
     
    desc «Build»
    after :updated, :build do
        on roles(:app) do
            within release_path do
                execute :composer, «install —no-dev —quiet» # install dependencies
                execute :chmod, «u+x artisan» # make artisan executable
            end
        end
    end
 
    desc «Restart»
    task :restart do
        on roles(:app) do
            within release_path do
                execute :chmod, «-R 777 app/storage/cache»
                execute :chmod, «-R 777 app/storage/logs»
                execute :chmod, «-R 777 app/storage/meta»
                execute :chmod, «-R 777 app/storage/sessions»
                execute :chmod, «-R 777 app/storage/views»
            end
        end
    end
 
end

Теперь вы должны поместить свои данные в каждую строку с комментарием #EDIT (IP-адрес, git-репо, ssh-пользователь, пароль и т. Д.). :deploy_to должна быть папкой, которую мы только что создали. Ваш веб-сервер (Apache, Nginx, …) должен указывать на /var/www/my-app/current/public .

В блоке namespace :deploy файла deploy.rb вы указываете, что на самом деле должно происходить при каждом развертывании. Итак, есть две задачи. В задаче build мы устанавливаем все ваши зависимости PHP, как вы привыкли к ним во время разработки. После этого мы делаем исполняемый файл ремесленным, чтобы использовать его для миграций. В задаче restart мы фиксируем разрешения для папок хранилища.

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

1
2
3
4
5
6
7
8
deploy:starting — start a deployment, make sure everything is ready
deploy:started — started hook (for custom tasks)
deploy:updating — update server(s) with a new release
deploy:updated — updated hook
deploy:publishing — publish the new release
deploy:published — published hook
deploy:finishing — finish the deployment, clean up everything
deploy:finished — finished hook

Каждое развертывание хранится в /var/www/my-app/releases/ . Встроенная задача deploy:publishing создает символическую ссылку недавнего развертывания в current папке. Таким образом, вы можете сохранять старые версии и переключать версии, не переходя в автономный режим ни на секунду. Когда эта задача была выполнена, ваша самая новая версия находится в сети.

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

После этих основных этапов настройки мы готовы к нашему первому развертыванию.

Так что это момент, которого вы ждали. Самое сложное сделано. На данный момент каждый раз, когда вы хотите доставить обновления вашего приложения, вам просто нужно выполнить следующую магическую команду. Capistrano прочитает ваши config/deploy.rb config/deploy/production.rb и выполнит каждую задачу. Если задача не выполнена, развертывание будет остановлено, а старая версия все еще будет в сети.

1
$ cap production deploy

Вы увидите кучу текстового вывода и через некоторое время (в зависимости от вашего сервера) все должно быть завершено. Это было легко, не так ли?

Примечание. Пока мы только настраиваем наш производственный этап, но вы можете заменить production этап другим этапом, например, своим тестовым сервером, и запустить $ cap staging deploy .

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

1
2
3
4
set :ssh_options, {
    keys: %w(«/path/to/your/key.pem»), # EDIT your ssh key
    auth_methods: %w(publickey)
}

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

01
02
03
04
05
06
07
08
09
10
desc «Build»
after :updated, :build do
    on roles(:app) do
        within release_path do
            execute :composer, «install —no-dev —quiet» # install dependencies
            execute :chmod, «u+x artisan» # make artisan executable
            execute :php, «artisan migrate» # run migrations
        end
    end
end

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

Иногда вы развертываете нерабочую версию своего приложения, и вам необходимо отменить эти изменения. У Capistrano есть встроенная функция, которая называется «откат». Просто беги:

1
$ cap production deploy:rollback

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

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