Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Notes from running Dokku on Digital Ocean.

My notes for Dokku on Digital Ocean.

These may be a bit outdated: Since I originally wrote them, I've reinstalled on a newer Dokku and may not have updated every section below.

Commands

Install dokku-cli (gem install dokku-cli) for a more Heroku-like CLI experience (dokku config:set FOO=bar).

# List/run commands when not on Dokku server (assuming a "henroku" ~/.ssh/config alias)
ssh henroku dokku
ssh henroku dokku config:get my-app

# Access the server, list commands, run command
ssh henroku
dokku
dokku config:get my-app

# See memory usage
# Source: https://gist.github.com/SQiShER/5d8cd3f14e4c72c39456#gistcomment-2209487
sudo docker stats $(sudo docker ps --format={{.Names}})
# With highest usage first, not live-updating
# Source: https://stackoverflow.com/a/54230482/6962
sudo docker stats --no-stream --format "table {{.Name}}\t{{.Container}}\t{{.MemUsage}}" | sort -k 3 -h -r
 
# See server stats (memory, disk usage, load) - same as shown on login
landscape-sysinfo

# Interesting dirs
cd /var/lib/dokku/plugins  # plugins
cd ~dokku  # apps

Adding a new app

git remote add dokku dokku@henroku.nyh.name:my-app  # Note to self: This might actually be "dokku.nyh.name" these days.
git push dokku

ssh henroku dokku domains:add my-app my-app.nyh.name  # and configure DNS

# DB?
ssh henroku dokku psql:create my-app

# memcache?
ssh henroku dokku memcached:create my-app  # MEMCACHE_SERVERS env will be set

Working with an app

# See logs
ssh henroku dokku logs my-app -t

# Conf
ssh henroku dokku config:get my-app
ssh henroku dokku config:set my-app KEY1=val KEY2=val

Removing a plugin

cd /var/lib/dokku/plugins
rm -rf the-plugin

# List containers, remove the ones from the plugin
ssh henroku
sudo docker ps -a
docker rm <the id>

# List images, remove the ones from the plugin
docker images
docker rmi <the id>

Setup

Use Digital Ocean's "Ubuntu with Dokku" image.

Create a swapfile to avoid out-of-memory errors during build/deploy (I got those sometimes even with a 1 GB RAM image):

ssh henroku
dd if=/dev/zero of=/swapfile bs=1024 count=1024000
mkswap /swapfile
swapon /swapfile

Change the default root password to avoid later issues with crontab not working:

sudo -u root passwd

Follow the instructions, specifying a new password as prompted, and store it in e.g. 1Password.

DNS

It's convenient to set up wildcard DNS so e.g. *.henroku.nyh.name points to this server.

With LoopiaDNS, you need to add a CNAME for sub-subdomain wildcards (e.g. *.henroku.nyh.name pointing to henroku.nyh.name).

Plugins

memcached

https://github.com/Flink/dokku-memcached-plugin

This fork seems to be the most up to date, with nice features like autostart on server reboot.

cd /var/lib/dokku/plugins
git clone git@github.com:Flink/dokku-memcached-plugin.git
git clone https://github.com/rlaneve/dokku-link.git link  # dependency
dokku plugins-install

PostgreSQL

https://github.com/Flink/dokku-psql-single-container

Before you install, see the section on getting a newer version of Postgres. At the time of writing, 9.4 has some cool new features over the default 9.3.

After install, run: dokku psql:start

(Got errors from Kloadut/dokku-pg-plugin, and it seems unmaintained.)

DB backups

Put one of these scripts (for dokku-postgres or for dokku-psql-single-container) in /root/database_backups.sh, run chmod +x /root/database_backups.sh.

Then add something like this to crontab:

# m h  dom mon dow   command
  0 0  *   *   *     /root/database_backups.sh

You will get daily backups in /var/backups/postgres. The script keeps a few days and then removes too old ones. Digital Ocean's infrequent server backups will include these dumps.

I recommend also adding a healthcheck to the cron job.

Static sites alongside Dokku

See this blog post.

Resources

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.