(個人的に使い勝手の良い)Docker版KUSANAGIを構築する

このブログは元々Conoha VPSのKUSANAGI で運用していたのですが、我が家にProxmoxを導入したため自宅サーバにブログを移設し、Docker版Wordpress、Docker版KUSANAGI を同時に建て検証してみました。
Docker版KUSANAGIの構築でなかなか苦戦したため健忘録として記事に残します。
※おそらく私の設定はKUSANAGI公式が推奨しない設定になると思います。

速度比較の記事を作成しました。
よければこちらもご覧ください。

ハマった事

最初は公式ドキュメント通りに構築しましたが、以下の動作が正しく動きませんでした。

  • WordPressの更新
  • テーマの更新
  • 一部プラグインの動作

結論から書くとパーミッションや所有権の問題でした。
デフォルトだとファイルの所有権がkusanagiになっているのですが、Nginxの実行ユーザがhttpdのためWordpressの更新、テーマの更新、一部プラグインが使うPHPが正しく動かなかったです。

ちなみにPHPのエラーの大部分はchmod()関係だったため以下の内容がとても参考になりました。
https://marunouchi-tech.i-studio.co.jp/3341/
ざっくり言うとchmod()はPHPの実行ユーザが所有しているファイル、ディレクトリにしか使えないって事です。

公式マガジンにセキュリティ対策の意図も書かれていたので、KUSANAGI の推奨設定で使うのであれば、Wprdpressのダッシュボードから更新せずにKUSANAGIプラグインによる自動更新、コマンドによる更新が必要なのかもしれません。

KUSANAGI Runs on Dockerのインストール

KUSANAGI Runs on Docker公式ドキュメント

#サーバのアップデートを行う
apt update -y
apt upgrade -y

公式ドキュメントを参考にdocker、docker compose、docker machineをインストールする。
ubuntuの場合は以下のサイトがとても参考になります。
dockerインストール
docker composeインストール

#gitの設定をする
#gitが入ってない場合はインストールすること
git config --global user.name "ユーザー名を入力"
git config --global user.email メールアドレスを入力
#kusanagi-dockerをインストールする
curl https://raw.githubusercontent.com/prime-strategy/kusanagi-docker/master/install.sh | bash
#kusanagi-dockerのパスを通す
export PATH=/home/<ユーザディレクトリ>/.kusanagi/bin:$PATH

KUSANAGIの構築

以下のコマンドを実行してKUSANAGIのコンテナを構築します。

kusanagi-docker provision --fqdn <ドメイン名> --wplang ja --admin-user <wordpress管理者ユーザ名> --admin-pass <管理者パスワード> <コンテナ名>

ちなみにデータ移行が必要な場合は上のオプションとしてDB名、DBユーザー、DBパスワードを追加すると後々楽です。
他のオプションは公式ドキュメントに書いてあります。

docker-compose.ymlの編集

#コンテナ名ディレクトリに移動し、ドッカーコンテナを一度終了する
cd <コンテナ名>
docker-compose down

docker-compose.ymlのコメント箇所を修正してください。

version: '3'
networks:
  default:
    driver: bridge
    driver_opts:
      com.docker.network.driver.mtu: 9000
services:
  httpd:
    container_name: <コンテナ名>_httpd
    image: primestrategy/kusanagi-nginx:1.21.1-r1
    restart: always
    env_file:
      - .kusanagi
      - .kusanagi.httpd
    volumes:
      - kusanagi:/home/kusanagi:rw #:roを:rwに変更:roがない場合は追加 *1
      - kusanagi:/etc/letsencrypt
      - kusanagi:/var/www/html/.well-known
      - ./nginx/conf.d/mylogs.conf:/etc/nginx/conf.d/mylogs.conf #*2
    ports:
      - "80:8080"
      - "443:8443"
    extra_hosts:
      - "<fqdn値>:127.0.0.1"
## CONFIG
  config:
    container_name: <コンテナ名>_config
    restart: always
    build:
        context: ./wpcli
    user: "1000:1001"
    env_file:
      - .kusanagi
      - .kusanagi.wp
      - .kusanagi.db
    volumes:
      - database:/var/run/mysqld
      - kusanagi:/home/kusanagi:rw #:roを:rwに変更:roがない場合は追加 *1
    command: wp --version
  php:
    container_name: <コンテナ名>_php
    image: primestrategy/kusanagi-php:7.4.22-r0
    restart: always
    env_file:
      - .kusanagi
      - .kusanagi.php
      - .kusanagi.mail
    network_mode: "service:httpd"
    volumes:
      - database:/var/run/mysqld
      - kusanagi:/home/kusanagi:rw #:roを:rwに変更:roがない場合は追加
      - ./php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini #追加 *3
## MYSQL
  db:
    container_name: <コンテナ名>_db
    image: mariadb:10.5.12-focal
    restart: always
    user: "999:999"
    env_file:
      - .kusanagi.mysql
    network_mode: "service:httpd"
    volumes:
      - database:/var/run/mysqld
      - database:/var/lib/mysql
