Universal deployment tool for container applications. Deploy to any cloud provider using any IaC tool.
OmniDeploy separates where you deploy (targets) from how you provision (backends):
Backend (HOW to provision)
┌─────────┬─────────┬───────────┐
│ Pulumi │ CDK │ Terraform │
┌───────────┼─────────┼─────────┼───────────┤
│ LightSail │ ✓ │ - │ - │
Target │ ECS │ - │ - │ - │
(WHERE) │ AgentCore │ - │ - │ - │
│ Kubernetes│ - │ - │ - │
└───────────┴─────────┴─────────┴───────────┘
go install github.com/plexusone/omnideploy/cmd/omnideploy@latest# Using OmniAgent config
omnideploy up \
--config omniagent.yaml \
--target lightsail \
--backend pulumi \
--stack prod
# Preview changes first
omnideploy preview --config omniagent.yaml
# Destroy when done
omnideploy destroy --stack prod --yesCreate a deploy.yaml:
name: my-api
region: us-east-1
container:
image: nginx:latest
ports:
- container_port: 80
protocol: HTTP
service:
replicas: 1
public: true
resources:
size: micro # nano, micro, small, medium, large, xlargeDeploy:
omnideploy up --config deploy.yamlOmniDeploy auto-detects OmniAgent configurations and extracts deployment settings:
# omniagent.yaml
gateway:
address: "0.0.0.0:18789"
agent:
provider: anthropic
model: claude-sonnet-4-20250514
api_key: ${ANTHROPIC_API_KEY}
# Deployment settings (omnideploy-specific)
deploy:
name: omniagent-prod
region: us-east-1
image: ghcr.io/plexusone/omniagent:latest
replicas: 1
resources:
size: micro
environment:
LOG_LEVEL: infoFull configuration reference:
name: my-service # Required: deployment name
version: "1.0.0" # Optional: version tag
region: us-east-1 # AWS region
container:
image: nginx:latest # Required: container image
command: [] # Optional: entrypoint override
args: [] # Optional: command arguments
ports:
- container_port: 80 # Required: port number
protocol: HTTP # HTTP, HTTPS, TCP, UDP
name: http # Optional: port name
health_check:
path: /health # Health check endpoint
interval: 30s # Check interval
timeout: 5s # Check timeout
healthy_threshold: 2 # Consecutive successes needed
unhealthy_threshold: 3 # Consecutive failures needed
service:
replicas: 1 # Number of instances
public: true # Publicly accessible
domains: # Custom domains
- api.example.com
resources:
size: micro # nano, micro, small, medium, large, xlarge
environment: # Environment variables
LOG_LEVEL: info
DATABASE_URL: ${DB_URL}
tags: # Resource tags
environment: production
team: platform# Deploy or update
omnideploy up --config <file> [--target <target>] [--backend <backend>] [--stack <name>] [--yes]
# Preview changes
omnideploy preview --config <file> [--target <target>] [--backend <backend>]
# Destroy stack
omnideploy destroy --stack <name> [--yes]
# List available components
omnideploy targets # List deployment targets
omnideploy backends # List IaC backends
omnideploy runtimes # List runtime adapters| Flag | Short | Description | Default |
|---|---|---|---|
--config |
-c |
Config file path | - |
--target |
-t |
Deployment target | lightsail |
--backend |
-b |
IaC backend | pulumi |
--runtime |
-r |
Runtime adapter (auto-detected) | - |
--stack |
-s |
Stack name | config name |
Cost-effective container hosting with simple scaling.
Resource Sizes:
| Size | vCPU | Memory | Price/month |
|---|---|---|---|
| nano | 0.25 | 512 MB | ~$7 |
| micro | 0.5 | 1 GB | ~$10 |
| small | 1 | 2 GB | ~$25 |
| medium | 2 | 4 GB | ~$50 |
| large | 4 | 8 GB | ~$100 |
| xlarge | 8 | 16 GB | ~$200 |
Uses Pulumi Automation API with local state storage.
Requirements:
- AWS credentials configured (
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) - Pulumi CLI installed (optional, for advanced operations)
State Location: ~/.omnideploy/pulumi/
Auto-detects OmniAgent configurations and maps:
- Gateway port → container port
- Agent config → environment variables
- Deploy section → resources and replicas
Generic container deployments using the full OmniDeploy config schema.
| Variable | Description |
|---|---|
AWS_ACCESS_KEY_ID |
AWS access key |
AWS_SECRET_ACCESS_KEY |
AWS secret key |
AWS_REGION |
Default AWS region |
OMNIDEPLOY_WORK_DIR |
Pulumi state directory |
package mytarget
import "github.com/plexusone/omnideploy/target"
func init() {
target.Register(&MyTarget{})
}
type MyTarget struct{}
func (t *MyTarget) Name() string { return "mytarget" }
func (t *MyTarget) Description() string { return "My custom target" }
func (t *MyTarget) Validate(cfg *config.DeployConfig) error { ... }
func (t *MyTarget) ResourceSpec(cfg *config.DeployConfig) (*target.ResourceSpec, error) { ... }package mybackend
import "github.com/plexusone/omnideploy/backend"
func init() {
backend.Register(&MyBackend{})
}
type MyBackend struct{}
func (b *MyBackend) Name() string { return "mybackend" }
func (b *MyBackend) Apply(ctx context.Context, spec *target.ResourceSpec, opts backend.ApplyOptions) (*backend.Result, error) { ... }MIT