POD — git push deploy для Node.js
Скриншот
Core API JSCoverage: 95,52%
Pod упрощает настройку, обновление и управление несколькими приложениями Node.js на сервере Linux. Идеально подходит для размещения личных проектов Node на виртуальном частном сервере (VPS). Есть две основные части: 1. развёртывание с помощью git hooks и 2. управление процессами с помощью pm2.
Он не управляет маршрутизацией DNS для вас (лично я делаю это в Nginx), но вы можете использовать pod для запуска сервера node-http-proxy на порту 80, который направляет входящие запросы к другим приложениям.
На сервере:
$ pod create myapp
На вашем локальном компьютере:
$ git clone ssh://your-server/pod_dir/repos/myapp.git
# хак хак хак, коммит
# убедитесь, что ваш основной файл — app.js
# или укажите «main» в package.json
$ git push
Вы также можете просто добавить его как удалённый в существующий локальный репозиторий:
$ git remote add deploy ssh://your-server/pod_dir/myapp.git
$ git push deploy master
Это всё! Приложение должно автоматически запуститься после нажатия. Для последующих нажатий процесс приложения будет перезапущен. Однако есть ещё кое-что, читайте дальше, чтобы узнать больше.
$ [sudo] npm install -g pod
Чтобы pod автоматически запускал все управляемые приложения при запуске системы, вы также можете написать простой скрипт upstart, который содержит что-то вроде этого:
# /etc/init/pod.conf
start on (local-filesystems and net-device-up IFACE!=lo)
exec sudo -u <username> /path/to/node /path/to/pod startall
При первом запуске pod спросит вас, где вы хотите разместить свои файлы. Структура данного каталога будет выглядеть так:
.
├── repos # содержит голые репозитории .git
│ └── example.git
└── apps # содержит рабочие копии
└── example
├──app.js
└──.podhook
Usage: pod [command]
Commands:
create <app> Create a new app
remote <app> <repo> Create a app from a remote GitHub repo
rm <app> Delete an app
start <app> Start an app monitored by pm2
stop <app> Stop an app
restart <app> Restart an app that's already running
list List apps and status
startall Start all apps not already running
stopall Stop all apps
restartall Restart all running apps
prune Clean up dead files
hooks Update hooks after a pod upgrade
web [command] Start/stop/restart the web interface
help You are reading it right now
$ pod web [stop|restart|status]
Эта команда запустит веб-службу pod, по умолчанию на порту 19999, которая предоставляет несколько функций:
/
: веб-интерфейс, отображающий текущий статус приложений./json
: возвращает данные о статусе приложения в формате json./jsonp
: принимает jsonp. Этот маршрут должен быть включён в конфигурации./hooks/appname
: запускает выборку/перезапуск соответствующих удалённых приложений.И /
, и /json
требуют базовой аутентификации http. Обязательно установите имя пользователя и пароль. Использование удалённого репозитория GitHub
Вы можете настроить приложение для отслеживания удалённого репозитория GitHub с помощью команды pod remote
:
$ pod remote my-remote-app username/repo
После этого добавьте вебхук в ваш репозиторий GitHub, указав на /hooks/my-remote-app
вашего веб-интерфейса. Вебхук вызовет выборку и перезапуск, как и локальные приложения. По умолчанию удалённое приложение будет отслеживать только основную ветку, если вы хотите отслеживать другую ветку, вы можете изменить её в файле конфигурации.
Также можно настроить удалённое приложение для отслеживания произвольного адреса git. Однако в этом случае вам нужно вручную сделать POST-запрос, соответствующий полезной нагрузке вебхука GitHub.
Начиная с версии 0.8.2, также поддерживаются вебхуки GitLab.
Начиная с версии 0.8.6, также поддерживаются вебхуки Bitbucket.
Конфигурация
Файл конфигурации находится по адресу ~/.podrc
. Обратите внимание, что с версии 0.7.0 все поля следуют формату подчёркивания, поэтому проверьте свой файл конфигурации, если после обновления что-то сломается.
Пример конфигурации:
{
// куда pod помещает все вещи
"root": "/srv",
// дефолтная среда
"node_env": "development",
// это можно переопределить в каждом package.json приложения "main" поле
// или в конфигурации приложения ниже, используя поле "script"
"default_script": "app.js",
// минимальное время безотказной работы, чтобы считаться стабильным,
// в миллисекундах. Если не установлено, все перезапуски
// считаются нестабильными.
"min_uptime": 3600000,
// максимальное количество разрешённых нестабильных перезапусков
// перед автоматическим остановкой приложения.
"max_restarts": 10
// конфигурация для веб-интерфейса
"web": {
// установите их! по умолчанию admin/admin
"username": "admin",
"password": "admin",
"port": 19999,
// разрешить jsonp для веб-интерфейса, по умолчанию false
"jsonp": true
},
"apps": {
"example1": {
// передаётся приложению как process.env.NODE_ENV
// если не установлено, наследуется от глобальных настроек
"node_env": "production",
// передаётся приложению как process.env.PORT
// если не установлен, pod попытается проанализировать из
// основного файла приложения (только для отображения), но не
// гарантируется правильность.
"port": 8080,
// pod будет искать этот скрипт перед проверкой
// в package.json приложения.
"script": "dist/server.js",
// *** любая допустимая конфигурация pm2 здесь передаётся pm2. ***
// запустить 2 экземпляра с использованием модуля кластера
"instances": 2,
// передать дополнительные аргументы командной строки в приложение
"args": "['--toto=heya coco', '-d', '1']",
// пути к файлам для stdout, stderr журналов и pid.
// будут в ~/.pm2/, если не указано
"error_file": "/absolute/path/to/stderr.log",
"out_file": "/absolute/path/to/stdout.log"
},
"example2": {
// вы можете переопределить глобальные настройки
"min_uptime": 1000,
"max_restarts": 200
},
"my-remote-app": {
"remote": "yyx990803/my-remote-app", // github shorthand
"branch": "test" // если не указан, по умолчанию master
}
},
// передавать переменные окружения всем приложениям
"env": {
"SERVER_NAME": "Commodore",
"CERT_DIR": "/path/to/certs"
}
}
Использование PM2 напрямую
Pod полагается на pm2 для управления процессами под капотом. При установке pod исполняемый файл pm2 также будет связан глобально. Вы можете вызывать команды pm2 для получения более подробной информации о процессе.
Ведение журнала делегировано pm2. Если вы не установили параметры out_file
и error_file
приложения, журналы по умолчанию будут сохранены в ~/.pm2/logs
.
Если что-то пойдёт не так и перезагрузка не решит проблему, попробуйте pm2 kill
. Он завершает все процессы, управляемые pm2, и сбрасывает потенциальные проблемы с переменными среды.
Все команды pod касаются только приложений, присутствующих в конфигурационном файле pod, так что всё в порядке, если... Использование PM2 отдельно для запуска дополнительных процессов
Пользовательский хук post-receive
По умолчанию pod будет запускать npm install каждый раз, когда вы отправляете изменения в репозиторий. Чтобы переопределить это поведение и запустить собственный сценарий оболочки перед перезапуском приложения, просто добавьте файл .podhook в своё приложение. Если .podhook завершает работу с кодом, отличным от 0, приложение не будет перезапущено и жёстко сбросится до фиксации перед отправкой.
Пример .podhook:
component install
npm install
grunt build
grunt test
passed=$?
if [[ $passed != 0 ]]; then
# тест не пройден, выход. рабочее дерево приложения на сервере будет сброшено.
exit $passed
fi
# перезапуск происходит автоматически, поэтому нет необходимости включать его здесь
Вы также можете напрямую отредактировать сценарий post-receive приложения, который находится в pod-root-dir/repos/my-app.git/hooks/post-receive, если хотите.
Использование API
Примечание: API можно использовать только после того, как вы инициировали конфигурационный файл через командную строку.
require('pod') вернёт API. Вы должны подождать, пока он будет готов, чтобы что-то с ним сделать:
var pod = require('pod')
pod.once('ready', function () {
// ... делаем что-то
})
Методы API следуют традиционному стилю обратного вызова с ошибкой в первую очередь. Обратитесь к источнику для получения более подробной информации.
Образы Docker
Готовые образы Docker:
Изменения
0.9.1
0.9.0
0.8.6
0.8.0
И так далее.
Полный текст без форматирования доступен по запросу.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )