<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Thiago Cavalcanti</title>
    <description>The latest articles on DEV Community by Thiago Cavalcanti (@thiagocavalcanti).</description>
    <link>https://dev.to/thiagocavalcanti</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F382768%2F5c6464e2-b9d5-4f7f-b58a-1696d742fb3e.jpeg</url>
      <title>DEV Community: Thiago Cavalcanti</title>
      <link>https://dev.to/thiagocavalcanti</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thiagocavalcanti"/>
    <language>en</language>
    <item>
      <title>Usando oracle cloud free tier como alternativa ao heroku [demonstração com a criação de chatbot do telegram]</title>
      <dc:creator>Thiago Cavalcanti</dc:creator>
      <pubDate>Fri, 27 Jan 2023 01:39:47 +0000</pubDate>
      <link>https://dev.to/thiagocavalcanti/usando-oracle-cloud-free-tier-como-alternativa-ao-heroku-demonstracao-com-a-criacao-de-chatbot-do-telegram-1h38</link>
      <guid>https://dev.to/thiagocavalcanti/usando-oracle-cloud-free-tier-como-alternativa-ao-heroku-demonstracao-com-a-criacao-de-chatbot-do-telegram-1h38</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Olá!&lt;/p&gt;

&lt;p&gt;Decidi criar esse post para ajudar a quem está buscando formas de realizar deploy de aplicações de forma gratuita para fins de POC, estudo, etc. Com o anúncio que o &lt;a href="https://blog.heroku.com/next-chapter" rel="noopener noreferrer"&gt;heroku não terá mais free tier&lt;/a&gt; iremos explorar a alternativa que a oracle cloud fornece como free tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Objetivo
&lt;/h2&gt;

&lt;p&gt;Iremos criar uma aplicação em node.js, iremos colocar ela na instância &lt;a href="https://www.oracle.com/cloud/free/" rel="noopener noreferrer"&gt;free tier da oracle cloud&lt;/a&gt; e iremos configurar nginx e certificados https para utilizar ela como bot do telegram&lt;/p&gt;

&lt;h3&gt;
  
  
  Como
&lt;/h3&gt;

&lt;p&gt;Irei separar em 3 partes, assim você consegue ver tudo ou somente aquilo que te interessa. Lembrando que o foco é na parte da infraestrutura. O chatbot vai basicamente só responder o id do usuário, independente do input, somente para fins de teste&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configurando o bot no telegram&lt;/li&gt;
&lt;li&gt;Criando nossa aplicação node.js&lt;/li&gt;
&lt;li&gt;Criando, configurando e deployando nosso chatbot na oracle cloud free tier&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Parte 1 - Configurando o bot no telegram
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Premissas
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Você deve ter uma conta no telegram&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Vamos lá
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Abra uma nova conversa no telegram com o &lt;a href="https://t.me/BotFather" rel="noopener noreferrer"&gt;BotFather&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Basta seguir o fluxo de mensagem abaixo para que seja criado um novo bot 
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcki7zqlrm36agvpsbgvz.png" alt="Fluxo de conversa no telegram para criação de um Bot" width="800" height="304"&gt;
&lt;/li&gt;
&lt;li&gt;Armazene o token informado pois usaremos isso mais pra frente&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Parte 2 - Criando nossa aplicação node.js
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Premissas
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Conhecimento básico no ambiente de node.js&lt;/li&gt;
&lt;li&gt;Conhecimento básico em git&lt;/li&gt;
&lt;li&gt;(Somente para testes) Ter instalado o node.js&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Vamos lá
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Criando a base do nosso projeto
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Setup inicial
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;artigo_oracle_chatbot
&lt;span class="nb"&gt;cd &lt;/span&gt;artigo_oracle_chatbot
git init
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Adicione o &lt;a href="https://www.fastify.io/" rel="noopener noreferrer"&gt;fastify&lt;/a&gt; que irá funcionar como o servidor http
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i fastify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Adicione o dotenv para adicionarmos nosso token de forma segura
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Crie um arquivo &lt;code&gt;.gitignore&lt;/code&gt; na raíz do projeto e adicione o seguinte
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
.env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Codando
&lt;/h4&gt;

