diff --git a/docs/cn/usage/docker.md b/docs/cn/usage/docker.md index 040e2bae..a170ae5f 100644 --- a/docs/cn/usage/docker.md +++ b/docs/cn/usage/docker.md @@ -12,6 +12,50 @@ ghcr.io/chatlab/chatlab-cli ## 快速开始 +### 与 Desktop / 本地 CLI 共用数据(推荐) + +ChatLab 的 Desktop、CLI 和 Docker 都可以使用宿主机的 `~/.chatlab`。本机运行 Docker 时,建议直接挂载这个目录: + +macOS / Linux: + +```bash +mkdir -p "$HOME/.chatlab" "$HOME/Downloads" + +docker run --name chatlab \ + -p 127.0.0.1:3110:3110 \ + --user "$(id -u):$(id -g)" \ + --mount type=bind,source="$HOME/.chatlab",target=/home/node/.chatlab \ + --mount type=bind,source="$HOME/Downloads",target=/home/node/Downloads \ + -e HOME=/home/node \ + -e CHATLAB_DATA_DIR=/home/node/.chatlab/data \ + ghcr.io/chatlab/chatlab-cli:latest +``` + +Windows PowerShell: + +```powershell +New-Item -ItemType Directory -Force "$HOME/.chatlab" | Out-Null + +docker run --name chatlab ` + -p 127.0.0.1:3110:3110 ` + --mount "type=bind,source=$HOME/.chatlab,target=/home/node/.chatlab" ` + -e CHATLAB_DATA_DIR=/home/node/.chatlab/data ` + ghcr.io/chatlab/chatlab-cli:latest +``` + +容器启动后,打开 。 + +镜像默认使用非特权 `node` 用户(UID/GID 1000)运行。在 macOS 和 Linux 上,`--user` 会让容器进程使用宿主机当前用户的 UID/GID,`HOME` 则确保 ChatLab 的系统目录仍是 `/home/node/.chatlab`。对于当前用户 UID/GID 不是 1000 的 Linux 主机,这两个参数是必需的。宿主机的 `~/.chatlab` 对应容器内的 `/home/node/.chatlab`,`~/Downloads` 对应容器内可写的下载目录;`CHATLAB_DATA_DIR` 将默认用户数据固定到容器可访问的 `/home/node/.chatlab/data`,避免宿主机 `config.toml` 中的绝对路径在容器内失效。 + +使用这组命令后,两种切换都不需要复制数据: + +- 先使用 Docker,之后安装 Desktop 或本地 CLI:Desktop / CLI 会继续读取宿主机 `~/.chatlab`。 +- 已经使用 Desktop 或本地 CLI,之后启动 Docker:Docker 会直接读取原有的配置、聊天数据库和 AI 数据。 + +### 使用独立 Docker 数据 + +在服务器上部署,或者明确不想与宿主机上的 ChatLab 共用数据时,可以使用 Docker named volume: + ```bash docker run --name chatlab \ -p 127.0.0.1:3110:3110 \ @@ -19,9 +63,27 @@ docker run --name chatlab \ ghcr.io/chatlab/chatlab-cli:latest ``` -容器启动后,打开 。 +该数据卷会保留容器内的系统状态和用户数据,但 Desktop 和宿主机 CLI **不会**自动看到其中的数据。替换或升级容器时,请保留 `chatlab-data` 数据卷。 -镜像使用非特权 `node` 用户运行。该数据卷会保留 `/home/node/.chatlab` 下的系统状态和用户数据。替换或升级容器时,请保留该数据卷。 +### 自定义用户数据目录 + +如果 Desktop / CLI 已将聊天数据库移动到 `~/.chatlab` 之外,还需要挂载该目录,并让环境变量指向对应的容器路径: + +```bash +docker run --name chatlab \ + -p 127.0.0.1:3110:3110 \ + --user "$(id -u):$(id -g)" \ + --mount type=bind,source="$HOME/.chatlab",target=/home/node/.chatlab \ + --mount type=bind,source="$HOME/Downloads",target=/home/node/Downloads \ + --mount type=bind,source="/absolute/path/to/chatlab-data",target=/chatlab-data \ + -e HOME=/home/node \ + -e CHATLAB_DATA_DIR=/chatlab-data \ + ghcr.io/chatlab/chatlab-cli:latest +``` + +请将 `/absolute/path/to/chatlab-data` 替换为宿主机上的真实用户数据目录。系统数据仍通过 `~/.chatlab` 挂载。由于 `CHATLAB_DATA_DIR` 的优先级最高,Docker 的数据目录应通过挂载和环境变量调整,而不是在存储管理页面中切换。 + +同一版本的 Desktop、CLI 和 Docker 可以共享数据库。切换数据目录、执行迁移或跨版本使用前,建议先停止其他 ChatLab 实例;如果旧版本无法安全读取已经升级的数据目录,ChatLab 会通过兼容门禁拒绝启动。 ## 服务选项 @@ -48,7 +110,11 @@ Docker 参数会替换完整的默认命令。添加服务选项时,需要按 ```bash docker run --rm \ -p 127.0.0.1:8080:8080 \ - -v chatlab-data:/home/node/.chatlab \ + --user "$(id -u):$(id -g)" \ + --mount type=bind,source="$HOME/.chatlab",target=/home/node/.chatlab \ + --mount type=bind,source="$HOME/Downloads",target=/home/node/Downloads \ + -e HOME=/home/node \ + -e CHATLAB_DATA_DIR=/home/node/.chatlab/data \ ghcr.io/chatlab/chatlab-cli:latest \ start --port 8080 --host 0.0.0.0 --headless --no-open ``` @@ -58,8 +124,13 @@ docker run --rm \ ```bash docker run --rm ghcr.io/chatlab/chatlab-cli:latest --version docker run --rm ghcr.io/chatlab/chatlab-cli:latest formats -docker run --rm -v chatlab-data:/home/node/.chatlab \ - ghcr.io/chatlab/chatlab-cli:latest sessions --format json +docker run --rm \ + --user "$(id -u):$(id -g)" \ + --mount type=bind,source="$HOME/.chatlab",target=/home/node/.chatlab \ + --mount type=bind,source="$HOME/Downloads",target=/home/node/Downloads \ + -e HOME=/home/node \ + -e CHATLAB_DATA_DIR=/home/node/.chatlab/data \ + ghcr.io/chatlab/chatlab-cli:latest sessions list --format json ``` ## 环境变量 @@ -98,15 +169,32 @@ Bearer Token、无界面模式、Web UI 认证和浏览器打开行为通过对 ## Docker Compose +先在 Compose 文件旁创建未跟踪的 `.env`: + +```dotenv +CHATLAB_HOST_DIR=/absolute/path/to/.chatlab +CHATLAB_DOWNLOADS_DIR=/absolute/path/to/Downloads +CHATLAB_UID=1000 +CHATLAB_GID=1000 +CHATLAB_TOKEN=replace-with-a-secret-token +``` + +将 `CHATLAB_HOST_DIR` 替换为宿主机的 `~/.chatlab` 绝对路径,并将 `CHATLAB_DOWNLOADS_DIR` 设置为一个已存在且可写的导出和截图目录,例如宿主机的 `~/Downloads`。在 macOS 和 Linux 上,还需要将 `CHATLAB_UID`、`CHATLAB_GID` 分别替换为 `id -u`、`id -g` 的输出;Windows Docker Desktop 可以保留 `1000`。 + ```yaml services: chatlab: image: ghcr.io/chatlab/chatlab-cli:latest restart: unless-stopped + user: "${CHATLAB_UID:-1000}:${CHATLAB_GID:-1000}" ports: - "127.0.0.1:3110:3110" + environment: + HOME: /home/node + CHATLAB_DATA_DIR: /home/node/.chatlab/data volumes: - - chatlab-data:/home/node/.chatlab + - "${CHATLAB_HOST_DIR:?set CHATLAB_HOST_DIR in the Compose environment}:/home/node/.chatlab" + - "${CHATLAB_DOWNLOADS_DIR:?set CHATLAB_DOWNLOADS_DIR in the Compose environment}:/home/node/Downloads" command: - start - --port @@ -117,12 +205,9 @@ services: - ${CHATLAB_TOKEN:?set CHATLAB_TOKEN in the Compose environment} - --require-auth - --no-open - -volumes: - chatlab-data: ``` -`CHATLAB_TOKEN` 由 Docker Compose 插值后作为 `--token` 的值传给 ChatLab,并不是 ChatLab 环境变量。请将其保存在密钥存储或未跟踪的 `.env` 文件中。 +`CHATLAB_TOKEN` 由 Docker Compose 插值后作为 `--token` 的值传给 ChatLab,并不是 ChatLab 环境变量。请将其保存在密钥存储或未跟踪的 `.env` 文件中。如果需要完全独立的服务器数据,请改用上文“使用独立 Docker 数据”中的 named volume。 ## 多架构镜像 diff --git a/docs/en/usage/docker.md b/docs/en/usage/docker.md index 3751995c..7d0b7f6f 100644 --- a/docs/en/usage/docker.md +++ b/docs/en/usage/docker.md @@ -13,6 +13,58 @@ ghcr.io/chatlab/chatlab-cli ## Quick start +### Share data with Desktop and a local CLI (recommended) + +ChatLab Desktop, CLI, and Docker can all use the host's `~/.chatlab` directory. When running Docker locally, bind mount that directory directly: + +macOS / Linux: + +```bash +mkdir -p "$HOME/.chatlab" "$HOME/Downloads" + +docker run --name chatlab \ + -p 127.0.0.1:3110:3110 \ + --user "$(id -u):$(id -g)" \ + --mount type=bind,source="$HOME/.chatlab",target=/home/node/.chatlab \ + --mount type=bind,source="$HOME/Downloads",target=/home/node/Downloads \ + -e HOME=/home/node \ + -e CHATLAB_DATA_DIR=/home/node/.chatlab/data \ + ghcr.io/chatlab/chatlab-cli:latest +``` + +Windows PowerShell: + +```powershell +New-Item -ItemType Directory -Force "$HOME/.chatlab" | Out-Null + +docker run --name chatlab ` + -p 127.0.0.1:3110:3110 ` + --mount "type=bind,source=$HOME/.chatlab,target=/home/node/.chatlab" ` + -e CHATLAB_DATA_DIR=/home/node/.chatlab/data ` + ghcr.io/chatlab/chatlab-cli:latest +``` + +Open after the container starts. + +The image normally runs as the unprivileged `node` user (UID/GID 1000). On +macOS and Linux, `--user` matches the container process to the owner of the bind +mount, while `HOME` keeps ChatLab's system directory at `/home/node/.chatlab`. +This is required on Linux hosts whose user UID/GID is not 1000. The host's +`~/.chatlab` maps to `/home/node/.chatlab`, and the host's `~/Downloads` maps +to the container's writable Downloads directory. +`CHATLAB_DATA_DIR` pins the default user data to the container-accessible +`/home/node/.chatlab/data`, so absolute paths from the host's `config.toml` do +not break inside the container. + +With this setup, neither direction requires copying data: + +- Start with Docker, then install Desktop or the local CLI: Desktop and CLI continue to read the host's `~/.chatlab`. +- Start with Desktop or the local CLI, then run Docker: Docker reads the existing configuration, chat databases, and AI data. + +### Use Docker-only data + +For a server deployment, or when you explicitly want data isolated from ChatLab on the host, use a Docker named volume: + ```bash docker run --name chatlab \ -p 127.0.0.1:3110:3110 \ @@ -20,11 +72,27 @@ docker run --name chatlab \ ghcr.io/chatlab/chatlab-cli:latest ``` -Open after the container starts. +This volume preserves system state and user data inside Docker, but Desktop and the host CLI do **not** see that data automatically. Keep the `chatlab-data` volume when replacing or upgrading the container. -The image runs as the unprivileged `node` user. The volume preserves system -state and user data under `/home/node/.chatlab`. Keep it when replacing or -upgrading the container. +### Use a custom user data directory + +If Desktop or CLI stores chat databases outside `~/.chatlab`, mount that directory separately and point the environment variable at its container path: + +```bash +docker run --name chatlab \ + -p 127.0.0.1:3110:3110 \ + --user "$(id -u):$(id -g)" \ + --mount type=bind,source="$HOME/.chatlab",target=/home/node/.chatlab \ + --mount type=bind,source="$HOME/Downloads",target=/home/node/Downloads \ + --mount type=bind,source="/absolute/path/to/chatlab-data",target=/chatlab-data \ + -e HOME=/home/node \ + -e CHATLAB_DATA_DIR=/chatlab-data \ + ghcr.io/chatlab/chatlab-cli:latest +``` + +Replace `/absolute/path/to/chatlab-data` with the actual user data directory on the host. System data remains shared through the `~/.chatlab` mount. Because `CHATLAB_DATA_DIR` has the highest priority, change Docker's data directory through its mount and environment variable rather than the Storage settings page. + +Desktop, CLI, and Docker on the same version can share the database. Before changing the data directory, running a migration, or switching between different versions, stop the other ChatLab instances first. If an older version cannot safely read an upgraded data directory, ChatLab's compatibility gate blocks startup. ## Server options @@ -52,7 +120,11 @@ Docker arguments replace the complete default command. Repeat `start`, ```bash docker run --rm \ -p 127.0.0.1:8080:8080 \ - -v chatlab-data:/home/node/.chatlab \ + --user "$(id -u):$(id -g)" \ + --mount type=bind,source="$HOME/.chatlab",target=/home/node/.chatlab \ + --mount type=bind,source="$HOME/Downloads",target=/home/node/Downloads \ + -e HOME=/home/node \ + -e CHATLAB_DATA_DIR=/home/node/.chatlab/data \ ghcr.io/chatlab/chatlab-cli:latest \ start --port 8080 --host 0.0.0.0 --headless --no-open ``` @@ -62,8 +134,13 @@ Other CLI commands can be selected directly: ```bash docker run --rm ghcr.io/chatlab/chatlab-cli:latest --version docker run --rm ghcr.io/chatlab/chatlab-cli:latest formats -docker run --rm -v chatlab-data:/home/node/.chatlab \ - ghcr.io/chatlab/chatlab-cli:latest sessions --format json +docker run --rm \ + --user "$(id -u):$(id -g)" \ + --mount type=bind,source="$HOME/.chatlab",target=/home/node/.chatlab \ + --mount type=bind,source="$HOME/Downloads",target=/home/node/Downloads \ + -e HOME=/home/node \ + -e CHATLAB_DATA_DIR=/home/node/.chatlab/data \ + ghcr.io/chatlab/chatlab-cli:latest sessions list --format json ``` ## Environment variables @@ -105,15 +182,36 @@ provide environment-variable aliases for those options. ## Docker Compose +First, create an untracked `.env` next to the Compose file: + +```dotenv +CHATLAB_HOST_DIR=/absolute/path/to/.chatlab +CHATLAB_DOWNLOADS_DIR=/absolute/path/to/Downloads +CHATLAB_UID=1000 +CHATLAB_GID=1000 +CHATLAB_TOKEN=replace-with-a-secret-token +``` + +Replace `CHATLAB_HOST_DIR` with the absolute path to the host's `~/.chatlab`. +Set `CHATLAB_DOWNLOADS_DIR` to an existing writable directory for exports and +screenshots, such as the host's `~/Downloads`. +On macOS and Linux, replace `CHATLAB_UID` and `CHATLAB_GID` with the output of +`id -u` and `id -g`. Windows Docker Desktop users can keep `1000`. + ```yaml services: chatlab: image: ghcr.io/chatlab/chatlab-cli:latest restart: unless-stopped + user: "${CHATLAB_UID:-1000}:${CHATLAB_GID:-1000}" ports: - "127.0.0.1:3110:3110" + environment: + HOME: /home/node + CHATLAB_DATA_DIR: /home/node/.chatlab/data volumes: - - chatlab-data:/home/node/.chatlab + - "${CHATLAB_HOST_DIR:?set CHATLAB_HOST_DIR in the Compose environment}:/home/node/.chatlab" + - "${CHATLAB_DOWNLOADS_DIR:?set CHATLAB_DOWNLOADS_DIR in the Compose environment}:/home/node/Downloads" command: - start - --port @@ -124,14 +222,12 @@ services: - ${CHATLAB_TOKEN:?set CHATLAB_TOKEN in the Compose environment} - --require-auth - --no-open - -volumes: - chatlab-data: ``` `CHATLAB_TOKEN` is interpolated by Docker Compose and passed to ChatLab as the value of `--token`; it is not a ChatLab environment variable. Keep it in a -secret store or an untracked `.env` file. +secret store or an untracked `.env` file. If you need completely isolated +server data, use the named volume from "Use Docker-only data" above instead. ## Multi-architecture images diff --git a/docs/tw/usage/docker.md b/docs/tw/usage/docker.md index 0e30bee0..7b792248 100644 --- a/docs/tw/usage/docker.md +++ b/docs/tw/usage/docker.md @@ -12,6 +12,50 @@ ghcr.io/chatlab/chatlab-cli ## 快速開始 +### 與 Desktop / 本機 CLI 共用資料(建議) + +ChatLab Desktop、CLI 和 Docker 都可以使用主機的 `~/.chatlab`。在本機執行 Docker 時,建議直接掛載此目錄: + +macOS / Linux: + +```bash +mkdir -p "$HOME/.chatlab" "$HOME/Downloads" + +docker run --name chatlab \ + -p 127.0.0.1:3110:3110 \ + --user "$(id -u):$(id -g)" \ + --mount type=bind,source="$HOME/.chatlab",target=/home/node/.chatlab \ + --mount type=bind,source="$HOME/Downloads",target=/home/node/Downloads \ + -e HOME=/home/node \ + -e CHATLAB_DATA_DIR=/home/node/.chatlab/data \ + ghcr.io/chatlab/chatlab-cli:latest +``` + +Windows PowerShell: + +```powershell +New-Item -ItemType Directory -Force "$HOME/.chatlab" | Out-Null + +docker run --name chatlab ` + -p 127.0.0.1:3110:3110 ` + --mount "type=bind,source=$HOME/.chatlab,target=/home/node/.chatlab" ` + -e CHATLAB_DATA_DIR=/home/node/.chatlab/data ` + ghcr.io/chatlab/chatlab-cli:latest +``` + +容器啟動後,開啟 。 + +映像預設使用非特權 `node` 使用者(UID/GID 1000)執行。在 macOS 和 Linux 上,`--user` 會讓容器程序使用主機目前使用者的 UID/GID,`HOME` 則確保 ChatLab 的系統目錄仍是 `/home/node/.chatlab`。對於目前使用者 UID/GID 不是 1000 的 Linux 主機,這兩個參數是必要的。主機的 `~/.chatlab` 對應容器內的 `/home/node/.chatlab`,`~/Downloads` 對應容器內可寫的下載目錄;`CHATLAB_DATA_DIR` 將預設使用者資料固定到容器可存取的 `/home/node/.chatlab/data`,避免主機 `config.toml` 中的絕對路徑在容器內失效。 + +使用這組指令後,兩種切換都不需要複製資料: + +- 先使用 Docker,之後安裝 Desktop 或本機 CLI:Desktop / CLI 會繼續讀取主機的 `~/.chatlab`。 +- 已經使用 Desktop 或本機 CLI,之後啟動 Docker:Docker 會直接讀取原有的設定、聊天資料庫和 AI 資料。 + +### 使用獨立 Docker 資料 + +在伺服器上部署,或明確不想與主機上的 ChatLab 共用資料時,可以使用 Docker named volume: + ```bash docker run --name chatlab \ -p 127.0.0.1:3110:3110 \ @@ -19,9 +63,27 @@ docker run --name chatlab \ ghcr.io/chatlab/chatlab-cli:latest ``` -容器啟動後,開啟 。 +此資料卷會保留容器內的系統狀態與使用者資料,但 Desktop 和主機 CLI **不會**自動看到其中的資料。替換或升級容器時,請保留 `chatlab-data` 資料卷。 -映像使用非特權 `node` 使用者執行。此資料卷會保留 `/home/node/.chatlab` 下的系統狀態與使用者資料。替換或升級容器時,請保留此資料卷。 +### 自訂使用者資料目錄 + +如果 Desktop / CLI 已將聊天資料庫移到 `~/.chatlab` 以外,還需要另外掛載該目錄,並讓環境變數指向對應的容器路徑: + +```bash +docker run --name chatlab \ + -p 127.0.0.1:3110:3110 \ + --user "$(id -u):$(id -g)" \ + --mount type=bind,source="$HOME/.chatlab",target=/home/node/.chatlab \ + --mount type=bind,source="$HOME/Downloads",target=/home/node/Downloads \ + --mount type=bind,source="/absolute/path/to/chatlab-data",target=/chatlab-data \ + -e HOME=/home/node \ + -e CHATLAB_DATA_DIR=/chatlab-data \ + ghcr.io/chatlab/chatlab-cli:latest +``` + +請將 `/absolute/path/to/chatlab-data` 替換為主機上的真實使用者資料目錄。系統資料仍透過 `~/.chatlab` 掛載。由於 `CHATLAB_DATA_DIR` 的優先順序最高,Docker 的資料目錄應透過掛載和環境變數調整,而不是在儲存管理頁面中切換。 + +相同版本的 Desktop、CLI 和 Docker 可以共用資料庫。切換資料目錄、執行遷移或跨版本使用前,建議先停止其他 ChatLab 執行個體;如果舊版本無法安全讀取已經升級的資料目錄,ChatLab 會透過相容性閘門拒絕啟動。 ## 服務選項 @@ -48,7 +110,11 @@ Docker 參數會替換完整的預設命令。加入服務選項時,需要視 ```bash docker run --rm \ -p 127.0.0.1:8080:8080 \ - -v chatlab-data:/home/node/.chatlab \ + --user "$(id -u):$(id -g)" \ + --mount type=bind,source="$HOME/.chatlab",target=/home/node/.chatlab \ + --mount type=bind,source="$HOME/Downloads",target=/home/node/Downloads \ + -e HOME=/home/node \ + -e CHATLAB_DATA_DIR=/home/node/.chatlab/data \ ghcr.io/chatlab/chatlab-cli:latest \ start --port 8080 --host 0.0.0.0 --headless --no-open ``` @@ -58,8 +124,13 @@ docker run --rm \ ```bash docker run --rm ghcr.io/chatlab/chatlab-cli:latest --version docker run --rm ghcr.io/chatlab/chatlab-cli:latest formats -docker run --rm -v chatlab-data:/home/node/.chatlab \ - ghcr.io/chatlab/chatlab-cli:latest sessions --format json +docker run --rm \ + --user "$(id -u):$(id -g)" \ + --mount type=bind,source="$HOME/.chatlab",target=/home/node/.chatlab \ + --mount type=bind,source="$HOME/Downloads",target=/home/node/Downloads \ + -e HOME=/home/node \ + -e CHATLAB_DATA_DIR=/home/node/.chatlab/data \ + ghcr.io/chatlab/chatlab-cli:latest sessions list --format json ``` ## 環境變數 @@ -98,15 +169,32 @@ Bearer Token、無介面模式、Web UI 驗證與瀏覽器開啟行為透過對 ## Docker Compose +先在 Compose 檔案旁建立未追蹤的 `.env`: + +```dotenv +CHATLAB_HOST_DIR=/absolute/path/to/.chatlab +CHATLAB_DOWNLOADS_DIR=/absolute/path/to/Downloads +CHATLAB_UID=1000 +CHATLAB_GID=1000 +CHATLAB_TOKEN=replace-with-a-secret-token +``` + +將 `CHATLAB_HOST_DIR` 替換為主機 `~/.chatlab` 的絕對路徑,並將 `CHATLAB_DOWNLOADS_DIR` 設定為已存在且可寫入的匯出與截圖目錄,例如主機的 `~/Downloads`。在 macOS 和 Linux 上,還需要將 `CHATLAB_UID`、`CHATLAB_GID` 分別替換為 `id -u`、`id -g` 的輸出;Windows Docker Desktop 可以保留 `1000`。 + ```yaml services: chatlab: image: ghcr.io/chatlab/chatlab-cli:latest restart: unless-stopped + user: "${CHATLAB_UID:-1000}:${CHATLAB_GID:-1000}" ports: - "127.0.0.1:3110:3110" + environment: + HOME: /home/node + CHATLAB_DATA_DIR: /home/node/.chatlab/data volumes: - - chatlab-data:/home/node/.chatlab + - "${CHATLAB_HOST_DIR:?set CHATLAB_HOST_DIR in the Compose environment}:/home/node/.chatlab" + - "${CHATLAB_DOWNLOADS_DIR:?set CHATLAB_DOWNLOADS_DIR in the Compose environment}:/home/node/Downloads" command: - start - --port @@ -117,12 +205,9 @@ services: - ${CHATLAB_TOKEN:?set CHATLAB_TOKEN in the Compose environment} - --require-auth - --no-open - -volumes: - chatlab-data: ``` -`CHATLAB_TOKEN` 由 Docker Compose 插值後作為 `--token` 的值傳給 ChatLab,並不是 ChatLab 環境變數。請將它儲存在密鑰儲存或未追蹤的 `.env` 檔案中。 +`CHATLAB_TOKEN` 由 Docker Compose 插值後作為 `--token` 的值傳給 ChatLab,並不是 ChatLab 環境變數。請將它儲存在密鑰儲存或未追蹤的 `.env` 檔案中。如果需要完全獨立的伺服器資料,請改用上文「使用獨立 Docker 資料」中的 named volume。 ## 多架構映像