Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
#
# The scripts below are why that matters. A shell script committed with CRLF
# fails on Linux with `bad interpreter: /bin/bash^M`, and the two places it would
# surface are the least convenient possible: CI, and `scripts/install.sh`, which
# users run. Nothing is broken today (every script is LF in the index); this is
# surface are the least convenient possible: CI, and `ops/bootstrap/pg-init.sh`,
# which the Postgres container runs on an operator's machine. Nothing is broken today (every script is LF in the index); this is
# what keeps it that way.
* text=auto eol=lf

Expand Down
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -1764,6 +1764,24 @@ under the pre-1.0 conventions in [VERSIONING.md](docs/governance/VERSIONING.md):
A header rather than a redirect: four doors sit in front of this route, and
`/01/{gtin}` beside it does not redirect either.

### Removed

- **`scripts/install.sh`, the one-click installer, which could not install
anything.** Every source it fetched returned `404` — the script itself, the
compose file (saved as a 404 page, since the download had no `--fail`) and the
CLI binary, because no GitHub Release exists. The images it would pull are not
public. Its `.env` lacked both database passwords and the admin credentials
compose requires, and the compose file it placed at the install root reads
`../.env` and bind-mounts `../ops/bootstrap/`, so role provisioning would
silently never have run. It printed a locally generated `odal_sk_…` as the
"API Key", which the node never issued. And when `cargo` was present it ran
`cargo install odal-cli`, **a crate name nobody owns** — whoever registered it
would have run code on every machine that followed the installer.

The maintained path is `docs/guides/OPERATOR-SETUP.md`: build `odal`, then
`odal init` and `odal up`. A replacement installer is tracked for before 1.0,
once the images and the CLI are published for it to install (#397).

## [0.13.0] - 2026-09-13

### Breaking
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ dpp-engine/
Cargo.toml # Workspace root — 10 member crates
LICENSE # BSL-1.1
docker/ # Dockerfiles + compose (dev infra + prod stack)
scripts/ # install.sh (curl|bash bootstrap)
scripts/ # the check scripts `just check` runs
ops/
pg/ # PostgreSQL DDL migrations (0001–0012_*.sql)
demo/ # CSV/XLSX import fixtures + JSON samples
Expand Down
2 changes: 1 addition & 1 deletion docs/guides/OPERATOR-SETUP.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ bare metal to a live, passport-issuing node.
| **Docker ≥ 24** (with Compose plugin) | `docker compose version` to verify |
| **A domain name** | Required for `did:web` — passports are signed against it |
| **TLS termination** | Reverse proxy (nginx, Caddy) in front of port 8001 recommended for production |
| **`odal` binary** | Build: `cargo build -p dpp-cli --release` or download a release |
| **`odal` binary** | Build: `cargo build -p dpp-cli --release` — no prebuilt binary is published yet |

---

Expand Down
7 changes: 3 additions & 4 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,9 @@ REDOCLY_VERSION := "2.46.2"
# environment, and compose interpolation reads the env file it was given, not
# the environment it inherits.
#
# The installer path was never affected — `scripts/install.sh` writes
# `docker-compose.yml` and `.env` into the same directory, so they line up
# there. This was only ever the in-repo developer path, which is the one
# CLAUDE.md tells you to use.
# `odal up` was never affected — it passes `--env-file` itself
# (`cli/src/core/infra.rs`). This was only ever the in-repo developer path,
# which is the one CLAUDE.md tells you to use.
COMPOSE := "docker compose --env-file .env"

# ---------------------------------------------------------------------------
Expand Down
100 changes: 14 additions & 86 deletions scripts/README.md
Original file line number Diff line number Diff line change
@@ -1,91 +1,19 @@
# Odal Node Installer
# scripts/

**License:** BSL-1.1
The checks `just check` runs, and the few helpers the `justfile` calls. Each
script's header comment says what it enforces and why; `just --list` shows which
recipe runs it. A `*.test.sh` beside a script proves that gate actually fails —
a check that has never been seen red proves nothing.

---
These are repository tooling, not something an operator runs.

## What This Is
## Installing a node

A one-click setup script that scaffolds a complete self-hosted Odal Node stack
using Docker Compose.
There is no one-click installer. The one that lived here fetched a script, a
compose file and a CLI binary that are not published anywhere, and pulled images
that are not public, so it could not install anything; it was removed rather than
repaired. A replacement is tracked for before 1.0, once there is something
published for it to install: #397.

---

## Usage

```bash
curl -sSL https://odal-node.io/install.sh | bash
```

### Options

| Flag | Default | Description |
|---|---|---|
| `--no-cli` | — | Skip installing the `odal` CLI |
| `--port PORT` | `8001` | Override the node port |
| `--dir DIR` | `~/.odal` | Installation directory |
| `--version VERSION` | `latest` | Odal Node image tag to install |

Example — custom port, no CLI:
```bash
curl -sSL https://odal-node.io/install.sh | bash -s -- --port 9001 --no-cli
```

---

## What the Script Does

1. Checks prerequisites (`docker`, `docker compose`)
2. Creates `~/.odal/` (or `--dir`)
3. Downloads `docker-compose.yml`
4. Generates a random PostgreSQL password, KeyStore passphrase, and API key
5. Writes `.env` with the generated secrets
6. Runs `docker compose up -d`
7. Polls `/health` endpoints until all services are healthy
8. Optionally installs the `odal` CLI binary
9. Prints a summary: node URL, resolver URL, API key, next steps

The script is **idempotent** — re-running it against an existing installation
will skip secret generation and reuse the existing `.env`.

---

## What Gets Deployed

| Service | Port | Description |
|---|---|---|
| `dpp-node` | 8001 | MVP binary (vault + identity + integrator) |
| `dpp-resolver` | 8003 | Public QR resolution |
| `postgres` | 5432 | PostgreSQL database |

The node exposes sub-routes: `/vault/*`, `/identity/*`, `/integrator/*`.

---

## Files

| File | Description |
|---|---|
| `install.sh` | One-click installer script |
| `docker-compose.yml` | Production Docker Compose file |
| `README.md` | This file |

---

## Manual Setup

If you prefer not to pipe from the internet:

```bash
git clone https://github.com/odal-node/dpp-engine
cd dpp-engine/installer
cp ../. env.example .env
# Edit .env with your preferred passwords
docker compose up -d
```

---

## Architecture

See [../docs/](../docs/) for full architecture documentation.
To run a node today, follow [docs/guides/OPERATOR-SETUP.md](../docs/guides/OPERATOR-SETUP.md):
build `odal` from this repository, then `odal init` and `odal up`.
220 changes: 0 additions & 220 deletions scripts/install.sh

This file was deleted.

Loading