Node 18 is reaching its end of life on April 30th, 2025, so we're updating in order to keep using a maintained version after that date.
129 lines
3.5 KiB
Markdown
129 lines
3.5 KiB
Markdown
# Deploying on Heroku
|
||
|
||
## Manual deployment
|
||
|
||
This tutorial assumes that you have already managed to clone Consul Democracy on your machine and gotten it to work.
|
||
|
||
1. First, create a [Heroku](https://www.heroku.com) account if it isn't already done.
|
||
2. Install the [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli) and sign in using:
|
||
|
||
```bash
|
||
heroku login
|
||
```
|
||
|
||
3. Go to your Consul Democracy repository and instantiate the process:
|
||
|
||
```bash
|
||
cd consuldemocracy
|
||
heroku create your-app-name
|
||
```
|
||
|
||
You can add the flag `--region eu` if you want to use their European servers instead of the US ones.
|
||
|
||
If _your-app-name_ is not already taken, Heroku should now create your app.
|
||
|
||
4. Create a database using:
|
||
|
||
```bash
|
||
heroku addons:create heroku-postgresql
|
||
```
|
||
|
||
You should now have access to an empty Postgres database whose address was automatically saved as an environment variable named _DATABASE\_URL_. Consul Democracy will automatically connect to it when deployed.
|
||
|
||
5. Now, generate a secret key and save it to an ENV variable named SECRET\_KEY\_BASE using:
|
||
|
||
```bash
|
||
heroku config:set SECRET_KEY_BASE=$(rails secret)
|
||
```
|
||
|
||
Also add your server address:
|
||
|
||
```bash
|
||
heroku config:set SERVER_NAME=myserver.address.com
|
||
```
|
||
|
||
You need to let the app know where the configuration variables are stored by adding a link to the ENV variables in _config/secrets.yml_
|
||
|
||
```yml
|
||
production:
|
||
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
|
||
server_name: <%= ENV["SERVER_NAME"] %>
|
||
```
|
||
|
||
and commit this file in the repo by commenting out the corresponding line in the _.gitignore_.
|
||
|
||
```gitignore
|
||
#/config/secrets.yml
|
||
```
|
||
|
||
**Remember not to commit the file if you have any sensitive information in it!**
|
||
|
||
6. To ensure Heroku correctly detects and uses the node.js version defined in the project, we need to make the following changes:
|
||
|
||
In package.json, add the node.js version:
|
||
|
||
```json
|
||
"engines": {
|
||
"node": "20.19.2"
|
||
}
|
||
```
|
||
|
||
and apply:
|
||
|
||
```bash
|
||
heroku buildpacks:add heroku/nodejs
|
||
```
|
||
|
||
7. You can now push your app using:
|
||
|
||
```bash
|
||
git push heroku your-branch:master
|
||
```
|
||
|
||
8. It won't work straight away because the database doesn't contain the tables needed. To create them, run:
|
||
|
||
```bash
|
||
heroku run rake db:migrate
|
||
heroku run rake db:seed
|
||
```
|
||
|
||
9. Your app should now be ready to use. You can open it with:
|
||
|
||
```bash
|
||
heroku open
|
||
```
|
||
|
||
You also can run the console on Heroku using:
|
||
|
||
```bash
|
||
heroku console --app your-app-name
|
||
```
|
||
|
||
10. Heroku doesn't allow saving images or documents in its servers, so it's necessary to setup a permanent storage space.
|
||
|
||
See [our S3 guide](using-aws-s3-as-storage.md) for more details about configuring ActiveStorage with S3.
|
||
|
||
### Configure Twilio Sendgrid
|
||
|
||
Add the Twilio SendGrid add-on in Heroku. This will create a Twilio SendGrid account for the application with a username and allow you to create a password. This username and password can be stored in the application’s environment variables on Heroku:
|
||
|
||
```bash
|
||
heroku config:set SENDGRID_USERNAME=example-username SENDGRID_PASSWORD=xxxxxxxxx
|
||
```
|
||
|
||
Now add this to `config/secrets.yml`, under the `production:` section:
|
||
|
||
```yaml
|
||
mailer_delivery_method: :smtp
|
||
smtp_settings:
|
||
:address: "smtp.sendgrid.net"
|
||
:port: 587
|
||
:domain: "heroku.com"
|
||
:user_name: ENV["SENDGRID_USERNAME"]
|
||
:password: ENV["SENDGRID_PASSWORD"]
|
||
:authentication: "plain"
|
||
:enable_starttls_auto: true
|
||
```
|
||
|
||
**Important:** Turn on one worker dyno so that emails get sent.
|