На примере развертывания приложения Javascript
Иногда для простых приложений и быстрого развертывания использование таких инструментов, как Kubernetes или даже Docker, является излишним. Итак, что мы тогда используем? Предлагаю PM2.
Давайте сначала посмотрим на наше приложение
Предположим, у нас есть приложение NodeJS, работающее на порту: 3000. Для простоты представим его как простое приложение Express с конечной точкой -
/api/v1/articles
Это возвращает ответ JSON, например -
[ { "userId":1, "id":1, "title":"sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body":"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" }, { "userId":1, "id":2, "title":"qui est esse", "body":"est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla" }, ]
Довольно просто, просто набор сообщений.
Настройка среды развертывания
Независимо от того, пытаетесь ли вы выполнить развертывание в Google Cloud, AWS, Digital Ocean, Azure или Heroku, его всегда можно представить как компьютер без пользовательского интерфейса. Итак, пока предположим, что у нас есть экземпляр EC2 или цифровая капля океана, которая является просто виртуальным экземпляром, например, Ubuntu 18. *. И мы получаем доступ к этому экземпляру через что-то вроде - ssh user@ip_address
и учетные данные. Всегда лучше, если мы будем обращаться к нему через ключ ssh (скажем, это файл с именем creds.pem
), а не использовать пароль непосредственно в команде. Итак, команда будет выглядеть так -
ssh ~/.ssh/creds.pem user@ip_address
Это зарегистрирует вас внутри экземпляра. Мы можем сделать это проще -
Наши ключи ssh могут быть предоставлены автоматически, если мы правильно настроим наши параметры ssh. Итак, давайте просто поместим creds.pem
файл в вашу ~/.ssh
папку. Затем добавьте блок ниже в свой ~/.ssh/config
файл
Host YOUR_INSTANCE_IP_ADDRESS
User USER_NAME
Port 22 or YOUR_CONNECTING_PORT
IdentitiesOnly yes
IdentityFile ~/.ssh/creds.pem
Это гарантирует, что вы можете войти в экземпляр, просто
ssh ip_address
Теперь выйдите из ssh-соединения и убедитесь, что на вашем компьютере установлены nodejs и pm2. Поскольку мы уже развертываем приложение express js, я предполагаю, что у вас есть node js, а для pm2 просто запустите npm install -g pm2
.
Теперь наш локальный рабочий стол готов, давайте исправим наш экземпляр.
Поскольку мы размещаем нашу кодовую базу в сервисах, подобных GitHub, нашему экземпляру требуется доступ к репозиторию, поскольку он должен клонировать / извлекать репозиторий всякий раз, когда происходит развертывание. Для этого нам нужно создать ключ ssh в нашем экземпляре / сервере, а затем добавить его в репозиторий для предоставления доступа.
- Первый ssh внутри сервера / экземпляра -
ssh IP_ADDRESS
- Теперь обновите все, если это происходит впервые -
sudo apt-get update & sudo apt-get upgrade
- Установите Git на свой сервер, если его еще нет -
sudo apt install git
- Создайте ключ ssh на своем сервере с помощью команд ниже -
ssh-keygen -t rsa cat ~/.ssh/id_rsa.pub
- Это должно распечатать ваш открытый ключ, скопировать его в буфер обмена и перейти в ваш репозиторий. Для Github перейдите по адресу https://github.com/{USER_NAME}/{REPO_NAME}/settings/keys/new. Затем вставьте и сохраните ключ развертывания. Для битбакета Репозиторий → Настройки → Ключи доступа должны показать те же параметры.
Теперь ваш сервер имеет доступ к вашему репозиторию git. - Теперь установите зависимости для этого проекта -
sudo apt-get install curl software-properties-common
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs
node --version
sudo npm install -g pm2
Это должно установить NodeJS и PM2 глобально внутри сервера.
Теперь наш сервер и локальное окружение готовы, перейдем к настройкам.
Конфигурация PM2
Внутри папки проекта нам нужно запустить pm2 init
. Это должно создать файл с именем ecosystem.config.js
в корневом каталоге вашего проекта. Это файл конфигурации, который pm2 использует для запуска и развертывания приложения. После редактирования ваш файл экосистемы должен выглядеть примерно так:
module.exports = { apps: [ { name: "app", script: "./index.js", env: { NODE_ENV: "development" }, env_production: { NODE_ENV: "production" } } ], deploy: { production: { host: SERVER_IP, user: SERVER_USER, ref: REPO_BRANCH, // (use 'origin/master' for your master branch, repo: "[email protected]:{USER_NAME}/{REPO_NAME}.git", // your repo url path: "/var/app/repositories", "post-deploy": "npm install && pm2 reload ecosystem.config.js --env production && pm2 save" } } };
Теперь запустите pm2 deploy production setup
, если вы впервые выполняете развертывание на этом сервере. Это может сломаться в зависимости от вашего процесса настройки, особенно с разрешением на чтение и запись вашего пути развертывания проекта. Например - /var/app/repositories
в приведенной выше конфигурации необходимо предоставить доступ пользователю сервера, на который вы используете ssh. Просто предоставьте пользователю разрешение на чтение и запись внутри /var/app/repositories
.
Теперь, если ваш pm2 deploy production setup
работал успешно, то сервер должен быть запущен и запускать ваше приложение. Чтобы проверить это, перейдите к IP_ADDRESS:PORT_NUMBER
для вашего сервера и приложения. Если это не так, вы можете настроить брандмауэр или прокси-сервер на своем сервере, чтобы открыть порт приложения на вашем сервере.
Теперь, если вы хотите сделать его ярлыком, вы можете добавить несколько команд в свой package.json
файл -
"deploy-production": "pm2 deploy ecosystem.config.js production --force",
"reload-production": "pm2 deploy ecosystem.config.js production exec 'pm2 reload app'"
Теперь вы можете просто запустить npm run deply-production
для развертывания или npm run reload-production
после того, как что-нибудь обновите, из своего репозитория для легкого развертывания 😃
Вы можете контролировать свое приложение pm2 с помощью команды pm2 monit
на своем сервере.
Ресурсы: