こんにちは。MLBお兄さんこと松村です。
この時期のMLBはシーズンオフながら、Winter Meetingが行われトレード市場が活発になっています。
我がヤンキースも2019シーズンに20勝&300奪三振を記録した、いま一番支配力のある投手のゲリット・コールを獲得しましたので、既に来季が楽しみになってきました。
www.nytimes.com
さて、この記事はオルターブース Advent Calendar 2019の21日目の記事です。
adventar.org
20日目の記事は黄色いテープのうちがわでした。
aadojo.alterbooth.com
前回の私の記事ではNode.js製のヘッドレスCMSの「strapi」をAzureにデプロイする方法についての記事を書きました。
aadojo.alterbooth.com
今回は前回の記事で書ききれなかったデータベースについて書きます。
strapiで利用できるデータベース
公式ドキュメントによると、strapiでは以下のデータベースを利用することができます。
- PostgreSQL
- SQLite
- MySQL
- MariaDB
- MongoDB
SQLiteはあくまで開発用として使うので、実運用環境で使うにはPostgreSQL, MySQL, MariaDB, MongoDBのどれかを使うことになります。
Microsoft Azureが提供するデータベースサービスでは、Azure SQL Databaseが最もポピュラーだと思いますが、strapiは今のところ対応していません。
そのため、他のデータベースサービスを使う選択肢になります。
データベース | Azureのサービス | ドキュメント |
---|---|---|
PostgreSQL | Azure Database for PostgreSQL | https://azure.microsoft.com/ja-jp/services/postgresql/ |
MySQL | Azure Database for MySQL | https://azure.microsoft.com/ja-jp/services/mysql/ |
MariaDB | Azure Database for MariaDB | https://azure.microsoft.com/ja-jp/services/mariadb/ |
MongoDB | Azure Cosmos DB | https://azure.microsoft.com/ja-jp/services/cosmos-db/ |
では早速Azure Database for PostgreSQLを例に、データベースに接続するstrapiのアプリケーションを作ってみましょう。
なお、Azure Database for PostgreSQLのリソースを作成したあと、自身のIPアドレスからの接続を許可する設定を行っておきましょう。
Re:ゼロから始めるDB接続
まずはCLIでstrapiアプリケーションを作る際に、PostgreSQLに接続する設定を入れてみましょう。
ちなみにMySQLもMariaDBも同じです。
$ yarn create strapi-app my-project yarn create v1.19.2 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh packages... success Installed "create-strapi-app@3.0.0-beta.18.1" with binaries: - create-strapi-app Creating a new Strapi application at /mnt/d/src/yuta/strapi/sample/my-project. ? Choose your default database client postgres ? Database name: (データベース名を入力します) ? Host: (ホスト名を入力します) ? Port: (ポート番号を入力します) ? Username: (ユーザー名を入力します) ? Password: (パスワードを入力します) ? Enable SSL connection: No Creating a project with custom database options. Creating files. Dependencies installed successfully. Your application was created at /mnt/d/src/yuta/strapi/sample/my-project. Available commands in your project: yarn develop Start Strapi in watch mode. yarn start Start Strapi without watch mode. yarn build Build Strapi admin panel. yarn strapi Display all available commands. You can start by doing: cd /mnt/d/src/yuta/strapi/sample/my-project yarn develop Done in 675.37s.
アプリケーションが出来上がったら package.json
を見てみましょう。
PostgreSQLクライアントであるpgが一緒にインストールされていることがわかります。
{ "name": "my-project", "private": true, "version": "0.1.0", "description": "A Strapi application", "scripts": { "develop": "strapi develop", "start": "strapi start", "build": "strapi build", "strapi": "strapi" }, "devDependencies": {}, "dependencies": { "strapi": "3.0.0-beta.18.1", "strapi-admin": "3.0.0-beta.18.1", "strapi-utils": "3.0.0-beta.18.1", "strapi-plugin-content-type-builder": "3.0.0-beta.18.1", "strapi-plugin-content-manager": "3.0.0-beta.18.1", "strapi-plugin-users-permissions": "3.0.0-beta.18.1", "strapi-plugin-email": "3.0.0-beta.18.1", "strapi-plugin-upload": "3.0.0-beta.18.1", "strapi-connector-bookshelf": "3.0.0-beta.18.1", "knex": "<0.20.0", "pg": "latest" }, "author": { "name": "A Strapi developer" }, "strapi": { "uuid": "f7c7fda9-1790-448e-a1e0-c857c1d8a001" }, "engines": { "node": ">=10.0.0", "npm": ">=6.0.0" }, "license": "MIT" }
また、データベースへの接続情報は /config/environments/development/database.json
に記載されています。
{ "defaultConnection": "default", "connections": { "default": { "connector": "bookshelf", "settings": { "client": "postgres", "database": "入力したデータベース名", "host": "入力したホスト名", "port": 入力したポート番号, "username": "入力したユーザー名", "password": "入力したパスワード" }, "options": {} } } }
この状態で yarn develop
を実行してアプリケーションを開始するとテーブルが自動的に作成されます。
以下はアプリケーション実行後にPostgreSQLにできあがったテーブルです。
strapi=> \d List of relations Schema | Name | Type | Owner --------+-------------------------------------+----------+----------------- public | core_store | table | yuta public | core_store_id_seq | sequence | yuta public | pg_buffercache | view | azure_superuser public | pg_stat_statements | view | azure_superuser public | strapi_administrator | table | yuta public | strapi_administrator_id_seq | sequence | yuta public | upload_file | table | yuta public | upload_file_id_seq | sequence | yuta public | upload_file_morph | table | yuta public | upload_file_morph_id_seq | sequence | yuta public | users-permissions_permission | table | yuta public | users-permissions_permission_id_seq | sequence | yuta public | users-permissions_role | table | yuta public | users-permissions_role_id_seq | sequence | yuta public | users-permissions_user | table | yuta public | users-permissions_user_id_seq | sequence | yuta (16 rows)
MySQLとMariaDB
MySQLとMariaDBは同じ構成になります。
まず、データベースクライアントはMySQLのものを使います。
/config/environments/development/database.json
の connections/default/settings/client
は "mysql"
になります。
接続情報をどのように指定するか
database.json
にデータベースの接続情報が載っていますが、例えばこのままソースコードをGitHubなどに公開してしまうと、他の人に接続情報を知られてしまいます。
場合によっては悪用の危険もあります。
(Azure Databaseのファイアウォールによってアクセス制限は入れていますが)
そのため database.json
に記載する接続情報は、下記のように環境変数で指定することが好ましいでしょう。
{ "defaultConnection": "default", "connections": { "default": { "connector": "strapi-hook-bookshelf", "settings": { "client": "mysql", "host": "${process.env.DATABASE_HOST}", "port": "${process.env.DATABASE_PORT}", "database": "${process.env.DATABASE_NAME}", "username": "${process.env.DATABASE_USERNAME}", "password": "${process.env.DATABASE_PASSWORD}" }, "options": {} } } }
ローカルで実行する際はコマンドラインで環境変数を指定します。
NODE_ENV=development \ DATABASE_HOST=(ホスト名) \ DATABASE_PORT=(ポート番号) \ DATABASE_NAME=(データベース名) \ DATABASE_USERNAME=(ユーザー名) \ DATABASE_PASSWORD=(パスワード) \ yarn develop
Azure WebApp for Containerで環境変数を指定する
実際にAzure WebApp for Containerでstrapiを実行する場合、コマンドラインで環境変数を指定することはできません。
そのためポータルから設定情報に環境変数を指定します。
以上でstrapiを色んなRDBに接続する方法をまとめました。お試しあれ。