Coolify makes deploying applications effortless. Connect a Git repository, click deploy, and your app is live with SSL and a reverse proxy in minutes. But that simplicity creates a subtle trap: it is easy to keep adding services — a database here, a background worker there, another side project — until your VPS grinds to a halt. The container crashed, the OOM killer struck, and now everything on the server is down.
This guide covers resource planning for running multiple applications on a single VPS with Coolify. You will learn how much RAM, CPU, and storage each common stack component actually needs, how to calculate total requirements for your specific combination of services, and when it makes sense to scale up your server versus distributing workloads across multiple nodes.
If you have not set up Coolify yet, start with our installation guide first, then return here to plan your resources before deploying your production stack.
1. Why Resource Planning Matters with Containers
Every application Coolify deploys runs inside a Docker container. Containers share the host kernel but each one consumes real memory, CPU cycles, and disk I/O. Unlike traditional hosting where you might run Apache with multiple virtual hosts sharing a single process pool, containerized applications each carry their own runtime, dependencies, and allocated resources.
This isolation is a strength — a crash in one container does not take down another — but it comes with overhead. A Node.js application that uses 80MB when run directly on the host will use 200–300MB inside a container because the container image includes the full Node.js runtime, OS libraries, and the application code. Multiply that by five or six services and you can see how quickly resources add up.
Without explicit resource limits, Docker containers will consume as much memory as they need. When total memory usage exceeds what the VPS has available, the Linux OOM (Out of Memory) killer activates and terminates processes. It does not care which process is most important — it kills whatever frees the most memory fastest. That could be your database, your application server, or Coolify itself.
The Coolify Overhead
Before you plan resources for your applications, account for what Coolify itself consumes:
- Coolify application — approximately 300–400MB RAM (includes the PHP backend, Node.js frontend, and internal services)
- PostgreSQL (Coolify’s internal database) — approximately 100–200MB RAM
- Traefik reverse proxy — approximately 50–100MB RAM
- Docker engine — approximately 100–200MB RAM
- Operating system — approximately 200–300MB RAM
Total Coolify platform overhead: approximately 750MB–1.2GB RAM. This is the baseline before you deploy a single application. On a 2GB VPS, that leaves you with roughly 800MB–1.2GB for your actual workloads — enough for a single lightweight application but not much more.
2. Resource Sizing for Common Stacks
The following tables provide realistic memory and CPU estimates for common application stacks deployed through Coolify. These numbers reflect actual container usage under moderate production load, not the minimums listed in documentation.
Web Application Runtimes
| Stack | RAM (Idle) | RAM (Production) | vCPU | Notes |
|---|---|---|---|---|
| Node.js (Express/Fastify) | ~80MB | ~256MB | 0.25–0.5 | Scales with concurrent connections |
| Next.js (SSR) | ~150MB | ~512MB | 0.5–1 | SSR rendering is CPU-intensive |
| Next.js (Static Export) | ~30MB | ~64MB | 0.1 | Served via Nginx/Caddy; minimal resources |
| Laravel (PHP-FPM) | ~100MB | ~384MB | 0.5–1 | Depends on worker count |
| Django (Gunicorn) | ~120MB | ~384MB | 0.5–1 | Per-worker memory adds up quickly |
| Go (compiled binary) | ~10MB | ~64MB | 0.25 | Extremely efficient; ideal for microservices |
| Ruby on Rails (Puma) | ~150MB | ~512MB | 0.5–1 | Memory-heavy with multiple workers |
Databases
| Database | RAM (Idle) | RAM (Production) | vCPU | Notes |
|---|---|---|---|---|
| PostgreSQL | ~50MB | 512MB–2GB | 0.5–1 | shared_buffers should be ~25% of allocated RAM |
| MySQL / MariaDB | ~100MB | 512MB–2GB | 0.5–1 | InnoDB buffer pool is the primary consumer |
| MongoDB | ~100MB | 1–4GB | 0.5–2 | WiredTiger cache uses 50% of available RAM by default |
| Redis | ~5MB | ~128MB | 0.1–0.25 | Memory-bound; size depends on dataset |
| SQLite | ~0MB | ~10MB | 0 | Embedded; runs within the application process |
Supporting Services
| Service | RAM (Idle) | RAM (Production) | vCPU | Notes |
|---|---|---|---|---|
| n8n (workflow automation) | ~150MB | ~512MB | 0.5–1 | Spikes during workflow execution |
| Uptime Kuma | ~60MB | ~128MB | 0.1–0.25 | Lightweight; scales with monitored endpoints |
| MinIO (S3-compatible storage) | ~100MB | ~512MB | 0.25–0.5 | CPU usage spikes during uploads/downloads |
| Plausible Analytics | ~200MB | ~512MB | 0.5–1 | ClickHouse backend is the primary consumer |
| Gitea | ~80MB | ~256MB | 0.25–0.5 | Lightweight Git hosting |
| Ghost (CMS) | ~100MB | ~256MB | 0.25–0.5 | Node.js-based; moderate memory |
3. How Coolify Manages Docker Resources
Coolify deploys every service — whether it is an application from a Git repository, a database from a one-click template, or a Docker Compose stack — as one or more Docker containers. Understanding how Docker manages resources on the host is essential for planning capacity.
Default Behavior: No Limits
By default, Docker containers have no memory or CPU limits. A container can use all available host memory and all available CPU cores. This is fine for a single application on a dedicated server, but it is dangerous when running multiple services. One misbehaving container (a memory leak, a runaway query, an unoptimized build process) can starve everything else on the server.
Setting Resource Limits in Coolify
Coolify allows you to set resource limits per service through its dashboard. For each deployed resource, you can configure:
- Memory limit — the maximum amount of RAM the container can use. If the container exceeds this limit, Docker will kill it (similar to the OOM killer, but scoped to a single container instead of the whole system).
- Memory reservation — the guaranteed minimum. Docker will try to ensure this much memory is always available to the container.
- CPU limit — the maximum number of CPU cores the container can use (e.g., 0.5 = half a core, 2 = two full cores).
Setting these limits is the single most important thing you can do for multi-app stability. With limits in place, a memory leak in your staging application will crash that container — not your production database.
Practical Limit Configuration
A good rule of thumb is to set memory limits at 1.5x your expected production usage and reservations at 1x. This gives containers room for occasional spikes without allowing runaway consumption:
# Example: Next.js application
# Expected production RAM: ~512MB
# Memory limit: 768MB (1.5x)
# Memory reservation: 512MB (1x)
# CPU limit: 1.0
# Example: PostgreSQL database
# Expected production RAM: ~1GB
# Memory limit: 1536MB (1.5x)
# Memory reservation: 1024MB (1x)
# CPU limit: 1.0
4. Calculating Total VPS Requirements
With the per-service resource estimates from section 2 and the Coolify overhead from section 1, you can calculate the total resources your VPS needs. The formula is straightforward:
Total RAM = Coolify overhead (1GB) + Sum of all service memory reservations + 20% headroom buffer
The 20% buffer is not optional. It accounts for temporary spikes during deployments (where both the old and new container run simultaneously), build processes, log aggregation, and general operating system overhead. Running at 100% memory utilization means any transient spike triggers the OOM killer.
Example Calculations
Minimal Stack: Static Site + Blog
| Service | RAM | vCPU |
|---|---|---|
| Coolify platform | 1,000MB | 0.5 |
| Next.js (static export) | 64MB | 0.1 |
| Ghost CMS | 256MB | 0.25 |
| MySQL (for Ghost) | 512MB | 0.5 |
| Subtotal | 1,832MB | 1.35 |
| + 20% buffer | 366MB | — |
| Total required | ~2.2GB | 2 vCPU |
Recommended VPS: 4GB RAM, 2 vCPU (provides comfortable headroom for deployments and traffic spikes).
SaaS Starter Stack: Next.js + PostgreSQL + Redis + n8n
This is the stack many indie developers and small SaaS companies start with. A Next.js frontend with server-side rendering, PostgreSQL for persistent data, Redis for caching and session storage, and n8n for workflow automation (handling webhooks, email sequences, and third-party integrations).
| Service | RAM | vCPU |
|---|---|---|
| Coolify platform | 1,000MB | 0.5 |
| Next.js (SSR) | 512MB | 1 |
| PostgreSQL | 1,024MB | 0.5 |
| Redis | 128MB | 0.1 |
| n8n | 512MB | 0.5 |
| Subtotal | 3,176MB | 2.6 |
| + 20% buffer | 635MB | — |
| Total required | ~3.8GB | 3 vCPU |
Recommended VPS: 4GB RAM, 4 vCPU minimum. Realistically, 8GB gives you the room to add a staging environment or additional services later without immediately needing to upgrade.
Full Production Stack: Multiple Apps + Monitoring
| Service | RAM | vCPU |
|---|---|---|
| Coolify platform | 1,000MB | 0.5 |
| Next.js app (production) | 512MB | 1 |
| Next.js app (staging) | 256MB | 0.5 |
| Node.js API server | 256MB | 0.5 |
| PostgreSQL (primary) | 2,048MB | 1 |
| Redis | 256MB | 0.25 |
| n8n | 512MB | 0.5 |
| MinIO | 512MB | 0.25 |
| Uptime Kuma | 128MB | 0.1 |
| Plausible Analytics | 512MB | 0.5 |
| Subtotal | 5,992MB | 5.1 |
| + 20% buffer | 1,198MB | — |
| Total required | ~7.2GB | 6 vCPU |
Recommended VPS: 8GB RAM, 6 vCPU. For production stability with this many services, consider 16GB to handle traffic spikes and deployment concurrency comfortably.
5. Storage Considerations
RAM and CPU get most of the attention in resource planning, but storage is equally important — and more nuanced. Docker images, container layers, build caches, database files, and application logs all consume disk space.
Where Storage Goes
- Docker images — each deployed service stores one or more images. A typical Node.js application image is 200–500MB. A PostgreSQL image is around 400MB. With multiple services and their build history, expect 5–15GB just for images.
- Build cache — Docker layer caching speeds up deployments but accumulates over time. Run
docker system pruneperiodically or configure Coolify’s cleanup settings. - Database volumes — PostgreSQL and MySQL data directories grow continuously. Plan for at least 2x your current dataset size to accommodate growth and vacuuming overhead.
- Application logs — Docker captures stdout/stderr from every container. Without log rotation, these files grow indefinitely.
- Coolify backups — if you are backing up databases locally before transferring to remote storage, each backup consumes disk space temporarily.
Minimum recommended storage: 40GB for a small stack, 80GB for a medium stack, 160GB+ for a full production stack with databases.
6. When to Scale Vertically vs. Horizontally
At some point, adding more RAM and CPU to a single VPS stops being the right answer. Understanding when to scale vertically (bigger server) versus horizontally (more servers) determines whether your infrastructure grows sustainably or becomes a single point of failure.
Scale Vertically When:
- Your total resource requirements fit within a single VPS (up to about 32GB RAM, 8–16 vCPU)
- All your services need low-latency access to each other (e.g., application server and database on the same network)
- Operational simplicity matters more than redundancy (early-stage startups, side projects, small teams)
- You are running a single production environment without staging/preview environments
With MassiveGRID’s Cloud VPS, vertical scaling is particularly efficient because resources (vCPU, RAM, SSD, bandwidth) are independently adjustable. You can add more RAM without changing your CPU allocation, which means you only pay for what you actually need. No need to jump to the next fixed-size tier just because you need 2GB more memory.
Scale Horizontally When:
- You need separate environments (production, staging, development) with full isolation
- Your database requires more resources than your application servers, or vice versa
- You want redundancy — if one server goes down, others continue serving traffic
- Build processes are consuming resources that should be reserved for production traffic
- Compliance requirements mandate separation of concerns (e.g., database server must be on a separate node)
Coolify supports multi-server deployments natively. You designate your primary Coolify server as the control plane and connect additional servers as worker nodes. Applications can then be deployed to specific servers based on their resource needs. See our Coolify multi-server setup guide for the full walkthrough.
The Hybrid Approach
Many teams find the right answer is a combination. A common pattern is:
- Server 1 (Coolify control plane + lightweight services): Coolify dashboard, Uptime Kuma, Gitea, static sites — 4GB RAM
- Server 2 (Production applications): Next.js, API servers, Redis — 8GB RAM
- Server 3 (Databases): PostgreSQL, MongoDB — 8–16GB RAM on a Dedicated VPS for consistent I/O performance
This separation gives you independent scaling for each tier, the ability to upgrade databases without impacting application deployments, and clear resource boundaries between concerns.
7. Resource Monitoring with Coolify
Planning resources upfront is essential, but ongoing monitoring tells you whether your estimates match reality. Coolify provides built-in resource monitoring through its dashboard.
What Coolify Shows You
Coolify’s server monitoring displays real-time and historical data for:
- CPU usage — overall host CPU utilization and per-container breakdown
- Memory usage — total host memory consumption and per-container allocation vs. actual usage
- Disk usage — overall disk utilization and Docker-specific storage consumption
- Network I/O — inbound and outbound traffic per container
Key Metrics to Watch
Check these metrics weekly (or set up alerts) to catch resource pressure before it causes outages:
- Host memory above 80% — you are entering the danger zone. Plan a RAM upgrade or move services to another server.
- CPU sustained above 70% — response times are likely degrading. Identify which container is consuming the most and consider scaling it.
- Disk usage above 75% — Docker builds and database growth will push you to 100% faster than expected. Clean up old images or add storage.
- Container restarts — frequent restarts often indicate OOM kills. Check
docker inspect <container>forOOMKilled: truein the state object.
Command-Line Monitoring
For deeper insights beyond Coolify’s dashboard, use these commands directly on the server:
# Real-time container resource usage
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"
# Check for OOM-killed containers
docker inspect --format='{{.Name}} OOMKilled={{.State.OOMKilled}}' $(docker ps -aq)
# Docker disk usage breakdown
docker system df -v
# Overall system memory with buffer/cache detail
free -h
# Disk usage by directory (find what is consuming space)
du -sh /var/lib/docker/*
8. Optimization Tips
Before upgrading your VPS, check whether you can reduce resource consumption through optimization:
- Use multi-stage Docker builds — smaller images mean less storage and faster deployments. A Next.js image can go from 1.2GB to 200MB with a proper multi-stage Dockerfile.
- Configure database connection pooling — each database connection consumes memory. Tools like PgBouncer reduce PostgreSQL memory usage by 50–70% for applications with many concurrent connections.
- Set Node.js memory limits — add
--max-old-space-size=384to constrain V8 heap usage. Without this flag, Node.js will use as much memory as the container allows. - Use Redis with maxmemory policies — set
maxmemory 128mbandmaxmemory-policy allkeys-lruto prevent Redis from consuming unbounded memory. - Prune Docker regularly — old images, stopped containers, and unused volumes accumulate. Schedule
docker system prune -af --volumesweekly or configure Coolify’s built-in cleanup. - Separate build and runtime — if build processes (npm install, webpack compilation) are consuming production resources, consider building images externally and deploying pre-built images to your production server.
MassiveGRID VPS for Coolify Workloads
- Cloud VPS — independently scalable vCPU, RAM, and SSD. Start small and add resources as your Coolify stack grows, without migrating to a new server. Ideal for multi-app deployments where resource needs change over time.
- Dedicated VPS — guaranteed dedicated CPU cores with no sharing or noisy-neighbor effects. Best for database-heavy workloads (PostgreSQL, MongoDB) where consistent I/O performance is critical.
- Global locations — deploy in New York, London, Frankfurt, or Singapore. Run your Coolify control plane close to your team and worker servers close to your users.
- Full root access — install Coolify, Docker, and any other tooling without restrictions. No locked-down environments or vendor-specific agents.
Plan First, Deploy Confidently
Resource planning is not glamorous, but it is the difference between a Coolify server that runs reliably for months and one that crashes at 2 AM when a traffic spike hits. The approach is straightforward: inventory your services, estimate their resource consumption using the tables in this guide, add the Coolify platform overhead, apply a 20% buffer, and select a VPS that meets the total.
Start with the SaaS starter stack as a baseline — 4GB RAM and 2–4 vCPU handles a surprising amount of workload when resources are properly allocated and limited. Set container memory limits from day one. Monitor actual usage weekly and adjust your estimates based on real data rather than assumptions.
When you outgrow a single server, Coolify’s multi-server architecture lets you add worker nodes without rebuilding your setup. The control plane stays on your primary server while applications spread across additional VPS instances based on their resource profiles.
For the initial Coolify installation and configuration, follow our step-by-step installation guide. And if you need help sizing your infrastructure for a specific workload, MassiveGRID’s team can review your stack and recommend the right configuration.