Rails 5.2 활성 스토리지: 미리보기, Poppler 및 라이센스 트랩 해결

Rails 5.2는 사전 예방적 스토리지라는 주요 새로운 기능을 갖춘 지난달 출시되었습니다.Active Storage는 AWS S3와 같은 다양한 지원 서비스를 통해 활성 기록 모델에 파일 업로드와 첨부 파일을 제공합니다.Paperclip 같은 라이브러리는 비슷한 작업을 할 수 있지만 레일스가 이런 기능을 제공하는 것은 이번이 처음이다.Heroku에서 우리는 클라우드 저장소가 가장 좋은 실천이라고 생각하기 때문에 우리는 클라우드 저장소가 우리의 플랫폼에서 작동하도록 확보한다.이 문서에서는 Rails 5.2 출시 준비 방법과 새로운 액티브 스토리지 기능을 사용하여 어플리케이션을 배포하는 방법을 설명합니다.

신뢰하지만 검증


Heroku에서 믿음은 우리의 가장 중요한 가치이다.Rails 5.2에 Active Storage가 포함되어 있다는 사실을 알게 되면 모든 기능을 시도해 보겠습니다.액티브 스토리지의 가장 편리한 점 중 하나는 PDF와 비디오를 미리 볼 수 있다는 것입니다.파일에서 PDF나 비디오를 추출하는 작은 화면 캡처를 텍스트를 통해 자산에 링크하지 않고 페이지에 표시합니다.
Rails 5.2의 테스트 버전은 유행하는 소스 오픈 도구인 FFmpeg와 MuPDF를 사용하여 비디오와 PDF 미리보기를 생성합니다.우리는 우리의 안전과 법률 부서를 통해 이러한 새로운 2진 의존 관계를 심사했다. 그곳에서 우리는 MuPDF가 AGPL에 따라 허가된 것이고 일부 사용은 상업 허가가 필요하다는 것을 발견했다.만약 우리가 기본적으로 MuPDF를 Rails 5.2 + 응용 프로그램에 추가했을 뿐이라면, 우리의 많은 고객들은 MuPDF를 구매해야만 상업적으로 사용할 수 있다는 것을 모를 것이다.
2017년 9월, 제한적인 AGPL 라이센스는 public attention으로 증가했습니다.5.2 버전을 준비하기 위해 저희 엔지니어는 PDF 미리 보기 기능이 상업 허가 없이 오픈 소스 백엔드를 사용할 수 있도록 Active Storage를 업데이트하려고 노력합니다.2018년 2월에 우리는 Rails introducing the ability to use poppler PDF as an alternative to MuPDF에 PR을 개통했다.약 한 달 후, 공공 관계가 합병되었고, 현재 모든 Rails5.2 사용자는 Heroku에 있거나 Heroku 아래에서 PDF 미리보기를 보여줄 수 있으며, 상업 허가증을 구매할 필요가 없다.

Heroku 예시 응용 프로그램의 활성 저장소


만약 활성 저장소를 실현하는 응용 프로그램이 있다면, jump over to our DevCenter documentation on Active Storage을 사용할 수 있습니다.
또는 예시 프로그램을 사용할 수 있습니다.이것은 동영상, PDF, 이미지를 게시할 수 있는 디지털 게시판인 Rails 5.2 응용 프로그램입니다.view the source on GitHub을 사용하거나 Heroku 버튼을 사용하여 애플리케이션을 배포할 수 있습니다.

Note: This example app requires a paid S3 add-on.


다음은 동영상 예시로 이 응용 프로그램의 기능을 보여 준다.

홈페이지를 열 때 적당한 자산을 선택하고 표를 제출합니다.동영상에서 mp4 파일이 S3에 업로드되고 ffmpeg의 도움으로 Rails를 통해 동적 미리보기가 생성됩니다.아주 깔끔해요.

Heroku의 활성 저장소


이 단추를 사용하여 예시 프로그램을 배치하면, app.json을 통해 Heroku에서 실행하도록 설정되어 있지만, 자신의 프로그램이 설치되어 있다면, Heroku에서 실행하도록 설정하는 방법은 무엇입니까?
DevCenter documentation for Active Storage 이후, 모든 dynos와 대화할 수 있는 파일 저장 서비스가 필요합니다.이 예는 S3에 Bucketeer이라는 Heroku 플러그인을 사용했지만 기존의 S3 인증서를 사용할 수 있습니다.
먼저 Gem 파일에 AWS gem for S3를 추가하고 이미지를 수정하려면 Mini-Magick을 추가합니다.
gem "aws-sdk-s3", require: false
gem 'mini_magick', '~> 4.8'
GEM 파일을 업데이트한 후 $ bundle install을 잊지 마십시오.
다음은 amazon 파일에 config/storage.yml 옵션을 추가하여 S3 구성을 가리키며, 이 예에서는 Bucketer가 설정한 구성을 사용합니다.
amazon:
  service: S3
  access_key_id: <%= ENV['BUCKETEER_AWS_ACCESS_KEY_ID'] %>
  secret_access_key: <%= ENV['BUCKETEER_AWS_SECRET_ACCESS_KEY'] %>
  region: <%= ENV['BUCKETEER_AWS_REGION'] %>
  bucket: <%= ENV['BUCKETEER_BUCKET_NAME'] %>
