> For the complete documentation index, see [llms.txt](https://samypesse.gitbook.io/heroku-node/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://samypesse.gitbook.io/heroku-node/configuration.md).

# Configuration

In this chapter, we'll learn how to manage different configurations for our applications (locally and in production).

## Environment variables

The best way to configure an application on Heroku is to use **environment variables**. It's a key value storage managed by the system that can affect the way running processes will behave on a computer.

Exemple of an env variable:

```
MESSAGE=Hello World
```

You can list all current environment variables using the command `env`.

Heroku defines by default 2 environement variables:

* `PORT` which equals the port our application should be running on.
* `DYNO` which gives you a id/name for the current process dyno.

## With Node.js

In Node.js, it's really easy to read environment variable, the varibale `process.env` is an object containing all current env variables.

We already used it to start our application on the right port: `var port = Number(process.env.PORT || 5000);`.

Notice that environment variables are always **string**.

## Modifying our application

We are going to change our application to show a message instead of "Hello World" that will be stored in a en environment variables.

Edit the **main.js** file to change the `app.get` to:

```javascript
app.get('/', function(req, res) {
  res.send(process.env.MESSAGE || 'Default message!');
});
```

If you run the application using `foreman start` and access `http://localhost:5000`, you'll see : `Default message!`.

But you can test changing the value of **MESSAGE** in your terminal and running the application with:

```
$ export MESSAGE=Hello
$ foreman start
```

## Storing a fixed configuration for foreman

You don't want to define using `export` our all configuration each time you want to start working on your application!

So we need to store our configuration in a file. By default foreman use a file named `.env` but we are going to use this file for your production configuration.

So we'll store our configuration in a file named `.env.local`:

```
MESSAGE=Hello from the local version
```

And we need to update foreman configuration by writting the file `.foreman`:

```
port: 5000
env: .env.local
```

You can then test using `foreman start` and see teh output: `Hello from the local version`.

## Deployment of a production configuration

We are going to store our production configuration in a file named `.env`:

```
MESSAGE=Hello from the production version
```

Then we need to commit all these changes and deploy the last update of our code to Heroku:

```
# Commit changes
$ git add .
$ git commit -m "Use environment variables as configuration"

# Deploy to heroku
$ git push heroku master
```

But if you take a look at your application (using `heroku open`), you can see that the message is still "Default message!". It's because we didn't pushed your configuration to heroku yet.

For this we are going to use the plugin [heroku-config](https://github.com/ddollar/heroku-config), install it using:

```
$ heroku plugins:install git://github.com/ddollar/heroku-config.git
```

And then we can push our all configuration using:

```
$ heroku config:push
```

Now take a look at your application and you'll see "Hello from the production version".

## Managing Heroku configuration by hand

| I want to...             | Command                          |
| ------------------------ | -------------------------------- |
| List all my configuraton | `heroku config`                  |
| Get a variable value     | `heroku config:get MESSAGE`      |
| Set a variable value     | `heroku config:set MESSAGE=Test` |
| Delete a variable        | `heroku config:unset MESSAGE`    |

And with the plugin **heroku-config**:

| I want to...                          | Command                          |
| ------------------------------------- | -------------------------------- |
| Push my .env to heroku                | `heroku config:push`             |
| Update my .env with my heroku config  | `heroku config:pull`             |
| Rewrite my .env with my heroku config | `heroku config:pull --overwrite` |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://samypesse.gitbook.io/heroku-node/configuration.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
