Skip to content

Commit e97dc2c

Browse files
authored
Merge pull request #2 from ditkrg/add-mssql
add mssql
2 parents 7a5b76c + f6792ed commit e97dc2c

File tree

7 files changed

+111
-77
lines changed

7 files changed

+111
-77
lines changed

Dockerfile

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,40 @@ RUN curl -O https://download.microsoft.com/download/b/9/f/b9f3cce4-3925-46d4-9f4
2121
apk add --allow-untrusted mssql-tools18_18.1.1.1-1_amd64.apk && \
2222
rm msodbcsql18_18.1.1.1-1_amd64.apk mssql-tools18_18.1.1.1-1_amd64.apk
2323

24+
# Install go-cron for scheduled backups
25+
# Source: https://github.com/ivoronin/go-cron
26+
ARG TARGETARCH
27+
RUN curl -L https://github.com/ivoronin/go-cron/releases/download/v0.0.5/go-cron_0.0.5_linux_${TARGETARCH}.tar.gz -O && \
28+
tar xvf go-cron_0.0.5_linux_${TARGETARCH}.tar.gz && \
29+
rm go-cron_0.0.5_linux_${TARGETARCH}.tar.gz && \
30+
mv go-cron /usr/local/bin/go-cron && \
31+
chmod +x /usr/local/bin/go-cron
32+
2433
RUN rm -rf /var/cache/apk/*
2534

2635
ENV PATH="${PATH}:/opt/mssql-tools18/bin"
2736

28-
ENV DATABASE_NAME ''
29-
ENV DATABASE_HOST ''
30-
ENV DATABASE_PORT ''
31-
ENV DATABASE_USER ''
32-
ENV DATABASE_SERVER ''
33-
ENV DATABASE_PASSWORD ''
34-
ENV PGDUMP_EXTRA_OPTS ''
35-
ENV MARIADB_DUMP_EXTRA_OPTS ''
36-
ENV MARIADB_EXTRA_OPTS ''
37-
ENV MSSQL_EXTRA_OPTS ''
38-
ENV MSSQL_DATA_DIR '/var/opt/mssql/data'
39-
ENV S3_ACCESS_KEY_ID ''
40-
ENV S3_SECRET_ACCESS_KEY ''
41-
ENV S3_BUCKET ''
42-
ENV S3_REGION 'us-west-1'
43-
ENV S3_PATH 'backup'
44-
ENV S3_ENDPOINT ''
45-
ENV S3_S3V4 'no'
46-
ENV SCHEDULE ''
47-
ENV PASSPHRASE ''
48-
ENV BACKUP_KEEP_DAYS ''
37+
ENV DATABASE_NAME=''
38+
ENV DATABASE_HOST=''
39+
ENV DATABASE_PORT=''
40+
ENV DATABASE_USER=''
41+
ENV DATABASE_SERVER=''
42+
ENV DATABASE_PASSWORD=''
43+
ENV PGDUMP_EXTRA_OPTS=''
44+
ENV MARIADB_DUMP_EXTRA_OPTS=''
45+
ENV MARIADB_EXTRA_OPTS=''
46+
ENV MSSQL_EXTRA_OPTS=''
47+
ENV MSSQL_DATA_DIR='/var/opt/mssql/data'
48+
ENV S3_ACCESS_KEY_ID=''
49+
ENV S3_SECRET_ACCESS_KEY=''
50+
ENV S3_BUCKET=''
51+
ENV S3_REGION='us-west-1'
52+
ENV S3_PATH='backup'
53+
ENV S3_ENDPOINT=''
54+
ENV S3_S3V4='no'
55+
ENV SCHEDULE=''
56+
ENV PASSPHRASE=''
57+
ENV BACKUP_KEEP_DAYS=''
4958

5059
ADD src/run.sh run.sh
5160
ADD src/env.sh env.sh

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ services:
2828
S3_BUCKET: my-bucket
2929
S3_PREFIX: backup
3030
DATABASE_HOST: postgres
31+
# Back up a single database
3132
DATABASE_NAME: dbname
33+
# Or back up multiple databases (comma or space separated)
34+
# DATABASE_NAMES: "db_one,db_two"
3235
DATABASE_USER: user
3336
DATABASE_PASSWORD: password
3437
DATABASE_SERVER: postgres # postgres, mariadb, or mssql
@@ -63,7 +66,7 @@ services:
6366
S3_PREFIX: mssql-backup
6467
DATABASE_HOST: mssql
6568
DATABASE_PORT: 1433
66-
DATABASE_NAME: MyDatabase
69+
DATABASE_NAME: MyDatabase # or set DATABASE_NAMES for multiple databases
6770
DATABASE_USER: sa
6871
DATABASE_PASSWORD: YourStrong@Passw0rd
6972
DATABASE_SERVER: mssql
@@ -76,6 +79,7 @@ volumes:
7679
See [`docker-compose.yaml`](./docker-compose.yaml) for a complete working example.
7780

7881
- Images are tagged by the major PostgreSQL version supported: `11`, `12`, `13`, `14`, or `15`.
82+
- To back up multiple databases in a single run, set `DATABASE_NAMES` to a comma- or space-separated list. `DATABASE_NAME` remains available for single database backups.
7983
- The `SCHEDULE` variable determines backup frequency. See go-cron schedules documentation [here](http://godoc.org/github.com/robfig/cron#hdr-Predefined_schedules). Omit to run the backup immediately and then exit.
8084
- If `PASSPHRASE` is provided, the backup will be encrypted using GPG.
8185
- Run `docker exec <container name> sh backup.sh` to trigger a backup ad-hoc.

docker-compose.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ services:
104104
S3_PREFIX: mssql-backups
105105
DATABASE_HOST: mssql
106106
DATABASE_NAME: TestDB
107+
# DATABASE_NAMES: "TestDB,AnotherDatabase" # Optional: back up multiple databases
107108
DATABASE_USER: sa
108109
DATABASE_PORT: 1433
109110
DATABASE_SERVER: mssql

src/backup.sh

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,37 +6,41 @@ set -o pipefail
66
source ./env.sh
77
source ./helpers.sh
88

9-
echo "Creating backup of $DATABASE_NAME database..."
10-
backup
11-
12-
timestamp=$(date +"%Y-%m-%dT%H:%M:%S")
13-
14-
# MSSQL uses .bak extension, other databases use .dump
15-
if [ "$DATABASE_SERVER" = "mssql" ]; then
16-
local_file="${MSSQL_DATA_DIR}/db.bak"
17-
s3_uri_base="s3://${S3_BUCKET}/${S3_PREFIX}/${DATABASE_NAME}_${timestamp}.bak"
18-
else
19-
local_file="db.dump"
20-
s3_uri_base="s3://${S3_BUCKET}/${S3_PREFIX}/${DATABASE_NAME}_${timestamp}.dump"
21-
fi
22-
23-
if [ -n "$PASSPHRASE" ]; then
24-
echo "Encrypting backup..."
25-
gpg --symmetric --batch --passphrase "$PASSPHRASE" "$local_file"
9+
for CURRENT_DATABASE in $DATABASE_NAMES_LIST; do
10+
DATABASE_NAME="$CURRENT_DATABASE"
11+
12+
echo "Creating backup of $DATABASE_NAME database..."
13+
backup
14+
15+
timestamp=$(date +"%Y-%m-%dT%H:%M:%S")
16+
17+
# MSSQL uses .bak extension, other databases use .dump
18+
if [ "$DATABASE_SERVER" = "mssql" ]; then
19+
local_file="${MSSQL_DATA_DIR}/db.bak"
20+
s3_uri_base="s3://${S3_BUCKET}/${S3_PREFIX}/${DATABASE_NAME}_${timestamp}.bak"
21+
else
22+
local_file="db.dump"
23+
s3_uri_base="s3://${S3_BUCKET}/${S3_PREFIX}/${DATABASE_NAME}_${timestamp}.dump"
24+
fi
25+
26+
if [ -n "${PASSPHRASE:-}" ]; then
27+
echo "Encrypting backup..."
28+
gpg --symmetric --batch --passphrase "$PASSPHRASE" "$local_file"
29+
rm "$local_file"
30+
local_file="${local_file}.gpg"
31+
s3_uri="${s3_uri_base}.gpg"
32+
else
33+
s3_uri="$s3_uri_base"
34+
fi
35+
36+
echo "Uploading backup of $DATABASE_NAME to $S3_BUCKET..."
37+
aws $aws_args s3 cp "$local_file" "$s3_uri"
2638
rm "$local_file"
27-
local_file="${local_file}.gpg"
28-
s3_uri="${s3_uri_base}.gpg"
29-
else
30-
s3_uri="$s3_uri_base"
31-
fi
32-
33-
echo "Uploading backup to $S3_BUCKET..."
34-
aws $aws_args s3 cp "$local_file" "$s3_uri"
35-
rm "$local_file"
39+
done
3640

3741
echo "Backup complete."
3842

39-
if [ -n "$BACKUP_KEEP_DAYS" ]; then
43+
if [ -n "${BACKUP_KEEP_DAYS:-}" ]; then
4044
sec=$((86400*BACKUP_KEEP_DAYS))
4145
date_from_remove=$(date -d "@$(($(date +%s) - sec))" +%Y-%m-%d)
4246
backups_query="Contents[?LastModified<='${date_from_remove} 00:00:00'].{Key: Key}"

src/env.sh

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,78 @@
1-
if [ -z "$S3_BUCKET" ]; then
1+
if [ -z "${S3_BUCKET:-}" ]; then
22
echo "You need to set the S3_BUCKET environment variable."
33
exit 1
44
fi
55

6-
if [ -z "$DATABASE_SERVER" ]; then
6+
if [ -z "${DATABASE_SERVER:-}" ]; then
77
echo "You need to set the DATABASE_SERVER environment variable. (postgres, mariadb, mssql)"
88
exit 1
99
fi
1010

11-
if [ -z "$DATABASE_NAME" ]; then
12-
echo "You need to set the DATABASE_NAME environment variable."
13-
exit 1
11+
database_names_env="${DATABASE_NAMES:-}"
12+
database_name_env="${DATABASE_NAME:-}"
13+
14+
if [ -n "$database_names_env" ]; then
15+
sanitized_names=$(printf "%s" "$database_names_env" | tr ',' ' ')
16+
DATABASE_NAMES_LIST=$(printf "%s" "$sanitized_names" | awk '{$1=$1; print}')
17+
else
18+
DATABASE_NAMES_LIST=""
19+
fi
20+
21+
if [ -n "$database_name_env" ]; then
22+
if [ -z "$DATABASE_NAMES_LIST" ]; then
23+
DATABASE_NAMES_LIST="$database_name_env"
24+
fi
25+
else
26+
if [ -z "$DATABASE_NAMES_LIST" ]; then
27+
echo "You need to set the DATABASE_NAME or DATABASE_NAMES environment variable."
28+
exit 1
29+
fi
1430
fi
1531

16-
if [ -z "$DATABASE_HOST" ]; then
32+
if [ -z "$database_name_env" ]; then
33+
for first_database in $DATABASE_NAMES_LIST; do
34+
DATABASE_NAME="$first_database"
35+
break
36+
done
37+
else
38+
DATABASE_NAME="$database_name_env"
39+
fi
40+
41+
export DATABASE_NAMES_LIST
42+
export DATABASE_NAME
43+
44+
if [ -z "${DATABASE_HOST:-}" ]; then
1745
echo "You need to set the DATABASE_HOST environment variable."
1846
exit 1
1947
fi
2048

21-
if [ -z "$DATABASE_PORT" ]; then
49+
if [ -z "${DATABASE_PORT:-}" ]; then
2250
echo "You need to set the DATABASE_PORT environment variable."
2351
exit 1
2452
fi
2553

26-
if [ -z "$DATABASE_USER" ]; then
54+
if [ -z "${DATABASE_USER:-}" ]; then
2755
echo "You need to set the DATABASE_USER environment variable."
2856
exit 1
2957
fi
3058

31-
if [ -z "$DATABASE_PASSWORD" ]; then
59+
if [ -z "${DATABASE_PASSWORD:-}" ]; then
3260
echo "You need to set the DATABASE_PASSWORD environment variable."
3361
exit 1
3462
fi
3563

36-
if [ -z "$S3_ENDPOINT" ]; then
64+
if [ -z "${S3_ENDPOINT:-}" ]; then
3765
echo "No S3_ENDPOINT set, using default aws region."
3866
aws_args=""
3967
else
4068
aws_args="--endpoint-url $S3_ENDPOINT"
4169
fi
4270

4371

44-
if [ -n "$S3_ACCESS_KEY_ID" ]; then
72+
if [ -n "${S3_ACCESS_KEY_ID:-}" ]; then
4573
export AWS_ACCESS_KEY_ID=$S3_ACCESS_KEY_ID
4674
fi
47-
if [ -n "$S3_SECRET_ACCESS_KEY" ]; then
75+
if [ -n "${S3_SECRET_ACCESS_KEY:-}" ]; then
4876
export AWS_SECRET_ACCESS_KEY=$S3_SECRET_ACCESS_KEY
4977
fi
5078

src/run.sh

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,10 @@ fi
1111
if [ -z "$SCHEDULE" ]; then
1212
sh backup.sh
1313
else
14-
# For non-root users, use a writable directory for crontabs
15-
# busybox crond supports -c option to specify crontab directory
16-
CRON_USER=$(id -u)
17-
CRON_DIR="${HOME}/crontabs"
18-
19-
# Create crontab directory
20-
mkdir -p "$CRON_DIR"
21-
22-
# Write crontab entry
23-
echo "$SCHEDULE /bin/sh $(pwd)/backup.sh" > "$CRON_DIR/$CRON_USER"
24-
chmod 600 "$CRON_DIR/$CRON_USER"
25-
2614
echo "Backup schedule configured: $SCHEDULE"
27-
echo "Crontab file: $CRON_DIR/$CRON_USER"
28-
echo "Starting crond..."
15+
echo "Starting go-cron..."
2916

30-
# Start crond in foreground mode with custom crontab directory
31-
exec crond -f -d 8 -c "$CRON_DIR"
17+
# Use go-cron to run backup.sh on the specified schedule
18+
# go-cron takes schedule and command as arguments
19+
exec go-cron "$SCHEDULE" /bin/sh "$(pwd)/backup.sh"
3220
fi

umb_pm_dev.bacpac

5.01 MB
Binary file not shown.

0 commit comments

Comments
 (0)