はじめに
自前の画像ホスティングやプライベートクラウドストレージの構築方法を探す際、MinIO が第一候補に挙がることが多いですが、個人開発者や中小チームにとっては、Garage がより軽量・高性能で設定の柔軟性も高い代替手段です。Rust で書かれており、リソース消費が極めて少なく、AWS S3プロトコルと完全互換です。
本記事では、1Panel パネル上で Docker Compose を利用して、本番環境で使用可能な Garageオブジェクトストレージサービスをデプロイする方法を詳しく記録します。よくある設定のハマりどころ(CORSクロスオリジン、WebUI 認証、ドメインバインディングなど)を記録・解決し、安全で使いやすいプライベート OSS を構築します。
0 事前準備
- サーバー OS: Debian 12(推奨)/ Ubuntu 22.04+
- 管理パネル: 1Panel(OpenResty/Nginx インストール済み)
- コアツール: Docker & Docker Compose
- ドメイン計画:
s3.example.com—— S3 APIエンドポイント(アップロード/管理ツール用)img.example.com—— 公開アクセスドメイン(ブログ/サイトでの画像参照用)admin.example.com—— Web 管理ダッシュボード(WebUI)
1 設定ファイルの準備(garage.toml)
- 1Panel でディレクトリを作成:
/opt/garage/config。 - ファイル
garage.tomlを作成し、以下の内容を記入:
2オーケストレーションファイルの作成(docker-compose.yml)
重要ポイント:
- WebUI の設定マウント:WebUIコンテナは
garage.tomlをマウントしないとadmin_tokenを自動的に読み取れません。 - パスワードのエスケープ:YAML 内では、Bcrypt パスワードハッシュ中の
$記号を$$と記述する必要があります。
1Panel でオーケストレーション garage-stack を作成し、内容は以下の通り:
を起動し、両方のコンテナが「実行中」と表示されることを確認します。
3 ノードレイアウトの初期化(Layout)
起動直後の Garage は「ロール未割り当て」状態のため、初期化が必要です。
ノード ID の確認:
1Panel のターミナルまたは SSH で実行:
表示された Node ID をコピーします。例:a8795c63e0c82b0b。
- 容量の割り当てと設定の適用:
この時点で WebUI を更新すると、ステータスが緑色の Healthy に変わるはずです。
4バケットの作成と権限設定
画像ホスティングとして使用するために、バケットを作成し、公開アクセスを許可する必要があります。
1.バケットの作成(Bucket)
WebUI で Buckets -> Create Bucket をクリックし、photo と命名します。
2. 公開ドメインのバインド(Alias)& Website モードの有効化
これが https://img.example.com/xxx.jpg で画像に直接アクセスできるようにするための鍵です。
WebUI で直接 Alias を設定し、Website を有効にすることもできます。

WebUI 画面
3. API キー(Key)の作成
- WebUI で Keys -> Create Key をクリック(
blog-keyなどと命名)。 - 表示された Access Key ID と Secret Access Key をすぐに保存します。
- Key 右側の Permissions をクリックし、
photoバケットの Read/Write 権限にチェックを入れます。- またはコマンドラインで権限付与:
docker exec -it garage /garage bucket allow --read --write --key blog-key photo
- またはコマンドラインで権限付与:
5リバースプロキシと HTTPS 設定(1Panel)
1Panel の「ウェブサイト」機能で3つのリバースプロキシを設定する必要があります:
| ドメイン | プロキシ先 | 用途 |
|---|---|---|
s3.example.com | http://127.0.0.1:3900 | S3 API(PicList/Lsky にはこちらを記入) |
admin.example.com | http://127.0.0.1:3903 | WebUI 管理ダッシュボード |
img.example.com | http://127.0.0.1:3902 | 公開画像アクセス(ポートは 3902 に注意) |
すべてのドメインに HTTPS 証明書を申請・有効化してください。
セキュリティに関する注意: Host モード使用時は、1Panel のファイアウォールまたはクラウドプロバイダーのセキュリティグループで、Nginx の 80/443 ポートのみを開放することを推奨します。Garage の 3900-3903 ポートを直接外部に公開せず、すべてのリクエストを Nginxリバースプロキシ経由にすることで、より安全になります。
6 CORSクロスオリジン問題の解決
ブログや他のウェブサイトで画像を参照する場合、ブラウザがクロスオリジンリクエストをブロックします。img.example.com の Nginx 設定で CORS を強制的に許可する必要があります。
1Panel のウェブサイト設定 -> 設定ファイル で、location / ブロックを見つけ、以下を追加します:
保存して Nginx をリロードします。
7クライアント接続設定
サービスの準備が完全に整いました。画像ホスティングツールに以下の設定を記入します:
- S3 Endpoint(ノード):
https://s3.example.com - Bucket(バケット名):
photo - Access Key ID: (ステップ4で取得した ID)
- Secret Access Key: (ステップ4で取得した Secret)
- Region(リージョン):
garage(デフォルト) - Force Path Style(強制パスモード): 有効(True)
- Custom Domain(カスタムドメイン):
https://img.example.com