Skip to content

Deploying applications

Complete examples for creating and managing deployments on Akash Network using the Python SDK.

Overview

Deployments on Akash Network follow a specific lifecycle:

Deployment Creation:

graph LR
    A[Create SDL] --> B[Validate SDL]
    B --> C[Create Deployment]

Market Interaction:

graph LR
    D[Wait for Bids] --> E["Create Lease (Accept Bid)"]

Deployment Management:

graph LR
    G[Upload Manifest] --> H[Monitor Deployment]
    H --> J[Update/Close]

Basic deployments

Simple web server

from akash import AkashClient, AkashWallet

def deploy_nginx():
    """Deploy a basic Nginx web server"""

    wallet = AkashWallet.from_mnemonic("your mnemonic here")
    client = AkashClient("https://akash-rpc.polkachu.com:443")

    sdl_content = '''
version: "2.0"
services:
  web:
    image: nginx:latest
    expose:
      - port: 80
        as: 80
        to:
          - global: true
profiles:
  compute:
    web:
      resources:
        cpu:
          units: 0.5
        memory:
          size: 512Mi
        storage:
          size: 1Gi
  placement:
    akash:
      attributes:
        host: akash
      pricing:
        web:
          denom: uakt
          amount: 1000
deployment:
  web:
    akash:
      profile: web
      count: 1
'''

    result = client.deployment.create_deployment(
        sdl_yaml=sdl_content,
        wallet=wallet,
        deposit="500000"
    )

    if result.success:
        print(f"Deployment created: DSEQ {result.dseq}")
        print(f"Transaction: {result.tx_hash}")
        return result
    else:
        print(f"Deployment failed: {result.raw_log}")
        return None

deployment = deploy_nginx()

API reference

See Deployment API for SDL validation, deployment creation, and lifecycle management

Database deployment

from akash import AkashClient, AkashWallet

def deploy_database():
    """Deploy a PostgreSQL database"""

    wallet = AkashWallet.from_mnemonic("your mnemonic here")
    client = AkashClient("https://akash-rpc.polkachu.com:443")

    sdl_content = '''
version: "2.0"
services:
  database:
    image: postgres:14
    env:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=secure123
      - PGDATA=/var/lib/postgresql/data/pgdata
    expose:
      - port: 5432
        as: 5432
        to:
          - global: true
profiles:
  compute:
    database:
      resources:
        cpu:
          units: 1.0
        memory:
          size: 2Gi
        storage:
          - size: 10Gi
            attributes:
              persistent: true
              class: beta2
  placement:
    akash:
      attributes:
        host: akash
      pricing:
        database:
          denom: uakt
          amount: 5000
deployment:
  database:
    akash:
      profile: database
      count: 1
'''

    result = client.deployment.create_deployment(
        sdl_yaml=sdl_content,
        wallet=wallet,
        deposit="5000000"
    )

    if result.success:
        print(f"Database deployment created: DSEQ {result.dseq}")
        print(f"Transaction: {result.tx_hash}")
        return result
    else:
        print(f"Database deployment failed: {result.raw_log}")
        return None

deployment = deploy_database()

USDC deployment

from akash import AkashClient, AkashWallet

def deploy_with_usdc():
    """Deploy using USDC denom"""

    wallet = AkashWallet.from_mnemonic("your mnemonic here")
    client = AkashClient("https://akash-rpc.polkachu.com:443", "akashnet-2")

    USDC_DENOM = "ibc/170C677610AC31DF0904FFE09CD3B5C657492170E7E52372E48756B71E56F2F1"

    sdl_content = '''
version: "2.0"
services:
  web:
    image: nginx:latest
    expose:
      - port: 80
        as: 80
        to:
          - global: true
profiles:
  compute:
    web:
      resources:
        cpu:
          units: 0.5
        memory:
          size: 512Mi
        storage:
          size: 1Gi
  placement:
    akash:
      attributes:
        host: akash
      pricing:
        web:
          denom: ibc/170C677610AC31DF0904FFE09CD3B5C657492170E7E52372E48756B71E56F2F1
          amount: 500000  
deployment:
  web:
    akash:
      profile: web
      count: 1
'''

    result = client.deployment.create_deployment(
        sdl_yaml=sdl_content,
        wallet=wallet,
        deposit="5000000",           
        deposit_denom=USDC_DENOM,   
        fee_amount="7000"           
    )

    if result.success:
        print(f"USDC deployment created: DSEQ {result.dseq}")
        print(f"Transaction: {result.tx_hash}")
        return result
    else:
        print(f"Deployment failed: {result.raw_log}")
        return None