## FTPD
  ftp:
    container_name: <コンテナ名>_ftp
    image: primestrategy/kusanagi-ftpd:1.0.2-r9
    restart: always
    network_mode: "service:httpd"
    env_file:
      - .kusanagi
      - .kusanagi.wp
    volumes:
            - kusanagi:/home/kusanagi:rw #:roを:rwに変更:roがない場合は追加 *1
volumes:
  kusanagi:
  database:

*1:”ro”が付いていると読み取り専用になってしまい書き込みができないため明示的に”rw”を記載して読み書きできるようにします。

*2:以下のサイトを参考にログ出力を変更します。
  https://tomluck.net/building-blog-3/

#ディレクトリとmylog.confを作成する
#mkdir -p ./nginx/conf.d/
#vi ./nginx/conf.d/mylogs.conf
#以下の内容をmylogs.confに記載する
error_log /dev/stderr warn;
access_log /dev/stdout  main;

*3:以下のサイトを参考にwordpressにアップロードできるファイルサイズを変更します。
  https://qiita.com/chiruparu/items/26dc623a089a0eac4aa7

#ディレクトリとuploads.iniを作成する
#mkdir -p ./php/
#vi ./php/uploads.ini
#以下の内容をuploads.iniに記載する
#アップロードサイズは数値を変更することで対応する
file_uploads = On
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600

修正が完了したらコンテナを起動する。

docker-compose up -d

コンテナ内の所有権を修正する

事前に以下のサイトを参考にNginxの実行ユーザを確認しておく。
確認できれば問題ないので私はコンテナに入り直接ファイルを作成しました。

#参考
#dockerコンテナに入る(書き込みを確実にできるようにrootユーザを指定する)
docker exec -it --user root <コンテナ名>_httpd sh
#KUSANAGIのドキュメントルートにファイルを作成する
vi /home/kusanagi/<コンテナ名>/DocumentRoot/user-check.php
#念の為所有権、権限を修正する(使い終わったら削除すること)
chown kusanagi:www /home/kusanagi/<コンテナ名>/DocumentRoot/user-check.php
chmod 777 /home/kusanagi/<コンテナ名>/DocumentRoot/user-check.php
#以下の内容を記載する
<?php
$user = exec('whoami');
$group = exec('groups ' .$user);
echo "ユーザー:{$user}<br>";
echo "グループ:{$group}<br>";
?>

ブラウザからuser-check.phpを開く

※以下の設定をするとkussanagi-configコマンドでエラーが出るようになります。
データ移行などがある場合には事前に行っておく必要があります。
また、KUSANAGIのキャッシュ機能もこのタイミングでオンにしておくことをお勧めします。
もし設定後にデータ移行等kusanagi-configを実行したい場合は所有権をkusanagi:wwwに変更することで対応できます。

コンテナ内の所有権を変更する。

#dockerコンテナに入る
docker exec -it --user root <コンテナ名>_httpd sh
#DocumentRootの所有権を変更する
chown -R httpd:www /home/kusanagi/<コンテナ名>/DocumentRoot/

また、wp-config.phpを修正する。

chmod 777 /home/kusanagi/<コンテナ名>/wp-config.php
vi /home/kusanagi/<コンテナ名>/wp-config.php
#以下の箇所を修正する
#define('FS_METHOD', 'ftpext'); #ここを以下のように
define('FS_METHOD', 'direct');
#以下の箇所も修正する
#define('FTP_PASS', '*****'); #ここを以下のように
define('FTP_PASS', '<KUSANAGIパスワード>');
#ファイルを保存し権限を修正する
chmod 440 /home/kusanagi/<コンテナ名>/wp-config.php
#dockerコンテナから出る
exit

KUSANAGIパスワードはコンテナ名ディレクトリ内の”.kusanagi.wp”内に記載されています。

その後wordpressの管理画面に入り以下ができることを確認します。

  • wordpressの再インストール
  • メディアのアップロード
  • プラグインのインストール

KUSANAGIのセキュリティ警告を修正する

KUSANAGIのセキュリティ設定修正は他の方も書いているのでさらっと書きます。

コンテナに入り設定を変更します。

#dockerコンテナに入る
docker exec -it --user root <コンテナ名>_httpd sh
#wp-contentの所有権、権限を変更する
chown kusanagi:kusanagi /home/kusanagi/probiees/DocumentRoot/wp-content/
chmod 755 /home/kusanagi/probiees/DocumentRoot/wp-content/
#KUSANAGIが利用するファイルの所有権、権限を変更する
chown kusanagi:kusanagi /home/kusanagi/probiees/DocumentRoot/wp-content/advanced-cache.php
chmod 755 /home/kusanagi/probiees/DocumentRoot/wp-content/advanced-cache.php

上記設定でKUSANAGIからの警告が消えているはずです。

最後に

今回の設定でWordpressのダッシュボードからほとんどの機能が使えると思います。
kusanagiの所有権を変更しているためkusanagi関連の機能で何らか問題が起きる可能性がありますが、今のところは大きな問題は起きていないです。

もろもろ設定しましたがkusanagi-configからのバックアップ、リストアが出来ないなど諸々課題があります。
通常のKUSANAGIが利用できるならその方が良いと思います。

コメント

タイトルとURLをコピーしました