s3_website_monadic 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.travis.yml +3 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE +42 -0
  6. data/README.md +451 -0
  7. data/Rakefile +24 -0
  8. data/additional-docs/example-configurations.md +62 -0
  9. data/additional-docs/setting-up-aws-credentials.md +51 -0
  10. data/assembly.sbt +3 -0
  11. data/bin/s3_website +80 -0
  12. data/build.sbt +33 -0
  13. data/changelog.md +215 -0
  14. data/features/as-library.feature +29 -0
  15. data/features/cassettes/cucumber_tags/create-redirect.yml +384 -0
  16. data/features/cassettes/cucumber_tags/empty-bucket.yml +89 -0
  17. data/features/cassettes/cucumber_tags/new-and-changed-files.yml +303 -0
  18. data/features/cassettes/cucumber_tags/new-files-for-sydney.yml +211 -0
  19. data/features/cassettes/cucumber_tags/new-files.yml +355 -0
  20. data/features/cassettes/cucumber_tags/no-new-or-changed-files.yml +359 -0
  21. data/features/cassettes/cucumber_tags/one-file-to-delete.yml +390 -0
  22. data/features/cassettes/cucumber_tags/only-changed-files.yml +411 -0
  23. data/features/cassettes/cucumber_tags/s3-and-cloudfront-after-deleting-a-file.yml +434 -0
  24. data/features/cassettes/cucumber_tags/s3-and-cloudfront-when-updating-a-file.yml +435 -0
  25. data/features/cassettes/cucumber_tags/s3-and-cloudfront.yml +290 -0
  26. data/features/cloudfront.feature +54 -0
  27. data/features/command-line-help.feature +54 -0
  28. data/features/delete.feature +19 -0
  29. data/features/error_reporting.feature +24 -0
  30. data/features/instructions-for-new-user.feature +154 -0
  31. data/features/jekyll-support.feature +20 -0
  32. data/features/nanoc-support.feature +20 -0
  33. data/features/push.feature +115 -0
  34. data/features/redirects.feature +14 -0
  35. data/features/security.feature +15 -0
  36. data/features/step_definitions/steps.rb +86 -0
  37. data/features/support/env.rb +26 -0
  38. data/features/support/test_site_dirs/cdn-powered.blog.fi/_site/css/styles.css +3 -0
  39. data/features/support/test_site_dirs/cdn-powered.blog.fi/_site/index.html +5 -0
  40. data/features/support/test_site_dirs/cdn-powered.blog.fi/s3_website.yml +4 -0
  41. data/features/support/test_site_dirs/cdn-powered.when-deleted-a-file.blog.fi/_site/index.html +10 -0
  42. data/features/support/test_site_dirs/cdn-powered.when-deleted-a-file.blog.fi/s3_website.yml +5 -0
  43. data/features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_site/css/styles.css +3 -0
  44. data/features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_site/index.html +10 -0
  45. data/features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/s3_website.yml +4 -0
  46. data/features/support/test_site_dirs/create-redirects/_site/.gitkeep +0 -0
  47. data/features/support/test_site_dirs/create-redirects/s3_website.yml +6 -0
  48. data/features/support/test_site_dirs/ignored-files.com/_site/css/styles.css +4 -0
  49. data/features/support/test_site_dirs/ignored-files.com/_site/index.html +8 -0
  50. data/features/support/test_site_dirs/ignored-files.com/s3_website.yml +5 -0
  51. data/features/support/test_site_dirs/index-and-assets.blog.fi/_site/assets/picture.gif +0 -0
  52. data/features/support/test_site_dirs/index-and-assets.blog.fi/_site/css/styles.css +3 -0
  53. data/features/support/test_site_dirs/index-and-assets.blog.fi/_site/index.html +5 -0
  54. data/features/support/test_site_dirs/index-and-assets.blog.fi/s3_website.yml +3 -0
  55. data/features/support/test_site_dirs/jekyllrb.com/_site/css/styles.css +3 -0
  56. data/features/support/test_site_dirs/jekyllrb.com/_site/index.html +5 -0
  57. data/features/support/test_site_dirs/jekyllrb.com/s3_website.yml +3 -0
  58. data/features/support/test_site_dirs/my.blog-with-clean-urls.com/_site/css/styles.css +3 -0
  59. data/features/support/test_site_dirs/my.blog-with-clean-urls.com/_site/index +5 -0
  60. data/features/support/test_site_dirs/my.blog-with-clean-urls.com/s3_website.yml +3 -0
  61. data/features/support/test_site_dirs/my.blog.com/_site/css/styles.css +3 -0
  62. data/features/support/test_site_dirs/my.blog.com/_site/index.html +5 -0
  63. data/features/support/test_site_dirs/my.blog.com/s3_website.yml +3 -0
  64. data/features/support/test_site_dirs/my.sydney.blog.au/_site/css/styles.css +3 -0
  65. data/features/support/test_site_dirs/my.sydney.blog.au/_site/index.html +5 -0
  66. data/features/support/test_site_dirs/my.sydney.blog.au/s3_website.yml +4 -0
  67. data/features/support/test_site_dirs/nanoc.ws/public/output/css/styles.css +3 -0
  68. data/features/support/test_site_dirs/nanoc.ws/public/output/index.html +5 -0
  69. data/features/support/test_site_dirs/nanoc.ws/s3_website.yml +3 -0
  70. data/features/support/test_site_dirs/new-and-changed-files.com/_site/css/styles.css +4 -0
  71. data/features/support/test_site_dirs/new-and-changed-files.com/_site/index.html +8 -0
  72. data/features/support/test_site_dirs/new-and-changed-files.com/s3_website.yml +3 -0
  73. data/features/support/test_site_dirs/no-new-or-changed-files.com/_site/css/styles.css +3 -0
  74. data/features/support/test_site_dirs/no-new-or-changed-files.com/_site/index.html +5 -0
  75. data/features/support/test_site_dirs/no-new-or-changed-files.com/s3_website.yml +3 -0
  76. data/features/support/test_site_dirs/only-changed-files.com/_site/css/styles.css +3 -0
  77. data/features/support/test_site_dirs/only-changed-files.com/_site/index.html +9 -0
  78. data/features/support/test_site_dirs/only-changed-files.com/s3_website.yml +3 -0
  79. data/features/support/test_site_dirs/site-that-contains-s3-website-file.com/_site/s3_website.yml +3 -0
  80. data/features/support/test_site_dirs/site-that-contains-s3-website-file.com/s3_website.yml +3 -0
  81. data/features/support/test_site_dirs/site-with-text-doc.com/_site/file.txt +1 -0
  82. data/features/support/test_site_dirs/site.with.css-maxage.com/_site/css/styles.css +3 -0
  83. data/features/support/test_site_dirs/site.with.css-maxage.com/_site/index.html +5 -0
  84. data/features/support/test_site_dirs/site.with.css-maxage.com/s3_website.yml +5 -0
  85. data/features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/_site/css/styles.css +3 -0
  86. data/features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/_site/index.html +5 -0
  87. data/features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/s3_website.yml +5 -0
  88. data/features/support/test_site_dirs/site.with.gzipped-html.com/_site/css/styles.css +3 -0
  89. data/features/support/test_site_dirs/site.with.gzipped-html.com/_site/index.html +5 -0
  90. data/features/support/test_site_dirs/site.with.gzipped-html.com/s3_website.yml +5 -0
  91. data/features/support/test_site_dirs/site.with.maxage.com/_site/css/styles.css +3 -0
  92. data/features/support/test_site_dirs/site.with.maxage.com/_site/index.html +5 -0
  93. data/features/support/test_site_dirs/site.with.maxage.com/s3_website.yml +4 -0
  94. data/features/support/test_site_dirs/unpublish-a-post.com/_site/css/styles.css +3 -0
  95. data/features/support/test_site_dirs/unpublish-a-post.com/s3_website.yml +3 -0
  96. data/features/support/vcr.rb +20 -0
  97. data/features/website-performance.feature +57 -0
  98. data/lib/cloudfront/invalidator.rb +37 -0
  99. data/lib/s3_website/config_loader.rb +55 -0
  100. data/lib/s3_website/diff_helper.rb +113 -0
  101. data/lib/s3_website/endpoint.rb +37 -0
  102. data/lib/s3_website/errors.rb +42 -0
  103. data/lib/s3_website/jekyll.rb +5 -0
  104. data/lib/s3_website/keyboard.rb +27 -0
  105. data/lib/s3_website/nanoc.rb +5 -0
  106. data/lib/s3_website/parallelism.rb +25 -0
  107. data/lib/s3_website/paths.rb +39 -0
  108. data/lib/s3_website/retry.rb +19 -0
  109. data/lib/s3_website/tasks.rb +36 -0
  110. data/lib/s3_website/upload.rb +137 -0
  111. data/lib/s3_website/uploader.rb +177 -0
  112. data/lib/s3_website.rb +34 -0
  113. data/project/assembly.sbt +1 -0
  114. data/project/build.properties +0 -0
  115. data/project/plugins.sbt +1 -0
  116. data/project/sbt-launch-0.13.2.jar +0 -0
  117. data/resources/configuration_file_template.yml +56 -0
  118. data/s3_website.gemspec +41 -0
  119. data/sbt +4 -0
  120. data/spec/lib/cloudfront/invalidator_spec.rb +60 -0
  121. data/spec/lib/config_loader_spec.rb +20 -0
  122. data/spec/lib/endpoint_spec.rb +31 -0
  123. data/spec/lib/error_spec.rb +21 -0
  124. data/spec/lib/keyboard_spec.rb +62 -0
  125. data/spec/lib/parallelism_spec.rb +81 -0
  126. data/spec/lib/paths_spec.rb +7 -0
  127. data/spec/lib/retry_spec.rb +34 -0
  128. data/spec/lib/upload_spec.rb +303 -0
  129. data/spec/lib/uploader_spec.rb +37 -0
  130. data/spec/sample_files/hyde_site/_site/.vimrc +5 -0
  131. data/spec/sample_files/hyde_site/_site/css/styles.css +3 -0
  132. data/spec/sample_files/hyde_site/_site/index.html +1 -0
  133. data/spec/sample_files/hyde_site/s3_website.yml +3 -0
  134. data/spec/sample_files/tokyo_site/_site/.vimrc +5 -0
  135. data/spec/sample_files/tokyo_site/_site/css/styles.css +3 -0
  136. data/spec/sample_files/tokyo_site/_site/index.html +1 -0
  137. data/spec/sample_files/tokyo_site/s3_website.yml +4 -0
  138. data/spec/spec_helper.rb +1 -0
  139. data/src/main/scala/s3/website/CloudFront.scala +96 -0
  140. data/src/main/scala/s3/website/Diff.scala +42 -0
  141. data/src/main/scala/s3/website/Implicits.scala +7 -0
  142. data/src/main/scala/s3/website/Push.scala +191 -0
  143. data/src/main/scala/s3/website/Ruby.scala +12 -0
  144. data/src/main/scala/s3/website/S3.scala +139 -0
  145. data/src/main/scala/s3/website/model/Config.scala +152 -0
  146. data/src/main/scala/s3/website/model/S3Endpoint.scala +22 -0
  147. data/src/main/scala/s3/website/model/Site.scala +68 -0
  148. data/src/main/scala/s3/website/model/errors.scala +11 -0
  149. data/src/main/scala/s3/website/model/push.scala +192 -0
  150. data/src/test/scala/s3/website/S3WebsiteSpec.scala +445 -0
  151. metadata +508 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 634e20c8a7499f1c7147b0460ff7c1a7fbc4c3c8
