Para este artigo é necessário ter acesso SSH a ambas as VPS. O foco será em users com ssh keys e acesso a todo o diretório de origem e destino. Idealmente, cada user tem acesso ao respetivo diretório no servidor em causa mas nada mais. Ou seja, é de evitar ao máximo utilizar o root ou outro user com maior acesso.

A título de exemplo vamos clonar o site brunocarrada.pt da delta.vps para o rc3.

TODO: Criar ssh-keys e configs poderia ficar noutro artigo e este apenas fazer referência

1. Criar ssh config

O host delta.vps.root é apenas um alias que pode ser utilizado para autocomplete no cmder. É possível escrever “ssh delta.” e depois carregar tab para ter autocomplete. Desta forma, colocamos primeiro o nome do servidor, para ter autocomplete com os users que temos acesso. Embora se escrevessemos o commando sem config seria ao contrário: ssh root@136.244.111.227


A config é apenas um ficheiro chamado “config” na pasta .ssh do user windows que nos encontramos logados. No meu caso o user é KLG e o absolute path é: “C:\Users\KLG\.ssh\config”

2. Pedir acesso root ao delta.vps ao Ivo

Neste momento podemos testar na consola: ssh delta.vps.root ou ssh rc3.brunocarradapt mas vamos ser bloqueados ou ter que introduzir uma password. Para o login ser automático é preciso dar a chave pública ao Ivo para ficar nas authorized_keys do server. É o conteúdo do ficheiro id_rsa.pub

3. Criar o site no rc3 através da runcloud

Na runcloud criamos o site: brunocarrada.pt seguindo os padrões usuais. Isto é:

3.1 Tentar trackar na runcloud o tipo de aplicação, neste caso, wordpress, embora depois vamos apagar toda a informação mas ficamos com o tracking de que é um site wordpress e também fica já linkada a webapp à base de dados que é útil nos backups e onde é necessária a associação

3.2 app, user, database, database user como brunocarradapt

A password deverá ter 60 caractéres, sem símbolos. É importante guardar estes dados para depois.

3.3 Como não é um subdomínio criamos também a versão www mas sem forçar o servidor a redirecionar

3.4 O SSL começa sem autorenew porque vamos ter que propagar e ligar depois

3.5 O PHP mais avançado embora provavelmente temos que alterar posteriormente

3.6 O nome do blog, e-mail do admin e a informação do wordpress é irrelevante dado que depois vamos apagar a base de dados e todos os ficheiros

4. Adicionar ssh key no destino e testar

No rc3 em SSH, adicionei uma nova chave com a label: brunocarradapt_KLG_Ivo, para saber que é uma chave para o user brunocarradapt, no meu computador KLG e que é do Ivo. É para seguir esta nomenclatura embora já tenha criado algumas sem convenção que vou apagar depois.

Agora podemos testar fazer “ssh rc3.brunocarradapt” e se estiver tudo bem configurado devemos entrar diretamente sem password e na consola deve aparecer algo do género:

brunocarradapt@vmi1399153:~$

O que significa que estamos no server “vmi1399153” logados como brunocarradapt

5. Primeiro Rsync

Vamos então fazer o primeiro rsync para colocar a pasta de destino no rc3 exatamente igual à pasta de origem da delta.vps

O comando será:

ssh root@136.244.111.227 "rsync --checksum --archive --verbose --compress --progress --delete /var/www/brunocarrada.pt/home/brunocarrada.pt/public/ brunocarradapt@184.174.32.101:/home/brunocarradapt/webapps/brunocarradapt/" --dry-run 

Aqui é preciso ter muito cuidado dado que um erro no rsync com acesso root pode causar muitos problemas, incluindo, a destruição duma VPS inteira. Tipicamente nunca vamos querer usar o root mas neste caso estou a usar porque a delta.vps é para descontinuar e não justifica trabalho adicional nesta fase. No rc3 estamos mais tranquilos porque estamos a usar um user que não é o root, mas sim o user brunocarradapt que está limitado à sua pasta e desta forma os danos possiveis são limitados ao site em questão.

Muito importante o primeiro IP ser o de origem e o segundo IP o de destino. Os paths devem ser absolutos, ou seja, devem começar por uma slash, e terminar também numa slash.

O –dry-run é fundamental para correr uma vez e observar o que acontece na consola.

O comando deve ser copy pasted para um notepad primeiro para confirmar que está correto e tudo numa linha. Depois então podemos fazer paste na consola e ver o output.

Obtive o seguinte erro:

Host key verification failed.
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(235) [sender=3.1.3]

Isto porque coloquei no servidor rc3 a minha chave mas o delta.vps também precisa de acesso ao rc3. Para isto vamos adicionar outra chave na runcloud, desta vez, é a chave com o nome “delta_vps_normal_user” e vamos dar-lhe o label: brunocarradapt_delta_vps_normal_user que indica que podemos aceder ao rc3 através do delta.vps que é necessário para fazer o rsync.

Temos ainda que logar na delta.vps com ssh delta.vps.root e fazer ssh brunocarradapt@184.174.32.101 e dizer “yes”. E verificar que estamos no server certo. Na verdade era preciso ver o fingerprint mas não vamos fazer isso agora.

Executei novamente o rsync e já funcionou. Apareceram uma série de ficheiros que iam ser passados de um lado para o outro. Aparantemente está ok, então fiz o mesmo comando mas desta vez sem o –dry-run

Correu tudo bem, e isto significa que acabámos de replicar tods os ficheiros da origem para o destino.