deployment = deploy_with_usdc()

Denomination matching

The deposit_denom parameter must exactly match the denom in your SDL pricing section.

Market interaction

Waiting for bids

from akash import AkashClient, AkashWallet
import time

def wait_for_bids(client, owner, dseq, timeout=300):
    """Wait for bids on a deployment"""
    start_time = time.time()

    while time.time() - start_time < timeout:
        bids = client.market.get_bids(owner=owner, dseq=dseq)

        if bids:
            print(f"Received {len(bids)} bids!")
            for bid in bids:
                print(f"Provider: {bid['bid_id']['provider']}")
                print(f"Price: {bid['price']['amount']} {bid['price']['denom']}")
                print(f"State: {bid['state']}")
            return bids

        print("Waiting for bids...")
        time.sleep(10)

    raise TimeoutError("No bids received within timeout period")

bids = wait_for_bids(client, wallet.address, dseq)

API reference

See Market API for bid listing, lease creation, and market operations

Selecting and accepting bids

from akash import AkashClient, AkashWallet

def select_best_bid(client, bids):
    """Select the best bid based on price and provider validation"""
    if not bids:
        return None

    print("Validating provider endpoints...")
    provider_addresses = [b['bid_id']['provider'] for b in bids]
    valid_providers = client.provider.filter_valid_providers(provider_addresses)

    valid_bids = [b for b in bids if b['bid_id']['provider'] in valid_providers]
    if not valid_bids:
        print("No valid providers found")
        return None

    bids_by_price = sorted(valid_bids, key=lambda b: float(b['price']['amount']))

    print("Valid bid comparison:")
    for i, bid in enumerate(bids_by_price, 1):
        print(f"{i}. Provider: {bid['bid_id']['provider']}")
        print(f"Price: {bid['price']['amount']} {bid['price']['denom']}")
        print(f"State: {bid['state']}")

    return bids_by_price[0] if bids_by_price else None

def accept_bid(client, bid, wallet):
    """Accept a bid and create a lease"""
    print(f"Accepting bid from {bid['bid_id']['provider']}")

    lease_result = client.market.create_lease_from_bid(wallet, bid)

    if lease_result["success"]:
        print(f"Lease created: TX {lease_result['tx_hash']}")
        print(f"Provider endpoint: {lease_result['provider_endpoint']}")
        return lease_result
    else:
        print(f"Lease creation failed: {lease_result['error']}")
        return None

best_bid = select_best_bid(client, bids)
if best_bid:
    lease = accept_bid(client, best_bid, wallet)

Deployment monitoring

Monitor status and get URIs

from akash import AkashClient, AkashWallet

def monitor_deployment(client, owner, dseq):
    """Monitor deployment status and get service information"""
    deployments = client.deployment.get_deployments(owner=owner)
    deployment = next((d for d in deployments if d['deployment']['deployment_id']['dseq'] == str(dseq)), None)

    if deployment:
        print(f"Deployment status: {deployment['deployment']['state']}")
        print(f"DSEQ: {deployment['deployment']['deployment_id']['dseq']}")
        print(f"Owner: {deployment['deployment']['deployment_id']['owner']}")

    leases = client.market.get_leases(owner=owner, dseq=dseq)

    for lease in leases:
        print(f"\nLease: {lease['lease_id']['provider']}")
        print(f"State: {lease['state']}")
        print(f"Price: {lease['price']['amount']} {lease['price']['denom']}")

        if lease['state'] == "active":
            try:
                provider_info = client.provider.get_providers()
                provider = next((p for p in provider_info if p['owner'] == lease['lease_id']['provider']), None)
                if provider:
                    print(f"Provider endpoint: {provider['host_uri']}")
            except Exception as e:
                print(f"Could not get provider info: {e}")

