From 35a5dd95bbc85044b3668587d32210eb15fddb20 Mon Sep 17 00:00:00 2001 From: Mart124 <37041094+Mart124@users.noreply.github.com> Date: Mon, 25 Nov 2019 14:35:52 +0100 Subject: [PATCH] DB backups without cron (#608) * Update backup-db.sh * Update entrypoint.sh * Update Dockerfile * Delete crontab * Update backup-db.sh * don't bother with log files all is already in /var/opt/mssql/log/errorlog * Use gosu --- util/MsSql/Dockerfile | 4 +--- util/MsSql/backup-db.sh | 23 ++++++++++++++++------- util/MsSql/crontab | 3 --- util/MsSql/entrypoint.sh | 11 +++++------ 4 files changed, 22 insertions(+), 19 deletions(-) delete mode 100644 util/MsSql/crontab diff --git a/util/MsSql/Dockerfile b/util/MsSql/Dockerfile index 8382533206..967656d2a6 100644 --- a/util/MsSql/Dockerfile +++ b/util/MsSql/Dockerfile @@ -4,13 +4,10 @@ LABEL com.bitwarden.product="bitwarden" RUN apt-get update \ && apt-get install -y --no-install-recommends \ - cron \ gosu \ tzdata \ && rm -rf /var/lib/apt/lists/* -COPY crontab /etc/cron.d/bitwarden-cron -RUN chmod 0644 /etc/cron.d/bitwarden-cron COPY backup-db.sql / COPY backup-db.sh / COPY entrypoint.sh / @@ -18,6 +15,7 @@ COPY entrypoint.sh / RUN chmod +x /entrypoint.sh \ && chmod +x /backup-db.sh +# Does not work unfortunately (https://github.com/bitwarden/server/issues/286) RUN /opt/mssql/bin/mssql-conf set telemetry.customerfeedback false HEALTHCHECK --timeout=3s CMD /opt/mssql-tools/bin/sqlcmd \ diff --git a/util/MsSql/backup-db.sh b/util/MsSql/backup-db.sh index 885b5c07fe..4bec552258 100644 --- a/util/MsSql/backup-db.sh +++ b/util/MsSql/backup-db.sh @@ -1,11 +1,20 @@ #!/bin/sh -# Backup timestamp -export now=${1:-$(date +%Y%m%d_%H%M%S)} +while true +do + # Sleep until next day + [ "$1" == "loop" ] && sleep $((24 * 3600 - (`date +%H` * 3600 + `date +%M` * 60 + `date +%S`))) -# Do a new backup -/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SA_PASSWORD} -i /backup-db.sql + # Backup timestamp + export now=$(date +%Y%m%d_%H%M%S) -# Delete backup files older than 30 days -grep -B1 "BACKUP DATABASE successfully" /var/opt/mssql/log/errorlog | grep -q _$now.BAK && -find /etc/bitwarden/mssql/backups/ -mindepth 1 -type f -name '*.BAK' -mtime +32 -delete + # Do a new backup + /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SA_PASSWORD} -i /backup-db.sql + + # Delete backup files older than 30 days + grep -B1 "BACKUP DATABASE successfully" /var/opt/mssql/log/errorlog | grep -q _$now.BAK && + find /etc/bitwarden/mssql/backups/ -mindepth 1 -type f -name '*.BAK' -mtime +32 -delete + + # Break if called manually (without loop option) + [ "$1" != "loop" ] && break +done diff --git a/util/MsSql/crontab b/util/MsSql/crontab deleted file mode 100644 index 1c53d00e05..0000000000 --- a/util/MsSql/crontab +++ /dev/null @@ -1,3 +0,0 @@ -59 23 * * * bitwarden /backup-db.sh >> /var/log/cron.log 2>&1 - -# An empty line is required at the end of this file for a valid cron file. diff --git a/util/MsSql/entrypoint.sh b/util/MsSql/entrypoint.sh index f1557cf562..cf490c01b1 100644 --- a/util/MsSql/entrypoint.sh +++ b/util/MsSql/entrypoint.sh @@ -42,9 +42,6 @@ fi # The rest... -# ref: https://stackoverflow.com/a/38850273 -touch /var/log/cron.log /etc/crontab /etc/cron.*/* -chown $USERNAME:$GROUPNAME /var/log/cron.log mkdir -p /etc/bitwarden/mssql/backups chown -R $USERNAME:$GROUPNAME /etc/bitwarden mkdir -p /var/opt/mssql/data @@ -52,8 +49,10 @@ chown -R $USERNAME:$GROUPNAME /var/opt/mssql chown $USERNAME:$GROUPNAME /backup-db.sh chown $USERNAME:$GROUPNAME /backup-db.sql -# Sounds like gosu keeps env when switching, but of course cron does not -env > /etc/environment -cron +# Launch a loop to backup database on a daily basis +if [ "$BACKUP_DB" != "0" ] +then + gosu $USERNAME:$GROUPNAME /bin/sh -c "/backup-db.sh loop >/dev/null 2>&1 &" +fi exec gosu $USERNAME:$GROUPNAME /opt/mssql/bin/sqlservr