Как запустить приложение play2 на удаленной машине с помощью capistrano

Я пытаюсь развернуть приложение play2 с помощью capistrano, но не могу понять, как (повторно) запустить приложение play2 после успешного развертывания. Просто запуск «начала воспроизведения» приведет к зависанию процесса, ожидая, когда я нажму Ctrl + D

Я создал стартовый скрипт в корневой папке игрового приложения.

#!/bin/bash

nohup bash -c "/var/lib/play2/play start &>> /tmp/myapp.log 2>&1" &> /dev/null &

Это прекрасно работает, когда я запускаю это на сервере. Когда я пытаюсь вызвать это с моей локальной машины через ssh, это также работает. Но когда я использую capistrano, похоже, он ничего не делает. Моя конфигурация капистрано выглядит так:

namespace :deploy do

  task :restart do
    stop
    sleep 1
    start
  end

  task :start do
    run "cd #{current_release}/trip-api && ./start.sh"
  end

  task :stop do
    run "cd #{current_release}/trip-api && ./stop.sh"
  end
end

Как лучше всего запустить приложение play2 на удаленной машине? Как заставить его работать с капистрано?


person Jeroen Rosenberg    schedule 14.05.2012    source источник


Ответы (3)


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

Рекомендуемый способ - упаковать ваше приложение с помощью

play clean compile stage

А затем запустите его с

$ цель/начало

Чтобы остановить это, взгляните на документы:

Идентификатор процесса сервера отображается при начальной загрузке и записывается в файл RUNNING_PID. Чтобы убить работающий сервер Play, достаточно отправить SIGTERM в процесс, чтобы правильно завершить работу приложения.

В этом кратком руководстве по Openshift показан другой способ запустить игру как услугу и как прекратите.

в основном вы делаете что-то вроде этого, чтобы начать:

APP_COMMAND="${OPENSHIFT_REPO_DIR}target/start $PLAY_PARAMS "\
"-Dhttp.port=${OPENSHIFT_INTERNAL_PORT} "\
"-Dhttp.address=${OPENSHIFT_INTERNAL_IP} "\
"-Dconfig.resource=openshift.conf"

echo $APP_COMMAND &>> $LOG_FILE
nohup bash -c "${APP_COMMAND} &>> ${LOG_FILE} 2>&1" &> /dev/null &

и остановить это

pid=`cat RUNNING_PID`
echo "Stopping play application" >> $LOG_FILE
kill -SIGTERM $pid
person opensas    schedule 14.05.2012
comment
Спасибо за разъяснение, но это не решает мою проблему. Это работает, когда я запускаю его локально на сервере, но по какой-то причине я не могу запустить это удаленно (например, с помощью capistrano) - person Jeroen Rosenberg; 14.05.2012
comment
Я заставил его работать на основе вашего предложения (см. gist.github.com/2769718). Ключ к решению было не использовать структуру каталогов версии + символической ссылки (текущей) capistrano по умолчанию, потому что файл RUNNING_PID останется в старом подкаталоге выпусков, и сценарии больше не смогут останавливать приложение. Я отмечу это как ответ, потому что считаю, что это лучший способ развертывания игровых приложений. - person Jeroen Rosenberg; 22.05.2012

В группах Google есть несколько свежих тем о запуске приложений:

Это хорошая идея, чтобы подписаться или присоединиться к ним

person biesior    schedule 14.05.2012

Я бы посоветовал использовать runit. В настоящее время мы запускаем кучу сервисов в производстве, и это отлично работает.

Это включает в себя только создание простого сценария оболочки с именем run, указывающего runit на его содержащий каталог, а затем запускающего его. Службы не должны демонизироваться сами по себе, а runit контролирует pid-файлы и т. д.

Существует команда ( sv ) для запуска, остановки и запроса служб. ( sv start|stop|status|restart yourapp ).

Беглый поиск в Google дал мне вот это http://rubygems.org/gems/capistrano-runit. Я вообще не использую капистрано, поэтому не могу ручаться за его полезность.

http://smarden.org/runit/

Лучше всего начать с часто задаваемых вопросов: http://smarden.org/runit/faq.html

В Debian вы просто apt-get install runit и готовы к работе. update-service --add /your/service/dir/ зарегистрирует службу в runit.

При развертывании мы останавливаем сервисы, меняем бинарники и запускаем сервисы; это действительно просто.

person fedesilva    schedule 14.05.2012
comment
Звучит как работоспособное решение, но мой вопрос был действительно специфичен для игровых приложений. Я попробую, если я смогу заставить его работать с runit. - person Jeroen Rosenberg; 22.05.2012
comment
Работает с любыми приложениями. Если вы успешны, отпишитесь о своем опыте. - person fedesilva; 23.05.2012