docs.ruby-lang.org の環境が Debian GNU/Linux 9.11 (stretch) で、 Debian GNU/Linux 10 (buster) の環境に移行するためにも 動作確認するための環境を作りやすくした方が良いと思って、 vagrant での再現環境構築をすすめています。

今回は再現環境の構築です。

動作確認環境

  • macOS Mojave 10.14.6
  • VirtualBox 6.1.2
  • Vagrant 2.2.6
  • ansible 2.9.3

予定

  • 再現環境を作成
  • cron を systemd timer に移行
  • Debian 10 に移行

再現環境を作成

https://github.com/ruby/docs.ruby-lang.org/pull/36 で途中まで作成されていた環境を参考にして、 Vagrantfile を作成しました。 (このブログ記事を書いていて、 .git/info/exclude で除外していて追加し忘れていたのに気づいたので 追加しました。)

ついでに TLS の設定の更新や system/update-rurema-index で zsh を使っているのに再現環境にはインストールする手順がなかったので bash に変更するなどの変更も入れました。

docs.ruby-lang.org の配信ファイル構成

docs.ruby-lang.org で外部から見えるものとしては、大きく4種類にわかれています。

  • / 直下 に public 由来のファイル
  • /en/バージョン/ 以下に ruby system/rdoc-static-all で生成されたファイル (古いバージョンは更新されず古いまま固定)
  • /ja/バージョン/ 以下に ruby system/bc-setup-all; ruby system/bc-static-all で生成されたファイル (古いバージョンは更新されず古いまま固定)
  • /ja/search/ 以下はるりまサーチ

動作確認手順

  • VirtualBox, Vagrant, ansible を入れておく
  • vagrant up して起動
  • vagrant ssh-config >> ~/.ssh/configssh default で接続できるように設定 (初回のみ、他を vagrant up してポート番号が変わるなどした時は ~/.ssh/config を適宜調整)
  • bundle installcapistrano などをインストール
  • cap vagrant deploy または bundle exec cap vagrant deployhttps://github.com/ruby/docs.ruby-lang.orghttps://github.com/ruby/rurema-search をデプロイ
  • vagrant ssh で入って sudo systemctl restart nginx で nginx を起動 (https の設定の関連で最初は起動失敗している)
  • sudo su - rurema して crontab -l でコマンドを確認して実行してドキュメントを生成する (system/fastly-purge-key のエラーが出るのは本番環境には存在するファイルが存在しないため、 CDN のキャッシュのパージができないということで、動作確認環境では問題ないため、無視する)
  • ブラウザーで https://localhost:10443/ を開いて (動作確認環境用の自己署名証明書なので) Chrome なら NET::ERR_CERT_AUTHORITY_INVALID というエラーを無視して開く

工夫した点

  • シェルスクリプトでの provision でもよかったのですが、使い慣れている ansible で冪等性の確保をしました。
  • ちゃんと本番環境と同じ nginx の設定ファイルで動作確認できた方が良いだろうと思って https の設定をしました。変更なしの設定ファイルだと、るりまサーチの「検索」ボタンを押した時のリダイレクトでポート番号が消えてしまうという問題が起きて、 vagrant の forwarded_port を host 側も 443 にするという手もあったのですが、 vagrant up に root 権限が必要になるなどの不便さが起きる可能性が嫌だったので、そこだけは nginx の設定ファイルを書き換えて対応しました。
  • 条件は調べていないのですが、 CSR で common name を localhost にしておかないと Chrome で証明書のエラーを無視できなかったので、ちゃんと common name を設定するようにしました。
  • dhparam はデフォルトだと 4096 で生成するようで、乱数源の少ない仮想環境だと時間がかかるので 2048 に減らしました。 localhost のみなので最低限まで減らしても良さそうですが、 1024 以下だと OS のバージョンアップ後に拒否される可能性がありそうなので、そこまでは減らしていません。
  • 基本的にユーザー側は fastly の CDN なので、オリジン側は気軽に安全側に倒した設定に更新しても良いだろうと思って、 https://ssl-config.mozilla.org/ で設定更新しましたが、バージョンが古くて Modern は選べませんでした。 letsencrypt で http だけで見える URL も使う設定になっているので HSTS は設定していません。
  • ssl_trusted_certificate を指定しているのはクライアント認証をしていないのになぜかと思ったら、 OCSP Stapling 用でした。

to be continued

今回の変更は https://github.com/ruby/docs.ruby-lang.org/pull/91 (と https://github.com/ruby/docs.ruby-lang.org/pull/93) になります。

systemd timer への移行編に続きます。

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published