Installing extenddb on macOS

June 24, 2026 · View on GitHub

See NOTICE for important disclaimers.

This guide is the macOS-specific path for the generic instructions in docs/getting-started.md. See that doc for the full CLI surface and feature walkthrough.

The installer script checks dependencies, builds extenddb, sets up a Python venv for documentation, and builds PDF manuals:

scripts/install-macos.sh

The script does not install missing dependencies — it reports what's missing so you can install them with Homebrew, then re-run.

After the script completes, skip to Step 3: Initialize the deployment.

Manual Installation

If you prefer to run each step yourself, follow the sections below.

Prerequisites

  • Rust 1.88+ (rustup update)
  • PostgreSQL 14+ via Homebrew (brew install postgresql@17)
  • Python 3.10+ (for test suites)
  • AWS CLI v2 (for testing)

1. Start PostgreSQL

Using brew services (recommended — survives reboots):

brew services start postgresql@17

Or manually:

pg_ctl -D /opt/homebrew/var/postgresql@17 \
       -l /opt/homebrew/var/postgresql@17/server.log start

Verify it's accepting connections:

pg_isready
# /tmp:5432 - accepting connections

On Homebrew macOS the superuser is your macOS username ($(whoami)), not postgres, and uses trust auth over the local socket.

2. Build extenddb

cargo build --release

Binary lands at target/release/extenddb.

3. Initialize the deployment

extenddb init creates the PostgreSQL extenddb role, the catalog and data databases, applies schema migrations, generates an encryption key, creates a default account + admin user, and writes extenddb.toml for you. Do not hand-write extenddb.toml before running init.

On macOS you must tell init which PostgreSQL user to connect as for the CREATE ROLE / CREATE DATABASE steps — your macOS username:

./target/release/extenddb init --pg-user $(whoami)

This prints the admin credentials once. Save them — they cannot be retrieved later.

init writes a extenddb.toml with auth.provider = "builtin" (the default). All DynamoDB requests must be signed with valid access keys. Create an IAM user and access key after starting the server (see step 7 below).

4. Verify

./target/release/extenddb verify --config extenddb.toml

Expected:

=== extenddb verify ===
...
  OK: Catalog version 0.0.2
...
=== HEALTHY: All checks passed ===

5. Start the server

./target/release/extenddb serve --config extenddb.toml

extenddb daemonizes automatically and logs to syslog.

Check status:

./target/release/extenddb status --config extenddb.toml

Read logs (macOS equivalent of journalctl -t extenddb):

log stream --predicate 'processImagePath ENDSWITH "extenddb"'        # follow live
log show   --predicate 'processImagePath ENDSWITH "extenddb"' --last 5m

Stop the server:

./target/release/extenddb stop --config extenddb.toml

6. Smoke test

curl --cacert ~/.extenddb/tls/cert.pem https://127.0.0.1:18443/health
# {"status":"healthy"}

export AWS_CA_BUNDLE=~/.extenddb/tls/cert.pem
aws dynamodb list-tables \
    --endpoint-url https://127.0.0.1:18443 \
    --region us-east-1
# { "TableNames": [] }

7. Management console

Open https://127.0.0.1:18443/console/ in a browser (accept the self-signed certificate warning). Log in with the admin user and the password printed during init.

Upgrading after a git pull

If the binary's expected catalog version is ahead of the deployed catalog, extenddb serve refuses to start and extenddb verify reports a version mismatch. Apply migrations:

cargo build --release
./target/release/extenddb migrate --config extenddb.toml

No data is lost; only the catalog schema is updated.

Tearing it all down

# Stop the server
./target/release/extenddb stop --config extenddb.toml

# Drop both databases and the extenddb role
./target/release/extenddb destroy --config extenddb.toml --yes

Differences from Linux

ItemLinuxmacOS (Homebrew)
PG admin userpostgres (or custom)Your macOS username ($(whoami)), no password
extenddb init flagsdefaults usually finepass --pg-user $(whoami)
Service managersystemctl / pg_ctlbrew services or pg_ctl
Syslog readerjournalctl -t extenddblog stream --predicate 'processImagePath ENDSWITH "extenddb"'

Troubleshooting

SymptomFix
connection refused on port 18443Server not running. ./target/release/extenddb serve --config extenddb.toml
Catalog version X.Y.Z (binary expects A.B.C)./target/release/extenddb migrate --config extenddb.toml
role "extenddb" does not exist during initRe-run with --pg-user $(whoami)
DROP DATABASE hangs after hard killCheck for lingering backends: ps -eo pid,command | grep postgres

See docs/troubleshooting.md for the full troubleshooting guide.


License

Copyright 2026 ExtendDB contributors. Licensed under the Apache License, Version 2.0. See LICENSE for the full text.

This software is provided "as is" without warranty of any kind. ExtendDB is not affiliated with, endorsed by, or sponsored by Amazon Web Services. "DynamoDB" is a trademark of Amazon.com, Inc.