Coolify turns a Linux server into your own deployment platform: connect a Git repository, pick a build pack, and it builds, runs and serves your app over HTTPS. This guide takes a fresh VPS or dedicated server to a first live deployment, following Coolify's official documentation. If you are still deciding between platforms, start with our Coolify vs Openship comparison.
What you need
| Requirement | Minimum | Notes |
|---|---|---|
| CPU | 2 cores | It can run on 1 core, but that is not recommended |
| RAM | 2 GB | Bitdoze reports Coolify idling at ~1.5–2 GB, so leave headroom for builds |
| Disk | 10 GB | Leave room for images and build output |
| Architecture | amd64 or arm64 | Includes 64-bit Raspberry Pi |
| Operating system | Linux only | Debian/Ubuntu, RHEL family (CentOS, Fedora, RHEL, AlmaLinux, Rocky), SUSE, Arch, Alpine, Raspberry Pi OS 64-bit |
| Access | Root over SSH | The installer must run as root |
Coolify runs on a VPS, a dedicated server, a VM, a 64-bit Raspberry Pi or even an old laptop — anything running Linux that you can reach over SSH. The docs recommend starting from a fresh server. On Ubuntu, use an LTS release (20.04, 22.04 or 24.04); non-LTS releases need the manual installation path.
The docs say Coolify can run on 1 CPU core, 512 MB RAM and 4 GB disk, but recommend 2 cores, 2 GB and 10 GB. Bitdoze reports Coolify idling at about 1.5–2 GB of RAM, which is why the 512 MB floor leaves nothing for your apps or builds. Source: Coolify docs (self-hosted installation), Bitdoze.
View data table
| Category | Runs, not recommended | Official minimum |
|---|---|---|
| RAM | 0.5 GB | 2 GB |
| Disk | 4 GB | 10 GB |
Setup at a glance
- 01
Provision a server
Fresh Linux server, 2 cores / 2 GB RAM / 10 GB disk or more.
- 02
SSH in as root
Open the firewall ports listed below first.
- 03
Run the installer
One curl command installs Coolify.
- 04
Open :8000
Browse to http://<server-ip>:8000.
- 05
Create the admin
Immediately — the first account to register gets root-level control.
- 06
Back up .env
Copy /data/coolify/source/.env somewhere safe.
- 07
Set domain & DNS
A and wildcard records, then serve the dashboard on a domain.
- 08
Deploy your first app
Project → resource → build pack → deploy.
Step 1: Open the firewall ports
| Port | Purpose | Keep open? |
|---|---|---|
| 22/tcp | SSH | Always — never remove this rule |
| 80/tcp | HTTP and certificate generation | Yes |
| 443/tcp | HTTPS | Yes |
| 8000/tcp | Dashboard via IP | Only until the dashboard is on a domain |
| 6001/tcp | Real-time communication | Only until the dashboard is on a domain |
| 6002/tcp | Web terminal | Only until the dashboard is on a domain |
Step 2: Run the installer
SSH into the server as root and run the official install script:
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bashStep 3: Create the admin account immediately
When the installer finishes, open http://<server-ip>:8000 and register straight away. The first person to register becomes the administrator — with root-level control of your server. Leaving the registration page open on a public IP, even briefly, is a real risk.
Safer alternative: pre-create the root user
To never expose registration at all, pass the root user's credentials to the installer as environment variables. Replace the example values with your own, and use a strong password:
env ROOT_USERNAME=RootUser ROOT_USER_EMAIL=example@example.com ROOT_USER_PASSWORD='StrongPassword123!' bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash'Step 4: Back up the .env file
Coolify stores its configuration in /data/coolify/source/.env. It contains the APP_KEY that encrypts values in Coolify's database — lose it and those values can't be decrypted. Copy it off the server to a safe place, such as your password manager or an encrypted backup, and keep it out of version control.
Step 5: Point DNS at the server
| Type | Name | Value | Why |
|---|---|---|---|
| A | app (e.g. app.example.com) | Server IP | A specific domain for one application |
| A | * | Server IP | Wildcard for Coolify-generated domains (does not cover the apex domain) |
Point each domain at the server that runs the resource, not at the server that hosts the Coolify dashboard — with multiple servers these are often different machines. Before deploying, confirm the record resolves:
dig +short app.example.com AThe command should print your server's IP. Coolify's own DNS validation uses 1.1.1.1 as its default resolver, so a record that has not propagated there yet will fail validation even if it resolves elsewhere. Once DNS works, configure Coolify to serve the dashboard itself on a domain through its proxy.
Step 6: Deploy your first app
In the dashboard, create a Project and add a resource to it — an application, a database or a one-click service. For an application, connect the repository and choose how it is built:
- Nixpacks — auto-detects the stack and builds it; the usual starting point.
- Railpack — currently in beta.
- Static — for static sites.
- Dockerfile — when your repository already has one.
- Docker Compose — for multi-container stacks.
- Docker image — deploy a prebuilt image instead of building.
By default the build runs on the deployment server itself. The coolify-proxy container on that server — Traefik by default, Caddy as an alternative — routes your domain to the app and obtains a Let's Encrypt certificate, so the first deploy ends on HTTPS.
Step 7: Close the bootstrap ports
Once the dashboard is served on a domain through the proxy, you no longer need ports 8000, 6001 and 6002 open to the internet. Remove those rules and keep 22, 80 and 443. This shrinks the attack surface to the proxy and SSH.
Scaling out: more servers and a build server
Coolify can manage more than one machine: add remote servers over SSH and validate them from the dashboard. You can also add a dedicated build server — it cannot run resources, but it builds images and pushes them to a registry so builds stop competing with production for memory. On a small VPS that is the main lever you have; our comparison with Openship covers how Openship handles the same problem by building off-box.
How we run bytevancer.com on Coolify
This guide is not theory: bytevancer.com itself runs on Coolify. The site is built from a Dockerfile and deployed by a self-hosted Coolify instance (v4.3.x). The source lives in a private GitHub repository connected through Coolify's GitHub App, so every push to main deploys automatically, and a deploy takes about three minutes. Cloudflare sits in front of the site.
- 01
Push to main
A commit lands on main in the private GitHub repo.
- 02
Webhook
Coolify's GitHub App notifies the Coolify instance.
- 03
Build
Coolify builds the image from the repo's Dockerfile.
- 04
Live
The new version is serving about 3 minutes after the push.
- 05
Cloudflare
Traffic reaches the site through Cloudflare.
Lesson 1: closing port 8000 silently stopped auto-deploy (Sep 2026)
Coolify's docs say you can close ports 8000, 6001 and 6002 once the dashboard runs on a domain through the proxy, so we did (Step 7 above). Auto-deploy then stopped without any error in Coolify: the GitHub App's webhook URL still pointed at http://<server-ip>:8000, the port we had just closed.
💥 What broke
Pushes to main no longer started a deploy.
GitHub's Recent Deliveries for the app showed "failed to connect to host".
Cause: the webhook still targeted http://<server-ip>:8000.
🔧 How we fixed it
Updated the GitHub App's Homepage, Callback, Setup and Webhook URLs to the Coolify domain.
Webhook URL: https://coolify.<your-domain>/webhooks/source/github/events
Pushed a commit to test: the deploy started within seconds.
Lesson 2: Search Console said robots.txt was unreachable (Sep 2026)
Google Search Console showed our sitemap as "Couldn't fetch". The URL Inspection live test reported "Robots.txt unreachable", and Crawl stats → Host status showed a high robots.txt fetch fail rate, even though robots.txt returned 200 from 15 locations worldwide.
💥 What broke
Sitemap: "Couldn't fetch". Live test: "Robots.txt unreachable".
High robots.txt fetch fail rate in Crawl stats → Host status.
Two suspects: robots.txt was rendered per request, and Cloudflare's "Bot Preference Sync" prepends Cloudflare's bot settings to robots.txt at the edge.
🔧 How we fixed it
Made robots.txt a static, prebuilt file.
Turned off Cloudflare's "Bot Preference Sync".
Re-ran the live test: "URL is available to Google".
Takeaway: keep robots.txt static, and test it from Search Console's live test, not just curl.
Troubleshooting
Want to compare with the newer alternative? See our Openship setup guide and the Coolify vs Openship breakdown.
