A powerful, modular workflow automation platform with encrypted secrets management, REST APIs, and multiple user interfaces.
- Overview
- Architecture
- Features
- Prerequisites
- Quick Start
- Docker Images
- Usage
- Workflow Examples
- Configuration
- Contributing
Open Automator is a comprehensive workflow automation system designed for DevOps, data pipelines, and integration tasks. It provides:
- YAML-based workflow definitions with conditional branching
- Encrypted secrets management (Wallet system with Fernet encryption)
- Multiple interfaces: CLI, REST API, FastAPI WebUI, Streamlit Dashboard
- Modular task system for easy extensibility
- Centralized workflow management with execution history
- Docker-first architecture for portability and scalability
Open Automator consists of 4 microservices that can be deployed independently or together:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Open Automator Platform β
βββββββββββββββββββ¬βββββββββββββββββββ¬βββββββββββββββ¬ββββββββββ€
β Wallet β Streamlit UI β FastAPI β Shell β
β Service β Dashboard β WebUI β CLI β
β β β β β
β Port: N/A β Port: 8501/8502 β Port: 8000 β N/A β
β (Utility) β (Frontend) β (API) β (Tool) β
βββββββββββββββββββ΄βββββββββββββββββββ΄βββββββββββββββ΄ββββββββββ
β β β β
βββββββββββββββββββ΄ββββββββββββββββββ΄ββββββββββββ
β
Shared Volumes:
- /app/workflows (YAML definitions)
- /app/data (secrets, state)
- /app/logs (execution logs)
| Component | Docker Image | Purpose |
|---|---|---|
| Wallet | lordraw/open-automator-wallet |
Encrypted secrets management utility |
| Streamlit | lordraw/open-automator-streamlit |
Interactive web dashboard for workflow management and api |
| FastAPI | lordraw/open-automator-fastapi |
REST API server for programmatic access |
| Shell | lordraw/open-automator-shell |
CLI tool for direct workflow execution |
- β Workflow Engine: YAML-based task orchestration with conditional branching
- π Secure Secrets: Encrypted wallet (PBKDF2 + Fernet) or plain JSON for development
- π Task Chaining: Pass outputs between tasks automatically
- π Execution Tracking: Full history with results, duration, and error logs
- π§© Modular Design: Easy to add custom task modules
- π Multiple Interfaces: Choose CLI, REST API, FastAPI WebUI, or Streamlit
- π³ Docker Native: All components containerized for easy deployment
- Parallel Execution: Configurable concurrent workflow limit
- WebSocket Support: Real-time execution updates (FastAPI)
- Workflow Visualization: Mermaid diagrams in Streamlit UI
- Environment Placeholders:
${ENV:VAR},${WALLET:key},${VAULT:key} - Task Store: Persistent result storage across executions
- CORS Enabled: API ready for frontend integration
- Docker 20.10+ and Docker Compose 1.29+
- Python 3.8+ (for local development)
- Git (to clone repository)
git clone https://github.com/lordraw77/open-automator.git
cd open-automatormkdir -p workflows data logsCreate workflows/hello.yaml:
name: hello_world
description: Simple hello world workflow
variables:
MESSAGE: "Hello from Open Automator!"
tasks:
- name: print_message
module: oautils
function: print_text
text: "${MESSAGE}"
on_success: enddocker-compose up -d- Streamlit Dashboard: http://localhost:8501
- Streamlit API: http://localhost:8502
- FastAPI WebUI: http://localhost:8000/docs
- Health Check: http://localhost:8000/health
Via Streamlit: Open browser β Select workflow β Click "Execute"
Via API:
curl "http://localhost:8502/?WORKFLOW=op-deploydata.yaml"Via REST API:
curl -X 'POST' \
'http://localhost:8000/api/workflows/wf_20260103155033/execute' \
-H 'accept: application/json' \
-d ''Via CLI:
docker exec open-automator-shell python automator.py workflows/hello.yamlAll images are available on Docker Hub: lordraw/open-automator-*
docker pull lordraw/open-automator-wallet:latest
docker pull lordraw/open-automator-streamlit:latest
docker pull lordraw/open-automator-fastapi:latest
docker pull lordraw/open-automator-shell:latest# Build all images
./buildWellet.sh # Wallet utility
./buildStreamlit.sh # Streamlit UI
./buildFastapi.sh # FastAPI server
./buildShell.sh # CLI tool
# Or build specific image
docker build -f Dockerfile.streamlit -t lordraw/open-automator-streamlit:latest .name: data_pipeline
description: Extract, transform, load data
variables:
API_URL: "https://api.example.com/data"
DB_HOST: "${ENV:DATABASE_HOST}"
DB_PASSWORD: "${WALLET:db_password}"
tasks:
- name: fetch_data
module: oahttp
function: get_request
url: "${API_URL}"
on_success: transform_data
on_failure: notify_error
- name: transform_data
module: oautils
function: process_json
on_success: save_to_db
on_failure: notify_error
- name: save_to_db
module: oadatabase
function: insert_records
host: "${DB_HOST}"
password: "${DB_PASSWORD}"
on_success: end
on_failure: notify_error
- name: notify_error
module: oanotify
function: send_alert
message: "Pipeline failed"
on_success: end# Interactive mode
docker exec -it open-automator-wallet python wallet.py create
# Programmatic mode
docker exec open-automator-wallet python -c "
from wallet import Wallet
wallet = Wallet('data/wallet.enc')
secrets = {
'api_key': 'sk-1234567890',
'db_password': 'supersecret',
'oauth_token': 'ya29.xxxxx'
}
wallet.create_wallet(secrets, 'my_master_password')
"Configure via .env file or docker-compose.yml:
# Wallet Configuration
OA_WALLET_FILE=/app/data/wallet.enc
OA_WALLET_PASSWORD=your_master_password
# API Configuration
FASTAPI_PORT=8000
FASTAPI_HOST=0.0.0.0
MAX_CONCURRENT_JOBS=5
# Streamlit Configuration
STREAMLIT_SERVER_PORT=8501
STREAMLIT_SERVER_ADDRESS=0.0.0.0
# Paths
OA_WORKFLOWS_DIR=/app/workflows
OA_DATA_DIR=/app/data
OA_LOGS_DIR=/app/logs
# Logging
OA_LOG_LEVEL=INFOtasks:
- name: get_weather
module: oahttp
function: get_request
url: "https://api.openweathermap.org/data/2.5/weather"
params:
q: "London"
appid: "${WALLET:weather_api_key}"
on_success: parse_response
- name: parse_response
module: oautils
function: extract_field
field: "main.temp"
on_success: send_notification
- name: send_notification
module: oanotify
function: send_email
to: "user@example.com"
subject: "Weather Update"
on_success: endtasks:
- name: read_csv
module: oafiles
function: read_csv
filepath: "/app/data/input.csv"
on_success: filter_rows
- name: filter_rows
module: oadataframe
function: filter
condition: "age > 18"
on_success: write_output
- name: write_output
module: oafiles
function: write_json
filepath: "/app/data/output.json"
on_success: endtasks:
- name: check_status
module: oahttp
function: get_request
url: "https://status.example.com/health"
on_success: process_success
on_failure: trigger_alert
- name: process_success
module: oautils
function: log_message
message: "Service is healthy"
on_success: end
- name: trigger_alert
module: oanotify
function: send_alert
severity: "critical"
message: "Service is down!"
on_success: endversion: '3.8'
services:
fastapi:
image: lordraw/open-automator-fastapi:latest
container_name: open-automator-api
ports:
- "8000:8000"
environment:
- FASTAPI_PORT=8000
- OA_WALLET_FILE=/app/data/wallet.enc
- OA_WALLET_PASSWORD=changeme
- MAX_CONCURRENT_JOBS=10
volumes:
- ./workflows:/app/workflows
- ./data:/app/data
- ./logs:/app/logs
streamlit:
image: lordraw/open-automator-streamlit:latest
container_name: open-automator-ui
ports:
- "8501:8501"
environment:
- STREAMLIT_SERVER_PORT=8501
- OA_WORKFLOWS_DIR=/app/workflows
volumes:
- ./workflows:/app/workflows
- ./data:/app/data
- ./logs:/app/logs
shell:
image: lordraw/open-automator-shell:latest
container_name: open-automator-cli
stdin_open: true
tty: true
volumes:
- ./workflows:/app/workflows
- ./data:/app/data
- ./logs:/app/logsopen-automator/
βββ automator.py # Core workflow engine
βββ workflow_manager.py # Centralized execution manager
βββ wallet.py # Secrets management
βββ api_server.py # Flask API (legacy)
βββ oa-webui.py # FastAPI server
βββ streamlit_app.py # Streamlit dashboard
βββ modules/ # Task modules
β βββ oahttp.py # HTTP requests
β βββ oautils.py # Utilities
β βββ oadatabase.py # Database operations
β βββ ...
βββ Dockerfile.wallet # Wallet image
βββ Dockerfile.streamlit # Streamlit image
βββ Dockerfile.fastapi # FastAPI image
βββ Dockerfile.shell # Shell image
βββ VERSION # version file
visit Extending-Modules for detailed instructions.
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is open source and available under the MIT License.
- Docker Hub: lordraw/open-automator-*
- GitHub: github.com/lordraw77/open-automator
- Issues: GitHub Issues
For questions and support:
- Open an issue on GitHub
- Check existing discussions
- Review documentation in
wiki
Built with β€οΈ for the automation community