Skip to content

Redirect STDERR to logfile too. #23

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 37 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
c6cd4e5
Redirect STDERR to logfile too.
PatBriPerso Mar 1, 2022
2132ede
Add todos
PatBriPerso Mar 1, 2022
95865df
Add a todo
PatBriPerso Mar 1, 2022
d5b048f
Actions: adapt Docker login
PatBriPerso Mar 1, 2022
ba78311
Bugfix: add PROJECT_VERSION env var.
PatBriPerso Mar 1, 2022
624b6a6
bugfix: change Docker tags
PatBriPerso Mar 1, 2022
a16aba4
bugfix: change Docker tags again
PatBriPerso Mar 1, 2022
b08db04
bugfix: change Docker tags #3
PatBriPerso Mar 1, 2022
7395d47
bugfix: change Docker tags #4
PatBriPerso Mar 1, 2022
9042b6e
REmove github release and unused github workflows
PatBriPerso Mar 1, 2022
0cbbd5f
Change sed separator to support "*/3" cron expression
PatBriPerso Mar 1, 2022
40d1321
Change version to RC one
PatBriPerso Mar 1, 2022
755a770
Allow to set AWS credentials with /root/.aws/credentials file
PatBriPerso Mar 1, 2022
c6ad0f7
Update todo list
PatBriPerso Mar 1, 2022
803ef26
Typo
PatBriPerso Mar 1, 2022
2b36ff3
We can test with docker-compose
PatBriPerso Mar 1, 2022
7517296
Typo
PatBriPerso Mar 1, 2022
91d0354
add an environment variable to set the S3 path
PatBriPerso Mar 1, 2022
7f29bdd
add an environment variable to set the table dump filename
PatBriPerso Mar 1, 2022
3f87072
Change default value for S3_PATH_FORMAT
PatBriPerso Mar 1, 2022
5ae8b1b
Add env var example
PatBriPerso Mar 1, 2022
d129e50
Typo
PatBriPerso Mar 2, 2022
fbde5b8
add an environment variable to make a dump of the whole database
PatBriPerso Mar 2, 2022
8ad4071
Add todos
PatBriPerso Mar 2, 2022
aeb77cd
REname S3_PATH_FORMAT to S3_ROOT_PATH
PatBriPerso Mar 2, 2022
eb531c7
Rename S3_TABLE_FORMAT to S3_TABLE_FILENAME
PatBriPerso Mar 2, 2022
fafb17e
add an environment variable to set the database dump filename
PatBriPerso Mar 2, 2022
5a000f7
add an environment variable to set the database dump path
PatBriPerso Mar 2, 2022
6373d1e
add an environment variable to set the table dump path
PatBriPerso Mar 2, 2022
8331966
Change path and filename default values
PatBriPerso Mar 2, 2022
9a2e184
Update .env.example
PatBriPerso Mar 2, 2022
3a79bae
Change version to 2.7.0
PatBriPerso Mar 2, 2022
a96fb6a
Update README
PatBriPerso Mar 2, 2022
d13f242
add `--single-transaction` option to mysqldump
PatBriPerso Mar 2, 2022
3430679
add `--quick` option to mysqldump
PatBriPerso Mar 2, 2022
094952d
add `--force` options to mysqldump to dump views (and not stopping wh…
PatBriPerso Mar 2, 2022
9bd1da1
Remove AWS s3 copy double
PatBriPerso Mar 2, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# mysql
MYSQL_ROOT_PASSWORD=justfortesting

# phpmyadmin
PMA_HOST=mysql

# backup-s3
CRON_EXPR="* * * * *"
S3_ACCESS_KEY=your_access_key
S3_SECRET_KEY=your_secret_key
S3_BUCKET_NAME=your_bucket_name
S3_REGION=eu-west-3
S3_ROOT_PATH=@MYSQL_HOST_ALIAS/%Y%m/@databaseName
S3_DATABASE_PATH=%Y-%m-%d
S3_DATABASE_FILENAME=%Y-%m-%dT%H-%M-@databaseName
S3_TABLE_PATH=%Y-%m-%d/%H-%M-tables
S3_TABLE_FILENAME=%Y-%m-%dT%H-%M-@tableName
# Possible values: TABLES, DATABASE, ALL
S3_BACKUP_TYPE=ALL
MYSQL_HOST=mysql
MYSQL_HOST_ALIAS=mysql-local-test
MYSQL_BACKUP_USER=root
MYSQL_BACKUP_PASS=justfortesting
27 changes: 0 additions & 27 deletions .github/workflows/nightly.yml

This file was deleted.

38 changes: 10 additions & 28 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,33 +24,15 @@ jobs:
file-to-check: version.txt
only-return-version: true

- name: push-image
env:
PROJECT_VERSION: ${{ steps.get_project_version.outputs.version }}
run: |
docker login ${{ secrets.DOCKER_REGISTRY }} -u ${{ secrets.DOCKER_REGISTRY_USER }} -p ${{ secrets.DOCKER_REGISTRY_TOKEN }}
docker build -t ${{ secrets.DOCKER_REGISTRY }}/${GITHUB_REPOSITORY}:${PROJECT_VERSION} -t ${{ secrets.DOCKER_REGISTRY }}/${GITHUB_REPOSITORY}:latest .
docker push ${{ secrets.DOCKER_REGISTRY }}/${GITHUB_REPOSITORY}:${PROJECT_VERSION}
if [[ "$PROJECT_VERSION" != *"SNAPSHOT"* || "$PROJECT_VERSION" != *"RC"* ]]; then
docker push ${{ secrets.DOCKER_REGISTRY }}/${GITHUB_REPOSITORY}:latest
fi

- name: setup-github-release
id: setup_github_release
env:
PROJECT_VERSION: ${{ steps.get_project_version.outputs.version }}
run: |
echo ::set-output name=gitcommitmessage::$(git log --no-merges -1 --oneline)
if [[ "$PROJECT_VERSION" == *"SNAPSHOT"* || "$PROJECT_VERSION" == *"RC"* ]]; then
echo ::set-output name=isprerelease::true
fi
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_REGISTRY_USER }}
password: ${{ secrets.DOCKER_REGISTRY_TOKEN }}

