在 ZEIT now 上部署 Telegram Bot
先前撰寫過一篇 Telegram Bot 開發起手式主要就是簡單學習如何撰寫一個自己的 Telegram Bot,但是後來想要把 Telegram Bot 給 deploy 起來,苦無找不到比較好的空間,最初那時候就是將 Bot deploy 到 Heroku 上,退伍後這陣子又寫了另一個 Cafe Nomad Bot,這次找到了一個很容易 deploy Telegram Bot 的方式,請繼續往下看吧!:rocket:
𝚫 now - realtime global deployments
zeit now 主要是可以讓你很即時的部屬你的 Nodejs 應用程式,首先你必須要去註冊一個帳號,接著你只要現在你的環境下安裝好 now
這個 CLI 一切都非常簡單,也支援 Dockerfile。
now 的官方網站也有提供一個入門教學,你可以很快明白到如何使用 now
,這邊就不多說明如何使用了。
目前我自己使用版本為 now-cli 4.6.1,4.7 版以上還須測試。
$ npm install now -g
完成 now CLI 的安裝後,文章後面就會提到如何 deploy 到 now 了!
Telegram Bot 設定
由於要把 Telegram Bot deploy 到網路上,所以我們必須要先設定 webHook,文件裡有詳細說明如何去設定 webHook,但因為當初開發有使用他人撰寫好的 library,所以只要簡單的去呼叫 method 做設定就可以了。
const token = 'Your token.';let bot;if (env === 'production') {const webHook = { port: process.env.PORT || 443 };const url = process.env.APP_URL || 'Your App URL.';bot = new TelegramBot(token, { webHook });bot.setWebHook(`${url}/bot${token}`); // In here for setting webHook} else {bot = new TelegramBot(token, { polling: true }); // On devlopment mode}
以上程式碼主要示意在 production
和 development
要如何去設定,首先我先設定了 webHook
以及 url
,最後第八行中完成設定 webHook。
目前支援的 WebHooks Port 有: 443, 80, 88, 8443。
這邊囉嗦一下,process.env
除了可以在 npm script
中可以直接設定:
{"name": "deploy-telegram-bot","main": "index.js","scripts": {"start": "NODE_ENV=production node index.js"}}
或者你可以選擇使用 dotenv 也是很方便的呢!我在開發 Cafe Nomad Bot 就是使用它,後面就會知道使用它的好處囉!
前面都是透過很簡單的方式說明如何設定 Telegram Bot,接下來我們回到 now
。
Deploy on 𝚫 now
我們使用 now
做 deploy 時,會產生像這樣的網址:
> https://package-name-random.now.sh
什麼意思呢?也就是說 now
會利用你的 package-name
作為前綴,後面在一組英文亂數,最後是 .now.sh
。
在你每次下 now
做 deploy 時,每次都會產生不同的網址,這其實挺麻煩的,但 now
提供了一個便利的方式,有興趣可以讀這篇文章。
簡單來說就是你可以在 package.json
加入一個 alias
property,或者是另外建立一個 now.json
。
延伸閱讀:
{"alias": "zeit.chat"}
所以當你下完 now
deploy 完後:
$ ~/P/telegram-cafe-nomad deploy-now ⚑ now> Deploying ~/Peng-Jie/telegram-cafe-nomad> Using Node.js 7.6.0 (default)> Ready! https://telegram-cafe-nomad-hjdcmlroud.now.sh (copied to clipboard) [2s]> Upload [====================] 100% 0.0s> Sync complete (174B) [1s]> Initializing…> Building> ▲ npm install> ‣ babel-preset-env@^1.1.8> ‣ babel-register@^6.22.0> ‣ fetch-mock@^5.9.3> ‣ nyc@^10.1.2> ‣ @google/maps@^0.3.1> ⧗ Installing:> ‣ dotenv@^4.0.0> ‣ isomorphic-fetch@^2.2.1> ‣ node-telegram-bot-api@^0.27.0> ✓ Installed 564 modules [12s]> ▲ npm start> > node index.js> Deployment complete!
再下 now alias
,這樣你就會有固定的 URL 囉:
> Assigning alias tg-cafe-nomad to deployment...> Success! Alias created (ccxNJdmWYN6bXW1Ok6FQzSZw):https://your-new-alias.now.sh now points to https://telegram-cafe-nomad-hjdcmlroud.now.sh (cfxel1qm7xDQ32XuhDw3zHAH) [copied to clipboard]
溫馨小提醒: now 對於 Free 用戶有它存在的方案:
- 每個月只能 deploy 20 次
- 每個月有 1GB 的頻寬
- 免費備份
- 每個檔案最大為 1 MB
- 沒有自訂的 domain
_src
頁面是公開的- 更多參考 Pricing
前面提到使用 dotenv 來載入你的一些 nodejs 的環境變數,now
本身也支援變數的設定,你可以使用 now --help
找到說明。
$ now -e NODE_ENV=production -e BOT_TOKEN=123456789
但是我覺得這樣還要額外去設定這些太麻煩了,所以就直接使用 dotenv 省下這些額外的設定,詳細的使用方式可以參考 dotenv 的 README。
總結
now
真的對於 nodejs 應用程式部署相當的方便容易 :v:,而且我覺得相對於 Heroku 感覺快很多 :confused:(錯覺嗎?),而且在設定上也相當的簡易,透過 CLI 進行設定等等。
以下是一個簡單的 Telegram Bot Example:
const token = 'Your token.';let bot;if (env === 'production') {const webHook = { port: process.env.PORT || 443 };const url = process.env.APP_URL || 'Your App URL.';bot = new TelegramBot(token, { webHook });bot.setWebHook(`${url}/bot${token}`);} else {bot = new TelegramBot(token, { polling: true });}bot.on('message', message => {bot.sendMessage(message.chat.id, 'Telegram Bot deployed on zeit/now.');});