Critto 通常运行在你的 Critto 账号中。如果你更想把所有内容留在自己的电脑上,也可以自行运行 Critto 服务器:你的 critto、它们的记忆和聊天都会保存在那台电脑上,Critto 桌面和手机应用会连接到这台电脑。

本指南适用于 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 配对应用(见第 2 步)。

  • **更新:**运行 nix flake update critto,然后重新构建。软件包是经过签名的预构建版本(静态二进制文件,不会遇到 glibc 问题)。要使用 beta 通道,请设置 services.critto.package = critto.packages.${system}.crittod-beta;。
  • **密钥:**将 BOAT_API_KEY=… 和 CRITTO_BACKUP_KEY=… 放入 environmentFile(由 root 所有,权限模式为 600;也支持 agenix 和 sops-nix)。服务启动时会读取它,不会复制到 Nix store。
  • 设置:listen(默认 127.0.0.1:8787)、publicUrl、webHost、openFirewall(默认关闭)、dataDir(默认 /var/lib/critto),以及其他 CRITTO_* 变量的 settings。den.backend 用于选择小窝的运行位置(boat、local 或 none;见可选的小窝)。
  • **AI 应用:**优先在 aiPackages 中使用 nixpkgs 软件包(例如 pkgs.codex、需要 allowUnfree 的 pkgs.claude-code)。nixpkgs 没有的软件,请设置 programs.nix-ld.enable = true;,然后运行 sudo crittod setup ai(见第 3 步)。Pi 只需要在 aiPackages 中添加 pkgs.nodejs_22,然后运行 sudo crittod setup ai pi。
  • **远程访问:**设置 services.tailscale.enable = true;,然后运行 sudo tailscale serve --bg 8787;也可以使用 services.cloudflared,并将入口规则指向 http://127.0.0.1:8787(见第 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 软件包、启动服务器并显示配对码。就这么简单:接着看配对应用。

想比其他人更早用到新版本?请使用 beta 通道: 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 卷中,保险库主密钥保存在单独的 critto-keys 卷中(两者分开保存,因此单独复制其中一个都无法解锁另一个;见“备份”),AI 应用保存在 critto-ai 卷中。也可以将 Docker secret 挂载到 /etc/critto/vault.key。运行 docker pull ghcr.io/nexferra-ltd/critto-server:latest 更新,然后使用相同卷重新创建容器。

或使用静态构建版

每个版本也提供可在任何 Linux 上运行的单文件构建版: https://downloads.critto.app/releases/<version>/critto-server-<version>-linux-x86_64.tar.gz (或 -aarch64)。解压后运行 ./crittod serve。你需要自行保持它运行并及时更新,因此使用软件包更方便。


2. 配对应用

服务器只允许已配对的设备连接。配对步骤如下:

  1. 在服务器上获取配对码(有效期为 10 分钟,且只能使用一次):

    sudo crittod pair
    
  2. 在 Critto 应用的登录界面中,选择使用我自己的 Critto 服务器。输入服务器地址和配对码。

    • 在服务器本机上:http://127.0.0.1:8787
    • 其他设备需要能访问的地址;请见让其他设备访问。

配对一台设备后,你可以从那台设备继续配对其他设备:“设置 → 设备 → 配对手机”会显示二维码。二维码中包含服务器监听的地址;如果你的设备通过其他方式(隧道、代理、域名)访问服务器,请将 CRITTO_PUBLIC_URL 设置为该地址(见设置)。

桌面应用和服务器在同一台电脑上?桌面应用通常会自行启动一个私有 Critto 服务器。如果你已经在这台电脑上安装了服务器,请改为选择使用我自己的 Critto 服务器,并填写 http://127.0.0.1:8787,这样两边就会使用同一批 critto。


3. 连接你的 AI

critto 会使用你选择的 AI 来思考。连接 AI 有两种方式。

你的 AI 订阅(ChatGPT、Claude、Grok……)

Critto 通过这些服务的官方命令行应用与它们通信。你只需在服务器上安装一次:

sudo crittod setup ai

选择你使用的服务,或者直接指定名称: sudo crittod setup ai codex claude。

应用 搭配使用
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 已因此封停过账号。

这些应用会安装在 /opt/critto-ai 中,不会自行更新。请时不时运行 sudo crittod setup ai --update 来更新它们。

然后在 Critto 应用中打开“连接”,并登录每个服务。登录信息保存在服务器上,不在应用中。

自定义 AI:本地模型和 API 密钥

打开“设置 → 高级模式”,然后选择“设置 → 自定义 AI → 添加连接”。任何支持“OpenAI 兼容” API 的服务都能使用。你可以在“从以下项目开始”中选择预设,也可以自行填写地址:

服务 基础 URL 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 在云端使用的专属电脑,可用于处理更大的任务(创建内容、浏览网页、使用应用)。自托管服务器会在你自己的Boat账号中运行小窝。请在应用中的“连接”下粘贴 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 的地址。在应用中使用这个地址。只有你自己的设备能访问它。

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 访问。每台设备仍然需要配对码。

使用你已经运行的反向代理

将它指向 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(见设置),并在应用中使用 http://<server's IP address>:8787。这是未加密的 http,因此只应在可信网络中使用。

无论选择哪种方式,都请将 CRITTO_PUBLIC_URL 设置为该地址,这样配对二维码才会指向正确位置。


6. 更新

服务器会随系统的其他软件一起更新:

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

更新后服务会自行重启。桌面和手机应用需要单独更新。


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……)。**在应用中打开“高级模式”,然后选择“设置 → 备份 → 更改目标…”。添加备份密钥,即可在备份离开服务器前加密:

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 卷,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 应用
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。


故障排查

  • **应用提示无法连接服务器。**在服务器上检查 systemctl status critto,并确认应用中的地址可由设备访问(在手机上,127.0.0.1 指手机本身)。
  • **“配对码无法使用。”**配对码有效期为 10 分钟,且只能使用一次。运行 sudo crittod pair 生成新码。请使用 sudo 运行;否则得到的会是另一台个人服务器的配对码。
  • **“连接”中没有显示某个 AI 应用。**再次运行 sudo crittod setup ai <name>;完成后服务器会重启。
  • **其他问题。**通常可以通过 journalctl -u critto -n 100 找到原因。