Backup automático de PostgreSQL com Coolify e Cloudflare R2

Backup automático de PostgreSQL com Coolify e Cloudflare R2

PostgreSQLBackupCloudflare R2CoolifyDevOps

Configurando backups automáticos e gratuitos de um PostgreSQL self-hosted, usando o agendador nativo do Coolify e o armazenamento S3-compatível da Cloudflare R2.

Sair de um provedor gerenciado como a Supabase pra um PostgreSQL self-hosted tem um custo invisível: você perde a rede de segurança dos backups automáticos. Documentando aqui como configurei backups confiáveis e gratuitos pro banco deste portfólio, rodando num PostgreSQL provisionado dentro do Coolify.

O Coolify já vem com um agendador de backups nativo pra recursos de banco de dados — na aba Backups do recurso Postgres, dá pra criar um "Scheduled Backup" definindo a frequência (aceita atalhos como `daily` e `weekly`, ou uma expressão cron completa) e, opcionalmente, um destino S3 pra onde o dump é enviado depois de gerado localmente no servidor.

Esse "opcionalmente" é importante: sem um S3 Storage configurado e validado antes, o campo some do formulário com a mensagem "No validated S3 Storages found". É um passo que precisa ser feito numa tela separada, em Team/Settings → S3 Storages, antes de voltar pro agendamento do backup em si.

Pra esse storage, escolhi Cloudflare R2 em vez de AWS S3. A principal razão é egress zero — R2 não cobra nada pra baixar dados, diferente do S3 tradicional, que cobra por GB transferido. Pra um backup que você eventualmente vai precisar restaurar (ou seja, baixar), isso importa. A camada gratuita mensal (10 GB de armazenamento, 1 milhão de operações de escrita e 10 milhões de leitura) cobre tranquilamente o dump de um banco de portfólio, que fica na casa de poucos megabytes.

Configurar o R2 exige dois tipos de credencial diferentes da Cloudflare, que é fácil confundir: um Access Key/Secret Key no padrão S3 (gerado em R2 → Manage API Tokens, vinculado só àquele bucket) é o que o Coolify precisa pro upload dos backups — diferente de um API Token geral da conta Cloudflare, que serve pra outras coisas como editar DNS.

Com o bucket criado e o token gerado, o cadastro no Coolify pede: Endpoint (`https://<account_id>.r2.cloudflarestorage.com`), Bucket, Region (`auto` no caso do R2) e as duas chaves. Depois de clicar em "Validate Connection", o storage fica disponível pra ser selecionado em qualquer agendamento de backup.

Voltando na tela de Scheduled Backups, bastou escolher a frequência (`0 3 * * *`, todo dia às 3h da manhã, fora do horário de maior tráfego) e selecionar o storage recém-criado. O Coolify mantém uma cópia local no próprio servidor antes de subir pro R2, então mesmo numa eventual falha de rede durante o upload, ainda existe uma camada de proteção local.

O que antes seria um script de cron chamando `pg_dump` e `aws s3 cp` escrito e mantido manualmente virou um formulário de dois passos. Pra um projeto pessoal, isso é a diferença entre ter backup de verdade e só ter boas intenções de configurar um dia.

Backup automático de PostgreSQL com Coolify e Cloudflare R2 | Dayvson Marques