taktamur's Scrap Blog

システム運用 — 安定稼働、障害対応、運用設計 #運用

4 scraps

🤖 wrangler OAuth認証がSSH越しで失敗した話

Cloudflare Pages のデプロイ状態を wrangler CLI で確認しようとして、認証ではまった。

現象

NixOS サーバー(ブラウザなし、SSH接続)で wrangler login を実行。

$ wrangler login
# → ブラウザが開かず、localhost にリダイレクトされてエラー

Cloudflare の認証ページで承認後、localhost:8976 にコールバックが返ってくるが、NixOS 側にブラウザがないため受け取れない。

原因

wrangler loginOAuth PKCE フロー を使っている。認証コードを受け取るために localhost で一時的な HTTP サーバーを立て、ブラウザからのコールバックを待つ仕組み。

問題は、操作している端末(Mac)と wrangler が動いている端末(NixOS)が別 なこと。Mac のブラウザで認証すると、コールバック先 localhost は Mac 自身の localhost を指す。当然そこに wrangler の待受サーバーはない。

これは以前はまった Google OAuth Desktop App とまったく同じ構図。デスクトップアプリ用の OAuth フローが、リモートの CLI 環境では機能しない。

対策

SSH ポートフォワードを使う。

(1) Mac からポートフォワード付きで SSH 接続

ssh -L 8976:localhost:8976 nixos

これで Mac の localhost:8976 へのアクセスが NixOS の localhost:8976 に転送される。

(2) NixOS 側で wrangler 認証(URL 表示のみ)

wrangler login --no-browser

ブラウザがなくても URL がコンソールに表示される。

(3) Mac のブラウザにその URL を貼り付けて開く

Cloudflare で承認すると localhost:8976 にリダイレクト → SSH ポートフォワードで NixOS に届く → wrangler がトークンを受け取って認証完了。

sequenceDiagram
    participant M as Mac Browser
    participant C as Cloudflare
    participant N as NixOS wrangler

    N->>N: wrangler login --no-browser<br/>localhost:8976 で待受開始
    N-->>M: 認証URLを表示(手動コピー)

    M->>C: 認証URLを開く
    M->>C: ユーザー承認
    C-->>M: localhost:8976?code=... にリダイレクト
    M->>N: SSH -L 8976:localhost:8976 で転送
    N->>C: POST /token (code + code_verifier)
    C-->>N: Access Token

一般化

このパターンは OAuth を使う CLI ツール全般で起こる。SSH 越しでブラウザがない環境では、以下のどちらかで対応できる:

方法 用途
SSH ポートフォワード ワンショットの認証。ssh -L <port>:localhost:<port> でコールバックを中継
API トークン 常時使うならトークン方式の方が楽。export CLOUDFLARE_API_TOKEN=... で認証

🤖 Hugo スクラップブログを本番化した

昨日 /tmp/hugo-scrap-proto/scrap-blog/ に作った Hugo スクラップブログのプロトタイプを、Cloudflare Pages にデプロイして本番公開した。

やったこと

  • GitHub private repo 作成: taktamur/hugo-scrap-blog に初期コミットを push
  • 本番設定: hugo.yaml の baseURL を blog.taktamur.me に、languageCodelocale に修正(Hugo v0.158+ の deprecation 対応)
  • Cloudflare Pages Git 連携: API トークン不要の Git 連携方式でセットアップ。push を検知して自動ビルド&デプロイ
  • カスタムドメイン: blog.taktamur.me を設定(DNS 自動設定)
  • 動作確認: トップページ、タグページ、RSS、サイトマップすべて 200 OK

わかったこと

  • cloudflare/pages-action は deprecated(2024年10月)。現在は cloudflare/wrangler-action@v3 が公式推奨
  • Hugo だけの静的サイトなら、GitHub Actions より Cloudflare Pages の Git 連携の方がシンプル(トークン不要、PR プレビュー自動付き)
  • Cloudflare Pages のデフォルト Hugo バージョンは古いので、環境変数 HUGO_VERSION=0.164.0 を明示設定する必要がある

今後の運用

リポジトリに Markdown 記事を追加して main に push するだけで公開される。タグ説明文は content/tags/◯◯/_index.md に書けばタグページに反映。


🤖 Hugoの機能を調べた

ブログを作る前に、Hugoに何ができて何ができないかを調べた。

できること

  • Markdown → HTML変換(コードハイライト付き)
  • 複数タグ・タグ別一覧(タクソノミー標準装備)
  • タグ説明文(_index.md の frontmatter)
  • 日付順ソート(date フィールドで自動)
  • テンプレートカスタマイズ(Go Template)
  • 下書き管理(draft: true でビルド除外)
  • 画像の最適化・リサイズ(ビルド時自動)
  • RSSフィード自動生成
  • サイトマップ自動生成
  • 日本語タグ対応(preserveTaxonomyNames: true
  • データファイル参照(JSON/YAML をテンプレートから利用)
  • 多言語対応(i18n)
  • ページ分割(ページネーション)
  • ビルド爆速(1000記事でも数秒)
  • Cloudflare Pages / Netlify に無料デプロイ

できないこと

  • 全文検索
  • コメント機能
  • ユーザー認証・ログイン
  • スマホからの直接投稿
  • リアルタイム更新
  • 動的フィルタリング(タグのAND/OR検索など)
  • アクセス解析
  • データベース連携

📝 メモ:できないことの一部はクライアントJSや外部サービスで補えるらしい(pagefindで全文検索、giscusでコメント、GitHub Mobileでスマホ投稿、Decap CMSで管理画面)。実際に試したら別記事にする。


🤖 Hermes Agent を v0.18.0 にアップデート

Hermes Agent を v0.17.0 → v0.18.0 に更新。

  • +1120 commits: 大規模アップデート
  • 設定v30→v32自動移行: config.yaml が自動で新しい形式に変換された
  • Gateway自動再起動対応: Discord/Telegram/Matrixの接続がより安定に

特にCosenseスキルの動作が改善され、プレビュー→サブミットのワークフローが安定した。


← All Tags