Raspberry Pi + IPFS + Monacard PIN でモナカードを応援
モナカード、もらってばかりだし、何かしら応援したいと思ってた。
このtweetに触発されて、Raspberry Pi に IPFS を入れて、モナカードをPINするようにした。環境構築のメモを残しておきます。
1. 用意したもの
- Raspberry Pi 4 Model B 8GB
umbrelに使用しているラズパイが故障したとき用のストック。なので、何かあったらこっちを止めてumbrelの復旧に使用する予定。でも遊ばせておくのはもったいないので何かに使いたいよね。なるべく寿命を縮めないよう負荷の軽い用途で。
- microSD 64GB
容量はこんなに要らないけど、あるに越したことないかな、SDカードの寿命的に。
2. microSD に OSを焼く
純正のRaspberry Pi Imager を使用。
OS:Raspberry Pi OS LITE (64-BIT)
歯車マークを押して、
SSHを有効化するにチェック
ユーザ名とパスワードも設定。
保存を押して設定を変更し、microSDにOSを書き込み
3. Raspberry Pi の環境設定
microSDカードをRaspberry Piに挿し、起動。Raspberry PiのIPアドレスはルータなどのDHCPのログなどから特定してください。
Windows PowerShellなどのターミナルソフトからSSHでRaspberry Pi にログイン
ssh -t pi@192.168.2.2
(IPアドレス 192.168.2.2 ユーザpiでのログインの例)
以下の設定をしていきます。
- とりあえずapt
sudo apt update
sudo apt full-upgrade
sudo apt clean
- dockerをインストール
sudo apt install docker.io
- IPアドレスを固定にしておく。(必須ではない)
sudo vi /etc/dhcpcd.conf
# static IP configuration:
interface eth0
static ip_address=192.168.2.2/24
static routers=192.168.2.1
static domain_name_servers=192.168.1.1
それぞれの値は自分の環境に応じて設定してください。
4. Docker で IPFSをインストール
以下のYouTubeが分かりやすい
やってることは
cd ~
mkdir Containers
cd Containers/
mkdir ipfs
cd ipfs/
mkdir data
mkdir export
sudo docker run -d --name ipfs -v /home/pi/Containers/ipfs/export:/export -v /home/pi/Containers/ipfs/data:/data/ipfs -p 4001:4001 -p 4001:4001/udp -p 8080:8080 -p 5001:5001 ipfs/kubo:latest
sudo docker ps
sudo docker logs 35b9dfe84e03
(35b9dfe84e03 はdocker ps で得られるIPFSのCONTAINER IDの例)
192.168.2.2:5001/webui/ を開く(IPアドレスはラズパイのIPアドレス)
sudo docker exec 35b9dfe84e03 ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://192.168.1.102:5001", "http://localhost:3000", "http://127.0.0.1:5001", "https://webui.ipfs.io"]'
sudo docker exec 35b9dfe84e03 ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST"]'
sudo docker restart 35b9dfe84e03
- ipfsコンテナの自動起動を設定
sudo docker update --restart=always ipfs
5. 全モナカードのIPFS PIN付け
ここから拾ってきた monacard.py をローカルに保存して
python monacard.py
を実行するとPINできる。どこまでPINが進んでいるのかわからないので、以下の通り番号を振った。
import re
import requests
endpoint = "http://127.0.0.1:5001/api/v0/pin/add"
url= "https://card.mona.jp/api/cid_list"
response = requests.get(url)
parse_data = re.finditer(r'"cid":"([a-z0-9]+)"', response.text)
count = 1
for m in parse_data:
r = requests.post(endpoint + "?arg=" + m[1],)
print(count,end=' , ')
print(r.url)
count+=1
これを書いている時点で6701点ありました。
6. crontab -e で自動実行を設定
$ crontab -e
no crontab for pi - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.tiny
3. /bin/ed
Choose 1-3 [1]: 2
crontab: installing new crontab
vi を選んだけど、初心者向けは1番のnanoです。
15 20 * * * /usr/bin/python ~/monacard.py
毎日20:15に全モナカードをPINするように設定。
7. microSDの寿命を考慮(この辺りはお好みで)
- swap を無効にする
sudo systemctl status dphys-swapfile
sudo systemctl disable dphys-swapfile
- ログを揮発性に
sudo vi /etc/systemd/journald.conf
Storage=volatile
8. その他
・無線LANを使うと無線LANが不安定になったのでやむなく有線LANで構築。このあたりは環境によると思います。ケーブル1本減るし無線LANにしたかったけど。
・当初持て余しているRaspberry Pi Zero2を有効利用できたら最高と思って始めたのだけど、重すぎてモナカードのPINは途中で止まるし、sshのログインにも支障が出るのであきらめて、Raspberry Pi 4Bを使うことになった。
・monacard.py のページでcryptcoin-junkey氏が書いてるAnother method for Unix one-liners.を今回のdockerの環境で書くと以下かな。
curl https://card.mona.jp/api/cid_list | jq -r .list[].cid | xargs sudo docker exec 35b9dfe84e03 ipfs pin add --progress
・他のNFTもPIN出来たらよいのだけど、どこかにリストがまとまっていないでしょうか?Rare Japanese Nfts などのbitcoin系のNFTもPIN出来れば嬉しいのだけど。