ChordWikiのマイグレーション: DockerとGitHub Actions CI/CD
ChordWikiをDockerコンテナ化し、GitHub Actions CI/CDを導入した。
そもそもCentOS 7で動いていたのだが2024年6月30日でメンテナンスアップデートが終了していて、移行は急務というかEOLを越えていた。ソースコードは手動バージョン管理だった。デプロイはMakefileでやっていた。
対応したのは上記の環境移行だけのマイグレーションで、Rubyのソースコード自体は変わっておらず、リファクタリングではない。
それでもずいぶん時間がかかってしまったが、ほとんどの期間は放置していたので工数自体は大したものではない。
2021年夏に育児休業を取得したタイミングで始動した。仕事に行かないので時間はたくさんあり、授乳や夜泣きはあって未知や不安からの負担もあるのだが後から振り返ってみれば0歳児は自分で勝手には動けないので手がかからない。
この余暇を利用して、まず現行ソースを人に見せられるように整理する作業を行い、2021年9月13日にGitHubへfirst commitした。
GitHubへのソースコード登録という長年のToDoを実行した。(非公開リポジトリ)
— クリックして名前を入力 (@worris) 2021年9月13日
すぐにuさんがDockerコンテナ化に着手し、動くようにしてもらったが、そこからいろいろあって一時中断し停滞した。
仕事に復帰するとプライベートの時間が少なくなるのは当然として、幼児は成長するにつれ自分でできることは増えるものの相手をしないと一緒に遊ぼうと絡んでくるので自分の趣味や作業に集中することができない。
そして夜は寝かしつけから寝落ちしてしまうのが習慣となり、睡眠が細切れとなって残り時間は家事を片づけるので手一杯という日々が続く。
この頃はgさんが機能を改良するプルリクエストを送ってくれていたが、検証してマージすることができないでいた。
また意味不明なDoSアタックによるレスポンス低下からのサーバー陥落が頻発するようになり、2021年11月からCloudflareをWAFとして利用開始し、2022年1月からはPro Planにしている。
2022年7月には新着情報を表示させるのに使っていたFeedBurnerの機能がなくなり、2023年4月頃にはイーロン・マスクによる買収後のTwitter API仕様変更によってログイン機能停止を余儀なくされた。
2023年4月10日には以下の投稿をしている。
ChordWikiでは、ボランティアで開発に協力してくださる方を求めています。
— ChordWiki (@chordwiki) 2023年4月10日
リファクタリングが急務となっており、このままではいずれ立ち行かなくなります。まずはDockerコンテナ化とGitHub Flow環境構築を当面の目標と考えています。
(続)
ドキュメントはなく、現行開発者からのサポートも十分に受けられないことを了承ください。自分でコード(chordではなくcode)を解読することが前提となります。まずはコードを見てみるだけでもOKです。
— ChordWiki (@chordwiki) 2023年4月10日
GitHubのアカウントをDMでお知らせいただいたらリポジトリに招待いたします。
しかし2023年~2024年にはほとんど動きがなかった。
この間、サイト利用者への広報を担い、現状でできることを模索して人集めにも奔走してくれたのが一番付き合いの長いmさんである。mさんがいなければ、もし何かもっと大きな障害が発生して復旧が困難になっていたら、サイトを閉じていたのではないかと思う。
2025年に入ってnさんが動かなくなっていたDockerfileを修正したり現行サイトとの乖離を是正する作業を行ってくれて、移行リリースが現実化してくる。
2025年11月にGitHub Team Plan、2026年1月にGitHub Copilot Proを導入。
この頃から仕事上の環境変化によって時間が確保できるようになり、2026年6月から重い腰を上げて、GitHub ActionsワークフローによるCI/CD環境でステージングと本番のブランチから自動デプロイ運用する形を整えた。
私としては長い間「オレにはもうそれ(DockerとGitHubとCloudflare Workers)が…よく分からんのよ…!」という状態だったのだが、2026年6月15日の投稿がこれ。
集中して実装に触れる時間を確保できれば、GitHub(Actions)もDockerもそれなりに解った 書いたものが動く、このhackingの手応え AIは時間短縮に役立った Cloudflareはまだわからん
— worris (@worris.bsky.social) 2026-06-14T15:42:49.648Z
そして2026年7月4日に環境移行を完了した。
ウェブサービスの環境移行作業を始めようとしたら、娘がこれを渡してきた
— worris (@worris.bsky.social) 2026-07-04T13:59:55.211Z
2006年に一人で始めたサイトだったが、今回のプロジェクト過程で複数の人に関わってもらった。GitHubリポジトリのコントリビューターは4名、Discordサーバーのメンバーは11名いる。
私よりもはるかにプログラミング技術に秀でた人たちがいて、ChordWikiというサイトを長年愛用してくださる人たちがいる。いくら感謝しても感謝しきれない。ありがとうございます。
今後は、脱CGIや、フラットファイルCMSからBLOB型データベース格納への再構築も模索したい。nさんは大規模リニューアルを手がけてくれている。
歩みは遅いながらも持続可能になったChordWikiを、これからもよろしくお願いいたします。
アクセスランキング集計スクリプトのGA4対応
GA4対応をサボっていたら8月17日でスクリプトが動作しなくなっていた。
Ruby で Google Analytics 4 (GA4) のデータを API で取得する方法 - 約束の地 や Google Analyticsの新バージョン!「Google Analytics 4(GA4)」のレポートデータをRubyで取得する - bagelee(ベーグリー) を参考に対応実施。
garb → google-api-ruby-client → 同 0.9 → google-analytics-data-v1beta と変遷しているが今回も最小限の修正で済ませる。
sudo gem install google-analytics-data-v1beta
rubyは2.6.5だったが2.7.8に上げた。
require 'google/analytics/data/v1beta' def get_ga4(startdate,enddate,limitnum) ENV['ANALYTICS_DATA_CREDENTIALS'] = 'credentials.json' client = Google::Analytics::Data::V1beta::AnalyticsData::Client.new property = 'properties/XXXXXXXX' dimensions = [ Google::Analytics::Data::V1beta::Dimension.new(name: 'pagePath'), ] metrics = [ Google::Analytics::Data::V1beta::Metric.new(name: 'screenPageViews'), ] date_ranges = [ Google::Analytics::Data::V1beta::DateRange.new(start_date: startdate.strftime('%Y-%m-%d'), end_date: enddate.strftime('%Y-%m-%d')), ] request = Google::Analytics::Data::V1beta::RunReportRequest.new( property: property , dimensions: dimensions, metrics: metrics, dimension_filter: {:filter=>{:field_name=>"pagePath", :string_filter=>{ :match_type=> "BEGINS_WITH", :value=>"/wiki/"}}}, limit: limitnum.to_i, date_ranges: date_ranges ) response = client.run_report(request) result=Hash.new response.rows.each{|row| row.dimension_values.each_with_index{|d,i| result[CGI.unescape(d.value)]= row.metric_values[i].value } } result end #r=get_ga4(Date.today-7, Date.today-1, 30) #r.each{|i,v| # print i,":",v,"\n" #}
ChordWikiのサーバを移転
2/24の2:00〜5:00に移転作業を完了。
Cent OS 5ではいろいろやってもTLS 1.2に対応させることができず、Chrome 81のアップデートが迫って警告メール*1も来たので、3年ほど遅いけどようやく移行。迷ったけどドキュメントが揃ってそうなCent OS 7へ。
rubyがyumだと2.0しか入らないけど、さすがに古いので2.6をソースからインストール。
これまで1.9で動かしていたコードは、ほぼそのまま動いた。
MySQLからMaria DBになってたけど、mysql2で何も変えずに通った。
Google Analyticsのデータを取得するgemが大きく変わっていて、google-api-ruby-clientが非互換なアップデートされたを参考に修正した。
あとApacheも2.2から2.4に変わってmod_rewrite設定に不具合が起こって手を入れたけど、たぶん大丈夫。
*1:Google Search Console Team <sc-noreply@google.com> Jan 14, 2020, 9:13 AM「https://ja.chordwiki.org/ で使用されている TLS 1.0/1.1 に関する警告が Chrome ブラウザで表示されるようになります」
2016年のbot開発
立て続けに発表されたbot開発プラットフォーム。作ってみた記事もちらほら見かけてちょっとしたブームっぽい。
Microsoft Bot Framework
Messaging API
Messengerプラットフォーム - ドキュメンテーション - 開発者向けFacebook
LINE BOT APIで当初NGだったLet's Encryptの証明書が通るようになったという噂を聞いたので*1昨日から使おうとしているが一向にコールバックが飛んで来ない。
なので先にFacebookから作ってみた。
ごちゃごちゃ試行錯誤しているうちに動くようになった。
だけどこれって、単にメッセージを投げているだけで、Twitter APIで出来ることと何も変わらない。これは9年前に通った道だ。*2
自然言語処理やAIを使って初めて2016年のbotと言えるだろう。
日本はbot後進国になる運命かもね。 | ふくゆきブログ
だから村上福之のこの記事こそが重視されるべきなのだが、それはそれで、趣味のプログラミングからは遠く離れたところへ行ってしまいそうなのである。
Let's Encryptのサーバ証明書でSSL対応
さくらVPSで、Let’s Encryptのサーバ証明書を使って、SSL対応のサイトを作る設定手順
を見てやってみようと思ったが、CentOS 5ではこの通りに行かないっぽい。
まずPythonが2.6以上必要と言われる。2.4しか入っていない。yumに2.6があるのでインストール("python26"になる)してスクリプトの中のpython27をpython26に変えても無理だった。
wget https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz
からインストールして"python2.7"が通るようにしてもやっぱり駄目だった。
KeyError: 'webroot'
となって止まる。
Letsencrypt-auto certonly fails with KeyError: 'webroot' - Help - Let's Encrypt Community Support
を見て、pythonに依存しない
GitHub - acmesh-official/acme.sh: A pure Unix shell script ACME client for SSL / TLS certificate automation · GitHub
を使うことにする。証明書の更新も自動でやってくれるらしい。むしろ便利じゃん。*1
git clone https://github.com/Neilpang/le.git cd le ./le.sh install sudo ./le issue /var/www/html/ www.example.com
して生成されたファイルを /etc/httpd/conf.d/ssl.conf に
SSLCertificateFile /home/hoge/.le/www.example.com/www.example.com.cer SSLCertificateKeyFile /home/hoge/.le/www.example.com/www.example.com.key SSLCertificateChainFile /home/hoge/.le/www.example.com/ca.cer
で指定。
sudo /etc/rc.d/init.d/httpd restart
で一応動いたっぽい。
ただしTLS1.0しか使えていないので「古い暗号スイート」と言われてしまう。CentOS 5ではOpenSSLが0.9.8のため。
$ cat /etc/redhat-release CentOS release 5.11 (Final)
CentOS5のサポート期限である2017年3月31日までにはOSバージョンアップが必須。
2015年いっぱいでOpenSSL0.9.8のアップデートが無くなる? #CentOS - Qiita
*1:有効期限が5月13日までになっているのがちゃんと更新されるか確認。
RubyでGoogle Analytics APIのOAuth2認証対応
YouTube API v2が終了したのに加えて、Analytics APIもOAuth2が必要になった。
YouTubeの方は道なりで行けたけど、Analyticsの方はGarbのままでは駄目っぽい。
RubyのバッチでGoogleAnalyticsのデータを取得する(OAuth2利用) - zakihayaメモ
ここ参考。Google Developers ConsoleでAnalytics APIを有効にするのを忘れないように。
zenbackがSSLページで動作しない
[blocked] The page at 'https://xxxx/' was loaded over HTTPS, but ran insecure content from 'http://w.zenback.jp/v1/?callback=jQueryxxxx': this content should also be loaded over HTTPS.
と言われる。
http://w.zenback.jp/v1/ の57行目が
url: "http:\/\/w.zenback.jp\/v1\/"
なので
url: "\/\/w.zenback.jp\/v1\/"
に直したものを自前でサーバに用意して読み込んでみると一応動く。(randも受け取って埋め込んだ。)
しかしさらにTwitterやはてなブックマークのボタン用jsを読み込む部分でhttp:が指定されている。今度は解読する部分が長いのであきらめた。
というか途中までは「//w.zenback.jp/〜」で記述してSSLに対応していると見せかけて、最後まで徹底していないのは不具合だよね。

