Compare commits

...
36 Commits
Author SHA1 Message Date
jcabillot 7ad5090715 Merge pull request 'feat: migrate to OpenCode 2 (@opencode/cli 2.0.32)' (#75) from feat/opencode-v2 into main
Main Release / hadolint (push) Successful in 31s
Renovate / renovate (push) Successful in 48s
Main Release / test (push) Successful in 2m36s
Main Release / build (push) Successful in 2m42s
Main Release / tag (push) Successful in 17s
Tag Release / hadolint (push) Successful in 14s
Tag Release / test (push) Successful in 3m14s
Tag Release / build-push (push) Successful in 4m35s
Reviewed-on: #75
2026-10-17 15:38:12 -04:00
OpenCode Cabillot c2c0a81547 feat: migrate to OpenCode 2
PR Checks / hadolint (pull_request) Successful in 12s
PR Checks / build-test (pull_request) Successful in 3m14s
OpenCode 2 publishes its CLI as @opencode/cli (opencode-ai stops at
1.19.x), so install that package and pin it to 2.0.32.

Also fix what the v2 migration invalidates:
- renovate.json: track @opencode/cli instead of opencode-ai, otherwise
  the pin is never bumped.
- opencode-attach: `opencode attach` no longer exists in v2. Point the
  client at the server with `--server <url>` instead (appended after a
  subcommand when one is given); auth still comes from
  OPENCODE_SERVER_PASSWORD / OPENCODE_PASSWORD.
- README/AGENTS: v2 package name, entrypoint, serve defaults, API
  surface (/global/health is gone, everything lives under authenticated
  /api/*), and removal of OPENCODE_SERVER_USERNAME (the username is
  always `opencode` in v2).

The entrypoint stays ["opencode"] on purpose: existing deployments pass
`serve ...` at runtime, and OpenCode 2 is invoked the same way.
2026-10-17 19:28:14 +00:00
opencodecabilloteu 82cfa4af95 Merge pull request 'chore(deps): update dependency opencode-ai to v1.19.0' (#74) from renovate/opencode-ai-1.x into main
Main Release / hadolint (push) Successful in 17s
Main Release / test (push) Successful in 29s
Main Release / build (push) Successful in 30s
Main Release / tag (push) Successful in 50s
Tag Release / hadolint (push) Successful in 22s
Tag Release / test (push) Successful in 33s
Renovate / renovate (push) Successful in 3m1s
Tag Release / build-push (push) Successful in 4m28s
2026-10-13 22:30:30 -04:00
renovate 1e89da3914 chore(deps): update dependency opencode-ai to v1.19.0
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 23s
PR Checks / build-test (pull_request) Successful in 3m2s
2026-10-14 02:14:01 +00:00
opencodecabilloteu d47c09fb0d Merge pull request 'chore(deps): update dependency opencode-ai to v1.18.35' (#73) from renovate/opencode-ai-1.x into main
Main Release / hadolint (push) Successful in 17s
Renovate / renovate (push) Successful in 54s
Main Release / test (push) Successful in 4m21s
Main Release / build (push) Successful in 1m2s
Main Release / tag (push) Successful in 45s
Tag Release / hadolint (push) Successful in 8s
Tag Release / test (push) Successful in 3m44s
Tag Release / build-push (push) Failing after 1m6s
2026-10-09 17:30:23 -04:00
renovate 93382d933c chore(deps): update dependency opencode-ai to v1.18.35
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 17s
PR Checks / build-test (pull_request) Successful in 4m19s
2026-10-09 21:13:45 +00:00
jcabillot d2edf88fd5 Merge pull request 'chore(deps): update dependency opencode-ai to v1.18.34' (#72) from renovate/opencode-ai-1.x into main
Main Release / hadolint (push) Successful in 30s
Main Release / test (push) Successful in 6m10s
Renovate / renovate (push) Successful in 1m16s
Main Release / build (push) Successful in 7m13s
Main Release / tag (push) Successful in 32s
Tag Release / hadolint (push) Successful in 20s
Tag Release / test (push) Successful in 7m34s
Tag Release / build-push (push) Successful in 8m22s
Reviewed-on: #72
2026-10-04 12:59:10 -04:00
renovate 8950a5db5d chore(deps): update dependency opencode-ai to v1.18.34
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 29s
PR Checks / build-test (pull_request) Successful in 6m18s
2026-10-03 23:22:01 +00:00
jcabillot 0025eb9443 Merge pull request 'chore(deps): update dependency opencode-ai to v1.18.33' (#71) from renovate/opencode-ai-1.x into main
Main Release / hadolint (push) Successful in 30s
Main Release / test (push) Successful in 55s
Main Release / build (push) Successful in 1m5s
Renovate / renovate (push) Successful in 2m20s
Main Release / tag (push) Successful in 42s
Tag Release / hadolint (push) Successful in 36s
Tag Release / test (push) Successful in 1m6s
Tag Release / build-push (push) Successful in 6m58s
Reviewed-on: #71
2026-10-01 07:27:13 -04:00
renovate 7a128d3079 chore(deps): update dependency opencode-ai to v1.18.33
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 26s
PR Checks / build-test (pull_request) Successful in 5m58s
2026-10-01 05:21:14 +00:00
jcabillot b6331a5368 Merge pull request 'chore(deps): update dependency opencode-ai to v1.18.32' (#70) from renovate/opencode-ai-1.x into main
Main Release / hadolint (push) Successful in 13s
Renovate / renovate (push) Successful in 50s
Main Release / test (push) Successful in 3m14s
Main Release / build (push) Successful in 25s
Main Release / tag (push) Successful in 15s
Tag Release / hadolint (push) Successful in 12s
Tag Release / test (push) Successful in 22s
Tag Release / build-push (push) Successful in 3m11s
Reviewed-on: #70
2026-09-25 14:51:01 -04:00
renovate ac669492e1 chore(deps): update dependency opencode-ai to v1.18.32
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 15s
PR Checks / build-test (pull_request) Successful in 2m49s
2026-09-25 00:12:15 +00:00
opencodecabilloteu 5a0d58a2ed Merge pull request 'chore(deps): update registry.k8s.io/kubectl docker tag to v1.37.1' (#69) from renovate/registry.k8s.io-kubectl-1.x into main
Main Release / hadolint (push) Successful in 13s
Main Release / test (push) Successful in 37s
Renovate / renovate (push) Successful in 44s
Main Release / build (push) Successful in 27s
Main Release / tag (push) Successful in 12s
Tag Release / hadolint (push) Successful in 12s
Tag Release / test (push) Successful in 22s
Tag Release / build-push (push) Successful in 3m54s
2026-09-23 15:59:07 -04:00
renovate 58807422ae chore(deps): update registry.k8s.io/kubectl docker tag to v1.37.1
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 14s
PR Checks / build-test (pull_request) Successful in 2m20s
2026-09-23 19:10:05 +00:00
opencodecabilloteu 87704514f8 Merge pull request 'chore(deps): update docker/setup-buildx-action digest to f87e599' (#68) from renovate/docker-setup-buildx-action-digest into main
Main Release / hadolint (push) Successful in 9s
Main Release / test (push) Successful in 22s
Renovate / renovate (push) Successful in 50s
Main Release / build (push) Successful in 18s
Main Release / tag (push) Successful in 15s
Tag Release / hadolint (push) Successful in 8s
Tag Release / test (push) Successful in 19s
Tag Release / build-push (push) Successful in 3m27s
2026-09-18 04:31:49 -04:00
renovate df15d0eb65 chore(deps): update docker/setup-buildx-action digest to f87e599
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 10s
PR Checks / build-test (pull_request) Successful in 4m4s
2026-09-18 08:14:16 +00:00
opencodecabilloteu bdef22f8fa Merge pull request 'chore(deps): update dependency opencode-ai to v1.18.31' (#67) from renovate/opencode-ai-1.x into main
Main Release / hadolint (push) Successful in 10s
Renovate / renovate (push) Successful in 42s
Main Release / test (push) Successful in 3m33s
Main Release / build (push) Successful in 13s
Main Release / tag (push) Successful in 10s
Tag Release / hadolint (push) Successful in 6s
Tag Release / test (push) Successful in 3m29s
Tag Release / build-push (push) Successful in 3m55s
2026-09-17 14:30:30 -04:00
renovate 5a1e1fd229 chore(deps): update dependency opencode-ai to v1.18.31
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 7s
PR Checks / build-test (pull_request) Successful in 3m56s
2026-09-17 18:10:27 +00:00
opencodecabilloteu 8fec07f316 Merge pull request 'chore(deps): update docker/build-push-action action to v7.4.0' (#66) from renovate/docker-build-push-action-7.x into main
Main Release / hadolint (push) Successful in 11s
Renovate / renovate (push) Successful in 51s
Main Release / test (push) Successful in 6m5s
Main Release / build (push) Successful in 4m52s
Main Release / tag (push) Successful in 11s
Tag Release / hadolint (push) Successful in 10s
Tag Release / test (push) Successful in 20s
Tag Release / build-push (push) Successful in 5m50s
2026-09-17 05:32:01 -04:00
renovate 0e72d192c4 chore(deps): update docker/build-push-action action to v7.4.0
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 12s
PR Checks / build-test (pull_request) Successful in 31s
2026-09-17 09:16:15 +00:00
opencodecabilloteu c520cb9926 Merge pull request 'chore(deps): update dependency opencode-ai to v1.18.30' (#65) from renovate/opencode-ai-1.x into main
Main Release / hadolint (push) Successful in 12s
Renovate / renovate (push) Successful in 1m10s
Main Release / test (push) Successful in 3m49s
Main Release / build (push) Successful in 22s
Main Release / tag (push) Successful in 14s
Tag Release / hadolint (push) Successful in 13s
Tag Release / test (push) Successful in 25s
Tag Release / build-push (push) Successful in 4m46s
2026-09-12 00:30:39 -04:00
renovate 15de535ff4 chore(deps): update dependency opencode-ai to v1.18.30
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 12s
PR Checks / build-test (pull_request) Successful in 3m10s
2026-09-12 04:12:45 +00:00
opencodecabilloteu 490b824a5c Merge pull request 'chore(deps): update dependency opencode-ai to v1.18.29' (#64) from renovate/opencode-ai-1.x into main
Main Release / hadolint (push) Successful in 38s
Renovate / renovate (push) Successful in 3m37s
Main Release / test (push) Successful in 10m21s
Main Release / build (push) Successful in 1m4s
Main Release / tag (push) Successful in 40s
Tag Release / hadolint (push) Successful in 24s
Tag Release / test (push) Successful in 1m3s
Tag Release / build-push (push) Successful in 7m53s
2026-09-07 21:31:44 -04:00
renovate b113168344 chore(deps): update dependency opencode-ai to v1.18.29
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 37s
PR Checks / build-test (pull_request) Successful in 9m23s
2026-09-08 00:27:17 +00:00
opencodecabilloteu 99c50a0cc3 Merge pull request 'chore(deps): update dependency opencode-ai to v1.18.28' (#63) from renovate/opencode-ai-1.x into main
Renovate / renovate (push) In progress
Main Release / hadolint (push) Successful in 1m10s
Main Release / test (push) Successful in 15m33s
Main Release / build (push) Successful in 1m11s
Main Release / tag (push) Successful in 31s
Tag Release / hadolint (push) Successful in 36s
Tag Release / test (push) Successful in 1m23s
Tag Release / build-push (push) Successful in 10m25s
2026-09-07 12:31:02 -04:00
renovate 2c22741806 chore(deps): update dependency opencode-ai to v1.18.28
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 46s
PR Checks / build-test (pull_request) Successful in 7m36s
2026-09-07 16:18:57 +00:00
opencodecabilloteu ab342272b3 Merge pull request 'chore(deps): update dependency opencode-ai to v1.18.27' (#62) from renovate/opencode-ai-1.x into main
Main Release / hadolint (push) Successful in 14s
Renovate / renovate (push) Successful in 49s
Main Release / test (push) Successful in 2m31s
Main Release / build (push) Successful in 2m10s
Main Release / tag (push) Successful in 31s
Tag Release / hadolint (push) Successful in 10s
Tag Release / test (push) Successful in 2m35s
Tag Release / build-push (push) Successful in 3m11s
2026-09-05 18:30:10 -04:00
renovate efe5f30b92 chore(deps): update dependency opencode-ai to v1.18.27
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 14s
PR Checks / build-test (pull_request) Successful in 2m40s
2026-09-05 22:09:09 +00:00
opencodecabilloteu 10ed6108b4 Merge pull request 'chore(deps): update dependency opencode-ai to v1.18.26' (#61) from renovate/opencode-ai-1.x into main
Main Release / hadolint (push) Successful in 18s
Renovate / renovate (push) Successful in 2m48s
Main Release / test (push) Successful in 5m16s
Main Release / build (push) Successful in 4m6s
Main Release / tag (push) Successful in 52s
Tag Release / hadolint (push) Successful in 18s
Tag Release / test (push) Successful in 29s
Tag Release / build-push (push) Successful in 5m11s
2026-09-04 18:31:03 -04:00
renovate 4c1258305b chore(deps): update dependency opencode-ai to v1.18.26
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 27s
PR Checks / build-test (pull_request) Successful in 6m33s
2026-09-04 22:14:37 +00:00
jcabillot 299d5dbfad Merge pull request 'chore: remove legacy GitLab CI and Jenkins files' (#60) from ci/remove-legacy-ci into main
Main Release / hadolint (push) Successful in 22s
Main Release / test (push) Successful in 42s
Renovate / renovate (push) Successful in 1m55s
Main Release / build (push) Successful in 6m22s
Main Release / tag (push) Successful in 34s
Tag Release / hadolint (push) Successful in 17s
Tag Release / test (push) Successful in 1m58s
Tag Release / build-push (push) Successful in 6m16s
Reviewed-on: #60
2026-09-02 09:50:13 -04:00
OpenCode Cabillot 259c67da7c chore: remove legacy GitLab CI and Jenkins files
PR Checks / hadolint (pull_request) Successful in 20s
PR Checks / build-test (pull_request) Successful in 7m3s
2026-09-02 13:48:30 +00:00
opencodecabilloteu b9067da569 Merge pull request 'chore(deps): update dependency opencode-ai to v1.18.25' (#59) from renovate/opencode-ai-1.x into main
Main Release / hadolint (push) Successful in 18s
Renovate / renovate (push) Successful in 53s
Main Release / test (push) Successful in 2m49s
Main Release / build (push) Successful in 24s
Main Release / tag (push) Successful in 14s
Tag Release / hadolint (push) Successful in 10s
Tag Release / test (push) Successful in 2m54s
Tag Release / build-push (push) Successful in 3m45s
2026-08-31 02:30:43 -04:00
renovate 334846fe11 chore(deps): update dependency opencode-ai to v1.18.25
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 17s
PR Checks / build-test (pull_request) Successful in 2m57s
2026-08-31 06:08:54 +00:00
opencodecabilloteu 388ec9816a Merge pull request 'chore(deps): update dependency opencode-ai to v1.18.24' (#58) from renovate/opencode-ai-1.x into main
Main Release / hadolint (push) Successful in 13s
Renovate / renovate (push) Successful in 55s
Main Release / test (push) Successful in 3m1s
Main Release / build (push) Successful in 3m6s
Main Release / tag (push) Successful in 23s
Tag Release / hadolint (push) Successful in 14s
Tag Release / test (push) Successful in 34s
Tag Release / build-push (push) Successful in 4m11s
2026-08-31 00:30:39 -04:00
renovate 70affd5187 chore(deps): update dependency opencode-ai to v1.18.24
renovate/stability-days Updates have met minimum release age requirement
PR Checks / hadolint (pull_request) Successful in 17s
PR Checks / build-test (pull_request) Successful in 3m11s
2026-08-31 04:09:52 +00:00
10 changed files with 75 additions and 85 deletions

No files matched your search

+3 -3
View File
@@ -18,7 +18,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4
- run: docker build -t ci-image:${{ github.sha }} .
build-push:
@@ -28,7 +28,7 @@ jobs:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
fetch-depth: 0
- uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4
- uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
@@ -43,7 +43,7 @@ jobs:
images: jcabillot/opencode
tags: |
type=raw,value=${{ steps.get-latest-tag.outputs.tag }}-latest,enable=${{ steps.get-latest-tag.outputs.tag != '' }}
- uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
- uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
with:
context: .
push: true
+2 -2
View File
@@ -15,14 +15,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4
- run: docker build -t ci-image:${{ github.sha }} .
build:
needs: [test]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4
- run: docker build -t jcabillot/opencode:${{ github.sha }} .
tag:
needs: [build]
+1 -1
View File
@@ -17,5 +17,5 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4
- run: docker build -t ci-image:${{ github.sha }} .
+3 -3
View File
@@ -18,7 +18,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4
- run: docker build -t ci-image:${{ github.sha }} .
build-push:
@@ -26,7 +26,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4
- uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
@@ -38,7 +38,7 @@ jobs:
tags: |
type=ref,event=tag
type=ref,event=tag,suffix=-latest
- uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
- uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
with:
context: .
push: true
+22 -12
View File
@@ -2,7 +2,7 @@
## Project overview
This repository builds and publishes a Docker image for [OpenCode](https://opencode.ai), the open source AI coding agent. The image runs OpenCode in headless server mode (`opencode serve`) and is automatically rebuilt and pushed to Docker Hub (`jcabillot/opencode`) every night by a Gitea Actions pipeline.
This repository builds and publishes a Docker image for [OpenCode](https://opencode.ai), the open source AI coding agent. The image ships OpenCode 2, runs it in headless server mode (`opencode serve`), and is automatically rebuilt and pushed to Docker Hub (`jcabillot/opencode`) every night by a Gitea Actions pipeline.
## Repository structure
@@ -17,18 +17,25 @@ This repository builds and publishes a Docker image for [OpenCode](https://openc
## Dependency management
- **Always pin versions** in the Dockerfile `npm install` command (e.g. `opencode-ai@1.16.2 n2-soul@9.0.9`). Never leave packages unpinned.
- **Always pin versions** in the Dockerfile `npm install` command (e.g. `@opencode/cli@2.0.32 n2-soul@9.0.9`). Never leave packages unpinned.
- **Update renovate customManagers** when adding, removing, or renaming a dependency tracked in the Dockerfile. Each pinned package must have a corresponding `customManager` entry in `renovate.json` with a regex `matchStrings` pattern that captures the version. If a dependency is added without a renovate entry, Renovatebot will not open automated PRs for it.
- **apt packages** (apt-get install lines in Dockerfile) and **COPY --from** image references are not currently tracked by Renovate. Pinning these manually is acceptable for now but adding renovate managers for them is encouraged.
## Dockerfile conventions
- **Base image**: `node:24` — Debian-based Node.js image (not Alpine, needed for apt packages).
- **Install**: `npm i -g opencode-ai@<version> n2-soul@<version>` — installs OpenCode and Soul globally, both pinned.
- **Base image**: `node:26-trixie` — Debian-based Node.js image (not Alpine) so that downstream images can still use `apt-get` and Node-based MCP servers keep working.
- **Install**: `npm i -g @opencode/cli@<version> n2-soul@<version>` — installs OpenCode 2 and Soul globally, both pinned. `@opencode/cli` replaced `opencode-ai` as the published package in OpenCode 2; `--allow-scripts=@opencode/cli` is required for its `postinstall` to select the native binary.
- **Version check**: `RUN opencode --version` after install to validate the build and record the installed version in build logs.
- **Dedicated user**: a non-root `opencode` user and group are created with `groupadd`/`useradd` (UID/GID 1000). All runtime steps run as this user.
- **Cluster tooling**: `kubectl` is copied from the official `registry.k8s.io/kubectl` image (multi-stage COPY).
- **Entrypoint**: `["opencode"]` — arguments are passed at runtime (e.g. `serve`).
- **Entrypoint**: `["opencode"]` — arguments are passed at runtime; `serve` starts the headless server. Bare `opencode` opens the TUI, so the server is always invoked explicitly.
## OpenCode 2 notes
- The npm package is `@opencode/cli` (bins `opencode` and `opencode2`); `opencode-ai` stops at 1.19.x and must not come back.
- `opencode attach` no longer exists: point a client at a server with `opencode --server <url>` (after the subcommand when one is given). `opencode-attach` wraps this.
- The server always authenticates: username is fixed to `opencode`, password comes from `OPENCODE_SERVER_PASSWORD` or `OPENCODE_PASSWORD`, and a random one is generated and logged when neither is set.
- The v1 REST API was replaced (`/global/health` is gone, every route now lives under `/api/*` and requires auth). Any client calling the v1 API — e.g. `perso/opencode-dispatch` — must be migrated separately.
## CI/CD conventions (Gitea Actions)
@@ -44,17 +51,17 @@ This repository builds and publishes a Docker image for [OpenCode](https://openc
docker build -t opencode .
# Run the server on all interfaces
docker run -it -p 4096:4096 opencode --hostname 0.0.0.0
docker run -it -p 4096:4096 opencode serve --hostname 0.0.0.0
# Run with a project mounted
docker run -it -p 4096:4096 \
-v $(pwd):/home/opencode/project \
opencode --hostname 0.0.0.0
opencode serve --hostname 0.0.0.0
# Protect with a password
docker run -it -p 4096:4096 \
-e OPENCODE_SERVER_PASSWORD=secret \
opencode --hostname 0.0.0.0
opencode serve --hostname 0.0.0.0
```
## opencode serve options
@@ -63,12 +70,15 @@ docker run -it -p 4096:4096 \
|------|---------|-------------|
| `--port` | `4096` | Port to listen on |
| `--hostname` | `127.0.0.1` | Hostname to bind |
| `--mdns` | `false` | Enable mDNS discovery |
| `--cors` | `[]` | Additional allowed browser origins |
| `--cors` | `[]` | Additional allowed browser origins (repeatable) |
| `--service` | `false` | Run as the shared background service |
| `--stdio` | `false` | Serve over stdio for editor integrations |
## Environment variables
| Variable | Description |
|----------|-------------|
| `OPENCODE_SERVER_PASSWORD` | Enables HTTP basic auth |
| `OPENCODE_SERVER_USERNAME` | Overrides the default username (`opencode`) |
| `OPENCODE_SERVER_PASSWORD` | Server password (HTTP basic auth, username `opencode`) |
| `OPENCODE_PASSWORD` | Same, takes precedence over `OPENCODE_SERVER_PASSWORD` |
`OPENCODE_SERVER_USERNAME` existed in OpenCode 1 and is no longer read: the username is always `opencode`.
+2 -2
View File
@@ -16,12 +16,12 @@ RUN apt-get update && \
npm install -g --no-fund --no-audit --ignore-scripts n2-soul@9.0.9 && \
npm install -g --no-fund --no-audit --allow-scripts=better-sqlite3 better-sqlite3@12.11.1 && \
rm -rf /usr/local/lib/node_modules/n2-soul/node_modules/better-sqlite3 && \
npm install -g --no-fund --no-audit --allow-scripts=opencode-ai opencode-ai@1.18.23 && \
npm install -g --no-fund --no-audit --allow-scripts=@opencode/cli @opencode/cli@2.0.32 && \
npm cache clean --force && \
chown -R 1000:1000 /usr/local/lib/node_modules/n2-soul/
COPY --chmod=755 opencode-attach /usr/local/bin/opencode-attach
COPY --from=registry.k8s.io/kubectl:v1.37.0 /bin/kubectl /usr/local/bin/kubectl
COPY --from=registry.k8s.io/kubectl:v1.37.1 /bin/kubectl /usr/local/bin/kubectl
# hadolint ignore=DL3066
USER opencode
WORKDIR /home/opencode
Vendored
-38
View File
@@ -1,38 +0,0 @@
pipeline {
environment {
registry = 'https://registry.hub.docker.com'
registryCredential = 'dockerhub_jcabillot'
dockerImage = 'jcabillot/opencode'
}
agent any
triggers {
cron('@midnight')
}
stages {
stage('Clone repository') {
steps{
checkout scm
}
}
stage('Build image') {
steps{
sh 'docker build --force-rm=true --no-cache=true --pull -t ${dockerImage} .'
}
}
stage('Deploy Image') {
steps{
script {
withCredentials([usernamePassword(credentialsId: 'dockerhub_jcabillot', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {
sh 'docker login --username ${DOCKER_USER} --password ${DOCKER_PASS}'
sh 'docker push ${dockerImage}'
}
}
}
}
}
}
+29 -19
View File
@@ -4,7 +4,7 @@ Docker image for running [OpenCode](https://opencode.ai) as a headless HTTP serv
## What is OpenCode?
OpenCode is an open source AI coding agent available as a terminal interface, desktop app, or IDE extension. This image runs it in server mode (`opencode serve`), exposing an HTTP API that clients can connect to.
OpenCode is an open source AI coding agent available as a terminal interface, desktop app, or IDE extension. This image ships OpenCode 2 and runs it in server mode (`opencode serve`), exposing an HTTP API and web UI that clients can connect to.
## Pull
@@ -12,7 +12,7 @@ OpenCode is an open source AI coding agent available as a terminal interface, de
docker pull jcabillot/opencode
```
The image is rebuilt and pushed to Docker Hub automatically every night via the Jenkins pipeline.
The image is rebuilt and pushed to Docker Hub automatically every night by the Gitea Actions pipeline.
## Build locally
@@ -22,14 +22,16 @@ docker build -t opencode .
## Run
The entrypoint is the `opencode` binary; pass `serve` to start the headless server:
```bash
docker run -it -p 4096:4096 jcabillot/opencode
docker run -it -p 4096:4096 jcabillot/opencode serve
```
By default the server listens on `127.0.0.1:4096`. To expose it on all interfaces:
The server listens on `127.0.0.1:4096` by default. To expose it on all interfaces:
```bash
docker run -it -p 4096:4096 jcabillot/opencode --hostname 0.0.0.0
docker run -it -p 4096:4096 jcabillot/opencode serve --hostname 0.0.0.0
```
### Mount a project
@@ -37,7 +39,7 @@ docker run -it -p 4096:4096 jcabillot/opencode --hostname 0.0.0.0
```bash
docker run -it -p 4096:4096 \
-v $(pwd):/home/opencode/project \
jcabillot/opencode --hostname 0.0.0.0
jcabillot/opencode serve --hostname 0.0.0.0
```
### Secure with a password
@@ -45,17 +47,17 @@ docker run -it -p 4096:4096 \
```bash
docker run -it -p 4096:4096 \
-e OPENCODE_SERVER_PASSWORD=your-password \
jcabillot/opencode --hostname 0.0.0.0
jcabillot/opencode serve --hostname 0.0.0.0
```
Authentication uses HTTP basic auth. The default username is `opencode`, override it with `OPENCODE_SERVER_USERNAME`.
Authentication uses HTTP basic auth. The username is always `opencode`; the password is read from `OPENCODE_SERVER_PASSWORD` (or `OPENCODE_PASSWORD`). When neither is set, OpenCode 2 generates a random password and prints it to the log at startup — the server is never left unauthenticated.
## Troubleshooting helper
The image includes an `opencode-attach` wrapper in `PATH` that runs:
```bash
opencode attach -p "${OPENCODE_SERVER_PASSWORD}" "${OPENCODE_API_URL}"
opencode --server "${OPENCODE_API_URL}"
```
Example:
@@ -66,31 +68,39 @@ export OPENCODE_API_URL=http://127.0.0.1:4096
opencode-attach
```
Extra arguments are forwarded to the client, with `--server` appended to the subcommand:
```bash
opencode-attach session list --format json
```
## API
Once running, the server exposes an OpenAPI 3.1 spec at:
```
http://localhost:4096/doc
http://localhost:4096/openapi.json
```
The web UI is served at `/` and is reachable without credentials; every `/api/*` route requires basic auth.
Key endpoints:
| Method | Path | Description |
|--------|------|-------------|
| `GET` | `/global/health` | Health check and version |
| `GET` | `/session` | List sessions |
| `POST` | `/session` | Create a session |
| `POST` | `/session/:id/message` | Send a message |
| `GET` | `/event` | Server-sent events stream |
| `GET` | `/api/info` | Health check and version |
| `GET` | `/api/session` | List sessions |
| `POST` | `/api/session` | Create a session |
| `POST` | `/api/session/:id/prompt` | Send a message |
| `GET` | `/api/event` | Server-sent events stream |
See the [OpenCode server docs](https://opencode.ai/docs/server/) for the full API reference.
See the [OpenCode v2 API reference](https://opencode.ai/v2/docs/api/) for the full API surface.
## Image details
- **Base image**: `node:24` (Debian)
- **Install**: `opencode-ai` via npm global install
- **Base image**: `node:26-trixie` (Debian)
- **Install**: `@opencode/cli` (OpenCode 2) via npm global install
- **User**: dedicated non-root `opencode` user
- **Cluster tooling**: `kubectl` (copied from official registry image)
- **Entrypoint**: `opencode serve`
- **Entrypoint**: `opencode`
- **Default port**: `4096`
+9 -1
View File
@@ -45,4 +45,12 @@ trap cleanup_lock INT TERM EXIT
kill_existing_instance
printf '%s\n' "$$" > "$LOCKFILE"
exec opencode attach -p "${OPENCODE_SERVER_PASSWORD}" "${OPENCODE_API_URL}" "$@"
# OpenCode 2 dropped `opencode attach`: a client is pointed at a server with
# --server <url>, which must follow the subcommand when one is given.
if [ "$#" -eq 0 ]; then
set -- --server "${OPENCODE_API_URL}"
else
set -- "$@" --server "${OPENCODE_API_URL}"
fi
exec opencode "$@"
+4 -4
View File
@@ -12,12 +12,12 @@
},
{
"customType": "regex",
"description": "Track opencode-ai npm package pinned in Dockerfile RUN command",
"description": "Track @opencode/cli npm package pinned in Dockerfile RUN command",
"managerFilePatterns": ["/^Dockerfile$/"],
"matchStrings": ["opencode-ai@(?<currentValue>[^\\s]+)"],
"depNameTemplate": "opencode-ai",
"matchStrings": ["@opencode/cli@(?<currentValue>[^\\s]+)"],
"depNameTemplate": "@opencode/cli",
"datasourceTemplate": "npm",
"versioningTemplate": "npm"
}
]
}
}