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¶
maestrois the dedicated unprivileged user that owns the install. Any non-root account works; this doc usesmaestroconsistently./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.27d7a8e5cfor a SHA-named build, or a semantic version if you passed one topublish.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)¶
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 load → docker 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)¶
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:
- Detects distro from
/etc/os-releaseand sources the matchinglib/distro-<family>.sh - Preflight: verifies JDK 21 and PG 16 are present at the distro-specific paths; errors with the missing-package command if anything's absent
- Writes
~/.env_integrator.pathswith the discoveredJAVA_HOMEandPGBINfor this distro - Installs
~/.env_integratorand adds thesourceline to~/.bashrcso future logins inherit the env - Downloads Spark 4.1.1 + Hadoop 3.4.3 from the Apache archive into
tools/(~600 MB combined, one-time) - Generates
server/keystore.jkswith 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 legacyrelaxSniHostCheckworkaround - Initializes Postgres:
initdb→ start temporary →createdb sqlmaestro→ loadinitdb.sql+postload-fixups.sql+seed-system-user.sql+ any pendingmigrations/*.sql→ stop
Expect 3-10 minutes depending on network speed (the Spark + Hadoop downloads dominate).
Step 5 - load the env and start everything¶
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:
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