Ankiの教材と学習状態を引き継ぎ、スマホ・PCからFSRSで復習するWebアプリです。Dopanki内で教材を作成・編集でき、AIから同じ教材管理APIも利用できます。オンライン利用を前提とします。回答のたびにマスコットと膨らみ続ける数字「ドパ」が盛り上げる演出があります。高品質AI音声の生成は含みません。
Node.js 24以降、Python 3.10〜3.13、uvを使います。
npm ci
npm run db:migrate
npm run devPCでは http://localhost:8787 を開きます。「教材管理」から学習日を設定し、デッキとノートタイプを作成すると、Ankiファイルなしでも始められます。Ankiから移行する場合は、初期設定の前にnpm run import:anki -- /path/to/deck.apkgを実行してください。今回提供された韓国語デッキは、すでにこの作業環境のローカルDBへ取り込み済みです。Ankiの元ファイルは変更しません。
通常の開発サーバーとViteは127.0.0.1だけで待ち受けます。スマホから使う場合は、.dev.varsにパスワードを設定し、専用のLAN起動コマンドを使います。同じWi-FiからWranglerが表示するLANアドレスを開いてください。
printf 'APP_PASSWORD="%s"\n' "$(openssl rand -hex 24)" > .dev.vars
npm run dev:lanログインには.dev.varsに保存したパスワードを使います。dev:lanはパスワード未設定なら起動を停止します。端末の韓国語音声が未導入の場合は、端末の音声設定から追加してください。
フロントエンド編集中は別ターミナルでnpm run dev:webを使えます。ViteからAPIをlocalhost:8787へ転送します。
Ankiから「スケジュール情報」「デッキのプリセット」「メディア」を含めて.apkgまたは.colpkgを書き出します。PCのCLIで変換し、D1へ登録します。ブラウザへのAPKGアップロードは未対応です。
npm run import:anki -- /path/to/deck.apkg --timezone Asia/Tokyo --day-start 4--day-startはAnkiで設定していた日付切り替わりの時刻です。APKGに含まれない場合は午前4時を使用し、画面に確認事項を表示します。タイムゾーンの既定値はAsia/Tokyoです。
- 現行のZIP+Zstandard+protobuf形式と、旧形式のSQLite+JSONに対応します。
- 元のノート・カードID、フィールド、テンプレート、CSS、画像・音声、回答履歴、FSRSパラメータと記憶状態、復習予定を保存します。
- 学習中・再学習中のステップ、停止・一時埋め込み状態を引き継ぎます。一時埋め込みは取り込み後の次の学習日に解除します。
- 初回取り込みで復習予定を再計算しません。次の回答からDopankiのFSRSで更新します。
- 学習済みカードにFSRS記憶状態がない場合は、正の間隔・easeがあればSM-2から推定し、警告します。推定できない状態は取り込みを停止します。
- 同じDBへの再取り込みは停止します。継続中の学習状態を上書きしません。取り込み失敗時は教材を公開せず、同じ操作の再実行で未完了分を読み直せます。取り込みコマンドは同時に実行しないでください。
変換結果は.local/import/collection.json、メディアは.local/import/media/です。.local、.wrangler、.dev.varsはGitに含みません。
上部の「教材管理」からノート・ノートタイプ・デッキ・APIトークンを管理します。
- ノートタイプごとに名前付きフィールド、必須/任意、表裏のHTMLテンプレート、CSSを定義します。入力回答は
{{type:項目名}}、読み上げは{{tts ko_KR:項目名}}で指定できます。 - 韓国語のノートタイプでは「品詞・活用欄を追加」で任意の「品詞」「変格活用」「活用例」を追加できます。裏面に分類のラベルと活用例を表示し、空欄は表示しません。既存のラベル付きタイプにも不足分だけ追加できます。保存後、各ノートの「活用例」に
듣다 + -어요 → 들어요などを複数行で記入してください。規則活用にも使え、自動入力やカードの追加は行いません。Anki由来のHTMLノートでは改行に<br>を使います。 - 1件のノートからテンプレートごとにカードを生成します。作成・編集画面にはカードのプレビューがあります。新規入力はプレーンテキストと改行を基本とし、Anki由来のHTMLは保持します。
- 内容・表示・フィールド順序や名前を編集しても、既存カードの復習予定・記憶状態・回答履歴は保持します。追加テンプレートのカードだけを未学習として生成します。
- 学習画面の「ノートを編集」で、いまのカードの内容・タグを直して同じカードの学習に戻れます。未保存の変更は破棄の確認があり、保存失敗時は入力を保持して再試行できます。「出題停止」は同じノートの全カード(他デッキを含む)を停止し、回答・ドパを加算せず次へ進みます。再開は「教材管理」から行います。
- 教材は内容・タグ・デッキ・ノートタイプで検索できます。デッキ移動や出題停止・再開は同じノートの全カードへ適用します。内容の編集履歴を確認できます。
- デッキの親や名前を変更すると、配下のデッキ名も追従します。学習上限はデッキごとに設定できます。
- 使用中のフィールド・テンプレートは削除できません。通常形式のノートタイプの作成・編集に対応し、穴埋め形式の新規生成、教材削除、新規メディアアップロード、Anki同期は対象外です。
AI用APIトークンは「APIトークン」で発行・失効できます。鍵の全文は一度だけ表示し、サーバーにはハッシュだけを保存します。教材の読み取り・編集と、ノートタイプの編集の権限を分けます。APIトークンは学習操作やバックアップ取得、トークン管理には使えません。
教材管理API仕様に認証・再送・競合・一括操作と入力例を記載しています。
- 表裏・逆方向・穴埋め、条件付きフィールド、
FrontSide、入力回答、ふりがな、添付音声に対応します。 {{tts ko_KR:KR}}などと[anki:tts]の読み上げ対象・言語・速度を解釈し、ブラウザの端末音声で再生します。AwesomeTTSの声や生成モデルを再現する機能ではありません。- Again / Hard / Good / Easyの4段階で評価します。Space・Enterで答え表示、1〜4で評価できます。
- 回答はサーバーでFSRS計算して保存します。再送は同じ回答IDで行い、二重記録を防ぎます。別画面との競合は409として検出し、読み直します。
- 直前の回答を取り消せます。同じカードがその後に更新された場合は取り消せません。履歴は削除せず取り消し済みとして保存します。
- デッキを親・子・孫のツリーで表示します。配下の開閉状態は次回も保持します。親デッキから配下をまとめて復習でき、カードのFSRS計算には所属する子デッキの設定を使います。
- 件数と今日の回答数は配下を含めて集計し、日次上限には移行した当日の履歴も含めます。親から学習する場合は親と各子の上限を適用し、子だけを選んだ場合は上の親の上限を適用しません。Ankiの出題順と一部の日次上限オプションの完全再現は未対応です。
- 通常学習は初期設定で10枚ずつの集中モードです。同じカードの再出題は枚数を増やさず、その組の当日分の学習・再学習ステップを終えるとリザルトを表示します。「次の10枚へ」で次の組に進み、最後の組は10枚未満でも表示します。画面の「連続モードへ」で切り替えられます。
- リザルトには当日分を完了した枚数、最初の回答で思い出せた枚数、失敗後に覚え直した枚数、回答回数を表示します。記憶の定着を保証する値ではなく、自己申告とその日の学習ステップに基づく集計です。停止・移動・ほかの画面で完了したカードは別に表示します。
- 集中モードの組と進捗は同じタブでの再読み込み・休憩後の再開に対応します。組の情報はタブ内に保存するため、別の端末・新しいタブでは新しい組を作ります。カードの学習履歴と復習予定は従来どおりサーバーに保存します。学習日が切り替わると組も作り直します。
- 時刻が来た学習カードを優先し、ほかに出せるカードがない場合は当日中の学習・再学習カードを最大20分先取りします。集中モードでは現在の組の中で判定します。翌日以降の通常復習と、日をまたぐ学習ステップは前倒ししません。再学習待ちのカードも学習枚数に含め、待機画面で予定を表示して自動で再取得します。
- 上部の「バックアップ」で教材・元履歴・現在状態・Dopanki回答履歴をJSONで保存できます。これはAnkiへの書き戻し用APKGではありません。復元ツールはまだありません。
デッキの「学習量を調整」から、今日だけ新規・復習カードを追加できます。新規と復習の枚数は別々に指定します。普段のデッキ設定は変更せず、追加枠はコレクションの学習日が切り替わると失効します。親デッキの追加分は配下で共有し、子を直接選んだ場合も元の通常枠は減りません。追加分も通常のFSRS復習として記録し、回答の取り消しで枠を戻します。「もう一度」などによる学習・再学習の回答は追加枚数に含めません。
長く休んで復習が溜まったときは、同じ画面から再開モードを開始します。
- 対象は選んだデッキと配下です。開始時に期限が来ている復習カードを滞留分として保存します。
- 1日の復習目標と、滞留分に取り組む枚数を指定します。期限が来た学習・再学習と、新たに期限が来た通常復習を優先し、その後で滞留分を出題します。
- 滞留分はFSRSの推定想起確率が高い順に出題します。再開中の新規枚数は別に指定します。初期値は1日5枚で、0枚なら自動出題を休止します。期限が来た学習・再学習の後、新規を先に出題するため、滞留復習が多くても新しい範囲を進められます。
- 再開中の新規枚数は、配分を作り直さず変更できます。既存の再開計画は新規0枚で移行します。新規から生じる将来の復習は、現在のカードだけを対象とする配分のプレビューには含みません。
- 余裕のある日は新規・復習を追加できます。日別配分で先の日に割り当てた滞留分も、元のFSRS期限が来ているカードに限って追加で取り組めます。まだ期限が来ていないカードは先取りしません。
- 設定と進捗はサーバーに保存し、別の端末でも続けられます。一時停止中は通常学習に戻り、再開すると保存したプランを使います。中止しても、実際に回答した学習結果は保持します。
- 滞留分を処理し終えたら「再開モードを終了」で通常学習と新規カードを再開できます。
- 任意の「日別に配分」で、滞留分と将来の復習の集中を日々に割り当てます。適用前に日別枚数と延期幅を確認できます。プレビュー後にカードや設定が変わった場合は、再確認が必要です。
- 日別配分はFSRS HelperのFlattenを参考にした出題計画です。FSRSの記憶状態・最終回答日時・元の復習期限は書き換えず、計画上の出題日を別に保存します。未回答のカードを学習済みにはしません。延期すると実際の記憶保持率が下がる可能性があり、日別枚数は将来の回答・再学習によって変わります。
- 停止中・一時埋め込み中のカードや学習・再学習カードは日別配分の対象外です。実際に回答したカードの次回予定は、通常どおりFSRSで決めます。
- 再送は同じ操作IDで処理し、追加枠やプランを二重に作りません。設定・配分・進捗はJSONバックアップにも含みます。
既存環境では起動前にnpm run db:migrateを実行してください。学習記録の「明日までの復習予定」は元のFSRS期限を集計するため、プランで先の日に割り当てた期限切れカードも含みます。
ホームの「カスタム学習」→「範囲を作る」で、名前・対象デッキを指定します。出題順はランダムです。複数デッキを選べ、親デッキの配下も含まれます。名前を空欄にすると、選択したデッキのうち一覧で一番上のデッキ名を使います。名前欄の入力例も選択に合わせて更新します。重複する範囲を選んでも同じカードは対象に重複登録されません。
- 復習時刻・日次上限に関係なく、未学習も含めて練習できます。停止中・一時埋め込み中のカードは対象外です。
- 新しい範囲と次の周は毎回シャッフルします。対象は周の開始時に確定し、途中で追加したカードは次の「全範囲をもう1周」から含めます。教材の編集は反映し、途中で停止したカードは出題しません。
- 「もう一度」(Again)は他のカードへの回答を3枚程度、「難しい」(Hard)は5枚程度挟んで、同じ周に再出題します。「普通」(Good)/「簡単」(Easy)でそのカードはその周を完了します。出題できる他のカードがなければ待たずに再出題します。進捗は回答回数ではなく、完了したカード数です。
- 「忘れたカードは短い間隔で再出題し、思い出せたカードはその周から外す」という、FSRSに着想を得た短期反復です。FSRSそのものではなく、記憶状態の推定・長期の復習予定・時間待ちは扱いません。
- 完了後は「全範囲をもう1周」または、この周で一度でも「もう一度」と評価したカードだけを追加で練習できます。最終評価が「普通」「簡単」でも対象に含みます。取り消した評価は含みません。評価は自己申告です。
- 更新前の進行中セッションは消しません。既回答は旧仕様どおり完了として保持し、途中のデッキ順も維持します。以後の回答には自動反復を適用し、次の周からシャッフルします。APIの旧
order: 'deck'入力も引き続き受け付け、新規作成時はshuffleに正規化します。 - 範囲・進捗・回答履歴はサーバーに保存します。ホームから再開でき、再読み込み後も続きから取り組めます。直前の1回答を取り消せます。続けて過去の回答を取り消すことはできません。新しい周を始めると前の周の回答は取り消せません。同じタブで他の範囲に回答した後は、その前の回答の取り消しボタンは無効になります。
- 通常学習のFSRS記憶状態・復習予定・回答履歴・日次上限は変えません。練習の回答は学習カレンダーに含み、今日の通常/練習の内訳を表示します。「明日の自分へ」の予定比較には含めません。
- カード表示・入力回答・音声・ドパ・勲章は通常学習と共通です。回答の保存失敗や競合では報酬を加算しません。練習の設定・進捗・履歴はJSONバックアップにも含みます。
既存環境では起動前にnpm run db:migrateを実行して、カスタム学習用のテーブルを追加してください。保存済み範囲の「削除」から設定と進捗を削除できます。元のデッキ・カード・練習履歴は残ります。削除済み範囲は再開や回答・取り消しができません。タグやAnki検索式による絞り込み、設定の編集は未対応です。
トップページは学習を始めるための画面です。上から順に、次の3つを置いています。
- 「今日の残り」: 新規・学習・復習の合計と内訳、回答済みの数。前回のデッキがあれば、その横(スマホでは下)の「続きから」の「学習する」ですぐ再開できます。
- 「学習の記録」: 累計・今週の学習日、今日の回答数、明日までの復習予定を1行で表示します。押すと学習カレンダーと「明日の自分へ」を開きます。開閉はこの端末に保存されます。
- デッキ一覧: デッキ名の検索(
/キーで移動)と、親・子デッキの開閉があります。デッキ名を押すとそのデッキの学習を始めます。
右上の「このセッションの勲章」から勲章の一覧を開けます。音・教材管理・バックアップ・ログアウトは上部のバーにあります。
学習画面では、カードの上にハムスターの「ドパハム」がいます。思い出す間と評価を選ぶ間は何も動きません。評価の保存が確認できると、そのカードにスタンプが押されます。続けて額が飛び出し、コインがドパのカウンターへ飛び込み、紙吹雪と画面全体の放射が回ります。そのあと「N枚目」のリボンが横切り、次のカードが静かに表示されます。
- 回答が保存されるたびに「ドパ」が増えます。額はこのタブで何回目の回答かだけで決まり、もう一度・難しい・普通・簡単のどれを選んでも同じです。序盤ほど桁が早く上がり(100→10万→174万…)、長く続けると京・垓を超えて無量大数まで伸びます。正答率・速さ・連続正解は数えず、もう一度を押しても途切れません。
- 回答を重ねるほど場面が育ちます。旗が付き、背景に放射が入り、仲間のハムスターが増えます。多くなるとFEVER表示になり、リボンや紙吹雪も増えます。合計が万→億→兆のように新しい単位へ上がると、大きく「突破!」を表示します。どれも回答数で決まり、評価では変わりません。
- ドパは演出用の遊びの点数で、記憶の強さを表しません。ブラウザのタブ内(sessionStorage)だけに保存し、サーバー・FSRS・バックアップには含めません。タブを閉じると新しく始まります。
- 保存に失敗した回答や409の競合では増えません。同じ回答IDでの再送は1回分だけ数えます。取り消すと直前の1回分を正確に戻し、再読み込み後の取り消しでも戻ります。
- 演出は通常1〜2秒です。Space・Enter・カードのクリック・「次へ」ですぐ飛ばせます。演出の表示は操作を妨げません。20回ごとに区切りを表示し、続けるか休憩するかを選べます。追加のカードは出題しません。最後のカードの後は「完了!」として長めに祝います。完了済みのデッキを開いただけでは祝いません。
- 評価は自己申告として扱います。「もう一度」は思い出せなかった、「難しい・普通・簡単」は思い出せたという意味です。自動採点はしません。ドパの額・コイン・演出の長さは同じで、見せ方だけを変えます。
- 思い出せた: ピンクの「◎ 思い出せた」スタンプ、暖色の紙吹雪、喜ぶドパハム、「N連続」の表示
- もう一度: 青い「また 会おう」スタンプ、寒色の紙吹雪、汗をかいたドパハムが「正直でえらい!」と声をかける。叱る表現はありません。
- 「思い出せた」が2回以上続くと、ステージに「連続想起 N」を表示します。「もう一度」で0に戻ります。
- 入力回答カードは、答えを表示すると入力と正解を文字ごとに比較します。余分・違う文字には取り消し線、足りない・正しい文字には下線を付け、一致時は正解を一度だけ表示します。未入力時はカードの正解欄をそのまま表示します。入力回答カードでは上部に同じ答えを重ねて表示しません。入力回答のないカードでは読み上げ対象を従来どおり強調表示します。言語はカードの読み上げ設定から決め、カード本体は白いiframeに表示します。
- 上部の「音」で、効果音と答え表示時の自動読み上げをまとめてオン・オフできます。設定はこの端末に保存されます。オフでも「▶ 読み上げる」と添付音声の再生ボタンは使えます。効果音はWebAudioで合成しており、音声ファイルや外部APIは使いません。音は操作の後にだけ鳴り、起動時には鳴りません。
- 端末の「視差効果を減らす」設定(prefers-reduced-motion)では花火とアニメーションを止め、待ち時間なしで次のカードを表示します。画面を移動したりログアウトしたりすると、読み上げ・効果音・花火を止めます。
トップページの「学習の記録」を開くと、「学習カレンダー」に直近26週間を表示します。1回答でもその日に色がつき、1〜4回・5〜19回・20〜49回・50回以上で濃くなります。どの評価でも同じ1回答として数えます。日を選ぶと回答数を確認でき、矢印キーでも移動できます。累計の学習日数と今週(月曜から)の学習日数も表示します。休んでも過去の記録は残ります。
- サーバーに保存された回答履歴と、取り込んだAnkiの有効な学習履歴を集計します。端末やタブをまたいでも同じ記録が見られます。取り消した回答は含めず、再送は二重に数えません。
- 日付はコレクションのタイムゾーンと学習日の切り替わり時刻で決めます。既定の午前4時なら、午前3時の回答は前日の学習です。
- トップと学習完了画面の「明日の自分へ」では、今日Dopankiで取り組んだカードの最初の回答前と最後の回答後の予定を比較します。同じカードに何度回答しても1枚として数え、明後日以降に進んだ枚数と、明日への持ち越しの増減を表示します。新規学習によって明日までの復習が増えた場合も表示します。
- 「明日までに復習予定」は今日の未完了分を含む全デッキの枚数で、日次上限をかける前の件数です。停止中のカードは含みません。今後の回答で予定は変わるため、将来の回答回数や所要時間の保証ではありません。Ankiから取り込んだ履歴には回答前の状態がないため、持ち越しの比較には含めません。
- 集計の読み込みに失敗しても学習は続けられ、記録の再読み込みを試せます。カレンダーや持ち越しの表示はFSRSの予定やドパ・勲章の報酬には影響しません。
既存環境ではnpm run db:migrateで学習記録の集計用テーブルと索引を追加してください。元の回答履歴は変更しません。初回とタイムゾーン・日境界の変更後は過去の集計を作り直すため、読み込みに時間がかかる場合があります。非常に長い履歴では「再読み込み」で集計を続けられます。集計用データはバックアップから省き、元履歴から再構築できます。
学習中の行動に応じて、このタブのセッション内で勲章がもらえます。判定はweb/medals.tsのMEDAL_RULESで行います。名前と絵柄はweb/medal-art.tsにあります。
| 勲章 | 条件 |
|---|---|
| 開幕の一枚(銅) | このセッションで最初の回答を記録する |
| 正直者(銅) | 「もう一度」を正直に1回選ぶ |
| 正直名人(銀) | 「もう一度」を正直に3回選ぶ |
| 三連想起(銅)・五連想起(銀)・十連想起(金) | 3・5・10回続けて「思い出せた」 |
| リベンジ(銀) | 「もう一度」の直後の回答で「思い出せた」 |
| 学びの天秤(銀) | 「もう一度」1回以上と「思い出せた」3回以上 |
| 十枚突破(銀)・二十枚突破(金) | このセッションで10・20枚に回答する |
- 数えるのは、勲章機能の導入後にサーバーへの保存が確認できた回答だけです。保存失敗や409の回答は数えません。同じ回答IDの再送は1回分だけです。
- 新しく獲得すると、ドパハムのステージの上に通知を出します。同じ回答で取った勲章はまとめて表示します。通知は数秒で消え、×やEscでも閉じられます。入力やキー操作は奪いません。
- 再読み込みしても通知は出し直しません。取り消しに成功すると、その回答で得た勲章と、まだ出ている通知を取り消します。取り消しに失敗した場合、勲章はそのまま残ります。
- トップの「このセッションの勲章」と完了画面から一覧を開けます。獲得済み・未獲得と各条件を確認できます。記録はタブ内(sessionStorage)だけに保存し、タブを閉じると新しいセッションになります。学習予定やサーバーには影響しません。
カードHTML/CSSはスクリプトを実行できないiframeに表示します。任意JavaScript、アドオン独自フィルター、画像穴埋め、フィルターデッキのプレビュー状態は未対応です。未対応フィルターは画面で報告します。
| 場所 | 役割 |
|---|---|
scripts/import_anki.py |
元ID・予定を保持したAnkiパッケージ変換 |
src/tools/import-anki.ts |
変換・DB登録・メディアアップロードのCLI |
src/lib/scheduler.ts |
FSRS、学習ステップ、タイムゾーンと日境界 |
src/lib/render.ts |
Ankiテンプレート解釈 |
src/server/index.ts |
認証、出題、回答、取り消し、バックアップ |
src/server/manage.ts |
教材管理API、APIトークン、編集競合・再送の制御 |
web/manager.ts |
教材・ノートタイプ・デッキ・APIトークンの管理画面 |
web/ |
スマホ・PC対応UI。festival.tsがドパの計算、fx.tsが効果音と演出、mascot.tsがドパハムの絵、medals.tsが勲章の判定、medal-art.tsが勲章の名前と絵 |
migrations/ |
D1のDBスキーマ |
ts-fsrs@5.4.2のFSRS計算を使用します。FSRS-4/5/6の17/19/21パラメータを保持して変換し、native fsrs-rsの参照値で検証しています。Ankiと同じ学習ステップと日境界を扱いますが、fuzzは無効で、スケジューラ全体の完全一致は保証しません。パラメータ最適化は未実装です。
Rust版のWorkers用WASMビルドはgetrandomのJavaScript依存で追加の構成が必要になったため、まず動作するTypeScript実装を採用しました。スケジューラの境界を分離しており、後から差し替えられます。
npm run typecheck
npm test
.venv/bin/python -W error::ResourceWarning -m unittest discover -s tests/importer -v
npm run build実デッキを取り込んで開発サーバーを起動した後、ブラウザの実操作も検証できます。テストは1回答を保存してから取り消すため、カードの予定と記憶状態は戻りますが、取り消しの履歴とリビジョンは残ります。
npx playwright install chromium
npm run test:e2e演出の画面テストはAPIをすべてブラウザ内のモックで応答するため、取り込んだDBに書き込みません。npm run dev:webでViteを起動してから実行します。スクリーンショット(演出の時間経過を含む)は.local/verification/redesign/に保存します。勲章・評価別フィードバックの画像は.local/verification/medals/に保存します。
DOPANKI_URL=http://127.0.0.1:5173 npx playwright test tests/e2e/festival.spec.ts
DOPANKI_URL=http://127.0.0.1:5173 npx playwright test tests/e2e/study-options.spec.tsWorkers+D1+R2で配置します。本番はproduction環境を使い、ローカルのDBとは分けています。本番URLは https://dopanki.seezet1024.workers.dev です。Cloudflare AccessのWorkerポリシーで本番・プレビューの全通信を保護し、所有者のメールアドレスだけを許可しています。プレビューURLは無効です。
既存の本番環境を更新する場合は、次を実行します。保存済みの教材・学習状態と秘密は引き継がれます。
# DBの変更があるときだけ、先に適用する
npx wrangler d1 migrations apply dopanki --env production --remote
npm run deploy0010の適用後は旧Workerから練習を更新できなくなるため、続けてデプロイしてください。切り替え中に練習の保存が失敗した場合は、更新後に再試行してください。0010より前のWorkerへ戻す場合はDBも対応する復元ポイントへ戻す必要があり、その後の学習を失うため、Workerだけをロールバックしないでください。
初めて別アカウントへ配置する場合は、以下の手順でリソースを作成します。最初は[env.production]のworkers_devをfalseにして配置し、Cloudflare管理画面のWorkers & Pages → dopanki → Accessで「すべてのTraffic」と自分のメールアドレスだけを許可するポリシーを設定します。設定を確認してからworkers_dev = trueで再配置してください。
npx wrangler login
npx wrangler d1 create dopanki
npx wrangler r2 bucket create dopanki-media表示されたdatabase_idをwrangler.tomlの[[env.production.d1_databases]]へ設定します。AccessアプリケーションのAUDタグとチームURLを[env.production.vars]のACCESS_AUD・ACCESS_TEAM_DOMAINへ設定し、DBを準備します。
npx wrangler d1 migrations apply dopanki --env production --remote
npm run deployローカルの現在の状態を移す場合は、空の本番DBへローカルDBのSQLエクスポートを取り込みます。元のAnkiファイルを再取り込みすると、Dopankiで行った学習・教材編集は引き継がれません。既存の本番DBへ初期データを再取り込みしないでください。メディアがある場合はR2への移行も必要です。
本番の本人確認はCloudflare Accessだけで行い、Dopanki独自のパスワード入力はありません。アプリはAccess JWTの署名・発行元・AUD・有効期限を検証します。ログアウトはAccessのセッションを終了するため、同じチームの他アプリにも影響します。ローカルLAN利用時は引き続きAPP_PASSWORDを使います。AI用APIにはDopankiのAPIトークンに加えてAccessの機械向け認証が必要です。Accessのサービス認証だけでは学習・バックアップ・トークン管理を操作できません。単一の個人コレクション用で、ユーザー登録・複数ユーザー分離・Ankiとの双方向同期はまだありません。