在 ZEIT now 上部署 Telegram Bot

March 4, 2017

先前撰寫過一篇 Telegram Bot 開發起手式主要就是簡單學習如何撰寫一個自己的 Telegram Bot,但是後來想要把 Telegram Bot 給 deploy 起來,苦無找不到比較好的空間,最初那時候就是將 Bot deploy 到 Heroku 上,退伍後這陣子又寫了另一個 Cafe Nomad Bot,這次找到了一個很容易 deploy Telegram Bot 的方式,請繼續往下看吧!:rocket:

𝚫 now - realtime global deployments

ZEIT - now

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
}

以上程式碼主要示意在 productiondevelopment 要如何去設定,首先我先設定了 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
>[email protected]^1.1.8
>[email protected]^6.22.0
>[email protected]^5.9.3
>[email protected]^10.1.2
>  ‣ @google/[email protected]^0.3.1
> ⧗ Installing:
>[email protected]^4.0.0
>[email protected]^2.2.1
>[email protected]^0.27.0
> ✓ Installed 564 modules [12s]
> ▲ npm start
> > [email protected] start /home/nowuser/src
> > 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.');
});