V-Backup: Encrypted Backup Script

3 months ago 5

A robust, secure backup solution written in V language that creates encrypted, signed, and compressed backups with real-time notifications.

🔐

GPG Encryption & Signing - All backups are encrypted and digitally signed

📦

High Compression - Uses pigz for parallel gzip compression

📱

Real-time Notifications - Sends status updates via ntfy.sh

Fast & Efficient - Written in V for optimal performance

🛡️

Security First - Handles sensitive directories with proper permissions

📊

Detailed Reporting - Comprehensive backup statistics and status

🎯

YAML Configuration - Easy-to-manage configuration file

Ensure the following tools are installed on your system:

  1. Clone or download the script

  2. Make it executable:

  3. Configure your backup settings in backups.yaml

  4. Run the backup:

The script uses a YAML configuration file (backups.yaml) with the following structure:

configs: gpg_email: "[email protected]" # (1) dest_dir: "/path/to/backup/directory" # (2) ntfy: topic: "your-backup-topic" # (3) url: "https://ntfy.sh" # (4) backups: - title: "DUMMY" # (5) path: "/tmp" - title: "SSH Keys" # (6) path: "/home/user/.ssh" - title: "GPG Keys" path: "/home/user/.gnupg" - title: "Application Config" path: "/home/user/.config/myapp"
  1. Email associated with your GPG key

  2. Directory where encrypted backups will be stored

  3. ntfy.sh topic for notifications

  4. ntfy.sh server URL

  5. Dummy entry - do not remove, used for array initialization

  6. Actual backup entries with title and path

Before running the script, ensure you have a GPG key pair

The script uses ntfy.sh for real-time notifications

=== 🔒 BACKUP SCRIPT COM GPG === ✅ Chave GPG encontrada 🚀 Iniciando backups criptografados... 📦 Processando: SSH Keys 📂 Origem: /home/user/.ssh 💾 Arquivo temporário: /home/user/vBackups/ssh_keys_2025-07-07_18-57-04.tar.gz 🔐 Usando sudo para diretório sensível ✅ Backup criado: 2.3 KB 🔐 Criptografando e assinando com GPG... ✅ Arquivo criptografado: ssh_keys_2025-07-07_18-57-04.tar.gz.gpg 🗑️ Removendo arquivo não criptografado... 🔒 Backup final: ssh_keys_2025-07-07_18-57-04.tar.gz.gpg (3.1 KB) === 📊 RESUMO FINAL === ✅ Backups bem-sucedidos: 3/3 📦 Tamanho total dos backups: 15.7 MB 🔒 Todos os backups foram criptografados e assinados 📧 Chave GPG usada: [email protected] 🎉 Todos os backups foram concluídos com sucesso! 📱 Enviando notificação...
graph TD A[Start] --> B[Check Dependencies] B --> C[Load YAML Config] C --> D[Verify GPG Key] D --> E[Create Destination Directory] E --> F[Process Each Backup Item] F --> G[Create Compressed Archive] G --> H[Encrypt & Sign with GPG] H --> I[Remove Unencrypted File] I --> J[Update Statistics] J --> K{More Items?} K -->|Yes| F K -->|No| L[Send Notification] L --> M[End]
Loading

7.2. File Naming Convention

Backup files follow this naming pattern:

{slugified_title}_{timestamp}.tar.gz.gpg

Example: ssh_keys_2025-07-07_18-57-04.tar.gz.gpg

  • Encryption: All backups are encrypted using GPG with your public key

  • Digital Signing: Files are signed with your private key for authenticity

  • Secure Permissions: Sensitive directories (.ssh, .gnupg) are handled with sudo

  • Cleanup: Unencrypted temporary files are automatically removed

The script uses pigz for parallel compression. You can modify the compression command in the source code:

// Current: tar -I pigz -cf // Alternative: tar -czf (standard gzip) // Alternative: tar -I "xz -T0" -cf (xz compression)

8.2. Scheduling with Cron

Add to your crontab for automated backups:

# Daily backup at 2 AM 0 2 * * * /path/to/vbackup.vsh # Weekly backup on Sundays at 3 AM 0 3 * * 0 /path/to/vbackup.vsh

Create a systemd service and timer for more advanced scheduling:

backup.service

[Unit] Description=V-Backup Service After=network.target [Service] Type=oneshot User=your-username WorkingDirectory=/path/to/script ExecStart=/path/to/vbackup.vsh

backup.timer

[Unit] Description=Run V-Backup daily Requires=backup.service [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.target

For debugging, uncomment the debug line in the run_cmd function:

fn run_cmd(cmd string) { println('Executando: ${cmd}') // Uncomment this line res := os.execute(cmd) // ... }
project/ ├── vbackup.vsh # Main backup script ├── backups.yaml # Configuration file └── README.adoc # This documentation
  • V Language Team - For the excellent V programming language

  • ntfy.sh - For the simple notification service

  • GPG Project - For robust encryption tools

  • pigz - For parallel compression capabilities


Made with ❤️ and V language

Read Entire Article