迅速な展開
このページでは、Docker Compose を使用して 5 分で Aivory プロダクション スタックの完全なセットを作成します: PostgreSQL、Redis、Qdrant、組み込みコード サンドボックス、および同時にサーバーのフロントエンド SPA、および/api裏側のappコンテナ(両方とも同じソースで、ドメイン名やCORS設定は必要ありません)。
スタック全体は、以下のようなサービスを含む compose ファイルで説明されています:
| サービス | 鏡像 | 役割 |
|---|---|---|
postgres | postgres:16-alpine | 関係型ストレージ:ユーザー、会話、ナレッジベース、使用量など |
redis | redis:7-alpine | キャッシュ、フロー制限カウンター、プロセスストップストリーム出力の pub/sub |
qdrant | qdrant/qdrant:v1.12.4 | RAG ベータ検索 |
sandbox | ghcr.io/hjxwz123/aivory-sandbox-sidecar | 内蔵コード実行 サンドボックス、内蔵ネットワークのみ |
app | ghcr.io/hjxwz123/aivory-app | シングルコンテナ同源サービス SPA と/api |
Aivory のバックエンドは環境変数によって自動的に選択されます: PostgreSQL でない場合に SQLite を内蔵し、Redis でない場合にプロセス内キャッシュし、Qdrant でない場合に RAG を回帰して全体に注入します。SQLite モデルこのページでは、推奨される完全な生産展開を説明しています。
事前要求
| プロジェクト | 要求 |
|---|---|
| Docker Engine | 正常に動作し、正常に動作する。docker info(誤報なし) |
| Docker Compose | v2(docker compose旧版ではなく旧版です。docker-compose) |
| 機械の仕様 | 2 コア CPU + 4 GB メモリスタート |
| ポート | ホスト機 80 ポート空き(変更可能、下記参照) |
| ディスク | データベース、ベータ、アップロードファイルは本機で永続化され、使用量に応じて予約されます。 |
組み込みコード サンドボックス によって吊るされた/var/run/docker.sockホストコンテナはセッションごとに分離コンテナを生成するため、ホストは Docker を直接実行する必要があります(Docker ホストプロセスなしのホストコンテナプラットフォームには適用されません)。app訪問。
ステップ1:コードの取得
git clone https://github.com/hjxwz123/Aivory.git
cd Aivory/deploy
配布に関連する書類はすべてdeploy/目録の下:docker-compose.prod.yml 和 .env.example。
ステップ 2: .env を作成および編集
cp .env.example .env
.env 中修正すべき残りはすべてデフォルトで維持できますが、そのうちの3つは、起動失敗または重大なセキュリティ上の問題を引き起こす可能性があります。
# 生成三个强随机值
openssl rand -hex 24 # 用作 POSTGRES_PASSWORD
openssl rand -hex 24 # 用作 REDIS_PASSWORD
openssl rand -hex 32 # 用作 JWT_SECRET
| 変数 | 要求 | 説明 |
|---|---|---|
POSTGRES_PASSWORD | 必定 | PostgreSQL パスワード. compose が設定されないときに起動を直接拒否 |
REDIS_PASSWORD | 必定 | Redis パスワード. compose が設定されないとき、起動を直接拒否 |
JWT_SECRET | 長さは最低でも32文字。 | ログイン トークンのキーを発行します Aivory は、生産環境下で、占有値または短いキーを検出します。スタートを拒否 |
ぜひ使用してください。openssl rand -hex 32生成し、推測可能な文字列を使用しないでください。同時に注意:置き換えJWT_SECRETすべての登録されたセッションを無効にします。
モデル サーバーの API キー(Anthropic / OpenAI / Gemini など)** はありません.env設定** では、データベースのチャンネルテーブルに存在し、デプロイが完了すると、管理コンソール で追加します。初めての運用配置。
ステップ3:スタート
メソッド 1 は、プレビルド グラフィックを引っ張り(GitHub Container Registry から推奨)します。
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d
方法 2 、ソースコードからローカルに構築する(コードに変更が行われた場合、または公式の鏡像が CPU アーキテクチャに覆われていない場合):
docker compose -f docker-compose.prod.yml up -d --build
appサービスも同時に発表。image: 和 build:: Compose は、プレビュー グラフィックがローカルに存在する場合に、プレビュー グラフィックを優先的に使用する場合に、ローカル グラフィックに戻ります。データベース スケーマは、アプリケーションの起動時に自動移行によって作成され、手動で SQL を実行する必要はありません。
ステップ4:検証
docker compose -f docker-compose.prod.yml ps
5 つのサービスが見られます:postgres、redis存在するhealthy,qdrant、app存在するrunning,sandbox初めて起動する際にはまずサンドボックス 実行時刻の鏡を引っ張り、健康チェックは120秒の起動ウィンドウを予約し、少し待つことができます。healthy。
最初のページをお願いします。app容器内部の監視8787ポート、compose はデフォルトでそれをホストにマッピングします80ポート :
curl -sI http://localhost
戻るHTTP/1.1 200SPA ページのコンテンツのデプロイが成功した場合、ポートマッピングを別のページに変更した場合(たとえば、8080:8787)は、コマンド内のポートを代替します。
ポートマッピングは環境変数に従わない、直接編集docker-compose.prod.yml 中 appサービスのports段落は、"80:8787"左側を変える(例えば、"8080:8787"右側は,8787コンテナ内のポートを監視し、変更しないでください。
ステップ5:サイトを開いて初期設定へ
ブラウザ訪問http://<你的服务器 IP 或域名>新しいデプロイはユーザーなしで、ページは自動的に初期設定に戻ります:最初に作成したアカウントはすぐに管理者になります。 次の作成番号、チャンネルの追加、モデルの作成などの手順を参照初めての運用配置。
竜の命令
次のコマンドブロックはゼロから完了します:クローン、キー生成、書き込み.env鏡を引っ張り、スタートします。新しいマシンに直接貼り付けるのに適しています。
git clone https://github.com/hjxwz123/Aivory.git \
&& cd Aivory/deploy \
&& cp .env.example .env \
&& sed -i "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$(openssl rand -hex 24)|" .env \
&& sed -i "s|^REDIS_PASSWORD=.*|REDIS_PASSWORD=$(openssl rand -hex 24)|" .env \
&& sed -i "s|^JWT_SECRET=.*|JWT_SECRET=$(openssl rand -hex 32)|" .env \
&& docker compose -f docker-compose.prod.yml pull \
&& docker compose -f docker-compose.prod.yml up -d \
&& docker compose -f docker-compose.prod.yml ps
上のコマンドは、ランダムキーを直接入力します。deploy/.envこのファイルは、あなたがデプロイしたキーチェーンに等しいので、バックアップを含め、公開倉庫に提出しないでください。
.env.example 変数の説明
下に押す。.env.exampleそれぞれの変数が変更されないことを説明する。
鏡の源
| 変数 | デフォルト値 | 変えるべきではない |
|---|---|---|
IMAGE_OWNER | hjxwz123 | 一般的に変わらない あなたのアカウントは、倉庫を fork し、GHCR ネームスペースでイメージを公開したときにのみ変更されます。 |
IMAGE_TAG | latest | 一般的に変更されません。バージョンをロックする必要がある場合は、相応の鏡のラベルに変更し、latest漂流 |
ネットワークと跨領域
| 変数 | デフォルト値 | 変えるべきではない |
|---|---|---|
ALLOWED_ORIGINS | 未設定(コメント状態) | 保有なし単一コンテナでのSPA配備と/api同じソースで、クロスドメインは存在せず、前端を API とは異なる origin に分割する場合にのみ必要です。リバースプロキシ |
注意:なしWEB_PORT 或 PUBLIC_ORIGINこのような変数: ホストポートは compose ファイルで変更されます; ドメイン名は設定する必要はありません、コンテナはどのホストによってアクセスされ、どのホストが使用できるか、複数のドメイン名を同時に指すこともできます。
PostgreSQL
| 変数 | デフォルト値 | 変えるべきではない |
|---|---|---|
POSTGRES_USER | aivory | 変える必要ない |
POSTGRES_DB | aivory | 変える必要ない |
POSTGRES_PASSWORD | 占拠価値 | 必変,openssl rand -hex 24 |
Redis
| 変数 | デフォルト値 | 変えるべきではない |
|---|---|---|
REDIS_PASSWORD | 占拠価値 | 必変,openssl rand -hex 24 |
Qdrant
| 変数 | デフォルト値 | 変えるべきではない |
|---|---|---|
QDRANT_URL | http://qdrant:6333 | 変更する必要はありません。カバーは、外部の Qdrant クラスターを指す場合にのみ適用されます |
QDRANT_API_KEY | 空 | 変更なし 空き時間qdrantサービスとapp同じ内蔵の内部キーを共有し、開箱で使用する; Qdrant はホストポートを発行しません。openssl rand -hex 24カバー |
認定
| 変数 | デフォルト値 | 変えるべきではない |
|---|---|---|
JWT_SECRET | 占拠価値 | 必変,openssl rand -hex 32少なくとも 32 文字でなければ、生産環境が起動を拒否します。 |
データカタログとバックアップ
| 変数 | デフォルト値 | 変えるべきではない |
|---|---|---|
DATA_DIR | ./data | ディスクのプランによって異なります。ホストパス、コンテナに縛られる/app/dataユーザーがファイルをアップロードし、生成した製品を保存し、バックアップが必要です。 |
BACKUP_DIR | /app/data/backups | 変更する必要はありません コンテナ内パス、コンソール 非同期生成の完全移行 ZIP ストレージを管理し、ホスト上の対応DATA_DIR/backups |
MAX_BACKUP_BYTES | 21474836480(20 GiB) | 通常変更なし 管理コンソール導入バックアップサイズの上限、ベクトルデータを含むパッケージの総量は大きい可能性があり、時間制限を超える |
データベース、Redis、Qdrantのデータはそれぞれ名称ボリュームにpgdata、redisdata、qdrantdata中、戦術見学。バックアップと移行。
デモモデル
| 変数 | デフォルト値 | 変えるべきではない |
|---|---|---|
ENABLE_MOCK_PROVIDER | false | 選択可能 設定true内蔵のデモチャンネルを注入し、本物の API Key を必要とせずに端から端までセッションを実行し、先にデプロイを検証するのに最適; 管理コンソールで本物のチャンネルを追加した後に変更false |
ネット検索(オプション)
| 変数 | デフォルト値 | 変えるべきではない |
|---|---|---|
SEARCH_PROVIDER | 空 | 選択可能 検索バックエンドタイプ:serper / brave必要配SEARCH_API_KEY;searxng必要配SEARCH_BASE_URLキーは必要ありません。 |
SEARCH_API_KEY | 空 | 随 SEARCH_PROVIDER確定 |
SEARCH_BASE_URL | 空 | 仅 searxng後部の必要性 |
これらの3つは、管理コンソールオンラインの設定後に展開することもできます。.env値はスタート時点のみで、まず空のままにします。
埋め込みモデル(オプション、ナレッジベース 検索品質関連)
| 変数 | デフォルト値 | 変えるべきではない |
|---|---|---|
EMBEDDING_BASE_URL | 空 | 生産設定を推奨します。空き時には、256D 内蔵のローカル embedder を使用しますが、生産には適していません。OpenAI 形式のいずれかを指します。/v1/embeddings端点でいい |
EMBEDDING_API_KEY | 空 | サービスに組み込まれる |
EMBEDDING_MODEL | text-embedding-3-small | お使いのサービスに合わせて変更 |
EMBEDDING_DIM | 1536 | 埋め込まれたモデルの出力次元と一致する必要があります.Qdrant では、個別 collection を使用し、不一致した次元はローカル 256 次元 embedder を返します。 |
MinerU ドキュメント解析(オプション)
| 変数 | デフォルト値 | 変えるべきではない |
|---|---|---|
MINERU_API_URL | https://mineru.net | 一般に変わらない |
MINERU_API_KEY | 空 | オプション: スキャン版/画像型 PDF 用の OCR 解像度; 構成されていない場合、このようなドキュメントはナレッジベースにアップロードできますが、コンテンツは 1 行だけです。 |
コード サンドボックス (コメント状態、通常は何も設定する必要はありません)
サンドボックスサービスがスタートし、appプライベートネットワーク経由でアクセスすると、両方とも同じ内蔵のデフォルトキーを共有し、オープンボックスを使用します。 デフォルトの制限をカバーする必要がある場合にのみコメントをキャンセルします:
| 変数 | デフォルト値 | 説明 |
|---|---|---|
SANDBOX_API_KEY | 内蔵共有デフォルト値 | カスタマイズされたキーで設定する場合は、app 与 sandbox同時に読む。 |
SANDBOX_MEMORY | 2g | 各セッションコンテナのメモリ上限 |
SANDBOX_CPUS | 1 | 各セッションコンテナの CPU クォータ |
SANDBOX_MAX_SESSIONS | 16 | サンドボックス セッション数の上限 |
SANDBOX_WORKSPACE_SIZE | 512m | 各セッション/workspaceサイズ |
SANDBOX_NETWORK | none | サンドボックス内コードネットワークなしネットワークを変えるときにbridge |
サンドボックス 構造とセキュリティの境界コード サンドボックス 展開同時に、管理コンソールの設定を保持してください。sandbox_base_url / sandbox_api_key2 つのフィールドは空であるため、組み込みサンドボックスが有効になります。
次のステップ
- 初めての運用配置: 管理者を作成し、チャンネルとモデルを追加し、最初のメッセージを送信する
- リバースプロキシとHTTPS: パブリック ネットワークのデプロイは必読で、80 ポートの明確な HTTP に TLS 終了層を加える
- Cloudflare アクセス: Cloudflare を使用する際の注意事項
- 主要な環境変数: すべての展開レベルの変数の完全な参照