Technical Writer II

Coolify is an open-source, self-hosted Platform as a Service (PaaS) that gives you a Heroku-style developer experience on your own infrastructure. Instead of configuring Docker, reverse proxies, databases, and CI/CD manually on every server, you can install Coolify once, connect additional machines over SSH, and deploy containerized apps through a single web dashboard.
This tutorial provides a beginner-friendly walkthrough for installing and configuring Coolify on a self-hosted Ubuntu server. You’ll learn how to connect additional servers, deploy your first containerized application, provision a database, secure everything with HTTPS, and troubleshoot common issues so you can run modern workloads on DigitalOcean Droplets without taking on the operational overhead of a full Kubernetes cluster.
By following this guide, you’ll learn how to deploy, secure, and operate Coolify as a flexible, self-hosted PaaS for anything from side projects to serious production workloads.
Coolify wraps Docker, reverse proxying, and multi-node orchestration behind a web interface so you can:
Coolify offers a compelling middle ground for those who have moved beyond simple single Droplet environments, custom Nginx proxies, or basic shell scripts, but aren’t ready for the overhead of maintaining a full Kubernetes cluster. It’s a self-hosted Platform-as-a-Service (PaaS) that provides powerful abstractions built upon familiar components.
Coolify is designed to feel familiar to developers coming from managed PaaS platforms:
Like other modern platforms, you can run Coolify in several ways:
| Option | Pros | Cons | Recommended For |
|---|---|---|---|
| Single local server | Fast to set up, no cloud cost | No redundancy, limited resources | Personal projects, local labs |
| Single cloud Coolify server | Simple architecture, easy DNS + HTTPS | Apps and DBs share resources | Small teams, prototypes |
| Coolify server + app servers | Isolated workloads, better scaling & resilience | Requires networking and node planning | Production apps, multi-team environments |
| Hybrid (local + cloud) | Mix of on-prem and cloud resources | More complex to reason about | Organizations with existing on-prem footprint |
For most developers and small teams, a single Coolify server plus one or more app/database servers in the same region strikes the right balance between simplicity and resilience.
Before you deploy Coolify, make sure you have:
sudo access via SSHAlthough Coolify installs Docker itself, it’s helpful to be familiar with basic Docker commands. If you haven’t worked with Docker on Ubuntu before, review:
To begin, connect to the server that will act as your Coolify server. This is the main node that manages your applications and infrastructure.
Replace 192.168.2.2 with your actual server’s domain name or IP address. If it’s a newly provisioned server, ensure that your SSH key has been added either via your cloud provider’s dashboard or manual configuration.
For example, connect as the root user:
ssh root@192.168.2.2
Update the package index and install security patches:
sudo apt update && sudo apt upgrade -y
Coolify relies on the server’s hostname resolving to a non-loopback IP. If the hostname points to 127.0.0.1 or multiple IPs, some operations may fail or show confusing addresses.
Check how the hostname resolves:
hostname --ip-address
If you see only loopback addresses (like 127.0.0.1), update /etc/hosts:
sudo nano /etc/hosts
Example:
127.0.0.1 localhost
192.0.2.10 coolify-server.example.com coolify-server
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Save the file and re-run:
hostname --ip-address
You should now see your Coolify server’s routable IP.
Coolify provides a one-command installer that sets up Docker, Traefik, the core services, and the dashboard.
Run:
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | sudo bash

The script will:
When the install completes (typically 3-5 minutes), you’ll see output similar to:

The installer will display the dashboard URL. Note any credentials or follow-up instructions shown in the terminal output.
Open the URL in your browser:
https://coolify-server.example.com
Note: If DNS is not fully propagated yet, you can temporarily use the Droplet IP.
On first visit, Coolify guides you through an onboarding flow to configure your instance:
Create the owner account
Review basic configuration
Create your first project
My First Projectproduction environmentThis initial setup bootstraps your control plane and gives you a dedicated space to start adding servers and applications.
The Coolify server hosts the Coolify dashboard and some platform services. Your applications and databases can run on:
To add a new server from the dashboard:
Go to Servers → Add Server.
Choose Local (same machine) or SSH (remote server).
For SSH servers, provide:
app-1.example.com)root or a sudo-capable user)Coolify will generate an SSH key and display it in the dashboard. Copy the entire public key (it will start with ssh-ed25519 or ssh-rsa) and add it to the target server’s ~/.ssh/authorized_keys:
echo "ssh-ed25519 AAAA...your-actual-key-here... coolify" | sudo tee -a ~/.ssh/authorized_keys
Note: Replace the placeholder AAAA...your-actual-key-here... with the complete public key shown in the Coolify dashboard.
Click Verify in the Coolify UI to confirm connectivity.
Once verified, Coolify installs Docker and its agent on the managed server (this typically takes 1-2 minutes). The dashboard will then report CPU, RAM, disk, and status metrics for the new server.
Repeat this process for:
Most production workloads will come from your own repositories. Coolify can build and deploy these directly from Git.
In the dashboard, connect your Git provider (GitHub, GitLab, Gitea, or others).
Add a new Application and select Git Repository as the source.
Choose the repo and branch (for example, main).
Provide a Dockerfile or use a preset for common frameworks.
Configure environment variables and secrets:
NODE_ENV=productionDATABASE_URL=postgres://user:password@db:5432/appExample Dockerfile for a Node.js/Next.js app:
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/.next ./.next
COPY package*.json ./
RUN npm ci --omit=dev
EXPOSE 3000
CMD ["npm", "start"]
Enable Auto-deploy on push if you want each commit to trigger a rebuild and rollout.
Click Deploy to perform the initial build and deployment.
Coolify will clone the repo, build the image with BuildKit caching (this typically takes 2-5 minutes depending on your Dockerfile complexity), start the container, and attach it to Traefik for HTTPS routing. Navigate to the application’s detail page and click the Logs tab to watch the build progress in real-time.
Note: For first-time deployments, watch the logs for any build errors. Common issues include missing dependencies, incorrect Dockerfile paths, or environment variable misconfigurations.
Coolify comes with recipes for common backing services:
To create a PostgreSQL instance:
15)Copy the connection URI from the database resource page (found under “Connection Information”) and use it in your application’s environment variables. Example format:
DATABASE_URL=postgres://app_user:strongpassword@postgresql:5432/app_db
Note: Replace the example values above with the actual credentials generated by Coolify. The connection URI format may vary depending on your network configuration (use the service name postgresql for same-project containers, or the full domain for external connections).
You can also manage:
To validate your Coolify setup and see how containerized applications work in practice, you can deploy a well-known service like Jenkins. This example demonstrates deploying a pre-built Docker image from Docker Hub.
Jenkins is a popular CI/CD automation server that many teams use for building, testing, and deploying applications. By deploying it through Coolify, you can manage Jenkins alongside your other applications, benefit from automatic HTTPS, and easily scale or migrate it to different servers.
In your project, click Add Resource → Applications.

Pick a template or choose Docker Hub / Container Registry and search for jenkins/jenkins:lts.
Configure the application:
jenkins-cijenkins.example.com8080 (Jenkins default)/var/jenkins_home to a named volume, or to an attached disk path like /mnt/data/jenkins_home to persist Jenkins configuration and job data.

Save and click Deploy.
Coolify will:
Jenkins container being deployed in Coolify dashboard.
Once the status changes to Running (as shown below):

open https://jenkins.example.com in your browser to begin Jenkins’ built-in onboarding.

After a few moments, you should see Jenkins fully installed and operational.
You’ll be able to install plugins, create jobs, and configure Jenkins just as you would in a traditional installation, but now with the added benefits of Coolify’s management interface, automatic HTTPS, and easy backup/restore through volume management.
This example shows how Coolify simplifies deploying any containerized application, whether it’s a pre-built image from a registry or a custom application built from your Git repositories.
| Error or Symptom | Possible Cause | Suggested Fix |
|---|---|---|
| Hostname resolves to 127.0.0.1 only | Incorrect /etc/hosts configuration |
Map hostname to public IP, re-check hostname --ip-address. |
| Server fails to register over SSH | Missing SSH key or locked-down firewall | Add Coolify’s public key to authorized_keys, open port 22 to the Coolify server IP. |
Application stuck in exited state |
Crash loop, port conflict, bad env vars | Check container logs, adjust port mapping, or correct environment vars. |
| HTTPS not issued for a domain | DNS not propagated or port 80 blocked | Confirm DNS A record, ensure ports 80/443 are open, retry certificate. |
| Database data not persisting | Volume not configured correctly | Attach a named volume or host path and redeploy the database service. |
Use Coolify’s logs and server metrics to zero in on issues. For deeper observability, forward logs to ELK or send metrics to a Prometheus/Grafana stack.
Q1: Is Coolify secure enough for production?
Yes, Coolify runs applications in Docker containers, terminates HTTPS via Traefik, and stores secrets separately from code. You should still harden the OS with firewalls, regular patching, and SSH best practices.
Q2: Can I run multiple servers under a single Coolify instance?
Absolutely. You can register multiple servers, deploy different apps to each, and use projects/environments to keep resources organized.
Q3: Does Coolify only work with Docker-based apps?
Coolify is Docker-first. If your application can be containerized, it can run under Coolify. For non-containerized apps, you’ll typically create a Docker image as part of your migration.
Q4: How do auto-deploys from Git work?
After connecting your Git provider, Coolify sets up webhooks so that pushes to a branch (for example, main) trigger a new build and deployment. You can pause auto-deploys or keep them manual for critical services.
Q5: Can I back up my Coolify-managed databases?
Yes. You can run scheduled jobs inside Coolify to execute pg_dump or other backup commands and push artifacts to block storage or object stores such as DigitalOcean Spaces.
Q6: What happens if the Coolify server goes down?
Applications on managed servers continue running, but you lose the dashboard and orchestration temporarily. Keep backups of the Coolify server and consider running it on a more resilient VM class.
Coolify gives you a practical, self-hosted PaaS layer on top of Docker, helping you standardize deployments across Droplets and other VMs without jumping straight into Kubernetes. With a single Coolify server, a handful of managed servers, and Git-backed builds, you can run production applications with clear visibility into logs, resources, and failures.
Set up the Coolify server, add one or two app servers, deploy a test workload like Jenkins, and then move your real applications over incrementally. As you grow, you can add more servers, environments, and services without rebuilding your platform from scratch.
To deepen your understanding of the underlying technologies and deployment patterns, explore:
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
Building future-ready infrastructure with Linux, Cloud, and DevOps. Full Stack Developer & System Administrator. Technical Writer @ DigitalOcean | GitHub Contributor | Passionate about Docker, PostgreSQL, and Open Source | Exploring NLP & AI-TensorFlow | Nailed over 50+ deployments across production environments.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.
Full documentation for every DigitalOcean product.
The Wave has everything you need to know about building a business, from raising funding to marketing your product.
Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.
New accounts only. By submitting your email you agree to our Privacy Policy
Scale up as you grow — whether you're running one virtual machine or ten thousand.
Sign up and get $200 in credit for your first 60 days with DigitalOcean.*
*This promotional offer applies to new accounts only.