Docs

自託管快速上手

用 Docker Compose 啟動 Multica,完成登入,並連線第一臺執行電腦。

自託管 Multica 分成兩部分:

部分執行什麼放在哪裡
Multica 服務Web、API 和 PostgreSQL一臺安裝了 Docker 的機器
執行電腦Multica 守護程序和 AI 程式設計工具開發者實際工作的電腦

它們可以是同一臺機器,也可以分開。自託管替換的只是 Multica Cloud 部分。

這篇文件使用 Docker Compose。Kubernetes 部署見倉庫中的 Self-hosting guide。

開始前

執行 Multica 服務的機器需要:

  • Docker Engine 或 Docker Desktop,並且 docker compose 可以執行
  • Git、Make、curl 和 OpenSSL
  • 本機的 3000、8080 埠未被佔用

先確認 Docker 和 Compose 可用:

docker info
docker compose version

Multica 使用 Compose v2,也就是 docker compose。舊版的 docker-compose v1 不受支援。

執行電腦還需要至少一款已經安裝並登入的 AI 程式設計工具,例如 Claude Code、Codex 或 Cursor。第 5 步再安裝 Multica CLI。

啟動 Multica

在準備執行服務的機器上執行:

git clone --depth 1 https://github.com/multica-ai/multica.git
cd multica
make selfhost

之後再次執行 make selfhost 會繼續使用現有的 .env 和資料卷,不會重新生成金鑰。

make selfhost 拉取已釋出的映象,不會編譯當前 checkout 中的程式碼。需要測試本地原始碼時,使用 make selfhost-build。

已釋出的映象跟隨最新的 release tag,而直接 git clone 檢出的是 main,通常領先於發版。如果你要在這個 checkout 上構建任何東西(CLI,或透過 make selfhost-build 構建映象),先切換到與映象對應的 release tag,讓構建產物和執行中的容器保持同一版本:

git fetch --tags --depth 1
git checkout $(git tag -l 'v*' --sort=-v:refname | head -1)

確認服務已經就緒

檢視容器狀態:

docker compose -f docker-compose.selfhost.yml ps

postgres 顯示為 healthy,backend 和 frontend 應處於執行狀態。然後檢查 backend、資料庫和 migration:

curl -fsS http://localhost:8080/readyz

正常響應是:

{"status":"ok","checks":{"db":"ok","migrations":"ok"}}

Backend 容器每次啟動時都會先執行資料庫 migration,再啟動服務,不需要手動執行 migration 命令。

選擇訪問方式

直接開啟 http://localhost:3000。後面執行 multica setup self-host 時也不需要傳 URL。

登入並建立工作區

開啟本機的 http://localhost:3000,或剛才配置的 https://app.example.com,輸入信箱獲取驗證碼。

預設沒有配置郵件服務。請求驗證碼後,可以從 backend 日誌中讀取:

docker compose -f docker-compose.selfhost.yml logs backend \
  | grep "Verification code"

日誌中會出現類似內容:

[DEV] Verification code for you@example.com: 123456

輸入驗證碼並建立第一個工作區。配置 Resend 或 SMTP 後,驗證碼透過郵件傳送,成員無需讀取容器日誌,具體見登入與註冊配置。

自託管部署預設使用 APP_ENV=production,不會啟用固定驗證碼。不要在公網例項上設定 MULTICA_DEV_VERIFICATION_CODE。

連線執行電腦

下面的命令在執行 AI 程式設計工具的電腦上執行,不一定是執行 Docker 的伺服器。

每次執行都擁有守護程序所屬使用者的全部權限,該使用者能讀寫的一切,執行都能讀寫。請用專用 Unix 使用者、容器或虛擬機器來執行守護程序,而不是你的個人帳號。詳見安全模型。

先安裝 Multica CLI:

curl -fsSL https://raw.githubusercontent.com/multica-ai/multica/main/scripts/install.sh | bash

然後讓 CLI 連線你的服務。按 Multica 服務所在的位置選擇:

multica setup self-host

服務在另一臺機器上時,傳入的是剛才配置的兩個地址。這條命令會先檢查 <server-url>/health,再開啟瀏覽器完成登入。登入完成後,它會儲存本機憑據並啟動守護程序。這一步報 Server not reachable,說明 /health 沒有透過探測拿到 200,可能的原因有三種:代理把所有流量轉給了不轉發該路徑的舊版 frontend;代理根本沒把 /health 路由到 backend;更底層的問題(DNS、TLS、防火牆、超時、backend 返回 5xx)。見故障排查。

確認連線狀態:

multica daemon status

正常情況下,輸出中會顯示:

  • Daemon: running
  • Agents 中包含本機已安裝的 AI 程式設計工具
  • Workspaces 大於 0

