<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>MulmoClaude on Off-Grid</title><link>https://offgrid.taikiito.com/tags/mulmoclaude/</link><description>Recent content in MulmoClaude on Off-Grid</description><generator>Hugo</generator><language>ja-JP</language><lastBuildDate>Mon, 17 Aug 2026 09:00:00 +0800</lastBuildDate><atom:link href="https://offgrid.taikiito.com/tags/mulmoclaude/index.xml" rel="self" type="application/rss+xml"/><item><title>MulmoClaudeを常時稼働にしたら、裏側の自動処理が無限ループしていた</title><link>https://offgrid.taikiito.com/posts/2026-08-17-journal-loop-bug/</link><pubDate>Mon, 17 Aug 2026 09:00:00 +0800</pubDate><guid>https://offgrid.taikiito.com/posts/2026-08-17-journal-loop-bug/</guid><description>常時稼働サーバーに移行した翌日、バックグラウンドの自動処理(journal機能)が特定セッションを延々とリトライし続けるバグを追いかけた記録。原因はPythonとNode.js間のミリ秒精度のズレだった。</description><content:encoded><![CDATA[<p>前回、MulmoClaudeをAWS Lightsailの常時稼働サーバーに移行したところまで書いた。移行自体は終わったが、次の日、今度は裏側の自動処理がおかしくなっていることに気づいた。</p>
<h2 id="何が起きていたか">何が起きていたか</h2>
<p>MulmoClaudeには、会話ログから日々の要約を自動生成する <code>journal</code> という裏側の機能がある。この処理が、毎時間動くたびに異常に時間がかかるようになっていた。1回あたり25〜90秒かかっている回もあった。裏で何度もリトライが走っている感触があり、消費されるトークン量も明らかに増えていた。</p>
<h2 id="原因を追う">原因を追う</h2>
<p>調べていくと、直前の移行作業(前回の記事参照)で発生した大量のセッション(625個)が、未処理のまま残留していることが分かった。毎時間動く自動処理は、この残留分を毎回すべて処理しようとしてリトライを繰り返していた。処理が終わらない→次の時間にまた同じ分をやり直す、という無限ループに近い状態になっていた。</p>
<p>さらに掘ると、根っこにはもう一段深い原因があった。処理済みかどうかを判定するタイムスタンプの比較で、Python側とNode.js側でミリ秒の扱いが微妙に食い違っていた。片方は切り捨て、もう片方は四捨五入、というようなズレがあり、本来「処理済み」と判定されるべきセッションが毎回「未処理」に見えてしまっていた。何度か修正を試したが、このズレそのものを直さない限り再発する状態だった。</p>
<h2 id="応急処置と本修正">応急処置と本修正</h2>
<p>まず <code>journal</code> 機能そのものを一時的にOFFにして、それ以上の消費を止めた。そのうえで、タイムスタンプ精度の扱いを両言語で揃える形に修正。修正後、<code>daysSkipped: 0</code> で毎時処理の所要時間が2〜3ミリ秒まで落ちたのを確認できた。</p>
<p>設定も見直して、<code>journal</code> は日次1回(<code>dailyIntervalHours: 24</code>)に固定。毎時のスケジューラーチェック自体は軽い処理だけに留めるようにした。</p>
<p>常時稼働は、アプリ本体だけでなく裏側の自動処理まで含めて「壊れない」ようにする話だと分かった。表から見えない場所ほど、地味にコストがかかっていたりする。</p>
<p>つづく。</p>
]]></content:encoded></item><item><title>MacBookからAWS Lightsailへ移行して、ハマった3つの問題と直し方</title><link>https://offgrid.taikiito.com/posts/2026-08-16-moving-to-a-server/</link><pubDate>Sun, 16 Aug 2026 09:00:00 +0800</pubDate><guid>https://offgrid.taikiito.com/posts/2026-08-16-moving-to-a-server/</guid><description>MulmoClaudeをAWS Lightsailに移行した記録。CSRFのtrusted originエラー、Docker Desktop/Docker Engineのネットワークの違いによる原因不明のエラー、メモリ増設と縮小の顛末まで。</description><content:encoded><![CDATA[<p>MulmoClaudeはそれまでローカルのMacBookで動かしていた。ノートを閉じたら止まる、持ち歩いたら止まる。外出先からもちゃんとしたWeb UIで使いたかったのと、Telegram bot運用は複数スレッドの並行やMarkdown表示のあたりで限界を感じていたので、常時稼働のサーバーに移すことにした。</p>
<h2 id="構成を決めるまで">構成を決めるまで</h2>
<p>自分のマシンから直接SSHで繋ぐ案は、会社のネットワークがoutboundのポート22を塞いでいることが多いので早々に除外した。代わりに、ドメイン経由でHTTPSアクセスし、手前にCloudflare Accessで認証ゲートを置く構成にした。ログインはGoogleアカウント、加えてアプリ側の共有シークレットでも二重にロックしている。</p>
<p>クラウドはさくらのクラウドとAWS Lightsailで迷ったが、Singaporeリージョンのレイテンシを優先してLightsailにした。最初は$7/月(1GB RAM、2 vCPU)の一番小さいバンドルから始め、足りなければ後で上げる方針にした。</p>
<h2 id="詰まったところ">詰まったところ</h2>
<p><strong>1. 送信しても無反応になる(CSRF)</strong></p>
<p>移行作業自体は終わったのに、ブラウザからメッセージを送っても何も起きない。エラーも出ない。原因は、アプリ内蔵のCSRFガードが<code>Origin</code>ヘッダーをチェックしていて、新しいドメインを<code>.env</code>の<code>MULMOCLAUDE_TRUSTED_ORIGINS</code>に追加し忘れていたことだった。自分の公開ドメインをここに足して<code>systemctl restart</code>したら直った。同じようにセルフホストしていて、公開ドメインからの送信だけ無言で失敗する場合は、まずここを疑うといい。</p>
<p><strong>2. 内部API呼び出しが断続的に失敗する</strong></p>
<p>数日後、<code>presentForm</code>や<code>manageCollection</code>など内部のMCPブリッジ呼び出しが「Network error calling &hellip;: fetch failed」で落ちるようになった。最初はメモリ不足を疑い、zram-toolsで圧縮swapを作ったり、Lightsailのプランを$7/月(1GB)から$12/月(2GB)に上げたりしたが、症状は変わらなかった。</p>
<p>結局、アプリのソース(<code>server/index.ts</code>)を読んで根本原因が分かった。アプリは<code>127.0.0.1</code>にしかbindしない設計になっており、Mac(Docker Desktop)ではこれがhypervisor越しにloopbackへ届くのに対し、Linux(Docker Engine)では単に<code>docker0</code>ブリッジの実IP(このケースでは<code>172.17.0.1</code>)に解決されるため、接続を受け付けていなかった。Macでは表面化しなかった設計上の穴が、Linux移行で初めて出てきた形だ。修正は、<code>socat</code>でブリッジ側からloopbackへTCPを1本中継するだけで済んだ。</p>
<pre tabindex="0"><code>ExecStart=/usr/bin/socat TCP-LISTEN:3001,bind=172.17.0.1,fork,reuseaddr TCP:127.0.0.1:3001
</code></pre><p>これをsystemdサービスとして登録したら、<code>curl http://host.docker.internal:3001/</code>が200を返すようになり、機能もすぐに正常化した。メモリ・zramの対応が無駄だったわけではないが(実際に空きは増えた)、このエラーの直接原因ではなかった。</p>
<p><strong>3. プランを下げようとしたら作り直しになった</strong></p>
<p>原因判明後、節約のため$7/月(1GB)に戻そうとしたが、Lightsailはスナップショット経由でのプラン縮小に対応しておらず、1GBインスタンスを作り直す必要があった。作り直したインスタンスは、Dockerのサンドボックスイメージビルドのような負荷時にたびたびハングし、SSHもブラウザコンソールも反応しなくなることが複数回あった。このワークロード(本体+Dockerサンドボックス+Telegram bridge)は1GBでは支えきれないと判断し、$12/月(2GB)を最終プランとして確定した。</p>
<p>いくつかのつまずきを経て、今はこのサーバーが24時間動き続けている。</p>
]]></content:encoded></item><item><title>MulmoClaudeをMacBookに導入して、個人用AIアシスタント環境を作った</title><link>https://offgrid.taikiito.com/posts/2026-07-25-mulmoclaude-genesis/</link><pubDate>Sat, 25 Jul 2026 09:00:00 +0800</pubDate><guid>https://offgrid.taikiito.com/posts/2026-07-25-mulmoclaude-genesis/</guid><description>サラリーマンをしながら趣味でパソコンをいじっている自分が、個人用のAIアシスタント環境を一から構築し、実際に使える状態にするまでの記録。ERR_MODULE_NOT_FOUNDのつまずきも含む。</description><content:encoded><![CDATA[<p>サラリーマンをしながら、趣味でパソコンをいじっている。エンジニアではないが、このブログでは、そのなかでやったことを起きた順番のまま記録していく。</p>
<p>まずは、そもそもの始まりの話から書く。</p>
<h2 id="きっかけ">きっかけ</h2>
<p>中島聡さんのニュースレターで「MulmoClaude」というものを知った。ChatGPTやClaudeのようなAIアシスタントを、SaaSとしてではなく自分のマシン上でセルフホストできるOSSプロジェクトで、会話履歴や記憶させた情報が全部ローカルのファイルとして自分の手元に残る、という点に惹かれた。試しに自分のMacBookに導入してみることにした。環境は Node.js v24.18.0、git 2.50.1、Claude Code CLI v2.1.220。</p>
<h2 id="最初のつまずき-err_module_not_found">最初のつまずき: <code>ERR_MODULE_NOT_FOUND</code></h2>
<p>導入方法はいくつかあり、最初は <code>receptron/mulmoclaude</code> を <code>git clone</code> する開発者向けの方法を選んだ。<code>yarn install</code> して <code>yarn dev</code> で起動しようとしたところ、<code>ERR_MODULE_NOT_FOUND</code> のビルドエラーで起動しなかった。原因は、パッケージ群のビルドが済んでいない状態で <code>dev</code> を起動しようとしていたこと。<code>yarn build:packages:dev</code> を先に実行してからだと、あっさり起動した。同じエラーで詰まっている人がいたら、まずこの順番を疑ってみてほしい。</p>
<p>動くようにはなったが、調べると公式が推奨しているのは <code>npx mulmoclaude@latest</code> というもっとシンプルな方法だった。ビルドの手間もgit cloneの管理も不要で、同じ日のうちに乗り換えた。ポートも <code>git clone</code>/<code>yarn dev</code> 版の <code>5173</code> から、npx版の <code>3001</code> に変わった。今もこのnpx版をベースに使い続けている。最初からこちらを選んでいれば、<code>ERR_MODULE_NOT_FOUND</code> にも遭遇しなかったはずだ。</p>
<h2 id="実際に使える環境に仕上げる">実際に使える環境に仕上げる</h2>
<p>動くようになってからは、日常的に使えるように何点か手を加えた。まず、パソコンの前にいないときにも使いたかったので、Telegramのbot(<code>taiki_mulmoclaude_bot</code>)をBotFather経由で作成し、公式のTelegram Bot APIの手順どおりに連携させた。外出先からでもチャットできるのは地味に便利だった。</p>
<p>あわせて、それまで公式のClaudeアプリで会話してきた蓄積(仕事の話、住んでいる場所、興味関心、日々の記録など)を、この新しい環境の「記憶」(ローカルのMarkdownファイルとして蓄積される仕組み)として移行した。ゼロから育てるのではなく、これまでの会話の続きから始められたのは大きかった。</p>
<p>最後に、ローカル環境が壊れたら全部消える、というのは避けたかったので、早い段階でGitHubにprivateリポジトリを作り、<code>git push</code> による定期的な自動バックアップの仕組みを整えた。この習慣は今も続いていて、後々サーバー移行を決める安心材料にもなった。</p>
<p>ここまでで、パソコンの中にMulmoClaudeを構築し、Telegram経由でも使えて、データもGitHubで守られている状態になった。</p>
<p>つづく。</p>
]]></content:encoded></item></channel></rss>