さくらVPSでmariaDB + nginxをDockerで

なぜDockerなのか

試行錯誤したいからです。

構成

OS:Ubuntu 20.04
スクリプト:Setup and update
 ー初回起動時にパッケージ更新する:する
 ー日本語環境 ja_JP.UTF-8 に変更する:する

準備

アップデートなどしていきます。

sudo apt update
sudo apt upgrade

Docker

sudo apt docker.io

Docker-compose

sudo apt docker-compose

docker-compose.yml

太字部分は適宜、変更してください。
特にmariaDBは、ポート番号を変更してください。
バージョンを固定する必要ないならlatestとかでも大丈夫じゃないでしょうか。(試してない)
できればstable(安定版)にすることをおすすめします。

version: '3'

services:
  db:
    image: mariadb:11.0.2
    environment:
      MYSQL_ROOT_PASSWORD: Password
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - ./mysql/data:/var/lib/mysql
  web:
    image: nginx:1.24.0
    volumes:
      - ./nginx/templates:/etc/nginx/templates
    ports:
      - "8080:80"
    environment:
      - NGINX_HOST=www.domain.net
      - NGINX_PORT=80

アクセス

パケットフィルタリングを有効にしている場合は通すようにしましょう。
mariaDBのユーザIDとパスワードは、上記のymlの設定ならroot/Passwordです。

当然ながら、外部からアクセスする場合にはドメインが必要になります。
(もしくはIPアドレス指定ですかね)

まとめ

とりあえず、アクセスできることだけ確認しました。
アプリの実装やデプロイ自動化などについては、また今度。

さくらVPSのWordPress環境にSSL証明書を設定

1.経緯

先日作成した当サイトの管理者ページにログインしようとしたところ、
「保護されていない通信」と表示されたため、
「おいおい、ログイン情報が保護されていないのは不味いんじゃない?」と思って。

2.「Let’s Encrypt」のSSL証明書を発行

かといって、長続きするか分からないサイトのために有料の証明書を購入するのは、
ちょっと、いや、かなり躊躇われる。

なので、無料でどうにかならないかと調べてみると、、、
「Let’s Encrypt」なるものが使えるらしいじゃないですか!

しかもおあつらえ向きなことに、KUSANAGIならコマンドが用意されていて、
更新までやってくれて、ちょうど構築した環境もKU☆SA☆NA☆GI!!

これは使うしかないということでさっそく!

kusanagi ssl --email [EmailAddress] [Profile]

ところが、、、

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
~省略~
Detail: Invalid response from
http://xxxxxx.com/.well-known/acme-challenge/QEqWBDKJkUucWcuZGr942OUJxwxY5riqaU0iUFCEJns
~省略~
To fix these errors, please make sure that your domain name was
entered correctly and the DNS A/AAAA record(s) for that domain
contain(s) the right IP address.
Cannot get Let\'s Encrypt SSL Certificate files.
失敗しました。

なんじゃこりゃってことですよ。。。

3.解決

いろんなサイトを見まくって頑張りました。
どんなエラーかというと、
証明書発行時にDocumentRoot配下のディレクトリにファイルを配置して、
そのファイルが参照できるかな?って見てるらしいです。

で、私の場合は、証明書発行コマンドが判断したドメインがアクセス可能なドメインじゃなかった!!!
(「xxxxxx.com」じゃなくて「www.xxxxxx.com」だったのさ)

参照権限がどうのこうのとかあったので、かなり惑わされてしまいましたよ。。

まぁ、なんにせよ/etc/nginx/conf.dに移動して、
該当プロファイルのhttp.confにサーバーネームを追加。
※再起動をお忘れなく!(kusanagi nginx)

server_name www.xxxxxx.com;
↓
server_name xxxxxx.com www.xxxxxx.com;

あとは、証明書発行コマンドを再実行すれば...Congratulations!!!

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
~省略~
IMPORTANT NOTES:
Congratulations! Your certificate and chain have been saved at:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Your key file has been saved at:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Your cert will expire on yyyy-mm-dd. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew all of your certificates, run
"certbot-auto renew"
If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
証明書の自動更新を有効にします
nginx/httpd の設定を変更し、再起動しました。
完了しました。

4.最後の仕上げ

あとはhttpをhttpsにリダイレクトしてあげればOKなので、
/etc/nginx/conf.dに移動して、
該当プロファイルのhttp.confのコメントアウトを除去!
※再起動をお忘れなく!(kusanagi nginx)

# rewrite ^(.*)$ https://www.xxxxxx.com$uri permanent; # SSL ONLY
↓
rewrite ^(.*)$ https://www.xxxxxx.com$uri permanent; # SSL ONLY