그런 다음 운영 환경에서 :amazon을 사용하여 스토리지를 구성하도록 애플리케이션을 설정해야 합니다.
config.active_storage.service = :amazon
이 단계를 잊어버리면 기본 저장소는 :local을 사용하여 파일을 디스크에 저장하는 것입니다.이것은 생산 과정에서 업로드 파일을 처리하는 확장 가능한 방식이 아니다.Heroku에 의외로 배치하면 파일이 처음에 업로드된 것처럼 보이지만, 여러 개의dyno를 실행하면 무작위로 요청할 때 사라집니다.dynos를 다시 시작하면 파일이 모두 사라집니다.ephemeral disk of Heroku in the DevCenter에 대한 더 많은 정보를 얻을 수 있습니다.
마지막으로 생산에서 이 점을 실현하기 위해 마지막으로 필요한 것은 사용자 정의 buildpack을 설치하는 것입니다. 이 buildpack 설치는 자산 미리보기를 만드는 데 사용되는 바이너리 의존항 ffmpegpoppler을 설치합니다.
$ heroku buildpacks:add -i 1 https://github.com/heroku/heroku-buildpack-activestorage-preview
완료되면 Heroku에 배치할 수 있습니다!

기존 애플리케이션에 활성 스토리지 추가


만약 응용 프로그램이 아직 활성 저장소가 없다면, 그것을 추가할 수 있습니다.우선, 다음 명령을 실행하여 활성 저장소 blob 저장소를 활성화해야 합니다.
$ bin/rails active_storage:install
이렇게 하면 Rails가 업로드한 파일을 추적할 수 있는 마이그레이션이 추가됩니다.
다음은 파일을 첨부하는 모델이 필요합니다.기존 모델을 사용하거나 새 모델을 생성할 수 있습니다.예제 응용 프로그램에서 대부분 비어 있는 bulletin 모델이 사용됩니다.
$ bin/rails generate scaffold bulletin
다음 응용 프로그램에서 마이그레이션을 실행합니다.
$ bin/rails db:migrate
데이터베이스를 마이그레이션한 후 모델을 업데이트하여 Rails에서 파일을 첨부할 수 있도록 합니다.
class Bulletin < ApplicationRecord
  has_one_attached :attachment
end
완료되면 첨부 파일을 업로드하는 폼, 첨부 파일을 저장하는 컨트롤러, 첨부 파일을 보여주는 보기 등 세 가지 부분이 필요합니다.
기존 양식이 있으면 file_fieldview helper를 통해 첨부 파일 필드를 다음과 같이 추가할 수 있습니다.
<%= form.file_field :attachment %>
the example app에서 첨부된 폼의 예시를 볼 수 있습니다.일단 양식이 생기면, 첨부파일을 저장해야 한다.
이 예시 프로그램에서 홈페이지는 폼과 보기를 포함합니다.bulletin controller에서 첨부 파일을 저장하고 사용자를 주 공지 목록으로 다시 지정합니다.
def create
  @bulletin = Bulletin.new()
  @bulletin.attachment.attach(params[:bulletin][:attachment])
  @bulletin.save!

  redirect_back(fallback_location: root_path)
end
마지막으로 welcome view에서 우리는 모든 공고 항목을 교체했고 우리가 가지고 있는 첨부 파일 유형에 따라 다른 방식으로 나타냈다.
Active Storage에서 시스템에 올바른 바이너리 파일이 설치되어 있으면 PDF 및 비디오의 경우 previewable? 메서드가true로 돌아갑니다.variable?이 설치되어 있으면 mini_magick 방법은true입니다.만약 이 두 가지 일이 모두 사실이 아니라면, 첨부 파일은 다운로드 후 가장 보기 좋은 파일일 가능성이 높다.이것은 how we can represent that logic입니다.
<ul class="no-bullet">
  <% @bulletin_list.each do |bulletin| %>
    <li>
      <% if bulletin.attachment.previewable? %>
        <%= link_to(image_tag(bulletin.attachment.preview(resize: "200x200>")), rails_blob_path(bulletin.attachment, disposition: "attachment"))
        %>
      <% elsif bulletin.attachment.variable? %>
        <%= link_to(image_tag(bulletin.attachment.variant(resize: "200x200")), rails_blob_path(bulletin.attachment, disposition: "attachment"))%>
      <% else %>
        <%= link_to "Download file", rails_blob_path(bulletin.attachment, disposition: "attachment") %>
      <% end %>
    </li>
  <% end %>
</ul>
응용 프로그램에 이 모든 내용을 포함하고 활성 저장소를 생산 환경에서 작업하도록 설정하면 사용자는 쉽게 파일을 업로드하고 다운로드할 수 있습니다.

좋은 웹페이지 즐겨찾기