Deploy in seconds, not hours

DeployAja is a platform for deploying applications with managed dependencies like PostgreSQL, Redis, MySQL, RabbitMQ, MongoDB, and more.

Quick Install
curl -sSL https://deployaja.id/setup.sh | bash
Get Started Explore Marketplace

✨ Features

Quick Deploy from Marketplace

Instantly install and launch popular apps with `aja install`

🤖

AI Configuration Generation

Generate deployment configs with natural language prompts using `aja gen`

🎯

Managed Configuration

Auto-inject connection strings for all dependencies

💰

Cost Forecasting

See deployment costs before you deploy with `aja plan`

🐙

GitHub Actions Integration

Official GitHub Action for automated CI/CD deployments

🔧

Managed Dependencies

PostgreSQL, Redis, MySQL, RabbitMQ, MongoDB, and more

🚀

One Command Deploy

From code to production in seconds

📊

Real-time Monitoring

Status, logs, and health checks

🔄

Configuration Overrides

Override any config value using `--set` flags

🔍

Pod Inspection

Describe pod details, containers, and events

🔧

Environment Management

Interactive CLI commands for managing environment variables, `aja env`

🔄

Variable Mapping

Map auto-injected variables to custom application names

🚀 Quick Start

Installation

Download Binary (Recommended)

# macOS/Linux
curl -sSL https://deployaja.id/setup.sh | bash

# Windows
iwr -useb https://deployaja.id/setup.bat | iex

Build from Source

git clone https://github.com/deployaja/deployaja-cli.git
cd deployaja-cli
go build -o aja main.go

Using Docker

docker pull ghcr.io/deployaja/deployaja-cli/aja

Deploy APP from marketplace

# 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

Deploy Your Own App

# 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

GitHub Actions Integration

Use the official DeployAja GitHub Action for automated deployments:

See a GitHub Actions demo using DeployAja →

Quick Start

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 }}          
      

Action Inputs

InputDescriptionRequiredDefault
commandDeployAja command to executeYesstatus
api-tokenDeployAja API token for authenticationNo-
config-filePath to DeployAja configuration fileNo./deployaja.yaml
environmentTarget environment for deploymentNoproduction
project-nameName of the project to deployNo-
additional-argsAdditional arguments to pass to the CLINo-

Action Outputs

OutputDescription
deployment-idID of the created deployment
deployment-urlURL of the deployed application
statusStatus of the deployment operation

🔧 Commands

Core Commands

CommandDescription
aja initCreate deployaja.yaml configuration with random Wayang-inspired name
aja gen PROMPTGenerate deployment configuration using AI based on natural language prompt
aja validateValidate configuration file
aja planShow deployment plan and costs
aja deployDeploy application
aja statusCheck deployment health and status
aja describe NAMEDescribe deployment pod details (status, containers, events, etc.)
aja logs NAMEView application logs

Management Commands

CommandDescription
aja env [edit|set|get]Manage environment variables
aja restart NAMERestart deployment by recreating pods
aja drop NAMEDelete deployment
aja rollback NAMERollback to previous version

Utility Commands

CommandDescription
aja deps [instance]List available dependencies and versions
aja loginAuthenticate with platform using browser OAuth
aja configShow configuration
aja search QUERYSearch for apps in the marketplace
aja install APPNAMEInstall an app from the marketplace
aja publishPublish your app to the marketplace
aja versionShow CLI version

Command Examples

# 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

🏪 Marketplace

The Aja marketplace provides pre-configured applications that you can deploy with a single command.

Searching Apps

# 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

Available App Categories

  • CMS: Content Management Systems (WordPress, Drupal, etc.)
  • E-commerce: Online stores (WooCommerce, Shopify, etc.)
  • Blog: Blogging platforms (Ghost, Jekyll, etc.)
  • API: Backend APIs (Node.js, Python, Go, etc.)
  • Frontend: Single Page Applications (React, Vue, Angular, etc.)
  • Database: Database applications (phpMyAdmin, pgAdmin, etc.)
  • Monitoring: Monitoring tools (Grafana, Prometheus, etc.)
  • Development: Development tools (GitLab, Jenkins, etc.)

🗃️ Supported Dependencies