monitor_deployment(client, wallet.address, dseq)

Access deployment logs

from akash import AkashClient, AkashWallet

def get_deployment_logs(client, provider_endpoint, lease_id, service_name="web", follow=False):
    """Get logs from a deployment service"""
    try:
        if follow:
            print(f"Following logs for {service_name}...")
            for log_line in client.deployment.stream_service_logs(
                provider_endpoint=provider_endpoint,
                lease_id=lease_id,
                service_name=service_name,
                follow=True
            ):
                print(f"[{service_name}] {log_line}")
        else:
            logs = client.deployment.get_service_logs(
                provider_endpoint=provider_endpoint,
                lease_id=lease_id,
                service_name=service_name,
                tail=100
            )
            print(f"Recent logs for {service_name}:")
            for log_line in logs:
                print(f"[{service_name}] {log_line}")

    except Exception as e:
        print(f"Error getting logs: {e}")

get_deployment_logs(client, provider_endpoint, lease_id, "web")

get_deployment_logs(client, provider_endpoint, lease_id, "web", follow=True)

Complete deployment workflow

Deploy nginx with full lifecycle

from akash import AkashClient, AkashWallet
import time

def complete_deployment_example():
    """Complete deployment workflow from start to running application"""

    wallet = AkashWallet.from_mnemonic("your mnemonic here")
    client = AkashClient("https://akash-rpc.polkachu.com:443")

    print("Step 1: Ensuring certificate")
    success, cert_pem, key_pem = client.cert.ensure_certificate(wallet)
    if not success:
        print("Certificate setup failed")
        return None

    print("Step 2: Creating deployment from SDL...")
    sdl_content = '''
version: "2.0"
services:
  web:
    image: nginx:latest
    expose:
      - port: 80
        as: 80
        to:
          - global: true
profiles:
  compute:
    web:
      resources:
        cpu:
          units: 0.1
        memory:
          size: 128Mi
        storage:
          size: 512Mi
  placement:
    akash:
      attributes:
        host: akash
      pricing:
        web:
          denom: uakt
          amount: 1000
deployment:
  web:
    akash:
      profile: web
      count: 1
'''

    deployment_result = client.deployment.create_deployment(
        sdl_yaml=sdl_content,
        wallet=wallet,
        deposit="500000"
    )

    if not deployment_result.success:
        print(f"Deployment failed: {deployment_result.raw_log}")
        return None

    dseq = deployment_result.dseq
    print(f"Deployment created: DSEQ {dseq}")
    print(f"Transaction: {deployment_result.tx_hash}")

    print("Step 3: Waiting for bids...")
    time.sleep(30)

    bids = client.market.get_bids(owner=wallet.address, dseq=dseq)
    if not bids:
        print("No bids received")
        return None

    print("Step 4: Selecting best validated provider...")
    provider_addresses = [b['bid_id']['provider'] for b in bids]
    valid_providers = client.provider.filter_valid_providers(provider_addresses)

    if not valid_providers:
        print("No valid providers found")
        return None

    valid_bids = [b for b in bids if b['bid_id']['provider'] in valid_providers]
    best_bid = min(valid_bids, key=lambda b: float(b['price']['amount']))

    provider = best_bid['bid_id']['provider']
    print(f"Best bid from provider: {provider}")

    print("Step 5: Creating lease...")
    lease_result = client.market.create_lease_from_bid(wallet, best_bid)

    if not lease_result["success"]:
        print(f"Lease creation failed: {lease_result['error']}")
        return None

    print(f"Lease created: TX {lease_result['tx_hash']}")
    provider_endpoint = lease_result['provider_endpoint']

    print("Step 6: Submitting manifest to provider...")
    lease_id = lease_result['lease_id']

    manifest_result = client.manifest.submit_manifest(
        provider_endpoint=provider_endpoint,
        lease_id=lease_id,
        sdl_content=sdl_content,
        cert_pem=cert_pem,
        key_pem=key_pem
    )

    if manifest_result["status"] != "success":
        print(f"Manifest submission failed: {manifest_result['error']}")
        return None

    print(f"Manifest submitted via {manifest_result.get('method', 'HTTP')}")
    print("Your nginx application is now starting...")

    print("Step 7: Waiting for application to start...")
    time.sleep(60)  # Give nginx time to boot

    print("Step 8: Retrieving application logs...")
    try:
        logs = client.deployment.get_service_logs(
            provider_endpoint=provider_endpoint,
            lease_id=lease_id,
            tail=10
        )
        print(f"Retrieved {len(logs)} log lines:")
        for log in logs:
            print(f"{log}")
    except Exception as e:
        print(f"Log retrieval note: {e}")

    print("Step 9: Streaming live logs for 60 seconds...")
    try:
        log_count = 0
        for log_line in client.deployment.stream_service_logs(
            provider_endpoint=provider_endpoint,
            lease_id=lease_id,
            follow=True,
            timeout=60
        ):
            print(f"[LIVE] {log_line}")
            log_count += 1
            if log_count >= 10:
                print("   (stopping after 10 lines for demo)")
                break
    except Exception as e:
        print(f"Live log streaming note: {e}")

    print("\n" + "="*60)
    print("Deployment complete! Your nginx server is running.")
    print(f"DSEQ: {dseq}")
    print(f"Provider: {provider}")
    print(f"Provider endpoint: {provider_endpoint}")
    print("="*60)

    return {
        "dseq": dseq,
        "provider": provider,
        "provider_endpoint": provider_endpoint,
        "lease_id": lease_id
    }

