Este artigo apresenta um projeto POC (Proof of Concept) para o desdobramento automatizado do LibreChat na AWS EC2, usando Terraform para orquestrar a infraestrutura de acordo com o princípio de Infraestrutura como Código, um script de Bash User-Data para instalar os componentes na EC2, e AWS Systems Manager para gerenciamento centralizado das chaves de API e acompanhamento do desdobramento. A ênfase está na automação e otimização de custos através do uso de instâncias Spot.

Introdução

LibreChat é um aplicativo avançado de chatbot que integra vários modelos de IA, incluindo Mistral AI, e oferece funcionalidades como pesquisa em conversas, criação de presets personalizados, edição e continuação de mensagens, bem como integração de plugins. Ele oferece uma interface de usuário multilíngue e multimodal, gerenciamento multiusuário com autenticação segura, e é totalmente open-source. Este projeto explora seu desdobramento na AWS EC2, utilizando ferramentas avançadas para uma implementação totalmente automatizada.

Arquitetura

A arquitetura implantada inclui os seguintes elementos:

  1. Uma instância EC2 executando Ubuntu Server.
  2. Um script User-Data em bash para automatizar a instalação e configuração dos componentes necessários ao LibreChat.
  3. Terraform para definir e provisionar a infraestrutura AWS necessária para o desdobramento do LibreChat.
  4. AWS Systems Manager (SSM) para armazenar e recuperar as chaves de API necessárias para o LibreChat e acompanhar o progresso do desdobramento.

Automação e Infraestrutura como Código

Terraform

Terraform é uma ferramenta que permite definir e provisionar a infraestrutura como código (Infrastructure as Code). Neste projeto, o Terraform é utilizado para criar e configurar a instância EC2, assim como os recursos AWS associados, como grupos de segurança e papéis IAM.

User-Data

O script User-Data em bash é executado na primeira inicialização da instância EC2. Ele automatiza a instalação e configuração dos componentes necessários ao LibreChat, como Docker, Docker Compose, Git, Node.js e NPM. O script User-Data também permite configurar as chaves de API necessárias ao LibreChat, como as chaves OpenAI, MistralAI, Anthropic, Google API e Google CSE ID, recuperando-as do AWS Systems Manager (SSM).

Uma função update_status é definida no script User-Data para atualizar o status do desdobramento via AWS SSM. Esta função permite monitorar o estado do desdobramento e detectar rapidamente possíveis problemas. O script User-Data também envia a função update_registration.sh e a adiciona no cron para ativar ou desativar registros.

Exemplo da função update_status:

update_status() {
  STATUS_MESSAGE=$1
  aws ssm put-parameter --name "/librechat/deployment-status" --type "String" --value "$STATUS_MESSAGE" --overwrite --region $AWS_DEFAULT_REGION
}

Exemplo da função update_registration.sh:

#!/bin/bash
set -e

# Update registration status in SSM Parameter Store
aws ssm put-parameter --name "/librechat/registration_enabled" --type "String" --value "$1" --overwrite --region $AWS_DEFAULT_REGION

# Update LibreChat configuration file
if [ "$1" == "true" ]; then
  sed -i 's/enabled: false/enabled: true/g' /opt/librechat/config.yaml
else
  sed -i 's/enabled: true/enabled: false/g' /opt/librechat/config.yaml
fi

# Restart LibreChat service
systemctl restart librechat

A função update_registration.sh é utilizada para atualizar o status de ativação dos registros no SSM Parameter Store e no arquivo de configuração do LibreChat. O serviço LibreChat é então reiniciado para aplicar as modificações.

Acompanhamento do progresso do desdobramento com SSM

O AWS Systems Manager (SSM) é um serviço que permite gerenciar e configurar as instâncias EC2 de maneira centralizada. Neste projeto, o SSM é utilizado para armazenar e recuperar as chaves de API necessárias ao LibreChat, assim como para acompanhar o progresso do desdobramento.

Uma função check_deployment_status também é definida no script export.sh para verificar o status do desdobramento via AWS SSM. Esta função permite acompanhar em tempo real o progresso da implantação e detectar rapidamente quaisquer problemas.

Exemplo da função check_deployment_status:

