DeployAja is a platform for deploying applications with managed dependencies like PostgreSQL, Redis, MySQL, RabbitMQ, MongoDB, and more.
curl -sSL https://deployaja.id/setup.sh | bash
Instantly install and launch popular apps with `aja install`
Generate deployment configs with natural language prompts using `aja gen`
Auto-inject connection strings for all dependencies
See deployment costs before you deploy with `aja plan`
Official GitHub Action for automated CI/CD deployments
PostgreSQL, Redis, MySQL, RabbitMQ, MongoDB, and more
From code to production in seconds
Status, logs, and health checks
Override any config value using `--set` flags
Describe pod details, containers, and events
Interactive CLI commands for managing environment variables, `aja env`
Map auto-injected variables to custom application names
# macOS/Linux
curl -sSL https://deployaja.id/setup.sh | bash
# Windows
iwr -useb https://deployaja.id/setup.bat | iex
git clone https://github.com/deployaja/deployaja-cli.git
cd deployaja-cli
go build -o aja main.go
docker pull ghcr.io/deployaja/deployaja-cli/aja
# Install n8n instantly
$ aja install n8n
📦 Installing n8n from marketplace...
✅ Configuration saved to: /path/to/n8n.yaml
💡 Deployment initiated successfully
$ aja status
📊 Deployment Status
NAME STATUS REPLICAS URL LAST DEPLOYED
------------------- ------- -------- ----------------------------------------
n8n-adipati73 running 1/1 https://n8n-adipati73.deployaja.id 2025-06-22 23:04:02
# Install with custom domain
$ aja install n8n --domain my-n8n.example.com
# Install with custom deployment name
$ aja install n8n --name my-workflow-tool
# You can edit the generated configuration
$ vim n8n.yaml
# Deploy the app
$ aja deploy -f n8n.yaml
# 1. Initialize configuration
$ aja init
# 2. Edit deployaja.yaml for your app
$ vim deployaja.yaml
# 3. Login to Aja
$ aja login
# or EXPORT DEPLOYAJA_TOKEN=your-token
# 4. See costs plan
$ aja plan
# 5. Deploy
$ aja deploy
Use the official DeployAja GitHub Action for automated deployments:
See a GitHub Actions demo using DeployAja →
name: Deploy with DeployAja
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy Application
uses: deployaja/deployaja-cli@v1
with:
command: 'deploy'
api-token: ${{ secrets.DEPLOYAJA_API_TOKEN }}
Input | Description | Required | Default |
---|---|---|---|
command | DeployAja command to execute | Yes | status |
api-token | DeployAja API token for authentication | No | - |
config-file | Path to DeployAja configuration file | No | ./deployaja.yaml |
environment | Target environment for deployment | No | production |
project-name | Name of the project to deploy | No | - |
additional-args | Additional arguments to pass to the CLI | No | - |
Output | Description |
---|---|
deployment-id | ID of the created deployment |
deployment-url | URL of the deployed application |
status | Status of the deployment operation |
Command | Description |
---|---|
aja init | Create deployaja.yaml configuration with random Wayang-inspired name |
aja gen PROMPT | Generate deployment configuration using AI based on natural language prompt |
aja validate | Validate configuration file |
aja plan | Show deployment plan and costs |
aja deploy | Deploy application |
aja status | Check deployment health and status |
aja describe NAME | Describe deployment pod details (status, containers, events, etc.) |
aja logs NAME | View application logs |
Command | Description |
---|---|
aja env [edit|set|get] | Manage environment variables |
aja restart NAME | Restart deployment by recreating pods |
aja drop NAME | Delete deployment |
aja rollback NAME | Rollback to previous version |
Command | Description |
---|---|
aja deps [instance] | List available dependencies and versions |
aja login | Authenticate with platform using browser OAuth |
aja config | Show configuration |
aja search QUERY | Search for apps in the marketplace |
aja install APPNAME | Install an app from the marketplace |
aja publish | Publish your app to the marketplace |
aja version | Show CLI version |
# Deploy with configuration overrides
aja deploy --set container.image=nginx:alpine --set resources.replicas=3
# Deploy with custom config file
aja deploy --file my-custom-config.yaml
# Deploy with custom name override
aja deploy --name my-production-app
# Dry run deployment
aja deploy --dry-run
# Follow logs in real-time
aja logs my-app --follow
# Follow logs with specific tail count
aja logs my-app --tail 50 -f
# Check all deployments
aja status
# Describe pod details with events
aja describe my-app
# List dependencies with pricing
aja deps --type database
# Get specific dependency instance details
aja deps my-postgres-instance
# Edit environment variables in vim
aja env edit
# Set environment variable
aja env set DEBUG=true
# Get all environment variables
aja env get
# Get specific environment variable
aja env get DEBUG
# Restart deployment (recreates all pods)
aja restart my-app
# Generate configuration with AI
aja gen "create a nodejs api with postgresql database"
aja gen "docker configuration for wordpress with mysql"
# Search for apps in marketplace
aja search wordpress
aja search "node.js api"
# Install app from marketplace
aja install wordpress
aja install react-app --domain myapp.example.com --name my-react-app
# Publish your app to marketplace
aja publish
The Aja marketplace provides pre-configured applications that you can deploy with a single command.
# Search by name
aja search wordpress
# Search by description
aja search "node.js api"
# Search by category
aja search "blog"
🔍 Searching for: wordpress
✅ Found 3 apps
1 WordPress
A popular content management system
Category: CMS
Author: WordPress.org
Version: 6.4
Downloads: 15420
Rating: 4.8/5.0
Tags: cms, blog, php, mysql
💡 Use 'aja install <app-name>' to install an app
Service | Type | Versions | Auto-Injected Variables |
---|---|---|---|
PostgreSQL | database | 13, 14, 15, 16 | Connection strings and credentials |
MySQL | database | 5.7, 8.0 | Connection strings and credentials |
Redis | cache | 6, 7 | Connection URLs and endpoints |
RabbitMQ | queue | 3.11, 3.12 | Connection URLs and credentials |
MongoDB | database | 5.0, 6.0, 7.0 | Connection strings and credentials |
dependencies:
# PostgreSQL database
- name: "postgres"
type: "database"
version: "15"
storage: "5Gi"
# Redis cache
- name: "cache"
type: "cache"
version: "7"
storage: "1Gi"
# RabbitMQ message queue
- name: "queue"
type: "queue"
version: "3.12"
storage: "2Gi"
# Application metadata
name: "arjuna-23-app" # Required: Application name
description: "My awesome app" # Optional: Description
# Container configuration
container:
image: "node:18-alpine" # Required: Docker image
port: 3000 # Required: Container port
# Resource requirements
resources:
cpu: "500m" # CPU request (millicores)
memory: "1Gi" # Memory request
replicas: 2 # Number of instances
# Dependencies (managed services)
dependencies:
- name: "postgres"
type: "database"
version: "15"
storage: "2Gi"
# Environment variables
env:
- name: "NODE_ENV"
value: "production"
- name: "LOG_LEVEL"
value: "info"
# Environment variable mapping (optional)
envMap:
db_host: APP_DB_HOST # Map POSTGRES_HOST to APP_DB_HOST
db_name: APP_DB_NAME # Map POSTGRES_DATABASE to APP_DB_NAME
db_user: APP_DB_USER # Map POSTGRES_USER to APP_DB_USER
db_password: APP_DB_PASSWORD # Map POSTGRES_PASSWORD to APP_DB_PASSWORD
# Health checks
healthCheck:
path: "/api/health" # Health check endpoint
port: 8080 # Port for health checks
initialDelaySeconds: 60 # Delay before first check
periodSeconds: 30 # Check interval
# Optional: Custom domain
domain: "arjuna23.deployaja.id"
# Optional: Persistent storage
volumes:
- name: "app-storage"
size: "1Gi"
mountPath: "/app/data"
When you deploy the above configuration, your application automatically receives:
# Database connection
POSTGRES_URL=postgresql://user:pass@postgres-myapp.aja.id:5432/myapp_db
JDBC_URL=jdbc:postgresql://postgres-myapp.aja.id:5432/myapp_db
JDBC_URL_NO_AUTH=jdbc:postgresql://postgres-myapp.aja.id:5432/myapp_db
POSTGRES_HOST=postgres-myapp.aja.id
POSTGRES_PORT=5432
POSTGRES_DB=myapp_db
POSTGRES_USER=auto_generated_user
POSTGRES_PASSWORD=auto_generated_password
# Your custom variables
NODE_ENV=production
LOG_LEVEL=info
Detailed explanation of each configuration item in deployaja.yaml
Field | Type | Required | Description | Example |
---|---|---|---|---|
name | string | ✅ Yes | Unique application name. Must be lowercase, alphanumeric with hyphens. Used for DNS and resource naming. | "arjuna-23-app" |
description | string | ❌ No | Human-readable description of your application. Displayed in dashboards and logs. | "My awesome web API" |
Field | Type | Required | Description | Example |
---|---|---|---|---|
container.image | string | ✅ Yes | Docker image reference. Can be from Docker Hub, private registry, or built image. | "node:18-alpine" "ghcr.io/user/app:v1.0" |
container.port | integer | ✅ Yes | Port your application listens on inside the container. Must match your app's listening port. | 3000 , 8080 , 80 |
container.command | array | ❌ No | Override container's default command. Useful for custom startup scripts. | ["npm", "start"] |
container.args | array | ❌ No | Arguments passed to the container command. | ["--port", "3000"] |
Field | Type | Required | Description | Example |
---|---|---|---|---|
resources.cpu | string | ❌ No | CPU request in millicores (m) or cores. Affects pricing and scheduling. | "100m" (0.1 core)"1" (1 core)"2.5" (2.5 cores) |
resources.memory | string | ❌ No | Memory request in bytes (Ki, Mi, Gi). Container will be killed if it exceeds this limit. | "128Mi" "1Gi" "2.5Gi" |
resources.replicas | integer | ❌ No | Number of application instances to run. Higher replicas provide better availability. | 1 (dev)2 (staging)3 (production) |
Field | Type | Required | Description | Example |
---|---|---|---|---|
dependencies[].name | string | ✅ Yes | Unique name for this dependency instance. Used in environment variable names. | "postgres" , "cache" , "queue" |
dependencies[].type | string | ✅ Yes | Type of managed service. Determines available versions and configuration. | "database" , "cache" , "queue" |
dependencies[].version | string | ✅ Yes | Version of the service to deploy. Must be supported by the service type. | "15" (PostgreSQL)"7" (Redis)"3.12" (RabbitMQ) |
dependencies[].storage | string | ✅ Yes | Persistent storage size for the service. Affects pricing and performance. | "1Gi" , "5Gi" , "20Gi" |
dependencies[].backup | boolean | ❌ No | Enable automated backups for the service (databases only). | true , false |
Field | Type | Required | Description | Example |
---|---|---|---|---|
env[].name | string | ✅ Yes | Environment variable name. Should follow UPPER_SNAKE_CASE convention. | "NODE_ENV" , "API_KEY" , "DEBUG" |
env[].value | string | ✅ Yes | Environment variable value. Avoid sensitive data - use secrets instead. | "production" , "info" , "true" |
env[].secret | boolean | ❌ No | Mark as secret. Value will be encrypted and hidden in logs/dashboards. | true (for passwords, API keys) |
The envMap
feature allows you to map auto-injected dependency environment variables
to custom names that your application expects. This is particularly useful for applications like
WordPress that require specific environment variable names.
Field | Type | Required | Description | Example |
---|---|---|---|---|
envMap | object | ❌ No | Map of custom environment variable names to auto-injected dependency variables. | See examples below |
# WordPress example with PostgreSQL dependency
name: "my-wordpress"
container:
image: "wordpress:latest"
port: 80
dependencies:
- name: "postgres"
type: "database"
version: "15"
storage: "5Gi"
# Map auto-injected variables to WordPress-expected names
envMap:
db_host: WORDPRESS_DB_HOST
db_name: WORDPRESS_DB_NAME
db_user: WORDPRESS_DB_USER
db_password: WORDPRESS_DB_PASSWORD
db_pass: WORDPRESS_DB_PASSWORD
When you define an envMap
, DeployAja will:
POSTGRES_HOST
, POSTGRES_USER
)You can map from any auto-injected dependency variable:
# For PostgreSQL dependency named "postgres"
POSTGRES_HOST # Database hostname
POSTGRES_PORT # Database port
POSTGRES_DATABASE # Database name
POSTGRES_USER # Database username
POSTGRES_PASSWORD # Database password
POSTGRES_URL # Full connection string
JDBC_URL # JDBC connection string
JDBC_URL_NO_AUTH # JDBC connection string without embedded credentials
# For Redis dependency named "cache"
REDIS_HOST # Redis hostname
REDIS_PORT # Redis port
REDIS_URL # Full connection string
WORDPRESS_DB_*
formatDB_HOST
, DB_DATABASE
, DB_USERNAME
, DB_PASSWORD
SPRING_DATASOURCE_URL
# Spring Boot app with PostgreSQL
name: "my-spring-app"
container:
image: "openjdk:17-jre"
port: 8080
dependencies:
- name: "postgres"
type: "postgresql"
storage_size: 5
# Map JDBC URL for Spring Boot
envMap:
jdbc_url: SPRING_DATASOURCE_URL
jdbc_url_no_auth: SPRING_DATASOURCE_URL_NO_AUTH
db_user: SPRING_DATASOURCE_USERNAME
db_pass: SPRING_DATASOURCE_PASSWORD
DeployAja automatically injects connection information for all dependencies:
# For PostgreSQL dependency named "postgres"
POSTGRES_URL=postgresql://user:pass@host:5432/db
JDBC_URL=jdbc:postgresql://postgres-service.aja.id:5432/app_db
JDBC_URL_NO_AUTH=jdbc:postgresql://postgres-service.aja.id:5432/app_db
POSTGRES_HOST=postgres-service.aja.id
POSTGRES_PORT=5432
POSTGRES_DATABASE=app_db
POSTGRES_USER=generated_user
POSTGRES_PASSWORD=generated_password
# For Redis dependency named "cache"
REDIS_URL=redis://cache-service.aja.id:6379
REDIS_HOST=cache-service.aja.id
REDIS_PORT=6379
Field | Type | Required | Description | Example |
---|---|---|---|---|
healthCheck.path | string | ❌ No | HTTP endpoint path for health checks. Should return 200 OK when healthy. | "/health" , "/api/status" , "/ping" |
healthCheck.port | integer | ❌ No | Port for health check requests. Usually same as container.port. | 3000 , 8080 |
healthCheck.initialDelaySeconds | integer | ❌ No | Seconds to wait before first health check. Allow time for app startup. | 30 (fast apps)60 (Java/heavy apps) |
healthCheck.periodSeconds | integer | ❌ No | Seconds between health check attempts. | 10 (frequent)30 (normal) |
healthCheck.timeoutSeconds | integer | ❌ No | Seconds to wait for health check response before timing out. | 5 , 10 |
healthCheck.failureThreshold | integer | ❌ No | Number of consecutive failures before marking as unhealthy. | 3 (default)5 (tolerant) |
Field | Type | Required | Description | Example |
---|---|---|---|---|
domain | string | ❌ No | Custom domain for your application. Auto-generates subdomain if not specified. | "myapp.example.com" "api.mycompany.com" |
ssl | boolean | ❌ No | Enable automatic SSL certificate generation. Always enabled for custom domains. | true (default) |
arjuna-23-app.deployaja.id
myapp.deployaja.id
api.yourcompany.com
(requires DNS setup)Field | Type | Required | Description | Example |
---|---|---|---|---|
volumes[].name | string | ✅ Yes | Unique name for the volume. Used for identification and management. | "app-storage" , "uploads" , "logs" |
volumes[].size | string | ✅ Yes | Storage size for the volume. Affects pricing. | "1Gi" , "10Gi" , "50Gi" |
volumes[].mountPath | string | ✅ Yes | Path inside container where volume is mounted. Must be absolute path. | "/app/data" , "/uploads" , "/var/log" |
volumes[].accessMode | string | ❌ No | Volume access mode. ReadWriteOnce for single pod, ReadWriteMany for multiple. | "ReadWriteOnce" (default)"ReadWriteMany" |
# Clear stored token and re-authenticate
rm ~/.deployaja/token
aja login
# Check deployment status
aja status
# Get detailed pod information and events
aja describe my-app
# View logs for errors
aja logs my-app --tail=100
# Follow logs in real-time for debugging
aja logs my-app -f
# Validate configuration
aja validate
# Enable verbose logging
export AJA_DEBUG=true
aja deploy
We welcome contributions! Here's how to get started with development:
# Clone repository
git clone https://github.com/deployaja/deployaja-cli.git
cd deployaja-cli
# Install dependencies
go mod tidy
# Run tests
go test ./...
# Build
go build -o aja main.go
# Run
./aja --help
Variable | Description | Default |
---|---|---|
DEPLOYAJA_TOKEN | API token for authentication | - |
DEPLOYAJA_API_TOKEN | Alternative API token variable | - |
AJA_DEBUG | Enable debug logging | false |
NO_COLOR | Disable colored output | false |
# Example right-sized configuration
resources:
cpu: "100m" # Start small
memory: "128Mi" # Scale up as needed
replicas: 1 # Single instance for dev