scripts: Add a script to stop the server.

Using `supervisorctl stop all` to stop the server is not terribly
discoverable, and may stop services which are not part of Zulip
proper.

Add an explicit tool which only stops the relevant services.  It also
more carefully controls the order in which services are stopped to
minimize lost requests, and maximally quiesce the server.

Locations which may be stopping _older_ versions of Zulip (without
this script) are left with using `supervisorctl stop all`.

Fixes #14959.
This commit is contained in:
Alex Vandiver 2021-04-16 05:46:05 +00:00 committed by Tim Abbott
parent 31169526ec
commit 476524c0c1
9 changed files with 63 additions and 11 deletions

View File

@ -257,7 +257,7 @@ For best results, you'll want to shut down access to the organization
before exporting; so that nobody can send new messages (etc.) while
you're exporting data. There are two ways to do this:
1. `supervisorctl stop all`, which stops the whole server. This is
1. `./scripts/stop-server`, which stops the whole server. This is
preferred if you're not hosting multiple organizations, because it has
no side effects other than disabling the Zulip server for the
duration.
@ -282,7 +282,7 @@ following commands:
```
cd /home/zulip/deployments/current
# supervisorctl stop all # Stops the Zulip server
# ./scripts/stop-server
# export DEACTIVATE_FLAG="--deactivate" # Deactivates the organization
./manage.py export -r '' $DEACTIVATE_FLAG # Exports the data
```
@ -316,7 +316,7 @@ archive of all the organization's uploaded files.
several months of development ahead of the latest release.
* Note that if your server has limited free RAM, you'll want to
shut down the Zulip server with `supervisorctl stop all` while
shut down the Zulip server with `./scripts/stop-server` while
you run the import, since our minimal system requirements do not
budget extra RAM for running the data import tool.

View File

@ -87,6 +87,9 @@ Similarly, you can stop Zulip using:
supervisorctl stop all
```
If you're looking to shut down the server, it is often better to run
`./scripts/stop-server`.
## Troubleshooting services
The Zulip application uses several major open source services to store

View File

@ -415,7 +415,6 @@ To upgrade the version of PostgreSQL on the Zulip server:
2. Stop the server and take a backup:
```
sudo -i # Or otherwise get a root shell
supervisorctl stop all
/home/zulip/deployments/current/manage.py backup --output=/home/zulip/postgresql-upgrade.backup.tar.gz
```

View File

@ -28,7 +28,7 @@ fi
# Shut down all services to ensure a quiescent state.
if [ -e "/var/run/supervisor.sock" ]; then
supervisorctl stop all
su zulip -c "$(dirname "$(dirname "$0")")/stop-server"
fi
# Drop any open connections to any old database.

50
scripts/stop-server Executable file
View File

@ -0,0 +1,50 @@
#!/usr/bin/env python3
import logging
import os
import pwd
import subprocess
import sys
import time
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
from scripts.lib.zulip_tools import ENDC, OKGREEN, WARNING
deploy_path = os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))
os.chdir(deploy_path)
if pwd.getpwuid(os.getuid()).pw_name != "zulip":
logging.error("Must be run as user 'zulip'.")
sys.exit(1)
logging.Formatter.converter = time.gmtime
logging.basicConfig(format="%(asctime)s stop-server: %(message)s", level=logging.INFO)
services = []
# Start with the least-critical services:
if os.path.exists("/etc/supervisor/conf.d/zulip/zulip_db.conf"):
services.append("process-fts-updates")
if os.path.exists("/etc/supervisor/conf.d/zulip/thumbor.conf"):
services.append("zulip-thumbor")
# Contrary to the order in (re)start-server, we stop django before the
# workers, to increase the chance that we finish processing any work
# that may have been enqueued by the Django, leaving the final state
# closer to "empty." We stop Django before Tornado so it doesn't try
# to make requests to make queues with a down'd Tornado.
services.append("zulip-django")
services.extend(["zulip-tornado", "zulip-tornado:*"])
services.append("zulip-workers:*")
subprocess.check_call(["supervisorctl", "stop", *services])
print()
print(OKGREEN + "Zulip stopped successfully!" + ENDC)
using_sso = subprocess.check_output(["./scripts/get-django-setting", "USING_APACHE_SSO"])
if using_sso.strip() == b"True":
print()
print(WARNING + "Apache2 needs to be shut down; as root, run:" + ENDC)
print(" service apache2 stop")
print()

View File

@ -49,7 +49,7 @@ the most common configuration, run the following commands:
```
cd /home/zulip/deployments/current
supervisorctl stop all # Stop the Zulip server
./scripts/stop-server
./manage.py convert_gitter_data gitter_data.json --output converted_gitter_data
./manage.py import '' converted_gitter_data
./scripts/restart-server

View File

@ -149,7 +149,7 @@ the most common configuration, run the following commands, replacing
cd /home/zulip
tar -xzvf export.tar.gz
cd /home/zulip/deployments/current
supervisorctl stop all # Stop the Zulip server
./scripts/stop-server
./manage.py convert_mattermost_data /home/zulip/mattermost --output /home/zulip/converted_mattermost_data
./manage.py import "" /home/zulip/converted_mattermost_data/<team-name>
./scripts/restart-server

View File

@ -79,7 +79,7 @@ the most common configuration, run the following commands, replacing
```
cd /home/zulip/deployments/current
supervisorctl stop all # Stop the Zulip server
./scripts/stop-server
./manage.py convert_slack_data slack_data.zip --token <token> --output converted_slack_data
./manage.py import '' converted_slack_data
./scripts/restart-server

View File

@ -3,10 +3,10 @@
set -e
set -x
ZULIP_PATH=/home/github/zulip
cd /home/github/zulip
supervisorctl stop all
"$ZULIP_PATH"/scripts/setup/upgrade-postgresql
su zulip -c ./scripts/stop-server
./scripts/setup/upgrade-postgresql
supervisorctl start all
echo "Upgrade of PostgreSQL complete!"