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"]]}}