Before getting started, ensure you have a Dokku instance running with a new app. An example app can be created following these steps:
# on the Dokku host
dokku apps:create amber-app
# Setup postgres db
sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git
dokku postgres:create amber-db
# This sets the DATABASE_URL env var
dokku postgres:link amber-db amber-app
Buildpacks tell Dokku how to build and deploy your application. Create a file named .buildpacks in the root of your project and with this:
https://github.com/amberframework/heroku-buildpack-amber.git
# If you need js / css compiled
https://github.com/heroku/heroku-buildpack-nodejs.git
{% hint style="danger" %}
If you want js / css to be compiled, you need to modify the build command in package.json to "build": "npm run release",. Because the nodejs buildpack expects npm build to compile the production assets.
{% endhint %}
{% hint style="danger" %}
Not defining a .buildpack file will cause Dokku to build your project using the
Dockerfile as Dokku will auto-detect it, this will not work and cause issues.
{% endhint %}
It's best practice to lock your crystal version to the one you're using. Without this the latest version of crystal will be used, potentially causing issues in deployment.
Create a file named .crystal-version in the root of your project with the
wanted crystal version:
0.31.1
To deploy your app to Dokku you're going to need a Procfile. Create a Procfile at the root of your Amber application and add the following:
release: bin/amber db migrate
web: bin/{your-app-name}The Amber buildpack takes care of compiling the project for you.
Where ever your application runs, it needs to be in production mode.
ssh dokku@{yourdokku.com} config:set {your-app-name} AMBER_ENV=productionEnsure you first run:
amber encryptTo be able to decrypt and use production environment you'll need to set ENV["AMBER_ENCRYPTION_KEY"] to the value of your local projects .encryption_key file.
{% hint style="danger" %}
Never add .encryption_key to github. Amber adds it by default to your .gitignore file.
{% endhint %}
Copy the key from .encryption_key and set it to env, like so:
ssh dokku@{yourdokku.com} config:set {your-app-name} AMBER_ENCRYPTION_KEY={your_key}In order for the buildpack to work properly your application has to:
- Listen on the environment's port.
- Connect to any services like redis / database.
Ensure these settings are in your settings.cr file.
Amber::Server.configure do |settings|
settings.host = "0.0.0.0"
settings.port = ENV["PORT"].to_i if ENV["PORT"]?
settings.redis_url = ENV["REDIS_URL"] if ENV["REDIS_URL"]?
settings.database_url = ENV["DATABASE_URL"] if ENV["DATABASE_URL"]?
endAll that's left is to create a git repository, add the Dokku remote and push it there.
$ git init
$ git remote add dokku dokku@{yourdokku.com}:{your-app-name}
$ git add -A
$ git commit -m "My first Amber app"
$ git push dokku master
More information on how to deploy your app can be found on the Dokku docs