This commit is contained in:
28
README.md
28
README.md
@@ -40,7 +40,7 @@ docker push your-registry/postgres-backup:latest
|
|||||||
- `S3_PREFIX`: S3 key prefix for backups (default: postgres-backups)
|
- `S3_PREFIX`: S3 key prefix for backups (default: postgres-backups)
|
||||||
- `S3_REGION`: S3 region (default: us-east-1)
|
- `S3_REGION`: S3 region (default: us-east-1)
|
||||||
- `BACKUP_RETENTION_DAYS`: Number of days to keep backups (default: 7)
|
- `BACKUP_RETENTION_DAYS`: Number of days to keep backups (default: 7)
|
||||||
- `WEBHOOK_URL`: Optional webhook URL for notifications
|
- `HEALTHCHECKS_URL`: Healthchecks.io ping URL for monitoring (optional)
|
||||||
|
|
||||||
## Running Locally
|
## Running Locally
|
||||||
|
|
||||||
@@ -53,6 +53,7 @@ docker run --rm \
|
|||||||
-e S3_ENDPOINT=https://nyc3.digitaloceanspaces.com \
|
-e S3_ENDPOINT=https://nyc3.digitaloceanspaces.com \
|
||||||
-e S3_ACCESS_KEY_ID=your-access-key \
|
-e S3_ACCESS_KEY_ID=your-access-key \
|
||||||
-e S3_SECRET_ACCESS_KEY=your-secret-key \
|
-e S3_SECRET_ACCESS_KEY=your-secret-key \
|
||||||
|
-e HEALTHCHECKS_URL=https://hc-ping.com/your-uuid \
|
||||||
your-registry/postgres-backup:latest
|
your-registry/postgres-backup:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -85,6 +86,31 @@ kubectl get jobs
|
|||||||
kubectl logs -l job-name=postgres-backup-<timestamp>
|
kubectl logs -l job-name=postgres-backup-<timestamp>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Monitoring with Healthchecks.io
|
||||||
|
|
||||||
|
The container has built-in support for [Healthchecks.io](https://healthchecks.io) monitoring:
|
||||||
|
|
||||||
|
### Setup:
|
||||||
|
1. Create a check on healthchecks.io
|
||||||
|
2. Copy the ping URL (e.g., `https://hc-ping.com/your-uuid-here`)
|
||||||
|
3. Add it to your Kubernetes secret as `healthchecks-url`
|
||||||
|
|
||||||
|
### Webhook Behavior:
|
||||||
|
- **Start**: Pings `/start` when backup begins
|
||||||
|
- **Success**: Pings the main URL when all backups complete successfully
|
||||||
|
- **Failure**: Pings `/fail` with error details when any backup fails
|
||||||
|
|
||||||
|
### Example healthchecks.io URL:
|
||||||
|
```
|
||||||
|
https://hc-ping.com/12345678-1234-1234-1234-123456789012
|
||||||
|
```
|
||||||
|
|
||||||
|
This will automatically track:
|
||||||
|
- Job start times
|
||||||
|
- Success/failure status
|
||||||
|
- Failure reasons in the check log
|
||||||
|
- Missing backup alerts if job doesn't run
|
||||||
|
|
||||||
## Backup Structure
|
## Backup Structure
|
||||||
|
|
||||||
Backups are stored in S3 with a simple flat structure:
|
Backups are stored in S3 with a simple flat structure:
|
||||||
|
|||||||
30
backup.sh
30
backup.sh
@@ -115,16 +115,26 @@ cleanup_old_backups() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to send notification (placeholder for webhook/email integration)
|
# Function to send notification to healthchecks.io
|
||||||
send_notification() {
|
send_notification() {
|
||||||
local status="$1"
|
local status="$1"
|
||||||
local message="$2"
|
local message="$2"
|
||||||
|
|
||||||
if [[ -n "${WEBHOOK_URL:-}" ]]; then
|
if [[ -n "${HEALTHCHECKS_URL:-}" ]]; then
|
||||||
curl -X POST "${WEBHOOK_URL}" \
|
case "$status" in
|
||||||
-H "Content-Type: application/json" \
|
"start")
|
||||||
-d "{\"status\": \"${status}\", \"message\": \"${message}\", \"timestamp\": \"$(date -Iseconds)\"}" \
|
# Ping start endpoint
|
||||||
|| log "Failed to send notification"
|
curl -fsS -m 10 --retry 5 "${HEALTHCHECKS_URL}/start" > /dev/null || log "Failed to send start notification"
|
||||||
|
;;
|
||||||
|
"success")
|
||||||
|
# Ping success endpoint (default)
|
||||||
|
curl -fsS -m 10 --retry 5 "${HEALTHCHECKS_URL}" > /dev/null || log "Failed to send success notification"
|
||||||
|
;;
|
||||||
|
"error"|"fail")
|
||||||
|
# Ping fail endpoint with log data
|
||||||
|
curl -fsS -m 10 --retry 5 --data-raw "$message" "${HEALTHCHECKS_URL}/fail" > /dev/null || log "Failed to send failure notification"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,9 +142,13 @@ send_notification() {
|
|||||||
main() {
|
main() {
|
||||||
log "Starting PostgreSQL backup process"
|
log "Starting PostgreSQL backup process"
|
||||||
|
|
||||||
|
# Send start notification
|
||||||
|
send_notification "start" "PostgreSQL backup process started"
|
||||||
|
|
||||||
# Validate required environment variables
|
# Validate required environment variables
|
||||||
if [[ -z "${S3_BUCKET}" || -z "${S3_ACCESS_KEY_ID}" || -z "${S3_SECRET_ACCESS_KEY}" || -z "${S3_ENDPOINT}" ]]; then
|
if [[ -z "${S3_BUCKET}" || -z "${S3_ACCESS_KEY_ID}" || -z "${S3_SECRET_ACCESS_KEY}" || -z "${S3_ENDPOINT}" ]]; then
|
||||||
log "ERROR: Missing required environment variables (S3_BUCKET, S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_ENDPOINT)"
|
log "ERROR: Missing required environment variables (S3_BUCKET, S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_ENDPOINT)"
|
||||||
|
send_notification "fail" "Missing required environment variables"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -145,7 +159,7 @@ main() {
|
|||||||
log "Testing database connection"
|
log "Testing database connection"
|
||||||
if ! PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${POSTGRES_HOST}" -p "${POSTGRES_PORT}" -U "${POSTGRES_USER}" -d postgres -c "SELECT 1" > /dev/null 2>&1; then
|
if ! PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${POSTGRES_HOST}" -p "${POSTGRES_PORT}" -U "${POSTGRES_USER}" -d postgres -c "SELECT 1" > /dev/null 2>&1; then
|
||||||
log "ERROR: Cannot connect to PostgreSQL database"
|
log "ERROR: Cannot connect to PostgreSQL database"
|
||||||
send_notification "error" "Cannot connect to PostgreSQL database"
|
send_notification "fail" "Cannot connect to PostgreSQL database"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -169,7 +183,7 @@ main() {
|
|||||||
send_notification "success" "All PostgreSQL database backups completed successfully"
|
send_notification "success" "All PostgreSQL database backups completed successfully"
|
||||||
else
|
else
|
||||||
log "Some database backups failed"
|
log "Some database backups failed"
|
||||||
send_notification "error" "Some PostgreSQL database backups failed"
|
send_notification "fail" "Some PostgreSQL database backups failed"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,11 +57,12 @@ spec:
|
|||||||
# Backup settings
|
# Backup settings
|
||||||
- name: BACKUP_RETENTION_DAYS
|
- name: BACKUP_RETENTION_DAYS
|
||||||
value: "7"
|
value: "7"
|
||||||
- name: COMPRESSION
|
# Healthchecks.io monitoring
|
||||||
value: "gzip"
|
- name: HEALTHCHECKS_URL
|
||||||
# Optional webhook for notifications
|
valueFrom:
|
||||||
# - name: WEBHOOK_URL
|
secretKeyRef:
|
||||||
# value: "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK"
|
name: postgres-backup-secret
|
||||||
|
key: healthchecks-url
|
||||||
resources:
|
resources:
|
||||||
requests:
|
requests:
|
||||||
memory: "256Mi"
|
memory: "256Mi"
|
||||||
|
|||||||
@@ -9,4 +9,5 @@ stringData:
|
|||||||
postgres-user: postgres
|
postgres-user: postgres
|
||||||
postgres-password: your-password
|
postgres-password: your-password
|
||||||
s3-access-key-id: your-s3-access-key
|
s3-access-key-id: your-s3-access-key
|
||||||
s3-secret-access-key: your-s3-secret-key
|
s3-secret-access-key: your-s3-secret-key
|
||||||
|
healthchecks-url: https://hc-ping.com/your-check-uuid
|
||||||
Reference in New Issue
Block a user