From a0cb9cf220a4b1f8e16e33da204139bc5f7b4d31 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 7 Nov 2026 17:52:44 +0000 Subject: [PATCH 1/2] docs(deploy,editions): state what the Enterprise kit ships for multi-node Single node today; OS_CLUSTER_REPLICAS above 1 refuses the boot; no HA promise (cloud ee-feature-catalog). Locale siblings of the three pages deleted: the capability assertion is reversed. Co-authored-by: Claude Claude-Session: https://claude.ai/code/session_012dn2AdARJtc4RgABPH7PHk --- content/docs/deploy/docker.ja.mdx | 299 ----------------- content/docs/deploy/docker.mdx | 36 +- content/docs/deploy/docker.zh-Hans.mdx | 380 --------------------- content/docs/deploy/docker.zh-Hant.mdx | 381 ---------------------- content/docs/deploy/index.ja.mdx | 83 ----- content/docs/deploy/index.mdx | 2 +- content/docs/deploy/index.zh-Hans.mdx | 101 ------ content/docs/deploy/index.zh-Hant.mdx | 102 ------ content/docs/editions/license.ja.mdx | 118 ------- content/docs/editions/license.mdx | 13 +- content/docs/editions/license.zh-Hans.mdx | 190 ----------- content/docs/editions/license.zh-Hant.mdx | 191 ----------- 12 files changed, 32 insertions(+), 1864 deletions(-) delete mode 100644 content/docs/deploy/docker.ja.mdx delete mode 100644 content/docs/deploy/docker.zh-Hans.mdx delete mode 100644 content/docs/deploy/docker.zh-Hant.mdx delete mode 100644 content/docs/deploy/index.ja.mdx delete mode 100644 content/docs/deploy/index.zh-Hans.mdx delete mode 100644 content/docs/deploy/index.zh-Hant.mdx delete mode 100644 content/docs/editions/license.ja.mdx delete mode 100644 content/docs/editions/license.zh-Hans.mdx delete mode 100644 content/docs/editions/license.zh-Hant.mdx diff --git a/content/docs/deploy/docker.ja.mdx b/content/docs/deploy/docker.ja.mdx deleted file mode 100644 index 7a3ef42c..00000000 --- a/content/docs/deploy/docker.ja.mdx +++ /dev/null @@ -1,299 +0,0 @@ ---- -title: Docker -seoTitle: "Docker:ObjectOS Community と Enterprise を実行する" -description: Docker で ObjectOS を実行します。イメージを固定し、必須の 3 つの変数を設定し、Compose で PostgreSQL を追加し、プローブとプロキシを接続し、アップグレードとロールバックを行います。Enterprise イメージでは、プライベートレジストリ、検証、ライセンスが加わります。 -editions: [community, enterprise] -translation: - source_sha: 7fb88e85e29666d6c9ec80215a289bfa2bbe75dc1a35ab842ddd53f33bf4ea72 - guide_rev: 1 - mode: auto ---- - -Docker は、自社のサーバーで ObjectOS を実行する標準的な方法です。手順はセルフマネージドの両エディションで同じです。正確に固定したひとつのイメージ、実行時に注入する設定、コンテナの外にあるデータベース。このページでは、オープンな **Community** イメージ `ghcr.io/objectstack-ai/objectstack` を使って手順を説明します。ライセンスされたイメージで変わる点は、最後の [Enterprise で追加されるもの](#enterprise-adds)のセクションで扱います。 - -## イメージを固定する [#pin-the-image] - -Community イメージは ObjectStack のリリースごとに公開されます。タグは内部の ObjectStack CLI のバージョンを反映しています。リリース `X.Y.Z` は `X.Y.Z` としてプッシュされ、`latest`、`X.Y`、`X` がそこへ移動します。移動するタグは公開のたびに動くため、`latest` に対する日常的な `docker compose pull` によって、デプロイの操作なしに実行中のバージョンが置き換わることがあります。 - -正確なタグが固定するのはバージョンであって、バイトではありません。メンテナーは、たとえば `node:22-slim` ベースイメージのセキュリティパッチを取り込むために、すでにリリースされたバージョンを再ビルドすることがあり、その再ビルドは同じ `X.Y.Z` タグを新しいイメージに再びプッシュします。内部の ObjectStack CLI は同じバージョンのままですが、ベースイメージと、バージョン範囲でインストールされるデータベースドライバーは新たに解決されます。[公開ワークフロー](https://github.com/objectstack-ai/objectstack/blob/main/.github/workflows/docker-publish.yml)がその再ビルドを宣言しています。同じバイトを永続的に指すのは**ダイジェスト**だけです。 - -**本番では正確なバージョンを実行してください。** アプリをビルドした CLI と同じバージョンです。そして、すべてのホストで、すべての再起動後に同じバイトが必要な場所では、そのダイジェストを固定します。ダイジェストはレジストリから読み取ります。 - -```bash -docker buildx imagetools inspect ghcr.io/objectstack-ai/objectstack:X.Y.Z -``` - -`Name:` の下にある最初の `Digest:` の行を固定します。これはイメージ全体(両方のアーキテクチャ)を指します。`Manifests:` の下に並ぶダイジェストは、それぞれ 1 つのプラットフォームを指します。そのダイジェストでイメージを参照し、ダイジェストからはどのリリースかわからないので、バージョンを横に書いておきます。 - -```bash -# ObjectStack X.Y.Z -ghcr.io/objectstack-ai/objectstack@sha256:<64 hex characters> -``` - -以前のバージョンとそのダイジェストは書き残しておいてください。それがロールバックです。イメージは `linux/amd64` と `linux/arm64` 向けに公開され、非 root ユーザーで実行され、ポート **8080** で待ち受け、独自のヘルスチェックを持っています。PostgreSQL(`pg`)と MySQL(`mysql2`)のドライバーが含まれています。 - -## 設定する 3 つの値 [#the-three-values-you-set] - -それ以外はすべて、使えるデフォルトがあります。次の 3 つにはありません。 - -| 変数 | ない場合に起きること | -|---|---| -| `OS_DATABASE_URL` | データはランタイムのホームディレクトリの下の SQLite ファイルに書き込まれます。永続的な単一ホストでは問題ありませんが、コンテナのファイルシステムとともに失われます。本番では `postgres://…` を使います。 | -| `OS_AUTH_SECRET` | `/api/v1/auth/*` の下のサインインエンドポイントが**スキップ**され、サーバーは認証なしで実行されます。 | -| `OS_SECRET_KEY` | ランタイムは保存されたシークレット用に独自のキーを生成し、自身のファイルシステムに保持します。コンテナではそのキーはコンテナとともに消え、それで暗号化されたすべてのシークレットが読めなくなります。 | - -2 つのシークレットは一度だけ生成し、シークレットマネージャーに保管します。 - -```bash -OS_AUTH_SECRET=$(openssl rand -hex 32) -OS_SECRET_KEY=$(openssl rand -hex 32) -``` - -**どちらのシークレットもイメージに焼き込まないでください。** オーケストレーターのシークレットストアから実行時に渡します。`OS_SECRET_KEY` はデータベースと一緒にバックアップします。キーなしで復元したデータベースは、自身のシークレットを復号できません。[バックアップ](/docs/operate/backup)を参照してください。完全な一覧は[環境変数](/docs/reference/environment-variables)にあります。 - -## 実行する [#run-it] - -イメージにはアプリが含まれていません。`os build` がコンパイルする `objectstack.json` を、次の 3 つの方法のいずれかで渡します。 - -**アーティファクトをマウントする。** イメージのビルドは一切不要です。イメージは `/srv/app/objectstack.json` でアプリを探します。 - -```bash -docker run -p 8080:8080 \ - -v "$PWD/dist/objectstack.json:/srv/app/objectstack.json:ro" \ - -e OS_DATABASE_URL="postgres://objectos:secret@db-host:5432/objectos" \ - -e OS_AUTH_SECRET \ - -e OS_SECRET_KEY \ - ghcr.io/objectstack-ai/objectstack:X.Y.Z -``` - -**アーティファクトを URL で指定する。** `OS_ARTIFACT_URL` は公開済みのアーティファクトを指します。固定したイメージと 1 つの変数で動くアプリになり、アプリのアップグレードはその変数の変更と再起動で済みます。 - -```bash -docker run -p 8080:8080 \ - -e OS_ARTIFACT_URL="https://releases.example.com/crm-2.2.2.json#sha256=<64 hex characters>" \ - -e OS_DATABASE_URL -e OS_AUTH_SECRET -e OS_SECRET_KEY \ - ghcr.io/objectstack-ai/objectstack:X.Y.Z -``` - -任意の `#sha256=` フラグメントはアーティファクトのバイトを固定し、ランタイムは起動時にそれを守ります。 - -| 状況 | ランタイムの動作 | -|---|---| -| 固定なし | 検証なしで起動します。アーティファクトを取得できない場合、オーケストレーターが再試行するよう起動は**失敗**します。フォールバックできるキャッシュはありません。 | -| 固定あり、バイトが一致 | 起動し、検証済みのコピーを保持します。 | -| 固定あり、バイトが不一致 | 期待するダイジェストと実際のダイジェストを示して**起動を拒否**します。 | -| 固定あり、ホストに到達不能 | キャッシュされたコピーが固定と一致する場合に限りそこから起動し、警告でその旨を表示します。 | - -マウントしたファイルには `file:///…` も使えます。アーティファクトは不変で、バージョン名の付いたオブジェクトとして公開し、書き込みアクセスはリリースパイプラインだけに与えてください。そうすることで、アプリのロールバックがロールフォワードと同じ操作になります。 - -**アーティファクトを自分のイメージにコピーする。** リリースごとに自己完結したイメージを 1 つ作ります。プロジェクトの雛形(`npm create objectstack`)が、この形の Dockerfile を書き出してくれます。 - -```dockerfile title="Dockerfile" -FROM node:22-slim AS build -WORKDIR /app -COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml* package-lock.json* ./ -RUN if [ -f pnpm-lock.yaml ]; then corepack pnpm@10 install --frozen-lockfile; \ - else npm ci; fi -COPY . . -RUN npx os build # → dist/objectstack.json - -FROM ghcr.io/objectstack-ai/objectstack:X.Y.Z -COPY --from=build --chown=node:node /app/dist/objectstack.json /srv/app/objectstack.json -``` - -## PostgreSQL と Compose で構成する [#compose-with-postgresql] - -単一ホストの本番スタックです。上記のイメージと、その横のデータベース。 - -```yaml title="docker-compose.yml" -services: - app: - build: . - ports: - - "8080:8080" - environment: - OS_DATABASE_URL: postgres://objectos:${POSTGRES_PASSWORD}@db:5432/objectos - OS_AUTH_SECRET: ${OS_AUTH_SECRET} - OS_SECRET_KEY: ${OS_SECRET_KEY} - depends_on: - db: - condition: service_healthy - restart: unless-stopped - - db: - image: postgres:17 - environment: - POSTGRES_USER: objectos - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - POSTGRES_DB: objectos - volumes: - - pgdata:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U objectos -d objectos"] - interval: 5s - timeout: 3s - retries: 10 - restart: unless-stopped - -volumes: - pgdata: -``` - -```bash -# .env beside docker-compose.yml — never committed -POSTGRES_PASSWORD=… -OS_AUTH_SECRET=… -OS_SECRET_KEY=… - -docker compose up -d -curl -fsS http://localhost:8080/api/v1/health -``` - -マネージド PostgreSQL に移行するときは、`OS_DATABASE_URL` をそこに向けて `db` サービスを削除します。スキーマはランタイムの起動時に最新の状態にされます。安全な変更は自動的に実行され、破壊的な変更は、`os migrate apply --allow-destructive` で意図的に適用するまで、各変更を示して**起動を拒否**します([CLI](/docs/reference/cli#database-migrations--os-migrate))。 - -## ヘルスチェック [#health-checks] - -エンドポイントは 2 つあり、互換性はありません。 - -| エンドポイント | 答える内容 | 接続先 | -|---|---|---| -| `/api/v1/health` | プロセスが起動し、HTTP を提供している。データベースには一切触れません。 | Liveness | -| `/api/v1/ready` | ランタイムが起動し、**データドライバーが応答している**。応答しないドライバーがある間は、そのドライバーを示して `503` を返します。 | Readiness、およびロードバランサー | - -取り違えると、ひどい失敗になります。`/api/v1/ready` に対する liveness プローブは、データベースの障害時にすべてのレプリカを再起動させ(再起動では直りません)、設定の不具合を、それを隠す再起動ループに変えてしまいます。反応すべきなのは readiness です。データベースが不在の間はレプリカをローテーションから外し、データベースが戻れば再起動なしで元に戻します。アプリがバインドするデータソースも起動時に接続できなければならず、そうでなければ起動はその場で失敗します。到達できないデータベースはデプロイの失敗であり、起動してからすべてのリクエストでエラーを返すコンテナではありません。 - -## リバースプロキシと TLS [#reverse-proxy-and-tls] - -ランタイムの前段で TLS を終端し(Caddy、nginx、Traefik、またはクラウドのロードバランサー)、3 つの値を公開アドレスと揃えておきます。 - -```bash -OS_AUTH_URL=https://app.example.com # sign-in callbacks and cookie origin -OS_TRUSTED_ORIGINS=https://app.example.com # sign-in callback and CSRF allow-list -OS_PORT=8080 # the proxy's upstream port -``` - -```text title="Caddyfile" -app.example.com { - reverse_proxy localhost:8080 -} -``` - -ポートやオリジンのずれは、セルフホスティングの典型的な失敗です。アプリは動くのに、サインインは跳ね返され、ブラウザは API 呼び出しをブロックします。Console と API が同じ公開オリジンを共有している間は、CORS の設定は不要です。**別の**オリジンから提供されるフロントエンドは、`OS_CORS_ORIGIN` に明示的に列挙します。認証情報が有効な間、`*` は起動時に拒否されます。HSTS は TLS を確認してから有効にしてください。残りは[本番環境への準備](/docs/operate/production)にあります。 - -## 初回起動:最初の管理者 [#first-boot-the-first-administrator] - -新しいデータベースでは、デプロイメントのアドレスを開いて**登録します。最初のアカウントが管理者になります。** 最初のデプロイの直後、アドレスを共有する前に行ってください。本番サーバーはデフォルトの認証情報を投入しません。`os dev` で見覚えのある `admin@objectos.ai` アカウントは、開発用データベースにしか存在しません。 - -代わりに設定で管理者を指定するには、`OS_PLATFORM_OWNER_EMAIL` に 1 つのアドレスまたはカンマ区切りのリストを設定します。列挙された各アカウントは、メールアドレスが確認されるとその地位を持ちます。マルチ組織の姿勢ではこれが必須です。[環境変数](/docs/reference/environment-variables#multi-organization-deployments)を参照してください。 - -サインインアカウントなしで人のレコードを投入するアプリは、この入り口を閉ざします。最初のアカウントのルールは、ログインではなく人を数えるからです。起動ログにその旨が表示されます。[トラブルシューティング](/docs/operate/troubleshooting#nobody-can-sign-in)を参照してください。 - -## マルチノード [#multi-node] - -ObjectOS Community は**レプリカ 1 つ**で実行します。ロック、キュー、スケジュールといった調整はプロセス内にあるため、2 つ目のレプリカはそれを共有しません。ライセンスなしで複数のレプリカを宣言すると(`OS_CLUSTER_REPLICAS` が 1 より大きい)、プロセスごとのロックで実行するのではなく、**起動を拒否**します。クラスタリングと高可用性は Enterprise の機能です。後述の[マルチノード](#multi-node-on-enterprise)を参照してください。 - -## アップグレードとロールバック [#upgrade-and-rollback] - -1. 通過するすべての ObjectStack バージョンのリリースノートと、それらがオペレーターに求める[バージョン固有の手順](/docs/operate/upgrade#version-specific-steps)を読みます。 -2. **データベースをバックアップします。** スキーマのマイグレーションは前にしか進みません。イメージをロールバックしても、スキーマはロールバックされません。 -3. イメージを新しい正確なバージョン(ダイジェストを固定している場合はそのダイジェスト)に変更し、再起動します。スキーマは、ランタイムが準備完了を報告する前の起動時に最新の状態にされます。 -4. `/api/v1/ready` が 200 を返すことを確認します。 -5. ロールバックするには、以前のタグまたはダイジェストに戻して手順 3 を繰り返します。離れるバージョンが互換性のないスキーマ変更を行っていない限り有効です。 - -アプリは別にバージョン管理されます。`OS_ARTIFACT_URL` やマウントするアーティファクトを変更すれば、イメージに触れずにアプリをアップグレードできます。 - -## Enterprise で追加されるもの [#enterprise-adds] - -ライセンスされた Enterprise イメージも同じ方法で実行し、プライベートレジストリ、サプライチェーンの検証、ライセンス、マルチノードが加わります。固定すべきダイジェストはリリースノートに記載されています。リリースには**デプロイバンドル**が付属し、Compose スタック、デプロイメント形態ごとの環境テンプレート、そして正確なバージョンのコマンドを記載した README が含まれます。このセクションは、そのバンドルが設定するものの判断マップです。 - -### 提供されるもの [#what-you-are-given] - -ライセンスには、プライベートなランタイムイメージ用の**レジストリの認証情報**が付属します。サインインにはパッケージの **read** アクセスを持つトークンが必要です。公開の Enterprise イメージやソースからのビルドはありません。イメージは、配布されないソースから私たちのリリースパイプラインが生成するため、`docker build` という手段は存在しません。 - -**サポートされるアーキテクチャ:`linux/amd64` のみ。** これは記載漏れではなく宣言です。ビルドは、宣言していないアーキテクチャのイメージの生成を拒否します。Apple Silicon や Graviton のホストではエミュレーションで実行されることになり、試すには問題ありませんが、本番には不適切です。 - -### ダイジェストでイメージを固定する [#pin-the-image-by-digest] - -本番で実行するイメージの参照は、タグではなく**ダイジェスト**です。 - -``` -OS_EE_IMAGE=@sha256:<64 hex characters> -``` - -タグは人が読める名前であり、別のバイトに付け替えられることがあります。ダイジェストはコンテンツアドレスです。同じダイジェストは、どのホストでも永遠に同じイメージです。タグでは、問題が起きたときに実際に何が動いていたかを後から証明する方法がありません。ダイジェストはリリースノートに記載されているので、そのまま貼り付けてください。**以前の**ダイジェストも残しておきます。 - -### イメージは自分が何であるかを示せる [#the-image-can-tell-you-what-it-is] - -イメージには 2 つの異なるバージョン番号が付いており、混同してはいけません。ObjectOS の**製品バージョン**と、それに組み込まれた **ObjectStack ランタイムの互換性範囲**で、後者は独自のスケジュールで動きます。どちらも、イメージのビルド元となったソースのリビジョンとともに、OCI ラベルおよび機械可読なリリースマニフェストとしてイメージ自体の中に記録されています。どのビルドを持っているかを私たちに尋ねる必要はありません。 - -このマニフェストは、サポートリクエストに添付するものとして最も役立つものでもあります。それだけで正確なイメージを再現できます。 - -### 本番の前にイメージを検証する [#verify-the-image-before-production] - -イメージは(リリースパイプラインの OIDC アイデンティティによるキーレス方式で)**署名**されており、**SBOM** と**ビルドの来歴**が付属します。本番へのロールアウトの前に一度検証してください。3 つのチェックは、それぞれ異なる問いに答えます。 - -| チェック | 答える問い | -|---|---| -| 署名 | このダイジェストは、他の誰かではなく ObjectOS のリリースパイプラインによって生成されたか | -| SBOM | このイメージの中に何が入っているか | -| 来歴 | このイメージはどのソースから、どのようにビルドされたか | - -バンドルの README には、照合すべきアイデンティティと発行者を含む検証コマンドが、リリースに合わせて記載されています。 - -### ライセンス [#license] - -**ライセンスは通常の手順の一部です。** ライセンスなしの Enterprise イメージの動作は、何を求めたかによって異なります。 - -- **単一組織、ライセンスなし**:デプロイメントは ObjectOS Community として実行されます。オープンな MCP サーバーと、自前の AI の持ち込み。何も動かなくなることはありません。 -- **単一組織、ライセンスあり**:自社のインフラストラクチャ上で製品内 AI が有効になります。AI Builder と「データに質問する」です。 -- **マルチ組織(壁で区切られたテナンシーの姿勢)、ライセンスなし**:ランタイムはライセンスを名指しして**起動時に終了**します。組織間の分離はライセンスされた機能であり、分離を求めたデプロイメントが、分離があるふりをしてトラフィックを提供することがあってはなりません。 - -同じ流れに 2 つ目の制約があり、こちらが人を驚かせるものです。**ライセンスにはモードがあり、そのモードはクラウドの姿勢と結びついています。** 通常のライセンスはコントロールプレーンに対してオンラインで検証され、エアギャップライセンスはローカルで検証されてネットワークを一切必要としません。通常のライセンスと「コントロールプレーンなし」の組み合わせは、劣化した状態ではなく不可能な状態です。後でライセンスについての誤解を招く苦情で失敗するのではなく、両方の設定を名指しして**起動時に拒否されます**。サポートされる組み合わせの完全な表は[エアギャップ](/docs/deploy/air-gapped)にあります。 - -### 壁で区切られたデプロイメントはさらに 2 つの判断を宣言しなければならない [#a-walled-deployment-must-declare-two-more-decisions] - -マルチ組織の姿勢では、2 つの設定に安全なデフォルトがないため、ランタイムは**決めるまで起動を拒否します**。どちらの値を宣言しても受け入れられますが、決めないことは受け入れられません。 - -| 判断 | デフォルトにできない理由 | -|---|---| -| **新しいサインアップが何に参加するか** | メンバーシップそのものがテナントの境界である場所では、メンバーシップは明示的な行為(招待、管理者、SSO プロビジョニング)によってのみ付与されるべきです。自動参加は、既存の組織の中に見知らぬ人を入れてしまいます。 | -| **どの AI エージェントをマウントするか** | 「ask」エージェントは読み取ります。「build」エージェントは**メタデータを作成**します。そしてメタデータの範囲は組織ではなくデプロイメントです。共有データベースでは、ある顧客の build のターンが、他のすべての顧客が使うスキーマを書き換えます。 | - -単一組織のデプロイメントでは、どちらのチェックも行われません。 - -### 提供されるスタック [#the-shipped-stack] - -バンドルの Compose スタックは、デプロイメントをあるべき順序で進めます。他のどのオーケストレーターでもこの順序を再現する必要があるため、知っておく価値があります。 - -1. データベースが正常な状態になります。 -2. **1 回限りのマイグレーション**がスキーマを完了まで実行します。アプリケーションのレプリカが起動する前なので、同時に動くレプリカが互いにスキーマ変更を実行し合うことはありません。 -3. アプリケーションのレプリカが起動します。イメージは独自のヘルスチェックを持っています。 -4. リバースプロキシは、レプリカが単に起動しただけでなく実際に応答するようになってから転送を始めます。 - -本番では、デプロイメントを**マネージド**の PostgreSQL(クラスター構成の場合は Redis も)に向け、バンドルのデータベースサービスを削除します。自動 HTTPS を得るには、プロキシにドメインを指定します。ランタイムのコンテナは非 root ユーザーで実行され、ランタイムの状態を宣言されたボリュームに保持します。 - -### Enterprise でのマルチノード [#multi-node-on-enterprise] - -レプリカを 2 つ以上にスケールすると、必須となるものが変わります。 - -- **クラスタードライバー**(Redis ベース)を有効にします。 -- **共有シークレットキーが必須になります。** クラスタードライバーがない場合、ランタイムは独自のキーを生成して永続化します。レプリカ間ではそれらのキーが黙って食い違うことになるため、食い違う代わりに**ランタイムは起動を拒否します**。キーを 1 つ生成し、すべてのレプリカに同じ値を渡してください。 -- **認証シークレットもすべてのレプリカで同一でなければなりません**。変更すると既存のすべてのセッションが無効になり、署名キーが宙に浮きます。ローテーションに伴う 1 回限りのクリーンアップは、環境テンプレートに記載されています。 -- `OS_CLUSTER_REPLICAS` は、バンドルのスタックが起動するアプリケーションのレプリカ数を設定します。 - -### ダイジェストでアップグレードする [#upgrade-by-digest] - -上記のアップグレード手順は、タグの代わりにダイジェストを使って同じように適用されます。 - -1. リリースノートから**新しいダイジェスト**を取得し、ロールアウトの前にイメージのリリースマニフェストを読みます。製品のメジャーラインが現在のものと同じであることを確認し、組み込まれたランタイムの互換性範囲が動いたかどうかを確認します。ランタイムのメジャーバージョンの移動は下層に破壊的変更があることを意味するため、先にそのリリースのノートを読んでください。 -2. データベースをバックアップします。 -3. イメージのダイジェストを変更し、スタックを再起動します。マイグレーションは、新しいレプリカがトラフィックを受ける前に完了まで実行されます。 -4. readiness が 200 を返し、レプリカが正常と報告することを確認します。 -5. ロールバックするには、以前のダイジェストに戻して手順 3 を繰り返します。離れるバージョンが互換性のないスキーマ変更を行っていない限り有効です(行った場合はリリースノートに記載されています)。 - -## 次へ [#next] - -- [Kubernetes](/docs/deploy/kubernetes):オーケストレーター上の同じイメージ。 -- [本番環境への準備](/docs/operate/production):本番稼働前のチェックリスト。 -- [オブザーバビリティ](/docs/operate/observability):ログ、メトリクス、監査。 -- [エアギャップ](/docs/deploy/air-gapped):切断されたサイト向けの Enterprise ライセンスモード。 diff --git a/content/docs/deploy/docker.mdx b/content/docs/deploy/docker.mdx index a1aad127..74daaf6a 100644 --- a/content/docs/deploy/docker.mdx +++ b/content/docs/deploy/docker.mdx @@ -257,7 +257,8 @@ ObjectOS Community runs **one replica**. Coordination — locks, queues, schedules — is in-process, so a second replica would not share it. Declaring several replicas (`OS_CLUSTER_REPLICAS` above 1) without a license **refuses the boot** rather than run them on per-process locks. -Clustering and high availability are Enterprise capabilities — see +Multi-node operation is an Enterprise license capability, and today the +Enterprise kit runs on a single node too — see [Multi-node](#multi-node-on-enterprise) below. ## Upgrade and rollback @@ -400,19 +401,32 @@ and keeps its runtime state on a declared volume. ### Multi-node on Enterprise -Scaling past one replica changes what is mandatory: - -- Turn on the **cluster driver** (backed by Redis), and -- **A shared secret key becomes required.** With no cluster driver the - runtime mints and persists its own key. Across replicas those keys would - silently diverge — so instead of diverging, **the runtime refuses to - start**. Generate one key and give every replica the same value. -- The **auth secret must also be identical on every replica**. Changing it +**Run the Enterprise kit on a single node today.** The deploy bundle wires +no cluster driver, so keep `OS_CLUSTER_REPLICAS` at `1` and do not scale the +app service with `docker compose up --scale`. + +Setting `OS_CLUSTER_REPLICAS` above 1 **refuses the boot**, by design. The +built-in in-process coordinator keeps locks, counters and pub/sub inside each +process, so a second replica would silently diverge from the first. Do not +silence the refusal with `OS_ALLOW_MEMORY_CLUSTER_MULTINODE`, and do not +bypass it with `--scale`: the compose template ties the replica count and the +`OS_CLUSTER_REPLICAS` the runtime reads to one variable so they cannot +disagree. + +Multi-node topology is unlocked by the Enterprise license (the node cap is the +license's `maxNodes`). It is activated by contract, and a cluster driver is +connected to the bundle when a contract calls for it; no date is committed +here. High availability is not part of what the kit includes today. If you +need more than one node, [contact sales](mailto:sales@objectos.ai). + +Whatever the node count, two rules hold: + +- **Set one shared secret key** (`OS_SECRET_KEY`). Without it the runtime mints + and persists its own key, which would diverge between replicas. +- **The auth secret must be identical wherever the runtime runs.** Changing it invalidates every existing session and orphans the signing key; the environment template documents the one-time cleanup that goes with a rotation. -- `OS_CLUSTER_REPLICAS` sets how many application replicas the bundled stack - starts. ### Upgrade by digest diff --git a/content/docs/deploy/docker.zh-Hans.mdx b/content/docs/deploy/docker.zh-Hans.mdx deleted file mode 100644 index 75561116..00000000 --- a/content/docs/deploy/docker.zh-Hans.mdx +++ /dev/null @@ -1,380 +0,0 @@ ---- -title: Docker -seoTitle: "Docker:运行 ObjectOS Community 和 Enterprise" -description: 用 Docker 运行 ObjectOS —— 固定镜像、设置三个必需的变量、用 Compose 加上 PostgreSQL、接好探针和代理、升级与回滚。企业版镜像还增加了私有镜像仓库、校验和许可证。 -editions: [community, enterprise] -translation: - source_sha: 7fb88e85e29666d6c9ec80215a289bfa2bbe75dc1a35ab842ddd53f33bf4ea72 - guide_rev: 1 - mode: auto ---- - -Docker 是在你自己的服务器上运行 ObjectOS 的标准方式。两个自管理版本的步骤相同: -一个被精确固定的镜像,配置在运行时注入,数据库放在容器之外。本页以开放的 -**Community** 镜像 `ghcr.io/objectstack-ai/objectstack` 逐步讲解;末尾的 -[企业版额外提供](#enterprise-adds)一节说明在需许可证的镜像上有什么不同。 - -## 固定镜像 [#pin-the-image] - -Community 镜像随每个 ObjectStack 版本发布。它的标签与镜像内 ObjectStack CLI 的 -版本一致:版本 `X.Y.Z` 以 `X.Y.Z` 推送,并把 `latest`、`X.Y` 和 `X` 移到它上面。 -滚动标签会随每次发布而移动,所以对 `latest` 做一次例行的 `docker compose pull`, -就可能在没有任何部署事件的情况下替换你正在运行的版本。 - -确切的标签固定的是版本,而不是字节。维护者可以重新构建一个已经发布的版本,例如 -为了纳入 `node:22-slim` 基础镜像中的安全补丁,而重新构建会把同一个 `X.Y.Z` 标签 -再次推送到一个新镜像上。镜像内的 ObjectStack CLI 仍是同一个版本;基础镜像,以及 -它按版本范围安装的数据库驱动,则会重新解析。 -[发布工作流](https://github.com/objectstack-ai/objectstack/blob/main/.github/workflows/docker-publish.yml) -声明了这种重新构建。只有**摘要**永远指向同样的字节。 - -**在生产环境中运行确切的版本**,与构建你的应用的 CLI 版本相同;凡是你需要每台 -主机、每次重启都运行同样字节的地方,还要固定它的摘要。从镜像仓库读取摘要: - -```bash -docker buildx imagetools inspect ghcr.io/objectstack-ai/objectstack:X.Y.Z -``` - -固定第一行 `Digest:`,也就是 `Name:` 下面那一行。它指向整个镜像,包括两种架构; -`Manifests:` 下列出的摘要各自只指向一个平台。按这个摘要引用镜像,并在旁边保留 -版本号,因为摘要本身并不说明它是哪个版本: - -```bash -# ObjectStack X.Y.Z -ghcr.io/objectstack-ai/objectstack@sha256:<64 hex characters> -``` - -把上一个版本及其摘要记下来:那就是回滚。镜像发布了 `linux/amd64` 和 `linux/arm64` 两种架构,以非 root -用户运行,监听 **8080** 端口,并自带健康检查。它包含 PostgreSQL(`pg`)和 MySQL -(`mysql2`)驱动。 - -## 你要设置的三个值 [#the-three-values-you-set] - -其他一切都有可用的默认值。这三个没有: - -| 变量 | 缺少它会怎样 | -|---|---| -| `OS_DATABASE_URL` | 数据会落到运行时主目录下的一个 SQLite 文件中 —— 在一台持久的主机上没问题,但会随容器的文件系统一起丢失。生产环境使用 `postgres://…`。 | -| `OS_AUTH_SECRET` | `/api/v1/auth/*` 下的登录端点会被**跳过**,服务器在没有认证的情况下运行。 | -| `OS_SECRET_KEY` | 运行时会为存储的密钥自行生成一个加密密钥,并把它保存在自己的文件系统上。在容器中,这个密钥会随容器一起消失,用它加密的每个密钥都会变得无法读取。 | - -两个密钥只生成一次,并保存在你的密钥管理器中: - -```bash -OS_AUTH_SECRET=$(openssl rand -hex 32) -OS_SECRET_KEY=$(openssl rand -hex 32) -``` - -**绝不要把任何一个密钥烘焙进镜像。**在运行时从编排器的密钥存储中传入。把 -`OS_SECRET_KEY` 与数据库一起备份:恢复时没有带上密钥的数据库无法解密它自己的 -密钥 —— 参见[备份](/docs/operate/backup)。完整列表见 -[环境变量](/docs/reference/environment-variables)。 - -## 运行它 [#run-it] - -镜像不带任何应用。把 `os build` 编译出的 `objectstack.json` 交给它,有三种方式。 - -**挂载产物。**完全不用构建镜像 —— 镜像会在 `/srv/app/objectstack.json` 查找应用: - -```bash -docker run -p 8080:8080 \ - -v "$PWD/dist/objectstack.json:/srv/app/objectstack.json:ro" \ - -e OS_DATABASE_URL="postgres://objectos:secret@db-host:5432/objectos" \ - -e OS_AUTH_SECRET \ - -e OS_SECRET_KEY \ - ghcr.io/objectstack-ai/objectstack:X.Y.Z -``` - -**按 URL 指定产物。**`OS_ARTIFACT_URL` 指向一个已发布的产物,所以一个固定的镜像 -加上一个变量就是一个运行中的应用,而升级应用就是修改这个变量再重启: - -```bash -docker run -p 8080:8080 \ - -e OS_ARTIFACT_URL="https://releases.example.com/crm-2.2.2.json#sha256=<64 hex characters>" \ - -e OS_DATABASE_URL -e OS_AUTH_SECRET -e OS_SECRET_KEY \ - ghcr.io/objectstack-ai/objectstack:X.Y.Z -``` - -可选的 `#sha256=` 片段会固定产物的字节,运行时会据此约束启动: - -| 情况 | 运行时的行为 | -|---|---| -| 没有固定值 | 不做校验直接启动。如果无法获取产物,启动会**失败**,以便编排器重试 —— 没有可以回落的缓存副本。 | -| 有固定值,字节匹配 | 启动,并保留已校验的副本。 | -| 有固定值,字节不同 | **拒绝启动**,并点名期望的摘要和实际的摘要。 | -| 有固定值,主机不可达 | 只有当缓存副本仍与固定值匹配时才从它启动,并以一条警告说明这一点。 | - -`file:///…` 也可以用于挂载的文件。把产物发布为不可变的、以版本命名的对象,并只给 -你的发布流水线写入权限 —— 正是这一点让回滚应用与升级应用成为同一种操作。 - -**把产物复制进你自己的镜像。**每个版本一个自包含的镜像。项目脚手架 -(`npm create objectstack`)会为你写一个这种形态的 Dockerfile: - -```dockerfile title="Dockerfile" -FROM node:22-slim AS build -WORKDIR /app -COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml* package-lock.json* ./ -RUN if [ -f pnpm-lock.yaml ]; then corepack pnpm@10 install --frozen-lockfile; \ - else npm ci; fi -COPY . . -RUN npx os build # → dist/objectstack.json - -FROM ghcr.io/objectstack-ai/objectstack:X.Y.Z -COPY --from=build --chown=node:node /app/dist/objectstack.json /srv/app/objectstack.json -``` - -## 用 Compose 加上 PostgreSQL [#compose-with-postgresql] - -一个单主机的生产技术栈:上面的镜像,旁边是它的数据库。 - -```yaml title="docker-compose.yml" -services: - app: - build: . - ports: - - "8080:8080" - environment: - OS_DATABASE_URL: postgres://objectos:${POSTGRES_PASSWORD}@db:5432/objectos - OS_AUTH_SECRET: ${OS_AUTH_SECRET} - OS_SECRET_KEY: ${OS_SECRET_KEY} - depends_on: - db: - condition: service_healthy - restart: unless-stopped - - db: - image: postgres:17 - environment: - POSTGRES_USER: objectos - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - POSTGRES_DB: objectos - volumes: - - pgdata:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U objectos -d objectos"] - interval: 5s - timeout: 3s - retries: 10 - restart: unless-stopped - -volumes: - pgdata: -``` - -```bash -# .env beside docker-compose.yml — never committed -POSTGRES_PASSWORD=… -OS_AUTH_SECRET=… -OS_SECRET_KEY=… - -docker compose up -d -curl -fsS http://localhost:8080/api/v1/health -``` - -当你迁移到托管的 PostgreSQL 时,把 `OS_DATABASE_URL` 指向它,并移除 `db` 服务。 -模式会在运行时启动时更新到最新:安全的变更会自行运行,而破坏性的变更会**拒绝 -启动**并点名每一项变更,直到你用 `os migrate apply --allow-destructive` 有意识地 -应用它([CLI](/docs/reference/cli#database-migrations--os-migrate))。 - -## 健康检查 [#health-checks] - -两个端点,它们不能互换: - -| 端点 | 回答什么 | 接到 | -|---|---|---| -| `/api/v1/health` | 进程已启动并在提供 HTTP 服务。它从不访问数据库。 | 存活探针 | -| `/api/v1/ready` | 运行时已启动**且其数据驱动有响应**。只要有一个驱动没有响应,就返回 `503` 并点名失败的驱动。 | 就绪探针,以及你的负载均衡器 | - -如果接反了,后果很糟。把存活探针接到 `/api/v1/ready`,会在数据库故障期间重启每个 -副本 —— 而重启解决不了这个问题 —— 还会把配置故障变成一个掩盖它的重启循环。应该 -做出反应的是就绪探针:数据库不可用时,它把副本从轮转中移出,数据库恢复后再把它 -放回来,不需要重启。应用所绑定的数据源也必须在启动时连上,否则启动会直接失败: -一个无法访问的数据库就是一次失败的部署,而不是一个先启动、然后在每个请求上都 -报错的容器。 - -## 反向代理和 TLS [#reverse-proxy-and-tls] - -在运行时前面终止 TLS —— Caddy、nginx、Traefik 或你的云负载均衡器 —— 并让三个值 -与公网地址保持一致: - -```bash -OS_AUTH_URL=https://app.example.com # sign-in callbacks and cookie origin -OS_TRUSTED_ORIGINS=https://app.example.com # sign-in callback and CSRF allow-list -OS_PORT=8080 # the proxy's upstream port -``` - -```text title="Caddyfile" -app.example.com { - reverse_proxy localhost:8080 -} -``` - -端口或源对不上是自托管时的经典故障:应用在运行,但登录会被弹回,浏览器会阻止 -API 调用。只要 Console 和 API 共享同一个公网源,CORS 就不需要任何配置。从**另一个** -源提供的前端要显式列在 `OS_CORS_ORIGIN` 中 —— 在开启凭据时,`*` 会在启动时被 -拒绝。只有在确认 TLS 正常后才开启 HSTS;其余内容见 -[生产就绪](/docs/operate/production)。 - -## 首次启动:第一个管理员 [#first-boot-the-first-administrator] - -在一个全新的数据库上,打开部署的地址并**注册 —— 第一个账户会成为管理员。**在首次 -部署后立即完成这一步,再分享地址。生产服务器不会预置任何默认凭据:你可能在 -`os dev` 中见过的 `admin@objectos.ai` 账户只存在于开发数据库中。 - -如果要改为在配置中指定管理员,就把 `OS_PLATFORM_OWNER_EMAIL` 设为一个地址或一个 -逗号分隔的列表;列出的每个账户在其邮箱地址验证后即拥有该身份。多组织姿态要求设置 -它 —— 参见[环境变量](/docs/reference/environment-variables#multi-organization-deployments)。 - -一个预置了人员记录、却没有登录账户的应用会关上这扇门:第一个账户的规则计算的是 -人员,而不是登录。启动日志会说明这一点 —— 参见 -[故障排查](/docs/operate/troubleshooting#nobody-can-sign-in)。 - -## 多节点 [#multi-node] - -ObjectOS Community 运行**一个副本**。协调 —— 锁、队列、调度 —— 是进程内的,所以 -第二个副本无法共享它。在没有许可证的情况下声明多个副本(`OS_CLUSTER_REPLICAS` -大于 1)会**拒绝启动**,而不是用按进程的锁运行它们。集群与高可用是企业版能力 —— -参见下文的[多节点](#multi-node-on-enterprise)。 - -## 升级与回滚 [#upgrade-and-rollback] - -1. 阅读你所跨越的每个 ObjectStack 版本的发布说明,以及它们要求运维人员执行的 - [特定版本步骤](/docs/operate/upgrade#version-specific-steps)。 -2. **备份数据库。**模式迁移只能向前:回滚镜像并不会回滚模式。 -3. 把镜像改为新的确切版本,如果你固定了摘要,就改为它的摘要,然后重启。模式会在 - 启动时、运行时报告就绪之前更新到最新。 -4. 确认 `/api/v1/ready` 返回 200。 -5. 要回滚,就恢复上一个标签或摘要并重复第 3 步 —— 只要你要离开的版本没有做不兼容的 - 模式变更,这就是有效的。 - -应用单独进行版本管理:修改 `OS_ARTIFACT_URL` 或你挂载的产物,就能在不动镜像的 -情况下升级它。 - -## 企业版额外提供 [#enterprise-adds] - -需许可证的企业版镜像以同样的方式运行,并增加了私有镜像仓库、供应链校验、许可证和 -多节点;它的发布说明会点名要固定的摘要。你的版本会附带一个**部署包**,其中包含一个 Compose 技术栈、 -每种部署形态一个环境模板,以及一份带有适用于你的确切版本的命令的 README。本节是 -该部署包所配置内容的决策地图。 - -### 你会得到什么 [#what-you-are-given] - -你的许可证附带私有运行时镜像的**镜像仓库凭据**。登录需要一个具有包**读取**权限的 -令牌;没有公开的企业版镜像,也不能从源码构建:镜像由我们的发布流水线从不分发的 -源码产出,所以 `docker build` 对它来说不是一条存在的路径。 - -**受支持的架构:仅 `linux/amd64`。**这是一项声明,而不是遗漏:构建会拒绝为我们未 -声明的架构产出镜像。Apple Silicon 和 Graviton 主机会在模拟下运行它,这用来看一看 -没问题,用于生产则是错的。 - -### 按摘要固定镜像 [#pin-the-image-by-digest] - -你在生产环境中运行的镜像引用是一个**摘要**,而不是标签: - -``` -OS_EE_IMAGE=@sha256:<64 hex characters> -``` - -标签是人类可读的名称,可以被重新指向不同的字节。摘要是按内容寻址的:同一个摘要 -永远是同一个镜像,在每台主机上、永远如此。使用标签的话,事后就无法证明出问题时 -实际运行的是什么。你的发布说明会给出摘要;原样粘贴即可。也要保留**上一个**摘要。 - -### 镜像可以告诉你它是什么 [#the-image-can-tell-you-what-it-is] - -镜像带有两个不同的版本号,不应混为一谈:ObjectOS 的**产品版本**,以及其中内嵌的 -**ObjectStack 运行时的兼容范围**,后者按自己的节奏变化。两者 —— 连同构建镜像所用 -的源码修订版本 —— 都记录在镜像本身中,作为 OCI 标签和一份机器可读的发布清单。你 -永远不必来问我们你拿到的是哪个构建。 - -这份清单也是附在支持请求中最有用的东西:它足以重现你的确切镜像。 - -### 在生产之前校验镜像 [#verify-the-image-before-production] - -镜像是**经过签名的**(无密钥签名,通过我们发布流水线的 OIDC 身份),并附带一份 -**SBOM** 和**构建溯源**。在生产上线之前校验一次 —— 三项检查回答三个不同的问题: - -| 检查 | 它回答的问题 | -|---|---| -| 签名 | 这个摘要是由 ObjectOS 发布流水线产出的,而不是别人? | -| SBOM | 这个镜像里有什么? | -| 溯源 | 这个镜像是如何、从哪些源码构建出来的? | - -部署包的 README 中有校验命令,以及要核对的身份和签发者,与你的版本相匹配。 - -### 许可证 [#license] - -**许可证是正常路径的一部分。**企业版镜像在没有许可证时的行为,取决于你要求它成为 -什么: - -- **单组织,无许可证** —— 部署以 ObjectOS Community 运行:开放的 MCP 服务器, - 自带你自己的 AI。什么都不会变砖。 -- **单组织,有许可证** —— 产品内 AI 会在你自己的基础设施上解锁:AI Builder 和 - "问你的数据"。 -- **多组织(隔离墙式租户姿态),无许可证** —— 运行时会**在启动时退出**,并点名 - 许可证。组织之间的隔离是一项需许可证的能力,一个要求隔离的部署绝不能假装拥有 - 隔离来提供服务。 - -同一条线上还有第二个约束,而它正是让人意外的那个:**许可证有模式,而模式与你的 -云端姿态耦合。**普通许可证针对控制平面在线校验;物理隔离许可证在本地校验,完全 -不需要网络。把普通许可证与"没有控制平面"搭配不是一种降级状态,而是一种不可能的 -状态 —— 它会**在启动时被拒绝**,并点名两项设置,而不是之后才以一条关于许可证的 -误导性抱怨失败。[物理隔离](/docs/deploy/air-gapped)给出了受支持组合的完整矩阵。 - -### 隔离墙式部署必须再声明两项决策 [#a-walled-deployment-must-declare-two-more-decisions] - -在多组织姿态下,有两项设置没有安全的默认值,所以运行时会**拒绝启动,直到你做出 -决定** —— 声明任何一个可用的值都会被接受;不做决定则不行: - -| 决策 | 为什么不能有默认值 | -|---|---| -| **新注册的用户加入什么** | 在成员资格*就是*租户边界的地方,它只能通过显式的行为授予 —— 邀请、管理员、SSO 开通。自动加入会把一个陌生人放进一个现有的组织。 | -| **挂载哪些 AI Agent** | "ask" Agent 只读;"build" Agent **编写元数据** —— 而元数据的作用域是部署,而不是组织。在共享数据库上,一个客户的一次 build 对话就会改写其他所有客户运行所依赖的模式。 | - -单组织部署不会看到这两项检查。 - -### 出厂技术栈 [#the-shipped-stack] - -部署包中的 Compose 技术栈按部署必须遵循的顺序编排,值得了解这个顺序,因为任何 -其他编排器都必须重现它: - -1. 数据库变为健康状态。 -2. 一个**一次性迁移**把模式运行到完成 —— 在任何应用副本启动之前,所以并发的 - 副本永远不会相互对抗地执行模式变更。 -3. 应用副本启动。镜像自带健康检查。 -4. 反向代理只有在某个副本真正有响应时才开始转发 —— 而不仅仅是被创建出来。 - -在生产环境中,把部署指向你**托管的** PostgreSQL(如果做集群,还有 Redis),并移除 -捆绑的数据库服务。把你的域名交给代理,即可获得自动 HTTPS。运行时容器以非 root -用户运行,并把运行时状态保存在一个声明的卷上。 - -### 企业版上的多节点 [#multi-node-on-enterprise] - -扩展到一个副本以上,会改变哪些是必需的: - -- 开启**集群驱动**(以 Redis 为后端),并且 -- **共享的加密密钥成为必需。**没有集群驱动时,运行时会自行生成并持久保存它自己的 - 密钥。跨副本时这些密钥会悄悄地互不相同 —— 所以**运行时会拒绝启动**,而不是让 - 它们分叉。生成一个密钥,并给每个副本相同的值。 -- **认证密钥也必须在每个副本上完全相同。**修改它会使所有现有会话失效,并让签名 - 密钥成为孤儿;环境模板说明了轮换时附带的那一次性清理步骤。 -- `OS_CLUSTER_REPLICAS` 设置捆绑的技术栈启动多少个应用副本。 - -### 按摘要升级 [#upgrade-by-digest] - -上面的升级步骤同样适用,只是用摘要代替标签: - -1. 从发布说明中取得**新的摘要**,并在上线之前阅读镜像的发布清单:确认产品主版本 - 线是你所在的那一条,并检查内嵌运行时的兼容范围是否移动了。运行时主版本的移动 - 意味着底层有破坏性变更 —— 先阅读那个版本的发布说明。 -2. 备份数据库。 -3. 修改镜像摘要并重启技术栈。迁移会在新副本接收流量之前运行到完成。 -4. 确认就绪端点返回 200,且副本报告为健康。 -5. 要回滚,就恢复上一个摘要并重复第 3 步 —— 只要你要离开的版本没有做不兼容的 - 模式变更,这就是有效的(发布说明会说明何时做了这样的变更)。 - -## 下一步 [#next] - -- [Kubernetes](/docs/deploy/kubernetes) —— 同一个镜像,运行在编排器上。 -- [生产就绪](/docs/operate/production) —— 上线前的检查清单。 -- [可观测性](/docs/operate/observability) —— 日志、指标、审计。 -- [物理隔离](/docs/deploy/air-gapped) —— 面向断网站点的企业版许可证模式。 diff --git a/content/docs/deploy/docker.zh-Hant.mdx b/content/docs/deploy/docker.zh-Hant.mdx deleted file mode 100644 index a4a8e10f..00000000 --- a/content/docs/deploy/docker.zh-Hant.mdx +++ /dev/null @@ -1,381 +0,0 @@ ---- -# @generated zh-Hant from zh-Hans -- do not edit. Edit the English source, then regenerate: pnpm --filter @objectos/docs gen:zh-hant -title: Docker -seoTitle: "Docker:執行 ObjectOS Community 和 Enterprise" -description: 用 Docker 執行 ObjectOS —— 固定映象、設定三個必需的變數、用 Compose 加上 PostgreSQL、接好探針和代理、升級與回滾。企業版映象還增加了私有映象倉庫、校驗和許可證。 -editions: [community, enterprise] -translation: - source_sha: 7fb88e85e29666d6c9ec80215a289bfa2bbe75dc1a35ab842ddd53f33bf4ea72 - guide_rev: 1 - mode: auto ---- - -Docker 是在你自己的伺服器上執行 ObjectOS 的標準方式。兩個自管理版本的步驟相同: -一個被精確固定的映象,配置在執行時注入,資料庫放在容器之外。本頁以開放的 -**Community** 映象 `ghcr.io/objectstack-ai/objectstack` 逐步講解;末尾的 -[企業版額外提供](#enterprise-adds)一節說明在需許可證的映象上有什麼不同。 - -## 固定映象 [#pin-the-image] - -Community 映象隨每個 ObjectStack 版本釋出。它的標籤與映象內 ObjectStack CLI 的 -版本一致:版本 `X.Y.Z` 以 `X.Y.Z` 推送,並把 `latest`、`X.Y` 和 `X` 移到它上面。 -滾動標籤會隨每次釋出而移動,所以對 `latest` 做一次例行的 `docker compose pull`, -就可能在沒有任何部署事件的情況下替換你正在執行的版本。 - -確切的標籤固定的是版本,而不是位元組。維護者可以重新構建一個已經發布的版本,例如 -為了納入 `node:22-slim` 基礎映象中的安全補丁,而重新構建會把同一個 `X.Y.Z` 標籤 -再次推送到一個新映象上。映象內的 ObjectStack CLI 仍是同一個版本;基礎映象,以及 -它按版本範圍安裝的資料庫驅動,則會重新解析。 -[釋出工作流](https://github.com/objectstack-ai/objectstack/blob/main/.github/workflows/docker-publish.yml) -聲明瞭這種重新構建。只有**摘要**永遠指向同樣的位元組。 - -**在生產環境中執行確切的版本**,與構建你的應用的 CLI 版本相同;凡是你需要每臺 -主機、每次重啟都運行同樣位元組的地方,還要固定它的摘要。從映象倉庫讀取摘要: - -```bash -docker buildx imagetools inspect ghcr.io/objectstack-ai/objectstack:X.Y.Z -``` - -固定第一行 `Digest:`,也就是 `Name:` 下面那一行。它指向整個映象,包括兩種架構; -`Manifests:` 下列出的摘要各自只指向一個平臺。按這個摘要引用映象,並在旁邊保留 -版本號,因為摘要本身並不說明它是哪個版本: - -```bash -# ObjectStack X.Y.Z -ghcr.io/objectstack-ai/objectstack@sha256:<64 hex characters> -``` - -把上一個版本及其摘要記下來:那就是回滾。映象釋出了 `linux/amd64` 和 `linux/arm64` 兩種架構,以非 root -使用者執行,監聽 **8080** 埠,並自帶健康檢查。它包含 PostgreSQL(`pg`)和 MySQL -(`mysql2`)驅動。 - -## 你要設定的三個值 [#the-three-values-you-set] - -其他一切都有可用的預設值。這三個沒有: - -| 變數 | 缺少它會怎樣 | -|---|---| -| `OS_DATABASE_URL` | 資料會落到執行時主目錄下的一個 SQLite 檔案中 —— 在一臺持久的主機上沒問題,但會隨容器的檔案系統一起丟失。生產環境使用 `postgres://…`。 | -| `OS_AUTH_SECRET` | `/api/v1/auth/*` 下的登入端點會被**跳過**,伺服器在沒有認證的情況下執行。 | -| `OS_SECRET_KEY` | 執行時會為儲存的金鑰自行生成一個加密金鑰,並把它儲存在自己的檔案系統上。在容器中,這個金鑰會隨容器一起消失,用它加密的每個金鑰都會變得無法讀取。 | - -兩個金鑰只生成一次,並儲存在你的金鑰管理器中: - -```bash -OS_AUTH_SECRET=$(openssl rand -hex 32) -OS_SECRET_KEY=$(openssl rand -hex 32) -``` - -**絕不要把任何一個金鑰烘焙進映象。**在執行時從編排器的金鑰儲存中傳入。把 -`OS_SECRET_KEY` 與資料庫一起備份:恢復時沒有帶上金鑰的資料庫無法解密它自己的 -金鑰 —— 參見[備份](/docs/operate/backup)。完整列表見 -[環境變數](/docs/reference/environment-variables)。 - -## 執行它 [#run-it] - -映象不帶任何應用。把 `os build` 編譯出的 `objectstack.json` 交給它,有三種方式。 - -**掛載產物。**完全不用構建映象 —— 映象會在 `/srv/app/objectstack.json` 查詢應用: - -```bash -docker run -p 8080:8080 \ - -v "$PWD/dist/objectstack.json:/srv/app/objectstack.json:ro" \ - -e OS_DATABASE_URL="postgres://objectos:secret@db-host:5432/objectos" \ - -e OS_AUTH_SECRET \ - -e OS_SECRET_KEY \ - ghcr.io/objectstack-ai/objectstack:X.Y.Z -``` - -**按 URL 指定產物。**`OS_ARTIFACT_URL` 指向一個已釋出的產物,所以一個固定的映象 -加上一個變數就是一個執行中的應用,而升級應用就是修改這個變數再重啟: - -```bash -docker run -p 8080:8080 \ - -e OS_ARTIFACT_URL="https://releases.example.com/crm-2.2.2.json#sha256=<64 hex characters>" \ - -e OS_DATABASE_URL -e OS_AUTH_SECRET -e OS_SECRET_KEY \ - ghcr.io/objectstack-ai/objectstack:X.Y.Z -``` - -可選的 `#sha256=` 片段會固定產物的位元組,執行時會據此約束啟動: - -| 情況 | 執行時的行為 | -|---|---| -| 沒有固定值 | 不做校驗直接啟動。如果無法獲取產物,啟動會**失敗**,以便編排器重試 —— 沒有可以回落的快取副本。 | -| 有固定值,位元組匹配 | 啟動,並保留已校驗的副本。 | -| 有固定值,位元組不同 | **拒絕啟動**,並點名期望的摘要和實際的摘要。 | -| 有固定值,主機不可達 | 只有當快取副本仍與固定值匹配時才從它啟動,並以一條警告說明這一點。 | - -`file:///…` 也可以用於掛載的檔案。把產物釋出為不可變的、以版本命名的物件,並只給 -你的釋出流水線寫入許可權 —— 正是這一點讓回滾應用與升級應用成為同一種操作。 - -**把產物複製進你自己的映象。**每個版本一個自包含的映象。專案腳手架 -(`npm create objectstack`)會為你寫一個這種形態的 Dockerfile: - -```dockerfile title="Dockerfile" -FROM node:22-slim AS build -WORKDIR /app -COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml* package-lock.json* ./ -RUN if [ -f pnpm-lock.yaml ]; then corepack pnpm@10 install --frozen-lockfile; \ - else npm ci; fi -COPY . . -RUN npx os build # → dist/objectstack.json - -FROM ghcr.io/objectstack-ai/objectstack:X.Y.Z -COPY --from=build --chown=node:node /app/dist/objectstack.json /srv/app/objectstack.json -``` - -## 用 Compose 加上 PostgreSQL [#compose-with-postgresql] - -一個單主機的生產技術棧:上面的映象,旁邊是它的資料庫。 - -```yaml title="docker-compose.yml" -services: - app: - build: . - ports: - - "8080:8080" - environment: - OS_DATABASE_URL: postgres://objectos:${POSTGRES_PASSWORD}@db:5432/objectos - OS_AUTH_SECRET: ${OS_AUTH_SECRET} - OS_SECRET_KEY: ${OS_SECRET_KEY} - depends_on: - db: - condition: service_healthy - restart: unless-stopped - - db: - image: postgres:17 - environment: - POSTGRES_USER: objectos - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - POSTGRES_DB: objectos - volumes: - - pgdata:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U objectos -d objectos"] - interval: 5s - timeout: 3s - retries: 10 - restart: unless-stopped - -volumes: - pgdata: -``` - -```bash -# .env beside docker-compose.yml — never committed -POSTGRES_PASSWORD=… -OS_AUTH_SECRET=… -OS_SECRET_KEY=… - -docker compose up -d -curl -fsS http://localhost:8080/api/v1/health -``` - -當你遷移到託管的 PostgreSQL 時,把 `OS_DATABASE_URL` 指向它,並移除 `db` 服務。 -模式會在執行時啟動時更新到最新:安全的變更會自行執行,而破壞性的變更會**拒絕 -啟動**並點名每一項變更,直到你用 `os migrate apply --allow-destructive` 有意識地 -應用它([CLI](/docs/reference/cli#database-migrations--os-migrate))。 - -## 健康檢查 [#health-checks] - -兩個端點,它們不能互換: - -| 端點 | 回答什麼 | 接到 | -|---|---|---| -| `/api/v1/health` | 程序已啟動並在提供 HTTP 服務。它從不訪問資料庫。 | 存活探針 | -| `/api/v1/ready` | 執行時已啟動**且其資料驅動有響應**。只要有一個驅動沒有響應,就返回 `503` 並點名失敗的驅動。 | 就緒探針,以及你的負載均衡器 | - -如果接反了,後果很糟。把存活探針接到 `/api/v1/ready`,會在資料庫故障期間重啟每個 -副本 —— 而重啟解決不了這個問題 —— 還會把配置故障變成一個掩蓋它的重啟迴圈。應該 -做出反應的是就緒探針:資料庫不可用時,它把副本從輪轉中移出,資料庫恢復後再把它 -放回來,不需要重啟。應用所繫結的資料來源也必須在啟動時連上,否則啟動會直接失敗: -一個無法訪問的資料庫就是一次失敗的部署,而不是一個先啟動、然後在每個請求上都 -報錯的容器。 - -## 反向代理和 TLS [#reverse-proxy-and-tls] - -在執行時前面終止 TLS —— Caddy、nginx、Traefik 或你的雲負載均衡器 —— 並讓三個值 -與公網地址保持一致: - -```bash -OS_AUTH_URL=https://app.example.com # sign-in callbacks and cookie origin -OS_TRUSTED_ORIGINS=https://app.example.com # sign-in callback and CSRF allow-list -OS_PORT=8080 # the proxy's upstream port -``` - -```text title="Caddyfile" -app.example.com { - reverse_proxy localhost:8080 -} -``` - -埠或源對不上是自託管時的經典故障:應用在執行,但登入會被彈回,瀏覽器會阻止 -API 呼叫。只要 Console 和 API 共享同一個公網源,CORS 就不需要任何配置。從**另一個** -源提供的前端要顯式列在 `OS_CORS_ORIGIN` 中 —— 在開啟憑據時,`*` 會在啟動時被 -拒絕。只有在確認 TLS 正常後才開啟 HSTS;其餘內容見 -[生產就緒](/docs/operate/production)。 - -## 首次啟動:第一個管理員 [#first-boot-the-first-administrator] - -在一個全新的資料庫上,開啟部署的地址並**註冊 —— 第一個賬戶會成為管理員。**在首次 -部署後立即完成這一步,再分享地址。生產伺服器不會預置任何預設憑據:你可能在 -`os dev` 中見過的 `admin@objectos.ai` 賬戶只存在於開發資料庫中。 - -如果要改為在配置中指定管理員,就把 `OS_PLATFORM_OWNER_EMAIL` 設為一個地址或一個 -逗號分隔的列表;列出的每個賬戶在其郵箱地址驗證後即擁有該身份。多組織姿態要求設定 -它 —— 參見[環境變數](/docs/reference/environment-variables#multi-organization-deployments)。 - -一個預置了人員記錄、卻沒有登入賬戶的應用會關上這扇門:第一個賬戶的規則計算的是 -人員,而不是登入。啟動日誌會說明這一點 —— 參見 -[故障排查](/docs/operate/troubleshooting#nobody-can-sign-in)。 - -## 多節點 [#multi-node] - -ObjectOS Community 執行**一個副本**。協調 —— 鎖、佇列、排程 —— 是程序內的,所以 -第二個副本無法共享它。在沒有許可證的情況下宣告多個副本(`OS_CLUSTER_REPLICAS` -大於 1)會**拒絕啟動**,而不是用按程序的鎖執行它們。叢集與高可用是企業版能力 —— -參見下文的[多節點](#multi-node-on-enterprise)。 - -## 升級與回滾 [#upgrade-and-rollback] - -1. 閱讀你所跨越的每個 ObjectStack 版本的釋出說明,以及它們要求運維人員執行的 - [特定版本步驟](/docs/operate/upgrade#version-specific-steps)。 -2. **備份資料庫。**模式遷移只能向前:回滾映象並不會回滾模式。 -3. 把映象改為新的確切版本,如果你固定了摘要,就改為它的摘要,然後重啟。模式會在 - 啟動時、執行時報告就緒之前更新到最新。 -4. 確認 `/api/v1/ready` 返回 200。 -5. 要回滾,就恢復上一個標籤或摘要並重復第 3 步 —— 只要你要離開的版本沒有做不相容的 - 模式變更,這就是有效的。 - -應用單獨進行版本管理:修改 `OS_ARTIFACT_URL` 或你掛載的產物,就能在不動映象的 -情況下升級它。 - -## 企業版額外提供 [#enterprise-adds] - -需許可證的企業版映象以同樣的方式執行,並增加了私有映象倉庫、供應鏈校驗、許可證和 -多節點;它的釋出說明會點名要固定的摘要。你的版本會附帶一個**部署包**,其中包含一個 Compose 技術棧、 -每種部署形態一個環境模板,以及一份帶有適用於你的確切版本的命令的 README。本節是 -該部署包所配置內容的決策地圖。 - -### 你會得到什麼 [#what-you-are-given] - -你的許可證附帶私有執行時映象的**映象倉庫憑據**。登入需要一個具有包**讀取**許可權的 -令牌;沒有公開的企業版映象,也不能從原始碼構建:映象由我們的釋出流水線從不分發的 -原始碼產出,所以 `docker build` 對它來說不是一條存在的路徑。 - -**受支援的架構:僅 `linux/amd64`。**這是一項宣告,而不是遺漏:構建會拒絕為我們未 -宣告的架構產出映象。Apple Silicon 和 Graviton 主機會在模擬下執行它,這用來看一看 -沒問題,用於生產則是錯的。 - -### 按摘要固定映象 [#pin-the-image-by-digest] - -你在生產環境中執行的映象引用是一個**摘要**,而不是標籤: - -``` -OS_EE_IMAGE=@sha256:<64 hex characters> -``` - -標籤是人類可讀的名稱,可以被重新指向不同的位元組。摘要是按內容定址的:同一個摘要 -永遠是同一個映象,在每臺主機上、永遠如此。使用標籤的話,事後就無法證明出問題時 -實際執行的是什麼。你的釋出說明會給出摘要;原樣貼上即可。也要保留**上一個**摘要。 - -### 映象可以告訴你它是什麼 [#the-image-can-tell-you-what-it-is] - -映象帶有兩個不同的版本號,不應混為一談:ObjectOS 的**產品版本**,以及其中內嵌的 -**ObjectStack 執行時的兼容範圍**,後者按自己的節奏變化。兩者 —— 連同構建映象所用 -的原始碼修訂版本 —— 都記錄在映象本身中,作為 OCI 標籤和一份機器可讀的釋出清單。你 -永遠不必來問我們你拿到的是哪個構建。 - -這份清單也是附在支援請求中最有用的東西:它足以重現你的確切映象。 - -### 在生產之前校驗映象 [#verify-the-image-before-production] - -映象是**經過簽名的**(無金鑰簽名,通過我們釋出流水線的 OIDC 身份),並附帶一份 -**SBOM** 和**構建溯源**。在生產上線之前校驗一次 —— 三項檢查回答三個不同的問題: - -| 檢查 | 它回答的問題 | -|---|---| -| 簽名 | 這個摘要是由 ObjectOS 釋出流水線產出的,而不是別人? | -| SBOM | 這個映象裡有什麼? | -| 溯源 | 這個映象是如何、從哪些原始碼構建出來的? | - -部署包的 README 中有校驗命令,以及要核對的身份和簽發者,與你的版本相匹配。 - -### 許可證 [#license] - -**許可證是正常路徑的一部分。**企業版映象在沒有許可證時的行為,取決於你要求它成為 -什麼: - -- **單組織,無許可證** —— 部署以 ObjectOS Community 執行:開放的 MCP 伺服器, - 自帶你自己的 AI。什麼都不會變磚。 -- **單組織,有許可證** —— 產品內 AI 會在你自己的基礎設施上解鎖:AI Builder 和 - "問你的資料"。 -- **多組織(隔離牆式租戶姿態),無許可證** —— 執行時會**在啟動時退出**,並點名 - 許可證。組織之間的隔離是一項需許可證的能力,一個要求隔離的部署絕不能假裝擁有 - 隔離來提供服務。 - -同一條線上還有第二個約束,而它正是讓人意外的那個:**許可證有模式,而模式與你的 -雲端姿態耦合。**普通許可證針對控制平面線上校驗;物理隔離許可證在本地校驗,完全 -不需要網路。把普通許可證與"沒有控制平面"搭配不是一種降級狀態,而是一種不可能的 -狀態 —— 它會**在啟動時被拒絕**,並點名兩項設定,而不是之後才以一條關於許可證的 -誤導性抱怨失敗。[物理隔離](/docs/deploy/air-gapped)給出了受支援組合的完整矩陣。 - -### 隔離牆式部署必須再宣告兩項決策 [#a-walled-deployment-must-declare-two-more-decisions] - -在多組織姿態下,有兩項設定沒有安全的預設值,所以執行時會**拒絕啟動,直到你做出 -決定** —— 宣告任何一個可用的值都會被接受;不做決定則不行: - -| 決策 | 為什麼不能有預設值 | -|---|---| -| **新註冊的使用者加入什麼** | 在成員資格*就是*租戶邊界的地方,它只能通過顯式的行為授予 —— 邀請、管理員、SSO 開通。自動加入會把一個陌生人放進一個現有的組織。 | -| **掛載哪些 AI Agent** | "ask" Agent 只讀;"build" Agent **編寫後設資料** —— 而後設資料的作用域是部署,而不是組織。在共享資料庫上,一個客戶的一次 build 對話就會改寫其他所有客戶執行所依賴的模式。 | - -單組織部署不會看到這兩項檢查。 - -### 出廠技術棧 [#the-shipped-stack] - -部署包中的 Compose 技術棧按部署必須遵循的順序編排,值得了解這個順序,因為任何 -其他編排器都必須重現它: - -1. 資料庫變為健康狀態。 -2. 一個**一次性遷移**把模式執行到完成 —— 在任何應用副本啟動之前,所以併發的 - 副本永遠不會相互對抗地執行模式變更。 -3. 應用副本啟動。映象自帶健康檢查。 -4. 反向代理只有在某個副本真正有響應時才開始轉發 —— 而不僅僅是被創建出來。 - -在生產環境中,把部署指向你**託管的** PostgreSQL(如果做叢集,還有 Redis),並移除 -捆綁的資料庫服務。把你的域名交給代理,即可獲得自動 HTTPS。執行時容器以非 root -使用者執行,並把執行時狀態儲存在一個宣告的捲上。 - -### 企業版上的多節點 [#multi-node-on-enterprise] - -擴充套件到一個副本以上,會改變哪些是必需的: - -- 開啟**叢集驅動**(以 Redis 為後端),並且 -- **共享的加密金鑰成為必需。**沒有叢集驅動時,執行時會自行生成並持久儲存它自己的 - 金鑰。跨副本時這些金鑰會悄悄地互不相同 —— 所以**執行時會拒絕啟動**,而不是讓 - 它們分叉。生成一個金鑰,並給每個副本相同的值。 -- **認證金鑰也必須在每個副本上完全相同。**修改它會使所有現有會話失效,並讓簽名 - 金鑰成為孤兒;環境模板說明了輪換時附帶的那一次性清理步驟。 -- `OS_CLUSTER_REPLICAS` 設定捆綁的技術棧啟動多少個應用副本。 - -### 按摘要升級 [#upgrade-by-digest] - -上面的升級步驟同樣適用,只是用摘要代替標籤: - -1. 從釋出說明中取得**新的摘要**,並在上線之前閱讀映象的釋出清單:確認產品主版本 - 線是你所在的那一條,並檢查內嵌執行時的兼容範圍是否移動了。執行時主版本的移動 - 意味著底層有破壞性變更 —— 先閱讀那個版本的釋出說明。 -2. 備份資料庫。 -3. 修改映象摘要並重啟技術棧。遷移會在新副本接收流量之前執行到完成。 -4. 確認就緒端點返回 200,且副本報告為健康。 -5. 要回滾,就恢復上一個摘要並重復第 3 步 —— 只要你要離開的版本沒有做不相容的 - 模式變更,這就是有效的(釋出說明會說明何時做了這樣的變更)。 - -## 下一步 [#next] - -- [Kubernetes](/docs/deploy/kubernetes) —— 同一個映象,執行在編排器上。 -- [生產就緒](/docs/operate/production) —— 上線前的檢查清單。 -- [可觀測性](/docs/operate/observability) —— 日誌、指標、審計。 -- [物理隔離](/docs/deploy/air-gapped) —— 面向斷網站點的企業版許可證模式。 diff --git a/content/docs/deploy/index.ja.mdx b/content/docs/deploy/index.ja.mdx deleted file mode 100644 index ca419ff2..00000000 --- a/content/docs/deploy/index.ja.mdx +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: デプロイ -seoTitle: "デプロイ:セルフマネージドの ObjectOS、Community と Enterprise" -description: 自社のインフラストラクチャで ObjectOS を実行します。オープンな Community イメージとライセンスされた Enterprise イメージ、ひとつのランタイム、ひとつの設定の契約、そしてライセンスが追加するものを説明します。 -editions: [community, enterprise] -translation: - source_sha: 58a24b6ac97029ee1e3b5771fb6126075b96fe0c022bea1b5147e4066862462b - guide_rev: 1 - mode: auto ---- - -ObjectOS にはセルフマネージドのエディションが 2 つあり、デプロイ方法は同じです。**ObjectOS Community** はオープンソースのランタイムイメージで、**ObjectOS Enterprise** はライセンスされたイメージです。後者は、シングルノードの Enterprise Single-Node としても、完全な Enterprise デプロイメントとしても実行できます。どちらも同じランタイムを実行し、同じ設定(データベース、認証シークレット、シークレットキー)を読み込みます。違いは、イメージの入手元、アプリの組み込み方、ライセンスで有効になるものです。このセクションの各ページは両方を対象に一度だけ書かれており、ライセンスされたイメージがより多くを行う箇所では、最後に **Enterprise で追加されるもの** のセクションがあります。 - -## 2 つのイメージ [#the-two-images] - -| | **Community** | **Enterprise** | -|---|---|---| -| イメージ | `ghcr.io/objectstack-ai/objectstack`、公開 | ライセンスされた Enterprise イメージ。プライベートレジストリから取得し、レジストリの認証情報はライセンスとともに提供されます | -| 固定する方法 | 内部の ObjectStack CLI と一致する正確なバージョンタグ(`X.Y.Z`)、そしてバイトが変わってはならない場所ではその**ダイジェスト**([理由](/docs/deploy/docker#pin-the-image)) | リリースノートに記載されたイメージの**ダイジェスト** | -| アーキテクチャ | `linux/amd64` と `linux/arm64` | `linux/amd64` のみ | -| アプリの組み込み方 | `os build` でコンパイルした `objectstack.json` を、マウントする、自分のイメージにコピーする、または `OS_ARTIFACT_URL` で指定する。空のランタイムでは、代わりに Console のマーケットプレイスからアプリをインストールします。 | 3 つの実行形態のいずれか:イメージにバンドルされたアプリ、公開済みアーティファクト、またはイメージの Enterprise プラグインと組み合わせた公開済みアーティファクト([後述](#how-the-app-gets-in)) | -| 設定が必須の変数 | `OS_DATABASE_URL`、`OS_AUTH_SECRET`、`OS_SECRET_KEY`(イメージはすでに `OS_PORT=8080` を設定しています) | 同じもの、加えて `OS_LICENSE_KEY` と意図して設定した `OS_CLOUD_URL` | -| コピーできる設定 | これらのページの例 | 各リリースとともに提供される**デプロイバンドル** | -| ライセンスで有効になるもの | — | 製品内 AI(AI Builder、「データに質問する」)、AI ガバナンス、クラスタリングと高可用性、1 つのデプロイメント上の複数の組織、SCIM、エアギャップ運用 | - -[エディションの比較](/docs/editions/compare)に完全な一覧があります。Community で構築したアプリは通常の ObjectStack メタデータであり、Enterprise でもそのまま動作します。 - -## すべてのデプロイメントが決める 3 つのこと [#every-deployment-decides-three-things] - -| 判断 | 意味 | -|---|---| -| **どのバイトを実行するか** | 正確なイメージをひとつに固定します。`latest` のような移動するタグは知らないうちに付け替えられることがあり、正確なバージョンタグもそのバージョンが再ビルドされれば同様です。それが起きないのはダイジェストだけです。以前のものは残しておきます。それがロールバックです。 | -| **設定をどこに置くか** | イメージとアプリの外です。データベース URL、シークレット、デプロイメントの識別情報は、実行時に注入される環境変数であり、決して焼き込みません。契約は[環境変数](/docs/reference/environment-variables)にあります。 | -| **どのデータベースか** | 本番は PostgreSQL で実行します。`OS_DATABASE_URL` がない場合、ランタイムはホームディレクトリの下に SQLite ファイルを書き込みます。これは永続的な単一ホストには適していますが、コンテナの一時的なファイルシステムではデータが失われます。 | - -## アプリの組み込み方 [#how-the-app-gets-in] - -Community イメージには**アプリが含まれていません**。`os build` がコンパイルするアーティファクト `dist/objectstack.json` を、次の 3 つの方法のいずれかで渡します。 - -| 方法 | やり方 | 使う場面 | -|---|---|---| -| **マウントする** | イメージがデフォルトで探す `/srv/app/objectstack.json` にファイルをマウントします | イメージのビルドを一切したくない | -| **自分のイメージにコピーする** | 公式イメージを `FROM` とする 2 段階の Dockerfile | リリースごとに自己完結したイメージを 1 つ出荷する | -| **URL で指定する** | `OS_ARTIFACT_URL`、任意で `#sha256=` による完全性の固定 | アプリのアップグレードを環境の変更と再起動で済ませたい | - -[Docker](/docs/deploy/docker#run-it) に 3 つすべてを示しています。アーティファクトがまったくない場合、ランタイムは空のカーネルで起動し、アプリは Console のマーケットプレイスからインストールします。 - -## ガイド [#guides] - -- [Docker](/docs/deploy/docker):イメージを実行し、設定し、プロキシの背後に置き、アップグレードします。 -- [Kubernetes](/docs/deploy/kubernetes):オーケストレーター上の同じイメージと、維持すべき性質。 -- [エアギャップ](/docs/deploy/air-gapped):Enterprise のみ。**ライセンスモード**としてのエアギャップと、起動時に拒否される組み合わせ。 - -コンテナランタイムがない場合は、Node.js 22 のホスト上で、同じアーティファクトを `os start` で実行できます。[ObjectOS Community をローカルで実行する](/docs/start/community)を参照してください。 - -## Enterprise で追加されるもの [#enterprise-adds] - -### さらに 2 つの判断:ライセンスとクラウドの姿勢 [#two-more-decisions-license-and-cloud-posture] - -| 判断 | 意味 | -|---|---| -| **どのライセンスか** | ライセンスは追加オプションではなく、通常の手順の一部です。デプロイメントの形態によっては、ライセンスがないと*起動を拒否*します。 | -| **どのクラウドの姿勢か** | このランタイムがコントロールプレーンと通信するかどうか。これは**ライセンスモードと結びついて**おり、サポートされない組み合わせは、黙って劣化するのではなく起動時に拒否されます。 | - -実際には、この 2 つはひとつの判断です。間違えるとゆっくりとした漏れではなく、起動の失敗になります。サポートされる組み合わせの全体は[エアギャップ](/docs/deploy/air-gapped)に記載されています。組み合わせが*なぜ*そうなっているかを説明しているページなので、サイトがネットワークに接続されている場合でも読んでください。 - -### デプロイバンドル [#the-deploy-bundle] - -リリースには**デプロイバンドル**が付属します。Compose スタック、サポートされる各形態の環境テンプレート、そしてそのバージョンの正確なコマンド(レジストリの参照、ダイジェスト、サプライチェーン検証の手順を含む)を記載した README です。 - -これらのページが扱うのは**判断**です。なぜダイジェストなのか、どの形態にどのライセンスモードか、マルチノードで何が必須になるか、ランタイムが何を拒否するか。バンドルが扱うのは**コピーする値**です。両者が食い違うように見えるときは、イメージとともに提供されたバンドルが正しいものです。バンドルは、それが設定するランタイムとともにバージョン管理されています。 - -### 3 つの実行形態 [#three-run-shapes] - -Enterprise イメージは 3 つの方法でアプリを実行でき、その選択によって利用できるものが変わります。単なるパッケージングの問題ではありません。 - -| 形態 | アプリの出どころ | 使う場面 | -|---|---|---| -| **Config-authored** | イメージ自身にバンドルされたアプリケーション。イメージ内で作成されたメタデータと、そこにインストールされたもの | 単一組織のデプロイメント。Compose スタックが設定するデフォルトで、設定が不要な形態です。 | -| **Artifact-pinned** | URL で指定された公開済みのアプリアーティファクト。デプロイメントの設定が実行される前に解決されます | 公開済みのアプリを 1 つ実行し、イメージを再ビルドせずに、環境の変更と再起動でアプリをアップグレードしたい。この経路では、デプロイメントの Enterprise プラグインは読み込まれ**ない**ことに注意してください。 | -| **Composed** | このデプロイメントの Enterprise プラグイン*と*組み合わせた公開済みのアプリアーティファクト | 複数の組織が 1 つのデータベースを共有する。これはホスト型の単一アプリ SaaS の形態であり、**エアギャップライセンスのみ**で、起動時に強制されます。 | - -各形態には、デプロイバンドル内に専用の環境テンプレートがあります。別のものを手直しするのではなく、自分の形態のものをコピーしてください。テンプレートは姿勢を決める値が異なり、それらはまさにランタイムが何かを提供する前に確認する値です。 diff --git a/content/docs/deploy/index.mdx b/content/docs/deploy/index.mdx index e81e63a5..5046e105 100644 --- a/content/docs/deploy/index.mdx +++ b/content/docs/deploy/index.mdx @@ -25,7 +25,7 @@ more. | How the app arrives | Your compiled `objectstack.json` from `os build`: mounted, copied into your own image, or named by `OS_ARTIFACT_URL`. An empty runtime installs apps from the Console marketplace instead. | One of three run shapes: the app bundled in the image, a published artifact, or a published artifact composed with the image's enterprise plugins ([below](#how-the-app-gets-in)) | | Variables you must set | `OS_DATABASE_URL`, `OS_AUTH_SECRET`, `OS_SECRET_KEY` (the image already sets `OS_PORT=8080`) | The same, plus `OS_LICENSE_KEY` and a deliberate `OS_CLOUD_URL` | | Copyable configuration | The examples on these pages | The **deploy bundle** that ships with each release | -| What the license unlocks | — | In-product AI (AI Builder, "ask your data"), AI governance, clustering and high availability, several organizations on one deployment, SCIM, air-gapped operation | +| What the license unlocks | — | In-product AI (AI Builder, "ask your data"), AI governance, multi-node topology (the kit runs a single node today), several organizations on one deployment, SCIM, air-gapped operation | [Compare Editions](/docs/editions/compare) has the full matrix. An app built on Community is ordinary ObjectStack metadata and runs on Enterprise diff --git a/content/docs/deploy/index.zh-Hans.mdx b/content/docs/deploy/index.zh-Hans.mdx deleted file mode 100644 index c7d6ae24..00000000 --- a/content/docs/deploy/index.zh-Hans.mdx +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: 部署 -seoTitle: "部署:自管理 ObjectOS,社区版和企业版" -description: 在你自己的基础设施上运行 ObjectOS —— 开放的社区版镜像或需许可证的企业版镜像,同一个运行时、同一份配置契约,以及许可证额外带来什么。 -editions: [community, enterprise] -translation: - source_sha: 58a24b6ac97029ee1e3b5771fb6126075b96fe0c022bea1b5147e4066862462b - guide_rev: 1 - mode: auto ---- - -ObjectOS 有两个自管理版本,它们的部署方式相同。**ObjectOS Community** 是开源 -的运行时镜像;**ObjectOS Enterprise** 是需许可证的镜像,可以作为 Enterprise -Single-Node 运行在单节点上,也可以作为完整的企业版部署。两者运行同一个运行时, -读取同一份配置:一个数据库、一个认证密钥和一个加密密钥。不同之处在于镜像从哪里 -来、应用如何进入,以及许可证解锁什么。本节的每一页都同时为两者编写一次,并以 -**企业版额外提供**一节结尾,说明需许可证的镜像能多做什么。 - -## 两个镜像 [#the-two-images] - -| | **Community** | **Enterprise** | -|---|---|---| -| 镜像 | `ghcr.io/objectstack-ai/objectstack`,公开 | 需许可证的企业版镜像,来自私有镜像仓库;你的许可证附带镜像仓库凭据 | -| 固定方式 | 确切的版本标签(`X.Y.Z`),与镜像内的 ObjectStack CLI 一致;在字节不能变化的地方,还要固定它的**摘要**([原因](/docs/deploy/docker#pin-the-image)) | 你的发布说明中点名的镜像**摘要** | -| 架构 | `linux/amd64` 和 `linux/arm64` | 仅 `linux/amd64` | -| 应用如何到达 | 你用 `os build` 编译出的 `objectstack.json`:挂载进去、复制进你自己的镜像,或由 `OS_ARTIFACT_URL` 指定。空的运行时则改为从 Console 市场安装应用。 | 三种运行形态之一:应用打包在镜像中、一个已发布的产物,或者一个与镜像的企业插件组合在一起的已发布产物([见下文](#how-the-app-gets-in)) | -| 必须设置的变量 | `OS_DATABASE_URL`、`OS_AUTH_SECRET`、`OS_SECRET_KEY`(镜像已经设置了 `OS_PORT=8080`) | 同上,另加 `OS_LICENSE_KEY` 和一个经过考虑的 `OS_CLOUD_URL` | -| 可复制的配置 | 这些页面上的示例 | 随每个版本发布的**部署包** | -| 许可证解锁什么 | —— | 产品内 AI(AI Builder、"问你的数据")、AI 治理、集群与高可用、一个部署上的多个组织、SCIM、物理隔离运行 | - -[版本对比](/docs/editions/compare)给出了完整的矩阵。在 Community 上构建的应用 -就是普通的 ObjectStack 元数据,不做任何修改即可在 Enterprise 上运行。 - -## 每个部署都要决定三件事 [#every-deployment-decides-three-things] - -| 决策 | 含义 | -|---|---| -| **运行哪些字节** | 固定一个确切的镜像。像 `latest` 这样的滚动标签可能在你不知情时被重新指向,确切的版本标签在该版本被重新构建时也会如此;只有摘要不会。保留上一个版本:那就是回滚。 | -| **配置放在哪里** | 放在镜像和应用之外。数据库 URL、密钥和部署的身份都是在运行时注入的环境变量,绝不烘焙进镜像。[环境变量](/docs/reference/environment-variables)就是契约。 | -| **哪个数据库** | 生产环境运行在 PostgreSQL 上。没有 `OS_DATABASE_URL` 时,运行时会在其主目录下写一个 SQLite 文件,这适合一台持久的主机,但在容器的临时文件系统上会丢失数据。 | - -## 应用如何进入 [#how-the-app-gets-in] - -Community 镜像**不带任何应用**。你把 `os build` 编译出的产物 -`dist/objectstack.json` 交给它,有三种方式: - -| 方式 | 做法 | 何时使用 | -|---|---|---| -| **挂载** | 把文件挂载到 `/srv/app/objectstack.json`,镜像默认在那里查找 | 你完全不想构建镜像 | -| **复制进你自己的镜像** | 一个 `FROM` 官方镜像的两阶段 Dockerfile | 你每个版本发布一个自包含的镜像 | -| **按 URL 指定** | `OS_ARTIFACT_URL`,可选带一个 `#sha256=` 完整性固定值 | 你希望升级应用就是一次环境变更加一次重启 | - -[Docker](/docs/deploy/docker#run-it) 展示了全部三种方式。完全没有产物时,运行时 -会启动一个空内核,应用从 Console 市场安装。 - -## 指南 [#guides] - -- [Docker](/docs/deploy/docker) —— 运行镜像、配置它、把它放到代理后面、升级它。 -- [Kubernetes](/docs/deploy/kubernetes) —— 在编排器上运行同一个镜像,以及需要保持的属性。 -- [物理隔离](/docs/deploy/air-gapped) —— 仅限企业版:物理隔离是一种**许可证模式**,以及会在启动时被拒绝的组合。 - -没有容器运行时的话,同一个产物可以在装有 Node.js 22 的主机上通过 `os start` -运行 —— 参见[在本地运行 ObjectOS Community](/docs/start/community)。 - -## 企业版额外提供 [#enterprise-adds] - -### 另外两个决策:许可证和云端姿态 [#two-more-decisions-license-and-cloud-posture] - -| 决策 | 含义 | -|---|---| -| **哪种许可证** | 许可证是正常路径的一部分,而不是附加项。有些部署形态没有许可证会*拒绝启动*。 | -| **哪种云端姿态** | 这个运行时是否与控制平面通信。它**与许可证模式耦合**,不受支持的组合会在启动时被拒绝,而不是悄悄降级。 | - -实践中这两者是同一个决策,而选错的后果是启动失败,而不是缓慢的泄漏。 -[物理隔离](/docs/deploy/air-gapped)完整列出了受支持的组合 —— 即使你的站点是联网 -的也请读一读,因为正是那一页解释了这些组合*为什么*是现在这样。 - -### 部署包 [#the-deploy-bundle] - -你的版本会附带一个**部署包**:一个 Compose 技术栈、每种受支持形态的环境模板, -以及一份 README,其中有适用于你的版本的确切命令 —— 包括镜像仓库引用、摘要和供应 -链校验步骤。 - -这些页面承载的是**决策** —— 为什么用摘要、哪种形态用哪种许可证模式、多节点使 -什么成为必需、运行时会拒绝什么。部署包承载的是**你要复制的值**。当两者看起来 -不一致时,以随你的镜像发布的部署包为准:它与它所配置的运行时一同版本化。 - -### 三种运行形态 [#three-run-shapes] - -企业版镜像可以用三种方式运行应用,而这个选择会影响你能用什么 —— 它不仅仅是 -打包方式的问题。 - -| 形态 | 应用来自 | 何时使用 | -|---|---|---| -| **配置编写** | 镜像自带的应用 —— 镜像中编写的元数据,加上安装进它的任何内容 | 单组织部署;Compose 技术栈配置的默认形态,也是不需要任何配置的形态。 | -| **产物固定** | 一个按 URL 指定的已发布应用产物,在任何部署配置运行之前解析 | 你运行一个已发布的应用,并希望升级应用就是一次环境变更加一次重启,无需重建镜像。注意,在这条路径上部署的企业插件**不会**加载。 | -| **组合** | 一个与本部署的企业插件*组合*在一起的已发布应用产物 | 多个组织共享一个数据库。这是托管的单应用 SaaS 形态 —— 并且**仅限物理隔离许可证**,在启动时强制执行。 | - -每种形态在部署包中都有自己的环境模板。复制适用于你的形态的那一个,而不是改写 -另一个:这些模板的不同之处,正是决定姿态的那些值,而它们恰恰是运行时在提供任何 -服务之前会检查的值。 diff --git a/content/docs/deploy/index.zh-Hant.mdx b/content/docs/deploy/index.zh-Hant.mdx deleted file mode 100644 index 2c441bef..00000000 --- a/content/docs/deploy/index.zh-Hant.mdx +++ /dev/null @@ -1,102 +0,0 @@ ---- -# @generated zh-Hant from zh-Hans -- do not edit. Edit the English source, then regenerate: pnpm --filter @objectos/docs gen:zh-hant -title: 部署 -seoTitle: "部署:自管理 ObjectOS,社群版和企業版" -description: 在你自己的基礎設施上執行 ObjectOS —— 開放的社群版映象或需許可證的企業版映象,同一個執行時、同一份配置契約,以及許可證額外帶來什麼。 -editions: [community, enterprise] -translation: - source_sha: 58a24b6ac97029ee1e3b5771fb6126075b96fe0c022bea1b5147e4066862462b - guide_rev: 1 - mode: auto ---- - -ObjectOS 有兩個自管理版本,它們的部署方式相同。**ObjectOS Community** 是開源 -的執行時映象;**ObjectOS Enterprise** 是需許可證的映象,可以作為 Enterprise -Single-Node 執行在單節點上,也可以作為完整的企業版部署。兩者運行同一個執行時, -讀取同一份配置:一個數據庫、一個認證金鑰和一個加密金鑰。不同之處在於映象從哪裡 -來、應用如何進入,以及許可證解鎖什麼。本節的每一頁都同時為兩者編寫一次,並以 -**企業版額外提供**一節結尾,說明需許可證的映象能多做什麼。 - -## 兩個映象 [#the-two-images] - -| | **Community** | **Enterprise** | -|---|---|---| -| 映象 | `ghcr.io/objectstack-ai/objectstack`,公開 | 需許可證的企業版映象,來自私有映象倉庫;你的許可證附帶映象倉庫憑據 | -| 固定方式 | 確切的版本標籤(`X.Y.Z`),與映象內的 ObjectStack CLI 一致;在位元組不能變化的地方,還要固定它的**摘要**([原因](/docs/deploy/docker#pin-the-image)) | 你的釋出說明中點名的映象**摘要** | -| 架構 | `linux/amd64` 和 `linux/arm64` | 僅 `linux/amd64` | -| 應用如何到達 | 你用 `os build` 編譯出的 `objectstack.json`:掛載進去、複製進你自己的映象,或由 `OS_ARTIFACT_URL` 指定。空的執行時則改為從 Console 市場安裝應用。 | 三種執行形態之一:應用打包在映象中、一個已釋出的產物,或者一個與映象的企業外掛組合在一起的已釋出產物([見下文](#how-the-app-gets-in)) | -| 必須設定的變數 | `OS_DATABASE_URL`、`OS_AUTH_SECRET`、`OS_SECRET_KEY`(映象已經設定了 `OS_PORT=8080`) | 同上,另加 `OS_LICENSE_KEY` 和一個經過考慮的 `OS_CLOUD_URL` | -| 可複製的配置 | 這些頁面上的示例 | 隨每個版本釋出的**部署包** | -| 許可證解鎖什麼 | —— | 產品內 AI(AI Builder、"問你的資料")、AI 治理、叢集與高可用、一個部署上的多個組織、SCIM、物理隔離執行 | - -[版本對比](/docs/editions/compare)給出了完整的矩陣。在 Community 上構建的應用 -就是普通的 ObjectStack 後設資料,不做任何修改即可在 Enterprise 上執行。 - -## 每個部署都要決定三件事 [#every-deployment-decides-three-things] - -| 決策 | 含義 | -|---|---| -| **執行哪些位元組** | 固定一個確切的映象。像 `latest` 這樣的滾動標籤可能在你不知情時被重新指向,確切的版本標籤在該版本被重新構建時也會如此;只有摘要不會。保留上一個版本:那就是回滾。 | -| **配置放在哪裡** | 放在映象和應用之外。資料庫 URL、金鑰和部署的身份都是在執行時注入的環境變數,絕不烘焙進映象。[環境變數](/docs/reference/environment-variables)就是契約。 | -| **哪個資料庫** | 生產環境執行在 PostgreSQL 上。沒有 `OS_DATABASE_URL` 時,執行時會在其主目錄下寫一個 SQLite 檔案,這適合一臺持久的主機,但在容器的臨時檔案系統上會丟失資料。 | - -## 應用如何進入 [#how-the-app-gets-in] - -Community 映象**不帶任何應用**。你把 `os build` 編譯出的產物 -`dist/objectstack.json` 交給它,有三種方式: - -| 方式 | 做法 | 何時使用 | -|---|---|---| -| **掛載** | 把檔案掛載到 `/srv/app/objectstack.json`,映象預設在那裡查詢 | 你完全不想構建映象 | -| **複製進你自己的映象** | 一個 `FROM` 官方映象的兩階段 Dockerfile | 你每個版本釋出一個自包含的映象 | -| **按 URL 指定** | `OS_ARTIFACT_URL`,可選帶一個 `#sha256=` 完整性固定值 | 你希望升級應用就是一次環境變更加一次重啟 | - -[Docker](/docs/deploy/docker#run-it) 展示了全部三種方式。完全沒有產物時,執行時 -會啟動一個空核心,應用從 Console 市場安裝。 - -## 指南 [#guides] - -- [Docker](/docs/deploy/docker) —— 執行映象、配置它、把它放到代理後面、升級它。 -- [Kubernetes](/docs/deploy/kubernetes) —— 在編排器上運行同一個映象,以及需要保持的屬性。 -- [物理隔離](/docs/deploy/air-gapped) —— 僅限企業版:物理隔離是一種**許可證模式**,以及會在啟動時被拒絕的組合。 - -沒有容器執行時的話,同一個產物可以在裝有 Node.js 22 的主機上通過 `os start` -執行 —— 參見[在本地執行 ObjectOS Community](/docs/start/community)。 - -## 企業版額外提供 [#enterprise-adds] - -### 另外兩個決策:許可證和雲端姿態 [#two-more-decisions-license-and-cloud-posture] - -| 決策 | 含義 | -|---|---| -| **哪種許可證** | 許可證是正常路徑的一部分,而不是附加項。有些部署形態沒有許可證會*拒絕啟動*。 | -| **哪種雲端姿態** | 這個執行時是否與控制平面通訊。它**與許可證模式耦合**,不受支援的組合會在啟動時被拒絕,而不是悄悄降級。 | - -實踐中這兩者是同一個決策,而選錯的後果是啟動失敗,而不是緩慢的洩漏。 -[物理隔離](/docs/deploy/air-gapped)完整列出了受支援的組合 —— 即使你的站點是聯網 -的也請讀一讀,因為正是那一頁解釋了這些組合*為什麼*是現在這樣。 - -### 部署包 [#the-deploy-bundle] - -你的版本會附帶一個**部署包**:一個 Compose 技術棧、每種受支援形態的環境模板, -以及一份 README,其中有適用於你的版本的確切命令 —— 包括映象倉庫引用、摘要和供應 -鏈校驗步驟。 - -這些頁面承載的是**決策** —— 為什麼用摘要、哪種形態用哪種許可證模式、多節點使 -什麼成為必需、執行時會拒絕什麼。部署包承載的是**你要複製的值**。當兩者看起來 -不一致時,以隨你的映象釋出的部署包為準:它與它所配置的執行時一同版本化。 - -### 三種執行形態 [#three-run-shapes] - -企業版映象可以用三種方式執行應用,而這個選擇會影響你能用什麼 —— 它不僅僅是 -打包方式的問題。 - -| 形態 | 應用來自 | 何時使用 | -|---|---|---| -| **配置編寫** | 映象自帶的應用 —— 映象中編寫的後設資料,加上安裝進它的任何內容 | 單組織部署;Compose 技術棧配置的預設形態,也是不需要任何配置的形態。 | -| **產物固定** | 一個按 URL 指定的已釋出應用產物,在任何部署配置執行之前解析 | 你執行一個已釋出的應用,並希望升級應用就是一次環境變更加一次重啟,無需重建映象。注意,在這條路徑上部署的企業外掛**不會**載入。 | -| **組合** | 一個與本部署的企業外掛*組合*在一起的已釋出應用產物 | 多個組織共享一個數據庫。這是託管的單應用 SaaS 形態 —— 並且**僅限物理隔離許可證**,在啟動時強制執行。 | - -每種形態在部署包中都有自己的環境模板。複製適用於你的形態的那一個,而不是改寫 -另一個:這些模板的不同之處,正是決定姿態的那些值,而它們恰恰是執行時在提供任何 -服務之前會檢查的值。 diff --git a/content/docs/editions/license.ja.mdx b/content/docs/editions/license.ja.mdx deleted file mode 100644 index db97c855..00000000 --- a/content/docs/editions/license.ja.mdx +++ /dev/null @@ -1,118 +0,0 @@ ---- -title: ライセンスと料金 -description: ObjectOS は 3 つのエディションを持つひとつの製品です。Community(オープンソース、無料)、Cloud、Enterprise。それぞれのライセンス形態と、ObjectStack フレームワークとの関係を説明します。 -editions: [community, cloud, enterprise] -translation: - source_sha: 32388e7b58b1b2a02d23d2ffc641867011e628c961d3b1ebccfb0dd20c99d037 - guide_rev: 1 - mode: auto ---- - -## ひとつの製品、3 つのエディション [#one-product-three-editions] - -ObjectOS は **ObjectStack アプリケーションの公式ランタイム環境**で、3 つのエディションがあります。**ObjectOS Community**(オープンソース、セルフホスト、無料)、**ObjectOS Cloud**(私たちが運用)、**ObjectOS Enterprise**(商用ライセンスのもとであなたが運用)です。ObjectStack は、3 つのエディションが実行するプロトコル、SDK、CLI、フレームワークの名前です。 - -{/* - Naming, decided under #79 and re-confirmed on #107: "Console UI" here and in - the Apache-2.0 list further down names the *component* — the shipped browser - bundle, the `@objectstack/console` package, the same spelling architecture.mdx - and configure/system-settings.mdx were deliberately kept at. #79 retired - "Console" as the name of the end-user surface (a reader opens ObjectOS, not - "the Console") but kept the names of things the product ships, and a license - enumerates artifacts rather than surfaces. Both occurrences on this page are - therefore deliberate — do not rewrite them to "the UI" or to "ObjectOS". -*/} - -オープンソースの部分には 2 つの名前と 1 つのライセンスがあります。**[ObjectStack フレームワーク](https://github.com/objectstack-ai/objectstack)**(Apache-2.0)はプロトコル、カーネル、SDK、CLI です。**ObjectOS Community** はそこから構築されたオープンソースのランタイムと Console UI です。本番用のランタイムイメージ、MCP サーバー、権限と共有、監査、あらゆるプロトコル機能など、**独自のアプリケーションを構築、実行、セルフホスト**するために必要なものすべてが無料で、開発と本番の間に機能の制限はありません。そのコードは同じ objectstack リポジトリにあります。ObjectOS Cloud と ObjectOS Enterprise は、その仕組みの上に**組み込みの AI** と**公式に運用 / サポートされる**プラットフォームが欲しいときに購入するものです。 - -## エディション [#editions] - -ObjectOS Community は無料です。2 つの商用エディションには、ひとつの料金表と 2 つの提供形態があり、**AI シート**が唯一の課金単位です。 - -| | **Community** | **Free** | **Team** | **Enterprise** | -|---|---|---|---|---| -| エディション | ObjectOS Community | ObjectOS Cloud | ObjectOS Cloud | ObjectOS Enterprise | -| 提供形態 | **セルフマネージド** | クラウド | クラウド | 契約によるクラウド、または**セルフマネージド**(シングルノードまたはプライベートデプロイ) | -| 料金 | **無料**(Apache-2.0) | **無料** | **$24** / AI シート / 月、または年払いで $20 / AI シート / 月 | 個別見積もり(ボリューム):[営業にお問い合わせください](mailto:sales@objectos.ai) | -| UI 内の AI(AI Builder +「データに質問する」) | MCP のみ(モデルは持ち込み) | お試し | ✓ | ✓ | -| AI ガバナンス(アクションの監査、ガードレール、権限のスコープ設定) | — | — | — | ✓ | -| クラスタリング / HA、マルチ組織のセルフホスト、エアギャップ、SCIM | — | — | — | ✓ | -| サポート | コミュニティ | コミュニティ | スタンダード | SLA + 専任 | - -ObjectOS Cloud は **Free** と **Team** で、Business プランはありません。Team にはメンバー、レコード、オブジェクトの数の上限がありません。Team を超えるものはすべて **Enterprise** 契約で、その唯一の価格付きのエントリーは **Enterprise Single-Node**(旧 Business Self-Managed)です。シングルノードで **$540** / AI シート / 年、10〜25 AI シート向けです。[営業にお問い合わせください](mailto:sales@objectos.ai)。 - -**無料で**セルフホストしたいですか?それが **ObjectOS Community** です(MCP のみの AI:モデルは持ち込み)。下の [ObjectOS Community](#objectos-community) を参照してください。 - -**オープンな仕組み、クローズドなインテリジェンス。** データをモデル化しアプリを実行するために必要なものはすべてオープンソースです(ObjectStack フレームワーク上の ObjectOS Community)。Cloud と Enterprise は、その上に*組み込みのインテリジェンス*(製品内の AI Builder と「データに質問する」アシスタント。ガバナンスと監査付き)を重ね、さらに運用のスケールと公式サポートを加えます。 - -**支払うのは AI シートだけです。** 課金されるシートは **AI シート**だけです。閲覧者、AI を使わないアプリユーザー、MCP 上で構築する開発者は無料で、ユーザーごとのシート課金はありません(ユーザーあたり $150〜300 の既存製品とは明確に対照的です)。 - -## クラウドかセルフマネージドか [#cloud-or-self-managed] - -セルフマネージドの ObjectOS は、**ObjectOS Community**(無料)または **ObjectOS Enterprise**(ライセンス制)です。Cloud は Free と Team で、Team より上はすべて Enterprise の契約です。 - -- **Cloud(Free / Team)**:フルホスト型、セルフサービス。料金にはホスティングと十分な月間 AI 利用枠が含まれます(モデルは私たちが実行します)。 -- **Enterprise**:契約により販売されるライセンス制の ObjectOS で、3 つの形があります。 - - **ObjectOS Cloud 上**:ホスト型サービス上の、自社のアイデンティティプロバイダーによるシングルサインオン(OIDC / SAML)と AI ガバナンス(アクションの監査、ガードレール、権限のスコープ設定)、上限のないストレージ、優先サポート。料金は契約によります。 - - **Enterprise Single-Node**:シングルノードのエントリーオプションで、旧 Business Self-Managed と同じ条件です。**10〜25 AI シート**向けの**シングルノード Docker ライセンス**です($540/AI シート/年、年額)。自社のインフラストラクチャ上で UI 内の AI、AI ガバナンス、シングルサインオンを利用でき、**モデル / キーは持ち込み**です(LLM のコストは自分で支払います。プラットフォームの AI 請求や従量課金はありません)。オンラインで検証されるライセンス、カード払い、スタンダードサポート。ライセンスが失効しても、ランタイムは動作し続け、データはそのまま残ります。有料機能がオフになるだけです(使えなくなることは決してありません)。名前と契約には、含まれないものが明記されており、そのすべてにフルのプライベートデプロイが必要です。クラスタリング / HA / マルチノード、エアギャップまたはオフラインのライセンス、ひとつのデプロイ上の複数の組織、SCIM と ID ライフサイクル、階層セキュリティ、更新しない場合の最後に支払ったバージョンの維持、オフライン / 銀行振込での支払いと複数年契約、優先 / SLA / 専任サポート、エンタープライズコネクタ、コンプライアンスの証明、データレジデンシー、そして 25 を超える AI シートです。 - - **フルのプライベートデプロイ**:それを超えるすべてのもの。クラスタリング / HA / マルチノード、マルチ組織のセルフホスト、データレジデンシーと**エアギャップ**運用、SCIM と ID ライフサイクル、コンプライアンスの証明、SLA と専任サポート、オフライン / 請求書払い。複数年の価格固定オプション付きの**年間ライセンス**として販売されます。更新しない場合、デプロイは**最後に支払ったバージョンを永続的に維持**します(失うのはアップデートとサポートであり、システムやデータではありません)。料金はボリュームベースです。[営業にお問い合わせください](mailto:sales@objectos.ai)。 - -**ノードごとの課金はありません**。クラスタリング / スケールは Enterprise に含まれます。 - -## それぞれが適するとき [#when-you-might-want-each] - -| シナリオ | 選ぶもの | -|---|---| -| プラットフォームを**ホストして運用してほしい** | ObjectOS Cloud(Free → Team) | -| ホスト型サービスで**自社のアイデンティティプロバイダーによる SSO と AI ガバナンス**が必要 | ObjectOS Cloud 上の **ObjectOS Enterprise**、契約による | -| **自社のシングルノード**で実行しなければならず、製品内の AI が欲しい、25 AI シート以下 | **Enterprise Single-Node**、ObjectOS Enterprise のシングルノードのエントリーオプション | -| **クラスタリング / HA**、**マルチ組織**、**エアギャップ**、**SCIM**、コンプライアンスの証明、SLA、オフライン払いが必要 | **ObjectOS Enterprise**、フルのプライベートデプロイ | -| ObjectOS Community をセルフホストしているが、**商用契約付きのサポートされたディストリビューション**(SLA、セキュリティパッチの優先対応、指名エスカレーション)が必要 | **ObjectOS Runtime Subscription**:[営業にお問い合わせください](mailto:sales@objectos.ai) | -| **無料のセルフホスト**で、MCP 経由で AI を持ち込みたい | **ObjectOS Community**(オープンソース) | -| ObjectOS または ObjectStack の名前で **OEM / 再配布**の権利が必要 | 商用契約:[営業にお問い合わせください](mailto:sales@objectos.ai) | - -## ObjectOS Community [#objectos-community] - -**ObjectOS Community**(ランタイムイメージと Console UI)と、その土台である **ObjectStack フレームワーク**は、[Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) のもとでライセンスされています。コピーレフトなし、明示的な特許許諾、永久に無料。シートも、利用ティアも、ライセンスサーバーも、キーも、テレメトリもありません。ノート PC、自社のサーバー、顧客のサーバー、1000 ポッドのクラスターのどこで実行しても、ライセンスは同じです。そこでの AI の経路はオープンな **MCP サーバー**です。自分の Claude Code(または任意の MCP クライアント)をデプロイに向ければ、自分のモデルでデータをクエリし操作できます。 - -Apache-2.0 であるもの(objectstack リポジトリ内):ランタイムイメージ、すべての`@objectstack/*` npm パッケージ(ランタイム、プラグイン、サービス、ドライバー、アダプター、CLI、クライアント SDK)、templates リポジトリ、そして Console UI(それが提供する Account アプリを含む)。ドキュメントは CC-BY-4.0 です。 - -全文:[LICENSE](https://github.com/objectstack-ai/objectstack/blob/main/LICENSE) - -## 商標 [#trademarks] - -「ObjectOS」と ObjectOS のロゴは**商標**であり、どのコードライセンスの対象でもありません。自社の製品が ObjectOS / ObjectStack の*上に構築されている*、または*互換性がある*と事実に即して述べることはできます。自社の製品名、会社名、ドメイン名にこれらの名前やロゴを使うには書面による許可が必要です。[TRADEMARK.md](https://github.com/objectstack-ai/docs.objectos.ai/blob/main/TRADEMARK.md) を参照してください。 - -## サードパーティのコンポーネント [#third-party-components] - -ObjectOS は ObjectStack フレームワークと、いくつかの上流のオープンソースプロジェクト(Node.js、Hono、Zod、Better Auth、AI SDK など)の上に構築されています。それぞれに独自のライセンスが付属し、すべて商用利用と互換性のある Apache-2.0、MIT、BSD 系の寛容なライセンスです。完全な一覧は、各リリースとともに公開される SBOM を参照してください。 - -## よくある質問 [#faq] - -### ObjectOS はオープンソースですか? [#is-objectos-open-source] - -**ObjectOS Community** はオープンソースです。ランタイムと Console は Apache-2.0 で無料、そのもととなる ObjectStack フレームワークと並んで [objectstack リポジトリ](https://github.com/objectstack-ai/objectstack)でオープンに開発されています。**ObjectOS Cloud**と **ObjectOS Enterprise** は商用エディションで、同じ仕組みの上に組み込みの AI、ホスティングと運用、SSO、サポートを加えたものです。 - -### 顧客に販売するクローズドソースの SaaS で ObjectStack を使えますか? [#can-i-use-objectstack-in-a-closed-source-saas-i-sell-to-my-customers] - -はい。Apache-2.0 にはコピーレフトもロイヤリティもありません。コードを共有する必要はなく、製品が利益を上げても支払うものはありません。 - -### 支払いなしで ObjectOS をセルフホストできますか? [#can-i-self-host-objectos-without-paying] - -はい。それが **ObjectOS Community** です。同じオープンな仕組みをセルフホストし、AI は MCP のみ(モデルは持ち込み)です。*ライセンス制*のセルフマネージドエディションは ObjectOS Enterprise で、その 2 つのセルフマネージドのオプション(Enterprise Single-Node、またはフルの Enterprise デプロイ)はどちらも、製品内の AI、AI ガバナンス、商用サポートを追加します。 - -### 更新しないとソフトウェアは動かなくなりますか? [#does-the-software-stop-working-if-i-dont-renew] - -使えなくなることは決してありません。Enterprise Single-Node は無料の仕組みの動作に戻ります(有料機能はオフになり、データとランタイムは動作し続けます)。フルの Enterprise デプロイは**最後に支払ったバージョンを永続的に**維持します。失うのはアップデート、新しい AI 機能、サポートであり、システムではありません。 - -### ObjectOS は外部に通信しますか? [#does-objectos-phone-home] - -ObjectOS Enterprise はライセンスをオンラインで検証します。エアギャップの Enterprise ライセンスはオフラインで検証します。ObjectOS Community にはテレメトリも、ライセンスチェックも、アップデートの確認通信もありません。 - -### ObjectOS Community に契約上の保証が欲しい場合は? [#what-if-i-want-a-contractual-warranty-on-objectos-community] - -それが **ObjectOS Runtime Subscription** です。ObjectOS Community に対するサポート契約(公式ディストリビューション、SLA、セキュリティパッチの優先対応)で、機能の違いはまったくありません。[sales@objectos.ai](mailto:sales@objectos.ai) にお問い合わせください。 - -### ObjectOS Community とフレームワークはずっと無料ですか? [#will-objectos-community-and-the-framework-always-be-free] - -はい。Apache-2.0 の許諾は取り消し不能であり、すでにリリースされたものはすべてリリース時のライセンスのままです。 diff --git a/content/docs/editions/license.mdx b/content/docs/editions/license.mdx index 1435c855..26709391 100644 --- a/content/docs/editions/license.mdx +++ b/content/docs/editions/license.mdx @@ -47,7 +47,7 @@ rate card, two deliveries, and the **AI seat** is the only unit of pricing. | Price | **Free** (Apache-2.0) | **Free** | **$24** / AI seat / mo, or $20 / AI seat / mo billed annually | Custom (volume) — [contact sales](mailto:sales@objectos.ai) | | In-UI AI (AI Builder + "ask your data") | MCP only (bring your own model) | taste | ✓ | ✓ | | AI governance (action audit, guardrails, permission scoping) | — | — | — | ✓ | -| Clustering / HA, multi-org self-host, air-gap, SCIM | — | — | — | ✓ | +| Multi-node topology (the kit runs a single node today), multi-org self-host, air-gap, SCIM | — | — | — | ✓ | | Support | community | community | standard | SLA + dedicated | ObjectOS Cloud is **Free** and **Team**; there is no Business plan. Team has @@ -92,14 +92,14 @@ Enterprise contract. license lapses, the runtime keeps running and your data stays intact — the paid features simply switch off (it never bricks). Its name and its contract state what it leaves out, all of which needs a full private - deployment: clustering / HA / multi-node, air-gapped or offline licenses, + deployment: multi-node, air-gapped or offline licenses, several organizations on one deployment, SCIM and identity lifecycle, hierarchy security, keeping the last paid version on non-renewal, offline / wire payment and multi-year terms, priority / SLA / dedicated support, enterprise connectors, compliance attestations, data residency, and more than 25 AI seats. - - **Full private deployment** — for everything beyond that: clustering / - HA / multi-node, multi-organization self-host, data residency and + - **Full private deployment** — for everything beyond that: multi-node + topology (the kit runs a single node today), multi-organization self-host, data residency and **air-gapped** operation, SCIM and identity lifecycle, compliance attestations, SLA and dedicated support, and offline / invoice payment. Sold as an **annual license** with multi-year price-lock options; on @@ -107,8 +107,7 @@ Enterprise contract. (you lose updates and support, never your system or data). Pricing is volume-based — [contact sales](mailto:sales@objectos.ai). -There is **no per-node charge** — clustering / scale is folded into -Enterprise. +There is **no per-node charge**. ## When you might want each @@ -117,7 +116,7 @@ Enterprise. | You want the platform **hosted and operated for you** | ObjectOS Cloud (Free → Team) | | You need **SSO with your identity provider and AI governance** on the hosted service | **ObjectOS Enterprise** on ObjectOS Cloud, by contract | | You must run on **your own single node** and want the in-product AI, ≤25 AI seats | **Enterprise Single-Node**, the single-node entry option of ObjectOS Enterprise | -| You need **clustering / HA**, **multi-org**, **air-gap**, **SCIM**, compliance attestations, SLAs, or offline payment | **ObjectOS Enterprise**, full private deployment | +| You need **multi-node**, **multi-org**, **air-gap**, **SCIM**, compliance attestations, SLAs, or offline payment | **ObjectOS Enterprise**, full private deployment | | You self-host ObjectOS Community but need a **supported distribution with a commercial contract** (SLA, security-patch priority, named escalation) | **ObjectOS Runtime Subscription** — [contact sales](mailto:sales@objectos.ai) | | You want **free self-hosting** and bring your own AI over MCP | **ObjectOS Community** (open source) | | You need **OEM / redistribution** rights under the ObjectOS or ObjectStack name | Commercial agreement — [contact sales](mailto:sales@objectos.ai) | diff --git a/content/docs/editions/license.zh-Hans.mdx b/content/docs/editions/license.zh-Hans.mdx deleted file mode 100644 index f537e4c2..00000000 --- a/content/docs/editions/license.zh-Hans.mdx +++ /dev/null @@ -1,190 +0,0 @@ ---- -title: 许可与定价 -description: ObjectOS 是一个产品、三个版本 —— Community(开源,免费)、Cloud 和 Enterprise —— 每个版本如何授权,以及它们与 ObjectStack 框架的关系。 -editions: [community, cloud, enterprise] -translation: - source_sha: 32388e7b58b1b2a02d23d2ffc641867011e628c961d3b1ebccfb0dd20c99d037 - guide_rev: 1 - mode: auto ---- - -## 一个产品,三个版本 [#one-product-three-editions] - -ObjectOS 是 **ObjectStack 应用的官方运行时环境**,有三个版本: -**ObjectOS Community**(开源、自托管、免费)、**ObjectOS Cloud**(由我们 -运维)和 **ObjectOS Enterprise**(由你在商业许可下运维)。ObjectStack 是这 -三个版本所运行的协议、SDK、CLI 和框架的名称。 - -{/* - Naming, decided under #79 and re-confirmed on #107: "Console UI" here and in - the Apache-2.0 list further down names the *component* — the shipped browser - bundle, the `@objectstack/console` package, the same spelling architecture.mdx - and configure/system-settings.mdx were deliberately kept at. #79 retired - "Console" as the name of the end-user surface (a reader opens ObjectOS, not - "the Console") but kept the names of things the product ships, and a license - enumerates artifacts rather than surfaces. Both occurrences on this page are - therefore deliberate — do not rewrite them to "the UI" or to "ObjectOS". -*/} - -开源这部分有两个名字、一个许可证。 -**[ObjectStack 框架](https://github.com/objectstack-ai/objectstack)** -(Apache-2.0)是协议、内核、SDK 和 CLI;**ObjectOS Community** 是由它构建 -的开源运行时和 Console UI —— 生产级运行时镜像、MCP 服务器、权限与共享、 -审计、每一项协议能力 —— **构建、运行和自托管你自己的应用**所需的一切, -免费,开发与生产之间没有功能关卡。它的代码位于同一个 objectstack 仓库中。 -当你想在这套机制之上获得**嵌入式 AI** 和一个**官方运维 / 官方支持**的平台 -时,你购买的就是 ObjectOS Cloud 和 ObjectOS Enterprise。 - -## 版本 [#editions] - -ObjectOS Community 免费。两个商业版本使用一张价目表、两种交付方式, -**AI 席位**是唯一的计价单位。 - -| | **Community** | **Free** | **Team** | **Enterprise** | -|---|---|---|---|---| -| 版本 | ObjectOS Community | ObjectOS Cloud | ObjectOS Cloud | ObjectOS Enterprise | -| 交付方式 | **自管理** | 云 | 云 | 按合同在云上,或**自管理**(单节点或私有部署) | -| 价格 | **免费**(Apache-2.0) | **免费** | **24 美元** / AI 席位 / 月,或按年付费 20 美元 / AI 席位 / 月 | 定制(按量)—— [联系销售](mailto:sales@objectos.ai) | -| UI 内 AI(AI Builder + "问你的数据") | 仅 MCP(自带模型) | 体验版 | ✓ | ✓ | -| AI 治理(动作审计、护栏、权限范围限定) | — | — | — | ✓ | -| 集群 / 高可用、多组织自托管、物理隔离、SCIM | — | — | — | ✓ | -| 支持 | 社区 | 社区 | 标准 | SLA + 专属 | - -ObjectOS Cloud 就是 **Free** 和 **Team**;没有 Business 套餐。Team 不限制成员、 -记录或对象的数量。Team 之上的一切都是 **Enterprise** 合同,它唯一标价的入门 -选项是 **Enterprise Single-Node**(原 Business Self-Managed):单个节点上 -**540 美元** / AI 席位 / 年,适用于 10–25 个 AI 席位 —— -[联系销售](mailto:sales@objectos.ai)。 - -想**免费**自托管?那就是 **ObjectOS Community**(仅 MCP 的 AI:自带模型)。 -参见下文的 [ObjectOS Community](#objectos-community)。 - -**开放的机制,封闭的智能。** 建模数据和运行应用所需的一切都是开源的 -(ObjectOS Community,基于 ObjectStack 框架)。Cloud 和 Enterprise 在其上 -叠加了*嵌入式智能* —— 产品内的 AI Builder 和"问你的数据"助手,经过治理 -和审计 —— 再加上运营规模和官方支持。 - -**你只为 AI 席位付费。** 唯一计费的席位是 **AI 席位**;只读用户、非 AI 的 -应用用户以及通过 MCP 构建的开发者都免费,没有按用户收取的席位税(与那些 -每用户 150–300 美元的老牌厂商形成鲜明对比)。 - -## 云还是自管理 [#cloud-or-self-managed] - -自管理的 ObjectOS 是 **ObjectOS Community**(免费)或 **ObjectOS -Enterprise**(需许可)。云是 Free 和 Team;Team 之上的一切都是 Enterprise -合同。 - -- **云(Free / Team)** —— 完全托管,自助开通。价格包含托管和一份充裕的 - 每月 AI 额度(模型由我们运行)。 -- **Enterprise** —— 需许可的 ObjectOS,按合同销售,有三种形态: - - **在 ObjectOS Cloud 上** —— 托管服务上与你的身份提供商的单点登录(OIDC - / SAML)和 AI 治理(动作审计、护栏、权限范围限定),不设上限的存储, - 优先支持。按合同定价。 - - **Enterprise Single-Node** —— 单节点入门选项,原 Business - Self-Managed,条款不变:适用于 **10–25 个 AI 席位**的**单节点 Docker - 许可证**(540 美元/AI 席位/年,按年):在你自己的基础设施上提供 UI 内 - AI、AI 治理和单点登录,**自带模型 / 密钥**(你自己承担 LLM 成本 —— 没有 - 平台 AI 账单或计量),在线校验的许可证,刷卡支付,标准支持。如果许可证 - 过期,运行时会继续运行,你的数据保持完整 —— 只是付费功能会关闭(它永远 - 不会变砖)。它的名称和合同写明了它不包含的内容,这些都需要完整私有部署: - 集群 / 高可用 / 多节点、物理隔离或离线许可证、单个部署承载多个组织、SCIM - 和身份生命周期、层级安全、不续约时保留最后一个已付费的版本、线下 / 电汇 - 付款和多年期合同、优先 / SLA / 专属支持、企业连接器、合规证明、数据驻留, - 以及超过 25 个 AI 席位。 - - **完整私有部署** —— 适用于超出上述范围的一切:集群 / 高可用 / 多节点、 - 多组织自托管、数据驻留和**物理隔离**运行、SCIM 和身份生命周期、合规 - 证明、SLA 和专属支持,以及线下 / 发票付款。以**年度许可证**销售,可选 - 多年锁价;不续约时,你的部署会**永久保留最后一个已付费的版本**(你失去 - 的是更新和支持,绝不是你的系统或数据)。价格按量计算 —— - [联系销售](mailto:sales@objectos.ai)。 - -**不按节点收费** —— 集群 / 扩展已包含在 Enterprise 中。 - -## 什么时候选哪个 [#when-you-might-want-each] - -| 场景 | 选择 | -|---|---| -| 你希望平台**由别人托管和运维** | ObjectOS Cloud(Free → Team) | -| 你需要托管服务上**与你的身份提供商的 SSO 和 AI 治理** | ObjectOS Cloud 上的 **ObjectOS Enterprise**,按合同 | -| 你必须在**你自己的单个节点**上运行,并且想要产品内 AI,AI 席位 ≤25 个 | **Enterprise Single-Node**,ObjectOS Enterprise 的单节点入门选项 | -| 你需要**集群 / 高可用**、**多组织**、**物理隔离**、**SCIM**、合规证明、SLA 或线下付款 | **ObjectOS Enterprise**,完整私有部署 | -| 你自托管 ObjectOS Community,但需要一个**带商业合同的受支持发行版**(SLA、安全补丁优先、指定升级渠道) | **ObjectOS Runtime Subscription** —— [联系销售](mailto:sales@objectos.ai) | -| 你想要**免费自托管**,并通过 MCP 自带 AI | **ObjectOS Community**(开源) | -| 你需要以 ObjectOS 或 ObjectStack 名义进行 **OEM / 再分发**的权利 | 商业协议 —— [联系销售](mailto:sales@objectos.ai) | - -## ObjectOS Community [#objectos-community] - -**ObjectOS Community** —— 运行时镜像和 Console UI —— 以及构建它的 -**ObjectStack 框架**,均采用 -[Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) -授权:没有 copyleft,有明确的专利授权,永久免费 —— 没有席位,没有用量 -档位,没有许可证服务器,没有密钥,没有遥测。在你的笔记本、你的服务器、 -你客户的服务器或一个 1000 个 Pod 的集群上运行它;许可证在任何情况下都 -一样。你在那里的 AI 路径是开放的 **MCP 服务器**:把你自己的 Claude Code -(或任何 MCP 客户端)指向你的部署,它就能用你自己的模型查询和操作你的 -数据。 - -Apache-2.0 授权的内容(位于 objectstack 仓库中):运行时镜像、所有 -`@objectstack/*` npm 包(运行时、插件、服务、驱动、适配器、CLI、客户端 -SDK)、templates 仓库,以及 Console UI,包括它提供的 Account 应用。 -文档采用 CC-BY-4.0。 - -全文:[LICENSE](https://github.com/objectstack-ai/objectstack/blob/main/LICENSE) - -## 商标 [#trademarks] - -"ObjectOS"和 ObjectOS 标志是**商标**,不受任何代码许可证的覆盖。你可以 -如实地说你的产品*构建于* ObjectOS / ObjectStack 之上或*兼容* ObjectOS / -ObjectStack;在你自己的产品、公司或域名中使用这些名称或标志需要书面许可。 -参见 [TRADEMARK.md](https://github.com/objectstack-ai/docs.objectos.ai/blob/main/TRADEMARK.md)。 - -## 第三方组件 [#third-party-components] - -ObjectOS 构建在 ObjectStack 框架和若干上游开源项目(Node.js、Hono、Zod、 -Better Auth、AI SDK ……)之上。每个组件都带有自己的许可证 —— 全部是 -Apache-2.0、MIT 或 BSD 风格的宽松许可证,兼容商业使用。完整清单见每个 -版本随附发布的 SBOM。 - -## 常见问题 [#faq] - -### ObjectOS 是开源的吗? [#is-objectos-open-source] - -**ObjectOS Community** 是:运行时和 Console 采用 Apache-2.0,免费,并在 -[objectstack 仓库](https://github.com/objectstack-ai/objectstack)中公开 -开发,与构建它们的 ObjectStack 框架放在一起。**ObjectOS Cloud** 和 -**ObjectOS Enterprise** 是商业版本 —— 在同一套机制之上提供嵌入式 AI、 -托管与运维、SSO 和支持。 - -### 我能在卖给客户的闭源 SaaS 中使用 ObjectStack 吗? [#can-i-use-objectstack-in-a-closed-source-saas-i-sell-to-my-customers] - -可以。Apache-2.0 没有 copyleft,也没有版税 —— 你不需要公开你的代码, -即使你的产品赚了钱,你也不欠任何费用。 - -### 我能不付费自托管 ObjectOS 吗? [#can-i-self-host-objectos-without-paying] - -可以 —— 那就是 **ObjectOS Community**:同样开放的机制,自托管,AI 仅通过 -MCP(自带模型)。*需许可*的自管理版本是 ObjectOS Enterprise,它的两个 -自管理选项(Enterprise Single-Node,或完整的 Enterprise 部署)都会 -增加产品内 AI、AI 治理和商业支持。 - -### 如果我不续约,软件会停止工作吗? [#does-the-software-stop-working-if-i-dont-renew] - -它永远不会变砖。Enterprise Single-Node 会降级为免费机制的行为(付费功能 -关闭;你的数据和运行时继续工作)。完整的 Enterprise 部署会**永久保留最后 -一个已付费的版本** —— 你失去的是更新、新的 AI 能力和支持,而不是你的 -系统。 - -### ObjectOS 会"回传数据"吗? [#does-objectos-phone-home] - -ObjectOS Enterprise 会在线校验许可证;物理隔离的 Enterprise 许可证离线 -校验。ObjectOS Community 没有遥测,没有许可证检查,也没有更新探测。 - -### 如果我想为 ObjectOS Community 获得合同担保怎么办? [#what-if-i-want-a-contractual-warranty-on-objectos-community] - -那就是 **ObjectOS Runtime Subscription** —— 针对 ObjectOS Community 的 -支持合同(官方发行版、SLA、安全补丁优先),功能上没有任何差别。请联系 -[sales@objectos.ai](mailto:sales@objectos.ai)。 - -### ObjectOS Community 和框架会一直免费吗? [#will-objectos-community-and-the-framework-always-be-free] - -会。Apache-2.0 的授予不可撤销,所有已经发布的内容都会保持发布时的许可。 diff --git a/content/docs/editions/license.zh-Hant.mdx b/content/docs/editions/license.zh-Hant.mdx deleted file mode 100644 index 336cee1a..00000000 --- a/content/docs/editions/license.zh-Hant.mdx +++ /dev/null @@ -1,191 +0,0 @@ ---- -# @generated zh-Hant from zh-Hans -- do not edit. Edit the English source, then regenerate: pnpm --filter @objectos/docs gen:zh-hant -title: 許可與定價 -description: ObjectOS 是一個產品、三個版本 —— Community(開源,免費)、Cloud 和 Enterprise —— 每個版本如何授權,以及它們與 ObjectStack 框架的關係。 -editions: [community, cloud, enterprise] -translation: - source_sha: 32388e7b58b1b2a02d23d2ffc641867011e628c961d3b1ebccfb0dd20c99d037 - guide_rev: 1 - mode: auto ---- - -## 一個產品,三個版本 [#one-product-three-editions] - -ObjectOS 是 **ObjectStack 應用的官方執行時環境**,有三個版本: -**ObjectOS Community**(開源、自託管、免費)、**ObjectOS Cloud**(由我們 -運維)和 **ObjectOS Enterprise**(由你在商業許可下運維)。ObjectStack 是這 -三個版本所執行的協議、SDK、CLI 和框架的名稱。 - -{/* - Naming, decided under #79 and re-confirmed on #107: "Console UI" here and in - the Apache-2.0 list further down names the *component* — the shipped browser - bundle, the `@objectstack/console` package, the same spelling architecture.mdx - and configure/system-settings.mdx were deliberately kept at. #79 retired - "Console" as the name of the end-user surface (a reader opens ObjectOS, not - "the Console") but kept the names of things the product ships, and a license - enumerates artifacts rather than surfaces. Both occurrences on this page are - therefore deliberate — do not rewrite them to "the UI" or to "ObjectOS". -*/} - -開源這部分有兩個名字、一個許可證。 -**[ObjectStack 框架](https://github.com/objectstack-ai/objectstack)** -(Apache-2.0)是協議、核心、SDK 和 CLI;**ObjectOS Community** 是由它構建 -的開源執行時和 Console UI —— 生產級執行時映象、MCP 伺服器、許可權與共享、 -審計、每一項協議能力 —— **構建、執行和自託管你自己的應用**所需的一切, -免費,開發與生產之間沒有功能關卡。它的程式碼位於同一個 objectstack 倉庫中。 -當你想在這套機制之上獲得**嵌入式 AI** 和一個**官方運維 / 官方支援**的平臺 -時,你購買的就是 ObjectOS Cloud 和 ObjectOS Enterprise。 - -## 版本 [#editions] - -ObjectOS Community 免費。兩個商業版本使用一張價目表、兩種交付方式, -**AI 席位**是唯一的計價單位。 - -| | **Community** | **Free** | **Team** | **Enterprise** | -|---|---|---|---|---| -| 版本 | ObjectOS Community | ObjectOS Cloud | ObjectOS Cloud | ObjectOS Enterprise | -| 交付方式 | **自管理** | 雲 | 雲 | 按合同在雲上,或**自管理**(單節點或私有部署) | -| 價格 | **免費**(Apache-2.0) | **免費** | **24 美元** / AI 席位 / 月,或按年付費 20 美元 / AI 席位 / 月 | 定製(按量)—— [聯絡銷售](mailto:sales@objectos.ai) | -| UI 內 AI(AI Builder + "問你的資料") | 僅 MCP(自帶模型) | 體驗版 | ✓ | ✓ | -| AI 治理(動作審計、護欄、許可權範圍限定) | — | — | — | ✓ | -| 叢集 / 高可用、多組織自託管、物理隔離、SCIM | — | — | — | ✓ | -| 支援 | 社群 | 社群 | 標準 | SLA + 專屬 | - -ObjectOS Cloud 就是 **Free** 和 **Team**;沒有 Business 套餐。Team 不限制成員、 -記錄或物件的數量。Team 之上的一切都是 **Enterprise** 合同,它唯一標價的入門 -選項是 **Enterprise Single-Node**(原 Business Self-Managed):單個節點上 -**540 美元** / AI 席位 / 年,適用於 10–25 個 AI 席位 —— -[聯絡銷售](mailto:sales@objectos.ai)。 - -想**免費**自託管?那就是 **ObjectOS Community**(僅 MCP 的 AI:自帶模型)。 -參見下文的 [ObjectOS Community](#objectos-community)。 - -**開放的機制,封閉的智慧。** 建模資料和執行應用所需的一切都是開源的 -(ObjectOS Community,基於 ObjectStack 框架)。Cloud 和 Enterprise 在其上 -疊加了*嵌入式智慧* —— 產品內的 AI Builder 和"問你的資料"助手,經過治理 -和審計 —— 再加上運營規模和官方支援。 - -**你只為 AI 席位付費。** 唯一計費的席位是 **AI 席位**;只讀使用者、非 AI 的 -應用使用者以及通過 MCP 構建的開發者都免費,沒有按使用者收取的席位稅(與那些 -每使用者 150–300 美元的老牌廠商形成鮮明對比)。 - -## 雲還是自管理 [#cloud-or-self-managed] - -自管理的 ObjectOS 是 **ObjectOS Community**(免費)或 **ObjectOS -Enterprise**(需許可)。雲是 Free 和 Team;Team 之上的一切都是 Enterprise -合同。 - -- **雲(Free / Team)** —— 完全託管,自助開通。價格包含託管和一份充裕的 - 每月 AI 額度(模型由我們執行)。 -- **Enterprise** —— 需許可的 ObjectOS,按合同銷售,有三種形態: - - **在 ObjectOS Cloud 上** —— 託管服務上與你的身份提供商的單點登入(OIDC - / SAML)和 AI 治理(動作審計、護欄、許可權範圍限定),不設上限的儲存, - 優先支援。按合同定價。 - - **Enterprise Single-Node** —— 單節點入門選項,原 Business - Self-Managed,條款不變:適用於 **10–25 個 AI 席位**的**單節點 Docker - 許可證**(540 美元/AI 席位/年,按年):在你自己的基礎設施上提供 UI 內 - AI、AI 治理和單點登入,**自帶模型 / 金鑰**(你自己承擔 LLM 成本 —— 沒有 - 平臺 AI 賬單或計量),線上校驗的許可證,刷卡支付,標準支援。如果許可證 - 過期,執行時會繼續執行,你的資料保持完整 —— 只是付費功能會關閉(它永遠 - 不會變磚)。它的名稱和合同寫明瞭它不包含的內容,這些都需要完整私有部署: - 叢集 / 高可用 / 多節點、物理隔離或離線許可證、單個部署承載多個組織、SCIM - 和身份生命週期、層級安全、不續約時保留最後一個已付費的版本、線下 / 電匯 - 付款和多年期合同、優先 / SLA / 專屬支援、企業聯結器、合規證明、資料駐留, - 以及超過 25 個 AI 席位。 - - **完整私有部署** —— 適用於超出上述範圍的一切:叢集 / 高可用 / 多節點、 - 多組織自託管、資料駐留和**物理隔離**執行、SCIM 和身份生命週期、合規 - 證明、SLA 和專屬支援,以及線下 / 發票付款。以**年度許可證**銷售,可選 - 多年鎖價;不續約時,你的部署會**永久保留最後一個已付費的版本**(你失去 - 的是更新和支援,絕不是你的系統或資料)。價格按量計算 —— - [聯絡銷售](mailto:sales@objectos.ai)。 - -**不按節點收費** —— 叢集 / 擴充套件已包含在 Enterprise 中。 - -## 什麼時候選哪個 [#when-you-might-want-each] - -| 場景 | 選擇 | -|---|---| -| 你希望平臺**由別人託管和運維** | ObjectOS Cloud(Free → Team) | -| 你需要託管服務上**與你的身份提供商的 SSO 和 AI 治理** | ObjectOS Cloud 上的 **ObjectOS Enterprise**,按合同 | -| 你必須在**你自己的單個節點**上執行,並且想要產品內 AI,AI 席位 ≤25 個 | **Enterprise Single-Node**,ObjectOS Enterprise 的單節點入門選項 | -| 你需要**叢集 / 高可用**、**多組織**、**物理隔離**、**SCIM**、合規證明、SLA 或線下付款 | **ObjectOS Enterprise**,完整私有部署 | -| 你自託管 ObjectOS Community,但需要一個**帶商業合同的受支援發行版**(SLA、安全補丁優先、指定升級渠道) | **ObjectOS Runtime Subscription** —— [聯絡銷售](mailto:sales@objectos.ai) | -| 你想要**免費自託管**,並通過 MCP 自帶 AI | **ObjectOS Community**(開源) | -| 你需要以 ObjectOS 或 ObjectStack 名義進行 **OEM / 再分發**的權利 | 商業協議 —— [聯絡銷售](mailto:sales@objectos.ai) | - -## ObjectOS Community [#objectos-community] - -**ObjectOS Community** —— 執行時映象和 Console UI —— 以及構建它的 -**ObjectStack 框架**,均採用 -[Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) -授權:沒有 copyleft,有明確的專利授權,永久免費 —— 沒有席位,沒有用量 -檔位,沒有許可證伺服器,沒有金鑰,沒有遙測。在你的筆記本、你的伺服器、 -你客戶的伺服器或一個 1000 個 Pod 的叢集上執行它;許可證在任何情況下都 -一樣。你在那裡的 AI 路徑是開放的 **MCP 伺服器**:把你自己的 Claude Code -(或任何 MCP 客戶端)指向你的部署,它就能用你自己的模型查詢和操作你的 -資料。 - -Apache-2.0 授權的內容(位於 objectstack 倉庫中):執行時映象、所有 -`@objectstack/*` npm 包(執行時、外掛、服務、驅動、介面卡、CLI、客戶端 -SDK)、templates 倉庫,以及 Console UI,包括它提供的 Account 應用。 -文件採用 CC-BY-4.0。 - -全文:[LICENSE](https://github.com/objectstack-ai/objectstack/blob/main/LICENSE) - -## 商標 [#trademarks] - -"ObjectOS"和 ObjectOS 標誌是**商標**,不受任何程式碼許可證的覆蓋。你可以 -如實地說你的產品*構建於* ObjectOS / ObjectStack 之上或*相容* ObjectOS / -ObjectStack;在你自己的產品、公司或域名中使用這些名稱或標誌需要書面許可。 -參見 [TRADEMARK.md](https://github.com/objectstack-ai/docs.objectos.ai/blob/main/TRADEMARK.md)。 - -## 第三方元件 [#third-party-components] - -ObjectOS 構建在 ObjectStack 框架和若干上游開源專案(Node.js、Hono、Zod、 -Better Auth、AI SDK ……)之上。每個元件都帶有自己的許可證 —— 全部是 -Apache-2.0、MIT 或 BSD 風格的寬鬆許可證,相容商業使用。完整清單見每個 -版本隨附釋出的 SBOM。 - -## 常見問題 [#faq] - -### ObjectOS 是開源的嗎? [#is-objectos-open-source] - -**ObjectOS Community** 是:執行時和 Console 採用 Apache-2.0,免費,並在 -[objectstack 倉庫](https://github.com/objectstack-ai/objectstack)中公開 -開發,與構建它們的 ObjectStack 框架放在一起。**ObjectOS Cloud** 和 -**ObjectOS Enterprise** 是商業版本 —— 在同一套機制之上提供嵌入式 AI、 -託管與運維、SSO 和支援。 - -### 我能在賣給客戶的閉源 SaaS 中使用 ObjectStack 嗎? [#can-i-use-objectstack-in-a-closed-source-saas-i-sell-to-my-customers] - -可以。Apache-2.0 沒有 copyleft,也沒有版稅 —— 你不需要公開你的程式碼, -即使你的產品賺了錢,你也不欠任何費用。 - -### 我能不付費自託管 ObjectOS 嗎? [#can-i-self-host-objectos-without-paying] - -可以 —— 那就是 **ObjectOS Community**:同樣開放的機制,自託管,AI 僅通過 -MCP(自帶模型)。*需許可*的自管理版本是 ObjectOS Enterprise,它的兩個 -自管理選項(Enterprise Single-Node,或完整的 Enterprise 部署)都會 -增加產品內 AI、AI 治理和商業支援。 - -### 如果我不續約,軟體會停止工作嗎? [#does-the-software-stop-working-if-i-dont-renew] - -它永遠不會變磚。Enterprise Single-Node 會降級為免費機制的行為(付費功能 -關閉;你的資料和執行時繼續工作)。完整的 Enterprise 部署會**永久保留最後 -一個已付費的版本** —— 你失去的是更新、新的 AI 能力和支援,而不是你的 -系統。 - -### ObjectOS 會"回傳資料"嗎? [#does-objectos-phone-home] - -ObjectOS Enterprise 會線上校驗許可證;物理隔離的 Enterprise 許可證離線 -校驗。ObjectOS Community 沒有遙測,沒有許可證檢查,也沒有更新探測。 - -### 如果我想為 ObjectOS Community 獲得合同擔保怎麼辦? [#what-if-i-want-a-contractual-warranty-on-objectos-community] - -那就是 **ObjectOS Runtime Subscription** —— 針對 ObjectOS Community 的 -支援合同(官方發行版、SLA、安全補丁優先),功能上沒有任何差別。請聯絡 -[sales@objectos.ai](mailto:sales@objectos.ai)。 - -### ObjectOS Community 和框架會一直免費嗎? [#will-objectos-community-and-the-framework-always-be-free] - -會。Apache-2.0 的授予不可撤銷,所有已經發布的內容都會保持釋出時的許可。 From 567bf106e270f91a32c00bac0b9ed8623a28ec2b Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 7 Nov 2026 17:56:32 +0000 Subject: [PATCH 2/2] docs(editions,deploy): drop the remaining clustering/HA promises Co-authored-by: Claude Claude-Session: https://claude.ai/code/session_012dn2AdARJtc4RgABPH7PHk --- content/docs/deploy/air-gapped.ja.mdx | 74 ----------- content/docs/deploy/air-gapped.mdx | 2 +- content/docs/deploy/air-gapped.zh-Hans.mdx | 105 --------------- content/docs/deploy/air-gapped.zh-Hant.mdx | 106 --------------- content/docs/deploy/kubernetes.ja.mdx | 112 ---------------- content/docs/deploy/kubernetes.mdx | 21 +-- content/docs/deploy/kubernetes.zh-Hans.mdx | 142 -------------------- content/docs/deploy/kubernetes.zh-Hant.mdx | 143 --------------------- content/docs/editions/compare.ja.mdx | 64 --------- content/docs/editions/compare.mdx | 4 +- content/docs/editions/compare.zh-Hans.mdx | 90 ------------- content/docs/editions/compare.zh-Hant.mdx | 91 ------------- 12 files changed, 15 insertions(+), 939 deletions(-) delete mode 100644 content/docs/deploy/air-gapped.ja.mdx delete mode 100644 content/docs/deploy/air-gapped.zh-Hans.mdx delete mode 100644 content/docs/deploy/air-gapped.zh-Hant.mdx delete mode 100644 content/docs/deploy/kubernetes.ja.mdx delete mode 100644 content/docs/deploy/kubernetes.zh-Hans.mdx delete mode 100644 content/docs/deploy/kubernetes.zh-Hant.mdx delete mode 100644 content/docs/editions/compare.ja.mdx delete mode 100644 content/docs/editions/compare.zh-Hans.mdx delete mode 100644 content/docs/editions/compare.zh-Hant.mdx diff --git a/content/docs/deploy/air-gapped.ja.mdx b/content/docs/deploy/air-gapped.ja.mdx deleted file mode 100644 index 5f30ad90..00000000 --- a/content/docs/deploy/air-gapped.ja.mdx +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: エアギャップデプロイメント -seoTitle: "エアギャップデプロイメント:ライセンスモードと設定" -description: エアギャップはファイアウォールの設定ではなくライセンスモードです。切断されたデプロイメントが宣言しなければならない 2 つの設定と、起動時に拒否される組み合わせを説明します。 -editions: [enterprise] -translation: - source_sha: d0fbf234ac1fc9be7bcdb652e29a259e133103a63533267bf3f065bdee48ce9b - guide_rev: 1 - mode: auto ---- - -## エアギャップはライセンスモードである [#air-gap-is-a-license-mode] - -ネットワークを抜くだけでは、エアギャップのデプロイメントにはなりません。通常の ObjectOS ライセンスは**オンライン**で検証されます。ランタイムはコントロールプレーンでライセンスキーを短期のエンタイトルメントと交換し、定期的に再確認します。その経路を断つと、ライセンスは「オフラインにフォールバック」するのではなく、そもそも一切有効になりません。 - -**エアギャップライセンスは別のライセンス**であり、私たちが意図的にオフラインで発行します。イメージに埋め込まれた公開鍵に対してローカルで検証され、**ネットワークトラフィックなし**でエンタイトルメントを有効にします。エアギャップ運用は Enterprise の機能であり([ライセンスと料金](/docs/editions/license)を参照)、必要なライセンスは設定するものではなく申請するものです。 - -したがって、切断されたデプロイメントは次の **2 つ**を同時に宣言します。 - -- **エアギャップライセンス** -- **コントロールプレーンなし**:クラウドの姿勢の設定を明示的に `off` にします(別名の `none`、`local`、`disabled` も同じ意味です) - -## 設定を未設定のままにすることは「クラウドなし」ではない [#leaving-the-setting-unset-is-not-no-cloud] - -これはこのページで最も高くつく間違いなので、専用の見出しを設けています。 - -> **未設定のクラウドの姿勢の設定は、公開コントロールプレーンに解決されます。** - -未設定は中立だったことは一度もありません。接続された動作を選びます。そのため、「何もしなかった」デプロイメントは、誰とも通信しないことが前提のサイトであるにもかかわらず、マーケットプレイスのプロキシがマウントされ、デバイスバインディングのルートが公開された状態になります。姿勢を宣言することは受け入れられますが、**決めないことは受け入れられません。** `off` を明示的に書いてください。 - -## サポートされる組み合わせ [#the-supported-combinations] - -これらは設定の読み込み時、ライセンスに関わる処理が始まる**前に**確認されます。サポートされない組み合わせは警告でも劣化でもありません。ランタイムは*両方*の設定を名指しした致命的エラーを表示して終了します。 - -| ライセンス | クラウドの姿勢 | 結果 | -|---|---|---| -| エアギャップライセンス | `off` | **ネットワークトラフィックなしで、完全にライセンスされた状態で動作します。** 切断環境の答えです。 | -| ライセンスなし | `off` | Community の動作で実行されます。マルチ組織の姿勢には引き続きライセンスが必要です。 | -| 通常の(オンライン)ライセンス | 到達可能なコントロールプレーン、デバイスバインディング完了済み | 通常の接続されたデプロイメント。 | -| 通常の(オンライン)ライセンス | `off` | **起動時に拒否されます。** | -| 通常の(オンライン)ライセンス | 未設定 | 公開コントロールプレーンとして扱われます(上記を参照)。動作するかどうかは、そのコントロールプレーンに実際に到達でき、バインドされているかどうかによります。 | - -### 拒否が存在する理由 [#why-the-refusal-exists] - -オンラインライセンスは、デプロイメントをコントロールプレーンにバインドする際に発行されたランタイムトークンを提示する交換によって検証されます。コントロールプレーンがなければバインディングもなく、トークンは存在しえず、交換は決して行われません。今回の起動でも、以降の起動でもです。猶予期間も役に立ちません。猶予は最後に*成功した*検証から計測されますが、最初の成功が永遠に来ないからです。 - -強制しなければ、その設定は後になって失敗し、間違ったものを責めます。マルチ組織の姿勢では、デプロイメントが「ライセンスを必要とする」という苦情で終わります。ライセンスこそが唯一間違っていなかったものなのにです。ランタイムは代わりに早い段階で拒否し、どの 2 つの設定が食い違っているかを示します。拒否はあらゆる検証の試行より前に行われるため、拒否された起動は**パケットを一切送信しません**。 - -## ホスト型のマルチ組織形態もエアギャップライセンスである [#the-hosted-multi-organization-shape-is-air-gap-licensed-too] - -**composed** 形態(公開済みアプリをこのデプロイメントのアプリとして起動し、分離の壁の背後で複数の組織が 1 つのデータベースを共有する)を実行する場合、そこでもエアギャップライセンスは任意ではありません。このモードはマーケットプレイスとクラウド接続のサーフェスを完全に拒否するため、オンラインライセンスに必要なバインディングがこのモードで行われることはありません。エアギャップライセンスと `off` が必須で、どちらも起動時に強制され、デプロイバンドル内に専用の環境テンプレートがあります。単一環境のテンプレートを手直ししてこの形態にしないでください。composed のテンプレートをコピーすれば、それが決めるすべての値が一緒についてきます。 - -## イメージをネットワーク内に持ち込む [#getting-the-image-inside-the-network] - -ObjectOS のランタイムイメージは、切断されたサイトからは到達できないプライベートレジストリにあるため、イメージは他の成果物と同じ方法で境界を越えます。 - -検証は、レジストリとツールがまだ使える接続側で行います。内部へ持ち込もうとしている正確なダイジェストについて、**署名**、**SBOM**、**ビルドの来歴**を確認します(コマンドはバンドルの README に記載されています)。あとは**ダイジェスト**に任せます。ダイジェストはコンテンツアドレスなので、ネットワーク内のコピーが同じダイジェストであることを確認すれば、それが検証したのと同じバイトであることの証明になります。デプロイメントがタグではなくダイジェストを固定するのもこのためです。境界の内側には、タグを再解決する相手がありません。 - -アップグレードも同じ方法で行います。新しいダイジェストを外部で検証し、内部に転送し、固定するダイジェストを変更して再起動します。以前のダイジェストは残しておいてください。エアギャップのネットワーク内では、それがロールバック先となる唯一のコピーかもしれません。 - -## 到達可能でなければならないもの [#what-still-has-to-be-reachable] - -エアギャップとは、*ObjectOS 自体が*必要とするトラフィックがないということです。ライセンスの検証も、マーケットプレイスも、更新の確認もありません。デプロイメントにネットワークがないという意味ではありません。境界の内側では、引き続き次のものが必要です。 - -- 設定されたデータベース(クラスター構成の場合は Redis も) -- インバウンドのイングレスまたはロードバランサー -- **あなたが**通信するよう設定したもの:アイデンティティプロバイダー、SMTP、オブジェクトストレージ、Webhook の送信先、AI プロバイダーのエンドポイント。ユーザーが OIDC でサインインする場合、そのアイデンティティプロバイダーにこのネットワークから到達できる必要があります。できない場合はローカルアカウントを使います。 - -ライセンス自体には有効期限があり、起動のたびにローカルで確認されます。外部への問い合わせはないため、更新はランタイムが取得するものではなく、納品として計画してください。 - -## 次へ [#next] - -- [Docker → Enterprise で追加されるもの](/docs/deploy/docker#enterprise-adds):検証、ライセンス、スケーリング、アップグレードの全体。 -- [アップグレード](/docs/operate/upgrade)と[バックアップ](/docs/operate/backup):上記の手順の詳細な手順書。 diff --git a/content/docs/deploy/air-gapped.mdx b/content/docs/deploy/air-gapped.mdx index 70f38274..fc07e290 100644 --- a/content/docs/deploy/air-gapped.mdx +++ b/content/docs/deploy/air-gapped.mdx @@ -106,7 +106,7 @@ Air-gapped means no traffic is required *by ObjectOS itself* — no license validation, no marketplace, no update ping. It does not mean the deployment has no network. Inside your perimeter it still needs: -- the database it is configured against (and Redis, when clustered); +- the database it is configured against; - your ingress or load balancer, inbound; - anything **you** configure it to talk to: an identity provider, SMTP, object storage, webhook targets, an AI provider endpoint. If your users sign in via diff --git a/content/docs/deploy/air-gapped.zh-Hans.mdx b/content/docs/deploy/air-gapped.zh-Hans.mdx deleted file mode 100644 index 50dd4294..00000000 --- a/content/docs/deploy/air-gapped.zh-Hans.mdx +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: 物理隔离部署 -seoTitle: "物理隔离部署:许可证模式和设置" -description: 物理隔离是一种许可证模式,而不是防火墙设置 —— 断网部署必须声明的两项设置,以及会在启动时被拒绝的组合。 -editions: [enterprise] -translation: - source_sha: d0fbf234ac1fc9be7bcdb652e29a259e133103a63533267bf3f065bdee48ce9b - guide_rev: 1 - mode: auto ---- - -## 物理隔离是一种许可证模式 [#air-gap-is-a-license-mode] - -拔掉网线并不能得到一个物理隔离的部署。普通的 ObjectOS 许可证是**在线**校验的: -运行时在控制平面上用你的许可证密钥换取一个短期授权,并定期重新检查。切断这条 -路径,许可证并不会"回落到离线"—— 它根本永远无法生效。 - -**物理隔离许可证是另一种许可证**,由我们有意离线签发。它在本地依据镜像中内嵌的 -公钥进行校验,并以**零网络流量**挂载你的授权。物理隔离运行是一项企业版能力 —— -参见[许可证与定价](/docs/editions/license) —— 你需要的许可证是申请来的,而不是 -配置出来的。 - -因此,一个断网部署要同时声明**两**件事: - -- 一个**物理隔离许可证**,以及 -- **没有控制平面**:云端姿态设置被显式设为 `off`(它的别名 `none`、`local` 和 - `disabled` 含义相同)。 - -## 不设置并不等于"不连云" [#leaving-the-setting-unset-is-not-no-cloud] - -这是本页上代价最高的错误,所以它有自己的一节: - -> **未设置的云端姿态会解析为公共控制平面。** - -未设置从来不是中立的。它选中的是联网行为 —— 这就是为什么一个"什么都没做"的部署 -最终会挂载一个市场代理,并暴露一个设备绑定路由,而这个站点的全部前提就是不与 -任何人通信。声明一个姿态会被接受;**不做决定则不行。**请显式写上 `off`。 - -## 受支持的组合 [#the-supported-combinations] - -这些组合在加载配置时、在任何与许可证相关的事情发生**之前**就会被检查。不受支持 -的组合不是警告,也不是降级:运行时会打印一条同时点名*两项*设置的致命错误,然后 -退出。 - -| 许可证 | 云端姿态 | 结果 | -|---|---|---| -| 物理隔离许可证 | `off` | **运行,完整授权,零网络流量。**这就是断网场景的答案。 | -| 无许可证 | `off` | 以 Community 行为运行。注意,多组织姿态仍然需要许可证。 | -| 普通(在线)许可证 | 可达的控制平面,且已完成设备绑定 | 正常的联网部署。 | -| 普通(在线)许可证 | `off` | **在启动时被拒绝。** | -| 普通(在线)许可证 | 未设置 | 被视为公共控制平面 —— 见上文。能否运行取决于那个控制平面是否真的可达且已绑定。 | - -### 为什么会拒绝 [#why-the-refusal-exists] - -在线许可证通过一次交换来校验,这次交换必须出示一个在部署绑定控制平面时签发的 -运行时令牌。没有控制平面就没有绑定,没有绑定令牌就不可能存在,于是交换永远不会 -发生 —— 这次启动不会,以后的启动也不会。宽限期也帮不上忙:宽限期从上一次*成功* -的校验开始计算,而第一次成功永远不会出现。 - -如果不加以强制,这种配置会在之后才失败,而且归咎于错误的东西:在多组织姿态下, -它最终会抱怨部署"需要许可证"—— 而许可证恰恰是唯一从未出错的东西。所以运行时会 -更早地拒绝,并说明是哪两项设置相互矛盾。由于拒绝发生在任何校验尝试之前,一次被 -拒绝的启动**不会发出任何数据包**。 - -## 托管的多组织形态也需要物理隔离许可证 [#the-hosted-multi-organization-shape-is-air-gap-licensed-too] - -如果你运行的是**组合**形态 —— 一个已发布的应用作为本部署的应用启动,多个组织 -在隔离墙后共享一个数据库 —— 那么物理隔离许可证在那里同样不是可选的。该模式直接 -拒绝市场和云连接界面,所以在线许可证所需的绑定在它上面永远不可能发生。它要求 -物理隔离许可证和 `off`,两者都在启动时强制执行,并且它在部署包中有自己的环境 -模板。不要改写单环境模板来达到它;复制组合形态的那个模板,这样它所决定的每一个 -值都会随之而来。 - -## 把镜像带进网络内部 [#getting-the-image-inside-the-network] - -ObjectOS 运行时镜像位于断网站点无法访问的私有镜像仓库中,所以镜像要像你的其他 -产物一样跨越边界。 - -在联网一侧完成校验,趁你还能访问镜像仓库和工具:针对你即将送入内网的确切摘要, -检查**签名**、**SBOM** 和**构建溯源**(部署包的 README 中有相关命令)。然后让 -**摘要**完成剩下的工作 —— 它是按内容寻址的,所以确认网络内部的副本具有相同的 -摘要,就证明了它与你校验过的是同一批字节。这也是部署固定摘要而不是标签的原因: -在边界之内,没有任何东西可以用来重新解析标签。 - -升级的方式相同:在外部校验新的摘要,把它传入内部,修改固定的摘要,然后重启。 -保留上一个摘要 —— 在物理隔离的网络中,它可能是你唯一能回滚到的副本。 - -## 哪些仍然必须可达 [#what-still-has-to-be-reachable] - -物理隔离的意思是 *ObjectOS 本身*不需要任何流量 —— 没有许可证校验,没有市场, -没有更新检查。它并不意味着部署没有网络。在你的边界之内,它仍然需要: - -- 它所配置的数据库(集群时还有 Redis); -- 你的入口或负载均衡器,用于入站流量; -- **你**配置它去通信的任何东西:身份提供商、SMTP、对象存储、webhook 目标、AI - 提供商端点。如果你的用户通过 OIDC 登录,那么这个身份提供商必须能从该网络访问, - 否则就改用本地账户。 - -许可证本身带有到期时间,在每次启动时本地检查 —— 没有回连,所以要把续期规划成 -一次交付,而不是指望运行时自己去获取。 - -## 下一步 [#next] - -- [Docker → 企业版额外提供](/docs/deploy/docker#enterprise-adds) —— 完整的校验、许可证、扩缩容和升级。 -- [升级](/docs/operate/upgrade)和[备份](/docs/operate/backup) —— 上述步骤所概括的操作流程。 diff --git a/content/docs/deploy/air-gapped.zh-Hant.mdx b/content/docs/deploy/air-gapped.zh-Hant.mdx deleted file mode 100644 index 1eefc3a2..00000000 --- a/content/docs/deploy/air-gapped.zh-Hant.mdx +++ /dev/null @@ -1,106 +0,0 @@ ---- -# @generated zh-Hant from zh-Hans -- do not edit. Edit the English source, then regenerate: pnpm --filter @objectos/docs gen:zh-hant -title: 物理隔離部署 -seoTitle: "物理隔離部署:許可證模式和設定" -description: 物理隔離是一種許可證模式,而不是防火牆設定 —— 斷網部署必須宣告的兩項設定,以及會在啟動時被拒絕的組合。 -editions: [enterprise] -translation: - source_sha: d0fbf234ac1fc9be7bcdb652e29a259e133103a63533267bf3f065bdee48ce9b - guide_rev: 1 - mode: auto ---- - -## 物理隔離是一種許可證模式 [#air-gap-is-a-license-mode] - -拔掉網線並不能得到一個物理隔離的部署。普通的 ObjectOS 許可證是**線上**校驗的: -執行時在控制平面上用你的許可證金鑰換取一個短期授權,並定期重新檢查。切斷這條 -路徑,許可證並不會"回落到離線"—— 它根本永遠無法生效。 - -**物理隔離許可證是另一種許可證**,由我們有意離線簽發。它在本地依據映象中內嵌的 -公鑰進行校驗,並以**零網路流量**掛載你的授權。物理隔離執行是一項企業版能力 —— -參見[許可證與定價](/docs/editions/license) —— 你需要的許可證是申請來的,而不是 -配置出來的。 - -因此,一個斷網部署要同時宣告**兩**件事: - -- 一個**物理隔離許可證**,以及 -- **沒有控制平面**:雲端姿態設定被顯式設為 `off`(它的別名 `none`、`local` 和 - `disabled` 含義相同)。 - -## 不設定並不等於"不連雲" [#leaving-the-setting-unset-is-not-no-cloud] - -這是本頁上代價最高的錯誤,所以它有自己的一節: - -> **未設定的雲端姿態會解析為公共控制平面。** - -未設定從來不是中立的。它選中的是聯網行為 —— 這就是為什麼一個"什麼都沒做"的部署 -最終會掛載一個市場代理,並暴露一個裝置繫結路由,而這個站點的全部前提就是不與 -任何人通訊。宣告一個姿態會被接受;**不做決定則不行。**請顯式寫上 `off`。 - -## 受支援的組合 [#the-supported-combinations] - -這些組合在載入配置時、在任何與許可證相關的事情發生**之前**就會被檢查。不受支援 -的組合不是警告,也不是降級:執行時會列印一條同時點名*兩項*設定的致命錯誤,然後 -退出。 - -| 許可證 | 雲端姿態 | 結果 | -|---|---|---| -| 物理隔離許可證 | `off` | **執行,完整授權,零網路流量。**這就是斷網場景的答案。 | -| 無許可證 | `off` | 以 Community 行為執行。注意,多組織姿態仍然需要許可證。 | -| 普通(線上)許可證 | 可達的控制平面,且已完成裝置繫結 | 正常的聯網部署。 | -| 普通(線上)許可證 | `off` | **在啟動時被拒絕。** | -| 普通(線上)許可證 | 未設定 | 被視為公共控制平面 —— 見上文。能否執行取決於那個控制平面是否真的可達且已繫結。 | - -### 為什麼會拒絕 [#why-the-refusal-exists] - -線上許可證通過一次交換來校驗,這次交換必須出示一個在部署繫結控制平面時簽發的 -執行時令牌。沒有控制平面就沒有繫結,沒有繫結令牌就不可能存在,於是交換永遠不會 -發生 —— 這次啟動不會,以後的啟動也不會。寬限期也幫不上忙:寬限期從上一次*成功* -的校驗開始計算,而第一次成功永遠不會出現。 - -如果不加以強制,這種配置會在之後才失敗,而且歸咎於錯誤的東西:在多組織姿態下, -它最終會抱怨部署"需要許可證"—— 而許可證恰恰是唯一從未出錯的東西。所以執行時會 -更早地拒絕,並說明是哪兩項設定相互矛盾。由於拒絕發生在任何校驗嘗試之前,一次被 -拒絕的啟動**不會發出任何資料包**。 - -## 託管的多組織形態也需要物理隔離許可證 [#the-hosted-multi-organization-shape-is-air-gap-licensed-too] - -如果你執行的是**組合**形態 —— 一個已釋出的應用作為本部署的應用啟動,多個組織 -在隔離牆後共享一個數據庫 —— 那麼物理隔離許可證在那裡同樣不是可選的。該模式直接 -拒絕市場和雲連線介面,所以線上許可證所需的繫結在它上面永遠不可能發生。它要求 -物理隔離許可證和 `off`,兩者都在啟動時強制執行,並且它在部署包中有自己的環境 -模板。不要改寫單環境模板來達到它;複製組合形態的那個模板,這樣它所決定的每一個 -值都會隨之而來。 - -## 把映象帶進網路內部 [#getting-the-image-inside-the-network] - -ObjectOS 執行時映象位於斷網站點無法訪問的私有映象倉庫中,所以映象要像你的其他 -產物一樣跨越邊界。 - -在聯網一側完成校驗,趁你還能訪問映象倉庫和工具:針對你即將送入內網的確切摘要, -檢查**簽名**、**SBOM** 和**構建溯源**(部署包的 README 中有相關命令)。然後讓 -**摘要**完成剩下的工作 —— 它是按內容定址的,所以確認網路內部的副本具有相同的 -摘要,就證明了它與你校驗過的是同一批位元組。這也是部署固定摘要而不是標籤的原因: -在邊界之內,沒有任何東西可以用來重新解析標籤。 - -升級的方式相同:在外部校驗新的摘要,把它傳入內部,修改固定的摘要,然後重啟。 -保留上一個摘要 —— 在物理隔離的網路中,它可能是你唯一能回滾到的副本。 - -## 哪些仍然必須可達 [#what-still-has-to-be-reachable] - -物理隔離的意思是 *ObjectOS 本身*不需要任何流量 —— 沒有許可證校驗,沒有市場, -沒有更新檢查。它並不意味著部署沒有網路。在你的邊界之內,它仍然需要: - -- 它所配置的資料庫(叢集時還有 Redis); -- 你的入口或負載均衡器,用於入站流量; -- **你**配置它去通訊的任何東西:身份提供商、SMTP、物件儲存、webhook 目標、AI - 提供商端點。如果你的使用者通過 OIDC 登入,那麼這個身份提供商必須能從該網路訪問, - 否則就改用本地賬戶。 - -許可證本身帶有到期時間,在每次啟動時本地檢查 —— 沒有回連,所以要把續期規劃成 -一次交付,而不是指望執行時自己去獲取。 - -## 下一步 [#next] - -- [Docker → 企業版額外提供](/docs/deploy/docker#enterprise-adds) —— 完整的校驗、許可證、擴縮容和升級。 -- [升級](/docs/operate/upgrade)和[備份](/docs/operate/backup) —— 上述步驟所概括的操作流程。 diff --git a/content/docs/deploy/kubernetes.ja.mdx b/content/docs/deploy/kubernetes.ja.mdx deleted file mode 100644 index 8bdfbf5c..00000000 --- a/content/docs/deploy/kubernetes.ja.mdx +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: Kubernetes -seoTitle: "Kubernetes:プローブ、シークレット、固定、マイグレーション" -description: Kubernetes で ObjectOS イメージを実行します。参照用の Deployment、正しいエンドポイントへの正しいプローブ、Secret からのシークレット、そしてマルチレプリカの Enterprise デプロイメントが維持すべきものを説明します。 -editions: [community, enterprise] -translation: - source_sha: 2270aa161805c5ab5a80c2c48562ac8ab6c54573019e3c7d17acc51587a2d6c0 - guide_rev: 1 - mode: auto ---- - -**Helm チャートや公式のマニフェスト一式はありません。** イメージは Kubernetes でもそのまま動作するため、このページでは最小限の参照例と、マニフェストが維持しなければならない性質を示します。それぞれ、ランタイムが依存するか強制するものです。[Docker](/docs/deploy/docker) の内容はすべて当てはまります。同じイメージ、同じ変数、同じアップグレードのルールです。 - -## 参照用の Deployment [#a-reference-deployment] - -Community イメージのレプリカ 1 つ、`Secret` からのシークレット、それぞれ専用のエンドポイントに向けたプローブ: - -```yaml title="deployment.yaml" -apiVersion: apps/v1 -kind: Deployment -metadata: - name: objectos -spec: - replicas: 1 - selector: - matchLabels: { app: objectos } - template: - metadata: - labels: { app: objectos } - spec: - containers: - - name: objectos - image: registry.example.com/crm:2.2.2 # your image FROM ghcr.io/objectstack-ai/objectstack:X.Y.Z - ports: - - containerPort: 8080 - envFrom: - - secretRef: - name: objectos-secrets # OS_DATABASE_URL, OS_AUTH_SECRET, OS_SECRET_KEY - livenessProbe: - httpGet: { path: /api/v1/health, port: 8080 } - periodSeconds: 30 - readinessProbe: - httpGet: { path: /api/v1/ready, port: 8080 } - initialDelaySeconds: 5 - periodSeconds: 10 ---- -apiVersion: v1 -kind: Service -metadata: - name: objectos -spec: - selector: { app: objectos } - ports: - - port: 80 - targetPort: 8080 -``` - -## 維持すべき性質 [#properties-to-preserve] - -### イメージが正確に固定されている [#the-image-is-pinned-exactly] - -イメージは `@sha256:` ダイジェストで参照し、読み取り元の正確なバージョンを横に書いておきます。移動するタグでは決して参照しないでください。オーケストレーターでは、単一ホストよりもこれが重要です。プルポリシーと移動するタグの組み合わせでは、「同じ」Deployment の 2 つの Pod が異なるビルドを実行することがあります。移動するタグはリリースのたびに動き、正確なバージョンタグもそのバージョンが再ビルドされれば動きます。[Docker → イメージを固定する](/docs/deploy/docker#pin-the-image)を参照してください。 - -### プローブが正しいエンドポイントに向いている [#probes-address-the-right-endpoints] - -`/api/v1/health` は liveness です。`/api/v1/ready` は readiness です。readiness は、ランタイムの起動中、シャットダウン中、そしてデータドライバーが応答しなくなったときに **503** を返します。そのため、ローリング再起動はきれいにドレインされ、データベースを失った Pod はエラーを返す代わりに Service のエンドポイントから外れます。 - -readiness を liveness プローブに使わないでください。そうしないと、データベースの障害ですべての Pod が一斉に再起動し(それではデータベースは戻りません)、設定の不具合はその不具合自体ではなく `CrashLoopBackOff` として現れます。データベースが戻れば Pod は自動的に回復します。readiness プローブが、不在の間は Pod をドレインし、その後に再び受け入れます。 - -### シークレットは Secret から [#secrets-come-from-a-secret] - -`OS_AUTH_SECRET` と `OS_SECRET_KEY` は `Secret` に入れ、一度だけ生成してすべての Pod にマウントします。Pod ごとに生成したり、イメージに焼き込んだりは決してしないでください。独自のシークレットキーを生成した Pod は、次の再スケジュールでそのキーを失い、それで暗号化されたすべてのシークレットも一緒に失います。 - -### 業務データはクラスターの外に置く [#business-data-lives-outside-the-cluster] - -デプロイメントはマネージド PostgreSQL に向けます。クラスター内の永続ボリュームは、業務データの置き場所として想定されていません。 - -### Community ではレプリカ 1 つ [#one-replica-on-community] - -Community の調整はプロセス内で行われるため、`replicas: 1` のままにします。それ以上を宣言すると(`OS_CLUSTER_REPLICAS` が 1 より大きい)、ライセンスなしでは起動が拒否されます。マルチレプリカは Enterprise の機能です(後述)。 - -### Ingress [#ingress] - -TLS はエッジで終端し、`OS_AUTH_URL` と `OS_TRUSTED_ORIGINS` を公開アドレスに設定します。クロスオリジンのフロントエンドは `OS_CORS_ORIGIN` に明示的に列挙し、ワイルドカードのオリジンと認証情報付きのリクエストを組み合わせないでください。ランタイムがプロキシの背後にある場合は、クライアントが指定した forwarded-for ヘッダーをプロキシが自身のもので置き換えるようにしてください。レート制限と監査証跡は、呼び出し元の識別情報が信頼できることに依存しています。 - -## Enterprise で追加されるもの [#enterprise-adds] - -**私たちが提供するのは Compose スタックであり、Helm チャートや Kubernetes マニフェストではありません。** リリースのデプロイバンドルが、サポートされテストされた構成です。Kubernetes ではマニフェストを自分で組み立てることになるため、そのスタックの次の性質も再現してください。オーケストレーターが何であれ、デプロイメントが受けられる権利は変わりません。 - -### イメージはダイジェストで固定する [#the-image-is-pinned-by-digest] - -Pod の spec では、Enterprise イメージを `@sha256:` ダイジェストで参照します。プルには、ライセンスされたレジストリの認証情報を持つプルシークレットが必要です。 - -### マイグレーションは、レプリカが提供を始める前に一度だけ、完了まで実行する [#migrations-run-once-to-completion-before-replicas-serve] - -Compose スタックは、アプリケーションのレプリカが起動する前に完了しなければならない 1 回限りのマイグレーションコンテナを実行します。Kubernetes ではこれは Job(または同等の提供前フック)であり、各レプリカの init コンテナではありません。要点は、スキーマ変更がレプリカごとに並行してではなく**一度だけ**実行されることです。イメージはまさにこのためにマイグレーションして終了するモードをサポートしており、その変数はバンドルに記載されています。 - -### すべてのレプリカに同一のシークレットを渡す [#every-replica-gets-identical-secrets] - -マルチレプリカは、レプリカ数を増やすだけの問題ではありません。 - -- Redis をバックエンドとする**クラスタードライバー**を有効にする必要があります。 -- **共有シークレットキー**が必須になります。クラスタードライバーがない場合、各レプリカは独自のキーを生成します。レプリカ間ではそれらが食い違うことになるため、食い違う代わりに**ランタイムは起動を拒否します**。1 つの値を、すべてのレプリカにマウントしてください。 -- **認証シークレット**も同様に、すべてのレプリカで同一でなければなりません。 - -### ライセンスとクラウドの姿勢はデプロイメント全体で共通 [#license-and-cloud-posture-are-deployment-wide] - -ライセンスキー、ライセンスモード、クラウドの姿勢の設定は、デプロイメントの識別情報の一部です。すべてのレプリカで同じでなければならず、サポートされる組み合わせは**起動時に**確認されます。設定が食い違う Pod は劣化した状態で動くのではなく、終了します。組み合わせについては[エアギャップ](/docs/deploy/air-gapped)を参照してください。 - -### ローリングアップグレードはダイジェストを変更する [#rolling-upgrades-change-the-digest] - -アップグレードとはイメージのダイジェストの変更であり、新しいレプリカが提供を始める前にマイグレーションの Job が完了まで実行されます。スキーマのマイグレーションは前にしか進みません。イメージをロールバックしてもスキーマはロールバックされないため、先にバックアップを取り、ロールバック先として以前のダイジェストを残しておいてください。アプリ自体は、公開済みアーティファクトとして提供される場合、イメージとは独立してバージョン管理されます。[デプロイ](/docs/deploy#three-run-shapes)の実行形態を参照してください。 diff --git a/content/docs/deploy/kubernetes.mdx b/content/docs/deploy/kubernetes.mdx index 274fa946..1f9e72f4 100644 --- a/content/docs/deploy/kubernetes.mdx +++ b/content/docs/deploy/kubernetes.mdx @@ -1,7 +1,7 @@ --- title: Kubernetes seoTitle: "Kubernetes: Probes, Secrets, Pinning, Migrations" -description: Run the ObjectOS image on Kubernetes — a reference Deployment, the right probe on the right endpoint, secrets from a Secret, and what multi-replica Enterprise deployments must preserve. +description: Run the ObjectOS image on Kubernetes — a reference Deployment, the right probe on the right endpoint, secrets from a Secret, and what must stay identical across replicas. editions: [community, enterprise] --- @@ -96,7 +96,8 @@ cluster are not the intended home for business data. Coordination on Community is in-process, so keep `replicas: 1`. Declaring more (`OS_CLUSTER_REPLICAS` above 1) refuses the boot without a license. -Multi-replica is an Enterprise capability — below. +Multi-node is an Enterprise license capability, and the Enterprise kit +runs a single replica today — below. ### Ingress @@ -131,14 +132,16 @@ variable. ### Every replica gets identical secrets -Multi-replica is not a matter of raising the replica count: +**Keep the Enterprise kit at one replica today.** It wires no cluster driver, +and declaring more than one (`OS_CLUSTER_REPLICAS` above 1) refuses the boot +by design: the in-process coordinator would not share locks, counters or +pub/sub between replicas. Multi-node is activated by license contract +(`maxNodes`) and is not a high-availability promise; contact sales if you need +it. Whatever the replica count: -- The **cluster driver** must be on, backed by Redis. -- A **shared secret key** becomes mandatory. Without a cluster driver each - replica mints its own; across replicas those would diverge, and rather than - diverge, **the runtime refuses to start**. One value, mounted into every - replica. -- The **auth secret** must likewise be identical across replicas. +- Use **one shared secret key** (`OS_SECRET_KEY`). Without it each replica would + mint its own, and those would diverge. +- The **auth secret** must likewise be identical wherever the runtime runs. ### License and cloud posture are deployment-wide diff --git a/content/docs/deploy/kubernetes.zh-Hans.mdx b/content/docs/deploy/kubernetes.zh-Hans.mdx deleted file mode 100644 index 7f60b83e..00000000 --- a/content/docs/deploy/kubernetes.zh-Hans.mdx +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: Kubernetes -seoTitle: "Kubernetes:探针、密钥、固定版本和迁移" -description: 在 Kubernetes 上运行 ObjectOS 镜像 —— 一个参考 Deployment、在正确端点上的正确探针、来自 Secret 的密钥,以及多副本企业版部署必须保持的属性。 -editions: [community, enterprise] -translation: - source_sha: 2270aa161805c5ab5a80c2c48562ac8ab6c54573019e3c7d17acc51587a2d6c0 - guide_rev: 1 - mode: auto ---- - -**没有 Helm chart,也没有官方清单集。**镜像在 Kubernetes 上无需修改即可运行, -所以本页给出一个最小参考,以及你的清单必须保持的属性 —— 每一项都是运行时所依赖 -或强制执行的东西。[Docker](/docs/deploy/docker) 上的一切都同样适用:同一个镜像、 -同样的变量、同样的升级规则。 - -## 参考 Deployment [#a-reference-deployment] - -Community 镜像的一个副本,密钥来自一个 `Secret`,每个探针各有自己的端点: - -```yaml title="deployment.yaml" -apiVersion: apps/v1 -kind: Deployment -metadata: - name: objectos -spec: - replicas: 1 - selector: - matchLabels: { app: objectos } - template: - metadata: - labels: { app: objectos } - spec: - containers: - - name: objectos - image: registry.example.com/crm:2.2.2 # your image FROM ghcr.io/objectstack-ai/objectstack:X.Y.Z - ports: - - containerPort: 8080 - envFrom: - - secretRef: - name: objectos-secrets # OS_DATABASE_URL, OS_AUTH_SECRET, OS_SECRET_KEY - livenessProbe: - httpGet: { path: /api/v1/health, port: 8080 } - periodSeconds: 30 - readinessProbe: - httpGet: { path: /api/v1/ready, port: 8080 } - initialDelaySeconds: 5 - periodSeconds: 10 ---- -apiVersion: v1 -kind: Service -metadata: - name: objectos -spec: - selector: { app: objectos } - ports: - - port: 80 - targetPort: 8080 -``` - -## 需要保持的属性 [#properties-to-preserve] - -### 镜像被精确固定 [#the-image-is-pinned-exactly] - -按 `@sha256:` 摘要引用镜像,并在旁边写上读取它时对应的确切版本,绝不使用滚动标签。 -在编排器上,这比在单台主机上更重要:拉取策略加上会移动的标签,意味着"同一个" -Deployment 的两个 Pod 可能运行不同的构建。滚动标签随每次发布而移动,确切的版本 -标签在该版本被重新构建时也会移动;参见[Docker → 固定镜像](/docs/deploy/docker#pin-the-image)。 - -### 探针指向正确的端点 [#probes-address-the-right-endpoints] - -`/api/v1/health` 是存活探针。`/api/v1/ready` 是就绪探针。在运行时启动期间、关闭 -期间,以及任何数据驱动停止响应时,就绪端点都会返回 **503** —— 这样滚动重启可以 -干净地排空,而失去数据库的 Pod 会离开 Service 的端点,而不是返回错误。 - -不要把就绪检查放到存活探针上。否则一次数据库故障会同时重启所有 Pod,而这并不能 -让数据库恢复,配置故障也会表现为 `CrashLoopBackOff`,而不是故障本身。数据库恢复 -后,Pod 会自行恢复:就绪探针在数据库不可用时把它们排空,之后再重新接纳它们。 - -### 密钥来自 Secret [#secrets-come-from-a-secret] - -`OS_AUTH_SECRET` 和 `OS_SECRET_KEY` 应放在一个 `Secret` 中,只生成一次,并由每个 -Pod 挂载 —— 绝不按 Pod 生成,绝不烘焙进镜像。一个自己生成加密密钥的 Pod 会在下次 -重新调度时丢失它,用它加密的所有密钥也随之丢失。 - -### 业务数据存放在集群之外 [#business-data-lives-outside-the-cluster] - -把部署指向一个托管的 PostgreSQL。集群内的持久卷并不是业务数据该待的地方。 - -### Community 上只用一个副本 [#one-replica-on-community] - -Community 上的协调是进程内的,所以保持 `replicas: 1`。声明更多副本 -(`OS_CLUSTER_REPLICAS` 大于 1)在没有许可证时会拒绝启动。多副本是一项企业版能力 -—— 见下文。 - -### 入口 [#ingress] - -在边缘终止 TLS,并把 `OS_AUTH_URL` 和 `OS_TRUSTED_ORIGINS` 设为公网地址。在 -`OS_CORS_ORIGIN` 中显式列出跨源前端;绝不把通配符源与携带凭据的请求一起使用。当 -运行时位于代理之后时,确保代理用它自己的 forwarded-for 头替换客户端提供的任何同类 -头 —— 速率限制和审计轨迹都依赖于调用者身份是可信的。 - -## 企业版额外提供 [#enterprise-adds] - -**我们提供的是 Compose 技术栈,而不是 Helm chart 或 Kubernetes 清单。**你的版本中 -附带的部署包才是受支持、经过测试的配置。在 Kubernetes 上,清单要你自己组装,所以 -也要重现该技术栈的这些属性。编排器不会改变部署有权获得的任何东西。 - -### 镜像按摘要固定 [#the-image-is-pinned-by-digest] - -在 Pod spec 中按 `@sha256:` 摘要引用企业版镜像。拉取镜像需要一个保存你的许可证 -镜像仓库凭据的拉取密钥。 - -### 迁移在副本提供服务之前运行一次,并运行到完成 [#migrations-run-once-to-completion-before-replicas-serve] - -Compose 技术栈运行一个一次性的迁移容器,它必须在任何应用副本启动之前完成。在 -Kubernetes 上,这是一个 Job(或等效的服务前钩子),而不是每个副本上的 init 容器 -—— 关键在于模式变更只运行**一次**,而不是每个副本并行各运行一次。镜像正是为此 -支持一种"迁移后退出"的模式;部署包中点名了对应的变量。 - -### 每个副本都使用完全相同的密钥 [#every-replica-gets-identical-secrets] - -多副本不只是调高副本数: - -- 必须开启**集群驱动**,并以 Redis 作为后端。 -- **共享的加密密钥**成为必需。没有集群驱动时,每个副本会自己生成一个;跨副本时 - 它们会互不相同,而**运行时会拒绝启动**,而不是让它们分叉。一个值,挂载到每个 - 副本中。 -- **认证密钥**同样必须在各副本之间完全相同。 - -### 许可证和云端姿态作用于整个部署 [#license-and-cloud-posture-are-deployment-wide] - -许可证密钥、许可证模式和云端姿态设置都是部署身份的一部分。它们在每个副本中都 -必须相同,其受支持的组合会**在启动时**检查 —— 不匹配的 Pod 不会降级运行,而是 -直接退出。组合参见[物理隔离](/docs/deploy/air-gapped)。 - -### 滚动升级就是更换摘要 [#rolling-upgrades-change-the-digest] - -升级就是更换镜像摘要,并让迁移 Job 在新副本提供服务之前运行到完成。模式迁移只能 -向前:回滚镜像并不会回滚模式,所以先做备份,并保留上一个摘要以便回滚。应用本身 -如果以已发布产物的形式交付,则独立于镜像进行版本管理 —— 参见 -[部署](/docs/deploy#three-run-shapes)中的运行形态。 diff --git a/content/docs/deploy/kubernetes.zh-Hant.mdx b/content/docs/deploy/kubernetes.zh-Hant.mdx deleted file mode 100644 index 8a7ea031..00000000 --- a/content/docs/deploy/kubernetes.zh-Hant.mdx +++ /dev/null @@ -1,143 +0,0 @@ ---- -# @generated zh-Hant from zh-Hans -- do not edit. Edit the English source, then regenerate: pnpm --filter @objectos/docs gen:zh-hant -title: Kubernetes -seoTitle: "Kubernetes:探針、金鑰、固定版本和遷移" -description: 在 Kubernetes 上執行 ObjectOS 映象 —— 一個參考 Deployment、在正確端點上的正確探針、來自 Secret 的金鑰,以及多副本企業版部署必須保持的屬性。 -editions: [community, enterprise] -translation: - source_sha: 2270aa161805c5ab5a80c2c48562ac8ab6c54573019e3c7d17acc51587a2d6c0 - guide_rev: 1 - mode: auto ---- - -**沒有 Helm chart,也沒有官方清單集。**映象在 Kubernetes 上無需修改即可執行, -所以本頁給出一個最小參考,以及你的清單必須保持的屬性 —— 每一項都是執行時所依賴 -或強制執行的東西。[Docker](/docs/deploy/docker) 上的一切都同樣適用:同一個映象、 -同樣的變數、同樣的升級規則。 - -## 參考 Deployment [#a-reference-deployment] - -Community 映象的一個副本,金鑰來自一個 `Secret`,每個探針各有自己的端點: - -```yaml title="deployment.yaml" -apiVersion: apps/v1 -kind: Deployment -metadata: - name: objectos -spec: - replicas: 1 - selector: - matchLabels: { app: objectos } - template: - metadata: - labels: { app: objectos } - spec: - containers: - - name: objectos - image: registry.example.com/crm:2.2.2 # your image FROM ghcr.io/objectstack-ai/objectstack:X.Y.Z - ports: - - containerPort: 8080 - envFrom: - - secretRef: - name: objectos-secrets # OS_DATABASE_URL, OS_AUTH_SECRET, OS_SECRET_KEY - livenessProbe: - httpGet: { path: /api/v1/health, port: 8080 } - periodSeconds: 30 - readinessProbe: - httpGet: { path: /api/v1/ready, port: 8080 } - initialDelaySeconds: 5 - periodSeconds: 10 ---- -apiVersion: v1 -kind: Service -metadata: - name: objectos -spec: - selector: { app: objectos } - ports: - - port: 80 - targetPort: 8080 -``` - -## 需要保持的屬性 [#properties-to-preserve] - -### 映象被精確固定 [#the-image-is-pinned-exactly] - -按 `@sha256:` 摘要引用映象,並在旁邊寫上讀取它時對應的確切版本,絕不使用滾動標籤。 -在編排器上,這比在單臺主機上更重要:拉取策略加上會移動的標籤,意味著"同一個" -Deployment 的兩個 Pod 可能執行不同的構建。滾動標籤隨每次釋出而移動,確切的版本 -標籤在該版本被重新構建時也會移動;參見[Docker → 固定映象](/docs/deploy/docker#pin-the-image)。 - -### 探針指向正確的端點 [#probes-address-the-right-endpoints] - -`/api/v1/health` 是存活探針。`/api/v1/ready` 是就緒探針。在執行時啟動期間、關閉 -期間,以及任何資料驅動停止響應時,就緒端點都會返回 **503** —— 這樣滾動重啟可以 -乾淨地排空,而失去資料庫的 Pod 會離開 Service 的端點,而不是返回錯誤。 - -不要把就緒檢查放到存活探針上。否則一次資料庫故障會同時重啟所有 Pod,而這並不能 -讓資料庫恢復,配置故障也會表現為 `CrashLoopBackOff`,而不是故障本身。資料庫恢復 -後,Pod 會自行恢復:就緒探針在資料庫不可用時把它們排空,之後再重新接納它們。 - -### 金鑰來自 Secret [#secrets-come-from-a-secret] - -`OS_AUTH_SECRET` 和 `OS_SECRET_KEY` 應放在一個 `Secret` 中,只生成一次,並由每個 -Pod 掛載 —— 絕不按 Pod 生成,絕不烘焙進映象。一個自己生成加密金鑰的 Pod 會在下次 -重新排程時丟失它,用它加密的所有金鑰也隨之丟失。 - -### 業務資料存放在叢集之外 [#business-data-lives-outside-the-cluster] - -把部署指向一個託管的 PostgreSQL。叢集內的持久卷並不是業務資料該待的地方。 - -### Community 上只用一個副本 [#one-replica-on-community] - -Community 上的協調是程序內的,所以保持 `replicas: 1`。宣告更多副本 -(`OS_CLUSTER_REPLICAS` 大於 1)在沒有許可證時會拒絕啟動。多副本是一項企業版能力 -—— 見下文。 - -### 入口 [#ingress] - -在邊緣終止 TLS,並把 `OS_AUTH_URL` 和 `OS_TRUSTED_ORIGINS` 設為公網地址。在 -`OS_CORS_ORIGIN` 中顯式列出跨源前端;絕不把萬用字元源與攜帶憑據的請求一起使用。當 -執行時位於代理之後時,確保代理用它自己的 forwarded-for 頭替換客戶端提供的任何同類 -頭 —— 速率限制和審計軌跡都依賴於呼叫者身份是可信的。 - -## 企業版額外提供 [#enterprise-adds] - -**我們提供的是 Compose 技術棧,而不是 Helm chart 或 Kubernetes 清單。**你的版本中 -附帶的部署包才是受支援、經過測試的配置。在 Kubernetes 上,清單要你自己組裝,所以 -也要重現該技術棧的這些屬性。編排器不會改變部署有權獲得的任何東西。 - -### 映象按摘要固定 [#the-image-is-pinned-by-digest] - -在 Pod spec 中按 `@sha256:` 摘要引用企業版映象。拉取映象需要一個儲存你的許可證 -映象倉庫憑據的拉取金鑰。 - -### 遷移在副本提供服務之前執行一次,並執行到完成 [#migrations-run-once-to-completion-before-replicas-serve] - -Compose 技術棧執行一個一次性的遷移容器,它必須在任何應用副本啟動之前完成。在 -Kubernetes 上,這是一個 Job(或等效的服務前鉤子),而不是每個副本上的 init 容器 -—— 關鍵在於模式變更只執行**一次**,而不是每個副本並行各執行一次。映象正是為此 -支援一種"遷移後退出"的模式;部署包中點名了對應的變數。 - -### 每個副本都使用完全相同的金鑰 [#every-replica-gets-identical-secrets] - -多副本不只是調高副本數: - -- 必須開啟**叢集驅動**,並以 Redis 作為後端。 -- **共享的加密金鑰**成為必需。沒有叢集驅動時,每個副本會自己生成一個;跨副本時 - 它們會互不相同,而**執行時會拒絕啟動**,而不是讓它們分叉。一個值,掛載到每個 - 副本中。 -- **認證金鑰**同樣必須在各副本之間完全相同。 - -### 許可證和雲端姿態作用於整個部署 [#license-and-cloud-posture-are-deployment-wide] - -許可證金鑰、許可證模式和雲端姿態設定都是部署身份的一部分。它們在每個副本中都 -必須相同,其受支援的組合會**在啟動時**檢查 —— 不匹配的 Pod 不會降級執行,而是 -直接退出。組合參見[物理隔離](/docs/deploy/air-gapped)。 - -### 滾動升級就是更換摘要 [#rolling-upgrades-change-the-digest] - -升級就是更換映象摘要,並讓遷移 Job 在新副本提供服務之前執行到完成。模式遷移只能 -向前:回滾映象並不會回滾模式,所以先做備份,並保留上一個摘要以便回滾。應用本身 -如果以已釋出產物的形式交付,則獨立於映象進行版本管理 —— 參見 -[部署](/docs/deploy#three-run-shapes)中的執行形態。 diff --git a/content/docs/editions/compare.ja.mdx b/content/docs/editions/compare.ja.mdx deleted file mode 100644 index ace497cf..00000000 --- a/content/docs/editions/compare.ja.mdx +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: エディションの比較 -seoTitle: "ObjectOS エディションの比較:Community、Free、Team、Enterprise" -description: ObjectOS の各エディションとプランに含まれるものを 1 行ずつ。Community、Cloud Free、Cloud Team、Enterprise、そして各違いがどこで強制されるか。 -editions: [community, cloud, enterprise] -translation: - source_sha: 9234b83013a276593829e0f00b4f2b20322c0d38e89f03b5b73aeb5439694fd5 - guide_rev: 1 - mode: auto ---- - -ObjectOS は 3 つのエディションを持つひとつの製品です。**ObjectOS Community** は自分で実行するオープンソースのランタイムです。**ObjectOS Cloud** は同じ製品をあなたのためにホストしたもので、**Free** と **Team** のプランがあります。**ObjectOS Enterprise** は契約で販売されるライセンス制の製品で、ホスト型サービス上、シングルノードの **Enterprise Single-Node** ライセンス、またはフルのプライベートデプロイとして提供されます。ObjectOS Cloud に Business プランはありません。料金と契約は[ライセンスと料金](/docs/editions/license)にあります。このページは、それぞれが何を違う形で行うかを説明します。 - -このドキュメントのすべてのページは、タイトルの下にエディションバッジの行を持ち、適用されるエディションを示します。サイドバーは、すべてのエディション向けではないページとグループに同じアイコンで印を付けます。 - -## 比較表 [#the-matrix] - -| | **Community** | **Cloud Free** | **Cloud Team** | **Enterprise** | -|---|---|---|---|---| -| 提供形態 | セルフマネージド | ホスト型 | ホスト型 | セルフマネージド | -| 料金 | 無料(Apache-2.0) | 無料 | $24 / AI シート / 月、または年払いで $20 / AI シート / 月 | 契約による | -| ファイルストレージ | 自前([ストレージ](/docs/configure/storage)) | 環境ごとに 1 GB | 環境ごとに 20 GB | 自前([ストレージ](/docs/configure/storage)) | -| 環境 | デプロイした数だけ | 組織ごとに 1 つ | 組織ごとに 1 つ | デプロイした数だけ | -| MCP リクエスト | デプロイで設定 | 20 / 分、1,000 / 日 | 120 / 分、1 日の上限なし | デプロイで設定 | -| カスタムドメイン | 自前のホスト | — | — | 自前のホスト | -| レコードレベルおよびフィールドレベルのセキュリティ | ✓ | ✓ | ✓ | ✓ | -| 承認ワークフロー | ✓ | — | ✓ | ✓ | -| スケジュールと相対時間のフロー | ✓ | — | ✓ | ✓ | -| UI 内の AI(AI Builder、「データに質問する」) | MCP のみ:モデルは持ち込み | お試し | ✓ | ✓ | -| AI ガバナンス(アクションの監査、ガードレール、権限のスコープ設定) | — | — | — | ✓ | -| 自社の ID プロバイダーによるシングルサインオン | ✓([認証](/docs/configure/authentication)) | — | — | ✓ | -| SCIM | — | — | — | ✓ | -| クラスタリング / 高可用性 | — | — | — | ✓ | -| ひとつのデプロイ上の複数の組織 | — | — | — | ✓ | -| エアギャップ運用 | — | — | — | ✓ | -| サポート | コミュニティ | コミュニティ | スタンダード | SLA + 専任 | - -ObjectOS Cloud では、自社のアイデンティティプロバイダーによるシングルサインオンと AI ガバナンスは、ホスト型サービス上の **Enterprise** 契約に含まれます。Enterprise Single-Node ライセンスは、製品内の AI、AI ガバナンス、シングルサインオンを 1 つのノードで提供し、フルのプライベートデプロイを必要とするもの(クラスタリング、複数の組織、SCIM、エアギャップ運用、階層セキュリティ)は含みません。セルフマネージドのデプロイでは、Community と Enterprise は同じランタイムを実行します。Community 列にあるものはすべて Enterprise 列にもあります。 - -## 各違いがどこで強制されるか [#where-each-difference-is-enforced] - -比較表には、製品が強制する違いだけを載せています。以下は、このドキュメントですでに詳しく説明しているものです。 - -- **ライセンスが、セルフマネージドのデプロイが何であるかを決めます。** ライセンスがない場合、単一組織のデプロイは Community の動作で実行されます。オープンな MCP サーバーで、AI は持ち込みです。ライセンスがある場合、AI Builder と「データに質問する」が自社のインフラストラクチャ上で利用可能になります。[AI サービス](/docs/configure/ai)を参照してください。 -- **ひとつのデプロイ上の複数の組織にはライセンスが必要です。** ライセンスなしのマルチ組織の体制は起動時に拒否され、ランタイムはトラフィックを処理しません。[ランタイム設定](/docs/configure/runtime)と[トラブルシューティング](/docs/operate/troubleshooting)を参照してください。 -- **エアギャップ運用はライセンスモードです。** 通常のライセンスはコントロールプレーンに対してオンラインで検証されます。エアギャップライセンスはローカルで検証され、デプロイはコントロールプレーンがないことも宣言しなければなりません。機能し得ない組み合わせは起動時に拒否されます。[エアギャップデプロイ](/docs/deploy/air-gapped)を参照してください。 -- **ObjectOS Cloud では、プランは環境ごとに強制されます。** 組織はどのプランでも 1 つの環境を持ちます。容量が満杯の環境は添付ファイルのアップロードと一括インポートを拒否しますが、単一レコードの書き込み、読み取り、エクスポートは決して拒否しません(`403 STORAGE_LIMIT_REACHED`、80% から警告)。MCP エンドポイントはプランのリクエスト上限を超えると `429` を返します。[環境](/docs/cloud/environments)と[ストレージと上限](/docs/cloud/storage-and-limits)を参照してください。 -- **ライセンスが失効してもランタイムは決して停止しません。** Enterprise Single-Node は有料機能をオフにし、データとランタイムは動作し続けます。フルの Enterprise デプロイは最後に支払ったバージョンを維持します。[ライセンスと料金](/docs/editions/license#faq)を参照してください。 - -## このページはどのエディション向けか [#which-edition-is-this-page-for] - -| バッジ | 意味 | -|---|---| -| Community | ObjectOS Community を自分で実行する場合に当てはまる | -| Cloud | ObjectOS Cloud の Free および Team プランで当てはまる | -| Enterprise | ライセンスを受けたセルフマネージドの ObjectOS Enterprise デプロイで当てはまる | - -デプロイと運用は、2 つのセルフマネージドのエディション、Community と Enterprise 向けです。ObjectOS Cloud では、私たちがデプロイを運用します。 - -## 次へ [#next] - -- [開始](/docs/start/cloud):3 つの入り口。Cloud、Community、Enterprise。 -- [ライセンスと料金](/docs/editions/license):料金、契約、オープンソースライセンス。 -- [パブリックプレビュー](/docs/editions/public-preview):ObjectOS Cloud の現在の段階が、データと連携にとって何を意味するか。 diff --git a/content/docs/editions/compare.mdx b/content/docs/editions/compare.mdx index 8b10bc06..7a16d712 100644 --- a/content/docs/editions/compare.mdx +++ b/content/docs/editions/compare.mdx @@ -35,7 +35,7 @@ are not for every edition with the same icons. | AI governance (action audit, guardrails, permission scoping) | — | — | — | ✓ | | Single sign-on with your identity provider | ✓ ([Authentication](/docs/configure/authentication)) | — | — | ✓ | | SCIM | — | — | — | ✓ | -| Clustering / high availability | — | — | — | ✓ | +| Multi-node topology (the Enterprise kit runs a single node today) | — | — | — | ✓ | | Several organizations on one deployment | — | — | — | ✓ | | Air-gapped operation | — | — | — | ✓ | | Support | Community | Community | Standard | SLA + dedicated | @@ -44,7 +44,7 @@ On ObjectOS Cloud, single sign-on with your identity provider and AI governance come with an **Enterprise** contract on the hosted service. The Enterprise Single-Node license carries the in-product AI, AI governance and single sign-on on one node, and leaves out what needs a full private -deployment: clustering, several organizations, SCIM, air-gapped operation and +deployment: multi-node topology, several organizations, SCIM, air-gapped operation and hierarchy security. On a self-managed deployment, Community and Enterprise run the same runtime: everything in the Community column is in the Enterprise column too. diff --git a/content/docs/editions/compare.zh-Hans.mdx b/content/docs/editions/compare.zh-Hans.mdx deleted file mode 100644 index 24b1211f..00000000 --- a/content/docs/editions/compare.zh-Hans.mdx +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: 版本对比 -seoTitle: "ObjectOS 版本对比:Community、Free、Team、Enterprise" -description: 逐行列出每个 ObjectOS 版本和套餐包含什么 —— Community、Cloud Free、Cloud Team 和 Enterprise —— 以及每项差异在哪里强制执行。 -editions: [community, cloud, enterprise] -translation: - source_sha: 9234b83013a276593829e0f00b4f2b20322c0d38e89f03b5b73aeb5439694fd5 - guide_rev: 1 - mode: auto ---- - -ObjectOS 是一个产品、三个版本。**ObjectOS Community** 是你自己运行的开源 -运行时。**ObjectOS Cloud** 是为你托管的同一个产品,有 **Free** 和 **Team** -两个套餐。**ObjectOS Enterprise** 是按合同售卖的许可产品:可以在托管服务上,可以是单节点的 -**Enterprise Single-Node** 许可证,也可以是完整的私有部署。ObjectOS Cloud 上 -没有 Business 套餐。价格与合同见 -[许可与定价](/docs/editions/license);本页讲的是每一个有什么不同。 - -这份文档中的每一页,标题下方都带有一排版本徽章,标明它适用于哪些版本。 -侧边栏用同样的图标标记那些并非适用于所有版本的页面和分组。 - -## 对照表 [#the-matrix] - -| | **Community** | **Cloud Free** | **Cloud Team** | **Enterprise** | -|---|---|---|---|---| -| 交付方式 | 自管理 | 托管 | 托管 | 自管理 | -| 价格 | 免费(Apache-2.0) | 免费 | 24 美元 / AI 席位 / 月,或按年付费 20 美元 / AI 席位 / 月 | 按合同 | -| 文件存储 | 你自己的([存储](/docs/configure/storage)) | 每个环境 1 GB | 每个环境 20 GB | 你自己的([存储](/docs/configure/storage)) | -| 环境 | 你部署多少就有多少 | 每个组织一个 | 每个组织一个 | 你部署多少就有多少 | -| MCP 请求 | 由你的部署设定 | 每分钟 20 次,每天 1,000 次 | 每分钟 120 次,无每日上限 | 由你的部署设定 | -| 自定义域名 | 你自己的主机 | — | — | 你自己的主机 | -| 记录级和字段级安全 | ✓ | ✓ | ✓ | ✓ | -| 审批工作流 | ✓ | — | ✓ | ✓ | -| 定时和相对时间流程 | ✓ | — | ✓ | ✓ | -| UI 内 AI(AI Builder、"问你的数据") | 仅 MCP —— 自带模型 | 体验版 | ✓ | ✓ | -| AI 治理(动作审计、护栏、权限范围限定) | — | — | — | ✓ | -| 与你的身份提供商单点登录 | ✓([身份认证](/docs/configure/authentication)) | — | — | ✓ | -| SCIM | — | — | — | ✓ | -| 集群 / 高可用 | — | — | — | ✓ | -| 单个部署承载多个组织 | — | — | — | ✓ | -| 物理隔离运行 | — | — | — | ✓ | -| 支持 | 社区 | 社区 | 标准 | SLA + 专属 | - -在 ObjectOS Cloud 上,与你的身份提供商的单点登录和 AI 治理随托管服务上的 -**Enterprise** 合同提供。Enterprise Single-Node 许可证在单个节点上提供产品内 -AI、AI 治理和单点登录,不包含需要完整私有部署的功能:集群、多个组织、SCIM、 -物理隔离运行和层级安全。在自管理部署上,Community -和 Enterprise 运行同一个运行时:Community 一列中的一切在 Enterprise 一列中 -也都有。 - -## 每项差异在哪里强制执行 [#where-each-difference-is-enforced] - -对照表只列出产品会强制执行的差异。下面这些是本文档已经详细描述过的: - -- **许可证决定一个自管理部署是什么。** 没有许可证时,单组织部署以 - Community 的行为运行 —— 开放的 MCP 服务器,自带 AI。有了许可证, - AI Builder 和"问你的数据"就会在你自己的基础设施上解锁。参见 - [AI 服务](/docs/configure/ai)。 -- **单个部署承载多个组织需要许可证。** 没有许可证的多组织姿态会在启动时 - 被拒绝,运行时不会提供服务。参见[运行时配置](/docs/configure/runtime) - 和[故障排查](/docs/operate/troubleshooting)。 -- **物理隔离运行是一种许可证模式。** 普通许可证会针对控制平面在线校验; - 物理隔离许可证在本地校验,并且部署还必须声明没有控制平面。无法工作的 - 组合会在启动时被拒绝。参见[物理隔离部署](/docs/deploy/air-gapped)。 -- **在 ObjectOS Cloud 上,套餐按环境强制执行。** 每个组织在每个套餐上 - 都有一个环境;存储已满的环境会拒绝附件上传和批量导入, - 但绝不拒绝单条记录的写入、读取或导出(`403 STORAGE_LIMIT_REACHED`,从 80% - 起发出警告);超过套餐的请求限额后,MCP 端点会返回 `429`。参见 - [环境](/docs/cloud/environments)和 - [存储与限制](/docs/cloud/storage-and-limits)。 -- **许可证过期绝不会让运行时停止。** Enterprise Single-Node 会关闭它的付费 - 功能,保持你的数据和运行时正常工作;完整的 Enterprise 部署会保留最后 - 一个已付费的版本。参见[许可与定价](/docs/editions/license#faq)。 - -## 这一页适用于哪个版本? [#which-edition-is-this-page-for] - -| 徽章 | 含义 | -|---|---| -| Community | 当你自己运行 ObjectOS Community 时成立 | -| Cloud | 在 ObjectOS Cloud 的 Free 和 Team 套餐上成立 | -| Enterprise | 在获得许可的、自管理的 ObjectOS Enterprise 部署上成立 | - -部署和运维适用于两个自管理版本,Community 和 Enterprise:在 ObjectOS -Cloud 上,部署由我们为你运行。 - -## 下一步 [#next] - -- [开始](/docs/start/cloud) —— 三种入门方式:Cloud、Community 或 Enterprise。 -- [许可与定价](/docs/editions/license) —— 价格、合同和开源许可证。 -- [公开预览](/docs/editions/public-preview) —— ObjectOS Cloud 当前阶段对你的数据和集成意味着什么。 diff --git a/content/docs/editions/compare.zh-Hant.mdx b/content/docs/editions/compare.zh-Hant.mdx deleted file mode 100644 index 61baf389..00000000 --- a/content/docs/editions/compare.zh-Hant.mdx +++ /dev/null @@ -1,91 +0,0 @@ ---- -# @generated zh-Hant from zh-Hans -- do not edit. Edit the English source, then regenerate: pnpm --filter @objectos/docs gen:zh-hant -title: 版本對比 -seoTitle: "ObjectOS 版本對比:Community、Free、Team、Enterprise" -description: 逐行列出每個 ObjectOS 版本和套餐包含什麼 —— Community、Cloud Free、Cloud Team 和 Enterprise —— 以及每項差異在哪裡強制執行。 -editions: [community, cloud, enterprise] -translation: - source_sha: 9234b83013a276593829e0f00b4f2b20322c0d38e89f03b5b73aeb5439694fd5 - guide_rev: 1 - mode: auto ---- - -ObjectOS 是一個產品、三個版本。**ObjectOS Community** 是你自己執行的開源 -執行時。**ObjectOS Cloud** 是為你託管的同一個產品,有 **Free** 和 **Team** -兩個套餐。**ObjectOS Enterprise** 是按合同售賣的許可產品:可以在託管服務上,可以是單節點的 -**Enterprise Single-Node** 許可證,也可以是完整的私有部署。ObjectOS Cloud 上 -沒有 Business 套餐。價格與合同見 -[許可與定價](/docs/editions/license);本頁講的是每一個有什麼不同。 - -這份文件中的每一頁,標題下方都帶有一排版本徽章,標明它適用於哪些版本。 -側邊欄用同樣的圖示標記那些並非適用於所有版本的頁面和分組。 - -## 對照表 [#the-matrix] - -| | **Community** | **Cloud Free** | **Cloud Team** | **Enterprise** | -|---|---|---|---|---| -| 交付方式 | 自管理 | 託管 | 託管 | 自管理 | -| 價格 | 免費(Apache-2.0) | 免費 | 24 美元 / AI 席位 / 月,或按年付費 20 美元 / AI 席位 / 月 | 按合同 | -| 檔案儲存 | 你自己的([儲存](/docs/configure/storage)) | 每個環境 1 GB | 每個環境 20 GB | 你自己的([儲存](/docs/configure/storage)) | -| 環境 | 你部署多少就有多少 | 每個組織一個 | 每個組織一個 | 你部署多少就有多少 | -| MCP 請求 | 由你的部署設定 | 每分鐘 20 次,每天 1,000 次 | 每分鐘 120 次,無每日上限 | 由你的部署設定 | -| 自定義域名 | 你自己的主機 | — | — | 你自己的主機 | -| 記錄級和欄位級安全 | ✓ | ✓ | ✓ | ✓ | -| 審批工作流 | ✓ | — | ✓ | ✓ | -| 定時和相對時間流程 | ✓ | — | ✓ | ✓ | -| UI 內 AI(AI Builder、"問你的資料") | 僅 MCP —— 自帶模型 | 體驗版 | ✓ | ✓ | -| AI 治理(動作審計、護欄、許可權範圍限定) | — | — | — | ✓ | -| 與你的身份提供商單點登入 | ✓([身份認證](/docs/configure/authentication)) | — | — | ✓ | -| SCIM | — | — | — | ✓ | -| 叢集 / 高可用 | — | — | — | ✓ | -| 單個部署承載多個組織 | — | — | — | ✓ | -| 物理隔離執行 | — | — | — | ✓ | -| 支援 | 社群 | 社群 | 標準 | SLA + 專屬 | - -在 ObjectOS Cloud 上,與你的身份提供商的單點登入和 AI 治理隨託管服務上的 -**Enterprise** 合同提供。Enterprise Single-Node 許可證在單個節點上提供產品內 -AI、AI 治理和單點登入,不包含需要完整私有部署的功能:叢集、多個組織、SCIM、 -物理隔離執行和層級安全。在自管理部署上,Community -和 Enterprise 運行同一個執行時:Community 一列中的一切在 Enterprise 一列中 -也都有。 - -## 每項差異在哪裡強制執行 [#where-each-difference-is-enforced] - -對照表只列出產品會強制執行的差異。下面這些是本文件已經詳細描述過的: - -- **許可證決定一個自管理部署是什麼。** 沒有許可證時,單組織部署以 - Community 的行為執行 —— 開放的 MCP 伺服器,自帶 AI。有了許可證, - AI Builder 和"問你的資料"就會在你自己的基礎設施上解鎖。參見 - [AI 服務](/docs/configure/ai)。 -- **單個部署承載多個組織需要許可證。** 沒有許可證的多組織姿態會在啟動時 - 被拒絕,執行時不會提供服務。參見[執行時配置](/docs/configure/runtime) - 和[故障排查](/docs/operate/troubleshooting)。 -- **物理隔離執行是一種許可證模式。** 普通許可證會針對控制平面線上校驗; - 物理隔離許可證在本地校驗,並且部署還必須宣告沒有控制平面。無法工作的 - 組合會在啟動時被拒絕。參見[物理隔離部署](/docs/deploy/air-gapped)。 -- **在 ObjectOS Cloud 上,套餐按環境強制執行。** 每個組織在每個套餐上 - 都有一個環境;儲存已滿的環境會拒絕附件上傳和批次匯入, - 但絕不拒絕單條記錄的寫入、讀取或匯出(`403 STORAGE_LIMIT_REACHED`,從 80% - 起發出警告);超過套餐的請求限額後,MCP 端點會返回 `429`。參見 - [環境](/docs/cloud/environments)和 - [儲存與限制](/docs/cloud/storage-and-limits)。 -- **許可證過期絕不會讓執行時停止。** Enterprise Single-Node 會關閉它的付費 - 功能,保持你的資料和執行時正常工作;完整的 Enterprise 部署會保留最後 - 一個已付費的版本。參見[許可與定價](/docs/editions/license#faq)。 - -## 這一頁適用於哪個版本? [#which-edition-is-this-page-for] - -| 徽章 | 含義 | -|---|---| -| Community | 當你自己執行 ObjectOS Community 時成立 | -| Cloud | 在 ObjectOS Cloud 的 Free 和 Team 套餐上成立 | -| Enterprise | 在獲得許可的、自管理的 ObjectOS Enterprise 部署上成立 | - -部署和運維適用於兩個自管理版本,Community 和 Enterprise:在 ObjectOS -Cloud 上,部署由我們為你執行。 - -## 下一步 [#next] - -- [開始](/docs/start/cloud) —— 三種入門方式:Cloud、Community 或 Enterprise。 -- [許可與定價](/docs/editions/license) —— 價格、合同和開源許可證。 -- [公開預覽](/docs/editions/public-preview) —— ObjectOS Cloud 當前階段對你的資料和整合意味著什麼。