···11+#!/usr/bin/env bash
22+33+44+### Creates a read only user.
55+###
66+### Usage:
77+### $ docker-compose -f <environment>.yml (exec |run --rm) postgres createreaduser
88+99+1010+set -o errexit
1111+set -o nounset
1212+1313+working_dir="$(dirname ${0})"
1414+source "${working_dir}/_sourced/constants.sh"
1515+source "${working_dir}/_sourced/messages.sh"
1616+1717+if [ -z "$POSTGRES_READ_ONLY_USER" ] || [ -z "$POSTGRES_READ_ONLY_PASSWORD" ] ; then
1818+ message_error "The environment variables POSTGRES_READ_ONLY_USER and POSTGRES_READ_ONLY_PASSWORD should be configured."
1919+ exit 1
2020+fi
2121+2222+export PGHOST="${POSTGRES_HOST}"
2323+export PGPORT="${POSTGRES_PORT}"
2424+export PGUSER="${POSTGRES_USER}"
2525+export PGPASSWORD="${POSTGRES_PASSWORD}"
2626+export PGDATABASE="${POSTGRES_DB}"
2727+2828+message_info "Creating read only user for '${POSTGRES_DB}' database..."
2929+3030+psql -tc "SELECT 1 FROM pg_catalog.pg_roles WHERE rolname = '${POSTGRES_READ_ONLY_USER}'" | grep -q 1 || psql -c "CREATE ROLE \"${POSTGRES_READ_ONLY_USER}\" WITH LOGIN PASSWORD '${POSTGRES_READ_ONLY_PASSWORD}' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION VALID UNTIL 'infinity';"
3131+3232+message_info "Grant permission to '${POSTGRES_READ_ONLY_USER}' user..."
3333+3434+psql -v ON_ERROR_STOP=1 <<-EOSQL
3535+ GRANT CONNECT ON DATABASE ${POSTGRES_DB} TO "${POSTGRES_READ_ONLY_USER}";
3636+ GRANT USAGE ON SCHEMA public TO "${POSTGRES_READ_ONLY_USER}";
3737+ GRANT SELECT ON ALL TABLES IN SCHEMA public TO "${POSTGRES_READ_ONLY_USER}";
3838+ GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO "${POSTGRES_READ_ONLY_USER}";
3939+EOSQL
4040+4141+message_success "The user '${POSTGRES_READ_ONLY_USER}' has been created with read-only permissions."
+55
maintenance/restore
···11+#!/usr/bin/env bash
22+33+44+### Restore database from a backup.
55+###
66+### Parameters:
77+### <1> filename of an existing backup.
88+###
99+### Usage:
1010+### $ docker-compose -f <environment>.yml (exec |run --rm) postgres restore <1>
1111+1212+1313+set -o errexit
1414+set -o pipefail
1515+set -o nounset
1616+1717+1818+working_dir="$(dirname ${0})"
1919+source "${working_dir}/_sourced/constants.sh"
2020+source "${working_dir}/_sourced/messages.sh"
2121+2222+2323+if [[ -z ${1+x} ]]; then
2424+ message_error "Backup filename is not specified yet it is a required parameter. Make sure you provide one and try again."
2525+ exit 1
2626+fi
2727+backup_filename="${BACKUP_DIR_PATH}/${1}"
2828+if [[ ! -f "${backup_filename}" ]]; then
2929+ message_error "No backup with the specified filename found. Check out the 'backups' maintenance script output to see if there is one and try again."
3030+ exit 1
3131+fi
3232+3333+message_welcome "Restoring the '${POSTGRES_DB}' database from the '${backup_filename}' backup..."
3434+3535+if [[ "${POSTGRES_USER}" == "postgres" ]]; then
3636+ message_error "Restoring as 'postgres' user is not supported. Assign 'POSTGRES_USER' env with another one and try again."
3737+ exit 1
3838+fi
3939+4040+export PGHOST="${POSTGRES_HOST}"
4141+export PGPORT="${POSTGRES_PORT}"
4242+export PGUSER="${POSTGRES_USER}"
4343+export PGPASSWORD="${POSTGRES_PASSWORD}"
4444+export PGDATABASE="${POSTGRES_DB}"
4545+4646+message_info "Dropping the database..."
4747+dropdb "${PGDATABASE}"
4848+4949+message_info "Creating a new database..."
5050+createdb --owner="${POSTGRES_USER}"
5151+5252+message_info "Applying the backup to the new database..."
5353+gunzip -c "${backup_filename}" | psql "${POSTGRES_DB}"
5454+5555+message_success "The '${POSTGRES_DB}' database has been restored from the '${backup_filename}' backup."