6. Confirmar que a origem e o destino são exatamente iguais

Para já ainda não é fundamental porque ainda vamos fazer um novo rsync, no entanto, para experiência vamos testar se as pastas origem e destino têm exatamente os mesmos ficheiros, e se os ficheiros têm exatamente o mesmo conteúdo. Para isto, corremos o seguinte comando:

ssh brunocarradapt@184.174.32.101 "(cd /home/brunocarradapt/webapps/brunocarradapt/ && find . -type f -print0 | sort -z | xargs -0 sha256sum | sha256sum)"

O resultado foi: 9bfee7b0425a365e28f84483a039c14a3e3534e7758605574c027afbc3ae1620

ssh root@136.244.111.227 "(cd /var/www/brunocarrada.pt/home/brunocarrada.pt/public/ && find . -type f -print0 | sort -z | xargs -0 sha256sum | sha256sum)"

O resultado foi: 9bfee7b0425a365e28f84483a039c14a3e3534e7758605574c027afbc3ae1620

Se forem exatemente iguais, é porque os ficheiros e conteúdo é exatamente igual, caso contrário não são. A título de exemplo podem mudar um enter num ficheiro qualquer, e confirmar que a checksum deixa de ser igual.

Guardar estes comandos para mais tarde voltar a executar após o segundo rsync.

7. Propagar A record, matar php-fpm, dump mysql, rsync2, ligar SSL

Estes passos devem ser sincronizados com o Ivo. A partir do momento em que propagarmos o A record para o novo IP vamos ter downtime portanto é importante ter tudo preparado e executar estes passos todos de seguida e o mais rápido possível para evitar downtime.

Para este passo, é fundamental os NS já estarem na vultr. Se estiverem, a propagação é feita no máximo em 300 segundos. Após o Ivo ter iniciado a propagação para o rc3, já podemos passar para os restantes passos.

Poderíamos colocar o site em manutenção mas se não for um site muito sobrecarregado podemos simplesmente matar o phpfpm e remover o serviço. Para isso, vamos correr o seguinte comando, logado na delta.vps.root

systemctl list-units --type=service | grep -i brunocarrada

Estranhamente, obtive 2 serviços:

php7.3-fpm-brunocarrada.pt.service

php7.4-fpm-brunocarrada.pt.service

Vamos fazer parar os serviços com o comando:

sudo systemctl stop php7.3-fpm-brunocarrada.pt.service

Depois voltar a repetir o comando acima para verificar que realmente pararam. Depois fazer disable dos serviços com o comando:

sudo systemctl disable php7.3-fpm-brunocarrada.pt.service

Não esquecer de repetir para o 7.4. Tipicamente, vamos só ter um php. Na runcloud devemos então alterar para o php7.4 e se correr mal o 7.3.

Ainda no mesmo servidor fazer o dump da base de dados, correndo o comando:

mysqldump brunocarradapt > /var/www/brunocarrada.pt/home/brunocarrada.pt/public/brunocarradapt.sql

O nome da base de dados deve seguir a convenção, caso não siga, é consultar no wp-config.php ou no ficheiro que contenha a ligação para a base de dados.

Neste momento podemos correr novamente o comando do rsync anterior e desta vez deverá ser ainda mais rápido porque só se vão sincronizar os ficheiros que foram alterados desde o primeiro rsync até ter desligado o php, se nada tiver sido alterado só o sql é que vai passar para o destino. É de notar que este comando é corrido no nosso computador, não no servidor delta.vps.

Agora ligamos ao servidor rc3.brunocarradapt e podemos correr o comando para importar a base de dados. Antes disso é importante ligar ao phpmyadmin com o user e pass do brunocarrada no rc3 para apagar as tabelas todas, importar com o comando, e confirmar que realmente apareceram lá novas tabelas.

Neste caso, utilizei o subdominio: rc3pma.deltasolucoes.com para ligar ao phpmyadmin do rc3, caso não saibam, falar com o Ivo.

Desta forma, aproveitei para testar que a base de dados está a funcionar, apaguei as tabelas, e importei a base de dados no rc3 com o seguinte comando:

mysql brunocarradapt -p < /home/brunocarradapt/webapps/brunocarradapt/brunocarradapt.sql

Desta vez tenho que colocar a password. Depois fui ao phpmyadmin novamente e confirmei que aparecem lá as novas tabelas importadas.

Agora é preciso ir ao runcloud ligar fazer deploy do SSL e ligar o auto-renew. É importante fazer este passo por último para aguardar pelo menos 300 segundos para propagar ou este passo vai falhar.

O cerificado foi deployed, e liguei o auto-renew nos settings.

8. Alterar config, apagar sql e verificar se está tudo bem

Neste momento, já consigo ver o site com SSL ligado mas dá um erro de ligação à base de dados. Vou ao wp-config.php alterar para os novos dados do rc3.

Já estou a ver o site e parece estar tudo ok. Não esquecer de apagar o sql que está no diretório público!

Ligar ao wp-admin para ver se está tudo bem, numa janela privada ver se o site funciona bem, se aparecem erros na consola, e por aí fora. Como extra, podemos ver se está muito desatualizado. Tipicamente é bom não fazer updates porque pode estragar o site, mas é importante saber se está tão desatualizado que devemos proceder a uma atualização em breve.

Antes de mais, pedir ao Ivo para ligar os backups. Assim já fica uma cópia feita, para o caso de querermos tentar algo arriscado como fazer updates de plugins ou do core. Em sites mais antigos, é muito normal que hajam erros ao fazer upgrade.