From ad122ab9f240a00c8f63127dfee419bac968af54 Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Sat, 19 Sep 2026 17:44:55 +0700 Subject: [PATCH] chore: drop the openhands service Remove the directory and its row from the root table, the related-services link in opencode-web, and the workspace-volume convention's reference to it. --- CLAUDE.md | 6 +-- README.md | 1 - opencode-web/README.md | 1 - openhands/README.md | 87 ------------------------------------------ openhands/compose.yml | 15 -------- 5 files changed, 3 insertions(+), 107 deletions(-) delete mode 100644 openhands/README.md delete mode 100644 openhands/compose.yml diff --git a/CLAUDE.md b/CLAUDE.md index 11c1ffc..9793271 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -49,9 +49,9 @@ directory, one mounted at `/workspace`. The home volume holds settings, credentials and CLI logins; `/workspace` holds the code. Point whatever variable selects the working directory at `/workspace`. -`code-server`, `paseo` and `opencode-web` all follow this. -A service with no human inside it does not: `openhands` keeps only its state -volume, because each agent session gets a container of its own. +`code-server`, `paseo` and `opencode-web` all follow this. A service with no +human inside it does not — one that spawns a container per session keeps only +its own state volume. The split is so that wiping one does not take the other. Reinstalling an editor should not cost you a repository, and deleting a repository should not cost you diff --git a/README.md b/README.md index 0e799a6..c7258fc 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,6 @@ Each links to its own README for variables, ports, and storage. | [diun](diun/README.md) | Image-update notifier, reading the Docker API through a read-only proxy | | [gitea-mirror](gitea-mirror/README.md) | Gitea + PostgreSQL + gitea-mirror, mirroring GitHub repos | | [opencode-web](opencode-web/README.md) | opencode coding agent, served as a browser UI | -| [openhands](openhands/README.md) | OpenHands coding agent, running each session in a container it spawns | | [paseo](paseo/README.md) | Paseo coding-agent daemon and web UI | | [traffmonetizer](traffmonetizer/README.md) | TraffMonetizer bandwidth-sharing client | diff --git a/opencode-web/README.md b/opencode-web/README.md index 27c02b5..cb1e06c 100644 --- a/opencode-web/README.md +++ b/opencode-web/README.md @@ -104,5 +104,4 @@ is just the subcommand and its flags. ## Related -- [openhands](../openhands/README.md) — a coding agent that runs each session in a container it spawns - [paseo](../paseo/README.md) — runs the opencode CLI, among others, in a terminal diff --git a/openhands/README.md b/openhands/README.md deleted file mode 100644 index 754a240..0000000 --- a/openhands/README.md +++ /dev/null @@ -1,87 +0,0 @@ -# openhands - -[OpenHands](https://openhands.dev) — a coding agent with a web UI. The app -container is only the front half: every agent session runs in a separate -*agent-server* container that this one creates on the host through the Docker -socket. Nothing is built here; the upstream image is complete. - -## Setup - -1. Point the domain at port `3000` and deploy. There is nothing to fill in — - the service has no environment file. -2. Open the domain and set the LLM provider and API key in the UI. They are - written to the state volume and survive a redeploy. - -## Docker socket - -Mounted read-write, and it has to be: the app creates and destroys containers, -and connecting to a Unix socket needs write permission on it. The `:ro` mount -that [code-server](../code-server/README.md) uses would fail here. - -That is full control of the host daemon, which is root-equivalent — the agent -can start a container that mounts anything. It is the price of the Docker -runtime; the alternative is running OpenHands somewhere it does not share a -daemon with anything else. - -`host.docker.internal` is required for the same architecture. Agent-server -containers are siblings started by the host daemon, not members of this compose -project's network, and they publish their port on the host. The app reaches -them by that name, so without the `extra_hosts` entry the UI loads and every -session then fails to connect. - -## Workspace - -There is none on the host. `SANDBOX_VOLUMES` is deliberately unset, so the -agent sees only the storage inside its own sandbox container and cannot touch -a host path. Clone into the sandbox from the agent's terminal instead. - -Setting it would mean a *host* path — the sibling container's mounts are -resolved by the host daemon, so a named volume or a path inside the app -container is not a valid value. - -## Environment - -Nothing is per-deployment, so there is no `.env.example`. What -`compose.yml` sets: - -| Variable | Purpose | -| --- | --- | -| `AGENT_SERVER_IMAGE_REPOSITORY` | Where to pull the sandbox image from | -| `AGENT_SERVER_IMAGE_TAG` | Which sandbox image to run. `-python` is the Python/Node toolchain variant; `-golang`, `-java` and others exist | -| `TZ` | Timestamps in the UI and logs | -| `LOG_ALL_EVENTS` | Full agent event stream in the container logs, which is what makes a failed session diagnosable | - -The app image tracks `latest` while the agent-server tag is pinned, which looks -inconsistent and is not. GHCR publishes no floating tag for -`openhands/agent-server` at all — its tags are version-and-toolchain triples -like `1.26.0-python` — so there is nothing to track. Bump it by hand when the -app image moves far enough that the two disagree; the app pulls it on first -session, so a wrong tag shows up as a session that never starts, not as a -failed deploy. - -## Storage - -| Volume | Mount | Holds | -| --- | --- | --- | -| `openhands-state` | `/.openhands` | Settings, LLM credentials, conversation history | - -`/.openhands` is at the filesystem root, not under `$HOME` — the upstream -`docker run` mounts the host's `~/.openhands` there, and only the container -side matters to a named volume. - -Sandbox containers keep their own storage and are not covered by this volume. - -## Networking - -Listens on `3000`, published nowhere — the platform maps the domain to it. See -the [root README](../README.md) for why. - -Sandbox containers do publish on the host, on ports the app picks, because that -is how the app reaches them. They are not reachable through the domain; serving -a preview running inside a sandbox would need `AGENT_SERVER_USE_HOST_NETWORK` -and `SANDBOX_CONTAINER_URL_PATTERN`, which this setup does not configure. - -## Related - -- [opencode-web](../opencode-web/README.md) — a coding agent that runs in its own container instead of spawning one -- [paseo](../paseo/README.md) — runs agent CLIs, including OpenHands' competitors, in a terminal diff --git a/openhands/compose.yml b/openhands/compose.yml deleted file mode 100644 index 8b58682..0000000 --- a/openhands/compose.yml +++ /dev/null @@ -1,15 +0,0 @@ -services: - openhands: - image: 'ghcr.io/openhands/openhands:latest' - environment: - - AGENT_SERVER_IMAGE_REPOSITORY=ghcr.io/openhands/agent-server - - AGENT_SERVER_IMAGE_TAG=1.26.0-python - - TZ=Asia/Ho_Chi_Minh - - LOG_ALL_EVENTS=true - extra_hosts: - - 'host.docker.internal:host-gateway' - volumes: - - 'openhands-state:/.openhands' - - '/var/run/docker.sock:/var/run/docker.sock' -volumes: - openhands-state: