😇

Certbot&Nginx&Dockerを使ってMeilisearchをSSL化する

2023/05/08に公開

概要

  • 諸事情でLet's Encryptの証明書管理を管理してくれるサービスが使えない(涙)
    • いずれ使う予定なのでまぁ良い
  • 泣く泣く Certbotを用意した
  • あくまで検証用に用意したものなので、プロダクションで利用するにはもっとやらんといけんことがありまぁーす
    • 証明書更新は別途やる(もしかしたらあとから追記するかも)
  • その時の雑メモ

事前準備

  • GCPのCompute Engine(E2 / Debian11 bullseye)でインスタンスを用意
  • ドメインの用意
  • Aレコードの用意(meilisearch-test.godzilla.love)

今回は僕が昔取得したドメイン godzilla.love のAレコードを作成して、クラウドサービスのインスタンスのIPアドレスを登録しました。

DDoSしないでね(もうアクセスできないと思うけど)

https://twitter.com/BugBountyCutter/status/1393194826057850889

手順

docker install

ここからコピペ(なので、下記URLをちゃんとみてください)
https://docs.docker.com/engine/install/debian/

$ sudo apt update -y
$ sudo apt-get remove docker docker-engine docker.io containerd runc
$ sudo apt-get install     ca-certificates     curl     gnupg
$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg
$ echo   "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" |   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update -y
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

確認

$ sudo docker run --rm hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
719385e32844: Pull complete 
Digest: sha256:9eabfcf6034695c4f6208296be9090b0a3487e20fb6a5cb056525242621cf73d
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

docker-compose.ymlの準備

$ touch docker-compose.yml

中身

  • meilisearch-test.godzilla.love が独自ドメインになるので、適宜修正してください
  • また、pemファイルのマウントは後続処理で作成後に作業するのでコメントアウトしてください
  • getmeili/meilisearch:prototype-japanese-1 は日本語対応版(説明は端折る)なので、latest使いたい場合はそれに変更してください
services:
  nginx:
    image: nginx:latest
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./dist:/dist
      # - /etc/letsencrypt/live/meilisearch-test.godzilla.love/fullchain.pem:/etc/nginx/conf.d/fullchain.pem
      # - /etc/letsencrypt/live/meilisearch-test.godzilla.love/privkey.pem:/etc/nginx/conf.d/privkey.pem

  meilisearch:
    image: getmeili/meilisearch:prototype-japanese-1
    volumes:
      - ./meili_data:/meili_data
    ports:
      - 7700:7700
    env_file:
      - .env

  certbot:
    image: certbot/certbot:latest
    container_name: certbot
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - /etc/letsencrypt:/etc/letsencrypt
      - ./dist:/dist
    command: ["--version"]

ディレクトリやファイルも作成しておく

$ mkdir ./nginx/
$ touch ./nginx/default.conf
$ mkdir ./dist
$ touch ./dist/index.html

nginxファイルを用意する

server {
    server_name meilisearch-test.godzilla.love;

    listen 80;
    listen [::]:80;

    location ^~ /.well-known {
        root /dist/;
    }

    location / {
        return 301 https://$host$request_uri;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

# server {
#     server_name meilisearch-test.godzilla.love;
# 
#     listen 443 ssl http2;
#     listen [::]:443 ssl http2;
# 
#     ssl_certificate      /etc/nginx/conf.d/fullchain.pem;
#     ssl_certificate_key  /etc/nginx/conf.d/privkey.pem;
#     ssl_session_timeout 1d;
#     ssl_session_cache shared:SSL:10m;
#     ssl_session_tickets off;
# 
#     ssl_protocols TLSv1.3 TLSv1.2;
#     ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
#     ssl_prefer_server_ciphers off;
# 
#     add_header Strict-Transport-Security "max-age=2592000" always;
# 
#     location / {
#         proxy_pass  http://meilisearch:7700;
#     }
# }

.envファイルの用意

$ touch .env

中身

MEILI_MASTER_KEY は適宜環境によって変更してください。
※Python3だったらすぐできる

$ python3 -c "import uuid; print(uuid.uuid4())"
9f444607-1c67-4e44-ab6b-44b3db200b49

master keyは16バイト以上であれば何でも良い(と思っています)

https://www.meilisearch.com/docs/learn/security/master_api_keys#protecting-a-meilisearch-instance

MEILI_ENV=production
MEILI_MASTER_KEY=9f444607-1c67-4e44-ab6b-44b3db200b49
MEILI_NO_ANALYTICS=false
MEILI_LOG_LEVEL=INFO
MEILI_SCHEDULE_SNAPSHOT=86400

Certbotの設定

$ sudo docker compose up -d
$ sudo docker compose run --rm certbot certonly -d meilisearch-test.godzilla.love --webroot -w /dist

メールアドレスを初回入力する必要があると思います。

Successfully received certificate.~ みたいな表示がでればおkです。(たぶん)

SSL周りのコメントアウト外して再度 docker compose up

$ sudo docker compose down

docker-compose.ymlの準備nginxファイルを用意する でコメントアウトしてた箇所を外す

これで起動したらおk

$ sudo docker compose up -d

動作確認

$ curl -s https://meilisearch-test.godzilla.love/ | jq .
{
  "status": "Meilisearch is running"
}

おk

やり直す場合

https://ex1.m-yabe.com/archives/4670

$ sudo docker compose down
$ sudo rm -rf  /etc/letsencrypt/archive/meilisearch-test.godzilla.love
$ sudo rm -rf  /etc/letsencrypt/live/meilisearch-test.godzilla.love
$ sudo rm -rf  /etc/letsencrypt/renewal/meilisearch-test.godzilla.love.conf 
$ sudo cp -pr /etc/letsencrypt /var/tmp
$ sudo docker compose run --rm certbot delete
CBcloud Tech Blog

Discussion