Critto 通常會在你的 Critto 帳號中執行。如果你想把所有內容留在自己擁有的電腦上,可以自行執行 Critto 伺服器:你的 critto、它們的記憶和你的聊天都會留在那台電腦上,Critto 桌面版和手機 App 會連線到該伺服器。

本指南適用於 Linux。你需要:

  • 一台會持續開機的 64 位元 Linux 電腦(Intel/AMD 或 ARM,例如 Raspberry Pi 4/5):家用伺服器、迷你電腦或小型雲端伺服器;
  • 約 1 GB 可用記憶體和幾 GB 磁碟空間;
  • 管理員權限(sudo)。

NixOS 可使用 NixOS 模組的 flake。Debian、Ubuntu、Fedora、RHEL 系統和 openSUSE 有正式套件並支援自動更新。其他系統則可使用容器映像或靜態版本。


NixOS

將 Critto flake 加入你的系統 flake:

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    critto.url = "https://downloads.critto.app/nix/critto.tar.gz";
    critto.inputs.nixpkgs.follows = "nixpkgs";
  };

  outputs = { nixpkgs, critto, ... }: {
    nixosConfigurations.myserver = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";            # or aarch64-linux
      modules = [
        ./configuration.nix
        critto.nixosModules.default
        ({ pkgs, ... }: {
          services.critto = {
            enable = true;
            # Secrets (Boat key, backup key) stay out of the Nix store:
            environmentFile = "/etc/critto/secrets.env";
            # AI apps for your subscriptions (you sign in from the app):
            aiPackages = [ pkgs.codex pkgs.nodejs_22 ];
            # publicUrl = "https://critto.example.com";
          };
        })
      ];
    };
  };
}

接著執行 sudo nixos-rebuild switch --flake .#myserver,並用 sudo crittod pair 配對你的 App(見步驟 2)。

  • **更新:**執行 nix flake update critto,再重新建置。套件是經簽署的預先建置版本(靜態執行檔,因此不會有 glibc 問題)。測試版通道請使用 services.critto.package = critto.packages.${system}.crittod-beta;。
  • **金鑰:**將 BOAT_API_KEY=… 和 CRITTO_BACKUP_KEY=… 放進 environmentFile(由 root 擁有,權限模式 600;也可使用 agenix 和 sops-nix)。服務啟動時會讀取,絕不會複製到 store。
  • 設定:listen(預設 127.0.0.1:8787)、publicUrl、webHost、openFirewall(預設關閉)、dataDir(預設 /var/lib/critto),以及其他任何 CRITTO_* 變數的 settings。den.backend 可選擇小窩的執行位置(boat、local 或 none;見選用:小窩)。
  • AI App:aiPackages 優先使用 nixpkgs 套件(例如 pkgs.codex、需要 allowUnfree 的 pkgs.claude-code)。nixpkgs 沒有的套件,請設定 programs.nix-ld.enable = true; 並執行 sudo crittod setup ai(見步驟 3)。Pi 只需要將 pkgs.nodejs_22 加到 aiPackages,然後執行 sudo crittod setup ai pi。
  • **遠端存取:**設定 services.tailscale.enable = true;,再執行 sudo tailscale serve --bg 8787;或透過 services.cloudflared 設定將流量導向 http://127.0.0.1:8787 的 ingress 規則(見步驟 5)。
  • systemd 會隔離此服務,但仍保留使用者命名空間(bubblewrap 和本機小窩需要),因此不要設定 security.allowUserNamespaces = false。

本指南其餘內容也適用於 NixOS;差別是更新要執行 nix flake update,而不是 apt 或 dnf。


1. 安裝

在伺服器上開啟終端機並執行:

curl -fsSL https://downloads.critto.app/install-server.sh | sh

這會加入 Critto 套件儲存庫、安裝 critto-server 套件、啟動伺服器並顯示配對碼。就這麼簡單:接著前往配對你的 App。

