---
title: "Docker Compose"
url: "https://control.actana.ai/docs/get-started/docker-compose"
description: "A Panel and a Core on one Docker network from published images: up, pair, and run a session."
updated: 2026-09-01T21:59:14+00:00
---

The whole product on one host: a **Panel and a Core on one Docker network**, pulled straight from published images — no clone needed. Prerequisite: [Docker](https://docs.docker.com/get-docker/) (on Windows: Docker Desktop with the WSL2 backend; every `docker` command below is identical in PowerShell).

Create a folder and step into it:

```bash
mkdir -p actana/repos
```

```bash
cd actana
```

Save this beside it as `docker-compose.yml`:

```yaml
services:
  panel:
    image: actana/panel:${ACTANA_TAG:-latest}
    restart: unless-stopped
    ports:
      - "127.0.0.1:7420:7420"
    volumes:
      - panel-data:/data

  core:
    image: actana/core:${ACTANA_TAG:-latest}
    restart: unless-stopped
    environment:
      - ACTANA_PUBLIC_HOST=core
    volumes:
      - core-home:/home/core
      - ./repos:/home/core/repos

volumes:
  panel-data:
  core-home:
```

Pull the images:

```bash
docker compose pull
```

Start it:

```bash
docker compose up -d
```

Mint a pairing code:

```bash
docker compose exec core actana pair new
```

At a terminal that prints a framed handout: the one-time code, the CA fingerprint, the expiry, the session id — and, under the frame, exactly what to do with them from the Panel or from another terminal.

### Part 1 — create your Operator account

Open [http://localhost:7420](http://localhost:7420).

A brand-new Panel has no account, so it opens on **Set up your Panel**. Choose a name and a password. The password is stored only as a hash and there is no recovery, so keep it somewhere safe.

**Do this first.** The Panel has no session until this account exists, and any other link you open before it is redirected here — including the one in Part 2.

### Part 2 — open the wizard on the pairing step

Now open [http://localhost:7420/?step=redeem](http://localhost:7420/?step=redeem).

That opens the first-run wizard directly on its last step, **Redeem the code here**. Steps 1 and 2 — install a Core, mint a code — are already done for you: the compose file did the install, and `pair new` minted the code.

Fill it in with what `pair new` printed:

- **Core address** — `core:8443`
- **CA fingerprint** — compare it against the one on that terminal. The Panel does not send the code until the two match.
- **Session** and **Pairing code** — both from the framed box.

The `?step=redeem` parameter only chooses which step the wizard opens on; it skips the reading, not the checking. It also only works once Part 1 is done — on a Panel with no account yet, the link is redirected to the setup screen and the parameter is lost along the way.

Full walkthrough: [Panel Pairing](/docs/pairing/panel-pairing).

`core:8443` is the Compose service name — the Panel dials it over the compose network; the Core publishes no port to your machine at all.

That is the whole quickstart: Fleet shows the Core, drop a checkout into `./repos`, add it as a project, start a session.

## Where to next

- Pin both images together with `ACTANA_TAG=x.y.z` in a `.env` beside the file (`npm view @actana/cli version` prints the current release). Panel and Core are version-locked at the handshake.
- Drive this Core from `actana` on your host machine too, or from the LAN: the certificate must cover the extra names — see [Reaching a compose Core from a local CLI](/docs/install/panel-installation#reaching-a-compose-core-from-a-local-cli).
- Volumes, a second Core, TLS in front of the Panel, backups: [Panel Installation](/docs/install/panel-installation).
