LayChat サーバー構築マニュアル

本マニュアルは、LayChat Ver1.2.0 をサーバーに構築・運用するための技術ガイドです。Docker を使ったローカル起動から、AWS Elastic Beanstalk・Heroku へのクラウドデプロイまでを網羅しています。

対象バージョン: Ver 1.2.0 対象読者: サーバー管理者・技術者 更新日: 2026-03-28

1. はじめに

エディション比較

LayChat には3つのエディションがあります。用途に合わせて選択してください。

FREE

Free版

  • 基本チャット・DM
  • スレッド・ピン・ブックマーク
  • Web Push通知
  • PWA対応
  • ローカルストレージ
  • AI Botなし
  • カスタムスタンプなし
STANDARD

Standard版

  • Free版の全機能
  • AI Bot(@bot)
  • カスタムスタンプ
  • システム統計
  • グループプラン管理
  • AWS S3ストレージ
  • ユーザー50名まで
  • ライセンス認証(コールホーム)
  • ビデオ通話なし
ENTERPRISE

Enterprise版

  • Free版の全機能
  • AI Bot(@bot)
  • カスタムスタンプ
  • システム統計
  • グループプラン管理
  • AWS S3ストレージ
  • ビデオ通話(WebRTC)
  • ライセンス認証(コールホーム)
  • 無制限ユーザー
ℹ️
Standard・Enterprise版のライセンス認証について Standard・Enterprise版は内部管理用のライセンス発行サーバーに対してライセンスキーの検証(コールホーム)を行います。ライセンスキー(例: Standard版 LAYCHAT-STD-A1B2C3D4、Enterprise版 LAYCHAT-ENT-A1B2C3D4)と検証サーバーのURLが必要です。検証失敗時は7日間の猶予期間があります。

最小システム要件

2コア+
CPU(最小2コア推奨)
2GB+
メモリ(最小2GB、推奨4GB)
20GB+
ディスク(ローカルストレージ時)
Node.js 20
ランタイム(ローカル開発時)
Docker 24+
コンテナランタイム
MongoDB 6.0
データベース(Docker内で自動起動)
ℹ️
MongoDBはDocker Compose内で自動起動するため、個別インストールは不要です。
S3ストレージ使用時(Standard/Enterprise版)はローカルディスク容量の制約はありません。

このマニュアルの使い方

LayChat のセットアップ手順は、エディションデプロイ先の組み合わせによって異なります。まず下の表で「自分のケース」を確認し、該当する章へ進んでください。

