Deploy an AI Agent
Coming from another cloud?
▸DigitalOcean·AI Agent Droplet
This Quake AI feature maps to DigitalOcean’s AI Agent Droplet.
Deploy an AI agent
Stand up an AI agent framework on a Quake AI instance using Docker Compose. An agent connects a language model to tools, memory, and external services. You control the model provider, data, and runtime on infrastructure you operate.
Monthly cost estimate
Pricing calculator ↗Sized as a custom package on dedicated vCPU.
Monthly total for the required template above. Use the configurator below to add optional pieces and see the total update.
What each resource is for
m2a.large
m2a.large · 2 dedicated vCPU, 8 GiB RAM, 0.5 Gbps
Compute shown per role at custom-package rates ($29/dedicated vCPU, $7.25/shared vCPU, $1/GiB RAM). The headline above is the billed total: the cheaper of a named plan and the custom package, plus add-ons.
Included in baseline
m2a.large
2 dedicated vCPU, 8 GiB RAM, 0.5 Gbps
Compute + RAM rate basis
2 vCPU + 8 GiB RAM at $29/dedicated vCPU, $7.25/shared vCPU, $1/GiB RAM (regular). Totals apply the flat −$5/mo package promotion.
Package promotional discount
Flat −$5.00/mo on the custom package (same promotion as named plans).
Included at no charge
These line items are zero on Quake AI. Many other providers meter them separately.
Data transfer (inbound and outbound)
Unlimited data transfer on every plan; Quake AI does not meter per-GB egress.
AWS, GCP, and Azure meter outbound transfer per GB. DigitalOcean and Hetzner include an allowance on compute plans, then charge overage.
Learn morePrivate networking
Private networks, subnets, Neutron routers, and security groups are included with the plan.
VPC objects are usually free to create elsewhere, but NAT gateways bill hourly plus per-GB processed. Quake AI uses router SNAT with no separate NAT line item.
Control-plane API requests
OpenStack API calls for provisioning and management are included.
Some managed services on other clouds meter API calls or charge for premium control-plane features.
Dev/test vs production
Start on shared CPU for dev/test, then promote to dedicated for production with a flavor resize. The network, storage, and template stay the same.
Dev/test on shared CPU
Burstable s1a flavors; suited to prototyping and low or bursty load.
Production on dedicated CPU
The headline estimate above; predictable steady-load performance.
Saves $49.50/mo while you build on shared CPU.
Shared flavors carry less RAM (m2a.large (8 GiB RAM) -> s1a.small (2 GiB RAM)). A resize reboots the instance; data on attached volumes persists. Size the dedicated flavor for the RAM your production workload needs.
Pricing data last validated: . For current rates, check quake.ai/pricing.
Prerequisites#
- A Quake AI account with an active project
- An SSH key pair added to your project
- An API key from an AI model provider (OpenAI, Anthropic, Google, or OpenRouter for multi-provider access with a single key), or a self-hosted Ollama instance
Choose a framework#
| Framework | Best for | Docker image |
|---|---|---|
| OpenClaw | Messaging bots (Telegram, Slack, Discord); 3,200+ community skills | ghcr.io/openclaw/openclaw |
| Flowise | Visual agent and RAG pipeline builder | flowiseai/flowise |
| n8n | Workflow automation with AI nodes; connects to 400+ services | n8nio/n8n |
| Custom stack | Full control; compose any LLM + tools + memory | N/A |
OpenClaw has a dedicated guide with a Console Apps deployment option (Compute > Apps). The steps below cover the general Docker Compose pattern and walk through Flowise as a concrete example.
Step 1: Create a VM#
Create a new instance:
- Image: Ubuntu-24.04
- Flavor:
m2a.large - Network: Attach to your project network
- Security group: Allow inbound TCP on port 22 (SSH) and 3000 (agent UI; restrict to your IP)
- Key pair: Select your SSH key pair
Assign a floating IP after the instance launches.
Use m2a.xlarge if running a local model on the same VM.
Step 2: Install Docker#
SSH into your VM:
ssh ubuntu@YOUR_FLOATING_IPInstall Docker and Docker Compose:
curl -fsSL https://get.docker.com | shAdd your user to the Docker group so you can run commands without sudo:
sudo usermod -aG docker ubuntu
newgrp dockerGroup membership changes take effect on your next login. The newgrp docker line above activates the group in your current shell. If you skip it or open a new shell, log out and SSH back in before you run docker commands.
Confirm the install with a command that needs the daemon socket:
docker run --rm hello-worldA daemon-less check such as docker --version passes even when the group is not active yet, so it hides this gotcha.
Step 3: Deploy Flowise#
Create a project directory:
mkdir -p ~/flowise && cd ~/flowiseCreate a docker-compose.yml. The steps below were last verified against Flowise 3.1.2; pinning the tag keeps the bootstrap flow predictable, since Flowise has reshaped its auth surface across releases.
services:
flowise:
image: flowiseai/flowise:3.1.2
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- ./data:/root/.flowise
environment:
- PORT=3000Start the service:
docker compose up -dVerify it is running:
docker compose psOnce docker compose ps shows the flowise container as Up, open http://YOUR_FLOATING_IP:3000 in your browser.
First-time setup#
Flowise 3.x bootstraps an admin account from the browser UI on the first visit. When you open http://YOUR_FLOATING_IP:3000, Flowise redirects you to /signin. Click Register and create the first account using a valid email address. The first account becomes the workspace administrator.
If you need to follow the container output during boot, run docker compose logs -f flowise in a separate terminal.
Step 4: Connect a model provider#
In the Flowise UI, navigate to Credentials and add your AI provider API key. Flowise supports OpenAI, Anthropic, Google Gemini, Azure OpenAI, and others.
If you are running Ollama locally, configure the Ollama node to point to http://localhost:11434 (or the Ollama VM's private IP if it is on a separate instance).
Step 5: Build your first flow#
In Flowise, create a new Chatflow. The basic pattern:
- Add a Chat Model node (e.g., ChatOpenAI, ChatOllama)
- Add a Conversational Retrieval QA Chain or ReAct Agent node
- Add a Buffer Memory node for conversation history
- Connect them and save
Use the built-in chat interface to test your agent before integrating it with an external system.
Deploying n8n instead#
n8n suits automation-first use cases: connecting your agent to webhooks, databases, and external APIs without writing code.
services:
n8n:
image: n8nio/n8n
restart: unless-stopped
ports:
- "5678:5678"
volumes:
- ./n8n-data:/home/node/.n8n
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=change-this-password
- WEBHOOK_URL=http://YOUR_FLOATING_IP:5678Access the UI at http://YOUR_FLOATING_IP:5678. n8n's AI nodes support OpenAI-compatible APIs, which means you can point them at Ollama for local inference.
Persisting data across restarts#
All three frameworks write state to a local directory inside the container. The volumes mapping in each compose file ensures that data survives container updates and restarts. Back up the volume directory before updating images:
docker compose down
cp -r ./data ./data-backup-$(date +%Y%m%d)
docker compose pull
docker compose up -dSecurity considerations#
Restrict the UI port. The default security group in this guide restricts port 3000 to your IP. Avoid opening it to 0.0.0.0/0. Most frameworks rely on a username/password that is trivial to brute-force over the public internet.
Keep API keys out of the compose file for production. Use environment variable files (.env) and keep them out of version control, or reference secrets from a vault.
Run HTTPS in production. For production deployments, place the agent UI behind a reverse proxy (nginx or Caddy) with a TLS certificate. Use a DNS record pointed at your floating IP.
Next steps#
- OpenClaw guide: OpenClaw agent framework via Console Apps
- Run a local LLM: local inference instead of external model providers
- Deploy Qdrant: long-term memory and document retrieval for agents
Clean up#
Stop the compose stack and delete the instance when finished:
docker compose down