dokku

$npx mdskill add TerminalSkills/skills/dokku

Deploy web apps to VPS via git push without Kubernetes.

  • Automates serverless-style hosting for Node, Python, and Ruby applications.
  • Integrates with SSH, git, and Let's Encrypt for SSL management.
  • Executes commands based on app type and detected buildpacks.
  • Outputs terminal logs and confirms successful deployment status.
SKILL.md
.github/skills/dokkuView on GitHub ↗
---
name: dokku
description: >-
  Deploy apps with Dokku — self-hosted Heroku alternative on any VPS. Use when: self-hosting
  web apps without Kubernetes, setting up git-push deployments, running PaaS on your own server.
license: Apache-2.0
compatibility: "Ubuntu 22.04/20.04 or Debian 11/12 VPS"
metadata:
  author: terminal-skills
  version: "1.0.0"
  category: devops
  tags: [dokku, self-hosted, paas, heroku-alternative, deployment]
  use-cases:
    - "Deploy a Node.js/Python/Ruby app to a DigitalOcean droplet with git push"
    - "Set up Postgres and Redis for a self-hosted SaaS app"
    - "Add custom domain with automatic SSL via Let's Encrypt"
  agents: [claude-code, openai-codex, gemini-cli, cursor]
---

# Dokku

## Overview

Dokku is an open-source PaaS that turns any VPS into a Heroku-like platform. Deploy apps with `git push`, manage databases with plugins, and get automatic SSL — all on infrastructure you control.

## Install on VPS

```bash
# Ubuntu 22.04 (run as root)
wget -NP . https://dokku.com/install/v0.35.0/bootstrap.sh
sudo DOKKU_TAG=v0.35.0 bash bootstrap.sh

# Set up SSH key and hostname
cat ~/.ssh/authorized_keys | dokku ssh-keys:add admin
dokku domains:set-global yourdomain.com
```

## Deploy an App

```bash
# On your VPS: create app
dokku apps:create myapp

# On your local machine: add remote and push
git remote add dokku dokku@your-server.com:myapp
git push dokku main
```

Dokku auto-detects buildpacks (Node.js, Python, Ruby, Go, etc.) or uses your `Dockerfile`.

## Procfile

```
web: node server.js
worker: node worker.js
release: npm run migrate
```

## Environment Variables

```bash
# Set config vars
dokku config:set myapp NODE_ENV=production SECRET_KEY=abc123

# View all vars
dokku config:show myapp

# Import from .env file
cat .env | xargs dokku config:set myapp
```

## PostgreSQL Plugin

```bash
# Install plugin
sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git postgres

# Create database and link to app
dokku postgres:create myapp-db
dokku postgres:link myapp-db myapp
# Sets DATABASE_URL automatically
```

## Redis Plugin

```bash
sudo dokku plugin:install https://github.com/dokku/dokku-redis.git redis
dokku redis:create myapp-redis
dokku redis:link myapp-redis myapp
# Sets REDIS_URL automatically
```

## Custom Domains + SSL

```bash
# Add domain
dokku domains:add myapp myapp.com www.myapp.com

# Install Let's Encrypt plugin
sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
dokku config:set --global DOKKU_LETSENCRYPT_EMAIL=you@email.com

# Enable SSL
dokku letsencrypt:enable myapp
dokku letsencrypt:cron-job --add  # auto-renew
```

## Zero-Downtime Deploys

```bash
# Enable checks (waits for app to respond before switching)
dokku checks:enable myapp

# Or use rolling restarts
dokku ps:set-restart-policy myapp always
```

## Scaling

```bash
# Scale web processes
dokku ps:scale myapp web=2 worker=1

# View process status
dokku ps:report myapp
```

## Persistent Storage

```bash
# Mount a directory (for uploads, etc.)
dokku storage:mount myapp /var/lib/dokku/data/storage/myapp:/app/uploads
```

## Useful Commands

```bash
dokku apps:list           # List all apps
dokku logs myapp -t       # Tail logs
dokku run myapp bash      # Open shell in container
dokku ps:restart myapp    # Restart app
dokku backup              # Backup all data
```

## Dockerfile Deploy

Dokku auto-uses your `Dockerfile` if present. Expose a port and Dokku routes traffic to it:

```dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
```

## Multi-Server Setup

```bash
# Add additional nodes (Dokku Scheduler)
dokku scheduler:set myapp selected docker-local

# Or use Kubernetes scheduler plugin for K8s deployments
sudo dokku plugin:install https://github.com/dokku/dokku-scheduler-kubernetes.git
```
More from TerminalSkills/skills