simple but safe postgresql 환경

나이트 개발자·2023년 3월 30일
0
post-thumbnail

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 재시작!

profile
개발하면서 또는 프러덕 관리하면서 겪는 기억해둬야하는 내용을 메모장 삼아 남긴다. Google Keep이나 메모 도구에 남기는 것과는 달리 잘 정리할 수 있어서 언젠가 들춰봐야할 내용들을 담은 글들이 게시된다.

0개의 댓글