小屋創作

日誌2022-01-31 09:27

將 LINE 聊天機器人部署到自己的雲端 VM (不用 heroku)

作者:游隼

整個 Server 最後會長這樣

由於 LINE bot 的 webhook URL 要求一定要是 https 的網址 所以還要 https 伺服器

我用 nginx 是因為 line-bot 應該沒必要用到 Apache (Apache 比較吃伺服器資源)

nginx 需要設定憑證 才會從 http 伺服器變成 https 伺服器 不過有 certbot 可以自動完成憑證簽發、更新的動作 (好東西、不用嗎?)

不用 heroku 是因為 heroku 免費用戶只要超過 30 分鐘沒人訪問就會關掉 有人在次訪問需要 1-2 分鐘重啟 重啟之後 Line bot 也會被重啟 總之在沒課金的狀況下十分不方便

如果是比較熟悉 Python 的朋友也可以把 Node.JS + express 的組合改成 python + Flask。兩種我都用過,不過我比較熟悉 JS 所以用 JS 寫流程。


創一個新的 VM 實體

~~~如果已經有雲端 VM 的朋友可以跳過這段~~~

有很多廠商提供雲端運算的服務 如 Azure, AWS, GCP...... 等等

有要收費的也有不用收費的 大家可以找一個自己喜歡的來做

在本篇文章中我用 Oracle Cloud 的 Standard E2 示範 映像檔用的是預設的 Oracle Linux 7.9

登入了自己的 Oracle Cloud 帳號後找到 Create a VM instance 點下去

在 Image and shape 點【Edit】然後選【Change Shap】→【Virtual machine】→ 【Specialty and previous generation】→【VM.Standard.E2.1.Micro】

記得保存 SSH 金鑰 (點【Save Private Key】就可以下載了) 或是貼上自己原有的金鑰

點整個網頁左下角的【Create】就可以創建 VM 實體了 (需要等一下才會創好)

創好後把 Public IP addressUsername 記下來待會會用到

在這個頁面順便設定子網路規則
找到 Primary VNIC 中的 Subnet 點進去

找到 Security Lists 中的 Default Security List for XXXXXX 點進去

點【Add Ingress Rules】
Source CIDR:0.0.0.0/0
IP Protocol:TCP (保持預設)
Source Port Range:留空 (保持預設)
Destination Port Range:80 (填入允許的連接埠)

完成後點【Add Ingress Rules】

需要新增兩個連接埠 (80 是給 http 用的、443 是給 https 用的)
所以再【Add Ingress Rules】一次 (這次 Destination Port Range 填入 443)

有了 Public IP address 可以去申請 domain.name 了 (可以用免費域名如 no-ip)
這裡不贅述了 給個 Google 關鍵字:免費域名 申請 教學 no-ip


登入 VM 實體

我習慣用 WinSCP 開 Putty 登入雲端 VM (其實只要 Putty 就好了)

不過有 WinSCP 傳檔案比較方便 反正是免費的總之就先都裝吧

都不想裝也可以用 Windows 內建的 PowerShell 連

