C#のドライバでつないでたMongoDBサーバを変更したらよくつながらなくなったのとその対処

 このブログのデータベースはMongoDBのホスティングサービスmlabを使っていたのだが、スペックとコストなどの問題から、VPSに入れたものへ切り替えた。そうしたらデータが取ってこれなくなることが頻発した。

 このブログはASP.NET Core MVCで作ってある。アプリのプロセス立ち上がり時にデータベース接続を行い、以降はその接続を使いまわしてリクエストをさばいていた。
client = new MongoClient(clientSettings);

db = client.GetDatabase(dbName);


 調べてみたところ、接続時のオプションにkeepAliveなるものがあるようなので、それを使ってみた。問題は起きなくなった。
https://jira.mongodb.org/browse/CSHARP-1151
var url = new MongoUrl(connectionString);

var clientSettings = MongoClientSettings.FromUrl(url);
Action<Socket> socketConfigurator = s => s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
clientSettings.ClusterConfigurator = cb => cb.ConfigureTcp(tcp => tcp.With(socketConfigurator: socketConfigurator));
client = new MongoClient(clientSettings);
db = client.GetDatabase(dbName);


 アプリ観察によると問題はとりあえず解決したようなんだけどちょっともやもや。MongoDBサーバをホスティングサービスのものから自分のVPS運用のものに変えてから問題は出始めた。なのにクライアントサイドの接続コードを変えることで問題は解決した。ちょっと謎。
comment: 0

Githubでのコントリビュートの仕方

 先日、最近お気に入りのサービスであるHyper.shのコマンドラインツールにバグを見つけたので、修正してプルリクを投げた。Githubで。これを振り返って、Githubでのコントリビュートの仕方をざっくりと書いておく。

 前準備として、Githubアカウントを持っていて、Githubのデスクトップアプリも入れておく。

・フォークする
コントリビュートしたいライブラリのGithubページをブラウザで開く。右上にForkというボタンがあるのでクリック。それでフォークが行われる。ここでのフォークとは、自分のリポジトリにそれがコピーされるということ。


 自分のGithubページにいけば、フォークされたライブラリが確認できる。


・自分のローカル環境に、ライブラリのファイル一連を落とす
 デスクトップのGithubアプリを開いてクローンする。


 クローンしたら、バグの箇所を直す。そして自分のところにコミットにして、Githubサーバと同期をとる。

・プルリクエストを投げる
 再びブラウザに戻って、プルリクエストを作る。


 なにをしたかをタイトルにつけて、詳細を本文に書く。今回は本文にはどういう環境、状況でバグが出て、それに対してどう修正を行ったかを書いた。
 テストの実行云々はCIが組まれていれば、プルリクエストを投げた時に自動で行われるのでこまごまと書く必要はない。
 

 ここまでやったらあとは向こうのリアクションを待つ。向こうにも都合があるかもしれんので、マージされるとは限らない。
 あとライブラリによってはコントリビュートにルールが設けてあったりする。コード修正の時のコーディング規約とか。そこらはルールに従って臨機応変に。
comment: 0

継続的デプロイと継続認証のコンテナ

 DockerコンテナでLet's Encryptと継続的デプロイをなにも考えずに組み合わせたら大失敗だった。Let's Encryptには証明書取得数の上限があった。
https://absurd.azurewebsites.net/Article/118

 上記の問題を、証明書を外部ボリュームに入れて運用するDockerイメージを作ることで解決した。
https://github.com/hMatoba/cdcc

 下記はコンテナホスティングサービスHyper.sh上で、このDockerイメージを作って運用するときのdocker-compose。証明書を自動で取りに行って、WebアプリをHTTPS運用するコンテナとしてよしなにやってくれる。
docker-compose.yml

version: '2'

services:
cdcc:
image: matoba/cdcc
ports:
- '80:80'
- '443:443'
fip: 199.245.56.122
size: s4
links:
- webapp:webapp1
volumes:
- cdcc:/etc/letsencrypt
environment:
DOMAIN: 'example.com'
E_MAIL: 'foobar@example.com'
LINK_NAME: 'webapp1'
webapp:
image: some_webapp
ports:
- '80:80'
comment: 0