------------------— вещи относительно постоянные —------------------
1) Берем сервак (Ubuntu, CentOS)
2) Настраиваем, обновляем, ставим либы, базы, устанавливаем пользователей — chef или ansible скрипт
3) Ставим nginx+passenger, nginx, postgresql, docker daemon (обоснование ниже) — chef или ansible скрипт
4) Настройка бекапов файлов, конфигов nginx и БД
—------------------------------------------------------------------------------------------
—------------------- уровень приложения (частые изменения, много вариаций) —-------------------------------------
5) ruby, rvm, конкретная ветка репозитория, конкретная версия. специфичные для приложения настройки
Я бы собрал Docker контейнер со всем этим и поставлял только его через Docker Registry
—------------------------------------------------------------------------------------------
Капистрана отпадает в данном случае. Поставляется только контейнер определенной версии из реестра контейнеров.
Как он туда попадает? Его собирает CI из нужной ветки и ложит в реестр.
Мониторинг доступности приложения в контейнере (ф-ть monit) можно реализовать через Docker Healthcheck (встроенная фича докера). Мониторинг доступности всей системы в твоих требованиях отсутствует, но по-хорошему надо этим озаботиться и поставить какой-нить zabbix, или решение по-проще.