下載 WinSCPPutty 然後無腦安裝 ((總之一直下一步就對了XD

打開 WinSCP 會有一個登入視窗
檔案協定:SFTP (保持預設)
主機名稱:填入剛剛的 Public IP address
連接埠:22 (保持預設)
使用者名稱:填入剛剛的 Username
點【進階】→ SSH → 身分核對 找到【私鑰檔案】選剛剛下載的 SSH 金鑰

【進階】的左邊有一個【儲存】 上面都設定好後可以把連線設定儲存起來 就不用每次連都要重打這些了

完成連線設定後點【登入】
第一次連線會問你要不要信任該主機 點【是】

※之後有需要傳檔案到伺服器可以在這邊傳

※可以在【指令】→【於 Putty 開啟】快速開啟終端機視窗


部署 Web Server

第一次打開 Putty 先更新一下已安裝的套件 (需要等幾分鐘)
sudo yum -y update

安裝 RHEL 庫 (標準 CentOS 不用 如果安裝 nginx 或 snap 出現 not available 再安裝)
sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

安裝 nginx
sudo yum install -y nginx

有關  nginx 的指令可以參考: nginx: Beginner’s Guide

用 vim 設定 nginx.conf
sudo vim /etc/nginx/nginx.conf

把 server_name  改成你從 no-ip 或其他地方申請到的域名 (domain.name)

在 server 區塊的最後加入 反向代理 /express/ 到 3000 埠的設定
(路由名字可以自己取 不過待會是要傳給 express 的 我就取作 express)
server {
    listen       80;
    server_name  domain.name;

    ...

    location /express/ {
        proxy_pass http://localhost:3000/;
    }
}
設定完成後儲存

這時啟動 nginx
sudo nginx

設定訪火牆 允許連接埠 80 和 443 (443 還沒用到 不過之後也要開就先打開吧XD)
sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
sudo firewall-cmd --permanent --zone=public --add-port=443/tcp
sudo firewall-cmd --reload

在瀏覽器打開 http://domain.name
如果有出現網頁 Welcome to nginx! 代表 nginx 正確運作

打開 http://domain.name/express
如果出現 404 Not Found 代表上面反向代理沒設好
如果出現 An error occurred. 這是正常的 因為 3000 埠上還沒有程式在監聽

如果啥也沒出現可能是 nginx 沒有執行、防火牆沒設定好......等等 請先排查故障

安裝 Certbot

安裝 snap
sudo yum install -y snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap

安裝 Certbot
sudo snap install core; sudo snap refresh core

centos 安装 snapd 报错: too early for operation, device not yet seeded or device model not acknowledged
sudo setenforce 0

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx

之後會提示你輸入 email 就輸入常用的 email 就行了

問你同不同意他們的服務規則之類的 輸入 y

問你要不要 email 訂閱他們的消息 要的話輸入 y

問你你的 domain.name 是什麼 輸入你的域名

在瀏覽器打開 https://domain.name/ 如果有出現網頁左上角也有鎖頭的話 代表 https 設定成功


將 bot 放到 VM 上

當環境部屬好之後 接著就是將寫好的 LINE bot 放上去運行了

這裡用 LINE Developers 官方提供的範例程式碼

Messaging API 本身提供很多程式語言的 SDK 可以依照自己習慣的語言來

我比較熟悉 JavaScript 所以選擇 Node.js 的 SDK

安裝 Node.js
sudo yum install -y nodejs

新增資料夾用來放 LINE bot
mkdir echo-bot
cd echo-bot

用 npm 安裝依賴項
npm install @line/bot-sdk --save
npm install express --save

把官方範例裡的 index.js 下載下來

第 8 行、第 9 行填上 LINE bot 的 tokensecret
const config = {
  channelAccessToken: 填上TOKEN,
  channelSecret: 填上SECRET,
};

第 21 行可以設定 express 的路由預設是 /callback
如果有多個 LINE bot 的話可以在這邊設定成你要的路由路徑
app.post('/callback', ...) => { ... });

第 46 行可以設定 express 的所監聽的連接埠 預設是 3000
如果 3000 埠被占用可以設定成其他的 不過前面 nginx 反向代理的連接埠也需要改
const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log(`listening on ${port}`);
});

改好 index.js 並放到伺服器上之後就可以執行了
node index.js

直接開的話當終端機視窗被關閉 伺服器上也會被一併關閉
如果是要長期執行可以用 nohup 在背景執行
nohup node index.js&


回去更新 Webhook URL

回去登入您的 LINE Developers 帳號

在 Messaging API 的頁籤裡有 Webhook settings

更新 Webhook URL 成 https://domain.name/express/callback/

儲存之後驗證看看 出現 Success 你的 line-bot 就能正常運作了~~灑花

6

18

LINE 分享

相關創作

這是一篇廢文

Windows10 KB5035845 (系統組建 1904x.4170) 安全性更新

Windows11 KB5035853 (系統組建 226x1.3296;Moment5) 安全性更新

留言

開啟 APP

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】