# Heroku

## Instalación manual

Este tutorial asume que ya has conseguido clonar Consul Democracy en tu máquina y conseguir que funcione.

1. En primer lugar, necesitas crear una cuenta en [Heroku](https://www.heroku.com) si no lo has hecho ya.
2. Instala [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli) e inicia sesión con:

```bash
heroku login
```

3. Accede a tu repositorio de Consul Democracy y crea una instancia:

```bash
cd consuldemocracy
heroku create your-app-name
```

Puedes añadir `--region eu` si quieres utilizar servidores europeos en lugar de los estadounidenses.

Si *your-app-name* no existe aún, Heroku creará tu aplicación.

4. Crea la base de datos con:

```bash
heroku addons:create heroku-postgresql
```

Ahora deberías tener acceso a una base de datos Postgres vacía cuya dirección se guardó automáticamente como una variable de entorno llamada *DATABASE\_URL*. Consul Democracy se conectará automáticamente a ella durante la instalación.

5. Ahora, genera una clave secreta y guárdala en la variable de entorno SECRET\_KEY\_BASE de la siguiente manera:

```bash
heroku config:set SECRET_KEY_BASE=$(rails secret)
```

Añade también la dirección de tu servidor:

```bash
heroku config:set SERVER_NAME=myserver.address.com
```

Es necesario que la aplicación sepa dónde se almacenan las variables de configuración añadiendo un enlace a las variables de entorno en *config/secrets.yml*

```yml
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
  server_name: <%= ENV["SERVER_NAME"] %>
```

y añade este archivo en el repositorio comentando la línea correspondiente en el *.gitignore*.

```gitignore
#/config/secrets.yml
```

**¡Recuerda no añadir el archivo si tienes información sensible en él!**

6. Para que Heroku detecte y utilice correctamente la versión de node.js definida en el proyecto deberemos añadir los siguientes cambios:

En el *package.json* añadir la versión de node.js:

```json
"engines": {
  "node": "18.20.3"
}
```

y aplicar:

```bash
heroku buildpacks:add heroku/nodejs
```

7. Ahora ya puedes subir tu aplicación utilizando:

```bash
git push heroku your-branch:master
```

8. No funcionará de inmediato porque la base de datos no contiene las tablas necesarias. Para crearlas, ejecuta:

```bash
heroku run rake db:migrate
heroku run rake db:seed
```

9. Ahora tu aplicación debería estar ya operativa. Puedes abrirla con:

```bash
heroku open
```

También puedes arrancar la consola en heroku utilizando

```bash
heroku console --app your-app-name
```

10. Heroku no permite guardar imágenes o documentos en sus servidores, por lo que es necesario configurar un nuevo espacio de almacenamiento.

Consulta [nuestra guía de S3](https://github.com/consuldemocracy/consuldemocracy/blob/docs-2.3/docs/es/installation/using-aws-s3-as-storage.md) para más detalles sobre la configuración de ActiveStorage con S3.

### Configurar Twilio SendGrid

Añade el complemento (*add-on*) de Twilio SendGrid en Heroku. Esto creará una cuenta en Twilio SendGrid para la aplicación con un nombre de usuario y permitirá crear una contraseña. Este usuario y contraseña lo podemos guardar en las variables de entorno de la aplicación en Heroku:

```bash
heroku config:set SENDGRID_USERNAME=example-username SENDGRID_PASSWORD=xxxxxxxxx
```

Ahora añade el siguiente código a `config/secrets.yml`, en la sección `production:`:

```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
```

**Importante:** Activa un "*worker dyno*" para que se envíen los correos electrónicos.
