hapostgres / pg_auto_failover

Postgres extension and service for automated failover and high-availability
Other
1.07k stars 112 forks source link

Docker Swarm - XDG_CONFIG_HOME and XDG_DATA_HOME needs to be persistent? #981

Closed dantio closed 1 year ago

dantio commented 1 year ago

Hey, thank you for this awesome project.

I'm trying to deploy pg_auto_failover in docker swarm. Everything looks good so far.

My Question is about XDG_CONFIG_HOME and XDG_DATA_HOME. Do they need to be persistent? It looks like, only if the folder is persistent, pg_auto_failover can bring back postgres back. Can I change the folder to PGDATA?

Also, what is the purpose of /var/backup Folder? I had to give it the right permission, without pg_auto_failover did not start. Should this folder also be persisten?

Thank you in advance


version: "3.9"
services:
  monitor:
    image: dantio/citus_auto_failover:2.4.6
    hostname: monitor
    volumes:
      - "monitor:/var/pgdata"
      - "autoctl_home:/var/docker/.local"
      - "autoctl_config:/var/docker/.config"
    command: |
      pg_autoctl create monitor --ssl-self-signed --auth trust --run --hostname monitor
    deploy:
      mode: global
      placement:
        constraints: [ node.labels.PG_Monitor == true ]

  primary:
    image: dantio/citus_auto_failover:2.4.6
    hostname: primary
    environment:
      PGUSER: citus
      PGDATABASE: citus
      PG_AUTOCTL_HBA_LAN: "true"
      PG_AUTOCTL_AUTH_METHOD: "trust"
      PG_AUTOCTL_SSL_SELF_SIGNED: "true"
      PG_AUTOCTL_MONITOR: "postgresql://autoctl_node@monitor/pg_auto_failover"
    volumes:
      - "/mnt/pgdata/data:/var/pgdata"
      - "autoctl_home:/var/docker/.local"
      - "autoctl_config:/var/docker/.config"
    command: |
      pg_autoctl create coordinator --name coord0a --run --hostname primary
    ports:
      - "5432"
    deploy:
      mode: global
      placement:
        constraints: [ node.labels.PG_Primary == true ]
volumes:
  monitor:
  autoctl_home:
  autoctl_config:

Dockerfile

FROM debian:bullseye-slim

ARG PGVERSION=15
ARG CITUS=postgresql-15-citus-11.2

# explicitly set user/group IDs
RUN set -eux;
RUN groupadd -r postgres --gid=999
RUN useradd -r -g postgres --uid=999 --home-dir=/var/lib/postgresql --shell=/bin/bash postgres
RUN mkdir -p /var/lib/postgresql && chown -R postgres:postgres /var/lib/postgresql

RUN apt-get update \
  && apt-get install -y --no-install-recommends \
     ca-certificates \
     gnupg \
     curl \
     sudo \
     postgresql-common \
  && rm -rf /var/lib/apt/lists/*

# make the "en_US.UTF-8" locale so postgres will be utf-8 enabled by default
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
  && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
ENV LANG en_US.utf8

# we use apt.postgresql.org
RUN curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
RUN echo "deb http://apt.postgresql.org/pub/repos/apt bullseye-pgdg main ${PGVERSION}" > /etc/apt/sources.list.d/pgdg.list
RUN echo "deb-src http://apt.postgresql.org/pub/repos/apt bullseye-pgdg main ${PGVERSION}" > /etc/apt/sources.list.d/pgdg.src.list

# bypass initdb of a "main" cluster
RUN echo 'create_main_cluster = false' | sudo tee -a /etc/postgresql-common/createcluster.conf

# Setup Citus
RUN curl https://install.citusdata.com/community/deb.sh | sudo bash

RUN apt-get update \
  && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
    ${CITUS} \
    postgresql-${PGVERSION}-cron \
    pg-auto-failover-cli \
    postgresql-${PGVERSION}-auto-failover \
  && rm -rf /var/lib/apt/lists/*

RUN adduser --disabled-password --gecos '' docker --home /var/docker
RUN adduser docker sudo
RUN adduser docker postgres
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

ENV PGDATA /var/pgdata
RUN mkdir -p "$PGDATA" && chown -R docker:postgres "$PGDATA"
RUN mkdir -p /var/backup && chown -R docker:postgres /var/backup
RUN mkdir -p /var/docker/.local && chown -R docker: /var/docker/.local # pg_autoctl home
RUN mkdir -p /var/docker/.config && chown -R docker: /var/docker/.config # pg_autoctl config

VOLUME /var/pgdata
VOLUME /var/docker/.local
VOLUME /var/docker/.config

USER docker

ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/postgresql/${PGVERSION}/bin
ENV PG_AUTOCTL_DEBUG 1

STOPSIGNAL SIGINT
EXPOSE 5432
s4ke commented 1 year ago

Afaik the home directory of the user things are running under needs to be persistent.

I see you are using Docker Swarm to spin up the cluster. We have built out some tooling for setting up pgaf on Swarm over at https://github.com/neuroforgede/pg_auto_failover_swarm . Maybe it will help :).

dantio commented 1 year ago

Thank you. With persistent XDG_CONFIG_HOME and XDG_DATA_HOME my docker swarm setup works fine.