メインコンテンツまでスキップ

Meilisearch セットアップ

Hetzner US(Ashburn)の VPS で Meilisearch を Docker セルフホストする手順。

サーバー情報

項目
プロバイダーHetzner Cloud
プロジェクトsubseek
サーバー名meilisearch
ロケーションAshburn, VA(us-east)
プランCPX22(Shared, Regular Performance)
OSUbuntu 24.04
IPv4<HETZNER_VM_IP>

コンテナ構成

1台の VM 上で Production / Staging の2コンテナを起動する。

環境コンテナ名ポートMEILI_ENV
Productionmeilisearch-production7700production
Stagingmeilisearch-staging7701development
Developmentローカル Docker7700development

初回セットアップ手順

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_HOSThttp://localhost:7700
MEILISEARCH_API_KEYlocal-dev-meilisearch-keydocker-compose.ymlMEILI_MASTER_KEY デフォルト値と一致)