管理画面とBAN
部屋のサーバー(Cloudflare版とVercel版)を運営する人が、部屋の様子を見て、困った使いかたをする人を止めるための画面です。部屋や画像を大量に作られて費用がかさむなど、思わぬ使われかたに気づいたときに読んでください。止めるとき(BAN)は、送信元のIPアドレス(とその範囲)か、Discordのアカウントを選べます。
使えるようにする
部屋のサーバーにADMIN_DISCORD_IDSを入れると、管理画面が使えるようになります。入れていないあいだは、管理画面は無く、/adminを開いても404が返ります。
ADMIN_DISCORD_IDSには、管理画面に入れる運営する人の、DiscordのユーザーIDを書きます。何人かいるときは、カンマで区切ります(例:123456789012345678,234567890123456789)。ユーザーIDは、Discordの「設定」→「詳細設定」で「開発者モード」を有効にし、自分のアイコンを右クリック(スマートフォンでは長押し)して「ユーザーIDをコピー」で取れます。数字でないものが入っていると、設定の誤りとして、部屋のサーバーのすべてのリクエストに500 config-invalidを返します。
| 置き場所 | 入れかた |
|---|---|
| Cloudflare版 | Workerのシークレットとして足します(→ 値の置き場所)。wrangler.jsoncには書きません |
| Vercel版 | プロジェクトのEnvironment Variablesに足し、デプロイし直します(→ 値を変える) |
あわせて、DiscordのアプリのRedirectsに、部屋のサーバーのURLの後ろに/admin/login/callbackを付けたものを足します(例:https://backend.example.com/admin/login/callback)。Axeのログインのための/v1/login/discord/callbackとは別に要ります(→ Discordのアプリを作る)。
管理画面が使えるのは、ログインの3つ(DISCORD_CLIENT_ID、DISCORD_CLIENT_SECRET、SESSION_SECRET)が入っているときだけです。ログインが無いと部屋も無いので、管理画面のAPIは503 login-unavailableを返します。
Cloudflare版では、BANと記録を置くDurable Object(MODERATION)を使います。この版からのデプロイで作られるので、用意するものはありません。
開く
ブラウザで、部屋のサーバーの/adminを開き(例:https://backend.example.com/admin)、「Discordでログイン」を押します。入るには、次の2つを通ります。どちらか1つが漏れても、入れないようにするためです。
- Discord:
ADMIN_DISCORD_IDSに書いたアカウントで、Discordにログインします。Discordの2段階認証を有効にしていないアカウントは入れません。 - パスキー:部屋のサーバーに戻ったら、端末のパスキー(指紋や顔、PIN、セキュリティキー)で確かめます。パスキーは、その部屋のサーバーのページでしか使えないので、にせのページに誘われても盗まれません。
- はじめて入るときは、パスキーを確かめる代わりに、その端末のパスキーを登録します。登録したら、「安全」から別の端末(スマートフォンなど)のパスキーも足しておいてください。端末を失くしても入れるようにするためです。
- 置いたあと、自分のパスキーを登録するまでのあいだは、
ADMIN_DISCORD_IDSのアカウントでDiscordにログインできた人が、最初のパスキーを登録できます。置いたらすぐに、自分で登録してください。 - 入ったあとのログインは、30分操作が無いか、Discordでログインしてから12時間たつと切れます。ログインはHttpOnlyのCookieに置くので、ページのスクリプトからは読めません。共用のパソコンでは、使い終わったら「ログアウト」を押してください。
- 部屋の削除、画像と音声の削除、二度と置かせないことと、その解除、アカウントの削除、パスキーの追加と削除、すべての人をログアウトさせることは、パスキーで確かめてから5分を過ぎていると、パスキーでもう一度確かめます。
- ログインと、断られた試みは、記録に残ります。知らせを入れていれば、Discordにも届きます。
- 管理画面は、BANの対象になりません。自分のIPアドレスを間違えてBANしても、管理画面から解けます。
画面
左のメニューで、「概要」「部屋」「アップロード」「通報」「記録」「BAN」「アカウント」「安全」「設定」を切り替えます(スマートフォンでは、上の「メニュー」から開きます)。開いたときと、「読み込み直す」を押したときに、最新の状態を読みます。「30秒ごとに読み込む」に印を付けると、タブを開いているあいだ、30秒ごとに読み直します。BANしてある送信元やアカウントには、BANのボタンの代わりに「BAN中」と出ます。緊急停止しているあいだは、どの画面でも、いちばん上に「緊急停止中」と、止めているものが出ます。
概要
部屋のサーバーでいま何が起きているかを、1つの画面で見ます。上の「24時間」「7日」で、数える期間を選びます。
- 注意:気にかけたほうがよい動きを、いちばん上に出します。管理画面に入ろうとして断られた送信元があるとき(要対応)、回数の上限を超えた送信元があるとき(注意)、記録が2000件に達して古い出来事を数えられないとき(注意)です。
- 数:いま部屋に入っている人、部屋の数、期間に置いた画像と音声の件数と大きさ、ログインの数、回数の制限、BANの数です。
ADMIN_STORAGE_ALERT_GBを入れていれば、置き場所の使用量(最後に数えたとき)も出します。知らせる量の8割を超えると「注意」、超えると「要対応」の印が付き、超えたときは上の注意にも出します。 - グラフ:「使われかた」(ログイン、部屋を作った、画像と音声を置いた)、「置いた画像と音声の大きさ」、「回数の制限とBAN」を、1時間ごと(7日のときは1日ごと)に積み上げます。棒にカーソルを合わせる(スマートフォンでは押す)と数が出ます。「数を表で見る」で表にもできます。
- 目立つ送信元・目立つアカウント:期間の出来事を、IPアドレスごとと、Discordのアカウントごとにまとめ、多いものから10件並べます。並べかたは、置いた画像と音声の大きさ、作った部屋の数、制限・BAN・管理画面で断った数、出来事の数から選べます。そこからBANの用意をしたり、「記録」でその送信元やアカウントの記録を、「作った部屋」でその送信元やアカウントが作った部屋を開いたりできます。
- 人がいる部屋:いま人がいる部屋を、人数の多いものから並べます。
数は記録から数えるので、記録と同じく、7日以内の2000件までです(運営する人の操作は数えません)。回数の制限とBANで断ったのは、送信元ごとに1分に1回だけ数えます。
部屋
いまある部屋を、新しいものから2000件まで並べます。名前・ID・鍵・作った人で絞り込んだり、人がいる部屋だけにしたり、人数の多いものから並べ替えたりできます。左の欄で部屋を選び、「選んだ部屋を削除」でまとめて削除できます。「CSVで保存」で、表示している部屋をCSVのファイルにします。
| 列 | 中身 |
|---|---|
| 名前 | 部屋の名前 |
| ID | 表示用の3文字 |
| 鍵 | 部屋の鍵(32文字) |
| 人数 | いま部屋に入っている人数 |
| パスワード | パスワードがある部屋に「あり」 |
| 作った時刻 | 部屋を作った時刻 |
| 作った人のDiscord ID | 部屋を作った人のDiscordのアカウントID |
| 作った人のIPアドレス | 部屋を作ったときの送信元のIPアドレス |
この版より前に作った部屋には、作った人は出ません。
- 中を見る:その部屋のこと(上の表と同じ項目)、いま入っている人、部屋に置いてある画像と音声を出します。入っている人は、役割、ピアID、ユーザーID、Discordのアカウント(見学は「—」)、IPアドレス、入った時刻で、そこからBANの用意もできます。画像と音声は、件数と大きさの合計と、大きいものからの一覧(ファイル名、形式、大きさ、SHA-256)で、どの部屋が置き場所を使っているかが分かります。
- 削除:部屋を削除します。部屋のGMでなくても削除できます。入っている人の接続は切れ、卓の状態と画像と音声はすべて消えて、戻せません。
- Discord BAN・IP BAN:作った人をBANする用意をします(下のBANする)。
アップロード
部屋のサーバーに置いてある画像と音声を、すべての部屋の分まとめて並べます。開いたときと、「読み込み直す」を押したときに、置き場所から読みます。とても多いときは先頭の一部だけを読み、そのことを件数の横に出します。名前・ID・部屋・置いた人で絞り込んだり、種類で絞ったり、大きいものから並べ替えたりできます。「CSVで保存」で、表示しているものをCSVのファイルにします。
| 列 | 中身 |
|---|---|
| 置いた時刻 | 部屋に置いた時刻 |
| ファイル名 | 置いたときのファイル名 |
| 種類 | 画像か音声 |
| 大きさ | ファイルの大きさ |
| 部屋 | 置いてある部屋の名前。部屋の一覧(2000件まで)に無い部屋は「一覧にない部屋」 |
| ほかの部屋 | 同じもの(SHA-256が同じもの)が置いてある、ほかの部屋の数 |
| 置いた人 | 置いた人の表示名 |
| 置いた人のDiscord ID | 置いた人のDiscordのアカウントID |
| 置いた人のIPアドレス | 置いたときの送信元のIPアドレス |
置いた人の3つは、記録に残っているもの(7日以内)だけを出し、残っていなければ「—」です。
「詳しく」を押すと、上の項目に加えて、中身から判定した形式、SHA-256、部屋の鍵を出します。そこから、次のことができます。
- 中身を見る:中身をその場で見るか、聞きます。見たことは、だれが見たかと一緒に記録に残ります。
- この部屋から消す:その部屋の1つだけを消します。部屋にいる人がそのファイルを手元に持っていれば、また置かれることがあります。
- 消して二度と置かせない:中身が同じもの(SHA-256が同じもの)を、一覧で見つかったすべての部屋から消し、どの部屋にも置けないようにします。同じものをまた足そうとしたGMとPLには、対応したAxeでは、運営者が置けなくしていることが知らされ、ほかの参加者には配られません。部屋のサーバーから読もうとすると
451 blockedを返すので、対応したAxeは、部屋のほかの人にも求めません。権利侵害の申し立てを受けたものや、法令に反するものに使います(→ 権利侵害の申し立てに応える)。先頭の一部だけを読んだときは、読んだ分に無い部屋のものが残るので、ほかの部屋に残っていないかを確かめてください。 - Discord BAN・IP BAN:置いた人をBANする用意をします。
部屋に置かれた画像と音声は、その卓の参加者に見せるためのものです。中身を見るのは、権利侵害の申し立てや不正な使われかたに応えるときだけにしてください(→ 置かれた画像と音声を見るとき)。費用をかさませる使われかたは、中身を見なくても、大きさ、件数、置いた人で分かります。
下の「場所を多く使っている部屋」には、置いてあるものの大きさの合計が多い部屋から10件を並べます。ROOM_STORAGE_LIMIT_MBを入れていれば、1つの部屋の上限に対する割合も出します(→ ROOM_STORAGE_LIMIT_MB)。「二度と置かせないもの」には、置けないようにしたもののSHA-256を並べます。「解除」を押すと、また置けるようになります。
通報
部屋にいる人が、Axeから運営する人に知らせた画像や音声、部屋を並べます。メニューの「通報」の横に、まだ対応していない通報の数が出ます。未対応の通報があるときは、「概要」の上の注意にも出ます。
| 列 | 中身 |
|---|---|
| 時刻 | 通報した時刻 |
| 状態 | 未対応・対応済み・却下 |
| 対象 | 画像か音声、または部屋 |
| 部屋 | 通報された部屋の名前 |
| 理由 | 通報した人が書いた理由 |
| 通報した人のDiscord ID | ログインして入っていたときの、通報した人のDiscordのアカウントID |
| 通報した人のIPアドレス | 通報したときの送信元のIPアドレス |
| この人の通報 | 同じ人(Discordのアカウント、見学ならIPアドレス)の通報の数 |
「詳しく」を押すと、部屋の鍵、画像か音声のSHA-256、通報した人の役割とユーザーID、対応した時刻と対応した人も出します。そこから、次のことができます。
- 対応済みにする・却下する・未対応に戻す:通報の状態を変えます。だれがいつ変えたかが残ります。
- 画像か音声を詳しく見る:その画像か音声を、「アップロード」の「詳しく」と同じ画面で開きます。消すことも、二度と置かせないこともできます。中身を見るのは、「中身を見る」を押したときだけです。
- 部屋の中を見る:その部屋の「中を見る」を開きます。
- Discord BAN・IP BAN:通報した人をBANする用意をします。虚偽の通報をくり返す人に使います。
通報は、通報した人と一緒に90日・1000件まで残します。Discordで知らせを受けるを入れていれば、通報があったときにも知らせます。Axeから通報できるのは、通報に対応したAxeだけです。
記録
部屋のサーバーで起きたことのうち、費用につながるものと、運営する人の操作を残します。7日以内のものを、新しいものから2000件まで残します。運営する人の操作(下の表の「管理」のうち、断られた試みのほか)は、別に90日・1000件まで残します。ログインや画像の置き場所が大量に記録されても、だれが何を見たか・消したかが押し出されないようにするためです。
| 出来事 | 残すとき | 絞り込んだときの列(時刻のほか) |
|---|---|---|
| ログイン | Discordでログインした | 名前、Discord ID、IPアドレス |
| 部屋を作った | 部屋を作った | 名前、Discord ID、IPアドレス、部屋、部屋の鍵 |
| 画像と音声を置いた | 部屋に新しく画像か音声を置いた(置いてあるものと同じなら残さない) | 名前、Discord ID、IPアドレス、部屋、部屋の鍵、形式、大きさ、SHA-256 |
| 回数の制限 | 送信元が、回数の上限を超えた(送信元と上限ごとに1分に1回) | IPアドレス、上限(超えた上限) |
| BANで断った | BANした送信元かアカウントを断った(それぞれ1分に1回) | 名前、Discord ID、IPアドレス、BANの種類、BANの対象(当たったBAN) |
| 管理 | 運営する人がログインした、BANした・解いた、部屋を削除した、画像と音声を見た・消した・二度と置かせないようにした・解除した、緊急停止した・再開した、回数の上限を締めた・元に戻した、通報の状態を変えた、アカウントを削除した、パスキーを登録した・消した、すべての人をログアウトさせた。管理画面に入ろうとして断られた | 操作(したこと)、名前、Discord ID、IPアドレス、部屋、部屋の鍵、対象の種類、対象 |
どれにも、時刻と送信元のIPアドレスが付きます。「すべて」では、時刻、出来事、名前、Discord ID、IPアドレス、部屋を出します。種類で絞り込むと、その種類だけにある列が増えます(上の表)。IPアドレス・Discordのアカウント・名前・部屋でも絞り込めます。「CSVで保存」で、絞り込んだ記録をCSVのファイルにします。「回数の制限」がくり返し出る送信元は、部屋のサーバーを呼び続けているかもしれません。
BAN
BANの一覧と、BANするための欄があります。一覧には、BANが終わるまでの残りの時間も出ます。
- 作った部屋:そのBANの対象が作った、いまある部屋を開きます。
- 変更:対象と理由を欄に入れます。期間や理由を選び直して「BANする」を押すと、いまのBANと置き換わり、期間は押したときから数え直します。
- 解除:BANを解きます。
- CSVで保存:BANの一覧をCSVのファイルにします。
CSVのファイルは、表計算ソフトで開けるようUTF-8(BOM付き)で書きます。部屋の名前などは参加者が決められるので、=などで始まるものは、数式として動かないよう頭に'を付けます。
アカウント
DiscordのユーザーIDで、部屋のサーバーのアカウントを調べ、削除します。参加する人から、アカウントを消してほしいと頼まれたときに使います。「概要」の「目立つアカウント」の行にある「アカウント」からも開けます。
- 出るのは、表示名、DiscordのユーザーID、部屋のサーバーが決めたユーザーIDです。
- アカウントを削除:本人が消すときと同じく、アカウントの情報とすべてのトークンが消えます(→ 本人がアカウントを消すとき)。戻せません。
- 削除しても、いま部屋に入っている席は、アクセストークンが切れるまで(長くて16分ほど)残ります。すぐに部屋から外すときは、Discord BANもします。
- 削除した人がまたDiscordでログインすると、新しいアカウントが作られます。ログインさせたくないときは、BANします。
安全
- 緊急停止:すべての人について、部屋を作ること、画像と音声を置くこと、新しくログインすることを止めます(→ 緊急停止)。
- 回数の上限を締める:回数の上限を、一時的に1/2・1/4・1/10に厳しくします(→ 回数の上限を締める)。
- パスキー:自分のパスキーの一覧です。「この端末のパスキーを追加」で、いま使っている端末のパスキーを足します。使わなくなった端末のパスキーは「削除」で消します。最後の1つは消せません。
- すべての人をログアウトさせる:すべての運営する人の、管理画面へのログインを切ります(自分も)。だれかにログインを盗まれたかもしれないときに使います。
設定
部屋のサーバーにいま入っている設定を、読むだけの表で出します。出すのは、ACCESS_CONTROL_ALLOW_ORIGIN、ROOM_RETENTION_HOURS、ADMIN_DISCORD_IDS、ADMIN_PASSKEY_RESETの値と、ログイン(Discord)とADMIN_WEBHOOK_URLが入っているかどうかです。秘密の値(DISCORD_CLIENT_SECRET、SESSION_SECRET、WebhookのURL)は出しません。変えるときは、それぞれの置き場所で変えます(→ 部屋のサーバーの設定項目)。ADMIN_PASSKEY_RESETが入ったままだと赤い字で知らせるので、パスキーを登録し直したら外してください(→ 端末を失くしたとき)。
BANする
「部屋」の行や「入っている人」、「記録」の行にある「Discord BAN」「IP BAN」を押すと、「BAN」のタブに移り、対象が入ります。期間と理由を確かめて、「BANする」を押すと、BANします。「この対象が作った部屋も削除する」に印を付けると、BANしたあとに、その対象が作った部屋もまとめて削除します(いくつ消えるかを先に尋ねます)。費用をかさませる使われかたの後片づけに使います。「BAN」のタブで、対象を手で書くこともできます。
| 欄 | 中身 |
|---|---|
| 種類 | 「IPアドレス」か「Discord ID」 |
| 対象 | 下の表の形で書きます |
| 期間 | 1時間、1日、7日、30日、解除するまで。過ぎると、ひとりでに解けます |
| 理由 | 自分のための控えです。BANされた人には見せません。200文字まで |
IPアドレスは、次のように書けます。
| 書いたもの | BANする範囲 |
|---|---|
203.0.113.5 | そのアドレスだけ(203.0.113.5/32) |
203.0.113.0/24 | 203.0.113.0〜203.0.113.255 |
2001:db8:1:2::5 | 先頭の/64(2001:db8:1:2::/64) |
2001:db8::/48 | 先頭の48ビットが同じアドレス |
- IPv6のアドレスは、/を付けなければ先頭の/64をまとめてBANします。IPv6の利用者は/64を丸ごと持っていることが多く、アドレスを替えるだけで逃れられないようにするためです。1つのアドレスだけにするときは
/128を付けます。 - 範囲は、IPv4は/8まで、IPv6は/16までです。それより広い範囲は受け付けません。
- 学校や携帯電話の回線などでは、多くの人が1つのIPアドレスを分け合っています。関係の無い人まで止めることがあるので、IPアドレスのBANには、まず短い期間を選んでください。
Discordのアカウントは、DiscordのユーザーID(数字だけの17〜20桁ほど)で書きます。管理画面の「Discord ID」の列に出るものです。
BANで止まるもの
BANは、押したときから、すべてのインスタンス(Cloudflare版のデータセンター、Vercel版のインスタンス)で、部屋に入る、部屋を作る、画像と音声を置く、ログイン、トークンの更新を止めます。そのほかのリクエストには、30秒ほど遅れて効くことがあります(→ BANで止まらないもの)。BANしたときに部屋に入っている人のうち、BANに当たる人の接続は、その場で切ります。部屋に入るときも、そのたびにBANを確かめるので、つなぎ直しても入れません。すでに出したアクセストークンが、まだ切れていなくても同じです。
| BANの種類 | 止まるもの |
|---|---|
| IPアドレス | 部屋の一覧、部屋を作る・入る・削除する、部屋のアセット、ログイン、トークンの発行と更新、アカウント。どれも403 bannedを返します(部屋に入るのはbannedで切ることもあります)。ログインはAxeにlogin_error=bannedで戻します |
| Discord ID | ログイン(Axeにlogin_error=bannedで戻す)、トークンの更新(Axeはログアウトします)、部屋に入る(bannedで切る)、部屋を作る、部屋のアセットの読み書き(403 banned) |
ADMIN_CONTACT_URLを入れておくと、Axeは断ったことを出すときに、その問い合わせ先も出します(→ ADMIN_CONTACT_URL)。緊急停止で断ったときも同じです。
Discordのアカウントだけを止めた人は、ログインせずに見学として部屋に入ることはできます。見学者も止めたいときは、IPアドレスもBANしてください。
BANを解くか、期間が過ぎると、もとどおり使えるようになります。BANしてもアカウントは消さないので、解けばログインしたままの状態に戻ります。
BANで止まらないもの
- 呼ばれる回数そのもの:BANを確かめるのは、部屋のサーバーが呼ばれたあとです。BANした送信元から呼ばれ続けると、呼ばれた分の費用はかかります。大量に呼ばれるときは、部屋のサーバーより手前で止めてください(→ サーバーを呼ぶ回数そのもの)。ただし、BANを置き場所から読み直すのは、正しいトークンやログインがあり、送信元ごとの回数の上限の内にあるリクエストだけです。BANした送信元やでたらめなリクエストに大量に呼ばれても、BANを読み直す分の費用は増えません。
- ほかのインスタンスで、費用につながらないリクエスト:部屋の一覧、部屋のアセット(画像と音声)を読む・消す、部屋を削除する、アカウントを見る・消す、ログインを始める、は、各インスタンスが30秒ごとに読み直したBANで確かめます。数が多く、通しても費用につながらないためです。そのため、BANしたのとは別のインスタンスでは、最大30秒、これらが通ります。
- アドレスやアカウントを替えること:別の回線やVPNに替えたり、Discordのアカウントを作り直したりすれば、BANを逃れられます。IPアドレスは範囲でBANできます。
- SkyWay版のトークン発行:BANは部屋のサーバーにだけ効きます。
緊急停止
コストアタックや荒らしが続き、BANでは追いつかないときに、すべての人について次のことを止めます。「安全」の「緊急停止」で止めるものに印を付け、「チェックしたものだけを止める」を押します。押したときから、すべてのインスタンスで止まります。
| 止めるもの | 止めているあいだ |
|---|---|
| 部屋を作る | 部屋を作ろうとすると、503 pausedを返します。Axeは、運営者が部屋を作ることを止めていると出します |
| 画像と音声を置く | 置こうとすると、503 pausedを返します。置いてあるものと同じなら、これまでどおり置いてあると答えます。Axeでの見えかたは、下の止めているあいだのAxeにあります |
| 新しくログインする | Discordでログインすると、Axeの戻り先にlogin_error=pausedを付けて戻します。Axeは、運営者が新しいログインを止めていると出します |
- いま部屋で遊んでいる人と、ログインしたままの人は、そのまま使えます。部屋に入ること、トークンの更新、画像と音声を読むことと、部屋のGMが消すことは止めません。
- 管理画面へのログインは止めません。
- 止めているかどうかを置き場所から読むのは、BANと同じく、正しいトークンやログインがあり、回数の上限の内にあるリクエストだけです。止めているあいだに大量に呼ばれても、その分の費用は増えません。
- 原因が片づいたら、「すべて再開する」を押します。止めたことと再開したことは、記録に残ります。
止めているあいだのAxe
画像と音声を置くことを止めているあいだ、対応したAxeでは次のようになります。
- GMとPLが足した画像と音声は、足した人の画面にだけ出て、ほかの参加者には届きません。足した人には、運営者が止めていることが知らされます。
- 再開すると、1分ほどのうちに部屋のサーバーへ上がり、ほかの参加者にも届きます。足した人には、上げられるようになったことが知らされます。上がる前に部屋を出ると、その画像と音声はほかの参加者に届きません(出るときに尋ねます)。
- 見学で入っている人は、もともと部屋のサーバーに画像と音声を置かないので、見学の人が足したものは、止めていても部屋の接続でほかの参加者に届きます。
それより前のAxeは、置けなかった画像と音声を、1分ほど試し直したあとに部屋の接続でほかの参加者に配ります。費用のかかる置き場所には置かれませんが、足した人からは普通に置けたように見えます。
回数の上限を締める
緊急停止するほどではないが、回数の上限を超える送信元が多いときに、上限を一時的に厳しくします。「安全」の「回数の上限を締める」で、上限ごとに「ふつう」「1/2」「1/4」「1/10」を選び、「この設定で締める」を押します。
| 上限 | ふつう |
|---|---|
| 画像と音声を置く | 1分に100回 |
| 読み出し | 1分に600回 |
| 部屋を作る・入る | 1分に30回 |
| ログイン | 1分に60回 |
- 1つの送信元(IPv6は/64ごと)が1分にできる回数が、選んだ分だけ減ります。1/2なら、画像と音声は1分に50回までです。
- 押したインスタンスではすぐに、ほかのインスタンスには30秒ほどで行き渡ります。緊急停止と違い、締めているかどうかは各インスタンスが持つ写しで確かめるので、締めても置き場所を読む回数は増えません。
- 締めているあいだは、どの画面でも、いちばん上に「締めています」と、締めている上限が出ます。
- 落ち着いたら「すべて元に戻す」を押します。締めたことと戻したことは、記録に残ります。
Discordで知らせを受ける
部屋のサーバーにADMIN_WEBHOOK_URLを入れると、気にかけたほうがよい動きがあったときに、DiscordのWebhookへ知らせを送ります。管理画面を開いていなくても、コストアタックなどに気づけます。
| 知らせ | 送るとき |
|---|---|
| 回数の上限 | 回数の上限を超えた送信元があった |
| BANした相手 | BANした送信元かアカウントが、また来た |
| 管理画面で断った | 管理画面に入ろうとして、断られた人がいた |
| 管理画面へのログイン | 運営する人が管理画面にログインした |
| 通報 | 部屋にいる人から通報があった |
| 置き場所の使用量 | 画像と音声の置き場所が、ADMIN_STORAGE_ALERT_GBの量を超えていた(1日1回数える) |
- 同じ知らせは、すべてのインスタンスを合わせて10分に1回までです(管理画面へのログインは、毎回送ります。置き場所の使用量は、1日に1回までです)。くわしくは管理画面で確かめます。
- 置き場所は、
ADMIN_STORAGE_ALERT_GBを入れたときだけ、1日1回、日本時間の3時ごろに数えます。Cloudflare版はwrangler.jsoncに書いた定期実行(Cron Trigger)が、Vercel版は1日1回の見回り(Vercel Cron)が数えます。数えるときは置き場所の一覧を読むので、Cloudflare版ではR2の一覧を読む回数を、Vercel版ではRedisのコマンドを少し使います。 - 知らせには、何があったかだけを書きます。IPアドレスや参加者のDiscordのアカウントは送りません。管理画面へのログインの知らせにだけ、ログインした運営する人の表示名を書きます。心当たりの無いログインがあったら、すぐにログインを盗まれたかもしれないときのとおりにしてください。
- Webhookは、Discordのチャンネルの設定の「連携サービス」→「ウェブフック」で作り、URLをコピーします(
https://discord.com/api/webhooks/…)。 - 入れかたは
ADMIN_DISCORD_IDSと同じです(→ 使えるようにする)。https://で始まらないと、設定の誤りとして500 config-invalidを返します。 - WebhookのURLを知っている人は、そのチャンネルに書き込めます。漏れたかもしれないときは、Discordでそのウェブフックを消して作り直してください。
残るもの
管理画面のために、部屋のサーバーは次のものを置きます。
| もの | 中身 | 消えるとき |
|---|---|---|
| 記録 | 上の記録の表のもの。IPアドレス、Discordのアカウントと表示名 | 7日たったとき。2000件を超えたとき(運営する人の操作は90日・1000件) |
| 部屋を作った人 | DiscordのアカウントとIPアドレス | 部屋が消えるとき |
| 入っている人 | IPアドレスとDiscordのアカウント | 部屋から抜けたとき |
| BAN | 対象、理由、BANした時刻、終わる時刻 | 解いたとき。期間が過ぎたとき |
| パスキー | 運営する人のパスキーの公開鍵、名前、登録した時刻と使った時刻 | 消したとき |
| 緊急停止 | 止めているものと、止めた時刻 | 再開したとき |
| 二度と置かせないもの | 画像と音声のSHA-256 | 解除したとき |
| 通報 | 対象、理由、通報した人のIPアドレス・Discordのアカウント・役割、対応した人 | 90日たったとき。1000件を超えたとき |
置き場所は、Cloudflare版はDurable Objects、Vercel版はRedisです。ただし、二度と置かせないものは、画像と音声と同じ置き場所(Cloudflare版はR2、Vercel版はVercel Blob)に、blocked/<SHA-256>という名前の空のファイルとして置きます。ADMIN_DISCORD_IDSを入れていなくても、記録と部屋を作った人は置きます。公開して運営するときは、プライバシーポリシーにも書いてください(→ プライバシーポリシーのひな形)。
ログインを盗まれたかもしれないとき
心当たりの無いログインの知らせが届いたときなどは、次のとおりにします。
- 管理画面の「安全」で「すべての人をログアウトさせる」を押します。すべての運営する人のログインが、その場で切れます。
- Discordのパスワードを替え、2段階認証が有効なままかを確かめます。
- 「安全」で、知らないパスキーがあれば消します。
- 運営する人から外す人がいれば、
ADMIN_DISCORD_IDSからそのIDを消します。消した人のログインは、次に何かするときに切れます。
端末を失くしたとき
ほかの端末のパスキーがあれば、その端末で入り、「安全」で失くした端末のパスキーを消します。
すべての端末のパスキーを失くしたときは、ADMIN_PASSKEY_RESETに自分のDiscordのユーザーIDを入れます(入れかたはADMIN_DISCORD_IDSと同じ)。Discordでログインすると、新しいパスキーを登録できます。登録したら、失くした端末のパスキーを消し、ADMIN_PASSKEY_RESETを外してください。入れたままにすると、Discordのアカウントだけでパスキーを足せてしまいます。