Com tudo rodando redondo na minha bolha, bolha minha, resta melhorar a resiliência com backups. Até agora apostei no zfs como saída pra qualquer problema. Mas isso é jogar com a sorte.
Fiz um pequeno e simples script de backup que executa dentro do container, que roda via podman, e faz o pg_dumpall do postgres.
#! /usr/bin/env bash
#
#pg_dumpall -U $POSTGRES_USER -f full-backup-$(date "+%Y-%m-%dT%H:%M:%S").sql
#
RETENTION=12
timestamp=$(date "+%Y-%m-%dT%H:%M:%S")
current_dir=$(readlink -f $0)
current_dir=$(dirname $current_dir)
program=$0
program=$(basename $program)
backup_file="full-backup-$timestamp.sql"
echo "Backup on: $timestamp"
podman exec postgres \
bash -c "pg_dumpall -U \$POSTGRES_USER -f /var/lib/postgresql/backup/$backup_file"
bzip2 $current_dir/postgresql/backup/$backup_file
for filename in $(find $current_dir/postgresql/backup -print | grep bz2 | sort | sed "1,${RETENTION}d")
do
echo "Removing: $filename"
rm -f $filename
done
E coloquei RETENTION=12 pra manter os últimos 12 backups.
Mas por quê 12?
Sei lá.
Pareceu um número legal.
Eu poderia rodar tudo via crontab, como geralmente faço. Mas nesse caso eu resolvi fazer com timer do systemd. Então primeiro criei o serviço de backup e depois o timer que ativa esse serviço.
❯ systemctl --user --force --full edit gotosocial-backup.service
❯ systemctl --user --force --full edit gotosocial-backup.timer
Assim são criados o serviço e o timer em modo usuário.
O gotosocial-backup.service:
[Unit]
Wants=gotosocial.service
After=gotosocial.service
[Service]
Type=oneshot
ExecStart=/home/helio/gotosocial/run-backup.sh
WorkingDirectory=/home/helio/gotosocial
[Install]
WantedBy=default.target
O gotosocial-backup.timer:
[Unit]
Description=GoToSo daily backup
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Após serem criados, eles ficam em seu diretório de usuário:
/home/helio/.config/systemd/user/gotosocial-backup.{service,timer}
Daí é só habilitar ambos. Ao fazer isso, um backup será gerado pois o systemd vai rodar o serviço ao ser ativado.
❯ systemctl enable --now --user gotosocial-backup.service
❯ systemctl enable --now --user gotosocial-backup.timer
Claro que ainda não testei restaurar nenhum desses backups.
Vou deixar pra fazer isso quando tiver algum problema de verdade.
No momento eles estão salvos em /home/helio/gotosocial/postgresql/backup
que é onde apontei como volume dentro compose.yaml do podman.
❯ ls -1 /home/helio/gotosocial/postgresql/backup/
full-backup-2025-11-29T13:17:38.sql.bz2
full-backup-2025-11-29T13:46:32.sql.bz2
full-backup-2025-11-29T13:47:14.sql.bz2
E também não testei meu "retention". Daqui 9 dias eu conto se deu certo.
