mirror of
https://github.com/Dvorinka/Containr.git
synced 2026-10-28 15:51:26 +00:00
feat(databases): S3-compatible backup targets — offsite archives + remote restore
Phase D3. Managed databases can ship backup archives to a configured S3-compatible destination (AWS S3, MinIO, Garage, …) while the local copy remains intact. - backup_targets table: owner-scoped endpoint/bucket/region/prefix + encrypted access/secret keys (enc:v1:, never returned, has_credentials) - create/update probe bucket access before storing; empty keys on update keep stored credentials; delete refused (409) while referenced - databases.backup_target_id assigns a target; external DBs rejected - backup pipeline uploads via a holder container over docker cp streams; remote failure keeps the local archive (logged), row gets remote:true - restore prefers the local archive; on a missing local copy it downloads the remote object into the backup volume first - holder containers must be started before archive ops — docker cp does not resolve volume mounts on never-started (Created) containers, and removing the source mid-stream stalls the reader without EOF - CLI: backup-targets list|add|update|remove|test + databases update --backup-target; MCP: 5 new tools; Settings UI card + per-database target picker + offsite badge on backups; OpenAPI + llms.txt + CLI.md Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
1 parent
b7131965b1
commit
6f43bbf8f6
25 files changed
+1901
-32
No files matched your search
@@ -0,0 +1,43 @@
|
||||
-- name: ListBackupTargetsByUser :many
|
||||
SELECT backup_targets.*
|
||||
FROM backup_targets
|
||||
WHERE user_id = sqlc.arg(user_id)
|
||||
ORDER BY created_at DESC;
|
||||
|
||||
-- name: GetBackupTargetByIDAndUser :one
|
||||
SELECT backup_targets.*
|
||||
FROM backup_targets
|
||||
WHERE id = sqlc.arg(id) AND user_id = sqlc.arg(user_id);
|
||||
|
||||
-- name: GetBackupTargetByID :one
|
||||
SELECT backup_targets.*
|
||||
FROM backup_targets
|
||||
WHERE id = sqlc.arg(id);
|
||||
|
||||
-- name: CreateBackupTarget :exec
|
||||
INSERT INTO backup_targets (id, user_id, name, endpoint, bucket, region, prefix, access_key, secret_key, use_tls, created_at, updated_at)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12);
|
||||
|
||||
-- name: UpdateBackupTargetByIDAndUser :exec
|
||||
UPDATE backup_targets
|
||||
SET name = $1, endpoint = $2, bucket = $3, region = $4, prefix = $5, access_key = $6, secret_key = $7, use_tls = $8, updated_at = $9
|
||||
WHERE id = $10 AND user_id = $11;
|
||||
|
||||
-- name: DeleteBackupTargetByIDAndUser :exec
|
||||
DELETE FROM backup_targets
|
||||
WHERE id = $1 AND user_id = $2;
|
||||
|
||||
-- name: SetDatabaseBackupTargetByIDAndUser :exec
|
||||
UPDATE database_services
|
||||
SET backup_target_id = $1, updated_at = $2
|
||||
WHERE id = $3 AND user_id = $4;
|
||||
|
||||
-- name: SetDatabaseBackupRemoteKeyByID :exec
|
||||
UPDATE database_backups
|
||||
SET remote_key = $1
|
||||
WHERE id = $2;
|
||||
|
||||
-- name: CountDatabasesUsingBackupTarget :one
|
||||
SELECT COUNT(*)
|
||||
FROM database_services
|
||||
WHERE backup_target_id = sqlc.arg(target_id);
|
||||
Reference in new issue
Block a user