На примере развертывания приложения 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 на своем сервере.

Ресурсы: