这篇文章介绍了一个 项目 POC(概念验证),目的是在AWS EC2上自动部署LibreChat,使用Terraform根据Infrastructure as Code的原则来编排基础设施,使用bash编写的User-Data脚本来安装EC2组件,并使用AWS Systems Manager进行API密钥的集中管理和部署跟踪。重点放在通过使用Spot实例来实现自动化和成本优化。

引言

LibreChat 是一个先进的聊天机器人应用程序,整合了多种人工智能模型,包括Mistral AI,并提供了包括对话检索、自定义预设创建、消息编辑和续写以及插件集成等功能。它提供了多语言和多模态的用户界面,多用户管理以及安全认证,并且是完全开源的。这个项目探讨了在AWS EC2上部署它,使用先进的工具实现完全自动化操作。

架构

部署的架构包括以下部分:

  1. 运行Ubuntu ServerEC2实例。
  2. 一个用bash编写的User-Data脚本,用于自动化安装和配置LibreChat所需的组件。
  3. Terraform,用于定义和配置部署LibreChat所需的AWS基础设施。
  4. AWS Systems Manager (SSM),用于存储和检索LibreChat所需的API密钥,并跟踪部署进度。

自动化和代码化基础设施

Terraform

Terraform是一个工具,允许以代码形式定义和配置基础设施(Infrastructure as Code)。在这个项目中,Terraform被用来创建和配置EC2实例,以及与之关联的AWS资源,如安全组和IAM角色。

User-Data

在EC2实例首次启动时执行bash编写的User-Data脚本。它自动化安装和配置LibreChat所需的组件,如Docker、Docker Compose、Git、Node.js和NPM。User-Data脚本还允许配置LibreChat所需的API密钥,如OpenAI、MistralAI、Anthropic、Google API和Google CSE ID的密钥,通过AWS Systems Manager (SSM)进行检索。

在User-Data脚本中定义了一个update_status功能,用于通过AWS SSM更新部署状态。这个功能允许监控部署状态和快速检测潜在问题。User-Data脚本还推送了update_registration.sh功能,并将其置于cron中以激活或禁用注册。

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
}

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

update_registration.sh功能用于在SSM Parameter Store和LibreChat配置文件中更新注册激活状态。然后重启LibreChat服务以应用更改。

使用SSM跟踪部署进度

AWS Systems Manager (SSM)是一个服务,它允许集中管理和配置EC2实例。在这个项目中,SSM用于存储和检索LibreChat所需的API密钥,并跟踪部署进度。

还在export.sh脚本中定义了一个check_deployment_status功能,用于通过AWS SSM检查部署状态。 这个功能允许实时跟踪部署进度并迅速检测到可能存在的问题。

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
}
}

部署状态被存储在一个 SSM 参数中,这允许您随时随地查询部署状态。

使用 set -etrap 'error_handler' ERR 进行错误管理

在 User-Data 脚本中,使用了 set -etrap 'error_handler' ERR 实施了强大的错误管理。这种方法确保了一旦发生错误脚本就会立即停止,并提供关于遇到的问题的详细信息。

下面是一个带有集成错误管理的 User-Data 脚本片段:

#!/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
}

每当脚本出现错误时都会调用 error_handler 函数。它接受一个错误信息作为参数,将其显示在控制台上,使用 update_status 函数通过 AWS SSM 更新部署状态,并以错误代码退出脚本。

得益于 set -etrap 'error_handler' ERR,一旦发生错误部署就会立即停止,这简化了调试和问题解决。此外,在 AWS SSM 中更新部署状态可以实时跟踪部署进度并迅速检测到可能存在的问题。

使用 Spot Instances 降低成本

Spot Instances 是 EC2 实例,允许您以低于按需实例的价格使用未利用的容量。在这个项目中,使用 Spot Instances 来降低应用程序托管成本。User-Data 脚本支持配置 Spot Instances,这可以在不影响应用程序性能的情况下实现重大的成本节省。

在 AWS EC2 上自动部署 LibreChat 的 export.sh 的共同使用

在 AWS EC2 上自动部署 LibreChat 的过程中,创建了一个名为 export.sh 的 shell 脚本,以便简化与部署和基础设施配置相关的各项任务。该脚本既可从本地工作站使用,也可在 GitLab CI 管道中使用,从而实现其包含的功能的共同且一致的使用。

export.sh 脚本包括了多个对于部署和管理 AWS 基础设施有用的功能。其中包括:

  • terraform_plan :生成 Terraform 计划以预览对基础设施的改动。
  • terraform_apply :在 AWS 基础设施上应用 Terraform 改动。
  • terraform_destroy :删除部署过程中创建的 Terraform 资源。
  • check_deployment_status :通过查询 AWS SSM 来检查正在进行的部署状态。

下面是这些功能在 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"

在这个例子中,在 GitLab CI 管道的不同阶段使用了 terraform_planterraform_applyterraform_destroy 功能。通过 sourced(源)export.sh 脚本,它所包含的功能在管道的执行环境中变得可访问。

在本地工作站和 GitLab CI 之间共同使用 export.sh 有助于简化在 AWS EC2 上 LibreChat 的自动部署管理。这个脚本中包含的功能简化了任务并确保对基础设施进行的操作的一致性。

要了解更多关于项目和查看源代码,请访问 GitLab 仓库。 您将在此找到有关此自动化部署项目中实施的架构、配置和最佳实践的详细信息。

使用 SSM 默认连接到实例

AWS Systems Manager (SSM) 允许默认连接到 EC2 实例,无需使用 SSH。该功能简化了对实例的访问,并通过避免将SSH端口暴露在互联网上增强了安全性。然而,仍然可以通过使用关联的变量打开适当的流来通过SSH访问实例。

自签名 SSL 证书和安全性

默认情况下,Librechat 会让端口 80 可访问,而不启用端口 443。在这个项目中,默认启动了端口443和一个自签名证书,并且将端口80重定向到端口443。虽然浏览器中会显示一个HTTPS警告,但是使用HTTPS协议可以提供网络上密码盗窃的安全防护。

结论

这个项目探讨了如何使用 Terraform 来部署和配置 AWS EC2 实例上的 LibreChat,使用 bash 的 User-Data 脚本来安装组件,以及 AWS Systems Manager 进行配置的集中管理和部署进度的跟踪。此外,还强调了通过使用自签名 SSL 证书和配置 HTTP 安全头部,以及利用 Spot Instances 来降低成本的重要性。

通过使用这个项目,您将能够高效、安全和经济地在 AWS EC2 实例上部署和配置 LibreChat。这个项目可以被扩展和适配,以便使用相同的自动化原则、基础设施即代码和配置集中管理来部署 AWS 上的其他 Web 应用程序。

用 GitLab 项目继续探索

为了深入理解 LibreChat 在 AWS EC2 上的部署,包括架构和配置的技术细节,我强烈建议您查阅 GitLab 上的项目 README。这篇文章介绍了项目、其核心概念和部署的优势,但你将在项目链接中找到所有详细信息。

此文档已使用gpt-4-1106-preview模型从fr版翻译成zh。有关翻译过程的更多信息,请访问 https://gitlab.com/jls42/ai-powered-markdown-translator