postgresql만 해당되는 이야기는 아니지만 사용하는 RDBMS가 이 아이이다보니 함께 기록한다.
아이디어는 간단하다 postgres만 docker로 띄워서 사용하기에는 데이터 백업없이 운영하다가 날벼락을 맞을 것 같다. 그래서 운영할 때 도움이 되도록 pgadmin과 백업을 자동화 해주는 오픈소스 이미지를 함께 docker compose에 담아내는 것이다.
아직 현업의 업무 자동화에 돌입하지 않아 일단은 루즈하게 백업을 하는 옵션으로 구성해보았다.
version: '3.7'
# refer to : https://github.com/prodrigestivill/docker-postgres-backup-local
services:
db:
image: postgres
restart: always
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- ./db-data:/var/lib/postgresql/data
ports:
- ${HOST_PG_PORT}:5432
pgadmin:
image: dpage/pgadmin4
restart: always
environment:
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
ports:
- ${HOST_PGA_PORT}:80
backup:
image: prodrigestivill/postgres-backup-local
restart: always
# user: postgres:postgres # Optional: see below
volumes:
- ${HOST_BAK_PATH}:/backups
links:
- db
depends_on:
- db
environment:
POSTGRES_HOST: db
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
# POSTGRES_PASSWORD_FILE=/run/secrets/db_password <-- alternative for POSTGRES_PASSWORD (to use with docker secrets)
POSTGRES_EXTRA_OPTS: "-Z6 --schema=public --blobs"
SCHEDULE: "@daily"
BACKUP_KEEP_DAYS: 7
BACKUP_KEEP_WEEKS: 4
BACKUP_KEEP_MONTHS: 6
HEALTHCHECK_PORT: 8080
# incremental-backup:
# image: postgres:latest
# depends_on:
# - db
# volumes:
# - ${HOST_BAK_PATH}:/backups
# environment:
# PGPASSWORD: ${POSTGRES_PASSWORD}
# command: bash -c 'while true; do pg_dump -U ${POSTGRES_USER} -h db -F c -b -v -f /backups/$(date +"%Y-%m-%d_%H-%M-%S").backup --incremental ${POSTGRES_DB}; sleep 3600; done'
volumes:
db-data:
이렇게 구성하면 백업 주기 중간에 날아간 데이터는 복구하기 어려우니 궁극적으로는 Barman 같은 도구를 활용해서 실시간 백업을 하고 항상 양쪽의 머신이 동일한 데이터로 유지되도록 구성하는 것이 바람직해 보인다.
각 변수는 .env 파일로 정의해서 아래와 같은 항목들에 값을 set한다.
POSTGRES_USER: admin
POSTGRES_PASSWORD: password
PASSWORD: password
POSTGRES_DB: testdb
PGADMIN_DEFAULT_EMAIL: a@b.c
PGADMIN_DEFAULT_PASSWORD: password
HOST_BAK_PATH: /home/safedb/backups
HOST_PG_PORT: 35432
HOST_PGA_PORT: 38080
volume은 작업자가 언제든 접근할 수 있도록 권한 변경필요하다.
sudo chown -R $USER:$USER ${HOST_BAK_PATH}
sudo chmod -R 755 ${HOST_BAK_PATH}
이후 docker 재시작!