Connector-only
Connector-only installs only spot-agent-sap, the local license validator, and
the required SAP NetWeaver RFC SDK. It does not include the backend, web UI, or
Elasticsearch. Use it when SPOT and Elasticsearch run on another host or when
the agent must remain close to SAP.
Choose an installation method
| Method | Artifact | Privileges | Recommended management |
|---|---|---|---|
| RPM/DEB | spot-agent-sap | root for installation | system systemd |
| Portable | spot-agent-sap-portable | non-root user | systemd --user or a supervisor |
Both methods run the same agent and produce the same data contract. Do not install connector-only over a SPOT suite or mix their directories. See also Installation matrix.
Before installing
Prepare:
- a Linux
x86_64host with a synchronized clock; - RFC connectivity from the host to every SAP system;
- HTTPS connectivity to the Elasticsearch cluster that receives agent data;
- a read-only SAP user authorized for the collection families you require;
- a valid online key or offline license file;
- the artifact and
SHA256SUMSfrom the same SPOT Release.
The official artifact already contains the expanded SDK and validated compatibility libraries. Do not extract another SDK into the package or replace its binaries.
Install with RPM or DEB
Verify and install
From the directory that contains the package and SHA256SUMS:
sha256sum -c --ignore-missing SHA256SUMS
sudo rpm -Uvh spot-agent-sap-X.Y.Z-1.el10.x86_64.rpm
# or
sudo dpkg -i spot-agent-sap_X.Y.Z_amd64.deb
The package creates the service user and leaves the Elasticsearch destination empty and disabled. Configure it before starting the agent.
| Content | System path |
|---|---|
| Binaries and SDK | /opt/spot |
| Editable configuration | /etc/spot/.spot-agent-sap.yaml |
| Incremental state | /var/lib/spot-agent-sap |
| License and history | /var/lib/spot/license |
| Agent log | /var/log/spot/spot-agent-sap.log |
Install portable without root
Download, verify, and extract
The official name is
spot-agent-sap-portable_X.Y.Z_linux_amd64.tar.gz. To use the included
systemd --user units without changes, extract it to the recommended path:
umask 077
SPOT_ARTIFACT=spot-agent-sap-portable_X.Y.Z_linux_amd64.tar.gz
grep -F " ${SPOT_ARTIFACT}" SHA256SUMS | sha256sum -c -
export SPOT_HOME="$HOME/spot-agent-sap-portable"
mkdir -p "$SPOT_HOME"
tar -xzf "$SPOT_ARTIFACT" -C "$SPOT_HOME" --strip-components=1
chmod -R go-rwx "$SPOT_HOME"
Confirm the package type before configuring it:
test -x "$SPOT_HOME/bin/spot-agent-sap"
test -x "$SPOT_HOME/bin/spot-license-blackbox"
test -x "$SPOT_HOME/scripts/run-agent.sh"
test -x "$SPOT_HOME/scripts/run-license.sh"
test ! -e "$SPOT_HOME/bin/spot-server"
test ! -e "$SPOT_HOME/scripts/run-elasticsearch.sh"
Portable creates no users, system services, or files in /opt, /etc, or
/var. Everything belongs to the runtime user:
| Content | Portable path |
|---|---|
| Editable configuration | $SPOT_HOME/config/spot-agent-sap.yaml |
| Generated runtime configuration | $SPOT_HOME/run/spot-agent-sap.yaml |
| Incremental state | $SPOT_HOME/data/spot-agent-sap |
| License and history | $SPOT_HOME/data/license |
| Logs | $SPOT_HOME/log |
| Included SDK | $SPOT_HOME/nwrfcsdk |
If you choose another $SPOT_HOME, the manual scripts still work. Adapt the
included units to that path before copying them.
Configure the agent
Edit the configuration file for your installation method. The portable
template initially ships with elasticsearch.enabled: false; complete the
destination and enable it only after reviewing TLS and authentication.
elasticsearch:
url: https://elastic.example.local:9200
transport_profile: external
namespace: production
apikey: "<elastic-credential>"
manage_data_streams_ilm: false
enabled: true
sapconnection:
- id: sap-production
alias: SAP Production
system_id: PRD
ashost: sap.example.local
sysnr: "00"
client: "100"
user: SPOT_READER
passwd: "enc:v1:<encrypted-secret>"
lang: EN
time_zone: Europe/Madrid
enabled: true
collections:
metrics: {enabled: true, intervalSeconds: 300}
ccms_events: {enabled: true, intervalSeconds: 300}
jobs: {enabled: true, intervalSeconds: 300}
work_processes: {enabled: true, intervalSeconds: 300}
abap_dumps: {enabled: true, intervalSeconds: 300}
rfc_failures: {enabled: true, intervalSeconds: 300}
certificates: {enabled: true, intervalSeconds: 86400}
sapconnection[].id is mandatory, non-empty, and unique within the process. It
is written as source_id in every document and becomes the user-facing
targetId; SPOT does not generate sap-N, resolve aliases, or migrate the old
topology. After trimming, the ID must match
^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$; comparison is case-sensitive. Add N SAP
blocks if needed: they all write to this one
Elasticsearch+namespace. Run another connector instance and service to split
SAP systems across clusters. One SAP must not belong to two connectors.
Use exactly one Elasticsearch authentication method: apikey or
username/password. If the cluster uses a private CA, copy only the public
certificate into the configuration area and set ca_file to an absolute path.
insecure_skip_verify retains encryption but does not verify server identity;
reserve it for a temporary, documented exception.
SAP passwd must contain an enc:v1: value encrypted for the same
installation. Do not store the password in clear text or pass it as a process
argument. On portable, preserve $SPOT_HOME/config/spot-sap-secret.key with the
configuration; losing or replacing that key prevents existing credentials from
being decrypted.
Generate enc:v1: safely
On RPM/DEB, run the command as the service user. It prompts for the SAP password without echo and writes only the encrypted value:
sudo -u spot /opt/spot/bin/spot-agent-sap encrypt
Copy the single enc:v1:... line into sapconnection[].passwd. If automation
already supplies the secret through a protected stream, use --stdin; never
place the literal value on the command line:
IFS= read -r -s -p 'SAP password: ' SPOT_SAP_PASSWORD; printf '\n' >&2
printf '%s' "$SPOT_SAP_PASSWORD" |
sudo -u spot /opt/spot/bin/spot-agent-sap encrypt --stdin
unset SPOT_SAP_PASSWORD
You can also use a temporary regular, non-symlink, private file:
sudo install -o spot -g spot -m 0600 /protected/path/password /run/spot-sap-password
sudo -u spot /opt/spot/bin/spot-agent-sap encrypt \
--password-file /run/spot-sap-password
sudo rm -f /run/spot-sap-password
On portable, invoke the artifact wrapper; it derives its own root and uses the
key below config/:
"$HOME/spot-agent-sap-portable/bin/spot-agent-sap" encrypt
Build a private Docker image with a temporary password
When preparing a private connector-only image, the Dockerfile can consume the
password through the sap_password BuildKit secret and run
spot-agent-sap encrypt --password-file /run/secrets/sap-password during the
build. In this case you do not need to create file-passwd-sap or add it to
.dockerignore: pass the value directly from a temporary environment variable:
SAP_PASSWORD='SAP_PASSWORD' \
DOCKER_BUILDKIT=1 docker build \
--no-cache \
--secret id=sap_password,env=SAP_PASSWORD \
--tag spot-agent-sap:2.0.4 .
The Dockerfile must mount that secret with
RUN --mount=type=secret,id=sap_password,target=/run/secrets/sap-password,required=true.
BuildKit does not add it to the image layers. The literal value may still remain
in the local shell history, so use this method only on a controlled build host.
Do not declare the password through ARG or ENV in the Dockerfile. Keep the
image in a private registry when it also contains the offline license and the
installation encryption key.
The system key is /etc/spot/spot-sap-secret.key; the portable key is
$SPOT_HOME/config/spot-sap-secret.key. Ciphertext is bound to that key. Add it
to the protected configuration backup and restore it together with its
enc:v1: values. Never delete, regenerate, or copy it from another
installation: a different key cannot decrypt existing passwords. If an
existing portable key is not mode 0600, the command fails without changing
it.
With manage_data_streams_ilm: false, bootstrap checks connectivity only and
creates no resources. With true, the agent requires administration
permissions and manages only the metrics and logs Data Streams. The
namespace must match a SPOT backend read scope. The backend discovers each SAP
through tenant_id=onprem + source_id; a wrong scope or duplicate ID across
scopes produces a binding diagnostic, never silent fallback.
SPOT 2.0 does not support separate Jobs, Events, or WPInfo indices. Three names
are derived from namespace: metrics telemetry, logs telemetry, and the
isolated operational agent stream.
Activate or install the license
The agent does not execute elastic-bootstrap or run without a valid
license. Usage warnings do not stop the connector; a missing, invalid, expired,
or revoked license does.
RPM/DEB
sudo systemctl enable --now spot-license.service
sudo systemctl status spot-license.service --no-pager
# Online activation through the hidden prompt
sudo -u spot /opt/spot/bin/spot-agent-sap license-activate
For an offline license:
sudo install -o spot -g spot -m 0600 /received/path/license /run/spot-license.offline
sudo -u spot /opt/spot/bin/spot-agent-sap license-install /run/spot-license.offline
sudo rm -f /run/spot-license.offline
Portable with systemd --user
The included units target $HOME/spot-agent-sap-portable. Install them and
start the validator first:
mkdir -p "$HOME/.config/systemd/user"
install -m 0644 "$SPOT_HOME/systemd-user/spot-license.service" \
"$HOME/.config/systemd/user/spot-license.service"
install -m 0644 "$SPOT_HOME/systemd-user/spot-agent-sap.service" \
"$HOME/.config/systemd/user/spot-agent-sap.service"
systemctl --user daemon-reload
systemctl --user enable --now spot-license.service
"$SPOT_HOME/bin/spot-agent-sap" license-activate
# or: "$SPOT_HOME/bin/spot-agent-sap" license-install /protected/path/license
"$SPOT_HOME/bin/spot-agent-sap" license-check
systemctl --user enable --now spot-agent-sap.service
Ask the host administrator to enable linger for the runtime user if the service must stay active after logout. Do not run the user units and manual scripts at the same time.
Portable with manual startup
For controlled validation or when using another supervisor:
umask 077
"$SPOT_HOME/scripts/run-license.sh" \
>"$SPOT_HOME/log/license.out" 2>"$SPOT_HOME/log/license.err" &
printf '%s\n' "$!" >"$SPOT_HOME/run/license.pid"
"$SPOT_HOME/bin/spot-agent-sap" license-activate
# or: "$SPOT_HOME/bin/spot-agent-sap" license-install /protected/path/license
"$SPOT_HOME/bin/spot-agent-sap" license-check
"$SPOT_HOME/scripts/run-agent.sh"
run-agent.sh keeps the agent in the foreground for supervision by its parent.
If the local validator is unavailable, it starts it and writes its output to
$SPOT_HOME/log/license.out and license.err.
Never pass the online key as a positional argument. Automation can use
--stdin or --key-file with a regular 0600 file. See
Licenses and renewal for status, history, and
encrypted renewal export without a web UI.
Apply configuration changes
For RPM/DEB, edit /etc/spot/.spot-agent-sap.yaml and restart the service. On
portable, every run-agent.sh invocation derives a fresh
$SPOT_HOME/run/spot-agent-sap.yaml from the editable file, publishes it
atomically with mode 0600, and uses the same copy for bootstrap and daemon.
When you save configuration in a local portable suite UI, SPOT serializes the
save and restart. An identical save does not restart a healthy agent. If the
agent cannot stop or start, the UI reports the failure and you can retry the
same save; do not start another agent while an unverifiable PID remains. With
systemd --user or manual startup, restart the supervised process after
editing. Do not delete config/spot-sap-secret.key, data/license, or
data/spot-agent-sap; you do not need to remove the generated runtime file.
When an RPM/DEB configuration reloads, the agent prepares the new namespace's Data Streams first. License evidence and SAP extraction start only afterwards. If bootstrap fails, the service remains failed without creating an incompatible regular index; correct the target and restart it.
Verify the installation
RPM/DEB
sudo -u spot /opt/spot/bin/spot-agent-sap license-status --json
sudo -u spot /opt/spot/bin/spot-agent-sap license-check
sudo -u spot /opt/spot/bin/spot-agent-sap elastic-bootstrap \
--config /etc/spot/.spot-agent-sap.yaml
sudo systemctl enable --now spot-agent-sap.service
sudo systemctl status spot-agent-sap.service --no-pager
sudo journalctl -u spot-agent-sap -n 120 --no-pager
The first start may take up to 3 minutes while bootstrap waits for Elasticsearch and completes its checks. During that interval, systemd keeps the service in the activating state.
Portable
"$SPOT_HOME/bin/spot-agent-sap" license-status --json
"$SPOT_HOME/bin/spot-agent-sap" license-check
test -f "$SPOT_HOME/run/spot-agent-sap.yaml"
tail -n 120 "$SPOT_HOME/log/spot-agent-sap.log"
systemctl --user status spot-license.service spot-agent-sap.service --no-pager
journalctl --user -u spot-agent-sap.service -n 120 --no-pager
The portable launcher runs elastic-bootstrap before the daemon. Invalid
connectivity, authentication, TLS, or mappings make it exit with an error
instead of starting extraction.
Then check Landing/Metrics, Events, Job Monitoring, Certificates, and RFC &
Integrations in the remote SPOT instance. The backend interprets only documents
with schema_version=2; legacy documents are ignored. If the selected target
has no genuine v2 signal, the view shows No data or UNKNOWN according to
its contract. In remote mode, a local connector journal neither authorizes nor
blocks reads from a standalone connector.
Capabilities and security
Each connection probe marks every family as supported, unauthorized,
unavailable, or error. An unavailable family does not block the others. The
RFC user must be read-only:
- dumps include the error, program, user, client, host, and the generic runtime
error description from
SNAPT; they never include the long text of an ST22 instance, memory, or business data; - RFC records include status, destination, queue, function, and error, never payloads;
- certificate records include subject, issuer, serial, fingerprint, PSE/application, and validity, never private keys.
The agent preserves watermarks, overlap, and deduplication. The initial Jobs, dumps, and RFC backfill covers 24 hours.
After upgrading an affected connector, SPOT runs one bounded repair of dump
descriptions retained during the previous 30 days. The repair is separate from
current collection, scoped to each source/client, and appends a deterministic
observation: it does not update or delete historical documents. After a restart
it retries with the same identities, and create-only conflicts are treated as
deduplication. Progress is stored in
/var/lib/spot-agent-sap/dump-description-repair-v2.json, or in portable mode
in $SPOT_HOME/data/spot-agent-sap/dump-description-repair-v2.json. Include it
in state backups and do not edit it to force another replay.
Collections use a fixed frequency, deterministic phases, and a dispatcher bounded to two executions. Metrics, Work Processes, and the long-running-jobs snapshot keep priority; delayed cycles coalesce without a backlog. Jobs and CCMS are paged and Elasticsearch bulks are capped at 500 documents or 8 MiB. The unit limits the agent to two cores, starts memory pressure at 640 MiB, and stops it before 768 MiB.
Backup, upgrade, and rollback
For RPM/DEB, reinstall the same package name with rpm -Uvh or dpkg -i;
configuration, license, journal, and incremental state are preserved. Follow
Upgrade, backup, restore, and uninstall.
For portable:
- Stop the agent and validator or their user units.
- Take a private, verified backup of
configanddata. - Verify the new tar and extract it to a different directory, never over the active tree.
- Migrate only
config/spot-agent-sap.yaml,config/spot-sap-secret.key,data/license, anddata/spot-agent-sapfrom the same installation. - Do not copy
bin,nwrfcsdk,scripts,share, orrunfrom the previous version. - Keep the stable
$HOME/spot-agent-sap-portablepath when using the included units, reload systemd, and start license before the agent. - Validate license, bootstrap, ingestion, and history continuity before retiring the previous version.
Do not clone data/license to another installation: it contains the local
verifiable identity. For rollback, restore the previous binary and its complete
compatible backup.
Uninstall portable
Disable and stop the user units, remove their copies from
$HOME/.config/systemd/user, and run systemctl --user daemon-reload. Archive
config and data first if you need restore or renewal. Remove the portable
tree only after verifying the backup; a correct non-root installation has no
other SPOT paths to clean.
Quick troubleshooting
| Symptom | Check |
|---|---|
| Agent exits before startup | Run license-check and inspect license.err |
| Bootstrap fails | Check URL, authentication mode, CA, namespace, and ILM permissions |
| A portable change is ignored | Stop the agent and regenerate only run/spot-agent-sap.yaml |
| Service stops after logout | Ask for linger on the runtime user |
| SAP library is missing | Recheck the checksum; do not replace nwrfcsdk or wrappers |
| Documents exist but dashboards are empty | Check read scope+namespace, schema_version=2, tenant_id=onprem, exact source_id, and select that SAP target |
| Target reports a conflict | The same source_id exists in two scopes or publishes different SID/client values; correct the connector, not the alias |
| User quality is partial/unknown | Check enabled sources and freshness; it is not a process failure |
No local UI or port 8080 exists | This is correct connector-only behavior |
Do not include configuration, credentials, or complete license responses when collecting evidence. Use sanitized status output and the documented logs.