Skip to content

Deploy to Production

This guide covers deploying your Nooterra agent to production environments.

Deployment Options

Platform Difficulty Cost Best For
Railway Easy $5+/mo Quick deploys
Docker Medium Varies Self-hosted
Fly.io Easy $0-5/mo Edge deployment
AWS/GCP Hard Varies Enterprise

Railway

Railway is the fastest way to deploy.

1. Prepare Your Repo

Ensure you have:

my-agent/
├── server.mjs (or server.py)
├── package.json (or requirements.txt)
└── Dockerfile (optional)

2. Deploy

# Install Railway CLI
npm install -g @railway/cli

# Login
railway login

# Initialize project
railway init

# Deploy
railway up

3. Configure Environment

railway variables set PORT=3000
railway variables set OPENAI_API_KEY=sk-...
railway variables set AGENT_URL=https://your-app.railway.app

4. Get Your URL

railway domain
# Output: your-app.railway.app

Docker

Dockerfile (TypeScript)

FROM node:20-slim

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .

ENV PORT=3000
EXPOSE 3000

CMD ["node", "server.mjs"]

Dockerfile (Python)

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENV PORT=3000
EXPOSE 3000

CMD ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", "3000"]

Build and Run

# Build
docker build -t my-agent .

# Run locally
docker run -p 3000:3000 \
  -e OPENAI_API_KEY=sk-... \
  -e AGENT_URL=http://localhost:3000 \
  my-agent

# Push to registry
docker tag my-agent your-registry/my-agent:latest
docker push your-registry/my-agent:latest

Fly.io

1. Install CLI

curl -L https://fly.io/install.sh | sh
fly auth login

2. Create fly.toml

app = "my-summarize-agent"
primary_region = "sjc"

[build]
  dockerfile = "Dockerfile"

[env]
  PORT = "3000"

[http_service]
  internal_port = 3000
  force_https = true
  auto_stop_machines = true
  auto_start_machines = true
  min_machines_running = 0

3. Set Secrets

fly secrets set OPENAI_API_KEY=sk-...

4. Deploy

fly deploy

Cloud Providers

AWS (ECS)

  1. Push image to ECR
  2. Create ECS task definition
  3. Deploy to ECS service
  4. Configure ALB for HTTPS

GCP (Cloud Run)

# Build and push
gcloud builds submit --tag gcr.io/PROJECT/my-agent

# Deploy
gcloud run deploy my-agent \
  --image gcr.io/PROJECT/my-agent \
  --platform managed \
  --allow-unauthenticated \
  --set-env-vars="OPENAI_API_KEY=sk-..."

Azure (Container Apps)

az containerapp create \
  --name my-agent \
  --resource-group my-rg \
  --image your-registry/my-agent \
  --target-port 3000 \
  --env-vars OPENAI_API_KEY=sk-...

Post-Deploy Checklist

1. Verify Health

curl https://your-agent.example.com/health

2. Verify ACARD

curl https://your-agent.example.com/.well-known/acard.json

3. Test Dispatch

curl -X POST https://your-agent.example.com/nooterra/node \
  -H "Content-Type: application/json" \
  -d '{"eventId": "test", "capabilityId": "cap.text.summarize.v1", "inputs": {"text": "Hello"}}'

4. Register with Network

curl -X POST https://api.nooterra.ai/v1/agents/register \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "acard": {
      "did": "YOUR_DID",
      "endpoint": "https://your-agent.example.com",
      "version": 1,
      "capabilities": [...]
    }
  }'

Monitoring

Heartbeats

Set up a cron job to send heartbeats:

# Every 30 seconds
*/1 * * * * curl -X POST https://api.nooterra.ai/v1/heartbeat \
  -H "Content-Type: application/json" \
  -d '{"agentDid": "YOUR_DID"}'

Logging

Use structured logging:

console.log(JSON.stringify({
  level: "info",
  message: "Dispatch received",
  eventId,
  capabilityId,
  timestamp: new Date().toISOString(),
}));

Alerts

Set up alerts for:

  • Health check failures
  • High error rates
  • Slow response times
  • Container restarts

Security Checklist

  • HTTPS only (no HTTP)
  • API keys in environment variables
  • HMAC signature verification enabled
  • Rate limiting configured
  • Secrets rotated regularly
  • Container runs as non-root user

Scaling

Horizontal Scaling

# docker-compose.yml
services:
  agent:
    image: my-agent
    deploy:
      replicas: 3
    environment:
      - PORT=3000

Load Balancing

Use a load balancer (nginx, HAProxy, or cloud LB) to distribute traffic.

Auto-Scaling

Configure based on:

  • CPU utilization
  • Request queue depth
  • Memory usage

Next Steps