Привет читатели. Если вам надоело постоянно устанавливать на новых машинах с разными ОС одно и тоже rails окружение с десятками зависимостей и кучей пакетов, то предлагаю вам ознакомится с интересным решением от rails-core разработчиков. На вашей хост-машине нужно иметь лишь Vagrant и Virtual Box.
Проблема
Так случилось, что в нашей компании возникла проблема установки всего необходимого окружения на разные оперирующие системы, Mac OS X и Linux в частности.
Казалось бы это тривиальная задача под Linux, немного сложнее под Mac, но всё оказалось еще сложнее, т.к. проект у нас не стандартный. Эдакая адская смесь дрюпала и рельсов. Проект как раз в процессе мигрирования на рельсы. И подружить это всё под маками оказалась не такой простой задачей для фронт-энд программистов, не искушенных в настройке окружения. Ставить убунту или другой линукс они категорически отказывались.
Решение
Ну что ж. Как самое быстрое решение был выбран такой замечательный проект как rails-dev-box
Этот проект автоматизируют установку для разработки ядра Ruby on Rails. Для наших нужд это подходит как нельзя кстати.
Нам потребуется иметь установленный Virtual Box и руби джем Vagrant. Оба установить достаточно легко.
После этого нам лишь нужно выполнить пару команд:
host:~$ git clone https://github.com/rails/rails-dev-box.git
host:~$ cd rails-dev-box
host:~$ vagrant up
Всё. После чего можно зайти по ssh в уже настроенную ubuntu:
vagrant ssh
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic-pae i686)
...
vagrant@rails-dev-box:~$
В витуальной системе уже установлено всё что надо, за исключением php и веб-сервера:
- Git
- RVM
- Ruby 1.9.3 (binary RVM install)
- Bundler
- SQLite3, MySQL, and Postgres
- System dependencies for nokogiri, sqlite3, mysql, mysql2, and pg
- Databases and users needed to run the Active Record test suite
- Node.js for the asset pipeline
- Memcached
Установку php и nginx мы не будем рассматривать, это выходить за пределы данной статьи. Это очень просто сделать в линуксе.
Нам лишь осталось скопировать проект в папку с rails-dev-box на хост системе и запустить rails server из под vagrant:
vagrant ssh
cd /vagrant/my_project
bundle exec unicorn -E development -D
Виртульная система и хост-системы видят одну и ту же папку, что позволяет нам редактировать её своим любимым редактором, а страницы открывать как и раньше через http://localhost:3000
В случае с php нужно еще прокинуть порт 1080 (80 порт мы прокинуть не можем, т.к. тогда нам нужен будет рут доступ)
Это делается довольно просто. Нужно вписать в Vagrantfile лишь одну строку:
config.vm.forward_port 80, 1080
Каково было мое удивление, когда оказалось что страницы из Rails грузятся чуть ли не по минуте. Drupal работал как ни в чем не бывало. Скорость почти неотличима от родной файловой системы.
Оказалось, что VirtualBox Shared Folders, которые Vagrant использует по умолчанию, очень и очень медленные.
Бенчмарк из документации Vagrant:
VirtualBox Shared Folders: 5m 14s
Host File System: 10s
Native VM File System: 13s
NFS Shared Folders: 22s
NFS Shared Folders (warm cache): 14s
Как видно, нам ничего не остается как только использовать NFS. В Mac OS этот демон уже предустановлен. Установка в линуксе опять же банальна — нужно установить пакет.
После этого правим наш Vagrantfile, добавляем строки:
config.vm.share_folder "v-root", "/home/vagrant/shared-folder", ".", :nfs => true
config.vm.network :hostonly, "33.33.33.100"
Опция Host-only используется для создания второго виртуального адаптера, через него и будет работать nfs.
Теперь надо перезагрузить виртуальную машину и проект в виртуальной системе уже будет находиться в /home/vagrant/shared-folder
Запускаем юникорн и теперь видим что страницы загружаются с положенной скоростью.
Дополнительно
Связка Virtual Box и Vagrant работает замечательно. Вы можете написать дополнительные рецепты(используется puppet), чтобы автоматизировать всё вышеописанное, включая клонирование репозитория вашего проекта со стороннего сервиса, а также настройку конфигов nginx/apache, php, unicorn
Спасибо за внимание и приятной разработки.
Ссылки
rails-dev-box github source code
Vagrant and NFS Shared Folders
Автор: alex_bel