Este artigo apresenta um projeto POC (Proof of Concept) para a implantação automatizada do LibreChat na AWS EC2, utilizando o Terraform para orquestrar a infraestrutura segundo o princípio de Infraestrutura como Código, um script User-Data em Bash para instalar os componentes na EC2, e o AWS Systems Manager para uma gestão centralizada das chaves de API e o acompanhamento da implantação. O foco está na automação e na otimização de custos através do uso de instâncias Spot.
Introdução
LibreChat é uma aplicação avançada de chatbot que integra vários modelos de IA, incluindo Mistral AI, e oferece funcionalidades como pesquisa nas conversas, criação de predefinições personalizadas, edição e continuação de mensagens, bem como integração de plugins. Apresenta uma interface multilingue e multimodal, gestão multiutilizador com autenticação segura, e é totalmente open-source. Este projeto explora o seu deployment na AWS EC2, utilizando ferramentas avançadas para uma implementação totalmente automatizada.
Arquitetura
A arquitetura implantada compreende os seguintes elementos:
- Uma instância
EC2executandoUbuntu Server. - Um script
User-Dataem bash para automatizar a instalação e a configuração dos componentes necessários ao LibreChat. Terraformpara definir e provisionar a infraestrutura AWS necessária ao deployment do LibreChat.AWS Systems Manager (SSM)para armazenar e recuperar as chaves de API necessárias ao LibreChat e acompanhar o progresso da implantação.
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, bem como os recursos AWS associados, como grupos de segurança e roles IAM.
User-Data
O script User-Data em bash é executado durante a primeira inicialização da instância EC2. Ele automatiza a instalação e a configuração dos componentes necessários ao LibreChat, tais 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 estado da implantação via AWS SSM. Essa função permite monitorar o estado da implantação e detectar rapidamente eventuais problemas. O script User-Data também envia a função update_registration.sh e a agenda no cron para ativar ou desativar os 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 é usada para atualizar o estado de ativação dos registros no SSM Parameter Store e no ficheiro de configuração do LibreChat. O serviço LibreChat é então reiniciado para aplicar as alterações.
Acompanhamento do progresso da implantação com SSM
AWS Systems Manager (SSM) é um serviço que permite gerir e configurar instâncias EC2 de forma centralizada. Neste projeto, o SSM é usado para armazenar e recuperar as chaves de API necessárias ao LibreChat, bem como para acompanhar o progresso da implantação.
Uma função check_deployment_status também é definida no script export.sh para verificar o estado da implantação via AWS SSM. Essa função permite acompanhar em tempo real o progresso da implantação e detectar rapidamente possíveis 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 estado da implantação é armazenado num parâmetro SSM, o que permite consultar o estado da implantação a qualquer momento e a partir de qualquer lugar.
Gestão de erros com set -e e trap 'error_handler' ERR
No script User-Data, foi implementada uma gestão de erros robusta usando set -e e trap 'error_handler' ERR. Esta 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 a gestão de erros integrada :
#!/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. Ela recebe uma mensagem de erro como parâmetro, exibe-a na consola, atualiza o estado 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 ocorre um erro, o que facilita o debugging e a resolução dos problemas. Além disso, a atualização do estado da implantação no AWS SSM permite acompanhar o progresso e detectar rapidamente eventuais problemas.
Redução de custos com Spot Instances
As Spot Instances são instâncias EC2 que permitem utilizar capacidades ociosas a preços reduzidos em comparação com instâncias sob demanda. Neste projeto, são usadas Spot Instances para reduzir os custos de hospedagem da aplicação. O script User-Data suporta a configuração de Spot Instances, permitindo obter reduções de custo significativas sem comprometer o desempenho da aplicação.
Uso comum de export.sh no deployment automatizado do LibreChat na AWS EC2
No âmbito do deployment automatizado do LibreChat na AWS EC2, foi criado um script shell chamado export.sh para facilitar a gestão das diversas tarefas relacionadas com a implantação e a configuração da infraestrutura. Este script é usado tanto a partir da estação de trabalho local como nos pipelines do GitLab CI, permitindo um uso comum e coerente das funções que contém.
O script export.sh agrupa várias funções úteis para o deployment e a gestão da infraestrutura AWS. Entre elas, encontram-se:
terraform_plan: gera um plano Terraform para pré-visualizar as alterações a aplicar na infraestrutura.terraform_apply: aplica as alterações Terraform na infraestrutura AWS.terraform_destroy: remove os recursos Terraform criados durante o deployment.check_deployment_status: verifica o estado da implantação em curso interrogando o AWS SSM.
Aqui está um exemplo de utilização destas funções num 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 sourcear o script export.sh, as funções que ele contém tornam-se acessíveis no ambiente de execução do pipeline.
O uso comum de export.sh entre a estação de trabalho local e o GitLab CI facilita a gestão do deployment automatizado do LibreChat na AWS EC2. As funções contidas neste script simplificam as tarefas e asseguram coerência nas operações efetuadas sobre a infraestrutura.
Para saber mais sobre o projeto e consultar o código-fonte, visite o repositório GitLab. Lá encontrará informações detalhadas sobre a arquitetura, a configuração e as boas práticas implementadas neste projeto de deployment automatizado.
Conexão por defeito com SSM na instância
AWS Systems Manager (SSM) permite ligar-se por defeito à instância EC2 sem ter de usar SSH. Esta funcionalidade simplifica o acesso à instância e reforça a segurança ao evitar expor a porta SSH à Internet. No entanto, continua a ser possível aceder à instância via SSH abrindo o fluxo apropriado através da variável associada.
Certificado SSL autoassinado e segurança
Por defeito, o Librechat torna a porta 80 acessível sem ativar a porta 443. Neste projeto, a porta 443 é ativada por defeito 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 uma proteção contra o roubo de palavra-passe na rede.
Conclusão
Este projeto explora a forma de implantar e configurar o LibreChat numa instância EC2 AWS utilizando Terraform para a infraestrutura, um script User-Data em bash para a instalação dos componentes, e o AWS Systems Manager para a gestão centralizada das configurações e o acompanhamento do progresso da implantação. O foco também está na redução de custos com Spot Instances e na segurança, usando um certificado SSL autoassinado e configurando os headers de segurança HTTP.
Ao usar este projeto, será capaz de implantar e configurar o LibreChat numa instância EC2 AWS de forma eficiente, 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, Infraestrutura como Código e gestão centralizada das configurações.
Continuar a exploração com o projeto GitLab
Para uma compreensão aprofundada e os detalhes técnicos do deployment do LibreChat na AWS EC2, incluindo a arquitetura e as configurações, encorajo vivamente a consultar o README do projeto no GitLab. Este artigo introduz o projeto, os seus conceitos-chave e as vantagens deste deployment, mas é no link do projeto que encontrará todos os detalhes.
Este documento foi traduzido da versão fr para a língua pt usando o modelo gpt-5-mini. Para mais informações sobre o processo de tradução, consulte https://gitlab.com/jls42/ai-powered-markdown-translator