2020年9月6日日曜日

Docker環境のWP Offload Mediaでminio(s3互換)に画像を保存する


Docker環境のWordPressで、WP Offload Mediaプラグインを試します。

WP Offload Mediaプラグインを使用すると、画像を AWSのS3に保存できますが、今回は、
S3互換の minioを使用して、Docker環境のminioに画像を保存したいと思います。
下記URLを参考にしました。


作業環境


私の作業環境は以下のとおり。
Windows10のWSL2(ubuntu20.04)で作業します。
なお、Dockerは、ubuntuにインストールして起動しています。(Docker Desktopではない)
  • Windows10
  • WSL2(ubuntu20.04)
  • docker 19.03.12

docker-compose


WordPressの検証環境を docker-compose で作ります。
docker-compose.yml を下記のように作成しました。
version: "3"
services:

  # wordpress
  wordpress:
    image: wordpress
    container_name: wordpress
    hostname: wordpress
    volumes:
      - ./wordpress:/var/www/html
    restart: always
    depends_on:
      - mysql
    network_mode: host
    expose:
      - 80
    environment:
      WORDPRESS_DB_HOST: 172.30.0.10:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: P@ssw0rd

  # aws s3 mock
  minio:
    image: minio/minio
    container_name: minio
    hostname: minio
    volumes:
      - ./minio:/data
    restart: always
    network_mode: host
    expose:
      - 9000
    environment:
      MINIO_ACCESS_KEY: key00000
      MINIO_SECRET_KEY: key00000
    command: server /data

  # mysql database
  mysql:
    image: mysql:5.7
    container_name: mysql
    hostname: mysql
    volumes:
      - ./mysql:/var/lib/mysql
    restart: always
    networks:
      app_net:
        ipv4_address: 172.30.0.10
    environment:
      MYSQL_ROOT_PASSWORD: P@ssw0rd!!
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: P@ssw0rd

  # mysql admin gui
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    hostname: phpmyadmin
    restart: always
    links:
      - mysql
    ports:
      - 18080:80
    networks:
      app_net:
        ipv4_address: 172.30.0.20
    environment:
      PMA_HOST: 172.30.0.10

networks:
  app_net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.30.0.0/24

下記のようにコマンドを実行すると起動します。
$ docker-compose up -d


各画面には下記URLでアクセスします。
  • WordPress
    http://localhost
  • minio (S3互換)
    http://localhost:9000
  • PhpMyAdmin (MySQL管理)
    http://localhost:18080

WordPressのインストール


ブラウザで http://localhost にアクセスすると、下図のように表示されます。
[日本語]を選択して[次へ]をクリック


下図のように入力して[WordPressをインストール]をクリック


下図のように表示されたらインストール完了です。


WP Offload Mediaプラグインのインストール


WordPress管理画面の[プラグイン]>[新規追加]をクリックすると下図の画面が表示されます。
[キーワード]に "s3" を入力すると、「WP Offload Mediaプラグイン」が表示されるので、[今すぐインストール]をクリックします。


インストールが完了したら[有効化]をクリックします。


wp-config.php を修正します。
ファイルの場所は、"<docker-compose.ymlのあるDIR>/wordpress/wp-config.php" です。
下記のように docker-compose.yml で設定したアクセスキー、シークレットキーを追記します。
define( 'AS3CF_SETTINGS', serialize( array(
        'provider' => 'aws',
        'access-key-id' => 'key00000',
        'secret-access-key' => 'key00000',
) ) );
追記した場所は下図のとおり。


WP Offload Media Tweaksプラグインのインストール


プラグインのディレクトリに移動します。
$ <docker-compose.ymlのあるDIR>/wordpress/wp-content/plugins

下記コマンドでプラグインをダウンロードし、オーナを変更します。
$ sudo git clone https://github.com/deliciousbrains/wp-amazon-s3-and-cloudfront-tweaks.git
$ sudo chown -R www-data.www-data wp-amazon-s3-and-cloudfront-tweaks

WordPressの管理画面でプラグインを有効化します。


下記ファイルを修正します。
  • <docker-compose.ymlのあるDIR>/wordpress/wp-content/plugins/wp-amazon-s3-and-cloudfront-tweaks/amazon-s3-and-cloudfront-tweaks.php
add_filter のコメントを下図のように削除して有効化します。
minio_s3_url_domain のフィルタは、エラーになるので有効にしませんでした。


minio_s3_client_args() のホスト名とポートを下図のように変更します。


minio_s3_url_domain() のホスト名とポートを下図のように変更します。
(たぶん、必要ないと思うが、念のため変更しました)


minio_s3_console_url() のホスト名とポートを下図のように変更します。


WP Offload Mediaプラグインの設定


WordPress管理画面でプラグインの設定を開きます。


試しに[Browse existing buckets]をクリックして、既存のバケットを表示してみます。


まだ、minioにはバケットを作成していないので、
当然、バケットは存在しません。
[Create new bucket] をクリックしてバケットを作成します。


[Bucket]にバケット名を入力して、[Create New Bucket]をクリックします。


下図のように表示されたら設定完了です。


動作確認


WordPressの管理画面で[メディア]から画像をアップロードします。
メディアライブラリにアップロードした画像が表示されたらOKです。


アップロードした画像の詳細を参照し、
ファイルのURLが minio (http://localhost:9000)であればOKです。


minio を見てみます。
http://localhost:9000 にアクセスします。
docker-compose.yml に記載したアクセスキー(key00000)とシークレットキー(key00000)でログインできます。


下図のように画像が格納されていればOKです。