Migrando uploads do WordPress para Digital Ocean Spaces

Recentemente, fui contatado para fazer uma manutenção em um servidor que roda um site em WordPress. Porém, é um site antigo (tendo mais de 6 anos), cujo foco é divulgação de produtos. Assim, ele tem MUITA foto (mais de 30 Gb em um site, sendo que ele roda mais de um na instância). O problema era que o armazenamento interno estava praticamente ocupado. A solução proposta foi migrar todos esses arquivos de mídias para o Digital Ocean Spaces. Para quem não sabe, o Spaces é um produto desenvolvido para SO para armazenamento de conteúdo estático. Pense nele como sendo o S3 da Digital Ocean.  Aliás, a API deles é compatível com o S3, então soluções desenvolvidas para o S3 podem ser utilizadas nele, só ajeitando os caminhos e regiões. Um ponto interessante do Spaces, ao meu ver, é seu preço: 5 dólares por 250 Gb de armazenamento. Caso extrapole essa cota, tem um custo de 0,02 dólar por gb. Além disso, tem uma transferência de 1 Tb, e 0,01 por Gb além dessa cota.

A Digital Ocean até dispõe de um plugin, conforme descrito nesse post. Porém, conforme os comentários, ele não sincroniza os arquivos já existentes no site. Por isso, ele é bastante funcional caso seu site seja novo, e já esteja previsto um grande número de arquivos, ou a hospedagem em que o WordPress forneça um espaço pequeno de armazenamento.

Entretanto, esse plugin por si só não é suficiente para quem tem um site em funcionamento, como era o caso deste – mais de 400 mil arquivos em produção. Mas, como escrevi no começo deste post, o Spaces é compatível com a API do S3 e já existem diversas ferramentas que nos auxiliam nesse processo. A que eu utilizei nesse processo foi a s3cmd, e o resultado foi bastante satisfatório.

Em primeiro lugar, a instalação desse software pode ser feita de diversas maneiras, dependendo do sistema operacional que você esteja rodando. Por exemplo, no Mac, é possível instalar através do brew. Eu estava no Linux, então instalei pelo pip, muito simples.

Primeiro, devemos garantir que o pip está instalado. No Ubuntu, isso pode ser feito através do comando:

sudo apt install python-pip
. Após, é só instalar com o comando
sudo pip install s3cmd 
. Se você baixar o zip do projeto, verá que tem um arquivo INSTALL.md, que possui instruções para instalar esse software de diversas formas, incluindo o método que eu utilizei.

Para utilizar o s3cmd, primeiro é preciso configurá-lo, conforme descrito nesse post. Basicamente, é necessário já ter um Spaces configurado, com o nome do bucket, a região (que no meu caso era sfo2.digitaloceanspaces.com), e a “key” e o “secret” do bucket. Com essas informações, basta rodar o comando

s3cmd --configure

. Ao fazer isso, as informações de como acessar o bucket (região, nome, key e secret) serão pedidos, bastando preencher corretamente. No final da configuração ele vai testar para ver se está tudo certo. Estando, ele dará uma mensagem de sucesso, e já podemos utilizar o s3cmd para fazer a migração.

No meu caso, eu queria transferir todos os arquivos da pasta wp-content/uploads. Para fazer isso, bastou rodar o seguinte comando:

cd /<path>/wp-content/uploads
s3cmd put * --acl-public --add-header=Cache-Control:max-age=86400 --recursive --continue-put s3://<bucket>/wp-content/uploads/

E foi isso. Primeiro, demorou um tempo sem fazer nenhuma transferência, enquanto ele listava todos os arquivos recursivamente. Aguarde caso não tenha retorno – o programa está funcionando. Depois, ele começou a transferir os arquivos, o que demorou um pouco de tempo, pela quantidade de arquivos.

Após ter transferido todos os arquivos (o que levou um tempinho), instalei o plugin: DigitalOcean Space Sync . Após a ativação, em Configurações > DigitalOcean Spaces Sync, é preciso colocar o endpoint do Spaces (https://ams3.digitaloceanspaces.com, por exemplo), o container (o equivalente ao bucket do S3), a API key e API secret. Além disso, é preciso configurar o caminho do bucket (por exemplo /wp-content/uploads), e a URL do domínio onde os arquivos ficarão armazenados, para que o plugin possa fazer a sincronização entre o site e o armazenamento. Esse processo me levou um tempinho, já que eu armazenei, no Spaces, com a pasta raiz sendo /wp-content/uploads, e não estava configurando o parâmetro Storage prefix. Porém, ao cadastrar esse valor, tudo passou a funcionar.

Agora, todas as imagens já foram migradas, e as novas que forem sendo inseridas serão automaticamente postas no Spaces. Com isso, é possível eliminar grande arquivo dos arquivos da instância. Outra motivação para fazer essa migração é que, caso o site venha a precisar de mais instâncias, ou passe a utilizar Docker, os arquivos estáticos já estão separados, tornando a migração para esse formato com múltiplas instâncias muito mais simples.