refactor script

This commit is contained in:
2025-02-02 21:27:28 +01:00
parent 07832050dc
commit 1f0df426be
7 changed files with 293 additions and 167 deletions

120
README.md
View File

@@ -1,20 +1,106 @@
# backupsidecar
# BackupSidecar
Backup sidecar that automatically creates backups of one PVC and saves it to another PVC via restic
BackupSidecar is a lightweight backup solution designed to run as a cron job in Kubernetes. It automates backups using Restic and supports both directory and PostgreSQL database backups. Notifications are sent via Gotify to keep you informed of backup results.
## Function
A cronjob inside the container runs in the configured interval creating the backup and purging old backups.
A notification is sent to gotify on completion of the backup or on error of either the backup or purge.
## Configuration
## Environment Variables
| ENV Variable | Required |Description| Example Value
|--------------|----------|--------------|-
|INTERVAL|yes|cronjob interval string|15 14 * * *|
|RESTIC_REPOSITORY|yes|path of the restic repository|/mnt/backups/gitea|
|SOURCEDIR |yes|path of the path to backup|/mnt/toBackup/|
|KEEPLAST|yes|number of increments to keep (keep in mind that the number of backups to keep correlates with the interval in which they are created) |10|
|RESTIC_PASSWORD|yes|password for the restic repository|******|
|RUNONSTART|no|set to true to force a backup at the start of the container|true|
|GOTIFYHOST|yes|URL of the gotify server (without trailing slash)|https://gotify.example.com|
|GOTIFYTOKEN|yes|gotify app token|******|
|GOTIFYTOPIC|yes|gotify topic to include in the notification|gotify|
BackupSidecar is configured through environment variables. Below is a breakdown of the available settings.
### General Settings
These variables apply to both directory and PostgreSQL backups.
- **`BACKUP_MODE`** _(optional)_ Defines the backup type (`directory` or `postgres`). Defaults to `directory`.
- **`RESTIC_PASSWORD`** _(required)_ The encryption password for Restic.
- **`RESTIC_REPOSITORY`** _(required)_ The URI of the Restic repository (e.g., `rest:http://your-rest-server:8000/backup`).
- **`RESTIC_REST_USERNAME`** _(optional)_ The username for REST server authentication.
- **`RESTIC_REST_PASSWORD`** _(optional)_ The password for REST server authentication.
- **`GOTIFYHOST`** _(required)_ The Gotify server URL.
- **`GOTIFYTOKEN`** _(required)_ The API token for Gotify.
- **`GOTIFYTOPIC`** _(required)_ The topic under which backup notifications will be sent.
### Directory Backup
When running in `directory` mode, the following variable must be set:
- **`SOURCEDIR`** _(required)_ The path of the directory to be backed up.
### PostgreSQL Backup
For `postgres` mode, the following database-related variables are required:
- **`PGHOST`** _(required)_ The hostname of the PostgreSQL server.
- **`PGDATABASE`** _(required)_ The name of the database to back up.
- **`PGUSER`** _(required)_ The PostgreSQL username.
- **`PGPORT`** _(optional)_ The port for PostgreSQL (defaults to `5432`).
- **`PGPASSWORD`** _(optional)_ The password for authentication. Setting this prevents interactive prompts.
- **`PG_DUMP_ARGS`** _(optional)_ Additional flags for `pg_dump`.
## Dependencies
Ensure the following commands are available in the container:
- `restic`
- `curl`
- `jq`
- `pg_dump` _(only required for `postgres` mode)_
## Usage
Example Kubernetes CronJob manifest for running BackupSidecar as a cron job for directory backups in minimal configuration:
```yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: backupsidecar-cron
spec:
schedule: "0 2 * * *" # Run daily at 2:00 AM
jobTemplate:
spec:
template:
spec:
containers:
- name: backupsidecar
image: backupsidecar:latest
env:
- name: RESTIC_REPOSITORY
value: "rest:http://rest-server:8000/backup"
- name: RESTIC_PASSWORD
valueFrom:
secretKeyRef:
name: backupsidecar-secret
key: restic_password
- name: BACKUP_MODE
value: "directory" # or "postgres"
- name: SOURCEDIR
value: "/data/source"
- name: GOTIFYHOST
value: "http://gotify.example.com"
- name: GOTIFYTOKEN
valueFrom:
secretKeyRef:
name: backupsidecar-secret
key: gotify_token
- name: GOTIFYTOPIC
value: "Backup Notification"
# (For PostgreSQL mode, add PGHOST, PGDATABASE, PGUSER, PGPORT, PGPASSWORD)
volumeMounts:
- name: source-data
mountPath: /data/source
restartPolicy: OnFailure
volumes:
- name: source-data
persistentVolumeClaim:
claimName: source-data-pvc
```
## Notifications
The script sends success or failure notifications via Gotify.
Example success notification:
```
Backup successful. Snapshot 56ff6a909a44e01f67d2d88f9a76aa713d437809d7ed14a2361e28893f38befb: files new: 1, files changed: 0, data added: 1019 bytes in 0.277535184 sec
```