Skip to content

liray-unendlich/mip-docker-swarm

Repository files navigation

mip-docker-swarm

MIP テストネットぞの察応ずしお、サヌバヌに以䞋の構造のサヌビスを皌働させ、ク゚リサヌビスを様々なチェヌンで提䟛したす。

今回の構成では、Contabo Cloud VPS XL 1 台を借りお構成を䜜るこずにしたしたチェヌン数が増えれば増えるほど、負荷が厳しくなる可胜性がありたす。その堎合、適宜サヌバヌ数を増やしたす。 既に、Gnosisチェヌンではメむンネットでのク゚リ提䟛が開始されおいたす。このブランチでは、あくたでテストネット甚のサヌビス提䟛䜓制ずしたす管理がややこしいんですが、しょうがないです。 たた、ロヌドバランサヌずしお traefik を、docker swarm の WebUI ずしお swarmpit/portainer をむンストヌルしたす。

手続きは、以䞋のずおりです。

  1. VPS を契玄する
  2. ENS(goerli), ドメむン(gunu-node.comみたいなや぀)を取埗する
  3. VPS の初期蚭定をするhttps://ayame.space/2021/03/ubuntu-20-04-initialize/ の Docker 環境の構築盎前たでぐらいやれば十分
  4. docker をむンストヌルする
  5. github レポをクロヌンする
  6. 以䞋のドキュメントに埓い蚭定する
  7. 動くか確認する
  8. レポゞトリの曎新があったずきに曎新する

ここでは、最初の 1~3 を省略し、4 からやっおいきたす。 2 に぀いおのみ、泚意点がありたす。 ドメむン玐付けは、次のように行なっおください。

サヌビス名 ドメむン 割圓 IP
traefik traefik.sld.tld サヌバヌマネヌゞャヌの IP
swarmpit swarmpit.sld.tld サヌバヌマネヌゞャヌの IP
portainer swarmpit.sld.tld サヌバヌマネヌゞャヌの IP
prometheus prometheus.sld.tld サヌバヌマネヌゞャヌの IP
grafana grafana.sld.tld サヌバヌマネヌゞャヌの IP
indexer indexer.sld.tld サヌバヌマネヌゞャヌの IP
indexer-arbitrum indexer-arb.sld.tld サヌバヌマネヌゞャヌの IP

目次は以䞋のずおりです。

4. docker をむンストヌルする

docker は、次のコマンドをサヌバヌ䞊で実行しお、むンストヌルしたしょう。

curl -fsSL https://get.docker.com/ | sh

次に、

sudo usermod -aG docker [ナヌザヌ名]
sudo service docker restart

を実斜し、タヌミナルを開きなおしたしょう。これにより、非 root ナヌザヌでも docker を䜿甚できるようになりたした。

5. github レポをクロヌンする

このレポのスクリプトでほがむンストヌルは完了するので、次の順番でコヌドを入れおいきたしょう。

sudo apt-get install -y git
git clone https://github.com/liray-unendlich/mip-docker-swarm.git
cd mip-docker-swarm
git checkout testnet
cp example.env .env

ここたでで、コヌドのダりンロヌドが完了したした。 最埌の行で、example.env を.env ずしおコピヌしたしたので、.env を自分甚の蚭定に倉曎したしょう。 詳しくは、 envファむルの蚭定事項に぀いお を確認ください。

5.1 以前のデヌタのうち、䞍芁なデヌタを削陀する

これたでのMIPレポゞトリず構造が倉わったので、これたで動かしおいた方は、次のコマンドを䜿っおデヌタを削陀したしょう。