想比其他人更早取得新版本嗎?使用測試版通道: curl -fsSL https://downloads.critto.app/install-server.sh | CRITTO_CHANNEL=beta sh

先檢查安裝程式(選用)

指令碼使用 Critto 發行金鑰簽署。執行前可先驗證:

curl -fsSLO https://downloads.critto.app/install-server.sh
curl -fsSLO https://downloads.critto.app/install-server.sh.minisig
minisign -Vm install-server.sh -P RWTRac/2j5M3cvVpvtz0flaOy7sH5PFSc4LwbB7PxG0OMO2h8APoZtLG
sh install-server.sh

(大多數發行版的套件中都有 minisign。)另有一般校驗碼 install-server.sh.sha256。套件本身也經過簽署;每次安裝和更新時,套件管理員都會檢查簽章。

或自行設定儲存庫

Debian / Ubuntu:

sudo install -d -m 755 /etc/apt/keyrings
sudo curl -fsSLo /etc/apt/keyrings/critto.gpg https://downloads.critto.app/keys/critto-archive-keyring.gpg
cat <<EOF | sudo tee /etc/apt/sources.list.d/critto.sources
Types: deb
URIs: https://downloads.critto.app/apt
Suites: stable
Components: main
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/critto.gpg
EOF
sudo apt update && sudo apt install critto-server

Fedora / RHEL / Rocky / Alma:

sudo rpm --import https://downloads.critto.app/keys/critto-archive-keyring.asc
cat <<EOF | sudo tee /etc/yum.repos.d/critto.repo
[critto]
name=Critto
baseurl=https://downloads.critto.app/rpm/stable
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://downloads.critto.app/keys/critto-archive-keyring.asc
EOF
sudo dnf install critto-server

金鑰指紋是 C78E FB7F 67CC 8184 1F70 EE3D D121 DC94 C534 50E3(「Critto Packages packages@critto.app」)。

或使用 Docker / Podman

docker run -d --name critto --restart unless-stopped \
  -p 127.0.0.1:8787:8787 \
  -v critto-data:/var/lib/critto -v critto-keys:/etc/critto -v critto-ai:/opt/critto-ai \
  ghcr.io/nexferra-ltd/critto-server:latest
docker exec critto crittod pair

容器不需要特殊權限。資料放在 critto-data volume,保險庫主金鑰放在獨立的 critto-keys volume,避免其中一份副本單獨解開另一份資料(見「備份」);AI App 放在 critto-ai。也可以將 Docker secret 掛載到 /etc/critto/vault.key。更新時執行 docker pull ghcr.io/nexferra-ltd/critto-server:latest,再使用相同的 volume 重新建立容器。

或使用靜態版本

每個版本也提供可在任何 Linux 上執行的單一檔案版本:https://downloads.critto.app/releases/<version>/critto-server-<version>-linux-x86_64.tar.gz(或 -aarch64)。解壓縮後執行 ./crittod serve。你必須自行讓它持續執行並保持更新,因此套件會比較方便。


2. 配對你的 App

伺服器只允許已配對的裝置連線。配對方式如下:

  1. 在伺服器上取得代碼(有效 10 分鐘,且只能使用一次):

    sudo crittod pair
    
  2. 在 Critto App 的登入畫面選擇 使用我自己的 Critto 伺服器。輸入伺服器位址和代碼。

    • 如果就在伺服器上使用:http://127.0.0.1:8787
    • 其他裝置需要能連到的位址;請見從其他裝置連線。

一台裝置配對後,就可以用它配對更多裝置:選擇「設定 → 裝置 → 配對手機」即可顯示 QR Code。QR Code 會帶入伺服器的監聽位址;如果裝置透過其他方式連線(通道、Proxy、網域),請將 CRITTO_PUBLIC_URL 設為該位址(見設定)。

**在同一台電腦上使用桌面 App?**桌面 App 通常會自行啟動一個私有的 Critto 伺服器。如果你已在這裡安裝伺服器,請改選 使用我自己的 Critto 伺服器,並輸入 http://127.0.0.1:8787,這樣兩邊就會使用相同的 critto。


