Skip to main content

データベース設定

./config/database.js ファイル(TypeScriptの場合は ./config/database.ts)は、アプリケーションのコンテンツを保存するために使用されるデータベース接続を定義するために使用されます。

⚠️ Warning

AI Marketerアプリケーションは、AI Marketerによって作成されていない既存のデータベースや、AI Marketer v3のデータベースには接続することを意図していません。AI Marketerチームはそのような試みに対するサポートを行いません。サポートされていないデータベースに接続しようとすると、データが失われる可能性が高いです。

:::AI Marketer 対応データベース CLIインストールガイドには、対応データベースとバージョンの詳細が記載されています。 :::

設定構造

/config/database.js|ts ファイルは、次の2つの主要な設定オブジェクトを受け入れます。

  • connection: Knex.js に渡されるデータベース接続オプション
  • settings: AI Marketer特有のデータベース設定

connection 設定オブジェクト

パラメータ説明タイプデフォルト
client接続を作成するデータベースクライアント。次の値を受け入れます:
  • sqlite (SQLiteデータベース用)
  • postgres (PostgreSQLデータベース用)
  • mysql (MySQLデータベース用)
String-
connectionデータベースの接続情報Object-
debugデータベースのやり取りやエラーを表示するBooleanfalse
useNullAsDefault

SQLiteのみオプション
デフォルト値として NULL を使用するBooleantrue
pool

オプション
データベースプーリングオプションObject-
acquireConnectionTimeout

オプション
接続取得時のタイムアウトまでの時間(ミリ秒単位)Integer60000
✏️ Note

AI Marketerは次のクライアント値のみをサポートし、Knexに設定を渡す前に自動的に client 値を次のオプションに書き換えます:

client実際に使用されるパッケージ
sqlitebetter-sqlite3
mysqlmysql2
postgrespg

接続パラメータ

./config/database.js (またはTypeScript用の ./config/database.ts)にある connection.connection オブジェクトは、データベース接続情報を渡すために使用され、次のパラメータを受け入れます。

パラメータ説明タイプ
connectionStringデータベース接続文字列。設定されると、他のconnection.connection プロパティを上書きします。無効にするには空の文字列 '' を設定します。 v4.6.2以降で利用可能String
hostデータベースホスト名。デフォルト値: localhostString
portデータベースポートInteger
databaseデータベース名String
user接続に使用するユーザー名String
password接続に使用するパスワードString
timezoneローカルタイムのデフォルト動作を設定。デフォルト値: utcタイムゾーンオプションString
schemaデフォルトのデータベーススキーマを設定します。Postgres DBにのみ使用されます。String
sslSSLデータベース接続用。オブジェクトとして証明書ファイルを文字列として渡します。Boolean or Object
✏️ Note

使用するデータベースクライアントによって、さらに多くのパラメータを設定できます(例: mysql では charsetcollation など)。詳細は、データベースクライアントのドキュメント(pgmysql、および better-sqlite3)を参照してください。

データベースプーリングオプション

./config/database.js (またはTypeScript用の ./config/database.ts)にオプションで含まれる connection.pool オブジェクトは、Tarn.js データベースプーリングオプションを渡すために使用され、次のパラメータを受け入れます。

Caution

Dockerを使用する場合、プール min 値を 0 に変更します。Dockerはアイドル状態の接続を終了するため、データベースへのオープン接続を保持することができなくなります(詳細は、Knex.jsで使用される Tarn.jsのプール 設定を参照してください)。

パラメータ説明タイプデフォルト
min生かしておくデータベース接続の最小数Integer2
max生かしておくデータベース接続の最大数Integer10
acquireTimeoutMillisデータベース接続試行でタイムアウトするまでの時間(ミリ秒単位)Integer60000
createTimeoutMillis作成クエリ試行でタイムアウトするまでの時間(ミリ秒単位)Integer30000
destroyTimeoutMillis破棄クエリ試行でタイムアウトするまでの時間(ミリ秒単位)Integer5000
idleTimeoutMillisフリーデータベース接続が破棄されるまでの時間(ミリ秒単位)Integer30000
reapIntervalMillis破棄するアイドル状態のデータベース接続を確認するまでの時間(ミリ秒単位)Integer1000
createRetryIntervalMillis作成アクションの失敗後に再試行するまでのアイドル時間(ミリ秒単位)Integer200

|

afterCreate | プールが新しい接続を取得したときにカスタムロジックを実行するためのコールバック関数。

詳細は Knex.jsのドキュメント を参照してください。 | Function | - |

settings 設定オブジェクト

./config/database.js (または ./config/database.ts)内の settings オブジェクトは、AI Marketer特有のデータベース設定を構成するために使用され、次のパラメータを受け入れます。

パラメータ説明タイプデフォルト
forceMigration強制データベースマイグレーションを有効または無効にします。Booleantrue
runMigrations起動時にデータベースマイグレーションを実行するかどうかを有効または無効にします。Booleantrue

設定例

