> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aiaxoniq.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Install with Docker Compose

> Add the zero-code agent to a Compose stack, generate its configuration, and keep the license key out of the file you commit.

The agent as a service in your Compose stack. One per host, not one per
application.

<Warning>
  **Availability.** The zero-code agent is an early-access distribution. It is
  installable, upgradable and tested, and it is **not yet an integrated part of
  the product**: there is no dashboard page for it, no in-product installer and
  no self-service download. Ask your account contact for access.

  Its telemetry, once flowing, is ordinary OTLP and needs nothing special —
  it appears in Services, Traces and Metrics exactly like SDK telemetry does.
  That is the design rather than a shortcut.
</Warning>

<Info>
  **Before you start, you need two values.**

  1. **Your base endpoint** — shown on **Get Started** in the dashboard. These
     pages write it as `$OIQ_ENDPOINT`.
  2. **A license key** — created in **Settings → License Keys**, starting
     `oiq_`. Requires the Admin role. See
     [Create a license key](/get-started/license-keys). These pages write it as
     `$OIQ_LICENSE_KEY`.

  Export both before running anything below:

  ```bash theme={null}
  export OIQ_ENDPOINT="https://app.aiaxoniq.com/otlp"   # or your own
  export OIQ_LICENSE_KEY="oiq_..."
  ```
</Info>

## Generate the configuration

You never hand-write agent configuration. The generator produces it from your
endpoint and profile:

```bash theme={null}
./bin/oiq-zerocode-config --endpoint "$OIQ_ENDPOINT" \
    --emit config --out docker/config.yaml
```

## Start it

```bash theme={null}
export OIQ_ENDPOINT="https://app.aiaxoniq.com/otlp"   # or your own
export OIQ_LICENSE_KEY='oiq_...'
docker compose -f docker/docker-compose.yaml up -d
```

<Note>
  **The reference Compose file contains no secrets and is safe to commit.**
  Both the endpoint and the key are read from the environment, and Compose
  refuses to start with a readable error if either is missing — rather than
  starting with an empty value and failing later at ingest with a `401` you
  have to trace back.
</Note>

## A different profile

The reference file is profile B. For A or C, generate a Compose file rather
than editing one by hand:

```bash theme={null}
./bin/oiq-zerocode-config --endpoint "$OIQ_ENDPOINT" --profile C \
    --target compose --emit compose --out docker-compose.yaml
```

Generating rather than editing is what keeps the capability set, the PID
namespace setting and the profile consistent with each other. See
[Capability profiles](/zero-code/profiles).

## What the generated service needs

Two settings carry the whole install, and both are easy to lose when merging
the agent into an existing stack:

<Warning>
  **`pid: host` is required, and its absence is silent.** Without it the agent
  shares no PID namespace with your other containers, sees only itself, and
  produces essentially nothing while reporting healthy.

  If you copy the agent service into your own `docker-compose.yaml`, this is
  the line that gets dropped.
</Warning>

<Note>
  **Capabilities are dropped and then added back**, rather than the service
  being privileged. If a merge leaves you with `privileged: true`, you have
  granted far more than the agent needs — regenerate rather than patch.
</Note>

## Confirm it is working

```bash theme={null}
docker compose -f docker/docker-compose.yaml logs -f
```

Then confirm data is arriving in the product — see
[Verification](/zero-code/verification).

## Updating configuration

Regenerate and restart:

```bash theme={null}
./bin/oiq-zerocode-config --endpoint "$OIQ_ENDPOINT" \
    --emit config --out docker/config.yaml
docker compose -f docker/docker-compose.yaml restart
```

<Warning>
  **A configuration change with no restart has no effect.** The agent reads its
  configuration at start. "I changed the routes and nothing happened" is almost
  always this.
</Warning>

## Next

<CardGroup cols={3}>
  <Card title="Verification" icon="circle-check" href="/zero-code/verification">
    Confirm data is arriving, and rule out the silent failure.
  </Card>

  <Card title="Kubernetes" icon="dharmachakra" href="/zero-code/kubernetes">
    The DaemonSet, for when the stack outgrows one host.
  </Card>

  <Card title="Troubleshooting" icon="triangle-exclamation" href="/zero-code/troubleshooting">
    Symptom to cause to fix.
  </Card>
</CardGroup>
