# Como Instalar e Configurar o Kong Gateway e o Kong Manager Usando Docker

Estava testando o Kong Manager, pois estava acostumado a usar somente kong deck ou KONGA. E após testar bastante, decidi resumir o teste para um post sobre como rodar do zero o Kong Gateway da sua máquina com docker e configurar um serviço e 2 rotas para o funcionamento básico via Kong Manager.

Caso exista o interesse de algumas pessoas, posso fazer outras partes falando sobre outras features que o Kong Gateway possui, desde como habilitar os logs de todas requisições e gerar dashboards no kibana / grafana, utilização de alguns plugins, consumers, entre outras features.

### Mas o que é o Kong Gateway?

O **Kong Gateway** é uma plataforma open-source amplamente reconhecida como um **API Gateway**, projetada para gerenciar e proteger APIs de forma centralizada, operando na borda da infraestrutura. Ele atua como um intermediário entre os clientes e os serviços de backend, facilitando o controle e a escalabilidade das APIs. Com o Kong, você pode realizar um gerenciamento eficiente, seguro e centralizado de suas interfaces. A plataforma oferece uma ampla gama de funcionalidades avançadas, incluindo:

* **Roteamento de APIs**: permite que você direcione o tráfego para diferentes serviços backend de forma inteligente.
    
* **Autenticação e Segurança**: protege suas APIs com métodos de autenticação como OAuth, JWT, ou API keys.
    
* **Escalabilidade e Performance**: projetado para lidar com grandes volumes de requisições em ambientes de produção de alto tráfego.
    
* **Monitoramento e Logs**: permite rastrear e monitorar todo o tráfego através do gateway, essencial para manter o controle e otimizar o desempenho.
    
* **Flexibilidade com Plugins**: você pode adicionar funcionalidades como cache, rate-limiting, gRPC, AWS Lambda diretamente na rota, entre outros, através de plugins customizáveis, ou criando o seu próprio plugin em Lua ou Go.
    

Além disso, nas novas versões do Kong temos o gerenciamento através do **Kong Manager**, uma interface gráfica simples e intuitiva, acessível pela porta 8002. Com ela, você pode configurar e monitorar APIs sem a necessidade de lidar com comandos complexos.

Existe outra possibilidade de configurar diretamente todo o kong via porta 8001 via cURL.

