在Amazon S3上存储Phoenix静态资产

时间:2017-04-05 11:04:51

标签: heroku amazon-s3 elixir assets phoenix-framework

在提出问题之前,我需要提供一些背景信息:

CONTEXT

我有一个 Phoenix 应用程序正在部署到 Heroku 。默认情况下,早午餐用于编译静态资产,例如.js.css和图片。

  • 这些资产存储在./assets上(从 Phoenix 1.3 开始)。
  • 这些资产编译为./priv/static/

资产digested using MD5 fingerprinting之后,编译过程会生成cache_manifest.json

重要的是要注意我使用 CloudFlare的免费版本作为CDN。

我并不关心用户上传的资产,我在谈论应用的资产

相关部分的应用config/prod.exs

config :bespoke_work, BespokeWork.Web.Endpoint, 
  on_init: {BespokeWork.Web.Endpoint, :load_from_system_env, []},
  http: [port: {:system, "PORT"}],
  url: [scheme: "https", host: System.get_env("HEROKU_HOST"), port: System.get_env("HEROKU_PORT")],
  static_url: [scheme: "https", host: System.get_env("STATIC_ASSETS"), port: 443],
  force_ssl: [rewrite_on: [:x_forwarded_proto]],
  cache_static_manifest: "priv/static/cache_manifest.json",
  secret_key_base: System.get_env("SECRET_KEY_BASE")```

问题

  1. 如何阻止Heroku构建资产,而是在部署期间自动将消化的资产上传到 Amazon S3 存储桶?

  2. 这会让Heroku的slug变小吗?

  3. 可能的解决方案

    1. 减少 Heroku的 Slug Size:

      •在Procfile重定向mix phx.digest上将消化的项目输出到/dev/null

      •为 Prod 重新定义mix deps.compile,而不是生成资产。

      1. 在本地生成资产。
        1. 手动上传或使用Shell脚本将其上传到 S3 。 (在我的情况下可能使用 Codeship的 Amazing Amazon S3 部署)
          1. 使用static_url生成“指向” S3 Bucket 的路径。
          2. 有没有更简单的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

这不是一个好主意......它甚至可能被认为是一种反模式。

但是,如果由于某种原因,这是绝对必要的,这是一种方法:

减少Heroku上的Slug大小:

自动化Amazon S3上传

•这应该通过shell脚本完成。