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.
This commit is contained in:
tiennm99 committed 2026-09-19 17:44:55 +07:00
1 parent 24cefe80a2
commit ad122ab9f2
5 files changed
+3 -107

No files matched your search

+3 -3
View File
@@ -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
-1
View File
@@ -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 |
-1
View File
@@ -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
-87
View File
@@ -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
-15
View File
@@ -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: