Skip to main content

Idle droplet monitor and auto-terminator.

Project description

mocea

Idle droplet monitor and auto-terminator.

mocea (Monitoring and Management of digital OCEA droplets) is a lightweight agent that runs on a DigitalOcean droplet, detects when it's idle, and auto-terminates it (via ocea down --terminate) to save costs. It runs as a systemd service and uses psutil for rich local metric collection.

Installation

pip install mocea

For the direct DO API action (optional):

pip install mocea[do]

Quick Start

# Test the checks
mocea check

# Start in foreground with dry-run
mocea run --dry-run --idle-minutes 5

# Install as systemd service
sudo mocea install

CLI Commands

mocea run          Start the monitoring agent
mocea check        Run all checks once and display results
mocea status       Show service status and current check results
mocea config       Show active configuration
mocea cloudinit    Generate cloud-init user-data for droplet bootstrap
mocea install      Install mocea as a systemd service
mocea uninstall    Remove mocea systemd service

mocea run

Options:
  -c, --config PATH       Config file path
  --idle-minutes INTEGER  Override idle timeout (minutes)
  --dry-run               Log actions but don't execute
  --log-level [DEBUG|INFO|WARNING]

Configuration

Config file: /etc/mocea/config.toml (or ~/.config/mocea/config.toml)

idle_minutes = 30
check_interval = 60
min_uptime_minutes = 10

[checks.cpu]
enabled = true
threshold = 5.0          # percent, below = idle

[checks.process]
enabled = true
names = ["python", "ffmpeg", "jupyter"]

[checks.ssh]
enabled = true

[checks.load]
enabled = false
threshold = 0.3

[checks.network]
enabled = false
threshold_kbps = 10
# interface = "eth0"      # omit for all non-loopback interfaces

[checks.gpu]
enabled = false

[checks.heartbeat]
enabled = false
file = "/tmp/mocea-heartbeat"
stale_minutes = 15

[action]
type = "shutdown"         # "ocea" | "api" | "shutdown"

# Optional: ocea action settings
# [action.ocea]
# binary = "ocea"         # path to ocea binary (auto-detected if on PATH)

# Optional: api action settings
# [action.api]
# snapshot_before_destroy = true

[logging]
level = "INFO"
# file = "/var/log/mocea.log"  # omit for stdout only

Priority: CLI flags > config file > defaults.

Checks

Check Signal Idle when
cpu psutil.cpu_percent() Below threshold (default 5%)
process psutil.process_iter() No configured process names running
ssh psutil.net_connections() port 22 No ESTABLISHED SSH sessions
load psutil.getloadavg() 1-min load below threshold (default 0.3)
network psutil.net_io_counters() Throughput below threshold (default 10 KB/s)
gpu nvidia-smi GPU utilization below threshold (default 5%)
heartbeat File mtime File missing or stale (default 15 min)

All enabled checks must report idle (AND logic) for the entire idle_minutes duration before the action triggers.

Actions

Action Description
ocea Runs ocea down --terminate <id> (preferred, triggers snapshot pipeline)
api Direct DO API: snapshot then destroy (requires pip install mocea[do])
shutdown Simple shutdown -h now (no snapshot)

Safety

  • Minimum uptime: Won't terminate within first 10 minutes after boot
  • Dry-run mode: --dry-run logs what would happen without executing
  • Lock file: Prevents multiple instances
  • Fail-safe: If a check errors, it's treated as "active" (keeps running)
  • Heartbeat file: Any process can touch /tmp/mocea-heartbeat to prevent termination

Managing the Systemd Service

Once installed with sudo mocea install, mocea runs as a standard systemd service called mocea.service. Here's how to manage it.

Checking Status

# mocea's built-in status (service + check results)
sudo mocea status

# Or use systemctl directly
sudo systemctl status mocea.service

Viewing Logs

mocea logs to the systemd journal. Use journalctl to read them:

# Recent logs
sudo journalctl -u mocea.service -n 50

# Follow logs in real time (like tail -f)
sudo journalctl -u mocea.service -f

# Logs since last boot
sudo journalctl -u mocea.service -b

# Logs from the last hour
sudo journalctl -u mocea.service --since "1 hour ago"

Stopping and Starting

# Stop mocea (it will restart on next boot since it's still enabled)
sudo systemctl stop mocea.service

# Start it again
sudo systemctl start mocea.service

# Restart (stop + start)
sudo systemctl restart mocea.service

Disabling and Re-enabling

"Enabled" means mocea starts automatically on boot. "Disabled" means it won't.

# Stop AND prevent auto-start on boot
sudo systemctl disable --now mocea.service

# Re-enable auto-start (and start it now)
sudo systemctl enable --now mocea.service

Updating mocea

After upgrading the mocea package (e.g. pip install --upgrade mocea), restart the service to pick up the new code:

sudo systemctl restart mocea.service

If the mocea binary path changed (e.g. you recreated the virtualenv), reinstall the service:

sudo mocea uninstall
sudo /path/to/new/venv/bin/mocea install

Uninstalling

sudo mocea uninstall

This stops the service, disables it, and removes the unit file.

Troubleshooting

Symptom Command What to look for
Service won't start sudo journalctl -u mocea.service -n 30 Python errors, missing config
Exit code 203/EXEC cat /etc/systemd/system/mocea.service ExecStart must be an absolute path; reinstall with sudo mocea install
Service keeps restarting sudo systemctl status mocea.service Shows restart count and exit code
Not sure if running sudo systemctl is-active mocea.service Prints active or inactive

The service is configured to restart automatically on failure after a 30-second delay. If it keeps crashing, check the logs with journalctl.

Cloud-Init Bootstrap

Generate cloud-init user-data to auto-install mocea on new droplets:

mocea cloudinit > user-data.yaml

Development

git clone https://github.com/ksteptoe/mocea.git
cd mocea
make bootstrap    # Create venv and install dependencies
make test         # Run tests
make lint         # Run linter
make format       # Format code

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mocea-1.1.6.tar.gz (19.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mocea-1.1.6-py3-none-any.whl (25.7 kB view details)

Uploaded Python 3

File details

Details for the file mocea-1.1.6.tar.gz.

File metadata

  • Download URL: mocea-1.1.6.tar.gz
  • Upload date:
  • Size: 19.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for mocea-1.1.6.tar.gz
Algorithm Hash digest
SHA256 38afca077f57bc5119152f5512c3affd2e49c836f2e5c2b5f97fcb4679fc2998
MD5 9d65746915806be2880984cb13137e01
BLAKE2b-256 633c1eb5fc54d82c94ddbdd47a4cb256706cba6bbf167509e2639bafeb7e5548

See more details on using hashes here.

File details

Details for the file mocea-1.1.6-py3-none-any.whl.

File metadata

  • Download URL: mocea-1.1.6-py3-none-any.whl
  • Upload date:
  • Size: 25.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for mocea-1.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 71241b31b8ba39d97f8b55f698ce932450cfec34491bfd82931bbdba76c96569
MD5 b29897b4ed0623fd394940f92512ff5e
BLAKE2b-256 2358e18892ee7ae08f61af23c7dbfbd0d4f1d24047585f6e087c6486624afde2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page