Compare the tradeoffs
Towbar
✅ Pros
- Towbar runs ordinary containers on servers you control, so applications can use long-lived processes, private networks, local volumes, and custom system packages without fitting a serverless runtime.
- Workload policy, domains, jobs, resource limits, and environment membership live in Git rather than in project settings spread across a hosted platform.
- Infrastructure credentials and application secrets remain on the Towbar installation.
⚠️ Cons
- Towbar has no global edge network, serverless autoscaling, framework-aware CDN, managed image optimization, or Vercel collaboration layer.
- Vercel Functions, Edge Runtime, Middleware, ISR, and platform routing may need application changes before they work in a persistent container.
- You operate capacity, security updates, host recovery, observability, and the control plane. Towbar previews also do not clone database Resources.
Vercel
✅ Pros
- Vercel’s Git integration provides automatic production and preview deployments, generated URLs, status checks, and a polished review workflow with no server administration.
- Its framework integrations, edge network, Functions, caching, image pipeline, and frontend observability remove substantial application and infrastructure work.
- Serverless scaling suits bursty request workloads that would otherwise need capacity planning.
⚠️ Cons
- Platform-specific runtimes, routing, caching, image behavior, and framework features can make a later container migration a code project rather than a configuration change.
- You accept Vercel’s regions, quotas, supported runtimes, platform behavior, and usage pricing instead of controlling the underlying compute.
- Stateful services come from Blob, Marketplace providers, or external systems, so a complete migration crosses several products and data boundaries.
1. Decide whether the workload is portable
Map every Vercel feature to an explicit destination before changing production:
Vercel’s runtime documentation
describes Node.js, Python, Ruby, Go, and Edge function environments. A Towbar
App is a persistent container process, so do not assume function isolation,
automatic concurrency, regional execution, duration limits, or edge APIs will
carry over unchanged. Keep a workload on Vercel until you have removed or
replaced every platform dependency it still needs.
2. Inventory the Vercel project
Record the following for each project:- Git provider, repository, production branch, root directory, framework preset, install command, build command, output directory, and Node.js version;
- Production, Preview, branch-specific, custom-environment, and Development variables, including Vercel-provided system variables the code reads;
- Functions, runtimes, regions, duration or memory settings, background work, and scheduled jobs;
- redirects, rewrites, headers, trailing-slash behavior, image configuration,
and any other
vercel.jsonorvercel.tspolicy; - production and preview domains, DNS ownership, certificates, OAuth callback URLs, webhooks, and allowlists; and
- Blob stores, Marketplace storage integrations, external databases, queues, caches, analytics, observability, and other provider dependencies.
vercel.json reference
as the source inventory. Towbar does not interpret vercel.json; translate the
behavior your application still needs into application code, its web server or
proxy, and the Towbar manifest.
If the source repository is on Bitbucket or Azure DevOps, move or mirror it to
GitHub or GitLab before connecting it to Towbar.
3. Make the application run as a container
Choose a supported source builder or add a Dockerfile. The application must start without the Vercel runtime, listen on the container network interface, use a fixed internal port, and expose an unauthenticated health endpoint. This example declares a Dockerfile build, the runtime port, a health check, and the production server:.towbar/apps/web.app.yml
4. Move variables and secrets by scope
Vercel variables can target Production, Preview, Development, custom environments, or individual preview branches. Review Vercel’s environment variable scopes and preserve that separation instead of copying every value into one shared set. Declare only the names the App needs in Git:.towbar/apps/web.app.yml
5. Recreate previews and Git automation
Vercel’s Git integration creates production deployments from the production branch and preview deployments from other branches and pull requests. Towbar previews are opt-in per App, deploy eligible same-repository pull requests, and use separate preview secrets..towbar/apps/web.app.yml
6. Move functions, cron jobs, and routing
Convert request functions into routes handled by the long-running application, or split independently scaled processes into separate Apps. Replace Edge Runtime APIs and region-dependent behavior deliberately. Long-lived workers should run as private Apps rather than being started by an HTTP request. Vercel Cron invokes an HTTP function on a schedule. In Towbar, declare the command that should run against the deployed App image:.towbar/apps/web.app.yml
vercel.json configuration
rather than copying the file and assuming equivalent routing.
7. Move data and files
Vercel Marketplace storage provisions third-party databases and injects their credentials into projects. Identify the actual provider, engine, version, extensions, region, connection mode, and export procedure behind each integration. Use an engine-native logical export, restore it to a compatible Towbar database Resource or external service, then verify schema, indexes, row counts, encodings, extensions, and application migrations. For Vercel Blob, list and download every required object before cutover. Thevercel blob CLI supports listing and
downloading objects, but your migration also needs to preserve application
metadata, access rules, content types, and public URLs. Update stored URLs or
add a compatibility redirect if the object origin changes.
Do not move durable uploads into a container filesystem unless the App declares
and operates an appropriate persistence and recovery model. External object
storage is usually the clearer replacement for Vercel Blob.
8. Rehearse the cutover
- Deploy the Towbar Apps against temporary domains with automatic deployment disabled.
- Test pages, API routes, authentication, functions converted to server routes, workers, jobs, uploads, redirects, headers, email, OAuth, webhooks, previews, logs, and alerts.
- Lower DNS TTL where you control it. Stop or make source writers read-only, then repeat the final database and object transfer.
- Restore and verify representative data before starting Towbar workers.
- Add the production domains to the manifest, deploy, and update DNS. Towbar uses Caddy to issue and renew certificates after the hostnames reach the target server.
- Confirm HTTPS, health, logs, scheduled jobs, previews, backups, and server capacity before closing the rollback window.
Migration checklist
- Every project, deployment mode, function, route, variable scope, domain, datastore, object store, job, and integration is inventoried.
- Every Vercel-specific runtime feature has a tested replacement or an explicit decision to remain on Vercel.
- The production container starts locally, listens on the expected port, and passes its health check.
- Towbar manifests pass schema validation and contain no secret values.
- Preview environments use isolated secrets and non-production data.
- Database and object migrations have been rehearsed and verified.
- Cutover, rollback, owners, timing, and the write boundary are documented.
