aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md11
-rw-r--r--lib/active_storage/config/sites.yml25
-rw-r--r--lib/active_storage/railtie.rb29
-rw-r--r--lib/active_storage/storage_services.yml27
-rw-r--r--lib/tasks/activestorage.rake15
5 files changed, 72 insertions, 35 deletions
diff --git a/README.md b/README.md
index 1f0f30098d..b771629cd0 100644
--- a/README.md
+++ b/README.md
@@ -53,13 +53,12 @@ class MessagesController < ApplicationController
end
```
-## Configuration
+## Installation
-Add `require "active_storage"` to config/application.rb and create a `config/initializers/active_storage_services.rb` with the following:
-
-```ruby
-
-```
+1. Add `require "active_storage"` to config/application.rb.
+2. Run rails activestorage:install to create needed directories, migrations, and configuration.
+3. Configure the storage service in config/environments/* with `config.active_storage.service = :local`
+ that references the services configured in config/storage_services.yml.
## Todos
diff --git a/lib/active_storage/config/sites.yml b/lib/active_storage/config/sites.yml
deleted file mode 100644
index 317ef2b9b7..0000000000
--- a/lib/active_storage/config/sites.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-# Configuration should be something like this:
-#
-# config/environments/development.rb
-# config.active_storage.service = :local
-#
-# config/environments/production.rb
-# config.active_storage.service = :amazon
-local:
- service: Disk
- root: <%%= File.join(Dir.tmpdir, "active_storage") %>
-
-amazon:
- service: S3
- access_key_id: <%%= Rails.application.secrets.aws[:access_key_id] %>
- secret_access_key: <%%= Rails.application.secrets.aws[:secret_access_key] %>
- region: us-east-1
- bucket: <%= Rails.application.class.name.remove(/::Application$/).underscore %>
-
-google:
- service: GCS
-
-mirror:
- service: Mirror
- primary: amazon
- secondaries: google
diff --git a/lib/active_storage/railtie.rb b/lib/active_storage/railtie.rb
index 15ab8aa096..76894c2e16 100644
--- a/lib/active_storage/railtie.rb
+++ b/lib/active_storage/railtie.rb
@@ -23,5 +23,34 @@ module ActiveStorage
extend ActiveStorage::Attached::Macros
end
end
+
+ config.after_initialize do |app|
+ config_choice = app.config.active_storage.service
+ config_file = Pathname.new(Rails.root.join("config/storage_services.yml"))
+
+ if config_choice
+ raise("Couldn't find Active Storage configuration in #{config_file}") unless config_file.exist?
+
+ begin
+ require "yaml"
+ require "erb"
+ configs = YAML.load(ERB.new(config_file.read).result) || {}
+
+ if service_configuration = configs[config_choice.to_s].symbolize_keys
+ service_name = service_configuration.delete(:service)
+
+ ActiveStorage::Blob.service = ActiveStorage::Service.configure(service_name, service_configuration)
+ else
+ raise "Couldn't configure Active Storage as #{config_choice} was not found in #{config_file}"
+ end
+ rescue Psych::SyntaxError => e
+ raise "YAML syntax error occurred while parsing #{config_file}. " \
+ "Please note that YAML must be consistently indented using spaces. Tabs are not allowed. " \
+ "Error: #{e.message}"
+ rescue => e
+ raise e, "Cannot load `Rails.config.active_storage.service`:\n#{e.message}", e.backtrace
+ end
+ end
+ end
end
end
diff --git a/lib/active_storage/storage_services.yml b/lib/active_storage/storage_services.yml
new file mode 100644
index 0000000000..d3f001a27b
--- /dev/null
+++ b/lib/active_storage/storage_services.yml
@@ -0,0 +1,27 @@
+test:
+ service: Disk
+ root: <%= Rails.root.join("tmp/storage") %>
+
+local:
+ service: Disk
+ root: <%= Rails.root.join("storage") %>
+
+# Use rails secrets:edit to set the AWS secrets (as shared:aws:access_key_id|secret_access_key)
+amazon:
+ service: S3
+ access_key_id: <%= Rails.application.secrets.aws[:access_key_id] %>
+ secret_access_key: <%= Rails.application.secrets.aws[:secret_access_key] %>
+ region: us-east-1
+ bucket: your_own_bucket
+
+# Remember not to checkin your GCS keyfile to a repository
+google:
+ service: GCS
+ project: your_project
+ keyfile: <%= Rails.root.join("path/to/gcs.keyfile") %>
+ bucket: your_own_bucket
+
+mirror:
+ service: Mirror
+ primary: local
+ secondaries: [ amazon, google ]
diff --git a/lib/tasks/activestorage.rake b/lib/tasks/activestorage.rake
index ff44958151..09aefef0d8 100644
--- a/lib/tasks/activestorage.rake
+++ b/lib/tasks/activestorage.rake
@@ -2,10 +2,17 @@ require "fileutils"
namespace :activestorage do
desc "Copy over the migration needed to the application"
- task :migration do
- FileUtils.cp \
- File.expand_path("../../active_storage/migration.rb", __FILE__),
- Rails.root.join("db/migrate/#{Time.now.utc.strftime("%Y%m%d%H%M%S")}_active_storage_create_tables.rb")
+ task :install do
+ FileUtils.mkdir_p Rails.root.join("storage")
+ FileUtils.mkdir_p Rails.root.join("tmp/storage")
+ puts "Made storage and tmp/storage directories for development and testing"
+
+ FileUtils.cp File.expand_path("../../active_storage/storage_services.yml", __FILE__), Rails.root.join("config")
+ puts "Copied default configuration to config/storage_services.yml"
+
+ migration_file_path = "db/migrate/#{Time.now.utc.strftime("%Y%m%d%H%M%S")}_active_storage_create_tables.rb"
+ FileUtils.cp File.expand_path("../../active_storage/migration.rb", __FILE__), Rails.root.join(migration_file_path)
+ puts "Copied migration to #{migration_file_path}"
puts "Now run rails db:migrate to create the tables for Active Storage"
end