docker stack rm $(docker stack ls --format "{{.Name}}")
rm -r ~/mip-docker-swarm/data/postgres/*

6. スクリプトを動かしお蚭定

それでは、スクリプトを䜿っお、サヌバヌごずの初期蚭定docker swarm の蚭定甚を行いたしょう。 たず、次のコマンドを、サヌバヌ 䞊で実斜したす。

chmod +x init-manager.sh
bash init-manager.sh

スクリプト実行時、管理者パスワヌドの入力が必芁ずなりたす。このスクリプトによっお、docker swarm のクラスタヌが生成され、traefik/swarmpit/portainer/prometheus/grafana をむンストヌルしたした。サヌバヌの動䜜が適切になされおいるかを確認するため、Web UI(Swarmpit/Portainer)を確認したしょう。

envファむルの蚭定事項に぀いお で蚭定した"swarmpit.sld.tld/portainer.sld.tld"に接続しおみたしょう。するず、最初にアカりント蚭定を芁求された埌、ログむンできるようになるはずです。ここでは、耇数のサヌバヌにたたがっお同じクラスタヌのサヌバヌの凊理状況やプロセス状況を確認するこずが出来たす䞋に䟋画像を匵り付けおいたす。埌で初期蚭定をする、むンデックスサヌバヌの蚭定のログや、様々な蚭定を WebUI から倉曎できたす。

7.むンデクサヌをgoerliテストネット䞊で皌働させる

次に、必芁なサヌビスずなる、以䞋4サヌビスを皌働させたす。

  • むンデックスノヌドク゚リノヌドが必芁ずするむンデックス枈みデヌタを提䟛する
  • ク゚リノヌドむンデックスサヌビスにク゚リデヌタを提䟛する
  • むンデクサヌ゚ヌゞェントGraph Networkず接続し、むンデックスノヌドの管理を行う
  • むンデクサヌサヌビスGraph Networkず接続し、ク゚リ提䟛を行う そのサヌビスを皌働させるために、次のコマンドをサヌバヌ䞊で実行し、必芁な蚭定ファむルの曎新を始めたしょう。
cp graph-node-config/config.tmpl graph-node-config/config.toml
nano graph-node-config/config.toml

このコマンドにより、次の画像のような画面が衚瀺されるはずです。

このファむルは、むンデックスノヌド及びク゚リノヌドが、様々なチェヌンで適切にデヌタを取埗するための蚭定ファむルになっおいたす。すなわち、どんなチェヌンを、どのような゚ンドポむントの組からデヌタ取埗するかを定矩しおいたす。graph-nodeのconfigに぀いお から、蚭定方法をご芧ください。

※今どのチェヌンのテストネットを行っおいるかは、Notionからご芧ください曎新倚くお远いきれないので。䞋のサブグラフ䞀芧から、必芁なサブグラフに割圓を行いたしょう。

さお、config.tomlが適切に蚭定出来たら、サヌバヌ䞊で、次のコマンドを䞀行ず぀実斜したす。

chmod +x update-indexer.sh
bash update-indexer.sh

このコマンドが完了すれば、swarmpit/portainerから次の画像のようにむンデクサヌが起動しおいるこずがわかるはずです。

たた、この動画のようにportainerを操䜜するこずで、ブラりザ䞊でコンテナぞのアクセス・コマンド送信が出来るようになりたす。この動画では、indexer-cliを操䜜しお、indexer statusを衚瀺させおいたす。

Goerliテストネット䞊でむンデクサヌを登録する

https://testnet.thegraph.com でむンデクサヌになるため、200kGRT をステヌキングする必芁がありたす。

  1. https://testnet.thegraph.com ぞ行く
  2. 䞊の goerli ETH アドレスを蚭定した Metamask で接続する
  3. 右䞊のアバタヌをクリックする
  4. Indexing タブをクリックし、Stake ボタンを抌すこの時、200kGRT をステヌキング

これが完了するず、むンデクサヌずしおの登録が完了したす。※オペレヌタヌ蚭定はオプションなので、テストネットの報酬ずは盎接関係ありたせん。

オペレヌタヌを蚭定する

次に、オペレヌタヌずしおサブのりォレットを蚭定したすむンデクサヌりォレットずオペレヌションりォレットを分ける人はこれをやるずよい。

  1. https://testnet.thegraph.com ぞ行く
  2. 䞊の goerli ETH アドレスを蚭定した Metamask で接続する
  3. 右䞊のアバタヌをクリックする
  4. Operators ボタンをクリックし、+ ボタンを抌しお他のアドレスを远加する

サブグラフぞのアロケヌションMIPで指定されたサブグラフを同期開始

次に、サブグラフをむンデックス開始するための手続きを説明したす。 portainerより、stack > indexer > indexer-cli ず移動し、コン゜ヌルを開きたしょう。 次のコマンドを䞀行ず぀入力し、アロケヌションを行いたしょう。

たた、40000は割り圓おたい枚数に適宜倉曎しおください枚数の倧小は報酬に圱響したせん。

graph indexer rules set QmTTUYzPWZjJotwhCej2KhXVygg9mbyTYXLqsTf7zNkxMc decisionBasis always allocationAmount 50000
graph indexer rules set QmYPTfFCmQPdD2jinmTRzmkqfuThGTVtat99xKy64q5QnG decisionBasis always allocationAmount 50000
graph indexer rules set QmcCzAgW7ZN7Bhwa8Mf5n7JzPxjX7c3ex1wEHVCYrpawjV decisionBasis always allocationAmount 50000

このコマンドを実行するず、オペレヌタヌりォレットからTXが発信し、アロケヌションが実斜されたす。この埌、grafanaのダッシュボヌドで確認するず、むンデックスが開始しおいるはずです。

次のコマンドを実行するこずで、今有効になっおいるアロケヌションの䞀芧を取埗できたす。

graph indexer allocations get --status active

アロケヌションを終了する際は、アロケヌションのIDが必芁になるので、泚意しおください。

サブグラフぞのアロケヌションの終了

次に、むンデックスをやめたいサブグラフずいうかアロケヌションを終了するための手続きを説明したす。 portainerより、stack > indexer > indexer-cliず移動し、コン゜ヌルを開きたしょう。 次のコマンドを䞀行ず぀入力し、アロケヌションを終了したしょう。

graph indexer allocations close *アロケヌションのID*

ただし、サブグラフが同期しきっおいなければ、この方法ではアロケヌションを終了できたせん。もし、報酬が無くおもいいから、匷制的にアロケヌションを終了するずきには、次のコマンドを䜿いたしょう。

graph indexer allocations close *アロケヌションのID* 0x0 --force

8. 䜿い方に慣れる

今回、以䞋の docker stack を生成・運甚しおいたす。

  • Swarmpit/Portainer(docker swarm の WebUI. このスクリプトでは、config を docker swarm の機胜を䜿甚しおアップロヌドしおいるので、原理的には、docker swarm にサヌバヌを入れた埌は、党お SwarmpitもしくはPortainer 䞊からこれからは蚭定が出来るようになりたす。curlコマンド等はportainer䞊でやりたす)
  • Traefik(ロヌドバランサヌ。SSL 蚌明曞等の発行もたずめおやっおくれたす。basicauth もやっおいたす)
  • Prometheus(index-node, query-node や、node-exporter から情報を受け取り、蓄積しおいたす)
  • Grafana(prometheus から受け取った情報や、postgreSQL から取り出したデヌタを可芖化したす)
  • postgreSQL
  • index-node(graph-node の圹割がむンデックスのもの。)
  • indexer-agent/service(index-node/query-node を管理し、倖郚から来たク゚リに応答したす)

実際にいろんな画面特に Swarmpit/Portainer ず Grafanaを芋おみおください。

9. レポゞトリの曎新に合わせお曎新する

今埌、サヌバヌの曎新は、原則次の行のコマンドを1行ごずにサヌバヌ䞊で実斜するこずで行われたす。 ※この䞭には、蚭定ファむルの曎新は含んでいたせん。

bash init-manager.sh
bash update-indexer.sh

10. 備考

もっずカスタムしたい人向けに、簡単なメモを入れおおきたす。

graph-nodeのconfigに぀いお

graph-node-config/config.tmpl には、䞋のような情報が蚘茉されおいたす。この config ファむルを盎接サヌビスに読み蟌たせるこずで、蚭定が出来たす。 䞋蚭定䟋の䞋に、各サヌビスの察応状況を衚で蚘茉しおいたす。

# むンデックスデヌタを保管するDBを指定する。自動で.envからロヌドしないので、自分で入れおください・・・・。
[store]
[store.primary]
connection = "postgresql://${DB_USER}:${DB_PASSWORD}@postgres:5432/${DB_NAME}"
pool_size = 10

# 各ブロックチェヌンの最新ブロックたでの同期をどのindex-nodeが行うか指定したす。そのたたでOK。
[chains]
ingestor = "index_node_0"

# Chainstackのような、フルノヌドずアヌカむブノヌドのAPI費甚に差があるようなサヌビスでは、
# フルノヌドずアヌカむブノヌドを別々に蚭定するこずで、比范的安䟡にむンデックスが可胜になりたす。
# providerにお、各サヌビスぞの接続を蚭定しおいたす。featuresにお、指定したサヌビスがフルノヌドか、
# アヌカむブノヌドか、トレヌス有のアヌカむブノヌドかを指定したす。
# それぞれ、[],["archive"],["archive", "traces"]ず指定するこずで、適切な蚭定になりたす。
# 䞋の䟋では、polygon-xxxずしおフルノヌドを、polygon-yyyずしおトレヌス有のアヌカむブノヌドを指定しおいたす。
# もし、polygonでのむンデックスをしない堎合、[chains.polygon]のセクションはたるごず削陀しおください。
[chains.polygon]
shard = "primary"
provider = [ { label = "polygon-xxx", url = "https://xxx.io/", features = [] },
             { label = "polygon-yyy", url = "https://yyy.io/", features = ["archive", "traces"] }
]

# もし、gnosisでのむンデックスをしない堎合、[chains.gnosis]のセクションはたるごず削陀しおください。
[chains.gnosis]
shard = "primary"
provider = [ { label = "gnosis-xxx", url = "https://xxx.io/", features = [] },
             { label = "gnosis-yyy", url = "https://yyy.io/", features = ["archive", "traces"] }
]

# もし、arbitrumでのむンデックスをしない堎合、[chains.arbitrum-one]のセクションはたるごず削陀しおください。
[chains.arbitrum-one]
shard = "primary"
provider = [ { label = "arbitrum-one-xxx", url = "https://xxx.io/", features = [] },
             { label = "arbitrum-one-yyy", url = "https://yyy.io/", features = ["archive", "traces"] }
]

# もし、Ethereumでのむンデックスをしない堎合、[chains.mainnet]のセクションはたるごず削陀しおください。
[chains.mainnet]
shard = "primary"
provider = [ { label = "gnosis-xxx", url = "https://xxx.io/", features = [] },
             { label = "gnosis-yyy", url = "https://yyy.io/", features = ["archive", "traces"] }
]

# むンデックスを行う際の、各むンデックスノヌドぞの割り圓おルヌルを芏定したす。そのたたでOK。
[[deployment.rule]]
shard = [ "primary" ]
indexers = [ "index_node_0", "index_node_1" ]

# ク゚リデヌタを䜜成するノヌドを指定したす。そのたたでOK。
[general]
query = "query_node_*"

こちらは、サヌビスごずの察応状況です。

サヌビス名 features 備考
Chainstack [] Archiveを指定しおいないずき
Chainstack ["archive", "traces"] Archiveを指定しおいるずき
Ankr ["archive"] -
QuickNode [] ただ怜蚌しおたせん

envファむルの蚭定事項に぀いお

envファむルの蚭定事項がどんどん増えおきたので、以䞋に内容を列蚘したす

項目名 䟋 意味
USER_ID 1000 LinuxにおけるUser ID
GROUP_ID 1000 LinuxにおけるGroup ID
ROOT_DOMAIN sld.tld 他サヌビスが䜿甚するベヌスドメむン
TRAEFIK_USER admin traefikのナヌザヌ名
TRAEFIK_PASSWORD password traefikのパスワヌド
TRAEFIK_EMAIL email@gmail.com SSL蚌明曞取埗甚のメヌルアドレス
DB_NAME graph ブロックチェヌンデヌタを栌玍する postgreSQLのデヌタベヌス名
DB_USER user postgreSQLのナヌザヌ名
DB_PASSWORD password postgreSQLのパスワヌド
PROMETHEUS_USER admin prometheusのナヌザヌ名
PROMETHEUS_PASSWORD password prometheusのパスワヌド
INDEXER_RPC https://infura.io むンデクサヌ甚のgoerli RPC API(Full Node)
INDEXER_ADDRESS 0x.... むンデクサヌのgoerli ETHアドレス
INDEXER_MNEMONIC 12 words INDEXER_ADDRESS に玐づくmnemonic
INDEXER_GEO "49.414 11.171" サヌバヌマネヌゞャヌの 緯床経床

About

For gunu-node setup

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages