在容器中部署 Django + Vuejs (AWS Elastic Beanstalk)

Deploying Django + Vuejs in containers (AWS Elastic Beanstalk)

我正在使用 Django 和 Vuejs 开发一个应用程序,是时候测试与部署相关的事情了。我的应用程序将部署多次(每个未来客户 1 个实例)所以我想使用容器来更快地部署和删除虚拟机维护。

事情是:

我现在不知道如何在生产中构建 vuejs 部分。

Django 后端应该为捆绑资产提供服务,虽然我在 AWS 文档上看到我可以迁移、收集静态文件,...容器启动时的 Django 应用程序,但我不知道 when/where 我应该构建 vuejs 部分,以便让 Django 收集构建的东西。

有人可以帮我解决这个问题吗?

When/where/how 我应该构建 vuejs 部分吗?

请注意,Django 和 Vuejs 以这种方式集成:无论 URL,Django 为 Vuejs SPA 提供服务。而 Vuejs SPA 使用了使用 Django Rest Framework 制作的 Django API。

在此先感谢您的帮助。

如果需要更多信息,我将编辑此 post。

没有用过beanstalk,所以尝试帮助ECR + ECS + ALB堆栈。

此外,您没有提供很多关于您的配置的信息,而且您的问题有点宽泛,无法明确回答。所以下面的描述是一个典型的情况,可能不适用于你的情况。

  1. 创建您自己的自定义容器映像:

    • 一个用于前端。那将是 Nginx + 编译的 Vue 代码。换句话说静态内容的图像
    • 一个用于后端。那将是 Django + 一些应用程序服务器(gunicorn、uwsgi 等)。

    并将其汇集到 ECR。

    这些图像将通过某些 CI/CD 工具或手动更新。您必须每次都在您的环境中的某个地方构建它。由你决定

  2. 创建 ECS 集群(或 Front 和 Back 两个)。设置必须同时 运行 的容器数量、要侦听的端口等。ECS 将从第一步开始使用您的图像到 运行 个容器。

  3. 创建应用程序负载均衡器并将所有路径 api/(域。com/api/url)重定向到后端容器,将所有其他路径重定向到前端(必须创建两个目标组)。

  4. 为负载均衡器 HTTPS 侦听器创建 SSL 证书

更新 1:回答 When/where/how should I build the vuejs part ?

根据 this information beantalk 可以将您的自定义图像用于 运行 容器

The Docker and Multicontainer Docker platforms for Elastic Beanstalk support the use of Docker images stored in a public or private online image repository.

因此,如果您将 Vue 和 Django 存储在一个容器中:

  1. 什么时候构建vuejs部分

    任何时候你想要向你的基础架构发布新代码

  2. 我应该在哪里构建vuejs部分

    已安装 Docker

    的 server/compute 服务的任何位置
  3. vuejs部分应该怎么搭建

    • 构建Vue静态代码
    • 复制到 Django 目录
    • 使用 Django + Vue 内容创建 Docker 图像
    • 将图像拉到 AWS ECR 并更新它的版本
    • 从更新的映像发布(运行 个新容器)更新的服务
    • 在新版本上重复

更新 2:回答 Concerning the uploaded images, I guess I have to save them on some AWS S3 storage somehow ?

最好的方法是在 S3 中使用 S3 作为 static content storage (You can even store all Vue 代码并且根本不要将容器用于前端)
Django 也 supports S3。而且还蛮方便的。

※ 如果您尝试 运行 Vue on S3

,请不要忘记 CORS 设置

但正如我所想,您已经拥有使用 usual POSIX storage instead of S3-like Object storage. So here will be easier to mount permanent shared EFS volume to your containers 的完整服务。在这种情况下,您可以 运行 服务而无需更改任何代码。

如果你有时间调整对象存储的代码,我推荐使用这种方式。