-- 0099_backups.up.sql — Minstrel backing itself up. -- -- backup_settings one row: whether the nightly backup is on, where it goes -- (a folder, or an S3 bucket such as a Fabled Archives -- target), and the hour it runs, in UTC. Off until an -- admin switches it on. -- backup_runs one row per attempt: when, what started it, how it ended, -- where the file went, its size, and the error in words. CREATE TABLE backup_settings ( id boolean PRIMARY KEY DEFAULT true CONSTRAINT backup_settings_one_row CHECK (id), enabled boolean NOT NULL DEFAULT false, destination text NOT NULL DEFAULT 's3' CONSTRAINT backup_settings_destination_check CHECK (destination IN ('folder', 's3')), folder text NOT NULL DEFAULT '', endpoint text NOT NULL DEFAULT '', bucket text NOT NULL DEFAULT '', access_key text NOT NULL DEFAULT '', -- Sealed under the stream secret, as every stored credential is. secret_key text NOT NULL DEFAULT '', run_hour smallint NOT NULL DEFAULT 3 CONSTRAINT backup_settings_run_hour_check CHECK (run_hour BETWEEN 0 AND 23), -- The most an upload to the bucket may send, in KiB a second; 0 is no limit. upload_limit_kib integer NOT NULL DEFAULT 4096 CONSTRAINT backup_settings_upload_limit_check CHECK (upload_limit_kib >= 0), updated_at timestamptz NOT NULL DEFAULT now() ); INSERT INTO backup_settings DEFAULT VALUES; CREATE TABLE backup_runs ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), trigger text NOT NULL CONSTRAINT backup_runs_trigger_check CHECK (trigger IN ('schedule', 'manual')), status text NOT NULL DEFAULT 'running' CONSTRAINT backup_runs_status_check CHECK (status IN ('running', 'succeeded', 'failed')), started_at timestamptz NOT NULL DEFAULT now(), finished_at timestamptz, -- Where the file went: the object key, or the file's path in the folder. location text NOT NULL DEFAULT '', bytes bigint NOT NULL DEFAULT 0, error text NOT NULL DEFAULT '' ); CREATE INDEX backup_runs_started_at_idx ON backup_runs (started_at DESC);