タグ
#EmDash
EmDashに関する記事を公開しています。
EmDash の管理画面で記事を直すと Workers 無料プランで 503 になる
Workers の無料プランで EmDash 1.3.0 を動かし、管理画面で記事を直すと、自動保存が 1回 61〜135ms の CPU を使い、4分で打ち切られて管理画面が約 2分 503 になりました。CLI で入れたときは打ち切られず、無料のままなら本文は外で仕上げてまとめて入れることになります。
EmDash 1.3 で coalesce: true を足すと D1 の読み取りが 1.2 並みに戻る
EmDash 1.3 は D1 を session: "auto" で使うサイトの先読みを止め、手元の計測ではトップページ 1回の読み取りが 439行から 18行に減りました。新しいテンプレートが既定にした coalesce: true を足すと先読みが戻り、往復は 3回から 2回に減る代わりに 440行を読みました。
D1 と R2 を使う Workers サイトは Deno の celld で動くが、今は移すメリットが無い
D1・R2・Cron を使う EmDash の Workers サイトを、Cloudflare Workers 以外で動かす環境として Deno の celld 0.6.2 に載せました。設定 5か所とコード 3か所を直すと自前の 2台で動きましたが、Workers のキャッシュと TLS を失い、ビルドのたびの手直しとベータ版のツールを抱えることになります。今は移すメリットが無く、使い道は Cloudflare から出られる道があるかを手元で確かめておくことです。
Cloudflare Pages に終了日は無く、Workers でも無料の範囲は同じ
Cloudflare Pages に終了日は発表されておらず、静的アセットの配信は Workers に移しても無料で無制限のままです。変わるのは、Cloudflare のネームサーバーを使っていないドメインをカスタムドメインにできないことと、ビルドの数え方です。移した後に Cron Trigger をサイトごとに置くと、無料プランではアカウント全体で 5本を超えた所で上限に当たります。
EmDash を本番で半年使った料金と WordPress 移行
EmDash は Cloudflare の無料プランで動くと言われます。9 サイトを半年本番で動かし、WordPress から 6 サイトを移した実例で、管理画面の保存の CPU 時間と移行で直した物を示します。9 サイトは無料のままで、有料にしても 1 アカウント月 5 ドルです。
WordPress と EmDash の差は好みではなくプラグインの作りにある
WordPress から EmDash に乗り換えるメリットはあるのか。どちらも同じことができるなら好みの問題ではないのか。9 サイトを 1.1 まで運用した私の答えは、差は好みではなく、管理者なら誰でも本番のコードを触れる WordPress の作りにある、です。エコシステムの未成熟と、国内に始める場所が無いことまで含めて書きます。
D1 を編集できる AI エージェントは、隠した EmDash の鍵を自分で作れる
AI エージェントには鍵をプロキシで差し替えて渡し、実体を見せていません。ところが D1 を編集できるエージェントは、EmDash の API トークンを自分で発行できます。EmDash の API トークンは隠すのをやめてスコープを絞って使い捨てにし、隠すのはそれ以外の鍵にしました。
EmDash は Workers の無料プランだと保存のたびに CPU 上限を超えた
Cloudflare Workers の無料プランで EmDash を動かすと、管理画面の保存と公開は成功した回も含めて毎回 CPU 上限の 10ms を超え、ときどき打ち切られました。既存の顧客は無料のまま移して問題が出たら払い、新規の顧客は最初から有料プランで見積もります。
EmDash の Cron は Free プランだと5本まで
EmDash は全サイトに Cron Trigger がある前提で作られています。9サイトに足すと6サイトでデプロイが落ちました。Workers Free の Cron はアカウント全体で5本までなので、置くサイトを2つに絞り1日1回にしました。
D1 にトランザクションが無い中で EmDash が整合性を保つ仕組み
Cloudflare D1 にはトランザクションが無く、EmDash はそれをソースに書いています。本番のリビジョンを数えて仕組みを追うと、守っているのはコンテンツの行が1つだけで、残りは多めに作って後で捨てる設計でした。
EmDash が真っ白になるのは Free プランの CPU 上限
Cloudflare Workers の Free プランで動く EmDash のトップが真っ白になりました。原因は CPU 時間 10ms の上限を日常的に超えていたことで、件数を絞る修正は実測で前提が崩れました。
戻せない D1 マイグレーションは本番のダンプで先に流す
EmDash は merge した瞬間に本番の D1 スキーマを自動で書き換える。down が空で戻せない 2本を含む 20本のアップグレードを、本番のダンプに先に流して検証してから通した設計を記す。
サンドボックスに鍵を置かずに EmDash の CLI を使う
CMS への記事投入を内蔵 MCP 経由で行うと本文がモデルの入出力を通り、トークン消費も文字化けの危険も増えます。サンドボックスの環境変数にプレースホルダーを置き、ホストのプロキシが差し替える経路に切り替えた設計を実例で示します。
Cloudflare D1 の無料枠を守るためだけに作らなかった 4 つの仕組み
D1 の読み取りを 1 日 2,110 万行(無料枠の 422%)から 190 万行前後まで下げる過程で、「次はこれを作ればさらに減る」という案が 4 つ出ました。公開時にキャッシュ済みの 404 を消すミドルウェア、404 ページを D1 を読まない静的ページにする案、リダイレクト表を Bulk Redirects へ同期する仕組み、スキャナをエッジで落とす WAF ルール。どれも半日で作れて効果も数字で見えていましたが、4 つとも作りませんでした。守る対象が今は圧迫されていないこと、持ち続ける費用が作る費用より高いこと、圧迫されたときの第一手は課金の方が確実なこと。判断の材料と、再訪の条件をまとめます。
EmDash の記事を API で一括更新する。_rev の場所と draft → publish
Astro 製の CMS「EmDash」で、タイトル 51 本・本文の言い回し 15 本・記事間リンク 32 本を 1 日で直すために、API を直接叩いて一括更新しました。楽観ロックの _rev は GET レスポンスの item の外側(data._rev)にあり、version を渡すと 400 になります。PUT を status: draft で保存して publish を分け、Portable Text は text キーだけを歩けばコードブロックと HTML ブロックを壊しません。タグの割り当てはコンテンツ更新と別経路で、キャッシュ失効も updatedAt も動き方が違う点まで、110 記事を更新して分かったことをまとめます。
Astro の /_astro/ 画像が移行後に 404 で叩かれ続ける原因と対処
WordPress をヘッドレスに使った Astro の静的ビルドから EmDash へ作り直したあと、旧ビルドの /_astro/<名前>-1024x717_<ハッシュ>.jpeg に週 700 回以上の 404 が来ていました。User-Agent は普通のスマートフォンのブラウザで、画像検索からの着地でした。EmDash のリダイレクト表は拡張子付きのパスを引かないため 747 行入れても発火せず、ミドルウェアでファイル名からメディアを引いて 301 する形にして、週 1,640 件の 404 を 156 件に減らしました。残った 1 枚は同じ画像が別名で 2 回アップロードされていたもので、Redirect Rule 1 本で受けた経緯までまとめます。
Astro + Cloudflare で公開した記事が 404 のままになる原因
記事を公開したのに、記事の URL だけが「ページが見つかりません」のままでした。公開前にその URL を一度でも開いていると、404 のレスポンスがエッジに 30 日キャッシュされ、公開しても消えません。Astro の routeRules はリクエストのパスで照合してステータスを見ず、EmDash が公開時に失効させるタグ(コレクション名と記事 ID)は 404 には付いていないためです。purge の仕組みを足す案を作って取り下げ、404.astro で Astro.cache.set({ maxAge: 300, swr: 0 }) を呼んで 5 分に上書きするだけにした経緯と、swr を忘れると起きることを実測で書きます。
Cloudflare にデプロイしたのに反映されないのはブラウザのキャッシュ
デプロイ後にブラウザで開くと古いページのままで、ハードリロードすると新しくなる状態になりました。エッジは正しく更新されていて、原因はレスポンスに Cache-Control が 1 つも無かったことです。指示が無いとブラウザは Last-Modified から有効期限を推測するため、古い記事ほど長く保持されます。エッジ用のヘッダはエッジで取り除かれるので、ブラウザ向けの指示は別に出す必要がありました。
EmDash で記事にタグを付けても本番に反映されない原因
記事にタグを付け直しても、本番のタグ一覧に出てきませんでした。CMS がキャッシュを自動失効させているのはコンテンツの CRUD だけで、タグの割り当て・サイト設定・メニュー・ウィジェットエリアは別のルートで処理され、失効を呼んでいませんでした。エッジキャッシュの保持時間を 30 日に延ばしてから実害が出た問題で、CMS 本体に patch を当てず、アプリ側のミドルウェア 1 か所で失効させるようにした記録です。
Cloudflare の Purge Everything で Workers Cache が消えない理由
ダッシュボードから Purge Everything を実行しても、ページが古いまま返ってきました。age が単調増加していることから消えていないと分かります。原因は消そうとしていたキャッシュがゾーンの CDN キャッシュではなく Workers Caching だったことで、ゾーンレベルの purge はこの層に届きません。あわせて、デプロイ時の purge がそもそも不要である理由も確かめました。