Deploying Rails Active Storage Correctly on Heroku

3 minutes read | Posted on: Feb 17, 2023

Author Image

By: Avee Dey

Main Image for the Article

Using Active Storage on your Ruby on Rails App

ActiveStorage allows uploading files without writing much code. It even allows you to perform some complex tasks easily, such as uploading a high resolution image, and creating several low resolution variants of the same image. However, you need to ensure that you set up all requirements properly, especially if your app is going to be deployed to a cloud service, such as, Heroku.

If you are using variants method that comes built in with ActiveStorage, you will need to ensure you have the ruby-vips gem in your Gemfile and some buildpacks necessary to process images.

Adding Heroku Buildpacks

Add the needed buildpacks to Heroku. This is important because Active Storage relies on certain libraries being available in your host environment. When you are running the app on your Mac, this is typically a bunch of stuff installed on your Mac. But when you deploy it to cloud, your cloud environment needs those libraries too. That is where Buildpacks come in, if you are pushing your code to Heroku.

There are two ways to do this, either through your app.json file if you use that for deployment, or directly through Heroku CLI, or terminal. Here are both ways.

Installing Buildpacks Through Heroku CLI

If you have Heroku CLI installed, you can connect with your app and install the buildpacks needed to enable certain image processing capabilities in your app directly. Run the commands below to add the two additional buildpacks needed (in addition to the ruby buildpack).

heroku buildpacks:set --index=1 heroku-community/apt -a [app-name]
heroku buildpacks:set --index=2 https://github.com/brandoncc/heroku-buildpack-vips -a [app-name]
heroku buildpacks:set --index=3 heroku/ruby -a [app-name]

Updating app.json File for Heroku Review App Deployment

If you have been using Heroku Review apps, then you will also need to update the buildpacks section of the app.json directive to ensure that these buildpacks are deployed correctly to spin up your review apps. Else, review app builds will start failing, and you will not be able to test the Active Storage capabilities, especially the variants methods in your app to create different variants of your original image.

            "scripts": {
                "postdeploy": "bundle exec rake db:migrate db:seed"
            },
            "buildpacks": [
                {
                    "url": "heroku-community/apt"
                },
                {
                    "url": "https://github.com/brandoncc/heroku-buildpack-vips"
                },
                {
                    "url": "heroku/ruby"
                }
            ]

Add Aptfile to Include Libraries Needed

Create a file named Aptfile in the root directory of your app, and add the following lines in it:

libglib2.0-0
libglib2.0-dev
libpoppler-glib8

This will ensure you have access to the libraries needed for any image processing using vips.

Update Github Actions for Proper CI Deployment and Testing

Finally, if you use Github Actions for CI, then you will want to update the yml file to include the directive to install libvips before invoking any tests on the CI setup.

      steps:
        ...
        - name: Install libvips
          run: sudo apt-get install -y libvips
        ...

Hopefully, the above information helps you modify your Rails app configuration correctly to ensure that the app runs without any issues after you have Active Storage enabled.


References:

Unlock the power of pay later for bills

Get $250 to $2000 in bill pay power.
Apply with no impact to your credit score.

Terms & Conditions Apply

Terms and Conditions

By entering your phone number and clicking "Request An Invite" you agree to receive marketing messages at the entered phone number and agree to Neon's Terms of Service and Privacy Policy By opting-in, you agree to be contacted via automated texts at the phone number provided for marketing purposes. You may opt-out at any time. Opt-in is not a condition to be approved. Message and data rates may apply.

🎉 Smarter Way to Pay Bills 🎉