TL;DR
Arango’s BYOC (Bring Your Own Code/Container) feature lets you run custom services — APIs, ML models, data processors — directly inside the Arango Contextual Data Platform, right next to your data. Upload your code as a .tar.gz (the platform builds and secures the container for you) or point to your own Docker image. Either way, authentication, routing, and network isolation are handled automatically via the Arango Control Plane. Services can be scoped globally or to a single database, and deploy in minutes through the Container Manager UI. Watch out for two gotchas: ARM/amd64 build mismatches on M-series Macs, and optional dependencies that need to be flattened into your pyproject.toml before packaging.
What if your custom ML model, API, or data-processing service could live right next to your data — natively authenticated, automatically routed, and fully isolated — without you managing any of that yourself? That’s exactly what Arango’s Bring Your Own Code (BYOCode) and Bring Your Own Container (BYOContainer) frameworks make possible.
The Container Manager — a specialized orchestration service within the Arango Contextual Data Platform — lets you deploy and run your own services right alongside your data, all orchestrated through the Arango Control Plane (ACP). Authentication, network isolation, telemetry, and license management are handled automatically, so your team can stay focused on building logic, not infrastructure.
Two Paths to Deployment
The platform gives you flexibility to meet your team where it is. Whether you want to hand off container-building entirely or keep full control of your runtime environment, there’s a path for you:
Bring Your Own Code
Upload your application code and dependencies as a .tar.gz package. The platform builds secure containers using hardened base images (like Python 3.13) automatically.
Bring Your Own Container
Prefer to manage the environment yourself? Provide a Docker image URL. Use any language or runtime — as long as it’s packaged in your image, the platform can run it.
Getting Started with ServiceMaker
For the code-based path, Arango recommends ServiceMaker — a CLI tool that automates the entire preparation workflow. It handles dependency installation via uv, builds local images for testing, and packages everything into a deployment-ready archive. Built in Rust, it’s fast and opinionated in all the right ways.
git clone https://github.com/arangodb/servicemaker.git cd servicemaker cargo build --release ./servicemaker --input /path/to/your/project --name my-project-name
💡 PRO TIP
After the build completes, your upload archive won’t be in the root folder. Head to the target/ directory and look for a project-specific .yml file named after your project and build SHA to find the actual project.tar.gz.
Key Requirements to Keep in Mind
Before you deploy, two networking rules are non-negotiable: your service must expose an HTTP server on port 8000, and it must handle requests at the root path (/). Here’s a minimal FastAPI setup that meets both:
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
def read_root():
return {"status": "Service is running on Arango Container Manager"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
Choose Your Deployment Scope
One of the most powerful BYOC features is choosing exactly where a service lives in your deployment topology:
Global Services
Hosted on _system, accessible across all databases. Ideal for shared infrastructure like API gateways or org-wide ML models.
Database-Specific Services
Bound to a single database. Perfect for isolated data-processing APIs or webhook handlers that must only touch specific datasets.
Deploying via the UI — Five Steps
- Navigate to Control Panel → Container Manager after logging in.
- Select the Packages tab for code uploads, or Containers for Docker image URLs.
- Drag and drop your .tar.gz, or paste your Docker image URL directly.
- Provide a filename, semantic version (e.g. 1.0.0), service URL path, and base image. Multiple versions can run simultaneously.
- Click Deploy Service. The Control Plane handles everything else.
Common Gotchas (and How to Fix Them)
ARM ARCHITECTURE MISMATCH
Running ServiceMaker on an M-series Mac? If it tries to pull an amd64 image, the build will fail. Fix: manually build the base image locally first:
cd servicemaker/baseimages docker build -f Dockerfile.py13base -t arangodb/py13base:latest .
Then rerun ServiceMaker — it will use your local image and skip the pull.
OPTIONAL DEPENDENCIES WON’T PACKAGE
ServiceMaker doesn’t currently support uv sync –extra optional dependency groups. If your pyproject.toml uses extras, those packages won’t make it into the container. Fix: move all required dependencies into the main dependencies array rather than tucking them behind optional groups.
Ready to See the Full Walkthrough?
The complete guide on Medium includes step-by-step screenshots of the Container Manager UI, detailed code examples, and the full troubleshooting checklist.