Итак, вы только что создали красивое веб-приложение и планируете разместить его в Интернете. Это можно сделать разными способами. В этой статье я хотел бы рассказать об одном подходе к развертыванию вашей серверной системы на рабочем сервере. Мы рассмотрим следующие шаги на примере приложения 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. Совершенно другой подход использует докер, который действует как легкая виртуальная машина. Идея заключается в том, чтобы развернуть всю среду как виртуальную машину. Проверь их!