コンテンツにスキップ

Docker でデプロイ

Chorus は公式 Docker イメージ chorusaidlc/chorus-app を提供しています。このガイドでは、二つの Compose 形態(スタンドアロン(組み込みデータベース)と本番(外部 PostgreSQL + Redis))、既存のデータベースに対する素の docker run、完全な環境変数リファレンス、そしてコンテナが起動時に何をするかを示します。

まずイメージをプルします。

Terminal window
docker pull chorusaidlc/chorus-app:latest

スタンドアロン形態と本番形態のどちらを選ぶかについては、デプロイ概要を参照してください。

スタンドアロン(組み込みデータベース)

Section titled “スタンドアロン(組み込みデータベース)”

外部データベースは不要です。イメージは PGlite(組み込み PostgreSQL)を同梱しており、すべてを自動的に起動します。データは Docker ボリュームに保存され、コンテナの再起動をまたいで永続します。

docker-compose.local.yml を作成します。

# Standalone Chorus — embedded PGlite, no external PostgreSQL or Redis
services:
app:
image: chorusaidlc/chorus-app:latest
ports:
- "8637:8637"
environment:
# No DATABASE_URL — entrypoint auto-starts embedded PGlite
- REDIS_URL=
- NEXTAUTH_SECRET=${NEXTAUTH_SECRET:-chorus-local-secret}
- COOKIE_SECURE=false
- DEFAULT_USER=${DEFAULT_USER:-admin@example.com}
- DEFAULT_PASSWORD=${DEFAULT_PASSWORD:-changeme}
volumes:
- chorus-local-data:/app/data
volumes:
chorus-local-data:

そして実行します。

Terminal window
docker compose -f docker-compose.local.yml up -d

http://localhost:8637 を開き、admin@example.com / changeme でログインします(または DEFAULT_USER / DEFAULT_PASSWORD 環境変数で上書きします)。

スタンドアロンモードでは、コンテナは次のことを行います。

  • PGlite を内部ポート(5433)で起動し、外部には公開しません。
  • データを chorus-local-data Docker ボリュームに保存するため、再起動をまたいで永続します。
  • Redis を無効化します(メモリ内 EventBus にフォールバック。単一インスタンスのみ)。
  • 起動時に Prisma マイグレーションを自動的に実行します。

本番環境向け、特に複数レプリカを伴う場合は、アプリを外部の PostgreSQL と Redis に接続します。docker-compose.yml を作成します。

services:
app:
image: chorusaidlc/chorus-app:latest
ports:
- "8637:8637"
environment:
- DATABASE_URL=postgresql://chorus:chorus@db:5432/chorus
- REDIS_URL=redis://default:chorus-redis@redis:6379
- NEXTAUTH_SECRET=change-me-to-a-random-secret
- DEFAULT_USER=admin@example.com
- DEFAULT_PASSWORD=your-password
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
redis:
image: redis:7-alpine
command: redis-server --requirepass chorus-redis
volumes:
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "-a", "chorus-redis", "ping"]
interval: 5s
timeout: 3s
retries: 5
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: chorus
POSTGRES_PASSWORD: chorus
POSTGRES_DB: chorus
volumes:
- chorus-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U chorus -d chorus"]
interval: 5s
timeout: 5s
retries: 5
volumes:
chorus-data:
redis-data:

そして実行します。

Terminal window
docker compose up -d

http://localhost:8637 を開き、DEFAULT_USER / DEFAULT_PASSWORD に設定した資格情報でログインします。

既存の PostgreSQL に対して実行する

Section titled “既存の PostgreSQL に対して実行する”

すでに PostgreSQL と Redis が動作しているなら、コンテナを直接起動します。

