Get started on a single node (binary + systemd)
This is the production-shaped first install: one Linux host, one static binary, systemd, the embedded SQLite store — and the real first-run path (a one-time setup token, TLS on by default, no default credentials, no demo data). By the end you will have Olivares AI running as a hardened service with a real source wired and a populated access graph.
It is the same engine the quickstart demos in five minutes; the difference is posture. If you want the instant look-around first, do the quickstart, then come back here for the real install.
Every command on this page was run, as written, against the current binary
(the first-boot banner, the token-recovery path, the pgAudit wiring and the
graph below are exercised by scripts/quickstart-smoke.sh and were re-verified
for this guide).
Prerequisites
Section titled “Prerequisites”- A Linux host with systemd and
curl. - Go 1.26+ to build the binary (the store is pure-Go SQLite, so no C toolchain). Releases with signed prebuilt artifacts ship at the first public release — until then you build from a checkout, and verify a release documents the chain you will use once they exist.
1. Build and install the binary
Section titled “1. Build and install the binary”-
Build the one static artifact (engine + embedded web UI + first-party connectors):
Terminal window task build # produces ./bin/olivares./bin/olivares version -
Install it and create the service user:
Terminal window sudo install -m 0755 bin/olivares /usr/local/bin/olivaressudo useradd --system --home /var/lib/olivares --shell /usr/sbin/nologin olivares
2. Run it as a hardened systemd service
Section titled “2. Run it as a hardened systemd service”Create /etc/systemd/system/olivares.service:
[Unit]Description=Olivares AI — self-hosted engine for enterprise AIDocumentation=https://olivares.ai/docsAfter=network-online.targetWants=network-online.target
[Service]Type=simpleUser=olivaresGroup=olivaresExecStart=/usr/local/bin/olivares serve \ --listen 127.0.0.1:8443 \ --grpc-listen 127.0.0.1:8444 \ --data-dir /var/lib/olivaresRestart=on-failureRestartSec=5
# The data directory holds the SQLite store, the audit signing key and the TLS# material. StateDirectory creates /var/lib/olivares owned by the service user.StateDirectory=olivaresStateDirectoryMode=0700UMask=0077
# Hardening (mirrors the container posture: non-root, read-only, no escalation)NoNewPrivileges=trueProtectSystem=strictProtectHome=truePrivateTmp=truePrivateDevices=trueProtectKernelTunables=trueProtectKernelModules=trueProtectControlGroups=trueRestrictSUIDSGID=trueRestrictRealtime=trueLockPersonality=trueMemoryDenyWriteExecute=trueSystemCallArchitectures=nativeCapabilityBoundingSet=AmbientCapabilities=ReadWritePaths=/var/lib/olivares
[Install]WantedBy=multi-user.targetsudo systemctl daemon-reloadsudo systemctl enable --now olivaresThe engine binds loopback by default — 127.0.0.1:8443 is deliberate.
Expose it later, behind your own ingress and TLS, as an explicit decision
(see hardening).
3. Claim the one-time setup token
Section titled “3. Claim the one-time setup token”A fresh install has no default credentials. On first boot the engine mints
a single-use setup token (olst_…) and prints it to stdout only — under
systemd, that is the journal:
journalctl -u olivares -o cat | sed -n '/FIRST-BOOT SETUP/,/========================/p'=== FIRST-BOOT SETUP ===No accounts exist yet. Open the console and create the first administratorwith this one-time token — setup also creates your first organization andmakes that administrator its owner:
Console: https://127.0.0.1:8443 Token: olst_…
The console serves HTTPS with a self-signed certificate on first boot — yourbrowser will warn once; that is expected. The token is shown ONCE and issingle-use. Prefer the API? POST /v1/setup {"token":"…","email":"…","password":"…"} — add "organization":"…" to name it (default: "DefaultOrganization"). The reply carries the new organization's tenant_id.========================Create the first administrator and log in:
SETUP="olst_…" # from the banner above
curl -ksf -X POST https://127.0.0.1:8443/v1/setup \ -H 'Content-Type: application/json' \ -d "{\"token\":\"$SETUP\",\"email\":\"you@example.com\",\"password\":\"<strong-password>\"}"
TOKEN="$(curl -ksf -X POST https://127.0.0.1:8443/v1/auth/login \ -H 'Content-Type: application/json' \ -d '{"email":"you@example.com","password":"<strong-password>"}' \ | python3 -c 'import sys,json;print(json.load(sys.stdin)["token"])')"4. Create your first organization
Section titled “4. Create your first organization”Everything in the product is tenant-scoped, so create the organization your sources will report into:
TENANT="$(curl -ksf -X POST https://127.0.0.1:8443/v1/system/orgs \ -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \ -d '{"name":"Production","slug":"prod"}' \ | python3 -c 'import sys,json;print(json.load(sys.stdin)["tenant_id"])')"echo "tenant: $TENANT"5. Wire your first real source
Section titled “5. Wire your first real source”Sources are declared in one operator-owned JSON file named by
OLIVARES_SOURCES_CONFIG, read before the engine starts. Here is the
PostgreSQL pgAudit source (the clean-tier R/RW signal — see the
pgAudit guide for the Postgres-side setup):
sudo tee /etc/olivares/sources.json >/dev/null <<JSON{"sources":[{ "name": "salesdb-pgaudit", "kind": "pgaudit", "tenant": "$TENANT", "config": { "log_path": "/var/log/postgresql/postgresql.csv", "format": "csvlog" }}]}JSONsudo chmod 0600 /etc/olivares/sources.json && sudo chown olivares: /etc/olivares/sources.jsonPoint the service at it with a drop-in, and restart:
sudo systemctl edit olivares[Service]Environment=OLIVARES_SOURCES_CONFIG=/etc/olivares/sources.jsonReadOnlyPaths=/etc/olivaressudo systemctl restart olivaresjournalctl -u olivares -o cat | grep "ingest: wired source"ingest: wired source (in-process fast-path) name=salesdb-pgaudit kind=pgauditIf nothing is wired, the engine says so honestly rather than looking healthy on an empty map — see troubleshooting for the exact warnings and what each means.
6. Reach the graph
Section titled “6. Reach the graph”curl -ksf "https://127.0.0.1:8443/v1/m/accessmap/graph?limit=200" \ -H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT" | python3 -m json.tool
curl -ksf "https://127.0.0.1:8443/v1/m/accessmap/drift" \ -H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT" | python3 -m json.toolThe same graph renders in the embedded web UI at https://127.0.0.1:8443
(from a workstation, tunnel it: ssh -L 8443:127.0.0.1:8443 <host>).
7. Before you call it done
Section titled “7. Before you call it done”Two artifacts in the data directory decide whether your evidence survives an incident — deal with them now, not after:
| Artifact | Why it matters | Action |
|---|---|---|
| audit-signing.key | Signs the append-only audit ledger. If it is lost, the ledger can no longer be re-verified. The engine only warns on first boot — there is no enforced escrow. | Back it up off-box, with 0600 permissions, today. |
| The ledger public key | An off-box copy of the public key is what makes verification attacker-resistant after a host compromise. | curl -ksf https://127.0.0.1:8443/v1/audit/pubkey and store the result off-box. |
Then schedule real backups — olivares dr backup produces an encrypted,
ledger-continuity-safe bundle; the backup & restore guide
is the full procedure, including the restore drill.
Health and monitoring
Section titled “Health and monitoring”The engine exposes /livez (process up), /readyz (store reachable — this is
the availability SLI) and /metrics (Prometheus) on the HTTP listener:
curl -ks https://127.0.0.1:8443/readyz# {"leader":true,"setup_required":false,"status":"ok","store":"up"}See monitor with Prometheus for the metric set, SLO targets and shipped alert rules.
Next steps
Section titled “Next steps”- Connect more signals: the connector guides — pgAudit, CloudTrail, Claude Code, eBPF, and the rest of the catalog.
- Harden the deployment: security hardening — exposure, mTLS for collectors, approvals.
- Govern: govern and approve — RBAC, policies, and the recorded-decisions guarantee.