В этом рассказе я собираюсь записать себе на память (а может и кому-то пригодится) процесс установки и деплоя rails приложения на сервер. Или даже не так, рассказ о том как настроить сервер за 10 минут пренебрегая всеми правилами безопасности. На самом деле если хочется быстрее сервер и меньше возни, то удобнее конечно взять Heroku. Или говорят Docker тоже в этом плане удобен. Так что будем считать что этот текст вот совсем для новичков.
В качестве сервера Debian 8 64 bit, приложение на Rails 5 и база данных конечно Postgres.
Шаг 1 – локальное окружение
Установка локального окружения. Так как у меня Mac, то и указания будут именно к этой системе.
ruby
Установить rvm , и уже при помощи rvm установка последней версии ruby.
1 |
rvm install ruby --latest |
postgres
Для Mac есть замечательная утилита postgres.app, которая решает вообще все проблемы с обслуживанием и установкой Postgres. Серьёзно, просто ставьте её и поехали дальше. Уже на сервере настроим полноценный Postgres установленный при помощи apt. А пока Postgres.app
rails
К этому моменту Вы можете ставить ruby-гемы и пожалуй пора парочку установить.
1 2 |
gem install rails bundler rails new AwesomeApp --database=postgresql |
rails + postgres
Как я уже говорил Postgres.app снимает все хлопоты по настройке Postgres. Откройте свежесозданный проект в текстовом редакторе, найдите файл config/database.yml и отредактируйте его так:
1 2 3 4 |
default: &default adapter: postgresql encoding: unicode user: postgres |
В консоли откройте папку приложения и выполните следующую команду:
1 |
rake db:create |
Убедитесь что всё работает
1 |
rails s |
Локальное окружение готово. Давайте добавим ему немного функциональности.
Шаг 2
На самом деле функциональности будет минимум, всё что надо будет сделать – запустить rails-scaffolder.
1 2 |
rails generate scaffold Post title:string content:text rake db:migrate |
Можно проверить функциональность локально, запустите rails s, и откройте в браузере адрес http://localhost:3000/posts
Если вы ещё не сделали git-проект, то сейчас самое время. Созданный репозитарий отправьте в любое git-хранилище. Мне нравится Gitlab.
Шаг 3 – настройка сервера
Регистрируйте сервер, площадка на ваш выбор, я буду использовать simple cloud. Чтобы было удобнее добавьте свой ssh ключ в authorized_keys на сервере, но это необязательно.
Начать, наверное, следует с обновления сервера
1 2 |
apt-get update && apt-get upgrade apt-get install git |
Далее установить rvm и postgres.
rvm – установка
1 2 3 4 |
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 \curl -sSL https://get.rvm.io | bash -s stable rvm install ruby --latest gem install bundler |
nvm – установка
Для компиляции ассетов на сервере необходим node, проще всего поставить при помощи nvm (node version manager). Установка описана здесь. На момент написания выглядело это так:
1 2 3 |
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash source ~/.bashrc nvm install node |
Postgres – установка
1 |
apt-get install postgresql libpq-dev |
У меня были проблемы с локалями, пришлось в ~/.bashrc внести эти строки
1 2 |
export LC_ALL=en_US.utf8 export LANGUAGE=en_US.utf8 |
Применить эти настройки source ~/.basrch
, и выполнить dpkg-reconfigure locales
, выбрав en_US.UTF-8
.
Postgres – настройка
Сейчас будет совершенно преступление, нет серьёзно. Как водится true-программисты на способ ниже будут сильно ругаться и возмущаться. Для того чтобы упростить доступ к БД, мы сделаем беспарольный вход от имени пользователя postgres. Ещё раз зачему, принято (и наверное так и надо делать), на каждый проект отдельный пользователь, свои пароли и прочее. Но если не терпится, то вот рецепт.
Пропишите в настройках доступка к postgres, которые можно найти примерно по такому адресу /etc/postgresql/9.4/main/pg_hba.conf
следующую строчку:
1 |
host all postgres 127.0.0.1/32 trust |
И перезапустите postgres – /etc/init.d/postgresql restart
. Можно протестировать, что всё прошло хорошо, попробуйте авторизоваться в интерактивную консоль psql -U postgres -h 127.0.0.1
В будущем на сервере понадобится созданная база данных. Создайте её сейчас:
1 2 |
psql -U postgres -h 127.0.0.1 CREATE DATABASE <em>database_name</em>; |
Nginx – установка
1 |
apt-get install nginx |
Для запуска приложения есть все необходимые ингредиенты – ruby и БД.
Capistrano
Перейдём обратно в локальный проект, это необходимо чтобы настроить Capistrano (кстати, Mina тоже ok). Инструмент для отправки приложения на сервера.
В Gemfile раскомментируйте строку gem 'capistrano-rails', group: :development
и установите. После установки будут доступны новые команды, список доступен из консоли при помощи команды cap -T
Начальная инициализация capistrano – cap install
. Будет добавлено несколько файлов.
Capistrano – настройка
Ещё один камень в огород безопасности, мы будем использовать пароль к репозитарию в настройках capistrano.) Откройте config/deploy.rb
, дополните адресом git-репозитария, с логином и паролем.
1 |
set :repo_url, 'https://<em>login:пароль</em>@gitlab.com/Rukomoynikov/just-testing-for-blog.git' |
Укажите папку на сервере в которую будет скопировано приложение
1 |
set :deploy_to, '/var/www/<em>awesome-app</em>' |
В файл /config/deploy/production.rb
внесите данные о вашем сервере, например так:
1 |
server '89.223.28.89', user: 'root', roles: %w{app db web} |
Перед выполнением cap production deploy
, необходимо отправлять свои изменения в git-репозитарий. Сейчас если из папки проекта запустить cap production deploy
, то всё должно пройти гладко. Ну точнее проект просто будет скопирован в папку на сервере. Пока что ни установки гемов, ни миграций. Всё впереди.
Capistrano – настройка 2
У Capistrano есть ряд дополнительных модулей упрощающих деплой приложения. Добавьте их в Gemfile.
1 2 3 4 5 6 7 |
group :development do gem 'capistrano', require: false gem 'capistrano-rvm', require: false gem 'capistrano-rails', require: false gem 'capistrano-bundler', require: false gem 'capistrano3-puma', require: false end |
Далее замените содержимое в Capfile, подключая все эти модули
1 2 3 4 5 6 7 8 |
# Load DSL and Setup Up Stages require 'capistrano/setup' require 'capistrano/deploy' require 'capistrano/rails' require 'capistrano/bundler' require 'capistrano/rvm' require 'capistrano/puma' |
# Loads custom tasks from `lib/capistrano/tasks’ if you have any defined.
Dir.glob(‘lib/capistrano/tasks/*.rake’).each { |r| import r }
В /config/production.rb раскомментируйте строку set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'public/system')
и добавьте
1 2 3 4 5 6 7 8 9 10 |
namespace :puma do desc 'Create Directories for Puma Pids and Socket' task :make_dirs do on roles(:app) do execute "mkdir #{shared_path}/tmp/sockets -p" execute "mkdir #{shared_path}/tmp/pids -p" end end before :start, :make_dirs end |
Если теперь выполнить cap production deploy
, вы увидите как установятся все гемы, пройдут миграции, и сервере puma запустится в режиме демона.
Capistrano – настройка nginx
Так как на сервере Nginx уже установлен, надо добавить проект в sites-enabled папку nginx.
Для этого добавьте в Capifile строку
1 2 3 4 5 6 |
Выполните в консоли <pre class="lang:default decode:true "> rails g capistrano:nginx_puma:config cap production puma:config cap production puma:nginx_config |
Это создаст и отправит необходимые конфигы на сервер.
Кажется, всё.
Пригодилось. Спасибо за статью