From 4a74729b73fc564801ef2c22d8ec36455177d6f4 Mon Sep 17 00:00:00 2001 From: Cyril Rohr Date: Mon, 12 Jul 2021 16:00:40 +0200 Subject: [PATCH] Introduce upgrade scripts for compose installation (here for postgres-13) (#6) --- .gitignore | 2 + compose/control/Dockerfile | 11 ++++ compose/control/README.md | 47 +++++++++++++++++ compose/control/backup/entrypoint.sh | 13 +++++ compose/control/upgrade/entrypoint.sh | 8 +++ .../control/upgrade/scripts/00-db-upgrade.sh | 32 ++++++++++++ compose/docker-compose.control.yml | 51 +++++++++++++++++++ compose/docker-compose.yml | 2 +- 8 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 compose/control/Dockerfile create mode 100644 compose/control/README.md create mode 100755 compose/control/backup/entrypoint.sh create mode 100755 compose/control/upgrade/entrypoint.sh create mode 100755 compose/control/upgrade/scripts/00-db-upgrade.sh create mode 100644 compose/docker-compose.control.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..82b0cd2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.swp +*.tar.gz diff --git a/compose/control/Dockerfile b/compose/control/Dockerfile new file mode 100644 index 0000000..69154b9 --- /dev/null +++ b/compose/control/Dockerfile @@ -0,0 +1,11 @@ +FROM debian:10 + +RUN apt-get update -qq && apt-get install wget gnupg2 -y && rm -rf /var/lib/apt/lists/* +RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - +RUN echo "deb http://apt.postgresql.org/pub/repos/apt buster-pgdg main" > /etc/apt/sources.list.d/pgdg.list +RUN apt-get update -qq && apt-get install postgresql-9.6 postgresql-10 postgresql-13 -y && rm -rf /var/lib/apt/lists/* +RUN localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 + +ENV LANG en_US.utf8 + +ADD . /control diff --git a/compose/control/README.md b/compose/control/README.md new file mode 100644 index 0000000..b46cf0a --- /dev/null +++ b/compose/control/README.md @@ -0,0 +1,47 @@ +# Control your OpenProject installation + +## Backup + +Switch off your current installation: + + docker-compose down + +Build the control scripts: + + docker-compose -f docker-compose.yml -f docker-compose.control.yml build + +Take a backup of your existing PostgreSQL data and OpenProject assets: + + docker-compose -f docker-compose.yml -f docker-compose.control.yml run backup + +Restart your OpenProject installation + + docker-compose up -d + +## Upgrade + +Switch off your current installation (using the outdated postgres engine): + + docker-compose down + +Fetch the latest changes from this repository: + + git pull origin stable/12 # adjust if needed + +Build the control plane: + + docker-compose -f docker-compose.yml -f docker-compose.control.yml build + +Take a backup of your existing postgresql data and openproject assets: + + docker-compose -f docker-compose.yml -f docker-compose.control.yml run backup + +Run the upgrade: + + docker-compose -f docker-compose.yml -f docker-compose.control.yml run upgrade + +Relaunch your OpenProject installation, using the normal Compose command: + + docker-compose up -d + +Test that everything works again, the database container should now be running postgres 13. diff --git a/compose/control/backup/entrypoint.sh b/compose/control/backup/entrypoint.sh new file mode 100755 index 0000000..f81abe2 --- /dev/null +++ b/compose/control/backup/entrypoint.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -e + +timestamp=$(date +%s) +mkdir -p /backups +cd /backups +filename="${timestamp}-pgdata.tar.gz" +echo "Backing up PostgreSQL data into backups/${filename}..." +tar czf "${filename}" -C "$PGDATA" . +filename="${timestamp}-opdata.tar.gz" +echo "Backing up OpenProject assets into backups/${filename}..." +tar czf "${filename}" -C "$OPDATA" . +echo "DONE" diff --git a/compose/control/upgrade/entrypoint.sh b/compose/control/upgrade/entrypoint.sh new file mode 100755 index 0000000..71a8f78 --- /dev/null +++ b/compose/control/upgrade/entrypoint.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -e +set -o pipefail + +/control/upgrade/scripts/00-db-upgrade.sh + +echo "Please restart your installation by issuing the following command:" +echo " docker-compose up -d" diff --git a/compose/control/upgrade/scripts/00-db-upgrade.sh b/compose/control/upgrade/scripts/00-db-upgrade.sh new file mode 100755 index 0000000..1e89bad --- /dev/null +++ b/compose/control/upgrade/scripts/00-db-upgrade.sh @@ -0,0 +1,32 @@ +#!/bin/bash +set -e +set -o pipefail + +CURRENT_PGVERSION="$(cat $PGDATA/PG_VERSION)" +NEW_PGVERSION="13" +PGWORKDIR=${PGWORKDIR:=/var/lib/postgresql/work} + +if [ ! "$CURRENT_PGVERSION" -lt "$NEW_PGVERSION" ]; then + echo "Current PG version is higher or equal to the PG version to be installed ($CURRENT_PGVERSION > $NEW_PGVERSION). Ignoring." + exit 0 +fi + +export PGBINOLD="/usr/lib/postgresql/$CURRENT_PGVERSION/bin" +export PGBINNEW="/usr/lib/postgresql/$NEW_PGVERSION/bin" +export PGDATAOLD="$PGDATA" +export PGDATANEW="$PGWORKDIR/datanew" + +rm -rf "$PGWORKDIR" && mkdir -p "$PGWORKDIR" "$PGDATANEW" +chown -R postgres.postgres "$PGDATA" "$PGWORKDIR" +cd "$PGWORKDIR" +# initialize new db +su -m postgres -c "$PGBINNEW/initdb --pgdata=$PGDATANEW --encoding=unicode --auth=trust" +echo "Performing a dry-run migration to PostgreSQL $NEW_PGVERSION..." +su -m postgres -c "$PGBINNEW/pg_upgrade -c" +echo "Performing the real migration to PostgreSQL $NEW_VERSION..." +su -m postgres -c "$PGBINNEW/pg_upgrade" +su -m postgres -c "rm -rf $PGDATAOLD/* && mv $PGDATANEW/* $PGDATAOLD/" +# as per docker hub documentation +su -m postgres -c "echo \"listen_addresses = '*'\" >> $PGDATAOLD/postgresql.conf" +su -m postgres -c "echo \"host all all all md5\" >> $PGDATAOLD/pg_hba.conf" +echo "DONE" diff --git a/compose/docker-compose.control.yml b/compose/docker-compose.control.yml new file mode 100644 index 0000000..95635e3 --- /dev/null +++ b/compose/docker-compose.control.yml @@ -0,0 +1,51 @@ +version: "3.7" + +volumes: + pgupgrade: + +services: + db: + restart: "no" + entrypoint: ["echo", "disabled"] + upgrade: + restart: "no" + build: + context: ./control + environment: + PGDATA: /var/lib/postgresql/data + volumes: + - "pgdata:/var/lib/postgresql/data" + - "./control:/control" + entrypoint: ["/control/upgrade/entrypoint.sh"] + backup: + restart: "no" + build: + context: ./control + environment: + PGDATA: /var/lib/postgresql/data + OPDATA: /var/openproject/assets + volumes: + - "pgdata:/var/lib/postgresql/data" + - "opdata:/var/openproject/assets" + - "./backups:/backups" + - "./control:/control" + entrypoint: ["/control/backup/entrypoint.sh"] + web: + restart: "no" + entrypoint: ["echo", "disabled"] + worker: + restart: "no" + entrypoint: ["echo", "disabled"] + cron: + restart: "no" + entrypoint: ["echo", "disabled"] + seeder: + restart: "no" + entrypoint: ["echo", "disabled"] + proxy: + restart: "no" + entrypoint: ["echo", "disabled"] + cache: + restart: "no" + entrypoint: ["echo", "disabled"] + diff --git a/compose/docker-compose.yml b/compose/docker-compose.yml index 6b3c1af..4c2da6e 100644 --- a/compose/docker-compose.yml +++ b/compose/docker-compose.yml @@ -30,7 +30,7 @@ x-op-app: &app services: db: - image: postgres:10 + image: postgres:13 <<: *restart_policy stop_grace_period: "3s" volumes: