Не секрет, что у каждого разработчика есть свой арсенал инструментов, позволяющий ему так или иначе сделать свою жизнь проще. Сегодня мы поговорим о таком инструменте, как Foreman. Используя его, вы можете объявить в одном месте все процессы, которые необходимы для запуска вашего приложения. Для этого используется так называемый Procfile, который выглядит как-то так:
web: mono ./awesome-app --port $PORT api: node ./api.js -p $PORT worker: bundle exec rake resque:work QUEUE=* habr: bundle exec ./bin/thin -a localhost -p $PORT
Как видите, все довольно просто, в каждой строчке файла содержится по названию типа процесса и строка для его запуска.
▌Установка и использование
Чтобы начать им пользоваться, достаточно его установить, воспользовавшись для этого вашим системным пакетным менеджером или с помощью rubygems:
$ gem install foreman
Если ваше приложение использует Foreman, то его запуск, при наличии готового Procfile, будет выглядеть довольно просто:
$ editor .env $ foreman start
Вот как выглядит запуск всех процессов:
Foreman установит необходимые переменные окружения, запустит все процессы, ассоциированные с вашим приложением, а также отобразит вывод стандартных потоков (stdout и stderr) каждого. Как можно заметить, имена процессов раскрашиваются в различные цвета, что позволяет визуально их отличить. Значение переменной $PORT
автоматически устанавливается Foreman отдельно для каждого запускаемого процесса.
Необходимо заметить, что ваши процессы не должны сами демонизироваться, потому как Foreman не сможет в таком случае управлять циклом их запуска-остановки.
▌Развертывание
Foreman может экспортировать ваши задания на запуск в upstart, а также в классический юниксовый init (впрочем, так делать не рекомендуется), bluepill и runit. Поддержка systemd также на подходе.
Экспорт в upstart
$ foreman export upstart /etc/init [foreman export] writing: /etc/init/testapp.conf [foreman export] writing: /etc/init/testapp-web.conf [foreman export] writing: /etc/init/testapp-web-1.conf [foreman export] writing: /etc/init/testapp-worker.conf [foreman export] writing: /etc/init/testapp-worker-1.conf [foreman export] writing: /etc/init/testapp-habr.conf [foreman export] writing: /etc/init/testapp-habr-1.conf
После экспорта в upstart, становятся доступными следующие команды:
$ start testapp $ stop testapp-habr $ restart testapp-worker-1
Экспорт в inittab
$ foreman export inittab # ----- foreman testapp processes ----- TE01:4:respawn:/bin/su - testapp -c 'PORT=5000 mono ./awesome-app --port $PORT >> /var/log/testapp/web-1.log 2>&1' TE02:4:respawn:/bin/su - testapp -c 'PORT=5100 bundle exec rake resque:work QUEUE=* >> /var/log/testapp/worker-1.log 2>&1' TE03:4:respawn:/bin/su - testapp -c 'PORT=5200 bundle exec ./bin/thin -a localhost -p $PORT >> /var/log/testapp/habr-1.log 2>&1' # ----- end foreman testapp processes -----
▌Возможности
Параллелизм
Foreman позволяет контролировать число запускаемых экземпляров каждого типа процесса, что тоже перекликается с идеей масштабирования с помощью процессов. Кстати говоря, данный подход уже успел полюбиться пользователям Heroku.
# запустить по одному экземпляру процесса «worker», четыре процесса «habr» и два «web» $ foreman start -c habr=4 -c web=2
# не запускать процесс «worker» $ foreman start -c worker=0
Переменные окружения
Существует подход, постепенно завоевывающий популярность у разработчиков, заключающийся в том, чтобы хранить конфигурацию приложения в переменных окружения. Foreman и здесь не остался в стороне и позволяет все упростить.
Для того, чтобы использовать эту возможность, в директории проекта необходимо создать файл .env
, содержащий перечисление всех необходимых значений переменных окружения, например:
APP_ENV=production DATABASE_URL=mysql://user:password@localhost/table
Хорошей практикой здесь будет создание и постановка на учет в систему контроля версий файла sample.env
, который будет содержать пример конфигурации вашего приложения. Таким образом, для его развертывания в новом окружении, необходимо будет скопировать файл sample.env
в .env
, отредактировать его в соответствии с вашим окружением, после чего запустить Foreman.
Вы также можете попросить Foreman запустить процессы с переменными окружения из другого файла:
$ foreman start -e development.env
Назначение портов
По умолчанию Foreman назначает порты процессам, начиная с 5000, и делает это блоками в 100 штук на каждый тип процесса, причем в том порядке, в котором они перечислены в Procfile.
Скажем, для Procfile из примера выше, процесс web.1 получит 5000-ый порт, worker.1 — 5100-ый, а habr.1 — 5200-ый. Если вы запустите два процесса habr, то процессу habr.2 будет назначен порт с номером 5201.
Вы также можете выбрать стартовый порт вручную, например:
$ foreman start -p 7000
▌Вместо заключения
Как видите, в использовании таких вот хороших практик нет абсолютно ничего сложного, а времени данная штука позволяет сэкономить достаточно, чтобы оказаться в арсенале продвинутого разработчика.
Для получения более подробной информации обо всех доступных возможностях, вы можете обратиться к документации, а также на страницу репозитория проекта на github.
ссылка на оригинал статьи http://habrahabr.ru/post/176947/
Добавить комментарий