heroku/pythonからPython2のサポートが外れたことの回避策

遭遇した問題

原因

使用していたbuildpackであるheroku/pythonのバージョンがあがり、Python 2.7がサポート外になったこと。

対策

Python 2.7 EOL FAQ | Heroku Dev Center に記述があるとおり、buildpackのURLを heroku/python から https://github.com/heroku/heroku-buildpack-python#v218 に変更する必要がある。

参考

heroku.ymlでConfig-Varsを利用する

やりたいこと

heroku.yml を利用してRailsアプリをHerokuにデプロイしたい。heroku.ymlを利用したDockerfileのビルドで bin/rails asset:precompile を利用する際に必要な環境変数 SECRET_KEY_BASE をハードコードせず、heroku config:set で利用できるConfig-Varsを利用したい。

やったこと

以下のように、 変数名を参照することができます

build:
  docker:
    web: Dockerfile
  config:
    SECRET_KEY_BASE: $SECRET_KEY_BASE

app.jsonを配備すれば、Review Appsごとに SECRET_KEY_BASE をセットすることも可能です。

review というキーにネストさせることもできる らしいのですがそこは試していません 🙏 )

{
    "stack": "container",
    "env": {
        "SECRET_KEY_BASE": {
            "required": true,
            "generator": "secret"
        }
    }
}

余談

Fullstaq Rubyを使ったRailsアプリをHerokuで動かすやつ(絶賛お試し中)

Using Fullstaq Ruby on Heroku

EchoをVercel(Zeit now)のServerless Function上で動かす

TL;DR

gist.github.com

Goやサーバレスアーキテクチャの初心者なので、もうちょっといいやり方ないかなーと持っています。

やりたいこと

Vercel(Zeit now)を使っていて、Serverless functionでGoが選択できたので利用してみたいと思ったので試してみた。

やったこと

ドキュメントにあるように プロジェクトルートに api ディレクトリを生成して date.go などつくる(このときhttp.HandleFuncのシグネチャである公開メソッドを用意すること)と /api/date というURLを提供できる( /api/ を指定したい場合は /api/index.go とする)。

が、今回はルーティングはEchoに任せたい(そもそもこれでいいのか?)と思ったので、 now.jsonroutes オプションを使い、 /api 配下に来たリクエストは /api/index.go で受け取って振り分けるようにした。

わかっていないこと

go.mod で module github.com/kimihito/hoge みたいな指定をすると、 now dev などで開発するとGitHubにアクセスしにいってしまう。 これがGo modのお作法なのか、 利用しているプラットフォームの動作なのかわかっていない(ょゎぃ)

参考にしたリンク

github.com

HanamiでNuxt.jsのビルドしたファイルを配信したい

やりたいこと

  • HTML, CSS, JavaScriptはHanamiの app/web/views で書きたくない。
  • Nuxt.jsやcreate-react-appとかで作ったものを public 配下で配信したい
  • ただ Hanami.rb では public/index.html をおいても反映されなかった

やったこと

Hanami::Static#initializerindex オプションを付与する

require 'rack/static'

module Hanami
  class Static < ::Rack::Static
    def initialize(app, root: Hanami.public_directory, header_rules: HEADER_RULES)
      super(app, urls: _urls(root), root: root, header_rules: header_rules, index: 'index.html') # index: 'index.html' を追加
    end
  end
end

動作確認をしたリポジトリ

github.com

Nuxt.js側の設定(srcDir , generate dir を指定を変えたり、 @nuxt/proxy 入れたり)もあります(雑コミットでごめんなさい)

参考

Google Cloud Storageでダイレクトアップロードを有効にする on Heroku

やりたいこと

  • RailsでActive Storageを利用している
  • Google Cloud Storageを利用している Rails.application.configuration.active_storage.service = :google
  • Heroku Review Appsでも利用したい。

やったこと

  • CORSに対応したバケットをHeroku Review Apps作成時に実行する
  • Heroku Review Appsが削除されたときに、対象のバケットも消す

setup for Active Storage direct upload ( Google Cl ...

github.com にてドキュメントが追加されましたが、ダイレクトアップロードを実行する際はCORSの設定が必要なのでその参考になるといいなぁと思ったので。

外部キー制約を付与したデータにより Herokuで db:fixtures:load が落ちてしまう

TL;DR

ENV['FIXTURES'] = 'hoge,fuga,bar' と並び順を指定してから投入しているが、あまり良いやり方ではなさそうなので、なにか良い方法があれば教えてください 🙏

遭遇した問題

今作っているアプリケーションをHerokuで開発している。 Review Appsで動作を確認したいので、 db:fixtures:load を読みだしたところ下記のようなエラーが出た。

ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR: insert or update on table "hoge" violates foreign key constraint "fk_rails_xxxxx"

Rails のバージョンは 5.2.3 。

原因

テーブル fuga が hoge に対して外部キー制約を持っていたが、 hoge より先に fuga のデータを作ろうとしてしまいエラーになっているようだった。

Use SET CONSTRAINTS for disable_referential_integrity without superuser privileges (take 2)Revertされており、現状解決策はなさそう?

やったこと

この辺を見てENV['FIXTURES'] = 'hoge,fuga,bar' と投入順を指定することで対処した。ただこれだと fixtures/*.yml の増減に引っ張られてしまうので、微妙だと思っている。

なにか他に良い方法があれば教えて下さい 🙏

参考

Heroku CI with rails fixtures - Stack Overflow

アバター画像のプレースホルダに avatars.dicebear.com を利用する

TL;DR

https://avatars.dicebear.com/v2/種類/値.svg みたいな感じで入力すればアバター画像のプレースホルダが手に入る。 他にもいろいろオプションがあるので便利かも。

やりたいこと

Webサービスでよくある、ログインユーザのアイコン画像を表示するときデフォルトをどうしようと思っていた。

GitHubのようなアイコン生成は identicons というらしく、似たような形で表現したいなーと思っていた。

やったこと

npmパッケージなどないか調べていたら、上掲の DiceBear/avatars を見つけたので導入した。 上掲のURLで利用することを推奨していたけど、npmパッケージで導入。

「Sprite Collections」を見ると identicons だけじゃなくていろんな種類がある。

READMEの通りに導入した。

Stimulus: A modest JavaScript framework for the HTML you already have.で使うときはこんな感じでconnect で呼び出す。

gist5e003daad409e4688ab04798acd94373