From d7ce373d870f3ad4c18b1e4cadd4f4e99be81e3e Mon Sep 17 00:00:00 2001 From: Michael Jerger <michael.jerger@meissa-gmbh.de> Date: Sat, 28 Dec 2024 09:59:43 +0100 Subject: [PATCH 1/5] refactoring - split config & auth --- project.clj | 10 ++--- shadow-cljs.edn | 2 +- src/main/clj/dda/c4k_nextcloud/uberjar.clj | 5 ++- src/main/cljc/dda/c4k_nextcloud/core.cljc | 46 ++++++++++++++-------- 4 files changed, 39 insertions(+), 24 deletions(-) diff --git a/project.clj b/project.clj index 9798606..37a4209 100644 --- a/project.clj +++ b/project.clj @@ -3,9 +3,9 @@ :url "https://domaindrivenarchitecture.org" :license {:name "Apache License, Version 2.0" :url "https://www.apache.org/licenses/LICENSE-2.0.html"} - :dependencies [[org.clojure/clojure "1.11.3"] - [org.clojure/tools.reader "1.4.2"] - [org.domaindrivenarchitecture/c4k-common-clj "6.3.1"] + :dependencies [[org.clojure/clojure "1.12.0"] + [org.clojure/tools.reader "1.5.0"] + [org.domaindrivenarchitecture/c4k-common-clj "8.0.0"] [hickory "0.7.1" :exclusions [viebel/codox-klipse-theme]]] :target-path "target/%s/" :source-paths ["src/main/cljc" @@ -23,9 +23,9 @@ :main dda.c4k-nextcloud.uberjar :uberjar-name "c4k-nextcloud-standalone.jar" :dependencies [[org.clojure/tools.cli "1.1.230"] - [ch.qos.logback/logback-classic "1.5.6" + [ch.qos.logback/logback-classic "1.5.15" :exclusions [com.sun.mail/javax.mail]] - [org.slf4j/jcl-over-slf4j "2.0.13"] + [org.slf4j/jcl-over-slf4j "2.0.16"] [com.github.clj-easy/graal-build-time "1.0.5"]]}} :release-tasks [["test"] ["vcs" "assert-committed"] diff --git a/shadow-cljs.edn b/shadow-cljs.edn index 6a69a18..8899f82 100644 --- a/shadow-cljs.edn +++ b/shadow-cljs.edn @@ -4,7 +4,7 @@ "src/test/cljc" "src/test/cljs" "src/test/resources"] - :dependencies [[org.domaindrivenarchitecture/c4k-common-cljs "6.3.1"] + :dependencies [[org.domaindrivenarchitecture/c4k-common-cljs "8.0.0"] [hickory "0.7.1"]] :builds {:frontend {:target :browser :modules {:main {:init-fn dda.c4k-nextcloud.browser/init}} diff --git a/src/main/clj/dda/c4k_nextcloud/uberjar.clj b/src/main/clj/dda/c4k_nextcloud/uberjar.clj index 368a49a..f4aa154 100644 --- a/src/main/clj/dda/c4k_nextcloud/uberjar.clj +++ b/src/main/clj/dda/c4k_nextcloud/uberjar.clj @@ -6,10 +6,11 @@ [dda.c4k-nextcloud.core :as core])) (defn -main [& cmd-args] - (uberjar/main-common + (uberjar/main-cm "c4k-nextcloud" nextcloud/config? nextcloud/auth? core/config-defaults - core/k8s-objects + core/config-objects + core/auth-objects cmd-args)) diff --git a/src/main/cljc/dda/c4k_nextcloud/core.cljc b/src/main/cljc/dda/c4k_nextcloud/core.cljc index 9d7cfdb..8b082b4 100644 --- a/src/main/cljc/dda/c4k_nextcloud/core.cljc +++ b/src/main/cljc/dda/c4k_nextcloud/core.cljc @@ -16,7 +16,29 @@ :pvc-storage-class-name "hcloud-volumes-encrypted" :pv-storage-size-gb 200}) -(defn-spec k8s-objects cp/map-or-seq? +(defn-spec config-objects cp/map-or-seq? + [config nextcloud/config?] + (let [resolved-config (merge config-defaults config)] + (map yaml/to-string + (filter + #(not (nil? %)) + (cm/concat-vec + (ns/generate resolved-config) + (postgres/generate-config (merge resolved-config {:postgres-size :8gb + :db-name "cloud" + :pv-storage-size-gb 50})) + [(nextcloud/generate-pvc resolved-config) + (nextcloud/generate-deployment resolved-config) + (nextcloud/generate-service)] + (nextcloud/generate-ingress-and-cert resolved-config) + (when (:contains? resolved-config :restic-repository) + [(backup/generate-config resolved-config) + (backup/generate-cron) + (backup/generate-backup-restore-deployment resolved-config)]) + (when (:contains? resolved-config :mon-cfg) + (mon/generate-config))))))) + +(defn-spec auth-objects cp/map-or-seq? [config nextcloud/config? auth nextcloud/auth?] (let [resolved-config (merge config-defaults config)] @@ -24,20 +46,12 @@ (filter #(not (nil? %)) (cm/concat-vec - (ns/generate resolved-config) - (postgres/generate (merge resolved-config {:postgres-size :8gb - :db-name "cloud" - :pv-storage-size-gb 50}) - auth) - [(nextcloud/generate-secret auth) - (nextcloud/generate-pvc resolved-config) - (nextcloud/generate-deployment resolved-config) - (nextcloud/generate-service)] - (nextcloud/generate-ingress-and-cert resolved-config) + (postgres/generate-auth (merge resolved-config {:postgres-size :8gb + :db-name "cloud" + :pv-storage-size-gb 50}) + auth) + [(nextcloud/generate-secret auth)] (when (:contains? resolved-config :restic-repository) - [(backup/generate-config resolved-config) - (backup/generate-secret auth) - (backup/generate-cron) - (backup/generate-backup-restore-deployment resolved-config)]) + [(backup/generate-secret auth)]) (when (:contains? resolved-config :mon-cfg) - (mon/generate (:mon-cfg resolved-config) (:mon-auth auth)))))))) + (mon/generate-auth (:mon-cfg resolved-config) (:mon-auth auth)))))))) \ No newline at end of file From 67ec0f58eb99f0867891e62a88fb382afb5398e6 Mon Sep 17 00:00:00 2001 From: Michael Jerger <michael.jerger@meissa-gmbh.de> Date: Sat, 28 Dec 2024 18:30:49 +0100 Subject: [PATCH 2/5] implement backup & snapshot --- infrastructure/backup/image/Dockerfile | 4 +- .../backup/image/resources/backup.bb | 35 +++++++++++++ .../backup/image/resources/backup.sh | 28 ---------- .../backup/image/resources/bb-backup.edn | 3 ++ infrastructure/backup/image/resources/bb.edn | 3 ++ .../backup/image/resources/config.clj | 34 ++++++++++++ infrastructure/backup/image/resources/init.bb | 3 ++ infrastructure/backup/image/resources/init.sh | 17 ------ .../backup/image/resources/install.bb | 23 ++++++++ .../backup/image/resources/list-snapshots.bb | 25 +++++++++ .../backup/image/resources/list-snapshots.sh | 31 ----------- infrastructure/backup/image/resources2/bb.edn | 3 ++ .../backup/image/resources2/exports.sh | 10 ++++ .../backup/image/resources2/file_password | 1 + .../backup/image/resources2/test.bb | 52 +++++++++++++++++++ infrastructure/backup/test/Dockerfile | 4 ++ infrastructure/backup/test/resources/bb.edn | 3 ++ .../backup/test/resources/file_password | 1 + infrastructure/backup/test/resources/test.bb | 48 +++++++++++++++++ 19 files changed, 251 insertions(+), 77 deletions(-) create mode 100755 infrastructure/backup/image/resources/backup.bb delete mode 100755 infrastructure/backup/image/resources/backup.sh create mode 100644 infrastructure/backup/image/resources/bb-backup.edn create mode 100644 infrastructure/backup/image/resources/bb.edn create mode 100644 infrastructure/backup/image/resources/config.clj create mode 100755 infrastructure/backup/image/resources/init.bb delete mode 100755 infrastructure/backup/image/resources/init.sh create mode 100755 infrastructure/backup/image/resources/install.bb create mode 100755 infrastructure/backup/image/resources/list-snapshots.bb delete mode 100755 infrastructure/backup/image/resources/list-snapshots.sh create mode 100644 infrastructure/backup/image/resources2/bb.edn create mode 100644 infrastructure/backup/image/resources2/exports.sh create mode 100644 infrastructure/backup/image/resources2/file_password create mode 100755 infrastructure/backup/image/resources2/test.bb create mode 100644 infrastructure/backup/test/Dockerfile create mode 100644 infrastructure/backup/test/resources/bb.edn create mode 100644 infrastructure/backup/test/resources/file_password create mode 100755 infrastructure/backup/test/resources/test.bb diff --git a/infrastructure/backup/image/Dockerfile b/infrastructure/backup/image/Dockerfile index e6e11b4..cfec7b3 100644 --- a/infrastructure/backup/image/Dockerfile +++ b/infrastructure/backup/image/Dockerfile @@ -2,4 +2,6 @@ FROM domaindrivenarchitecture/dda-backup:latest # Prepare Entrypoint Script ADD resources /tmp -RUN /tmp/install.sh +RUN /tmp/install.bb +RUN init.bb +ADD resources2 /tmp diff --git a/infrastructure/backup/image/resources/backup.bb b/infrastructure/backup/image/resources/backup.bb new file mode 100755 index 0000000..b2e9acc --- /dev/null +++ b/infrastructure/backup/image/resources/backup.bb @@ -0,0 +1,35 @@ +#!/usr/bin/env bb +(require + '[babashka.fs :as fs]) +(-> "/usr/local/bin/config.clj" fs/file load-file) + +(require + '[babashka.tasks :as t] + '[dda.backup.core :as bc] + '[dda.backup.restic :as rc] + '[dda.backup.postgresql :as pg] + '[dda.backup.backup :as bak] + '[config :as cf]) + +(defn prepare! + [] + (bc/create-aws-credentials! cf/aws-config) + (pg/create-pg-pass! cf/db-config)) + +(defn restic-repo-init! + [] + (rc/init! cf/file-config) + (rc/init! cf/db-role-config) + (rc/init! cf/db-config)) + +(defn restic-backup! + [] + (bak/backup-file! cf/file-config) + (bak/backup-db-roles! cf/db-role-config) + (bak/backup-db! cf/db-config)) + +(t/shell "start-maintenance.sh") +(prepare!) +(restic-repo-init!) +(restic-backup!) +(t/shell "end-maintenance.sh") \ No newline at end of file diff --git a/infrastructure/backup/image/resources/backup.sh b/infrastructure/backup/image/resources/backup.sh deleted file mode 100755 index 76c203b..0000000 --- a/infrastructure/backup/image/resources/backup.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -set -Eexo pipefail - -function main() { - - start-maintenance.sh - - file_env AWS_ACCESS_KEY_ID - file_env AWS_SECRET_ACCESS_KEY - file_env POSTGRES_DB - file_env POSTGRES_PASSWORD - file_env POSTGRES_USER - file_env RESTIC_DAYS_TO_KEEP 30 - file_env RESTIC_MONTHS_TO_KEEP 12 - - backup-roles 'oc_' - backup-db-dump - backup-directory '/var/backups/' - - end-maintenance.sh -} - -source /usr/local/lib/functions.sh -source /usr/local/lib/pg-functions.sh -source /usr/local/lib/file-functions.sh - -main diff --git a/infrastructure/backup/image/resources/bb-backup.edn b/infrastructure/backup/image/resources/bb-backup.edn new file mode 100644 index 0000000..1a7297a --- /dev/null +++ b/infrastructure/backup/image/resources/bb-backup.edn @@ -0,0 +1,3 @@ +{:deps {org.clojure/spec.alpha {:mvn/version "0.4.233"} + orchestra/orchestra {:mvn/version "2021.01.01-1"} + org.domaindrivenarchitecture/dda-backup {:local/root "/usr/local/lib/dda-backup"}}} diff --git a/infrastructure/backup/image/resources/bb.edn b/infrastructure/backup/image/resources/bb.edn new file mode 100644 index 0000000..da7e0df --- /dev/null +++ b/infrastructure/backup/image/resources/bb.edn @@ -0,0 +1,3 @@ +{:deps {org.clojure/spec.alpha {:mvn/version "0.4.233"} + orchestra/orchestra {:mvn/version "2021.01.01-1"} + org.domaindrivenarchitecture/dda-build {:mvn/version "0.2.0"}}} diff --git a/infrastructure/backup/image/resources/config.clj b/infrastructure/backup/image/resources/config.clj new file mode 100644 index 0000000..aaa1c63 --- /dev/null +++ b/infrastructure/backup/image/resources/config.clj @@ -0,0 +1,34 @@ +(ns config + (:require + [dda.backup.core :as bc])) + +(def restic-repo {:password-file (bc/env-or-file "RESTIC_PASSWORD_FILE") + :restic-repository (bc/env-or-file "RESTIC_REPOSITORY")}) + +(def file-config (merge restic-repo {:backup-path "files" + :execution-directory "/var/backups" + :restore-target-directory "/var/backups/" + :files ["."]})) + +(def file-restore-config (merge restic-repo {:backup-path "files" + :restore-target-directory "/var/backups/"})) + +(def db-config (merge restic-repo {:backup-path "pg-database" + :pg-host (bc/env-or-file "POSTGRES_SERVICE") + :pg-port (bc/env-or-file "POSTGRES_PORT") + :pg-db (bc/env-or-file "POSTGRES_DB") + :pg-user (bc/env-or-file "POSTGRES_USER") + :pg-password (bc/env-or-file "POSTGRES_PASSWORD")})) + +(def db-role-config (merge restic-repo {:backup-path "pg-role" + :pg-role-prefix "oc_" + :pg-host (bc/env-or-file "POSTGRES_SERVICE") + :pg-port (bc/env-or-file "POSTGRES_PORT") + :pg-db (bc/env-or-file "POSTGRES_DB") + :pg-user (bc/env-or-file "POSTGRES_USER") + :pg-password (bc/env-or-file "POSTGRES_PASSWORD")})) + +(def aws-config {:aws-access-key-id (bc/env-or-file "AWS_ACCESS_KEY_ID") + :aws-secret-access-key (bc/env-or-file "AWS_SECRET_ACCESS_KEY")}) + +(def dry-run {:dry-run true :debug true}) diff --git a/infrastructure/backup/image/resources/init.bb b/infrastructure/backup/image/resources/init.bb new file mode 100755 index 0000000..af0856c --- /dev/null +++ b/infrastructure/backup/image/resources/init.bb @@ -0,0 +1,3 @@ +#!/usr/bin/env bb + +(println "initialized") diff --git a/infrastructure/backup/image/resources/init.sh b/infrastructure/backup/image/resources/init.sh deleted file mode 100755 index fb33f35..0000000 --- a/infrastructure/backup/image/resources/init.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -set -Eexo pipefail - -function main() { - file_env AWS_ACCESS_KEY_ID - file_env AWS_SECRET_ACCESS_KEY - - init-role-repo - init-database-repo - init-file-repo -} - -source /usr/local/lib/functions.sh -source /usr/local/lib/pg-functions.sh -source /usr/local/lib/file-functions.sh -main diff --git a/infrastructure/backup/image/resources/install.bb b/infrastructure/backup/image/resources/install.bb new file mode 100755 index 0000000..9ce49b7 --- /dev/null +++ b/infrastructure/backup/image/resources/install.bb @@ -0,0 +1,23 @@ +#!/usr/bin/env bb + +(require + '[dda.image.ubuntu :as ub] + '[dda.image.install :as in]) + +(ub/upgrade-system!) +(in/install! "entrypoint.sh") +(in/install! "entrypoint-start-and-wait.sh") + +(in/install! "bb-backup.edn" :target-name "bb.edn" :mod "0440") +(in/install! "config.clj" :mod "0440") +(in/install! "init.bb") +(in/install! "backup.bb") +(in/install! "restore.sh") +(in/install! "list-snapshots.bb") +(in/install! "start-maintenance.sh") +(in/install! "end-maintenance.sh") + +#(in/install! "restore.bb") +#(in/install! "wait.bb") + +(ub/cleanup-container!) \ No newline at end of file diff --git a/infrastructure/backup/image/resources/list-snapshots.bb b/infrastructure/backup/image/resources/list-snapshots.bb new file mode 100755 index 0000000..361cfc4 --- /dev/null +++ b/infrastructure/backup/image/resources/list-snapshots.bb @@ -0,0 +1,25 @@ +#!/usr/bin/env bb + +(require + '[babashka.fs :as fs]) + +(println (-> "/usr/local/bin/config.clj" fs/file load-file)) +(-> "/usr/local/bin/config.clj" fs/file load-file) + +(require + '[dda.backup.core :as bc] + '[dda.backup.restic :as rc] + '[config.clj :as cf]) + +(defn prepare! + [] + (bc/create-aws-credentials! cf/aws-config)) + +(defn list-snapshots! + [] + (rc/list-snapshots! cf/file-config) + (rc/list-snapshots! cf/db-role-config) + (rc/list-snapshots! cf/db-config)) + +(prepare!) +(list-snapshots!) diff --git a/infrastructure/backup/image/resources/list-snapshots.sh b/infrastructure/backup/image/resources/list-snapshots.sh deleted file mode 100755 index 10ca9dd..0000000 --- a/infrastructure/backup/image/resources/list-snapshots.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -set -exo pipefail - -function list-snapshot-files() { - if [ -z ${CERTIFICATE_FILE} ]; - then - restic -r ${RESTIC_REPOSITORY}/${backup_file_path} snapshots - else - restic -r ${RESTIC_REPOSITORY}/${backup_file_path} snapshots --cacert ${CERTIFICATE_FILE} - fi -} - -function main() { - file_env AWS_ACCESS_KEY_ID - file_env AWS_SECRET_ACCESS_KEY - - file_env POSTGRES_DB - file_env POSTGRES_PASSWORD - file_env POSTGRES_USER - - list-snapshot-roles - list-snapshot-db - list-snapshot-files -} - -source /usr/local/lib/functions.sh -source /usr/local/lib/file-functions.sh -source /usr/local/lib/pg-functions.sh - -main diff --git a/infrastructure/backup/image/resources2/bb.edn b/infrastructure/backup/image/resources2/bb.edn new file mode 100644 index 0000000..1a7297a --- /dev/null +++ b/infrastructure/backup/image/resources2/bb.edn @@ -0,0 +1,3 @@ +{:deps {org.clojure/spec.alpha {:mvn/version "0.4.233"} + orchestra/orchestra {:mvn/version "2021.01.01-1"} + org.domaindrivenarchitecture/dda-backup {:local/root "/usr/local/lib/dda-backup"}}} diff --git a/infrastructure/backup/image/resources2/exports.sh b/infrastructure/backup/image/resources2/exports.sh new file mode 100644 index 0000000..f15d339 --- /dev/null +++ b/infrastructure/backup/image/resources2/exports.sh @@ -0,0 +1,10 @@ +export ENV_PASSWORD=env-password +export RESTIC_PASSWORD_FILE=/tmp/file_password +export RESTIC_REPOSITORY=/var/restic-repo +export POSTGRES_SERVICE=dummy +export POSTGRES_PORT=dummy +export POSTGRES_DB=dummy +export POSTGRES_USER=dummy +export POSTGRES_PASSWORD=dummy +export AWS_ACCESS_KEY_ID=dummy +export AWS_SECRET_ACCESS_KEY=dummy \ No newline at end of file diff --git a/infrastructure/backup/image/resources2/file_password b/infrastructure/backup/image/resources2/file_password new file mode 100644 index 0000000..f0890e1 --- /dev/null +++ b/infrastructure/backup/image/resources2/file_password @@ -0,0 +1 @@ +oldPassword \ No newline at end of file diff --git a/infrastructure/backup/image/resources2/test.bb b/infrastructure/backup/image/resources2/test.bb new file mode 100755 index 0000000..a6d4314 --- /dev/null +++ b/infrastructure/backup/image/resources2/test.bb @@ -0,0 +1,52 @@ +#!/usr/bin/env bb +(require + '[babashka.fs :as fs]) +(-> "/usr/local/bin/config.clj" fs/file load-file) + +(require '[babashka.tasks :as tasks] + '[dda.backup.core :as bc] + '[dda.backup.restic :as rc] + '[dda.backup.postgresql :as pg] + '[dda.backup.backup :as bak] + '[dda.backup.restore :as rs] + '[config :as cf]) + +(defn prepare! + [] + (println (bc/env-or-file "RESTIC_PASSWORD_FILE")) + (println (bc/env-or-file "ENV_PASSWORD")) + (tasks/shell "mkdir" "-p" "/var/backups/") + (tasks/shell "mkdir" "-p" "/var/restic-repo/") + (spit "/var/backups/file" "I was here")) + +(defn restic-repo-init! + [] + (rc/init! cf/file-config) + (rc/init! (merge cf/db-config cf/dry-run)) + (rc/init! (merge cf/db-role-config cf/dry-run))) + +(defn restic-backup! + [] + (bak/backup-file! cf/file-config) + (bak/backup-db-roles! (merge cf/db-role-config cf/dry-run)) + (bak/backup-db! (merge cf/db-config cf/dry-run))) + +(defn list-snapshots! + [] + (rc/list-snapshots! cf/file-config) + (rc/list-snapshots! (merge cf/db-role-config cf/dry-run)) + (rc/list-snapshots! (merge cf/db-config cf/dry-run))) + + +(defn restic-restore! + [] + (rs/restore-file! (merge {:debug true} cf/file-restore-config)) + (pg/drop-create-db! (merge cf/db-config cf/dry-run)) + ;(rs/restore-db-roles! (merge cf/db-role-config cf/dry-run)) + (rs/restore-db! (merge cf/db-config cf/dry-run))) + +(prepare!) +(restic-repo-init!) +(restic-backup!) +(list-snapshots!) +(restic-restore!) diff --git a/infrastructure/backup/test/Dockerfile b/infrastructure/backup/test/Dockerfile new file mode 100644 index 0000000..aa4f637 --- /dev/null +++ b/infrastructure/backup/test/Dockerfile @@ -0,0 +1,4 @@ +FROM c4k-cloud-backup:latest + +ADD resources /tmp/ +RUN ENV_PASSWORD=env-password RESTIC_PASSWORD_FILE_FILE=/tmp/file_password RESTIC_REPOSITORY=restic-repo POSTGRES_SERVICE=dummy POSTGRES_PORT=dummy POSTGRES_DB=dummy POSTGRES_USER=dummy POSTGRES_PASSWORD=dummy AWS_ACCESS_KEY_ID=dummy AWS_SECRET_ACCESS_KEY=dummy /tmp/test.bb diff --git a/infrastructure/backup/test/resources/bb.edn b/infrastructure/backup/test/resources/bb.edn new file mode 100644 index 0000000..1a7297a --- /dev/null +++ b/infrastructure/backup/test/resources/bb.edn @@ -0,0 +1,3 @@ +{:deps {org.clojure/spec.alpha {:mvn/version "0.4.233"} + orchestra/orchestra {:mvn/version "2021.01.01-1"} + org.domaindrivenarchitecture/dda-backup {:local/root "/usr/local/lib/dda-backup"}}} diff --git a/infrastructure/backup/test/resources/file_password b/infrastructure/backup/test/resources/file_password new file mode 100644 index 0000000..f0890e1 --- /dev/null +++ b/infrastructure/backup/test/resources/file_password @@ -0,0 +1 @@ +oldPassword \ No newline at end of file diff --git a/infrastructure/backup/test/resources/test.bb b/infrastructure/backup/test/resources/test.bb new file mode 100755 index 0000000..3c3903e --- /dev/null +++ b/infrastructure/backup/test/resources/test.bb @@ -0,0 +1,48 @@ +#!/usr/bin/env bb +(require + '[babashka.fs :as fs]) +(-> "/usr/local/bin/config.clj" fs/file load-file) + +(require '[babashka.tasks :as tasks] + '[dda.backup.core :as bc] + '[dda.backup.restic :as rc] + '[dda.backup.postgresql :as pg] + '[dda.backup.backup :as bak] + '[dda.backup.restore :as rs] + '[config :as cf]) + +(defn prepare! + [] + (println (bc/env-or-file "RESTIC_PASSWORD_FILE")) + (println (bc/env-or-file "ENV_PASSWORD")) + (tasks/shell "mkdir" "-p" "/var/backups/") + (spit "/var/backups/file" "I was here") + (tasks/shell "mkdir" "-p" "/var/restore")) + +(defn restic-repo-init! + [] + (rc/init! (merge cf/file-config cf/dry-run)) + (rc/init! (merge cf/db-config cf/dry-run))) + +(defn restic-backup! + [] + (bak/backup-file! cf/file-config) + (bak/backup-db! (merge cf/db-config cf/dry-run))) + +(defn list-snapshots! + [] + (rc/list-snapshots! cf/file-config) + (rc/list-snapshots! (merge cf/db-config cf/dry-run))) + + +(defn restic-restore! + [] + (rs/restore-file! cf/file-config) + (pg/drop-create-db! (merge cf/db-config cf/dry-run)) + (rs/restore-db! (merge cf/db-config cf/dry-run))) + +(prepare!) +(restic-repo-init!) +#(restic-backup!) +#(list-snapshots!) +#(restic-restore!) From 03b0b85247f359dddbfa586595ab95603152bd9a Mon Sep 17 00:00:00 2001 From: Michael Jerger <michael.jerger@meissa-gmbh.de> Date: Mon, 30 Dec 2024 14:21:27 +0100 Subject: [PATCH 3/5] refactor to babashka driven backup --- infrastructure/backup/image/Dockerfile | 2 +- .../resources/entrypoint-start-and-wait.sh | 19 ----------- .../backup/image/resources/entrypoint.sh | 17 ---------- .../backup/image/resources/install.bb | 10 ++---- .../backup/image/resources/install.sh | 21 ------------ .../backup/image/resources/list-snapshots.bb | 5 +-- .../backup/image/resources/restore.bb | 29 ++++++++++++++++ .../backup/image/resources/restore.sh | 33 ------------------- infrastructure/backup/image/resources/wait.bb | 21 ++++++++++++ .../backup/image/resources2/test.bb | 10 +++--- .../backup/backup-restore-deployment.yaml | 2 +- src/main/resources/backup/cron.yaml | 2 +- 12 files changed, 62 insertions(+), 109 deletions(-) delete mode 100644 infrastructure/backup/image/resources/entrypoint-start-and-wait.sh delete mode 100755 infrastructure/backup/image/resources/entrypoint.sh delete mode 100755 infrastructure/backup/image/resources/install.sh create mode 100755 infrastructure/backup/image/resources/restore.bb delete mode 100755 infrastructure/backup/image/resources/restore.sh create mode 100755 infrastructure/backup/image/resources/wait.bb diff --git a/infrastructure/backup/image/Dockerfile b/infrastructure/backup/image/Dockerfile index cfec7b3..b9adae5 100644 --- a/infrastructure/backup/image/Dockerfile +++ b/infrastructure/backup/image/Dockerfile @@ -1,4 +1,4 @@ -FROM domaindrivenarchitecture/dda-backup:latest +FROM domaindrivenarchitecture/dda-backup:5.1.0 # Prepare Entrypoint Script ADD resources /tmp diff --git a/infrastructure/backup/image/resources/entrypoint-start-and-wait.sh b/infrastructure/backup/image/resources/entrypoint-start-and-wait.sh deleted file mode 100644 index 58d847b..0000000 --- a/infrastructure/backup/image/resources/entrypoint-start-and-wait.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -set -exo pipefail - -function main() { - file_env POSTGRES_DB - file_env POSTGRES_PASSWORD - file_env POSTGRES_USER - - create-pg-pass - - while true; do - sleep 1m - done -} - -source /usr/local/lib/functions.sh -source /usr/local/lib/pg-functions.sh -main \ No newline at end of file diff --git a/infrastructure/backup/image/resources/entrypoint.sh b/infrastructure/backup/image/resources/entrypoint.sh deleted file mode 100755 index 3bdf754..0000000 --- a/infrastructure/backup/image/resources/entrypoint.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -set -Eexo pipefail - -function main() { - file_env POSTGRES_DB - file_env POSTGRES_PASSWORD - file_env POSTGRES_USER - - create-pg-pass - - /usr/local/bin/backup.sh -} - -source /usr/local/lib/functions.sh -source /usr/local/lib/pg-functions.sh -main diff --git a/infrastructure/backup/image/resources/install.bb b/infrastructure/backup/image/resources/install.bb index 9ce49b7..49f6429 100755 --- a/infrastructure/backup/image/resources/install.bb +++ b/infrastructure/backup/image/resources/install.bb @@ -5,19 +5,15 @@ '[dda.image.install :as in]) (ub/upgrade-system!) -(in/install! "entrypoint.sh") -(in/install! "entrypoint-start-and-wait.sh") - (in/install! "bb-backup.edn" :target-name "bb.edn" :mod "0440") (in/install! "config.clj" :mod "0440") (in/install! "init.bb") (in/install! "backup.bb") -(in/install! "restore.sh") +(in/install! "restore.bb") (in/install! "list-snapshots.bb") (in/install! "start-maintenance.sh") (in/install! "end-maintenance.sh") - -#(in/install! "restore.bb") -#(in/install! "wait.bb") +(in/install! "restore.bb") +(in/install! "wait.bb") (ub/cleanup-container!) \ No newline at end of file diff --git a/infrastructure/backup/image/resources/install.sh b/infrastructure/backup/image/resources/install.sh deleted file mode 100755 index 1ebd786..0000000 --- a/infrastructure/backup/image/resources/install.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -set -exo pipefail - -function main() { - { - install -m 0700 /tmp/entrypoint.sh / - install -m 0700 /tmp/entrypoint-start-and-wait.sh / - - install -m 0700 /tmp/init.sh /usr/local/bin/ - install -m 0700 /tmp/backup.sh /usr/local/bin/ - install -m 0700 /tmp/restore.sh /usr/local/bin/ - install -m 0700 /tmp/list-snapshots.sh /usr/local/bin/ - install -m 0700 /tmp/start-maintenance.sh /usr/local/bin/ - install -m 0700 /tmp/end-maintenance.sh /usr/local/bin/ - cleanupDocker - } > /dev/null -} - -source /tmp/install_functions_debian.sh -main diff --git a/infrastructure/backup/image/resources/list-snapshots.bb b/infrastructure/backup/image/resources/list-snapshots.bb index 361cfc4..fb97cdd 100755 --- a/infrastructure/backup/image/resources/list-snapshots.bb +++ b/infrastructure/backup/image/resources/list-snapshots.bb @@ -1,15 +1,12 @@ #!/usr/bin/env bb - (require '[babashka.fs :as fs]) - -(println (-> "/usr/local/bin/config.clj" fs/file load-file)) (-> "/usr/local/bin/config.clj" fs/file load-file) (require '[dda.backup.core :as bc] '[dda.backup.restic :as rc] - '[config.clj :as cf]) + '[config :as cf]) (defn prepare! [] diff --git a/infrastructure/backup/image/resources/restore.bb b/infrastructure/backup/image/resources/restore.bb new file mode 100755 index 0000000..797d005 --- /dev/null +++ b/infrastructure/backup/image/resources/restore.bb @@ -0,0 +1,29 @@ +#!/usr/bin/env bb +(require + '[babashka.fs :as fs]) +(-> "/usr/local/bin/config.clj" fs/file load-file) + +(require + '[babashka.tasks :as t] + '[dda.backup.core :as bc] + '[dda.backup.postgresql :as pg] + '[dda.backup.restore :as rs] + '[config :as cf]) + +(defn prepare! + [] + (bc/create-aws-credentials! cf/aws-config) + (pg/create-pg-pass! cf/db-config)) + +(defn restic-restore! + [] + (pg/drop-create-db! cf/db-config) + (rs/restore-db-roles! cf/db-role-config) + (rs/restore-db! cf/db-config) + (rs/restore-file! cf/file-config) + ) + +(t/shell "start-maintenance.sh") +(prepare!) +(restic-restore!) +(t/shell "end-maintenance.sh") \ No newline at end of file diff --git a/infrastructure/backup/image/resources/restore.sh b/infrastructure/backup/image/resources/restore.sh deleted file mode 100755 index 44db019..0000000 --- a/infrastructure/backup/image/resources/restore.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -set -Eexo pipefail - -function main() { - local role_snapshot_id="${1:-latest}" - local db_snapshot_id="${2:-latest}" - local file_snapshot_id="${3:-latest}" - - - start-maintenance.sh - - file_env AWS_ACCESS_KEY_ID - file_env AWS_SECRET_ACCESS_KEY - - file_env POSTGRES_DB - file_env POSTGRES_PASSWORD - file_env POSTGRES_USER - - drop-create-db - - restore-roles ${role_snapshot_id} - restore-db ${db_snapshot_id} - restore-directory '/var/backups/' ${file_snapshot_id} - - end-maintenance.sh -} - -source /usr/local/lib/functions.sh -source /usr/local/lib/pg-functions.sh -source /usr/local/lib/file-functions.sh - -main "$@" diff --git a/infrastructure/backup/image/resources/wait.bb b/infrastructure/backup/image/resources/wait.bb new file mode 100755 index 0000000..620b789 --- /dev/null +++ b/infrastructure/backup/image/resources/wait.bb @@ -0,0 +1,21 @@ +#!/usr/bin/env bb +(require + '[babashka.fs :as fs]) +(-> "/usr/local/bin/config.clj" fs/file load-file) + +(require + '[dda.backup.core :as bc] + '[dda.backup.postgresql :as pg] + '[config :as cf]) + +(defn prepare! + [] + (bc/create-aws-credentials! cf/aws-config) + (pg/create-pg-pass! cf/db-config)) + +(defn wait! [] + (while true + (Thread/sleep 1000))) + +(prepare!) +(wait!) \ No newline at end of file diff --git a/infrastructure/backup/image/resources2/test.bb b/infrastructure/backup/image/resources2/test.bb index a6d4314..3604da7 100755 --- a/infrastructure/backup/image/resources2/test.bb +++ b/infrastructure/backup/image/resources2/test.bb @@ -22,8 +22,8 @@ (defn restic-repo-init! [] (rc/init! cf/file-config) - (rc/init! (merge cf/db-config cf/dry-run)) - (rc/init! (merge cf/db-role-config cf/dry-run))) + (rc/init! (merge cf/db-config)) + (rc/init! (merge cf/db-role-config))) (defn restic-backup! [] @@ -37,12 +37,12 @@ (rc/list-snapshots! (merge cf/db-role-config cf/dry-run)) (rc/list-snapshots! (merge cf/db-config cf/dry-run))) - (defn restic-restore! [] - (rs/restore-file! (merge {:debug true} cf/file-restore-config)) + (println "huhu") + (rs/restore-file! (merge cf/file-restore-config {:debug true})) (pg/drop-create-db! (merge cf/db-config cf/dry-run)) - ;(rs/restore-db-roles! (merge cf/db-role-config cf/dry-run)) + (rs/restore-db-roles! (merge cf/db-role-config cf/dry-run)) (rs/restore-db! (merge cf/db-config cf/dry-run))) (prepare!) diff --git a/src/main/resources/backup/backup-restore-deployment.yaml b/src/main/resources/backup/backup-restore-deployment.yaml index 3a43bd1..26a4ebe 100644 --- a/src/main/resources/backup/backup-restore-deployment.yaml +++ b/src/main/resources/backup/backup-restore-deployment.yaml @@ -21,7 +21,7 @@ spec: - name: backup-app image: domaindrivenarchitecture/c4k-cloud-backup imagePullPolicy: IfNotPresent - command: ["/entrypoint-start-and-wait.sh"] + command: ["wait.bb"] env: - name: POSTGRES_USER valueFrom: diff --git a/src/main/resources/backup/cron.yaml b/src/main/resources/backup/cron.yaml index 0424ec6..a7c1cad 100644 --- a/src/main/resources/backup/cron.yaml +++ b/src/main/resources/backup/cron.yaml @@ -17,7 +17,7 @@ spec: - name: backup-app image: domaindrivenarchitecture/c4k-cloud-backup imagePullPolicy: IfNotPresent - command: ["/entrypoint.sh"] + command: ["backup.bb"] env: - name: POSTGRES_USER valueFrom: From 6de3e47bd2da2c813ddb69fd6df3c9c8b49b42ab Mon Sep 17 00:00:00 2001 From: Michael Jerger <michael.jerger@meissa-gmbh.de> Date: Tue, 31 Dec 2024 11:09:22 +0100 Subject: [PATCH 4/5] update refactoring --- src/test/cljc/dda/c4k_nextcloud/backup_test.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/cljc/dda/c4k_nextcloud/backup_test.cljc b/src/test/cljc/dda/c4k_nextcloud/backup_test.cljc index 9a0ccfa..aa013cf 100644 --- a/src/test/cljc/dda/c4k_nextcloud/backup_test.cljc +++ b/src/test/cljc/dda/c4k_nextcloud/backup_test.cljc @@ -41,7 +41,7 @@ [{:name "backup-app" :image "domaindrivenarchitecture/c4k-cloud-backup" :imagePullPolicy "IfNotPresent" - :command ["/entrypoint.sh"] + :command ["backup.bb"] :env [{:valueFrom {:secretKeyRef From dad69a180b4b5f49d6da776b9dd97a83c3d75b10 Mon Sep 17 00:00:00 2001 From: Michael Jerger <michael.jerger@meissa-gmbh.de> Date: Wed, 8 Jan 2025 16:52:21 +0100 Subject: [PATCH 5/5] versions update --- project.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project.clj b/project.clj index 37a4209..6cfe33f 100644 --- a/project.clj +++ b/project.clj @@ -5,7 +5,7 @@ :url "https://www.apache.org/licenses/LICENSE-2.0.html"} :dependencies [[org.clojure/clojure "1.12.0"] [org.clojure/tools.reader "1.5.0"] - [org.domaindrivenarchitecture/c4k-common-clj "8.0.0"] + [org.domaindrivenarchitecture/c4k-common-clj "8.1.1"] [hickory "0.7.1" :exclusions [viebel/codox-klipse-theme]]] :target-path "target/%s/" :source-paths ["src/main/cljc" @@ -23,7 +23,7 @@ :main dda.c4k-nextcloud.uberjar :uberjar-name "c4k-nextcloud-standalone.jar" :dependencies [[org.clojure/tools.cli "1.1.230"] - [ch.qos.logback/logback-classic "1.5.15" + [ch.qos.logback/logback-classic "1.5.16" :exclusions [com.sun.mail/javax.mail]] [org.slf4j/jcl-over-slf4j "2.0.16"] [com.github.clj-easy/graal-build-time "1.0.5"]]}}