3. 連結你的 AI

critto 會用你選擇的 AI 思考。你可以透過兩種方式連結 AI。

你的 AI 訂閱(ChatGPT、Claude、Grok…)

Critto 透過官方命令列 App 連線。你只需要在伺服器上安裝一次:

sudo crittod setup ai

選擇你使用的服務,也可以直接輸入名稱: sudo crittod setup ai codex claude。

App 搭配使用
codex ChatGPT 方案(Plus、Pro、Business…)
claude Claude 方案(Pro、Max…)
grok SuperGrok / X Premium
muse Meta AI(需要 Node.js 20+;安裝程式可行時會一併安裝)
antigravity Google Antigravity。**請先閱讀顯示的警告:**Google 條款指出其他軟體不應使用 Antigravity 登入資訊,Google 也曾因此停用帳號。

這些 App 會安裝在 /opt/critto-ai,不會自行更新。請不時執行 sudo crittod setup ai --update 進行更新。

接著在 Critto App 中開啟「連結」,並登入各項服務。登入資訊會儲存在伺服器上,而不是 App 裡。

自訂 AI:本機模型和 API 金鑰

開啟「設定 → 進階模式」,再選擇「設定 → 自訂 AI → 新增連結」。任何支援「OpenAI 相容」API 的服務都能使用。從「從範本開始」選擇預設項目,或自行填入位址:

服務 基礎網址 API 金鑰
伺服器上的 Ollama http://localhost:11434/v1 無
伺服器上的 LM Studio http://localhost:1234/v1 無
家中另一台電腦上的 Ollama http://192.168.1.20:11434/v1 無
OpenRouter https://openrouter.ai/api/v1 你的 OpenRouter 金鑰

選擇「測試連線」,挑選模型並儲存。之後就能為任何 critto 選用這個 AI。

若要讓另一台電腦上的 Ollama 接受網路連線,請以 OLLAMA_HOST=0.0.0.0 啟動。「localhost」永遠表示 Critto 伺服器所在的電腦。


4. 小窩(選用)

小窩是 critto 在雲端的專屬電腦,可用來處理較大的工作(建立內容、瀏覽網頁、使用 App)。自行架設的伺服器會透過你自己的 Boat 帳號執行小窩。請在 App 的「連結」中貼上 Boat API 金鑰,或將金鑰放進設定檔 BOAT_API_KEY 並重新啟動。

請注意:

  • 小窩要運作,伺服器不必能從網際網路連入。伺服器會連到小窩,而不是反過來。
  • 小窩工作需要可連上公開網際網路的 AI(你的訂閱或 OpenRouter 等服務)。在自家網路執行的 AI(Ollama、LM Studio)可以聊天,但雲端小窩無法連到它。
  • 小窩時數會由 Boat 向你的帳號收費。

在自己的電腦上執行自己的小窩

沒有 Boat 帳號嗎?伺服器也可以在這台電腦上,為每個人以小型虛擬機器執行小窩(需要 /dev/kvm、每個執行中的小窩約 4 GB 記憶體,並且需要建置一次映像檔)。NixOS 設定方式:

services.critto.den.backend = "local";

其他系統請在 /etc/critto/critto.env 設定 CRITTO_DEN_BACKEND=local。完整指南(需求、容量、小窩可連線的項目、如何建置映像檔)請見在自己的電腦上執行自己的小窩。


5. 從其他裝置連線

伺服器安裝完成時只會監聽自己的電腦(127.0.0.1:8787),這是安全的預設設定。如果你想從任何地方使用手機或筆電,請選擇以下其中一種方式。前兩種可提供安全的 https:// 位址,不必在路由器上開啟連接埠。

Tailscale(個人使用最簡單)

在伺服器和你的裝置上安裝 Tailscale,登入同一個帳號,接著在伺服器上執行:

