Meilisearch セットアップ
Hetzner US(Ashburn)の VPS で Meilisearch を Docker セルフホストする手順。
サーバー情報
| 項目 | 値 |
|---|---|
| プロバイダー | Hetzner Cloud |
| プロジェクト | subseek |
| サーバー名 | meilisearch |
| ロケーション | Ashburn, VA(us-east) |
| プラン | CPX22(Shared, Regular Performance) |
| OS | Ubuntu 24.04 |
| IPv4 | <HETZNER_VM_IP> |
コンテナ構成
1台の VM 上で Production / Staging の2コンテナを起動する。
| 環境 | コンテナ名 | ポート | MEILI_ENV |
|---|---|---|---|
| Production | meilisearch-production | 7700 | production |
| Staging | meilisearch-staging | 7701 | development |
| Development | ローカル Docker | 7700 | development |
初回セットアップ手順
1. SSH 接続
ssh root@`<HETZNER_VM_IP>`
2. Docker インストール
curl -fsSL https://get.docker.com | sh
3. Meilisearch 起動
# ディレクトリ作成
mkdir -p /opt/meilisearch/data/{production,staging}
# マスターキー生成
PROD_KEY=$(openssl rand -hex 32)
STG_KEY=$(openssl rand -hex 32)
echo "Production MEILI_MASTER_KEY: $PROD_KEY"
echo "Staging MEILI_MASTER_KEY: $STG_KEY"
# Production(ポート 7700)
docker run -d \
--name meilisearch-production \
--restart unless-stopped \
-p 7700:7700 \
-v /opt/meilisearch/data/production:/meili_data \
-e MEILI_MASTER_KEY="$PROD_KEY" \
-e MEILI_ENV=production \
getmeili/meilisearch:v1.13
# Staging(ポート 7701)
docker run -d \
--name meilisearch-staging \
--restart unless-stopped \
-p 7701:7700 \
-v /opt/meilisearch/data/staging:/meili_data \
-e MEILI_MASTER_KEY="$STG_KEY" \
-e MEILI_ENV=development \
getmeili/meilisearch:v1.13
重要:
MEILI_MASTER_KEYの値は安全な場所に保管すること。docker inspectで後から確認可能だが、紛失すると API キーの再取得ができなくなる。
4. 動作確認
curl localhost:7700/health # → {"status":"available"}
curl localhost:7701/health # → {"status":"available"}
5. ファイアウォール設定
SSH と Meilisearch ポートのみ許可し、それ以外を遮断する。
# SSH 許可
ufw allow 22/tcp
# Meilisearch ポートを Fly.io API の IP のみに制限
# Fly.io Shared IPv4
ufw allow from 66.241.125.181 to any port 7700
ufw allow from 66.241.125.181 to any port 7701
# Fly.io IPv6
ufw allow from 2a09:8280:1::f6:ac9f:0 to any port 7700
ufw allow from 2a09:8280:1::f6:ac9f:0 to any port 7701
# 有効化
ufw enable
ufw status
注意: Fly.io の Shared IPv4 は他の Fly.io アプリと共有される。より厳密なアクセス制限が必要な場合は Fly.io の Dedicated IPv4 を割り当てるか、Meilisearch の API キー認証に頼る。
6. API キーの取得
Meilisearch は起動時にマスターキーから Default Search API Key と Default Admin API Key を自動生成する。
# Production
curl -s http://localhost:7700/keys \
-H "Authorization: Bearer <PROD_MEILI_MASTER_KEY>" \
| jq '.results[] | {name, key}'
# Staging
curl -s http://localhost:7701/keys \
-H "Authorization: Bearer <STG_MEILI_MASTER_KEY>" \
| jq '.results[] | {name, key}'
Admin API Key を Fly.io API サーバーの MEILISEARCH_API_KEY に設定する。
7. Fly.io API への環境変数設定
# Production
fly secrets set \
"MEILISEARCH_HOST=http://`<HETZNER_VM_IP>`:7700" \
"MEILISEARCH_API_KEY=<Production Admin API Key>" \
-a subseek-api
# Staging
fly secrets set \
"MEILISEARCH_HOST=http://`<HETZNER_VM_IP>`:7701" \
"MEILISEARCH_API_KEY=<Staging Admin API Key>" \
-a subseek-api-staging
運用コマンド
コンテナの状態確認
ssh root@`<HETZNER_VM_IP>` docker ps
ログ確認
# Production
ssh root@`<HETZNER_VM_IP>` docker logs meilisearch-production --tail 50
# Staging
ssh root@`<HETZNER_VM_IP>` docker logs meilisearch-staging --tail 50
Meilisearch バージョンアップ
Staging で先に検証してから Production に適用する。
ssh root@`<HETZNER_VM_IP>` bash <<'REMOTE'
# Staging を先にアップグレード
docker stop meilisearch-staging
docker rm meilisearch-staging
docker pull getmeili/meilisearch:v1.14 # 新バージョン
docker run -d \
--name meilisearch-staging \
--restart unless-stopped \
-p 7701:7700 \
-v /opt/meilisearch/data/staging:/meili_data \
-e MEILI_MASTER_KEY="<STG_MEILI_MASTER_KEY>" \
-e MEILI_ENV=development \
getmeili/meilisearch:v1.14
# 動作確認後、Production も同様に実施
REMOTE
マスターキーの確認
マスターキーを忘れた場合、コンテナの環境変数から確認できる。
docker inspect meilisearch-production --format '{{range .Config.Env}}{{println .}}{{end}}' | grep MEILI_MASTER_KEY
docker inspect meilisearch-staging --format '{{range .Config.Env}}{{println .}}{{end}}' | grep MEILI_MASTER_KEY
ローカル開発
ローカルではリポジトリルートの docker-compose.yml で Meilisearch を起動する。
本番 (Hetzner) と同じ getmeili/meilisearch:v1.13 を使用し、MEILI_ENV=development で立ち上げる。
なお、pnpm dev を実行すると scripts/check-prerequisites.sh が自動で Meilisearch の起動状態を確認し、未起動であればバックグラウンドで立ち上げるため、通常は明示的な起動コマンドは不要。
起動・停止
# バックグラウンド起動
docker compose up -d meilisearch
# ログ確認
docker compose logs -f meilisearch
# ヘルスチェック
curl http://localhost:7700/health # → {"status":"available"}
# 停止(データは維持)
docker compose down
# 停止してボリュームも削除(インデックス初期化)
docker compose down -v
環境変数
ローカル開発時の apps/api/.env には以下を設定する(apps/api/.env.example 参照)。
| 変数 | 値 |
|---|---|
MEILISEARCH_HOST | http://localhost:7700 |
MEILISEARCH_API_KEY | local-dev-meilisearch-key(docker-compose.yml の MEILI_MASTER_KEY デフォルト値と一致) |