Discord の特定チャンネルから !post で下書きを作り、!publish で GitHub Pages に載せるまでを通す Discord-first publishing beta です。DB は使わず、投稿メタデータは data/posts.json、draft は content/drafts/、公開スナップショットは apps/site/src/posts/ に保存します。
apps/botDiscord adapter と demo CLI。!post,!publish,!unpublish,!status,!helpを処理します。apps/siteAstro の静的ブログ。apps/site/src/posts/*.mdだけを表示するので draft は公開されません。data/posts.jsonmessageId -> slugを中心に、author、status、公開状態、添付パスを保持します。content/drafts/*.mdDiscord メッセージ編集のたびに更新される最新 draft です。apps/site/public/uploads/YYYY/MM/*添付ファイルの保存先です。Markdown にはこの公開パスを差し込みます。scripts/discord-check.mjs,scripts/pages-check.mjsDiscord 実機確認と GitHub Pages 事前確認の補助スクリプトです。
- Node.js 20.11 以上
- npm 10 以上
install は npm の予約ライフサイクルなので custom script にはしていません。標準のコマンドをそのまま使います。
npm install.env.example をコピーして値を入れてください。
cp .env.example .envDISCORD_TOKEN: Discord bot tokenBLOG_CHANNEL_ID: 監視対象チャンネルPUBLISHER_ROLE_ID: publish / unpublish を許可する role idGIT_AUTO_COMMIT:trueなら draft/publish 更新時に git commitGIT_AUTO_PUSH:trueなら commit 後に git pushSITE_BASE_URL: 公開 URLGIT_AUTHOR_NAME,GIT_AUTHOR_EMAIL: auto commit 用 authorGITHUB_REPO: deploy 状態を追跡したい GitHub repo (owner/repo)GITHUB_TOKEN: GitHub Actions status を読む tokenGITHUB_PAGES_WORKFLOW_NAME: Pages workflow 名。通常はDeploy GitHub PagesMAX_ATTACHMENT_SIZE_MB: 添付のサイズ上限。既定は10
root の npm run dev, npm run demo, npm run build, npm run test, npm run discord:check, npm run pages:check は .env を自動で読み込みます。
Discord なしで一連の流れを再現します。
npm run demodemo は常にローカル専用で動き、GIT_AUTO_COMMIT / GIT_AUTO_PUSH は無効化されます。本番 repo への自動 push は行いません。
ただし、data/posts.json, content/drafts/, apps/site/src/posts/, apps/site/public/uploads/ は demo fixture に合わせて更新されます。
個別にも動かせます。
npm run demo -- reset
npm run demo -- post demo/fixtures/post-create.json
npm run demo -- edit demo/fixtures/post-edit.json
npm run demo -- publish hello-from-discord
npm run demo -- status hello-from-discord1 回通しで確認する前に、設定が揃っているかを確認できます。
npm run discord:checkこのコマンドは次を行います。
.envの必須値チェック- Discord Bot token が有効か確認
- 対象チャンネル取得
- publisher role の存在確認
- そのまま貼れる
!postサンプル出力
その後、別ターミナルで bot と site を起動します。
npm run devDiscord 上では次の順で確認してください。
npm run discord:checkが出した!postサンプルを対象チャンネルに投稿- 同じメッセージを編集して本文を変更
- publisher 権限付きユーザーで
!publish hello-from-discord SITE_BASE_URL/posts/hello-from-discord/を開いて反映確認
npm run dev- Astro site:
http://localhost:4321 - Discord bot:
DISCORD_TOKENがあれば接続、なければ idle
build 済み bot を本番寄りに単体起動できます。
npm run build
npm run start:botAstro の build 済み preview は次です。
npm run preview:site常駐化のテンプレートは deploy/ に同梱しています。
deploy/pm2.ecosystem.config.cjsdeploy/discord-blog-bot.service
本番向けの環境変数テンプレートは .env.production.example を使ってください。
npm run build
npm run testproject pages を使う場合は SITE_BASE_URL に完全な公開 URL を入れてください。
- user/org pages 例:
https://example.github.io/ - project pages 例:
https://example.github.io/discord-blog-poc/
そのうえで、公開パスや upload URL が正しく出るかを確認できます。
npm run pages:checkこのコマンドは build を実行し、次を確認します。
.github/workflows/pages.ymlがあるSITE_BASE_URL由来の base path が index に反映される- 公開記事 HTML に upload URL が正しく埋め込まれる
最後に GitHub の main へ push すれば Pages workflow を実行できます。
!post
title: タイトル
slug: optional
tags: a, b
本文...
!publish <slug>!republish <slug>!unpublish <slug>!status <slug>!preview <slug>!drafts [limit]!recent [limit]!cleanup-uploads!help
- 公開記事一覧に author 名と公開日時を表示
- 新しい publish からは Discord avatar URL も frontmatter に保持
- サイト内検索で title / tags / author / excerpt を横断検索
- 各記事ページに拍手ボタンを設置
拍手数は現状 beta 実装のため、ブラウザごとの localStorage に保存されます。グローバル共有カウントではありません。
- 監視対象は
BLOG_CHANNEL_IDのみ !post以外の通常メッセージは無視messageIdごとに 1 つの slug を紐付け- 初回保存後の slug は固定
!publishは現在の draft から公開用 Markdown を作成!republishは公開中記事を最新 draft で再反映する- publish 後に Discord メッセージを編集しても公開中の記事は自動更新しない
!unpublishしても draft は残る- 添付は
apps/site/public/uploads/YYYY/MMにコピーされ、本文末尾に Markdown として追加される - 添付は画像 /
pdf/txt/mdに限定し、サイズ上限を超えると拒否する - 添付 URL は
SITE_BASE_URLを基準に絶対 URL で生成される - git automation は Git リポジトリかつ
GIT_AUTO_COMMIT=trueのときだけ有効 GITHUB_REPO/GITHUB_TOKENがあれば!statusと publish 返信で GitHub Actions の deploy 状態を表示する- bot 側の mutate 操作は単一キューで逐次処理する
- draft:
content/drafts/<slug>.md - live:
apps/site/src/posts/<slug>.md - registry:
data/posts.json
.github/workflows/pages.yml で main push 時に apps/site/dist を deploy します。project pages で base path が必要な場合は、リポジトリ変数または .env の SITE_BASE_URL を https://<user>.github.io/<repo>/ のように設定してください。
!publish の返信で URL が返ってきても、GitHub Pages deploy 完了までは一時的に 404 になることがあります。deploy 状態を bot でも見たい場合は GITHUB_REPO と GITHUB_TOKEN を設定してください。
- シングルテナント前提
- process 内キューはあるが、複数 bot instance 間の分散ロックはない
- Discord 添付の削除検知はしていないため、不要になった upload ファイルは残ることがある
- slug の Unicode 変換は最小実装なので、日本語タイトルは自動 slug が
post-<timestamp>になることがあります - Astro 側は検索、RSS、OG 生成なし
- 既存の published snapshot は republish するまで Discord avatar を持たないため、site では fallback initials を表示することがある
- publish 承認フローと監査ログ
- 添付ファイルの GC と容量管理
- 投稿履歴の差分表示とロールバック
- slug 変更や複数著者運用の UX
- GitHub Pages 以外の CDN / object storage への upload 分離
- Discord API rate limit と retry の強化