2016-01-12 13:08:43 +01:00
|
|
|
|
#!/usr/bin/env bash
|
2017-10-02 01:48:25 +02:00
|
|
|
|
set -e
|
|
|
|
|
|
|
|
|
|
usage() {
|
2020-06-18 00:18:34 +02:00
|
|
|
|
# A subset of this documentation also appears in docs/production/install.md
|
|
|
|
|
cat <<'EOF'
|
2017-11-15 21:09:53 +01:00
|
|
|
|
Usage:
|
2019-02-01 02:23:37 +01:00
|
|
|
|
install --hostname=zulip.example.com --email=zulip-admin@example.com [options...]
|
2017-11-15 21:09:53 +01:00
|
|
|
|
install --help
|
|
|
|
|
|
2020-06-18 00:18:34 +02:00
|
|
|
|
Options:
|
|
|
|
|
--hostname=zulip.example.com
|
|
|
|
|
The user-accessible domain name for this Zulip server, i.e., what users will type
|
|
|
|
|
in their web browser. Required, unless --no-init-db is set and --certbot is not.
|
|
|
|
|
--email=zulip-admin@example.com
|
|
|
|
|
The email address of the person or team who should get support and error emails
|
|
|
|
|
from this Zulip server. Required, unless --no-init-db is set and --certbot is
|
|
|
|
|
not.
|
|
|
|
|
|
2018-03-03 01:10:51 +01:00
|
|
|
|
--certbot
|
2020-06-18 00:18:34 +02:00
|
|
|
|
Obtains a free SSL certificate for the server using Certbot,
|
|
|
|
|
https://certbot.eff.org/ Recommended. Conflicts with --self-signed-cert.
|
2018-01-24 02:03:18 +01:00
|
|
|
|
--self-signed-cert
|
2020-06-18 00:18:34 +02:00
|
|
|
|
Generate a self-signed SSL certificate for the server. This isn’t suitable for
|
|
|
|
|
production use, but may be convenient for testing. Conflicts with --certbot.
|
|
|
|
|
--cacert=/path/to/ca.pem
|
|
|
|
|
Set the CA which used to establish TLS to all public internet sites during the
|
|
|
|
|
install process; used when this command is run once in a highly-controlled
|
|
|
|
|
environment to produce an image which is used elsewhere. Uncommon.
|
2020-06-17 23:26:53 +02:00
|
|
|
|
|
2020-06-24 00:44:49 +02:00
|
|
|
|
--postgres-version=12
|
|
|
|
|
Sets the version of Postgres that will be installed.
|
2019-12-12 10:50:04 +01:00
|
|
|
|
--postgres-missing-dictionaries
|
2020-06-18 00:18:34 +02:00
|
|
|
|
Set postgresql.missing_dictionaries, which alters the initial database. Use with
|
|
|
|
|
cloud managed databases like RDS. Conflicts with --no-overwrite-settings.
|
2020-06-17 23:26:53 +02:00
|
|
|
|
--no-init-db
|
2020-06-18 00:18:34 +02:00
|
|
|
|
Does not do any database initialization; use when you already have a Zulip
|
|
|
|
|
database.
|
2020-06-17 23:26:53 +02:00
|
|
|
|
|
|
|
|
|
--no-overwrite-settings
|
2020-06-18 00:18:34 +02:00
|
|
|
|
Preserve existing `/etc/zulip` configuration files.
|
2020-06-17 23:26:53 +02:00
|
|
|
|
--no-dist-upgrade
|
2020-06-18 00:18:34 +02:00
|
|
|
|
Skip the initial `apt-get dist-upgrade`.
|
2018-03-03 01:10:51 +01:00
|
|
|
|
|
2017-11-15 21:09:53 +01:00
|
|
|
|
EOF
|
2017-10-02 01:48:25 +02:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
# Shell option parsing. Over time, we'll want to move some of the
|
|
|
|
|
# environment variables below into this self-documenting system.
|
2020-06-24 00:44:49 +02:00
|
|
|
|
args="$(getopt -o '' --long help,hostname:,email:,certbot,self-signed-cert,cacert:,postgres-version:,postgres-missing-dictionaries,no-init-db,no-overwrite-settings,no-dist-upgrade -n "$0" -- "$@")"
|
2017-10-02 01:48:25 +02:00
|
|
|
|
eval "set -- $args"
|
|
|
|
|
while true; do
|
|
|
|
|
case "$1" in
|
2019-02-01 02:23:37 +01:00
|
|
|
|
--help) usage; exit 0;;
|
2020-06-17 23:26:53 +02:00
|
|
|
|
|
2018-02-09 02:05:13 +01:00
|
|
|
|
--hostname) EXTERNAL_HOST="$2"; shift; shift;;
|
|
|
|
|
--email) ZULIP_ADMINISTRATOR="$2"; shift; shift;;
|
2020-06-17 23:26:53 +02:00
|
|
|
|
|
|
|
|
|
--certbot) USE_CERTBOT=1; shift;;
|
|
|
|
|
--cacert) export CUSTOM_CA_CERTIFICATES="$2"; shift; shift;;
|
|
|
|
|
--self-signed-cert) SELF_SIGNED_CERT=1; shift;;
|
|
|
|
|
|
2020-06-24 00:44:49 +02:00
|
|
|
|
--postgres-version) POSTGRES_VERSION="$2"; shift; shift;;
|
2019-12-12 10:50:04 +01:00
|
|
|
|
--postgres-missing-dictionaries) POSTGRES_MISSING_DICTIONARIES=1; shift;;
|
2020-06-17 23:26:53 +02:00
|
|
|
|
--no-init-db) NO_INIT_DB=1; shift;;
|
|
|
|
|
|
|
|
|
|
--no-overwrite-settings) NO_OVERWRITE_SETTINGS=1; shift;;
|
|
|
|
|
--no-dist-upgrade) NO_DIST_UPGRADE=1; shift;;
|
2018-02-09 02:05:13 +01:00
|
|
|
|
--) shift; break;;
|
2017-10-02 01:48:25 +02:00
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
|
2018-01-24 22:23:47 +01:00
|
|
|
|
if [ "$#" -gt 0 ]; then
|
2019-02-01 02:23:37 +01:00
|
|
|
|
usage >&2
|
|
|
|
|
exit 1
|
2018-01-24 22:23:47 +01:00
|
|
|
|
fi
|
|
|
|
|
|
2018-02-09 02:12:36 +01:00
|
|
|
|
## Options from environment variables.
|
|
|
|
|
#
|
|
|
|
|
# Specify options for apt.
|
2018-08-03 02:14:47 +02:00
|
|
|
|
read -r -a APT_OPTIONS <<< "${APT_OPTIONS:-}"
|
2019-12-15 18:15:17 +01:00
|
|
|
|
# Install additional packages.
|
2018-08-03 02:14:47 +02:00
|
|
|
|
read -r -a ADDITIONAL_PACKAGES <<< "${ADDITIONAL_PACKAGES:-}"
|
2018-02-09 02:12:36 +01:00
|
|
|
|
# Deployment type is almost always voyager.
|
|
|
|
|
DEPLOYMENT_TYPE="${DEPLOYMENT_TYPE:-voyager}"
|
|
|
|
|
# Comma-separated list of puppet manifests to install. default is
|
|
|
|
|
# zulip::voyager for an all-in-one system or zulip::dockervoyager for
|
|
|
|
|
# Docker. Use e.g. zulip::app_frontend for a Zulip frontend server.
|
|
|
|
|
PUPPET_CLASSES="${PUPPET_CLASSES:-zulip::voyager}"
|
|
|
|
|
VIRTUALENV_NEEDED="${VIRTUALENV_NEEDED:-yes}"
|
2020-06-24 00:44:49 +02:00
|
|
|
|
POSTGRES_VERSION="${POSTGRES_VERSION:-12}"
|
2013-11-14 06:32:49 +01:00
|
|
|
|
|
2018-01-24 02:13:09 +01:00
|
|
|
|
if [ -n "$SELF_SIGNED_CERT" ] && [ -n "$USE_CERTBOT" ]; then
|
2018-11-12 19:52:44 +01:00
|
|
|
|
set +x
|
2018-01-24 02:13:09 +01:00
|
|
|
|
echo "error: --self-signed-cert and --certbot are incompatible" >&2
|
|
|
|
|
echo >&2
|
2019-02-01 02:23:37 +01:00
|
|
|
|
usage >&2
|
|
|
|
|
exit 1
|
2018-01-24 02:13:09 +01:00
|
|
|
|
fi
|
|
|
|
|
|
2020-06-17 23:47:33 +02:00
|
|
|
|
if [ -n "$POSTGRES_MISSING_DICTIONARIES" ] && [ -n "$NO_OVERWRITE_SETTINGS" ]; then
|
|
|
|
|
set +x
|
|
|
|
|
echo "error: --postgres-missing-dictionaries and --no-overwrite-settings are incompatible" >&2
|
|
|
|
|
echo >&2
|
|
|
|
|
usage >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2018-03-03 01:10:51 +01:00
|
|
|
|
if [ -z "$EXTERNAL_HOST" ] || [ -z "$ZULIP_ADMINISTRATOR" ]; then
|
|
|
|
|
if [ -n "$USE_CERTBOT" ] || [ -z "$NO_INIT_DB" ]; then
|
2019-02-01 02:23:37 +01:00
|
|
|
|
usage >&2
|
|
|
|
|
exit 1
|
2018-03-03 01:10:51 +01:00
|
|
|
|
fi
|
2018-02-09 01:33:53 +01:00
|
|
|
|
fi
|
|
|
|
|
|
2019-02-01 02:23:37 +01:00
|
|
|
|
if [ "$EXTERNAL_HOST" = zulip.example.com ] ||
|
|
|
|
|
[ "$ZULIP_ADMINISTRATOR" = zulip-admin@example.com ]; then
|
|
|
|
|
# These example values are specifically checked for and would fail
|
|
|
|
|
# later; see check_config in zerver/lib/management.py.
|
|
|
|
|
echo 'error: The example hostname and email must be replaced with real values.' >&2
|
|
|
|
|
echo >&2
|
|
|
|
|
usage >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2017-10-02 01:48:25 +02:00
|
|
|
|
# Do set -x after option parsing is complete
|
|
|
|
|
set -x
|
2013-11-14 06:32:49 +01:00
|
|
|
|
|
2018-08-03 02:14:47 +02:00
|
|
|
|
ZULIP_PATH="$(readlink -f "$(dirname "$0")"/../..)"
|
2018-02-09 02:19:40 +01:00
|
|
|
|
|
2017-11-23 03:03:44 +01:00
|
|
|
|
# Force a known locale. Some packages on PyPI fail to install in some locales.
|
2018-10-11 23:40:58 +02:00
|
|
|
|
localedef -i en_US -f UTF-8 en_US.UTF-8
|
2017-11-23 03:03:44 +01:00
|
|
|
|
export LC_ALL="en_US.UTF-8"
|
2018-07-24 07:59:19 +02:00
|
|
|
|
export LANG="en_US.UTF-8"
|
|
|
|
|
export LANGUAGE="en_US.UTF-8"
|
2017-11-23 03:03:44 +01:00
|
|
|
|
|
2018-03-07 04:26:02 +01:00
|
|
|
|
# Check for a supported OS release.
|
2019-12-20 22:40:23 +01:00
|
|
|
|
if [ -f /etc/os-release ]; then
|
2019-12-21 01:54:51 +01:00
|
|
|
|
os_info="$(. /etc/os-release; printf '%s\n' "$ID" "$ID_LIKE" "$VERSION_ID" "$VERSION_CODENAME")"
|
2020-01-09 15:59:16 +01:00
|
|
|
|
{ read -r os_id; read -r os_id_like; read -r os_version_id; read -r os_version_codename || true; } <<< "$os_info"
|
2020-06-23 23:22:54 +02:00
|
|
|
|
case " $os_id $os_id_like " in
|
|
|
|
|
*' debian '*)
|
|
|
|
|
package_system="apt"
|
|
|
|
|
;;
|
|
|
|
|
*' rhel '*)
|
|
|
|
|
package_system="yum"
|
|
|
|
|
;;
|
|
|
|
|
esac
|
2019-12-15 17:41:35 +01:00
|
|
|
|
fi
|
2018-11-29 01:27:41 +01:00
|
|
|
|
|
2019-12-20 22:40:23 +01:00
|
|
|
|
case "$os_id$os_version_id" in
|
2020-06-23 23:19:37 +02:00
|
|
|
|
debian10|ubuntu18.04|ubuntu20.04) ;;
|
2018-03-07 04:26:02 +01:00
|
|
|
|
*)
|
|
|
|
|
set +x
|
|
|
|
|
cat <<EOF
|
|
|
|
|
|
2019-12-20 22:40:23 +01:00
|
|
|
|
Unsupported OS release: $os_id $os_version_id
|
2018-03-07 04:26:02 +01:00
|
|
|
|
|
|
|
|
|
Zulip in production is supported only on:
|
2019-08-13 15:11:58 +02:00
|
|
|
|
- Debian 10 "buster"
|
2018-05-24 19:44:29 +02:00
|
|
|
|
- Ubuntu 18.04 LTS "bionic"
|
2020-06-23 23:19:37 +02:00
|
|
|
|
- Ubuntu 20.04 LTS "focal"
|
2018-03-07 04:26:02 +01:00
|
|
|
|
|
|
|
|
|
For more information, see:
|
|
|
|
|
https://zulip.readthedocs.io/en/latest/production/requirements.html
|
|
|
|
|
EOF
|
|
|
|
|
exit 1
|
|
|
|
|
esac
|
|
|
|
|
|
2019-12-20 22:40:23 +01:00
|
|
|
|
if [ "$os_id" = ubuntu ] && ! apt-cache policy |
|
|
|
|
|
grep -q "^ release v=$os_version_id,o=Ubuntu,a=$os_version_codename,n=$os_version_codename,l=Ubuntu,c=universe"; then
|
2018-11-29 01:27:41 +01:00
|
|
|
|
set +x
|
|
|
|
|
cat <<'EOF'
|
|
|
|
|
|
|
|
|
|
You must enable the Ubuntu Universe repository before installing
|
2019-01-26 21:27:10 +01:00
|
|
|
|
Zulip. You can do this with:
|
|
|
|
|
|
|
|
|
|
sudo add-apt-repository universe
|
|
|
|
|
sudo apt update
|
2018-11-29 01:27:41 +01:00
|
|
|
|
|
|
|
|
|
For more information, see:
|
|
|
|
|
https://zulip.readthedocs.io/en/latest/production/requirements.html
|
|
|
|
|
EOF
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2020-06-23 08:57:14 +02:00
|
|
|
|
case ",$PUPPET_CLASSES," in
|
|
|
|
|
*,zulip::voyager,* | *,zulip::postgres_appdb_tuned,*)
|
|
|
|
|
if [ "$package_system" = apt ]; then
|
|
|
|
|
# We're going to install Postgres from the postgres apt
|
|
|
|
|
# repository; this may conflict with the existing postgres.
|
|
|
|
|
OTHER_PG="$(dpkg --get-selections |
|
2020-06-27 05:05:21 +02:00
|
|
|
|
grep -E '^postgresql-[0-9]+\s+install$' |
|
2020-06-23 08:57:14 +02:00
|
|
|
|
grep -v "^postgresql-$POSTGRES_VERSION\b" |
|
|
|
|
|
cut -f 1)" || true
|
|
|
|
|
if [ -n "$OTHER_PG" ]; then
|
|
|
|
|
INDENTED="${OTHER_PG//$'\n'/$'\n' }"
|
|
|
|
|
SPACED="${OTHER_PG//$'\n'/ }"
|
|
|
|
|
cat <<EOF
|
|
|
|
|
|
|
|
|
|
The following PostgreSQL servers were found to already be installed:
|
|
|
|
|
|
|
|
|
|
$INDENTED
|
|
|
|
|
|
|
|
|
|
Zulip needs to install PostgreSQL $POSTGRES_VERSION, but does not wish
|
|
|
|
|
to uninstall existing databases in order to do so. Remove all other
|
|
|
|
|
PostgreSQL servers manually before running the installer:
|
|
|
|
|
|
|
|
|
|
sudo apt-get remove $SPACED
|
|
|
|
|
|
|
|
|
|
EOF
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
|
2020-01-24 21:22:18 +01:00
|
|
|
|
# Check for at least ~1.86GB of RAM before starting installation;
|
2016-12-01 00:29:14 +01:00
|
|
|
|
# otherwise users will find out about insufficient RAM via weird
|
|
|
|
|
# errors like a segfault running `pip install`.
|
2020-01-24 21:22:18 +01:00
|
|
|
|
# Additionally, some AWS images that are advertised to be 2 GB
|
|
|
|
|
# are actually 1880000B in size.
|
2018-08-03 02:14:47 +02:00
|
|
|
|
mem_kb=$(head -n1 /proc/meminfo | awk '{print $2}')
|
2020-01-24 21:22:18 +01:00
|
|
|
|
if [ "$mem_kb" -lt 1860000 ]; then
|
2018-11-12 19:52:44 +01:00
|
|
|
|
set +x
|
|
|
|
|
echo -e '\033[0;31m' >&2
|
|
|
|
|
echo "Insufficient RAM. Zulip requires at least 2GB of RAM." >&2
|
|
|
|
|
echo >&2
|
|
|
|
|
echo -e '\033[0m' >&2
|
2016-12-01 00:29:14 +01:00
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2019-12-15 18:15:17 +01:00
|
|
|
|
# Do package update, e.g. do `apt-get update` on Debian
|
2020-06-23 23:22:54 +02:00
|
|
|
|
if [ "$package_system" = apt ]; then
|
|
|
|
|
# setup-apt-repo does an `apt-get update`
|
|
|
|
|
"$ZULIP_PATH"/scripts/lib/setup-apt-repo
|
|
|
|
|
elif [ "$package_system" = yum ]; then
|
|
|
|
|
"$ZULIP_PATH"/scripts/lib/setup-yum-repo
|
|
|
|
|
fi
|
2016-08-05 22:27:03 +02:00
|
|
|
|
|
2018-01-23 00:12:00 +01:00
|
|
|
|
# Check early for missing SSL certificates
|
2018-01-24 02:03:18 +01:00
|
|
|
|
if [ "$PUPPET_CLASSES" = "zulip::voyager" ] && [ -z "$USE_CERTBOT""$SELF_SIGNED_CERT" ] && { ! [ -e "/etc/ssl/private/zulip.key" ] || ! [ -e "/etc/ssl/certs/zulip.combined-chain.crt" ]; }; then
|
2018-02-09 02:05:13 +01:00
|
|
|
|
set +x
|
|
|
|
|
cat <<EOF
|
|
|
|
|
|
2018-04-19 20:00:37 +02:00
|
|
|
|
No SSL certificate found. One or both required files is missing:
|
|
|
|
|
/etc/ssl/private/zulip.key
|
|
|
|
|
/etc/ssl/certs/zulip.combined-chain.crt
|
|
|
|
|
|
|
|
|
|
Suggested solutions:
|
|
|
|
|
* For most sites, the --certbot option is recommended.
|
|
|
|
|
* If you have your own key and cert, see docs linked below
|
|
|
|
|
for how to install them.
|
|
|
|
|
* For non-production testing, try the --self-signed-cert option.
|
|
|
|
|
|
|
|
|
|
For help and more details, see our SSL documentation:
|
|
|
|
|
https://zulip.readthedocs.io/en/latest/production/ssl-certificates.html
|
2018-02-09 02:05:13 +01:00
|
|
|
|
|
|
|
|
|
Once fixed, just rerun scripts/setup/install; it'll pick up from here!
|
|
|
|
|
|
|
|
|
|
EOF
|
2020-06-17 23:45:20 +02:00
|
|
|
|
exit 1
|
2017-10-24 22:30:27 +02:00
|
|
|
|
fi
|
|
|
|
|
|
2019-06-05 14:18:52 +02:00
|
|
|
|
# don't run dist-upgrade in one click apps to make the
|
|
|
|
|
# installation process more seamless.
|
|
|
|
|
if [ -z "$NO_DIST_UPGRADE" ]; then
|
2020-06-23 23:22:54 +02:00
|
|
|
|
if [ "$package_system" = apt ]; then
|
|
|
|
|
apt-get -y dist-upgrade "${APT_OPTIONS[@]}"
|
|
|
|
|
elif [ "$package_system" = yum ]; then
|
2019-12-16 14:57:01 +01:00
|
|
|
|
# On CentOS, there is no need to do `yum -y upgrade` because `yum -y
|
|
|
|
|
# update` already does the same thing.
|
2020-06-23 23:22:54 +02:00
|
|
|
|
:
|
|
|
|
|
fi
|
2019-06-05 14:18:52 +02:00
|
|
|
|
fi
|
|
|
|
|
|
2020-06-23 23:22:54 +02:00
|
|
|
|
if [ "$package_system" = apt ]; then
|
|
|
|
|
if [ "$os_id" = ubuntu ] && [ "$os_version_id" = 20.04 ]; then
|
|
|
|
|
PYTHON2="python2"
|
|
|
|
|
else
|
|
|
|
|
PYTHON2="python"
|
|
|
|
|
fi
|
2020-05-20 22:13:57 +02:00
|
|
|
|
|
2020-06-23 23:22:54 +02:00
|
|
|
|
if ! apt-get install -y \
|
|
|
|
|
puppet git curl wget jq \
|
|
|
|
|
"$PYTHON2" python3 python-six python3-six crudini \
|
|
|
|
|
"${ADDITIONAL_PACKAGES[@]}"; then
|
|
|
|
|
set +x
|
|
|
|
|
echo -e '\033[0;31m' >&2
|
|
|
|
|
echo "Installing packages failed; is network working and (on Ubuntu) the universe repository enabled?" >&2
|
|
|
|
|
echo >&2
|
|
|
|
|
echo -e '\033[0m' >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
elif [ "$package_system" = yum ]; then
|
|
|
|
|
if ! yum install -y \
|
|
|
|
|
puppet git curl wget jq \
|
|
|
|
|
python python3 python-six python3-six crudini \
|
|
|
|
|
"${ADDITIONAL_PACKAGES[@]}"; then
|
|
|
|
|
set +x
|
|
|
|
|
echo -e '\033[0;31m' >&2
|
|
|
|
|
echo "Installing packages failed; is network working?" >&2
|
|
|
|
|
echo >&2
|
|
|
|
|
echo -e '\033[0m' >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
fi
|
2017-08-23 23:54:59 +02:00
|
|
|
|
|
2018-01-23 00:12:00 +01:00
|
|
|
|
if [ -n "$USE_CERTBOT" ]; then
|
|
|
|
|
"$ZULIP_PATH"/scripts/setup/setup-certbot \
|
|
|
|
|
--no-zulip-conf --method=standalone \
|
2018-10-20 10:11:46 +02:00
|
|
|
|
"$EXTERNAL_HOST" --email "$ZULIP_ADMINISTRATOR"
|
2018-02-09 01:27:13 +01:00
|
|
|
|
elif [ -n "$SELF_SIGNED_CERT" ]; then
|
|
|
|
|
"$ZULIP_PATH"/scripts/setup/generate-self-signed-cert \
|
|
|
|
|
--exists-ok "${EXTERNAL_HOST:-$(hostname)}"
|
2018-01-23 00:12:00 +01:00
|
|
|
|
fi
|
|
|
|
|
|
2016-06-22 21:00:50 +02:00
|
|
|
|
# Create and activate a virtualenv
|
2016-07-12 20:46:49 +02:00
|
|
|
|
if [ "$VIRTUALENV_NEEDED" = "yes" ]; then
|
2016-11-20 05:45:53 +01:00
|
|
|
|
"$ZULIP_PATH"/scripts/lib/create-production-venv "$ZULIP_PATH"
|
2017-05-24 02:46:52 +02:00
|
|
|
|
"$ZULIP_PATH"/scripts/lib/create-thumbor-venv "$ZULIP_PATH"
|
2016-07-12 20:46:49 +02:00
|
|
|
|
fi
|
2016-06-22 21:00:50 +02:00
|
|
|
|
|
2017-01-07 00:57:42 +01:00
|
|
|
|
"$ZULIP_PATH"/scripts/lib/install-node
|
|
|
|
|
|
2018-02-09 02:14:28 +01:00
|
|
|
|
# Generate /etc/zulip/zulip.conf .
|
2013-11-14 06:32:49 +01:00
|
|
|
|
mkdir -p /etc/zulip
|
2020-06-17 23:46:05 +02:00
|
|
|
|
if [ -z "$NO_OVERWRITE_SETTINGS" ] || ! [ -e "/etc/zulip/zulip.conf" ]; then
|
|
|
|
|
(
|
|
|
|
|
cat <<EOF
|
2018-02-09 02:05:13 +01:00
|
|
|
|
[machine]
|
|
|
|
|
puppet_classes = $PUPPET_CLASSES
|
|
|
|
|
deploy_type = $DEPLOYMENT_TYPE
|
|
|
|
|
EOF
|
2016-11-20 06:36:04 +01:00
|
|
|
|
|
2020-06-17 23:46:05 +02:00
|
|
|
|
# Note: there are four dpkg-query outputs to consider:
|
|
|
|
|
#
|
|
|
|
|
# root@host# dpkg-query --showformat '${Status}\n' -W rabbitmq-server 2>/dev/null
|
|
|
|
|
# root@host# apt install rabbitmq-server
|
|
|
|
|
# root@host# dpkg-query --showformat '${Status}\n' -W rabbitmq-server 2>/dev/null
|
|
|
|
|
# install ok installed
|
|
|
|
|
# root@host# apt remove rabbitmq-server
|
|
|
|
|
# root@host# dpkg-query --showformat '${Status}\n' -W rabbitmq-server 2>/dev/null
|
|
|
|
|
# deinstall ok config-files
|
|
|
|
|
# root@host# apt purge rabbitmq-server
|
|
|
|
|
# root@host# dpkg-query --showformat '${Status}\n' -W rabbitmq-server 2>/dev/null
|
|
|
|
|
# unknown ok not-installed
|
|
|
|
|
#
|
|
|
|
|
# (There are more possibilities in the case of dpkg errors.) Here
|
|
|
|
|
# we are checking for either empty or not-installed.
|
|
|
|
|
if ! dpkg-query --showformat '${Status}\n' -W rabbitmq-server 2>/dev/null | grep -vq ' not-installed$'; then
|
|
|
|
|
cat <<EOF
|
2018-02-09 02:05:13 +01:00
|
|
|
|
|
|
|
|
|
[rabbitmq]
|
|
|
|
|
nodename = zulip@localhost
|
|
|
|
|
EOF
|
2020-06-17 23:46:05 +02:00
|
|
|
|
fi
|
2017-11-15 00:48:22 +01:00
|
|
|
|
|
2020-06-17 23:46:05 +02:00
|
|
|
|
if [ -n "$USE_CERTBOT" ]; then
|
|
|
|
|
cat <<EOF
|
2018-02-09 02:05:13 +01:00
|
|
|
|
|
|
|
|
|
[certbot]
|
|
|
|
|
auto_renew = yes
|
|
|
|
|
EOF
|
2020-06-17 23:46:05 +02:00
|
|
|
|
fi
|
2020-06-16 07:29:17 +02:00
|
|
|
|
|
installer: Write PostgreSQL version based on puppet classes.
Using `/etc/init.d/postgresql` as the detection of if Postgres is on
the server is incorrect, because this line runs _before_ puppet and
any packages are installed. Thus, it cannot tell the difference
between a new Ubuntu one-host first-time-install without PostgreSQL
yet, and one which is merely a front-end and will never have
PostgreSQL. This leads to failures in first-time installs:
```
Error: Evaluation Error: Error while evaluating a Function Call,
Could not find template 'zulip/postgresql//postgresql.conf.template.erb'
```
The only way to detect if PostgreSQL will be present in the _end_
state of the install is to examine the puppet classes that are
applied.
To do this, we must inspect `PUPPET_CLASSES`. Unfortunately, this can
be fragile to subclassing (e.g. `zulip_ops::postgres_appdb`). We
might desire to use `puppet apply --write-catalog-summary` to deduce
the _applied_ classes, which would unroll the inheritance; however,
this causes a chicken-and-egg problem, because `zulip.conf` must be
already written out (including a value for `postgresql.version`, if
necessary!) before such a puppet run could successfully complete.
Switch to predicating the `postgresql.version` key on the puppet
classes that are known to install postgres.
2020-06-23 04:40:31 +02:00
|
|
|
|
case ",$PUPPET_CLASSES," in
|
|
|
|
|
*,zulip::voyager,* | *,zulip::postgres_appdb_tuned,*)
|
|
|
|
|
if [ "$package_system" = apt ]; then
|
|
|
|
|
cat <<EOF
|
2020-06-16 07:29:17 +02:00
|
|
|
|
|
|
|
|
|
[postgresql]
|
2020-06-24 00:44:49 +02:00
|
|
|
|
version = $POSTGRES_VERSION
|
2020-06-16 07:29:17 +02:00
|
|
|
|
EOF
|
installer: Write PostgreSQL version based on puppet classes.
Using `/etc/init.d/postgresql` as the detection of if Postgres is on
the server is incorrect, because this line runs _before_ puppet and
any packages are installed. Thus, it cannot tell the difference
between a new Ubuntu one-host first-time-install without PostgreSQL
yet, and one which is merely a front-end and will never have
PostgreSQL. This leads to failures in first-time installs:
```
Error: Evaluation Error: Error while evaluating a Function Call,
Could not find template 'zulip/postgresql//postgresql.conf.template.erb'
```
The only way to detect if PostgreSQL will be present in the _end_
state of the install is to examine the puppet classes that are
applied.
To do this, we must inspect `PUPPET_CLASSES`. Unfortunately, this can
be fragile to subclassing (e.g. `zulip_ops::postgres_appdb`). We
might desire to use `puppet apply --write-catalog-summary` to deduce
the _applied_ classes, which would unroll the inheritance; however,
this causes a chicken-and-egg problem, because `zulip.conf` must be
already written out (including a value for `postgresql.version`, if
necessary!) before such a puppet run could successfully complete.
Switch to predicating the `postgresql.version` key on the puppet
classes that are known to install postgres.
2020-06-23 04:40:31 +02:00
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
esac
|
2020-06-17 23:46:05 +02:00
|
|
|
|
) > /etc/zulip/zulip.conf
|
|
|
|
|
fi
|
2018-02-09 02:14:28 +01:00
|
|
|
|
|
2020-01-04 03:14:36 +01:00
|
|
|
|
case ",$PUPPET_CLASSES," in
|
|
|
|
|
*,zulip::voyager,* | *,zulip::dockervoyager,* | *,zulip::app_frontend,*)
|
2020-01-03 01:30:40 +01:00
|
|
|
|
if [ -z "$NO_OVERWRITE_SETTINGS" ] || ! [ -e "/etc/zulip/settings.py" ]; then
|
|
|
|
|
cp -a "$ZULIP_PATH"/zproject/prod_settings_template.py /etc/zulip/settings.py
|
|
|
|
|
if [ -n "$EXTERNAL_HOST" ]; then
|
|
|
|
|
sed -i "s/^EXTERNAL_HOST =.*/EXTERNAL_HOST = '$EXTERNAL_HOST'/" /etc/zulip/settings.py
|
|
|
|
|
fi
|
|
|
|
|
if [ -n "$ZULIP_ADMINISTRATOR" ]; then
|
|
|
|
|
sed -i "s/^ZULIP_ADMINISTRATOR =.*/ZULIP_ADMINISTRATOR = '$ZULIP_ADMINISTRATOR'/" /etc/zulip/settings.py
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
ln -nsf /etc/zulip/settings.py "$ZULIP_PATH"/zproject/prod_settings.py
|
2020-01-04 03:14:36 +01:00
|
|
|
|
"$ZULIP_PATH"/scripts/setup/generate_secrets.py --production
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
|
2016-09-15 19:29:56 +02:00
|
|
|
|
"$ZULIP_PATH"/scripts/zulip-puppet-apply -f
|
2013-11-14 06:32:49 +01:00
|
|
|
|
|
2020-06-23 23:22:54 +02:00
|
|
|
|
if [ "$package_system" = apt ]; then
|
|
|
|
|
SUPERVISOR_CONF_DIR="/etc/supervisor/conf.d"
|
|
|
|
|
elif [ "$package_system" = yum ]; then
|
|
|
|
|
SUPERVISOR_CONF_DIR="/etc/supervisord.d/conf.d"
|
|
|
|
|
fi
|
|
|
|
|
|
2016-07-12 05:35:14 +02:00
|
|
|
|
# Detect which features were selected for the below
|
2016-07-20 04:05:02 +02:00
|
|
|
|
set +e
|
2016-07-12 05:35:14 +02:00
|
|
|
|
[ -e "/etc/init.d/nginx" ]; has_nginx=$?
|
2020-01-09 13:30:40 +01:00
|
|
|
|
[ -e "$SUPERVISOR_CONF_DIR/zulip.conf" ]; has_appserver=$?
|
2016-07-12 05:35:14 +02:00
|
|
|
|
[ -e "/etc/cron.d/rabbitmq-numconsumers" ]; has_rabbit=$?
|
|
|
|
|
[ -e "/etc/init.d/postgresql" ]; has_postgres=$?
|
2016-07-20 04:05:02 +02:00
|
|
|
|
set -e
|
2016-07-12 05:35:14 +02:00
|
|
|
|
|
2016-07-20 11:55:45 +02:00
|
|
|
|
# Docker service setup is done in the docker config, not here
|
|
|
|
|
if [ "$DEPLOYMENT_TYPE" = "dockervoyager" ]; then
|
|
|
|
|
has_nginx=1
|
2018-05-15 17:16:39 +02:00
|
|
|
|
has_appserver=0
|
2016-07-20 11:55:45 +02:00
|
|
|
|
has_rabbit=1
|
|
|
|
|
has_postgres=1
|
|
|
|
|
fi
|
|
|
|
|
|
2019-12-12 10:50:04 +01:00
|
|
|
|
if [ -n "$POSTGRES_MISSING_DICTIONARIES" ]; then
|
2019-12-13 08:16:55 +01:00
|
|
|
|
crudini --set /etc/zulip/zulip.conf postgresql missing_dictionaries true
|
2019-12-12 10:50:04 +01:00
|
|
|
|
fi
|
|
|
|
|
|
2013-11-14 06:32:49 +01:00
|
|
|
|
# These server restarting bits should be moveable into puppet-land, ideally
|
2020-06-23 23:22:54 +02:00
|
|
|
|
if [ "$package_system" = apt ]; then
|
|
|
|
|
apt-get -y upgrade
|
|
|
|
|
elif [ "$package_system" = yum ]; then
|
|
|
|
|
# No action is required because `yum update` already does upgrade.
|
|
|
|
|
:
|
|
|
|
|
fi
|
2016-07-12 05:35:14 +02:00
|
|
|
|
|
|
|
|
|
if [ "$has_nginx" = 0 ]; then
|
2015-10-21 08:23:24 +02:00
|
|
|
|
# Check nginx was configured properly now that we've installed it.
|
|
|
|
|
# Most common failure mode is certs not having been installed.
|
2017-10-24 22:30:27 +02:00
|
|
|
|
nginx -t || (
|
|
|
|
|
set +x
|
2018-02-09 02:05:13 +01:00
|
|
|
|
cat <<EOF
|
|
|
|
|
|
|
|
|
|
Verifying the Zulip nginx configuration failed!
|
|
|
|
|
|
|
|
|
|
This is almost always a problem with your SSL certificates. See:
|
|
|
|
|
https://zulip.readthedocs.io/en/latest/production/ssl-certificates.html
|
|
|
|
|
|
|
|
|
|
Once fixed, just rerun scripts/setup/install; it'll pick up from here!
|
|
|
|
|
|
|
|
|
|
EOF
|
2017-10-24 22:30:27 +02:00
|
|
|
|
exit 1
|
|
|
|
|
)
|
2013-11-14 06:32:49 +01:00
|
|
|
|
service nginx restart
|
|
|
|
|
fi
|
|
|
|
|
|
2016-07-12 05:35:14 +02:00
|
|
|
|
if [ "$has_rabbit" = 0 ]; then
|
|
|
|
|
if ! rabbitmqctl status >/dev/null; then
|
|
|
|
|
set +x
|
2018-02-09 02:05:13 +01:00
|
|
|
|
cat <<EOF
|
|
|
|
|
|
|
|
|
|
RabbitMQ seems to not have started properly after the installation process.
|
|
|
|
|
Often this is caused by misconfigured /etc/hosts in virtualized environments.
|
|
|
|
|
For more information, see:
|
|
|
|
|
https://github.com/zulip/zulip/issues/53#issuecomment-143805121
|
|
|
|
|
|
|
|
|
|
EOF
|
2016-07-12 05:35:14 +02:00
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2016-09-15 19:29:56 +02:00
|
|
|
|
"$ZULIP_PATH"/scripts/setup/configure-rabbitmq
|
2015-09-30 03:41:31 +02:00
|
|
|
|
fi
|
|
|
|
|
|
2020-06-17 23:27:51 +02:00
|
|
|
|
if [ "$has_postgres" = 0 ] && [ -z "$NO_INIT_DB" ]; then
|
2016-09-15 19:29:56 +02:00
|
|
|
|
"$ZULIP_PATH"/scripts/setup/postgres-init-db
|
2016-07-12 05:35:14 +02:00
|
|
|
|
fi
|
2013-11-14 06:32:49 +01:00
|
|
|
|
|
2016-07-12 05:35:14 +02:00
|
|
|
|
if [ "$has_appserver" = 0 ]; then
|
2016-09-15 19:29:56 +02:00
|
|
|
|
deploy_path=$("$ZULIP_PATH"/scripts/lib/zulip_tools.py make_deploy_path)
|
|
|
|
|
mv "$ZULIP_PATH" "$deploy_path"
|
|
|
|
|
ln -nsf /home/zulip/deployments/next "$ZULIP_PATH"
|
2016-07-12 05:35:14 +02:00
|
|
|
|
ln -nsf "$deploy_path" /home/zulip/deployments/next
|
|
|
|
|
ln -nsf "$deploy_path" /home/zulip/deployments/current
|
2016-07-20 05:42:43 +02:00
|
|
|
|
ln -nsf /etc/zulip/settings.py "$deploy_path"/zproject/prod_settings.py
|
2016-07-12 05:35:14 +02:00
|
|
|
|
mkdir -p "$deploy_path"/prod-static/serve
|
|
|
|
|
cp -rT "$deploy_path"/prod-static/serve /home/zulip/prod-static
|
|
|
|
|
chown -R zulip:zulip /home/zulip /var/log/zulip /etc/zulip/settings.py
|
2017-09-23 00:40:35 +02:00
|
|
|
|
|
2017-09-23 04:52:33 +02:00
|
|
|
|
if ! [ -e "/home/zulip/prod-static/generated" ]; then
|
2017-09-23 00:40:35 +02:00
|
|
|
|
# If we're installing from a git checkout, we need to run
|
|
|
|
|
# `tools/update-prod-static` in order to build the static
|
|
|
|
|
# assets.
|
2020-04-24 22:26:32 +02:00
|
|
|
|
su zulip -c '/home/zulip/deployments/current/tools/update-prod-static'
|
2017-09-23 00:40:35 +02:00
|
|
|
|
fi
|
2016-07-12 05:35:14 +02:00
|
|
|
|
fi
|
2013-11-14 06:32:49 +01:00
|
|
|
|
|
2020-06-17 23:55:11 +02:00
|
|
|
|
if [ -n "$NO_INIT_DB" ]; then
|
2018-01-24 22:29:24 +01:00
|
|
|
|
set +x
|
|
|
|
|
cat <<EOF
|
2013-11-14 06:32:49 +01:00
|
|
|
|
|
2018-03-03 01:13:49 +01:00
|
|
|
|
Success!
|
2013-11-14 06:32:49 +01:00
|
|
|
|
|
2020-06-17 23:55:11 +02:00
|
|
|
|
Stopping because --no-init-db was passed.
|
2019-12-12 10:50:04 +01:00
|
|
|
|
To complete the installation, configure postgres and then run:
|
2013-11-14 06:32:49 +01:00
|
|
|
|
|
2018-11-30 21:08:25 +01:00
|
|
|
|
su zulip -c '/home/zulip/deployments/current/scripts/setup/initialize-database'
|
2019-12-12 10:50:04 +01:00
|
|
|
|
su zulip -c '/home/zulip/deployments/current/manage.py generate_realm_creation_link'
|
2013-11-14 06:32:49 +01:00
|
|
|
|
EOF
|
2018-01-24 22:29:24 +01:00
|
|
|
|
exit 0
|
|
|
|
|
fi
|
|
|
|
|
|
2018-03-03 01:17:52 +01:00
|
|
|
|
su zulip -c '/home/zulip/deployments/current/scripts/setup/initialize-database --quiet'
|
2018-01-24 22:29:24 +01:00
|
|
|
|
|
2018-03-03 01:17:52 +01:00
|
|
|
|
su zulip -c '/home/zulip/deployments/current/manage.py generate_realm_creation_link'
|