mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 14:03:30 +00:00
This uses the same technique used in840884ec89, to only apply select parts of the Puppet configuration. This is more correct, and simpler, than attempting to chop out some base puppet roles, and hack around the `purge => true` supervisor.d configuration. (cherry picked from commite13f82f048)
136 lines
5.0 KiB
Bash
Executable File
136 lines
5.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
if [ "$EUID" -ne 0 ]; then
|
|
echo "Error: This script must be run as root" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Force a known locale; some OS X terminals set an invalid LC_CTYPE
|
|
# which crashes pg_upgradecluster
|
|
export LC_ALL=C.UTF-8
|
|
export LANG=C.UTF-8
|
|
export LANGUAGE=C.UTF-8
|
|
|
|
LATEST_SUPPORTED_VERSION=17
|
|
UPGRADE_TO=${1:-$LATEST_SUPPORTED_VERSION}
|
|
UPGRADE_FROM=$(crudini --get /etc/zulip/zulip.conf postgresql version)
|
|
ZULIP_PATH="$(dirname "$0")/../.."
|
|
|
|
if [ "$UPGRADE_TO" = "$UPGRADE_FROM" ]; then
|
|
echo "Already running PostgreSQL $UPGRADE_TO!"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$UPGRADE_TO" -lt "$UPGRADE_FROM" ]]; then
|
|
echo "Refusing to downgrade PostgreSQL $UPGRADE_FROM to $UPGRADE_TO!"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$UPGRADE_TO" -gt "$LATEST_SUPPORTED_VERSION" ]]; then
|
|
echo "This version of Zulip does not support PostgreSQL $UPGRADE_TO."
|
|
echo "You may need to upgrade Zulip before you can upgrade to PostgreSQL $UPGRADE_TO."
|
|
exit 1
|
|
fi
|
|
|
|
# Verify that the version in /etc/zulip/zulip.conf is the version that
|
|
# Django actually stores its data in. We can only do that if the
|
|
# database server is on the same host as the application server.
|
|
if [ -d /home/zulip/deployments/current ]; then
|
|
DATA_IS_IN=$(su zulip -c '/home/zulip/deployments/current/manage.py shell -c "from django.db import connection; print(int(connection.cursor().connection.server_version/10000))"')
|
|
|
|
if [ "$UPGRADE_FROM" != "$DATA_IS_IN" ]; then
|
|
cat <<EOF
|
|
|
|
/etc/zulip/zulip.conf claims that Zulip is running PostgreSQL
|
|
$UPGRADE_FROM, but the server is connected to a PostgreSQL running
|
|
version $DATA_IS_IN. Check the output from pg_lsclusters to verify
|
|
which clusters are running, and update /etc/zulip/zulip.conf to match.
|
|
|
|
In general, this results from manually upgrading PostgreSQL; you
|
|
should use this tool for all PostgreSQL upgrades.
|
|
EOF
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
set -x
|
|
|
|
"$ZULIP_PATH"/scripts/lib/setup-apt-repo
|
|
apt-get install -y "postgresql-$UPGRADE_TO" "postgresql-client-$UPGRADE_TO"
|
|
drop_main_cluster="$(
|
|
pg_lsclusters --json \
|
|
| jq --arg pg_version "$UPGRADE_TO" -r \
|
|
'.[] | select((.version|tostring == $ARGS.named.pg_version) and (.cluster == "main")) | .cluster'
|
|
)"
|
|
if [ -n "$drop_main_cluster" ]; then
|
|
pg_dropcluster "$UPGRADE_TO" main --stop
|
|
fi
|
|
|
|
(
|
|
# Two-stage application of Puppet; we apply the bare-bones
|
|
# PostgreSQL configuration first, so that FTS will be configured
|
|
# prior to the pg_upgradecluster.
|
|
TEMP_CONF_DIR=$(mktemp -d)
|
|
cp /etc/zulip/zulip.conf "$TEMP_CONF_DIR"
|
|
ZULIP_CONF="${TEMP_CONF_DIR}/zulip.conf"
|
|
crudini --set "$ZULIP_CONF" postgresql version "$UPGRADE_TO"
|
|
|
|
if [ -f "/usr/share/postgresql/$UPGRADE_FROM/pgroonga_setup.sql.applied" ]; then
|
|
# This file is intentionally blank, to trigger always running
|
|
# `ALTER EXTENSION pgroonga UPDATE` and not `CREATE EXTENSION pgroonga`.
|
|
touch "/usr/share/postgresql/$UPGRADE_TO/pgroonga_setup.sql.applied"
|
|
fi
|
|
|
|
"$ZULIP_PATH"/scripts/zulip-puppet-apply -f --config "$ZULIP_CONF" --tags postgresql_upgrade
|
|
rm -rf "$TEMP_CONF_DIR"
|
|
)
|
|
|
|
# Capture the output so we know where the path to the post-upgrade scripts is
|
|
UPGRADE_LOG=$(mktemp "/var/log/zulip/upgrade-postgresql-$UPGRADE_FROM-$UPGRADE_TO.XXXXXXXXX.log")
|
|
pg_upgradecluster -v "$UPGRADE_TO" "$UPGRADE_FROM" main --method=upgrade --link | tee "$UPGRADE_LOG"
|
|
SCRIPTS_PATH=$(grep -o "/var/log/postgresql/pg_upgradecluster-$UPGRADE_FROM-$UPGRADE_TO-main.*" "$UPGRADE_LOG" || true)
|
|
|
|
# If the upgrade completed successfully, lock in the new version in
|
|
# our configuration immediately
|
|
crudini --set /etc/zulip/zulip.conf postgresql version "$UPGRADE_TO"
|
|
|
|
# Make sure the new PostgreSQL is running
|
|
start_main_cluster="$(
|
|
pg_lsclusters --json \
|
|
| jq --arg pg_version "$UPGRADE_TO" -r \
|
|
'.[] | select((.version|tostring == $ARGS.named.pg_version) and (.cluster == "main") and (.running != 1)) | .cluster'
|
|
)"
|
|
if [ -n "$start_main_cluster" ]; then
|
|
pg_ctlcluster "$UPGRADE_TO" main start
|
|
fi
|
|
|
|
# Update the statistics
|
|
su postgres -c "/usr/lib/postgresql/$UPGRADE_TO/bin/vacuumdb --all --analyze-only --jobs 10"
|
|
|
|
# Start the database up cleanly
|
|
"$ZULIP_PATH"/scripts/zulip-puppet-apply -f
|
|
|
|
# Drop the old data, binaries, and scripts
|
|
pg_dropcluster "$UPGRADE_FROM" main
|
|
apt remove -y "postgresql-$UPGRADE_FROM"
|
|
if [ -n "$SCRIPTS_PATH" ]; then
|
|
if [ -f "$SCRIPTS_PATH/update_extensions.sql" ]; then
|
|
su postgres -c "psql $SCRIPTS_PATH/update_extensions.sql"
|
|
fi
|
|
su postgres -c "$SCRIPTS_PATH/delete_old_cluster.sh"
|
|
rm -rf "$SCRIPTS_PATH"
|
|
else
|
|
set +x
|
|
echo
|
|
echo
|
|
echo ">>>>> pg_upgradecluster succeeded, but post-upgrade scripts path could not"
|
|
echo " be parsed out! Please read the pg_upgradecluster output to understand"
|
|
echo " the current status of your cluster:"
|
|
echo " $UPGRADE_LOG"
|
|
echo " and report this bug with the PostgreSQL $UPGRADE_FROM -> $UPGRADE_TO upgrade to:"
|
|
echo " https://github.com/zulip/zulip/issues"
|
|
echo
|
|
echo
|
|
fi
|