&lt;p&gt;Crie um arquivo &lt;code&gt;.env&lt;/code&gt; também na raíz e coloque o valor do seu token, além de uma secret (não pode ter símbolo) que você pode gerar usando &lt;a href="https://www.lastpass.com/pt/features/password-generator#generatorTool" rel="noopener noreferrer"&gt;LastPassword&lt;/a&gt; que iremos usar mais pra frente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TELEGRAM_API_TOKEN=93818281:nu1b31byb1i13bi13bi13
TELEGRAM_SECRET=tI5cfFVBW7DrvtHQoXit18r1sVapWWdqKImzymMxbaN33694gD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois crie um arquivo index.js com seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 1 - Importa as dependências&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fastify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fastify&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;https&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// 2 - Cria função que envia mensagem para o telegram via API rest&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sendMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;chatId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://api.telegram.org/bot&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TELEGRAM_API_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/sendMessage`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;chat_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;chatId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;
    &lt;span class="p"&gt;}))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 3 - Cria http server, disponibilizando endpoint que servirá como webhook&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fastify&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/telegram/message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-telegram-bot-api-secret-token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chatId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TELEGRAM_SECRET&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;chatId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Foi tentado acessar o bot sem autorização!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;idUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;chatId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`O seu id é &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;idUser&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; e você mandou a mensagem: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// 4 - Inicializa servidor http&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.0.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server started at 3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por fim adicione no seu package.json o script start:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node index.js"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Testando
&lt;/h4&gt;

&lt;p&gt;Vamos rodar o comando &lt;code&gt;npm start&lt;/code&gt; e esse é o resultado esperado: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0q4f76uevi0uba3vcber.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0q4f76uevi0uba3vcber.png" alt="npm rodando" width="800" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos agora testar a integração com telegram. Para isso, instale o &lt;a href="https://ngrok.com/" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt;, que serve como proxy reverso, em que vai fazer uma das suas portas ficar pública através de um domínio deles próprio&lt;/p&gt;

&lt;p&gt;Após instalar rode &lt;code&gt;ngrok http 3000&lt;/code&gt; e anote o link gerado &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tpm08w7hc44qikgwbe0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tpm08w7hc44qikgwbe0.png" alt="ngrok rodando" width="800" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por fim, vamos cadastrar o nosso webhook no telegram, usando a &lt;a href="https://core.telegram.org/bots/api#setwebhook" rel="noopener noreferrer"&gt;api do telegram&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="nt"&gt;--request&lt;/span&gt; POST &lt;span class="s1"&gt;'https://api.telegram.org/bot93818281:nu1b31byb1i13bi13bi13/setWebhook'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'url="https://85ec-2804-14d-5483-9658-51ed-100d-c05b-b1bd.sa.ngrok.io/telegram/message"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'secret_token="tI5cfFVBW7DrvtHQoXit18r1sVapWWdqKImzymMxbaN33694gD"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repare que:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Na url é passado o path bot que é o token que obtivemos na conversa com o BotFather&lt;/li&gt;
&lt;li&gt;Usamos o form data em que:&lt;/li&gt;
&lt;li&gt;url: é o valor da base url gerada pelo ngrok + /telegram/message que é o path que definimos no nosso index.js&lt;/li&gt;
&lt;li&gt;secret_token: é o secret token que definimos usando o LastPassword. Esse token o telegram vai enviar no cabeçalho x-telegram-bot-api-secret-token&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vamos mandar uma mensagem para nosso bot e ver se tudo funciona como esperado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffgt6zoav6ofjeg1a58di.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffgt6zoav6ofjeg1a58di.png" alt="Sucesso :)" width="800" height="1074"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Commitando
&lt;/h4&gt;

&lt;p&gt;Crie um repositório no github privado, commite e faça o push no repositório&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote add origin &amp;lt;link_git&amp;gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"artigo oracle cloud"&lt;/span&gt;
git push &lt;span class="nt"&gt;--set-upstream&lt;/span&gt; origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Parte 3 - Criando, configurando e deployando nosso chatbot na oracle cloud free tier
&lt;/h2&gt;

&lt;p&gt;Agora vem a parte que é o objetivo de todo esse artigo. Vamos lá :)&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando a instância
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Crie/Faça login na &lt;a href="https://www.oracle.com/br/cloud/sign-in.html" rel="noopener noreferrer"&gt;oracle cloud&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Começe a criar uma &lt;a href="https://cloud.oracle.com/compute/instances/create?region=sa-saopaulo-1" rel="noopener noreferrer"&gt;nova instância&lt;/a&gt; com as seguintes configurações 
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7e00nrzp45qnulhb543r.png" alt="Configuração da instância da oracle" width="800" height="359"&gt;
&lt;/li&gt;
&lt;li&gt;Na parte de "Add SSH keys" clique em "Save Private Key" para que seja possível acessar a sua instância via terminal 
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdi4dczejaxlsyvcw69rq.png" alt="Botão de download da chave ssh privada" width="800" height="254"&gt;
&lt;/li&gt;
&lt;li&gt;Acesso as &lt;a href="https://cloud.oracle.com/compute/instances?region=sa-saopaulo-1" rel="noopener noreferrer"&gt;suas instâncias&lt;/a&gt; e aguarde "State" ficar como "Running".&lt;/li&gt;
&lt;li&gt;Anote o Ip público, pois iremos usar mais pra frente.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Configurando a instância
&lt;/h3&gt;

&lt;p&gt;Caso não seja dito, todos os terminais para os fluxos abaixos, devem ser abertos acessando a sua instância via SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;600 &amp;lt;caminho_para_chave&amp;gt;
ssh &lt;span class="nt"&gt;-i&lt;/span&gt; &amp;lt;caminho_para_chave_privada&amp;gt; opc@&amp;lt;ip_publico&amp;gt;
&lt;span class="c"&gt;# Exemplo &lt;/span&gt;
&lt;span class="c"&gt;# ssh -i ./my_secret.key opc@129.393.293.42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Rodando nosso projeto node.js
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Vamos instalar as ferramentas que vamos utilizar
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;git &lt;span class="nt"&gt;-y&lt;/span&gt;
 &lt;span class="nb"&gt;sudo &lt;/span&gt;dnf module &lt;span class="nb"&gt;enable &lt;/span&gt;nodejs:18 &lt;span class="nt"&gt;-y&lt;/span&gt;
 &lt;span class="nb"&gt;sudo &lt;/span&gt;dnf module &lt;span class="nb"&gt;install &lt;/span&gt;nodejs:18 &lt;span class="nt"&gt;-y&lt;/span&gt;
 node &lt;span class="nt"&gt;-v&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O output deve ser uma versão 18+&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No &lt;a href="https://github.com/settings/tokens?type=beta" rel="noopener noreferrer"&gt;github&lt;/a&gt;, gere um novo token. Com esse token, vamos fazer o clone do repositório (no momento que o git pedir a senha, você passa ele). Em "Repository access" selecione "Only selected repositories", escolha o seu repositorio, e em "Repository Permission", selecione "Read Only" em "Contents"
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &amp;lt;link_repositorio&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Vamos adicionar a nossas secrets criando o arquivo .env
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;nome_repositorio&amp;gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano .env
&lt;span class="c"&gt;# Copie o conteúdo do seu .env local e salve apertando ctrl x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Instale as dependências usando &lt;code&gt;npm i&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rode &lt;code&gt;npm start&lt;/code&gt; e veja se o servidor é inicializado com sucesso&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Configurando nginx para fazer o proxy para o nosso serviço
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Em um novo terminal Instale o nginx
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo dnf install nginx -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Crie os certificados openssl (veja que possui alguns parametros para ajustar quando for rodar ai)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo openssl req -newkey rsa:2048 -sha256 -nodes -keyout private.key -x509 -days 365 -out public.key -subj "/C=BR/ST=&amp;lt;Seu estado&amp;gt;/L=&amp;lt;Sua cidade&amp;gt;/O=&amp;lt;Nome da sua empresa&amp;gt;/CN=&amp;lt;O ip da máquina&amp;gt;"
sudo mv public.key /etc/nginx
sudo mv private.key /etc/nginx
sudo chmod 600 /etc/nginx/public.key
sudo chmod 600 /etc/nginx/private.key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Edite o arquivo /etc/nginx/nginx.conf removendo o objeto server atual e colocando o abaixo:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server {
  listen       80;
  server_name  localhost;

  location / {
    proxy_pass http://localhost:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_redirect https:// http://;
  }
}

    server {
    listen 443 ssl;
    server_name localhost;

    ssl_certificate "/etc/nginx/public.key";
    ssl_certificate_key "/etc/nginx/private.key";

     location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
     }
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Rode os seguintes comandos (o primeiro comando é devido a &lt;a href="https://stackoverflow.com/questions/23948527/13-permission-denied-while-connecting-to-upstreamnginx#_=_" rel="noopener noreferrer"&gt;isso&lt;/a&gt;)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;setsebool &lt;span class="nt"&gt;-P&lt;/span&gt; httpd_can_network_connect 1
&lt;span class="nb"&gt;sudo &lt;/span&gt;restorecon &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; /etc/nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Caso você não apresente erro, significa que ocorreu tudo bem&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Configurando firewall e liberando https
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Precisamos habilitar na cloud da Oracle para permitir requisições https para a máquina. Para isso, vá na &lt;a href="https://cloud.oracle.com/compute/instances?region=sa-saopaulo-1" rel="noopener noreferrer"&gt;lista de instancias&lt;/a&gt;, clique na sua instancia. Depois em "Instance details" clique na sua "Virtual cloud network". Depois nas "Subnets", clique na "Sub rede pública". Depois em "Security Lists" clique em "Default Security List...". Você cair no "Ingress Rules" no final&lt;/li&gt;
&lt;li&gt;Adicione uma nova "Ingress Rule", colocando os seguintes valores 
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjxsbkithh2co7v3wdnp.png" alt="Ingress Rule" width="800" height="456"&gt;
&lt;/li&gt;
&lt;li&gt;Por fim, libere o firewall rodando o seguinte comando
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Último passo - Configurando o webhook do telegram
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Copie o conteúdo da sua chave pública criada anteriormente. Você pode obter rodando &lt;code&gt;sudo nano /etc/nginx/public.key&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Crie um novo arquivo local e coloque o conteúdo copiado anteriormente e salve como 'public.key' também&lt;/li&gt;
&lt;li&gt;Faça a seguinte chamada para configurar o webhook:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="nt"&gt;--request&lt;/span&gt; POST &lt;span class="s1"&gt;'https://api.telegram.org/bot&amp;lt;telegram_api_token&amp;gt;/setWebhook'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'url="https://&amp;lt;instancia_ip_publico&amp;gt;/telegram/message"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'secret_token="&amp;lt;secret_token_gerado_lastPassword&amp;gt;"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--form&lt;/span&gt; &lt;span class="s1"&gt;'certificate=@"&amp;lt;caminho_para_chave_publica&amp;gt;"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;[Opcional] Instale screen para conseguir deixar um terminal da máquina rodando a aplicação
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wget https://yum.oracle.com/repo/OracleLinux/OL8/developer/EPEL/x86_64/getPackage/screen-4.6.2-12.el8.x86_64.rpm
sudo rpm -i screen-4.6.2-12.el8.x86_64.rpm
sudo dnf localinstall screen-4.6.2-12.el8.x86_64.rpm

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Testando!
&lt;/h3&gt;

&lt;p&gt;Mande uma nova mensagem para o bot e caso ele responda significa que deu tudo certo! Se quiser, desligue o seu computador e teste para ver que não tem nada local :)&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>career</category>
      <category>offers</category>
    </item>
  </channel>
</rss>
