Add Wal-E backup support
This commit is contained in:
		
							parent
							
								
									7d89531c4a
								
							
						
					
					
						commit
						ba31a0da79
					
				
							
								
								
									
										25
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								README.md
									
									
									
									
									
								
							| @ -55,6 +55,31 @@ Dockerfiles for Mattermost in production | |||||||
| 
 | 
 | ||||||
|     sudo rm -rf volumes |     sudo rm -rf volumes | ||||||
| 
 | 
 | ||||||
|  | ## Database Backup | ||||||
|  | 
 | ||||||
|  | When AWS S3 environment variables are specified on db docker container, it enables [Wel-E](https://github.com/wal-e/wal-e) backup to S3. | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | docker run -d --name mattermost-db \ | ||||||
|  |     -e AWS_ACCESS_KEY_ID=XXXX \ | ||||||
|  |     -e AWS_SECRET_ACCESS_KEY=XXXX \ | ||||||
|  |     -e WALE_S3_PREFIX=s3://BUCKET_NAME/PATH \ | ||||||
|  |     -e AWS_REGION=us-east-1 | ||||||
|  |     -v ./volumes/db/var/lib/postgresql/data:/var/lib/postgresql/data | ||||||
|  |     -v /etc/localtime:/etc/localtime:ro | ||||||
|  |     db | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | All four environment variables are required. It will enable completed WAL segments sent to archive storage (S3). The base backup and clean up can be done through the following command: | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | # base backup | ||||||
|  | docker exec mattermost-db su - postgres sh -c "/usr/bin/envdir /etc/wal-e.d/env /usr/local/bin/wal-e backup-push /var/lib/postgresql/data" | ||||||
|  | # keep the most recent 7 base backups and remove the old ones | ||||||
|  | docker exec mattermost-db su - postgres sh -c "/usr/bin/envdir /etc/wal-e.d/env /usr/local/bin/wal-e delete --confirm retain 7" | ||||||
|  | ``` | ||||||
|  | Those tasks can be executed through a cron job or systemd timer. | ||||||
|  | 
 | ||||||
| ## Known Issues | ## Known Issues | ||||||
| 
 | 
 | ||||||
| * Do not modify the Listen Address in Service Settings. | * Do not modify the Listen Address in Service Settings. | ||||||
|  | |||||||
| @ -1,3 +1,18 @@ | |||||||
| FROM postgres:9.4 | FROM postgres:9.4 | ||||||
| 
 | 
 | ||||||
|  | RUN apt-get update \ | ||||||
|  |     && apt-get install -y python-dev lzop pv daemontools curl build-essential \ | ||||||
|  |     && curl --silent --show-error --retry 5 https://bootstrap.pypa.io/get-pip.py | python \ | ||||||
|  |     && pip install wal-e \ | ||||||
|  |     && apt-get remove -y build-essential python-dev \ | ||||||
|  |     && apt-get autoremove -y \ | ||||||
|  |     && apt-get clean \ | ||||||
|  |     && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* | ||||||
|  | 
 | ||||||
| ADD make_db.sh /docker-entrypoint-initdb.d/ | ADD make_db.sh /docker-entrypoint-initdb.d/ | ||||||
|  | ADD setup-wale.sh /docker-entrypoint-initdb.d/ | ||||||
|  | COPY docker-entrypoint1.sh / | ||||||
|  | 
 | ||||||
|  | ENTRYPOINT ["/docker-entrypoint1.sh"] | ||||||
|  | 
 | ||||||
|  | CMD ["postgres"] | ||||||
|  | |||||||
							
								
								
									
										29
									
								
								db/docker-entrypoint1.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										29
									
								
								db/docker-entrypoint1.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | 
 | ||||||
|  | if [ "${1:0:1}" = '-'  ]; then | ||||||
|  |     set -- postgres "$@" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | if [ "$1" = 'postgres'  ]; then | ||||||
|  |     VARS=(AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY WALE_S3_PREFIX AWS_REGION) | ||||||
|  | 
 | ||||||
|  |     for v in ${VARS[@]}; do | ||||||
|  |         if [ "${!v}" = "" ]; then | ||||||
|  |             echo "$v is required for Wal-E but not set. Skipping Wal-E setup." | ||||||
|  |             . /docker-entrypoint.sh | ||||||
|  |             exit | ||||||
|  |         fi | ||||||
|  |     done | ||||||
|  | 
 | ||||||
|  |     umask u=rwx,g=rx,o= | ||||||
|  |     mkdir -p /etc/wal-e.d/env | ||||||
|  | 
 | ||||||
|  |     for v in ${VARS[@]}; do | ||||||
|  |         echo "${!v}" > /etc/wal-e.d/env/$v | ||||||
|  |     done | ||||||
|  |     chown -R root:postgres /etc/wal-e.d | ||||||
|  | 
 | ||||||
|  |     . /docker-entrypoint.sh | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | exec "$@" | ||||||
							
								
								
									
										11
									
								
								db/setup-wale.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								db/setup-wale.sh
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | 
 | ||||||
|  | # wal-e specific | ||||||
|  | echo "wal_level = archive" >> /var/lib/postgresql/data/postgresql.conf | ||||||
|  | echo "archive_mode = on" >> /var/lib/postgresql/data/postgresql.conf | ||||||
|  | echo "archive_command = 'envdir /etc/wal-e.d/env /usr/local/bin/wal-e wal-push %p'" >> /var/lib/postgresql/data/postgresql.conf | ||||||
|  | echo "archive_timeout = 60" >> /var/lib/postgresql/data/postgresql.conf | ||||||
|  | 
 | ||||||
|  | # no cron in the image, use systemd timer on host instead | ||||||
|  | #su - postgres -c "crontab -l | { cat; echo \"0 3 * * * /usr/bin/envdir /etc/wal-e.d/env /usr/local/bin/wal-e backup-push /var/lib/postgresql/data\"; } | crontab -" | ||||||
|  | #su - postgres -c "crontab -l | { cat; echo \"0 4 * * * /usr/bin/envdir /etc/wal-e.d/env /usr/local/bin/wal-e delete --confirm retain 7\"; } | crontab -" | ||||||
| @ -3,6 +3,12 @@ db: | |||||||
|   volumes: |   volumes: | ||||||
|     - ./volumes/db/var/lib/postgresql/data:/var/lib/postgresql/data |     - ./volumes/db/var/lib/postgresql/data:/var/lib/postgresql/data | ||||||
|     - /etc/localtime:/etc/localtime:ro |     - /etc/localtime:/etc/localtime:ro | ||||||
|  |   # uncomment the following to enable backup | ||||||
|  |   #environment: | ||||||
|  |   #  - AWS_ACCESS_KEY_ID=XXXX | ||||||
|  |   #  - AWS_SECRET_ACCESS_KEY=XXXX | ||||||
|  |   #  - WALE_S3_PREFIX=s3://BUCKET_NAME/PATH | ||||||
|  |   #  - AWS_REGION=us-east-1 | ||||||
| app: | app: | ||||||
|   build: app |   build: app | ||||||
|   links: |   links: | ||||||
|  | |||||||
| @ -3,6 +3,12 @@ db: | |||||||
|   volumes: |   volumes: | ||||||
|     - ./volumes/db/var/lib/postgresql/data:/var/lib/postgresql/data |     - ./volumes/db/var/lib/postgresql/data:/var/lib/postgresql/data | ||||||
|     - /etc/localtime:/etc/localtime:ro |     - /etc/localtime:/etc/localtime:ro | ||||||
|  |   # uncomment the following to enable backup | ||||||
|  |   #environment: | ||||||
|  |   #  - AWS_ACCESS_KEY_ID=XXXX | ||||||
|  |   #  - AWS_SECRET_ACCESS_KEY=XXXX | ||||||
|  |   #  - WALE_S3_PREFIX=s3://BUCKET_NAME/PATH | ||||||
|  |   #  - AWS_REGION=us-east-1 | ||||||
| app: | app: | ||||||
|   build: app |   build: app | ||||||
|   links: |   links: | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Pan Luo
						Pan Luo