Monitor batch pipelines via API and email alerts — install and deploy on Linux servers from PyPI
Project description
inferyx-monitoring
Batch pipeline monitor with email alerts and Admin UI.
Install directory: /opt/pipeline-monitor
Admin URL: https://<your-host>/monitoring/admin/ (nginx required)
PyPI: inferyx-monitoring
Quick reference
| Task | Command |
|---|---|
| Fresh install | See Install from scratch |
| Upgrade | pip install --upgrade → release.sh upgrade --skip-pip |
| Uninstall | release.sh uninstall --skip-pip |
| Remove everything | release.sh uninstall --purge --skip-pip |
| Service status | sudo systemctl status inferyx-monitoring |
| Logs | sudo journalctl -u inferyx-monitoring -n 50 |
Maintainer build docs: docs/DEVELOPMENT.md (not for server operators).
Prerequisites
| Requirement | Notes |
|---|---|
| OS | Ubuntu 22.04+ (or Debian with apt) |
| Python | 3.10+ (python3, python3-venv) |
| User | inferyx system user (created by install script) |
| nginx | Reverse proxy for /monitoring/admin/ and /monitoring/api/ |
| Network | SMTP, Inferyx API, Google OAuth and/or AWS IDC SAML |
Install from scratch
Step 1 — Install Python package
Replace VERSION with the target release (e.g. 1.0.51):
export VERSION=1.0.51
export IM_HOME=/opt/pipeline-monitor
sudo mkdir -p "$IM_HOME"
sudo useradd --system --home-dir "$IM_HOME" --shell /usr/sbin/nologin inferyx 2>/dev/null || true
sudo -u inferyx python3 -m venv "$IM_HOME/.venv"
sudo -u inferyx "$IM_HOME/.venv/bin/pip" install --upgrade pip
sudo -u inferyx "$IM_HOME/.venv/bin/pip" install "inferyx-monitoring==${VERSION}"
Or from a local wheel:
sudo -u inferyx "$IM_HOME/.venv/bin/pip" install /path/to/inferyx_monitoring-${VERSION}-py3-none-any.whl
Step 2 — Run install script
sudo bash "$IM_HOME/.venv/share/inferyx-monitoring/release.sh" install --skip-pip
This creates:
| Path | Purpose |
|---|---|
/opt/pipeline-monitor/.env |
SMTP, API, alert settings |
/opt/pipeline-monitor/auth.policy |
Admin UI, OAuth, paths |
/opt/pipeline-monitor/batch_file.csv |
Batch schedules |
/opt/pipeline-monitor/secrets/ |
session_secret, OAuth secrets |
/opt/pipeline-monitor/www/ |
Admin UI static files |
/opt/pipeline-monitor/logs/ |
Monitor log |
inferyx-monitoring.service |
systemd unit |
Step 3 — Configure
sudo nano /opt/pipeline-monitor/.env
sudo nano /opt/pipeline-monitor/auth.policy
sudo nano /opt/pipeline-monitor/batch_file.csv
Secrets (never commit):
sudo mkdir -p /opt/pipeline-monitor/secrets
sudo openssl rand -hex 32 | sudo tee /opt/pipeline-monitor/secrets/session_secret
sudo chmod 600 /opt/pipeline-monitor/secrets/*
sudo chown -R inferyx:inferyx /opt/pipeline-monitor
.env templates: inferyx_pipeline_monitor/data/.env.example (in package: .venv/.../data/)
auth.policy: set ui.public_base_url, login providers, and paths under /opt/pipeline-monitor.
AWS IAM Identity Center (SAML 2.0)
Choose SAML 2.0 (not OAuth) when creating the AWS IDC application.
| AWS console field | auth.policy key |
Example |
|---|---|---|
| Application ACS URL | acs_url |
https://devops.inferyx.com/monitoring/api/auth/callback/aws_idc |
| Application SAML audience | entity_id |
https://devops.inferyx.com/monitoring |
| IAM Identity Center SAML issuer URL | idp_entity_id |
from IDC metadata |
| IAM Identity Center sign-in URL | idp_sso_url |
from IDC metadata |
| IDC certificate | idp_certificate_path |
/opt/pipeline-monitor/secrets/aws_idc_idp.crt |
"aws_idc": {
"enabled": true,
"entity_id": "https://devops.inferyx.com/monitoring",
"acs_url": "https://devops.inferyx.com/monitoring/api/auth/callback/aws_idc",
"idp_entity_id": "https://portal.sso.<region>.amazonaws.com/saml/assertion/<id>",
"idp_sso_url": "https://portal.sso.<region>.amazonaws.com/saml/assertion/<id>",
"idp_certificate_path": "/opt/pipeline-monitor/secrets/aws_idc_idp.crt",
"allowed_domains": ["inferyx.com"]
}
SP metadata (optional download for AWS setup):
https://devops.inferyx.com/monitoring/api/auth/saml/aws_idc/metadata
Google Workspace stays on OAuth 2.0 (auth.google).
Step 4 — nginx
sudo cp /opt/pipeline-monitor/.venv/share/inferyx-monitoring/nginx.conf.example \
/etc/nginx/sites-available/pipeline-monitor
sudo ln -sf /etc/nginx/sites-available/pipeline-monitor /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Edit server_name and SSL paths in the nginx file for production.
Step 5 — Verify
sudo systemctl status inferyx-monitoring
curl -s http://127.0.0.1:8090/api/health
curl -s http://127.0.0.1:8090/api/ui/status
Open https://<your-host>/monitoring/admin/ in a browser.
Upgrade
export VERSION=1.0.51 # new version
export IM_HOME=/opt/pipeline-monitor
sudo -u inferyx "$IM_HOME/.venv/bin/pip" install --upgrade "inferyx-monitoring==${VERSION}"
sudo bash "$IM_HOME/.venv/share/inferyx-monitoring/release.sh" upgrade --skip-pip
Upgrade without service restart:
sudo bash "$IM_HOME/.venv/share/inferyx-monitoring/release.sh" upgrade --skip-pip --no-restart
The upgrade script:
- Deploys new Admin UI to
/opt/pipeline-monitor/www/ - Merges new
.envkeys (existing values kept) - Updates systemd unit
- Restarts
inferyx-monitoringservice
Your config is never overwritten: .env secrets, batch_file.csv rows, and auth.policy values stay as-is unless you edit them.
Uninstall / remove
Stop service, keep config
Keeps /opt/pipeline-monitor (.env, CSV, secrets, logs):
sudo bash /opt/pipeline-monitor/.venv/share/inferyx-monitoring/release.sh uninstall --skip-pip
Remove everything
Deletes /opt/pipeline-monitor entirely:
sudo bash /opt/pipeline-monitor/.venv/share/inferyx-monitoring/release.sh uninstall --purge --skip-pip
Manual cleanup (optional)
# nginx
sudo rm -f /etc/nginx/sites-enabled/pipeline-monitor
sudo rm -f /etc/nginx/sites-available/pipeline-monitor
sudo nginx -t && sudo systemctl reload nginx
# service user (only if nothing else uses it)
sudo userdel inferyx 2>/dev/null || true
Reinstall from scratch
After --purge, repeat Install from scratch.
Configuration files
| File | Template | Description |
|---|---|---|
.env |
data/.env.example |
SMTP, API token, alert tuning |
batch_file.csv |
data/batch_file.csv.example |
Batch names and schedules |
auth.policy |
release/auth.policy.example |
Admin UI, OAuth, file paths |
All paths in auth.policy should point under /opt/pipeline-monitor/ on the server.
Batch CSV
Required columns: Name, Frequency
Optional: ExpectedStartTime, AvgExecutionTime, ExpectedDayOfMonth, Status (Active / Suspended)
Scheduled (Daily, Hourly, Weekly, …)
Name,Frequency,ExpectedStartTime,AvgExecutionTime,ExpectedDayOfMonth,Status
payroll_job,Daily,9:00:00,"30 mins",,Active
Alerts: missed, failed, stuck, no_data
On-demand (runtime trigger)
Name,Frequency,ExpectedStartTime,AvgExecutionTime,ExpectedDayOfMonth,Status
manual_export,OnDemand,,"30 mins",,Active
Use OnDemand (or Adhoc, Manual, Unscheduled). Leave start time empty.
AvgExecutionTime enables stuck alerts (API start + avg + grace).
Polling uses CHECK_WINDOW_MINUTES windows, not 24/7.
Continuous (always-on)
Name,Frequency,ExpectedStartTime,AvgExecutionTime,ExpectedDayOfMonth,Status
stream_job,Continuous,,,,Active
Alerts: failed and no_data only.
Alert tuning (.env)
Key variables (full list in .env.example):
| Variable | Default | Purpose |
|---|---|---|
PIPELINE_CHECK_MODE |
schedule_windows |
Poll in short windows vs continuous |
PIPELINE_CHECK_WINDOW_MINUTES |
10 |
Poll window length |
PIPELINE_SCHEDULE_GRACE_MINUTES |
5 |
Delay before missed/stuck alerts |
PIPELINE_ALERT_ONCE_PER_DAY_ALL_SCENARIOS |
true |
One new email per issue per day |
PIPELINE_ALERT_REPLY_TO_THREAD |
false |
Follow-ups as reply-all in same thread |
Test email threading:
sudo -u inferyx /opt/pipeline-monitor/.venv/bin/inferyx-monitoring --test-mail-thread
Troubleshooting
| Symptom | Fix |
|---|---|
No such file ... release.sh |
Run pip install inferyx-monitoring first |
| Service restart loop | Check .env — journalctl -u inferyx-monitoring -n 50 |
nginx 404 on /monitoring/admin/ |
Use nginx.conf.example; check ui_base_path in auth.policy |
| Admin UI "Unavailable" | curl http://127.0.0.1:8090/api/ui/status |
| Missed vs no_data | Empty API after schedule → missed; API error → no_data |
| OAuth / SAML login fails | Google: match redirect_uri. AWS IDC: use SAML 2.0; match acs_url / entity_id; check IdP cert file |
See CHANGELOG.md.
Service commands
sudo systemctl start inferyx-monitoring
sudo systemctl stop inferyx-monitoring
sudo systemctl restart inferyx-monitoring
sudo systemctl status inferyx-monitoring
sudo journalctl -u inferyx-monitoring -f
Or via package CLI:
sudo -u inferyx /opt/pipeline-monitor/.venv/bin/inferyx-monitoring-ctl status
sudo -u inferyx /opt/pipeline-monitor/.venv/bin/inferyx-monitoring-ctl restart
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file inferyx_monitoring-1.0.56.tar.gz.
File metadata
- Download URL: inferyx_monitoring-1.0.56.tar.gz
- Upload date:
- Size: 183.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
04ac1e3f63568c0d0b968a6ee036c1647aa344aecc2fd1e17de9b81730de44ec
|
|
| MD5 |
aad34f3dd9ffb12acc0d7853ea307ef2
|
|
| BLAKE2b-256 |
571f828f4ac68070405cb0610041f41bcd3d1ddd86153ee3ae014e45515248fe
|
File details
Details for the file inferyx_monitoring-1.0.56-py3-none-any.whl.
File metadata
- Download URL: inferyx_monitoring-1.0.56-py3-none-any.whl
- Upload date:
- Size: 195.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b1aa080e1e5658b6f2fb64cc7b9340609df9ef03876db99f979507b223c4abc1
|
|
| MD5 |
62f0d038e89dd87ca9ed37ff103a13d2
|
|
| BLAKE2b-256 |
5a26527d07ddf735dfe3d8e4f00b445433945d7c9bcba63503f7b66849dfed5a
|