check_deployment_status() {
  LAST_STATUS=""
  INSTANCE_ID=$(terraform output -raw instance_id)  # Récupère l'ID de l'instance Terraform.
  if [ -z "$INSTANCE_ID" ]; then
    echo "Aucune instance EC2 n'est actuellement déployée ou terraform output n'est pas configuré correctement."
    return 1
  fi
  IP_ADDRESS=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID --query "Reservations[*].Instances[*].PublicIpAddress" --output text --region $AWS_DEFAULT_REGION 2>/dev/null)
  URL="https://$IP_ADDRESS/"
  echo "Vérification de l'état de déploiement..."
  ATTENTE_STATUS=true  # Utilisée pour contrôler l'affichage du message d'attente.
  while true; do
    STATUS=$(aws ssm get-parameter --name "/librechat/deployment-status" --query "Parameter.Value" --output text --region $AWS_DEFAULT_REGION 2>/dev/null)
    if [ $? -ne 0 ]; then
      if [ "$ATTENTE_STATUS" = true ]; then
        echo -ne "\rEn attente des informations de statut de déploiement.\n"
        ATTENTE_STATUS=false  # Empêche la répétition du message.
      fi
      sleep 1
      continue
    else
      ATTENTE_STATUS=true  # Réinitialise pour le prochain cycle.
    fi
    if [[ "$STATUS" != "$LAST_STATUS" ]]; then
      if [[ "$LAST_STATUS" != "" ]]; then
        echo -e " \e[32m✓\e[0m"  # Affiche une coche verte pour le statut précédent.
      fi
      echo -ne "\rÉtat actuel du déploiement : $STATUS"
      LAST_STATUS="$STATUS"
      if [[ "$STATUS" == "100% - Installation terminée" ]]; then
        echo -e "\n\e[32m✓ Installation terminée avec succès\e[0m"
        echo -e "Accédez à l'instance Librechat via : $URL"
        break
      elif [[ "$STATUS" == "Echec de l'installation" ]]; then
        echo -e "\n\e[31m✗ Échec de l'installation\e[0m"
        exit 1
      fi
    fi
    sleep 1
  done
}
}

O status da implantação é armazenado em um parâmetro SSM, permitindo verificar o estado da implantação a qualquer momento e de qualquer lugar.

Gerenciamento de erros com set -e e trap 'error_handler' ERR

No script User-Data, um gerenciamento robusto de erros foi implementado usando set -e e trap 'error_handler' ERR. Essa abordagem garante que o script pare imediatamente em caso de erro e forneça informações detalhadas sobre o problema encontrado.

Aqui está um trecho do script User-Data com o gerenciamento de erros integrado:

#!/bin/bash
set -e
trap 'error_handler' ERR

error_handler() {
  local error_message=$1
  echo "Error occurred: ${error_message}"
  update_status "ERROR: ${error_message}"
  exit 1
}

update_status() {
  STATUS_MESSAGE=$1
  aws ssm put-parameter --name "/librechat/deployment-status" --type "String" --value "$STATUS_MESSAGE" --overwrite --region $AWS_DEFAULT_REGION
}

A função error_handler é chamada sempre que ocorre um erro no script. Ele recebe uma mensagem de erro como parâmetro, exibe-a no console, atualiza o status da implantação via AWS SSM usando a função update_status e sai do script com um código de erro.

Graças a set -e e trap 'error_handler' ERR, a implantação é interrompida assim que um erro ocorre, o que facilita a depuração e a resolução de problemas. Além disso, a atualização do status da implantação no AWS SSM permite acompanhar o progresso da implantação e detectar rapidamente quaisquer problemas.

Redução de custos com Spot Instances

As Spot Instances são instâncias EC2 que permitem usar capacidades não utilizadas a preços reduzidos em comparação com instâncias sob demanda. Neste projeto, Spot Instances são usadas para reduzir os custos de hospedagem do aplicativo. O script User-Data suporta a configuração de Spot Instances, permitindo economias significativas de custo sem comprometer o desempenho do aplicativo.

Uso comum de export.sh na implantação automatizada do LibreChat no AWS EC2

