11 月 28 に Heroku の無料プランが終了するとのことです.

Today, we’re announcing important Heroku updates. These include an interactive product roadmap on #GitHub, support programs for students and nonprofits, as well as phasing out free product plans. See what the future of building on #Heroku looks like: https://t.co/g6J4qJnyW0 Heroku (@heroku) August 25, 2022

Render.com とは?

PaaS(Platform as a Service)の一つで, Gatsby や Hugo などで作成した世紀サイトはもちろん, Django や Rails ベースの Web アプリケーションもデプロイできるサービスです. 有料プランの価格設定もお手頃なので Heroku よりコストを抑えることが出来ます.

CMS デプロイの準備

予算やサービスの用途によって以下の構成が推奨されています.

SQLite

もっとも簡単な構成で, Heroku の無料プランでも動作します. ただし, データの永続化が出来ないので, データのバックアップが必要です.

PostgreSQL+Cloudinary

手動でバックアップを取る必要がなく, データの永続化が出来ます. ただし, Heroku の無料プランでは PostgreSQL のデータベースの容量が 1GB までしか使えないので, 画像のアップロードが出来ない場合があります.

Heroku で Strapi を運用していた際は PostgreSQL+Cloudinary の構成でした. しかしHeroku の無料プランでは画像のアップロードが出来なくなるため, Render.com に移行しました.

render.yaml の作成

Render のデプロイには render.yaml というファイルが必要です. render.yaml の書き方はこちらを参考にしてください. Strapi のプロジェクトルートにrender.yamlを作成し, 以下を記述します.

services:
    - type: web
    name: strapi
    env: node
    plan: starter
    buildCommand: yarn install && yarn build
    startCommand: rsync -a public/ /data/public/ && yarn start
    healthCheckPath: /_health
    disk:
        name: strapi-data
        mountPath: /data
        sizeGB: 1
    envVars:
        - key: NODE_VERSION
        value: ~16.13.0
        - key: NODE_ENV
        value: production
        - key: DATABASE_FILENAME
        value: /data/strapi.db
        - key: JWT_SECRET
        generateValue: true
        - key: ADMIN_JWT_SECRET
        generateValue: true
        - key: APP_KEYS
        generateValue: true

本番環境の設定

config/env/production/server.jsを以下のように編集します.

module.exports = ({ env }) => ({
  url: env("RENDER_EXTERNAL_URL"),
  dirs: {
    public: "/data/public",
  },
});

リポジトリの作成・更新

Github または Gitlab にリポジトリを作成し, Strapi のプロジェクトを push します.

デプロイ

Render.com にログインし, Dashboard から New→Blueprint を選択して対象のリポジトリとブランチを選択します. とっても簡単!🍺

詰まったところ

Render ではなく Strapi 側の問題なのですが, Strapi のバージョンをアップデートした際に以下のようなエラーが出てしまいました.

Missing apiToken.salt. Please set apiToken.salt in config/admin.js

以下のようにconfig/admin.jsを編集することで解決しました.

module.exports = ({ env }) => ({
  auth: {
    secret: env("ADMIN_JWT_SECRET", "your secret"),
  },
  apiToken: {
    salt: "your key",
  },
});

とりあえず直にトークンを打ち込んだら動きましたが, あくまで応急処置なので実際に運用する際は Render 側で環境変数を設定するようにしましょう.

まとめ

Heroku は開発者コミュニティに多大な貢献をした素晴らしいサービスですが, 悪用する人が多かったので無料プランの廃止も仕方がないですね. 今後Web アプリケーションを開発する際は Render.com を検討してみてはいかがでしょうか?