Files
paseo/public-docs/docker.zh-CN.md
T
Mohamed Boudra bd15e40e94 Serve paseo.sh in Simplified Chinese (#7373)
* feat(website): serve paseo.sh in Simplified Chinese

Every page of the website now has a Simplified Chinese version under
/zh-CN: the interface, docs, blog posts, comparison pages, legal pages,
all changelog releases and the homepage mockup. English URLs are unchanged.

The URL alone decides the language. There is no browser-language redirect
and no stored preference, because either would have to redirect the
unprefixed English URLs that people share and search engines index.
Internal links carry the page's language instead, and hreflang alternates
point Chinese search results at /zh-CN.

Translated headings pin the English anchor with {#id}, so section links
work in both languages. content-translations.test.ts fails when a page
has no translation or a translation's headings drift from the English.
Changelog releases and plugin listings without a translation render
whole in English under a notice, so a release never waits on one.

Plugin manifests and the registry gain optional translations and
OVERVIEW.zh-CN.md fields; older clients and registries ignore them.

* feat(website): replace the native language select with an EN/ZH menu

The header showed an OS-native select whose popup did not match the site.
The trigger now shows the language abbreviated (EN, ZH) and opens a menu in
the app's dropdown style that names each language in itself, with its name
in the page language underneath. Rows are real links to the same page in
that language; arrows, Escape, outside presses and taps behave as a menu
button, and the menu keeps itself on screen when a narrow header pushes the
trigger toward an edge.

Also drops the stray space after the full-width comma in the Chinese
homepage subtitle.

* docs(website): translate main's new docs and 0.12.0 release notes

Main added Keep run workspaces to the schedules docs, rewrote plugin icons
around inline SVG, and promoted 0.12.0 with new entries. Bring the Chinese
pages and changelog in line so no section falls back to English.

* fix(server): leave plugin listing translations to the registry

The daemon rejected manifests whose translations the registry would refuse,
so a plugin main installs could fail to load here. Paseo never reads
translations; the registry validates them at publish. Docs now say which
checks are automated at publish and which are human review.

* docs(plugins): describe the registry's final overview translation discovery

* style(server): format manifest test

* test(app): measure sidebar rows one at a time

After a reload the developer error toast appears while expectVerticalOrder
measures every row at once. Each concurrent boundingBox runs the toast
locator handler, and only one of them resumes, so the poll timed out on
every attempt since #7424. Measuring sequentially keeps one action in flight.

* test(app): return sidebar row measuring to main

#7480 hides the developer toast instead of running a locator handler, so
measuring the rows concurrently no longer races it. Reverts 41ac23016.

* test(app): wait for the compact shell before opening compact Changes

The shell survives the breakpoint, so right after the resize the wide
Explorer could still be visible: the test skipped the Explorer toggle and
the tab then disappeared, or toggled at the wrong time. Wait for the
compact-shell marker, as the composer helpers do since #7424.

* docs(website): translate main's plugin file panel docs

* test(app): edit the code font size after the font family remount

A committed appearance change remounts the settings screen through
AppearanceStyleBoundary, and the new form starts from the stored size.
Filling the size before that remount lost the edit in CI.

* docs(website): translate main's client/ui import docs

Follows #7474: one /client/ui entry, StreamedText instead of useRevealedText,
SettingsGroup dropped from the settings table, and the new
'UI imports in v0.13' migration section.

* test(app): wait for the previous layout's file panel picker to leave

After a resize the old layout's picker animates out while the new one is
already mounted, so the Use button matched two elements and the strict
locator failed. Wait for the shell's layout and a single picker first.
2026-10-21 13:13:03 +07:00

5.2 KiB
Raw Blame History

title, description, nav
title description nav
Docker 使用官方 Docker 镜像运行 Paseo daemon 和内置网页界面。 Docker

Docker

官方 Paseo Docker 镜像运行 daemon,并在同一个 HTTP 源上提供内置的浏览器界面。它适用于服务器、开发机、NAS 设备、家庭实验室主机,以及其他你希望在没有桌面应用的情况下运行 Paseo 的地方。

Docker 镜像跟随 Paseo 稳定版的发布节奏。ghcr.io/getpaseo/paseo:latest 指向最新的稳定版,而不是任意的 main 构建。

docker run -d --name paseo \
  -p 6767:6767 \
  -e PASEO_PASSWORD=change-me \
  -v "$PWD/paseo-home:/home/paseo" \
  -v "$PWD:/workspace" \
  ghcr.io/getpaseo/paseo:latest

然后打开:

http://localhost:6767

如果设置了 PASEO_PASSWORD,在网页界面、移动应用或 CLI 中添加直连 daemon 时,请使用相同的密码。

镜像包含什么

该镜像:

  • 安装 Paseo daemon 和 CLI
  • 提供内置的网页界面
  • 在容器内监听 0.0.0.0:6767
  • 把 daemon 状态保存在 /home/paseo/.paseo 下
  • 以非 root 的 paseo 用户运行 daemon 和启动的 Agent

该镜像不包含 Claude Code、Codex、OpenCode、Copilot、Pi 或 Muse Code 等 Agent CLI。请用一个小的子镜像添加你使用的 Agent。

在宿主机上运行 CLI 命令时需要显式指定容器,例如 paseo project ls --host 127.0.0.1:6767。如果不指定端点,CLI 会查找本地 home 的 supervisor。容器的环境变量设置属于部署层面的覆盖;重启 worker 会保留它们。完整替换 supervisor 由你的容器管理器负责。

Docker Compose

services:
  paseo:
    image: ghcr.io/getpaseo/paseo:latest
    container_name: paseo
    restart: unless-stopped
    ports:
      - "6767:6767"
    environment:
      PASEO_PASSWORD: "change-me"
      # PASEO_HOSTNAMES: "paseo.example.com,.lan"
    volumes:
      - ./paseo-home:/home/paseo
      - ./workspace:/workspace

启动:

docker compose up -d

安装 Agent CLI

为你想使用的 Provider 创建一个子镜像:

FROM ghcr.io/getpaseo/paseo:latest

USER root
RUN npm install -g @openai/codex @anthropic-ai/claude-code opencode-ai

构建:

docker build -t paseo-with-agents .

然后在 Compose 中使用 image: paseo-with-agents。

保持子镜像的用户为 root。基础镜像的入口点只在首次运行配置挂载卷时使用 root,之后会以非 root 的 paseo 用户运行 daemon 和启动的 Agent。

你可以通过传入 Provider 环境变量来认证 Agent,也可以在容器内运行 Provider 的登录流程:

docker exec -it --user paseo paseo codex
docker exec -it --user paseo paseo claude

Agent 凭据会持久保存在 /home/paseo 中。

挂载卷

大多数部署需要挂载两个路径:

挂载点 用途
/home/paseo Paseo 状态,以及 .codex、.claude 等 Agent 配置和凭据
/workspace Paseo 和启动的 Agent 可以读写的代码

在 Linux 上,内置的 paseo 用户的 uid/gid 是 1000:1000。请让挂载的目录对该用户可写,或者使用 Docker 的 --user / Compose 的 user: 选项运行容器。

反向代理

把普通 HTTP 流量和 WebSocket 升级请求转发到容器。

Caddy:

paseo.example.com {
  reverse_proxy 127.0.0.1:6767
}

Nginx:

server {
    listen 443 ssl;
    server_name paseo.example.com;

    location / {
        proxy_pass http://127.0.0.1:6767;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

如果你通过 DNS 名称访问 Paseo,请允许该主机名:

environment:
  PASEO_HOSTNAMES: "paseo.example.com,.lan"

IP 和 localhost 默认是允许的。

安全

对于任何发布的端口或可通过网络访问的部署,请设置 PASEO_PASSWORD。在 localhost 之外通过浏览器访问时,请在反向代理上使用 HTTPS。

静态网页界面在 daemon 源上是公开的。配置密码后,daemon API 和 WebSocket 受密码认证保护。

Agent 可以访问你挂载到 /workspace 的任何内容,以及你放在 /home/paseo 中的任何凭据。请把这些挂载限制在 Agent 应该能使用的范围内。

完整的 daemon 信任模型见安全。

故障排查

  • 界面能加载但无法连接:如果设置了 PASEO_PASSWORD,请使用相同的密码添加直连。
  • 403 Host not allowed:把 PASEO_HOSTNAMES 设置为你使用的 DNS 名称。
  • Provider 不可用:在子镜像中安装该 Agent CLI,或确保二进制文件在 PATH 中。
  • /workspace 中的权限错误:让挂载的目录对 uid/gid 1000:1000 可写,或以宿主机的 uid/gid 运行容器。
  • 日志:运行 docker logs paseo,或在容器内查看 /home/paseo/.paseo/daemon.log。