ぽかぽかウンティの自由帳

ぽかぽか動物園から投稿します。

Ruby on Railsで組んだ無駄に動的なページをGitHub Pages用に静的なページとして出力する

Aniwatch

Bootstrap臭がするシンプルな静的ページだが、データ自体はRailsのdb:seedを使用してDBに格納しているため無駄に動的に出力するつくりになっている。

Rails が動く環境となると Microsoft Azure だと一番小さい A0 basic VM に全部載せ構成(Nginx+Puma+PostgreSQL)でも月2000円程度かかってしまう。

昔は Heroku を使っていたが無料枠では厳しくなってきたので諦めた。

どうせ1ページしかないのでせっかくある GitHub Pages を使うことを検討した。

pages.github.com

とりあえず以下のスクリプトを叩けば静的リソースが生成されるようにした。

  1. seedを用いた再生成可能なデータなのでproduction環境のDBを再生成する
  2. GitHub Pagesの設定はmasterブランチのdocs配下を指定しているので一度掃除する
  3. assetsをprecompileし、生成ファイルをdocs配下に移動する
  4. Rails runnerを使ってワンライナーでトップページのHTMLを取得してdocs配下に配置する、ただしassetsのパスをGitHub Pages用に変換する必要がある
#!/bin/bash

export DISABLE_DATABASE_ENVIRONMENT_CHECK=1
export RAILS_ENV=production
export SECRET_KEY_BASE=$(bin/rails secret)

readonly DISABLE_LOG='Rails.logger.level = 5'
readonly FETCH_HTML='Rails.application.call("REQUEST_METHOD" => "GET", "rack.input" => "").third.each { |b| puts b }'
readonly RAILS_CMD="${DISABLE_LOG}; ${FETCH_HTML}"

bin/rails db:setup

mkdir -p docs
rm docs/*

bin/rails assets:precompile
mv public/assets/* docs/

bin/rails runner "$RAILS_CMD" | sed -e 's#/assets/#/aniwatch/#g' > docs/index.html

railsguides.jp