Guía: Deployar un bot de Telegram con Dokku

#1

En el post anterior habíamos programado un bot de Telegram que corría localmente. Esto nos viene genial para la primera etapa donde estamos programando el comportamiento y lo testeamos.

Sin embargo, tarde o temprano vamos a tener que deployarlo a algún server.

simpsons%20cisco%20systems

1. Obtener un server con Ubuntu y Dokku

En este caso vamos a usar un servidor con Dokku instalado. Dokku vendría a ser una especie de Heroku open source, nos va a permitir subir varias apps / webs a un solo server y administrarlas de forma muy sencilla.

Yo usé Digital Ocean. Ahí se registran, crean un Droplet y en Marketplace, van a encontrar que hay uno que dice Dokku.

Hay servers por USD 5 al mes.

(Si, no es gratis :rat:)

2. Crear una app usando Dokku

Una vez que crean el Droplet con Dokku y siguen las instrucciones en pantalla. Abrimos una terminal y procedemos a crear nuestra primera aplicación.

ssh dokku@la-url-de-tu-droplet.com apps:create groot-bot

Dokku usa git para deployar, para eso necesitamos crear un git remote

git init
git remote add dokku dokku@la-url-de-tu-droplet.com:groot-bot
git add -A
git commit -m 'initial commit'
git push --set-upstream dokku master

3. Deployar, fallar, llorar. Repetir proceso (Buildpacks)

…and… :fire:

El error es porque nuestro server tiene que crear un Docker container y no puede determinar qué necesita. Para eso necesitamos un buildpack.

Por suerte alguien hizo uno por nosotros, así que lo único que tenemos que hacer es crear un file que se llama .buildpacks y poner lo siguiente:

https://github.com/kylef/heroku-buildpack-swift

Volvemos a tratar de deployar:

git add -A
git commit -m 'added .buildpacks file'
git push --set-upstream dokku master

4. Deployar, fallar, llorar. Repetir proceso (Versión de Swift)

…and… :fire:

Nuestro buildpack bajó Swift 4.1 pero nuestro archivo Package.swift indica que necesitamos Swift 5.0

// swift-tools-version:5.0

Vamos a crear un archivo .swift-version y ponemos lo siguiente:

5.0

Volvemos a tratar de deployar:

git add -A
git commit -m 'added .swiftversion (5.0)'
git push --set-upstream dokku master

5. Deployar, fallar, llorar. Repetir proceso (Procfile y DOKKU_SCALE)

…and… :fire:


Esta vez, nuestro server llevó a cabo unas cuantas cosas:

  • Bajó Swift 5.0 :white_check_mark:
  • Instaló las dependencias :white_check_mark:
  • Compiló nuestro código :white_check_mark:

El problema es que no sabe qué hacer después. Es decir, no sabe cómo correr nuestro bot.

Para eso tenemos que crear un archivo llamado Procfile y escribir:

botworker: groot-bot

Y crear un archivo DOKKU_SCALE:

botworker=1

Volvemos a tratar de deployar:

git add -A
git commit -m 'added Procfile and DOKKU_SCALE'
git push --set-upstream dokku master

6. Deployar, fallar, llorar. Repetir proceso (Versión de Swift, OTRA VEZ)

…and… :fire:


Parece que nuestra app tira un error en runtime por alguna dependencia entre Ubuntu y Swift. No sabría decir si esto viene por givip/Telegrammer, SwiftNIO (una dependencia del bot de Telegram) o el buildpack está desactualizado.

En vez de rompernos la cabeza con esto, les propongo bajar la versión de Swift a 4.2.

NOTA: Para el momento que escribí esto, Swift 5.0 era relativamente nuevo.
Puede que esto no suceda más ahora.

Para cambiar la versión de Swift tenemos que cambiarlo en Package.swift en la primera línea:

// swift-tools-version:4.2

Y en el archivo .swift-version tenemos que poner 4.2 también.

Probamos en nuestro local que funcione:

rm -rf .build
swift run

Volvemos a tratar de deployar:

git add -A
git commit -m 'changed swift version to 4.2'
git push --set-upstream dokku master

7. Deployar, fallar, llorar. Repetir proceso (la motherfucking cache)

…and… :fire:

A esta altura estoy seguro que querés manejar un Uber y no programar nunca más en tu vida.
Tranquilo, este issue se soluciona fácil. El problema parece que es la cache.

ssh dokku@la-url-de-tu-droplet.com repo:purge-cache groot-bot
git push --set-upstream dokku master

8. Deployar, tener éxito, llorar de todas formas

…and… :tada:

Vamos a Telegram a probarlo…

9. Harder Better Faster Stronger

Hay cosas que se pueden mejorar. Por ejemplo, el token lo tenemos hardcodeado.
Es mejor obtenerlo por environment variable:

let token = Enviroment.get("TELEGRAM_BOT_TOKEN")!

Para settear una environment variable via Dokku, escribimos:

ssh dokku@la-url-de-tu-droplet.com config:set groot-bot TELEGRAM_BOT_TOKEN=el-token-de-tu-bot

Setear environment variables reinicia nuestra app.

También tenemos que deployar nuestros cambios.

git add -A
git commit -m 'getting token as a environment variable'
git push

Esta vez no hace falta hacer git push --set-upstream dokku master porque ya tuvimos un deploy exitoso, con git push es suficiente.

That’s all folks

Pueden ver el código final en el repo betzerra/groot-bot.

Lean la documentación de Telegram y usenlo como punto de partida para hacer sus propios bots.

Hace poco hice uno de Canillitapp en el que te permite buscar noticias y compartirlas. Seguramente dentro de lo haga open-source :wink:

Pueden escribirle al bot de Canillitapp con este link

Espero que esto les haya servido. Si me equivoqué en alguna parte o tienen preguntas no duden en responder el thread :slight_smile:

1 me gusta

Guía: Telegram bot usando Swift