完成第一次執行

回到 Multica。執行時列表中出現線上的執行時後,建立一個 AI 代理,並把第一個任務分配給它。

執行日誌變為"已完成"、時間線中出現 AI 代理的回覆,說明自託管服務、執行電腦和 AI 程式設計工具已經連通。詳細步驟見快速上手第 3-5 步。

常用管理命令

以下命令都在 multica 倉庫目錄中執行:

# 檢視狀態
docker compose -f docker-compose.selfhost.yml ps

# 檢視 backend 日誌
docker compose -f docker-compose.selfhost.yml logs -f backend

# 應用 .env 變化
docker compose -f docker-compose.selfhost.yml up -d

# 停止服務,保留資料卷
docker compose -f docker-compose.selfhost.yml down

docker compose down 會保留 pgdata 和 backend_uploads。加上 -v 會刪除這些資料卷,包括資料庫;除非確定要清空例項,否則不要執行 docker compose down -v。

升級

確認沒有釘死映象 tag

兩個映象都寫成 ${MULTICA_IMAGE_TAG:-latest}(docker-compose.selfhost.yml:services.backend.image、services.frontend.image),而 .env.example 裡預設是 MULTICA_IMAGE_TAG=latest。

grep MULTICA_IMAGE_TAG .env
# MULTICA_IMAGE_TAG=v0.4.5   ← 釘死了:先改成 latest(或你想要的版本)

如果你在 .env 裡釘死了 MULTICA_IMAGE_TAG,下面的升級命令都升不上去。 pull 只是把同一個 tag 重拉一遍,版本原地不動,不報錯,也沒有任何警告。

備份 Postgres

migration 只往前走、不回滾,所以正式環境升級前先導一份:

docker compose -f docker-compose.selfhost.yml exec -T postgres \
  pg_dump -U multica multica > multica-backup.sql && gzip multica-backup.sql

如果你改過 POSTGRES_USER / POSTGRES_DB,把 multica 換成 .env 裡的實際值。資料存在名為 multica_pgdata 的 volume 裡,docker compose down 不會刪它,但 down -v 會。

不要把 pg_dump 直接管道接給 gzip。 shell 取的是管道里最後一條命令的退出碼,所以 pg_dump ... | gzip > backup.sql.gz 在匯出失敗時照樣返回 0,留下一個格式完全合法、但裡面什麼都沒有的 20 位元組壓縮包。先重定向到檔案,pg_dump 自己的退出碼才算數,&& 也只會壓縮真正成功的那份匯出。

拉取新映象並重建容器

在已有部署上,下面兩種寫法結果相同:Makefile 裡的 selfhost target 跑的就是同一套 docker compose pull + up -d,只是額外多做了兩件事,.env 缺失時生成一份,以及等 /health 就緒後列印一段狀態彙總。用哪個都行:

cd multica
git pull --ff-only
make selfhost

和第 2 步一樣,backend 容器啟動時會在對外提供服務之前先跑 ./migrate up(docker/entrypoint.sh)。沒有單獨的升級命令,把新映象起起來,本身就是升級這一步。想看過程:

docker compose -f docker-compose.selfhost.yml logs -f backend

需要回填歷史資料的 migration(如 103)也會自動完成回填。自動回填極少數情況下失敗,報 refusing to drop legacy daily rollups,處理見故障排查。

用 /readyz 驗證,不要用 /health

curl -s localhost:8080/readyz
# {"status":"ok","checks":{"db":"ok","migrations":"ok"}}

只要不是 HTTP 200 且兩項都是 ok,就說明新版本沒把 migration 跑完,先去看 backend 日誌,別急著放流量進來。

/health 是 liveness 探針,只要程序還活著就返回 {"status":"ok"},migration 失敗了它照樣是 ok。/readyz(server/cmd/server/router.go 中註冊的 readyHandler,/healthz 是它的別名)會檢查資料庫和已應用的 migration 集合,升級出問題能被它攔下來。

常見問題

現象先檢查什麼
/readyz 沒有返回 ok執行 docker compose -f docker-compose.selfhost.yml logs backend postgres。
收不到驗證碼請求一次驗證碼,再從 backend 日誌中查詢 Verification code。
setup self-host 提示 server 不可達在執行電腦上請求 https://api.example.com/health,確認 DNS、TLS 和反向代理都可達。返回 404 說明代理把 /health 轉給了不轉發該路徑的舊版 frontend,改為直通 backend(見故障排查)。
守護程序沒有列出 Agents確認 AI 程式設計工具在 PATH 中並已登入,然後執行 multica daemon restart。
任務一直排隊執行 multica daemon status,確認守護程序正在執行並連線了工作區。

更多情況見故障排查。

接下來

本頁目錄