自分用のソースコード管理にForgejoインスタンスを運用している。

Forgeba: https://code.babibubebo.org/

アーカイブファイルを生成させるな

しばらく何事もなく運用していたのだが、ある日Zabbixからディスク空き容量のアラートが飛んできた。 サーバを調べてみると、Forgejoのリポジトリアーカイブファイル(zipとかtar.gzでダウンロードできるやつ)が大量に生成されており、空き容量がゴリゴリ減っていったようだ。 これらはアーカイブにアクセスされる時に動的に生成されるもので、アクセスログを調べるとほぼすべてbotによるアクセスだった。

ドキュメントにこれに関する言及があり、robots.txtを使ってアーカイブURLのクロールを弾くようにしろ、と書いてある。

Forgejo: Search Engines Indexation - Disallow crawling archives to save disk space

ただし、これはあくまでお願いベースの対策に過ぎないので、アーカイブ機能自体が不要なら無効化してしまったほうがよい。

設定ファイル app.ini repositoryセクションDISABLE_DOWNLOAD_SOURCE_ARCHIVES で設定できる。

1
2
[repository]
DISABLE_DOWNLOAD_SOURCE_ARCHIVES = true

Anubisでbotを弾け

一見落着かと思いきや、またZabbixからアラートが頻繁に飛んでくるようになった。今度はCPUの高負荷を知らせるアラートだ。

まずは何が起きているかを調べるために docker compose logs -f forgejo を叩いてみると、ものすごいスピートでログが流れていく。 あらゆるページに対してbotによる数十リクエスト/秒の絨毯爆撃を受けていた。むむむ、昨今流行りのエーアイクローラーってやつか。

とりあえずIPアドレスで弾こうかと思ったが、数日格闘して諦めた。広い範囲のIPアドレスが使われており、ルールベースでの対応が困難だったからだ。(whoisしてみるとAlibaba CloudのIPアドレスの割合が多かったが……)

そこで、最近目にした褐色猫耳少女のキャラクターが特徴的なAnubisを思い出し、導入してみることに。Anubisは、クライアントにWebブラウザで実行可能なproof-of-workを要求し、これをパスできないと背後のサーバへのアクセスを遮断するリバースプロキシのように動作する。

導入はとても簡単で、Docker Composeでnginx-proxyと組み合わせた以下のような構成で運用している。

code.babibubebo.org/compose.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
services:
  forgejo:
    image: codeberg.org/forgejo/forgejo:12.0.4
    expose:
      - '3000'
    networks:
      - backend
    # 略

  anubis:
    image: ghcr.io/techarohq/anubis:v1.22.0
    container_name: anubis
    environment:
      - TARGET=http://forgejo:3000
      - DIFFICULTY=5
      # nginx-proxy
      - VIRTUAL_HOST=code.babibubebo.org
      - VIRTUAL_PORT=8923
      - LETSENCRYPT_HOST=code.babibubebo.org
    restart: always
    expose:
      - '8923'
    networks:
      - frontend
      - backend

networks:
  frontend:
    external: true
    name: proxy-network
  backend:

詳しくはSetting up Anubisを参照。

これで nginx-proxy => Anubis => Forgejo という形でAnubisを経由することになる。

お気持ち

Forgejoでセルフホストしてソースコードを公開している以上、情報を取得するな、とは言っていない。 しかしその手段として、わざわざHTMLドキュメントを大量にクロールし、貴重なネットワーク帯域と電力を使って情報をこすり取る無駄の極みに呆れてしまう。

え、だって git clone すればソースコード丸っと落とせるのに!リポジトリのメタデータ欲しければ、Forgejo APIで機械可読にアクセスできるのに!