世界を動かす技術を、日本語で。

私にとっての時代の終わり:自己ホスト型Gitの終了

概要

長年運用してきた 自前のgitサーバー を終了する決断。 AIスクレイパー による過剰アクセスが主な原因。 既存リポジトリは GitHubやGitLab などの大手サービスへ移行済み。 ブログ等は静的サイトとして 自前サーバー で継続運用。 今後は AIスクレイパー対策 の負担を手放し、安定運用を重視。

自前gitサーバー運用終了のお知らせ

  • 2011年から続けてきた パブリックgitサーバー運用 の終了決定
  • それ以前は CVSサーバー も公開運用
  • AIスクレイパー によるcgitフロントエンドへの大量リクエストでサーバーが過負荷状態
  • 数ヶ月前から実質的にサービス不能状態
  • 再構築やcgitフロントエンド刷新 も検討せず、撤退を決意
  • スクレイパー対策に時間を割く余裕や意欲の喪失
  • 大手git forge(GitHub, GitLab) にミラー済みのリポジトリが主役に
  • すべてのcgitリポジトリへのリンクを forge側へ修正 済み
  • 今後は GitHubやGitLab を参照推奨

残る自前サービスと現状

  • 現在は ブログ等を載せたwebサーバー のみ自前運用
  • 2018年に WordPressからJekyllへ移行 し、全ページ静的化
  • 静的サイトのため、AIスクレイパーによる 高負荷に強い構成
  • それでも AIスクレイパーが一度障害を引き起こした 経験あり
  • cgitサービス終了後も、 404応答を大量に返し続けるbot が存在
  • Apache自体は問題なく動作したが、 ログファイル肥大化 によるディスク圧迫を経験
  • logrotate設定を修正 し、安定運用を維持
  • 今後も 静的サイト運用 を継続予定

感想と今後

  • AIスクレイパー対策 を個人で担う時代の終焉
  • 大手サービス利用 への転換で、運用負担の軽減と安定性向上
  • 自前運用は 静的サイト など限定的な範囲に絞る方針
  • Security Nightmares 2025 (タイトルの元ネタ)への言及
  • 効率的なリポジトリ取得方法として git clone の推奨

Hackerたちの意見

これらのスクレイパーについて、何が起こっているのか知っている人いる?なんでAIに関連付けられているのかも気になる。普通のLLMを使ったスクレイパーなら、404エラーの山を見て止まると思うんだけど。もしデータを集めてLLMを訓練するためだけなら、これらは普通の方法で書かれた非常に質の悪い、悪質なスクレイパーだよね。もしかして、これらのスクレイパーがLLMを使って認証をバイパスしたり、もっと複雑なフローを実行しているのかな?ここ数年ボット検出に関わってないけど、住宅プロキシを使ったスクレイパーが何年もサイトを攻撃するのはよくあったから、今何が違うのか気になる。

自分のものの著作権を剥がして、他の誰かがそれを自分のものとして売り出すのには価値があるよね。LLMには技術的な改善がないから、盗まれたデータをどんどん投げ込むしかできなくて、なんとかしてあやふやな「閾値」を超えて、急に実際に利益が出るようになることを期待してる感じ。これは底辺へのレースだよ。今はその底にかなり近づいているのが違うところ。

推測だけど、今のAIリクエストの大部分は、ユーザーの質問に答えるためにデータを引っ張っているエージェントから来ていると思う。今はデータが主に訓練用に集められているわけじゃなくて、ほとんどが取得されてLLMに供給されて、応答を生成するために使われている。だから、同じリクエストがたくさん繰り返されるんだね。

これを理解したいな。数年前には、悪さをするスクレイパーは珍しくて、心配するほどじゃなかった。今は、動的なサイトをVercelやCloud Runみたいな有料のホスティングプラットフォームに接続するだけで、すぐに恐ろしい請求が来るくらいの脅威になってる。「AIのためだ」ってのは、ちょっと怠慢な理由に感じるけど…じゃあ、何のためなの?一つの予想としては、今は新鮮なウェブのスクレイプを買いたい市場が十分にあって、それがスクレイプを行うチャンスを与えているのかも。でも、顧客は誰なんだろう?

