> ## Documentation Index
> Fetch the complete documentation index at: https://o1.network/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Deploying first app

# Deploying Your First Application

This guide walks you through deploying your first application using O1's powerful deployment capabilities. We'll deploy **Anvil**, a popular Ethereum development node, as our example.

## Prerequisites

* O1 backend service running (see [Getting Started](../getting-started))
* At least one node configured and accessible
* SSH keys configured for the target node

## Step 1: Verify Your Environment

First, ensure your O1 environment is ready:

```bash theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
# Check if O1 is running
curl http://localhost:3000/health

# List available nodes
curl http://localhost:3000/api/nodes

# Verify node connectivity
curl -X POST http://localhost:3000/api/nodes/verify \
  -H "Content-Type: application/json" \
  -d '{"name": "your-node-name"}'
```

## Step 2: Create the Application Specification

Before deploying, we need to create an application specification. Let's create a spec for Anvil:

```bash theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
curl -X POST http://localhost:3000/api/applications/create \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Anvil",
    "basic_info": {
      "description": "A fast local Ethereum development node from Foundry"
    },
    "installation": {
      "setup_type": "dual",
      "binary": {
        "url": "https://github.com/foundry-rs/foundry/releases/download/v1.0.0/anvil-linux-amd64",
        "executable": "anvil"
      },
      "docker": {
        "image": "ghcr.io/foundry-rs/foundry:latest"
      }
    },
    "configuration": {
      "config_files": [
        {
          "filename": "config.yaml",
          "content": "server:\n  port: {anvil_port}\n  host: {anvil_host}",
          "destinationPath": "/etc/anvil/config.yaml"
        }
      ],
      "environment_variables": [
        {
          "key": "ANVIL_IP_ADDR",
          "value": "{anvil_host}"
        }
      ]
    }
  }'
```

## Step 3: Check Available Deployment Modes

Anvil supports both Docker and binary deployments. Let's check what's available:

```bash theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
curl http://localhost:3000/api/applications/Anvil/deployment-modes
```

You should see a response like:

```json theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
{
  "isDualMode": true,
  "availableModes": ["docker", "binary"],
  "defaultMode": "binary",
  "versions": {
    "docker": ["latest", "1.0.0", "1.1.0"],
    "binary": ["1.0.0", "1.1.0", "1.2.0"]
  }
}
```

## Step 4: Create a Deployment

Now let's deploy Anvil using binary mode:

```bash theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
curl -X POST http://localhost:3000/api/applications/deploy \
  -H "Content-Type: application/json" \
  -d '{
    "applicationName": "Anvil",
    "nodeName": "your-node-name",
    "version": "1.0.0",
    "deploymentMode": "binary",
    "variables": {
      "anvil_port": 8545,
      "anvil_host": "0.0.0.0",
      "accounts": 10
    },
    "deploymentId": "anvil-deploy-$(date +%Y%m%d-%H%M%S)"
  }'
```

**Response:**

```json theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
{
  "success": true,
  "deploymentId": "anvil-deploy-20240115-103000",
  "message": "Deployment started"
}
```

## Step 5: Monitor the Deployment

Use the deployment ID to monitor progress:

### Option 1: WebSocket Real-time Monitoring

O1 provides real-time deployment monitoring via WebSocket. Open a WebSocket connection:

```javascript theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
// JavaScript example
const ws = new WebSocket('ws://localhost:3000/api/websocket');
ws.onopen = () => {
  ws.send(
    JSON.stringify({
      type: 'subscribe',
      deploymentId: 'anvil-deploy-20240115-103000',
    })
  );
};

ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log(`${data.type}: ${data.message}`);
};
```

### Option 2: Check Deployment Status

You can also check the deployment status via API:

```bash theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
# Get deployment details
curl http://localhost:3000/api/applications/Anvil/deployments
```

## Step 6: Verify the Deployment

Once deployment completes, verify everything is working:

```bash theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
# Check if Anvil is running
curl -X POST http://localhost:3000/api/nodes/execute \
  -H "Content-Type: application/json" \
  -d '{
    "node": "your-node-name",
    "application": "Anvil",
    "command": "ps aux | grep anvil",
    "setup_mode": "binary"
  }'

# Test the Anvil RPC endpoint
curl -X POST http://localhost:3000/api/nodes/execute \
  -H "Content-Type: application/json" \
  -d '{
    "node": "your-node-name",
    "application": "Anvil",
    "command": "curl -X POST -H \"Content-Type: application/json\" --data \'{\\\"jsonrpc\\\":\\\"2.0\\\",\\\"method\\\":\\\"web3_clientVersion\\\",\\\"params\\\":[],\\\"id\\\":1}\' http://localhost:8545",
    "setup_mode": "binary"
  }'
```

