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 the DigitalOcean API (snapshot + destroy) to save costs. It runs as a systemd service and uses psutil for rich local metric collection.
Installation
pip install mocea
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 = "api" # "api" | "shutdown"
# 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 |
|---|---|
| api | Direct DO API: snapshot then destroy (default, requires DO_API_TOKEN) |
| shutdown | Simple shutdown -h now (no snapshot, for disposable droplets) |
Safety
- Minimum uptime: Won't terminate within first 10 minutes after boot
- Dry-run mode:
--dry-runlogs 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-heartbeatto 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
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 mocea-1.2.1.tar.gz.
File metadata
- Download URL: mocea-1.2.1.tar.gz
- Upload date:
- Size: 19.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
086ccbad9cef5b8f3d535197b52077a257172b62f358a6692db219e91922b14a
|
|
| MD5 |
ee726b586ad978467efd36d3603e4a72
|
|
| BLAKE2b-256 |
2aee068531fafbf75595bfe6fdd049f24ae9874ace3520da6b0172d866f60aeb
|
File details
Details for the file mocea-1.2.1-py3-none-any.whl.
File metadata
- Download URL: mocea-1.2.1-py3-none-any.whl
- Upload date:
- Size: 24.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ad9fe5ff3c2213db6e18e1a6c19545b9323d1b4a1aaf0076209f5566e1b9d1b
|
|
| MD5 |
98539b4d92484be99ff9f302b5b8ea8f
|
|
| BLAKE2b-256 |
3581794782f43012921237654358450ff785883c84ac69497e9488d4f956e361
|