なんでAIに関連付けられているのか? 彼らが言っているのは、必ずしもLLMによって駆動されているスクレイパーではなく、LLMを訓練するためにデータを集めているスクレイパーのことだと思う。

理解しようとするのをやめた。自分のサイトで404エラーが出ると、1年のバンに直結するからね。

軽いコラボ用に公開のForjegoインスタンスを立ち上げたんだけど、証明書が作成されてから約2分後に、透明性ログからインスタンスを拾ったみたいで、追加した2つのリポジトリのコミットを全部チェックし始めた。しばらく見てたけど、いつか終わるだろうと思ってたら、終わらなかった。ClaudebotとGPTBot(見たのはこの2つだけど、偽造の可能性もある)で同じURLを何度も繰り返し見てた。しかも、同時にいろんな検索クエリも試してた。次の日、もう見るのがうんざりになって、インデックスを禁止するrobot.txtを追加した。数時間待っても、まだ同じことをやってたから、基本認証を設定してwiki:wikiをユーザー名:パスワードにした。リンクしたページにその認証情報を書いたら、予想通りそれ以降は試みをやめたみたい。何かをバイパスしようとはしてないみたいで、前に何かを置けば基本的に防げる。ただ、ユーザーエージェントでブロックするのは面倒だから、"トリビアルな基本認証"の道を選んだ。特に問題はなかったけど、普通のユーザーを装おうとするのがちょっとイライラした。ウィキのインスタンスでも同じ問題があって、レート制限を追加したら、結局彼らは私の設定した制限以上に引き下がったみたいだから、やっぱり理解したんだろうね。ログを確認したら、完全に試みをやめたみたい。どうやら、使用量でホスティング代を払ってる人たちが一番影響を受けてるみたい(私には理解できないけど)。私はVPSで自分のものをホスティングしてるから、大した問題じゃない。最悪の場合、もっと攻撃的なキャッシュを追加すれば、もう問題にならないだろう。

リクエストに対する応答を考えるのにLLMを使うのは、コストがかかりすぎて遅すぎる。たくさんのリクエストを一気に送って、応答があったものを処理する方がずっと楽だよ。これ、別に新しいことじゃない。昔、WordPressを使ってた頃は、サーバーログがボットで埋まるのが普通だったし、よくある脆弱なPHPのエンドポイントにアクセスしようとするやつらがいた。今もそうかもしれないけど、ログを見る時間はあんまりない。公開サーバーを運営してるなら、そういう悪意のあるリクエストに対処するのは仕方ないことだよ。公共ポートで運営する限り、こういうことは昔からあることだし、適当に書かれたコードも新しいことじゃない。AIの機会主義は、確かに少しのボットやスクレイパートラフィックを加えたけど、基本的な脅威モデルを根本的に変えるわけじゃない。以前はバージョン管理サーバーはあまり価値がないものとされてたけど、コードがLLMのトレーニングに興味深いものになったんだ。とにかく、どんなポートでも応答するものがあれば、機会主義的な試みが来るのは避けられないよ。DOS目的で悪用できるものは、まさにそれに悪用されるかもしれない。もしそれが嫌なら、公開サーバーを運営しないか、適切に保護すればいい。確かにこれは面倒で簡単ではないけど、そういう痛みを和らげるクラウドサービスもあるよ。404、401、または400のレスポンスでサーバーがダウンするべきじゃない。再犯者には429(リクエストが多すぎる)を返すロジックを実装するのもありだと思う。ちょっと強引だけど、やってみてもいいんじゃない?でも、もしサーバーをDOSに使われる可能性があるものを運営するなら、誰かがそれをやっても驚かないでね。