4
+ data.tar.gz: b5cc7f546c4958744dce20476379da21e1bfcbb9
5
+ SHA512:
6
+ metadata.gz: 01ddba22131ffb857634230b553a659bb8d5ded515850849f0a41485bafff580caee2962508d9cc778735ebe6cfaf3bf14ae434c4383607ffb4f40bf8487cd38
7
+ data.tar.gz: 6a62c9c2905d0d6c2f32be332bcc7a74f115e0e5c6c878374ad800daf708eaa5a0d7c9e761464570765260135314c8a83dced0dbeaed0b1b892d51e1c9a06efc
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ .rvmrc
2
+ *.gem
3
+ .bundle
4
+ pkg/*
5
+ tmp
6
+ Gemfile.lock
7
+
8
+ .idea
9
+ target
10
+ .idea_modules
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: scala
2
+ scala:
3
+ 2.11.0
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,42 @@
1
+ Copyright (c) 2013 Lauri Lehmijoki
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
20
+
21
+ (This software is derived from the Ruby gem jekyll-s3, which was created by
22
+ Philippe Creux. Below is the MIT license of jekyll-s3.)
23
+
24
+ Copyright (c) 2011 VersaPay, Philippe Creux.
25
+
26
+ Permission is hereby granted, free of charge, to any person obtaining a copy
27
+ of this software and associated documentation files (the "Software"), to deal
28
+ in the Software without restriction, including without limitation the rights
29
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
30
+ copies of the Software, and to permit persons to whom the Software is
31
+ furnished to do so, subject to the following conditions:
32
+
33
+ The above copyright notice and this permission notice shall be included in
34
+ all copies or substantial portions of the Software.
35
+
36
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
37
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
38
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
39
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
40
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
41
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
42
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,451 @@
1
+ # Deploy your website to S3
2
+
3
+ [![Build Status](https://travis-ci.org/laurilehmijoki/s3_website.png?branch=master)](https://travis-ci.org/laurilehmijoki/s3_website)
4
+ [![Gem Version](https://fury-badge.herokuapp.com/rb/s3_website.png)](http://badge.fury.io/rb/s3_website)
5
+
6
+ ## What `s3_website` can do for you
7
+
8
+ * Create and configure an S3 website for you
9
+ * Upload your static website to AWS S3
10
+ * Jekyll and Nanoc are automatically supported
11
+ * Help you use AWS Cloudfront to distribute your website
12
+ * Improve page speed with HTTP cache control and gzipping
13
+ * Set HTTP redirects for your website
14
+ * (for other features, see the documentation below)
15
+
16
+ ## Install
17
+
18
+ gem install s3_website
19
+
20
+ `s3_website` requires Ruby. Here is documentation on installing Ruby:
21
+ <http://www.ruby-lang.org/en/downloads/>.
22
+
23
+ ## Usage
24
+
25
+ Here's how you can get started:
26
+
27
+ * Create API credentials that have sufficient permissions to S3. More info
28
+ [here](https://github.com/laurilehmijoki/s3_website/blob/master/additional-docs/setting-up-aws-credentials.md).
29
+ * Go to your website directory
30
+ * Run `s3_website cfg create`. This generates a configuration file called `s3_website.yml`.
31
+ * Put your AWS credentials and the S3 bucket name into the file
32
+ * Run `s3_website cfg apply`. This will configure your bucket to function as an
33
+ S3 website. If the bucket does not exist, the command will create it for you.
34
+ * Run `s3_website push` to push your website to S3. Congratulations! You are live.
35
+
36
+ **Important security note:** if the source code of your website is publicly
37
+ available, ensure that the `s3_website.yml` file is in the list of ignored files.
38
+ For git users this means that the file `.gitignore` should mention the
39
+ `s3_website.yml` file.
40
+
41
+ ### For Jekyll users
42
+
43
+ S3_website will automatically discover your website in the *_site* directory.
44
+
45
+ ### For Nanoc users
46
+
47
+ S3_website will automatically discover your website in the *public/output* directory.
48
+
49
+ ### For others
50
+
51
+ It's a good idea to store the `s3_website.yml` file in your project's root.
52
+ Let's say the contents you wish to upload to your S3 website bucket are in
53
+ *my_website_output*. You can upload the contents of that directory with
54
+ `s3_website push --site my_website_output`.
55
+
56
+ If you want to store the `s3_website.yml` file in a directory other than
57
+ the project's root you can specify the directory.
58
+ `s3_website push --config_dir config`.
59
+
60
+ ### Using environment variables
61
+
62
+ You can use ERB in your `s3_website.yml` file which incorporates environment variables:
63
+
64
+ ```yaml
65
+ s3_id: <%= ENV['S3_ID'] %>
66
+ s3_secret: <%= ENV['S3_SECRET'] %>
67
+ s3_bucket: blog.example.com
68
+ ```
69
+
70
+ (If you are using `s3_website` on an [EC2 instance with IAM
71
+ roles](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UsingIAM.html#UsingIAMrolesWithAmazonEC2Instances),
72
+ you can omit the `s3_id` and `s3_secret` keys in the config file.)
73
+
74
+ ## Project goals
75
+
76
+ * Provide a command-line interface tool for deploying and managing S3 websites
77
+ * Let the user have all the S3 website configurations in a file
78
+ * Minimise or remove the need to use the AWS Console
79
+ * Allow the user to deliver the website via CloudFront
80
+ * Automatically detect the most common static website tools, such as Jekyll or
81
+ Nanoc
82
+ * Be simple to use: require only the S3 credentials and the name of the S3
83
+ bucket
84
+ * Let the power users benefit from advanced S3 website features such as
85
+ redirects, Cache-Control headers and gzip support
86
+ * Be as fast as possible. Do in parallel all that can be done in parallel.
87
+ * Maintain 90% backward compatibility with the jekyll-s3 gem
88
+
89
+ `s3_website` attempts to be a command-line interface tool that is easy to
90
+ understand and use. For example, `s3_website --help` should print you all the
91
+ things it can perform. Please create an issue if you think the tool is
92
+ incomprehensible or inconsistent.
93
+
94
+ ## Additional features
95
+
96
+ ### Cache Control
97
+
98
+ You can use the `max_age` configuration option to enable more effective browser
99
+ caching of your static assets. There are two possible ways to use the option:
100
+ you can specify a single age (in seconds) like so:
101
+
102
+ ```yaml
103
+ max_age: 300
104
+ ```
105
+
106
+ Or you can specify a hash of globs, and all files matching those globs will have
107
+ the specified age:
108
+
109
+ ```yaml
110
+ max_age:
111
+ "assets/*": 6000
112
+ "*": 300
113
+ ```
114
+
115
+ Place the configuration into the file `s3_website.yml`.
116
+
117
+ ### Gzip Compression
118
+
119
+ If you choose, you can use compress certain file types before uploading them to
120
+ S3. This is a recommended practice for maximizing page speed and minimizing
121
+ bandwidth usage.
122
+
123
+ To enable Gzip compression, simply add a `gzip` option to your `s3_website.yml`
124
+ configuration file:
125
+
126
+ ```yaml
127
+ gzip: true
128
+ ```
129
+
130
+ Note that you can additionally specify the file extensions you want to Gzip
131
+ (`.html`, `.css`, `.js`, and `.txt` will be compressed when `gzip: true`):
132
+
133
+ ```yaml
134
+ gzip:
135
+ - .html
136
+ - .css
137
+ - .md
138
+ ```
139
+
140
+ Remember that the extensions here are referring to the *compiled* extensions,
141
+ not the pre-processed extensions.
142
+
143
+ #### Gzip zopfli
144
+
145
+ By adding the line `gzip_zopfli: true` into the config file, you can benefit
146
+ from the zopfli algorithm, which is 100% compatible with the traditional gzip
147
+ algorithm. A zopfli compression takes longer but results in about 5% smaller
148
+ files.
149
+
150
+ ### Specifying a MIME type for files without extensions
151
+
152
+ `s3_website` will look up the MIME type of each file it uploads, and infer the Content-Type from it automatically. By default, files without an extension will have a blank Content-Type.
153
+
154
+ You can specify a default MIME type for files without an extension using a line like this in `s3_website.yml`:
155
+
156
+ ```yaml
157
+ extensionless_mime_type: text/html
158
+ ```
159
+
160
+ This is useful when you are uploading HTML files for which you want 'clean' URLs, e.g. `www.domain.com/info`.
161
+
162
+ ### Using non-standard AWS regions
163
+
164
+ By default, `s3_website` uses the US Standard Region. You can upload your
165
+ website to other regions by adding the setting `s3_endpoint` into the
166
+ `s3_website.yml` file.
167
+
168
+ For example, the following line in `s3_website.yml` will instruct `s3_website` to
169
+ push your site into the Tokyo region:
170
+
171
+ ```yaml
172
+ s3_endpoint: ap-northeast-1
173
+ ```
174
+
175
+ The valid `s3_endpoint` values consist of the [S3 location constraint
176
+ values](http://docs.amazonwebservices.com/general/latest/gr/rande.html#s3_region).
177
+
178
+ ### Ignoring files you want to keep on AWS
179
+
180
+ Sometimes there are files or directories you want to keep on S3, but not on
181
+ your local machine. You may define a regular expression to ignore files like so:
182
+
183
+ ```yaml
184
+ ignore_on_server: that_folder_of_stuff_i_dont_keep_locally
185
+ ```
186
+
187
+ You may also specify the values as a list:
188
+
189
+ ```yaml
190
+ ignore_on_server:
191
+ - that_folder_of_stuff_i_dont_keep_locally
192
+ - file_managed_by_somebody_else
193
+ ```
194
+
195
+ ### Excluding files from upload
196
+
197
+ You can instruct `s3_website` not to push certain files:
198
+
199
+ ```yaml
200
+ exclude_from_upload: test
201
+ ```
202
+
203
+ The value can be a regex, and you can specify many of them:
204
+
205
+ ```yaml
206
+ exclude_from_upload:
207
+ - test
208
+ - (draft|secret)
209
+ ```
210
+
211
+ ### Reduced Redundancy
212
+
213
+ You can reduce the cost of hosting your blog on S3 by using Reduced Redundancy Storage:
214
+
215
+ * In `s3_website.yml`, set `s3_reduced_redundancy: true`
216
+ * All objects uploaded after this change will use the Reduced Redundancy Storage.
217
+ * If you want to change all of the files in the bucket, you can change them through the AWS console, or update the timestamp on the files before running `s3_website` again
218
+
219
+ ### How to use Cloudfront to deliver your blog
220
+
221
+ It is easy to deliver your S3-based web site via Cloudfront, the CDN of Amazon.
222
+
223
+ #### Creating a new CloudFront distribution
224
+
225
+ When you run the command `s3_website cfg apply`, it will ask you whether you
226
+ want to deliver your website via CloudFront. If you answer yes, the command will
227
+ create a CloudFront distribution for you.
228
+
229
+ #### Using your existing CloudFront distribution
230
+
231
+ If you already have a CloudFront distribution that serves data from your website
232
+ S3 bucket, just add the following line into the file `s3_website.yml`:
233
+
234
+ cloudfront_distribution_id: your-dist-id
235
+
236
+ Next time you run `s3_website push`, it will invalidate the items on CloudFront and
237
+ thus force the CDN system to reload the changes from your website S3 bucket.
238
+
239
+ #### Specifying custom settings for your CloudFront distribution
240
+
241
+ `s3_website` lets you define custom settings for your CloudFront distribution.
242
+
243
+ For example, like this you can define a your own TTL and CNAME:
244
+
245
+ ```yaml
246
+ cloudfront_distribution_config:
247
+ default_cache_behavior:
248
+ min_TTL: <%= 60 * 60 * 24 %>
249
+ aliases:
250
+ quantity: 1
251
+ items:
252
+ CNAME: your.website.com
253
+ ```
254
+
255
+ Once you've saved the configuration into `s3_website.yml`, you can apply them by
256
+ running `s3_website cfg apply`.
257
+
258
+ #### Invalidating root resources instead of index.htmls
259
+
260
+ By default, `s3_website push` calls the CloudFront invalidation API with the
261
+ file-name-as-it-is. This means that if your file is *article/index.html*, the
262
+ push command will call the invalidation API on the resource
263
+ *article/index.html*.
264
+
265
+ You can instruct the push command to invalidate the root resource instead of the
266
+ *index.html* resource by adding the following setting into the configuration
267
+ file:
268
+
269
+ cloudfront_invalidate_root: true
270
+
271
+ To recap, this setting instructs s3_website to invalidate the root resource
272
+ (e.g., *article/*) instead of the filename'd resource (e.g.,
273
+ *article/index.html*).
274
+
275
+ No more index.htmls in your URLs!
276
+
277
+ *Note*: If the root resource on your folder displays an error instead of the
278
+ index file, your source bucket in Cloudfront likely is pointing to the S3 Origin,
279
+ *example.com.s3.amazonaws.com*. Update the source to the S3 Website Endpoint,
280
+ *e.g. example.com.s3-website-us-east-1.amazonaws.com*, to fix this.
281
+
282
+ ### Configuring redirects on your S3 website
283
+
284
+ You can set HTTP redirects on your S3 website in two ways. If you only need
285
+ simple "301 Moved Premanently" redirects for certain keys, use the Simple
286
+ Redirects method. Otherwise, use the Routing Rules method.
287
+
288
+ #### Simple Redirects
289
+
290
+ For simple redirects `s3_website` uses Amazon S3's
291
+ [`x-amz-website-redirect-location`](http://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html)
292
+ metadata. It will create zero-byte objects for each path you want
293
+ redirected with the appropriate `x-amz-website-redirect-location` value.
294
+
295
+ For setting up simple redirect rules, simply list each path and target
296
+ as key-value pairs under the `redirects` configuration option:
297
+
298
+ ```yaml
299
+ redirects:
300
+ index.php: /
301
+ about.php: about.html
302
+ music-files/promo.mp4: http://www.youtube.com/watch?v=dQw4w9WgXcQ
303
+ ```
304
+
305
+ #### Routing Rules
306
+
307
+ You can configure more complex redirect rules by adding the following
308
+ configuration into the `s3_website.yml` file:
309
+
310
+ ```yaml
311
+ routing_rules:
312
+ - condition:
313
+ key_prefix_equals: blog/some_path
314
+ redirect:
315
+ host_name: blog.example.com
316
+ replace_key_prefix_with: some_new_path/
317
+ http_redirect_code: 301
318
+ ```
319
+
320
+ After adding the configuration, run the command `s3_website cfg apply` on your
321
+ command-line interface. This will apply the routing rules on your S3 bucket.
322
+
323
+ For more information on configuring redirects, see the documentation of the
324
+ [configure-s3-website](https://github.com/laurilehmijoki/configure-s3-website#configuring-redirects)
325
+ gem, which comes as a transitive dependency of the `s3_website` gem. (The
326
+ command `s3_website cfg apply` internally calls the `configure-s3-website` gem.)
327
+
328
+ ### Using `s3_website` as a library
329
+
330
+ By nature, `s3_website` is a command-line interface tool. You can, however, use
331
+ it programmatically by calling the same API as the executable `s3_website` does:
332
+
333
+ ````ruby
334
+ require 's3_website'
335
+ is_headless = true
336
+ S3Website::Tasks.push('/website/root', '/path/to/your/website/_site/', is_headless)
337
+ ````
338
+
339
+ You can also use a basic `Hash` instead of a `s3_website.yml` file:
340
+
341
+ ```ruby
342
+ config = {
343
+ "s3_id" => YOUR_AWS_S3_ACCESS_KEY_ID,
344
+ "s3_secret" => YOUR_AWS_S3_SECRET_ACCESS_KEY,
345
+ "s3_bucket" => "your.blog.bucket.com"
346
+ }
347
+ in_headless = true
348
+ S3Website::Uploader.run('/path/to/your/website/_site/', config, in_headless)
349
+ ```
350
+
351
+ The code above will assume that you have the `s3_website.yml` in the directory
352
+ `/path/to/your/website`.
353
+
354
+ ### Specifying custom concurrency level
355
+
356
+ By default, `s3_website` does 3 operations in parallel. An operation can be an
357
+ HTTP PUT operation against the S3 API, for example.
358
+
359
+ You can increase the concurrency level by adding the following setting into the
360
+ `s3_website.yml` file:
361
+
362
+ ```
363
+ concurrency_level: <integer>
364
+ ```
365
+
366
+ However, because S3 throttles connections, there's an upper limit to the
367
+ level of parallelism. If you start to see end-of-file errors, decrease the
368
+ concurrency level. Conversely, if you don't experience any errors, you can
369
+ increase the concurrency level and thus benefit from faster uploads.
370
+
371
+ If you experience the "too many open files" error, either increase the amount of
372
+ maximum open files (on Unix-like systems, see `man ulimit`) or decrease the
373
+ `concurrency_level` setting.
374
+
375
+ ## Example configurations
376
+
377
+ See
378
+ <https://github.com/laurilehmijoki/s3_website/blob/master/additional-docs/example-configurations.md>.
379
+
380
+ ## Known issues
381
+
382
+ Please create an issue and send a pull request if you spot any.
383
+
384
+ ## Development
385
+
386
+ ### Versioning
387
+
388
+ s3_website uses [Semantic Versioning](http://semver.org).
389
+
390
+ In the spirit of semantic versioning, here is the definition of public API for
391
+ s3_website: Within a major version, s3_website will not break
392
+ backwards-compatibility of anything that is mentioned in this README file.
393
+
394
+ ### Tests
395
+
396
+ * Install bundler and run `bundle install`
397
+ * Run all tests by invoking `rake test`
398
+
399
+ ### Contributing
400
+
401
+ We (users and developers of s3_website) welcome patches, pull requests and
402
+ ideas for improvement.
403
+
404
+ When sending pull requests, please accompany them with tests. Favor BDD style
405
+ in test descriptions. Use VCR-backed integration tests where possible. For
406
+ reference, you can look at the existing s3_website tests.
407
+
408
+ If you are not sure how to test your pull request, you can ask the [gem owners
409
+ ](http://rubygems.org/gems/s3_website) to supplement the request with tests.
410
+ However, by including proper tests, you increase the chances of your pull
411
+ request being incorporated into future releases.
412
+
413
+ #### Checklist for new features
414
+
415
+ * Is it tested?
416
+ * Is it documented in README?
417
+ * Is it mentioned in `resources/configuration_file_template.yml`?
418
+
419
+ ## License
420
+
421
+ MIT. See the LICENSE file for more information.
422
+
423
+ ## Contributors
424
+
425
+ This gem is created by Lauri Lehmijoki. Without the valuable work of [Philippe
426
+ Creux](https://github.com/pcreux) on
427
+ [jekyll-s3](https://github.com/laurilehmijoki/jekyll-s3), this project would not
428
+ exist.
429
+
430
+ Contributors (in alphabetical order)
431
+ * Alan deLevie
432
+ * Cory Kaufman-Schofield
433
+ * Chris Kelly
434
+ * Chris Moos
435
+ * Christopher Petersen
436
+ * David Michael Barr
437
+ * David Raffensperger
438
+ * Greg Karékinian
439
+ * John Allison
440
+ * Jordan White
441
+ * László Bácsi
442
+ * Mason Turner
443
+ * Michael Bleigh
444
+ * Philip I. Thomas
445
+ * Philippe Creux
446
+ * Shigeaki Matsumura
447
+ * stanislas
448
+ * Tate Johnson
449
+ * Toby Marsden
450
+ * Trevor Fitzgerald
451
+ * Zee Spencer
data/Rakefile ADDED
@@ -0,0 +1,24 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ desc "Build the project"
5
+ task :default => 'test'
6
+
7
+ desc "Run tests"
8
+ task :test do
9
+ ENV['disable_parallel_processing'] = 'true'
10
+ sh "bundle exec rspec"
11
+ sh "bundle exec cucumber --tags ~@skip-on-travis"
12
+ end
13
+
14
+ desc 'Run work-in-progress features'
15
+ task "cucumber:wip" do
16
+ ENV['disable_parallel_processing'] = 'true'
17
+ sh "bundle exec cucumber --tags @wip"
18
+ end
19
+
20
+ desc 'Run fast tests'
21
+ task "cucumber:fast" do
22
+ ENV['disable_parallel_processing'] = 'true'
23
+ sh "bundle exec cucumber --tags ~@network-io --tags ~@starts-new-os-process"
24
+ end
@@ -0,0 +1,62 @@
1
+ # Example `s3_website` configurations
2
+
3
+ This document shows examples of complete `s3_website.yml` configurations.
4
+
5
+ ## Minimal
6
+
7
+ ````yaml
8
+ s3_id: abcd
9
+ s3_secret: 2s+x92
10
+ s3_bucket: your.domain.net
11
+ ````
12
+
13
+ ## Minimal with EC2 AIM roles
14
+
15
+ ````yaml
16
+ s3_bucket: your.domain.net
17
+ ````
18
+
19
+ If you run `s3_website` on an EC2 instance with IAM roles, it is possible to omit
20
+ the `s3_id` and `s3_secret`.
21
+
22
+ ## Optimised for speed
23
+
24
+ Use CloudFront, gzip, cache headers and greater concurrency:
25
+
26
+ ````yaml
27
+ s3_id: <%= ENV['your_domain_net_aws_key'] %>
28
+ s3_secret: <%= ENV['your_domain_net_aws_secret'] %>
29
+ s3_bucket: your.domain.net
30
+ cloudfront_distribution_id: <%= ENV['your_domain_net_cloudfront_distribution_id'] %>
31
+ cloudfront_distribution_config:
32
+ default_cache_behavior:
33
+ min_TTL: <%= 60 * 60 * 24 %>
34
+ aliases:
35
+ quantity: 1
36
+ items:
37
+ CNAME: your.domain.net
38
+ max_age: 120
39
+ gzip: true
40
+ ````
41
+
42
+ Above, we store the AWS credentials and the id of the CloudFront distribution as
43
+ environment variables. It's convenient, since you can keep the `s3_website.yml`
44
+ in a public Git repo, and thus have your deployment configurations
45
+ version-controlled.
46
+
47
+ ## Using redirects
48
+
49
+ ````yaml
50
+ s3_id: hello
51
+ s3_secret: galaxy
52
+ redirects:
53
+ index.php: /
54
+ about.php: about.html
55
+ routing_rules:
56
+ - condition:
57
+ key_prefix_equals: code/repositories/git/
58
+ redirect:
59
+ host_name: git.johnny.com
60
+ replace_key_prefix_with: ""
61
+ http_redirect_code: 301
62
+ ````
@@ -0,0 +1,51 @@
1
+ # Setting up AWS credentials
2
+
3
+ Before starting to use s3\_website, you need to create AWS credentials.
4
+
5
+ ## Easy setup
6
+
7
+ * Go to [AWS IAM console](https://console.aws.amazon.com/iam)
8
+ * Create a new user that has full permissions to the S3 and CloudFront services
9
+ * Call `s3_website cfg create` and place the credentials of your new AWS user
10
+ into the *s3_website.yml* file
11
+ * Read the main documentation for further info
12
+
13
+ ## Limiting the permissions of the credentials
14
+
15
+ AWS IAM offers multiple ways of limiting the permissions of a user. Below is one
16
+ way of configuring the limitations and yet retaining the capability to use all
17
+ s3\_website features.
18
+
19
+ If you know the hostname of your public website (say `my.website.com`), perform the
20
+ following steps:
21
+
22
+ * Create a user that has full permissions to the S3 bucket
23
+ * In addition, let the user have full permissions to CloudFront
24
+
25
+ Here is the IAM Policy Document of the above setup:
26
+
27
+ ```json
28
+ {
29
+ "Statement": [
30
+ {
31
+ "Action": [
32
+ "cloudfront:*"
33
+ ],
34
+ "Effect": "Allow",
35
+ "Resource": [
36
+ "*"
37
+ ]
38
+ },
39
+ {
40
+ "Action": [
41
+ "s3:*"
42
+ ],
43
+ "Effect": "Allow",
44
+ "Resource": [
45
+ "arn:aws:s3:::my.website.com",
46
+ "arn:aws:s3:::my.website.com/*"
47
+ ]
48
+ }
49
+ ]
50
+ }
51
+ ```
data/assembly.sbt ADDED
@@ -0,0 +1,3 @@
1
+ import AssemblyKeys._ // put this at the top of the file
2
+
3
+ assemblySettings