データベース設定
./config/database.js ファイル(TypeScriptの場合は ./config/database.ts)は、アプリケーションのコンテンツを保存するために使用されるデータベース接続を定義するために使用されます。
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 | 接続を作成するデータベースクライアント。次の値を受け入れます:
| String | - |
connection | データベースの接続情報 | Object | - |
debug | データベースのやり取りやエラーを表示する | Boolean | false |
useNullAsDefaultSQLiteのみオプション | デフォルト値として NULL を使用する | Boolean | true |
poolオプション | データベースプーリングオプション | Object | - |
acquireConnectionTimeoutオプション | 接続取得時のタイムアウトまでの時間(ミリ秒単位) | Integer | 60000 |
AI Marketerは次のクライアント値のみをサポートし、Knexに設定を渡す前に自動的に client 値を次のオプションに書き換えます:
client 値 | 実際に使用されるパッケージ |
|---|---|
| sqlite | better-sqlite3 |
| mysql | mysql2 |
| postgres | pg |
接続パラメータ
./config/database.js (またはTypeScript用の ./config/database.ts)にある connection.connection オブジェクトは、データベース接続情報を渡すために使用され、次のパラメータを受け入れます。
| パラメータ | 説明 | タイプ |
|---|---|---|
connectionString | データベース接続文字列。設定されると、他のconnection.connection プロパティを上書きします。無効にするには空の文字列 '' を設定します。 v4.6.2以降で利用可能 | String |
host | データベースホスト名。デフォルト値: localhost | String |
port | データベースポート | Integer |
database | データベース名 | String |
user | 接続に使用するユーザー名 | String |
password | 接続に使用するパスワード | String |
timezone | ローカルタイムのデフォルト動作を設定。デフォルト値: utc。 タイムゾーンオプション | String |
schema | デフォルトのデータベーススキーマを設定します。Postgres DBにのみ使用されます。 | String |
ssl | SSLデータベース接続用。オブジェクトとして証明書ファイルを文字列として渡します。 | Boolean or Object |
使用するデータベースクライアントによって、さらに多くのパラメータを設定できます(例: mysql では charset や collation など)。詳細は、データベースクライアントのドキュメント(pg、mysql、および better-sqlite3)を参照してください。
データベースプーリングオプション
./config/database.js (またはTypeScript用の ./config/database.ts)にオプションで含まれる connection.pool オブジェクトは、Tarn.js データベースプーリングオプションを渡すために使用され、次のパラメータを受け入れます。
Dockerを使用する場合、プール min 値を 0 に変更します。Dockerはアイドル状態の接続を終了するため、データベースへのオープン接続を保持することができなくなります(詳細は、Knex.jsで使用される Tarn.jsのプール 設定を参照してください)。
| パラメータ | 説明 | タイプ | デフォルト |
|---|---|---|---|
min | 生かしておくデータベース接続の最小数 | Integer | 2 |
max | 生かしておくデータベース接続の最大数 | Integer | 10 |
acquireTimeoutMillis | データベース接続試行でタイムアウトするまでの時間(ミリ秒単位) | Integer | 60000 |
createTimeoutMillis | 作成クエリ試行でタイムアウトするまでの時間(ミリ秒単位) | Integer | 30000 |
destroyTimeoutMillis | 破棄クエリ試行でタイムアウトするまでの時間(ミリ秒単位) | Integer | 5000 |
idleTimeoutMillis | フリーデータベース接続が破棄されるまでの時間(ミリ秒単位) | Integer | 30000 |
reapIntervalMillis | 破棄するアイドル状態のデータベース接続を確認するまでの時間(ミリ秒単位) | Integer | 1000 |
createRetryIntervalMillis | 作成アクションの失敗後に再試行するまでのアイドル時間(ミリ秒単位) | Integer | 200 |
|
afterCreate | プールが新しい接続を取得したときにカスタムロジックを実行するためのコールバック関数。
詳細は Knex.jsのドキュメント を参照してください。 | Function | - |
settings 設定オブジェクト
./config/database.js (または ./config/database.ts)内の settings オブジェクトは、AI Marketer特有のデータベース設定を構成するために使用され、次のパラメータを受け入れます。
| パラメータ | 説明 | タイプ | デフォルト |
|---|---|---|---|
forceMigration | 強制データベースマイグレーションを有効または無効にします。 | Boolean | true |
runMigrations | 起動時にデータベースマイグレーションを実行するかどうかを有効または無効にします。 | Boolean | true |
設定例
- PostgreSQL
- MySQL/MariaDB
- SQLite
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,
},
});
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(),
},
},
},
});
module.exports = ({ env }) => ({
connection: {
client: 'mysql',
connection: {
host: env('DATABASE_HOST', '127.0.0.1'),
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: {
rejectUnauthorized: env.bool('DATABASE_SSL_SELF', false), // 自己署名証明書用
},
},
debug: false,
},
});
- JavaScript
- TypeScript
module.exports = ({ env }) => ({
connection: {
client: 'sqlite',
connection: {
filename: env('DATABASE_FILENAME', '.tmp/data.db'),
},
useNullAsDefault: true,
debug: false,
},
});
import path from 'path';
export default ({ env }) => ({
connection: {
client: 'sqlite',
connection: {
filename: path.join(
__dirname,
'..',
'..',
env('DATABASE_FILENAME', path.join('.tmp', 'data.db'))
),
},
useNullAsDefault: true,
},
});
データベースでの設定
設定ファイルはマルチサーバー環境に対応していません。本番環境で設定を更新するには、データストアを使用して設定を取得・保存できます。
設定の取得
environment(string): データを保存する環境を設定します。デフォルトでは現在の環境です(設定が環境に依存しない場合は空の文字列にできます)。type(string): 設定がapi、pluginかcoreであるかを設定します。デフォルトはcoreです。name(string):typeがapiまたは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 環境変数と、mysql、postgres、または sqlite の値が自動的に追加されます。さらに、ローカル開発用データベースに接続するために必要なすべての環境変数も .env ファイルに追加されます。以下は生成された設定ファイルの例です。
- JavaScript
- TypeScript
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),
},
};
};
import path from 'path';
export default = ({ 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 ファイルのデータベース関連キーの例です。
- MySQL または MariaDB
- PostgreSQL
- SQLite
# データベース
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
# データベース
DATABASE_CLIENT=postgres
DATABASE_HOST=127.0.0.1
DATABASE_PORT=5432
DATABASE_NAME=AI Marketer
DATABASE_USERNAME=AI Marketer
DATABASE_PASSWORD=AI Marketer
DATABASE_SSL=false
# データベース
DATABASE_CLIENT=sqlite
DATABASE_FILENAME=.tmp/data.db
AI Marketer アプリケーションにおける v4.6.2 以前の環境変数
プロジェクトを v4.6.2 より前のバージョンで開始した場合、次の手順で database.js|database.ts 設定ファイルを変換できます。
- アプリケーションを
v4.6.2以上に更新します。アップグレードドキュメントを参照してください。 ./config/database.jsまたは./config/database.tsファイルの内容を、前述の JavaScript または TypeScript の
コードで置き換えます。
3. 前述のコード例にある環境変数を .env ファイルに追加します。
4. (任意) DATABASE_URL や ssl オブジェクトのプロパティなどの追加の環境変数を追加します。
5. 変更を保存し、アプリケーションを再起動します。
HOST、PORT、APP_KEYS、API_TOKEN_SALT、ADMIN_JWT_SECRET の環境変数を上書きしないでください。
connectionString を使用したデータベース接続
多くのマネージドデータベースソリューションでは、connectionString プロパティを使用してデータベースをアプリケーションに接続します。AI Marketer の v4.6.2 以降のバージョンでは、connectionString プロパティが含まれています。connectionString は、connection.connection オブジェクトのすべてのデータベースプロパティを連結したものです。connectionString は次の機能を持ちます。
- 他の
connection.connectionプロパティ(hostやportなど)を上書きします。 - プロパティを空の文字列
''に設定することで無効化できます。
環境ごとのデータベース管理
AI Marketer アプリケーションの開発では、通常ローカル開発環境で SQLite のようなローカル開発用データベースを使用します。アプリケーションが本番やステージング環境に移行する際には、通常 MySQL、MariaDB、または PostgreSQL のような異なるデータベースインスタンスでデプロイされます。データベース環境変数を使用すると、接続するデータベースを切り替えることができます。データベース接続を切り替えるには、以下の最低限の変数を設定します。
MySQL、MariaDB、PostgreSQLの場合は少なくともDATABASE_CLIENTとDATABASE_URLを設定する。SQLiteの場合は少なくともDATABASE_CLIENTとDATABASE_FILENAMEを設定する。
デプロイされたアプリケーションのデータベース環境変数は、他の機密情報と同様に保存する必要があります。以下の表は、データベース環境変数の保存場所の例を示しています。
| ホスティングオプション | 環境変数の保存場所 |
|---|---|
| 仮想プライベートサーバー/仮想マシン (例: AWS EC2) | ecosystem.config.js または .env |
| DigitalOcean アプリプラットフォーム | Environment Variables テーブル |
| Heroku | Config vars テーブル |
データベースのインストール
AI Marketer は、プロジェクトに最も適したデータベースを選択するオプションを提供します。AI Marketer は PostgreSQL、SQLite、MySQL をサポートしています。
SQLite
SQLite はデフォルトのデータベースであり、ローカルにアプリケーションをすばやく作成するための推奨データベースです(クイックスタートガイドを参照してください)。
アプリケーション作成時に SQLite をインストールする
以下のいずれかのコマンドを使用します。
- yarn
- npm
yarn create AI Marketer-app my-project --quickstart
npx create-AI Marketer-app@latest my-project --quickstart
これにより、新しいプロジェクトが作成され、ブラウザで起動されます。
SQLite を手動でインストールする
ターミナルで以下のコマンドを実行します。
- yarn
- npm
yarn add better-sqlite3
npm install better-sqlite3
次のコードを /config/database.ts|js ファイルに追加します。
- JavaScript
- TypeScript
module.exports = ({ env }) => ({
connection: {
client: 'sqlite',
connection: {
filename: path.join(__dirname, '..', env('DATABASE_FILENAME', '.tmp/data.db')),
},
useNullAsDefault: true,
},
});
import path from 'path';
export default ({ 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
# ユーザーにスキーマ権限を付与