これらのスクレイパーについて、何が起こっているのか、またなぜAIに関連付けられているのか知っている人いる?推測する必要はないよ、アクセスログを見れば明らかだから。自分のサーバーを運営している人ばかりじゃないのは分かってるから、俺のログからいくつか抜粋してみるね: - "meta-externalagent/1.1 +https://developers.facebook.com/docs/sharing/webmasters/craw...)" - "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" - "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Amazonbot/0.1; +https://developer.amazon.com/support/amazonbot) Chrome/119.0.6045.214 Safari/537.36" - "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.3; +https://openai.com/gptbot)" - [...] (compatible; PetalBot;+https://webmaster.petalsearch.com/site/petalbot)" それで規模感を伝えるために、俺のcgitインスタンスは過去60日間で37,212,377リクエストを受け取ったんだ。99%以上がボットだよ。nginxのaccess.logはその60日間で12GiBに増えた。彼らは見つけられるものは何でも無差別にスクレイピングしていて、かなりの作業を必要とするエンドポイントも含まれているから、今はそのサーバーで30-50%のCPU使用率が基本になってる。ああ、もちろん、彼らがスクレイピングしているもののほとんどは過去60日間で実際には何も変わってないから、まさに無駄な計算と帯域幅の浪費だよ。ホスティング会社がまだ彼らをブロックしていないことに驚いてる、これでエネルギー代がかなり増えるはずだし。ボットの中には、他よりも行儀がいいのもあるみたいで、OpenAIだけでその3700万リクエストのうち2600万を占めてる。

俺は、a) スクレイパーの量、b) 特定のコンテンツではなく「すべて」のコンテンツを求める欲望、c) スクレイパーが新しくてGooglebotなどの何十年分のパッチがないことが原因だと思う。5年前はForgeJoインスタンスや個人ブログをスクレイピングすることに興味を持っている人はほとんどいなかった。今は、モデルをトレーニングしたりRAGに使ったりするためにデータを集める会社や個人が山ほどいる。より良いスクレイパーを持つことは、より多くのデータを意味し、それがより良いモデル(大雑把に言って)につながるから、競争上の優位性になる。良い、行儀のいい分散スクレイパーを書くのは簡単じゃない。

多くのAIスタートアップがデータセットを構築して、それを売ることを目指しているんじゃないかと推測してる。完全には理解できないけど、下手にやると自分たちが損するだけだし、でももしかしたら彼らは製品や結果にはあまり関心がなくて、ただAIのゴールドラッシュの一部を掴もうとしてるのかも?

それで、これらのボットはどうなってるの?最近よく耳にするけど。DDoS攻撃は新しいことじゃないし、正直言って、これがCloudflareが存在する理由の一つなんだけど、OpenAIのボット(今はこれが何か分からないけど)をもう少し簡単に対処できると思ってたんだけど、違うの?例えば、合理的に攻撃を防ぐfail2banポリシーを持つとか?それとも、リクエストが異なるネットワークの異なるIPから来るボットネットみたいに振る舞ってるの?どうして?これは一体何なんだ?

OpenAIだとは思えないな。もしかしたらOpenAIに売ってる誰かかもしれないけど、たぶん違う。彼らはこの件をほとんど社内で適切にやれるほど大きいと思う。AI以前は、全インターネットのスクレイプを望むのは大手だけだったし、質の高いボットを作ったり、協力したり、ちゃんと振る舞ったりしてた。でも今は、3流のラボでもそのデータが欲しいし、何百万ものスタートアップがそれを売りたがってるから、悪行と悪い実装の無法地帯になってる。彼らも住宅IPセットを使ってるよ。

こっそり言うと、彼らの多くは「住宅プロキシ」、つまりバックドアが仕込まれた家庭用ルーターや、セキュリティがひどいIoTデバイスを通じて来てるんだ。基本的に、これらのスクレイパーはしばしば第三者でもあって、こういう「会社」に行って、これらの「住宅プロキシ」へのアクセスを買ってる。一部は他よりも…配慮があるかも。なんで?データだよ。どんなデータも価値があるかもしれないから。そして、陰謀論みたいに聞こえるかもしれないけど、量子後の時代に近づいている(すでにそうかもしれないけど)と思う。

これがCloudflareが存在する理由のほとんどだよ。自分で言ったじゃん。もし治療法を売るなら、疫病を始めるのと同じだよ。

シボレスでブロックする方法ってあるのかな?最近のGoogleハックで、クエリの最後に-(n-word)を追加するとAIが自動でシャットダウンするってのがうまくいくから、気になって。

そんなこと知らなかった!ありがとう!

こういうことは、リポジトリのすべてのブランチ、コミット、diffを公開しないことで軽減できるよ。各ブランチのHEADだけを公開すればいい。もっと詳細が欲しい人は、クローンしてお気に入りのgitクライアントで見ればいい。例えば、https://mitxela.com/projects/web-git-sum (https://git.mitxela.com/)