ServiceTypeVersionsAuto-Injected Variables
PostgreSQLdatabase13, 14, 15, 16Connection strings and credentials
MySQLdatabase5.7, 8.0Connection strings and credentials
Rediscache6, 7Connection URLs and endpoints
RabbitMQqueue3.11, 3.12Connection URLs and credentials
MongoDBdatabase5.0, 6.0, 7.0Connection strings and credentials

Dependency Configuration Examples

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"

⚙️ Configuration Example

deployaja.yaml

# 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"

Auto-Injected Environment Variables

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

📋 Configuration Reference

Detailed explanation of each configuration item in deployaja.yaml

📝 Application Metadata

FieldTypeRequiredDescriptionExample
namestring✅ YesUnique application name. Must be lowercase, alphanumeric with hyphens. Used for DNS and resource naming."arjuna-23-app"
descriptionstring❌ NoHuman-readable description of your application. Displayed in dashboards and logs."My awesome web API"

🐳 Container Configuration

FieldTypeRequiredDescriptionExample
container.imagestring✅ YesDocker image reference. Can be from Docker Hub, private registry, or built image."node:18-alpine"
"ghcr.io/user/app:v1.0"
container.portinteger✅ YesPort your application listens on inside the container. Must match your app's listening port.3000, 8080, 80
container.commandarray❌ NoOverride container's default command. Useful for custom startup scripts.["npm", "start"]
container.argsarray❌ NoArguments passed to the container command.["--port", "3000"]

⚡ Resource Requirements

FieldTypeRequiredDescriptionExample
resources.cpustring❌ NoCPU request in millicores (m) or cores. Affects pricing and scheduling."100m" (0.1 core)
"1" (1 core)
"2.5" (2.5 cores)
resources.memorystring❌ NoMemory request in bytes (Ki, Mi, Gi). Container will be killed if it exceeds this limit."128Mi"
"1Gi"
"2.5Gi"
resources.replicasinteger❌ NoNumber of application instances to run. Higher replicas provide better availability.1 (dev)
2 (staging)
3 (production)

Resource Guidelines

  • Development: cpu: "100m", memory: "128Mi", replicas: 1
  • Staging: cpu: "500m", memory: "512Mi", replicas: 2
  • Production: cpu: "1", memory: "1Gi", replicas: 3+

🗃️ Dependencies (Managed Services)

FieldTypeRequiredDescriptionExample
dependencies[].namestring✅ YesUnique name for this dependency instance. Used in environment variable names."postgres", "cache", "queue"
dependencies[].typestring✅ YesType of managed service. Determines available versions and configuration."database", "cache", "queue"
dependencies[].versionstring✅ YesVersion of the service to deploy. Must be supported by the service type."15" (PostgreSQL)
"7" (Redis)
"3.12" (RabbitMQ)
dependencies[].storagestring✅ YesPersistent storage size for the service. Affects pricing and performance."1Gi", "5Gi", "20Gi"
dependencies[].backupboolean❌ NoEnable automated backups for the service (databases only).true, false

Supported Service Types

  • database: PostgreSQL, MySQL, MongoDB
  • cache: Redis, Memcached
  • queue: RabbitMQ, Apache Kafka
  • search: Elasticsearch (coming soon)

🔧 Environment Variables

FieldTypeRequiredDescriptionExample
env[].namestring✅ YesEnvironment variable name. Should follow UPPER_SNAKE_CASE convention."NODE_ENV", "API_KEY", "DEBUG"
env[].valuestring✅ YesEnvironment variable value. Avoid sensitive data - use secrets instead."production", "info", "true"
env[].secretboolean❌ NoMark as secret. Value will be encrypted and hidden in logs/dashboards.true (for passwords, API keys)

🔄 Environment Variable Mapping (envMap)

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.

FieldTypeRequiredDescriptionExample
envMapobject❌ NoMap of custom environment variable names to auto-injected dependency variables.See examples below

Configuration Example

# 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

How envMap Works

When you define an envMap, DeployAja will:

  • Auto-inject the standard dependency variables (e.g., POSTGRES_HOST, POSTGRES_USER)
  • Create additional environment variables with your custom names
  • Map values from the auto-injected variables to your custom names

Available Source Variables

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

Common Use Cases

  • WordPress: Maps database variables to WORDPRESS_DB_* format
  • Laravel: Maps to DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD
  • Django: Maps to application-specific database settings
  • Spring Boot/Java: Maps JDBC URL to SPRING_DATASOURCE_URL
  • Legacy Apps: Maps to existing environment variable conventions

