@drawoharaя ❤️ це! << натисни мене 🐛 🫖 🧚
/a-sane-image-magick-configuration-for-your-rails-apps
опубліковано: 2013-03-19

я часто казав, що завантаження файлів - це самонав'язана DOS-атака. Звичайно, не треба далеко ходити, щоб знайти приклади, коли, здавалося б, невелика функція додатку сіє хаос на багатьох серверах додатків: https://www.google.com/search?q=heroku+image+magick+timed+out

@dojo4 ми використовуємо можливість ImageMagick встановлювати обмеження через середовище як перший захист, щоб процеси магії були добре впорядковані.

спочатку трохи підготовки/інформації: ми часто розгортаємо пару файлів RAILS_ROOT/env.yml та RAILS_ROOT/env.rb, які програма Rails завантажує при запуску. вони не містять жодних залежностей Rails і можуть використовуватися у фонових скриптах для швидкого розуміння розгорнутої конфігурації Rails без необхідності завантажувати весь додаток Rails.

перший файл - це простий файл yaml із парами ключ=значення середовища.

# файл: RAILS_ROOT/config/env.yml
# RAILS_ENV : production
# RAILS_STAGE : stage
# APP_RUBY : /usr/local/rbenv/versions/1.9.3-p0/bin/ruby
APP_RUBY_VERSION : 1.9.3
# APP_PORT : 4201
# APP_USER : dojo4
# APP_GROUP : dojo4

другий файл насправді є тим, який завантажується. він завантажує цей файл і динамічно встановлює додаткові змінні середовища

# файл: RAILS_ROOT/env.rb
#
# спочатку ми додаємо будь-які налаштування середовища, знайдені в
#
# RAILS_ROOT/env.yml
#
# уважно, щоб не замінювати жодні вручну встановлені змінні ENV. файл env.yml
# зазвичай створюється під час розгортання cap.
#
  require 'erb'
  require 'yaml'
  require 'rbconfig'
  
  env_yml = File.expand_path('../env.yml', __FILE__)
  
  if test(?s, env_yml)
    buf = IO.read(env_yml)
    expanded = ERB.new(buf).result(binding)
    config = YAML.load(expanded)
    config.each{|key, val| ENV[key.to_s] ||= val.to_s} if config.is_a?(Hash)
  end

те, що нас цікавить тут, - це розділ, в якому налаштовується середовище imagemagick.

ось він у всій своїй красі - коментарі повинні забезпечити контекст і пояснення:

# переконайтеся, що RAILS_* встановлені
#
  ENV['RAILS_ENV'] ||= 'development'
  ENV['RAILS_ROOT'] ||= File.dirname(File.dirname(__FILE__))
# встановіть середовище Imagick Magick
#
# посилання: http://www.imagemagick.org/script/resources.php
#
# використовуйте систему "convert -list resource" у консолі для перегляду
#
# зрозумійте, що ці налаштування є *на рівні процесу*, тому враховуйте кількість серверів додатків, які у вас працюють!
#
  tmp = File.join(ENV['RAILS_ROOT'], 'tmp')
# тримайте ваші тимчасові файли поза системним простором, який на AWS є частиною кореневого
# тому!