Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update webapp/tools/README.md #258

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 1 addition & 78 deletions webapp/tools/README.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
# Examples
# webapp/tools

このディレクトリは、仮想ポータルおよび仮想ベンチマークサーバの動作確認に使える Ruby スクリプトが置いてあります。

Web Push の実装の参考にできるコード例については、各言語で実装されており、 webapp/{言語名}/ 配下に配置しています (後述)。

| File | 説明 |
| ---------------------- | ----------------------------------------------------------------------- |
| `add_benchmark_job` | 仮想ベンチマークジョブのエンキューを行えます。 |
| `finish_benchmark_job` | 仮想ベンチマークサーバから 1 件デキューし、仮想負荷走行を完了させます。 |
| `show_notifications` | `notifications` テーブルの中身をデコードして表示します。 |

また、 `webpush` ディレクトリには、仮想ポータルに対して Web Push 通知でテストメッセージを送ることができる各言語のコードが置かれています。

## セットアップ

このディレクトリの `add_benchmark_job`, `finish_benchmark_job`, `show_notifications` は Ruby で実装されています。これらを実行するためには最初に
Expand Down Expand Up @@ -62,76 +58,3 @@ $ bundle exec ./show_notifications -c contestant_id
```

- `-c contestant_id` 通知を表示をする contestant の ID(必須)

## Web Push サンプルコードについて

仮想ポータルに対して Web Push 通知でテストメッセージを送ることができる各言語のコードが用意されています。

これらのサンプルコードは、 `xsuportal.proto.resources.Notification.TestMessage` をメッセージとして持つ通知 (`xsuportal.proto.resources.Notification`) を生成し、指定された contestant の持つ push_subscriptions に対し Web Push で送ります。

### Web Push の購読とサンプルコードの実行方法

1. `/home/isucon/webapp` 上で `./generate_vapid_key.sh` を実行し、VAPID 用の ECDSA 鍵 `webapp/vapid_private.pem` を生成する
- 参考実装では自動で `/home/isucon/webapp/vapid_private.pem` をロードするようになっています。
- 複数のサーバーを利用する場合、同じ鍵ファイルを共有するようにする必要があります。
2. 仮想ポータルにブラウザでアクセスして通知を受け取りたい contestant としてログインし、`/contestant` から通知を購読する
3. `send_web_push` (後述) を実行し、通知を送信する

正常に Web Push が送信できた場合、下図のような通知を受け取ることができます。

![image](https://user-images.githubusercontent.com/20384/94367612-d8064880-011a-11eb-8b21-495b1824de91.png)

以下に各言語の実装および、その実行方法を記載します。いずれもサーバー上かつ、初期状態での実行を想定しています。

### Ruby 実装: webapp/ruby/send_web_push.rb

```
set -o allexport; source ~isucon/env; set +o allexport

cd ~isucon/webapp/ruby
bundle exec send_web_push.rb -c contestant_id -i vapid_private_key_path
```

- `-c contestant_id` 通知を送信する contestant の ID(必須)
- `-i vapid_private_key_path` ECDSA 秘密鍵 PEM ファイル(必須)
- `~isucon/webapp/generate_vapid_key.sh` で生成した鍵を利用できます。

### Rust 実装: webapp/rust/src/bin/send_web_push.rs

```
set -o allexport; source ~isucon/env; set +o allexport

cd ~isucon/webapp/rust
cargo run --bin send_web_push -- -c contestant_id -i vapid_private_key_path
```

- `-c contestant_id` 通知を送信する contestant の ID(必須)
- `-i vapid_private_key_path` ECDSA 秘密鍵 PEM ファイル(必須)
- `~isucon/webapp/generate_vapid_key.sh` で生成した鍵を利用できます。

### Go 実装: webapp/golang/cmd/send_web_push/main.go

```
set -o allexport; source ~isucon/env; set +o allexport

cd ~isucon/webapp/golang
make
./bin/send_web_push -c contestant_id -i vapid_private_key_path
```

- `-c contestant_id` 通知を送信する contestant の ID(必須)
- `-i vapid_private_key_path` ECDSA 秘密鍵 PEM ファイル(必須)
- `~isucon/webapp/generate_vapid_key.sh` で生成した鍵を利用できます。

### Node.js 実装: webapp/nodejs/src/sendWebpush.ts

```
set -o allexport; source ~isucon/env; set +o allexport

cd ~isucon/webapp/nodejs
npm run send-webpush -- ${contestant_id} ${vapid_private_key_path}
```

- `${contestant_id}` 通知を送信する contestant の ID(必須)
- `${vapid_private_key_path}` ECDSA 秘密鍵 PEM ファイル(必須)
- `~isucon/webapp/generate_vapid_key.sh` で生成した鍵を利用できます。