if __name__ == "__main__":
    complete_deployment_example()

Deployment management

Update existing deployment

from akash import AkashClient, AkashWallet
import time

def update_deployment_example():
    """Update an existing deployment with new configuration"""

    wallet = AkashWallet.from_mnemonic("your mnemonic here")
    client = AkashClient("https://akash-rpc.polkachu.com:443")

    dseq = 12345
    provider_endpoint = "https://provider.europlots.com:8443"
    lease_id = {
        "dseq": str(dseq),
        "gseq": 1,
        "oseq": 1
    }

    success, cert_pem, key_pem = client.cert.ensure_certificate(wallet)
    if not success:
        print("Certificate setup failed")
        return None

    updated_sdl_content = '''
version: "2.0"
services:
  web:
    image: nginx:1.21
    command: ["/bin/sh", "-c", "echo 'Updated container' && nginx -g 'daemon off;'"]
    env:
      - NGINX_WORKER_PROCESSES=auto
      - UPDATE_VERSION=v2
    expose:
      - port: 80
        as: 80
        to:
          - global: true
profiles:
  compute:
    web:
      resources:
        cpu:
          units: 0.2
        memory:
          size: 256Mi
        storage:
          size: 1Gi
  placement:
    akash:
      pricing:
        web:
          denom: uakt
          amount: 1500
deployment:
  web:
    akash:
      profile: web
      count: 1
'''

    print("Step 1: Updating deployment on-chain...")

    update_result = client.deployment.update_deployment(
        wallet=wallet,
        sdl_yaml=updated_sdl_content,
        owner=wallet.address,
        dseq=dseq,
        fee_amount="5000"
    )

    if not update_result.success:
        print(f"Deployment update failed: {update_result.raw_log}")
        return None

    print(f"Deployment updated on-chain: tx {update_result.tx_hash}")
    time.sleep(10)

    print("\nStep 2: Submitting updated manifest to provider...")

    manifest_result = client.manifest.submit_manifest(
        provider_endpoint=provider_endpoint,
        lease_id=lease_id,
        sdl_content=updated_sdl_content,
        cert_pem=cert_pem,
        key_pem=key_pem
    )

    if manifest_result['status'] != 'success':
        print(f"Manifest submission failed: {manifest_result.get('error')}")
        return None

    print("Updated manifest submitted successfully!")
    print(f"Method: {manifest_result.get('method')}")

    return update_result