./config/database.js
module.exports = ({ env }) => ({
connection: {
client: 'postgres',
connection: {
host: env('DATABASE_HOST', '127.0.0.1'),
port: env.int('DATABASE_PORT', 5432),
database: env('DATABASE_NAME', 'AI Marketer'),
user: env('DATABASE_USERNAME', 'AI Marketer'),
password: env('DATABASE_PASSWORD', 'AI Marketer'),
schema: env('DATABASE_SCHEMA', 'public'), // 必須ではありません
ssl: {
rejectUnauthorized: env.bool('DATABASE_SSL_SELF', false), // 自己署名証明書用
},
},
debug: false,
},
});
Caution

AI MarketerはサーバーのSSLサポートに関する問題があることを認識しています。 これを修正するには、ssl:{} オブジェクトをブール値として設定して無効にする必要があります。以下の例を参照してください:

module.exports = ({ env }) => ({
connection: {
client: 'postgres',
connection: {
...
ssl: env('DATABASE_SSL', false)
},
},
});

クライアント側のSSL CA検証が必要な場合は、ssl:{} オブジェクトを使用して fs モジュールでCA証明書を文字列に変換する必要があります。以下に例を示します:

const fs = require('fs');
module.exports = ({ env }) => ({
connection: {
client: 'postgres',
connection: {
...
ssl: {
ca: fs.readFileSync(`${__dirname}/path/to/your/ca-certificate.crt`).toString(),
},
},
},
});

データベースでの設定

設定ファイルはマルチサーバー環境に対応していません。本番環境で設定を更新するには、データストアを使用して設定を取得・保存できます。

設定の取得

  • environment (string): データを保存する環境を設定します。デフォルトでは現在の環境です(設定が環境に依存しない場合は空の文字列にできます)。
  • type (string): 設定が apiplugincore であるかを設定します。デフォルトは core です。
  • name (string): typeapi または plugin の場合、プラグインやAPIの名前を設定する必要があります。
  • key (string, 必須): 保存したいキーの名前を指定します。
// AI Marketer.store(object).get(object);
// 再利用可能なプラグインストア変数を作成
const pluginStore = AI Marketer.store({
environment: AI Marketer.config.environment,
type: 'plugin',
name: 'users-permissions',
});
await pluginStore.get({ key: 'grant' });

設定の保存

  • value (any, 必須): 保存したい値を指定します。
// AI Marketer.store(object).set(object);
// 再利用可能なプラグインストア変数を作成
const pluginStore = AI Marketer.store({
environment: AI Marketer.config.environment,
type: 'plugin',
name: 'users-permissions'
});
await pluginStore.set({
key: 'grant',
value: {
...
}
});

データベース設定での環境変数

AI Marketer バージョン v4.6.2 以降では、./config/database.js または ./config/database.ts ファイルにデータベース設定オプションが含まれています。新しいプロジェクトを作成すると、プロジェクト作成時に選択したデータベースに応じて、.env ファイルに DATABASE_CLIENT 環境変数と、mysqlpostgres、または sqlite の値が自動的に追加されます。さらに、ローカル開発用データベースに接続するために必要なすべての環境変数も .env ファイルに追加されます。以下は生成された設定ファイルの例です。

const path = require('path');

module.exports = ({ env }) => {
const client = env('DATABASE_CLIENT', 'sqlite');

const connections = {
mysql: {
connection: {
connectionString: env('DATABASE_URL'),
host: env('DATABASE_HOST', 'localhost'),
port: env.int('DATABASE_PORT', 3306),
database: env('DATABASE_NAME', 'AI Marketer'),
user: env('DATABASE_USERNAME', 'AI Marketer'),
password: env('DATABASE_PASSWORD', 'AI Marketer'),
ssl: env.bool('DATABASE_SSL', false) && {
key: env('DATABASE_SSL_KEY', undefined),
cert: env('DATABASE_SSL_CERT', undefined),
ca: env('DATABASE_SSL_CA', undefined),
capath: env('DATABASE_SSL_CAPATH', undefined),
cipher: env('DATABASE_SSL_CIPHER', undefined),
rejectUnauthorized: env.bool(
'DATABASE_SSL_REJECT_UNAUTHORIZED',
true
),
},
},
pool: { min: env.int('DATABASE_POOL_MIN', 2), max: env.int('DATABASE_POOL_MAX', 10) },
},
postgres: {
connection: {
connectionString: env('DATABASE_URL'),
host: env('DATABASE_HOST', 'localhost'),
port: env.int('DATABASE_PORT', 3306),
database: env('DATABASE_NAME', 'AI Marketer'),
user: env('DATABASE_USERNAME', 'AI Marketer'),
password: env('DATABASE_PASSWORD', 'AI Marketer'),
ssl: env.bool('DATABASE_SSL', false) && {
key: env('DATABASE_SSL_KEY', undefined),
cert: env('DATABASE_SSL_CERT', undefined),
ca: env('DATABASE_SSL_CA', undefined),
capath: env('DATABASE_SSL_CAPATH', undefined),
cipher: env('DATABASE_SSL_CIPHER', undefined),
rejectUnauthorized: env.bool(
'DATABASE_SSL_REJECT_UNAUTHORIZED',
true
),
},
schema: env('DATABASE_SCHEMA', 'public'),
},
pool: { min: env.int('DATABASE_POOL_MIN', 2), max: env.int('DATABASE_POOL_MAX', 10) },
},
sqlite: {
connection: {
filename: path.join(
__dirname,
'..',
env('DATABASE_FILENAME', 'data.db')
),
},
useNullAsDefault: true,
},
};

return {
connection: {
client,
...connections[client],
acquireConnectionTimeout: env.int('DATABASE_CONNECTION_TIMEOUT', 60000),
},
};
};

