Compare commits

..

No commits in common. "1a49fe3c10e7c906d0d718c6ec2d16db2bec51cc" and "46eb2ada332cf6abc733e5abe9c91c65e631a5fb" have entirely different histories.

9 changed files with 31 additions and 152 deletions

View file

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

View file

@ -15,7 +15,7 @@ function babashka_install() {
function main() { function main() {
{ {
upgradeSystem upgradeSystem
apt-get install -qqy ca-certificates curl gnupg postgresql-client-16 restic apt-get install -qqy ca-certificates curl gnupg postgresql-client-14 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 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' 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 upgradeSystem

View file

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

View file

@ -9,16 +9,8 @@
[dda.backup.infrastructure :as i])) [dda.backup.infrastructure :as i]))
(s/def ::config (s/def ::config
(s/keys :req-un [::domain/files (s/keys :req-un [::domain/files ::cd/restic-repository ::cd/backup-path]
::cd/restic-repository :opt-un [::cd/certificate-file ::cd/directory ::cd/debug ::cd/dry-run]))
::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? (defn-spec backup! nil?
[config ::config] [config ::config]

View file

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

View file

@ -1,43 +1,26 @@
(ns dda.backup.postgresql (ns dda.backup.postgres
(:require (:require
[orchestra.core :refer [defn-spec]] [orchestra.core :refer [defn-spec]]
[clojure.spec.alpha :as s] [clojure.spec.alpha :as s]
[dda.backup.core.domain :as cd] [dda.backup.core.domain :as cd]
[dda.backup.postgresql.domain :as domain] [dda.backup.management.domain :as domain]
[dda.backup.core :as core] [dda.backup.core :as core]
[dda.backup.infrastructure :as i])) [dda.backup.infrastructure :as i]))
(def default ;; function drop-create-db() {
(merge core/default ;; psql -d template1 -h ${POSTGRES_SERVICE} -p ${POSTGRES_PORT} -U ${POSTGRES_USER} \
{:pg-host "localhost" ;; --no-password -c "DROP DATABASE \"${POSTGRES_DB}\";"
:pg_port 5432})) ;; psql -d template1 -h ${POSTGRES_SERVICE} -p ${POSTGRES_PORT} -U ${POSTGRES_USER} \
;; --no-password -c "CREATE DATABASE \"${POSTGRES_DB}\";"
;; }
(s/def ::config ;; function create-pg-pass() {
(s/keys :req-un [::domain/pg-db ;; local pg_host=${POSTGRES_HOST:-localhost}
::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]))
(defn-spec create-pg-pass! nil? ;; echo "${pg_host}:${POSTGRES_DB}:${POSTGRES_USER}:${POSTGRES_PASSWORD}" > /root/.pgpass
[config ::config] ;; echo "${POSTGRES_HOST}:template1:${POSTGRES_USER}:${POSTGRES_PASSWORD}" >> /root/.pgpass
(let [config-w-defaults (merge default config)] ;; chmod 0600 /root/.pgpass
(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() { ;; function backup-roles() {
;; local role_prefix="$1"; shift ;; local role_prefix="$1"; shift

View file

@ -1,41 +0,0 @@
(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,16 +12,8 @@
(s/def ::config (s/def ::config
(s/keys :req-un [::domain/target-directory (s/keys :req-un [::domain/target-directory
::cd/restic-repository ::cd/restic-repository ::cd/backup-path]
::cd/backup-path] :opt-un [::domain/snapshot-id ::cd/certificate-file ::cd/directory ::cd/debug ::cd/dry-run]))
: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? (defn-spec restore! nil?
[config ::config] [config ::config]

View file

@ -1,31 +0,0 @@
(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"}))))