EC-CUBEをTiDB Serverlessで動かす
TiDB ServerlessをWordpressで動かした例はいくつかあるので、他のアプリケーションでも動作するのかを確認してみます。広く使われているアプリケーションとして、ec-cube4 を動かしてみたいと思います。
なるべく環境に依存せず確認できるように、dockerを利用して実行することにします。
ビルド
まず公式githubをcloneします。
Dockerでのビルド、実行方法は公式ドキュメントを参考にしています。
TiDB ServerlessはSSLでの接続が必須のため、doctrineのオプションを指定する必要がありました。こちらの記事を参考に、/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 ###
までを書き換えます。
###> 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