## Step 7: Set Up Monitoring

Set up monitoring to keep track of your application:

```bash theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
# Create a healthcheck
curl -X POST http://localhost:3000/api/monitoring/healthchecks \
  -H "Content-Type: application/json" \
  -d '{
    "host": "your-node-name",
    "application": "Anvil",
    "type": "http",
    "endpoint": "http://localhost:8545",
    "interval": 30,
    "timeout": 5
  }'

# Start background metrics collection
curl -X POST http://localhost:3000/api/monitoring/register-app \
  -H "Content-Type: application/json" \
  -d '{
    "node": "your-node-name",
    "application": "Anvil",
    "setup": "binary"
  }'
```

## Step 8: View Application Logs and Metrics

Monitor your application's performance:

```bash theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
# Get recent logs
curl -X POST http://localhost:3000/api/monitoring/logs \
  -H "Content-Type: application/json" \
  -d '{
    "host": "your-node-name",
    "application": "Anvil",
    "timespan": "1h"
  }'

# Get metrics snapshot
curl -X POST http://localhost:3000/api/monitoring/metrics/snapshot \
  -H "Content-Type: application/json" \
  -d '{
    "host": "your-node-name",
    "application": "Anvil",
    "timespan": "1h"
  }'
```

## Common Deployment Scenarios

### Deploying with Docker

If you prefer Docker deployment:

```bash theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
curl -X POST http://localhost:3000/api/applications/deploy \
  -H "Content-Type: application/json" \
  -d '{
    "applicationName": "Anvil",
    "nodeName": "your-node-name",
    "version": "latest",
    "deploymentMode": "docker",
    "variables": {
      "anvil_port": 8545,
      "anvil_host": "0.0.0.0"
    }
  }'
```

### Deploying with Custom Configuration

For more complex configurations:

```bash theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
curl -X POST http://localhost:3000/api/applications/deploy \
  -H "Content-Type: application/json" \
  -d '{
    "applicationName": "Anvil",
    "nodeName": "your-node-name",
    "version": "1.0.0",
    "deploymentMode": "binary",
    "variables": {
      "anvil_port": 8547,
      "anvil_host": "0.0.0.0",
      "accounts": 20,
      "block_time": 5,
      "gas_limit": 30000000
    }
  }'
```

## Troubleshooting

### Deployment Fails

If deployment fails, check the following:

```bash theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
# Check deployment logs
curl http://localhost:3000/api/applications/Anvil/deployments

# Verify node connectivity
curl -X POST http://localhost:3000/api/nodes/verify \
  -H "Content-Type: application/json" \
  -d '{"name": "your-node-name"}'

# Check SSH key configuration
curl http://localhost:3000/api/nodes/ssh-keys
```

### Application Not Starting

If the application doesn't start properly:

```bash theme={"theme":{"light":"github-light","dark":"one-dark-pro"}}
# Check application logs
curl -X POST http://localhost:3000/api/monitoring/logs \
  -H "Content-Type: application/json" \
  -d '{
    "host": "your-node-name",
    "application": "Anvil",
    "timespan": "10m",
    "search": "error"
  }'

# Restart the application
curl -X POST http://localhost:3000/api/nodes/state/restart \
  -H "Content-Type: application/json" \
  -d '{
    "node": "your-node-name",
    "application": "Anvil",
    "setup_mode": "binary"
  }'
```

## Next Steps

Congratulations! You've successfully deployed your first application with O1. Here's what to explore next:

* [Managing Cloud Infrastructure](../guides/managing-cloud-infrastructure) - Learn to provision cloud instances
* [Working with Addons](../guides/working-with-addons) - Deploy complex multi-component systems
* [Monitoring Applications](../guides/monitoring-applications) - Set up comprehensive monitoring
* [API Reference](../api/applications) - Explore all available API endpoints

Remember to regularly monitor your deployed applications and set up appropriate alerts to ensure they remain healthy and performant.
