prepare first backup test
This commit is contained in:
parent
c0a5539d19
commit
a12a421bbf
18 changed files with 149 additions and 142 deletions
|
@ -2,4 +2,4 @@ FROM domaindrivenarchitecture/dda-backup:latest
|
||||||
|
|
||||||
# Prepare Entrypoint Script
|
# Prepare Entrypoint Script
|
||||||
ADD resources /tmp
|
ADD resources /tmp
|
||||||
RUN /tmp/install.sh
|
RUN /tmp/install.bb
|
||||||
|
|
40
infrastructure/backup/image/resources/backup.bb
Executable file
40
infrastructure/backup/image/resources/backup.bb
Executable file
|
@ -0,0 +1,40 @@
|
||||||
|
#!/usr/bin/env bb
|
||||||
|
|
||||||
|
(require '[dda.backup.core :as bc]
|
||||||
|
'[dda.backup.restic :as rc]
|
||||||
|
'[dda.backup.postgresql :as pg]
|
||||||
|
'[dda.backup.backup :as bak])
|
||||||
|
|
||||||
|
(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"
|
||||||
|
:files ["/var/backups/" "gitea/" "git/repositories/"]}))
|
||||||
|
|
||||||
|
|
||||||
|
(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 dry-run {:dry-run true :debug true})
|
||||||
|
|
||||||
|
(defn prepare!
|
||||||
|
[]
|
||||||
|
(pg/create-pg-pass! db-config))
|
||||||
|
|
||||||
|
(defn restic-repo-init!
|
||||||
|
[]
|
||||||
|
(rc/init! file-config)
|
||||||
|
(rc/init! db-config))
|
||||||
|
|
||||||
|
(defn restic-backup!
|
||||||
|
[]
|
||||||
|
(bak/backup-file! file-config)
|
||||||
|
(bak/backup-db! db-config))
|
||||||
|
|
||||||
|
(prepare!)
|
||||||
|
(restic-repo-init!)
|
||||||
|
(restic-backup!)
|
|
@ -1,19 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -Eexo pipefail
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
file_env AWS_ACCESS_KEY_ID
|
|
||||||
file_env AWS_SECRET_ACCESS_KEY
|
|
||||||
file_env RESTIC_DAYS_TO_KEEP 30
|
|
||||||
file_env RESTIC_MONTHS_TO_KEEP 12
|
|
||||||
|
|
||||||
backup-db-dump
|
|
||||||
backup-fs-from-directory '/var/backups/' 'gitea/' 'git/repositories/'
|
|
||||||
}
|
|
||||||
|
|
||||||
source /usr/local/lib/functions.sh
|
|
||||||
source /usr/local/lib/pg-functions.sh
|
|
||||||
source /usr/local/lib/file-functions.sh
|
|
||||||
|
|
||||||
main
|
|
3
infrastructure/backup/image/resources/bb-backup.edn
Normal file
3
infrastructure/backup/image/resources/bb-backup.edn
Normal file
|
@ -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"}}}
|
3
infrastructure/backup/image/resources/bb.edn
Normal file
3
infrastructure/backup/image/resources/bb.edn
Normal file
|
@ -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.1.1-SNAPSHOT"}}}
|
|
@ -1,15 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -Eexo pipefail
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
create-pg-pass
|
|
||||||
|
|
||||||
while true; do
|
|
||||||
sleep 1m
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
source /usr/local/lib/functions.sh
|
|
||||||
source /usr/local/lib/pg-functions.sh
|
|
||||||
main
|
|
|
@ -1,13 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -Eexo pipefail
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
create-pg-pass
|
|
||||||
|
|
||||||
/usr/local/bin/backup.sh
|
|
||||||
}
|
|
||||||
|
|
||||||
source /usr/local/lib/functions.sh
|
|
||||||
source /usr/local/lib/pg-functions.sh
|
|
||||||
main
|
|
3
infrastructure/backup/image/resources/init.bb
Executable file
3
infrastructure/backup/image/resources/init.bb
Executable file
|
@ -0,0 +1,3 @@
|
||||||
|
#!/usr/bin/env bb
|
||||||
|
|
||||||
|
(println "initialized")
|
|
@ -1,16 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -Eexo pipefail
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
file_env AWS_ACCESS_KEY_ID
|
|
||||||
file_env AWS_SECRET_ACCESS_KEY
|
|
||||||
|
|
||||||
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
|
|
14
infrastructure/backup/image/resources/install.bb
Executable file
14
infrastructure/backup/image/resources/install.bb
Executable file
|
@ -0,0 +1,14 @@
|
||||||
|
#!/usr/bin/env bb
|
||||||
|
|
||||||
|
(require
|
||||||
|
'[dda.image.ubuntu :as ub]
|
||||||
|
'[dda.image.install :as in])
|
||||||
|
|
||||||
|
|
||||||
|
(ub/upgrade-system!)
|
||||||
|
(in/install! "bb-backup.edn" :target-name "bb.edn" :mod "0400")
|
||||||
|
(in/install! "backup.bb")
|
||||||
|
(in/install! "restore.bb")
|
||||||
|
(in/install! "list-snapshots.bb")
|
||||||
|
(in/install! "wait.bb")
|
||||||
|
(ub/cleanup-container!)
|
|
@ -1,21 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -exo pipefail
|
|
||||||
|
|
||||||
function main()
|
|
||||||
{
|
|
||||||
upgradeSystem
|
|
||||||
|
|
||||||
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/restic-snapshots.sh /usr/local/bin/
|
|
||||||
|
|
||||||
cleanupDocker
|
|
||||||
} > /dev/null
|
|
||||||
|
|
||||||
source /tmp/install_functions_debian.sh
|
|
||||||
DEBIAN_FRONTEND=noninteractive DEBCONF_NOWARNINGS=yes main
|
|
14
infrastructure/backup/image/resources/list-snapshots.bb
Executable file
14
infrastructure/backup/image/resources/list-snapshots.bb
Executable file
|
@ -0,0 +1,14 @@
|
||||||
|
#!/usr/bin/env bb
|
||||||
|
|
||||||
|
(require '[dda.backup.core :as bc]
|
||||||
|
'[dda.backup.restic :as rc])
|
||||||
|
|
||||||
|
(def restic-repo {:password-file (bc/env-or-file "RESTIC_PASSWORD_FILE")
|
||||||
|
:restic-repository (bc/env-or-file "RESTIC_REPOSITORY")})
|
||||||
|
|
||||||
|
(defn list-snapshots!
|
||||||
|
[]
|
||||||
|
(rc/list-snapshots! file-config)
|
||||||
|
(rc/list-snapshots! db-config))
|
||||||
|
|
||||||
|
(list-snapshots!)
|
|
@ -1,16 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -exo pipefail
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
file_env AWS_ACCESS_KEY_ID
|
|
||||||
file_env AWS_SECRET_ACCESS_KEY
|
|
||||||
|
|
||||||
restic -r ${RESTIC_REPOSITORY}/files snapshots
|
|
||||||
restic -r ${RESTIC_REPOSITORY}/pg-database snapshots
|
|
||||||
}
|
|
||||||
|
|
||||||
source /usr/local/lib/functions.sh
|
|
||||||
source /usr/local/lib/file-functions.sh
|
|
||||||
|
|
||||||
main
|
|
42
infrastructure/backup/image/resources/restore.bb
Executable file
42
infrastructure/backup/image/resources/restore.bb
Executable file
|
@ -0,0 +1,42 @@
|
||||||
|
#!/usr/bin/env bb
|
||||||
|
|
||||||
|
(require '[babashka.tasks :as tasks]
|
||||||
|
'[dda.backup.core :as bc]
|
||||||
|
'[dda.backup.postgresql :as pg]
|
||||||
|
'[dda.backup.restore :as rs])
|
||||||
|
|
||||||
|
(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"
|
||||||
|
:restore-target-directory "/var/backups/restore"
|
||||||
|
:snapshot-id "latest"}))
|
||||||
|
|
||||||
|
|
||||||
|
(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")
|
||||||
|
:snapshot-id "latest"}))
|
||||||
|
|
||||||
|
(def dry-run {:dry-run true :debug true})
|
||||||
|
|
||||||
|
(defn prepare!
|
||||||
|
[]
|
||||||
|
(pg/create-pg-pass! db-config))
|
||||||
|
|
||||||
|
(defn restic-restore!
|
||||||
|
[]
|
||||||
|
(rs/restore-file! file-config)
|
||||||
|
(tasks/sh "bash" "-c" "rm -rf /var/backups/gitea/*")
|
||||||
|
(tasks/sh "bash" "-c" "rm -rf /var/backups/git/repositories/*")
|
||||||
|
(tasks/sh "mv" "/var/backups/restore/gitea" "/var/backups/")
|
||||||
|
(tasks/sh "mv" "/var/backups/restore/git/repositories" "/var/backups/git/")
|
||||||
|
(tasks/sh "chown" "-R" "1000:1000" "/var/backups")
|
||||||
|
(pg/drop-create-db! db-config)
|
||||||
|
(rs/restore-db! db-config))
|
||||||
|
|
||||||
|
(prepare!)
|
||||||
|
(restic-restore!)
|
|
@ -1,39 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -Eexo pipefail
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
local db_snapshot_id="${1:-latest}"
|
|
||||||
local file_snapshot_id="${2:-latest}"
|
|
||||||
|
|
||||||
file_env AWS_ACCESS_KEY_ID
|
|
||||||
file_env AWS_SECRET_ACCESS_KEY
|
|
||||||
|
|
||||||
file_env POSTGRES_DB
|
|
||||||
file_env POSTGRES_PASSWORD
|
|
||||||
file_env POSTGRES_USER
|
|
||||||
|
|
||||||
# Restore latest snapshot into /var/backups/restore
|
|
||||||
restore-directory '/var/backups/restore' ${file_snapshot_id}
|
|
||||||
|
|
||||||
rm -rf /var/backups/gitea/*
|
|
||||||
rm -rf /var/backups/git/repositories/*
|
|
||||||
mv /var/backups/restore/gitea /var/backups/
|
|
||||||
mv /var/backups/restore/git/repositories /var/backups/git/
|
|
||||||
|
|
||||||
# adjust file permissions for the git user
|
|
||||||
chown -R 1000:1000 /var/backups
|
|
||||||
|
|
||||||
# TODO: Regenerate Git Hooks? Do we need this?
|
|
||||||
#/usr/local/bin/gitea -c '/data/gitea/conf/app.ini' admin regenerate hooks
|
|
||||||
|
|
||||||
# Restore db
|
|
||||||
drop-create-db
|
|
||||||
restore-db ${db_snapshot_id}
|
|
||||||
}
|
|
||||||
|
|
||||||
source /usr/local/lib/functions.sh
|
|
||||||
source /usr/local/lib/pg-functions.sh
|
|
||||||
source /usr/local/lib/file-functions.sh
|
|
||||||
|
|
||||||
main "$@"
|
|
27
infrastructure/backup/image/resources/wait.bb
Executable file
27
infrastructure/backup/image/resources/wait.bb
Executable file
|
@ -0,0 +1,27 @@
|
||||||
|
#!/usr/bin/env bb
|
||||||
|
|
||||||
|
(require
|
||||||
|
'[dda.backup.core :as bc]
|
||||||
|
'[dda.backup.postgresql :as pg])
|
||||||
|
|
||||||
|
|
||||||
|
(def restic-repo {:password-file (bc/env-or-file "RESTIC_PASSWORD_FILE")
|
||||||
|
:restic-repository (bc/env-or-file "RESTIC_REPOSITORY")})
|
||||||
|
|
||||||
|
(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")}))
|
||||||
|
|
||||||
|
(defn prepare!
|
||||||
|
[]
|
||||||
|
(pg/create-pg-pass! db-config))
|
||||||
|
|
||||||
|
(defn wait! []
|
||||||
|
(while true
|
||||||
|
(Thread/sleep 1000)))
|
||||||
|
|
||||||
|
(prepare!)
|
||||||
|
(wait!)
|
|
@ -21,7 +21,7 @@ spec:
|
||||||
- image: domaindrivenarchitecture/c4k-forgejo-backup
|
- image: domaindrivenarchitecture/c4k-forgejo-backup
|
||||||
name: backup-app
|
name: backup-app
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
command: ["/entrypoint-start-and-wait.sh"]
|
command: ["wait.bb"]
|
||||||
env:
|
env:
|
||||||
- name: POSTGRES_USER
|
- name: POSTGRES_USER
|
||||||
valueFrom:
|
valueFrom:
|
||||||
|
|
|
@ -17,7 +17,7 @@ spec:
|
||||||
- name: backup-app
|
- name: backup-app
|
||||||
image: domaindrivenarchitecture/c4k-forgejo-backup
|
image: domaindrivenarchitecture/c4k-forgejo-backup
|
||||||
imagePullPolicy: IfNotPresent
|
imagePullPolicy: IfNotPresent
|
||||||
command: ["/entrypoint.sh"]
|
command: ["backup.bb"]
|
||||||
env:
|
env:
|
||||||
- name: POSTGRES_USER
|
- name: POSTGRES_USER
|
||||||
valueFrom:
|
valueFrom:
|
||||||
|
|
Loading…
Reference in a new issue