Terminal window
docker run -d \
-p 8637:8637 \
-e DATABASE_URL=postgresql://user:pass@your-db-host:5432/chorus \
-e REDIS_URL=redis://default:password@your-redis-host:6379 \
-e NEXTAUTH_SECRET=change-me-to-a-random-secret \
-e COOKIE_SECURE=false \
-e DEFAULT_USER=admin@example.com \
-e DEFAULT_PASSWORD=your-password \
chorusaidlc/chorus-app:latest
変数説明
DATABASE_URLPostgreSQL 接続文字列。形式:postgresql://user:password@host:port/dbname。代わりに個別の DB_* 変数を設定することもできます(下記参照)。省略した場合、エントリーポイントは組み込みの PGlite インスタンスを自動的に起動します。
NEXTAUTH_SECRETJWT セッショントークンに署名するための秘密鍵。ランダムな文字列を使用してください(例:openssl rand -base64 32)。

データベース(DATABASE_URL の代替)

Section titled “データベース(DATABASE_URL の代替)”

DATABASE_URL が設定されていない場合、エントリーポイントは以下の個別変数からそれを組み立てます。

変数説明
DB_HOSTPostgreSQL ホスト
DB_PORTPostgreSQL ポート(デフォルト:5432
DB_USERNAMEPostgreSQL ユーザー名
DB_PASSWORDPostgreSQL パスワード
DB_NAMEデータベース名
変数説明
REDIS_URL完全な Redis 接続文字列。形式:redis://username:password@host:port。個別変数より優先されます。
REDIS_HOSTRedis ホスト(REDIS_URL が設定されていない場合に使用)
REDIS_PORTRedis ポート(デフォルト:6379
REDIS_USERNAMERedis ユーザー名(デフォルト:default
REDIS_PASSWORDRedis パスワード
変数説明
DEFAULT_USER組み込みログイン用のメールアドレス(OIDC をバイパスします)。初回ログイン時にユーザーと会社を自動プロビジョニングします。
DEFAULT_PASSWORDデフォルトユーザーのパスワード(平文で、実行時に bcrypt で照合します)。
NEXTAUTH_URLアプリの対外的なベース URL(デフォルト:http://localhost:8637)。リバースプロキシの背後で実行するときに設定します。
COOKIE_SECUREHTTP のみのデプロイでセキュア Cookie を無効にするには "false" に設定します(docker-compose ではデフォルトで "false")。本番で HTTPS でデプロイするときは "true" に設定します。
変数デフォルト説明
LOG_LEVELinfo(本番)/ debug(開発)サーバーの最低ログレベル。受け付ける値:tracedebuginfowarnerrorfatalsilent。Prisma のクエリログを抑制するには info に設定します。
NEXT_PUBLIC_LOG_LEVELwarn(本番)/ debug(開発)ブラウザの最低ログレベル。受け付ける値:debuginfowarnerror

本番 Docker イメージは常に JSON を stdout に出力します(CloudWatch / ELK にそのまま対応)。色付きの整形出力はローカル開発時のみ利用できます。

変数説明
SUPER_ADMIN_EMAILスーパー管理者アカウントのメール(/admin パネルにアクセスできます)。
SUPER_ADMIN_PASSWORD_HASHスーパー管理者パスワードの bcrypt ハッシュ。生成方法:node -e "console.log(require('bcryptjs').hashSync('your-password', 10))"

コンテナのエントリーポイントは、起動するたびに同じ流れを実行します。

  1. DATABASE_URL が設定されておらず、DB_* 変数も一つも与えられていない場合、エントリーポイントは内部ポート(5433)で組み込みの PGlite インスタンスを起動します。外部データベースが設定されているときは、PGlite は起動しません。
  2. prisma migrate deploy を実行し、保留中のデータベースマイグレーションを適用します。
  3. データベースがまだ準備できていない場合は、10 秒ごとにリトライします(最大 30 回、およそ 5 分)。
  4. マイグレーションが成功すると、Next.js サーバーが 8637 ポートで起動します。
  • ベースイメージ: node:22-alpine
  • 内部ポート: 8637
  • アーキテクチャ: linux/amd64linux/arm64
  • 本番デプロイ:グローバル npm パッケージから実行する方法と、 完全な AWS CDK の手順。
  • 運用:初回ログインのブートストラップ、デプロイ側の身分 認証、そしてアップグレード前のバックアップ。