dreamin' blog 開発日誌

設定値の見直し で行なった対応の一部を変更した。 秘匿化した値を呼び出す際に、

Rails.application.credentials[Rails.env.to_sym][:foo] と書いていたところを、 Rails.application.credentials[:foo] と書けるようになったので、

それらの変更を行なった。

(追記)

Rails 6.0: Action Mailbox, Action Text, Multiple DBs, Parallel Testing, Webpacker by default, and Zeitwerk | Riding Rails

この機能の名前をper-environment credentials と呼ぶようです。

該当pull requestは下記です。heroku側で RAILS_MASTER_KEY の環境変数を今まで作っていたものではなくて、 config/credentials/production.key の値に変更する必要がありました。(修正したつもりだったけどデプロイに失敗してました。)

Add support for multi environment credentials. by morgoth · Pull Request #33521 · rails/rails

なるほど。 と思ってgithubとかは見出しにリンクがhoverで出るようになっていることに気づいてパクってそのまま実装しました。

果たしてどれだけ有用かは僕がちゃんとした記事を書けているかどうか?ってところですが。。

Guard against DNS rebinding attacks by permitting hosts by gsamokovarov · Pull Request #33145 · rails/rails

上記のPull RequestによるとDNS rebinding攻撃対策のために、localhost127.0.0.10.0.0.0、以外の名前でローカルでアクセスする場合に明示的に設定が必要なようです。

dreamin' blog では開発環境では lvh.me を用いて開発を行っています。 lvh.me はlocalhostを解決してくれるドメインで、 foo.lvh.me のように自由にサブドメインを使用することができます。 dreamin' blog は複数ドメインを利用できる機能があるため、lvh.meを用いて開発を行っていました。

config.hosts = '.lvh.me' を指定

config.hosts = '.lvh.me' を指定することで、lvh.meまたはそのサブドメイン全てで開発ができるようになりました。

railsを6.0にアップデートしました。 特に何か新しい機能を入れたりはしていませんが、アップデートして問題なく動くことを確認しました。

capybaraのバージョンアップ

railsのバージョンがcapybaraのバージョンに引きずられて上がらなかったので、アップデートしました。

エラーの対応

rails6にしてデプロイすると、herokuで以下のエラーが出たので対応しました。

bundler: failed to load command: puma (/app/vendor/bundle/ruby/2.6.0/bin/puma)
Errno::ENOENT: No such file or directory @ rb_sysopen - tmp/pids/server.pid
/app/vendor/bundle/ruby/2.6.0/gems/puma-4.1.0/lib/puma/launcher.rb:135:in `initialize'/app/vendor/bundle/ruby/2.6.0/gems/puma-4.1.0/lib/puma/launcher.rb:135:in `open'
/app/vendor/bundle/ruby/2.6.0/gems/puma-4.1.0/lib/puma/launcher.rb:135:in `write_pid'
/app/vendor/bundle/ruby/2.6.0/gems/puma-4.1.0/lib/puma/launcher.rb:108:in `write_state'
...
... Continue Reading

昨日、 マルチサイトのテーマの切り替え を行いました。 流石にcssを当てていないと読みにくいため、開発日誌側のlayoutは黒としました。

一旦、それぞれの色が変えられるような仕組みを導入するのが良いかなと思っていますが、 コードを書くより、色のスキーマを設計する方が時間がかかるので。。。。

本来はもっと多様なテーマに対応できなり、cssそのものやDOMをそれぞれのサイトごとに変更できることが理想です。 将来的にはヘッドレスCMS化を行いJavaScriptで自由に描画を行えるようにするところまで考えてはいます。

切り替えというか、完全に開発者ブログの方ではcssを落とすという実装になりました。 ブログなんて、本来このくらいの方が男らしいかもしれません。

流石に読みにくいので時間があるときに対応するつもりではあります。

herokuを使っていると、環境変数でDATABASE_URLが設定される。 その流れでdotenvを入れて、環境毎の値はdotenvでサクッと管理してきた。

けれども、本来crednetailに当たるような情報も暗号化せずに管理していたので、 それは良くないなと、sentryを導入するにあたってcredentialを使うようにしてみた。

今回は秘匿化が目的なので、 Rails.application.credentials[Rails.env.to_sym][:foo] で取れるようにしてみた。 本来は環境毎に秘密鍵を分けて管理できる仕組みがあるといいのだけれど。

ただ、本当はもうちょっといいやり方がないか模索している。

https://twitter.com/yoshi_hirano/status/1115420387976699904

https://twitter.com/yoshi_hirano/status/1067019171521716224

config.x は以前使用したことがあるのだけど、結局ENVを渡すことが多くなってしまった。 本番環境の値はcredentailに入れて、開発環境の値はenvでというのも悪くないと思っている。 その橋渡し役に config.x はrailsの機能を使うやり方でいいなぁと思う。

ただ、実運用の世界ではproductionだけでなくstagingの情報も秘匿化しなくてはならなかったり、 秘密鍵の権限管理をしなくてはならなかったり、もうちょっと複雑なので、 Config + yaml_valut あたりの運用になってしまうのではないかとは思う。 ...

... Continue Reading

マルチサイトに対応したもののRSSフィードがサイト毎に出なかった問題がありましたので、修正しました。

https://koheisg.dreamin.cc/feed

上記がdreamin blogのサイトのフィード、

https://dev.dreamin.cc/feed

上記がこの開発ログのフィードになります。

マルチサイトでドメインの紐付けをherokuと連携できるか調査しています。

この障害から分かる通り、マルチサイトはマルチテナントではなく、シングルテナントでの運用を行っています。 このサイトは現状個人開発で自分のために運用しているため、マルチテナント化の予定はありません。

実際にこういうサイトを一般のユーザーに解放する時はマルチテナントの運用によってリスクを回避するべきなのかもしれません。

この度、個人ブログである koheisg.dreamin.cc をマルチサイトに対応させました。 ブログには書くまでもない、個人ブログを機能開発の情報を発信していきたいです。

マルチサイトは雑にドメインを判定して、記事を出し分けているだけなので、 デザインのレイアウトがヘッダ、フッター含めて全て同じ状態になってしまっています。 (個人開発はこのレベルでもリリースしちゃえと思えるのがいいところです。)

しかしながら、一つのherokuを複数のドメインを扱えることがわかったので、個人的には大きな学びでした。 今後はマルチサイトのデザインを別デザインにできるよう改善していきます。

https://gist.github.com/nicolashery/5765395 CSSは上記を参考にした。

koheisg.dreamin.cc では記事の生成処理に、html-pipelineのはフィルターのを利用しているが、html-pipelineのから rouge を使用している。 rouge は pythonの pygments 互換らしいので、そちらでsolarizedを使っている人がいないか検索してみた。 rougeよりも情報が多かったが、基本的にcss部分は互換性があるので、そのまま使えそうである。

シンタックスハイライトはサーバーサイドでレンダリングするのではなく、 クライアントサイドでレンダリングする場面が多そうではあるが、サーバーサイドでレンダリングする場合はrougeで情報がなかった場合は、 pygments で情報を探すと出てくるかもしれません。