ケース 読む章 必要なもの(概要)
Free版・社内サーバー/PCで試す 3章 Docker のみ
Standard版・社内/VPSで動かす(社内LAN限定) 4章-A Docker・ライセンスキー・(S3任意)
Standard版・インターネット公開(おすすめ 4章-A8章 Docker・ライセンスキー・Cloudflareアカウント・ドメイン
Standard版・AWSで動かす 4章-B9章 AWSアカウント・ライセンスキー・S3
Standard版・Herokuで動かす 4章-C10章 Herokuアカウント・ライセンスキー・S3
Enterprise版・社内/VPSで動かす(社内LAN限定) 5章-A Docker・ライセンスキー・S3・(TURN任意)
Enterprise版・インターネット公開(おすすめ 5章-A8章 Docker・ライセンスキー・S3・Cloudflareアカウント・ドメイン
Enterprise版・AWSで動かす 5章-B9章 AWSアカウント・ライセンスキー・S3・(TURN任意)
Enterprise版・Herokuで動かす 5章-C10章 Herokuアカウント・ライセンスキー・S3・(TURN任意)
💡
初めての方へ
まずは ローカルDocker(社内サーバー/PC) での起動をお勧めします。クラウドへのデプロイは動作確認後でも遅くありません。AWS・Heroku への本番デプロイは IT の知識が必要です。不明な場合は サポートまでお問い合わせ ください。

2. 事前準備

Docker / Docker Composeのインストール

LayChatはDockerで動作します。まずDockerをインストールしてください。

macOS / Windows

Docker Desktopをインストールしてください。Docker ComposeはDocker Desktopに同梱されています。

Linux(Ubuntu/Debian)

bash
# 必要パッケージのインストール
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg

# Docker公式GPGキーの追加
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Dockerリポジトリの追加
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Docker Engineのインストール
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

# 現在のユーザーをdockerグループに追加(sudoなしで実行可能に)
sudo usermod -aG docker $USER
newgrp docker

# バージョン確認
docker --version
docker compose version

Node.js 20のインストール(ローカル開発時)

Dockerを使う本番環境では不要ですが、ローカルで直接実行する場合やVAPIDキー生成に使います。

bash
# nvmを使ったインストール(推奨)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc  # または ~/.zshrc
nvm install 20
nvm use 20
node --version  # v20.x.x が表示されればOK
ℹ️
MongoDBはDocker Compose内のコンテナとして自動起動します。別途インストールする必要はありません。

VAPIDキーの生成

Web Push通知に必要なVAPIDキーを生成します。このキーペアは一度生成したら変更しないでください。変更すると既存の通知登録が無効になります。

bash
# web-pushライブラリをグローバルインストール
npm install -g web-push

# VAPIDキーペアを生成
web-push generate-vapid-keys

以下のような出力が得られます:

出力例
Public Key:
BNZ8g7tXdXmrF3sY9k2mP...(88文字程度)

Private Key:
xK3j9mLpQ7...(44文字程度)

生成された Public KeyVAPID_PUBLIC_KEYPrivate KeyVAPID_PRIVATE_KEY に設定します。

AWS S3バケットの作成(Standard/Enterprise版)

  1. AWSコンソールにログインし、S3サービスを開く
  2. 「バケットを作成」をクリック。バケット名(例: my-laychat-uploads)とリージョンを設定
  3. 「パブリックアクセスをすべてブロック」をオフにし、パブリック読み取りを許可
  4. バケットポリシーを設定(以下のJSONを適用)
json(バケットポリシー)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::your-bucket-name/*"
    }
  ]
}

次に、IAMユーザーを作成してアクセスキーを取得します。

  1. IAM → ユーザー → 「ユーザーを作成」をクリック
  2. 「許可を追加」→「ポリシーを直接アタッチ」→「AmazonS3FullAccess」を選択(または専用ポリシーを作成)
  3. 「セキュリティ認証情報」タブ → 「アクセスキーを作成」→ キーIDとシークレットを控える
⚠️
セキュリティ注意 アクセスキーとシークレットは作成時のみ表示されます。必ず安全な場所に保存してください。本番環境では最小権限(S3のみ)のIAMポリシーを使用することを推奨します。

Google Gemini APIキーの取得(Standard/Enterprise版)

  1. Google AI Studio(aistudio.google.com)にアクセス
  2. 「Get API Key」→「Create API key」をクリック
  3. 生成されたキー(AIza...で始まる文字列)を GEMINI_API_KEY に設定
ℹ️
LayChat Ver1.2.0 では Gemini 2.5 Flash モデルを使用しています。無料枠でも十分動作しますが、使用量に応じて課金が発生する場合があります。

3. Free版セットアップ(ローカルDockerでの起動)

📋
事前チェックリスト(Free版・ローカルDocker)
  • ☐ Docker Desktop がインストールされている(2章参照
  • ☐ VAPID キーを生成済み(2章参照
  • ☐ サーバーのポート 8080 が空いている

✅ 以上が揃えば開始できます。AWS S3・APIキー・ライセンスキーは不要です。

ファイルの配置

LayChatのソースファイルをサーバー上の任意のディレクトリに配置します。以下の構成になっていることを確認してください。

ディレクトリ構成
laychat/
├── server.js
├── main.js
├── index.html
├── style.css
├── sw.js
├── manifest.json
├── dockerfile
├── Procfile
├── package.json
├── configs/
│   ├── .env.free          ← 編集する設定ファイル
│   ├── .env.free.sample   ← テンプレート(参照用)
│   ├── docker-compose.free.yml
│   └── ...
└── uploads/               ← ローカルストレージ用(自動作成)

.env.free の設定

configs/.env.free.sampleconfigs/.env.free としてコピーし、以下の項目を設定します。

configs/.env.free
# ==========================================
# LayChat Free版 環境設定ファイル
# ==========================================

# エディション識別子(変更不要)
EDITION=free

# ストレージ設定: Free版はローカル推奨
STORAGE_TYPE=local

# MongoDB接続URI(Docker使用時は自動設定のため空白でOK)
MONGODB_URI=

# Web Push通知用VAPIDキー(web-push generate-vapid-keysで生成)
VAPID_PUBLIC_KEY=BNZ8g7tXdXmr...(生成した公開鍵)
VAPID_PRIVATE_KEY=xK3j9mLpQ7...(生成した秘密鍵)
VAPID_EMAIL=mailto:admin@your-domain.com

# Google OAuth設定(省略可)
APP_URL=https://your-domain.com
SESSION_SECRET=ランダムな文字列(例: openssl rand -hex 32 で生成)
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
⚠️
VAPID_EMAIL について 必ず mailto: プレフィックスを含めてください(例: mailto:admin@example.com)。URLを設定する場合は https:// プレフィックスを使用します。

docker-compose.free.yml の確認

設定ファイル configs/docker-compose.free.yml の内容を確認します(通常は変更不要)。

configs/docker-compose.free.yml
name: laychat-free
services:
  mongo:
    image: mongo:4.4
    container_name: laychat-free-mongo
    restart: always
    volumes:
      - laychat-free-db:/data/db
    networks:
      - laychat-network

  app:
    build: ..
    container_name: laychat-free-app
    restart: always
    ports:
      - "8080:8080"
    env_file:
      - .env.free
    environment:
      - MONGODB_URI=mongodb://mongo:27017/laychat
      - EDITION=free
      - STORAGE_TYPE=local
    volumes:
      - ../uploads:/app/uploads
    depends_on:
      - mongo
    networks:
      - laychat-network

volumes:
  laychat-free-db:

networks:
  laychat-network:
    driver: bridge

起動コマンド

Ver1.2.0 ディレクトリに移動し、以下のコマンドを実行します。

bash
# Ver1.2.0ディレクトリに移動
cd /path/to/Ver1.2.0

# Free版を起動(バックグラウンド実行)
docker compose -f configs/docker-compose.free.yml up -d --build

# ログの確認
docker compose -f configs/docker-compose.free.yml logs -f

動作確認

起動後、ブラウザで以下のURLにアクセスします。

アクセスURL
http://localhost:8080        # ローカルの場合
http://your-server-ip:8080  # リモートサーバーの場合
LayChatのログイン画面が表示されれば起動成功です。最初のユーザー登録は「アカウント作成」から行えます。

停止・再起動コマンド

bash
# 停止
docker compose -f configs/docker-compose.free.yml down

# 再起動(コンテナのみ)
docker compose -f configs/docker-compose.free.yml restart

# ソースコードを更新して再ビルド起動
docker compose -f configs/docker-compose.free.yml up -d --build

# 完全削除(データも含む)※データが消えるため注意
docker compose -f configs/docker-compose.free.yml down -v

4. Standard版セットアップ(ローカルDockerでの起動)

Standard版は以下の4つのデプロイ先に対応しています。まず動かしたい環境を選択し、対応するチェックリストを確認してください。

  • A. ローカルDocker(社内サーバー・VPS・自宅サーバー)← 初めての方はこちら
  • A + Cloudflare Tunnel(外部インターネット公開・ドメイン取得済みの方)→ 本章でローカル手順を確認後、8章
  • B. AWS Elastic Beanstalk(AWSの知識がある方向け)→ 本章でローカル手順を確認後、9章
  • C. Heroku(Herokuの知識がある方向け)→ 本章でローカル手順を確認後、10章

A. ローカルDockerの事前チェックリスト

📋
以下が揃っていることを確認してから作業を開始してください
  • ☐ Docker Desktop がインストールされている(2章参照
  • ☐ VAPID キーを生成済み(2章参照
  • ☐ AWS S3バケットを作成済み(2章参照
     ※ローカルにファイルを保存する場合(STORAGE_TYPE=local)は不要
  • ☐ Gemini API キーを取得済み(AI Bot機能を使う場合のみ)(2章参照
  • ☐ ライセンスキー(LAYCHAT-STD-XXXXXXXX)を当社より入手済み
  • ☐ ライセンスサーバーURL を当社より入手済み
  • ☐ サーバーのポート 8081 が空いている(Free版と共存する場合)

ファイルの配置

Free版と同様に、LayChatのソースファイルをサーバー上の任意のディレクトリに配置します。

ディレクトリ構成
laychat/
├── server.js
├── main.js
├── index.html
├── dockerfile
├── package.json
├── configs/
│   ├── .env.standard          ← 編集する設定ファイル
│   ├── .env.standard.sample   ← テンプレート(参照用)
│   ├── docker-compose.standard.yml
│   └── ...
└── uploads/                   ← ローカルにも一時利用される場合あり

.env.standard の設定

⚠️
事前にライセンスキーが必要です
Standard版はライセンス認証のために当社ライセンスサーバーへの接続が必要です。ライセンスキー(LAYCHAT-STD-XXXXXXXX)と当社より提供するライセンスサーバーURLをご確認の上、設定を行ってください。

configs/.env.standard.sampleconfigs/.env.standard としてコピーし、以下の項目を設定します。

configs/.env.standard
# エディション識別子(変更不要)
EDITION=standard

# ストレージ設定
STORAGE_TYPE=s3

# AWS S3設定(必須)
AWS_ACCESS_KEY_ID=AKIAxxxxxxxxxxxxxxxxxx
AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
S3_BUCKET=my-laychat-uploads

# MongoDB接続URI(Docker使用時は空白でOK)
MONGODB_URI=

# Gemini AI APIキー(必須)
GEMINI_API_KEY=AIzaSy...

# Web Push VAPID設定
VAPID_PUBLIC_KEY=(生成した公開鍵)
VAPID_PRIVATE_KEY=(生成した秘密鍵)
VAPID_EMAIL=mailto:admin@your-domain.com

# Google OAuth設定(省略可)
APP_URL=https://your-domain.com
SESSION_SECRET=ランダムな文字列
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=

# Microsoft OAuth設定(省略可)
MICROSOFT_CLIENT_ID=
MICROSOFT_CLIENT_SECRET=

# ==========================================
# Standard版:ライセンス認証設定(必須)
# ==========================================

# LayChat運営から発行されたライセンスキー
LAYCHAT_LICENSE_KEY=LAYCHAT-STD-A1B2C3D4

# ライセンス検証を行うサーバーURL(末尾スラッシュ不要)
LAYCHAT_MASTER_URL=https://admin.laychat.example.com
💡
AWS S3設定について
ローカルにファイルを保存する場合(STORAGE_TYPE=local)は AWS S3の設定は不要です。S3を使用する場合のみ AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYS3_BUCKET を設定してください。
⚠️
ライセンス認証の注意事項
  • Standard版サーバーからライセンスサーバーへのHTTPS通信が必要です
  • 認証に失敗した場合、7日間の猶予期間が設けられます
  • 猶予期間内に認証が成功しない場合、一部機能が制限される場合があります
  • LAYCHAT_MASTER_URL はライセンスサーバーの外部公開URLを指定してください(localhost不可)

docker-compose.standard.yml の確認

設定ファイル configs/docker-compose.standard.yml の内容を確認します(通常は変更不要)。

configs/docker-compose.standard.yml
name: laychat-standard
services:
  mongo:
    image: mongo:4.4
    container_name: laychat-standard-mongo
    restart: always
    volumes:
      - laychat-standard-db:/data/db
    networks:
      - laychat-network

  app:
    build: ..
    container_name: laychat-standard-app
    restart: always
    ports:
      - "8081:8080"
    env_file:
      - .env.standard
    environment:
      - MONGODB_URI=mongodb://mongo:27017/laychat
      - EDITION=standard
    depends_on:
      - mongo
    networks:
      - laychat-network

volumes:
  laychat-standard-db:

networks:
  laychat-network:
    driver: bridge
ℹ️
Free版と同じサーバーで動かす場合はポートが競合しないようにしてください(上記例ではポート 8081 を使用)。

起動コマンド

Ver1.2.0 ディレクトリに移動し、以下のコマンドを実行します。

bash
# Ver1.2.0ディレクトリに移動
cd /path/to/Ver1.2.0

# Standard版を起動(バックグラウンド実行)
docker compose -f configs/docker-compose.standard.yml up -d --build

# ログの確認(ライセンス認証の成否もここで確認できます)
docker compose -f configs/docker-compose.standard.yml logs -f

動作確認

起動後、ブラウザで以下のURLにアクセスします。

アクセスURL
http://localhost:8081        # ローカルの場合
http://your-server-ip:8081  # リモートサーバーの場合
LayChatのログイン画面が表示されれば起動成功です。最初のユーザー登録後にシステム管理者権限を付与してください。

停止・再起動コマンド

bash
# 停止
docker compose -f configs/docker-compose.standard.yml down

# 再起動(コンテナのみ)
docker compose -f configs/docker-compose.standard.yml restart

# ソースコードを更新して再ビルド起動
docker compose -f configs/docker-compose.standard.yml up -d --build

# 完全削除(データも含む)※データが消えるため注意
docker compose -f configs/docker-compose.standard.yml down -v

ライセンス認証確認

起動後、システム管理画面(管理者メニュー → システム管理)を開き、「ライセンス状態」タブで認証状況を確認できます。

ℹ️
ライセンス認証に失敗した場合は7日間の猶予期間があります。猶予期間中に LAYCHAT_MASTER_URL の設定を確認し、ライセンス発行サーバーへの疎通を確認してください。

5. Enterprise版セットアップ(ローカルDockerでの起動)

Enterprise版は以下の4つのデプロイ先に対応しています。まず動かしたい環境を選択し、対応するチェックリストを確認してください。

  • A. ローカルDocker(社内サーバー・VPS・自宅サーバー)← 初めての方はこちら
  • A + Cloudflare Tunnel(外部インターネット公開・ドメイン取得済みの方)→ 本章でローカル手順を確認後、8章
  • B. AWS Elastic Beanstalk(AWSの知識がある方向け)→ 本章でローカル手順を確認後、9章
  • C. Heroku(Herokuの知識がある方向け)→ 本章でローカル手順を確認後、10章

A. ローカルDockerの事前チェックリスト

📋
以下が揃っていることを確認してから作業を開始してください
  • ☐ Docker Desktop がインストールされている(2章参照
  • ☐ VAPID キーを生成済み(2章参照
  • ☐ AWS S3バケットを作成済み(2章参照
  • ☐ Gemini API キーを取得済み(AI Bot機能を使う場合のみ)(2章参照
  • ☐ ライセンスキー(LAYCHAT-ENT-XXXXXXXX)を当社より入手済み
  • ☐ ライセンスサーバーURL を当社より入手済み
  • ☐ ビデオ通話を使う場合はTURN設定を確認(6章参照
  • ☐ サーバーのポート 8082 が空いている(他版と共存する場合)
⚠️
事前にライセンスキーが必要です
Standard/Enterprise版はライセンス認証のために内部管理用ライセンス発行サーバーへの接続が必要です。ライセンスキーと発行サーバーのURLをご確認の上、設定を行ってください。

ファイルの配置

Enterprise版も同様に、LayChatのソースファイルを配置します(Standard版とは別ディレクトリを推奨)。

ディレクトリ構成
laychat/
├── server.js
├── main.js
├── index.html
├── dockerfile
├── package.json
├── configs/
│   ├── .env.enterprise          ← 編集する設定ファイル
│   ├── .env.enterprise.sample   ← テンプレート(参照用)
│   ├── docker-compose.enterprise.yml
│   └── ...
└── uploads/

.env.enterprise の設定

configs/.env.enterprise
# エディション識別子(変更不要)
EDITION=enterprise

# ストレージ設定
STORAGE_TYPE=s3

# AWS S3設定(必須)
AWS_ACCESS_KEY_ID=AKIAxxxxxxxxxxxxxxxxxx
AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
S3_BUCKET=my-laychat-uploads

# MongoDB接続URI(Docker使用時は空白でOK)
MONGODB_URI=

# Gemini AI APIキー(必須)
GEMINI_API_KEY=AIzaSy...

# Web Push VAPID設定
VAPID_PUBLIC_KEY=(生成した公開鍵)
VAPID_PRIVATE_KEY=(生成した秘密鍵)
VAPID_EMAIL=mailto:admin@your-domain.com

# Google OAuth設定(省略可)
APP_URL=https://your-domain.com
SESSION_SECRET=ランダムな文字列
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=

# TURN設定(省略可・ビデオ通話用)
TURN_URL=
TURN_USERNAME=
TURN_CREDENTIAL=

# ==========================================
# Enterprise版専用:ライセンス認証設定(必須)
# ==========================================

# LayChat運営から発行されたライセンスキー
LAYCHAT_LICENSE_KEY=LAYCHAT-ENT-A1B2C3D4

# ライセンス検証を行うサーバーURL(末尾スラッシュ不要)
LAYCHAT_MASTER_URL=https://admin.laychat.example.com

LAYCHAT_MASTER_URLの設定

Enterprise版はライセンス発行サーバーに対してライセンスキーの検証を定期的に行います。LAYCHAT_MASTER_URL にはライセンス発行サーバーの公開URLを設定してください(末尾のスラッシュは不要)。

⚠️
ライセンス認証の注意事項
  • Standard/Enterprise版サーバーからライセンス発行サーバーへのHTTPS通信が必要です
  • 認証に失敗した場合、7日間の猶予期間が設けられます
  • 猶予期間内に認証が成功しない場合、一部機能が制限される場合があります
  • LAYCHAT_MASTER_URLはライセンス発行サーバーの外部公開URLを指定してください(localhost不可)

docker-compose.enterprise.yml の確認

設定ファイル configs/docker-compose.enterprise.yml の内容を確認します(通常は変更不要)。

configs/docker-compose.enterprise.yml
name: laychat-enterprise
services:
  mongo:
    image: mongo:4.4
    container_name: laychat-enterprise-mongo
    restart: always
    volumes:
      - laychat-enterprise-db:/data/db
    networks:
      - laychat-network

  app:
    build: ..
    container_name: laychat-enterprise-app
    restart: always
    ports:
      - "8082:8080"
    env_file:
      - .env.enterprise
    environment:
      - MONGODB_URI=mongodb://mongo:27017/laychat
      - EDITION=enterprise
    depends_on:
      - mongo
    networks:
      - laychat-network

volumes:
  laychat-enterprise-db:

networks:
  laychat-network:
    driver: bridge
ℹ️
Free版・Standard版と同じサーバーで動かす場合はポートが競合しないようにしてください(上記例ではポート 8082 を使用)。

起動コマンド

Ver1.2.0 ディレクトリに移動し、以下のコマンドを実行します。

bash
# Ver1.2.0ディレクトリに移動
cd /path/to/Ver1.2.0

# Enterprise版を起動(バックグラウンド実行)
docker compose -f configs/docker-compose.enterprise.yml up -d --build

# ログの確認(ライセンス認証の成否もここで確認できます)
docker compose -f configs/docker-compose.enterprise.yml logs -f

動作確認

起動後、ブラウザで以下のURLにアクセスします。

アクセスURL
http://localhost:8082        # ローカルの場合
http://your-server-ip:8082  # リモートサーバーの場合
LayChatのログイン画面が表示されれば起動成功です。ログ内に License verified と表示されればライセンス認証も完了しています。

停止・再起動コマンド

bash
# 停止
docker compose -f configs/docker-compose.enterprise.yml down

# 再起動(コンテナのみ)
docker compose -f configs/docker-compose.enterprise.yml restart

# ソースコードを更新して再ビルド起動
docker compose -f configs/docker-compose.enterprise.yml up -d --build

# 完全削除(データも含む)※データが消えるため注意
docker compose -f configs/docker-compose.enterprise.yml down -v

ライセンス認証確認

起動後、システム管理画面(管理者メニュー → システム管理)を開き、「ライセンス状態」タブで認証状況を確認できます。

ℹ️
ライセンス認証に失敗した場合は7日間の猶予期間があります。猶予期間中に LAYCHAT_MASTER_URL の設定を確認し、ライセンス発行サーバーへの疎通を確認してください。

6. ビデオ通話のTURN設定(Enterprise版のみ、任意)

ビデオ通話機能(WebRTC)はEnterprise版限定でDM間で利用できます。TURNサーバーの設定は任意ですが、異なるネットワーク(企業ファイアウォール内外など)をまたぐ通話には必要です。

STUNサーバー(設定不要)

LayChatはデフォルトでGoogleの公開STUNサーバー(stun:stun.l.google.com:19302)を使用します。同一LAN内や一般家庭回線同士の通話であれば、TURNサーバーなしで動作します。

TURNサーバーが必要なケース

  • 企業のファイアウォールやNAT環境下でのビデオ通話
  • Symmetric NATを使用している環境
  • モバイル回線 ↔ 固定回線など、異なるネットワーク間の通話

Metered.ca を使う場合(無料枠あり)

  1. Metered.ca にアクセスしてアカウントを作成
  2. ダッシュボードから TURN URL / Username / Credential を取得
  3. 環境変数に設定:
    .env.enterprise
    TURN_URL=turn:openrelay.metered.ca:443
    TURN_USERNAME=openrelayproject
    TURN_CREDENTIAL=openrelayproject

Cloudflare Calls を使う場合(月1,000分無料)

  1. Cloudflare Calls を有効化(Cloudflareアカウント必要)
  2. TURN クレデンシャルをCloudflareダッシュボードから生成
  3. 環境変数に設定:
    .env.enterprise
    TURN_URL=turn:turn.cloudflare.com:3478
    TURN_USERNAME=(Cloudflareから発行されたユーザー名)
    TURN_CREDENTIAL=(Cloudflareから発行されたパスワード)

coturnをEC2にセルフホストする場合

bash(Ubuntu EC2上)
# coturnのインストール
sudo apt-get install -y coturn

# /etc/turnserver.conf の主要設定
sudo tee /etc/turnserver.conf <<EOF
listening-port=3478
tls-listening-port=5349
external-ip=$(curl -s ifconfig.me)
realm=your-domain.com
user=turnuser:turnpassword
lt-cred-mech
fingerprint
no-cli
EOF

# サービス有効化・起動
sudo systemctl enable coturn
sudo systemctl start coturn
ℹ️
EC2のセキュリティグループで UDP 3478、TCP 3478/5349 を開放してください。

7. 初期設定(起動後)

最初のアカウント作成とシステム管理者設定

LayChatはユーザー登録画面から最初のアカウントを作成します。

  1. ブラウザでLayChatにアクセスし、「アカウント作成」をクリック
  2. ユーザー名・メールアドレス・パスワードを入力して登録
  3. システム管理者の設定:MongoDBにアクセスし、最初のユーザーに管理者フラグを設定します
    bash(Dockerコンテナ経由でMongoDBにアクセス)
    # MongoDBコンテナに接続(Free版の例)
    docker exec -it laychat-free-mongo mongosh
    
    # laychatデータベースを選択
    use laychat
    
    # 対象ユーザーを管理者に設定(usernameを実際の値に変更)
    db.users.updateOne(
      { username: "your-admin-username" },
      { $set: { isSystemAdmin: true } }
    )
    
    # 確認
    db.users.findOne({ username: "your-admin-username" }, { username: 1, isSystemAdmin: 1 })
  4. ブラウザをリロードし、右上のメニューから「システム管理」が表示されることを確認

SMTP設定(パスワードリセットメール用)

システム管理画面の「システム設定」タブからSMTPを設定します。環境変数での設定も可能です。

設定項目 説明 例(Gmail)
SMTPホスト メールサーバーのホスト名 smtp.gmail.com
SMTPポート 587(TLS)または 465(SSL) 587
SMTPユーザー名 認証用メールアドレス your@gmail.com
SMTPパスワード アプリパスワード(2段階認証有効時) xxxx xxxx xxxx xxxx
差出人メールアドレス 送信元として表示されるアドレス noreply@your-domain.com
ℹ️
Gmailを使用する場合は、Googleアカウントの「アプリパスワード」を生成して使用してください(2段階認証を有効にする必要があります)。

グループプランの設定(Standard/Enterprise版)

Standard/Enterprise版ではグループごとに「Free」または「Premium」プランを設定できます。Premium設定にするとそのグループでAI Bot・カスタムスタンプが利用可能になります。システム管理画面 → 「グループ管理」タブから変更できます。

8. Cloudflare Tunnelを使ったインターネット公開

🌐
この章について
ローカルDockerで起動したLayChatを、ポート開放なしでインターネット上に公開する手順を説明します。 Cloudflare Tunnelを使うことで、固定IPなし・ルーター設定不要でHTTPS対応の公開URLが取得できます。
Standard版・Enterprise版の両方で利用できます。

Cloudflare Tunnelとは

Cloudflare Tunnelは、サーバーから Cloudflare のネットワークに対してアウトバウンド接続を確立することで、ポートを開放せずにサーバーを外部公開できるサービスです。cloudflared という軽量エージェントをDockerコンテナとして起動するだけで利用できます。

  • ✅ ポートフォワード設定不要(ルーター操作不要)
  • ✅ 固定グローバルIPアドレス不要
  • ✅ HTTPS が自動で有効になる(SSL証明書自動発行)
  • ✅ 無料プランで十分利用可能
  • ⚠️ 独自ドメインが必要(Cloudflareで管理するドメイン)

事前準備チェックリスト

📋
以下を事前に準備してください
  • ☐ LayChat(Standard版またはEnterprise版)がローカルDockerで起動・動作確認済み(4章または5章
  • ☐ 独自ドメインを取得済み(Cloudflareで取得するか、他レジストラで取得後にCloudflareへ移管)
  • ☐ Cloudflareアカウントを作成済み(無料)

ステップ1:Cloudflareアカウントとドメインの準備

Cloudflareアカウントの作成

  1. https://cloudflare.com にアクセスし、「Sign Up」からアカウントを作成
  2. メール認証を完了させる

ドメインの追加

Cloudflareでドメインを管理するには、以下のいずれかの方法を使います:

  • 方法A:Cloudflareで新規取得(推奨)
    Cloudflare ダッシュボード → 「Domain Registration」→「Register Domains」からドメインを購入。取得と同時にCloudflare管理下に入るため、追加設定不要。
  • 方法B:他レジストラのドメインを追加
    ダッシュボード → 「Add a Site」からドメインを入力 → ネームサーバーを Cloudflare のものに変更(レジストラ側の設定が必要)

ステップ2:Tunnelの作成とトークン取得

  1. Cloudflare ダッシュボードにログイン
  2. 左サイドバーの「Zero Trust」をクリック
  3. Networks」→「Tunnels」を開く
  4. + Create a tunnel」をクリック
  5. Cloudflared」を選択して「Next」
  6. Tunnel名を入力(例:laychat-standard)して「Save tunnel」
  7. 「Install connector」画面で Docker を選択すると、以下のようなコマンドが表示されます
表示例(TUNNEL_TOKENの確認場所)
docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token eyJhI...(この長い文字列がTUNNEL_TOKEN)

--token の後ろに続く長い文字列(eyJhI...で始まる)が TUNNEL_TOKEN です。この値をコピーしておいてください。

⚠️
TOKENは機密情報です
TUNNEL_TOKENは.envファイルに保存し、Gitや他者に共有しないよう注意してください。

ステップ3:ルートの設定(重要)

Tunnelを通じてどのドメインへのアクセスをLayChatに転送するか設定します。
ルートドメイン(例:your-domain.com)と wwwサブドメイン(例:www.your-domain.com)の 2つ を登録する必要があります。

⚠️
2つのルートを登録しないと、どちらかのURLでアクセスできません
例えば your-domain.com だけ登録した場合、www.your-domain.com でアクセスするとエラーになります。必ず両方登録してください。

ルート1:ルートドメイン

  1. Tunnel詳細ページ → 「Public Hostname」タブ → 「Add a public hostname
  2. 以下のように設定:
    • Subdomain:空白(何も入力しない)
    • Domainyour-domain.com(取得したドメイン)
    • Path:空白
    • Service TypeHTTP
    • URLapp:8080(Dockerコンテナ名とポート番号)
  3. 「Save hostname」をクリック

ルート2:wwwサブドメイン

  1. 同じ画面で再度「Add a public hostname
  2. 以下のように設定:
    • Subdomainwww
    • Domainyour-domain.com
    • Path:空白
    • Service TypeHTTP
    • URLapp:8080
  3. 「Save hostname」をクリック
💡
Serviceポート番号について
Dockerコンテナ内のLayChatアプリは app:8080 で動作しています(docker-compose.yml の PORT=8080 に対応)。Tunnel から app:8080 を指定することで、LayChatに転送されます。ホストOSのポートは関係ありません。

ステップ4:DNS設定の確認

Public Hostnameを保存すると、Cloudflare DNSに自動的にCNAMEレコードが作成されます。
ただし www サブドメインが自動作成されない場合は手動で追加が必要です。

  1. Cloudflare ダッシュボード → 対象ドメイン → 「DNS」→「Records
  2. 以下のレコードが存在することを確認:
    • CNAME: your-domain.com(または @)→ Tunnel ID のアドレス(Proxied)
    • CNAME: wwwyour-domain.com(Proxied)
  3. wwwのレコードがない場合は「+ Add record」から手動追加:
    • Type: CNAME
    • Name: www
    • Target: your-domain.com
    • Proxy status: Proxied(オレンジ色の雲アイコン)

ステップ5:TUNNEL_TOKENを.envに設定

ステップ2でコピーしたTUNNEL_TOKENを .env.standard(またはEnterprise版の場合 .env.enterprise)に設定します。

configs/.env.standard(TUNNEL_TOKENを追加)
# Cloudflare Tunnel設定
# ⚠️ Tunnelルートは「サブドメイン空白(your-domain.com)」と「www」の
#    2つを登録しないと、どちらかのURLでアクセスできなくなります
TUNNEL_TOKEN=eyJhI...(コピーしたトークン)

# アプリURL(OAuth利用時に必要)
APP_URL=https://your-domain.com

ステップ6:コンテナの起動(または再起動)

TUNNEL_TOKENを設定した後、コンテナを起動(または再起動)します。docker-compose.standard.yml には cloudflared サービスが含まれており、自動的にTunnel接続が確立されます。

bash(Standard版)
# 初回起動の場合(ビルドから)
docker-compose -f configs/docker-compose.standard.yml --env-file configs/.env.standard up -d --build

# すでに起動中のコンテナを再起動する場合
docker-compose -f configs/docker-compose.standard.yml --env-file configs/.env.standard up -d --force-recreate

ステップ7:動作確認

Tunnelの接続確認

bash
# cloudflaredのログを確認(Registered tunnel connectionと表示されれば成功)
docker logs laychat-standard-cloudflared --tail=20

ログに Registered tunnel connection が表示されれば、Tunnel接続は成功しています。

正常時のログ例
{"level":"info","message":"Registered tunnel connection","connIndex":0,...}
{"level":"info","message":"Registered tunnel connection","connIndex":1,...}
{"level":"info","message":"Registered tunnel connection","connIndex":2,...}
{"level":"info","message":"Registered tunnel connection","connIndex":3,...}

ブラウザからアクセス

  • https://your-domain.com にアクセスしてLayChatのログイン画面が表示されれば成功です
  • https://www.your-domain.com でも同様にアクセスできることを確認してください
💡
DNS反映には時間がかかる場合があります
ドメインのDNS設定変更後、反映まで数分〜最大数時間かかる場合があります。アクセスできない場合は少し待ってから再試行してください。
dig your-domain.com コマンドでDNSの浸透状況を確認できます。

よくあるトラブル

⚠️
cloudflaredコンテナがTLS handshakeエラーで起動しない
Service URLhttps://app:8080 に設定している場合に発生します。LayChatコンテナ内はHTTP通信のため、http://app:8080(またはルート設定で HTTP を選択)に変更してください。
⚠️
Tunnelのステータスが「非アクティブ」のまま
TUNNEL_TOKENが正しく設定されていないか、コンテナが起動していない可能性があります。docker ps でcloudflaredコンテナが起動しているか確認し、docker logs laychat-standard-cloudflared でエラーログを確認してください。
⚠️
www.your-domain.com にアクセスできない
Tunnel ルートに www サブドメイン分が登録されていないか、DNS の CNAME レコード(wwwyour-domain.com)が追加されていない可能性があります。ステップ3・4を再確認してください。

9. AWS Elastic Beanstalkへのデプロイ

ℹ️
この章について
Standard版・Enterprise版を AWS Elastic Beanstalk にデプロイする手順です。AWSアカウントおよびAWS CLIの操作知識が必要です。ローカルDockerで動作確認済みの方を対象としています。

EB CLIのインストール

bash
# pipを使ってEB CLIをインストール
pip install awsebcli

# バージョン確認
eb --version

アプリケーションの初期化

bash
# Ver1.2.0ディレクトリで初期化
cd /path/to/Ver1.2.0
eb init

# インタラクティブな質問への回答例:
# Region: ap-northeast-1 (アジアパシフィック・東京)
# Application name: laychat
# Platform: Docker
# Platform branch: Docker running on 64bit Amazon Linux 2023

.ebextensions の設定(タイムアウト)

.ebextensions/elb-timeout.config により、大容量ファイル転送中の切断を防ぐためALBのタイムアウトが300秒に設定されます。

.ebextensions/elb-timeout.config(確認用)
option_settings:
  aws:elbv2:loadbalancer:
    IdleTimeout: 300

Nginx WebSocket設定

.platform/nginx/conf.d/ 以下の設定ファイルがElastic Beanstalkの本番Nginxに自動適用されます。

.platform/nginx/conf.d/elasticbeanstalk/websocket.conf
# Socket.io WebSocket プロキシ設定
location /socket.io/ {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade    $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host       $host;
    proxy_cache_bypass          $http_upgrade;
    proxy_read_timeout  86400s;
    proxy_send_timeout  86400s;
    client_max_body_size 200m;
}

# ストリーミングファイルアップロード
location /api/upload-stream {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Host              $host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_request_buffering off;
    proxy_buffering         off;
    client_max_body_size 200m;
    proxy_read_timeout   300s;
    proxy_send_timeout   300s;
}

環境の作成とデプロイ

bash
# 新しい環境を作成(初回)
eb create laychat-production \
  --platform "Docker running on 64bit Amazon Linux 2023" \
  --region ap-northeast-1

# デプロイ(2回目以降)
eb deploy laychat-production

# ステータス確認
eb status

# ログ確認
eb logs

環境変数の設定(EBコンソール)

AWSコンソール → Elastic Beanstalk → 環境 → 「設定」→「ソフトウェア」→「環境プロパティ」から環境変数を設定します。

⚠️
セキュリティ注意 シークレット情報(AWSキー、APIキー等)はEBコンソールの環境プロパティで設定し、.envファイルをGit等のリポジトリにコミットしないでください。
ℹ️
EBではDockerコンテナ内のMongoDBは使えません。本番環境では MongoDB Atlasmongodb.com/cloud/atlas)などの外部MongoDBサービスを使用し、MONGODB_URIに接続文字列を設定してください。

10. Herokuへのデプロイ

ℹ️
この章について
Standard版・Enterprise版を Heroku にデプロイする手順です。Herokuアカウントおよびheroku CLIの操作知識が必要です。ローカルDockerで動作確認済みの方を対象としています。

Heroku CLIのインストール

bash
# macOS (Homebrew)
brew tap heroku/brew && brew install heroku

# npm経由
npm install -g heroku

# ログイン
heroku login

アプリの作成

bash
# Herokuアプリ作成
heroku create your-laychat-app

# Gitリモートの確認
git remote -v

Procfileの確認

Herokuはルートディレクトリの Procfile を読み込んで起動コマンドを決定します。LayChatのProcfileは以下の内容です。

Procfile
web: node --max-old-space-size=4096 server.js

--max-old-space-size=4096 により、Node.jsのヒープメモリ上限を4GBに設定しています。大容量ファイルのアップロード処理やBase64変換時のメモリ不足を防ぎます。

環境変数の設定

bash
# 環境変数を一括設定
heroku config:set \
  EDITION=standard \
  STORAGE_TYPE=s3 \
  AWS_ACCESS_KEY_ID=AKIAxxxxxxxxxx \
  AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxx \
  S3_BUCKET=my-laychat-uploads \
  GEMINI_API_KEY=AIzaSy... \
  VAPID_PUBLIC_KEY="BNZ8g7t..." \
  VAPID_PRIVATE_KEY="xK3j9m..." \
  VAPID_EMAIL="mailto:admin@example.com" \
  MONGODB_URI="mongodb+srv://user:pass@cluster.mongodb.net/laychat" \
  --app your-laychat-app

# 設定の確認
heroku config --app your-laychat-app

MongoDB Atlas連携

HerokuではMongoDBをコンテナで起動できないため、MongoDB Atlas(無料Tier M0利用可)と連携します。

  1. MongoDB Atlasでアカウント作成・Clusterを作成(M0 Free Tierで可)
  2. 「Database Access」でユーザーを作成(username / password を設定)
  3. 「Network Access」でHerokuのIPを許可(または「Allow Access from Anywhere」を設定)
  4. 接続文字列を取得して MONGODB_URI に設定:
    接続文字列の例
    mongodb+srv://laychat-user:password@cluster0.xxxxx.mongodb.net/laychat?retryWrites=true&w=majority

デプロイコマンド

bash
# Gitにコミット後、Herokuへプッシュ
git add .
git commit -m "Deploy LayChat"
git push heroku main

# デプロイ後のログ確認
heroku logs --tail --app your-laychat-app

# アプリを開く
heroku open --app your-laychat-app
⚠️
Heroku無料プランはEOLとなっています。Eco/Basic/Standard等の有料プランをご利用ください。また、Free StorageはS3を使用することを強く推奨します。

11. Nginxリバースプロキシ設定(VPS等)

VPSやオンプレミスサーバーでNginxをリバースプロキシとして使用する場合の設定です。

Nginxのインストール

bash(Ubuntu/Debian)
sudo apt-get update
sudo apt-get install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx

WebSocket対応 Nginx設定ファイル

以下のサンプル設定を /etc/nginx/sites-available/laychat として保存してください。

/etc/nginx/sites-available/laychat
upstream laychat_app {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name your-domain.com;

    # Let's Encryptを使う場合、certbotが自動でHTTPSリダイレクトを追加
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name your-domain.com;

    # SSL証明書(Let's Encryptの場合)
    ssl_certificate     /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    # 大容量ファイルアップロード対応
    client_max_body_size 200m;
    proxy_read_timeout    300s;
    proxy_connect_timeout  75s;
    proxy_send_timeout    300s;

    # 通常のHTTPリクエスト
    location / {
        proxy_pass         http://laychat_app;
        proxy_http_version 1.1;
        proxy_set_header   Host              $host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }

    # Socket.IO WebSocket接続(必須)
    location /socket.io/ {
        proxy_pass         http://laychat_app;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade    $http_upgrade;
        proxy_set_header   Connection "upgrade";
        proxy_set_header   Host       $host;
        proxy_cache_bypass             $http_upgrade;
        proxy_read_timeout  86400s;
        proxy_send_timeout  86400s;
        client_max_body_size 200m;
    }

    # ストリーミングアップロード(バッファリング無効化)
    location /api/upload-stream {
        proxy_pass              http://laychat_app;
        proxy_http_version      1.1;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_request_buffering off;
        proxy_buffering         off;
        client_max_body_size    200m;
        proxy_read_timeout      300s;
        proxy_send_timeout      300s;
    }
}

設定の有効化

bash
# シンボリックリンクを作成して有効化
sudo ln -s /etc/nginx/sites-available/laychat /etc/nginx/sites-enabled/

# デフォルト設定を無効化(必要に応じて)
sudo rm /etc/nginx/sites-enabled/default

# 設定ファイルの文法チェック
sudo nginx -t

# Nginxをリロード
sudo systemctl reload nginx

SSL/TLS設定(Let's Encrypt)

bash
# Certbotのインストール
sudo apt-get install -y certbot python3-certbot-nginx

# SSL証明書の取得と自動設定
sudo certbot --nginx -d your-domain.com

# 自動更新の確認
sudo certbot renew --dry-run
Let's Encryptの証明書は90日で期限切れになりますが、certbotが自動更新するcronジョブを設定します。sudo certbot renew --dry-run でエラーがなければ自動更新が機能しています。

12. バックアップ・メンテナンス

MongoDBのバックアップ(mongodump)

bash
# Dockerコンテナ内でmongodumpを実行(Free版の例)
docker exec laychat-free-mongo \
  mongodump --db laychat --out /tmp/backup

# バックアップをホストにコピー
docker cp laychat-free-mongo:/tmp/backup ./backup-$(date +%Y%m%d)

# 圧縮してアーカイブ
tar -czf backup-$(date +%Y%m%d).tar.gz ./backup-$(date +%Y%m%d)
rm -rf ./backup-$(date +%Y%m%d)

# リストア時
docker cp ./backup-20260101 laychat-free-mongo:/tmp/restore
docker exec laychat-free-mongo \
  mongorestore --db laychat /tmp/restore/laychat

定期バックアップの設定(cronジョブ)

bash
# crontabの編集
crontab -e

# 毎日午前2時にバックアップ(以下を追加)
0 2 * * * docker exec laychat-free-mongo mongodump --db laychat --archive=/tmp/laychat-$(date +\%Y\%m\%d).gz --gzip && docker cp laychat-free-mongo:/tmp/laychat-$(date +\%Y\%m\%d).gz /var/backups/laychat/

ローカルストレージのバックアップ

Free版でローカルストレージを使用している場合、uploads/ ディレクトリをバックアップします。

bash
# uploadsディレクトリを圧縮バックアップ
tar -czf uploads-backup-$(date +%Y%m%d).tar.gz /path/to/laychat/uploads/

# rsyncで別サーバーに同期
rsync -avz /path/to/laychat/uploads/ user@backup-server:/backup/laychat-uploads/

システム管理画面からのメンテナンス

システム管理者はブラウザからメンテナンス操作を実行できます。

管理画面 → 「メンテナンス」タブ から以下の操作・確認が可能です:

項目説明
💾 ドライブ使用量 サーバーのディスク使用率・使用量(GB)・空き容量・合計容量をプログレスバーで表示。使用率70%以上でオレンジ、90%以上で赤に変化します。
🧹 孤児データのクリーンアップ 削除済みグループに残っているメッセージなどを消去しDBの容量を削減します。週1回程度の実行を推奨します。
⚠️ 古いメッセージの一括削除 1年以上前のすべてのメッセージを一括削除。データベースの肥大化を防ぎます。この操作は取り消せません。
🚨
注意:操作は取り消しできません メンテナンス操作実行前に、必ずMongoDBとファイルのバックアップを取得してください。

Dockerコンテナの更新方法

ソースコードを更新した後、以下の手順でコンテナを更新します。

bash
# ソースコードを更新後、コンテナを再ビルド・再起動
docker compose -f configs/docker-compose.free.yml up -d --build

# 古いDockerイメージのクリーンアップ
docker image prune -f

13. トラブルシューティング

ログの確認方法

bash
# アプリケーションログ(リアルタイム)
docker compose -f configs/docker-compose.free.yml logs -f

# アプリコンテナのみ
docker compose -f configs/docker-compose.free.yml logs -f app

# MongoDBコンテナのログ
docker compose -f configs/docker-compose.free.yml logs -f mongo

# 直近100行を表示
docker compose -f configs/docker-compose.free.yml logs --tail=100

起動しない場合のチェックリスト

症状原因対処法
コンテナがすぐに停止する 環境変数の設定ミス、必須項目の未入力 docker logs laychat-free-app でエラーを確認
bind: address already in use ポート8080が他のプロセスに使用中 下記「ポート競合の解決」を参照
dockerfileのビルドエラー Dockerfileの問題、ネットワーク接続エラー docker compose build --no-cache で再試行
MongoDBに接続できない MongoDBコンテナの起動前にアプリが起動 docker compose restart app で再起動
VAPID関連のエラー VAPIDキーの形式が不正 web-push generate-vapid-keys で再生成

WebSocket接続エラー

チャット画面に「接続中...」が表示され続ける場合は、WebSocket接続が確立できていません。

  • Nginxを使用している場合、Upgrade / Connection ヘッダーが設定されているか確認
  • AWS ALBを使用している場合、WebSocketプロトコルを許可するリスナー設定が必要
  • ブラウザの開発者ツール → ネットワーク → WS タブでエラー内容を確認
  • HTTPS環境では ws:// ではなく wss:// が使用されているか確認

ファイルアップロードエラー

エラー内容原因対処法
413 Request Entity Too Large Nginxの client_max_body_size 超過 Nginx設定で client_max_body_size 200m; を確認
S3アップロード失敗 AWSキーの設定ミス、バケットポリシー不備 IAMポリシーとバケットポリシーを確認
ローカルストレージに保存できない uploads/ ディレクトリの書き込み権限なし chmod 755 uploads/ で権限を付与

MongoDB接続エラー

bash
# MongoDBコンテナの状態確認
docker ps | grep mongo

# MongoDBコンテナに接続してテスト
docker exec -it laychat-free-mongo mongosh --eval "db.adminCommand('ping')"

# アプリを再起動(MongoDB起動後に試す)
docker compose -f configs/docker-compose.free.yml restart app

ポート競合の解決

bash
# ポート8080を使用しているプロセスを確認
sudo lsof -i :8080

# 別のポートを使う場合は docker-compose.*.yml の ports を変更
# 例: "3000:8080" に変更して http://localhost:3000 でアクセス

# または既存のコンテナが残っている場合は削除
docker rm -f laychat-free-app
docker compose -f configs/docker-compose.free.yml up -d

14. 付録

環境変数一覧(全エディション)

変数名 Free Standard Enterprise 説明
EDITION free / standard / enterprise
STORAGE_TYPE local / s3
MONGODB_URI MongoDB接続文字列(Docker時は自動設定)
PORT サーバーポート(デフォルト: 3000、Docker: 8080)
VAPID_PUBLIC_KEY Web Push通知用公開鍵
VAPID_PRIVATE_KEY Web Push通知用秘密鍵
VAPID_EMAIL Web Push連絡先(mailto:形式)
APP_URL アプリのURL(OAuth使用時に必要)
SESSION_SECRET セッション署名用シークレット(OAuth使用時に必要)
GOOGLE_CLIENT_ID 任意 任意 任意 Google OAuth クライアントID
GOOGLE_CLIENT_SECRET 任意 任意 任意 Google OAuth クライアントシークレット
MICROSOFT_CLIENT_ID 任意 Microsoft OAuth クライアントID
MICROSOFT_CLIENT_SECRET 任意 Microsoft OAuth クライアントシークレット
AWS_ACCESS_KEY_ID AWS S3認証キーID
AWS_SECRET_ACCESS_KEY AWS S3認証シークレットキー
S3_BUCKET S3バケット名
GEMINI_API_KEY Google Gemini AI API キー
TURN_URL 任意 任意 TURNサーバーURL(ビデオ通話)
TURN_USERNAME 任意 任意 TURN認証ユーザー名
TURN_CREDENTIAL 任意 任意 TURN認証パスワード
LAYCHAT_LICENSE_KEY Standard/Enterprise版ライセンスキー(LAYCHAT-STD-XXXXXXXX / LAYCHAT-ENT-XXXXXXXX)
LAYCHAT_MASTER_URL ライセンス検証先のサーバーURL(内部管理用)

よく使うDockerコマンド一覧

操作コマンド(Free版の例)
起動(バックグラウンド) docker compose -f configs/docker-compose.free.yml up -d
再ビルドして起動 docker compose -f configs/docker-compose.free.yml up -d --build
停止 docker compose -f configs/docker-compose.free.yml down
再起動 docker compose -f configs/docker-compose.free.yml restart
ログ確認(リアルタイム) docker compose -f configs/docker-compose.free.yml logs -f
コンテナ一覧 docker ps
コンテナに接続 docker exec -it laychat-free-app sh
MongoDBに接続 docker exec -it laychat-free-mongo mongosh
ボリューム一覧 docker volume ls
不要イメージ削除 docker image prune -f
全停止+ボリューム削除(注意) docker compose -f configs/docker-compose.free.yml down -v

ファイル構成一覧

ファイル/ディレクトリ説明
server.jsバックエンド(Express + Socket.IO)約1,157行
main.jsフロントエンドJS 約2,462行・114関数
index.htmlフロントエンドHTML(約52KB)
style.cssスタイルシート(約261行)
sw.jsService Worker(PWA対応)
manifest.jsonPWAマニフェスト
dockerfileマルチステージビルド(難読化含む)
ProcfileHeroku起動コマンド(node --max-old-space-size=4096)
package.json依存関係定義
configs/.env.freeFree版環境設定
configs/.env.standardStandard版環境設定
configs/.env.enterpriseEnterprise版環境設定
configs/docker-compose.free.ymlFree版 Docker Compose設定
configs/docker-compose.standard.ymlStandard版 Docker Compose設定
configs/docker-compose.enterprise.ymlEnterprise版 Docker Compose設定
.ebextensions/elb-timeout.configAWS ELB タイムアウト設定(300秒)
.platform/nginx/conf.d/upload.confNginxファイルアップロード設定
.platform/nginx/conf.d/elasticbeanstalk/websocket.confNginx WebSocket設定
uploads/ローカルストレージ用ディレクトリ(Free版)
Documents/マニュアル類