Daily backup of production staging using a Docker container for Heroku maintenance that can be deployed to Heroku
Tags: heroku, docker, backup
Published: 2020-05-28 05:21:50

---
title: Daily backup of production staging using a Docker container for Heroku maintenance that can be deployed to Heroku
published: true
description: 
tags: Heroku, docker, backup 
---

[Heroku Advent Calendar 2016](http://qiita.com/advent-calendar/2016/heroku) Day 6 article. I've been writing Heroku's Advent Calendar for about three years in a row, no matter what.


# Introduction.

I was inspired by this article by Crowdworks.

[Things to do when running a production service in Heroku & configuration examples](http://engineer.crowdworks.jp/entry/2016/09/05/154304)

I created a Docker container that can execute the following shell commands, which I did in the above article [Adding a preview environment that can synchronize data with production](http://engineer.crowdworks.jp/entry/2016/09/05/154304#DBのバックアップ設定をしておく).

* Copy Heroku Postgres from the Production environment to the Staging environment
* Mask personal information from the copied DB
* Synchronize the Puroduction environment bucket in AWS S3 to the Staging environment bucket

I'm deploying this Docker container to Heroku.

As you can see, Heroku has a mechanism to deploy Docker containers, which is not well known, but it is actually made before you know it.
https://devcenter.heroku.com/articles/container-registry-and-runtime

In order to run the backup command in heroku or the CLI in AWS, as in this case
Rather than making an existing build pack (or rather, a build pack that could do something about it, but I haven't looked it up)
I think it's more convenient to create Docker container because it's easier to check the operation on the development machine.

In the case of Docker container, if you can deploy Docker container other than Heroku, you can build it in any cloud environment, even in a suitable internal server, I think it is a good point.


## Remote Repository

### Github.
https://github.com/konyu/heroku-aws-backup

#### Docker hub
https://hub.docker.com/r/konyu/heroku-aws-backup/


## How to get an API key for AWS and Heroku
Obtain the AWS and Heroku API keys in advance and make a note of them

The URLs for each method are as follows

### AWS access key and secret key
http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html

### Heroku api token
https://devcenter.heroku.com/articles/authentication#api-token-storage

## How to build in the local environment

```sh
git@github.com:konyu/heroku-aws-backup.git
cd heroku-aws-backup
docker build --rm -t heroku-aws-backup .
```

## Local startup method
Start with AWS and Heroku environment variables in --env

```sh
docker run -it --rm --env AWS_ACCESS_KEY_ID=xxxxxxx\fnDroid
--env AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
--env AWS_DEFAULT_REGION=ap-northeast-1
--env HEROKU_API_KEY=xxxxxxxxxxxxxxxxxxxxx
heroku-aws-backup bash
```

## Backup shell file modifications

If you're using a cloned Github repository as I write here, you can use

There is a sample file for backup in sh/backup.sh, so you can rewrite it to suit your environment.

It would be good to make sh/backup.sh and rewrite the shell file appropriately when you write it in the From of Dockerfile and use it.

https://github.com/konyu/heroku-aws-backup/blob/master/sh/backup.sh.

```
# sample backup shell
# echo "start daily buckup!!!"

# echo "== stopping worker =="
# heroku ps:scale worker=0 -a APP_BE_BAKED_UP

# echo "== copying database to preview from production =="
# heroku pg:copy ORIGINAL_DB_NAME DB_TO_BE_COPIED --confirm APP_BE_BAKED_UP -a APP_BE_BAKED_UP

# echo "== clearing jobs =="
# heroku run rake jobs:clear -a APP_BE_BAKED_UP

# echo "== copying s3 bucket to staging from production =="
# aws s3 sync --delete --acl public-read s3://ORIGINAL_BUCKET s3://BUCKET_TO_BE_COPIED

# echo "== starting worker =="
# heroku ps:scale worker=1 -a APP_BE_BAKED_UP
```


# Running in Heroku

### Install the Heroku cli.
If you don't have Heroku's CLI command installed, you should be able to use the OS in the following URL

https://devcenter.heroku.com/articles/heroku-command-line

### Add Heroku container registry

```
heroku plugins:install heroku-container-registry
```

## Deploy to Heroku

Move to this repository directory

### Log in to Heroku

```
heroku login
> enter your id and password
```

### Create application(in the case of a new one)

```
heroku create APP_NAME_YOU_WANT
```

### Modify application (in case of modification)

Added git remote to be able to deploy to heroku

```
heroku git:remote -a APP_NAME_YOU_WANT
```

### Deploying to Heroku

```
heroku container:push web
```

## Setting environment variables

```
Setting environment variables
heroku config:set AWS_ACCESS_KEY_ID=xxxxxxx AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxx AWS_DEFAULT_REGION=ap-northeast-1 HEROKU_API_KEY=xxxxx -app APP_NAME_YOU_WANT
```

# Adding a Scheduler

```
heroku addons:create scheduler:standard -app APP_NAME_YOU_WANT
```

# Add a shell to the Scheduler to run
The shell to run should be written with the full path.

Note that it doesn't work well if you write the path relative to your home directory when you start with `heroku run bash -a APP_NAME`.

![2016-11-18 11 39 35](https://cloud.githubusercontent.com/assets/1217706/20417217/33c8071c-ad87-11e6-9da7-0b755a21ea1b.png)