Generar sitemap.xml en Heroku

Para generar un sitemap.xml vamos a usar la gema sitemap_generator.

Añadimos la gema al Gemfile

gem 'sitemap_generator'

Instalamos gemas:

$ bundle
$ rake -T | grep sitemap 
# rake sitemap:clean
# rake sitemap:create
# rake sitemap:install
# rake sitemap:refresh
# rake sitemap:refresh:no_ping

Lanzamos rake sitemap:install para que nos genere el fichero básico con algo de documentación y lo personalizamos

En nuestro caso quedaría algo así:

# config/sitemap.rb

SitemapGenerator::Sitemap.default_host = "http://tutoronrails.com"

SitemapGenerator::Sitemap.create do
  Post.find_each do |post|
    add post_path(post), :lastmod => post.updated_at
  end

  Page.find_each do |page|
    add page_path(page), :lastmod => page.updated_at
  end

Si lanzamos rake sitemap:create podemos ver que nos genera los xml necesarios.

Desplegar en Heroku

En heroku o en otros entornos con sistemas de fichero de solo lectura (Read-only file system) tendremos que ser un poco ingeniosos.

Generar en local

Para algunos casos puede ser suficiente la opción de generar el sitemap en local y añadirlo al repo, es la opción que menos me gusta, pero si se ajusta a tus necesidades puede que sea suficiente.

Almacenar en S3

La opción que más me convence es la combinación de generar en Heroku periódicamente y almacenar en Amazon S3.

Tendremos que actualizar el fichero config/sitemap.rb con:

# config/sitemap.rb

if ENV['AWS_KEY_ID'].present?
  adapter = SitemapGenerator::S3Adapter.new(fog_provider: 'AWS',
                                  aws_access_key_id: ENV['AWS_KEY_ID'],
                                  aws_secret_access_key: ENV['AWS_SECRET_KEY'],
                                  fog_directory: ENV['AWS_BUCKET'],
                                  fog_region: ENV['AWS_REGION'])

  SitemapGenerator::Sitemap.adapter = adapter
  SitemapGenerator::Sitemap.sitemaps_path = '/'
end


Y añadir las variables de entorno a Heroku:

$ heroku config:set AWS_REGION=eu-west-1 AWS_BUCKET=tutoronrails AWS_SECRET_KEY=my-secret-key AWS_KEY_ID=my-key-id

Obviamente necesitas una cuenta de Amazon AWS y crear un bucket en Amazon S3.

Ahora podemos desplegar a Heroku y generar los sitemaps:

$ git push heroku master
$ heroku run rake sitemap:refresh

Si todo va bien en la cosola de S3 podrás ver un nuevo fichero dentro del bucket que creaste. Selecciona el fichero y hazlo publico.

Ya solo nos falta añadir nuestro sitemap a Google Webmaster Tools. No voy a entrar en detalles sobre cómo hacer esto, pero tendréis el problema de que para añadir el sitemap este debe estar en el mismo dominio.

Si tu web es pequeña posiblemente solo tengas un fichero, por lo que podrías hacer un redirect de forma sencilla en alguna parte.

Pero si tienes más de un fichero lo mejor será hacer una solución general.

Añadimos:

# config/routes.rb
  get '/sitemaps/:path.xml.gz', to: redirect("#{ENV['SITEMAP_HOST']}sitemaps/%{path}.xml.gz")


# config/sitemap.rb
SitemapGenerator::Sitemap.sitemaps_path = 'sitemaps/'
SitemapGenerator::Sitemap.public_path = 'tmp/'

Y añadimos a heroku la variable de entorno SITEMAP_HOST:

$ heroku config:set SITEMAP_HOST=https://s3-eu-west-1.amazonaws.com/tutoronrails/

Ahora puedes añadir en Webmaster Tools /sitemaps/sitemap.xml.gz.

Regenerar el sitemap

Despliegues donde despliegues querrás regenerar el sitemap en dos ocasiones, periódicamente para que se actualice con los datos de tu base de datos y después de desplegar cambios que afecten al sitemap.

Para lanzar tareas rake en tu servidor desde capistrano puedes mirar el artículo Tareas útiles en capistrano.

Para hacerlo en heroku es tan sencillo como:

$ heroku run rake sitemap:refresh

Para ejecutar tareas periódicas en Heroku añadimos el addon gratuito y vamos al panel de control y añadimos rake sitemap:refresh.

$ heroku addons:create scheduler:standard
$ heroku addons:open scheduler

Comentarios