Case study · Built with Claude Code

The OCI migration:
12 services, one platform I run end to end.

In one month, hands-on with Claude Code as my pair, I moved my entire stack — websites, apps, MCP servers, databases — off Vercel, Render and Supabase onto a single ARM server I operate end to end: automatic HTTPS, git push-to-deploy, automated backups and a tested disaster-recovery restore.

24/7in production, backed up and recoverable
4 / 24ARM cores / GB RAM (Always Free)
500+DB rows migrated, zero loss
1 push= 1 production deployment

Why, and how

The goal: centralize everything on one free server, without giving up the developer experience of Vercel or Render.

1 · Foundation

Ubuntu 24.04 on an OCI Ampere A1 (ARM64). Two firewall layers — OCI Security List + instance iptables — DuckDNS subdomains with a cron-based IP updater.

2 · The platform

Coolify as a self-hosted PaaS: builds from GitHub, deploys Docker containers, manages env vars and cron. Traefik terminates HTTPS with automatic Let's Encrypt certificates.

3 · The workloads

MCP servers, web services and API servers, each in its own container, routed by hostname and path. Test and prod environments, deployed by git push (Coolify webhook).

4 · The data

Self-hosted PostgreSQL/PostgREST (same API syntax as Supabase — zero code change) plus an Oracle DB. 500+ rows migrated with full-text search intact; automated backups to OCI Object Storage.

Architecture diagrams

The complete picture, from migration flow to service layer.

Migration overview

What moved from where: Vercel, Render, Supabase and local workloads consolidated onto the OCI server.

OCI migration overview diagram

Infrastructure architecture

Internet traffic crosses two firewall layers, reaches Traefik which terminates TLS, and is routed to the right container. Coolify builds from GitHub and manages the lifecycle.

Arx infrastructure architecture diagram

Component data flow

How requests, builds and data move between the proxy, the applications, the databases and object storage.

OCI component data flow diagram

PaaS service layer

The Coolify control plane: builds, deployments, environment variables, scheduled tasks.

Arx PaaS service layer diagram

PaaS details

A closer look at the platform internals and how each hosted service fits in.

Arx PaaS details diagram

Platform services, one by one

The building blocks behind every deployed app: the deployment plane, the data layer, object storage and backups.

Coolify — deployment plane

Builds from GitHub on every push, deploys Docker containers, manages environment variables and scheduled jobs — all driven through its REST API.

Coolify deployment plane diagram

Data layer — PostgreSQL + PostgREST + Oracle DB

A self-hosted, Supabase-compatible data API with French full-text search, alongside an Oracle database. 500+ rows migrated with zero loss.

Arx data layer diagram

MinIO — S3-compatible object storage

Self-hosted S3-style storage for application assets and files, behind Traefik like every other service.

MinIO S3 storage diagram

Backups — automated, off-container

Scheduled database and volume backups shipped to OCI Object Storage (10 GB free tier), tested by restore before any cutover.

Backups architecture diagram

The stack

ComponentRole
OCI Ampere A1 (ARM64)4 OCPU, 24 GB RAM, Ubuntu 24.04 — Oracle free tier
Docker EngineRuntime for every workload
CoolifySelf-hosted PaaS: build, deploy, env, cron, REST API
TraefikReverse proxy, automatic Let's Encrypt HTTPS, host/path routing
PostgreSQL + PostgRESTSelf-hosted Supabase-compatible data API, French full-text search
MinIOS3-compatible object storage
OCI Object StorageAutomated off-container backups, disaster-recovery restore tested
DuckDNSFree DNS with cron-based IP updates

Migration phases

Cutover strategy: the old host stays live in parallel until the target is validated — no deletion before production validation, backups tested before final cutover.

PhaseScopeStatus
0Foundation — Docker, 2-layer firewall, DNS + cron✅ Done
1Coolify platform + admin + REST API✅ Done
2First app migrated from local (Node)✅ Done
3Einstein MCP server migrated from Vercel✅ Done
4Render services + scheduled jobs⏳ In progress
5Postgres self-hosting + backups, off Supabase✅ Done
6Ollama — small ARM-quantized models (optional)⏳ Planned