No contexto da implantação automatizada do LibreChat no AWS EC2, foi criado um script shell chamado export.sh para facilitar o gerenciamento das diferentes tarefas relacionadas à implantação e configuração da infraestrutura. Este script é usado tanto a partir da estação de trabalho local quanto nos pipelines do GitLab CI, permitindo um uso comum e coerente das funções que ele contém.

O script export.sh agrupa várias funções úteis para implantação e gerenciamento da infraestrutura AWS. Entre elas, incluem-se:

  • terraform_plan: gera um plano Terraform para visualizar as modificações a serem feitas na infraestrutura.
  • terraform_apply: aplica as modificações do Terraform na infraestrutura AWS.
  • terraform_destroy: remove os recursos do Terraform criados durante a implantação.
  • check_deployment_status: verifica o estado da implantação em andamento consultando o AWS SSM.

Aqui está um exemplo de uso dessas funções em um pipeline GitLab CI:

stages:
  - Vérifications
  - Déploiements
  - Suppressions

Vérification Terraform:
  stage: Vérifications
  script:
    - /bin/bash -c "source export.sh && terraform_plan"

Déploiement Terraform:
  stage: Déploiements
  script:
    - /bin/bash -c "source export.sh && terraform_apply && check_deployment_status"

Suppression Terraform:
  stage: Suppressions
  script:
    - /bin/bash -c "source export.sh && terraform_destroy"

Neste exemplo, as funções terraform_plan, terraform_apply, e terraform_destroy são usadas nas diferentes etapas do pipeline GitLab CI. Ao fazer o sourcing do script export.sh, as funções que ele contém se tornam acessíveis no ambiente de execução do pipeline.

O uso comum do export.sh entre a estação de trabalho local e o GitLab CI facilita o gerenciamento da implantação automatizada do LibreChat no AWS EC2. As funções contidas nesse script simplificam as tarefas e garantem a coerência nas operações realizadas na infraestrutura.

Para saber mais sobre o projeto e consultar o código-fonte, visite o repositório GitLab. Você encontrará informações detalhadas sobre a arquitetura, configuração e as boas práticas implementadas neste projeto de implantação automatizada.

Conexão padrão com SSM na instância

AWS Systems Manager (SSM) permite conectar-se por padrão à instância EC2 sem ter que usar SSH. Esta funcionalidade simplifica o acesso à instância e reforça a segurança ao evitar expor a porta SSH à Internet. No entanto, ainda é possível acessar a instância via SSH abrindo o fluxo apropriado usando a variável associada.

Certificado SSL autoassinado e segurança

Por padrão, o Librechat torna a porta 80 acessível sem ativar a porta 443. Neste projeto, a porta 443 é ativada por padrão com um certificado autoassinado, e a porta 80 redireciona para a porta 443. Embora um aviso HTTPS seja exibido no navegador, o uso do protocolo HTTPS oferece segurança contra o roubo de senha na rede.

Conclusão

Este projeto explora a maneira de implantar e configurar o LibreChat em uma instância EC2 AWS usando Terraform para a infraestrutura, um script User-Data em bash para a instalação dos componentes, e AWS Systems Manager para a gestão centralizada das configurações e o acompanhamento do progresso da implantação. A ênfase também é colocada na redução de custos com Spot Instances e na segurança usando um certificado SSL autoassinado e na configuração dos cabeçalhos de segurança HTTP.

Ao usar este projeto, você será capaz de implantar e configurar o LibreChat em uma instância EC2 AWS de maneira eficaz, segura e econômica. Este projeto pode ser expandido e adaptado para implantar outras aplicações web na AWS usando os mesmos princípios de automação, Infrastructure as Code e gestão centralizada de configurações.

Continuar a Exploração com o Projeto GitLab

Para uma compreensão aprofundada e os detalhes técnicos da implantação do LibreChat na AWS EC2, incluindo a arquitetura e as configurações, eu encorajo fortemente a consultar o README do projeto no GitLab. Este artigo introduz o projeto, seus conceitos chave e os benefícios desta implantação, mas é no link do projeto que você encontrará todos os detalhes.

Este documento foi traduzido da versão fr para a língua pt utilizando o modelo gpt-4o. Para mais informações sobre o processo de tradução, consulte https://gitlab.com/jls42/ai-powered-markdown-translator