これからのアイデアがもう一つ浮かんだんだけど、SSHのgitクライアントやウェブサイトと通常の機能を組み合わせたらどうかな?例えば、https://ssheasy.com/みたいなものも使えるかもしれないし、gotty/xtermインスタンスで自動的にSSHしてTUIみたいなインターフェースを持つのもありかも。これでスクレイパーには十分だと思うんだけど。

代わりに、git.ardour.orgのnginx設定ファイルから: location ~ commit/* { return 404; }

Forgejoサーバーへのトラフィックを、1日あたり約60万リクエストから約1000に減らしたよ: https://honeypot.net/2025/12/22/i-read-yann-espositos-blog.h... 1. Anubisは奇跡だ。 2. 大半のスクレイパーはダメだから、全てのリクエストにshibbolethクッキーを含めるようにしてる。もし含まれてなかったら、クッキーを設定してJavaScriptでページをリロードするように指示する。普通のブラウザはこれに何も気にしないけど、大半のスクレイパーはこれができない。 (これは俺のアイデアじゃないよ;インスピレーションのリンクを貼っておく。実装のためのCaddy特有の指示を含めただけ。)

Anubisが出たとき、ここで「スクレイパーが適応するから長続きしない」って言ってた懐疑派がいたのを覚えてる。結局、無頓着で倫理観のないバイブコーダーはあまり有能じゃないんだな。

JavaScriptでページをリロードするように指示するのは、 NoscriptやuBlockみたいなものを使っているユーザーをすべて排除することになるけど、それがあなたにとって許容できる collateral damage かもしれない。しかし、これはビッグアドテックのプレイブックにまさにハマることを考慮するのが良いかも。彼らは20年以上かけて、信頼できないソースのプログラムを100個以上実行することをページロードのたびに普通のことにして、ドキュメントブラウザでコードを実行することにオプトインするユーザーを疑いの目で見るようにしてきた。誰もがその力を彼らに銀の皿で渡したくないと思うだろう。

うわ、cgitで公開するのが原因だね。KeycloakみたいなものでOAuthログインの背後にすべてを隠して、GitLab、Forgejo、Giteaなどに統合するのがいいよ。でも、gitをホストするには、ユーザーとsshがあれば十分。ウェブUIは必要ないし、ポート443や80も必要ない。

giteaを使っても、非認証の読み取り専用アクセスをウェブブラウザから許可するのが目的なら意味がないよ。スクレイパーはそれを使って、個々のコミットに何度も何度もアクセスしてくるからね。私たちはnginxの設定を使って、個々のコミットへのアクセスを防ぎつつ、giteaが提供する「その他」の部分は非認証のアクセスでも読み取り専用のままにしておいたよ。

ああ、可哀想な人 :) 同じ問題を抱えてたよ。俺は簡単に解決した。インターネットから情報を引っ張り出して、VPNオーバーレイネットワークだけを残したんだ。未来は暗い、つまり…ダークネットだ。人々のための人々による場所で、悪い奴らと対処できるところだ。目を覚ませ!ネットワーキングを始めよう :)

Fail2banはApache httpd用の良い監獄があるよ。存在しないリソースへのリクエストにマッチするルールを書くのはすごく簡単で、ワンライナーと時間ベースの閾値で済むからね。基本的には、発生するHTTPエラーに応じて異なる方法で禁止できるよ(例えば、移行したリソースに対するボット: 1分以内に多くの404、Slowlorisは多くの408として見える)。

他のウェブサーバー用の監獄も当然簡単だよ。

よくわからないな。あなたのHTTPSサーバーが攻撃されてたから、Gitの提供をやめたの?それは全く意味がないよ。プライベートサーバーなら、ウェブフロントエンドをオフにすればいいじゃん。

投稿には、彼らのウェブフロントエンドが公開されていたと書いてあるよ。

私はCloudflare Tunnelの背後にある自己ホストのGiteaインスタンスを持っていて、CloudFlare Accessで保護されてるけど、全く問題ないよ。明らかに「公開」ではないけど、簡単なログインでインターネットからアクセスできるよ。