vapor-docs/docs/deploy/heroku.es.md

237 lines
6.5 KiB
Markdown

# ¿Qué es Heroku?
Heroku es una solución de alojamiento todo en uno muy popular. Puedes encontrar más información en [heroku.com](https://www.heroku.com)
## Registrarse
Necesitarás una cuenta de Heroku. Si no tienes una, regístrate aquí: [https://signup.heroku.com/](https://signup.heroku.com/)
## Instalar CLI
Asegúrate de haber instalado la herramienta CLI de Heroku.
### HomeBrew
```bash
brew tap heroku/brew && brew install heroku
```
### Otras Opciones de Instalación
Consulta las opciones de instalación alternativas aquí: [https://devcenter.heroku.com/articles/heroku-cli#download-and-install](https://devcenter.heroku.com/articles/heroku-cli#download-and-install).
### Iniciar sesión
Una vez que hayas instalado la CLI, inicia sesión con el siguiente comando:
```bash
heroku login
```
Verifica que el correo electrónico correcto esté conectado con:
```bash
heroku auth:whoami
```
### Crear una aplicación
Visita dashboard.heroku.com para acceder a tu cuenta, y crea una aplicación nueva desde el menú desplegable en la esquina superior derecha. Heroku te hará algunas preguntas, como la región y el nombre de la aplicación, tan solo sigue las indicaciones.
### Git
Heroku usa Git para desplegar tu aplicación, por lo que deberás colocar tu proyecto en un repositorio de Git, si aún no lo está.
#### Inicializar Git
Si necesitas agregar Git a tu proyecto, ingresa el siguiente comando en Terminal:
```bash
git init
```
#### Master
Debes decidirte por una rama y ceñirte a ella para desplegar en Heroku, como la rama **main** o **master**. Asegúrate de que todos los cambios se hayan registrado en esta rama antes de hacer push.
Comprueba tu rama actual con:
```bash
git branch
```
El asterisco indica la rama actual.
```bash
* main
commander
other-branches
```
!!! note "Nota"
Si no ves ningún resultado y acabas de ejecutar `git init`, primero deberás hacer un commit de tu código y luego verás el resultado del comando `git branch`.
Si actualmente no estás en la rama correcta, cambia a ella escribiendo (para el caso de **main**):
```bash
git checkout main
```
#### Commit de cambios
Si este comando produce resultados, entonces tienes cambios sin commit.
```bash
git status --porcelain
```
Confirmalos con lo siguiente
```bash
git add .
git commit -m "a description of the changes I made"
```
#### Conectar con Heroku
Conecta tu aplicación con heroku (reemplaza con el nombre de tu aplicación).
```bash
$ heroku git:remote -a your-apps-name-here
```
### Establecer Buildpack
Establece el buildpack para enseñar a heroku cómo tratar con vapor.
```bash
heroku buildpacks:set vapor/vapor
```
### Archivo de versión de Swift
El buildpack que agregamos busca un archivo **.swift-version** para saber qué versión de Swift usar. (Reemplace 5.8.1 con la versión que requiera su proyecto).
```bash
echo "5.8.1" > .swift-version
```
Esto crea **.swift-version** con `5.8.1` como su contenido.
### Procfile
Heroku usa el **Procfile** para saber cómo ejecutar tu aplicación, en nuestro caso debe verse así:
```
web: App serve --env production --hostname 0.0.0.0 --port $PORT
```
Podemos crear esto con el siguiente comando de terminal
```bash
echo "web: App serve --env production" \
"--hostname 0.0.0.0 --port \$PORT" > Procfile
```
### Confirmar cambios
Acabamos de agregar estos archivos, pero no están confirmados. Si hacemos push, heroku no los encontrará.
Confírmarlos con lo siguiente.
```bash
git add .
git commit -m "adding heroku build files"
```
### Despliegue en Heroku
Estás listo para desplegar, ejecuta esto desde la terminal. Puede que la compilación tarde un poco de tiempo, esto es normal.
```bash
git push heroku main
```
### Escalabilidad
Una vez que hayas realizado una build con éxito, debes agregar al menos un servidor. Los precios comienzan en $5/mes para el plan Eco (consulta [precios](https://www.heroku.com/pricing#containers)), asegúrate de tener configurado el pago en Heroku. Luego, para un solo trabajador web (worker):
```bash
heroku ps:scale web=1
```
### Despliegue continuo
Cada vez que quieras actualizar, solo tienes que obtener los últimos cambios en main y enviarlos a heroku y se volverá a desplegar.
## Postgres
### Agregar base de datos PostgreSQL
Visita tu aplicación en dashboard.heroku.com y ve a la sección **Add-ons**.
Desde aquí entra en `postgres` y verás una opción para `Heroku Postgres`. Selecciónala.
Elige el plan Essential 0 por $5/mes (consulta [precios](https://www.heroku.com/pricing#data-services)) y realiza la instalación. Heroku hará el resto.
Una vez que termines, verás que la base de datos aparece en la pestaña **Resources**.
### Configura la base de datos
Ahora tenemos que indicarle a nuestra aplicación cómo acceder a la base de datos. En el directorio de nuestra aplicación, ejecutémosla.
```bash
heroku config
```
Esto generará una salida similar a esta
```none
=== today-i-learned-vapor Config Vars
DATABASE_URL: postgres://cybntsgadydqzm:2d9dc7f6d964f4750da1518ad71hag2ba729cd4527d4a18c70e024b11cfa8f4b@ec2-54-221-192-231.compute-1.amazonaws.com:5432/dfr89mvoo550b4
```
Aquí **DATABASE_URL** representará nuestra base de datos postgres. **NUNCA** codifiques de manera estática la URL desde aquí, heroku la rotará y romperá tu aplicación. Además, es una mala práctica. En su lugar, lee la variable de entorno en tiempo de ejecución.
El complemento Heroku Postgres [requiere](https://devcenter.heroku.com/changelog-items/2035) que todas las conexiones sean cifradas. Los certificados que utilizan los servidores Postgres son internos a Heroku, por lo que se debe configurar una conexión TLS **no verificada**.
El siguiente fragmento muestra cómo lograr ambas cosas:
```swift
if let databaseURL = Environment.get("DATABASE_URL") {
var tlsConfig: TLSConfiguration = .makeClientConfiguration()
tlsConfig.certificateVerification = .none
let nioSSLContext = try NIOSSLContext(configuration: tlsConfig)
var postgresConfig = try SQLPostgresConfiguration(url: databaseURL)
postgresConfig.coreConfiguration.tls = .require(nioSSLContext)
app.databases.use(.postgres(configuration: postgresConfig), as: .psql)
} else {
// ...
}
```
No olvides hacer commit de estos cambios.
```bash
git add .
git commit -m "configured heroku database"
```
### Revertir tu base de datos
Puedes revertir o ejecutar otros comandos en heroku con el comando `run`.
Para revertir tu base de datos:
```bash
heroku run App -- migrate --revert --all --yes --env production
```
Para migrar:
```bash
heroku run App -- migrate --env production
```