🛒

EC-CUBEをTiDB Serverlessで動かす

2024/09/08に公開

TiDB ServerlessをWordpressで動かした例はいくつかあるので、他のアプリケーションでも動作するのかを確認してみます。広く使われているアプリケーションとして、ec-cube4 を動かしてみたいと思います。

なるべく環境に依存せず確認できるように、dockerを利用して実行することにします。

ビルド

まず公式githubをcloneします。

Dockerでのビルド、実行方法は公式ドキュメントを参考にしています。

TiDB ServerlessはSSLでの接続が必須のため、doctrineのオプションを指定する必要がありました。こちらの記事を参考に、/app/config/eccube/packages/doctrine.yaml を書き換えます。

/app/config/eccube/packages/doctrine.yaml
doctrine:
    dbal:
        driver: 'pdo_sqlite'
        server_version: "%env(DATABASE_SERVER_VERSION)%"
        charset: '%env(DATABASE_CHARSET)%'

        # for mysql only
        default_table_options:
            charset: 'utf8mb4'
            collation: 'utf8mb4_bin'

        # With Symfony 3.3, remove the `resolve:` prefix
        url: '%env(DATABASE_URL)%'

        # types
        types:
            datetime: 'Eccube\Doctrine\DBAL\Types\UTCDateTimeType'
            datetimetz: 'Eccube\Doctrine\DBAL\Types\UTCDateTimeTzType'
        default_connection: 'default'
+        options:
+            !php/const PDO::MYSQL_ATTR_SSL_CA: '%env(SSL_CA)%'

追加したのは最後の2行です。

このあと、docker buildを行います。

docker build -t eccube4-php-apache .

ビルドが完了すればOKです。

設定変更

今回作成したDockerは起動時にスキーマの作成を行うようなので、.env.dist を修正して、起動時にバインドマウントするようにします。(最初 .env にバインドマウントしていたんですが、起動時に上書きされるようでうまくいかなかったです)

###> doctrine/doctrine-bundle ### から ###< doctrine/doctrine-bundle ### までを書き換えます。

.env.dist
###> doctrine/doctrine-bundle ###
# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
# For a sqlite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
# Set "serverVersion" to your server version to avoid edge-case exceptions and extra database calls
- # DATABASE_URL=sqlite:///var/eccube.db
+ DATABASE_URL=mysql://<TIDBユーザー名>:<TiDBパスワード>@gateway01.ap-northeast-1.prod.aws.tidbcloud.com:4000/eccubedb
# DATABASE_URL=postgresql://postgres/eccubedb?user=dbuser&password=secret

# The version of your database engine
- # DATABASE_SERVER_VERSION=3
+ DATABASE_SERVER_VERSION=8.0

# The charset of your database engine
- # DATABASE_CHARSET=utf8
+ DATABASE_CHARSET=utf8mb4

+ SSL_CA=/etc/ssl/certs/ca-certificates.crt
###< doctrine/doctrine-bundle ###

DATABASE_URL ではTiDB Serverlessの接続時の情報を記載します。先ほどdoctrineの設定荷追加した SSL_CA もここで設定します。DockerのOSはDebianなので、Debianのデフォルトルート証明書を使っています。

実行

起動します。先程修正した .env.dis をバインドマウントしています。

docker run --name ec-cube -p "8080:80" -p "4430:443" -v "$(pwd)"/.env.dist:/var/www/html/.env.dist --add-host host.docker.internal:host-gateway eccube4-php-apache

起動途中でスキーマが作成されます。このステップが終わると、TiDB Serverless側でもスキーマが確認できます。

> bin/console doctrine:database:create
Created database `eccubedb` for connection named default
> bin/console doctrine:schema:create

 ! [CAUTION] This operation should not be executed in a production environment!

 Creating database schema...

 [OK] Database schema created successfully!

確認

無事起動できたら、localhost:8080 にアクセスして試してみます。

会員登録なども試してみましたが、正しく動作しているようです。(すべての機能を試してはいませんが)ひとまず動すところまでは成功です。

終わりに

もっと苦労するかもと思ったのですが杞憂でした。EC-CUBEはテーブル数もそれなりにあるので、TiDB Serverlessを使うことで、chat2queryなどの機能を活用したり、Data Serviceを使って他システムと簡単にAPI連携などのメリットも出せるのではないかと思います。

Discussion