Skip to content

Fresh install

Bare-metal install of ELTMaestro on a RHEL or Debian family host from the portable tarball. The OS-level prerequisites (JDK 21 + PostgreSQL 16) are installed once by root; everything else is owned by an unprivileged maestro user.

Conventions used below

  • maestro is the dedicated unprivileged user that owns the install. Any non-root account works; this doc uses maestro consistently.
  • /data/ is the parent directory the tarball is extracted into. Result is /data/iserver/.... Any path works as long as the user owns it and has ~50 GB free.
  • <VERSION> matches the suffix on the tarball (e.g. 27d7a8e5c for a SHA-named build, or a semantic version if you passed one to publish.sh).

Step 1 - prerequisites (root, once per host)

RHEL / Rocky / Alma 8.10+ or 9.4+

sudo dnf install -y java-21-openjdk-devel
sudo dnf install -y \
    https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %rhel)-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf install -y postgresql16-server

install.sh will find Java under /usr/lib/jvm/ and the PG binaries under /usr/pgsql-16/bin/ — no extra configuration needed.

Debian 12 / Ubuntu 22.04 / Ubuntu 24.04

sudo apt update
sudo apt install -y openjdk-21-jdk-headless

# PGDG apt repo (PostgreSQL 16 is not in the stock Debian/Ubuntu repos)
sudo install -d /usr/share/postgresql-common/pgdg
sudo curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc \
    -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc
echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" \
    | sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt update
sudo apt install -y postgresql-16

install.sh will find Java under /usr/lib/jvm/java-21-openjdk-* and the PG binaries under /usr/lib/postgresql/16/bin/.

If you skip these, install.sh's preflight will fail with the exact missing-command and the exact dnf / apt line to run.

Step 2 - create the dedicated user (root, once)

sudo useradd -m -s /bin/bash maestro
sudo mkdir -p /data
sudo chown maestro:maestro /data

install.sh will refuse to run as root and recommend you switch to a regular user. The maestro user does not need sudo.

Step 2.5 - download the release from S3 (as maestro)

ELTMaestro releases are published for public download to https://eltmaestro.s3.amazonaws.com/docker/ by the eltmaestro-ci Jenkins job (ACTION publish-s3). Two artifacts are available, each named with the release <VERSION>:

Artifact What it is
eltm-portable-<VERSION>.tar.gz the portable Linux installer — used by this guide
eltmaestro-<VERSION>.tar.gz the Docker image export — alternative to a bare-metal install

Linux installer (then continue with Step 3):

su - maestro
cd /data
curl -fLO https://eltmaestro.s3.amazonaws.com/docker/eltm-portable-<VERSION>.tar.gz

Docker image (alternative path — instead of the bare-metal Steps 3-5): download and load the image rather than extracting the tarball:

curl -fLO https://eltmaestro.s3.amazonaws.com/docker/eltmaestro-<VERSION>.tar.gz
docker load -i eltmaestro-<VERSION>.tar.gz            # registers eltmaestro:<VERSION>

Then load and run it per Install from the Docker image (the full docker loaddocker run → verify recipe). The image is large — it bundles Spark, Hadoop, Marquez, the JDK, and Postgres — so the bare-metal tarball is the lighter option for a single host, while the image export suits container or air-gapped deployments.

See Downloads for the exact download URLs (current release line 17.0.4; the bucket isn't directory-browsable).

Step 3 - extract the tarball (as maestro)

su - maestro
cd /data
tar -xzf /path/to/eltm-portable-<VERSION>.tar.gz
ls -d iserver        # produces /data/iserver/...

The tarball stages a tree under iserver/ mirroring the runtime layout. Nothing is started yet.

Step 4 - run install.sh (as maestro)

/data/iserver/install.sh

This is the convenience symlink to /data/iserver/bin/install.sh. It runs idempotently — re-running skips steps that are already done. What it does, in order:

  1. Detects distro from /etc/os-release and sources the matching lib/distro-<family>.sh
  2. Preflight: verifies JDK 21 and PG 16 are present at the distro-specific paths; errors with the missing-package command if anything's absent
  3. Writes ~/.env_integrator.paths with the discovered JAVA_HOME and PGBIN for this distro
  4. Installs ~/.env_integrator and adds the source line to ~/.bashrc so future logins inherit the env
  5. Downloads Spark 4.1.1 + Hadoop 3.4.3 from the Apache archive into tools/ (~600 MB combined, one-time)
  6. Generates server/keystore.jks with the hostname-correct SAN (DNS:$(hostname -f),DNS:localhost,IP:$(hostname -I),IP:127.0.0.1) so the Spring Boot meta-service's HTTPS works without the legacy relaxSniHostCheck workaround
  7. Initializes Postgres: initdb → start temporary → createdb sqlmaestro → load initdb.sql + postload-fixups.sql + seed-system-user.sql + any pending migrations/*.sql → stop

Expect 3-10 minutes depending on network speed (the Spark + Hadoop downloads dominate).

Step 5 - load the env and start everything

. ~/.env_integrator
mstart-all

mstart-all starts Postgres, the Spring Boot meta-service, the engine, and any auxiliary services in the right order. PID files land under /data/iserver/transient/socket/.

Verify:

show-mprocess           # lists all running maestro processes
curl -k https://localhost:8181/MaestroMetaDataProviderService/MaestroMetaService?wsdl

The WSDL should return HTTP 200 with the SOAP contract.

Step 6 - default credentials

The seed loads a single bootstrap user named integrator (uppercased to INTEGRATOR in t_user.user_id). Reset the password before connecting any real client:

mset-password-md5 INTEGRATOR '<new-password>'

Where to go next

  • Day-to-day operation: see OPERATIONS.md
  • Upgrading later: see UPGRADE.md (run a one-off backup first per BACKUP.md)
  • Layout reference: see OPERATIONS.md § Install layout reference for the full /data/iserver/ tree
  • Backups: weekly Proxmox VM snapshot via BACKUP.md; daily Jenkins controller snapshot via JENKINS-BACKUP.md