baserCMSという国産のCMSを導入します。もしかするとワードプレスのコンテンツを移行するのにそれほど苦労はないかもしれないというのが導入する理由です。さらに、無料で使える国産のオープンソース・ソフトウェアであるのがうれしいです。AWS、GoogleCloud、Azureなどのクラウドに設置することができます。本日はOracleCloudのインスタンスにDockerを使用してインストールします。ホストのOSはUbuntu22.04です。
まずはphpとapacheのコンテナを起動します。
docker run --name phptest -d php:8.2.0RC6-apache-buster
コンテナの中を解析するため一度テストで立ち上げます。
コンテナに入ってPHPなどのファイルの場所を確認します。
docker exec -ti phpba bash
/var/www/html→ドキュメントルート
/etc/apache2→webサーバーの設定ファイル
/usr/local/etc/php→PHP関連
適当なディレクトリをホストに作成して、コンテナからホストへディレクトリごとファイルを転送します。
mkdir baser
docker cp phptest:/usr/local/etc/php /root/baser/
docker cp phptest:/etc/apache2 /root/baser/
docker cp phptest:/var/www/html /root/baser/
配置場所の確認とファイルの取得をしたのでコンテナを停止して削除します。
docker stop phpba
docker rm phpba
今度は実際に運用できるようにコンテナを起動します。ホストに取得したファイルとコンテナのファイルの場所が合致するようにして起動します。アクセスできるポート番号の指定もします。あとはbaserCMSをコンテナのドキュメントルートに相当するホストのディレクトリに配置します。
docker run \
--name phpba \
--net net1722525 \
-p 8887:80 \
--ip 172.25.25.75 \
-v /root/baser/php:/usr/local/etc/php \
-v /root/baser/apache2:/etc/apache2 \
-v /root/baser/html:/var/www/html \
-d php:8.2.0RC6-apache-buster
外部からアクセスできるように、ホストでファイヤーウォールの設定をします。
ufw allow 8887/tcp
最新版のbaserCMSをダウンロードします。
WindowsPCでダウンロードしたのでTeraTermのSSH SCP機能を利用してLinuxにファイルを転送しました。転送後にファイルを展開します。展開する場所は先に示したコンテナのドキュメントルートです。マウントしたのでホストの対応したディレクトリに展開します。
unzip basercms-4.7.0.zip
ディレクトリ(basercms)付きで解凍されたので意図した場所ではなくなりました。ディレクトリの中身をすべて所定のディレクトリに移動します。
cd /baser/html/basercms
mv * /root/baser/html
ここまでで準備はできたはずです。ブラウザでアクセスします。
ページが表示されない場合は、コンテナ内でapacheのリライト機能を有効にします。
a2enmod rewrite
ステップ2でエラーが発生しました。
ディレクトリに無いファイルにアクセスしています。これはapacheのRewrite機能なので問題はありませんでした。アクセスのあったURLを、正規表現で書き換えてから処理するので、このようになったわけです。
解決方法
後から気が付いたのですが隠しファイルやディレクトリは普通に入力したmvコマンドでは移動できないという重大なミスをしていました。
移動できなかった隠しファイルやディレクトリ
.github .editorconfig .htaccess
これらを所定の場所に配置することで次に進むことができました。PHPモジュールのGDとZIPが不足しているので対処します。
コンテナ内で次のコマンドを入力します。
docker exec -ti phpba bash
docker-php-ext-configure gd zip
しかし、エラーが発生しました。次のコマンドに訂正します。
docker-php-ext-install gd zip
今度は違うエラーが発生しました。
No package ‘zlib’ found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables ZLIB_CFLAGS
and ZLIB_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
そこでコンテナ内で不足しているパッケージをインストールします。
apt install zlib1g-dev
その後再びPHPモジュールのgdとzipをインストールするコマンドを入力します。
No package ‘libpng’ found
エラー内容が変わりました。同様にして不足しているパッケージをインストールしてPHPモジュールをインストールします。
apt install libpng-dev
その後、libzipも不足しているので同様にして対処します。
apt install libzip-dev
これでようやくエラーがなくなりました。ブラウザで再チェックをしますが直りません。この問題はコンテナを再起動することで解決することができました。
docker restart phpba
ブラウザで次に進みます。しかし、MySQLが選択できません。設定ファイルに記述する必要があるようです。設定ファイルの場所は次の通りで、ファイル名は「database.php」です。
app/Config
その前に、新規でデータベースを作成しておきました。さらにデータベースが別コンテナや別サーバーにある場合はユーザーにリモート操作できる許可をしておきます。
外部接続する方法は以前記事にしました。
記述内容
class DATABASE_CONFIG {
public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => '172.25.25.4',
'port' => '3306',
'login' => 'mamushi',
'password' => 'testpass',
'database' => 'baser',
'schema' => '',
'prefix' => '',
'encoding' => 'utf8'
);
ブラウザで戻ってデータベースの設定に進むとエラーが発生しました。この「database.php」はデータベースの選択ページに進んだ時、作成されることが判明しました。さらに、MySQLが表示されないのはPDOが必要であることがわかりました。「database.php」を削除します。
rm database.php
コンテナに入ってPDOをインストールします。
docker-php-ext-install pdo_mysql
忘れずにコンテナを再起動します。この作業でMySQLが選択可能になりました。
MySQLにして次に進むとデータベース情報を入力する画面が表示されます。データベースサーバーは別コンテナにあるのでその情報を入力します。先に述べたようにMySQLで外部接続できるデータベースユーザーを作成しておく必要があります。
実は後から気が付いたのですが、WordPressのコンテナを利用するとPDOだけインストールすれば正常に起動しました。