整個 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 address 跟
Username 記下來待會會用到
在這個頁面順便設定子網路規則
找到 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 連
下載 WinSCP 和 Putty 然後無腦安裝 ((總之一直下一步就對了XD
打開 WinSCP 會有一個登入視窗
檔案協定:SFTP (保持預設)
主機名稱:填入剛剛的 Public IP address
連接埠:22 (保持預設)
使用者名稱:填入剛剛的 Username
點【進階】→ SSH → 身分核對 找到【私鑰檔案】選剛剛下載的 SSH 金鑰
【進階】的左邊有一個【儲存】 上面都設定好後可以把連線設定儲存起來 就不用每次連都要重打這些了
完成連線設定後點【登入】
第一次連線會問你要不要信任該主機 點【是】
※之後有需要傳檔案到伺服器可以在這邊傳
※可以在【指令】→【於 Putty 開啟】快速開啟終端機視窗
部署 Web Server
第一次打開 Putty 先更新一下已安裝的套件 (需要等幾分鐘)
安裝 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
設定訪火牆 允許連接埠 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 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 的 token 和 secret
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 並放到伺服器上之後就可以執行了
直接開的話當終端機視窗被關閉 伺服器上也會被一併關閉
如果是要長期執行可以用 nohup 在背景執行
回去更新 Webhook URL
回去登入您的 LINE Developers 帳號
在 Messaging API 的頁籤裡有 Webhook settings
更新 Webhook URL 成 https://
domain.name/
express/
callback/
儲存之後驗證看看 出現 Success 你的 line-bot 就能正常運作了~~灑花