# Elixir CDN Assets Manager

[![Build Status](](
[![ version](](

### Content Delivery Network Package for Elixir/Phoenix.

This package provides the developer the ability to upload assets to a CDN with single mix command.  
Inspired by [Vinelab/cdn](

## Overview

<img src="" width="600">

## Installation

If [available in Hex](, the package can be installed as:

1. Add cdn to your list of dependencies in `mix.exs`:

{:cdn, "~> 0.0.4"}

## Configuration

Firstly this package is relies on [ex_aws]( then setting `ex_aws` before configuration.

`:ex_aws` must always be added to your applications list.

def application do
  [applications: [:ex_aws, :httpoison, :poison]]

Export your AWS access key ID and Secret to your environmet variable(recommend)

export AWS_ACCESS_KEY_ID=your_access_key_id
export AWS_SECRET_ACCESS_KEY=your_secret_access_key

or set config in mix.exs.

config :ex_aws,
  access_key_id: [{:system, "AWS_ACCESS_KEY_ID"}, :instance_role],
  secret_access_key: [{:system, "AWS_SECRET_ACCESS_KEY"}, :instance_role]

and set your region.

config :ex_aws,
  region: "us-east-1"

After that Configure `:cdn` in `config.exs`.(Example)

config :cdn,  bucket: "",
              include: [
                directories: ["priv/static", "public/bin"],
                patterns: ["**/*", "**/*.css"],
                hidden: true
              exclude: [
                directories: [],
                patterns: [],
                hidden: true
              acl: :public_read,
              cache_control: "max-age=#{86400 * 30}",
              expires_after: 86400 * 30,
              cloudfront_url: "",
              bypass: false

This means it should be include files matched pattern `**/*` or `**/*.css` in `priv/static` or `public/bin`. Also includes hidden files(filename starts with `.`). And base url for asset helper is ``, but always outputs local file url for asset helper because `bypass` is false.   

- `bucket`: A bucket name of s3
- `include`: Setting for upload target
  - `directories`: List of upload directory(`default`: `["priv/static"]`)
  - `patterns`: List of upload pattern(`default`: `["**/*"]`)
  - `hidden`: Include hidden files or not
- `exclude`: Exclude targets
- `acl`: Default acl for assets
- `cloudfront_url`: URL of CDN endopoint (e.g. ``)
- `bypass`: Return local asset if `bypass` is `true` in cdn helper.

## Usage

### Commands

- Upload to S3

mix cdn.push

- Empty bucket

mix cdn.empty

### Asset Helper

Import CDN Helper to your dependency

- Phoenix


def view do
  quote do
    # Import CDN helper
    import Cdn.Helpers

then you can load static file like this.

<%= cdn(static_path(@conn, "/css/app.css")) %>

# MIX_ENV=dev
<%= cdn(static_path(@conn, "/css/app.css")) %> #=> "/css/app.css"

# MIX_ENV=prod
<%= cdn(static_path(@conn, "/css/app.css")) %> #=> ""

## Contributing

1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request