本文介绍了一个用于在 AWS EC2 上自动部署 LibreChat 的 项目 POC(概念验证),使用 Terraform 来按基础设施即代码的原则编排基础设施,使用一个 User-Data Bash 脚本在 EC2 上安装组件,并使用 AWS Systems Manager 来集中管理 API 密钥并跟踪部署进度。重点是通过使用 Spot 实例实现自动化和成本优化。
介绍
LibreChat 是一个先进的聊天机器人应用,集成了多个 AI 模型,包括 Mistral AI,并提供诸如对话搜索、创建自定义预设、编辑与继续消息以及插件集成等功能。它提供多语言与多模态的用户界面、具有安全验证的多用户管理,并且完全开源。本项目探索了在 AWS EC2 上部署 LibreChat,采用先进工具实现全自动化部署。
架构
部署的架构包含以下要素:
- 一台
EC2实例,运行Ubuntu Server。 - 一个用于自动化安装和配置 LibreChat 所需组件的 bash 脚本
User-Data。 - 使用
Terraform来定义并配置部署 LibreChat 所需的 AWS 基础设施。 - 使用
AWS Systems Manager (SSM)来存储和检索 LibreChat 所需的 API 密钥并跟踪部署进度。
自动化与基础设施即代码
Terraform
Terraform 是一个允许以代码形式定义并配置基础设施(Infrastructure as Code)的工具。在本项目中,Terraform 用于创建和配置 EC2 实例,以及相关的 AWS 资源,例如安全组和 IAM 角色。
User-Data
User-Data 的 bash 脚本在 EC2 实例首次启动时执行。它自动化安装和配置 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 -e 和 trap 'error_handler' ERR 的错误处理
在 User-Data 脚本中,通过使用 set -e 和 trap '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 -e 和 trap 'error_handler' ERR,一旦发生错误部署就会立即停止,有助于调试和问题定位。此外,在 AWS SSM 中更新部署状态可以跟踪部署进度并快速发现问题。
使用 Spot 实例以降低成本
Spot 实例是 EC2 实例的一种,可以以低于按需实例的价格使用未被使用的容量。本项目使用 Spot 实例来降低应用托管成本。User-Data 脚本支持 Spot 实例的配置,从而在不影响应用性能的前提下获得显著的成本节省。
在 AWS EC2 上自动部署 LibreChat 时对 export.sh 的通用使用
在自动化部署 LibreChat 到 AWS EC2 的过程中,创建了一个名为 export.sh 的 shell 脚本,用于简化与部署和基础设施配置相关的各种任务管理。该脚本既可在本地工作站使用,也可在 GitLab CI 管道中使用,从而实现函数的通用且一致的使用。
脚本 export.sh 汇集了多个有用的部署与基础设施管理函数。其中包括:
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"
在该示例中,函数 terraform_plan、terraform_apply 和 terraform_destroy 在管道的不同阶段被使用。通过 source 脚本 export.sh,其中包含的函数将在管道执行环境中可用。
在本地工作站与 GitLab CI 之间共享使用 export.sh 有助于简化自动化部署 LibreChat 到 AWS EC2 的管理。此脚本中的函数简化了任务并确保对基础设施操作的一致性。
如需了解项目并查看源代码,请访问 GitLab 仓库。在其中您将找到有关架构、配置和本项目部署实践的详细信息。
默认通过 SSM 连接到实例
AWS Systems Manager (SSM) 允许默认通过 SSM 连接到 EC2 实例,而无需使用 SSH。此功能简化了对实例的访问,并通过避免将 SSH 端口暴露在 Internet 上来增强安全性。不过,仍然可以通过打开相应流量并使用相关变量来通过 SSH 访问实例。
自签名 SSL 证书与安全性
默认情况下,LibreChat 将端口 80 开放但不启用 443。在本项目中,默认启用端口 443 并使用自签名证书,端口 80 会重定向到 443。尽管浏览器会显示 HTTPS 警告,但使用 HTTPS 协议可在网络上传输时防止密码被窃取,从而提供更好的安全性。
结论
本项目探索了如何在 AWS EC2 实例上部署和配置 LibreChat,使用 Terraform 管理基础设施、使用 User-Data Bash 脚本安装组件,以及使用 AWS Systems Manager 集中管理配置并跟踪部署进度。项目同样强调通过 Spot 实例降低成本,并通过使用自签名 SSL 证书和配置 HTTP 安全头来提高安全性。
使用本项目,您将能够以高效、安全且经济的方式在 AWS EC2 实例上部署和配置 LibreChat。本项目可以扩展并适配用于在 AWS 上部署其他 Web 应用,沿用相同的自动化、基础设施即代码与集中配置管理原则。
通过 GitLab 项目继续深入探索
如需深入理解并查看 LibreChat 在 AWS EC2 上部署的技术细节(包括架构和配置),强烈建议查阅该 项目的 GitLab README。本文介绍了项目、关键概念及部署优势,但项目链接中包含所有实现细节。
本文件已使用模型 gpt-5-mini 将 fr 版本翻译为 zh 语言。欲了解有关翻译过程的更多信息,请参见 https://gitlab.com/jls42/ai-powered-markdown-translator