昨年から自作サービスの多くを dokku 環境で公開しています。このブログでも何件かの dokku 関連ネタを紹介しています。今回のネタはその1つです:
20220609


dokku を使うことで、ウェブアプリケーションだけでなく PostgreSQL のようなデータベースインスタンスを作って利用することもできます。実際に PostgreSQL データベースを作ってウェブアプリケーションと接続(link)して使う方法をブログエントリとして紹介したこともあります:
http://dotnsf.blog.jp/archives/1080505175.html


最終的に dokku で公開するアプリケーションに関しては dokku アプリから dokku の PostgreSQL に接続して使うことになります。この場合はアプリとデータベースとを link することで、アプリケーション側の環境変数 DATABASE_URL に
postgres://postgres:password@dokku-postgres-mydb:5432/mydb

のような接続文字列の値が設定されます(ホスト名 dokku-postgres-mydb、ポート番号 5432、ユーザー名 postgres、パスワード password、DB名 mydb)。この値を使ってデータベースに接続することになります(ホスト名 dokku-postgres-mydb という値は dokku 内部で解決されて、アプリケーションサーバーと同じ dokku 内で動いている PostgreSQL データベースコンテナに接続されます)。この時点では PostgreSQL データベースは dokku 内のアプリケーションだけに公開されていることになります。


ただアプリケーションを一時的に localhost で起動して、localhost から dokku の PostgreSQL に接続して動作確認したくなることもあります(デバッグ時など)。そのようなことをする場合、dokku 内に作った PostgreSQL を dokku 外の(localhost の)アプリケーションから接続することになり、上述の(dokku 内のアプリケーションから接続する前提の)接続文字列を使うことはできません。このような接続設計を実現するための設定を紹介します。

まず PostgreSQL データベースインスタンス(mydb)を作成します:
# dokku postgres:create mydb

この mydb への(link した dokku アプリからの)接続文字列を確認するには以下のようなコマンドを実行します。実行結果の Dsn 値に対象の接続文字列を確認できます:
# dokku postgres:info mydb

=====> mydb postgres service information
       Config dir:          /var/lib/dokku/services/postgres/mydb/data
       Config options:
       Data dir:            /var/lib/dokku/services/postgres/mydb/data
       Dsn:                 postgres://postgres:password@dokku-postgres-mydb:5432/mydb
       Exposed ports:       -
       Id:                  1f5692d21aeb94de6f7bd9f467c41e2a52d6ee9fdff4d628379c883f72d25f9e
       Internal ip:         172.17.0.29
       Links:               -
       Service root:        /var/lib/dokku/services/postgres/mydb
       Status:              running
       Version:             postgres:14.2

この mydb データベースを dokku 外部から利用するには expose コマンドを実行します:
# dokku postgres:expose mydb

-----> Service mydb exposed on port(s) [container->host]: 5432->31157

すると実行結果に(↑の例だと) 5432->31157 という結果が表示されます。この 31157 というのが dokku 外部からこの mydb に接続するための(外向けの)ポート番号となります。仮にこの dokku が動いているホストの名前が dokku.myserver.com であったとすると、外部アプリからの接続文字列は
postgres://postgres:password@dokku.myserver.com:31157/mydb

を指定すればよい、ということになります。