Deploying a Ruby app to production server with Dokku

in deploy •  5 years ago  (edited)

Tutorial how to easily deploy Ruby on Rails application to production ready environment.

In this tutorial we will use Dokku PaaS (Platform as a Service) and Digital Ocean for our servers servers.

Let's start by WHAT IS DOKKU?

Dokku is an extensible, open source PaaS (Platform as a Service) that runs on a single server of your choice.

To start using Dokku, you'll need a system that meets the following minimum requirements:

A fresh installation of Ubuntu 16.04/18.04 x64, Debian 9+ x64 or CentOS 7 x64 (experimental) with the FQDN set [1]

At least 1 GB of system memory [2]

You can optionally have a domain name pointed at the host's IP, though this is not necessary.

I personally recommend one of these providers:

Digital Ocean ( Get $100 using this link )

Vultr ( Get $100 using this link )

Linode


Once you are registered with one of these providers, create an instance with ubuntu 18.04 LTS and connect by ssh ( I recommend to chose more than 1 GB RAM ).

Update first:

sudo apt-get update
sudo apt-get upgrade
sudo reboot

Install Dokku:

wget https://raw.githubusercontent.com/dokku/dokku/v0.19.13/bootstrap.sh;
sudo DOKKU_TAG=v0.19.13 bash bootstrap.sh

Setup SSH key and Virtualhost Settings:

Once the installation is complete, you can open a browser to setup your SSH key and virtualhost settings. Open your browser of choice and navigate to the host's IP address - or the domain you assigned to that IP previously - and configure Dokku via the web admin.

Done :) From here it is almost the same as using heroku.


Deploy your first application:

Deploying to Dokku

Once you have configured Dokku with at least one user, you can deploy applications using git push. To quickly see Dokku deployment in action, try using the Heroku Ruby on Rails "Getting Started" app.

shell

# from your local machine
# SSH access to github must be enabled on this host
git clone https://github.com/heroku/ruby-getting-started

Create the app

SSH into the Dokku host and create the application as follows:

shell

# on the Dokku host
dokku apps:create ruby-getting-started

Create the backing services

Dokku by default does not provide datastores (e.g. MySQL, PostgreSQL) on a newly created app. You can add datastore support by installing plugins, and the Dokku project provides official plugins for common datastores.

The Getting Started app requires a PostgreSQL service, so install the plugin and create the related service as follows:

shell

# on the Dokku host
# install the postgres plugin
# plugin installation requires root, hence the user change
sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git

# create a postgres service with the name railsdatabase
dokku postgres:create railsdatabase

Each service may take a few moments to create.

Linking backing services to applications

Once the services have been created, you then set the DATABASE_URL environment variable by linking the service, as follows:

shell

# on the Dokku host
# each official datastore offers a `link` method to link a service to any application
dokku postgres:link railsdatabase ruby-getting-started

Dokku supports linking a single service to multiple applications as well as linking only one service per application.

Deploy the app

Warning: Your app should respect the PORT environment variable, otherwise it may not respond to web requests. You can find more information in the port management documentation.**

Now you can deploy the ruby-getting-started app to your Dokku server. All you have to do is add a remote to name the app. Applications are created on-the-fly on the Dokku server.

shell

# from your local machine
# the remote username *must* be dokku or pushes will fail
cd ruby-getting-started
git remote add dokku [email protected]:ruby-getting-started
git push dokku master

Note: Some tools may not support the short-upstream syntax referenced above, and you may need to prefix the upstream with the scheme ssh:// like so: ssh://[email protected]:ruby-getting-started Please see the Git documentation for more details.

Note: Your private key should be registered with ssh-agent in your local development environment. If you get a permission denied error when pushing, you can register your private key as follows: ssh-add -k ~/<your private key>.

After running git push dokku master, you should have output similar to this in your terminal:

Counting objects: 231, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (162/162), done.
Writing objects: 100% (231/231), 36.96 KiB | 0 bytes/s, done.
Total 231 (delta 93), reused 147 (delta 53)
-----> Cleaning up...
-----> Building ruby-getting-started from herokuish...
-----> Adding BUILD_ENV to build environment...
-----> Ruby app detected
-----> Compiling Ruby/Rails
-----> Using Ruby version: ruby-2.2.1
-----> Installing dependencies using 1.9.7
Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
Fetching gem metadata from https://rubygems.org/...........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Using rake 10.4.2

...

=====> Application deployed:
http://ruby-getting-started.dokku.me

Once the deploy is complete, the application's web URL will be generated as above.

Dokku supports deploying applications via Heroku buildpacks with Herokuish, as well as by using a project's Dockerfile.

Skipping deployment

If you only want to rebuild and tag a container, you can skip the deployment phase by setting $DOKKU_SKIP_DEPLOY to true by running:

shell

# on the Dokku host
dokku config:set ruby-getting-started DOKKU_SKIP_DEPLOY=true

Redeploying or restarting

If you need to redeploy or restart your app:

shell

# on the Dokku host
dokku ps:rebuild ruby-getting-started

See the process scaling documentation for more information.

Deploying with private Git submodules

Dokku uses Git locally (i.e. not a Docker image) to build its own copy of your app repo, including submodules, as the dokku user. This means that in order to deploy private Git submodules, you need to put your deploy key in /home/dokku/.ssh/ and potentially add github.com (or your VCS host key) into /home/dokku/.ssh/known_hosts. You can use the following test to confirm your setup is correct:

shell

# on the Dokku host
su - dokku
ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
ssh -T [email protected]

Warning: if the buildpack or Dockerfile build process require SSH key access for other reasons, the above may not always apply.

DEPLOYING TO SUBDOMAINS

If you do not enter a fully qualified domain name when pushing your app, Dokku deploys the app to <remotename>.yourdomain.tld as follows:

shell

# from your local machine
# the remote username *must* be dokku or pushes will fail
git remote add dokku [email protected]:ruby-getting-started
git push dokku master

output

remote: -----> Application deployed:
remote: http://ruby-getting-started.dokku.me

You can also specify the fully qualified name as follows:

shell

# from your local machine
# the remote username *must* be dokku or pushes will fail
git remote add dokku [email protected]:app.dokku.me
git push dokku master

output

remote: -----> Application deployed:
remote: http://app.dokku.me

This is useful when you want to deploy to the root domain:

shell

# from your local machine
# the remote username *must* be dokku or pushes will fail
git remote add dokku [email protected]:dokku.me
git push dokku master

output

... deployment ...

remote: -----> Application deployed:
remote: http://dokku.me

DOKKU/DOCKER CONTAINER MANAGEMENT COMPATIBILITY

Dokku is, at its core, a Docker container manager. Thus, it does not necessarily play well with other out-of-band processes interacting with the Docker daemon.

Prior to every deployment, Dokku will execute a cleanup function. As of 0.5.x, the cleanup removes all containers with the dokku label where the status is either dead or exited (previous versions would remove all dead or exited containers). The cleanup function also removes all images with dangling status.

ADDING DEPLOY USERS

See the user management documentation.

DEFAULT VHOST

See the nginx documentation.

DEPLOYING NON-MASTER BRANCH

See the Git documentation.

DOCKERFILE DEPLOYMENT

See the Dockerfile documentation.

IMAGE TAGGING

See the image tagging documentation.

SPECIFYING A CUSTOM BUILDPACK

See the buildpack documentation.

REMOVING A DEPLOYED APP

See the application management documentation.

RENAMING A DEPLOYED APP

See the application management documentation.

ZERO DOWNTIME DEPLOY

See the zero-downtime deploy documentation.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!