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.
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
git remote add dokku [email protected]: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
# 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
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>
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.
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
).
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 [email protected]:Flink/dokku-memcached-plugin.git
git clone https://github.com/rlaneve/dokku-link.git link # dependency
dokku plugins-install
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.)
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.
See this blog post.
For my own future reference:
If Dokku seems to get stuck with extra Docker processes like
my-app.web.1
my-app.web.1.1557421298
my-app.web.1.1557094771
(probably due to a half-completed deploy for some reason), this is the only thing I found to fix them:
ssh dokku ps:stop my-app
sudo docker stats --no-stream --format "table {{.Name}}\t{{.Container}}\t{{.MemUsage}}" | sort -k 3 -h -r
sudo docker stop my-app.web.1.1557094771
and so onps:start
wasn't enough)