Migrating from Heroku to Vultr with Dokku
Why Change?
Heroku is removing their free tier.
Vultr is inexpensive and fast.
Dokku makes it easy to self host.
TLDR; (Too Long Didn't Read)
Migration worked, costs are down, speed is up.
Setting Up Vultr
I use VULTR because they are cheaper than most other cloud providers and their VMs are more performant per core and with optional NVMe storage its blazing fast.
Choose Cloud Compute as Server Type.
AMD High Performance as CPU type.
Choose the location closest to you are your customers. Vultr has 25 locations around the globe.
Operating System: Ubuntu 22.04 LTS x64 or newer.
Server Size: 25 GB NVMe, 1 vCPU, 1 GB Memory, 1 TB Bandwidth
Auto Backups, only $1.20/month extra.
Create your server hostname and label. You'll have to wait until the system is created to update your DNS with the IP.
Logging in and Updating
ssh-copy-id [email protected]
ssh [email protected]
apt update
apt upgrade -y
shutdown -r now
Installing Dokku on the VM
wget https://raw.githubusercontent.com/dokku/dokku/v0.29.3/bootstrap.sh
DOKKU_TAG=v0.29.3 bash bootstrap.sh
dokku domains:set-global yourdomain.com
echo "your-public-key-goes-here" | dokku ssh-keys:add admin
dokku apps:create your-app-name
dokku plugin:install https://github.com/dokku/dokku-postgres.git
dokku postgres:create your-db-name-production
dokku postgres:link your-db-name-production your-app-name
# Open Firewall to Web Traffic
ufw allow from any to any port 80
ufw allow from any to any port 443
HTTPS with LetsEncrypt.org
Free https is easy with the Let's Encrypt plugin for Dokku.
dokku config:set app-name DJANGO_ALLOWED_HOSTS=hostname.com
dokku domains:add app-name your-domain.com
dokku domains:set app-name mydomain.com www.mydomain.com
dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
dokku config:set --no-restart app-name [email protected]
dokku letsencrypt:enable app-name
dokku letsencrypt:auto-renew app-name
Deploy Code Via Git Push
pip install cookiecutter
cookiecutter https://github.com/Jean-Zombie/cookiecutter-django-wagtail/
git init .
git add .
git commit -m "Initial Commit"
git remote add dokku [email protected]:projectname
git push dokku main
# Depending on how you manage your static files you may want to generate and commit them
python manage.py collectstatic
If you don't already have a python app, you can start with the heroku python-getting-started.
# To add Existing Repo to git
git init .
git add .
git commit -m "Initial Commit"
git remote
git push dokku main:master