Compare commits

...

3 commits

Author SHA1 Message Date
1a49fe3c10 add db-drop-create 2024-08-20 07:56:13 +02:00
4df437f707 fix spec 2024-08-20 07:55:54 +02:00
26822dd8fd update versions 2024-08-20 07:55:25 +02:00
9 changed files with 152 additions and 31 deletions

View file

@ -1,4 +1,4 @@
FROM ubuntu:jammy
FROM ubuntu:24.04
# install it
ADD resources /tmp/

View file

@ -15,7 +15,7 @@ function babashka_install() {
function main() {
{
upgradeSystem
apt-get install -qqy ca-certificates curl gnupg postgresql-client-14 restic
apt-get install -qqy ca-certificates curl gnupg postgresql-client-16 restic
curl -Ss --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /etc/apt/trusted.gpg.d/postgresql-common_pgdg_archive_keyring.gpg
sh -c 'echo "deb [signed-by=/etc/apt/trusted.gpg.d/postgresql-common_pgdg_archive_keyring.gpg] https://apt.postgresql.org/pub/repos/apt jammy-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
upgradeSystem

View file

@ -2,30 +2,40 @@
(require '[babashka.tasks :as tasks]
'[dda.backup.management :as mgm]
'[dda.backup.postgresql :as ps]
'[dda.backup.backup :as bak]
'[dda.backup.restore :as rs])
(def restic-repo {:password-file "restic-pwd"
:restic-repository "restic-repo"})
(defn prepare!
[]
(ps/create-pg-pass! (merge restic-repo {:backup-path "db"
:pg-db "mydb"
:pg-user "user"
:pg-password "password"})))
(defn restic-repo-init!
[]
(spit "restic-pwd" "ThePassword")
(mgm/init! {:password-file "restic-pwd"
:restic-repository "restic-repo"}))
(mgm/init! (merge restic-repo {:backup-path "files"}))
(mgm/init! (merge restic-repo {:backup-path "db" :dry-run true :debug true})))
(defn restic-backup!
[]
(tasks/shell "mkdir" "-p" "test-backup")
(spit "test-backup/file" "I was here")
(bak/backup! {:password-file "restic-pwd"
:restic-repository "restic-repo"
:files ["test-backup"]}))
(bak/backup! (merge restic-repo {:backup-path "files"
:files ["test-backup"]})))
(defn restic-restore!
[]
(tasks/shell "mkdir" "-p" "test-restore")
(rs/restore! {:password-file "restic-pwd"
:restic-repository "restic-repo"
:target-directory "test-restore"}))
(rs/restore! (merge restic-repo {:backup-path "files"
:target-directory "test-restore"})))
(prepare!)
(restic-repo-init!)
(restic-backup!)
(restic-restore!)

View file

@ -9,8 +9,16 @@
[dda.backup.infrastructure :as i]))
(s/def ::config
(s/keys :req-un [::domain/files ::cd/restic-repository ::cd/backup-path]
:opt-un [::cd/certificate-file ::cd/directory ::cd/debug ::cd/dry-run]))
(s/keys :req-un [::domain/files
::cd/restic-repository
::cd/backup-path]
:opt-un [::cd/certificate-file
::cd/password-file
::cd/days-to-keep
::cd/months-to-keep
::cd/directory
::cd/dry-run
::cd/debug]))
(defn-spec backup! nil?
[config ::config]

View file

@ -8,9 +8,15 @@
[dda.backup.infrastructure :as i]))
(s/def ::config
(s/keys :req-un [::cd/restic-repository ::cd/backup-path]
:opt-un [::cd/certificate-file ::cd/directory ::cd/debug
::cd/dry-run ::cd/days-to-keep ::cd/months-to-keep]))
(s/keys :req-un [::cd/restic-repository
::cd/backup-path]
:opt-un [::cd/certificate-file
::cd/password-file
::cd/days-to-keep
::cd/months-to-keep
::cd/directory
::cd/dry-run
::cd/debug]))
(defn-spec initalized? boolean?
[config ::config]

View file

@ -1,26 +1,43 @@
(ns dda.backup.postgres
(ns dda.backup.postgresql
(:require
[orchestra.core :refer [defn-spec]]
[clojure.spec.alpha :as s]
[dda.backup.core.domain :as cd]
[dda.backup.management.domain :as domain]
[dda.backup.postgresql.domain :as domain]
[dda.backup.core :as core]
[dda.backup.infrastructure :as i]))
;; function drop-create-db() {
;; psql -d template1 -h ${POSTGRES_SERVICE} -p ${POSTGRES_PORT} -U ${POSTGRES_USER} \
;; --no-password -c "DROP DATABASE \"${POSTGRES_DB}\";"
;; psql -d template1 -h ${POSTGRES_SERVICE} -p ${POSTGRES_PORT} -U ${POSTGRES_USER} \
;; --no-password -c "CREATE DATABASE \"${POSTGRES_DB}\";"
;; }
(def default
(merge core/default
{:pg-host "localhost"
:pg_port 5432}))
;; function create-pg-pass() {
;; local pg_host=${POSTGRES_HOST:-localhost}
(s/def ::config
(s/keys :req-un [::domain/pg-db
::domain/pg-user
::domain/pg-password
::cd/restic-repository
::cd/backup-path]
:opt-un [::domain/pg-host
::domain/pg-port
::cd/certificate-file
::cd/password-file
::cd/days-to-keep
::cd/months-to-keep
::cd/directory
::cd/dry-run
::cd/debug]))
;; echo "${pg_host}:${POSTGRES_DB}:${POSTGRES_USER}:${POSTGRES_PASSWORD}" > /root/.pgpass
;; echo "${POSTGRES_HOST}:template1:${POSTGRES_USER}:${POSTGRES_PASSWORD}" >> /root/.pgpass
;; chmod 0600 /root/.pgpass
;; }
(defn-spec create-pg-pass! nil?
[config ::config]
(let [config-w-defaults (merge default config)]
(spit "/root/.pgpass" (domain/pgpass config-w-defaults))))
(defn-spec drop-create-db! nil?
[config ::config]
(let [config-w-defaults (merge default config)]
((i/execute! (domain/db-drop-create-command config-w-defaults)))))
;; function backup-roles() {
;; local role_prefix="$1"; shift

View file

@ -0,0 +1,41 @@
(ns dda.backup.postgresql.domain
(:require
[orchestra.core :refer [defn-spec]]
[clojure.spec.alpha :as s]
[dda.backup.core.domain :as cd]))
(s/def ::pg-host string?)
(s/def ::pg-port pos-int?)
(s/def ::pg-db string?)
(s/def ::pg-user string?)
(s/def ::pg-password string?)
(s/def ::config
(s/keys :req-un [::pg-host
::pg-port
::pg-db
::pg-password
::pg-user
::cd/restic-repository
::cd/backup-path]
:opt-un [::cd/certificate-file
::cd/password-file]))
(defn-spec psql-command ::cd/command
[config ::config
command string?]
(let [{:keys [pg-host pg-port pg-user]} config]
["psql" "-d" "template1" "-h" pg-host "-p" (str pg-port) "-U" pg-user
"--no-password" "-c" command]))
(defn-spec pgpass string?
[config ::config]
(let [{:keys [pg-host pg-db pg-user pg-password]} config]
(str pg-host ":" pg-db ":" pg-user ":" pg-password)))
(defn-spec db-drop-create-command ::cd/commands
[config ::config]
(let [{:keys [pg-db]} config]
[(psql-command config (str "\"DROP DATABASE \\\"" pg-db "\\\";\""))
(psql-command config (str "\"CREATE DATABASE \\\"" pg-db "\\\";\""))]))

View file

@ -12,8 +12,16 @@
(s/def ::config
(s/keys :req-un [::domain/target-directory
::cd/restic-repository ::cd/backup-path]
:opt-un [::domain/snapshot-id ::cd/certificate-file ::cd/directory ::cd/debug ::cd/dry-run]))
::cd/restic-repository
::cd/backup-path]
:opt-un [::domain/snapshot-id
::cd/certificate-file
::cd/password-file
::cd/days-to-keep
::cd/months-to-keep
::cd/directory
::cd/dry-run
::cd/debug]))
(defn-spec restore! nil?
[config ::config]

View file

@ -0,0 +1,31 @@
(ns dda.backup.postgresql.domain-test
(:require
[clojure.test :refer [deftest is are testing run-tests]]
[clojure.spec.test.alpha :as st]
[dda.backup.postgresql.domain :as cut]))
(st/instrument `cut/pgpass)
(st/instrument `cut/db-drop-create-command)
(deftest should-calculate-pgpass
(is (= "localhost:mydb:user:password"
(cut/pgpass {:restic-repository "repo"
:backup-path "dir-at-repo"
:pg-host "localhost"
:pg-port 5432
:pg-db "mydb"
:pg-user "user"
:pg-password "password"}))))
(deftest should-calculate-db-drop-create-command
(is (= [["psql" "-d" "template1" "-h" "localhost" "-p" "5432" "-U" "user"
"--no-password" "-c" "\"DROP DATABASE \\\"mydb\\\";\""]
["psql" "-d" "template1" "-h" "localhost" "-p" "5432" "-U" "user"
"--no-password" "-c" "\"CREATE DATABASE \\\"mydb\\\";\""]]
(cut/db-drop-create-command {:restic-repository "repo"
:backup-path "dir-at-repo"
:pg-host "localhost"
:pg-port 5432
:pg-db "mydb"
:pg-user "user"
:pg-password "password"}))))