One Server, Every App: The Fleet Concept Explained
The default way to deploy internal tools is one-at-a-time. Build an app, spin up a server (or push to Vercel), configure DNS, set up a database, wire up auth. Then do it all again for the next app. And the next one.
By app number five, you're managing five servers, five databases, five TLS certificates, five auth configurations, and five monitoring setups. Your "simple internal tools" now have the operational surface of a distributed system.
The fleet concept is the opposite approach: one server, every app. All your internal tools run on a single deployment, sharing infrastructure, auth, data, and operational tooling. Instead of managing N isolated systems, you manage one platform that hosts N apps.
This isn't a new idea. It's how platforms like Heroku worked. What's different in 2026 is that AI-coded apps are being produced faster than ever, which makes the per-app deployment model break down faster than ever.
The per-app deployment problem
When each internal tool is its own deployment, every app brings its own operational baggage:
| Concern | Per-app model | What it costs you |
|---|---|---|
| Hosting | Separate server or container per app | $20-100/month × N apps |
| Database | Fresh PostgreSQL instance per app | Connection management, backup complexity |
| Auth | Configure SSO integration per app | Repeated OIDC setup, inconsistent session handling |
| TLS | Certificate per domain/subdomain | Renewal management, Let's Encrypt rate limits |
| Monitoring | Health checks, alerts per app | Alert fatigue, fragmented dashboards |
| Backups | Backup strategy per database | More surfaces to verify, more restore procedures |
| Updates | Patch OS and dependencies per server | N times the maintenance window |
At three apps, this is manageable. At ten, it's a full-time job. At twenty, you need a dedicated platform team, just to run your internal tools.
And here's the thing: these apps don't need this isolation. They're internal tools. They serve the same team, access the same business data, and need the same security posture. Treating each one as a separate production system is architectural overkill that creates real operational cost.
What a fleet looks like
A fleet is a single deployment that hosts multiple applications. The architecture:
┌──────────────────────────────────────────────────────┐
│ One Server │
├──────────────────────────────────────────────────────┤
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │
│ │ CRM │ │ Billing │ │Inventory│ │ ... │ │
│ │ App │ │ App │ │ App │ │ │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └───┬────┘ │
│ │ │ │ │ │
├───────┴─────────────┴────────────┴────────────┴──────┤
│ Shared Platform Layer │
│ ┌──────┐ ┌──────┐ ┌──────────┐ ┌────────────┐ │
│ │ Auth │ │ RBAC │ │Audit Logs│ │ Routing │ │
│ │ (SSO)│ │ │ │ │ │ │ │
│ └──────┘ └──────┘ └──────────┘ └────────────┘ │
├──────────────────────────────────────────────────────┤
│ Shared Database (PostgreSQL) │
├──────────────────────────────────────────────────────┤
│ Infrastructure (TLS, DNS, Backups) │
└──────────────────────────────────────────────────────┘
Every app in the fleet inherits:
- Authentication, SSO configured once, applies to all apps. Users log in once and access every tool their role permits.
- Authorization, RBAC defined at the platform level. Per-app permissions without per-app configuration.
- Audit logging, Every mutation across every app, logged automatically in one place.
- Database, One PostgreSQL instance. Apps share tables where it makes sense (customers, users) and have their own where it doesn't (app-specific entities).
- Routing, One domain with sub-paths or subdomains per app. One TLS certificate. One DNS record.
- Backups, One backup strategy covers all data for all apps.
- Monitoring, One health check, one set of alerts, one dashboard.
Adding a new app to the fleet is a deployment, not an infrastructure project. The app comes online with auth, permissions, logging, and routing already handled.
Why this works for internal tools specifically
The fleet model works for internal tools because of their unique properties:
Same users. Your internal tools serve the same people, your team. It makes no sense for each app to have its own identity system. One SSO configuration, one user directory, one session. A person logs in and accesses everything they're permitted to.
Shared data. Internal tools operate on the same business entities. The CRM's customer record is the same customer that appears in billing, support, and operations. A shared database means one source of truth, no sync scripts, no stale copies, no reconciliation.
Same security posture. All your internal tools need the same baseline: SSO, RBAC, audit logs, encryption. Implementing this per-app is wasteful repetition. Implementing it once in the platform layer guarantees consistency.
Low scale requirements. Internal tools typically serve 5-500 users. They don't need auto-scaling Kubernetes clusters. A single well-provisioned server handles the load comfortably. The traffic patterns are predictable (business hours, weekdays).
High breadth, low depth. Organizations need many internal tools (high breadth), but each individual tool is relatively simple (low depth). The fleet model optimizes for exactly this: easy to add another app, minimal overhead per app.
The economics
Let's compare costs for a team running 10 internal tools:
Per-app deployment
| Item | Cost/month |
|---|---|
| 10 servers (or container instances) | $500-1,000 |
| 10 database instances | $300-700 |
| DNS and TLS management | $20-50 |
| Monitoring (per-app) | $100-200 |
| Auth service (per-app user count) | $200-500 |
| Total | $1,120-2,450/month |
Fleet deployment
| Item | Cost/month |
|---|---|
| 1 server (4-8 vCPU, 16-32GB RAM) | $80-200 |
| 1 database instance | $50-150 |
| DNS and TLS (one cert) | $5-10 |
| Monitoring (one target) | $20-30 |
| Auth (built into platform) | $0 |
| Total | $155-390/month |
That's a 5-7x cost reduction. For a team running 20 tools, the gap widens further, the fleet cost barely increases while the per-app cost doubles.
What about isolation?
The obvious objection: "If everything runs on one server, doesn't a problem in one app affect all the others?"
Yes, that's a real trade-off. Here's how the fleet model handles it:
Process isolation. Each app runs in its own process or container on the server. A crash in the billing app doesn't take down the CRM. The platform restarts the failed process.
Database isolation by schema. Apps can share tables (for shared entities like customers) or have their own (for app-specific data). Access control at the database level prevents one app's queries from interfering with another's data.
Resource limits. Per-app memory and CPU limits prevent one runaway app from starving the others. This is basic cgroup/container resource management.
The honest answer: for internal tools with 5-500 users and predictable load, single-server deployment is more than sufficient. You don't need the isolation guarantees of a multi-region Kubernetes cluster. Your CRM and your inventory tracker can share a server the same way they share an office.
If you're running customer-facing SaaS with strict SLA requirements and unpredictable traffic, yes, you want stronger isolation. For internal tools, the fleet model hits the right trade-off between operational simplicity and reliability.
How apps share data in a fleet
The shared database is the fleet's most powerful feature, and the one that scares people most.
In a fleet, apps can:
Share entities. The
customerstable is used by the CRM, the billing app, and the support tool. One record, three views, governed by per-app permissions. No sync.Own entities. The inventory app has a
stock_levelstable that only it reads and writes. Other apps can't access it unless explicitly granted. Each app can have its own data without interference.Reference across apps. The billing app's invoice references a customer from the shared
customerstable. Foreign keys work because it's the same database. No API calls, no eventual consistency, no stale data.
This is what eliminates the island problem. When all your apps operate on the same database, the "5 apps, 5 databases" fragmentation disappears by construction. The architecture makes it impossible.
When the fleet model doesn't fit
Be honest about the limits:
- Customer-facing products with SLA requirements. Your marketing website and your internal admin panel shouldn't share infrastructure. Different availability requirements, different traffic patterns.
- Dramatically different tech stacks. If one tool is Python/Django and another is Elixir/Phoenix, a fleet model that standardizes the runtime won't accommodate both. Fleets work best with a shared runtime.
- Strict regulatory isolation. Some compliance regimes require physical separation between systems (air-gapped environments, different classification levels). A fleet can't satisfy these requirements.
- Massive scale for a single app. If one internal tool handles millions of records with complex queries, it might need dedicated database resources. In practice, this is rare for internal tools.
For the 90% of cases where you're building CRUD apps, dashboards, workflows, and admin panels for your team, the fleet model is the right default.
Getting started
If you're currently running isolated internal tools and want to move toward a fleet:
- Inventory what you have. List every internal tool, its database, its auth method, its hosting. You'll likely find redundancy everywhere.
- Identify shared entities. Which data is duplicated across tools? Customers, products, users, these are your candidates for consolidation.
- Pick a platform that supports fleet deployment. You need: shared database, shared auth, per-app permissions, single-server deployment. Not all internal tool platforms offer this, most treat each app as isolated.
- Migrate incrementally. You don't have to move everything at once. Start with the next new tool, deploy it on the fleet instead of standalone. Then migrate existing tools one at a time.
The shift
The per-app deployment model made sense when apps were rare and expensive to build. If you only have two internal tools, the overhead of managing them separately is tolerable.
But in 2026, teams generate internal tools in hours, not months. AI coding tools make creation trivial. What's not trivial is the operational surface each new app creates. Every app needs hosting, auth, monitoring, backups.
The fleet model inverts this. Creation stays fast. Operations stay flat. Your tenth app costs nearly the same to run as your first, because they all share the same infrastructure.
One server. Every app. The operational surface of one, the utility of many.
That's the fleet concept. And for internal tools, it's the architecture that scales with your team's ambition instead of against it.