コンテンツにスキップ

Apple Container スタック

この repo に stack file は無い。S3 API を話す SeaweedFS は crawler の repo が共有する 1 つの store(submodule の seaweedfs)で、Apple Container の上で container-compose が動かす。 archive を生成する側、つまり BrowserHive や browser は含まれない。 これが、wacz-validator が「誰が書いた WACZ か」に依存しないための土台になっている。

wacz-validator 自身も service ではない。Apple Container の compose は subcommand が up / down / build / version の 4 つしかなく、one-shot の service を駆動する手段が無いため。wacz-validator は host で動かすか、container run で叩くかのどちらかで、両方とも以下に示す。

SeaweedFS の設定は submodule (seaweedfs) にある。browserhive と capture-ledger と同じものを使う。clone のときに一緒に取るか、後から取る:

ターミナルウィンドウ
git clone --recurse-submodules https://github.com/uraitakahito/wacz-validator.git
# 既存の checkout なら:
git submodule update --init --recursive
ターミナルウィンドウ
brew install mcrich23/formulae/container-compose
sudo container system dns create crawler-storage

domain 名は共有 store の docker-compose.yml の name: と一致していなければならない。 これによって store が seaweedfs.crawler-storage として platform DNS に登録され、 他の container からだけでなく host からも解決できるようになる。開発用の container を用意していないのはこれが理由。

この repo に store は無い。 crawler の 3 つの repo が共有する 1 つの store を使う (wacz-validator bucket はそこに在る)。submodule から起こす:

ターミナルウィンドウ
sh seaweedfs/scripts/stack.sh up

bucket は store の entrypoint 内の retry ループが作る。順序を待つ init container は無い。 bucket を使う前に master を待つ:

ターミナルウィンドウ
until curl -sf http://localhost:9333/cluster/status >/dev/null; do sleep 1; done

sidecar の AWS CLI container を使えば、host に何も入れずに済む:

ターミナルウィンドウ
container run --rm \
-v "$(pwd)/samples:/samples" \
-e AWS_ACCESS_KEY_ID=wacz-validator -e AWS_SECRET_ACCESS_KEY=wacz-validator \
-e AWS_REGION=us-east-1 -e AWS_ENDPOINT_URL_S3=http://seaweedfs.crawler-storage:8333 \
docker.io/amazon/aws-cli s3 cp /samples/wikipedia.wacz s3://wacz-validator/wikipedia.wacz

upload した archive は http://localhost:8888/ui/index.html?bucket=wacz-validator で 新しい順に並ぶ(成果物を探す)。 /buckets/wacz-validator/ の素の一覧は名前順にしか返らない。

こちらが開発時の経路。AWS SDK の default chain を store に向けて、ビルド済みの CLI をそのまま動かす:

ターミナルウィンドウ
unset AWS_PROFILE # 下記参照 — profile が設定されていると負ける
export AWS_ENDPOINT_URL_S3=http://seaweedfs.crawler-storage:8333
export AWS_REGION=us-east-1
export AWS_ACCESS_KEY_ID=wacz-validator AWS_SECRET_ACCESS_KEY=wacz-validator
export WACZ_VALIDATOR_S3_FORCE_PATH_STYLE=true
./packages/validate-cli/dist/wacz-validator-validate.js s3://wacz-validator/wikipedia.wacz

port は loopback に publish してあるので、container 名の代わりに http://localhost:8333 を指しても同じように動く。

同梱の samples/wikipedia.wacz は既定の spec profile では pass する。 --profile browserhive では pass しない — webrecorder が生成した archive で CDXJ index が gzip されており、この profile はそれを拒否するため。profile が仕事を している状態で、詳細はプロファイルを参照。

ターミナルウィンドウ
container build -t wacz-validator:latest .
container run --rm \
-e AWS_ENDPOINT_URL_S3=http://seaweedfs.crawler-storage:8333 \
-e AWS_REGION=us-east-1 \
-e AWS_ACCESS_KEY_ID=wacz-validator -e AWS_SECRET_ACCESS_KEY=wacz-validator \
-e WACZ_VALIDATOR_S3_FORCE_PATH_STYLE=true \
-e NODE_OPTIONS=--dns-result-order=ipv4first \
wacz-validator:latest s3://wacz-validator/wikipedia.wacz

--target を書かない build は、CLI の image を建てる(Dockerfile の最後の段)。 image の entrypoint が CLI なので、image 名より後ろはそのまま CLI に渡り、 終了コードも wacz-validator 自身のものになる。

NODE_OPTIONS=--dns-result-order=ipv4first が要るのは container 内で動かすとき だけ。platform DNS は AAAA も返すが VM 間に v6 経路が無いので、Node が v6 を先に 解決すると到達できない。host 実行では不要。

常駐の daemon は、Dockerfile の daemon の段で建てる。

ターミナルウィンドウ
container build --target daemon -t wacz-validator-daemon:latest .
container run --rm -p 127.0.0.1:7180:7180 \
-v "$PWD/samples:/samples:ro" \
wacz-validator-daemon:latest

コンテナの中では 0.0.0.0:7180 で待つ(WACZ_VALIDATOR_DAEMON_HOST・WACZ_VALIDATOR_DAEMON_PORT)。 host には 127.0.0.1 にだけ出すこと。 mount した置き場の WACZ は、file:///samples/wikipedia.wacz の形の source で読める。

image の中には .git が無いので、報告と /healthz の版は unknown、gitSha は nogit になる。

store は共有なので、立てたままにしておくのが普通(他の repo が使っているかもしれない)。

ターミナルウィンドウ
sh seaweedfs/scripts/stack.sh down # 共有 store を全員のぶん止める
pnpm run store:wipe # あるいは、この repo の bucket だけ空にする

中身を消す・見る・store ごと作り直す手順は 1 か所にまとまっている: seaweedfs の operations。

credential がどう wacz-validator に届くか

Section titled “credential がどう wacz-validator に届くか”

AWS_ENDPOINT_URL_S3 は AWS SDK の default chain が読むので、bundled store に 向けるための専用の code path は要らない。AWS_REGION は SDK が要求するが SeaweedFS 側は値を無視する。WACZ_VALIDATOR_S3_FORCE_PATH_STYLE=true を opt-in している のは、virtual-hosted-style の addressing に必要な bucket subdomain の wildcard DNS を SeaweedFS が持たないため。

この構成は bundled SeaweedFS 専用で、AWS / R2 / その他の S3 互換 service への 切り替えは現状想定していない。