Ou se deseja manter suas rotas e configurações versionadas, é possível integrar utilizando o projeto [https://github.com/Kong/deck](https://github.com/Kong/deck), mas deixaremos isso para outro post.

### Passo a Passo para rodar e configurar o Kong:

1. **Configurar o Docker Compose**
    
    Crie o seguinte arquivo `docker-compose.yml` para rodar o Kong, o PostgreSQL e o Kong Manager:
    
    ```yaml
    version: '3.5'
    
    services:
    
      kong-migrations:
        image: kong:latest
        command: kong migrations bootstrap
        environment:
          KONG_DATABASE: postgres
          KONG_PG_HOST: db_postgres
          KONG_PG_USER: kong
          KONG_PG_PASSWORD: kong
          KONG_PG_DATABASE: kong
        depends_on:
          - db_postgres
        networks:
          - kong-net
        restart: "no"
    
      kong:
        image: kong:latest
        environment:
          KONG_DATABASE: postgres
          KONG_PG_HOST: db_postgres
          KONG_PG_USER: kong
          KONG_PG_PASSWORD: kong
          KONG_PG_DATABASE: kong
          KONG_PROXY_ACCESS_LOG: /dev/stdout
          KONG_PROXY_ERROR_LOG: /dev/stderr
          KONG_ADMIN_ACCESS_LOG: /dev/stdout
          KONG_ADMIN_ERROR_LOG: /dev/stderr
          KONG_ADMIN_LISTEN: 0.0.0.0:8001
          KONG_PROXY_LISTEN: 0.0.0.0:8000
          KONG_ADMIN_GUI_LISTEN: 0.0.0.0:8002
          KONG_PORTAL_GUI_HOST: localhost:8002
        ports:
          - "8000:8000"  # Proxy
          - "8001:8001"  # Admin API
          - "8002:8002"  # Kong Manager (Admin GUI)
        depends_on:
          - kong-migrations
          - db_postgres
        restart: on-failure
        networks:
          - kong-net
    
      db_postgres:
        image: postgres:latest
        environment:
          POSTGRES_DB: kong
          POSTGRES_USER: kong
          POSTGRES_PASSWORD: kong
          POSTGRES_HOST_AUTH_METHOD: trust
        healthcheck:
          test: ["CMD", "pg_isready", "-U", "kong"]
          interval: 5s
          timeout: 10s
          retries: 5
        networks:
          - kong-net
        restart: on-failure
    
    networks:
      kong-net:
        driver: bridge
    ```
    
    Esta configuração do **Docker Compose** cria um ambiente para o **Kong Gateway** e um banco de dados **PostgreSQL**.
    
    1. `kong-migrations`: Executa as migrations para configurar o banco de dados do Kong.
        
    2. `kong`: Configura o Kong para gerenciar APIs, ouvindo nas portas 8000 (proxy), 8001 (admin) e 8002 (Kong Manager).
        
    3. `db_postgres`: Inicia um banco de dados PostgreSQL para armazenar dados do Kong, com verificações de saúde para garantir que está ativo.
        
    4. `kong-net`: Cria uma rede `bridge` para facilitar a comunicação entre os serviços.
        
2. **Rodar o Docker Compose**
    
    No terminal, execute o comando:
    
    ```bash
    docker-compose up
    ```
    
    Isso iniciará o Kong, o PostgreSQL e o Kong Manager.
    
3. **Entendendo as portas do Kong:**
    
    * **8000**: Porta padrão para o **Proxy**, onde suas APIs serão expostas.
        
    * **8001**: Porta para a **Admin API**, usada para configurar serviços, rotas, plugins e mais.
        
    * **8002**: Porta do **Kong Manager**, a interface gráfica que facilita a administração das APIs.
        
4. **Acessar o Kong Manager**
    
    Após subir os containers, acesse o Kong Manager em [`http://localhost:8002`](http://localhost:8002). Aqui você pode gerenciar seus serviços e rotas de maneira fácil e visual.
    
5. ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1727840510918/bc4ec8ad-0c14-4cf3-9511-2c8c7827cd53.png align="center")
    
6. **Criar um Serviço**
    
    No Kong Manager:
    
    * Vá para a aba **Gateway Services**.
        
    * Crie um novo serviço com as seguintes configurações:
        
        * **Name:** PokeAPI (Nome do seu serviço)
            
        * ***Full URL:*** [`https://pokeapi.co`](http://pokeapi.co)
            
        * **Save**
            
        
        ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1727841949754/9b4aa963-f142-492f-9413-0fba53fe9b6d.png align="center")
        
7. **Criar uma Rota para** `/api/v2/pokemon/ditto`
    
    Após criar o serviço, configure uma rota:
    
    * **Name**: Nome da Rota (meu caso, PokemonDitto)
        
    * **Service:** Selecionar o PokeAPI (ID do service (host) onde vai intermediar a rota)
        
    * **Path**: `/api/v2/pokemon/ditto`
        
    * **View Advanced Fields**
        
    * **Desmarcar opção:** Strip Path
        
    * **Save**
        
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1727843006734/a60e6adb-c342-4c14-b23f-ed16975ca596.png align="center")
    
    Agora, toda vez que você fizer uma requisição para [`http://localhost:8000/api/v2/pokemon/ditto`](http://localhost:8000/api/v2/pokemon/ditto), o Kong encaminhará a chamada para o serviço [`https://pokeapi.co/api/v2/pokemon/ditto`](http://pokeapi.co/api/v2/pokemon/ditto).
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1727840992336/7d8b88d8-585f-40d4-a11e-4ce258a84ae7.png align="center")
    
    O problema de ter somente uma rota mapeada e para o pokemon ditto, é que qualquer outro pokemon não será encontrado. Por exemplo se acessarmos agora [`http://localhost:8000/api/v2/pokemon/pikachu`](http://localhost:8000/api/v2/pokemon/pikachu), teremos a pagina de rota não encontrada:
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1727843186201/bf4cf1b9-8d12-461d-a832-e5c77b289c74.png align="center")
    
    **Criar uma Rota para acessar qualquer pokemon**
    
    Para permitir que qualquer rota dentro de `/api/v2/pokemon` seja capturada, crie uma nova rota:
    
8. * **Name**: Nome da Rota (meu caso, Pokemon)
        
    * **Service:** Selecionar o PokeAPI (ID do service (host) onde vai intermediar a rota)
        
    * **Path**: `/api/v2/pokemon`
        
    * **View Advanced Fields**
        
    * **Desmarcar opção:** Strip Path
        
    * **Save**
        
    
    Isso permitirá que qualquer chamada para `/api/v2/pokemon/<nome>` seja roteada corretamente, como `/api/v2/pokemon/pikachu`.
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1727843450389/94bdf60c-d727-49c4-bc27-68e61ab5f43a.png align="center")
    

Agora você pode gerenciar suas APIs com facilidade através do Kong Manager!

Lembrando que a ideia não era trazer muita complexidade para este primeiro post, mas conseguir rodar o kong local e fazer upstreams de 2 ou mais rotas.

Aproveitando, sugiro fortemente para que todos olhem o post do @[Leonardo do Carmo](@leocarmo) sobre [Ambiente de desenvolvimento das galáxias usando Docker](https://leocarmo.dev/ambiente-de-desenvolvimento-das-galaxias-usando-docker) com várias ferramentas indispensáveis para o ambiente local.

É isso, espero que gostem =P
