このサイトはWordPressをAzureのAppServiceのフリープラン+CDNで細々と運用していまが、あまりお金をかけてないためWordPressが不安定なところが否めず。何かよい引っ越し先はないかと「軽量で無料なCMSを探しています」的な質問を Copilot に尋ねてみたわけです。

すると福岡発の純国産CMSであるOneThirdCMS(公式ページ https://onethird.net/)を推してくるではありませんか。SQLiteもサポートしていてDBサーバを必須としていないところもポイント高い。というわけで、さっそく試してみることにしました。
結論から言うとうまく行かなかったのですが、紆余曲折あり長くなったので記録もかねてここに記しておきます。
Dockerコンテナで動かす
ダウンロード資材は2種類あって、1つはWindowsPCでWebサーバを起動してその上でOneThirdCMSを動かすもの。もう1つはWebサーバ上で動くオンラインインストーラ。
私のゴールは Azure
の AppService
(F1
プラン)で単一コンテナで動かすことなので後者を使うことにします。Docker
公式の php
の apache
コンテナを動かせばすぐに使えるかと思ったのですが・・・
mod_rewrite
が必須(=Apache
で動かすことが前提)。これがクリア。SQLite
で稼働する予定でもpdo_mysql
が有効になっている必要あり。- オンラインインストールでzip展開するのでzipが有効になっている必要あり。
PHP8.2
から導入された仕様「動的プロパティの作成が非推奨」により"Deprecated: Creation of dynamic property Ut::$circle is deprecated in /var/www/html/module/utility.php on line 296 OneThird CMS"
というようなエラーが発生するのでPHP8.1
で動かす。
ということで php:8.1-apache-bookworm
をベースに Dockerfile
を作成しました。
FROM php:8.1-apache-bookworm
# Install zip & mysql
# Install required packages
RUN apt-get update && apt-get install -y libzip-dev locales
# Install PHP extensions
RUN docker-php-ext-install zip pdo_mysql
# Set up Japanese locale
RUN sed -i '/^# *ja_JP.UTF-8 UTF-8/s/^# *//g' /etc/locale.gen && \
locale-gen && \
update-locale LANG=ja_JP.UTF-8
ENV LC_ALL=ja_JP.UTF-8
# Set timezone to Asia/Tokyo
RUN apt-get install -y tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
echo "Asia/Tokyo" > /etc/timezone
# Set cron
RUN apt-get install -y cron
# Set rsync
RUN apt-get install -y rsync
# enable rewrite
RUN a2enmod rewrite
# custom php entrypoint
COPY custom-php-entrypoint "/usr/local/bin/"
RUN chmod +x "/usr/local/bin/custom-php-entrypoint"
ENTRYPOINT [ "/usr/local/bin/custom-php-entrypoint" ]
CMD ["apache2-foreground"]
WORKDIR /var/www/html
Docker勉強中なのでイケてないところがあるかもしれません。
githubのプライベートレポジトリにまとめていますが、GitHub Actions の勉強もかねて Docker Hubへ公開しています(https://hub.docker.com/r/komina77/onethirdcms)。使い方らしきものも書きました。
なぜ App Service の PHP8.1 を使わないか
App Service
のPHP8.1
で動かせばいいじゃないか、と思われるかもしれません。FTPSで公開用ディレクトリにオンラインインストーラ index.php
を置くだけ済みそうです。
でもダメでした。
公開用のディレクトリ /home
は Azure Files
の CIFS/SMB
をマウントして永続化していて、そのために POSIX
のファイル操作の原子性や即時反映が期待通りに動作しなかったようです。(writableチェックとして、ファイルを複製して、元ファイルを削除、直後に再作成、でエラーになっている。ここまで念入りにチェックしていることにビックリした)
Webサーバも nginx
を使っているようなので上記をクリアしてもおそらく mod_rewrite
の問題で不可。
というわけで カスタムコンテナで PHP8.1 + Apache
を動かす選択をするに至りました。コンテナ内のファイルシステムであればPOSIX準拠の動作になりますのでオンラインインストーラのチェックはクリアするかと。一方でファイルは一時ストレージに保持されることになるため、コンテナ停止時には /home
へデータを退避は必要。
Azure App Serviceで動かす
Azure で リソースの作成>Web アプリ でリソースを作成します。公開方法を「コンテナ」、OSはLinux、価格プランを「Free F1(共通インフラストラクチャ)」を選びます。
App Serviceの設定をする
設定>環境変数
変数名 | 設定値 | 説明 |
---|---|---|
WEBSITES_ENABLE_APP_SERVICE_STORAGE | true | App Service機能。 コンテナ内 /home 配下が永続化されFTPでアクセスできる。 |
BACKUP_DIR | /home/backup | komina77/onethirdcms 向け設定。永続化対象のディレクトリを意識する。 |
BACKUP_CRON | 0 * * * * | komina77/onethirdcms 向け設定。cron書式。永続化のスケジュール。0 * * * * は毎時0分ごと。 |
設定>構成
- FTPを使えるようにする。
- SCM基本認証の発行資格情報をON
- FTP基本認証の発行資格情報をON
- FTPの状態をFTPSのみ
- デプロイ>デプロイセンター>FTPS資格情報 に有効な値が表示されるのでFTPクライアントに登録する。
デプロイ>デプロイセンター>設定
項目 | 設定値 |
---|---|
ソース | Container Registry |
コンテナの種類 | 単一コンテナー |
レジストリ ソース | Docker Hub |
リポジトリ アクセス | パブリック |
完全なイメージの名前とタグ | komina77/onethirdcms:latest |
スタートアップファイルまたはコマンド | 空欄 |
継続的デプロイ | OFF |
WebhookURL | 空欄 |
準備作業
komina77/onethirdcms
ではコンテナ起動時に ${BACKUP_DIR}/backup.sh
、コンテナ停止時に ${BACKUP_DIR}/restore.sh
が実行されるようになっています。また、${BACKUP_CRON}
が設定されていれば定期的に ${BACKUP_DIR}/restore.sh
が実行されます。
komina77/onethirdcms
では /var/www/html
配下がサイトとして公開されるようになっているので、${BACKUP_DIR}/data
と /var/www/html
の間でファイルを同期するようなスクリプトを用意しておくことで公開資材を永続化することができるという仕組みです。
そこで、FTPクライアントから以下のスクリプトを保存したファイルを /${BACKUP_DIR}
から /home
を除いたディレクトリにアップロードしておきます。(${BACKUP_DIR}=/home/backup
であれば、/backup/backup.sh
, /backup/restore.sh
という感じです)
#!/bin/sh
# 環境変数チェック
if [ -z "$BACKUP_DIR" ]; then
echo "Error: BACKUP_DIR environment variable is not set"
exit 1
fi
# ソースディレクトリ確認
SRC_DIR="/var/www/html"
if [ ! -d "$SRC_DIR" ]; then
echo "Error: Source directory $SRC_DIR does not exist"
exit 1
fi
# バックアップ先ディレクトリ作成
DEST_DIR="$BACKUP_DIR/data"
mkdir -p "$DEST_DIR"
if [ $? -ne 0 ]; then
echo "Error: Failed to create backup directory $DEST_DIR"
exit 1
fi
# バックアップ実行
echo "$(date '+%Y-%m-%d %H:%M:%S') - Starting backup: $SRC_DIR → $DEST_DIR"
rsync -a --delete "$SRC_DIR/" "$DEST_DIR/"
if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Backup completed successfully"
exit 0
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - Error occurred during backup"
exit 1
fi
#!/bin/sh
# 環境変数チェック
if [ -z "$BACKUP_DIR" ]; then
echo "Error: BACKUP_DIR environment variable is not set"
exit 1
fi
# バックアップソースディレクトリ確認
SRC_DIR="$BACKUP_DIR/data"
if [ ! -d "$SRC_DIR" ]; then
echo "Error: Backup directory $SRC_DIR does not exist"
exit 1
fi
# 復元先ディレクトリ確認/作成
DEST_DIR="/var/www/html"
mkdir -p "$DEST_DIR"
if [ $? -ne 0 ]; then
echo "Error: Failed to create restore destination directory $DEST_DIR"
exit 1
fi
# 復元実行
echo "$(date '+%Y-%m-%d %H:%M:%S') - Starting restore: $SRC_DIR → $DEST_DIR"
rsync -a --delete "$SRC_DIR/" "$DEST_DIR/"
if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Restore completed successfully"
exit 0
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - Error occurred during restore"
exit 1
fi
OneThirdCMSのインストール作業
OneThirdCMSを動かす環境が準備できたらインストール作業を行います。
- OneThirdのダウンロードからオンラインインストーラをダウンロードし解凍する。
- FTPクライアントから解凍したファイル
index.php
を/${BACKUP_DIR}/data
から/home
を除いたディレクトリにアップロードする。 - App Service の 概要 へ
- 開始されてなかったら開始をクリック。
- 参照をクリックすると公開されているURLが別タブで開く。このURLへのアクセスがトリガになってコンテナ起動となる。初回はコンテナのプルから始まるので時間かかります。

[Start Download OneThird CMS] ボタンをクリックするとダウンロードが走ります。

[Install OneThird CMS] ボタンをクリックすると資材が解凍されてインストールが開始されます。1項目ずつチェックが入り、見た目もかっこいいです。

今回はSQLiteを使うので [インストール(SQLite)] をクリック。

Admin ID や Admin password を適当に入れて、jQuery はCDN参照を選んでインストール開始します。

順調にインストールは進み・・・

成功したように思いきやなんかエラーが出てしまった。

うむ。私はPHP5までの人なのだが、どうやら PHP8 で非推奨になった書き方についてのエラーのようだ。PHP8.1からさらにPHP7系に戻すのもセキュリティ的に問題ありですし(PHP8.1もセキュリティサポート切れてますが)、ソースを直してまで稼働するところまで持っていく義理もなく。。
残念だがここで中断することにした。おそらくこういった非推奨エラーになるところを一つ一つ潰していけば、この興味深いCMSは動くようになると思われる。
(よくよく見るとローカルPCで動かす版のPHPもバージョン7のようだ :-))
中途半端になってしまったが、無駄にAzure App Serviceの知識が増えたところで今回はあきらめることにした。長々と読んでいただいた方、結果がパッとせず申し訳ない。