【问题标题】:Deploying Django + Vuejs in containers (AWS Elastic Beanstalk)在容器中部署 Django + Vuejs (AWS Elastic Beanstalk)
【发布时间】:2021-09-10 11:16:14
【问题描述】:

我正在使用 Django 和 Vuejs 开发一个应用程序,现在是时候测试部署相关的东西了。我的应用将部署多次(每个未来客户 1 个实例),因此我想使用容器来加快部署速度并消除虚拟机维护。

事情是这样的:

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

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

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

我应该何时/何地/如何构建 vuejs 部分?

请注意,Django 和 Vuejs 是这样集成的:无论 URL 是什么,Django 都为 Vuejs SPA 提供服务。并且 Vuejs SPA 使用使用 Django Rest Framework 制作的 Django API。

提前感谢您的帮助。

如果需要更多信息,我会编辑这篇文章。

【问题讨论】:

    标签: django vue.js amazon-elastic-beanstalk


    【解决方案1】:

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

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

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

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

      并将其汇集到 ECR。

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

    2. 创建 ECS 集群(或两个用于 Front 和 Back)。设置必须同时运行多少个容器、监听哪些端口等。ECS 将使用您在第一步中的镜像来运行容器。

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

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

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

    根据this information beanstalk 可以使用你的自定义镜像来运行容器

    用于 Elastic Beanstalk 的 Docker 和多容器 Docker 平台支持使用存储在公共或私有在线映像存储库中的 Docker 映像。

    所以,如果你将 Vue 和 Django 存储在一个容器中:

    1. 我应该什么时候构建 vuejs 部分

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

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

      在您的服务器/计算服务上安装了 Docker 的任何地方

    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 作为static content 存储(您甚至可以在 S3 上使用store all Vue 编码,并且根本不使用容器作为前端)
    Django 也supports S3。而且很方便。

    ※ 如果您要尝试在 S3 上运行 Vue,请不要忘记 CORS 设置

    但我可以假设,您已经有一个使用usual POSIX storage instead of S3-like Object storage 的完整服务。所以这里会更容易mount permanent shared EFS volume to your containers。在这种情况下,您无需更改任何代码即可运行服务。

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

    【讨论】:

    • 我的配置缺少什么?我可以在描述中添加它。否则,您的解决方案意味着每位客户需要 2 个容器?
    • 不知道能不能解释一下,这里有很多细节:1.如何分离静态内容和API响应,2.如何分离Vue和Django容器(将Vue内容存储为Django的静态文件通常不会一个好方法),3.您计划使用Docker或Python等什么beantalks平台。关于每个客户的容器,您可以按照您的描述集成Django和Vue,但这在通常情况下并不方便。例如,即使只更新前端,您也需要始终重建后端,反之亦然。
    • 您的回答启发了我,我绝对应该建立前后的完整图像并按原样使用此图像。而不是试图在旅途中启动 Django 后端并在那一刻构建前端来收集构建的资产。所以我猜我应该每个版本都有一个图像。这是最简单的方法。关于上传的图片(我的意思是例如个人资料图片,甚至是 pdf 文件),我想我必须以某种方式将它们保存在一些 AWS S3 存储中?
    • I guess I have to save them on some AWS S3 storage somehow ? → 更新了我的答案
    • 感谢您花时间回答。它帮助了我!我会接受您的回答并花时间关注您提供的不同链接。
    猜你喜欢
    • 2020-03-24
    • 2015-09-20
    • 2020-08-02
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2017-04-11
    相关资源
    最近更新 更多