Merge pull request #289 from NyakudyaA/develop

Further improvements
pull/291/head
Rizky Maulana Nugraha 2021-01-29 18:35:14 +07:00 zatwierdzone przez GitHub
commit c8f7978644
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
37 zmienionych plików z 1185 dodań i 200 usunięć

18
.example.env 100644
Wyświetl plik

@ -0,0 +1,18 @@
## Example environment file for docker-compose and builders
COMPOSE_PROJECT_NAME=postgis
## For build arguments
DISTRO=debian
IMAGE_VERSION=bullseye
IMAGE_VARIANT=slim
# Set GENERATE_ALL_LOCALE to empty value or 0 to build just default LOCALE: en_US.UTF-8
GENERATE_ALL_LOCALE=1
# Set the language if you need to specify LANG locale at build time
LANG=en_US.UTF-8
# locale filter to include in the locale generator
LANGS="en_US.UTF-8,id_ID.UTF-8"
POSTGRES_MAJOR_VERSION=13
POSTGIS_MAJOR_VERSION=3
POSTGIS_MINOR_RELEASE=1

Wyświetl plik

@ -0,0 +1,197 @@
name: build-latest
on:
# workflow_dispatch:
# inputs:
# distro:
# description: Base image distro
# required: true
# default: debian
# imageVersion:
# description: Base distro image version/release
# required: true
# default: bullseye
# imageVariant:
# description: Base image variant
# required: true
# default: slim
push:
pull_request:
jobs:
build-image:
runs-on: ubuntu-latest
env:
latest-ref: refs/heads/develop
strategy:
matrix:
postgresMajorVersion:
- 13
postgisMajorVersion:
- 3
postgisMinorRelease:
- 1
include:
- distro: debian
imageVersion: bullseye
imageVariant: slim
steps:
- uses: actions/checkout@v2
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Get build cache
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
# Build inputs are:
# - Dockerfile recipe
# - docker-compose.build.yml
# - build args (.example.env)
# - base_build directory
# - scripts directory
key: buildx-${{ hashFiles('Dockerfile', 'docker-compose.build.yml', '.example.env', 'base_build', 'scripts') }}-${{ github.sha }}
restore-keys: |
buildx-${{ hashFiles('Dockerfile', 'docker-compose.build.yml', '.example.env', 'base_build', 'scripts') }}-
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Build base image
id: docker_build_base
uses: docker/build-push-action@v2
with:
context: .
file: Dockerfile
push: false
load: true
tags: ${{ secrets.DOCKERHUB_REPO }}/postgis:base-${{ matrix.distro }}-${{ matrix.imageVersion }}-${{ matrix.imageVariant }}
build-args: |
DISTRO=${{ matrix.distro }}
IMAGE_VERSION=${{ matrix.imageVersion }}
IMAGE_VARIANT=${{ matrix.imageVariant }}
LANGS=en_US.UTF-8,id_ID.UTF-8
GENERATE_ALL_LOCALE=0
POSTGRES_MAJOR_VERSION=${{ matrix.postgresMajorVersion }}
POSTGIS_MAJOR_VERSION=${{ matrix.postgisMajorVersion }}
POSTGIS_MINOR_VERSION=${{ matrix.postgresMinorVersion }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,mode=max,dest=/tmp/.buildx-cache
target: postgis-base
- name: Build prod image
id: docker_build_prod
uses: docker/build-push-action@v2
with:
context: .
file: Dockerfile
push: false
load: true
tags: ${{ secrets.DOCKERHUB_REPO }}/postgis:${{ matrix.postgresMajorVersion }}-${{ matrix.postgisMajorVersion }}.${{ matrix.postgisMinorRelease }}
build-args: |
DISTRO=${{ matrix.distro }}
IMAGE_VERSION=${{ matrix.imageVersion }}
IMAGE_VARIANT=${{ matrix.imageVariant }}
LANGS=en_US.UTF-8,id_ID.UTF-8
GENERATE_ALL_LOCALE=0
POSTGRES_MAJOR_VERSION=${{ matrix.postgresMajorVersion }}
POSTGIS_MAJOR_VERSION=${{ matrix.postgisMajorVersion }}
POSTGIS_MINOR_VERSION=${{ matrix.postgresMinorVersion }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,mode=max,dest=/tmp/.buildx-cache
target: postgis-prod
- name: Build image for testing
id: docker_build_testing_image
uses: docker/build-push-action@v2
with:
context: .
file: Dockerfile
push: false
load: true
tags: kartoza/postgis:manual-build
build-args: |
DISTRO=${{ matrix.distro }}
IMAGE_VERSION=${{ matrix.imageVersion }}
IMAGE_VARIANT=${{ matrix.imageVariant }}
LANGS=en_US.UTF-8,id_ID.UTF-8
GENERATE_ALL_LOCALE=0
POSTGRES_MAJOR_VERSION=${{ matrix.postgresMajorVersion }}
POSTGIS_MAJOR_VERSION=${{ matrix.postgisMajorVersion }}
POSTGIS_MINOR_VERSION=${{ matrix.postgresMinorVersion }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,mode=max,dest=/tmp/.buildx-cache
target: postgis-test
run-scenario-tests:
runs-on: ubuntu-latest
needs: [ build-image ]
strategy:
matrix:
postgresMajorVersion:
- 13
postgisMajorVersion:
- 3
postgisMinorRelease:
- 1
scenario:
- datadir_init
- streaming_replication
- collations
- extensions
- logical_replication
include:
- distro: debian
imageVersion: bullseye
imageVariant: slim
steps:
- uses: actions/checkout@v2
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Get build cache
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
# Build inputs are:
# - Dockerfile recipe
# - docker-compose.build.yml
# - build args (.example.env)
# - base_build directory
# - scripts directory
key: buildx-${{ hashFiles('Dockerfile', 'docker-compose.build.yml', '.example.env', 'base_build', 'scripts') }}-${{ github.sha }}
restore-keys: |
buildx-${{ hashFiles('Dockerfile', 'docker-compose.build.yml', '.example.env', 'base_build', 'scripts') }}-
- name: Build image for testing
id: docker_build_testing_image
uses: docker/build-push-action@v2
with:
context: .
file: Dockerfile
push: false
load: true
tags: kartoza/postgis:manual-build
build-args: |
DISTRO=${{ matrix.distro }}
IMAGE_VERSION=${{ matrix.imageVersion }}
IMAGE_VARIANT=${{ matrix.imageVariant }}
LANGS=en_US.UTF-8,id_ID.UTF-8
GENERATE_ALL_LOCALE=0
POSTGRES_MAJOR_VERSION=${{ matrix.postgresMajorVersion }}
POSTGIS_MAJOR_VERSION=${{ matrix.postgisMajorVersion }}
POSTGIS_MINOR_VERSION=${{ matrix.postgresMinorVersion }}
cache-from: type=local,src=/tmp/.buildx-cache
target: postgis-test
- name: Run scenario test
env:
COMPOSE_INTERACTIVE_NO_CLI: 1
PRINT_TEST_LOGS: 1
run: |
pushd scenario_tests/${{ matrix.scenario }}
./test.sh
popd

Wyświetl plik

@ -0,0 +1,106 @@
name: deploy-image
on:
workflow_dispatch:
# inputs:
# distro:
# description: Base image distro
# required: true
# default: debian
# imageVersion:
# description: Base distro image version/release
# required: true
# default: bullseye
# imageVariant:
# description: Base image variant
# required: true
# default: slim
workflow_run:
workflows:
- build-latest
branches:
- develop
types:
- completed
jobs:
deploy-image:
runs-on: ubuntu-latest
env:
latest-ref: refs/heads/develop
strategy:
matrix:
postgresMajorVersion:
- 13
postgisMajorVersion:
- 3
postgisMinorRelease:
- 1
include:
- distro: debian
imageVersion: bullseye
imageVariant: slim
steps:
- uses: actions/checkout@v2
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Get build cache
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
# Build inputs are:
# - Dockerfile recipe
# - docker-compose.build.yml
# - build args (.example.env)
# - base_build directory
# - scripts directory
key: buildx-${{ hashFiles('Dockerfile', 'docker-compose.build.yml', '.example.env', 'base_build', 'scripts') }}-${{ github.sha }}
restore-keys: |
buildx-${{ hashFiles('Dockerfile', 'docker-compose.build.yml', '.example.env', 'base_build', 'scripts') }}-
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Build base image
id: docker_build_base
uses: docker/build-push-action@v2
with:
context: .
file: Dockerfile
push: true
tags: ${{ secrets.DOCKERHUB_REPO }}/postgis:base-${{ matrix.distro }}-${{ matrix.imageVersion }}-${{ matrix.imageVariant }}
build-args: |
DISTRO=${{ matrix.distro }}
IMAGE_VERSION=${{ matrix.imageVersion }}
IMAGE_VARIANT=${{ matrix.imageVariant }}
GENERATE_ALL_LOCALE=1
POSTGRES_MAJOR_VERSION=${{ matrix.postgresMajorVersion }}
POSTGIS_MAJOR_VERSION=${{ matrix.postgisMajorVersion }}
POSTGIS_MINOR_VERSION=${{ matrix.postgresMinorVersion }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
target: postgis-base
- name: Build prod image
id: docker_build_prod
uses: docker/build-push-action@v2
with:
context: .
file: Dockerfile
push: true
load: true
tags: ${{ secrets.DOCKERHUB_REPO }}/postgis:${{ matrix.postgresMajorVersion }}-${{ matrix.postgisMajorVersion }}.${{ matrix.postgisMinorRelease }}
build-args: |
DISTRO=${{ matrix.distro }}
IMAGE_VERSION=${{ matrix.imageVersion }}
IMAGE_VARIANT=${{ matrix.imageVariant }}
GENERATE_ALL_LOCALE=1
POSTGRES_MAJOR_VERSION=${{ matrix.postgresMajorVersion }}
POSTGIS_MAJOR_VERSION=${{ matrix.postgisMajorVersion }}
POSTGIS_MINOR_VERSION=${{ matrix.postgresMinorVersion }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
target: postgis-prod

3
.gitignore vendored
Wyświetl plik

@ -5,4 +5,7 @@
.DS_Store
.python-version
venv
.venv
__pycache__
.env

Wyświetl plik

@ -1,24 +0,0 @@
sudo: required
language: python
services:
- docker
python:
- '3.7'
env:
- SCENARIO=datadir_init
- SCENARIO=replications
- SCENARIO=collations
- SCENARIO=extensions
- SCENARIO=logical_replication
before_script:
- ./build-test.sh
script:
- pushd scenario_tests/${SCENARIO}
- ./test.sh
- popd

Wyświetl plik

@ -1,19 +1,85 @@
#--------- Generic stuff all our Dockerfiles should start with so we get caching ------------
##############################################################################
# Base stage #
##############################################################################
ARG DISTRO=debian
ARG IMAGE_VERSION=buster
ARG IMAGE_VERSION=bullseye
ARG IMAGE_VARIANT=slim
FROM kartoza/postgis:$DISTRO-$IMAGE_VERSION-$IMAGE_VARIANT
FROM $DISTRO:$IMAGE_VERSION-$IMAGE_VARIANT AS postgis-base
MAINTAINER Tim Sutton<tim@kartoza.com>
# Reset ARG for version
ARG IMAGE_VERSION
RUN apt-get -qq update --fix-missing && apt-get -qq --yes upgrade
RUN set -eux \
&& export DEBIAN_FRONTEND=noninteractive \
&& apt-get update \
&& apt-get -y --no-install-recommends install \
locales gnupg2 wget ca-certificates rpl pwgen software-properties-common iputils-ping \
apt-transport-https curl \
&& dpkg-divert --local --rename --add /sbin/initctl
RUN apt-get -y update; apt-get -y install build-essential autoconf libxml2-dev zlib1g-dev netcat gdal-bin
# Temporary - PostgreSQL requires this which is not available in bullseye
ADD base_build/gdal_install.sh /gdal_install.sh
RUN chmod 0755 /gdal_install.sh;/bin/bash /gdal_install.sh
# Generating locales takes a long time. Utilize caching by runnig it by itself
# early in the build process.
# Generate all locale only on deployment mode build
# Set to empty string to generate only default locale
ARG GENERATE_ALL_LOCALE=1
ARG LANGS="en_US.UTF-8,id_ID.UTF-8"
ARG LANG=en_US.UTF-8
ENV LANG=en_US.UTF-8 \
LANGUAGE=en_US:en \
LC_ALL=en_US.UTF-8
COPY base_build/scripts/locale.gen /etc/all.locale.gen
COPY base_build/scripts/locale-filter.sh /etc/locale-filter.sh
RUN if [ -z "${GENERATE_ALL_LOCALE}" ] || [ $GENERATE_ALL_LOCALE -eq 0 ]; \
then \
cat /etc/all.locale.gen | grep "${LANG}" > /etc/locale.gen; \
/bin/bash /etc/locale-filter.sh; \
else \
cp -f /etc/all.locale.gen /etc/locale.gen; \
fi; \
set -eux \
&& /usr/sbin/locale-gen
RUN update-locale ${LANG}
# Cleanup resources
RUN apt-get -y --purge autoremove \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
##############################################################################
# Production Stage #
##############################################################################
FROM postgis-base AS postgis-prod
MAINTAINER Tim Sutton<tim@kartoza.com>
# Reset ARG for version
ARG IMAGE_VERSION
ARG POSTGRES_MAJOR_VERSION=13
ARG POSTGIS_MAJOR=3
ARG POSTGIS_MAJOR_VERSION=3
ARG POSTGIS_MINOR_RELEASE=1
RUN set -eux \
&& export DEBIAN_FRONTEND=noninteractive \
&& apt-get upgrade;apt-get update \
&& apt-get update \
&& sh -c "echo \"deb http://apt.postgresql.org/pub/repos/apt/ ${IMAGE_VERSION}-pgdg main\" > /etc/apt/sources.list.d/pgdg.list" \
&& wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc -O- | apt-key add - \
&& apt-get -y --purge autoremove \
@ -32,15 +98,18 @@ RUN set -eux \
&& apt-get update \
&& apt-get -y --no-install-recommends install postgresql-client-${POSTGRES_MAJOR_VERSION} \
postgresql-common postgresql-${POSTGRES_MAJOR_VERSION} \
postgresql-${POSTGRES_MAJOR_VERSION}-postgis-${POSTGIS_MAJOR} \
postgresql-${POSTGRES_MAJOR_VERSION}-postgis-${POSTGIS_MAJOR_VERSION} \
netcat postgresql-${POSTGRES_MAJOR_VERSION}-ogr-fdw \
postgresql-${POSTGRES_MAJOR_VERSION}-postgis-${POSTGIS_MAJOR}-scripts \
postgresql-${POSTGRES_MAJOR_VERSION}-postgis-${POSTGIS_MAJOR_VERSION}-scripts \
postgresql-plpython3-${POSTGRES_MAJOR_VERSION} postgresql-${POSTGRES_MAJOR_VERSION}-pgrouting \
postgresql-server-dev-${POSTGRES_MAJOR_VERSION} postgresql-${POSTGRES_MAJOR_VERSION}-cron
RUN echo $POSTGRES_MAJOR_VERSION >/tmp/pg_version.txt
RUN echo $POSTGRES_MAJOR_VERSION >/tmp/pg_version.txt
RUN echo $POSTGIS_MAJOR_VERSION >/tmp/pg_major_version.txt
RUN echo $POSTGIS_MINOR_RELEASE >/tmp/pg_minor_version.txt
ENV \
PATH="$PATH:/usr/lib/postgresql/${POSTGRES_MAJOR_VERSION}/bin"
# Compile pointcloud extension
RUN wget -O- https://github.com/pgpointcloud/pointcloud/archive/master.tar.gz | tar xz && \
@ -68,4 +137,22 @@ RUN set -eux \
VOLUME /var/lib/postgresql
ENTRYPOINT /scripts/docker-entrypoint.sh
ENTRYPOINT /scripts/docker-entrypoint.sh
##############################################################################
# Testing Stage #
##############################################################################
FROM postgis-prod AS postgis-test
COPY scenario_tests/utils/requirements.txt /lib/utils/requirements.txt
RUN set -eux \
&& export DEBIAN_FRONTEND=noninteractive \
&& apt-get update \
&& apt-get -y --no-install-recommends install python3-pip \
&& apt-get -y --purge autoremove \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN pip3 install -r /lib/utils/requirements.txt

Wyświetl plik

@ -1,16 +0,0 @@
#--------- Generic stuff all our Dockerfiles should start with so we get caching ------------
FROM kartoza/postgis:manual-build
# For testing
COPY scenario_tests/utils/requirements.txt /lib/utils/requirements.txt
RUN set -eux \
&& export DEBIAN_FRONTEND=noninteractive \
&& apt-get update \
&& apt-get -y --no-install-recommends install python3-pip \
&& apt-get -y --purge autoremove \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN pip3 install -r /lib/utils/requirements.txt

Wyświetl plik

@ -59,8 +59,7 @@ docker pull kartoza/postgis:image_version
## Building the image
To build the image yourself without apt-cacher (also consumes more bandwidth
since deb packages need to be fetched each time you build) do:
To build the image yourself do:
```
docker build -t kartoza/postgis git://github.com/kartoza/docker-postgis
@ -79,7 +78,7 @@ Then do:
docker build -t kartoza/postgis .
```
Or
Or build against a specific PostgreSQL version
```
docker build --build-arg POSTGRES_MAJOR_VERSION=13 --build-arg POSTGIS_MAJOR=3 -t kartoza/postgis:POSTGRES_MAJOR_VERSION .
@ -91,9 +90,10 @@ and `IMAGE_VARIANT` (=slim) which can be used to control the base image used
(but it still needs to be Debian based and have PostgreSQL official apt repo).
For example making Ubuntu 20.04 based build (for better arm64 support)
First build the base image using the branch `postgres-base` following instructions from [Kartoza base image builds](https://github.com/kartoza/docker-postgis/tree/postgres-base#alternative-base-distributions-builds)
First build the base image using instructions in the folder `base_build` using the
build script from [Kartoza base image builds](https://github.com/kartoza/docker-postgis/blob/develop/base_build/build.sh)
And then build the `PostGIS Image` using
Then build the `PostGIS Image` to match the base build
```
docker build --build-arg DISTRO=ubuntu --build-arg IMAGE_VERSION=focal --build-arg IMAGE_VARIANT="" -t kartoza/postgis .
@ -105,14 +105,13 @@ By default, the image build will include **all** `locales` to cover any value fo
You can safely delete all `locales` except for the ones you need in `scripts/locale.gen`. This will speed up the build considerably.
You can also run the container using the environment variables.
### Environment variables
#### Cluster Initializations
With minimum setup, our image will use initial cluster located in the
With a minimum setup, our image will use an initial cluster located in the
`DATADIR` environment variable. If you want to use persistence, mount these
location into your volume/host. By default, `DATADIR` will point to `/var/lib/postgresql/{major-version}`.
locations into your volume/host. By default, `DATADIR` will point to `/var/lib/postgresql/{major-version}`.
You can instead mount the parent location like this:
* `-v data-volume:/var/lib/postgresql`
@ -134,8 +133,8 @@ You need to specify different empty directory, like this
The containers will use above parameters to initialize a new db cluster in the
specified directory. If the directory is not empty, then initialization parameter will be ignored.
These are some initialization parameter that will only be used to initialize new cluster.
If the container uses existing cluster, it will be ignored (for example, when the container restarts).
These are some initialization parameters that will only get used to initialize a new cluster.
If the container uses an existing cluster, it is ignored (for example, when the container restarts).
* `DEFAULT_ENCODING`: cluster encoding
* `DEFAULT_COLLATION`: cluster collation
@ -150,7 +149,7 @@ new db cluster.
* `RECREATE_DATADIR`: Force database reinitialization in the location `DATADIR`
If you used `RECREATE_DATADIR` and successfully created new cluster. Remember
If you used `RECREATE_DATADIR` and successfully created a new cluster. Remember
that you should remove this parameter afterwards. Because, if it was not omitted,
it will always recreate new db cluster after every container restarts.
@ -170,7 +169,7 @@ or
If you use default `DATADIR` location.
If you need to setup a database cluster with other encoding parameters you need
If you need to set up a database cluster with other encoding parameters you need
to pass the environment variables when you initialize the cluster.
* -e DEFAULT_ENCODING="UTF8"
@ -186,7 +185,7 @@ delete the current cluster and create a new one. Make sure to remove parameter
#### Basic configuration
You can use the following environment variables to pass a
user name, password and/or default database name(or multiple databases comma separated).
username, password and/or default database name(or multiple databases comma separated).
* `-e POSTGRES_USER=<PGUSER>`
* `-e POSTGRES_PASS=<PGPASSWORD>`
@ -236,12 +235,12 @@ Maximum size to let the WAL grow to between automatic WAL checkpoints.
* `-e MAINTAINANCE_WORK_MEM=128MB`
#### Configure networking
You can open up the PG port by using the following environment variable. By default
You can open up the PG port by using the following environment variable. By default,
the container will allow connections only from the docker private subnet.
* `-e ALLOW_IP_RANGE=<0.0.0.0/0> By default`
Postgres conf is setup to listen to all connections and if a user needs to restrict which IP address
Postgres conf is set up to listen to all connections and if a user needs to restrict which IP address
PostgreSQL listens to you can define it with the following environment variable. The default is set to listen to
all connections.
* `-e IP_LIST=<*>`

Wyświetl plik

@ -0,0 +1,44 @@
[![Build Status](https://travis-ci.org/kartoza/docker-postgis.svg?branch=develop)](https://travis-ci.org/kartoza/docker-postgis)
# docker-postgis
A docker image that installs all the dependency for building `kartoza/postgis` image variants.
Visit our page on the docker hub at: https://hub.docker.com/r/kartoza/postgis/
#### Alternative base distributions builds
There are build args for `DISTRO` (=debian), `IMAGE_VERSION` (=buster)
and `IMAGE_VARIANT` (=slim) which can be used to control the base image used
(but it still needs to be Debian based and have PostgreSQL official apt repo).
For example making Ubuntu 20.04 based build (for better arm64 support)
First build the base image using the in the folder `base_build` using the
build script
following instructions from [Kartoza base image builds](https://github.com/kartoza/docker-postgis/tree/postgres-base#alternative-base-distributions-builds)
Then build the `PostGIS base Image` using
```
docker build --build-arg DISTRO=ubuntu --build-arg IMAGE_VERSION=focal --build-arg IMAGE_VARIANT="" -t kartoza/postgis:$DISTRO-$IMAGE_VERSION-$IMAGE_VARIANT-base .
```
#### Locales
By default, the image build will include **all** `locales` to cover any value for `locale` settings such as `DEFAULT_COLLATION`, `DEFAULT_CTYPE` or `DEFAULT_ENCODING`.
You can safely delete all `locales` except for the ones you need in `scripts/locale.gen`. This will speed up the build considerably.
### Support
If you require more substantial assistance from [kartoza](https://kartoza.com) (because our work and interaction on docker-postgis is pro bono),
please consider taking out a [Support Level Agreeement](https://kartoza.com/en/shop/product/support)
## Credits
Tim Sutton (tim@kartoza.com)
Gavin Fleming (gavin@kartoza.com)
Rizky Maulana (rizky@kartoza.com)
Admire Nyakudya (admire@kartoza.com)
December 2020

Wyświetl plik

@ -0,0 +1,7 @@
#!/usr/bin/env bash
if [[ ${IMAGE_VERSION} =~ [Bb][Uu][Ll][Ll][Ss][Ee][Yy][Ee] ]]; then
wget --progress=bar:force:noscroll -c --no-check-certificate http://ftp.br.debian.org/debian/pool/main/g/gdal/libgdal27_3.1.4+dfsg-1+b1_amd64.deb
dpkg -i libgdal27_3.1.4+dfsg-1+b1_amd64.deb
fi

Wyświetl plik

@ -0,0 +1,9 @@
#!/usr/bin/env bash
## Filter list of locales from a given filter args
## Parse into array
LANG_ARR=(${LANGS//,/ })
echo "" > /etc/locale.gen
for i in "${LANG_ARR[@]}"; do
cat /etc/all.locale.gen | grep "$i" >> /etc/locale.gen
done

Wyświetl plik

@ -0,0 +1,484 @@
# This file lists locales that you wish to have built. You can find a list
# of valid supported locales at /usr/share/i18n/SUPPORTED, and you can add
# user defined locales to /usr/local/share/i18n/SUPPORTED. If you change
# this file, you need to rerun locale-gen.
aa_DJ ISO-8859-1
aa_DJ.UTF-8 UTF-8
aa_ER UTF-8
aa_ER@saaho UTF-8
aa_ET UTF-8
af_ZA ISO-8859-1
af_ZA.UTF-8 UTF-8
ak_GH UTF-8
am_ET UTF-8
an_ES ISO-8859-15
an_ES.UTF-8 UTF-8
anp_IN UTF-8
ar_AE ISO-8859-6
ar_AE.UTF-8 UTF-8
ar_BH ISO-8859-6
ar_BH.UTF-8 UTF-8
ar_DZ ISO-8859-6
ar_DZ.UTF-8 UTF-8
ar_EG ISO-8859-6
ar_EG.UTF-8 UTF-8
ar_IN UTF-8
ar_IQ ISO-8859-6
ar_IQ.UTF-8 UTF-8
ar_JO ISO-8859-6
ar_JO.UTF-8 UTF-8
ar_KW ISO-8859-6
ar_KW.UTF-8 UTF-8
ar_LB ISO-8859-6
ar_LB.UTF-8 UTF-8
ar_LY ISO-8859-6
ar_LY.UTF-8 UTF-8
ar_MA ISO-8859-6
ar_MA.UTF-8 UTF-8
ar_OM ISO-8859-6
ar_OM.UTF-8 UTF-8
ar_QA ISO-8859-6
ar_QA.UTF-8 UTF-8
ar_SA ISO-8859-6
ar_SA.UTF-8 UTF-8
ar_SD ISO-8859-6
ar_SD.UTF-8 UTF-8
ar_SS UTF-8
ar_SY ISO-8859-6
ar_SY.UTF-8 UTF-8
ar_TN ISO-8859-6
ar_TN.UTF-8 UTF-8
ar_YE ISO-8859-6
ar_YE.UTF-8 UTF-8
as_IN UTF-8
ast_ES ISO-8859-15
ast_ES.UTF-8 UTF-8
ayc_PE UTF-8
az_AZ UTF-8
be_BY CP1251
be_BY.UTF-8 UTF-8
be_BY@latin UTF-8
bem_ZM UTF-8
ber_DZ UTF-8
ber_MA UTF-8
bg_BG CP1251
bg_BG.UTF-8 UTF-8
bhb_IN.UTF-8 UTF-8
bho_IN UTF-8
bn_BD UTF-8
bn_IN UTF-8
bo_CN UTF-8
bo_IN UTF-8
br_FR ISO-8859-1
br_FR.UTF-8 UTF-8
br_FR@euro ISO-8859-15
brx_IN UTF-8
bs_BA ISO-8859-2
bs_BA.UTF-8 UTF-8
byn_ER UTF-8
ca_AD ISO-8859-15
ca_AD.UTF-8 UTF-8
ca_ES ISO-8859-1
ca_ES.UTF-8 UTF-8
ca_ES.UTF-8@valencia UTF-8
ca_ES@euro ISO-8859-15
ca_ES@valencia ISO-8859-15
ca_FR ISO-8859-15
ca_FR.UTF-8 UTF-8
ca_IT ISO-8859-15
ca_IT.UTF-8 UTF-8
ce_RU UTF-8
chr_US UTF-8
cmn_TW UTF-8
crh_UA UTF-8
cs_CZ ISO-8859-2
cs_CZ.UTF-8 UTF-8
csb_PL UTF-8
cv_RU UTF-8
cy_GB ISO-8859-14
cy_GB.UTF-8 UTF-8
da_DK ISO-8859-1
da_DK.UTF-8 UTF-8
de_AT ISO-8859-1
de_AT.UTF-8 UTF-8
de_AT@euro ISO-8859-15
de_BE ISO-8859-1
de_BE.UTF-8 UTF-8
de_BE@euro ISO-8859-15
de_CH ISO-8859-1
de_CH.UTF-8 UTF-8
de_DE ISO-8859-1
de_DE.UTF-8 UTF-8
de_DE@euro ISO-8859-15
de_IT ISO-8859-1
de_IT.UTF-8 UTF-8
de_LI.UTF-8 UTF-8
de_LU ISO-8859-1
de_LU.UTF-8 UTF-8
de_LU@euro ISO-8859-15
doi_IN UTF-8
dv_MV UTF-8
dz_BT UTF-8
el_CY ISO-8859-7
el_CY.UTF-8 UTF-8
el_GR ISO-8859-7
el_GR.UTF-8 UTF-8
en_AG UTF-8
en_AU ISO-8859-1
en_AU.UTF-8 UTF-8
en_BW ISO-8859-1
en_BW.UTF-8 UTF-8
en_CA ISO-8859-1
en_CA.UTF-8 UTF-8
en_DK ISO-8859-1
en_DK.ISO-8859-15 ISO-8859-15
en_DK.UTF-8 UTF-8
en_GB ISO-8859-1
en_GB.ISO-8859-15 ISO-8859-15
en_GB.UTF-8 UTF-8
en_HK ISO-8859-1
en_HK.UTF-8 UTF-8
en_IE ISO-8859-1
en_IE.UTF-8 UTF-8
en_IE@euro ISO-8859-15
en_IL UTF-8
en_IN UTF-8
en_NG UTF-8
en_NZ ISO-8859-1
en_NZ.UTF-8 UTF-8
en_PH ISO-8859-1
en_PH.UTF-8 UTF-8
en_SG ISO-8859-1
en_SG.UTF-8 UTF-8
en_US ISO-8859-1
en_US.ISO-8859-15 ISO-8859-15
en_US.UTF-8 UTF-8
en_ZA ISO-8859-1
en_ZA.UTF-8 UTF-8
en_ZM UTF-8
en_ZW ISO-8859-1
en_ZW.UTF-8 UTF-8
eo UTF-8
es_AR ISO-8859-1
es_AR.UTF-8 UTF-8
es_BO ISO-8859-1
es_BO.UTF-8 UTF-8
es_CL ISO-8859-1
es_CL.UTF-8 UTF-8
es_CO ISO-8859-1
es_CO.UTF-8 UTF-8
es_CR ISO-8859-1
es_CR.UTF-8 UTF-8
es_CU UTF-8
es_DO ISO-8859-1
es_DO.UTF-8 UTF-8
es_EC ISO-8859-1
es_EC.UTF-8 UTF-8
es_ES ISO-8859-1
es_ES.UTF-8 UTF-8
es_ES@euro ISO-8859-15
es_GT ISO-8859-1
es_GT.UTF-8 UTF-8
es_HN ISO-8859-1
es_HN.UTF-8 UTF-8
es_MX ISO-8859-1
es_MX.UTF-8 UTF-8
es_NI ISO-8859-1
es_NI.UTF-8 UTF-8
es_PA ISO-8859-1
es_PA.UTF-8 UTF-8
es_PE ISO-8859-1
es_PE.UTF-8 UTF-8
es_PR ISO-8859-1
es_PR.UTF-8 UTF-8
es_PY ISO-8859-1
es_PY.UTF-8 UTF-8
es_SV ISO-8859-1
es_SV.UTF-8 UTF-8
es_US ISO-8859-1
es_US.UTF-8 UTF-8
es_UY ISO-8859-1
es_UY.UTF-8 UTF-8
es_VE ISO-8859-1
es_VE.UTF-8 UTF-8
et_EE ISO-8859-1
et_EE.ISO-8859-15 ISO-8859-15
et_EE.UTF-8 UTF-8
eu_ES ISO-8859-1
eu_ES.UTF-8 UTF-8
eu_ES@euro ISO-8859-15
eu_FR ISO-8859-1
eu_FR.UTF-8 UTF-8
eu_FR@euro ISO-8859-15
fa_IR UTF-8
ff_SN UTF-8
fi_FI ISO-8859-1
fi_FI.UTF-8 UTF-8
fi_FI@euro ISO-8859-15
fil_PH UTF-8
fo_FO ISO-8859-1
fo_FO.UTF-8 UTF-8
fr_BE ISO-8859-1
fr_BE.UTF-8 UTF-8
fr_BE@euro ISO-8859-15
fr_CA ISO-8859-1
fr_CA.UTF-8 UTF-8
fr_CH ISO-8859-1
fr_CH.UTF-8 UTF-8
fr_FR ISO-8859-1
fr_FR.UTF-8 UTF-8
fr_FR@euro ISO-8859-15
fr_LU ISO-8859-1
fr_LU.UTF-8 UTF-8
fr_LU@euro ISO-8859-15
fur_IT UTF-8
fy_DE UTF-8
fy_NL UTF-8
ga_IE ISO-8859-1
ga_IE.UTF-8 UTF-8
ga_IE@euro ISO-8859-15
gd_GB ISO-8859-15
gd_GB.UTF-8 UTF-8
gez_ER UTF-8
gez_ER@abegede UTF-8
gez_ET UTF-8
gez_ET@abegede UTF-8
gl_ES ISO-8859-1
gl_ES.UTF-8 UTF-8
gl_ES@euro ISO-8859-15
gu_IN UTF-8
gv_GB ISO-8859-1
gv_GB.UTF-8 UTF-8
ha_NG UTF-8
hak_TW UTF-8
he_IL ISO-8859-8
he_IL.UTF-8 UTF-8
hi_IN UTF-8
hne_IN UTF-8
hr_HR ISO-8859-2
hr_HR.UTF-8 UTF-8
hsb_DE ISO-8859-2
hsb_DE.UTF-8 UTF-8
ht_HT UTF-8
hu_HU ISO-8859-2
hu_HU.UTF-8 UTF-8
hy_AM UTF-8
hy_AM.ARMSCII-8 ARMSCII-8
ia_FR UTF-8
id_ID ISO-8859-1
id_ID.UTF-8 UTF-8
ig_NG UTF-8
ik_CA UTF-8
is_IS ISO-8859-1
is_IS.UTF-8 UTF-8
it_CH ISO-8859-1
it_CH.UTF-8 UTF-8
it_IT ISO-8859-1
it_IT.UTF-8 UTF-8
it_IT@euro ISO-8859-15
iu_CA UTF-8
ja_JP.EUC-JP EUC-JP
ja_JP.UTF-8 UTF-8
ka_GE GEORGIAN-PS
ka_GE.UTF-8 UTF-8
kk_KZ PT154
kk_KZ.RK1048 RK1048
kk_KZ.UTF-8 UTF-8
kl_GL ISO-8859-1
kl_GL.UTF-8 UTF-8
km_KH UTF-8
kn_IN UTF-8
ko_KR.EUC-KR EUC-KR
ko_KR.UTF-8 UTF-8
kok_IN UTF-8
ks_IN UTF-8
ks_IN@devanagari UTF-8
ku_TR ISO-8859-9
ku_TR.UTF-8 UTF-8
kw_GB ISO-8859-1
kw_GB.UTF-8 UTF-8
ky_KG UTF-8
lb_LU UTF-8
lg_UG ISO-8859-10
lg_UG.UTF-8 UTF-8
li_BE UTF-8
li_NL UTF-8
lij_IT UTF-8
ln_CD UTF-8
lo_LA UTF-8
lt_LT ISO-8859-13
lt_LT.UTF-8 UTF-8
lv_LV ISO-8859-13
lv_LV.UTF-8 UTF-8
lzh_TW UTF-8
mag_IN UTF-8
mai_IN UTF-8
mg_MG ISO-8859-15
mg_MG.UTF-8 UTF-8
mhr_RU UTF-8
mi_NZ ISO-8859-13
mi_NZ.UTF-8 UTF-8
mk_MK ISO-8859-5
mk_MK.UTF-8 UTF-8
ml_IN UTF-8
mn_MN UTF-8
mni_IN UTF-8
mr_IN UTF-8
ms_MY ISO-8859-1
ms_MY.UTF-8 UTF-8
mt_MT ISO-8859-3
mt_MT.UTF-8 UTF-8
my_MM UTF-8
nan_TW UTF-8
nan_TW@latin UTF-8
nb_NO ISO-8859-1
nb_NO.UTF-8 UTF-8
nds_DE UTF-8
nds_NL UTF-8
ne_NP UTF-8
nhn_MX UTF-8
niu_NU UTF-8
niu_NZ UTF-8
nl_AW UTF-8
nl_BE ISO-8859-1
nl_BE.UTF-8 UTF-8
nl_BE@euro ISO-8859-15
nl_NL ISO-8859-1
nl_NL.UTF-8 UTF-8
nl_NL@euro ISO-8859-15
nn_NO ISO-8859-1
nn_NO.UTF-8 UTF-8
nr_ZA UTF-8
nso_ZA UTF-8
oc_FR ISO-8859-1
oc_FR.UTF-8 UTF-8
om_ET UTF-8
om_KE ISO-8859-1
om_KE.UTF-8 UTF-8
or_IN UTF-8
os_RU UTF-8
pa_IN UTF-8
pa_PK UTF-8
pap_AW UTF-8
pap_CW UTF-8
pl_PL ISO-8859-2
pl_PL.UTF-8 UTF-8
ps_AF UTF-8
pt_BR ISO-8859-1
pt_BR.UTF-8 UTF-8
pt_PT ISO-8859-1
pt_PT.UTF-8 UTF-8
pt_PT@euro ISO-8859-15
quz_PE UTF-8
raj_IN UTF-8
ro_RO ISO-8859-2
ro_RO.UTF-8 UTF-8
ru_RU ISO-8859-5
ru_RU.CP1251 CP1251
ru_RU.KOI8-R KOI8-R
ru_RU.UTF-8 UTF-8
ru_UA KOI8-U
ru_UA.UTF-8 UTF-8
rw_RW UTF-8
sa_IN UTF-8
sat_IN UTF-8
sc_IT UTF-8
sd_IN UTF-8
sd_IN@devanagari UTF-8
se_NO UTF-8
sgs_LT UTF-8
shs_CA UTF-8
si_LK UTF-8
sid_ET UTF-8
sk_SK ISO-8859-2
sk_SK.UTF-8 UTF-8
sl_SI ISO-8859-2
sl_SI.UTF-8 UTF-8
so_DJ ISO-8859-1
so_DJ.UTF-8 UTF-8
so_ET UTF-8
so_KE ISO-8859-1
so_KE.UTF-8 UTF-8
so_SO ISO-8859-1
so_SO.UTF-8 UTF-8
sq_AL ISO-8859-1
sq_AL.UTF-8 UTF-8
sq_MK UTF-8
sr_ME UTF-8
sr_RS UTF-8
sr_RS@latin UTF-8
ss_ZA UTF-8
st_ZA ISO-8859-1
st_ZA.UTF-8 UTF-8
sv_FI ISO-8859-1
sv_FI.UTF-8 UTF-8
sv_FI@euro ISO-8859-15
sv_SE ISO-8859-1
sv_SE.ISO-8859-15 ISO-8859-15
sv_SE.UTF-8 UTF-8
sw_KE UTF-8
sw_TZ UTF-8
szl_PL UTF-8
ta_IN UTF-8
ta_LK UTF-8
tcy_IN.UTF-8 UTF-8
te_IN UTF-8
tg_TJ KOI8-T
tg_TJ.UTF-8 UTF-8
th_TH TIS-620
th_TH.UTF-8 UTF-8
the_NP UTF-8
ti_ER UTF-8
ti_ET UTF-8
tig_ER UTF-8
tk_TM UTF-8
tl_PH ISO-8859-1
tl_PH.UTF-8 UTF-8
tn_ZA UTF-8
tr_CY ISO-8859-9
tr_CY.UTF-8 UTF-8
tr_TR ISO-8859-9
tr_TR.UTF-8 UTF-8
ts_ZA UTF-8
tt_RU UTF-8
tt_RU@iqtelif UTF-8
ug_CN UTF-8
uk_UA KOI8-U
uk_UA.UTF-8 UTF-8
unm_US UTF-8
ur_IN UTF-8
ur_PK UTF-8
uz_UZ ISO-8859-1
uz_UZ.UTF-8 UTF-8
uz_UZ@cyrillic UTF-8
ve_ZA UTF-8
vi_VN UTF-8
wa_BE ISO-8859-1
wa_BE.UTF-8 UTF-8
wa_BE@euro ISO-8859-15
wae_CH UTF-8
wal_ET UTF-8
wo_SN UTF-8
xh_ZA ISO-8859-1
xh_ZA.UTF-8 UTF-8
yi_US CP1255
yi_US.UTF-8 UTF-8
yo_NG UTF-8
yue_HK UTF-8
zh_CN GB2312
zh_CN.GB18030 GB18030
zh_CN.GBK GBK
zh_CN.UTF-8 UTF-8
zh_HK BIG5-HKSCS
zh_HK.UTF-8 UTF-8
zh_SG GB2312
zh_SG.GBK GBK
zh_SG.UTF-8 UTF-8
zh_TW BIG5
zh_TW.EUC-TW EUC-TW
zh_TW.UTF-8 UTF-8
zu_ZA ISO-8859-1
zu_ZA.UTF-8 UTF-8
zu_ZA.UTF-8 UTF-8

10
build-base.sh 100755
Wyświetl plik

@ -0,0 +1,10 @@
#!/usr/bin/env bash
# Building an debian base image
if [[ ! -f .env ]]; then
echo "Default build arguments don't exists. Creating one from default value."
cp .example.env .env
fi
docker-compose -f docker-compose.build.yml build postgis-base

Wyświetl plik

@ -1,5 +1,9 @@
#!/usr/bin/env bash
# For scenario testing purposes
./build.sh
if [[ ! -f .env ]]; then
echo "Default build arguments don't exists. Creating one from default value."
cp .example.env .env
fi
docker build -t kartoza/postgis:manual-build -f Dockerfile.test .
docker-compose -f docker-compose.build.yml build postgis-test

Wyświetl plik

@ -1,3 +1,8 @@
#!/usr/bin/env bash
docker build -t kartoza/postgis:manual-build .
docker build -t kartoza/postgis:13.0 .
if [[ ! -f .env ]]; then
echo "Default build arguments don't exists. Creating one from default value."
cp .example.env .env
fi
docker-compose -f docker-compose.build.yml build postgis-prod

Wyświetl plik

@ -0,0 +1,33 @@
# Used solely for docker-compose build
version: '3'
services:
postgis-base:
image: kartoza/postgis:base-${DISTRO}-${IMAGE_VERSION}-${IMAGE_VARIANT}
build:
context: .
# Use yaml anchor for reusability
args: &build-args-anchor
DISTRO: ${DISTRO}
IMAGE_VERSION: ${IMAGE_VERSION}
IMAGE_VARIANT: ${IMAGE_VARIANT}
GENERATE_ALL_LOCALE: ${GENERATE_ALL_LOCALE}
POSTGRES_MAJOR_VERSION: ${POSTGRES_MAJOR_VERSION}
POSTGIS_MAJOR_VERSION: ${POSTGIS_MAJOR_VERSION}
POSTGIS_MINOR_RELEASE: ${POSTGIS_MINOR_RELEASE}
target: postgis-base
postgis-prod:
image: kartoza/postgis:${POSTGRES_MAJOR_VERSION}-${POSTGIS_MAJOR_VERSION}.${POSTGIS_MINOR_RELEASE}
build:
context: .
args:
<<: *build-args-anchor
target: postgis-prod
postgis-test:
image: kartoza/postgis:manual-build
build:
context: .
args:
<<: *build-args-anchor
target: postgis-test

Wyświetl plik

@ -7,7 +7,7 @@ volumes:
services:
db:
image: kartoza/postgis:12.0
image: kartoza/postgis:13.1
volumes:
- postgis-data:/var/lib/postgresql
- dbbackups:/backups
@ -26,7 +26,7 @@ services:
test: "exit 0"
dbbackups:
image: kartoza/pg-backup:12.0
image: kartoza/pg-backup:13.0
hostname: pg-backups
volumes:
- dbbackups:/backups

1
requirements.txt 100644
Wyświetl plik

@ -0,0 +1 @@
docker-compose==1.28

Wyświetl plik

@ -8,6 +8,10 @@ source ../test-env.sh
# Run service
docker-compose up -d
if [[ -n "${PRINT_TEST_LOGS}" ]]; then
docker-compose logs -f &
fi
sleep 30
services=("pg" "pg-new")
@ -15,10 +19,12 @@ services=("pg" "pg-new")
for service in "${services[@]}"; do
# Execute tests
until docker-compose exec $service pg_isready; do
until docker-compose exec -T $service pg_isready; do
sleep 30
echo "Wait service to be ready"
done;
docker-compose exec $service /bin/bash /tests/test.sh
echo "Execute test for $service"
docker-compose exec -T $service /bin/bash /tests/test.sh
done

Wyświetl plik

@ -8,6 +8,10 @@ source ../test-env.sh
# Run service
docker-compose up -d
if [[ -n "${PRINT_TEST_LOGS}" ]]; then
docker-compose logs -f &
fi
sleep 60
services=("pg-default" "pg-new" "pg-recreate")
@ -15,10 +19,12 @@ services=("pg-default" "pg-new" "pg-recreate")
for service in "${services[@]}"; do
# Execute tests
until docker-compose exec $service pg_isready; do
sleep 1
until docker-compose exec -T $service pg_isready; do
sleep 5
echo "Wait service to be ready"
done;
docker-compose exec $service /bin/bash /tests/test.sh
echo "Execute test for $service"
docker-compose exec -T $service /bin/bash /tests/test.sh
done

Wyświetl plik

@ -8,6 +8,10 @@ source ../test-env.sh
# Run service
docker-compose up -d
if [[ -n "${PRINT_TEST_LOGS}" ]]; then
docker-compose logs -f &
fi
sleep 30
services=("pg" "pg-two-extensions")
@ -15,10 +19,12 @@ services=("pg" "pg-two-extensions")
for service in "${services[@]}"; do
# Execute tests
until docker-compose exec $service pg_isready; do
until docker-compose exec -T $service pg_isready; do
sleep 30
echo "Wait service to be ready"
done;
docker-compose exec $service /bin/bash /tests/test.sh
echo "Execute test for $service"
docker-compose exec -T $service /bin/bash /tests/test.sh
done

Wyświetl plik

@ -47,8 +47,7 @@ services:
REPLICATION_PASS: 'replicator'
REPLICATION: 'true'
depends_on:
pg-publisher:
condition: service_healthy
- pg-publisher
# You can expose the port to observe it in your local machine
# For this sample, it was disabled by default to allow scaling test
ports:

Wyświetl plik

@ -8,22 +8,26 @@ source ../test-env.sh
# Run service
docker-compose up -d
sleep 5
if [[ -n "${PRINT_TEST_LOGS}" ]]; then
docker-compose logs -f &
fi
sleep 60
# Preparing publisher cluster
until docker-compose exec pg-publisher pg_isready; do
until docker-compose exec -T pg-publisher pg_isready; do
sleep 1
done;
# Execute tests
docker-compose exec pg-publisher /bin/bash /tests/test_publisher.sh
docker-compose exec -T pg-publisher /bin/bash /tests/test_publisher.sh
# Preparing node cluster
until docker-compose exec pg-subscriber pg_isready; do
until docker-compose exec -T pg-subscriber pg_isready; do
sleep 1
done;
# Execute tests
docker-compose exec pg-subscriber /bin/bash /tests/test_subscriber.sh
docker-compose exec -T pg-subscriber /bin/bash /tests/test_subscriber.sh
docker-compose down -v

Wyświetl plik

@ -72,7 +72,7 @@ class TestReplicationSubscriber(unittest.TestCase):
try:
output = func_action()
func_assert(output)
print('Assertion succes')
print('Assertion success')
return
except Exception as e:
last_error = e

Wyświetl plik

@ -1,29 +0,0 @@
#!/usr/bin/env bash
# exit immediately if test fails
set -e
source ../test-env.sh
# Run service
docker-compose up -d
sleep 5
# Preparing master cluster
until docker-compose exec pg-master pg_isready; do
sleep 1
done;
# Execute tests
docker-compose exec pg-master /bin/bash /tests/test_master.sh
# Preparing node cluster
until docker-compose exec pg-node pg_isready; do
sleep 1
done;
# Execute tests
docker-compose exec pg-node /bin/bash /tests/test_node.sh
docker-compose down -v

Wyświetl plik

@ -0,0 +1,33 @@
#!/usr/bin/env bash
# exit immediately if test fails
set -e
source ../test-env.sh
# Run service
docker-compose up -d
if [[ -n "${PRINT_TEST_LOGS}" ]]; then
docker-compose logs -f &
fi
sleep 30
# Preparing master cluster
until docker-compose exec -T pg-master pg_isready; do
sleep 30
done;
# Execute tests
docker-compose exec -T pg-master /bin/bash /tests/test_master.sh
# Preparing node cluster
until docker-compose exec -T pg-node pg_isready; do
sleep 30
done;
# Execute tests
docker-compose exec -T pg-node /bin/bash /tests/test_node.sh
docker-compose down -v

Wyświetl plik

@ -1,5 +1,7 @@
#!/usr/bin/env bash
POSTGRES_MAJOR_VERSION=$(cat /tmp/pg_version.txt)
POSTGIS_MAJOR=$(cat /tmp/pg_major_version.txt)
POSTGIS_MINOR_RELEASE=$(cat /tmp/pg_minor_version.txt)
DEFAULT_DATADIR="/var/lib/postgresql/${POSTGRES_MAJOR_VERSION}/main"
ROOT_CONF="/etc/postgresql/${POSTGRES_MAJOR_VERSION}/main"
PG_ENV="$ROOT_CONF/environment"
@ -8,7 +10,7 @@ WAL_ARCHIVE="/opt/archivedir"
RECOVERY_CONF="$ROOT_CONF/recovery.conf"
POSTGRES="/usr/lib/postgresql/${POSTGRES_MAJOR_VERSION}/bin/postgres"
INITDB="/usr/lib/postgresql/${POSTGRES_MAJOR_VERSION}/bin/initdb"
SQLDIR="/usr/share/postgresql/${POSTGRES_MAJOR_VERSION}/contrib/postgis-3.0/"
SQLDIR="/usr/share/postgresql/${POSTGRES_MAJOR_VERSION}/contrib/postgis-${POSTGIS_MAJOR}.${POSTGIS_MINOR_RELEASE}/"
SETVARS="POSTGIS_ENABLE_OUTDB_RASTERS=1 POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL"
LOCALONLY="-c listen_addresses='127.0.0.1'"
PG_BASEBACKUP="/usr/bin/pg_basebackup"
@ -337,3 +339,26 @@ function entry_point_script {
return 0
}
function configure_replication_permissions {
echo "Setup data permissions"
echo "----------------------"
chown -R postgres:postgres $(getent passwd postgres | cut -d: -f6)
su - postgres -c "echo \"${REPLICATE_FROM}:${REPLICATE_PORT}:*:${REPLICATION_USER}:${REPLICATION_PASS}\" > ~/.pgpass"
su - postgres -c "chmod 0600 ~/.pgpass"
}
function streaming_replication {
until su - postgres -c "${PG_BASEBACKUP} -X stream -h ${REPLICATE_FROM} -p ${REPLICATE_PORT} -D ${DATADIR} -U ${REPLICATION_USER} -R -vP -w --label=gis_pg_custer"
do
echo "Waiting for master to connect..."
sleep 1s
if [[ "$(ls -A ${DATADIR})" ]]; then
echo "Need empty folder. Cleaning directory..."
rm -rf ${DATADIR}/*
fi
done
}

Wyświetl plik

@ -7,21 +7,20 @@ if [ -f "${SETUP_LOCKFILE}" ]; then
return 0
fi
list=(`echo ${POSTGRES_DBNAME} | tr ',' ' '`)
arr=(${list})
SINGLE_DB=${arr[0]}
# This script will setup necessary configuration to enable replications
# Refresh configuration in case environment settings changed.
cat $CONF.template > $CONF
# Reflect DATADIR loaction
# Reflect DATA DIR location
# Delete any data_dir declarations
sed -i '/data_directory/d' $CONF
echo "data_directory = '${DATADIR}'" >> $CONF
# This script will setup necessary configuration to optimise for PostGIS and to enable replications
cat >> $CONF <<EOF
# Create a config to optimise postgis
if [[ -f ${ROOT_CONF}/postgis.conf ]];then
rm $CONF/postgis.conf
fi
cat >> ${ROOT_CONF}/postgis.conf <<EOF
data_directory = '${DATADIR}'
port = 5432
superuser_reserved_connections= 10
listen_addresses = '${IP_LIST}'
shared_buffers = ${SHARED_BUFFERS}
@ -39,12 +38,14 @@ timezone='${TIMEZONE}'
cron.use_background_workers = on
EOF
# This script will setup necessary replication settings
echo "include 'postgis.conf'" >> $CONF
# Create a config for logical replication
if [[ "${REPLICATION}" =~ [Tt][Rr][Uu][Ee] && "$WAL_LEVEL" == 'logical' ]]; then
cat >> "$CONF" <<EOF
if [[ -f ${ROOT_CONF}/logical_replication.conf ]];then
rm $CONF/logical_replication.conf
fi
cat >> ${ROOT_CONF}/logical_replication.conf <<EOF
wal_level = ${WAL_LEVEL}
max_wal_senders = ${PG_MAX_WAL_SENDERS}
wal_keep_size = ${PG_WAL_KEEP_SIZE}
@ -53,10 +54,15 @@ max_wal_size = ${WAL_SIZE}
max_logical_replication_workers = ${MAX_LOGICAL_REPLICATION_WORKERS}
max_sync_workers_per_subscription = ${MAX_SYNC_WORKERS_PER_SUBSCRIPTION}
EOF
echo "include 'logical_replication.conf'" >> $CONF
fi
# Create a config for streaming replication
if [[ "${REPLICATION}" =~ [Tt][Rr][Uu][Ee] && "$WAL_LEVEL" == 'replica' ]]; then
cat >> "$CONF" <<EOF
if [[ -f ${ROOT_CONF}/streaming_replication.conf ]];then
rm $CONF/streaming_replication.conf
fi
cat >> ${ROOT_CONF}/streaming_replication.conf <<EOF
wal_level = ${WAL_LEVEL}
archive_mode = ${ARCHIVE_MODE}
archive_command = '${ARCHIVE_COMMAND}'
@ -73,9 +79,17 @@ recovery_target_timeline=${TARGET_TIMELINE}
recovery_target_action=${TARGET_ACTION}
promote_trigger_file = '${PROMOTE_FILE}'
EOF
echo "include 'streaming_replication.conf'" >> $CONF
fi
echo -e $EXTRA_CONF >> $CONF
if [[ -f ${ROOT_CONF}/extra.conf ]];then
rm $CONF/extra.conf
fi
if [[ ! -z $EXTRA_CONF ]]; then
echo -e $EXTRA_CONF >> ${ROOT_CONF}/extra.conf
echo "include 'extra.conf'" >> $CONF
fi
# Optimise PostgreSQL shared memory for PostGIS
# shmall units are pages and shmmax units are bytes(?) equivalent to the desired shared_buffer size set in setup_conf.sh - in this case 500MB

Wyświetl plik

@ -7,37 +7,11 @@ source /scripts/env-data.sh
# Adapted from https://github.com/DanielDent/docker-postgres-replication
# To set up replication
create_dir ${WAL_ARCHIVE}
chown -R postgres:postgres ${DATADIR} ${WAL_ARCHIVE}
chmod -R 750 ${DATADIR} ${WAL_ARCHIVE}
function configure_replication_permissions {
echo "Setup data permissions"
echo "----------------------"
chown -R postgres:postgres $(getent passwd postgres | cut -d: -f6)
su - postgres -c "echo \"${REPLICATE_FROM}:${REPLICATE_PORT}:*:${REPLICATION_USER}:${REPLICATION_PASS}\" > ~/.pgpass"
su - postgres -c "chmod 0600 ~/.pgpass"
}
function streaming_replication {
until su - postgres -c "${PG_BASEBACKUP} -X stream -h ${REPLICATE_FROM} -p ${REPLICATE_PORT} -D ${DATADIR} -U ${REPLICATION_USER} -R -vP -w --label=gis_pg_custer"
do
echo "Waiting for master to connect..."
sleep 1s
if [[ "$(ls -A ${DATADIR})" ]]; then
echo "Need empty folder. Cleaning directory..."
rm -rf ${DATADIR}/*
fi
done
}
if [[ "$WAL_LEVEL" == 'replica' && "${REPLICATION}" =~ [Tt][Rr][Uu][Ee] ]]; then
# No content yet - but this is a slave database
if [ -z "${REPLICATE_FROM}" ]; then

Wyświetl plik

@ -22,15 +22,19 @@ mkdir -p ${PGSTAT_TMP}
chmod 0777 ${PGSTAT_TMP}
# moved from setup.sh
echo "ssl = true" >> $CONF
#echo "ssl_ciphers = 'DEFAULT:!LOW:!EXP:!MD5:@STRENGTH' " >> $CONF
#echo "ssl_renegotiation_limit = 512MB " >> $CONF
echo "ssl_cert_file = '${SSL_CERT_FILE}'" >> $CONF
echo "ssl_key_file = '${SSL_KEY_FILE}'" >> $CONF
if [ ! -z "${SSL_CA_FILE}" ]; then
echo "ssl_ca_file = '${SSL_CA_FILE}' # (change requires restart)" >> $CONF
if [[ -f ${ROOT_CONF}/ssl.conf ]];then
rm $CONF/ssl.conf
fi
#echo "ssl_crl_file = ''" >> $CONF
cat >> ${ROOT_CONF}/ssl.conf <<EOF
ssl = true
ssl_cert_file = '${SSL_CERT_FILE}'
ssl_key_file = '${SSL_KEY_FILE}'
EOF
if [ ! -z "${SSL_CA_FILE}" ]; then
echo "ssl_ca_file = '${SSL_CA_FILE}' # (change requires restart)" >> ${ROOT_CONF}/ssl.conf
fi
echo "include 'ssl.conf'" >> $CONF
# Put lock file to make sure conf was not reinitialized
touch ${SETUP_LOCKFILE}

Wyświetl plik

@ -14,44 +14,24 @@ source /scripts/env-data.sh
# Only create credentials if this is a master database
# Slave database will just mirror from master users
echo "Setup postgres User:Password"
echo "postgresql user: $POSTGRES_USER" > /tmp/PGPASSWORD.txt
echo "postgresql password: $POSTGRES_PASS" >> /tmp/PGPASSWORD.txt
echo "$POSTGRES_PASS" >> /tmp/PGPASSWORD.txt
# Check super user already exists
# Check user already exists
echo "Creating superuser $POSTGRES_USER"
RESULT=`su - postgres -c "psql postgres -t -c \"SELECT 1 FROM pg_roles WHERE rolname = '$POSTGRES_USER'\""`
COMMAND="ALTER"
if [ -z "$RESULT" ]; then
COMMAND="CREATE"
fi
su - postgres -c "psql postgres -c \"$COMMAND USER $POSTGRES_USER WITH SUPERUSER ENCRYPTED PASSWORD '$POSTGRES_PASS';\""
echo "Creating superuser user $POSTGRES_USER using $PASSWORD_AUTHENTICATION authentication "
if [ PASSWORD_AUTHENTICATION="md5" ]; then
PG_PASS=$(U=$POSTGRES_USER; P=$(cat /tmp/PGPASSWORD.txt); echo -n md5; echo -n $P$U | md5sum | cut -d' ' -f1)
su - postgres -c "psql postgres -c \"$COMMAND USER $POSTGRES_USER WITH SUPERUSER PASSWORD '$PG_PASS';\""
elif [ PASSWORD_AUTHENTICATION="scram-sha-256" ]; then
PG_PASS=$(U=$POSTGRES_USER; P=$(cat /tmp/PGPASSWORD.txt); echo -n sha256; echo -n $P$U | sha256sum | cut -d' ' -f1)
su - postgres -c "psql postgres -c \"$COMMAND USER $POSTGRES_USER WITH SUPERUSER PASSWORD '$PG_PASS';\""
fi
echo "$REPLICATION_PASS" >> /tmp/REPLICATION_PASS.txt
# Check replication user already exists
echo "Creating replication user $REPLICATION_USER"
RESULT_REPLICATION=`su - postgres -c "psql postgres -t -c \"SELECT 1 FROM pg_roles WHERE rolname = '$REPLICATION_USER'\""`
COMMANDS="ALTER"
if [ -z "$RESULT_REPLICATION" ]; then
COMMANDS="CREATE"
fi
su - postgres -c "psql postgres -c \"$COMMANDS USER $REPLICATION_USER WITH REPLICATION ENCRYPTED PASSWORD '$REPLICATION_PASS';\""
if [ -z "$RESULT" ]; then
COMMAND="CREATE"
fi
echo "Creating replication user $REPLICATION_USER using $PASSWORD_AUTHENTICATION authentication "
if [ PASSWORD_AUTHENTICATION="md5" ]; then
REP_PASS=$(U=$REPLICATION_USER; P=$(cat /tmp/REPLICATION_PASS.txt); echo -n md5; echo -n $P$U | md5sum | cut -d' ' -f1)
su - postgres -c "psql postgres -c \"$COMMANDS USER $REPLICATION_USER WITH REPLICATION PASSWORD '$REP_PASS';\""
elif [ PASSWORD_AUTHENTICATION="scram-sha-256" ]; then
REP_PASS=$(U=$REPLICATION_USER; P=$(cat /tmp/REPLICATION_PASS.txt); echo -n sha256; echo -n $P$U | sha256sum | cut -d' ' -f1)
su - postgres -c "psql postgres -c \"$COMMANDS USER $REPLICATION_USER WITH REPLICATION PASSWORD '$REP_PASS';\""
fi
rm /tmp/PGPASSWORD.txt /tmp/REPLICATION_PASS.txt

Wyświetl plik

@ -7,13 +7,9 @@ source /scripts/env-data.sh
# Restrict subnet to docker private network
echo "host all all 172.0.0.0/8 md5" >> $ROOT_CONF/pg_hba.conf
# And allow access from DockerToolbox / Boottodocker on OSX
echo "host all all 192.168.0.0/16 md5" >> $ROOT_CONF/pg_hba.conf
# Listen on all ip addresses
echo "listen_addresses = '*'" >> $CONF
echo "port = 5432" >> $CONF
echo "host all all 172.0.0.0/8 ${PASSWORD_AUTHENTICATION}" >> $ROOT_CONF/pg_hba.conf
# And allow access from DockerToolbox / Boot to docker on OSX
echo "host all all 192.168.0.0/16 ${PASSWORD_AUTHENTICATION}" >> $ROOT_CONF/pg_hba.conf
# Create backup template for conf
cat $CONF > $CONF.template