Java/Spring Boot Example

# 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

Auto-Injected Variables

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

🏥 Health Checks

FieldTypeRequiredDescriptionExample
healthCheck.pathstring❌ NoHTTP endpoint path for health checks. Should return 200 OK when healthy."/health", "/api/status", "/ping"
healthCheck.portinteger❌ NoPort for health check requests. Usually same as container.port.3000, 8080
healthCheck.initialDelaySecondsinteger❌ NoSeconds to wait before first health check. Allow time for app startup.30 (fast apps)
60 (Java/heavy apps)
healthCheck.periodSecondsinteger❌ NoSeconds between health check attempts.10 (frequent)
30 (normal)
healthCheck.timeoutSecondsinteger❌ NoSeconds to wait for health check response before timing out.5, 10
healthCheck.failureThresholdinteger❌ NoNumber of consecutive failures before marking as unhealthy.3 (default)
5 (tolerant)

🌐 Domain Configuration

FieldTypeRequiredDescriptionExample
domainstring❌ NoCustom domain for your application. Auto-generates subdomain if not specified."myapp.example.com"
"api.mycompany.com"
sslboolean❌ NoEnable automatic SSL certificate generation. Always enabled for custom domains.true (default)

Domain Examples

  • Auto-generated: arjuna-23-app.deployaja.id
  • Custom subdomain: myapp.deployaja.id
  • Your domain: api.yourcompany.com (requires DNS setup)

💾 Persistent Storage (Volumes)

FieldTypeRequiredDescriptionExample
volumes[].namestring✅ YesUnique name for the volume. Used for identification and management."app-storage", "uploads", "logs"
volumes[].sizestring✅ YesStorage size for the volume. Affects pricing."1Gi", "10Gi", "50Gi"
volumes[].mountPathstring✅ YesPath inside container where volume is mounted. Must be absolute path."/app/data", "/uploads", "/var/log"
volumes[].accessModestring❌ NoVolume access mode. ReadWriteOnce for single pod, ReadWriteMany for multiple."ReadWriteOnce" (default)
"ReadWriteMany"

Volume Use Cases

  • File Uploads: Store user-uploaded files persistently
  • Application Logs: Persist logs beyond container lifecycle
  • Database Files: Store SQLite or other file-based databases
  • Cache Data: Persist cache data across deployments

📋 Validation Rules

  • name: Required, 3-63 characters, lowercase alphanumeric with hyphens, must start/end with alphanumeric
  • container.image: Required, valid Docker image reference (registry/image:tag)
  • container.port: Required, integer between 1-65535
  • resources.cpu: Valid CPU units (e.g., "100m", "0.5", "2")
  • resources.memory: Valid memory units (e.g., "128Mi", "1Gi", "2.5Gi")
  • dependencies[].type: Must be supported type (database, cache, queue)
  • dependencies[].version: Must be available version for the service type
  • volumes[].mountPath: Must be absolute path starting with "/"

🔍 Troubleshooting

Common Issues

Authentication Errors

# Clear stored token and re-authenticate
rm ~/.deployaja/token
aja login

Deployment Failures

# 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

Debug Mode

# Enable verbose logging
export AJA_DEBUG=true
aja deploy

🛠️ Development

Contributing

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
  • Cobra - CLI framework
  • Viper - Configuration management
  • Color - Colored terminal output
  • Browser - Browser launching for OAuth
  • UUID - UUID generation

⚙️ Environment Variables & Configuration

Environment Variables

VariableDescriptionDefault
DEPLOYAJA_TOKENAPI token for authentication-
DEPLOYAJA_API_TOKENAlternative API token variable-
AJA_DEBUGEnable debug loggingfalse
NO_COLORDisable colored outputfalse

💰 Cost Optimization Tips

  • Right-size Resources: Start with minimal CPU and memory, scale up as needed
  • Optimize Dependencies: Use appropriate storage sizes for your workload
  • Use Cost Planning: Always run `aja plan` to check costs before deployment
  • Monitor Usage: Regular monitoring helps identify optimization opportunities
# Example right-sized configuration
resources:
  cpu: "100m"     # Start small
  memory: "128Mi" # Scale up as needed
  replicas: 1     # Single instance for dev