- name: github-release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GPR_TOKEN }}
- name: Build and push
id: docker_build
uses: docker/build-push-action@v2
with:
tag_name: ${{ steps.get_project_version.outputs.version }}
release_name: ${{ steps.get_project_version.outputs.version }}
body: ${{ steps.setup_github_release.outputs.gitcommitmessage }}
prerelease: ${{ steps.setup_github_release.outputs.isprerelease }}
push: true
tags: computablefacts/mysql-s3-backup:${{ steps.get_project_version.outputs.version }},computablefacts/mysql-s3-backup:latest
53 changes: 0 additions & 53 deletions .github/workflows/review.yml

This file was deleted.

1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/.project
/.idea
/*.iml
.env
50 changes: 46 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,25 @@
# mysql-s3-backup
[![Build](https://github.com/avides/mysql-s3-backup/workflows/release/badge.svg)](https://github.com/avides/mysql-s3-backup/actions)
[![Nightly build](https://github.com/avides/mysql-s3-backup/workflows/nightly/badge.svg)](https://github.com/avides/mysql-s3-backup/actions)
[![Docker Pulls](https://img.shields.io/docker/pulls/avides/mysql-s3-backup.svg)](https://hub.docker.com/r/avides/mysql-s3-backup)
[![Build](https://github.com/computablefacts/mysql-s3-backup/workflows/release/badge.svg)](https://github.com/computablefacts/mysql-s3-backup/actions)
[![Docker Pulls](https://img.shields.io/docker/pulls/computablefacts/mysql-s3-backup.svg)](https://hub.docker.com/r/computablefacts/mysql-s3-backup)

This script is used to backup a MySQL Server, ZIP the data and upload it to Amazon S3. It will dump, zip and upload each table in a separate "sql.gz"-file. This script will be executed by a specified cron expression.

## TODOS

I fork this repo to:

- [x] add STDERR output to logfile
- [x] allow `/` in cron expression like in "*/15 * * * *"
- [x] allow to set AWS credential from a Docker secret (linked to /root/.aws/credentials)
- [x] add an environment variable to set the S3 path
- [x] add an environment variable to set the table dump filename
- [x] add an environment variable to make a dump of the whole database
- [x] add an environment variable to set the database dump filename
- [x] add an environment variable to set the database dump path
- [x] add an environment variable to set the table dump path
- [x] add `--single-transaction --quick` options to mysqldump
- [x] add `--force` options to mysqldump to dump views (and not stopping when something goes wrong)

## Requirements

- Docker
Expand All @@ -28,7 +43,7 @@ docker run \
--env MYSQL_BACKUP_USER="root" \
--env MYSQL_BACKUP_PASS="MYSQL_BACKUP_PASS" \
-p 9300:9300 \
avides/mysql-s3-backup:2.6.0
computablefacts/mysql-s3-backup:2.7.0
```

### Build & Test
Expand Down Expand Up @@ -59,6 +74,33 @@ docker logs -f mysql-s3-backup
docker exec -it mysql-s3-backup /bin/bash
```

### Build & Test with Docker compose

Make an `.env` file from `.env.example`:

```bash
cp .env.example .env
```

Change your AWS settings:
```
S3_ACCESS_KEY=your_access_key
S3_SECRET_KEY=your_secret_key
S3_BUCKET_NAME=your_bucket_name
S3_REGION=eu-west-3
```

