環境変数
セルフホスト Melso でよく使うサーバー、ストレージ、連携、ランタイムの設定。
Melso はプロセス起動時に環境変数を読み込みます。変更後は、該当する API・Web・デーモンのプロセスを再起動してください。Docker Compose の docker compose restart は .env を再読み込みしません。up -d でコンテナを再作成して初めて反映されます。
このページにはデプロイ運用者向けの設定のみを載せています。テスト用変数や内部タスク用の変数は扱いません。グループ別のリファレンスとして使い、完全なデプロイ手順はセルフホストクイックスタートを参照してください。
プロダクションの最小構成
DATABASE_URL=postgres://user:password@postgres:5432/multica?sslmode=require
JWT_SECRET=<long-random-secret>
APP_ENV=production
FRONTEND_ORIGIN=https://multica.example.com
MULTICA_APP_URL=https://multica.example.com
MULTICA_PUBLIC_URL=https://api.multica.example.comさらにメールサービスを 1 つ選ぶ必要があります。選ばない場合、認証コードと招待はサーバーログに書き込まれるだけです。
プロダクションでデフォルトの JWT_SECRET を使わないでください。MULTICA_DEV_VERIFICATION_CODE も設定しないでください。
API とデータベース
| 変数 | デフォルト | 説明 |
|---|---|---|
DATABASE_URL | ローカルの multica データベース | PostgreSQL 接続文字列 |
DATABASE_MAX_CONNS | 25 | API プロセスあたりの最大データベース接続数 |
DATABASE_MIN_CONNS | 5 | API プロセスが保持する最小接続数 |
PORT | 8080 | API のリッスンポート |
JWT_SECRET | 開発用の固定値 | ログイン JWT と一部の署名フローに使うシークレット |
APP_ENV | 空 | プロダクションでは production を設定 |
AUTH_TOKEN_TTL | 720h(30 日) | ブラウザ JWT と cookie の有効期間。Go duration または正の整数秒を受け付けます |
LOG_LEVEL | アプリのデフォルト | ログレベル |
MULTICA_SHUTDOWN_HOLD_DURATION | 0 | 終了シグナル受信後、グレースフルシャットダウンを開始するまでの待機時間 |
Kubernetes で shutdown hold を設定する場合、terminationGracePeriodSeconds は hold と実際のシャットダウンにかかる時間の合計より大きくしてください。
公開アドレスとブラウザアクセス
| 変数 | デフォルト | 説明 |
|---|---|---|
FRONTEND_ORIGIN | 空 | ユーザーがアクセスするフロントエンドの origin。CORS、cookie、招待リンクに使われます |
MULTICA_APP_URL | FRONTEND_ORIGIN にフォールバック | ユーザーが到達できる Web アドレス。CLI ログインとアカウント連携リンクが使います |
MULTICA_PUBLIC_URL | 空 | 公開 API アドレス。webhook URL とランタイム接続案内に使われます |
CORS_ALLOWED_ORIGINS | 空 | 追加で許可する HTTP origin。カンマ区切り |
ALLOWED_ORIGINS | CORS / フロントエンド設定にフォールバック | WebSocket origin の許可リスト。カンマ区切り |
COOKIE_DOMAIN | 空 | フロントエンドと API の host が異なり、ブラウザが API ドメインへ直接アクセスする場合は必須。単一ドメイン構成では空のまま |
フロントエンドと API が異なる host を使い、ブラウザが API ドメインへ直接アクセスする構成では、COOKIE_DOMAIN の設定が必須です。設定しないとブラウザが CSRF cookie を読めず、すべての書き込みリクエストが 403 CSRF validation failed を返す一方、読み取りは正常に動きます。値には、両方の host を同時にカバーできる最も狭い親ドメインを使ってください(.example.com より .agent.example.com)。この設定はログインセッション cookie をそのドメイン配下のすべての host に広げるため、それらの host がすべて同一の信頼できる運用主体のものである場合にのみ使えます。変更後は両方の host で古い cookie を削除し、再ログインしてください。セルフホストクイックスタートの同一オリジン構成(ブラウザは app ドメインのみアクセス)に従う場合は、空のままで構いません。IP アドレスは指定しないでください。ブラウザは Domain が IP の cookie を無視します。
セルフホストのデプロイでは FRONTEND_ORIGIN の設定が必須です。設定しないと、招待リンク、cookie のセキュリティ属性、WebSocket の origin 検証が実際のドメインと食い違うおそれがあります。
メールとログイン
Resend
| 変数 | デフォルト | 説明 |
|---|---|---|
RESEND_API_KEY | 空 | 設定すると Resend が有効になります |
RESEND_FROM_EMAIL | noreply@melso.ai | 送信元アドレス。検証済みドメインに属している必要があります |
SMTP
SMTP_HOST が空でない限り、SMTP が Resend より優先されます。
| 変数 | デフォルト | 説明 |
|---|---|---|
SMTP_HOST | 空 | SMTP ホスト。設定すると SMTP が有効になります |
SMTP_PORT | 25 | よく使う値: 25、587、465 |
SMTP_USERNAME | 空 | ユーザー名。匿名 relay では空のまま |
SMTP_PASSWORD | 空 | パスワード |
SMTP_FROM_EMAIL | RESEND_FROM_EMAIL にフォールバック | Envelope From とメールの From |
SMTP_TLS | starttls | implicit、smtps、ssl は暗黙的 TLS を意味します。465 では自動的に有効 |
SMTP_TLS_INSECURE | false | 証明書検証をスキップ。信頼できる内部ネットワーク専用 |
SMTP_EHLO_NAME | ホスト名 | 厳格な relay が要求する EHLO/FQDN |
Google OAuth
| 変数 | デフォルト | 説明 |
|---|---|---|
GOOGLE_CLIENT_ID | 空 | Google OAuth client ID |
GOOGLE_CLIENT_SECRET | 空 | Google OAuth client secret |
GOOGLE_REDIRECT_URI | http://localhost:3000/auth/callback | Google Console のコールバックアドレスと完全に一致している必要があります |
サインアップ範囲
| 変数 | デフォルト | 説明 |
|---|---|---|
ALLOW_SIGNUP | true | allowlist が一つも設定されていない場合に新規登録を許可するか |
ALLOWED_EMAILS | 空 | 登録を許可する完全なメールアドレス。カンマ区切り |
ALLOWED_EMAIL_DOMAINS | 空 | 登録を許可するメールドメイン。カンマ区切り |
DISABLE_WORKSPACE_CREATION | false | すべてのユーザーのワークスペース新規作成を禁止。owner/admin の例外はありません |
MULTICA_DEV_VERIFICATION_CODE | 空 | 非 production 環境で使う固定 6 桁のテスト認証コード |
allowlist の正確な判定順序はログインとサインアップを参照してください。
添付ファイルストレージ
S3_BUCKET が未設定の場合、Melso はローカルディスクを使います。
S3 または互換ストレージ
| 変数 | デフォルト | 説明 |
|---|---|---|
S3_BUCKET | 空 | バケット名。完全な hostname は指定しないでください |
S3_REGION | us-west-2 | バケットのあるリージョン |
AWS_ACCESS_KEY_ID | SDK デフォルトの資格情報チェーン | 静的な access key |
AWS_SECRET_ACCESS_KEY | SDK デフォルトの資格情報チェーン | 静的な secret key |
AWS_ENDPOINT_URL | 空 | MinIO などの S3 互換 endpoint |
S3_USE_PATH_STYLE | カスタム endpoint 時は true | path-style アドレスを使うか |
ATTACHMENT_DOWNLOAD_MODE | auto | auto、cloudfront、presign、proxy |
ATTACHMENT_DOWNLOAD_URL_TTL | 30m | 署名付きダウンロード URL の有効期間 |
内部ネットワークの MinIO など、ブラウザから endpoint に直接到達できない場合は ATTACHMENT_DOWNLOAD_MODE=proxy を使ってください。
ローカルディスク
| 変数 | デフォルト | 説明 |
|---|---|---|
LOCAL_UPLOAD_DIR | ./data/uploads | ファイルと metadata の保存ディレクトリ。永続ボリュームが必要です |
LOCAL_UPLOAD_BASE_URL | 空 | 任意の公開 base URL。空の場合はアプリ内の相対アドレスを返します |
CloudFront
| 変数 | 説明 |
|---|---|
CLOUDFRONT_DOMAIN | CDN ドメイン |
CLOUDFRONT_KEY_PAIR_ID | CloudFront key pair ID |
CLOUDFRONT_PRIVATE_KEY | 完全な秘密鍵 |
CLOUDFRONT_PRIVATE_KEY_SECRET | Secrets Manager から秘密鍵を読み込む場合に使用 |
Redis とレート制限
| 変数 | デフォルト | 説明 |
|---|---|---|
REDIS_URL | 空 | 共有レート制限、リアルタイムイベント、token cache に使用。未設定の場合、リアルタイムイベントと招待制限はプロセス内メモリにフォールバックし、認証レート制限は無効になります |
REDIS_DISABLE_CLIENT_NAME | false | マネージド Redis が CLIENT SETNAME を禁止している場合に true を設定 |
RATE_LIMIT_AUTH | 5 | 認証コード送信または Google ログイン開始の、IP あたり毎分の回数 |
RATE_LIMIT_AUTH_VERIFY | 20 | 認証コード検証の、IP あたり毎分の回数 |
RATE_LIMIT_INVITATION_ACTOR_10M | 10 | 招待者ごとの 10 分間スライディングウィンドウ内のワークスペース招待数。0 でこの制限を無効化 |
RATE_LIMIT_INVITATION_WORKSPACE_24H | 50 | ワークスペース内の全管理者による 24 時間スライディングウィンドウ内の招待総数。0 でこの制限を無効化 |
RATE_LIMIT_INVITATION_RECIPIENT_24H | 6 | 正規化された同一受信メールアドレスがワークスペースをまたいで 24 時間スライディングウィンドウ内に受け取れる招待数。0 でこの制限を無効化 |
RATE_LIMIT_TRUSTED_PROXIES | 空 | X-Forwarded-For の提供を許可するプロキシ CIDR。カンマ区切り |
MULTICA_TRUSTED_PROXIES | 空 | オートパイロット webhook とリアルタイム接続が使う信頼済みプロキシ CIDR |
リバースプロキシ配下のデプロイでは、実際のプロキシのネットワーク範囲を設定してください。すべての送信元を無条件に信頼してはいけません。クライアントが転送元 IP を偽装できてしまいます。
認証レート制限には REDIS_URL が必要です。未設定の場合、起動ログに認証レート制限が無効であることが表示されます。招待制限は Redis なしでもプロセス内メモリで動作し、Redis を設定すると複数レプリカで割り当てを共有します。設定済みの Redis が一時的に利用できない場合、認証レート制限はフェイルオープンしますが、招待作成は保護なしでメールを送らず、再試行可能な 503 を返します。
外部連携
| 連携 | 変数 | 説明 |
|---|---|---|
| GitHub | GITHUB_APP_SLUG | GitHub App の slug |
| GitHub | GITHUB_WEBHOOK_SECRET | Webhook HMAC と接続 state の署名シークレット |
| GitHub | GITHUB_APP_ID | PR カードの CI ステータス・マージ可否と「GitHub から選択」リポジトリに必要です |
| GitHub | GITHUB_APP_PRIVATE_KEY | App ID と対になる完全な PEM 秘密鍵。用途は同上 |
| Lark | MULTICA_LARK_SECRET_KEY | base64 エンコードされた 32 バイトの資格情報暗号化キー |
| Slack | MULTICA_SLACK_SECRET_KEY | base64 エンコードされた 32 バイトの token 暗号化キー |
| Composio | COMPOSIO_API_KEY | Composio ツール接続を有効化 |
| Composio | COMPOSIO_CALLBACK_BASE_URL | コールバック API アドレス。MULTICA_PUBLIC_URL にフォールバック可能 |
| Composio | COMPOSIO_STATE_SECRET | OAuth state の署名シークレット。JWT_SECRET から派生可能 |
| セルフホスト Git | MULTICA_VCS_INTEGRATION_ENABLED | Forgejo/Gitea/GitLab 連携のスイッチ。compose ではデフォルトで有効 |
| セルフホスト Git | MULTICA_VCS_SECRET_KEY | base64 エンコードされた 32 バイトの暗号化キー(openssl rand -base64 32)。未設定の場合、この機能全体が利用できません |
GITHUB_APP_ID と秘密鍵を設定しなくても、PR の関連付け・ミラー・マージによる done への遷移は通常どおり動きますが、カードに CI とマージ可否のステータスが表示されず、「GitHub から選択」のリポジトリ入口も無効になります。
設定手順は GitHub 連携、Lark Bot、Slack Botを参照してください。
サーバーサイド LLM
このグループは、会話タイトルなどサーバー側の補助生成機能の設定です。エージェントがタスクを実行するときに使う AI コーディングツールの資格情報ではありません。
| 変数 | デフォルト | 説明 |
|---|---|---|
MULTICA_LLM_API_KEY | 空 | OpenAI 互換の API key |
MULTICA_LLM_BASE_URL | 空 | OpenAI 互換の endpoint |
MULTICA_LLM_DEFAULT_MODEL | gpt-5.6-luna | リクエストがモデルを指定しない場合に使用 |
API key と base URL の両方が空の場合、サーバーサイド LLM 生成は無効になり、呼び出し側はローカルのフォールバックロジックを使います。
デーモン設定
以下の変数は、エージェントを実行するコンピューター上で読み込まれます。API コンテナ内ではありません。
| 変数 | デフォルト | 説明 |
|---|---|---|
MULTICA_SERVER_URL | ws://localhost:8080/ws | Melso API / WebSocket アドレス。http(s) も受け付けます |
MULTICA_DAEMON_DEVICE_NAME | ホスト名 | ランタイム一覧に表示されるデバイス名 |
MULTICA_AGENT_RUNTIME_NAME | Local Agent | ランタイムの表示名 |
MULTICA_DAEMON_POLL_INTERVAL | 30s | ウェイクイベントがないときのタスクポーリング間隔 |
MULTICA_DAEMON_HEARTBEAT_INTERVAL | 15s | ハートビート間隔 |
MULTICA_DAEMON_MAX_CONCURRENT_TASKS | 20 | デーモン 1 つあたりの同時実行タスク上限 |
MULTICA_AGENT_TIMEOUT | 0 | 1 回の実行の絶対時間上限。0 は上限なし |
MULTICA_AGENT_IDLE_WATCHDOG | 30m | 出力もツール実行もない状態の静穏上限 |
MULTICA_AGENT_TOOL_WATCHDOG | 2h | 単一のツール呼び出しが静穏なままでいられる上限 |
MULTICA_OPENCODE_IDLE_WATCHDOG | 10m | OpenCode 専用の静穏しきい値 |
MULTICA_CODEX_SEMANTIC_INACTIVITY_TIMEOUT | 10m | Codex のセマンティック静穏しきい値 |
MULTICA_CODEX_FIRST_TURN_TIMEOUT | 0 | Codex 初回ターンの無進捗上限を明示的に上書き;0 はデフォルトを維持。実効の初回ターン待機は依然として MULTICA_CODEX_SEMANTIC_INACTIVITY_TIMEOUT と全体の実行タイムアウトに制限される——MULTICA_CODEX_SEMANTIC_INACTIVITY_TIMEOUT をこの値より厳密に大きく(余裕を持たせて)設定すること。さもないと待機はその値で打ち切られ、モデルカタログの起動リトライがスキップされる。同値では不十分:セマンティックタイマーが先に起動するため、同値の場合でもリトライが失われることがある |
MULTICA_CODEX_HANDSHAKE_TIMEOUT | 30s | Codex app-server 起動ハンドシェイクの上限 |
MULTICA_DAEMON_AUTO_UPDATE | Cloud は true、セルフホストは false | CLI の更新を自動でチェックして適用するか |
MULTICA_DAEMON_AUTO_UPDATE_INTERVAL | 6h | 更新チェックの間隔 |
MULTICA_DAEMON_AUTO_RELOAD | true | 帯域外で置き換えられた multica バイナリ(brew upgrade、再ダウンロード、ローカルビルド)へ再起動して追従するかどうか。MULTICA_DAEMON_AUTO_UPDATE とは独立 |
MULTICA_WORKSPACES_ROOT | ~/multica_workspaces | タスク作業ディレクトリのルート |
MULTICA_AGENT_TEMP_BASE | /tmp(Linux/macOS) | Linux/macOS 専用。作業ごとのプライベート一時ディレクトリの親ディレクトリ。既存かつ書き込み可能な絶対パスである必要があり、無効な値の場合は /tmp にフォールバックせず作業の開始に失敗します。短いパスを選んでください。子ツールがその配下に AF_UNIX ソケットを作成する場合があり、sun_path の上限は Linux で 108 バイト、macOS で 104 バイトです |
MULTICA_KEEP_ENV_AFTER_TASK | false | デバッグ用にタスクディレクトリを保持 |
各 AI コーディングツールは MULTICA_<PROVIDER>_PATH と MULTICA_<PROVIDER>_MODEL でコマンドパスとデフォルトモデルを上書きできます。QwenPaw だけは例外で、Melso がモデルを渡さないため MULTICA_QWENPAW_MODEL はありません。詳しくは AI コーディングツール比較 を参照してください。DeepSeek Harness は MULTICA_DSH_PATH と MULTICA_DSH_MODEL に対応しています(値は dsh のモデルカタログにあるモデル ID、例: deepseek-official/deepseek-chat)。マシン全体のデフォルト引数 MULTICA_<PROVIDER>_ARGS は、現在 Claude Code、Codex、CodeBuddy、Qwen Code、QwenPaw の 5 ツールに対応しています。対応する変数は MULTICA_CLAUDE_ARGS、MULTICA_CODEX_ARGS、MULTICA_CODEBUDDY_ARGS、MULTICA_QWEN_ARGS、MULTICA_QWENPAW_ARGS です。例:
MULTICA_CLAUDE_PATH=/opt/bin/claude
MULTICA_CLAUDE_ARGS=--max-turns 40優先順位はコマンドラインフラグ → 環境変数 → ~/.multica/config.json → 組み込みデフォルトです。watchdog の動作はデーモンとランタイムを参照してください。
デーモン設定の永続化
デーモン側のよく使う設定は、シェルの環境変数に頼らず ~/.multica/config.json に書き込むこともできます。名前付きプロファイルの設定ファイルは ~/.multica/profiles/<name>/config.json にあります:
melso config set poll_interval 10s
melso config showサポートされるキー:
| キー | デフォルト | 説明 |
|---|---|---|
server_url | ws://localhost:8080/ws | Melso API / WebSocket アドレス |
app_url | 空 | ブラウザログインに使う Web アドレス |
workspace_id | 空 | デフォルトのワークスペース |
device_name | ホスト名 | ランタイム一覧に表示されるデバイス名 |
runtime_name | Local Agent | ランタイムの表示名 |
workspaces_root | ~ 配下のプロファイル別パス | タスク作業ディレクトリのルート |
max_concurrent_tasks | 20 | 同時実行タスク上限。0 または空は未設定を意味します |
poll_interval | 30s | タスクのポーリング間隔 |
heartbeat_interval | 15s | ハートビート間隔 |
agent_timeout | 無制限 | 1 回の実行の絶対時間上限 |
codex_semantic_inactivity_timeout | 10m | Codex のセマンティック静穏しきい値 |
codex_handshake_timeout | 30s | Codex app-server ハンドシェイクの上限 |
disable_auto_update | 環境に従う | true で自動更新を無効化。false はローカルの上書きをクリアし、環境変数またはデフォルトに戻します |
auto_update_check_interval | 6h | 更新チェックの間隔 |
disable_auto_reload | 環境に従う | true でディスク上の置き換えへの追従を停止。false はローカルの上書きをクリア。disable_auto_update とは別に解決されます |
値のルール:
- duration 系のキーは正の Go duration(
10s、2hなど)を受け付け、0sと負の値は拒否されます。唯一の例外はagent_timeoutで、0sは有効な値として実行時間上限を明示的に無効化します。 - 空文字列を渡すと永続化された値がクリアされ、環境変数または組み込みデフォルトに戻ります。例:
melso config set poll_interval ""。 max_concurrent_tasksには非負の整数が必要です。- 相対パスの
workspaces_rootは保存時に絶対パスへ変換されます。
可観測性と分析
| 変数 | デフォルト | 説明 |
|---|---|---|
ANALYTICS_DISABLED | false | true で PostHog への送信を無効化 |
POSTHOG_API_KEY | 空 | 未設定の場合は分析送信が無効。自前の PostHog プロジェクトを使う場合に設定 |
POSTHOG_HOST | https://us.i.posthog.com | PostHog アドレス |
METRICS_ADDR | 空 | Prometheus metrics のリッスンアドレス。空なら起動しません |
REALTIME_METRICS_TOKEN | 空 | /health/realtime を保護する bearer token |
次のステップ
- ログインとサインアップ — ログイン方式とサインアップ制限。
- トラブルシューティング — デプロイ問題の症状別診断。
- デーモンとランタイム — デーモン側の対応する設定。