ykzts.com

Manael v3.0.0をリリースしました

著者: 山岸和利

表題の通り、画像変換プロキシサーバーであるManael v3.0.0をリリースしました。Graceful Shutdownのサポートなど、モダンな運用に耐えうるアーキテクチャへの刷新をはじめ様々な変更が含まれていますが、一番大きな変更としては画像処理バックエンドのlibvipsへの移行でしょう。

libvipsの導入によるパフォーマンスの向上

これまでのManaelではlibwebpやlibaomなどのCライブラリを個別にバインディングして画像処理を行っていましたが、v3.0からは高速で省メモリな画像処理ライブラリであるlibvipsに基盤を統合する形へと書き直しました。

単なるフォーマット変換だけでなく、後述するリサイズなどの処理を行う際にもピクセルデータをメモリ上で効率的に扱うことができるため、ピーク時のメモリ使用量が削減されて変換速度自体も向上しています。

画像のリサイズと画質の動的制御

新しい機能としてクエリパラメータを用いた画像のリサイズと画質の動的制御に対応しました。

URLに?w=300&h=300といったパラメータを付与することで任意のサイズに縮小できるほか、fitパラメータを用いてアスペクト比の維持やクロップの挙動を制御することが可能です。

また、圧縮品質については?q=80のように全体的な数値を指定できるだけでなく、?q=avif:60,webp:80のように配信されるフォーマットごとに最適な品質を細かくコントロールできる設計としています。

ただしプロキシサーバーにおける画像のリサイズは展開時にCPUとメモリを激しく消費する処理でもあります。悪意のあるユーザーが巨大なサイズ指定を大量に送りつけてきた場合、すぐにメモリを食いつぶしてOOMを引き起こす懸念があります。

プロキシとしての安全性と軽量さを保つため、このリサイズ機能はデフォルトで無効化するオプトイン方式を採用しました。環境変数MANAEL_ENABLE_RESIZE=trueを設定した場合のみ有効化され、変換可能な最大ピクセル数にも上限を設けるセーフガードを実装することで、DoS攻撃のリスクを排して安全に運用できるようにしています。

複数のAIを活用した開発プロセスへの移行

今回のv3.0.0アップデートでは、複数のAIを適材適所で組み合わせた開発プロセスを導入しています。具体的にはIssueの作成にGemini、実装にCopilot Coding Agent、そしてコードレビューにCodeRabbitを利用するという役割分担を行いました。

Issueの作成にGeminiを採用したのはコンテキストを解釈してビジネスライクな文章やドキュメント、要件定義を書き起こす能力に長けていると感じたためです。他方で純粋なコード生成においては不向きな側面があるように見受けられたため、実装フェーズについてはCopilot Coding Agentへと委譲しています。

Copilot Coding AgentはGitHubのUI上から容易に実行をトリガーできることに加え、実行環境の定義もGitHub Actionsと同様の記法で簡潔に記述できるという、インフラストラクチャおよびワークフロー上の明確なメリットがありました。こうしたツール群を開発フローに組み込むことによって生じるプロセス上の変化についても、非常に興味深い知見が得られたと感じています。

おわりに

v3.0.0への移行に伴う環境変数の設定や新機能の具体的な使い方については新しく階層化して見やすくなったドキュメントおよびリリース告知記事に改めて整理し、備忘録として残しておこうと思います。

より実用的で堅牢なプロキシサーバーへと進化したManaelをぜひプロジェクトで活用してみてください。引き続き改善を続けていこうと思います。