Start the containers:
```bash
docker-compose up
```

This will start a MySQL server, a phpMyAdmin and the mysql-s3-backup containers.
You can use phpMyAdmin, found at http://localhost:8099/, to create some databases and tables.
Then you could see the backups done on your S3 bucket.

Happy testing!

## Metrics

This container delivers some metrics about the MySQL backups. The metrics are available to the HTTP endpoint "/metrics" on port 9300. Following metrics are collected:
Expand Down
39 changes: 33 additions & 6 deletions backup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,17 @@ source functions.sh

## Check if variables are given
if [ -z ${S3_ACCESS_KEY+x} ]; then
echo "ERROR: Please set the S3_ACCESS_KEY!"
exit 1
echo "WARNING: Please set the S3_ACCESS_KEY or create /root/.aws/credentials file!"
else
## Set S3 environment variables
export AWS_ACCESS_KEY_ID=$S3_ACCESS_KEY
fi

if [ -z ${S3_SECRET_KEY+x} ]; then
echo "ERROR: Please set the S3_SECRET_KEY!"
exit 1
echo "WARNING: Please set the S3_SECRET_KEY or create /root/.aws/credentials file!"
else
## Set S3 environment variables
export AWS_SECRET_ACCESS_KEY=$S3_SECRET_KEY
fi

if [ -z ${S3_REGION+x} ]; then
Expand All @@ -24,6 +28,31 @@ if [ -z ${S3_BUCKET_NAME+x} ]; then
exit 1
fi

if [ -z ${S3_ROOT_PATH+x} ]; then
echo "Use default S3_ROOT_PATH..."
export S3_ROOT_PATH=@MYSQL_HOST_ALIAS/@databaseName
fi

if [ -z ${S3_DATABASE_PATH+x} ]; then
echo "Use default S3_DATABASE_PATH..."
export S3_DATABASE_PATH=/
fi

if [ -z ${S3_DATABASE_FILENAME+x} ]; then
echo "Use default S3_DATABASE_FILENAME..."
export S3_DATABASE_FILENAME=%Y-%m-%d-%H-%M-@databaseName
fi

if [ -z ${S3_TABLE_PATH+x} ]; then
echo "Use default S3_TABLE_PATH..."
export S3_TABLE_PATH=%Y-%m-%d-%H-%M-tables
fi

if [ -z ${S3_TABLE_FILENAME+x} ]; then
echo "Use default S3_TABLE_FILENAME..."
export S3_TABLE_FILENAME=@tableName
fi

if [ -z ${MYSQL_HOST_ALIAS+x} ]; then
echo "Use default MySQL host alias: $MYSQL_HOST"
MYSQL_HOST_ALIAS=$MYSQL_HOST
Expand Down Expand Up @@ -54,8 +83,6 @@ BACKUP_PATH="/root/backups"
BUCKET_NAME=${S3_BUCKET_NAME}

## Set S3 environment variables
export AWS_ACCESS_KEY_ID=$S3_ACCESS_KEY
export AWS_SECRET_ACCESS_KEY=$S3_SECRET_KEY
export AWS_DEFAULT_REGION=$S3_REGION

## MySQL-Servers
Expand Down
2 changes: 1 addition & 1 deletion crontab
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
CRON_EXPR root . /root/project_env.sh; /root/backup.sh >> /var/log/backup-cron/cron.log
CRON_EXPR root . /root/project_env.sh; /root/backup.sh >> /var/log/backup-cron/cron.log 2>&1
# An empty line is required at the end of this file for a valid cron file.
23 changes: 23 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
version: '3.7'

services:
mysql:
image: mysql:8.0
env_file:
- .env

phpmyadmin:
depends_on:
- mysql
image: phpmyadmin
env_file:
- .env
ports:
- "8099:80"

backup-s3:
depends_on:
- mysql
build: .
env_file:
- .env
4 changes: 2 additions & 2 deletions entrypoint.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## Setup
printenv | grep -E 'PATH|S3_BUCKET_NAME|S3_ACCESS_KEY|S3_SECRET_KEY|S3_REGION|MYSQL_HOST|MYSQL_PORT|MYSQL_BACKUP_USER|MYSQL_BACKUP_PASS' | sed 's/^\(.*\)$/export \1"/g' | sed '/=/s//="/' > /root/project_env.sh
sed -i -e "s/CRON_EXPR/${CRON_EXPR}/g" /etc/cron.d/backup-cron
printenv | grep -E 'PATH|S3_|MYSQL_' | sed 's/^\(.*\)$/export \1"/g' | sed '/=/s//="/' > /root/project_env.sh
sed -i -e "s#CRON_EXPR#${CRON_EXPR}#g" /etc/cron.d/backup-cron

## Start metrics endpoint
mkdir /var/log/webserver
Expand Down
Loading