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] 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!)