Creo que Heroku debería patrocinarme ya que he escrito en varias ocasiones sobre este servicio y ¿cómo no hacerlo? Es un buen servicio con una buena oferta.
En esta ocasión voy a compartir cómo montar una aplicación estática en un dyno de Heroku. Si bien en ocasiones podemos valernos de servicios como GitHub Pages, Netlify o Vercel, Heroku no deja de ser una buena alternativa.
Vale destacar que mandar aplicaciones estáticas a Heroku puede ser más complicado que en los otros servicios mencionados aunque no está de más tener opciones.
Usando Buildpacks
La opción más sencilla seguro será usando un buildpack. Estos son un conjunto de scripts que Heroku corre cuando se configura o despliega un servicio. El buildpack que necesitamos es heroku/nodejs.
También hay otro buildpack llamado heroku/static y se supone existe con el propósito de poder alojar páginas web normales o aplicaciones SPA.
Si estás haciendo algo usando Jekyll, está el buildpack para Jekyll que no es más que un fork de heroku/ruby con soporte para Jekyll.
Usando Rack
Rack es un framework para trabajar con servidores web en Ruby. Con una configuración particular, podremos sacarle provecho para montar nuestras aplicaciones estáticas.
En este artículo en Heroku está todo el detalle. Acá voy a mostrar el código.
Teniendo esta estructura de carpetas:
public/
Gemfile
Gemfile.lock
config.ru
En donde el archivo Gemfile
contiene:
source 'https://rubygems.org'
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem 'rack'
Y en el archivo config.ru
lo siguiente:
use Rack::Static,
urls: ["/js", "/css"],
root: "public"
run lambda do |env|
[
200,
{
'Content-Type' => 'text/html',
'Cache-Control' => 'public, max-age=86400'
},
File.open('public/index.html', File::RDONLY)
]
end
Guardas y mandas a Heroku git push heroku master
y con eso habrás desplegado un sitio estático a este servicio.
De estas dos formas será posible montar una página web o aplicación estática en Heroku. Si bien hay mejores opciones hoy en día, no está demás tener una alternativa a la mano.