update_result = update_deployment_example()

Two-step update process

Updating a deployment requires two steps:

  1. Update on-chain: Call update_deployment() to update the version hash on the blockchain
  2. Submit manifest: Send the updated manifest to the provider(s) using submit_manifest()

The provider validates that the manifest version hash matches the on-chain deployment version before applying changes.

Query deployment manifest

from akash import AkashClient, AkashWallet
import time

def query_manifest_example():
    """Query manifest from provider to verify deployment configuration"""

    wallet = AkashWallet.from_mnemonic("your mnemonic here")
    client = AkashClient("https://akash-rpc.polkachu.com:443")

    dseq = 12345
    provider_endpoint = "https://provider.europlots.com:8443"
    lease_id = {
        "dseq": str(dseq),
        "gseq": 1,
        "oseq": 1
    }

    success, cert_pem, key_pem = client.cert.ensure_certificate(wallet)
    if not success:
        print("Certificate setup failed")
        return None

    print("Querying manifest from provider...")
    time.sleep(10)  

    result = client.manifest.get_deployment_manifest(
        provider_endpoint=provider_endpoint,
        lease_id=lease_id,
        cert_pem=cert_pem,
        key_pem=key_pem
    )

    if result["status"] == "success":
        print(f"Provider version: {result['provider_version']}")
        print(f"Query method: {result['method']}")

        manifest = result["manifest"]
        print(f"\nRetrieved manifest with {len(manifest)} groups")

        for group in manifest:
            print(f"\nGroup: {group['name']}")
            for service in group['services']:
                print(f" Service: {service['name']}")
                print(f" Image: {service['image']}")
                if 'command' in service:
                    print(f" Command: {service['command']}")
                if 'env' in service:
                    print(f" Environment: {service['env']}")

                resources = service['resources']
                cpu_val = resources['cpu']['units']['val']
                mem_val = resources['memory']['size']['val']
                print(f" CPU: {cpu_val} millicores")
                print(f" Memory: {int(mem_val) / (1024**2):.0f}Mi")

                if 'expose' in service:
                    print(f" Exposed ports:")
                    for expose in service['expose']:
                        print(f"  Port {expose['port']} -> {expose['externalPort']} ({expose['proto']})")
    else:
        print(f"Failed to get manifest: {result['error']}")

    return result

query_result = query_manifest_example()

API reference

See Manifest API for manifest parsing, validation, and provider operations

Provider-stored manifests

Manifests are stored in the provider's Kubernetes cluster, NOT on the blockchain. The blockchain only stores resource requirements (CPU, memory, storage, GPU). The get_deployment_manifest() function retrieves the full manifest from the provider via HTTP API, with automatic version detection for both modern and legacy providers.

Close deployment

from akash import AkashClient, AkashWallet

def close_deployment(client, owner, dseq, wallet):
    """Close a deployment and all associated leases"""
    print("Closing deployment...")

    leases = client.market.get_leases(owner=owner, dseq=dseq)

    for lease in leases:
        if lease['state'] == "active":
            print(f"Closing lease with {lease['lease_id']['provider']}")
            close_result = client.market.close_lease(
                wallet=wallet,
                lease_id=lease['lease_id']
            )
            if close_result.success:
                print(f"Lease closed: TX {close_result.tx_hash}")

    close_result = client.deployment.close_deployment(
        wallet=wallet,
        owner=owner,
        dseq=dseq
    )

    if close_result.success:
        print(f"Deployment closed successfully: TX {close_result.tx_hash}")
    else:
        print(f"Deployment closure failed: {close_result.raw_log}")

close_deployment(client, wallet.address, dseq, wallet)