Gainium について
Gainium Docker Compose 構成は、マイクロサービス、データベース、フロントエンドを含む Gainium 取引プラットフォームをデプロイします。ローカル開発やセルフホスト環境を対象としています。本プロジェクトは MCP サーバーでもクライアントでもありません。
主な機能
- 011 つの Compose ファイルで 18 のサービスを起動
- 02MongoDB、Redis、RabbitMQ の基盤を同梱
- 03GraphQL API と WebSocket によるリアルタイム配信
- 04設定可能な ENCRYPT_KEY による資格情報の暗号化
- 05価格コネクタの取引所とモードを選択
活用シーン
- 01ローカルでの Gainium プラットフォーム開発
- 02自社ホストへのセルフホストによる取引基盤の構築
- 03価格データのモード選択によるリソース使用量の削減
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Gainium の Docker Compose セットアップ
すべてのマイクロサービス、データベース、フロントエンドアプリケーションを含む、Gainium 取引プラットフォームの完全な Docker オーケストレーションです。
📋 目次
🔧 前提条件
開始する前に、以下を用意してください。
- Docker(v20.10 以降)と Docker Compose(v2.0 以降)がインストールされていること
- 4GB 以上の RAM と 5GB 以上の空きディスク容量
⚡ クイックスタート
1. クローンして移動
# Clone the repository
git clone https://github.com/Gainium/docker-sh.git
# Navigate into the cloned directory
cd docker-sh
2. 環境をセットアップ
# Copy the sample environment file
cp .env.sample .env
# Generate this installation's encryption key (see below — back it up)
./setupEncryptKey.sh
# Edit the .env file with your configuration
nano .env # or use your preferred editor
3. 変数を設定(任意)
.env ファイルを編集し、必要に応じて変数を設定します。
# Coinbase API credentials (only required if using Coinbase)
COINBASEKEY=your_coinbase_api_key
COINBASESECRET=your_coinbase_secret
4. すべてのサービスを起動
# Start all services in background
docker-compose up -d
# View logs (optional)
docker-compose logs -f
5. セットアップを確認
- API:http://localhost:7503(GraphQL エンドポイント)
- WebSocket:ws://localhost:7502(リアルタイムデータ)
- フロントエンド:http://localhost:7500(ウェブダッシュボード)
🔧 環境設定
🔐 暗号化キー(ENCRYPT_KEY)
ユーザーが追加する取引所 API 認証情報は暗号化して保存されます。これを暗号化するのが ENCRYPT_KEY です。インストール環境用にキーを生成してください。
./setupEncryptKey.sh
キーを設定しない場合、アプリケーションはイメージにコンパイルされたキーを使用します。このキーはすべてのセルフホスト環境で共通であり、公開ソースコードから確認できます。そのため、データベースのコピーだけで、保存されたすべての認証情報を復号できます。独自のキーを設定すれば、その心配はありません。
キーは、このホスト以外の場所にもバックアップしてください。 キーを紛失すると、保存された取引所の認証情報は誰にも復元できず、すべてのユーザーがキーを再入力する必要があります。
すでにキーを設定せずに稼働していますか? 今からキーを設定し、保存済みのデータを後から再暗号化できます。その間に問題が発生することはありません。デプロイガイドの暗号化キーを参照してください。
任意の変数
| 変数 | 説明 | 例 | 必須 |
|---|---|---|---|
COINBASEKEY | Coinbase Pro API キー | your_api_key | Coinbase を使用する場合のみ |
COINBASESECRET | Coinbase Pro API シークレット | your_secret | Coinbase を使用する場合のみ |
PRICE_CONNECTOR_EXCHANGES | WebSocket 価格コネクターで使用する取引所のカンマ区切りリスト | binance,kucoin,bybit | いいえ(未設定の場合はすべてに接続) |
データベース設定
| 変数 | デフォルト | 説明 |
|---|---|---|
MONGO_DB_USERNAME | user | MongoDB のユーザー名 |
MONGO_DB_PASSWORD | password | MongoDB のパスワード |
MONGO_DB_NAME | gainium | データベース名 |
REDIS_PASSWORD | H2Ga1DB1alBg | Redis のパスワード |
RABBIT_USER | gainium | RabbitMQ のユーザー名 |
RABBIT_PASSWORD | bdo3nyVMX5l6 | RabbitMQ のパスワード |
サービスポート
| サービス | ポート | 説明 |
|---|---|---|
GRAPH_QL_PORT | 7503 | メイン API の GraphQL エンドポイント |
WS_PORT | 7502 | WebSocket ストリーミングサービス |
PORT | 7500 | フロントエンドのウェブダッシュボード |
BACKTEST_PORT | 7515 | バックテストサービス |
🔒 ダッシュボードと API のみを公開してください
内部サービスは、いずれも認証を行いません。アクセスできない状態にあるから安全なのであり、それ以外の理由はありません。 必要な場合は PORT(7500)と GRAPH_QL_PORT(7503)を公開し、それ以外はすべて内部 Docker ネットワーク内に置くか、ホストのループバックインターフェースにバインドしてください。また、ファイアウォールでポートを開放しないでください。
特に、次の 2 つのサービスには注意が必要です。
- exchange-connector. これは認証情報をそのまま中継するプロキシです。
GET /verifyとGET /keyPermissionsに渡されたあらゆる取引所 API キーを取引所に照会して有効性を確認し、その結果を返します。キーで出金できるかどうかも返します。想定される呼び出し元はバランサーのみのため、呼び出し元認証もスロットリングも意図的に設けていません。外部からアクセス可能になると、盗まれた取引所キーを大量に検証するためのサービスになってしまいます。ポートは決して公開しないでください。 - paper-trading.
POST /userは、呼び出し元が開始残高を指定してアカウントを作成できますが、認証はありません。資金はシミュレーション上のものなので、損失によって生じるのは資金ではなく汚染されたデータですが、公開してよいエンドポイントではありません。単一ホストにデプロイする場合は、このサービスにAPP_HOST=127.0.0.1を設定し、ネットワークから完全に切り離すことができます。
スタックの前段にリバースプロキシを配置する場合は、ダッシュボードと API のルートのみを通過させてください。この Compose ファイル内の他のサービスは、管理下にないネットワークに公開するようには設計されていません。
⚠️ 重要:PRICEROLE の設定
PRICEROLE 環境変数は、システムが価格更新を処理する方法を制御し、リソース使用量に大きな影響を与える可能性があります。
| 値 | 説明 | リソース使用量 | 用途 |
|---|---|---|---|
all | デフォルト - ティッカーストリームとローソク足ストリームの両方に接続します | 高 - ティッカーをリアルタイムで更新します | ペーパートレーディング、高頻度取引 |
candle | ローソク足ストリームのみに接続し、ティッカーストリームは無視します | 低 - 2.5 分ごとの定期更新 | ペーパートレーディングを使用しないライブ取引 |
ticker | ティッカーストリームのみに接続します | 中 - ティッカーのみをリアルタイムで更新します | 特定ティッカーの監視 |
⚠️ リソースへの影響に関する警告:
PRICEROLE=allは、ティッカーを高頻度で更新するため、かなりのリソースを消費する可能性があります- ペーパートレーディングを使用していない場合は、リソース使用量を減らすために
PRICEROLE=candleを設定してください PRICEROLE=candleでは、ボットの価格関連メソッドはリアルタイムではなく、2.5 分ごとのスケジュールで実行されます
設定例:
# For production without paper trading (recommended)
PRICEROLE=candle
# For development/paper trading (default)
PRICEROLE=all
# For ticker monitoring only
PRICEROLE=ticker
🔗 PRICE_CONNECTOR_EXCHANGES の設定
PRICE_CONNECTOR_EXCHANGES 環境変数を使用すると、価格データを受信するために WebSocket 価格コネクターが接続する取引所を指定できます。
対応取引所:
binance- Binance 取引所binanceus- Binance US 取引所kucoin- KuCoin 取引所bybit- Bybit 取引所okx- OKX 取引所bitget- Bitget 取引所coinbase- Coinbase 取引所kraken- Kraken 取引所hyperliquid- Hyperliquid 取引所
設定オプション:
# Connect to all exchanges (default behavior)
# Leave variable unset or empty
PRICE_CONNECTOR_EXCHANGES=
# Connect to specific exchanges only
PRICE_CONNECTOR_EXCHANGES=binance,kucoin,bybit
# Connect to a single exchange
PRICE_CONNECTOR_EXCHANGES=binance
# Connect to multiple exchanges
PRICE_CONNECTOR_EXCHANGES=binance,binanceus,coinbase,okx
重要な注意事項:
PRICE_CONNECTOR_EXCHANGESが設定されていないか空の場合、コネクターは対応するすべての取引所に接続します- 取引所名の間にスペースを入れず、カンマ区切りで指定してください
- 無効な取引所名は無視されます
- この設定は WebSocket 価格コネクターサービスにのみ適用されます
フロントエンドのランタイム設定
フロントエンドサービスでは、サーバーと WebSocket の設定にランタイム環境変数を使用できるようになりました。
# Default values (for local development)
NEXT_PUBLIC_SERVER=http://localhost:7503
NEXT_PUBLIC_WS=ws://localhost:7502
# For remote deployment, set these to your domain/IP
NEXT_PUBLIC_SERVER=https://api.yourdomain.com
NEXT_PUBLIC_WS=wss://ws.yourdomain.com
重要な注意事項:
- これらの変数はビルド時ではなく、コンテナのランタイムに設定します
- デフォルト値はローカル開発で使用できます
- 本番環境にデプロイする場合は、サーバーに合わせてこれらの値を更新してください
- 環境変数を変更した場合は、コンテナを再作成する必要があります
使用例:
# Local development (uses defaults)
docker-compose up -d
# Production deployment - update docker-compose.yml:
# services:
# frontend:
# environment:
# - NEXT_PUBLIC_SERVER=https://api.mycompany.com
# - NEXT_PUBLIC_WS=wss://ws.mycompany.com
🏗️ サービスの概要
インフラストラクチャサービス(3)
- mongo:永続ストレージを備えた MongoDB データベース
- redis:Redis キャッシュおよびセッションストア
- rabbit:RabbitMQ メッセージブローカー
コネクターサービス(4)
- exchange-connector:Exchange API との統合
- paper-trading:ペーパートレードのシミュレーション
- user-update-connector:ユーザー情報のリアルタイム更新
- price-connector:価格データのストリーミング
メインアプリケーションサービス(10)
すべてのサービスは同じコードベースを共有していますが、異なるコマンドを実行します。
- api:GraphQL API サーバー(ポート 7503)
- stream:WebSocket ストリーミング(ポート 7502)
- bots-dca:DCA 取引ボット
- bots-grid:グリッド取引ボット
- bots-combo:組み合わせ取引ボット
- bots-hedge-combo:ヘッジ組み合わせボット
- bots-hedge-dca:ヘッジ DCA ボット
- indicators:テクニカル指標プロセッサー
- cron:スケジュールタスクとメンテナンス
- backtest:戦略バックテストサービス
フロントエンドサービス(1)
- frontend:Next.js ウェブダッシュボード(ポート 7500)
合計:18 サービス
🐳 Docker イメージ
レジストリから以下のイメージを使用します。
| イメージ | バージョン | 使用するサービス |
|---|---|---|
docker.gainium.io/gainium/exchange-connector | 1.0.0 | exchange-connector |
docker.gainium.io/gainium/paper-trading | 1.0.0 | paper-trading |
docker.gainium.io/gainium/websocket-connector | 1.0.0 | user-update-connector, price-connector |
docker.gainium.io/gainium/main-app | 1.0.0 | すべての main-app サービス(10個) |
docker.gainium.io/gainium/frontend | 1.0.0 | frontend |
外部イメージ:
bitnami/mongodb:latestbitnami/redis:latestbitnami/rabbitmq:latest
🚀 使用コマンド
サービスの起動
# Start all services
docker-compose up -d
# Start specific services
docker-compose up -d mongo redis rabbit
docker-compose up -d api frontend
# Start with build (rebuild images)
docker-compose up -d --build
# Start and view logs
docker-compose up
イメージの更新
まず
git pullを実行してください。これはアップグレードの一部であり、省略できません。 イメージタグは、追跡対象のdocker-compose.ymlにデフォルト値(${MAIN_APP_VERSION:-…})として設定されており、新しいリリースではこのリポジトリでタグが更新されます。古いチェックアウトのままdocker-compose pullを実行すると、現在実行中のタグを再取得するだけで、更新は行われません。代わりに、ダッシュボードの Admin → Services タブを使用する方法もあります。このタブではレジストリのバージョンが.versions.envに固定されるため、git pullは不要です。
# Update and restart services (the full upgrade)
git pull
docker-compose pull && docker-compose up -d
# Pull latest images from registry only
docker-compose pull
# Pull specific image
docker pull docker.gainium.io/gainium/main-app:1.0.0
docker pull docker.gainium.io/gainium/frontend:1.0.0
# See which tags your checkout would actually pull
docker compose config --images
サービスの管理
# Stop all services
docker-compose down
# Stop and remove volumes (⚠️ deletes database data)
docker-compose down -v
# Restart specific service
docker-compose restart api
docker-compose restart frontend
# Scale a service (if supported)
docker-compose up -d --scale bots-dca=2
監視とデバッグ
# View logs for all services
docker-compose logs -f
# View logs for specific service
docker-compose logs -f api
docker-compose logs -f frontend
docker-compose logs -f mongo
# View service status
docker-compose ps
# Execute command in running container
docker-compose exec api bash
docker-compose exec mongo mongosh
# View resource usage
docker stats
メンテナンスコマンド
# Update images (git pull first — see "Updating Images" above)
git pull
docker-compose pull
docker-compose up -d
# Clean up unused resources
docker system prune
# Remove all Gainium images
docker images | grep docker.gainium.io | awk '{print $3}' | xargs docker rmi
# Reset everything (⚠️ deletes all data)
docker-compose down -v --rmi all
パスワードのリセット
セルフホスト環境でパスワードを復旧する方法はこれだけです。 「パスワードをお忘れですか」のメールリンクはありません。この手順は、メール配信が設定された Gainium のホストサービスでのみ利用できます。ご自身のデプロイ環境では、サインインできないユーザーのために、シェルアクセス権を持つ運用担当者が以下のコマンドを実行する必要があります。ユーザーにアカウントを渡す前に、この点を考慮してください。
コマンドラインからユーザーのパスワードをリセットするには:
# Using helper script (recommended)
./resetPassword.sh <username> <newPassword>
# Or using Docker Compose directly
docker-compose run --rm cli-runner npm run cli:reset-password -- <username> <newPassword>
パスワードの要件: 6文字以上で、大文字、小文字、数字をそれぞれ1文字以上含めてください。
例:
./resetPassword.sh admin MyNewPass123
この操作を行うと、ユーザーはすべての場所でサインアウトされます。 アカウントの既存セッションがすべて無効になるため、ユーザーと、そのセッションを保持している人は、新しいパスワードで再度サインインする必要があります。これは意図的な動作です。アカウントが侵害された可能性があるためにリセットする場合、侵入者のセッションがリセット後も有効なままにならないようにする必要があります。
ユーザーがこの操作を必要とするケース
- パスワードを忘れてサインインできない。 唯一の方法です。メールリンクはありません。
- パスワードを忘れたが、まだサインインしている。 この方法を使用してください。main-app
1.52.0以降、アプリ内の Settings → Change Password フォームではアカウントの 現在の パスワードが必要です。そのため、サインイン中でもパスワードを忘れたユーザーは自分で変更できません。(このリリース以前は、セッションがあれば新しいパスワードを設定できたため、漏えいしたセッションによってアカウントが完全に乗っ取られる可能性がありました — GHSA-4m6h-m5mj-733x。) - アカウントが侵害された疑いがある。 アプリからではなく、ここでリセットしてください。このコマンドはすべてのセッションを無効にし、侵入者を締め出します。
運用上の注意
- ユーザー名にはアカウントのメールアドレスを使用します。大文字と小文字は区別されません。
- 新しいパスワードは、ほかのすべての書き込み処理と同様に bcrypt ハッシュとして書き込まれます。復元可能な形式で保存されることはありません。
- コマンドの実行中、パスワードはシェルの履歴とプロセス一覧に表示されます。共有ホストでは実行後に履歴から削除し(
history -d)、ユーザーには復帰後にパスワードを変更してもらってください。 - このコマンドは稼働中のデータベースに対して
cli-runnerを実行するため、その後にスタックを再起動する必要はありません。
🔍 トラブルシューティング
よくある問題
1. サービスが起動しない — イメージが見つからない
# Error: pull access denied or image not found
# Solution: Check image names and tags in docker-compose.yml
docker-compose pull # Pull all required images
2. サービスが起動しない — ポートがすでに使用されている
# Find what's using the port
lsof -i :7503
# Kill the process or change the port in .env
3. データベース接続の問題
# Check if MongoDB is running
docker-compose logs mongo
# Reset database
docker-compose restart mongo
4. メモリ不足エラー
# Check available resources
docker stats
# Increase Docker memory limit or reduce running services
5. Mac との互換性の問題(Apple Silicon M1/M2)
問題:特に Apple Silicon チップ搭載の Mac で、サービスが起動しません。
# Common error messages:
# "exec format error"
# "WARNING: The requested image's platform does not match the detected host platform"
# Services keep restarting or fail to start
解決策:
オプション 1:Docker Desktop の Rosetta 2 エミュレーションを使用する
- Docker Desktop を開きます
- Settings → General に移動します
- 「Use Rosetta for x86/amd64 emulation on Apple Silicon」にチェックを入れます
- Docker Desktop を再起動します
- 次を実行します:
docker-compose down && docker-compose up -d
オプション 2:Docker の実験的機能を有効にする
# Enable buildx for multi-platform support
docker buildx create --use
docker buildx inspect --bootstrap
# Pull ARM64 specific images
docker pull --platform linux/arm64 bitnami/redis:latest
docker pull --platform linux/arm64 bitnami/rabbitmq:latest
オプション 3:Docker Desktop の設定を確認する
- 最新バージョンの Docker Desktop を使用していることを確認します
- Settings → Resources に移動し、十分なリソースを割り当てます:
- メモリ:4GB 以上
- CPU:2 コア以上
- Docker Desktop を再起動します
確認:
# Check if all services are running properly
docker-compose ps
# Check logs for any platform-related errors
docker-compose logs | grep -i "platform\|arch\|format"
# Test database connections
docker-compose exec mongo mongosh --version
docker-compose exec redis redis-cli ping
6. Docker レジストリのタイムアウトに関する問題
問題:イメージのプル中に Docker レジストリへの接続がタイムアウトします。
# Common error message:
# "Error response from daemon: Get "https://docker.gainium.io/v2/gainium/main-app/manifests/sha256:..." context deadline exceeded"
解決策: 通常、これは Docker レジストリからイメージをプルする際のネットワークタイムアウトの問題です。ほとんどの場合、コマンドを再試行するだけで解決します:
# Retry pulling images
docker-compose pull
# If pull succeeds, restart the services
docker-compose up -d
# Alternative: Pull specific image that failed
docker pull docker.gainium.io/gainium/main-app:1.0.0
注:レジストリのタイムアウトは、一時的なネットワークの問題であることがほとんどです。問題が解決しない場合は、インターネット接続を確認するか、数分後に再試行してください。
デバッグ手順
-
サービスの状態を確認します:
docker-compose ps -
詳細なログを表示します:
docker-compose logs serviceName -
接続をテストします:
# Test API curl http://localhost:7503/health # Test WebSocket wscat -c ws://localhost:7502 -
コンテナを調べます:
docker-compose exec api bash
� 高度な設定
環境別のセットアップ
環境ごとに異なるファイルを作成します:
# Development
cp .env.sample .env.development
# Production
cp .env.sample .env.production
# Use specific environment
docker-compose --env-file .env.production up -d
パフォーマンスの調整
# Limit service resources in docker-compose.yml
services:
api:
deploy:
resources:
limits:
memory: 1G
cpus: '0.5'
ヘルスチェック
サービスの状態を監視するため、ヘルスチェックを追加します:
# Check all services health
docker-compose ps
📊 モニタリング
サービスのエンドポイント
- API ヘルス:http://localhost:7503/health
- API GraphQL:http://localhost:7503/graphql
- WebSocket:ws://localhost:7502
- フロントエンド:http://localhost:7500
- RabbitMQ 管理:http://localhost:15672 (guest/guest)
ログ管理
# Rotate logs to prevent disk space issues
docker-compose logs --no-log-prefix api > api.log 2>&1
📝 重要な注意事項
- 初回実行:最初のイメージのプルには、インターネットの速度に応じて 5~10 分かかることがあります
- リソース要件:システム要件は引き下げられています(RAM は 4GB 以上を推奨)
- データの永続化:データベースのデータは Docker ボリュームに保存されます
- ネットワーク:すべてのサービスは、デフォルトの Docker ブリッジネットワーク上で通信します
🆘 サポート
問題が発生した場合:
- この README のトラブルシューティングセクションを確認します
- サービスログを表示します:
docker-compose logs serviceName - Docker のリソースを確認します:
docker stats - 環境設定を確認します:
cat .env
さらにサポートが必要な場合は、以下を添えて Gainium 開発チームにお問い合わせください:
.envファイル(シークレットを伏せたもの)- エラーを示すサービスログ
docker-compose psの出力
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。