systemd

systemd

  • Adicionando backup do DB no GoToSo

    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.