デプロイガイド
Manael はステートレスな Docker コンテナとして配布されており、最新のコンテナオーケストレーションプラットフォームへの導入が容易です。このガイドでは代表的なデプロイ方法を説明します。
Docker Compose
以下の docker-compose.yml は、Manael をローカルの画像サーバーと一緒に動かす例です。
services:
manael:
image: ghcr.io/manaelproxy/manael:v2.1.0
ports:
- "8080:8080"
environment:
- MANAEL_UPSTREAM_URL=http://origin:9000
- MANAEL_ENABLE_AVIF=true
depends_on:
- origin
origin:
image: nginx:alpine
volumes:
- ./images:/usr/share/nginx/html:ro
次のコマンドで起動します。
docker compose up
Manael はポート 8080 でリッスンし、画像リクエストを origin サービスに転送します。MANAEL_ENABLE_AVIF=true を設定すると、デフォルトの WebP 変換に加えて AVIF 変換も有効になります。
Google Cloud Run
Cloud Run はトラフィックに応じて自動でスケールするため、Manael との相性が良いプラットフォームです。AVIF 変換は CPU 負荷が高いため、メモリ不足エラーを防ぐために少なくとも 1 GiB のメモリを割り当てることを推奨します。
gcloud CLI を使って Cloud Run に Manael をデプロイします。
gcloud run deploy manael \
--image ghcr.io/manaelproxy/manael:v2.1.0 \
--region us-central1 \
--platform managed \
--allow-unauthenticated \
--set-env-vars MANAEL_UPSTREAM_URL=https://storage.example.com,MANAEL_ENABLE_AVIF=true \
--memory 1Gi \
--cpu 1
| フラグ | 説明 |
|---|---|
--image |
GHCR で公開されている Manael コンテナイメージ。 |
--set-env-vars |
KEY=VALUE 形式でカンマ区切りの環境変数を指定します。 |
--memory |
コンテナインスタンスに割り当てるメモリ量。AVIF 有効時に OOM が発生する場合は 2Gi に増やしてください。 |
--cpu |
コンテナインスタンスに割り当てる vCPU 数。 |
--allow-unauthenticated |
公開アクセスを許可します。アクセスを制限したい場合はこのフラグを削除してください。 |
デプロイ後、Cloud Run がサービス URL を表示します。変換済み画像をキャッシュするために、その URL の前段に CDN や Cloud CDN を配置することを推奨します。
Kubernetes
以下のマニフェストは、Manael を Deployment としてデプロイし、クラスター内に公開する Service を定義しています。特に AVIF 変換を有効にしている場合は、OOM を防ぐためにリソースの requests と limits を設定することが重要です。
Deployment と Service
以下のマニフェストを manael.yaml という名前のファイルに保存します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: manael
labels:
app: manael
spec:
replicas: 2
selector:
matchLabels:
app: manael
template:
metadata:
labels:
app: manael
spec:
containers:
- name: manael
image: ghcr.io/manaelproxy/manael:v2.1.0
ports:
- containerPort: 8080
env:
- name: MANAEL_UPSTREAM_URL
value: "https://storage.example.com"
- name: MANAEL_ENABLE_AVIF
value: "true"
resources:
requests:
cpu: "250m"
memory: "256Mi"
limits:
cpu: "1000m"
memory: "1Gi"
---
apiVersion: v1
kind: Service
metadata:
name: manael
spec:
selector:
app: manael
ports:
- protocol: TCP
port: 80
targetPort: 8080
次のコマンドでマニフェストを適用します。
kubectl apply -f manael.yaml
リソース設定の目安
| ワークロード | メモリ request | メモリ limit | 備考 |
|---|---|---|---|
| WebP のみ(デフォルト) | 128Mi |
512Mi |
低〜中程度のトラフィックに適しています。 |
| WebP + AVIF | 256Mi |
1Gi |
AVIF エンコードは CPU・メモリ使用量がより大きくなります。 |
| 高トラフィック | 512Mi |
2Gi |
limit をさらに増やすよりも replicas を増やして水平スケールさせることを推奨します。 |
Manael はステートレスなので、負荷への対処には replicas を増やす水平スケールが最適です。共有ストレージやセッションアフィニティは不要です。