sudo tailscale serve --bg 8787

它會顯示類似 https://myserver.tail1234.ts.net 的位址。在 App 中使用該位址。只有你自己的裝置能連線。

Cloudflare Tunnel(使用自己網域的公開位址)

如果你在 Cloudflare 上有網域,請安裝 cloudflared,然後執行:

cloudflared tunnel login
cloudflared tunnel create critto
cloudflared tunnel route dns critto critto.example.com
cat > ~/.cloudflared/config.yml <<EOF
tunnel: critto
credentials-file: $HOME/.cloudflared/$(cloudflared tunnel list | awk '/critto/{print $1}').json
ingress:
  - hostname: critto.example.com
    service: http://127.0.0.1:8787
  - service: http_status:404
EOF
sudo cloudflared service install

你的伺服器網址會是 https://critto.example.com。每台裝置仍需配對碼。

使用你已經在執行的反向 Proxy

將它指向 http://127.0.0.1:8787,並允許 WebSocket。使用可自行處理 HTTPS 的 Caddy 時:

critto.example.com {
    reverse_proxy 127.0.0.1:8787
}

只在家用網路使用

如果所有裝置都在家裡,可以讓伺服器直接監聽你的網路。設定 CRITTO_LISTEN=0.0.0.0:8787(見設定),並在 App 中使用 http://<server's IP address>:8787。這是未加密的 http,只能在你信任的網路上使用。

無論選擇哪種方式,都請將 CRITTO_PUBLIC_URL 設為該位址,讓配對 QR Code 指向正確位置。


6. 更新

伺服器會和系統其他部分一起更新:

  • Debian / Ubuntu:sudo apt update && sudo apt upgrade
  • Fedora / RHEL:sudo dnf upgrade
  • openSUSE:sudo zypper update

更新後服務會自行重新啟動。桌面和手機 App 需要另外更新。


7. 備份

所有內容都在 /var/lib/critto:你的 critto、記憶、聊天、檔案和 AI 登入資訊。設定在 /etc/critto/critto.env。

**自行複製備份。**為了確保備份一致,請先停止伺服器:

sudo systemctl stop critto
sudo tar czf critto-backup-$(date +%F).tar.gz --exclude=/etc/critto/vault.key /var/lib/critto /etc/critto
sudo systemctl start critto

伺服器執行期間也會在 /var/lib/critto/backups/latest.db 保留最新資料庫複本。

異地備份(S3、Cloudflare R2、Backblaze B2…)。在 App 開啟進階模式,接著選擇「設定 → 備份 → 變更目標…」。加入備份金鑰,讓備份離開伺服器前先加密:

sudo crittod backup keygen

將 CRITTO_BACKUP_KEY=… 這一行複製到 /etc/critto/critto.env,並在安全的離線位置另外保存一份(沒有金鑰就無法還原備份),接著重新啟動:sudo systemctl restart critto。

異地備份會持續更新:

  • 資料庫變更每 10 秒上傳一次;
  • 使用者檔案每 10 分鐘上傳一次;
  • 每天上傳一次完整複本。

你可以直接從備份空間還原過去 7 天內任一時間點的資料:

sudo systemctl stop critto
sudo -u critto crittod backup list
sudo -u critto crittod backup pitr --to /var/lib/critto/restore --at "2026-10-02 14:30"
sudo -u critto mv /var/lib/critto/restore/critto.db /var/lib/critto/critto.db
sudo systemctl start critto

(--at 使用 UTC;省略時會還原最新狀態。還原的 users/ 資料夾會放在原本位置。)

若要還原異地備份,請從儲存空間下載備份檔,將它放在 critto 使用者可以讀取的位置(例如 /var/lib/critto),然後執行:

sudo systemctl stop critto
sudo crittod backup restore --from /path/to/downloaded-backup --to /var/lib/critto/restored.db
sudo -u critto mv /var/lib/critto/restored.db /var/lib/critto/critto.db
sudo systemctl start critto