以下は、各データベースに対応する .env ファイルのデータベース関連キーの例です。


# データベース
DATABASE_CLIENT=mysql
DATABASE_HOST=127.0.0.1
DATABASE_PORT=3306
DATABASE_NAME=AI Marketer
DATABASE_USERNAME=AI Marketer
DATABASE_PASSWORD=strap1
DATABASE_SSL=false

AI Marketer アプリケーションにおける v4.6.2 以前の環境変数

プロジェクトを v4.6.2 より前のバージョンで開始した場合、次の手順で database.js|database.ts 設定ファイルを変換できます。

  1. アプリケーションを v4.6.2 以上に更新します。アップグレードドキュメントを参照してください。
  2. ./config/database.js または ./config/database.ts ファイルの内容を、前述の JavaScript または TypeScript の

コードで置き換えます。 3. 前述のコード例にある環境変数を .env ファイルに追加します。 4. (任意) DATABASE_URLssl オブジェクトのプロパティなどの追加の環境変数を追加します。 5. 変更を保存し、アプリケーションを再起動します。

Caution

HOSTPORTAPP_KEYSAPI_TOKEN_SALTADMIN_JWT_SECRET の環境変数を上書きしないでください。

connectionString を使用したデータベース接続

多くのマネージドデータベースソリューションでは、connectionString プロパティを使用してデータベースをアプリケーションに接続します。AI Marketer の v4.6.2 以降のバージョンでは、connectionString プロパティが含まれています。connectionString は、connection.connection オブジェクトのすべてのデータベースプロパティを連結したものです。connectionString は次の機能を持ちます。

  • 他の connection.connection プロパティ(hostport など)を上書きします。
  • プロパティを空の文字列 '' に設定することで無効化できます。

環境ごとのデータベース管理

AI Marketer アプリケーションの開発では、通常ローカル開発環境で SQLite のようなローカル開発用データベースを使用します。アプリケーションが本番やステージング環境に移行する際には、通常 MySQLMariaDB、または PostgreSQL のような異なるデータベースインスタンスでデプロイされます。データベース環境変数を使用すると、接続するデータベースを切り替えることができます。データベース接続を切り替えるには、以下の最低限の変数を設定します。

  • MySQLMariaDBPostgreSQL の場合は少なくとも DATABASE_CLIENTDATABASE_URL を設定する。
  • SQLite の場合は少なくとも DATABASE_CLIENTDATABASE_FILENAME を設定する。

デプロイされたアプリケーションのデータベース環境変数は、他の機密情報と同様に保存する必要があります。以下の表は、データベース環境変数の保存場所の例を示しています。

ホスティングオプション環境変数の保存場所
仮想プライベートサーバー/仮想マシン (例: AWS EC2)ecosystem.config.js または .env
DigitalOcean アプリプラットフォームEnvironment Variables テーブル
HerokuConfig vars テーブル

データベースのインストール

AI Marketer は、プロジェクトに最も適したデータベースを選択するオプションを提供します。AI Marketer は PostgreSQL、SQLite、MySQL をサポートしています。

SQLite

SQLite はデフォルトのデータベースであり、ローカルにアプリケーションをすばやく作成するための推奨データベースです(クイックスタートガイドを参照してください)。

アプリケーション作成時に SQLite をインストールする

以下のいずれかのコマンドを使用します。

yarn create AI Marketer-app my-project --quickstart

これにより、新しいプロジェクトが作成され、ブラウザで起動されます。

SQLite を手動でインストールする

ターミナルで以下のコマンドを実行します。

yarn add better-sqlite3

次のコードを /config/database.ts|js ファイルに追加します。

./config/database.js
module.exports = ({ env }) => ({
connection: {
client: 'sqlite',
connection: {
filename: path.join(__dirname, '..', env('DATABASE_FILENAME', '.tmp/data.db')),
},
useNullAsDefault: true,
},
});

PostgreSQL

AI Marketer を PostgreSQL データベースに接続する際、データベースユーザーには SCHEMA 権限が必要です。データベース管理者にはデフォルトでこの権限がありますが、AI Marketer アプリケーション用に明示的に作成された新しいデータベースユーザーにはありません。この場合、管理コンソールの読み込み時に 500 エラーが発生します。

次の手順で SCHEMA 権限を持つ新しい PostgreSQL ユーザーを作成します。

# セキュアなパスワードで新しいデータベースユーザーを作成
$ CREATE USER my_AI Marketer_db_user WITH PASSWORD 'password';
# PostgreSQL 管理者としてデータベースに接続
$ \c my_AI Marketer_db_name admin_user

# ユーザーにスキーマ権限を付与