2026-05-18 06:00:20 -04:00
# Docker and Docker Compose
This is the easiest self-hosting path for beginners.
## Before You Start
- Docker Desktop installed and running
- Internet connection (first run downloads the image)
## Step 1: Open the Deploy Folder
```bash
git clone https://github.com/nexu-io/open-design.git
cd open-design/deploy
```
What this does:
- Downloads the project
- Moves into the folder that contains `docker-compose.yml`
2026-06-19 11:24:14 +08:00
## Step 2: Create `.env` and choose an API auth mode
Create `deploy/.env` from the tracked template:
```bash
cp .env.example .env
```
Generate a token if you want the default protected mode:
```bash
openssl rand -hex 32
```
Then edit `.env` and configure one of these before first start:
- recommended default: paste the generated token into `OD_API_TOKEN=`
- trusted authenticated reverse proxy only: leave `OD_API_TOKEN=` empty and set `OPEN_DESIGN_DISABLE_API_AUTH=1`
2026-08-18 07:09:45 +00:00
If you expose OpenDesign through a reverse proxy, also set:
2026-06-19 11:24:14 +08:00
```bash
OPEN_DESIGN_ALLOWED_ORIGINS = https://yourdomain.com
```
2026-08-18 07:09:45 +00:00
## Step 3: Start OpenDesign
2026-05-18 06:00:20 -04:00
```bash
2026-07-18 11:41:08 +08:00
docker compose up -d
2026-05-18 06:00:20 -04:00
```
What to expect:
- First run can take 1-2 minutes while Docker pulls the image
- You should see container creation and startup messages
2026-06-19 11:24:14 +08:00
## Step 4: Confirm Container Health
2026-05-18 06:00:20 -04:00
```bash
2026-07-18 11:41:08 +08:00
docker compose ps
2026-05-18 06:00:20 -04:00
```
Success looks like:
- `open-design` container is listed
- `STATUS` shows `Up` and eventually `healthy`
- Port mapping includes `127.0.0.1:7456->7456/tcp`


2026-08-12 06:47:28 +00:00
## Step 5: Verify Container Health Over HTTP
2026-05-18 06:00:20 -04:00
```bash
2026-08-12 06:47:28 +00:00
curl -i http://127.0.0.1:7456/api/health
2026-05-18 06:00:20 -04:00
```
Success looks like:
- HTTP status `200 OK`

2026-08-18 07:09:45 +00:00
## Step 6: Open OpenDesign in Your Browser
2026-05-18 06:00:20 -04:00
2026-10-13 02:34:28 +00:00
For a headless integration with your own model provider, follow
[Headless BYOK runs over REST ](../headless-byok.md ) instead of opening the UI.
The guide covers the OpenCode runtime prerequisite and per-run provider payload.
2026-05-18 06:00:20 -04:00
Open:
2026-08-12 06:47:28 +00:00
- `http://127.0.0.1:7456/`
2026-05-18 06:00:20 -04:00
2026-08-12 06:47:28 +00:00
If the browser displays a sign-in dialog, enter `open-design` as the username
and the `OD_API_TOKEN` value from `deploy/.env` as the password. You should then
2026-08-18 07:09:45 +00:00
see the OpenDesign interface. Docker bridge peers remain authenticated; no host
2026-08-12 06:47:28 +00:00
networking override is required.
2026-05-18 06:00:20 -04:00
2026-08-18 07:09:45 +00:00


2026-05-18 06:00:20 -04:00
## Common Issues
- `failed to connect to the docker API` : Docker Desktop is not running yet
- `address already in use` : Port `7456` is occupied by another process
- `curl: (7) Failed to connect` : container is still starting; wait 10-20 seconds and retry
2026-07-15 10:02:13 +05:30
- `pull access denied` or `authentication required` for `ghcr.io/nexu-io/od` : the GHCR package must be public for anonymous Docker, Compose, and Dokploy pulls. An organization maintainer must open GitHub -> Packages -> `od` -> Package settings and change visibility to Public.
2026-06-19 11:24:14 +08:00
- reverse proxy + `OD_API_TOKEN` : either inject `Authorization: Bearer <OD_API_TOKEN>` at the proxy, or set `OPEN_DESIGN_DISABLE_API_AUTH=1` only when that proxy already authenticates every request and the daemon is not directly exposed.
2026-08-12 06:47:28 +00:00
- browser sign-in repeats: use username `open-design` and the exact `OD_API_TOKEN` value from `deploy/.env` ; recreate the container after changing the token.