**保險庫金鑰。**已存金鑰和密碼會以主金鑰加密,主金鑰位於 /etc/critto/vault.key(安裝時建立,只有 critto 使用者能讀取;Docker 使用 critto-keys volume,NixOS 使用 services.critto.vaultKeyFile,預設為 /var/lib/critto-keys/vault.key,一律放在資料目錄之外)。主金鑰不會放進備份。它解鎖的各帳號金鑰清單(/var/lib/critto/vault/keys.db)會另行加密備份到 vault/,和其他備份放在一起,保留 30 天;但你必須提供復原金鑰:

sudo crittod vault recovery-keygen

將 CRITTO_VAULT_BACKUP_RECIPIENT=… 加到 /etc/critto/critto.env 並重新啟動。請將顯示的復原身分和 /etc/critto/vault.key 複本一起離線保存在密碼管理器中,絕不要留在伺服器上。若伺服器遺失,要還原時請先放回 vault.key,再下載 vault/latest.db.age,然後執行:

sudo -u critto crittod vault restore --identity /path/to/recovery.txt /path/to/latest.db.age

設定

伺服器會讀取 /etc/critto/critto.env。所有選項都列在檔案中,並附有說明。使用 sudo nano /etc/critto/critto.env 編輯,然後執行 sudo systemctl restart critto。常用項目:

設定 用途
CRITTO_LISTEN 伺服器監聽位址。預設 127.0.0.1:8787(僅限這台電腦)。
CRITTO_PUBLIC_URL 裝置使用的位址,例如 https://critto.example.com。
BOAT_API_KEY 你的 Boat 金鑰,供小窩使用。
CRITTO_BACKUP_KEY 加密異地備份。
CRITTO_ANTIGRAVITY=0 隱藏 Antigravity。
CRITTO_PROACTIVE=0 critto 不會自行定時關心你(已排程事項會等待)。若沒有 Critto Smarts,定時關心會使用 critto 自己的 AI 思考。
CRITTO_JOB_WORKERS 同時執行的背景工作數量(定時關心、排程事項)。預設為 4。

常用指令:

指令
sudo crittod pair 為新裝置產生配對碼
sudo crittod setup ai 安裝或更新 AI App
sudo crittod users 列出這台伺服器上的帳號
systemctl status critto 檢查服務是否正在執行
journalctl -u critto -f 查看服務紀錄
curl http://127.0.0.1:8787/health 快速檢查服務狀態

第一次需要小窩桌面軟體前,/health 會顯示 "desktop": "on-demand"。這是正常的,伺服器之後會下載該軟體。


解除安裝

  • Debian / Ubuntu:sudo apt purge critto-server
  • Fedora / RHEL:sudo dnf remove critto-server
  • Docker:docker rm -f critto(也可加上 docker volume rm critto-data critto-keys critto-ai 一併刪除資料)

這會停止伺服器並移除套件;如果沒有其他 Critto 套件,還會移除儲存庫。為了方便你日後回來,/var/lib/critto 裡的資料會保留。若要刪除所有內容:

sudo rm -rf /var/lib/critto /etc/critto /opt/critto-ai
sudo userdel critto

若要避免套件一開始就加入儲存庫,請在安裝前執行 echo CRITTO_REPO=no | sudo tee /etc/default/critto。


疑難排解

  • **App 顯示無法連上伺服器。**在伺服器上檢查 systemctl status critto,並確認 App 使用的位址能從該裝置連線(在手機上,127.0.0.1 代表手機本身)。
  • **「配對碼無法使用。」**代碼有效 10 分鐘,而且只能使用一次。執行 sudo crittod pair 產生新代碼。請加上 sudo 執行;否則你會取得另一台個人伺服器的代碼。
  • **「連結」中沒有顯示 AI App。**再次執行 sudo crittod setup ai <name>;完成後會重新啟動伺服器。
  • **其他問題。**通常 journalctl -u critto -n 100 會指出問題所在。