這是一篇介紹如何在Linux上管理Node進程並透過GitHub Webhooks自動重啟它們的技術文章。

pm2是一個非常有用的Linux進程管理工具。

我在幾個項目中使用過它,現在我想告訴你如何使用它!

特別是我將使用它在DigitalOcean VPS上運行一個Node.js應用程式,並設置當我們將應用程式的更新推送到GitHub存儲庫時,pm2將會被觸發,從GitHub更新應用程式並重啟它。

聽起來很酷吧?那我們開始吧!

首先,在DigitalOcean上註冊並按照我的教程创建一個VPS

重要提示:在DigitalOcean上使用NodeJS映象,它已經設置了pm2node,而且除了root用戶外還有一個nodejs用戶。

當你的VPS運行起來之後,我們可以開始了。

確保你使用nodejs用戶進行ssh登錄。當以root身份登录時,只需運行su nodejs以使用該用戶。

你在VPS上運行的示例Node.js應用程式位於/var/www/html/文件夾中,它由hello.js文件組成。

應用程式的部署/運行已經通過pm2程序進行管理,它是一個守護進程管理器。

你可以使用pm2 list命令來查看現在正在運行的所有應用程序:

如果你對應用程式做任何更改,這些更改將在重新啟動應用程式之前不會生效:

pm2 restart hello

你可以停止正在運行的應用程式:

pm2 stop hello

如果你嘗試重新加載頁面,這將在瀏覽器中產生一個錯誤:

你可以運行:

pm2 start hello

將應用程式重新啟動。

pm2的好處是,當系統重新啟動時,它會自動重新運行應用程序。

現在你已經看到了內置的Hello World的運行方式,讓我們部署另一個應用程式。

讓我們停止當前的示例應用程式:

pm2 stop hello

並在/var/www/html中創建一個名為test的文件夾:

mkdir test

進入該文件夾:

cd test

運行以下命令:

npm init -y

然後安裝Express:

npm install express

現在運行nano app.js並添加以下代碼:

const express = require("express")
const app = express()

app.get("/", (req, res) => res.send("Hello World!"))
app.listen(3000, () => console.log("Server ready"))

運行:

pm2 start app.js --name app

你應該看到應用程式正在運行!

我們使用了3000端口,這就是hello應用程式使用的端口,所以我們不需要做其他配置。

否則,我們需要修改/etc/nginx/sites-available/default文件,並添加一個新的URL來映射到我們的應用程式。

現在我們部署了一個示例應用程式,讓我們看看如何從GitHub部署一個應用程式。

首先,讓我們停止剛才在上一節中構建的應用程式:

pm2 stop app

然後創建一個簡單的GitHub應用程式。這個示例不會很複雜,它非常類似於我們在上一節中構建的應用程式,但它會顯示Hello World, deployed from GitHub!而不僅僅是Hello World!

在本地創建一個文件夾,在該文件夾中運行以下命令:

npm init -y

然後安裝Express:

npm install express

現在運行nano app.js並添加以下代碼:

const express = require("express")
const app = express()

app.get("/", (req, res) => res.send("Hello World, deployed from GitHub!"))
app.listen(3000, () => console.log("Server ready"))

現在我們把應用程式推送到GitHub上。我使用的是GitHub桌面版,官方的GitHub應用程式,我只需將該文件夾拖放到該應用程式中,它會讓我創建一個新的Git存儲庫和一個GitHub存儲庫。

我使用了標准的Node.js .gitignore文件來初始化存儲庫,它忽略了node_modules文件夾。我們將看到如何在部署期間初始化npm模塊。

現在我們需要在DigitalOcean機器上創建一個SSH密鑰,並將其添加到GitHub。否則,我們將無法訪問剛剛建立的私有存儲庫。

仔細檢查您用於連接到GitHub的電子郵件地址,因為它很重要。您可以在GitHub設置中的電子郵件面板中找到它。然後運行以下命令:

ssh-keygen -t rsa -b 4096 -C "[[email protected]](/cdn-cgi/l/email-protection)"

現在在GitHub上打開“SSH和GPG金鑰”面板:

然後點擊“New SSH key”。將“DigitalOcean”作為標題,以便你知道此密鑰的用途。

現在在DigitalOcean droplet上運行less /home/nodejs/.ssh/id_rsa.pub以獲取公鑰

將其粘貼到您的設置中,然後保存。你應該可以在SSH密鑰列表中看到它。

現在我們應該能夠在服務器上克隆私有存儲庫。

進入/var/www/html文件夾,並運行以下命令:

git clone [[email protected]](/cdn-cgi/l/email-protection):<yourname>/<reponame>.git

在我的情況下,它是:

git clone [[email protected]](/cdn-cgi/l/email-protection):flaviocopes/testdo.git

應用程式被成功下載:

現在輸入cd testdo,然後運行npm install

應用程式現在已準備好運行,所以輸入:

pm2 stop test

停止先前的應用程式,再運行:

pm2 start app.js --name testdo

以啟動新的應用程式:

安裝名為pm2-githook的pm2模塊 https://github.com/vmarchaud/pm2-githook,使用以下命令:

pm2 install pm2-githook

要配置應用程序,我們需要使用以下命令,該命令需要正確轉義雙引號:

pm2 set pm2-githook:apps "{\"testdo\":{\"secret\":\"test123\",\"prehook\":\"npm install --production\",\"posthook\":\"echo done\"}}"

在這個示例中,我使用了secrettest123,但請將其更改為不容易猜測的值。

默認情況下,此模塊在端口8888上監聽來自GitHub的Webhooks。

現在這個端口是關閉的,使用以下命令打開它:

sudo ufw allow 8888

現在在GitHub的存儲庫設置中,在Webhooks部分點擊Add Webhook

粘貼你網域的URL,加上端口8888。

在這個示例中,我使用了secrettest123

現在,如果你對代碼做了任何更改,它應該會自動部署!