Tutorial: Como criar um sitemap dinâmico com rails (inclusive no Heroku usando S3)

Então, todos sabem que ter um sitemap bem definido é bem útil né? É ótimo pra SEO e tudo mais! Mas como fazemos pra criar um dinamicamente usando Ruby on Rails?

E se usarmos um host, como o Heroku, que não permite a criação de arquivos estáticos? Aí usamos o S3 pra contornar isso 🙂

Vamos lá:

1. Se cadastre no Amazon Web Services, mais especificamente pra usar o S3.

2. Crie um IAM user e anote a KEY_ID e a ACCESS_KEY.

3. Crie um bucket no S3, anote o nome dele.

4. Altere a “bucket policy” dele. Pra isso selecione ele, clique para exibir suas propriedades e você encontrará essa opção dentro de “permissions”.

{
	"Version": "2012-10-17",
	"Id": "Policy1432927162812",
	"Statement": [
		{
			"Sid": "Stmt1432927158236",
			"Effect": "Allow",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::NOMEDOBUCKET/sitemaps/*"
		}
	]
}

5. Instale a gem sitemap_generator e a aws-sdk adicionando ambas ao seu Gemfile:

gem 'aws-sdk'
gem 'sitemap_generator'

Depois rode:

rake sitemap:install

Essa rake task irá criar o arquivo config/sitemap.rb, nele terão comentários explicando direitinho como você faz pra adicionar URLs ao seu sitemap. No repositório da gem tem mais detalhes.

Mantenha as configurações assim:

SitemapGenerator::Sitemap.default_host = "http://www.SEUDOMINIO.com.br"
SitemapGenerator::Sitemap.create_index = true
SitemapGenerator::Sitemap.public_path = 'public/sitemaps/'
SitemapGenerator::Sitemap.sitemaps_host = "http://s3.amazonaws.com/NOME-DO-BUCKET/sitemaps/"

6. Defina variáveis de ambiente com o que anotamos previamente:

AWS_ACCESS_KEY_ID: AKIAIPZEMVLPPLEOBIIK
AWS_SECRET_ACCESS_KEY: 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
S3_BUCKET: nome-do-bucket

Não sabe fazer isso? Aprenda o que é. Eu uso o dotenv pra isso.

7. Crie uma rake task lib/tasks/sitemap.rb para enviar esse sitemap para o S3:

require 'aws'

namespace :sitemap do
  desc 'Upload the sitemap files to S3'
  task upload_to_s3: :environment do
    s3 = AWS::S3.new(
      access_key_id: ENV['AWS_ACCESS_KEY_ID'],
      secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
    )
    bucket = s3.buckets[ENV['S3_BUCKET']]

    Dir.entries(File.join(Rails.root, "public", "sitemaps")).each do |file_name|
      next if ['.', '..'].include? file_name
      path = "sitemaps/#{file_name}"
      file = File.join(Rails.root, "public", "sitemaps", file_name)

      begin
        object = bucket.objects[path]
        object.write(file: file)
      rescue Exception => e
        raise e
      end
      puts "Saved #{file_name} to S3"
    end
  end
end

8. Crie um scheduler no Heroku (ou no seu host) pra chamar essa rake task de tempos em tempos.

rake sitemap:refresh sitemap:upload_to_s3 --trace

A primeira task gera um novo sitemap e a segunda o envia para o S3. Gosto de adicionar –trace pra deixar tudo no log.

Pronto! Demorou um pouco mas deu certo né? Se não deu, comenta aí que tentou lhe ajudar.

ps: esse tutorial foi baseado em um do w1zeman1p mas dei uma melhorada, além de traduzir 🙂

1 Comment

  • Olá, eu estou com problemas para que o webmaster reconheça meu sitemap.xml no ec2 da aws, ocorre o erro redirect error http:302 será que o problema é de permissão ou falta fazer alguma coisa no route53 ou terei que mudar tudo para o s3 como você ensinou?
    site:alphacontabilidadeonline.com.br
    Muito Obrigado.

Leave a Comment