必要なもの
- ロールにAPIが含まれているSymbolノード
- Tera Term または PuTTY
MongoDB コンテナの IP とポートを調べる
まず、docker ps コマンドで MongoDB コンテナ名を調べます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d18c1ab5b762 symbolplatform/symbol-server:gcc-1.0.3.9 "/bin/bash /symbol-c…" 2 months ago Up 2 weeks 0.0.0.0:7900->7900/tcp mainnet-node
4c11df2c87ca symbolplatform/symbol-server:gcc-1.0.3.9 "/bin/bash /symbol-c…" 2 months ago Up 2 weeks mainnet-broker
17b22ca1104e symbolplatform/symbol-rest:2.5.1 "npm start --prefix …" 2 months ago Up 2 weeks 0.0.0.0:3010->3000/tcp mainnet-rest-gateway
12d6ad7e7e5d mongo:7.0.23 "docker-entrypoint.s…" 2 months ago Up 2 weeks 27017/tcp mainnet-db
e06b4784e8db symbolplatform/symbol-server:gcc-1.0.3.9 "/bin/bash /symbol-c…" 2 months ago Up 2 weeks 0.0.0.0:7950->7950/tcp testnet-node
4087f52bb1a6 symbolplatform/symbol-server:gcc-1.0.3.9 "/bin/bash /symbol-c…" 2 months ago Up 2 weeks testnet-broker
5161191d856b symbolplatform/symbol-rest:2.5.1 "npm start --prefix …" 2 months ago Up 2 weeks 0.0.0.0:3060->3000/tcp testnet-rest-gateway
4339e4fe9748 mongo:7.0.23 "docker-entrypoint.s…" 2 months ago Up 2 weeks 27017/tcp testnet-db
aadea88ec5de symbolplatform/symbol-explorer:1.3.0-amd64 "ash -c '/bin/ash /s…" 7 months ago Up 2 weeks 0.0.0.0:90->4000/tcp mainnet-explorer
3ae4a0dda632 symbolplatform/symbol-explorer:1.3.0-amd64 "ash -c '/bin/ash /s…" 7 months ago Up 2 weeks 0.0.0.0:100->4000/tcp testnet-explorer
IMAGEにmongoが含まれる行を探します。この例ではメインネットとテストネットの両方が稼働していますが、ここではテストネットに接続してみます。
NAMEがtestnet-dbで、ポートが27017であることが分かります。
次に、コンテナ名を使ってIPアドレスを調べます。
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' コンテナ名
上記の例では、以下のように実行します。
$ docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' testnet-db
172.21.0.3
これで、IPアドレスが172.21.0.3であることが分かりました。
ターミナルエミュレータの設定
Tera Termの場合
SSH接続後、Tera Termのメニューから「設定 -> SSH転送」を選択するとSSHポート転送ダイアログが開くので、「追加」を押します。
ローカルポート: 27027(任意の未使用ポートでOK)
リモートホスト: 172.21.0.3(上記で調べたIPアドレス)
リモートポート: 27017(上記で調べたポート)
設定出来たら、「OK」を押してSSHポート転送ダイアログを閉じます。
PuTTYの場合
セッションから接続先を読み込み、「接続 -> SSH -> トンネル」を選択します。
- ローカルポート:
27027(任意の未使用ポートでOK) - 送り先:
172.21.0.3:27017(上記で調べたIPアドレスとポート)
設定が完了したら、SSH でサーバーにログインします。
ローカルPCから接続
SSH接続出来たらローカルPCからMongoDBにアクセスしてみましょう。
MongoDB Compass で接続
MongoDB Compassをインストールします。以下のリンクからダウンロードできます。
Compassの接続設定で、ポート番号を「ローカルポート」に設定した値(例: 27027)に変更し、「Connect」ボタンを押すと接続できます。
接続URI例: mongodb://localhost:27027/
catapultスキーマにSymbol Restで扱うデータが格納されています。
Base64で格納されていることが多いので、16進数文字列をバイナリ->Base64変換する面倒さがあります。
自作プログラムからアクセスしたい
Python などのプログラムから接続する場合、ローカルホストに接続するように記述します。
以下はPythonでMongoDBにアクセスする例です。
"""
MongoDBからcatapultブロック情報を取得するサンプルスクリプト。
"""
from pprint import pprint
from pymongo import MongoClient
from bson import ObjectId, Binary
def clean_mongo_doc(doc):
"""
MongoDBドキュメントを再帰的にクリーンアップする関数
"""
if isinstance(doc, dict):
return {k: clean_mongo_doc(v) for k, v in doc.items()}
if isinstance(doc, list):
return [clean_mongo_doc(v) for v in doc]
if isinstance(doc, ObjectId):
return str(doc)
if isinstance(doc, (bytes, Binary)):
return doc.hex()
else:
return doc
def main():
"""
メイン処理
"""
client = MongoClient("localhost", 27027)
db = client.catapult
collection = db.blocks
mongo_doc = collection.find_one(filter={"block.height": 2})
pprint(clean_mongo_doc(mongo_doc))
if __name__ == "__main__":
main()






